{ "info": { "author": "", "author_email": "probachai.yu@gmail.com", "bugtrack_url": null, "classifiers": [], "description": " `pip install middleware_test`\r\r\n \r\r\n `middleware-active-directory` is required as main provider\r\r\n \r\r\n **Settings**\r\r\n \r\r\n All of the settings are specified in config/{env}.conf file\r\r\n \r\r\n `config/local.conf` will be autocreated after installation\r\r\n You had to specify all configs there\r\r\n \r\r\n **Database creation**\r\r\n \r\r\n `create_db` - creates initial database structure on existing database.\r\r\n User, password and db name must be specified in config/{env}.conf file\r\r\n \r\r\n **Installation providers**\r\r\n \r\r\n `pip install middleware-provider-name`\r\r\n `provider_name_init` -- creates record in db and child class\r\r\n \r\r\n then you need to append your class to PROVIDERS_LIST:\r\r\n PROVIDERS_LIST.append(ActiveDirectoryBase)\r\r\n PROVIDERS_LIST.append(SlackBase)\r\r\n PROVIDERS_LIST.append(OfficeVibeBase)\r\r\n \r\r\n **Running sync***\r\r\n \r\r\n `from middleware.start_sync import Sync\r\r\n Sync.run()`\r\r\n \r\r\n Also command `start_sync` available for this\r\r\n \r\r\n **Making a report**\r\r\n \r\r\n `from middleware.make_report import Report\r\r\n Report.make_report()`\r\r\n \r\r\n Also command `make_report` available for this\r\r\n \r\r\n \r\r\n **Possible configuration params**\r\r\n \r\r\n *Database config*\r\r\n \r\r\n `middleware_db_name` -- name of database\r\r\n `mysql_user` -- database user\r\r\n `mysql_password` -- password to connect to database\r\r\n `middleware_db_ip` -- db ip\r\r\n \r\r\n *Active directory settings*\r\r\n \r\r\n `AD_admin'` - admin profile to connect to Active Director\r\r\n `AD_password` - password for admin profile\r\r\n `AD_server` - Active Directory server address\r\r\n `AD_base_dn` - base dn for Active Directory server\r\r\n \r\r\n *Slack settings*\r\r\n \r\r\n `slack_api_tokens_dict` - dict of slack tokens from slack app with read and write permissions for multiply workspaces\r\r\n \r\r\n *Other settings*\r\r\n \r\r\n You can setup expiration time of logs in days in 'logs_expires' setting\r\r\n \r\r\n *Read fields configuration*\r\r\n \r\r\n Fields which would be read from system you can configure in 'field_read_configuration' table.\r\r\n There are fields:\r\r\n (`field_read_configuration_id`, `system_id`, `from_path`, `to_field_name`, `active`, `create_dttm`)\r\r\n \r\r\n `from_path` should start from '$.'. For example, for this structure:\r\r\n ```\r\r\n {\r\r\n \"user\":\r\r\n {\r\r\n \"profile\":\r\r\n {\r\r\n \"name\": \"Test_name\"\r\r\n }\r\r\n }\r\r\n }\r\r\n ```\r\r\n `from_path` would be `$.user.profile.name`\r\r\n \r\r\n `to_field_name` should be just the single name of the field, the same for the all of systems with equivalent values\r\r\n \r\r\n Example structure of Active Directory user data:\r\r\n ```\r\r\n {u'attributes':\r\r\n {u'manager': u'',\r\r\n u'departmentNumber': [],\r\r\n u'telephoneNumber': u'',\r\r\n u'countryCode': ,\r\r\n u'physicalDeliveryOfficeName': u'',\r\r\n u'co': u'',\r\r\n u'homePhone': u'',\r\r\n u'streetAddress': u'',\r\r\n u'title': u'',\r\r\n u'objectGUID': u'',\r\r\n u'distinguishedName': u'',\r\r\n u'name': u'',\r\r\n u'company': u'',\r\r\n u'objectClass': [u'top', u'person', u'organizationalPerson', u'user'],\r\r\n u'street': [],\r\r\n u'wWWHomePage': u'',\r\r\n u'comment': [],\r\r\n u'department': u'',\r\r\n u'middleName': [],\r\r\n u'description': [u'Love Python'],\r\r\n u'initials': u'Y.V.',\r\r\n u'isDeleted': [],\r\r\n u'userPrincipalName': u'Some.User@test-octopus.local',\r\r\n u'c': u'UA',\r\r\n u'postOfficeBox': [u''],\r\r\n u'cn': u'Some User',\r\r\n u'displayName': u'Some User',\r\r\n u'jpegPhoto': [],\r\r\n u'mail': u'email@example.com',\r\r\n u'mobile': u'+380672112999',\r\r\n u'whenChanged': u'2018-02-27 14:31:38+00:00',\r\r\n u'sn': u'User',\r\r\n u'sAMAccountName': u'Some.User',\r\r\n u'givenName': u'Some',\r\r\n u'postalAddress': [],\r\r\n u'facsimileTelephoneNumber': u'',\r\r\n u'photo': [],\r\r\n u'st': u'Vinnitsya'},\r\r\n u'dn': u''}\r\r\n ```\r\r\n \r\r\n Example of Slack user data\r\r\n ```\r\r\n {\r\r\n \"ok\": true,\r\r\n \"user\": {\r\r\n \"id\": \"\",\r\r\n \"team_id\": \"\",\r\r\n \"name\": \"\",\r\r\n \"deleted\": ,\r\r\n \"color\": \"\",\r\r\n \"real_name\": \"\",\r\r\n \"tz\": \"\",\r\r\n \"tz_label\": \"\",\r\r\n \"tz_offset\": ,\r\r\n \"profile\": {\r\r\n \"title\": \"\",\r\r\n \"phone\": \"\",\r\r\n \"skype\": \"\",\r\r\n \"real_name\": \"\",\r\r\n \"real_name_normalized\": \"\",\r\r\n \"display_name\": \"\",\r\r\n \"display_name_normalized\": \"\",\r\r\n \"status_text\": \"\",\r\r\n \"status_emoji\": \"\",\r\r\n \"avatar_hash\": \"\",\r\r\n \"guest_channels\": \"[]\",\r\r\n \"image_original\": \"\",\r\r\n \"email\": \"\",\r\r\n \"first_name\": \"\",\r\r\n \"last_name\": \"\",\r\r\n \"image_24\": \"\",\r\r\n \"image_32\": \"\",\r\r\n \"image_48\": \"\",\r\r\n \"image_72\": \"\",\r\r\n \"image_192\": \"\",\r\r\n \"image_512\": \"\",\r\r\n \"image_1024\": \"\",\r\r\n \"team\": \"\"\r\r\n },\r\r\n \"is_admin\": false,\r\r\n \"is_owner\": false,\r\r\n \"is_primary_owner\": false,\r\r\n \"is_restricted\": true,\r\r\n \"is_ultra_restricted\": false,\r\r\n \"is_bot\": false,\r\r\n \"updated\": ,\r\r\n \"is_app_user\": false,\r\r\n \"has_2fa\": false,\r\r\n \"enterprise_user\": {\r\r\n \"id\": \"\",\r\r\n \"enterprise_id\": \"\",\r\r\n \"enterprise_name\": \"\",\r\r\n \"is_admin\": false,\r\r\n \"is_owner\": false,\r\r\n \"teams\": [\r\r\n \"\",\r\r\n \"\"\r\r\n ]\r\r\n }\r\r\n }\r\r\n }\r\r\n ```\r\r\n \r\r\n Example of SelectHR user data:\r\r\n ```\r\r\n {'first_name': '',\r\r\n 'surname': '',\r\r\n 'gender': '',\r\r\n 'mobile_phone_number': '',\r\r\n 'e-mail': '',\r\r\n 'person_number': ,\r\r\n 'birth_date': '',\r\r\n 'updated_at': '',\r\r\n 'initials': '',\r\r\n 'second_name': '',\r\r\n 'nationality': '',\r\r\n 'end_date': '',\r\r\n 'title': '',\r\r\n 'work_phone_number': '',\r\r\n 'biography': '',\r\r\n 'salutation': '',\r\r\n 'post_name': '',\r\r\n 'manager_name': '',\r\r\n 'team': '',\r\r\n ```\r\r\n \r\r\n !Email and updated_at fields are required for each system\r\r\n \r\r\n !Person_number is required for SelectHR in `field_read_configuration` and `field_write_configuration`\r\r\n \r\r\n !Salutation field in SelectHr cannot be updated because, it is a computed field\r\r\n \r\r\n *Write fields configuration*\r\r\n \r\r\n Fields which would be read from system you can configure in 'field_write_configuration' table.\r\r\n There are fields:\r\r\n (`field_write_configuration_id`, `system_id`, `from_field_name`, `to_path`, `active`, `create_dttm`)\r\r\n \r\r\n `from_field_name` is a field name from actual_user_data\r\r\n `to_path` starts from '$.' and configures final field path per system\r\r\n For example:\r\r\n `('1', '1', 'first_name', '$.givenName', TRUE, '2017-05-05 12:00:00'), `\r\r\n \r\r\n \r\r\n For Active Directory and SelectHR structure will be the same as in `field_read_configuration`,\r\r\n but Slack system allows to configure only profile fields, so structure for configuring will be:\r\r\n ```\r\r\n \"profile\": {\r\r\n \"title\": \"\",\r\r\n \"phone\": \"\",\r\r\n \"skype\": \"\",\r\r\n \"real_name\": \"\",\r\r\n \"real_name_normalized\": \"\",\r\r\n \"display_name\": \"\",\r\r\n \"display_name_normalized\": \"\",\r\r\n \"status_text\": \"\",\r\r\n \"status_emoji\": \"\",\r\r\n \"avatar_hash\": \"\",\r\r\n \"guest_channels\": \"[]\",\r\r\n \"image_original\": \"\",\r\r\n \"email\": \"\",\r\r\n \"first_name\": \"\",\r\r\n \"last_name\": \"\",\r\r\n \"image_24\": \"\",\r\r\n \"image_32\": \"\",\r\r\n \"image_48\": \"\",\r\r\n \"image_72\": \"\",\r\r\n \"image_192\": \"\",\r\r\n \"image_512\": \"\",\r\r\n \"image_1024\": \"\",\r\r\n \"team\": \"\"\r\r\n }\r\r\n ```\r\r\n \r\r\n *Write forbidden fields*\r\r\n \r\r\n in `write_forbidden_field` table you can specified field that cannot be updated\r\r\n \r\r\n Fields\r\r\n (`write_forbidden_field_id`, `system_id`, `field_name`, `create_dttm`)\r\r\n \r\r\n Example:\r\r\n \r\r\n `('1', '3', 'last_name', '2017-05-05 12:00:00'),`\r\r\n \r\r\n \r\r\n *Write Required Fields*\r\r\n \r\r\n in `write_required_field` table you can specify field required to update from specified system to other ones\r\r\n \r\r\n Fields\r\r\n (`write_required_field_id`, `system_id`, `field_name`, `create_dttm`)\r\r\n \r\r\n Example:\r\r\n \r\r\n `('1', '3', 'manager', '2017-05-05 12:00:00'),`\r\r\n \r\r\n \r\r\n \r\r\n *Write Empty Field By User*\r\r\n \r\r\n in `write_empty_field_by_user` table you can set up field that would be rewritten in specified system by default value for specified user\r\r\n \r\r\n Fields\r\r\n `write_empty_field_by_user_id`, `system_id`, `field_name`, `user_email`, `default_value`, `create_dttm`)\r\r\n \r\r\n Example:\r\r\n \r\r\n `('1', '1', 'job_title', 'email@example.com', '', '2017-05-05 12:00:00')`\r\r\n \r\r\n \r\nPlatform: UNKNOWN\r\nClassifier: Development Status :: 3 - Alpha\r\nClassifier: Environment :: Web Environment\r\nClassifier: Intended Audience :: Developers\r\nClassifier: License :: OSI Approved :: BSD License\r\nClassifier: Operating System :: OS Independent\r\nClassifier: Programming Language :: Python :: 2\r\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "", "keywords": "", "license": "BSD", "maintainer": "", "maintainer_email": "", "name": "middleware-test", "package_url": "https://pypi.org/project/middleware-test/", "platform": "", "project_url": "https://pypi.org/project/middleware-test/", "project_urls": null, "release_url": "https://pypi.org/project/middleware-test/2.1/", "requires_dist": null, "requires_python": "", "summary": "Module to sync users' profiles", "version": "2.1" }, "last_serial": 4145075, "releases": { "1.1.10": [ { "comment_text": "", "digests": { "md5": "47280e160a32ce6b887610eb03f4d416", "sha256": "83f0ec668ed3f8039e89dbd3e3d34e5ff1caed8e5f22430a43bb27ae2d585af6" }, "downloads": -1, "filename": "middleware_test-1.1.10.tar.gz", "has_sig": false, "md5_digest": "47280e160a32ce6b887610eb03f4d416", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 33444, "upload_time": "2018-08-02T19:45:24", "url": "https://files.pythonhosted.org/packages/06/3a/bea50eb112e41b89e8fc2599593a8d8a8e615407a8036f5d52a695514806/middleware_test-1.1.10.tar.gz" } ], "1.1.11": [ { "comment_text": "", "digests": { "md5": "5191e3d01122b784ac3a381a2f7c6035", "sha256": "6263964e2866decd677c353a9da3a1564a18fdf84229e8a90086eaa0929c0118" }, "downloads": -1, "filename": "middleware_test-1.1.11.tar.gz", "has_sig": false, "md5_digest": "5191e3d01122b784ac3a381a2f7c6035", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 33447, "upload_time": "2018-08-02T19:49:10", "url": "https://files.pythonhosted.org/packages/35/a8/a834237738b8a7414278a3688a7403fad9722af23818da52af06970e97b4/middleware_test-1.1.11.tar.gz" } ], "1.1.12": [ { "comment_text": "", "digests": { "md5": "d44e9802de5f39ddf05ff54e3d469519", "sha256": "0ba89388955698956361b2314a53781abad340eaf897aee4b379754c9e3458a0" }, "downloads": -1, "filename": "middleware_test-1.1.12.tar.gz", "has_sig": false, "md5_digest": "d44e9802de5f39ddf05ff54e3d469519", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 33423, "upload_time": "2018-08-02T19:59:43", "url": "https://files.pythonhosted.org/packages/db/0d/442828f2937733d35b030e98494dfb10e79e796cc93b37ec327883acd116/middleware_test-1.1.12.tar.gz" } ], "1.1.13": [ { "comment_text": "", "digests": { "md5": "639988f043635a8499cad8d916d7e7fb", "sha256": "93d4ccaa73af930ea7a03592f7529fff555e5dca3a59bf00423b6b1fe27be453" }, "downloads": -1, "filename": "middleware_test-1.1.13.tar.gz", "has_sig": false, "md5_digest": "639988f043635a8499cad8d916d7e7fb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 33419, "upload_time": "2018-08-02T20:08:44", "url": "https://files.pythonhosted.org/packages/de/a6/3e6b50b494a8c45613ea265c1acd72ee28d4a08dbfa3c1f0a86c77d3fa60/middleware_test-1.1.13.tar.gz" } ], "1.1.14": [ { "comment_text": "", "digests": { "md5": "0057d4a334da24470005b9ed11fb6ffd", "sha256": "df6d5810be3e1794a2899dcfef0b82de90cf2012b8bd89245da2a75b49845b69" }, "downloads": -1, "filename": "middleware_test-1.1.14.tar.gz", "has_sig": false, "md5_digest": "0057d4a334da24470005b9ed11fb6ffd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30250, "upload_time": "2018-08-03T15:43:02", "url": "https://files.pythonhosted.org/packages/b8/d1/1a4f2c5b02841814138c78d9f366621ad258f9429cf1b4f45b60aa1b2c1c/middleware_test-1.1.14.tar.gz" } ], "1.1.15": [ { "comment_text": "", "digests": { "md5": "12f4d4b2727a0cdb4f06168c6850c758", "sha256": "f04d385fb93f70c0c490b926d630dc6bf419b4f0c7c64e77f0dc4a26fa700633" }, "downloads": -1, "filename": "middleware_test-1.1.15.tar.gz", "has_sig": false, "md5_digest": "12f4d4b2727a0cdb4f06168c6850c758", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30258, "upload_time": "2018-08-07T13:13:00", "url": "https://files.pythonhosted.org/packages/9f/ea/3f1b17dcd2702da7d6820862ddce7ba997ba89cf0e0b20cbd862ce5b93a9/middleware_test-1.1.15.tar.gz" } ], "1.1.2": [ { "comment_text": "", "digests": { "md5": "7ac5b51ae254196a1bbfa37ba3b8c154", "sha256": "bdb58982fc38f488e0143c3aac4fef96c029cd90efcf3b6e2c05f12aa7d81431" }, "downloads": -1, "filename": "middleware_test-1.1.2.tar.gz", "has_sig": false, "md5_digest": "7ac5b51ae254196a1bbfa37ba3b8c154", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25825, "upload_time": "2018-08-02T19:06:17", "url": "https://files.pythonhosted.org/packages/37/2d/fd48ac9c1bfdc6b0028a12124561683b4f237b3a59f02730a3966000e50c/middleware_test-1.1.2.tar.gz" } ], "1.1.3": [ { "comment_text": "", "digests": { "md5": "f1cfa508fb57099904392770e3f0516c", "sha256": "6b648b3b92fd6f0b53b541ec6749bcb9b837ea664f63675954cd5b82ea6d6aaf" }, "downloads": -1, "filename": "middleware_test-1.1.3.tar.gz", "has_sig": false, "md5_digest": "f1cfa508fb57099904392770e3f0516c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 34199, "upload_time": "2018-08-02T19:17:00", "url": "https://files.pythonhosted.org/packages/2c/e8/798de99e3bd1e8ba2a5625d9181a427ab3a16d2b9bb45e5375e5328aca62/middleware_test-1.1.3.tar.gz" } ], "1.1.4": [ { "comment_text": "", "digests": { "md5": "c35068b6f61923a7d883637dec15d765", "sha256": "bcbd4f017529058fc055338d737adea6c89e6f46ee1cfab1a68b2ecd3f3e4435" }, "downloads": -1, "filename": "middleware_test-1.1.4.tar.gz", "has_sig": false, "md5_digest": "c35068b6f61923a7d883637dec15d765", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 34199, "upload_time": "2018-08-02T19:19:12", "url": "https://files.pythonhosted.org/packages/a3/14/0648a1da05212d232821f9dc02ab3000fe39cd8aabc920abe0459ae2bf87/middleware_test-1.1.4.tar.gz" } ], "1.1.5": [ { "comment_text": "", "digests": { "md5": "c47e621bf33ae755fdf4bcc4f31f677b", "sha256": "1f7d38043cd46d0ca67bcfb0c61cde0670aabb47251fd6f644d5e45e1e152394" }, "downloads": -1, "filename": "middleware_test-1.1.5.tar.gz", "has_sig": false, "md5_digest": "c47e621bf33ae755fdf4bcc4f31f677b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 34204, "upload_time": "2018-08-02T19:21:22", "url": "https://files.pythonhosted.org/packages/d4/10/4ec68c8a2b231f20b9734355fb9eac55b1b5c9cd81719d5441b32ef8f104/middleware_test-1.1.5.tar.gz" } ], "1.1.6": [ { "comment_text": "", "digests": { "md5": "a8b8c25689ccb3a5c6e1070d897b2651", "sha256": "78d5199f9bcc220a3bf3c70333b7be18bef6c69409b0f08473983e34bc4f8dd6" }, "downloads": -1, "filename": "middleware_test-1.1.6.tar.gz", "has_sig": false, "md5_digest": "a8b8c25689ccb3a5c6e1070d897b2651", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 34220, "upload_time": "2018-08-02T19:24:49", "url": "https://files.pythonhosted.org/packages/3c/ec/6e0d09496314d0bb97795f2145063525b26feb73b98755f67265b9ff5c1b/middleware_test-1.1.6.tar.gz" } ], "1.1.7": [ { "comment_text": "", "digests": { "md5": "5239b9f67902b2621fb16276e50cb94b", "sha256": "9263cfdb74bc0b2ce883ba4ebdac41a589e0b7cf1e023e0b4cdfa96b1eea3099" }, "downloads": -1, "filename": "middleware_test-1.1.7.tar.gz", "has_sig": false, "md5_digest": "5239b9f67902b2621fb16276e50cb94b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 34169, "upload_time": "2018-08-02T19:27:38", "url": "https://files.pythonhosted.org/packages/66/c9/ee7615246a791c0e3435788db12f58d023414cb57081461329bf2ae30cf8/middleware_test-1.1.7.tar.gz" } ], "1.1.8": [ { "comment_text": "", "digests": { "md5": "bbd0d922693f3b3ec0ae51efa1e75b3c", "sha256": "ed4901f646bf1cf793bb1b877822e707bf2e57dfcde17049c6cf0b4d30d5d0cf" }, "downloads": -1, "filename": "middleware_test-1.1.8.tar.gz", "has_sig": false, "md5_digest": "bbd0d922693f3b3ec0ae51efa1e75b3c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 34169, "upload_time": "2018-08-02T19:33:58", "url": "https://files.pythonhosted.org/packages/27/75/88a030dc18161d199cd5f354f28f6a4799f75cb01664d9eb5b17315b935a/middleware_test-1.1.8.tar.gz" } ], "1.1.9": [ { "comment_text": "", "digests": { "md5": "f1b54e2d82bd40c42c393fd6ddd4ec83", "sha256": "86fc953e2e33be9357462d05e89653339bf5394e6f63ac1e7e900213d7a660f0" }, "downloads": -1, "filename": "middleware_test-1.1.9.tar.gz", "has_sig": false, "md5_digest": "f1b54e2d82bd40c42c393fd6ddd4ec83", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 33447, "upload_time": "2018-08-02T19:39:57", "url": "https://files.pythonhosted.org/packages/a9/f1/272f864eb235a57ecb8d238adb6bad7aabcaa85c5dd5c94a5ef6feee337a/middleware_test-1.1.9.tar.gz" } ], "1.2": [ { "comment_text": "", "digests": { "md5": "bdd2936d1d5fd6b7c6a8a3aed147bd11", "sha256": "2575102e381b6ea340b59096eb88a733c942289642b41d44a912ea1457661e23" }, "downloads": -1, "filename": "middleware_test-1.2.tar.gz", "has_sig": false, "md5_digest": "bdd2936d1d5fd6b7c6a8a3aed147bd11", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23188, "upload_time": "2018-08-07T15:33:47", "url": "https://files.pythonhosted.org/packages/59/12/ef873b54e97834974db1b2fac41a8281fcae32a9df2807447ace1f8d224f/middleware_test-1.2.tar.gz" } ], "1.2.1": [ { "comment_text": "", "digests": { "md5": "114e1f8d7bf1edc09c531aad83629d3f", "sha256": "74208854c96474abd5db5d13f0ff94519bb915336158653679606008a0801e9a" }, "downloads": -1, "filename": "middleware_test-1.2.1.tar.gz", "has_sig": false, "md5_digest": "114e1f8d7bf1edc09c531aad83629d3f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23090, "upload_time": "2018-08-07T15:59:48", "url": "https://files.pythonhosted.org/packages/20/48/ba23f5eb3963d09b0220c8056c71c67f1253d0501bc0180b21eae79a9683/middleware_test-1.2.1.tar.gz" } ], "1.2.2": [ { "comment_text": "", "digests": { "md5": "d81ec1f78ae9e3e5e05d69abf1f1ad08", "sha256": "b86ce87096537f609a1a54f5a3ffbb2b778b05a04ff8a2d99eb020cfb1a23387" }, "downloads": -1, "filename": "middleware_test-1.2.2.tar.gz", "has_sig": false, "md5_digest": "d81ec1f78ae9e3e5e05d69abf1f1ad08", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23212, "upload_time": "2018-08-07T16:08:14", "url": "https://files.pythonhosted.org/packages/40/63/e0ba6b73de0145b93a355a20e987ad6f42c9d30009dc9be60f42801f785e/middleware_test-1.2.2.tar.gz" } ], "1.2.3": [ { "comment_text": "", "digests": { "md5": "a8db3deebef5a53b50d94e25f6ca9789", "sha256": "936d8df8f7a5c641479c006cd56871162fb5e890fbc09364b7c4d8a72792300f" }, "downloads": -1, "filename": "middleware_test-1.2.3.tar.gz", "has_sig": false, "md5_digest": "a8db3deebef5a53b50d94e25f6ca9789", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23186, "upload_time": "2018-08-07T16:10:15", "url": "https://files.pythonhosted.org/packages/76/34/5cf5f937facd627ff825887798ffd4f09af821682accc6dd602005ed354f/middleware_test-1.2.3.tar.gz" } ], "2.0": [ { "comment_text": "", "digests": { "md5": "a575220f8f3f412b28a9ea1e159700f0", "sha256": "e575be8116ae44ce44bcdd0d607ea1911fa587b0ff83c70fb9681e20f9432426" }, "downloads": -1, "filename": "middleware_test-2.0.tar.gz", "has_sig": false, "md5_digest": "a575220f8f3f412b28a9ea1e159700f0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23106, "upload_time": "2018-08-07T16:49:31", "url": "https://files.pythonhosted.org/packages/4f/3b/98e812673b8695f169c389ec6100ad8d272b2f45138e7f23b2069a804cb0/middleware_test-2.0.tar.gz" } ], "2.1": [ { "comment_text": "", "digests": { "md5": "0b4a31d55ec83b8c95ad771ab18e2259", "sha256": "fb4fb073d571c74c0771a54a650950eb65635b38c3c752eb30f7df0b78490f52" }, "downloads": -1, "filename": "middleware_test-2.1.tar.gz", "has_sig": false, "md5_digest": "0b4a31d55ec83b8c95ad771ab18e2259", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23422, "upload_time": "2018-08-07T16:56:16", "url": "https://files.pythonhosted.org/packages/42/c5/dde4f32ea09d4f000527aab7b1b0076c887d0aa98d129f0616a4dff1ce54/middleware_test-2.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "0b4a31d55ec83b8c95ad771ab18e2259", "sha256": "fb4fb073d571c74c0771a54a650950eb65635b38c3c752eb30f7df0b78490f52" }, "downloads": -1, "filename": "middleware_test-2.1.tar.gz", "has_sig": false, "md5_digest": "0b4a31d55ec83b8c95ad771ab18e2259", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23422, "upload_time": "2018-08-07T16:56:16", "url": "https://files.pythonhosted.org/packages/42/c5/dde4f32ea09d4f000527aab7b1b0076c887d0aa98d129f0616a4dff1ce54/middleware_test-2.1.tar.gz" } ] }