{ "info": { "author": "Derrick Gilland", "author_email": "dgilland@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Topic :: Communications", "Topic :: Internet", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Utilities" ], "description": "********\npushjack\n********\n\n|version| |travis| |coveralls| |license|\n\nPush notifications for APNS (iOS) and GCM (Android).\n\n\nLinks\n=====\n\n- Project: https://github.com/dgilland/pushjack\n- Documentation: https://pushjack.readthedocs.io\n- PyPi: https://pypi.python.org/pypi/pushjack/\n- TravisCI: https://travis-ci.org/dgilland/pushjack\n\n\nQuickstart\n==========\n\nInstall using pip:\n\n\n::\n\n pip install pushjack\n\n\nWhether using ``APNS`` or ``GCM``, pushjack provides clients for each.\n\n\nAPNS\n----\n\nSend notifications using the ``APNSClient`` class:\n\n\n.. code-block:: python\n\n from pushjack import APNSClient\n\n client = APNSClient(certificate='',\n default_error_timeout=10,\n default_expiration_offset=2592000,\n default_batch_size=100,\n default_retries=5)\n\n token = ''\n alert = 'Hello world.'\n\n # Send to single device.\n # NOTE: Keyword arguments are optional.\n res = client.send(token,\n alert,\n badge='badge count',\n sound='sound to play',\n category='category',\n content_available=True,\n title='Title',\n title_loc_key='t_loc_key',\n title_loc_args='t_loc_args',\n action_loc_key='a_loc_key',\n loc_key='loc_key',\n launch_image='path/to/image.jpg',\n extra={'custom': 'data'})\n\n # Send to multiple devices by passing a list of tokens.\n client.send([token], alert, **options)\n\n\nAccess response data.\n\n.. code-block:: python\n\n # List of all tokens sent.\n res.tokens\n\n # List of errors as APNSServerError objects\n res.errors\n\n # Dict mapping errors as token => APNSServerError object.\n res.token_errors\n\n\nOverride defaults for error_timeout, expiration_offset, and batch_size.\n\n.. code-block:: python\n\n client.send(token,\n alert,\n expiration=int(time.time() + 604800),\n error_timeout=5,\n batch_size=200)\n\n\nSend a low priority message.\n\n.. code-block:: python\n\n # The default is low_priority == False\n client.send(token, alert, low_priority=True)\n\n\nGet expired tokens.\n\n.. code-block:: python\n\n expired_tokens = client.get_expired_tokens()\n\n\nClose APNS connection.\n\n.. code-block:: python\n\n client.close()\n\n\nFor the APNS sandbox, use ``APNSSandboxClient`` instead:\n\n\n.. code-block:: python\n\n from pushjack import APNSSandboxClient\n\n\nGCM\n---\n\nSend notifications using the ``GCMClient`` class:\n\n\n.. code-block:: python\n\n from pushjack import GCMClient\n\n client = GCMClient(api_key='')\n\n registration_id = ''\n alert = 'Hello world.'\n notification = {'title': 'Title', 'body': 'Body', 'icon': 'icon'}\n\n # Send to single device.\n # NOTE: Keyword arguments are optional.\n res = client.send(registration_id,\n alert,\n notification=notification,\n collapse_key='collapse_key',\n delay_while_idle=True,\n time_to_live=604800)\n\n # Send to multiple devices by passing a list of ids.\n client.send([registration_id], alert, **options)\n\n\nAlert can also be be a dictionary with data fields.\n\n.. code-block:: python\n\n alert = {'message': 'Hello world', 'custom_field': 'Custom Data'}\n\n\nAlert can also contain the notification payload.\n\n.. code-block:: python\n\n alert = {'message': 'Hello world', 'notification': notification}\n\n\nSend a low priority message.\n\n.. code-block:: python\n\n # The default is low_priority == False\n client.send(registration_id, alert, low_priority=True)\n\n\nAccess response data.\n\n.. code-block:: python\n\n # List of requests.Response objects from GCM Server.\n res.responses\n\n # List of messages sent.\n res.messages\n\n # List of registration ids sent.\n res.registration_ids\n\n # List of server response data from GCM.\n res.data\n\n # List of successful registration ids.\n res.successes\n\n # List of failed registration ids.\n res.failures\n\n # List of exceptions.\n res.errors\n\n # List of canonical ids (registration ids that have changed).\n res.canonical_ids\n\n\nFor more details, please see the full documentation at https://pushjack.readthedocs.io.\n\n\n.. |version| image:: http://img.shields.io/pypi/v/pushjack.svg?style=flat-square\n :target: https://pypi.python.org/pypi/pushjack/\n\n.. |travis| image:: http://img.shields.io/travis/dgilland/pushjack/master.svg?style=flat-square\n :target: https://travis-ci.org/dgilland/pushjack\n\n.. |coveralls| image:: http://img.shields.io/coveralls/dgilland/pushjack/master.svg?style=flat-square\n :target: https://coveralls.io/r/dgilland/pushjack\n\n.. |license| image:: http://img.shields.io/pypi/l/pushjack.svg?style=flat-square\n :target: https://pypi.python.org/pypi/pushjack/\n\n.. _changelog:\n\nChangelog\n=========\n\n\nv1.6.0 (2019-03-15)\n-------------------\n\n- apns: Remove TLS version flag and default to ``ssl.PROTOCOL_TLS`` when creating APNS socket connection. Thanks `Tanner Stirrat`_!\n\n\nv1.5.0 (2018-07-29)\n-------------------\n\n- gcm: Use FCM URL instead of deprecated GCM URL. Thanks `Lukas Anzinger`_!\n\n\nv1.4.1 (2018-06-18)\n-------------------\n\n- apns: Remove restriction on token length due to incorrect assumption about tokens always being 64 characters long.\n\n\nv1.4.0 (2017-11-09)\n-------------------\n\n- apns: Add exceptions ``APNSProtocolError`` and ``APNSTimeoutError``. Thanks `Jakub Kle\u0148`_!\n- apns: Add retry mechanism to ``APNSClient.send``. Thanks `Jakub Kle\u0148`_!\n\n - Add ``default_retries`` argument to ``APNSClient`` initialization. Defaults to ``5``.\n - Add ``retries`` argument to ``APNSClient.send``. By default will use ``APNSClient.default_retries`` unless explicitly passed in.\n - If unable to send after ``retries``, an ``APNSTimeoutError`` will be raised.\n\n- apns: Fix bug in bulk ``APNSClient.send`` that resulted in an off-by-one error for message identifier in returned errors. Thanks `Jakub Kle\u0148`_!\n- apns: Add max payload truncation option to ``APNSClient.send``. Thanks `Jakub Kle\u0148`_!\n\n - Add ``default_max_payload_length`` argument to ``APNSClient`` initialization. Defaults to ``0`` which disabled max payload length check.\n - Add ``max_payload_length`` argument to ``APNSClient.send``. By default will use ``APNSClient.default_max_payload_length`` unless explicitly passed in.\n - When ``max_payload_length`` set, messages will be truncated to fit within the length restriction by trimming the \"message\" text and appending it with \"...\".\n\n\nv1.3.0 (2017-03-11)\n-------------------\n\n- apns: Optimize reading from APNS Feedback so that the number of bytes read are based on header and token lengths.\n- apns: Explicitly close connection to APNS Feedback service after reading data.\n- apns: Add support for ``mutable-content`` field (Apple Notification Service Extension) via ``mutable_content`` argument to ``APNSClient.send()``. Thanks `Ahmed Khedr`_!\n- apns: Add support for ``thread-id`` field (group identifier in Notification Center) via ``thread_id`` argument to ``APNSClient.send()``. Thanks `Ahmed Khedr`_!\n\n\nv1.2.1 (2015-12-14)\n-------------------\n\n- apns: Fix implementation of empty APNS notifications and allow notifications with ``{\"aps\": {}}`` to be sent. Thanks `Julius Seporaitis`_!\n\n\nv1.2.0 (2015-12-04)\n-------------------\n\n- gcm: Add support for ``priority`` field to GCM messages via ``low_priority`` keyword argument. Default behavior is for all messages to be ``\"high\"`` priority. This is the opposite of GCM messages but mirrors the behavior in the APNS module where the default priority is ``\"high\"``.\n\n\nv1.1.0 (2015-10-22)\n-------------------\n\n- gcm: Add support for ``notification`` field to GCM messages.\n- gcm: Replace ``registration_ids`` field with ``to`` field when sending to a single recipient since ``registration_ids`` field has been deprecated for single recipients.\n\n\nv1.0.1 (2015-05-07)\n-------------------\n\n- gcm: Fix incorrect authorization header in GCM client. Thanks `Brad Montgomery`_!\n\n\nv1.0.0 (2015-04-28)\n-------------------\n\n- apns: Add ``APNSSandboxClient`` for sending notifications to APNS sandbox server.\n- apns: Add ``message`` attribute to ``APNSResponse``.\n- pushjack: Add internal logging.\n- apns: Fix APNS error checking to properly handle reading when no data returned.\n- apns: Make APNS sending stop during iteration if a fatal error is received from APNS server (e.g. invalid topic, invalid payload size, etc).\n- apns/gcm: Make APNS and GCM clients maintain an active connection to server.\n- apns: Make APNS always return ``APNSResponse`` object instead of only raising ``APNSSendError`` when errors encountered. (**breaking change**)\n- apns/gcm: Remove APNS/GCM module send functions and only support client interfaces. (**breaking change**)\n- apns: Remove ``config`` argument from ``APNSClient`` and use individual method parameters as mapped below instead: (**breaking change**)\n\n - ``APNS_ERROR_TIMEOUT`` => ``default_error_timeout``\n - ``APNS_DEFAULT_EXPIRATION_OFFSET`` => ``default_expiration_offset``\n - ``APNS_DEFAULT_BATCH_SIZE`` => ``default_batch_size``\n\n- gcm: Remove ``config`` argument from ``GCMClient`` and use individual method parameters as mapped below instead: (**breaking change**)\n\n - ``GCM_API_KEY`` => ``api_key``\n\n- pushjack: Remove ``pushjack.clients`` module. (**breaking change**)\n- pushjack: Remove ``pushjack.config`` module. (**breaking change**)\n- gcm: Rename ``GCMResponse.payloads`` to ``GCMResponse.messages``. (**breaking change**)\n\n\nv0.5.0 (2015-04-22)\n-------------------\n\n- apns: Add new APNS configuration value ``APNS_DEFAULT_BATCH_SIZE`` and set to ``100``.\n- apns: Add ``batch_size`` parameter to APNS ``send`` that can be used to override ``APNS_DEFAULT_BATCH_SIZE``.\n- apns: Make APNS ``send`` batch multiple notifications into a single payload. Previously, individual socket writes were performed for each token. Now, socket writes are batched based on either the ``APNS_DEFAULT_BATCH_SIZE`` configuration value or the ``batch_size`` function argument value.\n- apns: Make APNS ``send`` resume sending from after the failed token when an error response is received.\n- apns: Make APNS ``send`` raise an ``APNSSendError`` when one or more error responses received. ``APNSSendError`` contains an aggregation of errors, all tokens attempted, failed tokens, and successful tokens. (**breaking change**)\n- apns: Replace ``priority`` argument to APNS ``send`` with ``low_priority=False``. (**breaking change**)\n\n\nv0.4.0 (2015-04-15)\n-------------------\n\n- apns: Improve error handling in APNS so that errors aren't missed.\n- apns: Improve handling of APNS socket connection during bulk sending so that connection is re-established when lost.\n- apns: Make APNS socket read/writes non-blocking.\n- apns: Make APNS socket frame packing easier to grok.\n- apns/gmc: Remove APNS and GCM ``send_bulk`` function. Modify ``send`` to support bulk notifications. (**breaking change**)\n- apns: Remove ``APNS_MAX_NOTIFICATION_SIZE`` as config option.\n- gcm: Remove ``GCM_MAX_RECIPIENTS`` as config option.\n- gcm: Remove ``request`` argument from GCM send function. (**breaking change**)\n- apns: Remove ``sock`` argument from APNS send function. (**breaking change**)\n- gcm: Return namedtuple for GCM canonical ids.\n- apns: Return namedtuple class for APNS expired tokens.\n\n\nv0.3.0 (2015-04-01)\n-------------------\n\n- gcm: Add ``restricted_package_name`` and ``dry_run`` fields to GCM sending.\n- gcm: Add exceptions for all GCM server error responses.\n- apns: Make ``apns.get_expired_tokens`` and ``APNSClient.get_expired_tokens`` accept an optional ``sock`` argument to provide a custom socket connection.\n- apns: Raise ``APNSAuthError`` instead of ``APNSError`` if certificate file cannot be read.\n- apns: Raise ``APNSInvalidPayloadSizeError`` instead of ``APNSDataOverflow``. (**breaking change**)\n- apns: Raise ``APNSInvalidTokenError`` instead of ``APNSError``.\n- gcm: Raise ``GCMAuthError`` if ``GCM_API_KEY`` is not set.\n- pushjack: Rename several function parameters: (**breaking change**)\n\n - gcm: ``alert`` to ``data``\n - gcm: ``token``/``tokens`` to ``registration_id``/``registration_ids``\n - gcm: ``Dispatcher``/``dispatcher`` to ``GCMRequest``/``request``\n - Clients: ``registration_id`` to ``device_id``\n\n- gcm: Return ``GCMResponse`` object for ``GCMClient.send/send_bulk``. (**breaking change**)\n- gcm: Return ``requests.Response`` object(s) for ``gcm.send/send_bulk``. (**breaking change**)\n\n\nv0.2.2 (2015-03-30)\n-------------------\n\n- apns: Fix payload key assigments for ``title-loc``, ``title-loc-args``, and ``launch-image``. Previously, ``'_'`` was used in place of ``'-'``.\n\n\nv0.2.1 (2015-03-28)\n-------------------\n\n- apns: Fix incorrect variable reference in ``apns.receive_feedback``.\n\n\nv0.2.0 (2015-03-28)\n-------------------\n\n- pushjack: Fix handling of ``config`` in clients when ``config`` is a class object and subclass of ``Config``.\n- apns: Make ``apns.send/send_bulk`` accept additional ``alert`` fields: ``title``, ``title-loc``, ``title-loc-args``, and ``launch-image``.\n- gcm: Make ``gcm.send/send_bulk`` raise a ``GCMError`` exception if ``GCM_API_KEY`` is not set.\n- gcm: Make gcm payload creation cast ``data`` to dict if isn't not passed in as one. Original value of ``data`` is then set to ``{'message': data}``. (**breaking change**)\n- gcm: Make gcm payload creation not set defaults for optional keyword arguments. (**breaking change**)\n\n\nv0.1.0 (2015-03-26)\n-------------------\n\n- pushjack: Rename ``pushjack.settings`` module to ``pushjack.config``. (**breaking change**)\n- apns/gcm: Allow config settings overrides to be passed into ``create_gcm_config``, ``create_apns_config``, and ``create_apns_sandbox_config``.\n- pushjack: Override ``Config``'s ``update()`` method with custom method that functions similarly to ``from_object()`` except that it accepts a ``dict`` instead.\n\n\nv0.0.1 (2015-03-25)\n-------------------\n\n- First release.\n\n\n.. _Brad Montgomery: https://github.com/bradmontgomery\n.. _Julius Seporaitis: https://github.com/seporaitis\n.. _Ahmed Khedr: https://github.com/aakhedr\n.. _Jakub Kle\u0148: https://github.com/kukosk\n.. _Lukas Anzinger: https://github.com/Lukas0907\n.. _Tanner Stirrat: https://github.com/tstirrat15\n\nLicense\n=======\n\nThe MIT License (MIT)\n\nCopyright (c) 2015 Derrick Gilland\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/dgilland/pushjack", "keywords": "apns ios gcm android push notifications", "license": "MIT License", "maintainer": "", "maintainer_email": "", "name": "pushjack", "package_url": "https://pypi.org/project/pushjack/", "platform": "", "project_url": "https://pypi.org/project/pushjack/", "project_urls": { "Homepage": "https://github.com/dgilland/pushjack" }, "release_url": "https://pypi.org/project/pushjack/1.6.0/", "requires_dist": [ "requests", "coverage ; extra == 'dev'", "flake8 ; extra == 'dev'", "httmock ; extra == 'dev'", "invoke ; extra == 'dev'", "mock ; extra == 'dev'", "pylint ; extra == 'dev'", "pytest ; extra == 'dev'", "pytest-cov ; extra == 'dev'", "Sphinx ; extra == 'dev'", "sphinx-rtd-theme ; extra == 'dev'", "tox ; extra == 'dev'", "twine ; extra == 'dev'", "wheel ; extra == 'dev'" ], "requires_python": "", "summary": "Push notifications for APNS (iOS) and GCM (Android)", "version": "1.6.0" }, "last_serial": 4946769, "releases": { "0.0.0-dev": [], "0.0.1": [ { "comment_text": "", "digests": { "md5": "ae0fbb5665471296878d4f68a73cb3bd", "sha256": "ba1bec45e4130e2a1ac33222f9fe3a07ac7578d3e5dae551c5e3ea90a83b4b3a" }, "downloads": -1, "filename": "pushjack-0.0.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "ae0fbb5665471296878d4f68a73cb3bd", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 13035, "upload_time": "2015-03-25T23:22:41", "url": "https://files.pythonhosted.org/packages/ac/3e/6237b5fa00dc5d568e3871be709bf93c79b18bf1a3ee67c4bdff1ec5ed8a/pushjack-0.0.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6b5c13d5be07430bfa1b8fd6b964604b", "sha256": "388abcaa88498a1a841fcf166939b2051d6fd4344baa2291f3b4479e9307ce6f" }, "downloads": -1, "filename": "pushjack-0.0.1.tar.gz", "has_sig": false, "md5_digest": "6b5c13d5be07430bfa1b8fd6b964604b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9696, "upload_time": "2015-03-25T23:22:44", "url": "https://files.pythonhosted.org/packages/0f/23/34c2cd4f54bab1775a9929a28fd4e96b950b8ccca83a6a3e15df186f22c5/pushjack-0.0.1.tar.gz" } ], "0.1.0": [ { "comment_text": "", "digests": { "md5": "d41a2ca2cf7a40ff1a3663483f2eb784", "sha256": "0dcd8faf6dc6b9276103af8f069d0fa9f7df52994683d243b2c9a137612741b9" }, "downloads": -1, "filename": "pushjack-0.1.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "d41a2ca2cf7a40ff1a3663483f2eb784", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 13336, "upload_time": "2015-03-27T01:33:12", "url": "https://files.pythonhosted.org/packages/1c/21/61d8b7cb0819e1a2d12ae8cdd823614230e028721a92f064d27cc6578377/pushjack-0.1.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9f0c2afed02de6a82b1dff0caf2aff3d", "sha256": "cfea1e457b73993a2a324df9eda0eaec346347edbbfc12c847bc43bb8fef2458" }, "downloads": -1, "filename": "pushjack-0.1.0.tar.gz", "has_sig": false, "md5_digest": "9f0c2afed02de6a82b1dff0caf2aff3d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10014, "upload_time": "2015-03-27T01:33:15", "url": "https://files.pythonhosted.org/packages/a9/c9/9d8139cb3701d065e343c32c8fb8efe4c70f27c2dac6da383d757e923fd6/pushjack-0.1.0.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "f63fa5441e6511799d0251c3ee912c02", "sha256": "2878623bf93b35ac1cda8a173a830ee3443bae0768ce8fc43729f16e8a6dc1ec" }, "downloads": -1, "filename": "pushjack-0.2.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "f63fa5441e6511799d0251c3ee912c02", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 14218, "upload_time": "2015-03-28T16:25:38", "url": "https://files.pythonhosted.org/packages/cc/74/9fd6c27d437f96624e56c57a5b5b35364c04c942e1905125418626a9f87d/pushjack-0.2.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3fce4f208f0303340497a3c2da2ea465", "sha256": "2606f9f8d4b898e77114a5ef9f41fbceedc7ca191d23afa1239930598681beda" }, "downloads": -1, "filename": "pushjack-0.2.0.tar.gz", "has_sig": false, "md5_digest": "3fce4f208f0303340497a3c2da2ea465", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10872, "upload_time": "2015-03-28T16:25:40", "url": "https://files.pythonhosted.org/packages/28/1a/0b77eec6de154add6c7b523d3fc8dbe0b1057b237a067ce2464a6d2a799a/pushjack-0.2.0.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "227a2c313e06f3206b94c761e0947c03", "sha256": "47c7c9244bb5377de582b3b2b42d257d4781972b01ce41c1434a108bdd6a92dc" }, "downloads": -1, "filename": "pushjack-0.2.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "227a2c313e06f3206b94c761e0947c03", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 14216, "upload_time": "2015-03-28T16:57:35", "url": "https://files.pythonhosted.org/packages/2f/21/06e0c9c9d7c8629fb96902e224cc873321090d505945d577be069f509105/pushjack-0.2.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "28f0710fdda0a53ebba12af6084f2e1a", "sha256": "27317e47d958276274490360c16e79c41bd2260a85e7ff5312ca8344b80dfa4f" }, "downloads": -1, "filename": "pushjack-0.2.1.tar.gz", "has_sig": false, "md5_digest": "28f0710fdda0a53ebba12af6084f2e1a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10885, "upload_time": "2015-03-28T16:57:37", "url": "https://files.pythonhosted.org/packages/77/8f/d4970c8660a81c755a4645d83c1014cc99145c96caa1493825ea3013f1a0/pushjack-0.2.1.tar.gz" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "9a946b1747487436ff902441ae6b7d79", "sha256": "9230b7ae71385870856b35265f71f790335eb33ded626ed1181a7488d3ae3224" }, "downloads": -1, "filename": "pushjack-0.2.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "9a946b1747487436ff902441ae6b7d79", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 14211, "upload_time": "2015-03-30T16:31:49", "url": "https://files.pythonhosted.org/packages/ab/3e/65c30efe816305ae973f8d632671e075bc339c8bf04383b21bdf52cac573/pushjack-0.2.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b2d5445fb299b5177f69a093773d7ae6", "sha256": "7006a2a73d786d91d4ac92b689414279838aa0a71ddf5b33faf84fc014dbb9ad" }, "downloads": -1, "filename": "pushjack-0.2.2.tar.gz", "has_sig": false, "md5_digest": "b2d5445fb299b5177f69a093773d7ae6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10957, "upload_time": "2015-03-30T16:31:51", "url": "https://files.pythonhosted.org/packages/b0/b7/8fcd9d5519e1a9725f4f9cc06a5e506fecf31b07218742af093c879be6b9/pushjack-0.2.2.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "c34da45d6f61e62ddc7aa06de2abefa0", "sha256": "d2dfaad43195eed35b82b1c6c92393d0341b1d26434afe2958a063666ea27d76" }, "downloads": -1, "filename": "pushjack-0.3.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "c34da45d6f61e62ddc7aa06de2abefa0", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 18979, "upload_time": "2015-04-02T01:58:16", "url": "https://files.pythonhosted.org/packages/7a/88/7e5dec3109e86a54cb67e84b57050a64c3869c075218ebf9d6b2049a99be/pushjack-0.3.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ace13789417028be58b39c048850ab01", "sha256": "55294e2911b803485754ba48f4f05f810be67f4efd2610528506be00216ec405" }, "downloads": -1, "filename": "pushjack-0.3.0.tar.gz", "has_sig": false, "md5_digest": "ace13789417028be58b39c048850ab01", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15578, "upload_time": "2015-04-02T01:58:18", "url": "https://files.pythonhosted.org/packages/7a/da/29a3f84603f23617a0d8a5fa0f4fbffd1c17973d2546efc2de913cd77c46/pushjack-0.3.0.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "9056bb8d19308178038184bf8dfea6a8", "sha256": "249a755fb92df0930a2d9c4b745ce59ed91f54cfecfd6910019d0ba05c2a49a7" }, "downloads": -1, "filename": "pushjack-0.4.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "9056bb8d19308178038184bf8dfea6a8", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 19507, "upload_time": "2015-04-16T00:53:05", "url": "https://files.pythonhosted.org/packages/0a/9f/9fe1cb6f2d0e35ac20279731e29f784e61d3e96ee08a5131163ae2cede33/pushjack-0.4.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e109f39fd9c5d45efa6fe33bd6abe5ed", "sha256": "82a15016290bdbf6d17cdb3757f1009b222d2fb598a942906c66ffb520b6385e" }, "downloads": -1, "filename": "pushjack-0.4.0.tar.gz", "has_sig": false, "md5_digest": "e109f39fd9c5d45efa6fe33bd6abe5ed", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17689, "upload_time": "2015-04-16T00:53:08", "url": "https://files.pythonhosted.org/packages/b7/90/4771f5f7a2d1d46d758f55480d06e74e866b7b567afb171cd5aa32771d8c/pushjack-0.4.0.tar.gz" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "1fbea96789400eddaec33f3e81794d13", "sha256": "bab6e0dcd1f9f79daa9f37d068f867b17b8f61a962b157b1863c3e587afaecfc" }, "downloads": -1, "filename": "pushjack-0.5.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "1fbea96789400eddaec33f3e81794d13", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 21265, "upload_time": "2015-04-23T03:26:53", "url": "https://files.pythonhosted.org/packages/12/73/3934db52137660bcbb58bb592f650e77fb167692ed8ca7ec43e046691240/pushjack-0.5.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9b06c376989fd3b3af14b3808c844c4f", "sha256": "32841c9804bcdf93aba97592971f2476b9ee290edf9fef58c85e4cef1d7edfa1" }, "downloads": -1, "filename": "pushjack-0.5.0.tar.gz", "has_sig": false, "md5_digest": "9b06c376989fd3b3af14b3808c844c4f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18254, "upload_time": "2015-04-23T03:26:56", "url": "https://files.pythonhosted.org/packages/1d/d4/88c0d935789779ca53398907241a8df50185f641fa5d8195f259c5821cc5/pushjack-0.5.0.tar.gz" } ], "1.0.0": [ { "comment_text": "", "digests": { "md5": "32e30b239262f42d556b6c325b0d986c", "sha256": "3eb56474236c97a6c397b9e9e9f477795c07ed4efb7c4cd19288d1438f810bff" }, "downloads": -1, "filename": "pushjack-1.0.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "32e30b239262f42d556b6c325b0d986c", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 19447, "upload_time": "2015-04-28T20:43:02", "url": "https://files.pythonhosted.org/packages/1f/08/c4f1420eff28c96870cd9775cf24c7e5a98fa761da3fabe08e846c08a2ec/pushjack-1.0.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "34cce8a62395e8f4b675048d4ab97ea2", "sha256": "cdd0a674800f12bea4dbe5221bbb84eb603a9ffa5b372a4934915a0a174ca485" }, "downloads": -1, "filename": "pushjack-1.0.0.tar.gz", "has_sig": false, "md5_digest": "34cce8a62395e8f4b675048d4ab97ea2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17836, "upload_time": "2015-04-28T20:43:05", "url": "https://files.pythonhosted.org/packages/ed/af/0a6644626aad939620309be6f990d14cd2075f102c9bbda5938356767f05/pushjack-1.0.0.tar.gz" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "8dcbbf1844248c4ac01934aab7bdae3e", "sha256": "6c18cc9566d09de4e2a03c3e490a8099914fd947c3fd78f2268fe83b38801eb7" }, "downloads": -1, "filename": "pushjack-1.0.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "8dcbbf1844248c4ac01934aab7bdae3e", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 19599, "upload_time": "2015-05-07T13:26:12", "url": "https://files.pythonhosted.org/packages/40/91/d1ee81fe1e13aeef8a62dd03757599dc5c6755deff6913e400002bd4f100/pushjack-1.0.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d34229824a52c374bca5f7ea142e61a0", "sha256": "53d733a37664f49184430e2e5b8fcaed0fbe5e4043d1029debf8aa4ecf3419ef" }, "downloads": -1, "filename": "pushjack-1.0.1.tar.gz", "has_sig": false, "md5_digest": "d34229824a52c374bca5f7ea142e61a0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18076, "upload_time": "2015-05-07T13:26:15", "url": "https://files.pythonhosted.org/packages/c1/81/3aa918d863e3869f2e38c3de2bf2f9cf48c087e2ba0b9030350fcb7ad1bd/pushjack-1.0.1.tar.gz" } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "fb13ee0e8e89d5457993d879b6d3c795", "sha256": "d7e02d2ee279634bdd035421edd8aa620c6e9993ea8fa4aacd9793da7c96a4dc" }, "downloads": -1, "filename": "pushjack-1.1.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "fb13ee0e8e89d5457993d879b6d3c795", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 20204, "upload_time": "2015-10-23T00:16:11", "url": "https://files.pythonhosted.org/packages/b7/42/f13330008380d511181c18d817913624f02a63ea35fb9a4acadf51087d11/pushjack-1.1.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ca25244c96a4383f88140590b603347e", "sha256": "a0235689cb05d25858a72890d8352ece7620510dedf38f63a9bb95d418e0c6c7" }, "downloads": -1, "filename": "pushjack-1.1.0.tar.gz", "has_sig": false, "md5_digest": "ca25244c96a4383f88140590b603347e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18579, "upload_time": "2015-10-23T00:16:14", "url": "https://files.pythonhosted.org/packages/c7/de/c80d0a7e927ff9d2c46dc95867da99a8d6bcb51d012328623490ca1e797b/pushjack-1.1.0.tar.gz" } ], "1.2.0": [ { "comment_text": "", "digests": { "md5": "cd24f70bf50581ffa4f53d92f2e705e3", "sha256": "a1f60c0fc4fae3992597800a867f2df441aa27a7b4d1fddf503467490738140f" }, "downloads": -1, "filename": "pushjack-1.2.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "cd24f70bf50581ffa4f53d92f2e705e3", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 20642, "upload_time": "2015-12-04T05:11:19", "url": "https://files.pythonhosted.org/packages/70/fb/64083cba15f4a2f0cf8d5c6c5fca57f33fec60e221329d5b55e0c4a8526b/pushjack-1.2.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6266c66cb877af9e7953c64932e4a4d5", "sha256": "a94781a0d8811262e8e0a61925d5579705149411128bb1ed2d6be184eb4aee13" }, "downloads": -1, "filename": "pushjack-1.2.0.tar.gz", "has_sig": false, "md5_digest": "6266c66cb877af9e7953c64932e4a4d5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19676, "upload_time": "2015-12-04T05:11:26", "url": "https://files.pythonhosted.org/packages/6f/6f/9e68c9256b8194bfa8b926e6a55cbf98102f44164b932b5e5e332ee0ad3c/pushjack-1.2.0.tar.gz" } ], "1.2.1": [ { "comment_text": "", "digests": { "md5": "52f9f11d97bb3980457937a67e86033f", "sha256": "0249e61166c23537b0035a578d17304f70b8d63f52eb3a40a377f2fea3fcc99b" }, "downloads": -1, "filename": "pushjack-1.2.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "52f9f11d97bb3980457937a67e86033f", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 20558, "upload_time": "2015-12-15T03:25:58", "url": "https://files.pythonhosted.org/packages/f9/de/09ecc0b550f17a04a628750942139d7af69eb372bbed1aae5b0e0e850312/pushjack-1.2.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f10da4e29e6bfb81b3276b8960ec48cb", "sha256": "241a80c75e4eba62190246643f376bbcc930c09c33c0de1715c7bf367e45d66f" }, "downloads": -1, "filename": "pushjack-1.2.1.tar.gz", "has_sig": false, "md5_digest": "f10da4e29e6bfb81b3276b8960ec48cb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19698, "upload_time": "2015-12-15T03:26:13", "url": "https://files.pythonhosted.org/packages/f9/eb/6227a9bc751d0aee5242ae4dd73399f7cb9a6b6408bce413439d23e9a802/pushjack-1.2.1.tar.gz" } ], "1.3.0": [ { "comment_text": "", "digests": { "md5": "f0248e82667a66a029ce78dfa77b88a2", "sha256": "75728bf17d0f79fc530927d266927c5df82fe79f43aacae6a5408ac1a29dd7c1" }, "downloads": -1, "filename": "pushjack-1.3.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "f0248e82667a66a029ce78dfa77b88a2", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 25209, "upload_time": "2017-03-12T00:47:11", "url": "https://files.pythonhosted.org/packages/e4/e6/84bde558b8578e2f4629d68653eef7416a310cafad8bc6508b07c8a29bad/pushjack-1.3.0-py2.py3-none-any.whl" } ], "1.4.0": [ { "comment_text": "", "digests": { "md5": "bc100f5c67236e2760e9021480a7ffe8", "sha256": "fb03bd102b80120bef7e4693fe521d16550d9f218a878f8e178a4f82aaf221ed" }, "downloads": -1, "filename": "pushjack-1.4.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "bc100f5c67236e2760e9021480a7ffe8", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 26599, "upload_time": "2017-11-10T03:33:34", "url": "https://files.pythonhosted.org/packages/f4/a3/2e702929011553ddce0580fc3784146a71f143b6967095b6dcc2a50ef317/pushjack-1.4.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "bdd4278503362938d5724ad656d9c119", "sha256": "9c08e6252343e8e6d1e9e11dc452b0959e3ea87a137f659c3e0ed190527ddd97" }, "downloads": -1, "filename": "pushjack-1.4.0.tar.gz", "has_sig": false, "md5_digest": "bdd4278503362938d5724ad656d9c119", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 42192, "upload_time": "2017-11-10T03:33:35", "url": "https://files.pythonhosted.org/packages/4c/3a/726714dc0e7711af53f22e7f50a1cb6d09b2b993b9ab9641ca82224b8e21/pushjack-1.4.0.tar.gz" } ], "1.4.1": [ { "comment_text": "", "digests": { "md5": "81a05a6372f375eacc04c4dbc58facd8", "sha256": "03c2d4bf7e8814ce124c547e556f72e5b0b2ac4ffc1109faec630747fde60df3" }, "downloads": -1, "filename": "pushjack-1.4.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "81a05a6372f375eacc04c4dbc58facd8", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 26713, "upload_time": "2018-06-18T22:39:43", "url": "https://files.pythonhosted.org/packages/b9/a0/8db5581beb644ca198e618f53ea9b452c99883a0d2296e9877546c66aec8/pushjack-1.4.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d6a27707f80101e518c656a997725462", "sha256": "faf4343c1b6ad1a4055886212a5f53a5bc8886b23a31799c3a77eb1c84b22f32" }, "downloads": -1, "filename": "pushjack-1.4.1.tar.gz", "has_sig": false, "md5_digest": "d6a27707f80101e518c656a997725462", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 42379, "upload_time": "2018-06-18T22:39:44", "url": "https://files.pythonhosted.org/packages/6d/ee/bf9e1f7d76f5d315cc15e6fbf846b4255e164e53f8c021e566742f2b80af/pushjack-1.4.1.tar.gz" } ], "1.5.0": [ { "comment_text": "", "digests": { "md5": "0968ebb7b894ab4c58e56e40bfe72a53", "sha256": "bf001391387666d4c9aa59b88e88f1d9c3ea821f67a9c29e3683760c5abbefef" }, "downloads": -1, "filename": "pushjack-1.5.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "0968ebb7b894ab4c58e56e40bfe72a53", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 26835, "upload_time": "2018-07-30T01:52:48", "url": "https://files.pythonhosted.org/packages/61/57/de9ff9a9c93f44932d559e263bed5d003840cf534f25c99e9a8a36ba3b4a/pushjack-1.5.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "df057f2f734d9c38c4cac9669c5b025d", "sha256": "9daade85c23eb0a53ea76c18bd8c19c626177cf11428628c3b1d0e7cbc1574b9" }, "downloads": -1, "filename": "pushjack-1.5.0.tar.gz", "has_sig": false, "md5_digest": "df057f2f734d9c38c4cac9669c5b025d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 40586, "upload_time": "2018-07-30T01:52:49", "url": "https://files.pythonhosted.org/packages/31/82/f5fb4c554a9075bea2caf8305dbe7c7dbf4df415e5cdbed4b24701bc1bc2/pushjack-1.5.0.tar.gz" } ], "1.6.0": [ { "comment_text": "", "digests": { "md5": "49736edc7074261cf2ff711dad7d8a09", "sha256": "9c73d776488a0cd67e577d329492f3fbb46bacb961b303a059aabea13b32e636" }, "downloads": -1, "filename": "pushjack-1.6.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "49736edc7074261cf2ff711dad7d8a09", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 23511, "upload_time": "2019-03-16T03:52:06", "url": "https://files.pythonhosted.org/packages/1f/a4/ad86b9ceda1d2ca7bd5a35fe4529f7eb1e4dc147ebf33111e90b929deb60/pushjack-1.6.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7cd21528f12ee0ec25947e72620f8002", "sha256": "6f547e402ee8d36a6b6aa62087690461ca87826a8034f264097f7e4140757efd" }, "downloads": -1, "filename": "pushjack-1.6.0.tar.gz", "has_sig": false, "md5_digest": "7cd21528f12ee0ec25947e72620f8002", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 39825, "upload_time": "2019-03-16T03:52:07", "url": "https://files.pythonhosted.org/packages/8e/68/a311e02db2689617857709895fd265fc506e08eb0925385ba0389b957aec/pushjack-1.6.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "49736edc7074261cf2ff711dad7d8a09", "sha256": "9c73d776488a0cd67e577d329492f3fbb46bacb961b303a059aabea13b32e636" }, "downloads": -1, "filename": "pushjack-1.6.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "49736edc7074261cf2ff711dad7d8a09", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 23511, "upload_time": "2019-03-16T03:52:06", "url": "https://files.pythonhosted.org/packages/1f/a4/ad86b9ceda1d2ca7bd5a35fe4529f7eb1e4dc147ebf33111e90b929deb60/pushjack-1.6.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7cd21528f12ee0ec25947e72620f8002", "sha256": "6f547e402ee8d36a6b6aa62087690461ca87826a8034f264097f7e4140757efd" }, "downloads": -1, "filename": "pushjack-1.6.0.tar.gz", "has_sig": false, "md5_digest": "7cd21528f12ee0ec25947e72620f8002", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 39825, "upload_time": "2019-03-16T03:52:07", "url": "https://files.pythonhosted.org/packages/8e/68/a311e02db2689617857709895fd265fc506e08eb0925385ba0389b957aec/pushjack-1.6.0.tar.gz" } ] }