Commits

Shinya Okano  committed f87cfa1

bpmappersのサイトを移転

  • Participants
  • Parent commits 95cb153

Comments (0)

Files changed (34)

File bpmappers/_sources/djangomodel.txt

-.. _djangomodel:
-
-Djangoフレームワークのモデルをマッピングする
-============================================
-
-Djangoフレームワークのモデルインスタンスをマッピングする場合、 ``bpmappers.djangomodel.ModelMapper`` を使用することができます。
-
-Djangoフレームワークのバージョン
---------------------------------
-
-``bpmappers.djangomodel`` は、Djangoフレームワークのバージョンが 1.0 から 1.3 に対応しています。
-
-1.0 以前のバージョンへの対応予定は、今のところありません。
-
-ModelMapperの使用
------------------
-
-ModelMapperを使用するには、 ModelMapper を継承したクラスを定義します。
-
-次のようなモデルを定義したとします:
-
-.. code-block:: python
-
-   from django.db import models
-
-   class Person(models.Model):
-       name = models.CharField(max_length=10)
-
-   class Book(models.Model):
-       title = models.CharField(max_length=10)
-       author = models.Foreignkey(Person)
-
-ModelMapper を使ってBookモデルを辞書にマッピングするための定義は次のようになります:
-
-.. code-block:: python
-
-   from bpmappers.djangomodel import ModelMapper
-   from myapp.models import Book
-
-   class BookMapper(ModelMapper):
-       class Meta:
-           model = Book
-
-ModelMapper を使わない場合は次のようになります:
-
-.. code-block:: python
-
-   from bpmappers import Mapper, RawField, DelegateField
-
-   class PersonMapper(Mapper):
-       id = RawField()
-       name = RawField()
-
-   class BookMapper(Mapper):
-       id = RawField()
-       title = RawField()
-       author = DelegateField(PersonMapper)
-
-仕組み
-------
-
-ModelMapper は、Djangoモデルクラスの ``Model._meta.fields`` のモデルフィールドの定義を参照してマッピングフィールドを作成しています。
-
-モデルフィールドとマッピングフィールドの対応は次の通りです:
-
-========================  ==========================================
-Djangoのモデルフィールド  bpmappersのフィールド
-========================  ==========================================
-AutoField                 bpmappers.RawField
-CharField                 bpmappers.RawField
-TextField                 bpmappers.RawField
-IntegerField              bpmappers.RawField
-DateTimeField             bpmappers.RawField
-DateField                 bpmappers.RawField
-TimeField                 bpmappers.RawField
-BooleanField              bpmappers.RawField
-FileField                 bpmappers.djangomodel.DjangoFileField
-ForeignKey                bpmappers.DelegateField
-ManyToManyField           bpmappers.ListDelegateField
-========================  ==========================================
-
-Metaインナークラス
-------------------
-
-``ModelMapper`` を継承したクラスには、 ``Meta`` インナークラスを定義する必要があります。このクラスで定義した内容から、マッピングルールが生成されます。
-
-Meta.model
-~~~~~~~~~~
-
-Djangoのモデルクラスを指定します。
-
-Meta.fields
-~~~~~~~~~~~
-
-``Meta.model`` で指定したモデルクラスのフィールドのうち、マッピング対象とするフィールド名をシーケンス型で列挙します。省略した場合はすべてのフィールドがマッピング対象になります。
-
-Meta.exclude
-~~~~~~~~~~~~
-``Meta.model`` で指定したモデルクラスのフィールドのうち、マッピング対象から除外するフィールド名をシーケンス型で列挙します。省略した場合は、すべてのフィールドがマッピング対象になります。

File bpmappers/_sources/flatten.txt

-.. _flatten:
-
-同じ階層にマッピング結果をマージする
-====================================
-
-``myapp/models.py`` に定義した次のようなPersonモデルとBookモデルを同じ階層にマッピングする例です。
-
-
-.. code-block:: python
-
-   from django.db import models
-
-   class Person(models.Model):
-       name = models.CharField(max_length=20)
-       age = models.PositiveIntegerField()
-
-       def __unicode__(self):
-           return '%s, %d' % (self.name, self.age)
-
-   class Book(models.Model):
-       title = models.CharField(max_length=30)
-       author = models.ForeignKey(Person)
-
-       def __unicode__(self):
-           return '%s, %s' % (self.title, self.author)
-
-
-``myapp/mappers.py`` にマッピングルールを定義します。
-``DelegateField`` の ``attach_parent`` オプションに ``True`` を指定することで、対象のマッピング結果を同じ階層のマッピング結果にマージします。
-
-.. code-block:: python
-
-   from bpmappers import Mapper, fields, djangomodel
-   from myapp.models import Person, Book
-
-   class PersonModelMapper(djangomodel.ModelMapper):
-       class Meta:
-           model = Person
-           exclude = ['id']
-
-   class BookFlattenMapper(djangomodel.ModelMapper):
-       author = fields.DelegateField(PersonModelMapper, attach_parent=True)
-
-       class Meta:
-           model = Book
-
-
-結果はこのようになります:
-
-.. code-block:: pycon
-
-   >>> from myapp.models import Book
-   >>> book = Book.objects.get(pk=1)
-   >>> book
-   <Book: feizbook, feiz, 23>
-   >>> from myapp.mappers import BookFlattenMapper
-   >>> BookFlattenMapper(book).as_dict()
-   {'name': u'feiz', 'age': 23, 'id': 1, 'title': u'feizbook'}
-

File bpmappers/_sources/index.txt

-bpmappers ドキュメント
-======================
-
-コンテンツ:
-
-.. toctree::
-   :maxdepth: 2
-
-   intro
-   install
-   usage
-   flatten
-   djangomodel
-   reference
-
-索引
-====
-
-* :ref:`genindex`
-* :ref:`modindex`
-* :ref:`search`

File bpmappers/_sources/install.txt

-.. _install:
-
-インストール
-============
-
-インストールは `easy_install` や `pip` コマンドで行えます。
-
-easy_install によるインストール
--------------------------------
-
-::
-
-  $ sudo easy_install bpmappers
-
-pip によるインストール
-----------------------
-
-::
-
-  $ pip install bpmappers
-
-開発版リポジトリ
-----------------
-
-開発版のソースコードは `Mercurial` で管理され、 bitbucket.org でホストされています。
-
-https://bitbucket.org/tokibito/python-bpmappers/

File bpmappers/_sources/intro.txt

