{ "info": { "author": "Swimlane", "author_email": "info@swimlane.com", "bugtrack_url": null, "classifiers": [], "description": "# graphish\n\nA Python package to search & delete messages from mailboxes in Office 365 using Microsoft Graph API\n\n## Current Features\n\n * Searching\n * Create new Search\n * Update a Search\n * Get Search Folder\n * Get Search messages\n * Delete Search\n * Deleting\n * Delete a Message\n * Mailbox Rules\n * List Mailbox Rules\n * Users\n * Return a list of email addresses in your Azure AD Tenant\n * MailFolder\n * Create MailFolder\n * Move message to a MailFolder\n * List messages in a MailFolder\n\n## Installation\n\nTo use, please install the package locally:\n\n## Installation\n\nLocally:\n\n``bash\ngit clone git@github.com:swimlane/graphish.git\ncd graphish\npip install setup.py\n``\n\nOS X & Linux:\n\n```bash\npip install graphish\n```\n\nWindows:\n\n```bash\npip install graphish\n```\n\n## Usage\n\nTo use, you will need to have created a new application in Azure AD. Follow these instructions to obtain the appropriate secrets:\n\nhttps://docs.microsoft.com/en-us/graph/auth-register-app-v2\n\nPlease also checkout this blog post about `graphish` [https://swimlane.com/blog/swimlane-open-sources-graphish/](https://swimlane.com/blog/swimlane-open-sources-graphish/)\n\nAdditionally, if you would like `graphish` to search all users within your Azure tenant you need to provide `User.Read.All` permissions to your Azure AD application during registration.\n\nOnce you have this information, then you can do the following:\n\n### GraphConnector\n\nTo use `graphish` you must first create a `GraphConnector` object that contains all your authentication information. Once you have created this connector object then a user will provide this object as a mandatory parameter to other classes within this package.\n\nHere are the different ways to generate a `GraphConnector` object and are dependent on which authentication workflow method you have choose for your application.\n\n#### Delegated Authentication\n\nTo use `graphish` with delegated permissions and a username and password you will need to supply the clientId, clientSecret, tenantId, as well as your accounts username and password.\n\nBy using the delegated authentication (Single-Page, Web Apps, Mobile & Native Apps - Grant Auth Flow) you can search your own mailbox by not passing a `userPrincipalName` or if you would like to search another mailbox then provide the `userPrincipalName` (e-mail address):\n\n#### Creating connector for your account using a (Single-Page, Web Apps, Mobile & Native Apps) authentication flow:\n\n```python\nfrom graphish import GraphConnector\n\nconnector = GraphConnector(\n clientId='14b8e5asd-c5a2-4ee7-af26-53461f121eed', # you applications clientId\n clientSecret='OdhG1hXb*UB/ho]A?0ZCci13KMflsHDy', # your applications clientSecret\n tenantId='c1141d00-072f-1eb9-2526-12802571dd41', # your applications Azure Tenant ID\n userPrincipalName='first.last@myorg.onmicrosoft.com', # the user's mailbox you want to search\n password='somepassword' # password of your normal or admin account\n)\n```\n#### Creating connector for another users mailbox using a (Single-Page, Web Apps, Mobile & Native Apps) authentication flow:\n\n```python\nfrom graphish import GraphConnector\n\n# For legacy app grant flow provide a username and password\nconnector = GraphConnector(\n clientId='14b8e5asd-c5a2-4ee7-af26-53461f121eed', # you applications clientId\n clientSecret='OdhG1hXb*UB/ho]A?0ZCci13KMflsHDy', # your applications clientSecret\n tenantId='c1141d00-072f-1eb9-2526-12802571dd41', # your applications Azure Tenant ID\n userPrincipalName='first.last@myorg.onmicrosoft.com', # the user's mailbox you want to search\n password='somepassword' # password of your normal or admin account\n)\n```\n\n### Application Authentication\n\nTo use `graphish` with application permissions you will need to supply the clientId, clientSecret, and tenantId.\n\nBy using the application authentication (Client Credentials Grant Auth Flow) you can search a specific mailbox or ALL mailboxes. \n\n#### Creating a connector for your account using a service/daemon authentication flow:\n\n```python\nfrom graphish import GraphConnector\n\n# For backend / client_credential auth flow just supply the following\nconnector = GraphConnector(\n clientId='14b8e5asd-c5a2-4ee7-af26-53461f121eed', # you applications clientId\n clientSecret='OdhG1hXb*UB/ho]A?0ZCci13KMflsHDy', # your applications clientSecret\n tenantId='c1141d00-072f-1eb9-2526-12802571dd41', # your applications Azure Tenant ID\n)\n```\n\n#### Creating a connector for another users mailbox using a service/daemon authentication flow:\n\n```python\nfrom graphish import GraphConnector\n\n# For backend / client_credential auth flow just supply the following\nconnector = GraphConnector(\n clientId='14b8e5asd-c5a2-4ee7-af26-53461f121eed', # you applications clientId\n clientSecret='OdhG1hXb*UB/ho]A?0ZCci13KMflsHDy', # your applications clientSecret\n tenantId='c1141d00-072f-1eb9-2526-12802571dd41' # your applications Azure Tenant ID\n)\n```\n\n### Creating a new Search\n\nOnce you have determined your appropriate authentication and have created a `GraphConnector` object, then you can create a new `Search` Object. Once you have your `Search` Object then you can create a new search, retrieve messages from your search, get search folders, update a search folder, or delete a search. When you create a new search, this will create a hidden folder in the users mailbox (that the user is unable to see) and it will populate based on your search filterQuery. \n\nWhen you create (or instantiate) a `Search` object you can specify the scope of your search. There are three use-cases related to specifying a search:\n\n- Provide a user principal name to the `userPrincipalName` parameter on the `Search` class\n- Provide 'me' to the `userPrincipalName` parameter on the `Search` class when you are using username and password authentication workflow\n- **DEFAULT**: Provide no value to the `userPrincipalName` parameter on the `Search` class. This will pull in all users within your Azure AD via the ListUsers endpoint.\n\n**NOTE: If using application authentication workflow, you can either pass in a single or list of userPrincipalName's. If you DO NOT pass in a userPrincipalName then Search will attempt to search all mailboxes in your Azure AD tenant!**\n\n```python\nfrom graphish import Search\n\nsearch = Search(connector)\n\nnew_search = search.create(\n searchFolderName='Phishing Search',\n sourceFolder='inbox',\n filterQuery=\"contains(subject, 'EXPIRES')\"\n)\n```\n\n### Getting messages from a Search\n\nYou can retrieve messages identified during your search by using the same instance of your Search object and using the `messages` method:\n\n```python\n# get all the messages in your search folder\n\nfor message in search.messages():\n print(message) # Returns all attributes from a message\n print(message['id']) # returns the message ID\n print(message['headers']) # Returns the RFC822 headers of the message\n```\n\n### Getting a list of mail folders\n\nIf you are needing a list of mail folders in a mailbox you can use the `folders` method to retrieve them:\n\n```python\n# get a list of search folders\nsearch.folders()\n```\n\n\n### Getting a list of users\n\nIf you are needing a list of all users within your search scope:\n\n```python\n# get a list of users\nsearch.user\n```\n\n### Moving a message to a folder\n\nIf you have performed a search and want to move a message to a mail folder, you can do so by doing the following:\n\n```python\nfrom graphish import Search\nfrom graphish import GraphConnector\nfrom graphish import MailFolder\n\n\nconnector = GraphConnector(\n clientId='14b8e5asd-c5a2-4ee7-af26-53461f121eed', # you applications clientId\n clientSecret='OdhG1hXb*UB/ho]A?0ZCci13KMflsHDy', # your applications clientSecret\n tenantId='c1141d00-072f-1eb9-2526-12802571dd41' # your applications Azure Tenant ID\n)\n\nsearch = Search(connector, userPrincipalName='some.account@myorg.onmicrosoft.com')\n\nnew_search = search.create(\n searchFolderName='Phishing Search',\n sourceFolder='inbox',\n filterQuery=\"contains(subject, 'phishing')\"\n)\n\nmessages = search.messages()\nfor message in messages:\n print(message['internetMessageId'])\n print(message['fromAddress'])\n print(message['id'])\n mail_folder = MailFolder(connector,'some.account@myorg.onmicrosoft.com')\n moved_message = mail_folder.move_message(message['id'],'junkemail')\n print(moved_message)\n\n```\n\n### Creating a new MailFolder\n\nYou can also create a new `MailFolder` using the `MailFolder` class:\n\n```python\nfrom graphish import MailFolder\n\nmail_folder = MailFolder(connector,'some.account@myorg.onmicrosoft.com')\nnew_mail_folder = mail_folder.create('My Phishing Folder')['id']\n```\n\n### Updating a search\n\nIf you wanted to make changes to a search performed you can update the search folder and individual criteria like the name of the search folder, the sourceFolder (root to search), or the filterQuery itself:\n\n```python\n# update your search folder property's\nsearch.update(\n searchFolderName='Some Phishing Search',\n sourceFolder='inbox',\n filterQuery=\"contains(subject, 'EXPIRES!')\"\n)\n```\n\n### Deleting a search\n\nYou can also delete a search performed by using the `delete` method:\n\n```python\n# delete the current search folder\nsearch.delete()\n```\n\n### List Mailbox Rules\n\nAdditionally, you can list any mailbox rules:\n\n```python\nfrom graphish import Rules\n\nrules = Rules(\n connector,\n userPrincipalName='some.account@myorg.onmicrosoft.com'\n)\n\nprint(rules.get())\n```\n\n\n### Additional Examples\n\nYou can find additional examples [here](bin/graphish-example.py)\n\n## Release History\n\n* 1.0.0\n * Initial release of graphish to PyPi\n* 1.3.0\n * Added capabilities to get all users and to move messages to a specified mailfolder\n\n## Meta\n\nJosh Rickard \u2013 [@MSAdministrator](https://twitter.com/MSAdministrator) \u2013 rickardja@live.com\n\nDistributed under the MIT license. See ``LICENSE`` for more information.\n\n## Contributing\n\n1. Fork it ()\n2. Create your feature branch (`git checkout -b feature/fooBar`)\n3. Commit your changes (`git commit -am 'Add some fooBar'`)\n4. Push to the branch (`git push origin feature/fooBar`)\n5. Create a new Pull Request\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/swimlane/graphish", "keywords": "graph,microsoft,office365,email,ediscovery,phish,phishing,swimlane", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "graphish", "package_url": "https://pypi.org/project/graphish/", "platform": "", "project_url": "https://pypi.org/project/graphish/", "project_urls": { "Homepage": "https://github.com/swimlane/graphish" }, "release_url": "https://pypi.org/project/graphish/1.3.0/", "requires_dist": [ "requests", "oauthlib", "pendulum", "requests-oauthlib" ], "requires_python": "", "summary": "A Python package to search & delete & move emails using Microsoft Graph API", "version": "1.3.0" }, "last_serial": 5752948, "releases": { "1.0.0": [ { "comment_text": "", "digests": { "md5": "32ca59ed44b90c963d660858836debd9", "sha256": "210ecf3cdc3cfa9adb901fd7fb1e3e9be2bf7ea041b58c437d95987b1f63b604" }, "downloads": -1, "filename": "graphish-1.0.0-py2-none-any.whl", "has_sig": false, "md5_digest": "32ca59ed44b90c963d660858836debd9", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, <4", "size": 8329, "upload_time": "2019-06-19T14:24:50", "url": "https://files.pythonhosted.org/packages/15/a8/74b5b228c6503a32bc8cc1458b9053582be57fe5b9e445ce2ebcbf9eb624/graphish-1.0.0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5524f82945bd002a687a1eddd2061aac", "sha256": "7574c1956f6ae2cf3b75ff93b94d9c3b2474d348dcb2690617a6cbd1f19fd1e7" }, "downloads": -1, "filename": "graphish-1.0.0-py3-none-any.whl", "has_sig": false, "md5_digest": "5524f82945bd002a687a1eddd2061aac", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, <4", "size": 8330, "upload_time": "2019-06-19T14:24:52", "url": "https://files.pythonhosted.org/packages/e3/06/6833465b87b37d71e33aca4a85d4ddd94aa924a1b6ff1ed67057eace470c/graphish-1.0.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6f20bbcfd582a648ac912ed0f3d0b6ba", "sha256": "2d0876f91ef4df7d887ae6b668dc70bbcbf36e613a5aa98a09a72cf07a969bb8" }, "downloads": -1, "filename": "graphish-1.0.0.tar.gz", "has_sig": false, "md5_digest": "6f20bbcfd582a648ac912ed0f3d0b6ba", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, <4", "size": 6986, "upload_time": "2019-06-19T14:24:54", "url": "https://files.pythonhosted.org/packages/ba/f6/02be1cb6b256567045fa30dc4f56dc134a737b784d930d7ae36d4250415d/graphish-1.0.0.tar.gz" } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "a232ac9932c2d852dfdb4f93ca806fd5", "sha256": "8b80c3cd224657c673f32cb3c1a261fa89e51a69fa89b01d602bd25771921f5c" }, "downloads": -1, "filename": "graphish-1.1.0-py2-none-any.whl", "has_sig": false, "md5_digest": "a232ac9932c2d852dfdb4f93ca806fd5", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, <4", "size": 10474, "upload_time": "2019-07-25T15:43:45", "url": "https://files.pythonhosted.org/packages/94/5e/36cf8bba596b4b2acf3c329d95f3bf30860e50f33da4b8ef174dc686eeea/graphish-1.1.0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "122c6f4701813fee880a4a054669f6b8", "sha256": "2095687b3475d0baf8b574be871aa6e58751e06662c96b65e9f3f25798e01cdc" }, "downloads": -1, "filename": "graphish-1.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "122c6f4701813fee880a4a054669f6b8", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, <4", "size": 10475, "upload_time": "2019-07-25T15:43:47", "url": "https://files.pythonhosted.org/packages/fe/ed/17733dcb72b6d783eb0fce79c0597d097daaeb94b5a16a4a180cce2021c7/graphish-1.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "16cc984c96b0f73a6c65acbc22696d91", "sha256": "90631c653e2b1a0b8092131736778d4c63171dceb8bb72cbda759be7cba115f1" }, "downloads": -1, "filename": "graphish-1.1.0.tar.gz", "has_sig": false, "md5_digest": "16cc984c96b0f73a6c65acbc22696d91", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, <4", "size": 9859, "upload_time": "2019-07-25T15:43:49", "url": "https://files.pythonhosted.org/packages/24/29/8b5ab4382d1414ef3bf36fab185a2a8f296a9f46e9f641a2f85c1726994a/graphish-1.1.0.tar.gz" } ], "1.1.1": [ { "comment_text": "", "digests": { "md5": "544f83465dd3c3b955fba06ff82787b5", "sha256": "47c01f13ee01e1e8e4e6fd56fdd9a4b70347551834990626117c4b6b9e9d6fe0" }, "downloads": -1, "filename": "graphish-1.1.1-py2-none-any.whl", "has_sig": false, "md5_digest": "544f83465dd3c3b955fba06ff82787b5", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, <4", "size": 10596, "upload_time": "2019-07-25T15:57:38", "url": "https://files.pythonhosted.org/packages/b3/69/c2170c58bc2d1eeb4a284551c9eea4b8785a2335cff2d524ad6e720e7f70/graphish-1.1.1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "47709c6da645fd01d32cacff6566cc09", "sha256": "49561b48c3c46633f025d4d4dda0cc2e2b98f105dd21a8aee46fcb07cd9a7350" }, "downloads": -1, "filename": "graphish-1.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "47709c6da645fd01d32cacff6566cc09", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, <4", "size": 10596, "upload_time": "2019-07-25T15:57:40", "url": "https://files.pythonhosted.org/packages/f6/e6/0a67abdb20b9c540f23a4ea87f26ce591e53354757b3d8b9a46d516c62ea/graphish-1.1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5ed0d6783e58919c2caaf8c6c9dd6fbe", "sha256": "9f1882b30086f5d04dd1bb0e3a502b7b79a20e0163ba073f4dca3fbc2a40909b" }, "downloads": -1, "filename": "graphish-1.1.1.tar.gz", "has_sig": false, "md5_digest": "5ed0d6783e58919c2caaf8c6c9dd6fbe", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, <4", "size": 9887, "upload_time": "2019-07-25T15:57:42", "url": "https://files.pythonhosted.org/packages/89/37/9bfb2d4484aff98a840e9c0a5a7810d0fd166d57874aaa4da3faaa7dcf5a/graphish-1.1.1.tar.gz" } ], "1.1.2": [ { "comment_text": "", "digests": { "md5": "6793914800716e1742d4c62703f7bbbf", "sha256": "231d5996220c3a657615e862fa657a5786d276f8aafb7359f75f2dcb8c629842" }, "downloads": -1, "filename": "graphish-1.1.2-py2-none-any.whl", "has_sig": false, "md5_digest": "6793914800716e1742d4c62703f7bbbf", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, <4", "size": 10610, "upload_time": "2019-07-26T14:39:41", "url": "https://files.pythonhosted.org/packages/05/99/4e65c64595e4c690fd86ebcaaa94e1ab1ca8c618eb116e864dff37ac3dd3/graphish-1.1.2-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "badeb77204192c5d1de68fadaac3e4bf", "sha256": "ac8f7e02ecce654ee078442e9fd78e6c405d395b5f06dd63b501b4edca6f23cf" }, "downloads": -1, "filename": "graphish-1.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "badeb77204192c5d1de68fadaac3e4bf", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, <4", "size": 10614, "upload_time": "2019-07-26T14:39:42", "url": "https://files.pythonhosted.org/packages/68/3b/3bda9e2e543bd6e33009a5d5eca6ffafd2d88e30d6de293f2b27fcf774c9/graphish-1.1.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9cd0f5605073aefbe8bb3cbf0731417f", "sha256": "79165bae022ef24cf2b182edede77337c3179f671eda42eaaa65612dd25eebe3" }, "downloads": -1, "filename": "graphish-1.1.2.tar.gz", "has_sig": false, "md5_digest": "9cd0f5605073aefbe8bb3cbf0731417f", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, <4", "size": 9915, "upload_time": "2019-07-26T14:39:44", "url": "https://files.pythonhosted.org/packages/29/f1/e7c445e59dd2e933304d89a83e13734077bfe3de4329f0e144588ae88d36/graphish-1.1.2.tar.gz" } ], "1.1.3": [ { "comment_text": "", "digests": { "md5": "ca494020afd18a7abf6ab1b3701a00fd", "sha256": "91d0e425ca5264960fb57a39e4096b07e7770fd0d2f7351eed3b52fde6c50c79" }, "downloads": -1, "filename": "graphish-1.1.3-py2-none-any.whl", "has_sig": false, "md5_digest": "ca494020afd18a7abf6ab1b3701a00fd", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, <4", "size": 10607, "upload_time": "2019-07-26T15:30:29", "url": "https://files.pythonhosted.org/packages/93/90/e2c4a03fadf1dd0183af03ff62462f0eb5693cb22df9e24afc62c50d111c/graphish-1.1.3-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "da234f24aa2279e956f0fe7a82b168dc", "sha256": "809d8e1d23530e89d0a3d5b2d7bc03cfe13c77505776d3ea49c413d764ee906c" }, "downloads": -1, "filename": "graphish-1.1.3-py3-none-any.whl", "has_sig": false, "md5_digest": "da234f24aa2279e956f0fe7a82b168dc", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, <4", "size": 10611, "upload_time": "2019-07-26T15:30:31", "url": "https://files.pythonhosted.org/packages/2b/d5/c501fcc06d3a29227d00d44a3b4a9861873e1ddab2968d4665c86a0c517d/graphish-1.1.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7339034a852bbbb1b39abf4b179eacb1", "sha256": "1b66b0b93e6ea3231be1f21a8939b00ebb14b812e0524d2885dd60321beed787" }, "downloads": -1, "filename": "graphish-1.1.3.tar.gz", "has_sig": false, "md5_digest": "7339034a852bbbb1b39abf4b179eacb1", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, <4", "size": 9900, "upload_time": "2019-07-26T15:30:32", "url": "https://files.pythonhosted.org/packages/d3/8d/c1e5a5355a61aacb972771418855fe1e3eb4bdd64318f9556895ada973d4/graphish-1.1.3.tar.gz" } ], "1.2.0": [ { "comment_text": "", "digests": { "md5": "50be4e468ad4b27fb857c4ca65371021", "sha256": "028e6512e7bb3d42095fa3470154321db1fbe747b05a9edd690674972d2bcfef" }, "downloads": -1, "filename": "graphish-1.2.0-py2-none-any.whl", "has_sig": false, "md5_digest": "50be4e468ad4b27fb857c4ca65371021", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, <4", "size": 10800, "upload_time": "2019-07-26T18:27:19", "url": "https://files.pythonhosted.org/packages/eb/89/55bb6bfd68ae8790f0fc82e8a38dc6c6995e9a7742e083e2707c62789053/graphish-1.2.0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f8dc57907050a86d0f33fdeb5b2d33f0", "sha256": "2878bb6e95ec04b0eb6d6de2a31b85f59174d181093ce8177f7d882870eaac17" }, "downloads": -1, "filename": "graphish-1.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "f8dc57907050a86d0f33fdeb5b2d33f0", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, <4", "size": 10800, "upload_time": "2019-07-26T18:27:20", "url": "https://files.pythonhosted.org/packages/65/a1/719e70d2bb752390fe43f95f9a222e6760e701c375b1278750ce180133a8/graphish-1.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "89fce7bf3739437f73f3db055f428328", "sha256": "51951e292fc1176c30468b3f633671e289d6f06126a1b09766ad628166b4d35f" }, "downloads": -1, "filename": "graphish-1.2.0.tar.gz", "has_sig": false, "md5_digest": "89fce7bf3739437f73f3db055f428328", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, <4", "size": 10139, "upload_time": "2019-07-26T18:27:21", "url": "https://files.pythonhosted.org/packages/78/56/0eb43d02f7f5468c810bc6bed788dc47f317493041bb6fb910b145fe3fd8/graphish-1.2.0.tar.gz" } ], "1.3.0": [ { "comment_text": "", "digests": { "md5": "6ddb1ba65829eadf644f8b1213eeac9f", "sha256": "0d857afd15d68ecf708bfe8057bac9fc905993e8ca862ec5b7b294e836b2e7d6" }, "downloads": -1, "filename": "graphish-1.3.0-py2-none-any.whl", "has_sig": false, "md5_digest": "6ddb1ba65829eadf644f8b1213eeac9f", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 12348, "upload_time": "2019-08-29T14:20:03", "url": "https://files.pythonhosted.org/packages/48/41/350b262f5d77229ea8d482c0c54e2d2a5e1606107e3bb0101ab0d84e94cb/graphish-1.3.0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "947cf28e0e512f4b620962851b78eab8", "sha256": "e4a9d1cf8c1cb67a386cc9010f60fd97a7dfa252ab20db9a18f382c85a767ae6" }, "downloads": -1, "filename": "graphish-1.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "947cf28e0e512f4b620962851b78eab8", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 12350, "upload_time": "2019-08-29T14:20:04", "url": "https://files.pythonhosted.org/packages/ca/e8/c841838f6789fdcccbea3a8eb787e8fd8a4598125adb37fa09b0410071c9/graphish-1.3.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "bfe7e0ce194770a266b4e5336d7038bc", "sha256": "a96c460c12edd16c2013fa0b168c5e09ae5ed1f35c669791df63e8a0ea81dbb3" }, "downloads": -1, "filename": "graphish-1.3.0.tar.gz", "has_sig": false, "md5_digest": "bfe7e0ce194770a266b4e5336d7038bc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11926, "upload_time": "2019-08-29T14:20:06", "url": "https://files.pythonhosted.org/packages/62/2f/c3bb029b3b46124a26cbce8b0c3cf58a9ce0daf270d51915dd9995f7828a/graphish-1.3.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "6ddb1ba65829eadf644f8b1213eeac9f", "sha256": "0d857afd15d68ecf708bfe8057bac9fc905993e8ca862ec5b7b294e836b2e7d6" }, "downloads": -1, "filename": "graphish-1.3.0-py2-none-any.whl", "has_sig": false, "md5_digest": "6ddb1ba65829eadf644f8b1213eeac9f", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 12348, "upload_time": "2019-08-29T14:20:03", "url": "https://files.pythonhosted.org/packages/48/41/350b262f5d77229ea8d482c0c54e2d2a5e1606107e3bb0101ab0d84e94cb/graphish-1.3.0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "947cf28e0e512f4b620962851b78eab8", "sha256": "e4a9d1cf8c1cb67a386cc9010f60fd97a7dfa252ab20db9a18f382c85a767ae6" }, "downloads": -1, "filename": "graphish-1.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "947cf28e0e512f4b620962851b78eab8", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 12350, "upload_time": "2019-08-29T14:20:04", "url": "https://files.pythonhosted.org/packages/ca/e8/c841838f6789fdcccbea3a8eb787e8fd8a4598125adb37fa09b0410071c9/graphish-1.3.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "bfe7e0ce194770a266b4e5336d7038bc", "sha256": "a96c460c12edd16c2013fa0b168c5e09ae5ed1f35c669791df63e8a0ea81dbb3" }, "downloads": -1, "filename": "graphish-1.3.0.tar.gz", "has_sig": false, "md5_digest": "bfe7e0ce194770a266b4e5336d7038bc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11926, "upload_time": "2019-08-29T14:20:06", "url": "https://files.pythonhosted.org/packages/62/2f/c3bb029b3b46124a26cbce8b0c3cf58a9ce0daf270d51915dd9995f7828a/graphish-1.3.0.tar.gz" } ] }