Commits

Shinya Okano committed 9fc5e78

バージョンを0.2に変更

  • Participants
  • Parent commits 581c380
  • Tags v0.2

Comments (0)

Files changed (8)

bpmappers/__init__.py

   'Field', 'NonKeyField', 'RawField', 'ChoiceField', 'DelegateField', 'ListDelegateField',
   'NonKeyDelegateField', 'NonKeyListDelegateField', 'Mapper'
 ]
+
+VERSION = (0, 2, 0, 'dev')

bpmappers/djangomodel.py

-# vim:fileencoding=utf-8
+# -*- coding: utf-8 -*-
 from bpmappers.fields import RawField, DelegateField, ListDelegateField
 from bpmappers.mappers import Options, BaseMapper, Mapper
 
             # Meta.modelが無い場合はエラー
             if model is None:
                 raise MetaModelError
-            #if name=='TaggedItemModelMapper':
-            #    import pdb;pdb.set_trace()
             for model_field in model._meta.fields + model._meta.many_to_many:
                 # Meta.fields
                 if hasattr(mapper_meta, 'fields'):

bpmappers/fields.py

-# vim:fileencoding=utf-8
+# -*- coding: utf-8 -*-
 class BaseField(object):
     def __init__(self, callback=None, after_callback=None, *args, **kwargs):
         self.key = None

bpmappers/mappers.py

-# vim:fileencoding=utf-8
+# -*- coding: utf-8 -*-
 from copy import copy
 
 from bpmappers.utils import MultiValueDict, SortedDict

docs/ja/source/conf.py

 # If extensions (or modules to document with autodoc) are in another directory,
 # add these directories to sys.path here. If the directory is relative to the
 # documentation root, use os.path.abspath to make it absolute, like shown here.
-#sys.path.append(os.path.abspath('.'))
+sys.path.append(os.path.dirname(os.path.abspath('./../../')))
 
 # -- General configuration -----------------------------------------------------
 
 # Add any Sphinx extension module names here, as strings. They can be extensions
 # coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
-extensions = []
+extensions = [
+    'sphinx.ext.doctest',
+]
 
 # Add any paths that contain templates here, relative to this directory.
 templates_path = ['_templates']
 # built documents.
 #
 # The short X.Y version.
-version = '0.1'
+version = '0.2'
 # The full version, including alpha/beta/rc tags.
-release = '0.1'
+release = '0.2'
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.

docs/ja/source/intro.rst

        return {
             'name': team.name,
             'point': team.point,
-            'persons': [_map_person(p) for p in team.persons],
+            'persons': [_map_person(p) for p in team.persons.all()],
        }
    
    def response_json(request):
        return {
             'name': team.name,
             'point': team.point,
-            'persons': [_map_person(p) for p in team.persons],
+            'persons': [_map_person(p) for p in team.persons.all()],
        }
    
    def _map_person_only_name(person):
        " teamオブジェクトのマッピング(名前のみ) "
        return {
             'name': team.name,
-            'persons': [_map_person_only_name(p) for p in team.persons],
+            'persons': [_map_person_only_name(p) for p in team.persons.all()],
        }
    
    def response_json(request):
    class TeamPersonNameMapper(Mapper):
        " teamオブジェクトのマッピング(名前のみ) "
        name = RawField()
-       persons = ListDelegateField(PersonNameMapper)
+       persons = ListDelegateField(PersonNameMapper, filter=lambda manager:manager.all())
 
    class TeamMapper(TeamPersonNameMapper):
        " teamオブジェクトのマッピング "
        point = RawField()
-       persons = ListDelegateField(PersonMapper)
+       persons = ListDelegateField(PersonMapper, filter=lambda manager:manager.all())
 
    def response_json(request):
        team = Team.objects.get(pk=1)

docs/ja/source/usage.rst

 .. _usage:
 
-======
 使い方
 ======
 
 シンプルなマッピング
-====================
+--------------------
 
 シンプルなオブジェクトのマッピング例を以下に示します。
 
-.. code-block:: pycon
+.. doctest::
 
-  >>> from bpmappers import Mapper, RawField
-  >>> class Person(object):
-  ...     def __init__(self, name, value):
-  ...         self.name = name
-  ...         self.value = value
-  ...
-  >>> class PersonMapper(Mapper):
-  ...     username = RawField('name')
-  ...     num = RawField('value')
-  ...
-  >>> obj = Person('wozozo', 123)
-  >>> mapper = PersonMapper(obj)
-  >>> print mapper.as_dict()
-  {'username': 'wozozo', 'num': 123}
+   >>> from bpmappers import Mapper, RawField
+   >>> class Person(object):
+   ...     def __init__(self, name, value):
+   ...         self.name = name
+   ...         self.value = value
+   ...
+   >>> class PersonMapper(Mapper):
+   ...     username = RawField('name')
+   ...     num = RawField('value')
+   ...
+   >>> obj = Person('wozozo', 123)
+   >>> mapper = PersonMapper(obj)
+   >>> print mapper.as_dict()
+   {'username': 'wozozo', 'num': 123}
 
 この例では、Personクラスのオブジェクトの要素を辞書にマッピングしています。
+`bpmappers.Mapper` クラスを継承して、各フィールドに対応するマッピングをクラス属性に定義します。
 
 Djangoモデルからマッパークラスを作成する
-========================================
+----------------------------------------
 