-.. _intro:
-
-概要
-====
-
-bpmappersは、Pythonのオブジェクトなどの値を別の辞書へマッピングする操作を支援するモジュールです。
-
-オブジェクトをJSONやXMLへシリアライズする際などに役立ちます。
-
-背景
-----
-
-レスポンスをJSONで返すとき、JSONのデータとモデルが一対一にならないことが頻繁にありました。
-
-例を示します。Personモデルを複数所有するTeamモデルがあったとします。TeamモデルのオブジェクトをJSONで返す ``response_json`` 関数を次のように書きました。
-
-.. code-block:: python
-
-   def _map_person(person):
-       " personオブジェクトのマッピング "
-       return {
-           'name': person.fullname,
-           'age': person.age,
-       }
-   
-   def _map_team(team):
-       " teamオブジェクトのマッピング "
-       return {
-            'name': team.name,
-            'point': team.point,
-            'persons': [_map_person(p) for p in team.persons.all()],
-       }
-   
-   def response_json(request):
-       team = Team.objects.get(pk=1)  # Djangoのマネージャを使用しています
-       return HttpResponse(json.dumps(_map_team(team)))
-
-さて、この時点ではさほど問題はありませんでしたが、後に機能追加、変更によりPersonのnameとTeamのnameのみを返すTeamのJSONが必要になりました。
-
-処理を追加したコードは次のようになりました。
-
-.. code-block:: python
-
-   def _map_person(person):
-       " personオブジェクトのマッピング "
-       return {
-           'name': person.fullname,
-           'age': person.age,
-       }
-   
-   def _map_team(team):
-       " teamオブジェクトのマッピング "
-       return {
-            'name': team.name,
-            'point': team.point,
-            'persons': [_map_person(p) for p in team.persons.all()],
-       }
-   
-   def _map_person_only_name(person):
-       " personオブジェクトのマッピング(名前のみ) "
-       return {
-           'name': person.fullname,
-       }
-   
-   def _map_team_person_name(team):
-       " teamオブジェクトのマッピング(名前のみ) "
-       return {
-            'name': team.name,
-            'persons': [_map_person_only_name(p) for p in team.persons.all()],
-       }
-   
-   def response_json(request):
-       team = Team.objects.get(pk=1)
-       return HttpResponse(json.dumps(_map_team(team)))
-
-   def response_json_name(request):
-       team = Team.objects.get(pk=1)
-       return HttpResponse(json.dumps(_map_team_person_name(team)))
-
-マッピング用の関数が少し冗長になってきました。似たようなマッピングなのでどうにかしてまとめたいです。
-
-しかし、例えばPersonモデルのマッピングを共通の関数を使用するようにした場合、Teamモデルのマッピングにも変更が必要になります。
-
-このように、マッピングの数や関連が多い場合、変更対してに柔軟に対応するのが難しくなってきて、やがて破綻します。
-
-こうした背景から、 bpmappers を開発しました。
-
-bpmappers を使用すると先ほどのコードは次のようになります。
-
-.. code-block:: python
-
-   class PersonNameMapper(Mapper):
-       " personオブジェクトのマッピング(名前のみ) "
-       name = RawField('fullname')
-
-   class PersonMapper(PersonNameMapper):
-       " personオブジェクトのマッピング "
-       age = RawField()
-
-   class TeamPersonNameMapper(Mapper):
-       " teamオブジェクトのマッピング(名前のみ) "
-       name = RawField()
-       persons = ListDelegateField(PersonNameMapper, filter=lambda manager:manager.all())
-
-   class TeamMapper(TeamPersonNameMapper):
-       " teamオブジェクトのマッピング "
-       point = RawField()
-       persons = ListDelegateField(PersonMapper, filter=lambda manager:manager.all())
-
-   def response_json(request):
-       team = Team.objects.get(pk=1)
-       return HttpResponse(json.dumps(TeamMapper(team).as_dict()))
-
-   def response_json_name(request):
-       team = Team.objects.get(pk=1)
-       return HttpResponse(json.dumps(TeamPersonNameMapper(team).as_dict()))
-
-似たようなマッピングは、継承を使って定義しています。リスト内包表記は ``ListDelegateField`` で置き換えられています。
-
-また、Mapperクラスにはフックポイントがいくつか用意されているため、後の変更や複雑なマッピングに対しても柔軟に対応できます。
-
-詳しい利用方法は次の :ref:`usage` を参照してください。

File bpmappers/_sources/reference.txt

-.. _reference:
-
-============
-リファレンス
-============
-
-class Mapper
-============
-
-.. class:: Mapper(data=None, \*\*options)
-
-:data: マッピング元のオブジェクト(デフォルト値: None).
-:\*\*options: オプション引数(デフォルト値: なし)
-
-.. method:: Mapper.as_dict()
-
-マッピングした順序付き辞書(SortedDict)を返します。
-
-.. method:: Mapper.filter_FOO(value)
-
-FOOにはフィールド名を指定します。
-
-オブジェクトから取り出してデータを評価したあとに実行されます。
-
-フィールドが NonKeyField の場合、引数なしで呼び出されます。
-
-.. method:: Mapper.after_filter_FOO(value)
-
-FOOにはフィールド名を指定します。
-
-Field.get_value のあとに実行されます。
-
-.. method:: Mapper.attach_FOO(parsed, value)
-
-:parsed: 変換済みのフィールド名-値の辞書
-:value: 変換済みの値
-
-FOOにはフィールド名を指定します。
-
-このメソッドを記述した場合、マッピング結果の辞書への値の追加は自前の処理で行う必要があります。
-
-.. method:: Mapper.order(parsed)
-
-:parsed: 変換済みのフィールド名-値の辞書
-
-as_dictメソッドの最後に呼ばれます。順序付き辞書のソート順を変更する場合にオーバーライドします。
-
-.. method:: Mapper.key_name(name, value, field)
-
-:name: マッピング先の辞書のキー名
-:value: 変換済みの値
-:field: 処理中のFieldオブジェクト
-
-as_dictメソッドから呼ばれます。マッピング先のキー名をマッピングの直前に変換したい場合に使います。
-
-class ModelMapper
-=================
-
-.. class:: ModelMapper(data=None, \*\*options)
-
-Djangoモデルクラスからマッピング定義を生成します。
-
-class NonKeyField
-=================
-
-.. class:: NonKeyField([callback=None, after_callback=None, \*args, \*\*kwargs])
-
-マッピング対象のdataにキーがない場合に使用します。
-
-class StubField
-===============
-
-.. class:: StubField([stub={}, \*args, \*\*kwargs])
-
-stubで指定した固定値を返すフィールドです。
-
-class Field
-===========
-
-.. class:: Field([key=None, callback=None, \*args, \*\*kwargs])
-
-キーを持つフィールドのクラス。通常は継承して使用します。
-
-class RawField
-==============
-
-.. class:: RawField([key=None, callback=None, \*args, \*\*kwargs])
-
-マッピング対象のdataに対してキーで取得した内容をそのまま返すフィールドです。
-
-class ChoiceField
-=================
-
-.. class:: ChoiceField(choices, [key=None, callback=None, \*args, \*\*kwargs])
-
-class DelegateField
-===================
-
-.. class:: DelegateField(mapper_class, [key=None, callback=None, before_filter=None, required=True, attach_parent=False, \*args, \*\*kwargs])
-
-.. method:: DelegateField.before_filiter(value)
-
-class NonKeyDelegateField
-=========================
-
-.. class:: NonKeyDelegateField(mapper_class, [callback=None, filter=None, required=True, attach_parent=False, \*args, \*\*kwargs])
-
-class ListDelegateField
-=======================
-
-.. class:: ListDelegateField(mapper_class, [key=None, callback=None, filter=None, after_filter=None, \*args, \*\*kwargs])
-
-.. method:: ListDelegateField.filter(value)
-
-.. method:: ListDelegateField.after_filter(value)
-
-class NonKeyListDelegateField
-=============================
-
-.. class:: NonKeyListDelegateField(mapper_class, [callback=None, \*args, \*\*kwargs])
-
-.. method:: NonKeyListDelegateField.filter(value=None)
-

File bpmappers/_sources/usage.txt

