{ "info": { "author": "Mozilla Services", "author_email": "services-dev@mozilla.org", "bugtrack_url": null, "classifiers": [ "Intended Audience :: Developers", "License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0)", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.6" ], "description": "===========================================================\nPyFxA: Python library for interacting with Firefox Accounts\n===========================================================\n\n.. image:: https://travis-ci.org/mozilla/PyFxA.svg?branch=master\n :target: https://travis-ci.org/mozilla/PyFxA\n\nThis is python library for interacting with the Firefox Accounts ecosystem.\n\nEventually, it is planned to provide easy support for the following features:\n\n* being a direct firefox accounts authentication client\n* being an FxA OAuth Service Provider\n* accessing attached services\n* helps interactions with Firefox Account servers wiht requests Authentication plugins.\n\nBut none of that is ready yet; caveat emptor.\n\n\nFirefox Accounts\n================\n\nCurrently, basic auth-server operations should work like so:\n\n.. code-block:: python\n\n from fxa.core import Client\n\n client = Client(\"https://api.accounts.firefox.com\")\n client.create_account(\"test@example.com\", \"MySecretPassword\")\n\n session = client.login(\"test@example.com\", \"MySecretPassword\")\n cert = session.sign_certificate(myPublicKey)\n session.change_password(\"MySecretPassword\", \"ThisIsEvenMoreSecret\")\n\n\nFxA OAuth Relier\n================\n\nTrade the authentication code against a longer lived OAuth token:\n\n.. code-block:: python\n\n from fxa.oauth import Client\n\n client = Client()\n token = client.trade_code(\"client-id\", \"client-secret\", \"code-1234\")\n\n\nVerify an OAuth token:\n\n.. code-block:: python\n\n from fxa.oauth import Client\n from fxa.errors import ClientError\n\n client = Client()\n\n try:\n profile = client.verify_token(\"123456...\")\n except ClientError:\n print \"Invalid token\"\n\n print(\"User id\", profile[\"user\"])\n\n\nTesting email addresses\n=======================\n\nThere's also very basic integration with restmail.net, to allow for\ntesting with live email addresses. It works like this:\n\n.. code-block:: python\n\n from fxa.core import Client\n from fxa.tests.utils import TestEmailAccount\n\n # Create a testing account using an @restmail.net address.\n acct = TestEmailAccount()\n client = Client(\"https://api.accounts.firefox.com\")\n session = client.create_account(acct.email, \"MySecretPassword\")\n\n # Verify the account using the code from email.\n acct.fetch()\n for m in acct.messages:\n if \"x-verify-code\" in m[\"headers\"]:\n session.verify_email_code(m[\"headers\"][\"x-verify-code\"])\n\n ...\n\n # Destroy the account once you're done with it.\n acct.clear()\n client.destroy_account(acct.email, \"MySecretPassword\")\n\n\nPassing tokens and assertions to other applications\n===================================================\n\nPyFxA provides a ``fxa-client`` that you can use to export Bearer\nTokens and Browser ID assertions.\n\n\nGet a Bearer Token for an existing account\n------------------------------------------\n\n.. code-block:: bash\n\n fxa-client --bearer --auth you@domain.tld \\\n --account-server https://api.accounts.firefox.com/v1 \\\n --oauth-server https://oauth.accounts.firefox.com/v1\n\n Please enter a password for you@domain.tld: \n\n # ---- BEARER TOKEN INFO ----\n # User: you@domain.tld\n # Scopes: profile\n # Account: https://api.accounts.firefox.com/v1\n # Oauth: https://oauth.accounts.firefox.com/v1\n # ---------------------------\n export OAUTH_BEARER_TOKEN=\"3f5106b203c...b728ef93fe29203aad44ee816a45b2f2ff57a6aed7a3\"\n\n\nCreate a new account Bearer Token on stage\n------------------------------------------\n\n.. code-block:: bash\n\n fxa-client --bearer --create --prefix hello\n\n # ---- BEARER TOKEN INFO ----\n # User: hello-89331eba46e970dc1686ba2dc4583fc9@restmail.net\n # Scopes: profile\n # Account: https://api-accounts.stage.mozaws.net/v1\n # Oauth: https://oauth.stage.mozaws.net/v1\n # ---------------------------\n export OAUTH_BEARER_TOKEN=\"ecb5285d59b28e6768fe60d76e6994877ffb16d3232c...72bdee05ea8a5\"\n\n\nCreate a new account BrowserID assertion on stage\n-------------------------------------------------\n\n.. code-block:: bash\n\n fxa-client --browserid --create --audience https://token.stage.mozaws.net/ --prefix syncto\n # ---- BROWSER ID ASSERTION INFO ----\n # User: syncto-5bcf63598bf6026a6833035821742d3e@restmail.net\n # Audience: https://token.stage.mozaws.net/\n # Account: https://api-accounts.stage.mozaws.net/v1\n # ------------------------------------\n export FXA_BROWSERID_ASSERTION=\"eyJhbGciOiJSUzI1NiJ9.eyJw......VNKcPu6Uc9Y4pCuGcdM0UwaA\"\n export FXA_CLIENT_STATE=\"abaa31cc3b16aaf6759f2cba164a54be\"\n\n\nWith Requests\n=============\n\nUsing Firefox Account BrowserID with Requests\n---------------------------------------------\n\nYou can use the ``FxABrowserIDAuth`` to build the BrowserID assertion:\n\n.. code-block:: python\n\n from fxa.core import Client\n from fxa.plugins.requests import FxABrowserIDAuth\n\n email = acct.email\n password = \"MySecretPassword\"\n\n raw_resp = requests.get('https://token.services.mozilla.com/1.0/sync/1.5',\n auth=FxABrowserIDAuth(email, password,\n with_client_state=True))\n\n raw_resp.raise_for_status()\n resp = raw_resp.json()\n user_id = resp['uid']\n\n\nUsing Firefox Account Bearer Token with Requests\n------------------------------------------------\n\nYou can use the ``FxABearerTokenAuth`` to build the Bearer Token:\n\n.. code-block:: python\n\n from fxa.core import Client\n from fxa.plugins.requests import FxABearerTokenAuth\n\n email = acct.email\n password = \"MySecretPassword\"\n\n raw_resp = requests.get('https://profile.accounts.firefox.com/v1/profile',\n auth=FxABearerTokenAuth(email, password,\n ['profile'], client_id))\n\n raw_resp.raise_for_status()\n resp = raw_resp.json()\n user_id = resp['uid']\n\n\nWith HTTPie\n===========\n\nUsing Firefox Account BrowserID with HTTPie\n-------------------------------------------\n\nYou can use the httpie plugin provided with PyFxA to build the BrowserID request:\n\n.. code-block:: http\n\n BID_WITH_CLIENT_STATE=True \\\n http GET https://token.services.mozilla.com/1.0/sync/1.5 \\\n --auth-type=fxa-browserid --auth \"email:password\" -v\n\n GET /1.0/sync/1.5 HTTP/1.1\n Accept: */*\n Accept-Encoding: gzip, deflate\n Authorization: BrowserID eyJhbG..._EqaQ\n Connection: keep-alive\n Host: token.services.mozilla.com\n User-Agent: HTTPie/0.9.2\n X-Client-State: 97b945...920fac4d4d5f0dc6...2992\n\n HTTP/1.1 200 OK\n Access-Control-Allow-Credentials: true\n Access-Control-Allow-Headers: DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization,X-Conditions-Accepted\n Access-Control-Allow-Methods: GET, POST, OPTIONS\n Access-Control-Max-Age: 1728000\n Connection: keep-alive\n Content-Length: 414\n Content-Type: application/json; charset=UTF-8\n Date: Tue, 21 Jul 2015 10:48:42 GMT\n X-Timestamp: 1437475722\n\n {\n \"api_endpoint\": \"https://sync-230-us-west-2.sync.services.mozilla.com/1.5/99283757\",\n \"duration\": 3600,\n \"hashalg\": \"sha256\",\n \"id\": \"eyJub2RlI....FlYzdiMCIsICJ1aWQiOiAyMDIzODc3NX2Bvj5zv..7S2jRaw__-....eh3hiSVWA==\",\n \"key\": \"lSw-MvgK....ebu9JsX-yXS70NkiXu....6wWgVzU0Q=\",\n \"uid\": 99283757\n }\n\n.. note::\n\n You can configure the audience by settings the ``BID_AUDIENCE``\n environment variable.\n\n\tYou can also compute the Token Server client state using the\n\t``BID_WITH_CLIENT_STATE`` environment variable.\n\n\nUsing Firefox Account Bearer Tokens with HTTPie\n-----------------------------------------------\n\nYou can use the httpie plugin provided with PyFxA to build the Bearer\ntoken request:\n\n.. code-block:: http\n\n $ http GET https://profile.accounts.firefox.com/v1/profile \\\n --auth-type fxa-bearer --auth \"email:password\" -v\n\n GET /v1/profile HTTP/1.1\n Accept: */*\n Accept-Encoding: gzip, deflate\n Authorization: Bearer 98e05e12ba...0d61231e88daf91\n Connection: keep-alive\n Host: profile.accounts.firefox.com\n User-Agent: HTTPie/0.9.2\n\n HTTP/1.1 200 OK\n Connection: keep-alive\n Content-Length: 92\n Content-Type: application/json; charset=utf-8\n Date: Tue, 21 Jul 2015 14:47:32 GMT\n Server: nginx\n access-control-allow-headers: Authorization, Content-Type, If-None-Match\n access-control-allow-methods: GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS\n access-control-allow-origin: *\n access-control-expose-headers: WWW-Authenticate, Server-Authorization\n access-control-max-age: 86400\n cache-control: no-cache\n content-encoding: gzip\n etag: \"d1cf22901b3e3be527c06e27689be705bb22a172\"\n strict-transport-security: max-age=15552000; includeSubdomains\n vary: accept-encoding\n\n {\n \"email\": \"email@address.com\",\n \"uid\": \"63b91ca4ec19ad79f320eaf5815d75e9\"\n }\n\n.. note::\n\n You can configure the following:\n\n - FXA_CLIENT_ID: To choose the CLIENT_ID (default to Firefox Dev id)\n - FXA_SCOPES: To choose the list of scopes\n - FXA_ACCOUNT_SERVER_URL: To select the account server url\n (default to: https://api.accounts.firefox.com/v1)\n - FXA_OAUTH_SERVER_URL: To select the oauth server url\n (default to: https://oauth.accounts.firefox.com/v1)\n\n\nCHANGELOG\n#########\n\nThis document describes changes between each past release.\n\n0.7.3 (2019-07-26)\n==================\n\n- Allow specifying a `ttl` when redeeming an authorization code.\n\n\n0.7.2 (2019-06-03)\n==================\n\n- Several cleans for Python3 compatibility; thanks Tom\u00e1\u0161 Chv\u00e1tal!\n- Fix a bug could accidentally introduce multiple slashes into\n the result of oauth.Client.get_redirect_url.\n\n\n0.7.1 (2019-03-18)\n==================\n\n- Fix test bustage due to session verification.\n\n\n0.7.0 (2019-03-18)\n==================\n\n- Add support for TOTP.\n\n\n0.6.0 (2018-05-04)\n==================\n\n- Add support for PKCE challenge and response in the OAuth flow.\n- Add ability to supply `keys_jwk` when starting an OAuth flow.\n- Improve scope-matching logic based on new FxA testcases,\n including handling of URL-format scopes.\n\n\n0.5.0 (2018-01-12)\n==================\n\n- Add ability to login with unblock codes.\n- Tell testrunners to ignore some test helper utilities.\n\n\n0.4.0 (2017-??-??)\n==================\n\n- Use `pkg_resources` to handle package version. (#45)\n- Add a shortcut for authorizing oauth codes directly from a core.Session,\n rater than requiring the caller to explicitly create an assertion.\n\n\n0.3.0 (2016-09-07)\n==================\n\n- Add a ``verify_email_code(uid, code)`` method to the ``core.Client`` (#43).\n\n\n0.2.0 (2016-05-11)\n==================\n\n- Make sure fxa.tests.utils can be used without installing PyFxA tests dependencies. (#41)\n\n\n0.1.3 (2016-04-22)\n==================\n\n- Update the User-Agent so that we can detect PyFxA calls. (#40)\n\n\n0.1.2 (2016-04-21)\n==================\n\n- Correctly send request to the Auth server.\n\n\n0.1.1 (2016-01-13)\n==================\n\n- Correctly configure cert duration while generating BrowserID Assertion (#39)\n\n\n0.1.0 (2016-01-07)\n==================\n\n- Add fxa-client CLI tool (#36)\n- Remove support for Python 2.6 (#38)\n\n\n0.0.9 (2015-08-15)\n==================\n\n- Remove the mention stating that PyFxA is still highly experimental (#31)\n- Do not rely on the package to be installed in order to be used (#32)\n\n\n0.0.8 (2015-08-14)\n==================\n\n- Update setup.py to handle utf-8 characters in README and CHANGES files (#29)\n- Add cache functionality to the Auth plugins (#30)\n\n\n0.0.7 (2015-07-23)\n==================\n\n- Use grequests if available to use PyFxA with the gevent ecosystem.\n- Add the oauth /destroy operation.\n- Profile fetch skips fields you don't have permission to read.\n- Add the BrowserID requests Auth module and related HTTPie plugin.\n- Add the BearerToken requests Auth module and related HTTPie plugin.\n- Add PyOpenSSL support for secure SSL requests handling with Python 2.\n\n\n0.0.6 (2015-03-20)\n==================\n\n- Expose unicode in oauth cache, not bytestrings.\n\n\n0.0.5 (2015-03-19)\n==================\n\n- Specify minimum required version of `requests` dependency.\n\n\n0.0.4 (2015-03-11)\n==================\n\n- Add a basic API for retrieving profile information\n with an OAuth token.\n\n\n0.0.3 (2015-02-20)\n==================\n\n- Refacotor oauth.Client to take id/secret as constructor args.\n- Add basic caching on oauth token verification.\n- Accept option \"/v1\" suffix on server URLs.\n- Add get_identity_assertion() method to core.Session.\n- Add methods to oauth.Client for authorizing codes and tokens.\n- Add a new error hierarchy for trust-related errors.\n- Additional sanity-checking in oauth scope checks.\n\n\n0.0.2 (2015-01-05)\n==================\n\n- Initial release; includes basic auth and oauth functionality.", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/mozilla/PyFxA", "keywords": "firefox accounts authentication", "license": "MPLv2.0", "maintainer": "", "maintainer_email": "", "name": "PyFxA", "package_url": "https://pypi.org/project/PyFxA/", "platform": "", "project_url": "https://pypi.org/project/PyFxA/", "project_urls": { "Homepage": "https://github.com/mozilla/PyFxA" }, "release_url": "https://pypi.org/project/PyFxA/0.7.3/", "requires_dist": null, "requires_python": "", "summary": "Firefox Accounts client library for Python", "version": "0.7.3" }, "last_serial": 5586016, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "f93d84cdd5f6496a22b2698e0d3c5db1", "sha256": "064b123b8ec2144f07ed6e770dd46586db72d94dd57bc91625d5be63ec3d95d7" }, "downloads": -1, "filename": "PyFxA-0.0.1.tar.gz", "has_sig": false, "md5_digest": "f93d84cdd5f6496a22b2698e0d3c5db1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13266, "upload_time": "2014-12-12T06:11:09", "url": "https://files.pythonhosted.org/packages/6b/02/11e188978ea380e3b3c243d272db1a6cda68fbe7e46a07e153a480ec016c/PyFxA-0.0.1.tar.gz" } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "838185e05a4cc7d5960158c8f407f403", "sha256": "e4b0ebc8dc29ab901d487a30569974975b30790273031847566863b454ec029a" }, "downloads": -1, "filename": "PyFxA-0.0.2.tar.gz", "has_sig": false, "md5_digest": "838185e05a4cc7d5960158c8f407f403", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15652, "upload_time": "2015-01-05T10:29:16", "url": "https://files.pythonhosted.org/packages/62/e5/649ca03e978904be603687500d06f6c39120332dcf82a8ef60b8bcebb6d8/PyFxA-0.0.2.tar.gz" } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "cd3cb5f7ac11e4a441fbc04c6d20519b", "sha256": "b6ac2445e16ca9af080789424782948ea71ceaf7a00dad382982a1e79c5f6999" }, "downloads": -1, "filename": "PyFxA-0.0.3.tar.gz", "has_sig": false, "md5_digest": "cd3cb5f7ac11e4a441fbc04c6d20519b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19593, "upload_time": "2015-02-20T10:27:03", "url": "https://files.pythonhosted.org/packages/da/32/8e2a773aac2ecaf954ab92e334200895de7cd1290e4f0fa83bc51d03873a/PyFxA-0.0.3.tar.gz" } ], "0.0.4": [ { "comment_text": "", "digests": { "md5": "564ff10f384e2c0c9a371b20ea04b773", "sha256": "2c4cebdbddc982f905864f8739e32bbae21f4b24151679e805bfbf1c672caa9f" }, "downloads": -1, "filename": "PyFxA-0.0.4.tar.gz", "has_sig": false, "md5_digest": "564ff10f384e2c0c9a371b20ea04b773", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20798, "upload_time": "2015-03-11T09:27:08", "url": "https://files.pythonhosted.org/packages/95/bd/20a457acf994bfc709fa48b4502c8d3d8a822a7516eef60bc5c4e96d2cdf/PyFxA-0.0.4.tar.gz" } ], "0.0.5": [ { "comment_text": "", "digests": { "md5": "1f942a92d32f2a96296b87406dfd8bb1", "sha256": "ee9bfb12d63a1d965aa64a0478b6305b08628212d75c46f1adcadd3dee1b25c4" }, "downloads": -1, "filename": "PyFxA-0.0.5.tar.gz", "has_sig": false, "md5_digest": "1f942a92d32f2a96296b87406dfd8bb1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20889, "upload_time": "2015-03-19T21:44:17", "url": "https://files.pythonhosted.org/packages/f6/a7/3ee1104f52da4bfd1f7c236c18732ddc8d19a0f952a2a8a150834b8fc0eb/PyFxA-0.0.5.tar.gz" } ], "0.0.6": [ { "comment_text": "", "digests": { "md5": "cf0e35f0c8fb511f78d8a6b79ae9e39d", "sha256": "1a6ac4cec279fc19772be5d89e03d741d6b97080a2e08409d1f192d3309965da" }, "downloads": -1, "filename": "PyFxA-0.0.6.tar.gz", "has_sig": false, "md5_digest": "cf0e35f0c8fb511f78d8a6b79ae9e39d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20903, "upload_time": "2015-03-27T05:58:04", "url": "https://files.pythonhosted.org/packages/9a/0c/ead34236bab55399eb8d3f65f1ab29c4916e6676f48e212ada8f8c919359/PyFxA-0.0.6.tar.gz" } ], "0.0.7": [ { "comment_text": "", "digests": { "md5": "d4595a8e4df917733863fb7de43a2db2", "sha256": "da34318e9fa554503f9a26c5e81ffdb7df657c905a8f007f19349933830162ba" }, "downloads": -1, "filename": "PyFxA-0.0.7.zip", "has_sig": false, "md5_digest": "d4595a8e4df917733863fb7de43a2db2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 40203, "upload_time": "2015-07-23T09:55:10", "url": "https://files.pythonhosted.org/packages/ca/c9/952a23fedcc2f19afbfa67b34e545aeae31ad5cf11bd28f16805b09ca712/PyFxA-0.0.7.zip" } ], "0.0.8": [ { "comment_text": "", "digests": { "md5": "df58eb460ff3c84e8de81b0b714f07d3", "sha256": "ec7753cfa7c90645a0da0c586b234f30b3efbd509d3f5cfb3f4e8fff984a1b82" }, "downloads": -1, "filename": "PyFxA-0.0.8.zip", "has_sig": false, "md5_digest": "df58eb460ff3c84e8de81b0b714f07d3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 41912, "upload_time": "2015-08-14T08:50:43", "url": "https://files.pythonhosted.org/packages/ff/c6/6a181c0537d102588952ec0519aa1103b95d2dd58e3cdb8fd23e31a9cdce/PyFxA-0.0.8.zip" } ], "0.0.9": [ { "comment_text": "", "digests": { "md5": "7af2e38c712ece1bb1498cda700756e9", "sha256": "33965b4400e4c4171a0ee8293ac5a703e9f133602200e6e68e292d4d9ee78c3f" }, "downloads": -1, "filename": "PyFxA-0.0.9.tar.gz", "has_sig": false, "md5_digest": "7af2e38c712ece1bb1498cda700756e9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 29541, "upload_time": "2015-08-17T17:17:17", "url": "https://files.pythonhosted.org/packages/5c/3f/5cd1b093db94943107ce2ec85ff6e04531cd45f733eff48b1c60539efbab/PyFxA-0.0.9.tar.gz" } ], "0.1.0": [ { "comment_text": "", "digests": { "md5": "dfcbb668aa50012b57bf7760e61515a3", "sha256": "b5126cd47627ac7f02ce14d28a9b347886f2769c99a47b7e3cff68a0d316a711" }, "downloads": -1, "filename": "PyFxA-0.1.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "dfcbb668aa50012b57bf7760e61515a3", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 44755, "upload_time": "2016-01-07T12:06:26", "url": "https://files.pythonhosted.org/packages/55/a2/31af33b51dc515867ae0ca675efc9fd72cd842e0e713cf475dd59c839681/PyFxA-0.1.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b54b734613839ceee4630061727ba698", "sha256": "b069baa38e701bb5afc0a5861b423a372709e0c4b4e319b185df27b748865a11" }, "downloads": -1, "filename": "PyFxA-0.1.0.tar.gz", "has_sig": false, "md5_digest": "b54b734613839ceee4630061727ba698", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 33230, "upload_time": "2016-01-07T12:06:47", "url": "https://files.pythonhosted.org/packages/77/4c/72140a98bd26b946e087914e54f3a821336e6465a8d2934b5e902803c2b7/PyFxA-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "6628eef880afd980e3fbae38c4cf0760", "sha256": "ddc4a9027afd8f8d8a9b54a7f7d8d52c0af58e2ca7503b93d8adec24d6564a2f" }, "downloads": -1, "filename": "PyFxA-0.1.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "6628eef880afd980e3fbae38c4cf0760", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 45238, "upload_time": "2016-01-13T16:35:48", "url": "https://files.pythonhosted.org/packages/c5/09/5f9293e49107c32e42b47cf7becf413ef2602faef54e3629e107c3df3a2c/PyFxA-0.1.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ea39a152bf1d4a4fad1ccafe0c1ffa0a", "sha256": "56d40230b4942d3dce4bcee6620b5834c840924e97458e71e6dc4271f9a4444e" }, "downloads": -1, "filename": "PyFxA-0.1.1.tar.gz", "has_sig": false, "md5_digest": "ea39a152bf1d4a4fad1ccafe0c1ffa0a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 33777, "upload_time": "2016-01-13T16:35:55", "url": "https://files.pythonhosted.org/packages/bf/6f/b64d16ed63e43f04ae52ca50e37cb2b61785e10332b2fd3d383347d75316/PyFxA-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "f1d16fba2385248f2f2177c2879bafff", "sha256": "f6762aeb1179f3949d41af86acb937f8ec1a980066dacdd9252bb8d9beca0b86" }, "downloads": -1, "filename": "PyFxA-0.1.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "f1d16fba2385248f2f2177c2879bafff", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 45151, "upload_time": "2016-04-21T12:09:50", "url": "https://files.pythonhosted.org/packages/87/52/743bb4b5710af5062b592810c680469d675ca0d6ab702ae2568a8d95625c/PyFxA-0.1.2-py2.py3-none-any.whl" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "2b90233d0daa3516d9bd329760eece55", "sha256": "3b35f6fd1e7c2d8db1ae84a290c4a805cdff2f179558bd339bdc3373628b11a4" }, "downloads": -1, "filename": "PyFxA-0.1.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "2b90233d0daa3516d9bd329760eece55", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 45337, "upload_time": "2016-04-22T08:46:51", "url": "https://files.pythonhosted.org/packages/43/c9/7d4bb84fb19f117c913ab1c1c4c734474ae28495740c414ad43d3321e5ec/PyFxA-0.1.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7d5837c6ab9319e6281bcc72cf9b21e2", "sha256": "d795355f9e479ee4ec43fa74a40de5cb07a23c9221ebda597b31f58f35dd8476" }, "downloads": -1, "filename": "PyFxA-0.1.3.tar.gz", "has_sig": false, "md5_digest": "7d5837c6ab9319e6281bcc72cf9b21e2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 32092, "upload_time": "2016-04-22T19:30:48", "url": "https://files.pythonhosted.org/packages/77/f8/295ca80bbcec77a1bbf2765159125336b6f087e8073b130a3de70d653943/PyFxA-0.1.3.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "cfe79a898ce369f24f85f80c56b8ef70", "sha256": "e50b5430bb779279178b40f19b2ab11ddcd5f1f979513f5006a309d6f8838cb9" }, "downloads": -1, "filename": "PyFxA-0.2.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "cfe79a898ce369f24f85f80c56b8ef70", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 45647, "upload_time": "2016-05-11T12:02:53", "url": "https://files.pythonhosted.org/packages/0e/89/ba70ca269b13b43da0643cfe33d44cabd094d252a24357932dbd7c39474d/PyFxA-0.2.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a7fcb87bddda44eac3986ae0dad4aede", "sha256": "0bb8c3d7c37cfce885f73a1cfbbf6beff9229bf3858d6ea0933758e0adee0439" }, "downloads": -1, "filename": "PyFxA-0.2.0.tar.gz", "has_sig": false, "md5_digest": "a7fcb87bddda44eac3986ae0dad4aede", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 34181, "upload_time": "2016-05-11T12:03:17", "url": "https://files.pythonhosted.org/packages/57/a4/3a116640a4500e3bc35be5c76fa1f936328a20fb43ff4dfbbcc69586f58d/PyFxA-0.2.0.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "605546678d7e81de31e40b083622edcc", "sha256": "e5963db092b71bff0f51e0695eeeb59405e5646c51998c2d3f06b96d5aca6ace" }, "downloads": -1, "filename": "PyFxA-0.3.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "605546678d7e81de31e40b083622edcc", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 45960, "upload_time": "2016-09-20T12:28:16", "url": "https://files.pythonhosted.org/packages/b6/97/91b810a1b5678c2b84e0e1fc8a47736fd8d41c0425bcb5daa84ca11b6b97/PyFxA-0.3.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "505da3a9f29ff69e03188c9520597d16", "sha256": "783d798168a8df3d5c72829a3cf62210635626047baabebe409ccd4a0a16d0d1" }, "downloads": -1, "filename": "PyFxA-0.3.0.tar.gz", "has_sig": false, "md5_digest": "505da3a9f29ff69e03188c9520597d16", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 34531, "upload_time": "2016-09-20T12:28:18", "url": "https://files.pythonhosted.org/packages/f6/d0/e7b7c6707b644e6692bd1713957659824ae8f84f540d0c821d1f0251ff20/PyFxA-0.3.0.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "423bc3afe7cf0abfed2afd9bdd6c61ab", "sha256": "78f7cc76d9d22f17cdb5212ecb7c946aaeac43c9c9a4e6f141e2e232d1fe7290" }, "downloads": -1, "filename": "PyFxA-0.4.0.tar.gz", "has_sig": false, "md5_digest": "423bc3afe7cf0abfed2afd9bdd6c61ab", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 32851, "upload_time": "2017-04-27T23:44:16", "url": "https://files.pythonhosted.org/packages/93/c4/66fb817e3541664a82232532a43af5fe4ce548a0e0494628f521d01ebf13/PyFxA-0.4.0.tar.gz" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "3524365db47e7e58f96e54401f8ba551", "sha256": "d264c72360090a55ba54291a538dddffde4fee1335192adb91b2f787d1675384" }, "downloads": -1, "filename": "PyFxA-0.5.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "3524365db47e7e58f96e54401f8ba551", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 47951, "upload_time": "2018-01-11T21:14:27", "url": "https://files.pythonhosted.org/packages/64/e0/c4cd3cd7285ece5eaf466eb7fa3357ca06294ac6efefaaa501ebfa4902f5/PyFxA-0.5.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "68647afb79290bfc11a1f83fa1962067", "sha256": "681a7d5f562f56ce6d0f7b08fc1d09a8feb33b127adfa3ee1cda7e03f644d7f4" }, "downloads": -1, "filename": "PyFxA-0.5.0.tar.gz", "has_sig": false, "md5_digest": "68647afb79290bfc11a1f83fa1962067", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 33556, "upload_time": "2018-01-11T21:14:29", "url": "https://files.pythonhosted.org/packages/5f/12/c3aebbfbd830e6a34f13835543a0496a10a26a8e4f9cd7a5edeb1d0b3400/PyFxA-0.5.0.tar.gz" } ], "0.6.0": [ { "comment_text": "", "digests": { "md5": "c77d49ee65f4c259e195ea7d2eec9634", "sha256": "e37149cf27e26eed2b321389d313c876ffbbdd7868ec7f0694a8989847b9c8da" }, "downloads": -1, "filename": "PyFxA-0.6.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "c77d49ee65f4c259e195ea7d2eec9634", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 49964, "upload_time": "2018-05-04T03:18:48", "url": "https://files.pythonhosted.org/packages/ab/a7/77f964ad3d88c4693cbe610522f58c101b0c9d77abe518232c7dbb217d13/PyFxA-0.6.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "83c740c041b6f0736c711db1722cb908", "sha256": "d511b6f43a9445587c609a138636d378de76661561116e1f4259fcec9d09b42b" }, "downloads": -1, "filename": "PyFxA-0.6.0.tar.gz", "has_sig": false, "md5_digest": "83c740c041b6f0736c711db1722cb908", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 35446, "upload_time": "2018-05-04T03:18:25", "url": "https://files.pythonhosted.org/packages/42/dc/98b3709cdbc02c49afd27449adf16c8ee80c37df8f8cdbb5eb071ddc2200/PyFxA-0.6.0.tar.gz" } ], "0.7.0": [ { "comment_text": "", "digests": { "md5": "2fe295376c848153a509c1dbbb349a1f", "sha256": "5744eaef3335bc83a9475f598c788fac4c9dce79abf4f91df543a490ffe7ec14" }, "downloads": -1, "filename": "PyFxA-0.7.0.tar.gz", "has_sig": false, "md5_digest": "2fe295376c848153a509c1dbbb349a1f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36337, "upload_time": "2019-03-18T02:10:14", "url": "https://files.pythonhosted.org/packages/fd/b2/6e2658aa2c13585f261f27d9bdaa094cf7aceef4ffea297159025a7f530e/PyFxA-0.7.0.tar.gz" } ], "0.7.1": [ { "comment_text": "", "digests": { "md5": "e0d72952fbedcd9a07511242c819fa4c", "sha256": "616689486d8d63956aa40836cffafde6e7590cdeb200badabaaf3c17d5b26cce" }, "downloads": -1, "filename": "PyFxA-0.7.1.tar.gz", "has_sig": false, "md5_digest": "e0d72952fbedcd9a07511242c819fa4c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36451, "upload_time": "2019-03-18T02:09:50", "url": "https://files.pythonhosted.org/packages/cf/93/002ded7990d847f730cd9b63fec2f5de98d72fc752408be14173b4e763a5/PyFxA-0.7.1.tar.gz" } ], "0.7.2": [ { "comment_text": "", "digests": { "md5": "6bdd09b7c0b1baa131528ced6f429cc0", "sha256": "87c1f940e40c6dce4d46ec0d411bb521a897f574234462c970e6392a834305ea" }, "downloads": -1, "filename": "PyFxA-0.7.2.tar.gz", "has_sig": false, "md5_digest": "6bdd09b7c0b1baa131528ced6f429cc0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36798, "upload_time": "2019-06-03T03:16:09", "url": "https://files.pythonhosted.org/packages/f5/59/ca3407cf5c0838c143a94f843ce42fab90a3c5a1563242fce274f45344b4/PyFxA-0.7.2.tar.gz" } ], "0.7.3": [ { "comment_text": "", "digests": { "md5": "04605467c4ce61c237a49721b4cccef4", "sha256": "f47f4285629fa6c033c79adc3fb90926c0818a42cfddb04d32818547362f1627" }, "downloads": -1, "filename": "PyFxA-0.7.3.tar.gz", "has_sig": false, "md5_digest": "04605467c4ce61c237a49721b4cccef4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36859, "upload_time": "2019-07-25T23:03:41", "url": "https://files.pythonhosted.org/packages/e3/2c/b857508fd96ceca766c7bda2c0516bdeb61835d22c61e4ad1880a0734e08/PyFxA-0.7.3.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "04605467c4ce61c237a49721b4cccef4", "sha256": "f47f4285629fa6c033c79adc3fb90926c0818a42cfddb04d32818547362f1627" }, "downloads": -1, "filename": "PyFxA-0.7.3.tar.gz", "has_sig": false, "md5_digest": "04605467c4ce61c237a49721b4cccef4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36859, "upload_time": "2019-07-25T23:03:41", "url": "https://files.pythonhosted.org/packages/e3/2c/b857508fd96ceca766c7bda2c0516bdeb61835d22c61e4ad1880a0734e08/PyFxA-0.7.3.tar.gz" } ] }