{ "info": { "author": "righ", "author_email": "righ.m9@gmail.com", "bugtrack_url": null, "classifiers": [ "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python", "Topic :: Software Development" ], "description": ".. image:: https://circleci.com/gh/righ/d2a.svg?style=svg\n :target: https://circleci.com/gh/righ/d2a\n\nRequirements\n============\n- Python: 2.7.15 or later, 3.4 or later.\n\n - Tested with 2.7.15, 3.6\n\n- Django: 1.9 or later.\n\n - Tested with 1.11, 2.0, 2.1\n\n- SQLAlchemy: 0.9 or later.\n\n - Tested with 1.2\n\nInstallation\n============\n\n.. code:: bash\n\n $ pip install d2a\n\nUsage\n=====\n\nAuto loading\n------------\nJust add `d2a` to ``settings.INSTALLED_APPS``.\n\n.. code-block:: python\n\n INSTALLED_APPS = [\n 'django.contrib.admin',\n 'django.contrib.auth',\n 'django.contrib.contenttypes',\n 'django.contrib.sessions',\n 'django.contrib.messages',\n 'django.contrib.staticfiles',\n\n # top or here\n 'd2a',\n\n # example apps\n 'books',\n 'sales',\n ]\n\n.. warning::\n\n Put it before apps you made as you can.\n Because it expects to register alchemy model before the other ``apps.py``.\n\nThen `models_sqla` (default) in all apps will be imported as a module.\n\n.. code:: python\n\n >>> from books import models_sqla\n >>> models_sqla. # tab completion\n models_sqla.Author( models_sqla.BookCategory( models_sqla.CategoryRelation( models_sqla.transfer(\n models_sqla.Book( models_sqla.Category( models_sqla.models\n\n >>> models_sqla.Book\n \n\n >>> models_sqla.Book. # tab completion\n models_sqla.Book.author models_sqla.Book.content models_sqla.Book.metadata models_sqla.Book.tags\n models_sqla.Book.author_id models_sqla.Book.description models_sqla.Book.mro( models_sqla.Book.title\n models_sqla.Book.category models_sqla.Book.id models_sqla.Book.price\n # SQL Expression schema\n >>> models_sqla.Book.__table__\n Table(\n 'book', MetaData(bind=None), \n Column('id', UUID(), table=, primary_key=True, nullable=False, default=ColumnDefault()), \n Column('price', JSON(astext_type=Text()), table=, nullable=False), \n Column('title', VARCHAR(length=255), table=, nullable=False), \n Column('description', TEXT(), table=),\n Column('author_id', INTEGER(), ForeignKey('author.id'), table=), \n Column('content', BYTEA(), table=, nullable=False), \n Column('tags', ARRAY(VARCHAR()), table=, nullable=False), \n schema=None\n )\n\nAlso, it can extract model declared implicitly depending on m2m field.\n(in this case, `BookCategory`)\n\n.. note::\n\n You can set configrations to ``settings.py``.\n\n Example:\n\n .. code-block:: python\n\n # This variable can be omitted.\n D2A_CONFIG = {\n 'AUTOLOAD': { # optional\n # module name: It can be used different module name from `models_sqla`.\n 'module': 'modelsa', # optional, default: 'models_sqla'\n # waiting seconds during autoloading\n 'seconds': 5, # default: 1\n # transfer function's args after 'exports' arg.\n 'option': { # optional\n 'db_type': 'postgresql', # default: 'default'\n 'back_type': 'backref', # default: 'backref'\n 'as_table': True, # default: False\n 'name_formatter': str.upper, # default: get_camelcase\n }\n },\n # converting rules for customized fields\n 'ALIASES': { # optional\n # Evaluates ExtendedImageField as ImageField\n ExtendedImageField: models.ImageField,\n },\n }\n\n\nPer models module\n-----------------\nIf you want to create a module manually, create a `models_sqla.py` in the apps.\n\nWrite like the following to it:\n\n.. code-block:: python3\n\n from d2a import transfer\n from . import models\n transfer(models, globals())\n\n`models_sqla.py` exists, auto module creation will be omitted.\n\nAnd if you create every `models_sqla.py` manually,\nit is unnecessary to set `d2a` to ``settings.INSTALLED_APPS``.\n\nExample:\n\n- `project_postgresql/books/models_sqla.py `_\n- You can omit specifying `db_type`, then it automatically detects a database type from ``settings.DATABASES['default']``.\n\n - Now `postgresql`, `mysql` and `oracle` are allowed,\n the other types will be converted to the following types as ``default`` type: \n `sqlalchemy/types.py `_\n\nPer model\n---------\nIf you just want to convert one model, you should use `declare` function.\n\n.. code:: python\n\n >>> from d2a import declare\n >>> from sales.models import Sales\n >>> sales = declare(Sales)\n >>> sales\n \n\n >>> sales.__table__\n Table(\n 'sales', MetaData(bind=None), \n Column('id', BIGINT(), table=, primary_key=True, nullable=False), \n Column('book_id', UUID(), ForeignKey('book.id'), table=, nullable=False), \n Column('sold', TIMESTAMP(), table=, nullable=False), \n Column('reservation', INTERVAL(), table=), \n Column('source', INET(), table=), \n schema=None\n )\n\n >>> sales.\n sales.book sales.id sales.mro( sales.sold\n sales.book_id sales.metadata sales.reservation sales.source\n\nCustom fields\n-------------\nIf you are using customized field (not built-in),\nyou can register the field as the other field using `alias` or `alias_dict` method.\n\n.. code:: python\n\n from django.db.models import ImageField\n\n class ExtendedImageField(ImageField):\n \"\"\"something customizing\"\"\"\n\n from d2a import alias\n alias(ExtendedImageField, ImageField)\n\n # or\n alias_dict({\n ExtendedImageField: ImageField,\n })\n\nQuerying shortcut\n------------------\nORM\n~~~~~~~~~~~~~~~~~~\nThere is a function named `make_session` for ORM mode.\n\n.. code-block:: python3\n\n >>> from d2a import make_session\n >>> from books.models_sqla import Author\n\n >>> with make_session() as session:\n ... # it commits and flushes automatically when the scope exits.\n ... a = Author()\n ... a.name = 'righ'\n ... a.age = 30\n ... session.add(a)\n ...\n >>> with make_session() as session:\n ... # when the session was rolled back or causes some exception in the context,\n ... # it won't register records in the session.\n ... a = Author()\n ... a.name = 'teruhiko'\n ... a.age = 85\n ... session.add(a)\n ... session.rollback()\n ...\n >>> with make_session() as session:\n ... session.query(Author.name, Author.age).all()\n ...\n [('righ', 30)]\n\nIt receives the following arguments:\n\n:engine: engine object or database-type (**string**) (default: None). When it is omitted, it guesses database type and gets an engine automatically.\n:autoflush: It is the same as `sessionmaker `__ (default: True)\n:autocommit: It is the same as `sessionmaker `__ (default: False)\n:expire_on_commit: It is the same as `sessionmaker `__ (default: True)\n:info: It is the same as `sessionmaker `__ (default: None)\n\nAll arguments can be omitted.\n\nExpression\n~~~~~~~~~~~~~~~~~~\nThere are two functions.\n\n:query_expression: To retrieve `SELECT` results, and returns a list containing record.\n:execute_expression: To execute `INSERT`, `DELETE`, `UPDATE` statements, and returns num of records having been affected.\n\n.. code-block:: python3\n\n >>> from sqlalchemy import (\n ... select,\n ... insert,\n ... )\n\n >>> from d2a import query_expression, execute_expression\n\n # if you try on `project_mysql` demo, you should write ``from books.modelsa import Author``\n >>> from books.models_sqla import Author\n\n >>> AuthorTable = Author.__table__\n\n >>> records = [\n ... {'name': 'a', 'age': 10},\n ... {'name': 'b', 'age': 30},\n ... {'name': 'c', 'age': 20},\n ... ]\n\n >>> # insert\n >>> stmt = insert(AuthorTable).values(records)\n >>> execute_expression(stmt)\n 3\n\n >>> # select\n >>> stmt = select([\n ... AuthorTable.c.id,\n ... AuthorTable.c.name,\n ... AuthorTable.c.age,\n ... ]).select_from(AuthorTable).order_by(AuthorTable.c.age)\n >>> query_expression(stmt)\n [\n OrderedDict([('id', 12), ('name', 'a'), ('age', 10)]),\n OrderedDict([('id', 14), ('name', 'c'), ('age', 20)]),\n OrderedDict([('id', 13), ('name', 'b'), ('age', 30)])\n ]\n\n >>> # record as tuple\n >>> query_expression(stmt, as_col_dict=False)\n [(12, 'a', 10), (14, 'c', 20), (13, 'b', 30)]\n\n >>> query_expression(stmt, as_col_dict=False, debug={'printer': print, 'show_explain': True, 'sql_format': True})\n ====================================================================================================\n SELECT author.id,\n author.name,\n author.age\n FROM author\n ORDER BY author.age\n ====================================================================================================\n Sort (cost=16.39..16.74 rows=140 width=522) (actual time=0.027..0.028 rows=18 loops=1)\n Sort Key: age\n Sort Method: quicksort Memory: 25kB\n -> Seq Scan on author (cost=0.00..11.40 rows=140 width=522) (actual time=0.007..0.009 rows=18 loops=1)\n Planning time: 0.072 ms\n Execution time: 0.047 ms\n [(12, 'a', 10), (14, 'c', 20), (13, 'b', 30)]\n\n.. note::\n\n I added argument of ``query_expression()`` to see debugging information.\n\n Specify options as dict type like the following:\n\n .. code-block:: python3\n\n query_expression(stmt, debug={ # all options can be skipped.\n 'show_sql': True, # if showing the sql query or not.\n 'show_explain': False, # if showing explain for the sql query or not.\n 'sql_format': False, # if formatting the sql query or not.\n 'sql_reindent': True, # if setting indent the sql query or not.\n 'sql_keyword_case': 'upper', # A rule converting reserved words.\n 'explain_prefix': depends on the database type. unless you specify it, an appropriate prefix will be automatically used.\n 'printer': logger.debug, # printing method, if you use python3, then try `print` function.\n 'delimiter': '=' * 100, # characters dividing debug informations.\n 'database': 'default' # django database\n })\n\n Default is ``{}`` (An empty dict means disabling debug.)\n\n.. warning::\n\n Supported auto-detecting db types are the following:\n\n - PostgreSQL\n - MySQL\n - Oracle\n\nDemo\n============\n\nstart up environment\n--------------------\n\n.. code-block:: shell\n\n $ git clone git@github.com:walkframe/d2a.git\n $ cd d2a\n $ docker-compose up\n\npreparation\n--------------------\n\n.. code-block:: shell \n\n $ docker exec -it d2a_app_1 /bin/bash\n # python -m venv venv # only first time\n # source venv/bin/activate\n (venv) # cd project_postgresql/ # (or mysql)\n (venv) project_postgresql # ./manage.py migrate\n\nexecute\n------------\n\n.. code-block:: shell\n\n (venv) project_postgresql # ./manage.py shell\n\n.. code-block:: python\n\n >>> from books import models_sqla\n >>> book = models_sqla.Book()\n >>> author = models_sqla.Author()\n >>> book.author = author\n >>> author.books\n []\n # And do something you want do ;)\n\n\nLinks\n=====\n- https://github.com/walkframe/d2a\n- https://pypi.org/project/d2a/\n\nHistory\n=======\n\n:2.1.0:\n\n - Changed: \n\n - **Warning:** Changed arg name ``as_dict`` to ``as_col_dict``\n\n - Added:\n\n :as_row_list: \n\n If result set being list type or not.\n\n default is ``True``.\n\n :dict_method:\n\n A method making row to dict.\n You got to be able to change the method to ``dict()``.\n\n default is ``collections.OrderedDict``.\n\n :debug:\n\n If showing debug information or not. specify options dict.\n\n:2.0.0:\n\n - Added a shortcut function for executing in ORM mode.\n - Added two shortcut functions for executing in EXPRESSION mode.\n\n:1.1.x:\n\n - (2019-02-17)\n - Added a function to load all models automatically.\n\n:1.0.2:\n\n - (2018-07-10)\n - Improved a little.\n\n:1.0.1:\n\n - (2018-07-06)\n - Fixed a bug, that it will be provided `None` even though it's not specified `default` argument.\n\n:1.0.0:\n\n - (2018-07-05)\n - Fixed bugs.\n - Added unit tests.\n\n:0.0.6:\n\n - Fixed a bug that abstract models become the targets.\n - Deleted `install_requires`.\n\n:0.0.5:\n\n - added alias method.\n\n:0.0.4:\n\n - fixed bugs.\n\n:0.0.3:\n\n - it got easy to declare custom field.\n - transfer method can define secondary table.\n\n:0.0.2:\n\n - it supported m2m field.\n - it limited django version less than `1.9`.\n\n:0.0.1: first release (2017-12-27)\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/walkframe/d2a", "keywords": "django,sqlalchemy,model,mapping,decralation,table,schema,expression,orm", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "d2a", "package_url": "https://pypi.org/project/d2a/", "platform": "", "project_url": "https://pypi.org/project/d2a/", "project_urls": { "Homepage": "https://github.com/walkframe/d2a" }, "release_url": "https://pypi.org/project/d2a/2.1.2/", "requires_dist": null, "requires_python": "", "summary": "It converts django models to sqlalchemy orm/expression objects.", "version": "2.1.2" }, "last_serial": 5402883, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "09af9cacdfeed27979c2db7155c779ba", "sha256": "a9434c4df9bb7b0a2e0c4bf5ace98b16e13ecaa02f307e17f451651d714c2bc4" }, "downloads": -1, "filename": "d2a-0.0.1.tar.gz", "has_sig": false, "md5_digest": "09af9cacdfeed27979c2db7155c779ba", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3548, "upload_time": "2017-12-27T13:44:04", "url": "https://files.pythonhosted.org/packages/af/bb/9b26bb08740863018c459944dbbf9b9fb291af9b043b348dc1af3c6f7785/d2a-0.0.1.tar.gz" } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "dec7d15ebc7229922d89492c5f7ff1d8", "sha256": "a30cafcaea2d4ff4745a3c6995395dc1ba0509e66aaf7cb89f9ea5b61989f994" }, "downloads": -1, "filename": "d2a-0.0.2.tar.gz", "has_sig": false, "md5_digest": "dec7d15ebc7229922d89492c5f7ff1d8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4471, "upload_time": "2017-12-29T04:42:54", "url": "https://files.pythonhosted.org/packages/30/86/22e2ff732e12f03eaced88d463d15d11a63e9888ffb2c416e8710806fcd4/d2a-0.0.2.tar.gz" } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "ad7dd1e71e3025b245f8bec5b8fd90cf", "sha256": "f8851d74825532089cee660fb5f5ecf4b86bf7f347c4a56968ec4e476125d39f" }, "downloads": -1, "filename": "d2a-0.0.3.tar.gz", "has_sig": false, "md5_digest": "ad7dd1e71e3025b245f8bec5b8fd90cf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4960, "upload_time": "2018-01-04T16:50:03", "url": "https://files.pythonhosted.org/packages/29/8c/4f50618a751b5e09ef0b61203f19baf08e67490d351e1fd85912d4fd18a8/d2a-0.0.3.tar.gz" } ], "0.0.4": [ { "comment_text": "", "digests": { "md5": "93a85f14154c8fc40faca87322c8ee50", "sha256": "977ff69ba23888a69834afd6c99d9dbc027c5102fd1632751df16c53cae2327c" }, "downloads": -1, "filename": "d2a-0.0.4.tar.gz", "has_sig": false, "md5_digest": "93a85f14154c8fc40faca87322c8ee50", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5075, "upload_time": "2018-01-09T14:23:43", "url": "https://files.pythonhosted.org/packages/24/f9/807a5e9b72603ed9104468729b0450815f0ba5bd2d683d447ec2936941ef/d2a-0.0.4.tar.gz" } ], "0.0.5": [ { "comment_text": "", "digests": { "md5": "3da1fcb9be44ba7546561a2315455324", "sha256": "93533fbda6af0fe692d5dd1dc70284a8cf6439bd5152d566378ba83d6520e698" }, "downloads": -1, "filename": "d2a-0.0.5.tar.gz", "has_sig": false, "md5_digest": "3da1fcb9be44ba7546561a2315455324", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5349, "upload_time": "2018-02-06T06:39:03", "url": "https://files.pythonhosted.org/packages/d4/b8/2bde4b7b21641ec86f3579acb4e0f8d30a6fce33e94689a3998c5a97efd2/d2a-0.0.5.tar.gz" } ], "0.0.6": [ { "comment_text": "", "digests": { "md5": "1faf046778d7edab65395aa7762df8af", "sha256": "be253c4db3057fe85885451c419fc86b9834ca084cfab8ae007fdf96cb3e9c9e" }, "downloads": -1, "filename": "d2a-0.0.6.tar.gz", "has_sig": false, "md5_digest": "1faf046778d7edab65395aa7762df8af", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5370, "upload_time": "2018-02-09T03:26:16", "url": "https://files.pythonhosted.org/packages/73/08/299e89e5e3430aa0a40bd09a622c655b234c989165cbb8c93142f0d89769/d2a-0.0.6.tar.gz" } ], "1.0.0": [ { "comment_text": "", "digests": { "md5": "1e12f3ab9ee3c932b988e2ad3b4a2ebe", "sha256": "19e7688f804055ee7ca2d66f73cd283f4d9b0232ea17d568feaf99786d0b77a4" }, "downloads": -1, "filename": "d2a-1.0.0.tar.gz", "has_sig": false, "md5_digest": "1e12f3ab9ee3c932b988e2ad3b4a2ebe", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7683, "upload_time": "2018-07-05T12:09:06", "url": "https://files.pythonhosted.org/packages/94/f9/2730c171025076855a878741771e966292d14fc8a77a4ba856f97ba451fd/d2a-1.0.0.tar.gz" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "5051936c71879b9c20a980f8adef291d", "sha256": "eead52338ae7ec30ab890d745ff476c6fc0d7659781260708c015a295486873f" }, "downloads": -1, "filename": "d2a-1.0.1.tar.gz", "has_sig": false, "md5_digest": "5051936c71879b9c20a980f8adef291d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7843, "upload_time": "2018-07-06T08:08:17", "url": "https://files.pythonhosted.org/packages/43/67/fae883b7f762f3426c4de9afde6c94401f11f2e0cd559c1b5f6fceac0438/d2a-1.0.1.tar.gz" } ], "1.0.2": [ { "comment_text": "", "digests": { "md5": "bce7447477bc74c0e6cadb6b94047e97", "sha256": "5f49aa331c96b80d7818021275a5bbb2d6199f53274546c453977499c5d8052c" }, "downloads": -1, "filename": "d2a-1.0.2.tar.gz", "has_sig": false, "md5_digest": "bce7447477bc74c0e6cadb6b94047e97", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9426, "upload_time": "2018-07-10T15:13:52", "url": "https://files.pythonhosted.org/packages/11/88/4a2dd11e8f3a15ae8d68a9b13cba305d1c8d7c6f2353a77c872f93c3883a/d2a-1.0.2.tar.gz" } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "a4e52845cb15a41b95b5f8092aa81cd6", "sha256": "a200379bcb26730b76b728a3d48fe934719a84a5d9100f35b3140902209ec43d" }, "downloads": -1, "filename": "d2a-1.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "a4e52845cb15a41b95b5f8092aa81cd6", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 9084, "upload_time": "2019-02-17T10:09:55", "url": "https://files.pythonhosted.org/packages/a3/45/3affb96a8c19b7ef18cf9f70f21ac163c97023c77ced26023d0fd8f37fc6/d2a-1.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3d2fa4bddcaf7657f319ee297ef465db", "sha256": "f43e512a6566b014a93eab5fcad55ad17b793a872ec20a0571abb2bf1b7bc3c4" }, "downloads": -1, "filename": "d2a-1.1.0.tar.gz", "has_sig": false, "md5_digest": "3d2fa4bddcaf7657f319ee297ef465db", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8406, "upload_time": "2019-02-17T10:09:59", "url": "https://files.pythonhosted.org/packages/aa/48/1d9ba229c06e0c64ab8bf3bc406bc96b1167b25249fd094f71c1bac3fb6b/d2a-1.1.0.tar.gz" } ], "1.1.1": [ { "comment_text": "", "digests": { "md5": "9239e38a62398d6e4842bd9e9204d02c", "sha256": "a6b3f539befda5ba869eeb8e31601605e66c035fb10cdb570db2faf75c0772b6" }, "downloads": -1, "filename": "d2a-1.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "9239e38a62398d6e4842bd9e9204d02c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 9171, "upload_time": "2019-02-20T14:12:39", "url": "https://files.pythonhosted.org/packages/60/9d/5dd1974f89355c21d45107ede0b1db29ee8734660a1148f1b7f8da71dc18/d2a-1.1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "cfa6315703f536f919bc6f78fc49993f", "sha256": "ed0541c855b7a26351e29f6c99f4bb2fe2192e3461a3ca9b8e390a4809d2485c" }, "downloads": -1, "filename": "d2a-1.1.1.tar.gz", "has_sig": false, "md5_digest": "cfa6315703f536f919bc6f78fc49993f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8519, "upload_time": "2019-02-20T14:12:44", "url": "https://files.pythonhosted.org/packages/6b/90/aa6955543cbc9680e591ee087c5eb0fb2dc17f2e079227b1187f9cb10950/d2a-1.1.1.tar.gz" } ], "1.1.2": [ { "comment_text": "", "digests": { "md5": "038b02c29ff12663ed7301398c380c86", "sha256": "92e6ac8f206e5ef5c7a2368d8190da03fa14b5dfa9ded65ad367f464a50f14ad" }, "downloads": -1, "filename": "d2a-1.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "038b02c29ff12663ed7301398c380c86", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 9464, "upload_time": "2019-02-21T15:35:19", "url": "https://files.pythonhosted.org/packages/85/56/ef8b9da9e779cefce965b700901598f87f79e4c0e3589733f20f9f084391/d2a-1.1.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "cec2fe6a6712bfe6ec9eac4c50dbfe67", "sha256": "01754d2ab644694b142e9ea48afd27a57fadd53e469a96c55ab60792e0c1d73e" }, "downloads": -1, "filename": "d2a-1.1.2.tar.gz", "has_sig": false, "md5_digest": "cec2fe6a6712bfe6ec9eac4c50dbfe67", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8795, "upload_time": "2019-02-21T15:35:27", "url": "https://files.pythonhosted.org/packages/f7/a2/74c9f8231703a32e07a581c7cf6501a26d61954c63108315be0c61220882/d2a-1.1.2.tar.gz" } ], "1.1.3": [ { "comment_text": "", "digests": { "md5": "be237d4a348ebc8f8554e08a588d852f", "sha256": "3cb316eb61207b026c13f21c200ac8f7e38d8d4fad7035f23d2e61d111929da1" }, "downloads": -1, "filename": "d2a-1.1.3-py3-none-any.whl", "has_sig": false, "md5_digest": "be237d4a348ebc8f8554e08a588d852f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 9465, "upload_time": "2019-02-21T15:38:02", "url": "https://files.pythonhosted.org/packages/2e/12/0a25566a0dfd06febc62f35564bddf9c368f99602ad770b66538f1a9bf38/d2a-1.1.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b0ff0f5205d89a55bbf43dfd3ccac6b7", "sha256": "080734a1ec05b1079f5e89f142ca434b971b5b6c0b314d355951a0d8dae535b4" }, "downloads": -1, "filename": "d2a-1.1.3.tar.gz", "has_sig": false, "md5_digest": "b0ff0f5205d89a55bbf43dfd3ccac6b7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8794, "upload_time": "2019-02-21T15:38:10", "url": "https://files.pythonhosted.org/packages/67/8e/46fe9536ff4ae817dd555e01d5c0fb96b3fe1c7b43ff9df57ae5ed788dae/d2a-1.1.3.tar.gz" } ], "1.1.4": [ { "comment_text": "", "digests": { "md5": "97d9dcb8266465482b1aefc9e5247cc6", "sha256": "5159e2123a0e1cc7cb5e0ef450661d50f5f5cfb886c0c44a0aa7771d9718292a" }, "downloads": -1, "filename": "d2a-1.1.4-py3-none-any.whl", "has_sig": false, "md5_digest": "97d9dcb8266465482b1aefc9e5247cc6", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 9647, "upload_time": "2019-02-28T15:20:50", "url": "https://files.pythonhosted.org/packages/b5/e4/4c596a4c96383f534b833446e37e5d29cfbc1140b230254daace36c3661c/d2a-1.1.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6ee180927630d931897554a58f1acf53", "sha256": "25cefb3ced28a17476f1d742118961166a89d57876d4dcd2b1f26ce8f0d2ea8c" }, "downloads": -1, "filename": "d2a-1.1.4.tar.gz", "has_sig": false, "md5_digest": "6ee180927630d931897554a58f1acf53", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8943, "upload_time": "2019-02-28T15:20:59", "url": "https://files.pythonhosted.org/packages/34/c2/e41d3574161721d778c17396e7850fccad1a37632718b49c370787359692/d2a-1.1.4.tar.gz" } ], "2.0.0": [ { "comment_text": "", "digests": { "md5": "09097e8ca9699a568a2d712d3d9cefb6", "sha256": "ac7eb11b238c211ece6da8bad5907b6e933730253917cc4595bdbb239eba6712" }, "downloads": -1, "filename": "d2a-2.0.0-py3-none-any.whl", "has_sig": false, "md5_digest": "09097e8ca9699a568a2d712d3d9cefb6", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 12260, "upload_time": "2019-03-20T09:12:40", "url": "https://files.pythonhosted.org/packages/28/d7/5faa28e8593030959d47de79b62dbb92ddf789095814ba34c13ef63cca3e/d2a-2.0.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "27a396510119c74cbe4bdb0f77070c3a", "sha256": "a6a53009df6f2e27a1f60069518ab23543aff5dc67903f618350f4200bc1a75c" }, "downloads": -1, "filename": "d2a-2.0.0.tar.gz", "has_sig": false, "md5_digest": "27a396510119c74cbe4bdb0f77070c3a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14947, "upload_time": "2019-03-20T09:12:42", "url": "https://files.pythonhosted.org/packages/8c/0d/607b8120f7e02b0c72310e227908285b48d9db6c4000379877ddac6e0b86/d2a-2.0.0.tar.gz" } ], "2.1.0": [ { "comment_text": "", "digests": { "md5": "e6d942503138b5ebf5c1bc8ea6b755ff", "sha256": "d7a74e325be7399b8b35cedc84f79d6f735c0da91223ed7391966d92b11bf342" }, "downloads": -1, "filename": "d2a-2.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "e6d942503138b5ebf5c1bc8ea6b755ff", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 13935, "upload_time": "2019-04-24T12:24:26", "url": "https://files.pythonhosted.org/packages/94/70/a86430ae508c7d6f37e253a18a507af74c3171abefa57c11011a4199c26b/d2a-2.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7c0faa2ab3a09abe28ec8e7261cb04e9", "sha256": "932627f2776d86bca8db7852a9db2729026556faa545c33243bbb7f39e2a33ad" }, "downloads": -1, "filename": "d2a-2.1.0.tar.gz", "has_sig": false, "md5_digest": "7c0faa2ab3a09abe28ec8e7261cb04e9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17335, "upload_time": "2019-04-24T12:24:33", "url": "https://files.pythonhosted.org/packages/18/d4/cd021b34e76c5ac1492d332244f5617caacbaec0e0b6533ac2e4c0f70f54/d2a-2.1.0.tar.gz" } ], "2.1.1": [ { "comment_text": "", "digests": { "md5": "3c1416a4146815d9d1bbe0743ee21580", "sha256": "fe1abc5e244972d6d2d0f9f314f4bd242631231502e40cc7ce6c8b99bdad65db" }, "downloads": -1, "filename": "d2a-2.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "3c1416a4146815d9d1bbe0743ee21580", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 13938, "upload_time": "2019-05-05T02:10:19", "url": "https://files.pythonhosted.org/packages/39/fe/e93b90aca9146fe5ce6d3169bc5c9c9722092a651244ebcb0b9124f74190/d2a-2.1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c6d5e2737db29ef4c17979ff4ca8aca9", "sha256": "1b8b0952b754c9faef10bcb3bc4e0cfb2c2f70c30fabcb5d5bc5836bf65ccaf7" }, "downloads": -1, "filename": "d2a-2.1.1.tar.gz", "has_sig": false, "md5_digest": "c6d5e2737db29ef4c17979ff4ca8aca9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17350, "upload_time": "2019-05-05T02:10:27", "url": "https://files.pythonhosted.org/packages/3b/de/24132bbb6ff955c850f2dbfca48f46e3e9d24f338282b6f3a2731aff8342/d2a-2.1.1.tar.gz" } ], "2.1.2": [ { "comment_text": "", "digests": { "md5": "1d9191e0b6f4b0cf9ac23beb9a7c5836", "sha256": "fdc7c3ed9b7c0dab5913ee8e58c44622fa91ca907fb8fff621fadc17b15eabe9" }, "downloads": -1, "filename": "d2a-2.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "1d9191e0b6f4b0cf9ac23beb9a7c5836", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 13936, "upload_time": "2019-06-15T04:01:59", "url": "https://files.pythonhosted.org/packages/a0/8a/03012b16b9df6ff5151b6c4de6ed3a1a99d68bac68ec7b9ed5e67de75ad6/d2a-2.1.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "47b36946fda5ed807086af457fc96032", "sha256": "68805eb15d1ef153ebde346febe2d76eff9746fd9ceed43ed5cbc803f4e5a4ee" }, "downloads": -1, "filename": "d2a-2.1.2.tar.gz", "has_sig": false, "md5_digest": "47b36946fda5ed807086af457fc96032", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17359, "upload_time": "2019-06-15T04:02:01", "url": "https://files.pythonhosted.org/packages/b9/99/2a5da750b79cc14b591270430bfa87a61caae1cf5ac67c9b7f5039d058da/d2a-2.1.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "1d9191e0b6f4b0cf9ac23beb9a7c5836", "sha256": "fdc7c3ed9b7c0dab5913ee8e58c44622fa91ca907fb8fff621fadc17b15eabe9" }, "downloads": -1, "filename": "d2a-2.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "1d9191e0b6f4b0cf9ac23beb9a7c5836", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 13936, "upload_time": "2019-06-15T04:01:59", "url": "https://files.pythonhosted.org/packages/a0/8a/03012b16b9df6ff5151b6c4de6ed3a1a99d68bac68ec7b9ed5e67de75ad6/d2a-2.1.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "47b36946fda5ed807086af457fc96032", "sha256": "68805eb15d1ef153ebde346febe2d76eff9746fd9ceed43ed5cbc803f4e5a4ee" }, "downloads": -1, "filename": "d2a-2.1.2.tar.gz", "has_sig": false, "md5_digest": "47b36946fda5ed807086af457fc96032", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17359, "upload_time": "2019-06-15T04:02:01", "url": "https://files.pythonhosted.org/packages/b9/99/2a5da750b79cc14b591270430bfa87a61caae1cf5ac67c9b7f5039d058da/d2a-2.1.2.tar.gz" } ] }