-.. _usage:
-
-使い方
-======
-
-マッピング定義
---------------
-
-bpmappers を使ったマッピング定義の基本的な形は次のようになります。
-
-.. code-block:: python
-
-   from bpmappers import Mapper, RawField
-   class MyMapper(Mapper):
-       mapping_to = RawField('mapping_from')
-
-``bpmappers.Mapper`` クラスを継承したクラスを定義します。
-各フィールドに対応するマッピングをクラス属性に ``RawField`` で定義します。
-``mapping_to`` はマッピング後のフィールド名、 ``mapping_from`` はマッピング対象のフィールド名です。
-``mapping_to`` と ``mapping_from`` が同じになる場合、 ``mapping_from`` を省略できます。
-
-シンプルなマッピング
---------------------
-
-シンプルなオブジェクトのマッピング例を以下に示します。
-
-.. 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}
-
-この例では、Personクラスのオブジェクトの要素を辞書にマッピングしています。
-出力される辞書では、 ``Person.name`` の値が ``username`` キーの値に、 ``Person.value`` の値が、 ``num`` キーの値にそれぞれマッピングされています。
-
-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}
-
-``bpmappers.djangomodel.ModelMapper`` を継承したクラスを定義し、ModelMapperを継承したクラスには ``Meta`` インナークラスを定義しています。
-``Meta.model`` にDjangoのモデルクラスを指定することで、モデルのフィールドから自動的にマッピング定義が生成されます。
-この例では、PersonモデルクラスからPersonMapperクラスを生成しています。
-
-別のマッパーへの委譲
---------------------
-
-特定のフィールドのマッピングを別のマッパークラスに委譲するには、 ``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'}}
-
-``bpmappers.DelegateField`` には、引数としてMapperを継承したクラスを指定します。
-この例では、 ``BookMapper.author`` の値は、 ``PersonMapper`` を使ってマッピングを行うように定義されています。
-
-リストのマッピング
-~~~~~~~~~~~~~~~~~~
-
-リストなどのシーケンスのマッピングを委譲するには、 ``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'}]}
-
-``bpmappers.ListDelegateField`` には、引数としてMapperを継承したクラスを指定します。
-この例では、 ``TeamMapper.members`` の値はリストとして展開されて、 ``PersonMapper`` を使ってマッピングを行うように定義されています。
-
-ドット区切りのフィールド指定による参照
----------------------------------------
-
-ドット区切りの指定で、深い階層の値を簡単に参照できます。
-
-.. doctest::
-
-   >>> from bpmappers import Mapper, RawField
-   >>> class HogeMapper(Mapper):
-   ...     hoge = RawField('hoge.piyo.fuga')
-   ...
-   >>> HogeMapper({'hoge': {'piyo': {'fuga': 123}}}).as_dict()
-   {'hoge': 123}
-
-.. note:: この機能はバージョン0.5で追加されました。
-
-複数の入力値を1つの値にまとめる
--------------------------------
-
-``Mapper.data`` はインスタンス作成時に引数で与えたものが格納されています。
-この例では、入力値としてリストを渡しています。
-
-.. doctest::
-
-   >>> from bpmappers import Mapper, NonKeyField
-   >>> class Person(object):
-   ...     def __init__(self, name):
-   ...         self.name = name
-   ...
-   >>> class MultiDataSourceMapper(Mapper):
-   ...     pair = NonKeyField()
-   ...     def filter_pair(self):
-   ...         return '%s-%s' % (self.data[0].name, self.data[1].name)
-   ...
-   >>> MultiDataSourceMapper([Person('foo'), Person('bar')]).as_dict()
-   {'pair': 'foo-bar'}
-
-
-フックポイント
---------------
-
-マッピング処理の途中で何か追加の処理を行いたい場合、いくつかのフックポイントを使用できます。
-
-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はフィールド名に置き換えてください。
-第一引数に、filter_FOOの結果の値が入ります。
-
-.. doctest::
-
-   >>> from bpmappers import Mapper, NonKeyField
-   >>> class MyMapper(Mapper):
-   ...     value = NonKeyField()
-   ...     def filter_value(self):
-   ...         return "oyoyo"
-   ...     
-   ...     def after_filter_value(self, val):
-   ...         return val.capitalize()
-   ... 
-   >>> mapper = MyMapper()
-   >>> print mapper.as_dict()
-   {'value': 'Oyoyo'}
-
-
-Mapper.attach_FOO
-~~~~~~~~~~~~~~~~~
-
-マッピングの結果の辞書に値を追加する前に実行されます。値を追加しない場合や、値の追加位置を変更する場合などに使用できます。
-
-.. doctest::
-
-   >>> from bpmappers import Mapper, NonKeyField, RawField
-   >>> class Point(object):
-   ...     def __init__(self, x, y):
-   ...         self.x = x
-   ...         self.y = y
-   ... 
-   >>> class PointMapper(Mapper):
-   ...     x = RawField("x")
-   ...     y = RawField("y")
-   ...
-   ...     def attach_x(self, parsed, x):
-   ...         parsed[x] = (x, x*x, x*x*x, x*x*x*x)
-   ...
-   ...     def attach_y(self, parsed, y):
-   ...         parsed[y] = "y is %s" % y
-   ... 
-   >>> mapper = PointMapper(Point(10, 20))
-   >>> print mapper.as_dict()
-   {20: 'y is 20', 10: (10, 100, 1000, 10000)}
-
-Field.callback
-~~~~~~~~~~~~~~
-
-フィールドの値変換の前に実行されます。 ``filter_FOO`` の後にフィールドクラスで実行されます。
-
-.. doctest::
-
-   >>> from bpmappers import Mapper, RawField, DelegateField
-   >>> class Person(object):
-   ...     def __init__(self, name):
-   ...        self.name = name
-   ... 
-   >>> class PersonInfoMapper(Mapper):
-   ...     info = RawField("name", callback = lambda v : "name:%s" % v)
-   ... 
-   >>> 
-   >>> class PersonInfoMapper2(Mapper):
-   ...     info = RawField("name", callback = lambda v : "name:%s" % v)
-   ...     
-   ...     def filter_info(self, v):
-   ...         return v+v
-   ... 
-   >>> mapper = PersonInfoMapper(Person("bucho"))
-   >>> print mapper.as_dict()
-   {'info': 'name:bucho'}
-   >>> mapper = PersonInfoMapper2(Person("bucho"))
-   >>> print mapper.as_dict()
-   {'info': 'name:buchobucho'}
-
-Field.after_callback
-~~~~~~~~~~~~~~~~~~~~
-
-フィールドの値変換の後に実行されます。 ``after_filter_FOO`` の前にフィールドクラスで実行されます。
-
-.. doctest::
-
-   >>> from bpmappers import Mapper, RawField, ListDelegateField
-   >>> class Person(object):
-   ...     def __init__(self, name):
-   ...         self.name = name
-   ... 
-   >>> class Book(object):
-   ...     def __init__(self, title, authors):
-   ...         self.title = title
-   ...         self.authors = authors
-   ... 
-   >>> class AuthorMapper(Mapper):
-   ...     author = RawField("name")
-   ... 
-   >>> class BookMapper(Mapper):
-   ...     title = RawField()
-   ...     authors = ListDelegateField(AuthorMapper)
-   ... 
-   >>> book = Book("be clound", [Person("bucho"), Person("shacho")])
-   >>> print BookMapper(book).as_dict()
-   {'authors': [{'author': 'bucho'}, {'author': 'shacho'}], 'title': 'be clound'}
-   >>> def get_vals(items):
-   ...     """
-   ...     辞書のリストから、値だけを取り出す関数
-   ... 
-   ...     >>> get_vals([{"pt":1}, {"pt":2}])
-   ...     [1, 2]
-   ...     """
-   ...     result = []
-   ...     for dic in items:
-   ...         for k, v in dic.items():
-   ...             result.append(v)
-   ...     return result
-   ... 
-   >>> class BookMapperExt(Mapper):
-   ...     title = RawField()
-   ...     authors = ListDelegateField(AuthorMapper, after_callback=get_vals)
-   ... 
-   >>> book = Book("be clound", [Person("bucho"), Person("shacho")])
-   >>> print BookMapperExt(book).as_dict()
-   {'authors': ['bucho', 'shacho'], 'title': 'be clound'}
-
-
-.. note::
-   filter_FOO, after_filter_FOO, callback, after_callbackは以下の順序で呼ばれます。
-
-   #. filter_FOO
-   #. callback
-   #. after_callback
-   #. after_filter_FOO
-
-   実行例
-
-   .. doctest::
-
-      >>> from bpmappers import Mapper, RawField, DelegateField
-      >>> class Person(object):
-      ...     def __init__(self, name):
-      ...         self.name = name
-      ... 
-      >>> class PersonInfoMapper(Mapper):
-      ...     info = RawField("name",
-      ...                     callback= lambda v :  "( cb: %s )" % v, 
-      ...                     after_callback = lambda v :  "[ after_cb: %s ]" % v)
-      ...
-      ...     def filter_info(self, v): 
-      ...         return "< filter: %s >" % v
-      ...
-      ...     def after_filter_info(self, v): 
-      ...         return "{ after_filter: %s }" % v
-      ... 
-      >>> mapper = PersonInfoMapper(Person("BP"))
-      >>> print mapper.as_dict()
-      {'info': '{ after_filter: [ after_cb: ( cb: < filter: BP > ) ] }'}       
-
-
-Mapper.key_name
-~~~~~~~~~~~~~~~
-
-キー名を変更したい場合などに使用します。
-
-.. doctest::
-
-   >>> from bpmappers import Mapper, RawField
-   >>> class NameSpaceMapper(Mapper):
-   ...     name = RawField()
-   ...     def key_name(self, name,  value, field):
-   ...         return 'namespace:%s' % name
-   ...
-   >>> NameSpaceMapper(dict(name='bucho')).as_dict()
-   {'namespace:name': 'bucho'}