-Djangoのモデルをマッピングする際には、マッパークラスを簡単に作成することができます。
+Djangoのモデルをマッピングする場合、ヘルパーを使ってマッピングを簡単に作成することができます。
+``bpmappers.djangomodel.ModelMapper`` を使用した例を示します。
 
 .. code-block:: pycon
 
-  >>> from django.db import models
-  >>> from bpmappers.djangomodel import *
-  >>> class Person(models.Model):
-  ...    name = models.CharField(max_length=10)
-  ...    val = models.IntegerField()
-  ...
-  >>> class PersonMapper(ModelMapper):
-  ...     class Meta:
-  ...         model = Person
-  ...
-  >>> obj = Person('wozozo', 123)
-  >>> mapper = PersonMapper(obj)
-  >>> print mapper.as_dict()
-  {'name': 'wozozo', 'val': 123}
+   >>> from django.db import models
+   >>> from bpmappers.djangomodel import *
+   >>> class Person(models.Model):
+   ...    name = models.CharField(max_length=10)
+   ...    val = models.IntegerField()
+   ...
+   >>> class PersonMapper(ModelMapper):
+   ...     class Meta:
+   ...         model = Person
+   ...
+   >>> obj = Person('wozozo', 123)
+   >>> mapper = PersonMapper(obj)
+   >>> print mapper.as_dict()
+   {'name': 'wozozo', 'val': 123}
 
 別のマッパーへの委譲
-====================
+--------------------
 
-特定のフィールドのマッピングを別のマッパークラスに委譲することができます。
+特定のフィールドのマッピングを別のマッパークラスに委譲するには、 ``DelegateField`` を使用します。
 
-フック
-======
+.. doctest::
 
-各フィールドのマッピング処理にフックすることができます。
+   >>> from bpmappers import  Mapper, RawField, DelegateField
+   >>> class Person(object):
+   ...     def __init__(self, name):
+   ...         self.name = name
+   ...
+   >>> class Book(object):
+   ...     def __init__(self, name, author):
+   ...         self.name = name
+   ...         self.author = author
+   ...
+   >>> class PersonMapper(Mapper):
+   ...     name = RawField()
+   ...
+   >>> class BookMapper(Mapper):
+   ...     name = RawField()
+   ...     author = DelegateField(PersonMapper)
+   ...
+   >>> p = Person('wozozo')
+   >>> b = Book('python book', p)
+   >>> mapper = BookMapper(b)
+   >>> print mapper.as_dict()
+   {'name': 'python book', 'author': {'name': 'wozozo'}}
 
+リストのマッピング
+~~~~~~~~~~~~~~~~~~
+
+リストなどのシーケンスをマッピングを委譲するには、 ``ListDelegateField`` を使用します。
+
+.. doctest::
+
+   >>> from bpmappers import  Mapper, RawField, ListDelegateField
+   >>> class Person(object):
+   ...     def __init__(self, name):
+   ...         self.name = name
+   ...
+   >>> class Team(object):
+   ...     def __init__(self, name, members):
+   ...         self.name = name
+   ...         self.members = members
+   ...
+   >>> class TeamMapper(Mapper):
+   ...     name = RawField()
+   ...     members = ListDelegateField(PersonMapper)
+   ...
+   >>> p1 = Person('wozozo')
+   >>> p2 = Person('moriyoshi')
+   >>> t = Team('php', [p1, p2])
+   >>> mapper = TeamMapper(t)
+   >>> print mapper.as_dict()
+   {'name': 'php', 'members': [{'name': 'wozozo'}, {'name': 'moriyoshi'}]}
+
+フックポイント
+--------------
+
+マッピング処理の途中で何か独自の処理を行いたい場合、いくつかのフックポイントを使用できます。
+
+Mapper.filter_FOO
+~~~~~~~~~~~~~~~~~
+
+フィールドの値変換の前に実行されます。FOOはフィールド名に置き換えてください。
+
+``NonKeyField`` を使った場合、ここでマッピングに利用する値を生成することができます。
+
+.. doctest::
+
+   >>> from bpmappers import Mapper, NonKeyField
+   >>> class MyMapper(Mapper):
+   ...     value = NonKeyField()
+   ...     def filter_value(self):
+   ...         return 10
+   ...
+   >>> mapper = MyMapper()
+   >>> mapper.as_dict()
+   {'value': 10}
+
+Mapper.after_filter_FOO
+~~~~~~~~~~~~~~~~~~~~~~~
+
+フィールドの値変換の後に実行されます。FOOはフィールド名に置き換えてください。
+
+Mapper.attach_FOO
+~~~~~~~~~~~~~~~~~
+
+マッピングの結果の辞書に値を追加する前に実行されます。値を追加しない場合や、値の追加位置を変更する場合などに使用できます。
+
+Field.callback
+~~~~~~~~~~~~~~
+
+フィールドの値変換の前に実行されます。 ``filter_FOO`` の後にフィールドクラスで実行されます。
+
+Field.after_callback
+~~~~~~~~~~~~~~~~~~~~
+
+フィールドの値変換の後に実行されます。 ``after_filter_FOO`` の前にフィールドクラスで実行されます。
 #!/usr/bin/env python
-#:coding=utf-8:
 
 from setuptools import setup, find_packages
  
 setup (
     name='bpmappers',
-    version='0.1',
+    version='0.2',
     description='Model to dictionary mapping for Python',
     author='K.K. BeProud',
     author_email='tokibito@gmail.com',