{ "info": { "author": "Mozilla Release Engineering", "author_email": "release+python@mozilla.com", "bugtrack_url": null, "classifiers": [ "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7" ], "description": "# pushapkscript\n\n[![Build Status](https://travis-ci.org/mozilla-releng/pushapkscript.svg?branch=master)](https://travis-ci.org/mozilla-releng/pushapkscript) [![Coverage Status](https://coveralls.io/repos/github/mozilla-releng/pushapkscript/badge.svg?branch=master)](https://coveralls.io/github/mozilla-releng/pushapkscript?branch=master)\n\nMain script that is aimed to be run with [scriptworker](https://github.com/mozilla-releng/scriptworker) (but runs perfectly fine as a standalone script). This project is a fork of [signingscript](https://github.com/mozilla-releng/signingscript). Most of the documentation from signing script applies to this project.\n\n\n## Get the code\n\n\nFirst, you need `python>=3.5.0`.\n\n```sh\n# create the virtualenv in ./venv3\nvirtualenv3 venv3\n# activate it\n. venv3/bin/activate\ngit clone https://github.com/mozilla-releng/pushapkscript\ncd pushapkscript\npip install pushapkscript\n```\n\nThen you need to install [jarsigner](http://docs.oracle.com/javase/8/docs/technotes/tools/windows/jarsigner.html) (usually included with JDK).\n\n### Configure\n\n#### Jarsigner\n\nAdd the nightly certificate to the java keystore:\n```sh\nkeytool -import -keystore ~/.keystores/mozilla-android -file pushapkscript/data/android-nightly.cer -alias nightly\n```\n\nNote: The keystore location and the certificate alias will be used in the `config.json` section\n\n#### config.json\n```sh\ncp examples/config.example.json config.json\n# edit it with your favorite text editor\n```\n\nThere are many values to edit. Example values should give you a hint about what to provide. If not, please see [signingscript's README](https://github.com/mozilla-releng/signingscript#config-json) for more details about allowing URLs, or contact the author for other unclear areas.\n\n#### directories and file naming\n\nIf you aren't running through scriptworker, you need to manually create the directories that `work_dir` and `artifact_dir` point to. It's better to use new directories for these rather than cluttering and potentially overwriting an existing directory. Once you set up scriptworker, the `work_dir` and `artifact_dir` will be regularly wiped and recreated.\n\n\n### task.json\n\n```sh\ncp examples/task.example.json /path/to/work_dir\n# edit it with your favorite text editor\n```\n\nOrdinarily, scriptworker would get the task definition from TaskCluster, and write it to a `task.json` in the `work_dir`. Since you're initially not going to run through scriptworker, you need to put this file on disk yourself.\n\nThe important entries to edit are the:\n * `apks`: point to the file(s) to publish to Google Play\n * `dependencies`: need to match the `taskId`s of the URLs unless you modify the `valid_artifact_*` config items as specified above\n * `scopes`: the first and only scope, `project:releng:googleplay:*`, tells which product in Google Play store should be updated (either [aurora](https://play.google.com/store/apps/details?id=org.mozilla.fennec_aurora), [beta](https://play.google.com/store/apps/details?id=org.mozilla.firefox_beta), or [release](https://play.google.com/store/apps/details?id=org.mozilla.firefox))\n * `google_play_track`: refers to which Google Play track (either production, beta, or alpha) the APK will be uploaded\n\n#### (aurora, beta, release) vs (alpha, beta, production)?\n\nGoogle Play allows a product to have 3 different tracks (`alpha`, `beta`, `production`). Tracks are used by end-users when they want to enroll in a beta-testing program.\n\nHowever, this feature wasn't out when we started publishing Fennec. This is why Fennec is registred as 3 different product: one for each regular Firefox channel (aurora, beta, release). As a consequence, here's how products/tracks should be used.\n\n| Product | Brand name | Track | Notes |\n| ------- | ----------------------- | ------------ | ----- |\n| release | Firefox | `production` | |\n| beta | Firefox Beta | `production` | |\n| aurora | Firefox Aurora for Developers | `beta` | production is not used to show the product is not aimed at regular users |\n\nNote: For development purpose, aurora on the `alpha` track can also be used.\n\n### run\n\nYou're ready to run pushapkscript!\n\n```sh\npushapkscript CONFIG_FILE\n```\n\nwhere `CONFIG_FILE` is the config json you created above.\n\nThis should download the file(s) specified in the payload, check their signatures with jarsigner and publish them to Google Play Store.\n\n### running through scriptworker\n\nFollow the [scriptworker readme](https://github.com/mozilla-releng/scriptworker/blob/master/README.rst) to set up scriptworker, and use `[\"path/to/pushapkscript\", \"path/to/script_config.json\"]` as your `task_script`.\n\n:warning: Make sure your `work_dir` and `artifact_dir` point to the same directories between the scriptworker config and the pushapkscript config!\n\n\n## Frequently asked questions\n\n### I'd like to test out changes in pushapkscript...\n\n#### Do I *need* to activate chain of trust for *local* development?\n\nNo. Chain of trust is used to securely download artifacts. You can bypass that step by having artifacts already on-disk. Just put the APKs in: `$work_dir/cot/$task_id/public/build/target.apk` (each APK has a different task_id). Then, you can [run pushapkscript](#run).\n\n#### Is there a staging instance I can push my code to?\n\nThere used to be one, but it's now decommissioned. You can spawn a new instance via puppet. To do so:\n\n1. Create a new VM instance. You can [ask for a loaner](https://bugzilla.mozilla.org/show_bug.cgi?id=1307110).\n1. On the [puppet master node](https://dxr.mozilla.org/build-central/rev/e2e751bce7198d358725904a9130bbb06a26c0f9/puppet/manifests/moco-config.pp#78), [set up a user environment](https://wiki.mozilla.org/ReleaseEngineering/PuppetAgain/HowTo/Set_up_a_user_environment).\n1. Add a new node to [moco-nodes.pp](https://dxr.mozilla.org/build-central/rev/e2e751bce7198d358725904a9130bbb06a26c0f9/puppet/manifests/moco-nodes.pp#1069). The config example is present in this repo at `examples/puppet-node.example.pp`.\n1. Activate chain of trust [by creating the gpg keys and whitelisting them](http://scriptworker.readthedocs.io/en/latest/chain_of_trust.html#gpg-key-management). Otherwise, artifacts won't be downloaded.\n1. Edit your tasks to point to a different worker-type. Define it at your will. Please do not use the `dep` pool because it's used outside of releng, in `try` for example.\n1. On your VM, make the slave [take the config of your user environment](https://wiki.mozilla.org/ReleaseEngineering/PuppetAgain/HowTo/Set_up_a_user_environment#On_the_slave_node.28s.29).\n\n:warning: Like [explained below](#is-there-an-instance-which-doesnt-interact-with-production-data), this instance will interact with the production instance of Google Play. Please make sure `\"commit\": false` is in your task definitions (or don't define it).\n\n### I'd like to test out Taskcluster tasks...\n\n#### Is there an instance which doesn't interact with production data?\n\nSadly, no. The Google Play documentation doesn't mention any server we can plug to. This means, you will interact with production data. There are ways to [mitigate the risk](#how-can-i-avoid-to-publish-to-actual-users), though.\n\n#### How can I avoid to publish to actual users?\n\nThere are 3 incremental ways to avoid targetting real users (or the entire user base):\n\n##### 1. Use `\"commit\": false` in your task definition.\n\nThis will execute every step implemented in pushapkscript, but the last one, which commits the transaction to the Play store.\n\nThis allows to publish the same APK several times.\n\nHowever, there are a few final checks that Google Play does only when the transaction is committed. We have already experienced one: the integrity of l10n stores (descriptions and \"what's new\" sections) is verified only at this time. We may extrapolate the behavior to: everything that can be done in several calls to Google Play will be checked at commit time.\n\nIf not defined in the task payload, `commit` defaults to `false`.\n\n##### 2. Push to a closed alpha track\n\nAt some point, you may want to publish your APK anyway.\n\nGoogle Play provides the ability to have [a beta and alpha program](https://support.google.com/googleplay/android-developer/answer/3131213) within a product. Aurora already uses [the beta program](#aurora-beta-release-vs-alpha-beta-production).\n\nYou can ask release management to set up a closed alpha testing on the [Google Play console](https://play.google.com/apps/publish) (Go to Release management -> App releases -> Manage Alpha) and target users by email address. Then, edit your task definition to contain `\"google_play_track\": \"alpha\"`.\n\n###### Before going further: tear down the alpha track\n\n:warning: Once you're done with the alpha track, you **must** ask Release Management to close it. Google Play doesn't accept another track to have more recent version, than the alpha one. If you start using another track (without closing alpha), you may end up with the following error:\n\n```\nHttpError 403 when requesting https://www.googleapis.com/androidpublisher/v2/applications/org.mozilla.fennec_aurora/edits/17791185193608549142:commit?alt=json returned \"Version 2015491409 of this app can not be downloaded by any devices as they will all receive APKs with higher version codes.\n```\n\nIn the case where Release Management isn't connect, there's a temporary workaround:\n\n1. Publish the APKs on the alpha track.\n1. On the Google Play dashboard, promote the APKs to the beta (then the rollout channel). Reuploading the same APKs to the beta track won't be accepted by Google Play, because APKs can only be pushed once.\n\n##### 3. For non-aurora products: Push to the rollout track\n\nIf you are confident enough to publish to percentage of our user base, you can use \"rollout\" functionality. Just edit your task definition to contain:\n```json\n\"channel\": \"production\",\n\"rollout_percentage\": 10,\n```\nif you want to target 10% of the production user base.\n\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/mozilla-releng/pushapkscript", "keywords": "", "license": "MPL2", "maintainer": "", "maintainer_email": "", "name": "pushapkscript", "package_url": "https://pypi.org/project/pushapkscript/", "platform": "", "project_url": "https://pypi.org/project/pushapkscript/", "project_urls": { "Homepage": "https://github.com/mozilla-releng/pushapkscript" }, "release_url": "https://pypi.org/project/pushapkscript/5.0.0/", "requires_dist": [ "google-api-python-client", "mozapkpublisher (<5,>=4)", "oauth2client", "pyOpenSSL", "scriptworker" ], "requires_python": "", "summary": "TaskCluster Push APK Worker", "version": "5.0.0" }, "last_serial": 5892586, "releases": { "0.1.2": [ { "comment_text": "", "digests": { "md5": "b9cbfef176f39074a1a20ca5a9d8ebe4", "sha256": "cad15ea6ad76c3d323ead54618b3ac61bf03db4d800948e708f9de5596bf5938" }, "downloads": -1, "filename": "pushapkscript-0.1.2.tar.gz", "has_sig": false, "md5_digest": "b9cbfef176f39074a1a20ca5a9d8ebe4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14752, "upload_time": "2016-10-25T10:33:06", "url": "https://files.pythonhosted.org/packages/8e/cb/94146239dc12d6d8b920e9709ca14962d2cf046709ebaf758e7a8baea671/pushapkscript-0.1.2.tar.gz" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "0a766d3e85eaa1c37e4f46bdd3026a49", "sha256": "07fe5cf89370b378a937a651dc9ece97b5d90d73c71b47ba7a4d7408ebb354c6" }, "downloads": -1, "filename": "pushapkscript-0.1.4.tar.gz", "has_sig": false, "md5_digest": "0a766d3e85eaa1c37e4f46bdd3026a49", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14972, "upload_time": "2016-11-28T14:04:30", "url": "https://files.pythonhosted.org/packages/27/d2/c38e4312c28a47f2e995cfef2b8cefdf48f8e05fe1bf3734f062275ee5e0/pushapkscript-0.1.4.tar.gz" } ], "0.10.0": [ { "comment_text": "", "digests": { "md5": "9d7dd67619f632fc6c999b1024497c53", "sha256": "139ed6168ba0cb7db4a8aa9dac3c0342f117f01117ec968e118bd04dcf78be10" }, "downloads": -1, "filename": "pushapkscript-0.10.0-py3-none-any.whl", "has_sig": true, "md5_digest": "9d7dd67619f632fc6c999b1024497c53", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 27821, "upload_time": "2018-12-19T17:47:19", "url": "https://files.pythonhosted.org/packages/1c/c3/ff22a49656aa9a9c4fe538dab0ce8fb8cd3e95f65dd85eb5d1abae5d456f/pushapkscript-0.10.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "fc34b30486a8a9534671e7ad06f7af18", "sha256": "2b111861901c6df5836b8edac79646ceb525025086aa10db3365f5b0102c6f21" }, "downloads": -1, "filename": "pushapkscript-0.10.0.tar.gz", "has_sig": true, "md5_digest": "fc34b30486a8a9534671e7ad06f7af18", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27377, "upload_time": "2018-12-19T17:47:21", "url": "https://files.pythonhosted.org/packages/7e/43/37213449606a23ff20d798a9997fde27da27ed231e40ecfcbe1e2562b082/pushapkscript-0.10.0.tar.gz" } ], "0.10.1": [ { "comment_text": "", "digests": { "md5": "880622c7f90e3edce9367fce6ff020cc", "sha256": "c8fec882074e2c09d836cb2da17134397ffa01c22965164ed1096f98c315a96b" }, "downloads": -1, "filename": "pushapkscript-0.10.1-py3-none-any.whl", "has_sig": true, "md5_digest": "880622c7f90e3edce9367fce6ff020cc", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 27834, "upload_time": "2018-12-20T20:12:28", "url": "https://files.pythonhosted.org/packages/a5/73/6750b117d9bbb6bc78c06cb3e3cc792275bc7ef422ca7a4912a5ba7ec9a8/pushapkscript-0.10.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1ff6a9ad0ed90f139255e571dd20668e", "sha256": "b5c2c24b86ef8fe42a7b1f9db713dd5b8abcd86b40313836437ef9988610def2" }, "downloads": -1, "filename": "pushapkscript-0.10.1.tar.gz", "has_sig": true, "md5_digest": "1ff6a9ad0ed90f139255e571dd20668e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27382, "upload_time": "2018-12-20T20:12:30", "url": "https://files.pythonhosted.org/packages/10/a7/6b8e6274fd9403a644a3dd1e34db950e01acd235a9e5bff331c9fc2faf17/pushapkscript-0.10.1.tar.gz" } ], "0.13.0": [ { "comment_text": "", "digests": { "md5": "ba9b4280d21ab5f217fb489629d3fdeb", "sha256": "5f24648f602414c4a4472732217b29f8b9fb750da14ab05adef0cafe166ca25e" }, "downloads": -1, "filename": "pushapkscript-0.13.0-py3-none-any.whl", "has_sig": true, "md5_digest": "ba9b4280d21ab5f217fb489629d3fdeb", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 28400, "upload_time": "2019-02-01T19:18:39", "url": "https://files.pythonhosted.org/packages/71/dc/1f4aed18f9c0ff13da496361c297be0eac705688085f11614dc5f4527a84/pushapkscript-0.13.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c6d57bd98dcb1593cd0db2d1b28bad0b", "sha256": "0c3bde69e8e8c40bb76d8a7238d15593454ad27983768dcc849962fd299deb15" }, "downloads": -1, "filename": "pushapkscript-0.13.0.tar.gz", "has_sig": true, "md5_digest": "c6d57bd98dcb1593cd0db2d1b28bad0b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27720, "upload_time": "2019-02-01T19:18:41", "url": "https://files.pythonhosted.org/packages/4c/d7/c2d35589e16d7b0015e755aa9a3e5eab4577394b0d6da51dbada93229e4f/pushapkscript-0.13.0.tar.gz" } ], "0.14.0": [ { "comment_text": "", "digests": { "md5": "4dafd8794d7249de91eda57d189a7eb2", "sha256": "fdd9562f734a2321df9d9ce6ac110fa3c76a4e47e2f5d6d1f5eff7704ae3b9c7" }, "downloads": -1, "filename": "pushapkscript-0.14.0-py3-none-any.whl", "has_sig": true, "md5_digest": "4dafd8794d7249de91eda57d189a7eb2", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 28938, "upload_time": "2019-02-13T23:21:21", "url": "https://files.pythonhosted.org/packages/0e/ec/765bc5897bb647e4be10f37556602cffe73308bf810f544479b820211204/pushapkscript-0.14.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "edd4497adb453cda1f9b89c4110ce48a", "sha256": "fe91cedd2e98c9458e240a243a3fac069faf94cc5f0eda9e961947ffba218611" }, "downloads": -1, "filename": "pushapkscript-0.14.0.tar.gz", "has_sig": true, "md5_digest": "edd4497adb453cda1f9b89c4110ce48a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28494, "upload_time": "2019-02-13T23:21:23", "url": "https://files.pythonhosted.org/packages/96/3d/1a9a6b78d650baf49dae8a90b3259c3d816c1a7dab0e382080c4b5a05699/pushapkscript-0.14.0.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "e110fa112142f3e388b4e986f41e97e1", "sha256": "3dfdacd6563b838a7852295edd15d44e04dd1d6a838d88f0e771422e60f0358d" }, "downloads": -1, "filename": "pushapkscript-0.2.0.tar.gz", "has_sig": true, "md5_digest": "e110fa112142f3e388b4e986f41e97e1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15977, "upload_time": "2017-01-20T17:25:00", "url": "https://files.pythonhosted.org/packages/36/61/5a72f2504a87b32c8f34daa2622a6ef34689170598223472bdfba789a4ec/pushapkscript-0.2.0.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "6733caf0d955a079db429130ab43ede2", "sha256": "5731dafb4ff22d3d15a5e6d8eb23e7fbb26feeb7789a7aa6d28a30bae2c9e145" }, "downloads": -1, "filename": "pushapkscript-0.2.1.tar.gz", "has_sig": true, "md5_digest": "6733caf0d955a079db429130ab43ede2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15999, "upload_time": "2017-01-27T13:12:57", "url": "https://files.pythonhosted.org/packages/39/ea/c35f6d4ce1612f8658a40c7cf02217d822d938e372b7521553015411e84e/pushapkscript-0.2.1.tar.gz" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "014e4c0ba729d1f8e8d3011301e84f48", "sha256": "23c5314733793caf98cb96512d746beae8dc67dd1ec8059e22caa0d4bdf0ad26" }, "downloads": -1, "filename": "pushapkscript-0.2.2.tar.gz", "has_sig": true, "md5_digest": "014e4c0ba729d1f8e8d3011301e84f48", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15937, "upload_time": "2017-02-10T16:00:24", "url": "https://files.pythonhosted.org/packages/d3/2a/49b9b65d0ca0959dd571c8339d9c7bdccf992451e7cc67e39c6b17c4ff28/pushapkscript-0.2.2.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "da62edf4ceaec7ca207edc21b42046fc", "sha256": "5b4d4a149fc11d99f49bdaaf682c8d5ba1d271414b68eeaa332c5cf04ef91e3e" }, "downloads": -1, "filename": "pushapkscript-0.3.0.tar.gz", "has_sig": true, "md5_digest": "da62edf4ceaec7ca207edc21b42046fc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16542, "upload_time": "2017-03-30T15:15:37", "url": "https://files.pythonhosted.org/packages/bc/5f/eb0c5c39eb1cdfe50fa7af71fa1147b82c3b03819b895be7f7ea949546f7/pushapkscript-0.3.0.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "74f7d97642372ac3a213018a48ba929b", "sha256": "fd064f5cc1ec22a3d643c38d915745ab7a1012673b0e5bbc0056ab99a86ca11a" }, "downloads": -1, "filename": "pushapkscript-0.3.1.tar.gz", "has_sig": true, "md5_digest": "74f7d97642372ac3a213018a48ba929b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16765, "upload_time": "2017-04-10T12:56:37", "url": "https://files.pythonhosted.org/packages/97/e3/247ed65caafa4add7ea471b28033fea8e8207760c21cd3e4c6111046adfc/pushapkscript-0.3.1.tar.gz" } ], "0.3.2": [ { "comment_text": "", "digests": { "md5": "4e9ff5f4d1529e6538c508ea405d999b", "sha256": "a53c9ef1a91430d87a46411d4e183a720d0289f99095e484e2f908329e83a77e" }, "downloads": -1, "filename": "pushapkscript-0.3.2.tar.gz", "has_sig": true, "md5_digest": "4e9ff5f4d1529e6538c508ea405d999b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17535, "upload_time": "2017-04-11T17:04:20", "url": "https://files.pythonhosted.org/packages/64/d0/57fb57983f3c640c2b695392eade6a01c0a2c053e65a0d073b31a58e7328/pushapkscript-0.3.2.tar.gz" } ], "0.3.3": [ { "comment_text": "", "digests": { "md5": "8913676b8c5b2c894a45fb433c70e385", "sha256": "996871ef2d3e28fac8d83629eef97668133a2bb66f3af792c4503f78a99bb699" }, "downloads": -1, "filename": "pushapkscript-0.3.3.tar.gz", "has_sig": true, "md5_digest": "8913676b8c5b2c894a45fb433c70e385", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19268, "upload_time": "2017-05-31T08:19:02", "url": "https://files.pythonhosted.org/packages/89/9a/95780fe74a18978e2157e3cade9c2037a123728286c6744731feb4f44fcc/pushapkscript-0.3.3.tar.gz" } ], "0.3.4": [ { "comment_text": "", "digests": { "md5": "647957227341525a76ff9111561d9d60", "sha256": "8f6143e2d5fcf7b6463166c5e64450699dc8298fc19ba4cd67d93b0ebafb1781" }, "downloads": -1, "filename": "pushapkscript-0.3.4.tar.gz", "has_sig": true, "md5_digest": "647957227341525a76ff9111561d9d60", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19731, "upload_time": "2017-06-19T12:04:46", "url": "https://files.pythonhosted.org/packages/6a/fe/a82287330896281858d396877430ad39364689411a168f7376bcb7a600ef/pushapkscript-0.3.4.tar.gz" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "f5461c710a3428e577f62542897fafb4", "sha256": "13570f4924a7cf9312c812c399b44e245d6e8563c8af9802888594a003c3eef7" }, "downloads": -1, "filename": "pushapkscript-0.5.0.tar.gz", "has_sig": true, "md5_digest": "f5461c710a3428e577f62542897fafb4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21212, "upload_time": "2018-03-19T16:58:11", "url": "https://files.pythonhosted.org/packages/6f/c0/aeff2671bc435d7b2c012709391aec870287a1df5c9ec23e7ee6596a4748/pushapkscript-0.5.0.tar.gz" } ], "0.6.0": [ { "comment_text": "", "digests": { "md5": "42cf34013735544dfee4f49c7de70e16", "sha256": "9cf2a06e03e3bf5343a8e80d0affbc1b785ab4e0f90754cd9b9bcef7ebb4cf57" }, "downloads": -1, "filename": "pushapkscript-0.6.0.tar.gz", "has_sig": true, "md5_digest": "42cf34013735544dfee4f49c7de70e16", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19583, "upload_time": "2018-04-20T13:56:32", "url": "https://files.pythonhosted.org/packages/8f/45/e294275a8b1936e7d7e68fac6654bb729c01a4f550e999f1982f5c9513b7/pushapkscript-0.6.0.tar.gz" } ], "0.7.0": [ { "comment_text": "", "digests": { "md5": "42921c03012e438ab6bc4b4dc7ed2447", "sha256": "97f27b43caf246bd217b9fd85f9bd3642bb5b48d0631e39083468472426e6b14" }, "downloads": -1, "filename": "pushapkscript-0.7.0.tar.gz", "has_sig": true, "md5_digest": "42921c03012e438ab6bc4b4dc7ed2447", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20182, "upload_time": "2018-04-27T15:49:30", "url": "https://files.pythonhosted.org/packages/89/b7/4e17be85ff525dd062863cd686d1ec9a4fa28b1ea0d84a2690e289a0f253/pushapkscript-0.7.0.tar.gz" } ], "0.8.0": [ { "comment_text": "", "digests": { "md5": "2df68da2a46dce638000263abdcf2c1c", "sha256": "709a82ed1254f516eb802237646d9ba69f7fb0a56063343589bf7793a7631194" }, "downloads": -1, "filename": "pushapkscript-0.8.0.tar.gz", "has_sig": true, "md5_digest": "2df68da2a46dce638000263abdcf2c1c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20158, "upload_time": "2018-06-22T12:10:23", "url": "https://files.pythonhosted.org/packages/bc/48/ed75539cff5236ef10da8d930304ce6e75440c9533e05aec18d0d2098362/pushapkscript-0.8.0.tar.gz" } ], "0.9.0": [ { "comment_text": "", "digests": { "md5": "3684f0aa6cb2575126b46f205ed580ed", "sha256": "2a755b5625204f6a63f20c2f7a1a4e63d7bf07d83138ee097e1ba4b09eb03a12" }, "downloads": -1, "filename": "pushapkscript-0.9.0.tar.gz", "has_sig": true, "md5_digest": "3684f0aa6cb2575126b46f205ed580ed", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26911, "upload_time": "2018-11-23T15:42:09", "url": "https://files.pythonhosted.org/packages/44/59/982687cb910a6c7a4934b6a4b8708d377e917ec491e8570d965a161287dd/pushapkscript-0.9.0.tar.gz" } ], "1.0.0": [ { "comment_text": "", "digests": { "md5": "6f60fdba2905ed146976767f9639dc69", "sha256": "cf62294387aadb73d37c7c05b60dbf3d5524d5bccf68aebefd5e108e9e3cfe80" }, "downloads": -1, "filename": "pushapkscript-1.0.0-py3-none-any.whl", "has_sig": true, "md5_digest": "6f60fdba2905ed146976767f9639dc69", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 28921, "upload_time": "2019-03-29T13:11:34", "url": "https://files.pythonhosted.org/packages/cb/b6/bec6a685946132f710e80893112ef9496a4c740e614aed670b6000df21a6/pushapkscript-1.0.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "946d678833a14dedc2a345d14a31a74a", "sha256": "ad18d5d5a3d8dd074c412f36d2aad0575b0f6277ac1aa07731f05e0689df1211" }, "downloads": -1, "filename": "pushapkscript-1.0.0.tar.gz", "has_sig": true, "md5_digest": "946d678833a14dedc2a345d14a31a74a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28477, "upload_time": "2019-03-29T13:11:37", "url": "https://files.pythonhosted.org/packages/a9/8b/d5551235f0734f2b9608cf78f12fe67778d527f2341d631106c5c3353dee/pushapkscript-1.0.0.tar.gz" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "670b5afaab085cf95d9c2c3395517691", "sha256": "1587aecd67a8dadc0b5576f3291203d4fa45f1891b562469a77d074239bf308f" }, "downloads": -1, "filename": "pushapkscript-1.0.1-py3-none-any.whl", "has_sig": true, "md5_digest": "670b5afaab085cf95d9c2c3395517691", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 28751, "upload_time": "2019-04-12T13:19:02", "url": "https://files.pythonhosted.org/packages/df/ca/be0040235bf38be273163f75191c96580d62648621cd1be33d35deb0389c/pushapkscript-1.0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1c32e74e1efaea438817c46d5633753c", "sha256": "9c4b5d1686a98ac30a6d48da51951453d8a5e7999d5e38edc621f45a25cbef70" }, "downloads": -1, "filename": "pushapkscript-1.0.1.tar.gz", "has_sig": true, "md5_digest": "1c32e74e1efaea438817c46d5633753c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28378, "upload_time": "2019-04-12T13:19:05", "url": "https://files.pythonhosted.org/packages/d1/b5/47ffa6c7f43979e7f3d24dff0837b3cd4f76716e521bcff39961b2afc49e/pushapkscript-1.0.1.tar.gz" } ], "1.0.2": [ { "comment_text": "", "digests": { "md5": "b285cb1ac63131be026a19275d10d91f", "sha256": "b7005b12bdb349f5dee66deff394bfc19b09fa85eeb329ad286c193069c03a71" }, "downloads": -1, "filename": "pushapkscript-1.0.2-py3-none-any.whl", "has_sig": true, "md5_digest": "b285cb1ac63131be026a19275d10d91f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 28818, "upload_time": "2019-04-26T15:03:24", "url": "https://files.pythonhosted.org/packages/0f/ab/9ba72ee21f04591cd801494ecad317ac2e41cc721f2541dfec8a9f3b0069/pushapkscript-1.0.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8836381fcaff1f79183785c5ea990287", "sha256": "8021ddcdb82cfd42a1ad11b31e1be3e98d96ed284071ae0c8c52fc4c5a5393a8" }, "downloads": -1, "filename": "pushapkscript-1.0.2.tar.gz", "has_sig": true, "md5_digest": "8836381fcaff1f79183785c5ea990287", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28578, "upload_time": "2019-04-26T15:03:28", "url": "https://files.pythonhosted.org/packages/19/12/3b2ad2ece932c18e01dc1312826f39e14efd744ff0e7fd06aae48b82a062/pushapkscript-1.0.2.tar.gz" } ], "1.0.3": [ { "comment_text": "", "digests": { "md5": "2e82d0bb8e3b095233243940a311525e", "sha256": "57d0b778f0ad5d9c47c06e0b769641f3eec762b6a50605ecdd9c94d3ff7e5646" }, "downloads": -1, "filename": "pushapkscript-1.0.3-py3-none-any.whl", "has_sig": true, "md5_digest": "2e82d0bb8e3b095233243940a311525e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 29110, "upload_time": "2019-05-07T20:49:54", "url": "https://files.pythonhosted.org/packages/92/94/a79abfa9c4c481d1962738e3d31c014261c278fdd0acc2282aade3192ce8/pushapkscript-1.0.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "77e065cb2138e0a86ea86f0670636847", "sha256": "7891aeb44316a76137cf80e6554d9b6596cf74a87af85ab0b86c2a68bf373490" }, "downloads": -1, "filename": "pushapkscript-1.0.3.tar.gz", "has_sig": true, "md5_digest": "77e065cb2138e0a86ea86f0670636847", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28924, "upload_time": "2019-05-07T20:49:57", "url": "https://files.pythonhosted.org/packages/5c/7a/e6625e893da1d555df7a1e7efad7dded67d4175015075fea1697466e5405/pushapkscript-1.0.3.tar.gz" } ], "1.0.4": [ { "comment_text": "", "digests": { "md5": "14aeeb3aa76f54e6ad5cbc4d1b9fbbe2", "sha256": "da41b27f1753416a677f5d141255b66d21c2416493ea07a3a1b5631efae104aa" }, "downloads": -1, "filename": "pushapkscript-1.0.4-py3-none-any.whl", "has_sig": false, "md5_digest": "14aeeb3aa76f54e6ad5cbc4d1b9fbbe2", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 29120, "upload_time": "2019-05-13T13:08:31", "url": "https://files.pythonhosted.org/packages/70/67/19d953d54255ff74e299ceb0488faa7a8f075d9ebb15f2ec1b9ce7ba2ef6/pushapkscript-1.0.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8723154d815489eeffa9890ea4630df9", "sha256": "ae7f6c675137334c3da4bf1beddaef9b03e55b1ed05d7e6a9c5534b712e3f6e0" }, "downloads": -1, "filename": "pushapkscript-1.0.4.tar.gz", "has_sig": false, "md5_digest": "8723154d815489eeffa9890ea4630df9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25349, "upload_time": "2019-05-13T13:08:33", "url": "https://files.pythonhosted.org/packages/ee/80/985fd12010fd188c613d8fe1d03e244d82c9a88f422de68d0911eee72d6d/pushapkscript-1.0.4.tar.gz" } ], "2.0.0": [ { "comment_text": "", "digests": { "md5": "568a6c55e4b635c07969666505997a03", "sha256": "2bcc9159f720450044c55132d34b9cf41d531a2b6753d07ca8e147834c811486" }, "downloads": -1, "filename": "pushapkscript-2.0.0-py3-none-any.whl", "has_sig": true, "md5_digest": "568a6c55e4b635c07969666505997a03", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 29170, "upload_time": "2019-06-03T11:57:51", "url": "https://files.pythonhosted.org/packages/72/12/cf7b5eb398e8b103edfd37d6622e247acec8e304d6b7e7b3683ff319cfa1/pushapkscript-2.0.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "af5a61a2bce6ee22b034effc41df97b6", "sha256": "bf850901c65d54a7b0e4aeaac79d4e2d53905ff66fa0bf6ead6e7e08e0e71bb2" }, "downloads": -1, "filename": "pushapkscript-2.0.0.tar.gz", "has_sig": true, "md5_digest": "af5a61a2bce6ee22b034effc41df97b6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28951, "upload_time": "2019-06-03T11:57:53", "url": "https://files.pythonhosted.org/packages/97/3a/18fa2b1e28d9dceb78d5f322ab931101171c4d620887445986b2b375ad6a/pushapkscript-2.0.0.tar.gz" } ], "2.1.0": [ { "comment_text": "", "digests": { "md5": "ccb0e34f44b3eeccdd96d93ff6a779e2", "sha256": "6d46dcbb4b7e837a0ddf6f88b96308bf2a1b5660340198872e1e0aca0fc136c5" }, "downloads": -1, "filename": "pushapkscript-2.1.0-py3-none-any.whl", "has_sig": true, "md5_digest": "ccb0e34f44b3eeccdd96d93ff6a779e2", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 29016, "upload_time": "2019-06-06T15:00:45", "url": "https://files.pythonhosted.org/packages/4d/82/0f132af6ea6952a2741cd25bacd22ecc055669961d73edeb12447e56bc08/pushapkscript-2.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "fa1f8c37db8fb05329ce16b77eb91507", "sha256": "2ddbf4e58deb4463193cb73e97b0b4c01ee0d37cc99dd8477997c0284b41cd49" }, "downloads": -1, "filename": "pushapkscript-2.1.0.tar.gz", "has_sig": true, "md5_digest": "fa1f8c37db8fb05329ce16b77eb91507", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28801, "upload_time": "2019-06-06T15:00:47", "url": "https://files.pythonhosted.org/packages/c3/54/f1f5505f5c3e9287fa003bc764b459db385d7370cc92a9a3f3027cc90248/pushapkscript-2.1.0.tar.gz" } ], "3.0.0": [ { "comment_text": "", "digests": { "md5": "533b5db9358aeae30f0f2e4f729b40ef", "sha256": "f1d3d96bcea2eb07aefa3051075f0416a28c7e51f2c335952af58c2dfae648a5" }, "downloads": -1, "filename": "pushapkscript-3.0.0-py3-none-any.whl", "has_sig": true, "md5_digest": "533b5db9358aeae30f0f2e4f729b40ef", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 27477, "upload_time": "2019-07-09T17:32:16", "url": "https://files.pythonhosted.org/packages/13/05/9e532b49d873312857d70cafc125e1bf7e7eceaa8f448e1ded03e63e534d/pushapkscript-3.0.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "cffa426871568a02cf32311196bce072", "sha256": "22b27425ac4cf7383157675286efcb1ae9020587e3468888eb891a35e77effda" }, "downloads": -1, "filename": "pushapkscript-3.0.0.tar.gz", "has_sig": true, "md5_digest": "cffa426871568a02cf32311196bce072", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27363, "upload_time": "2019-07-09T17:32:19", "url": "https://files.pythonhosted.org/packages/13/4a/b5c6726c664fd0d21ed3018adea25bcb9ad61faf3039c63cb8d78a1c5f06/pushapkscript-3.0.0.tar.gz" } ], "3.1.0": [ { "comment_text": "", "digests": { "md5": "ae7b6b3a31d3249c86f867f9741a25e1", "sha256": "98d250eeec7277535b62a1b4bd24b54979420f6365084883937e190a559d7ce3" }, "downloads": -1, "filename": "pushapkscript-3.1.0-py3-none-any.whl", "has_sig": true, "md5_digest": "ae7b6b3a31d3249c86f867f9741a25e1", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 27470, "upload_time": "2019-07-11T23:17:14", "url": "https://files.pythonhosted.org/packages/36/63/f0ae77cbc364d5d955019969c22a4e956b129776791ef0f9c878b3c0c884/pushapkscript-3.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a1502348117b99781248f5530a8f8dfb", "sha256": "6fe8cd8c886d85598a4fee2e312165cb228b2164c8d649d6e59a9240ee04387c" }, "downloads": -1, "filename": "pushapkscript-3.1.0.tar.gz", "has_sig": true, "md5_digest": "a1502348117b99781248f5530a8f8dfb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27406, "upload_time": "2019-07-11T23:17:17", "url": "https://files.pythonhosted.org/packages/6a/e1/edfcc622911a7a08a260774706cd4521f263709f5a41878fa2881d6ffa47/pushapkscript-3.1.0.tar.gz" } ], "4.0.0": [ { "comment_text": "", "digests": { "md5": "b06d1e3af8f14e749f9ee052f6381a4f", "sha256": "64df96b7b8ab71e793fde059ab91f445f19a301cf1338ba2109af5802872be67" }, "downloads": -1, "filename": "pushapkscript-4.0.0-py3-none-any.whl", "has_sig": true, "md5_digest": "b06d1e3af8f14e749f9ee052f6381a4f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 27485, "upload_time": "2019-08-28T23:18:21", "url": "https://files.pythonhosted.org/packages/3a/be/d7a10b9e21a50efc48b09d234b81020302a1c1fce2b98f772c49ae7def9a/pushapkscript-4.0.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9a90babdbd7b9963296073c11fd47499", "sha256": "8906ff1be26c32b5408655b9d931dd6f22a7b63148c6098892a434029c07d1de" }, "downloads": -1, "filename": "pushapkscript-4.0.0.tar.gz", "has_sig": true, "md5_digest": "9a90babdbd7b9963296073c11fd47499", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 44930, "upload_time": "2019-08-28T23:18:23", "url": "https://files.pythonhosted.org/packages/0c/51/d1e7b28d467a53e70b0390d6742537243933a7e281e53f03471e74b8b62b/pushapkscript-4.0.0.tar.gz" } ], "5.0.0": [ { "comment_text": "", "digests": { "md5": "5f44fef13af8a323152c54895f49c3db", "sha256": "1cadd4a64ce42a48a224fe3e3d421934e9fcb3c63293c27146152233219382b0" }, "downloads": -1, "filename": "pushapkscript-5.0.0-py3-none-any.whl", "has_sig": true, "md5_digest": "5f44fef13af8a323152c54895f49c3db", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 29824, "upload_time": "2019-09-26T20:24:59", "url": "https://files.pythonhosted.org/packages/e9/65/d781b8e548073a4f83597139bee09762fc5c030649d81372cbe6877d6ebb/pushapkscript-5.0.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b276611cd6198bab72ba863afb7f968c", "sha256": "45a59cf0e3d72744605f379c490abbf7425503bf8093204b47ff5d21583b2974" }, "downloads": -1, "filename": "pushapkscript-5.0.0.tar.gz", "has_sig": true, "md5_digest": "b276611cd6198bab72ba863afb7f968c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 47352, "upload_time": "2019-09-26T20:25:01", "url": "https://files.pythonhosted.org/packages/71/6e/4865fd5e8e8b62d9ef3894c7b9c39306a121c9f62772432f3ceb9b695e79/pushapkscript-5.0.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "5f44fef13af8a323152c54895f49c3db", "sha256": "1cadd4a64ce42a48a224fe3e3d421934e9fcb3c63293c27146152233219382b0" }, "downloads": -1, "filename": "pushapkscript-5.0.0-py3-none-any.whl", "has_sig": true, "md5_digest": "5f44fef13af8a323152c54895f49c3db", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 29824, "upload_time": "2019-09-26T20:24:59", "url": "https://files.pythonhosted.org/packages/e9/65/d781b8e548073a4f83597139bee09762fc5c030649d81372cbe6877d6ebb/pushapkscript-5.0.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b276611cd6198bab72ba863afb7f968c", "sha256": "45a59cf0e3d72744605f379c490abbf7425503bf8093204b47ff5d21583b2974" }, "downloads": -1, "filename": "pushapkscript-5.0.0.tar.gz", "has_sig": true, "md5_digest": "b276611cd6198bab72ba863afb7f968c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 47352, "upload_time": "2019-09-26T20:25:01", "url": "https://files.pythonhosted.org/packages/71/6e/4865fd5e8e8b62d9ef3894c7b9c39306a121c9f62772432f3ceb9b695e79/pushapkscript-5.0.0.tar.gz" } ] }