File bpmappers/_static/alert_info_32.png

Removed
Old image

File bpmappers/_static/alert_warning_32.png

Removed
Old image

File bpmappers/_static/basic.css

-/*
- * basic.css
- * ~~~~~~~~~
- *
- * Sphinx stylesheet -- basic theme.
- *
- * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
- * :license: BSD, see LICENSE for details.
- *
- */
-
-/* -- main layout ----------------------------------------------------------- */
-
-div.clearer {
-    clear: both;
-}
-
-/* -- relbar ---------------------------------------------------------------- */
-
-div.related {
-    width: 100%;
-    font-size: 90%;
-}
-
-div.related h3 {
-    display: none;
-}
-
-div.related ul {
-    margin: 0;
-    padding: 0 0 0 10px;
-    list-style: none;
-}
-
-div.related li {
-    display: inline;
-}
-
-div.related li.right {
-    float: right;
-    margin-right: 5px;
-}
-
-/* -- sidebar --------------------------------------------------------------- */
-
-div.sphinxsidebarwrapper {
-    padding: 10px 5px 0 10px;
-}
-
-div.sphinxsidebar {
-    float: left;
-    width: 230px;
-    margin-left: -100%;
-    font-size: 90%;
-}
-
-div.sphinxsidebar ul {
-    list-style: none;
-}
-
-div.sphinxsidebar ul ul,
-div.sphinxsidebar ul.want-points {
-    margin-left: 20px;
-    list-style: square;
-}
-
-div.sphinxsidebar ul ul {
-    margin-top: 0;
-    margin-bottom: 0;
-}
-
-div.sphinxsidebar form {
-    margin-top: 10px;
-}
-
-div.sphinxsidebar input {
-    border: 1px solid #98dbcc;
-    font-family: sans-serif;
-    font-size: 1em;
-}
-
-img {
-    border: 0;
-}
-
-/* -- search page ----------------------------------------------------------- */
-
-ul.search {
-    margin: 10px 0 0 20px;
-    padding: 0;
-}
-
-ul.search li {
-    padding: 5px 0 5px 20px;
-    background-image: url(file.png);
-    background-repeat: no-repeat;
-    background-position: 0 7px;
-}
-
-ul.search li a {
-    font-weight: bold;
-}
-
-ul.search li div.context {
-    color: #888;
-    margin: 2px 0 0 30px;
-    text-align: left;
-}
-
-ul.keywordmatches li.goodmatch a {
-    font-weight: bold;
-}
-
-/* -- index page ------------------------------------------------------------ */
-
-table.contentstable {
-    width: 90%;
-}
-
-table.contentstable p.biglink {
-    line-height: 150%;
-}
-
-a.biglink {
-    font-size: 1.3em;
-}
-
-span.linkdescr {
-    font-style: italic;
-    padding-top: 5px;
-    font-size: 90%;
-}
-
-/* -- general index --------------------------------------------------------- */
-
-table.indextable {
-    width: 100%;
-}
-
-table.indextable td {
-    text-align: left;
-    vertical-align: top;
-}
-
-table.indextable dl, table.indextable dd {
-    margin-top: 0;
-    margin-bottom: 0;
-}
-
-table.indextable tr.pcap {
-    height: 10px;
-}
-
-table.indextable tr.cap {
-    margin-top: 10px;
-    background-color: #f2f2f2;
-}
-
-img.toggler {
-    margin-right: 3px;
-    margin-top: 3px;
-    cursor: pointer;
-}
-
-div.modindex-jumpbox {
-    border-top: 1px solid #ddd;
-    border-bottom: 1px solid #ddd;
-    margin: 1em 0 1em 0;
-    padding: 0.4em;
-}
-
-div.genindex-jumpbox {
-    border-top: 1px solid #ddd;
-    border-bottom: 1px solid #ddd;
-    margin: 1em 0 1em 0;
-    padding: 0.4em;
-}
-
-/* -- general body styles --------------------------------------------------- */
-
-a.headerlink {
-    visibility: hidden;
-}
-
-h1:hover > a.headerlink,
-h2:hover > a.headerlink,
-h3:hover > a.headerlink,
-h4:hover > a.headerlink,
-h5:hover > a.headerlink,
-h6:hover > a.headerlink,
-dt:hover > a.headerlink {
-    visibility: visible;
-}
-
-div.body p.caption {
-    text-align: inherit;
-}
-
-div.body td {
-    text-align: left;
-}
-
-.field-list ul {
-    padding-left: 1em;
-}
-
-.first {
-    margin-top: 0 !important;
-}
-
-p.rubric {
-    margin-top: 30px;
-    font-weight: bold;
-}
-
-img.align-left, .figure.align-left, object.align-left {
-    clear: left;
-    float: left;
-    margin-right: 1em;
-}
-
-img.align-right, .figure.align-right, object.align-right {
-    clear: right;
-    float: right;
-    margin-left: 1em;
-}
-
-img.align-center, .figure.align-center, object.align-center {
-  display: block;
-  margin-left: auto;
-  margin-right: auto;
-}
-
-.align-left {
-    text-align: left;
-}
-
-.align-center {
-    clear: both;
-    text-align: center;
-}
-
-.align-right {
-    text-align: right;
-}
-
-/* -- sidebars -------------------------------------------------------------- */
-
-div.sidebar {
-    margin: 0 0 0.5em 1em;
-    border: 1px solid #ddb;
-    padding: 7px 7px 0 7px;
-    background-color: #ffe;
-    width: 40%;
-    float: right;
-}
-
-p.sidebar-title {
-    font-weight: bold;
-}
-
-/* -- topics ---------------------------------------------------------------- */
-
-div.topic {
-    border: 1px solid #ccc;
-    padding: 7px 7px 0 7px;
-    margin: 10px 0 10px 0;
-}
-
-p.topic-title {
-    font-size: 1.1em;
-    font-weight: bold;
-    margin-top: 10px;
-}
-
-/* -- admonitions ----------------------------------------------------------- */
-
-div.admonition {
-    margin-top: 10px;
-    margin-bottom: 10px;
-    padding: 7px;
-}
-
-div.admonition dt {
-    font-weight: bold;
-}
-
-div.admonition dl {
-    margin-bottom: 0;
-}
-
-p.admonition-title {
-    margin: 0px 10px 5px 0px;
-    font-weight: bold;
-}
-
-div.body p.centered {
-    text-align: center;
-    margin-top: 25px;
-}
-
-/* -- tables ---------------------------------------------------------------- */
-
-table.docutils {
-    border: 0;
-    border-collapse: collapse;
-}
-
-table.docutils td, table.docutils th {
-    padding: 1px 8px 1px 5px;
-    border-top: 0;
-    border-left: 0;
-    border-right: 0;
-    border-bottom: 1px solid #aaa;
-}
-
-table.field-list td, table.field-list th {
-    border: 0 !important;
-}
-
-table.footnote td, table.footnote th {
-    border: 0 !important;
-}
-
-th {
-    text-align: left;
-    padding-right: 5px;
-}
-
-table.citation {
-    border-left: solid 1px gray;
-    margin-left: 1px;
-}
-
-table.citation td {
-    border-bottom: none;
-}
-
-/* -- other body styles ----------------------------------------------------- */
-
-ol.arabic {
-    list-style: decimal;
-}
-
-ol.loweralpha {
-    list-style: lower-alpha;
-}
-
-ol.upperalpha {
-    list-style: upper-alpha;
-}
-
-ol.lowerroman {
-    list-style: lower-roman;
-}
-
-ol.upperroman {
-    list-style: upper-roman;
-}
-
-dl {
-    margin-bottom: 15px;
-}
-
-dd p {
-    margin-top: 0px;
-}
-
-dd ul, dd table {
-    margin-bottom: 10px;
-}
-
-dd {
-    margin-top: 3px;
-    margin-bottom: 10px;
-    margin-left: 30px;
-}
-
-dt:target, .highlighted {
-    background-color: #fbe54e;
-}
-
-dl.glossary dt {
-    font-weight: bold;
-    font-size: 1.1em;
-}
-
-.field-list ul {
-    margin: 0;
-    padding-left: 1em;
-}
-
-.field-list p {
-    margin: 0;
-}
-
-.refcount {
-    color: #060;
-}
-
-.optional {
-    font-size: 1.3em;
-}
-
-.versionmodified {
-    font-style: italic;
-}
-
-.system-message {
-    background-color: #fda;
-    padding: 5px;
-    border: 3px solid red;
-}
-
-.footnote:target  {
-    background-color: #ffa;
-}
-
-.line-block {
-    display: block;
-    margin-top: 1em;
-    margin-bottom: 1em;
-}
-
-.line-block .line-block {
-    margin-top: 0;
-    margin-bottom: 0;
-    margin-left: 1.5em;
-}
-
-.guilabel, .menuselection {
-    font-family: sans-serif;
-}
-
-.accelerator {
-    text-decoration: underline;
-}
-
-.classifier {
-    font-style: oblique;
-}
-
-/* -- code displays --------------------------------------------------------- */
-
-pre {
-    overflow: auto;
-    overflow-y: hidden;  /* fixes display issues on Chrome browsers */
-}
-
-td.linenos pre {
-    padding: 5px 0px;
-    border: 0;
-    background-color: transparent;
-    color: #aaa;
-}
-
-table.highlighttable {
-    margin-left: 0.5em;
-}
-
-table.highlighttable td {
-    padding: 0 0.5em 0 0.5em;
-}
-
-tt.descname {
-    background-color: transparent;
-    font-weight: bold;
-    font-size: 1.2em;
-}
-
-tt.descclassname {
-    background-color: transparent;
-}
-
-tt.xref, a tt {
-    background-color: transparent;
-    font-weight: bold;
-}
-
-h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt {
-    background-color: transparent;
-}
-
-.viewcode-link {
-    float: right;
-}
-
-.viewcode-back {
-    float: right;
-    font-family: sans-serif;
-}
-
-div.viewcode-block:target {
-    margin: -1px -10px;
-    padding: 0 10px;
-}
-
-/* -- math display ---------------------------------------------------------- */
-
-img.math {
-    vertical-align: middle;
-}
-
-div.body div.math p {
-    text-align: center;
-}
-
-span.eqno {
-    float: right;
-}
-
-/* -- printout stylesheet --------------------------------------------------- */
-
-@media print {
-    div.document,
-    div.documentwrapper,
-    div.bodywrapper {
-        margin: 0 !important;
-        width: 100%;
-    }
-
-    div.sphinxsidebar,
-    div.related,
-    div.footer,
-    #top-link {
-        display: none;
-    }
-}

