{ "info": { "author": "4teamwork AG", "author_email": "mailto:info@4teamwork.ch", "bugtrack_url": null, "classifiers": [ "Framework :: Plone", "Framework :: Plone :: 4.2", "Framework :: Plone :: 4.3", "Framework :: Plone :: 5.0", "Intended Audience :: Developers", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "ftw.blueprints\n==============\n\n``ftw.blueprints`` provides some useful blueprints and includes example cfgs\nfor archetypes and dexterity.\n\nFor more informations about creating blueprints and how to use them see:\n\n- https://github.com/collective/collective.jsonmigrator\n- https://pypi.python.org/pypi/collective.transmogrifier\n\n.. contents:: Table of Contents\n\n\nInstallation\n------------\n\n- Add ``ftw.blueprints`` to your buildout configuration:\n\n.. code:: rst\n\n [instance]\n eggs +=\n ftw.blueprints\n\n- Open view @@jsonmigrator and chose your configuration file\n\nNote: Some of the Archetypes and Dexterity example configs also reference\nsections from `ftw.inflator `_.\nIf you base your config on one of these, you'll also need to install\n``ftw.inflator``.\n\n\nCompatibility\n-------------\n\nRuns with `Plone `_ ``4.2``, ``4.3`` or ``5.0``.\n\nPlone 4.2\n\n.. image:: https://jenkins.4teamwork.ch/job/ftw.blueprints-master-test-plone-4.2.x.cfg/badge/icon\n :target: https://jenkins.4teamwork.ch/job/ftw.blueprints-master-test-plone-4.2.x.cfg\n\nPlone 4.3\n\n.. image:: https://jenkins.4teamwork.ch/job/ftw.blueprints-master-test-plone-4.3.x.cfg/badge/icon\n :target: https://jenkins.4teamwork.ch/job/ftw.blueprints-master-test-plone-4.3.x.cfg\n\nPlone 5.0\n\n.. image:: https://jenkins.4teamwork.ch/job/ftw.blueprints-master-test-plone-5.0.x.cfg/badge/icon\n :target: https://jenkins.4teamwork.ch/job/ftw.blueprints-master-test-plone-5.0.x.cfg\n\n\nBlueprints provided by this package\n-----------------------------------\n\n- ftw.blueprints.fieldmapper\n - Powerful blueprint to map and change fields from the given item\n with a static value, lambda expressions, conditions and dict-mapping.\n\n- ftw.blueprints.pathmapper\n - Map old paths to new paths. Applies the mapping recursively if required.\n\n- ftw.blueprints.childinserter\n - Inserts a child for the given item\n\n- ftw.blueprints.parentinserter\n - Inserts a parent for the given item\n\n- ftw.blueprints.additionalobjectinserter\n - Inserts an object at the given path\n\n- ftw.blueprints.dataupdater\n - Updates blob data.\n\n- ftw.blueprints.regexreplacer\n - Replaces values with regex\n\n- ftw.blueprints.logger\n - Alternate to the printer blueprint. Configurable logging blueprint to\n log the information given in an expression.\n\n- ftw.blueprints.workflowmanager\n - Manages the workflow states, transitions and history\n\n- ftw.blueprints.formmailer-fields-inserter\n - Blueprint to convert the very old PloneFormMailer fields to the new\n PloneFormGen archetype fields\n\n- ftw.blueprints.contextualportletadder\n - Adds a portlet on a given context\n\n- ftw.blueprints.unicodeawaremimeencapsulator\n - Unicode aware plone.app.transmogrifier.mimeencapsulator.\n\n- ftw.blueprints.multilingual.linguaploneitemlinker\n - Create new translations with plone.app.multilingual from a source that used\n LinguaPlone.\n\n- ftw.blueprints.positionupdater\n - A object position in parent blueprint, supporting Plone sites.\n\n- Under construction / deprecated\n - ftw.blueprints.annotatedefaultviewpathobjects\n - ftw.blueprints.updatedefaultviewobjectpath\n - ftw.blueprints.checkisdefaultviewobject\n\nftw.blueprints.fieldmapper\n~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThis blueprint is to map or change values on the item.\n\nRequired options:\n\n- field-mapping\n - option to map or change fields\n\nUsing field-mapping:\n\n {'source-key': {option: value}}\n\n- First, you need to define the source-key you want to modifiy.\n- Then you need to define some options:\n\n - destination: the new name of the key.\n\n {'plz': {'destination':'zip'}\n\n Just moves the value of plz to zip\n\n - static_value: if you want to use a static value, you can use this\n option:\n\n {'plz': {'static_value':'3000'}}\n\n Replaces the value in plz with 3000\n\n - map_value: in some cases you want to change the values with a map:\n\n {'plz': {'map_value':{'PLZ 3000': '3000'}}}\n\n Tf the value of plz is PLZ 3000, it will be replaced with 3000\n\n - transform: transforms the value with the given function.\n As parameter, you have the item itself.\n\n {'plz': {'transform':lambda x: x['plz'] = x['plz'] and \\\n x['plz'] or '3000'}}\n\n This example would replace the plz with 3000 if its value is None\n\n - need_src_key: in some cases you just want to do transforms if the\n source-key is available.\n\n {'plz': 'static_value':'3000', need_src_key: True}\n\n It would just set the static value if the source-key exists on the item.\n\nThe option 'need_src_key' defaults to False. So you can use the\nmapper as a more powerful inserter blueprint. For example you can add\nan attribute to the item which does not exist yet. If the source-key does not\nexist on the item, it will be ignored by the mapper.\n\n.. code:: python\n\n {'update_show_title': {\n 'destination': 'showTitle',\n 'transform': lambda x: x['title'] and True or False,\n }\n }\n\nThis example would set the non existing yet 'showTitle' attribute\non the item to True if the items title is not None.\n\nIts also possible to do transforms on an attribute, after you can map it\nwith the map_value option.\n\n.. code:: python\n\n {'title': {\n 'destination': 'description',\n 'transform': lambda x: x['title'].lower(),\n 'map_value': {'james': 'bond', 'bud': 'spencer'}\n }\n }\n\nFirst it transforms the title to lowercase. If the title contains one\nof the given keys in the map_value option it will be replaced.\nAt the end, it put the transformed and mapped value into the description.\n\nYou can combine all this options together to do powerful mappings\non your item.\n\n.. code:: python\n\n {'zip': {'static_value':'3000'},\n 'client': {\n 'destination': 'text',\n 'transform': lambda x: x['language'] == \\\n 'en' and 'Customer: %s' % (x['cleint']) or \\\n 'Kunde: %s' % (x['client']),\n 'need_src_key': True\n }\n }\n\nFirst we put a static value to the zip attribute.\nAfter we do some stuff with the client attribute. If the client-key\nis available in the items-map, it fills a given\nstring, depending on the language of the object into the text\nattribute.\n\n\nMinimal configuration:\n\n.. code:: cfg\n\n [fieldmapper]\n blueprint = ftw.blueprints.fieldmapper\n field-mapping = python:{}\n\nOptional options:\n\nThere are no optional options.\n\nftw.blueprints.pathmapper\n~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThis Blueprint updates the path for each item.\n\nRequired options:\n\n- mapping\n\n - An iterable of mappings.\n\n - Each mapping-item is a tuple (regular_expression, replacement).\n\n - The mappings are applied exhaustively in the defined order.\n\n - expression, iterable\n\nMinimal configuration:\n\n.. code:: cfg\n\n [pathmapper]\n blueprint = ftw.blueprints.pathmapper\n mapping = python: (\n ('^/de/foo/bar', '/foo/bar'),\n ('^/en/foo/bar', '/foo/qux'),)\n\nOptional options:\n\n- path-key\n - The key-name for the path that is mapped. It defaults to _path.\n\n- strip_prefixes\n - A list of prefixes that are stripped from each path if the paths starts with\n that prefix.\n\nFull configuration\n\n.. code:: cfg\n\n [pathmapper]\n blueprint = ftw.blueprints.pathmapper\n mapping = python: (\n ('^/de/foo/bar', '/foo/bar'),\n ('^/en/foo/bar', '/foo/qux'),)\n path-key = '_gak'\n strip-prefixes = python: (\n '/plone/www/irgendwo',)\n\n\nftw.blueprints.typefieldmapper\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThis Blueprint maps types and their fields to new types and new fields.\n\nRequired options:\n\n- mapping\n\n - Nested mapping for types and their fields.\n\n - The first level maps types.\n\n - The second levels maps fields of the first level's types.\n\n - expression, dict\n\nMinimal configuration:\n\n.. code:: cfg\n\n [typefieldmapper]\n blueprint = ftw.blueprints.typefieldmapper\n mapping = python: {\n 'OldType': ('NewType', {'oldfield': 'newfield'}),\n }\n\nOptional options:\n\n- type-key\n - The key-name for the type that is mapped. It defaults to _type.\n\nftw.blueprints.childinserter\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThis Blueprint inserts a new item to the pipline as a child.\n\nThe new item is not a copy of the parent-item. If you want to use metadata\nof the parent-item, you need to map them with the metadata-key option\n\nRequired options:\n\n- content-type\n - defines the contenttype of the child object\n - string\n\n- additional-id\n - defines the new id of the child object\n - expression, string\n\n-Minimal configuration:\n\n.. code:: cfg\n\n [childinserter]\n blueprint = ftw.blueprints.childinserter\n content-type = ContentPage\n additional-id = python: 'downloads'\n\nOptional options:\n\n- metadata-key\n - metadatamapping for the child as a dict.\n you can provide metadata from the parent item for the child or you can\n use lambda expressions to set a new value.\n - expression, dict\n\n Using parents metadata:\n\n {'description': 'title'}\n\n will get the value of title on parent-item and put it into the description\n field on child-item\n\n Using new value:\n\n {'title': lambda x: 'Images'}\n\n will put 'Images' into the title field on child-item\n\n- _interfaces\n - adds interfaces as a list to the child-item\n - expression, list\n\n- _annotations\n - adds annotations as a dict to the child-item\n - expression, dict\n\nFull configuration\n\n.. code:: cfg\n\n [childinserter]\n blueprint = ftw.blueprints.childinserter\n content-type = ContentPage\n additional-id = python: 'downloads'\n metadata-key = python: {\n 'title': lambda x: 'Images',\n 'description': 'title',\n }\n _interfaces = python: [\n \"simplelayout.portlet.dropzone.interfaces.ISlotBlock\",\n \"remove:simplelayout.base.interfaces.ISlotA\"\n ]\n _annotations = {'viewname': 'portlet'}\n\nVisual example:\n\n * A = item in pipeline\n * A' = item in pipeline after blueprint\n * B = child in pipeline after the item\n\n.. code::\n\n +-------------------+\n | _path: /foo |\n | _id: album | (A)\n | _type: Folder |\n +---------+---------+\n |\n | 1.0\n |\n +--------------+------------------+\n | BLUEPRINT |\n | content-type = Image |\n | additional-id = python: 'bar' |\n | |\n +--+------------------------+-----+\n | |\n | | 1.2\n | +-----+-------------+\n | 1.1 | _path: /foo/bar |\n | | _id: bar | (B)\n | | _type: Image |\n | +-----+-------------+\n +---------+---------+ |\n | _path: /foo | |\n | _id: album | (A') |\n | _type: Folder | |\n +---------+---------+ |\n | |\n | 1.1.1 | 1.2.1\n | |\n +--+------------------------+-----+\n\n\nftw.blueprints.parentinserter\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThis Blueprint inserts a new item to the pipline as a parent.\n\nThe new item is not a copy of the child-item. If you want to use metadata\nof the child-item, you need to map them with the metadata-key option\n\nPleas see the ftw.blueprints.childinserter section documentation for how to\nuse.\n\nVisual Example:\n\n * A = item in pipeline\n * A' = item in pipeline after blueprint\n * B = parent in pipeline after the item\n\n.. code::\n\n +-------------------+\n | _path: /foo |\n | _id: album | (A)\n | _type: Image |\n +---------+---------+\n |\n | 1.0\n |\n +--------------+------------------+\n | BLUEPRINT |\n | content-type = Folder |\n | additional-id = python: 'bar' |\n | |\n +--+------------------------+-----+\n | |\n | | 1.2\n | +-----+-------------+\n | 1.1 | _path: /bar/foo |\n | | _id: album | (A')\n | | _type: Image |\n | +-----+-------------+\n +---------+---------+ |\n | _path: /bar | |\n | _id: bar | (B) |\n | _type: Folder | |\n +---------+---------+ |\n | |\n | 1.1.1 | 1.2.1\n | |\n +--+------------------------+-----+\n\n\nftw.blueprints.additionalobjectinserter\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThis Blueprint inserts a new item to the pipline at a given path.\n\nThe new item is not a copy of the item. If you want to use metadata\nof the item, you need to map them with the metadata-key option\n\nRequired options:\n\n- new-path\n - the path including the id of the object you want create\n - expression, string\n\n- content-type\n - defines the contenttype of the new object\n - string\n\n- additional-id\n - defines the new id of the new object\n -expression, string\n\nMinimal configuration:\n\n.. code:: cfg\n\n [additionalobjectinserter]\n blueprint = ftw.blueprints.additionalobjectinserter\n content-type = Contact\n additional-id = python: 'downloads'\n new-path = python:'/contacts/contact-%s' % item['_id']\n\nPlease see the ftw.blueprints.childinserter section documentation for more\ninformations about optional options.\n\nVisual Example:\n\n * A = item in pipeline\n * A' = item in pipeline after blueprint\n * B = parent in pipeline after the item\n\n.. code::\n\n +-------------------+\n | _path: /foo |\n | _id: album | (A)\n | _type: Image |\n +---------+---------+\n |\n | 1.0\n |\n +--------------+-----------------------+\n | BLUEPRINT |\n | content-type = Contact |\n | additional-id = python: 'bar' |\n | new-path = python:'/contacts/james |\n | |\n +--+------------------------+----------+\n | |\n | | 1.2\n | +-----+-------------+\n | 1.1 | _path: /foo |\n | | _id: album | (A')\n | | _type: Image |\n | +-----+-------------+\n +---------+----------------+ |\n | _path: /contacts/james | |\n | _id: bar | (B) |\n | _type: Contact | |\n +---------+----------------+ |\n | |\n | 1.1.1 | 1.2.1\n | |\n +--+------------------------+----------+\n\n\nftw.blueprints.workflowmanager\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nBlueprint to manage workflows after migration\n\nWhith this blueprint it's possible to migrate the workflowhistory and\nthe reviewstate.\n\nIt provides workflow-mapping, states-mapping and transition-mapping.\n\nRequired options:\n\n- old-workflow-id\n - the name of the old workflow you want to migrate\n - String\n\nMinimal configuration:\n\n.. code:: cfg\n\n [workflowmanager]\n blueprint = ftw.blueprints.workflowmanager\n old-workflow-id = simple_publication_workflow\n\nOptional options:\n\n- update-history\n - default: True\n - Set it to False if you just want to update the review_state\n\n- new-workflow-id\n - if the name of the new workflow differs to the old one.\n - String\n\n- state-map\n - mapping for the old states to the new ones\n - expression, dict\n\n- transition-map\n - mapping for the old transitions to the new ones\n - expression, dict\n\nFull configuration\n\n.. code:: cfg\n\n [workflowmanager]\n blueprint = ftw.blueprints.workflowmanager\n old-workflow-id = IntranetPublicationWorkflow\n new-workflow-id = intranet_secure_workflow\n state-map = python: {\n 'draft': 'intranet_secure_workflow--STATUS--draft',\n 'published': 'intranet_secure_workflow--STATUS--published',\n 'revision': 'intranet_secure_workflow--STATUS--revision'}\n transition-map = python: {\n 'publish': 'intranet_secure_workflow--TRANSITION--publish',\n 'retract': 'intranet_secure_workflow--TRANSITION--retract'}\n\n\nftw.blueprints.contextualportletadder\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nBlueprint to insert a portlet on a given context.\n\nRequired options:\n\n- manager-name\n - Name of the portletmanager you want to add a portlet\n - String\n\n- assignment-path\n - Dotted name path to the portlet assignment you want to add\n - String\n\n- portlet-id\n - ID of the portlet you want to add\n - String\n\nMinimal configuration:\n\n.. code:: cfg\n\n [contextualportletadder]\n blueprint = ftw.blueprints.contextualportletadder\n manager-name = plone.rightcolumn\n assignment-path = ftw.contentpage.portlets.news_archive_portlet.Assignment\n portlet-id = news_archive_portlet\n\n\nOptional options:\n\n- portlet-properties\n - Default properties for the portlet assignment\n - expression, dict\n\n\nftw.blueprints.formmailer-fields-inserter\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nBlueprint to convert the very old PloneFormMailer fields to the new\nPloneFormGen archetype fields\n\nThe Problem converting the fields of the PloneFormMailer is, that they aren't\nArchetype fields like in the PloneFormGen. To convert it automatically, we\nuse the formXML function of the Formulator package and put the exported xml-\nform-representation into the item exported with collective.jsonify.\n\nAfter creating the form itself trough the pipeline, we parse the xml and\nconvert it to a transmogrifier item with the archetypes fields.\n\nSee the example ftw.blueprints.pfm2pfg config to see how to integrate\nthe PloneFormMailer migration correctly into the pipeline.\n\nMinimal configuration:\n\n.. code:: cfg\n\n [formmailer-fields-inserter]\n blueprint = ftw.blueprints.formmailer-fields-inserter\n\n\nftw.blueprints.unicodeawaremimeencapsulator\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nMakes plone.app.transmogrifier.mimeencapsulator accept unicode input data. The\nconfiguration options don't change. See `transmogrifier documentation\n`_.\n\n\nftw.blueprints.multilingual.linguaploneitemlinker\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nLinks translations in the new Plone site with plone.app.multilingual. Expects\nthat the source has been translated with LinguaPlone. Furthermore expects that\nPlone content in the new site has already been constructed when this section\nruns.\n\nNote that when you are mapping paths you should also apply the same mapping to\nthe reference to the canonical translation (_translationOf).\n\nMinimal configuration:\n\n.. code:: cfg\n\n [multilingual]\n blueprint = ftw.blueprints.multilingual.linguaploneitemlinker\n\nOptional options:\n\n- path-key\n - The key-name for the new item's path. It defaults to _path.\n\n- canonical-key\n - The key-name for the boolean that indicates whether this item is a canonical\n translation. It defaults to _canonicalTranslation.\n\n- translationOf\n - The key-name for the reference to the canonical translation. It defaults to\n _translationOf.\n\n\nftw.blueprints.positionupdater\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe ``positionupdater`` blueprint supports folders and Plone sites.\nIt stores the desired position of each object in its annotations,\nso that we can migrate children separately but keep the position\n(e.g. one FTI at a time).\n\n.. code:: cfg\n\n [position]\n blueprint = ftw.blueprints.positionupdater\n\nOptional:\n\n- ``path-key``\n - The key-name for the new item's path. It defaults to ``_path``.\n\n- ``position-key``\n - The key-name for the item's position. It defaults to ``_gopip``.\n\n\nLinks\n-----\n\n- Github: https://github.com/4teamwork/ftw.blueprints\n- Issues: https://github.com/4teamwork/ftw.blueprints/issues\n- Continuous integration: https://jenkins.4teamwork.ch/search?q=ftw.blueprints\n\n\nCopyright\n---------\n\nThis package is copyright by `4teamwork `_.\n\n``ftw.blueprints`` is licensed under GNU General Public License, version 2.\n\nChangelog\n=========\n\n\n1.1.1 (2017-01-09)\n------------------\n\n- Multilingual: encode canonicalpath. [libargutxi]\n\n\n1.1.0 (2016-08-29)\n------------------\n\n- Fix Plone 5 tests:\n\n - Make sure to set unicode titles.\n - Install p.a.contenttypes:default profile during Plone 5 tests\n - Use conditional imports for Plone 4 / 5 compatibility in tests.\n - Ensure we have consistent IDs on Plone 4 and 5.\n\n [lgraf]\n\n- Make ILanguage import conditional so it works for both Plone 4 and Plone 5.\n [lgraf]\n\n- Don't hard depend on ftw.inflator.\n This makes it possible to use ftw.blueprint sections in Plone5 even when ftw.inflator is not upgraded yet.\n [Guido A.J. Stevens]\n\n- Update imports to work with both Plone 4 and Plone 5\n [Guido A.J. Stevens]\n\n- Update imports to work with Plone 5\n [erral]\n\n\n1.0.0 (2015-09-30)\n------------------\n\n- Initial release", "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/4teamwork/ftw.blueprints", "keywords": "", "license": "GPL2", "maintainer": "", "maintainer_email": "", "name": "ftw.blueprints", "package_url": "https://pypi.org/project/ftw.blueprints/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/ftw.blueprints/", "project_urls": { "Homepage": "https://github.com/4teamwork/ftw.blueprints" }, "release_url": "https://pypi.org/project/ftw.blueprints/1.1.1/", "requires_dist": null, "requires_python": "", "summary": "Provides useful blueprints for migrations with transmogrifier", "version": "1.1.1" }, "last_serial": 5823537, "releases": { "1.0.0": [ { "comment_text": "", "digests": { "md5": "0c4b744638dcbc5b6bbd9867a80bd640", "sha256": "4a8c9b0e62860fd7ce5b7ba55560ac5e22ceb5eac5407ed85be532c2d440a16c" }, "downloads": -1, "filename": "ftw.blueprints-1.0.0.tar.gz", "has_sig": false, "md5_digest": "0c4b744638dcbc5b6bbd9867a80bd640", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 34814, "upload_time": "2015-09-30T13:36:46", "url": "https://files.pythonhosted.org/packages/a3/3e/20e6ebd5a645001350b7d09b21c3b812f7fcc045471f4e9d32f75072103b/ftw.blueprints-1.0.0.tar.gz" } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "e1adc7eff0f82e2b4610a5caaad5c13a", "sha256": "5acf1f76f5c500bb4f19fa3654940907f05a8406c7d3d6e50143eb8f4ebcda09" }, "downloads": -1, "filename": "ftw.blueprints-1.1.0.tar.gz", "has_sig": false, "md5_digest": "e1adc7eff0f82e2b4610a5caaad5c13a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36239, "upload_time": "2016-08-29T13:44:57", "url": "https://files.pythonhosted.org/packages/a8/48/013573a450569af63778955e851baa9f6ba8d56f644621c79babc939007b/ftw.blueprints-1.1.0.tar.gz" } ], "1.1.1": [ { "comment_text": "", "digests": { "md5": "97ed14260187cd0089d2a48b7a0726e2", "sha256": "9e89b39d766edfe0eeb301237e2ca0f884ca14960df472b1c52f1ba922903606" }, "downloads": -1, "filename": "ftw.blueprints-1.1.1.tar.gz", "has_sig": false, "md5_digest": "97ed14260187cd0089d2a48b7a0726e2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36370, "upload_time": "2017-01-09T11:18:16", "url": "https://files.pythonhosted.org/packages/89/1e/5cb8d10698959475f708dab816b3d587720b93c09b3184bb4359426fd399/ftw.blueprints-1.1.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "97ed14260187cd0089d2a48b7a0726e2", "sha256": "9e89b39d766edfe0eeb301237e2ca0f884ca14960df472b1c52f1ba922903606" }, "downloads": -1, "filename": "ftw.blueprints-1.1.1.tar.gz", "has_sig": false, "md5_digest": "97ed14260187cd0089d2a48b7a0726e2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36370, "upload_time": "2017-01-09T11:18:16", "url": "https://files.pythonhosted.org/packages/89/1e/5cb8d10698959475f708dab816b3d587720b93c09b3184bb4359426fd399/ftw.blueprints-1.1.1.tar.gz" } ] }