{ "info": { "author": "Mardix", "author_email": "mcx2082@gmail.com", "bugtrack_url": null, "classifiers": [ "Environment :: Web Environment", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3.6", "Topic :: Internet :: WWW/HTTP :: Dynamic Content", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "# Assembly\n\n### A Pythonic Object-Oriented Web Framework built on Flask\n\n---\n\n**Assembly** is a pythonic object-oriented, mid stack, batteries included framework built on Flask, that adds structure to your Flask application, and group your routes by class.\n\n**Assembly** allows you to build web applications in much the same way you would build any other object-oriented Python program.\n\n**Assembly** helps you create small to enterprise level applications easily.\n\n**Assembly** Makes Flask Great Again!\n\n---\n\n### [Assembly Documentation](http://mardix.github.io/assembly/)\n\nAssembly Version: 1.x.x\n\n---\n\n## Assembly in action\n\n### Pythonic Routes\n\nRoutes are created based on the class and the method names by default. \nClass named *Index* and method named *index* will be the entry point of the route.\n\n\n```python\nfrom assembly import Assembly\n\n# Extends to Assembly makes it a route automatically\n# By default, Index will be the root url\nclass Index(Assembly):\n\n # index is the entry route\n # -> /\n def index(self):\n return \"welcome to my site\"\n\n # method name becomes the route\n # -> /hello/\n def hello(self):\n return \"I am a string\"\n\n # undescore method name will be dasherize\n # -> /about-us/\n def about_us(self):\n return \"I am a string\"\n\n# The class name is part of the url prefix\n# This will become -> /blog\nclass Blog(Assembly):\n\n # index will be the root\n # -> /blog/\n def index(self):\n return [\n {\n \"title\": \"title 1\",\n \"content\": \"content\"\n },\n ]\n\n # with params. The order will be respected\n # -> /blog/comments/1234/\n # 1234 will be passed to the id\n def comments(self, id):\n return [\n {\n # comments\n }\n ]\n\n```\n\n### RESTful\n\nMethods named **get**, **post**, **put**, **delete**, **update** will automatically accept the associated methods GET, POST, PUT, DELETE UPDATE respectively.\n\nBut you can also assign a different method by using the appropriate request decorator.\n\n\n```python\nfrom assembly import Assembly, request\n\nclass Api(Assembly):\n\n # method named get, automatically accepts get method\n # -> GET /api/\n def get(self, id):\n return {\n \"message\": \"This will show on get call\"\n }\n\n # method named post, automatically accepts post method\n # -> POST /api/\n def post(self):\n return {\n \"message\": \"This will show on POST call\"\n }\n\n # Example of a different route assigned a method\n # /submit/ will only accept POST call\n # -> POST /submit/\n @request.post\n def submit(self):\n return \"Submitted!\"\n```\n\n### Multi Response Type\n\nBy default Assembly will map the route to its associated template. It's very convenient as you don't have to explicitely render the template.\n\nBut you can also make the route return JSON.\n\n\n```python\n# views/main.py\n\nfrom assembly import (Assembly, response, request, HTTPError)\n\n# Extends to Assembly makes it a route automatically\n# By default, Index will be the root url\nclass Index(Assembly):\n\n # index is the entry route\n # -> /\n # it will render its associated template from \n # 'templates/main/Index/index.html'\n def index(self):\n return \n\n # returning string will be rendered as string.\n # -> /hello/\n def hello(self):\n return \"I am a string\"\n\n # returns a json response\n # -> /api/\n @response.json\n def api(self):\n return {\n \"name\": \"Assembly\",\n \"title\": \"Assembly for ever\",\n \"items\": [\n # list of items\n ]\n }\n\n # This will throw an Unauthorize error\n def error(self):\n raise HTTPError.Unauthorized()\n\n```\n\n---\n\n## Decisions made for you + Features\n\n- Smart Pythonic Routing: automatically generates routes based on the classes and methods in your views\n\n- Class name as the base url, ie: class UserAccount will be accessed at '/user-account'\n\n- Class methods (action) could be accessed: hello_world(self) becomes 'hello-world'\n\n- RESTful: good to create API endpoints, which can also return JSON object\n\n- Automatic view rendering\n\n- Auto route can be edited with @request.route()\n\n- Multi responses type: HTML, JSON, Text \n\n- Markdown friendly: Inclusion of a markdown file will turn into HTML\n\n- BCRYPT is chosen as the password hasher\n\n- Session: Redis, AWS S3, Google Storage, SQLite, MySQL, PostgreSQL\n\n- Database/ORM: SQLAlchemy base to work DB models via [Active-Alchemy](https://github.com/mardix/active-alchemy)\n\n- Login Manager: for user session management via Flask-Login\n\n- Form Validations: Validate your forms via WTForms\n\n- CSRF on all POST: to protect against CSRF attacks \n\n- Idiomatic HTTP error responses\n\n- Storage: to access and store files from Local, S3, Google Storage with [Flask-Cloudy](https://github.com/mardix/flask-cloudy)\n\n- Mailer: To send email using SMTP or AWS SES\n\n- Arrow: Human friendly date and time library\n\n- CLI/Scripts: Create your own scripts to be used on the command line.\n\n- Caching: To cache responses\n\n- JWT\n\n- Pagination\n\n- Signals: to dispatch messages and data to other part of the application\n\n- Markdown\n\n- Jinja2 for templating language\n\n- Multi application: Allow to share the same codebase but with multiple applications.\n\n- Web Assets: To easily manage your static content: css, js, images etc...\n\n- Inbuilt development server\n\n- And much more...\n\n---\n\n## Quick Start\n\nThis quickstart will allow us to go with Assembly from 0 to 100!\n\n### 1. Install Assembly\n\nInstall Assembly with `pip install assembly`\n\nIt is highly recommended to use a virtualenv, in this case let's\nuse VirtualenvWrapper (you can use any that is convenient for you)\n\n```\nmkvirtualenv my-first-app\n\nworkon my-first-app\n\npip install assembly\n\n```\n\n### 2. Initialize your application\n\nInitialize Assembly with `asm gen:init`\n\nCD into the folder you intend to create the application, then run `asm gen:init`.\nThis will setup the structure along with the necessary files to get started\n\n```\ncd app-dir\n\nasm gen:init\n\n```\n\nUpon initialization you should have a structure similar to this:\n\n```\n-- /\n |- wsgi.py\n |- requirements.txt\n |- lib/\n |- config.py\n |- models.py\n |- run\n |- scripts.py\n |- views/\n |- main.py\n |- templates/\n |- layouts/\n |- base.html \n |- main/\n |- Index/\n |- index.html\n |- static/\n |- data/\n```\n\n### 3. Edit your first view\n\n```python\n\n# views/main.py\n\nfrom assembly import (Assembly, response)\n\nclass Index(Assembly):\n\n def index(self):\n return {\n \"title\": \"Assembly is awesome\",\n \"content\": \"That is a true fact\"\n }\n\n @response.json\n def api(self):\n return {\n \"name\": \"Assembly\",\n \"version\": \"x-to-infinity\"\n }\n\n```\n\n### 4. Edit your template\n\n#### 4.0 Edit base layout\n\n```html\n\n\n\n\n \n {% block title %}{% endblock %}\n \n\n \n
\n {% block body %}{% endblock %}\n
\n \n\n```\n\n#### 4.1 Edit Index/index.html\n\n```html\n\n\n{% extends 'layouts/base.html' %} {% block title %}Welcome to my Assembly Site {% endblock %} {% block body %}\n
\n

{{ title }}

\n
\n
\n {{ content }}\n
\n{% endblock %}\n```\n\n### 5. Serve your first application\n\nIf everything is all set, all you need to do now is run your site:\n\n```sh\nasm gen:serve\n```\n\nIt will start serving your application by default at `127.0.0.1:5000`\n\nTwo endpoints will be available:\n\n- `http://127.0.0.1:5000/` which will show an HTML\n- `http://127.0.0.1:5000/api/` which will a json response\n\n---\n\n### Learn More: [Assembly Documentation](http://mardix.github.io/assembly/)\n\n---\n\nLicense MIT\n\nCopyright: 2020 - Forever Mardix\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/mardix/assembly", "keywords": "flask,assembly,templates,views,classy,framework,mvc,blueprint", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "Assembly", "package_url": "https://pypi.org/project/Assembly/", "platform": "any", "project_url": "https://pypi.org/project/Assembly/", "project_urls": { "Homepage": "https://github.com/mardix/assembly" }, "release_url": "https://pypi.org/project/Assembly/1.3.0/", "requires_dist": [ "Flask (>=1.0.0)", "flask-assets (>=0.12)", "flask-kvsession (>=0.6.2)", "flask-s3 (>=0.3.3)", "flask-mail (>=0.9.1)", "flask-caching (>=1.7.2)", "flask-cloudy (>=1.0.1)", "flask-seasurf (>=0.2.2)", "flask-cors (>=3.0.8)", "flask-login (>=0.4.1)", "Active-Alchemy (>=1.0.0)", "six (>=1.9.0)", "passlib (<1.8.0,>=1.7.0)", "bcrypt (>=3.1.7)", "python-slugify (>=4.0.0)", "ses-mailer (>=0.13.0)", "markdown (>=2.6.2)", "inflection (==0.3.1)", "click (>=6.2)", "dicttoxml (>=1.7.4)", "arrow (>=0.15.2)", "blinker (>=1.4)", "itsdangerous (>=1.1.0)", "requests (>=2.13.0)", "paginator", "pyyaml", "wtforms", "python-dateutil (<2.8.1)" ], "requires_python": "", "summary": "Assembly is a pythonic object-oriented, mid stack, batteries included framework built on Flask, that adds structure to your Flask application, and group your routes by class.Assembly allows developers to build web applications in much the same way they would build any other object-oriented Python program.Assembly Makes Flask Great Again!", "version": "1.3.0", "yanked": false, "yanked_reason": null }, "last_serial": 6357760, "releases": { "0.0.0": [ { "comment_text": "", "digests": { "md5": "40016ae9e661aa2f3763052ad42f569d", "sha256": "99f2a57befb488895d698d1a1f6315893605a5fe94c45a49b806a247660005db" }, "downloads": -1, "filename": "assembly-0.0.0-py2-none-any.whl", "has_sig": false, "md5_digest": "40016ae9e661aa2f3763052ad42f569d", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 395805, "upload_time": "2019-10-27T09:18:46", "upload_time_iso_8601": "2019-10-27T09:18:46.134779Z", "url": "https://files.pythonhosted.org/packages/3c/57/968ef5334f70c5d364e6e7e805af2226f77dcfc1e5ed30dce4b9ead40313/assembly-0.0.0-py2-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "676b679a65dff71916604deffb4dc5a1", "sha256": "1e4257d0ff4c0e8ecb9e7cb009b0a95473f7dd6bfd6e86c3989372ddd105658b" }, "downloads": -1, "filename": "assembly-0.0.0.tar.gz", "has_sig": false, "md5_digest": "676b679a65dff71916604deffb4dc5a1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 136029, "upload_time": "2019-10-27T09:18:53", "upload_time_iso_8601": "2019-10-27T09:18:53.731414Z", "url": "https://files.pythonhosted.org/packages/16/50/712c550f9755b0620af008fdd1548f22de25c3692572f56cce698306b41c/assembly-0.0.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.0": [ { "comment_text": "", "digests": { "md5": "0d456390947c912c34730f3559653d50", "sha256": "6059932e67ff9d102ce21f58c26efefbb41dc3ffc47578e435ae0f4ecd11b7de" }, "downloads": -1, "filename": "Assembly-0.1.0-py2-none-any.whl", "has_sig": false, "md5_digest": "0d456390947c912c34730f3559653d50", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 174278, "upload_time": "2019-10-28T05:45:07", "upload_time_iso_8601": "2019-10-28T05:45:07.315813Z", "url": "https://files.pythonhosted.org/packages/e0/59/6704b4b66c9eb84a0c08048fee25b3190419b21496c0505763c89b2bebe7/Assembly-0.1.0-py2-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "9b49960c35502cdec7e2147e8514c952", "sha256": "e42ce24e358db7cb90238cef4b16c592f4526b7f6cd1305b24971b21ada10bf1" }, "downloads": -1, "filename": "Assembly-0.1.0.tar.gz", "has_sig": false, "md5_digest": "9b49960c35502cdec7e2147e8514c952", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 140113, "upload_time": "2019-10-28T05:45:09", "upload_time_iso_8601": "2019-10-28T05:45:09.174201Z", "url": "https://files.pythonhosted.org/packages/05/65/3c980e59dd86c18739995a3a3c8c6fd64e8e775842703a759fd8a8bf1c65/Assembly-0.1.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "fad0ca2996935cb9d09079a2159a5e7b", "sha256": "276120b199ed02e896488b43ec3542765dba10fe8a6d078af16b194c96a2b8a6" }, "downloads": -1, "filename": "Assembly-0.3.0-py2-none-any.whl", "has_sig": false, "md5_digest": "fad0ca2996935cb9d09079a2159a5e7b", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 227488, "upload_time": "2019-11-18T07:11:54", "upload_time_iso_8601": "2019-11-18T07:11:54.194608Z", "url": "https://files.pythonhosted.org/packages/38/f0/4740ddf840c891e79c5421136dc38f821a79be188867a4cbf2542963a6d9/Assembly-0.3.0-py2-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "b7f6794ccd252d3d0573242419ae14a1", "sha256": "e3eb8f6dae854cf3690f03ac338f9e48257d5caee938202795b4a4055af4732d" }, "downloads": -1, "filename": "Assembly-0.3.0.tar.gz", "has_sig": false, "md5_digest": "b7f6794ccd252d3d0573242419ae14a1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 157855, "upload_time": "2019-11-18T07:11:56", "upload_time_iso_8601": "2019-11-18T07:11:56.880899Z", "url": "https://files.pythonhosted.org/packages/06/64/cbed5a04dec0c5f6de3199cf1c3e62efeddef90d41846c88b83851e20d2c/Assembly-0.3.0.tar.gz", "yanked": false, "yanked_reason": null } ], "1.0.0": [ { "comment_text": "", "digests": { "md5": "4322bcf3dd64d823e3160beb35fcc161", "sha256": "0bfe9a37b0359b51ef6321a3ea999fd85af76e0b25f1a5bfa37f85bf1266acd1" }, "downloads": -1, "filename": "Assembly-1.0.0-py2-none-any.whl", "has_sig": false, "md5_digest": "4322bcf3dd64d823e3160beb35fcc161", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 231142, "upload_time": "2019-11-19T08:06:21", "upload_time_iso_8601": "2019-11-19T08:06:21.018665Z", "url": "https://files.pythonhosted.org/packages/02/55/3f78514f40d5e995067475647459fbcd29335c486df238c99716d7177b06/Assembly-1.0.0-py2-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "b6344037e2157ecc4760a0295ee3418c", "sha256": "bda79b94e02af505486704763553c7094be26653daeb4330979aa1eccf90e474" }, "downloads": -1, "filename": "Assembly-1.0.0.tar.gz", "has_sig": false, "md5_digest": "b6344037e2157ecc4760a0295ee3418c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 157995, "upload_time": "2019-11-19T08:06:24", "upload_time_iso_8601": "2019-11-19T08:06:24.467532Z", "url": "https://files.pythonhosted.org/packages/1c/6f/8f0089b82f0c834d1f81ba1a108b4c4f28a82d11e99d497a35e88842f080/Assembly-1.0.0.tar.gz", "yanked": false, "yanked_reason": null } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "574a8ad74d14ea595ce12274335cb943", "sha256": "75096dbc9d7cc66e5a589213d8f94786d911b9c7636f380a192dc0b7a62e71db" }, "downloads": -1, "filename": "Assembly-1.0.1-py2-none-any.whl", "has_sig": false, "md5_digest": "574a8ad74d14ea595ce12274335cb943", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 231144, "upload_time": "2019-11-21T02:38:11", "upload_time_iso_8601": "2019-11-21T02:38:11.549986Z", "url": "https://files.pythonhosted.org/packages/1a/28/6912a47378eab97d006cc9659a8a57a298a6ff8901edcb8e34899bf0adce/Assembly-1.0.1-py2-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "1411292e4abd11fa68c0a17430141735", "sha256": "3fedbaaec07ec53304a070969c5e3e390e3050e406edf0d07f6645d6741844ef" }, "downloads": -1, "filename": "Assembly-1.0.1.tar.gz", "has_sig": false, "md5_digest": "1411292e4abd11fa68c0a17430141735", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 158023, "upload_time": "2019-11-21T02:38:15", "upload_time_iso_8601": "2019-11-21T02:38:15.541186Z", "url": "https://files.pythonhosted.org/packages/6e/10/af8691b8dc64e56035d5d0db861f0d25081875b7f525d21ce276c23e91ca/Assembly-1.0.1.tar.gz", "yanked": false, "yanked_reason": null } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "ad6df90fbe3ff8105ff86e161c4535b5", "sha256": "cf5bf6cdb3e63d6b796e847b446aa7a9c4e2281fc616c6e7c50aaac07c00ecf8" }, "downloads": -1, "filename": "Assembly-1.1.0-py2-none-any.whl", "has_sig": false, "md5_digest": "ad6df90fbe3ff8105ff86e161c4535b5", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 244754, "upload_time": "2019-11-25T01:11:15", "upload_time_iso_8601": "2019-11-25T01:11:15.416777Z", "url": "https://files.pythonhosted.org/packages/62/d4/19f587e779afad6c8f4ed6f11e48016c8ed2f09fa60a1c61b13791834218/Assembly-1.1.0-py2-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "35f21b96d5bd901aecc4b156d49a387a", "sha256": "772e5540c742229b95cb9737f764fa1b78daf02ca82462752d1ff44cd2e45ddd" }, "downloads": -1, "filename": "Assembly-1.1.0.tar.gz", "has_sig": false, "md5_digest": "35f21b96d5bd901aecc4b156d49a387a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 159729, "upload_time": "2019-11-25T01:11:17", "upload_time_iso_8601": "2019-11-25T01:11:17.444481Z", "url": "https://files.pythonhosted.org/packages/41/00/aa212f444b58addfb84f5e4656db22a795a9738fcd7d454ee154523575cb/Assembly-1.1.0.tar.gz", "yanked": false, "yanked_reason": null } ], "1.2.0": [ { "comment_text": "", "digests": { "md5": "fcec788ba54929b1697105c0ddcbb255", "sha256": "ac0dfe331d203c05b640464df45cbd3564a28b6d676b47e9366abeca4061be3e" }, "downloads": -1, "filename": "Assembly-1.2.0-py2-none-any.whl", "has_sig": false, "md5_digest": "fcec788ba54929b1697105c0ddcbb255", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 244792, "upload_time": "2019-11-27T19:45:03", "upload_time_iso_8601": "2019-11-27T19:45:03.687976Z", "url": "https://files.pythonhosted.org/packages/32/4d/e0b98dd0f9e399201d58f118f192bde9dcf78e0b60cc4731bb9ee25af092/Assembly-1.2.0-py2-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "c3e95186a9a4ce80234b03b925a699f8", "sha256": "746e5eaf18df3a19169f07b6dbe327215ad19187e9f17cfe9e1737da9cf97e3c" }, "downloads": -1, "filename": "Assembly-1.2.0.tar.gz", "has_sig": false, "md5_digest": "c3e95186a9a4ce80234b03b925a699f8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 159754, "upload_time": "2019-11-27T19:45:06", "upload_time_iso_8601": "2019-11-27T19:45:06.390779Z", "url": "https://files.pythonhosted.org/packages/94/5d/b26d9ba16a9944bc3885b250bbe2b0f504a86213ab290eda1e6e418df0dd/Assembly-1.2.0.tar.gz", "yanked": false, "yanked_reason": null } ], "1.3.0": [ { "comment_text": "", "digests": { "md5": "60e2c2fbce0cfe89d17133a5eb4bc447", "sha256": "00a0032864a68b5a42c336e16a8eaa6ad44897d1b701dbeb5f2a24da9199a96e" }, "downloads": -1, "filename": "Assembly-1.3.0-py2-none-any.whl", "has_sig": false, "md5_digest": "60e2c2fbce0cfe89d17133a5eb4bc447", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 283983, "upload_time": "2019-12-25T07:18:11", "upload_time_iso_8601": "2019-12-25T07:18:11.788408Z", "url": "https://files.pythonhosted.org/packages/12/3a/7cdb9dbf5a62fee1d5ca952cf39976af332b57559efd9ed3f0a951f1beab/Assembly-1.3.0-py2-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "e9de69b806c7594d19c6bb87ea9fcc9e", "sha256": "0fc7695ed3e77cbb02d02f2f3a8990e0e6aff2c29da35d825dd60090b9b1296d" }, "downloads": -1, "filename": "Assembly-1.3.0.tar.gz", "has_sig": false, "md5_digest": "e9de69b806c7594d19c6bb87ea9fcc9e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 175951, "upload_time": "2019-12-25T07:18:15", "upload_time_iso_8601": "2019-12-25T07:18:15.933675Z", "url": "https://files.pythonhosted.org/packages/6a/dd/300832e2e2c2ceb979a8812a1a8de43dec456b296b081206afda5b4ea0a4/Assembly-1.3.0.tar.gz", "yanked": false, "yanked_reason": null } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "60e2c2fbce0cfe89d17133a5eb4bc447", "sha256": "00a0032864a68b5a42c336e16a8eaa6ad44897d1b701dbeb5f2a24da9199a96e" }, "downloads": -1, "filename": "Assembly-1.3.0-py2-none-any.whl", "has_sig": false, "md5_digest": "60e2c2fbce0cfe89d17133a5eb4bc447", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 283983, "upload_time": "2019-12-25T07:18:11", "upload_time_iso_8601": "2019-12-25T07:18:11.788408Z", "url": "https://files.pythonhosted.org/packages/12/3a/7cdb9dbf5a62fee1d5ca952cf39976af332b57559efd9ed3f0a951f1beab/Assembly-1.3.0-py2-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "e9de69b806c7594d19c6bb87ea9fcc9e", "sha256": "0fc7695ed3e77cbb02d02f2f3a8990e0e6aff2c29da35d825dd60090b9b1296d" }, "downloads": -1, "filename": "Assembly-1.3.0.tar.gz", "has_sig": false, "md5_digest": "e9de69b806c7594d19c6bb87ea9fcc9e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 175951, "upload_time": "2019-12-25T07:18:15", "upload_time_iso_8601": "2019-12-25T07:18:15.933675Z", "url": "https://files.pythonhosted.org/packages/6a/dd/300832e2e2c2ceb979a8812a1a8de43dec456b296b081206afda5b4ea0a4/Assembly-1.3.0.tar.gz", "yanked": false, "yanked_reason": null } ], "vulnerabilities": [] }