File bpmappers/_static/beproud.png

Removed
Old image

File bpmappers/_static/bg-page.png

Removed
Old image

File bpmappers/_static/bullet_orange.png

Removed
Old image

File bpmappers/_static/doctools.js

-/*
- * doctools.js
- * ~~~~~~~~~~~
- *
- * Sphinx JavaScript utilties for all documentation.
- *
- * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
- * :license: BSD, see LICENSE for details.
- *
- */
-
-/**
- * select a different prefix for underscore
- */
-$u = _.noConflict();
-
-/**
- * make the code below compatible with browsers without
- * an installed firebug like debugger
-if (!window.console || !console.firebug) {
-  var names = ["log", "debug", "info", "warn", "error", "assert", "dir",
-    "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace",
-    "profile", "profileEnd"];
-  window.console = {};
-  for (var i = 0; i < names.length; ++i)
-    window.console[names[i]] = function() {};
-}
- */
-
-/**
- * small helper function to urldecode strings
- */
-jQuery.urldecode = function(x) {
-  return decodeURIComponent(x).replace(/\+/g, ' ');
-}
-
-/**
- * small helper function to urlencode strings
- */
-jQuery.urlencode = encodeURIComponent;
-
-/**
- * This function returns the parsed url parameters of the
- * current request. Multiple values per key are supported,
- * it will always return arrays of strings for the value parts.
- */
-jQuery.getQueryParameters = function(s) {
-  if (typeof s == 'undefined')
-    s = document.location.search;
-  var parts = s.substr(s.indexOf('?') + 1).split('&');
-  var result = {};
-  for (var i = 0; i < parts.length; i++) {
-    var tmp = parts[i].split('=', 2);
-    var key = jQuery.urldecode(tmp[0]);
-    var value = jQuery.urldecode(tmp[1]);
-    if (key in result)
-      result[key].push(value);
-    else
-      result[key] = [value];
-  }
-  return result;
-};
-
-/**
- * small function to check if an array contains
- * a given item.
- */
-jQuery.contains = function(arr, item) {
-  for (var i = 0; i < arr.length; i++) {
-    if (arr[i] == item)
-      return true;
-  }
-  return false;
-};
-
-/**
- * highlight a given string on a jquery object by wrapping it in
- * span elements with the given class name.
- */
-jQuery.fn.highlightText = function(text, className) {
-  function highlight(node) {
-    if (node.nodeType == 3) {
-      var val = node.nodeValue;
-      var pos = val.toLowerCase().indexOf(text);
-      if (pos >= 0 && !jQuery(node.parentNode).hasClass(className)) {
-        var span = document.createElement("span");
-        span.className = className;
-        span.appendChild(document.createTextNode(val.substr(pos, text.length)));
-        node.parentNode.insertBefore(span, node.parentNode.insertBefore(
-          document.createTextNode(val.substr(pos + text.length)),
-          node.nextSibling));
-        node.nodeValue = val.substr(0, pos);
-      }
-    }
-    else if (!jQuery(node).is("button, select, textarea")) {
-      jQuery.each(node.childNodes, function() {
-        highlight(this);
-      });
-    }
-  }
-  return this.each(function() {
-    highlight(this);
-  });
-};
-
-/**
- * Small JavaScript module for the documentation.
- */
-var Documentation = {
-
-  init : function() {
-    this.fixFirefoxAnchorBug();
-    this.highlightSearchWords();
-    this.initIndexTable();
-  },
-
-  /**
-   * i18n support
-   */
-  TRANSLATIONS : {},
-  PLURAL_EXPR : function(n) { return n == 1 ? 0 : 1; },
-  LOCALE : 'unknown',
-
-  // gettext and ngettext don't access this so that the functions
-  // can safely bound to a different name (_ = Documentation.gettext)
-  gettext : function(string) {
-    var translated = Documentation.TRANSLATIONS[string];
-    if (typeof translated == 'undefined')
-      return string;
-    return (typeof translated == 'string') ? translated : translated[0];
-  },
-
-  ngettext : function(singular, plural, n) {
-    var translated = Documentation.TRANSLATIONS[singular];
-    if (typeof translated == 'undefined')
-      return (n == 1) ? singular : plural;
-    return translated[Documentation.PLURALEXPR(n)];
-  },
-
-  addTranslations : function(catalog) {
-    for (var key in catalog.messages)
-      this.TRANSLATIONS[key] = catalog.messages[key];
-    this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')');
-    this.LOCALE = catalog.locale;
-  },
-
-  /**
-   * add context elements like header anchor links
-   */
-  addContextElements : function() {
-    $('div[id] > :header:first').each(function() {
-      $('<a class="headerlink">\u00B6</a>').
-      attr('href', '#' + this.id).
-      attr('title', _('Permalink to this headline')).
-      appendTo(this);
-    });
-    $('dt[id]').each(function() {
-      $('<a class="headerlink">\u00B6</a>').
-      attr('href', '#' + this.id).
-      attr('title', _('Permalink to this definition')).
-      appendTo(this);
-    });
-  },
-
-  /**
-   * workaround a firefox stupidity
-   */
-  fixFirefoxAnchorBug : function() {
-    if (document.location.hash && $.browser.mozilla)
-      window.setTimeout(function() {
-        document.location.href += '';
-      }, 10);
-  },
-
-  /**
-   * highlight the search words provided in the url in the text
-   */
-  highlightSearchWords : function() {
-    var params = $.getQueryParameters();
-    var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : [];
-    if (terms.length) {
-      var body = $('div.body');
-      window.setTimeout(function() {
-        $.each(terms, function() {
-          body.highlightText(this.toLowerCase(), 'highlighted');
-        });
-      }, 10);
-      $('<li class="highlight-link"><a href="javascript:Documentation.' +
-        'hideSearchWords()">' + _('Hide Search Matches') + '</a></li>')
-          .appendTo($('.sidebar .this-page-menu'));
-    }
-  },
-
-  /**
-   * init the domain index toggle buttons
-   */
-  initIndexTable : function() {
-    var togglers = $('img.toggler').click(function() {
-      var src = $(this).attr('src');
-      var idnum = $(this).attr('id').substr(7);
-      $('tr.cg-' + idnum).toggle();
-      if (src.substr(-9) == 'minus.png')
-        $(this).attr('src', src.substr(0, src.length-9) + 'plus.png');
-      else
-        $(this).attr('src', src.substr(0, src.length-8) + 'minus.png');
-    }).css('display', '');
-    if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) {
-        togglers.click();
-    }
-  },
-
-  /**
-   * helper function to hide the search marks again
-   */
-  hideSearchWords : function() {
-    $('.sidebar .this-page-menu li.highlight-link').fadeOut(300);
-    $('span.highlighted').removeClass('highlighted');
-  },
-
-  /**
-   * make the url absolute
-   */
-  makeURL : function(relativeURL) {
-    return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL;
-  },
-
-  /**
-   * get the current relative url
-   */
-  getCurrentURL : function() {
-    var path = document.location.pathname;
-    var parts = path.split(/\//);
-    $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() {
-      if (this == '..')
-        parts.pop();
-    });
-    var url = parts.join('/');
-    return path.substring(url.lastIndexOf('/') + 1, path.length - 1);
-  }
-};
-
-// quick alias for translations
-_ = Documentation.gettext;
-
-$(document).ready(function() {
-  Documentation.init();
-});

File bpmappers/_static/file.png

Removed
Old image

File bpmappers/_static/haiku.css

-/*
- * haiku.css_t
- * ~~~~~~~~~~~
- *
- * Sphinx stylesheet -- haiku theme.
- *
- * Adapted from http://haiku-os.org/docs/Haiku-doc.css.
- * Original copyright message:
- *
- *     Copyright 2008-2009, Haiku. All rights reserved.
- *     Distributed under the terms of the MIT License.
- *
- *     Authors:
- *              Francois Revol <revol@free.fr>
- *              Stephan Assmus <superstippi@gmx.de>
- *              Braden Ewing <brewin@gmail.com>
- *              Humdinger <humdingerb@gmail.com>
- *
- * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
- * :license: BSD, see LICENSE for details.
- *
- */
-
-@import url("basic.css");
-
-html {
-    margin: 0px;
-    padding: 0px;
-    background: #FFF url(bg-page.png) top left repeat-x;
-}
-
-body {
-    line-height: 1.5;
-    margin: auto;
-    padding: 0px;
-    font-family: "DejaVu Sans", Arial, Helvetica, sans-serif;
-    min-width: 59em;
-    max-width: 70em;
-    color: #456;
-}
-
-div.footer {
-    padding: 8px;
-    font-size: 11px;
-    text-align: center;
-    letter-spacing: 0.5px;
-}
-
-/* link colors and text decoration */
-
-a:link {
-    font-weight: bold;
-    text-decoration: none;
-    color: #A00000;
-}
-
-a:visited {
-    font-weight: bold;
-    text-decoration: none;
-    color: #A00000;
-}
-
-a:hover, a:active {
-    text-decoration: underline;
-    color: #ff4500;
-}
-
-/* Some headers act as anchors, don't give them a hover effect */
-
-h1 a:hover, a:active {
-    text-decoration: none;
-    color: #0c3762;
-}
-
-h2 a:hover, a:active {
-    text-decoration: none;
-    color: #0c3762;
-}
-
-h3 a:hover, a:active {
-    text-decoration: none;
-    color: #0c3762;
-}
-
-h4 a:hover, a:active {
-    text-decoration: none;
-    color: #0c3762;
-}
-
-a.headerlink {
-    color: #a7ce38;
-    padding-left: 5px;
-}
-
-a.headerlink:hover {
-    color: #a7ce38;
-}
-
-/* basic text elements */
-
-div.content {
-    margin-top: 20px;
-    margin-left: 40px;
-    margin-right: 40px;
-    margin-bottom: 50px;
-    font-size: 0.9em;
-}
-
-/* heading and navigation */
-
-div.header {
-    position: relative;
-    left: 0px;
-    top: 0px;
-    height: 85px;
-    /* background: #eeeeee; */
-    padding: 0 40px;
-}
-div.header h1 {
-    font-size: 1.6em;
-    font-weight: normal;
-    letter-spacing: 1px;
-    color: #0c3762;
-    border: 0;
-    margin: 0;
-    padding-top: 15px;
-}
-div.header h1 a {
-    font-weight: normal;
-    color: #0c3762;
-}
-div.header h2 {
-    font-size: 1.3em;
-    font-weight: normal;
-    letter-spacing: 1px;
-    text-transform: uppercase;
-    color: #aaa;
-    border: 0;
-    margin-top: -3px;
-    padding: 0;
-}
-
-div.header img.rightlogo {
-    float: right;
-}
-
-
-div.title {
-    font-size: 1.3em;
-    font-weight: bold;
-    color: #0c3762;
-    border-bottom: dotted thin #e0e0e0;
-    margin-bottom: 25px;
-}
-div.topnav {
-    /* background: #e0e0e0; */
-}
-div.topnav p {
-    margin-top: 0;
-    margin-left: 40px;
-    margin-right: 40px;
-    margin-bottom: 0px;
-    text-align: right;
-    font-size: 0.8em;
-}
-div.bottomnav {
-    background: #eeeeee;
-}
-div.bottomnav p {
-    margin-right: 40px;
-    text-align: right;
-    font-size: 0.8em;
-}
-
-a.uplink {
-    font-weight: normal;
-}
-
-
-/* contents box */
-
-table.index {
-    margin: 0px 0px 30px 30px;
-    padding: 1px;
-    border-width: 1px;
-    border-style: dotted;
-    border-color: #e0e0e0;
-}
-table.index tr.heading {
-    background-color: #e0e0e0;
-    text-align: center;
-    font-weight: bold;
-    font-size: 1.1em;
-}
-table.index tr.index {
-    background-color: #eeeeee;
-}
-table.index td {
-    padding: 5px 20px;
-}
-
-table.index a:link, table.index a:visited {
-    font-weight: normal;
-    text-decoration: none;
-    color: #A00000;
-}
-table.index a:hover, table.index a:active {
-    text-decoration: underline;
-    color: #ff4500;
-}
-
-
-/* Haiku User Guide styles and layout */
-
-/* Rounded corner boxes */
-/* Common declarations */
-div.admonition {
-    -webkit-border-radius: 10px;
-    -khtml-border-radius: 10px;
-    -moz-border-radius: 10px;
-    border-radius: 10px;
-    border-style: dotted;
-    border-width: thin;
-    border-color: #dcdcdc;
-    padding: 10px 15px 10px 15px;
-    margin-bottom: 15px;
-    margin-top: 15px;
-}
-div.note {
-    padding: 10px 15px 10px 80px;
-    background: #e4ffde url(alert_info_32.png) 15px 15px no-repeat;
-    min-height: 42px;
-}
-div.warning {
-    padding: 10px 15px 10px 80px;
-    background: #fffbc6 url(alert_warning_32.png) 15px 15px no-repeat;
-    min-height: 42px;
-}
-div.seealso {
-    background: #e4ffde;
-}
-
-/* More layout and styles */
-h1 {
-    font-size: 1.3em;
-    font-weight: bold;
-    color: #0c3762;
-    border-bottom: dotted thin #e0e0e0;
-    margin-top: 30px;
-}
-
-h2 {
-    font-size: 1.2em;
-    font-weight: normal;
-    color: #0c3762;
-    border-bottom: dotted thin #e0e0e0;
-    margin-top: 30px;
-}
-
-h3 {
-    font-size: 1.1em;
-    font-weight: normal;
-    color: #0c3762;
-    margin-top: 30px;
-}
-
-h4 {
-    font-size: 1.0em;
-    font-weight: normal;
-    color: #0c3762;
-    margin-top: 30px;
-}
-
-p {
-    text-align: justify;
-}
-
-p.last {
-    margin-bottom: 0;
-}
-
-ol {
-    padding-left: 20px;
-}
-
-ul {
-    padding-left: 5px;
-    margin-top: 3px;
-}
-
-li {
-    line-height: 1.3;
-}
-
-div.content ul > li {
-    -moz-background-clip:border;
-    -moz-background-inline-policy:continuous;
-    -moz-background-origin:padding;
-    background: transparent url(bullet_orange.png) no-repeat scroll left 0.45em;
-    list-style-image: none;
-    list-style-type: none;
-    padding: 0 0 0 1.666em;
-    margin-bottom: 3px;
-}
-
-td {
-    vertical-align: top;
-}
-
-tt {
-    background-color: #e2e2e2;
-    font-size: 1.0em;
-    font-family: monospace;
-}
-
-pre {
-    border-color: #0c3762;
-    border-style: dotted;
-    border-width: thin;
-    margin: 0 0 12px 0;
-    padding: 0.8em;
-    background-color: #f0f0f0;
-}
-
-hr {
-    border-top: 1px solid #ccc;
-    border-bottom: 0;
-    border-right: 0;
-    border-left: 0;
-    margin-bottom: 10px;
-    margin-top: 20px;
-}
-
-/* printer only pretty stuff */
-@media print {
-    .noprint {
-        display: none;
-    }
-    /* for acronyms we want their definitions inlined at print time */
-    acronym[title]:after {
-        font-size: small;
-        content: " (" attr(title) ")";
-        font-style: italic;
-    }
-    /* and not have mozilla dotted underline */
-    acronym {
-        border: none;
-    }
-    div.topnav, div.bottomnav, div.header, table.index {
-        display: none;
-    }
-    div.content {
-        margin: 0px;
-        padding: 0px;
-    }
-    html {
-        background: #FFF;
-    }
-}
-
-.viewcode-back {
-    font-family: "DejaVu Sans", Arial, Helvetica, sans-serif;
-}
-
-div.viewcode-block:target {
-    background-color: #f4debf;
-    border-top: 1px solid #ac9;
-    border-bottom: 1px solid #ac9;
-    margin: -1px -12px;
-    padding: 0 12px;
-}

File bpmappers/_static/jquery.js

-/*!
- * jQuery JavaScript Library v1.4.2
- * http://jquery.com/
- *
- * Copyright 2010, John Resig
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * Includes Sizzle.js
- * http://sizzlejs.com/
- * Copyright 2010, The Dojo Foundation
- * Released under the MIT, BSD, and GPL Licenses.
- *
- * Date: Sat Feb 13 22:33:48 2010 -0500
- */
-(function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(ma,1);return}c.ready()}}function Qa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,j){var i=a.length;if(typeof b==="object"){for(var o in b)X(a,o,b[o],f,e,d);return a}if(d!==w){f=!j&&f&&c.isFunction(d);for(o=0;o<i;o++)e(a[o],b,f?d.call(a[o],o,e(a[o],b)):d,j);return a}return i?
-e(a[0],b):w}function J(){return(new Date).getTime()}function Y(){return false}function Z(){return true}function na(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function oa(a){var b,d=[],f=[],e=arguments,j,i,o,k,n,r;i=c.data(this,"events");if(!(a.liveFired===this||!i||!i.live||a.button&&a.type==="click")){a.liveFired=this;var u=i.live.slice(0);for(k=0;k<u.length;k++){i=u[k];i.origType.replace(O,"")===a.type?f.push(i.selector):u.splice(k--,1)}j=c(a.target).closest(f,a.currentTarget);n=0;for(r=
-j.length;n<r;n++)for(k=0;k<u.length;k++){i=u[k];if(j[n].selector===i.selector){o=j[n].elem;f=null;if(i.preType==="mouseenter"||i.preType==="mouseleave")f=c(a.relatedTarget).closest(i.selector)[0];if(!f||f!==o)d.push({elem:o,handleObj:i})}}n=0;for(r=d.length;n<r;n++){j=d[n];a.currentTarget=j.elem;a.data=j.handleObj.data;a.handleObj=j.handleObj;if(j.handleObj.origHandler.apply(j.elem,e)===false){b=false;break}}return b}}function pa(a,b){return"live."+(a&&a!=="*"?a+".":"")+b.replace(/\./g,"`").replace(/ /g,
-"&")}function qa(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function ra(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var f=c.data(a[d++]),e=c.data(this,f);if(f=f&&f.events){delete e.handle;e.events={};for(var j in f)for(var i in f[j])c.event.add(this,j,f[j][i],f[j][i].data)}}})}function sa(a,b,d){var f,e,j;b=b&&b[0]?b[0].ownerDocument||b[0]:s;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===s&&!ta.test(a[0])&&(c.support.checkClone||!ua.test(a[0]))){e=
-true;if(j=c.fragments[a[0]])if(j!==1)f=j}if(!f){f=b.createDocumentFragment();c.clean(a,b,f,d)}if(e)c.fragments[a[0]]=j?f:1;return{fragment:f,cacheable:e}}function K(a,b){var d={};c.each(va.concat.apply([],va.slice(0,b)),function(){d[this]=a});return d}function wa(a){return"scrollTo"in a&&a.document?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var c=function(a,b){return new c.fn.init(a,b)},Ra=A.jQuery,Sa=A.$,s=A.document,T,Ta=/^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,Ua=/^.[^:#\[\.,]*$/,Va=/\S/,
-Wa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(a==="body"&&!b){this.context=s;this[0]=s.body;this.selector="body";this.length=1;return this}if(typeof a==="string")if((d=Ta.exec(a))&&
-(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=sa([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a);return c.merge(this,
-a)}else return!b||b.jquery?(b||T).find(a):c(b).find(a);else if(c.isFunction(a))return T.ready(a);if(a.selector!==w){this.selector=a.selector;this.context=a.context}return c.makeArray(a,this)},selector:"",jquery:"1.4.2",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){var f=c();c.isArray(a)?ba.apply(f,a):c.merge(f,a);f.prevObject=this;f.context=this.context;if(b===
-"find")f.selector=this.selector+(this.selector?" ":"")+d;else if(b)f.selector=this.selector+"."+b+"("+d+")";return f},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this,
-function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,j,i,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b<d;b++)if((e=arguments[b])!=null)for(j in e){i=a[j];o=e[j];if(a!==o)if(f&&o&&(c.isPlainObject(o)||c.isArray(o))){i=i&&(c.isPlainObject(i)||
-c.isArray(i))?i:c.isArray(o)?[]:{};a[j]=c.extend(f,i,o)}else if(o!==w)a[j]=o}return a};c.extend({noConflict:function(a){A.$=Sa;if(a)A.jQuery=Ra;return c},isReady:false,ready:function(){if(!c.isReady){if(!s.body)return setTimeout(c.ready,13);c.isReady=true;if(Q){for(var a,b=0;a=Q[b++];)a.call(s,c);Q=null}c.fn.triggerHandler&&c(s).triggerHandler("ready")}},bindReady:function(){if(!xa){xa=true;if(s.readyState==="complete")return c.ready();if(s.addEventListener){s.addEventListener("DOMContentLoaded",
-L,false);A.addEventListener("load",c.ready,false)}else if(s.attachEvent){s.attachEvent("onreadystatechange",L);A.attachEvent("onload",c.ready);var a=false;try{a=A.frameElement==null}catch(b){}s.documentElement.doScroll&&a&&ma()}}},isFunction:function(a){return $.call(a)==="[object Function]"},isArray:function(a){return $.call(a)==="[object Array]"},isPlainObject:function(a){if(!a||$.call(a)!=="[object Object]"||a.nodeType||a.setInterval)return false;if(a.constructor&&!aa.call(a,"constructor")&&!aa.call(a.constructor.prototype,
-"isPrototypeOf"))return false;var b;for(b in a);return b===w||aa.call(a,b)},isEmptyObject:function(a){for(var b in a)return false;return true},error:function(a){throw a;},parseJSON:function(a){if(typeof a!=="string"||!a)return null;a=c.trim(a);if(/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return A.JSON&&A.JSON.parse?A.JSON.parse(a):(new Function("return "+
-a))();else c.error("Invalid JSON: "+a)},noop:function(){},globalEval:function(a){if(a&&Va.test(a)){var b=s.getElementsByTagName("head")[0]||s.documentElement,d=s.createElement("script");d.type="text/javascript";if(c.support.scriptEval)d.appendChild(s.createTextNode(a));else d.text=a;b.insertBefore(d,b.firstChild);b.removeChild(d)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,b,d){var f,e=0,j=a.length,i=j===w||c.isFunction(a);if(d)if(i)for(f in a){if(b.apply(a[f],
-d)===false)break}else for(;e<j;){if(b.apply(a[e++],d)===false)break}else if(i)for(f in a){if(b.call(a[f],f,a[f])===false)break}else for(d=a[0];e<j&&b.call(d,e,d)!==false;d=a[++e]);return a},trim:function(a){return(a||"").replace(Wa,"")},makeArray:function(a,b){b=b||[];if(a!=null)a.length==null||typeof a==="string"||c.isFunction(a)||typeof a!=="function"&&a.setInterval?ba.call(b,a):c.merge(b,a);return b},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var d=0,f=b.length;d<f;d++)if(b[d]===
-a)return d;return-1},merge:function(a,b){var d=a.length,f=0;if(typeof b.length==="number")for(var e=b.length;f<e;f++)a[d++]=b[f];else for(;b[f]!==w;)a[d++]=b[f++];a.length=d;return a},grep:function(a,b,d){for(var f=[],e=0,j=a.length;e<j;e++)!d!==!b(a[e],e)&&f.push(a[e]);return f},map:function(a,b,d){for(var f=[],e,j=0,i=a.length;j<i;j++){e=b(a[j],j,d);if(e!=null)f[f.length]=e}return f.concat.apply([],f)},guid:1,proxy:function(a,b,d){if(arguments.length===2)if(typeof b==="string"){d=a;a=d[b];b=w}else if(b&&
-!c.isFunction(b)){d=b;b=w}if(!b&&a)b=function(){return a.apply(d||this,arguments)};if(a)b.guid=a.guid=a.guid||b.guid||c.guid++;return b},uaMatch:function(a){a=a.toLowerCase();a=/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version)?[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||!/compatible/.test(a)&&/(mozilla)(?:.*? rv:([\w.]+))?/.exec(a)||[];return{browser:a[1]||"",version:a[2]||"0"}},browser:{}});P=c.uaMatch(P);if(P.browser){c.browser[P.browser]=true;c.browser.version=P.version}if(c.browser.webkit)c.browser.safari=
-true;if(ya)c.inArray=function(a,b){return ya.call(b,a)};T=c(s);if(s.addEventListener)L=function(){s.removeEventListener("DOMContentLoaded",L,false);c.ready()};else if(s.attachEvent)L=function(){if(s.readyState==="complete"){s.detachEvent("onreadystatechange",L);c.ready()}};(function(){c.support={};var a=s.documentElement,b=s.createElement("script"),d=s.createElement("div"),f="script"+J();d.style.display="none";d.innerHTML="   <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
-var e=d.getElementsByTagName("*"),j=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!j)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(j.getAttribute("style")),hrefNormalized:j.getAttribute("href")==="/a",opacity:/^0.55$/.test(j.style.opacity),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected,
-parentNode:d.removeChild(d.appendChild(s.createElement("div"))).parentNode===null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(i){}a.insertBefore(b,a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}try{delete b.test}catch(o){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function k(){c.support.noCloneEvent=
-false;d.detachEvent("onclick",k)});d.cloneNode(true).fireEvent("onclick")}d=s.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=s.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var k=s.createElement("div");k.style.width=k.style.paddingLeft="1px";s.body.appendChild(k);c.boxModel=c.support.boxModel=k.offsetWidth===2;s.body.removeChild(k).style.display="none"});a=function(k){var n=
-s.createElement("div");k="on"+k;var r=k in n;if(!r){n.setAttribute(k,"return;");r=typeof n[k]==="function"}return r};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=j=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ya=0,za={};c.extend({cache:{},expando:G,noData:{embed:true,object:true,
-applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var f=a[G],e=c.cache;if(!f&&typeof b==="string"&&d===w)return null;f||(f=++Ya);if(typeof b==="object"){a[G]=f;e[f]=c.extend(true,{},b)}else if(!e[f]){a[G]=f;e[f]={}}a=e[f];if(d!==w)a[b]=d;return typeof b==="string"?a[b]:a}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else