{ "info": { "author": "ESSS", "author_email": "dev@esss.com.br", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 3.6", "Topic :: Software Development" ], "description": "Job's Done\n===========\n\n[![link](https://img.shields.io/pypi/v/jobs_done10.svg)](https://pypi.org/project/jobs_done10)\n[![link](https://img.shields.io/pypi/pyversions/jobs_done10.svg)](https://pypi.org/project/jobs_done10)\n[![link](https://travis-ci.com/ESSS/jobs_done10.svg?branch=master)](https://travis-ci.com/ESSS/jobs_done10)\n[![link](https://img.shields.io/github/license/ESSS/jobs_done10.svg)](https://img.shields.io/github/license/ESSS/jobs_done10.svg)\n\n# About #\n\nJob's Done is a tool heavily inspired by [Travis](https://travis-ci.org/), and works in the same way \nin that configuring a `.jobs_done.yaml` file in your repository's root to create and trigger Continuous Integration jobs.\n\nExample of a `.jobs_done.yaml` file:\n\n```yaml\nmatrix:\n platform:\n - \"win64\"\n - \"redhat64\"\n\nplatform-win64:build_batch_commands:\n- | \n python -m venv .env3 || goto eof\n call .env3\\Scripts\\activate || goto eof\n pytest --junitxml=tests-{platform}.xml \n\nplatform-redhat64:build_shell_commands:\n- |\n python3 -m venv .env3\n source .env3/bin/activate\n pytest --junitxml=tests-{platform}.xml \n\njunit_patterns:\n- \"tests.*.xml\"\n```\n\nConsidering this file is in the root of repository `myproject` and was pushed to branch `feat-71`, this will generate two Jenkins jobs:\n\n* `myproject-feat-71-win64`\n* `myproject-feat-71-linux64`\n\n\n## Command-line ###\n\nJobs done can be executed in the command-line. \n\nTo use it, from the repository's folder that you want to create jobs for, execute:\n\n```console\n$ jobs_done jenkins --username USER https://example.com/jenkins \n```\n\nThis will create/update existing jobs.\n\nBelow are the possible installation options.\n\n### PyPI ###\n\n1. Create a virtual environment using Python 3 and activate it:\n\n ```console\n $ python -m venv .env\n $ .env\\Scripts\\activate # Windows\n $ source .env/bin/activate # Linux\n ```\n\n3. Install jobs_done10:\n\n ```console\n $ pip install jobs_done10\n ```\n\n### Development ###\n\n1. Clone the repository:\n\n ```console\n git clone git@github.com:ESSS/jobs_done10.git\n cd jobs_done10\n ```\n\n2. Create a virtual environment using Python 3 and activate it:\n\n ```console\n $ python -m venv .env\n $ .env\\Scripts\\activate # Windows\n $ source .env/bin/activate # Linux\n ```\n\n3. Install dependencies:\n\n ```console\n $ pip install -e .[testing]\n ```\n\n\n## Server ##\n\njobs done includes a `flask` end point in `jobs_done10.server` which can be deployed using [Docker](https://www.docker.com/). \n\nThis end point is tailored to receive the push event from a Webhook of a BitBucket Server instance. A post without any\njson data will return the installed version, useful to check the installed version and that the end point is correct.\n\n### Configuration ###\n\nConfiguration is done by having a `.env` file (cortesy of [python-dotenv](https://github.com/theskumar/python-dotenv))\nin the root of this repository with the following variables:\n\n```ini\nJD_JENKINS_URL=https://example.com/jenkins\nJD_JENKINS_USERNAME=jenkins-user\nJD_JENKINS_PASSWORD=some password\n\nJD_STASH_URL=https://example.com/stash\nJD_STASH_USERNAME=stash-user\nJD_STASH_PASSWORD=some password\n\nJD_EMAIL_USER=mail-sender@example.com\nJD_EMAIL_FROM=JobsDone Bot \nJD_EMAIL_PASSWORD=email password\nJD_EMAIL_SERVER=smtp.example.com\nJD_EMAIL_PORT=587\n``` \n\n### Build ###\n\nClone the repository and checkout the tag:\n\n```console\n$ git clone https://github.com/ESSS/jobs_done10.git\n$ cd jobs_done10\n$ git checkout \n``` \n\nBuild a docker image:\n\n```console\n$ docker build . --tag jobsdone: --build-arg SETUPTOOLS_SCM_PRETEND_VERSION=\n```\n\n### Run server ###\n\n```console\n$ docker run --publish 5000:5000 jobsdone:\n```\n\n# Hello World #\n\nThis is an example of a Job's Done file, and what you might expect of its contents.\n\n```yaml\nbuild_batch_commands:\n- \"echo MESSAGE: Hello, world!\"\n\ndescription_regex: \"MESSAGE\\\\:(.*)\"\n```\n\nAdding this file to a repository hooked into our CI system will create a single job that when executed run a \nWindows batch command, and later on catches the message echoed and sets that as the build description.\n\n\n# Tests #\n\nThis is an example of a simple application with tests:\n\n```yaml\n\nbuild_batch_commands:\n- \"pytest --junitxml=pytest_results.xml\"\n\njunit_patterns:\n- \"pytest_results.xml\"\n```\n\nThis jobs runs pytest in the repository and outputs test results to a file. We also configure the job to look for that \nfile, and present test results to us at then end of the build.\n\n# Multiple platforms #\n\n\nThe same application as above, but now running on multiple platforms.\n\n```yaml\n\nplatform-win64:build_batch_commands:\n- \"pytest --junitxml=pytest_results-{platform}.xml\"\n\nplatform-redhat64:build_shell_commands:\n- \"pytest --junitxml=pytest_results-{platform}.xml\"\n\njunit_patterns:\n- \"pytest_results.*.xml\"\n\nmatrix:\n platform:\n - \"win64\"\n - \"redhat64\"\n```\n\nHere we add a **matrix** section to define variations of this job. In this case, we have the platform variable, \nwith two possible values, `win64` and `redhat64`.\n\nOne job will be created for each possible combination in the matrix (only two jobs in this case).\n\nSince we can't run batch commands in linux, we add another builder section, `build_shell_commands`. Using some flags \nbefore defining sections we can choose which one will be available in each job.\n\nValues from the matrix can also be used as variables, in this case, `{platform}` will be replaced by the platform used \nin that job (`win64` or `redhat64`).\n\n\n## Branch patterns ##\n\nBranch patterns are used to filter which branches will produce jobs. This list of regular expressions \n(using Python syntax), ensures that a branch will only produce jobs if at least one of the regular \nexpressions matches the name of the branch.\n\nHere's an example that filter only `master` and feature branches:\n\n```yaml\n\nbranch_patterns:\n- \"master\"\n- \"fb-*\"\n```\n\nIf this section is not defined in the file, all branches will produce jobs.\n\n## Job Matrix ##\n\nAs shown in the examples above, the job matrix can be used to create multiple variations of a job. \nOne job for each combination of entries in this matrix is created.\n\n```yaml\nmatrix:\n mode:\n - \"app\"\n - \"cases\"\n platform:\n - \"win64\"\n - \"linux64\"\n```\n\nIn this case 4 jobs will be generated:\n\n* `app-win64`\n* `app-linux64`\n* `cases-win64`\n* `cases-linux64`\n\nNote that you can use any variables you need, Job's done has no idea what `mode` or `platform` means.\n\nThere's an `exclude` clause which can be used to remove particular entries from the matrix:\n\n\n```yaml\nmatrix:\n mode:\n - \"app\"\n - \"cases\"\n platform:\n - \"win64\"\n - \"linux64\"\n\nmode-cases:platform-win.*:exclude: \"yes\" \n```\n\nThis will exclude all cases jobs from windows.\n\n## String replacement ##\n\nVariables defined in the job matrix can be used to replace strings in the job file.\n\nOn top of matrix variables, there are a few special string templates that can be used in any job:\n\n* `name` - Name of the repository\n* `branch` - Branch being built\n\n\n```yaml\nmatrix:\n platform:\n - \"win64\"\n - \"linux64\"\n\nplatform-win.*:build_batch_commands:\n- \"echo Building project {name} in branch {branch} on platform {platform}\" \n```\n\nNote that we use Python's format syntax, so if you need an actual `{` or `}` use double braces: `{{`, `}}`.\n\n\n## Condition Flags ##\n\nVariables defined in your job matrix can also be used to control some of the contents in your job file. \nA common example here is using different builder for windows (bash) and linux (shell).\n\nThis is done by adding a prefix to sections of the YAML file, with the variable name and value necessary to use it:\n\n```yaml\nplatform-win.*:build_batch_commands:\n- \"dir .\"\n\nplatform-linux.*:build_shell_commands:\n- \"ls -la .\"\n\nmatrix:\n platform:\n - \"win32\"\n - \"linux64\"\n```\n\nMatrix variables can also define aliases, useful to reduce duplication when using such flags. \nTo add aliases, simply use commas to separate additional names for matrix values:\n\n```yaml\nplatform-windows:build_batch_commands:\n- \"dir .\"\n\nplatform-linux:build_shell_commands:\n- \"ls -la .\"\n\nmatrix:\n platform:\n - \"win32,windows\"\n - \"win64,windows\"\n - \"linux64,linux\"\n```\n\nOn top of that you can use a special variable `branch` that's always available, and points to your branch:\n\n```yaml\nbranch-master:build_batch_commands:\n- \"echo Build\"\n\nbranch-deploy:build_batch_commands:\n- \"echo Build + Deploy\"\n```\n\nCondition values can use Python regex syntax for extra flexibility:\n\n```yaml\nbranch-master:build_batch_commands:\n- \"echo Build\"\n\nbranch-fb.*:build_batch_commands:\n- \"echo Feature branch!\"\n\nbranch-rb.*:build_batch_commands:\n- \"echo Release branch!\"\n```\n\n# Development #\n\nCreate a virtual environment and install it in development mode:\n\n```console\n$ python -m virtualenv .env36\n$ source .env36/bin/activate\n$ pip install -e .[testing]\n```\n\nRun tests:\n\n```console\n$ pytest src\n```\n\n## Deploy to PyPI ##\n\nJobs done can be deployed to PyPI. Open a PR updating the CHANGELOG and after it passes, push a tag to the repository;\nTravis will see the tag and publish the package to PyPI automatically.\n\n# All options #\n\n### additional_repositories ###\n\nAdditional repositories to be checked out in this job.\n\nThe repository where this .jobs_done file is included by default.\n\nRequires [Multiple SCMs Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Multiple+SCMs+Plugin) and [Git Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Git+Plugin).\n\nUses same options as `git`.\n\n```yaml\nadditional_repositories:\n- git:\n url: \"https://project.git\"\n branch: \"{branch}\"\n```\n\n### auth_token ###\n\nJob authentication token required to triggers builds remotely.\n\n```yaml\nauth_token: \"my_token\"\n```\n\n### boosttest_patterns ###\n\nList of boosttest file patterns to look for test results.\n\nRequires the [xUnit Plugin](https://wiki.jenkins-ci.org/display/JENKINS/xUnit+Plugin).\n\n```yaml\nboosttest_patterns:\n- \"*.xml\"\n```\n\n\n### branch_patterns ###\n\nList of regexes used to match branch names.\nOnly branches that match one of these will create\njobs.\n\n```yaml\nbranch_patterns:\n- \"master\"\n- \"fb-*\"\n```\n\n### build_batch_commands ###\nList of Windows batch commands used to build the job.\nIf errorcode is not 0 after any command, the build fails.\n\n```yaml\nbuild_batch_commands:\n- \"pytest src\"\n- \"echo Finished\"\n```\n\n### build_shell_commands ###\n\nList of shell commands used to build the job.\nIf errorcode is not 0 after any command, the build fails.\n\n```yaml\nbuild_shell_commands:\n- \"pytest src\"\n- \"echo Finished\"\n```\n\n### build_python_commands ###\n\nList of python commands used to build the job.\n\nRequires [Python Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Python+Plugin).\n\n```yaml\nbuild_python_commands:\n- \"print(5)\"\n```\n\n### console_color ###\n\nEnable support for ANSI escape sequences, including color, to Console Output.\n\nRequires [AnsiColor Plugin](https://wiki.jenkins-ci.org/display/JENKINS/AnsiColor+Plugin).\n\nAccepted values: \n* `xterm` (default)\n* `vga`\n* `css`\n* `gnome-terminal`\n\n```yaml\nconsole_color: \"css\"\n```\n\n### coverage ###\n\n\nEnables code coverage report.\n\nRequire [Cobertura Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Cobertura+Plugin).\n\nOptions:\n\n* `report_pattern`: mandatory, pattern where XML coverage files are searched. These XML files are usually in\n [Cobertura](http://cobertura.github.io/cobertura) format, which is also format by \n [pytest-cov](https://pypi.python.org/pypi/pytest-cov) XML output (because pytest-cov uses coverage library).\n* `healthy`: optional, specifies desired method, line and conditional metric. Any omitted metric defaults to `80`.\n* `unhealthy`: optional, specifies desired method, line and conditional metric. Any omitted metric defaults to `0`. Builds below these thresholds are marked as unhealthy.\n* `failing`: optional, specifies desired method, line and conditional metric. Any omitted metric defaults to `0`. Builds below these thresholds are marked as failed.\n\n```yaml\ncoverage:\n report_pattern: \"**/build/coverage/*.xml\"\n healthy:\n method: 100\n line: 100\n conditional: 90\n unhealthy:\n method: 95\n line: 95\n conditional: 85\n failing:\n method: 90\n line: 90\n conditional: 80\n```\n\n### cron ###\n\nSchedules to build to run periodically.\n\n```yaml\ncron: |\n # Everyday at 22pm\n * 22 * * *\n```\n\n### custom_workspace ###\n\nDefines a custom workspace directory for the job. To maintain the same base directory as the default workspace directories prefix it with `\"workspace/\"`.\n\n```yaml\ncustom_workspace: \"workspace/devspace-user\"\n```\n\n### description_regex ###\n\nRegular expression for searching job output for a description.\nIf a match is found, the contents of the first group will be set as the description.\n\nRequires [Description Setter Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Description+Setter+Plugin).\n\n```yaml\ndescription_regex: \"OUTPUT: (.*)\"\n```\n\n### display_name ###\n\nConfigures the display name of the job.\n\n```yaml\ndisplay_name: \"{branch} {name}\"\n```\n\n### email_notification ###\n\nSends emails for failed builds.\n\n```yaml\nemail_notification: \"email1@example.com email2@example.com\"\n\n# or\n\nemail_notification:\n recipients: \"email1@example.com email2@example.com\" \n notify_every_build: true\n notify_individuals: true\n```\n\n### exclude ###\n\nExcludes a job from the matrix.\n\n```yaml\nplatform-linux64:exclude: \"yes\"\n```\n\n### git ###\n\nAdditional git options for the main project.\n\nRequires [Git Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Git+Plugin).\n\nOptions available here are shared with `additional_repositories`.\n\n```yaml\ngit: \n target_dir: \"\"\n recursive_submodules: \"true\"\n reference: \"/path/to/ref_repos\"\n```\n\n### jsunit_patterns ###\n\nList of jsunit file patterns to look for test results.\n\nRequires [JSUnit Plugin](https://wiki.jenkins-ci.org/display/JENKINS/JSUnit+plugin).\n\n```yaml\njsunit_patterns:\n- \"*.xml\"\n```\n\n### junit_patterns ###\n\nList of junit file patterns to look for test results.\n\nRequires [xUnit Plugin](https://wiki.jenkins-ci.org/display/JENKINS/xUnit+Plugin).\n\n```yaml\njunit_patterns:\n- \"*.xml\"\n```\n\n### label_expression ###\n\nConfigures the label expression of the job.\n\nThe label-expression is used to determine which workers can run the job.\n\n```yaml\nlabel_expression: \"{platform}\"\n```\n\n### matrix ###\n\nConfigures variations of a job.\n\n```yaml\nmatrix:\n python:\n - \"27\"\n - \"36\"\n```\n\n### notify_stash ###\n\nNotifies a Stash instance when the build passes.\n\nWhen no parameters are given, uses configurations set in the Jenkins instance.\n\nRequires [StashNotifier Plugin](https://wiki.jenkins-ci.org/display/JENKINS/StashNotifier+Plugin).\n\n```yaml\nnotify_stash:\n url: \"example.com/stash\"\n username: \"user\"\n password: \"pass\"\n\n# Using default from Jenkins\nnotify_stash: \n```\n\n### parameters ###\n\nJob parameters for Jenkins jobs.\n\nCurrently, only `choice` and `string` are implemented.\n\n```yaml\nparameters:\n - choice:\n name: \"PARAM_BIRD\"\n choices:\n - \"African\"\n - \"European\"\n description: \"Area where the bird is from\"\n - string:\n name: \"PARAM_VERSION\"\n default: \"dev\"\n description: \"App version\"\n```\n\n### scm_poll ###\n\nSchedules to periodically poll SCM for changes, and trigger builds.\n\n```yaml\nscm_poll: |\n # Everyday at 22pm\n * 22 * * *\n```\n\n### slack ###\n\nConfigure notification with slack.\n\n1. Configure your Jenkins integration on Slack\n2. Obtain the token\n3. Configure your job to notify slack using this option.\n\n```yaml\nslack:\n team: esss\n channel: dev\n token: XXX\n url: https://example.com/jenkins\n```\n\n### timeout ###\n\nJob timeout in minutes.\n\n```yaml\ntimeout: 60\n```\n\n### timestamps ###\n\nShow timestamps on the left side of the console output. \n\nRequires the [Timestamper Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Timestamper).\n\n```yaml\ntimestamps:\n```\n\n### trigger_jobs ###\n\nTrigger other jobs after the current job finishes. Parameters are optional.\n\n```yaml\ntrigger_jobs:\n names:\n - myrepo-{branch}-synthetic-{platform}\n condition: SUCCESS # can be one of: SUCCESS, UNSTABLE, FAILED, ALWAYS. Defaults to SUCCESS.\n parameters: # optional\n - PARAM1=VALUE1\n - PARAM2=VALUE2\n```\n\n### warnings ###\n\nConfigures parsing of warnings and static analysis in a CI job.\n\nRequires [Warnings Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Warnings+Plugin).\n\n```yaml\nwarnings:\n console:\n - parser: Clang (LLCM based)\n - parser: PyLint\n file:\n - parser: CppLint\n file_pattern: *.cpplint\n - parser: CodeAnalysis\n file_pattern: *.codeanalysis\n```\n\n### auto-updater ###\n\nThis option is not used by jobs_done. It's used by Auto-Updater (aka Marvin from tHGttG) to obtain infos about the repository such as default branch, jobs to run and pull request reviewers. Note that ``Jobs Done`` doesn't really use this entry, it is present here just because the schema is fully validated.\n\n```yaml\nauto-updater:\n default-branch: \"master\"\n jobs:\n - \"*-linux64\"\n - \"*-win64\"\n\n pull-request-reviewers:\n - \"jo\u00e3o\"\n - \"marcelo\"\n - \"teodoro\"\n```\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/ESSS/jobs_done10", "keywords": "jenkins continuous integration ci jobs job build", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "jobs-done10", "package_url": "https://pypi.org/project/jobs-done10/", "platform": "", "project_url": "https://pypi.org/project/jobs-done10/", "project_urls": { "Homepage": "https://github.com/ESSS/jobs_done10" }, "release_url": "https://pypi.org/project/jobs-done10/1.2.0/", "requires_dist": [ "click", "flask", "mailer", "pygments", "python-dotenv", "python-jenkins", "pyyaml", "requests-mock", "pytest ; extra == 'testing'", "pytest-mock ; extra == 'testing'" ], "requires_python": "", "summary": "Job's Done uses a .jobs_done.yaml file in your repository to create Continuous Integration jobs on Jenkins.", "version": "1.2.0" }, "last_serial": 5816060, "releases": { "1.0.2": [ { "comment_text": "", "digests": { "md5": "a927c5749c0612dd9ebcc4c7f6eb1ea1", "sha256": "eb348f8a983ced99506f4adc0b49f139e222b9f6bc7054a32f6a9143854f1fe4" }, "downloads": -1, "filename": "jobs_done10-1.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "a927c5749c0612dd9ebcc4c7f6eb1ea1", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 50480, "upload_time": "2018-06-26T11:24:07", "url": "https://files.pythonhosted.org/packages/ab/96/f3bb4749098a0bda8936ef41ceecde7bb376ad56cbc918b183e3b091f13e/jobs_done10-1.0.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1a25c53599aedfb06e97006b2fb9e34f", "sha256": "23ebb37b6c75e8c7e74bba0c346a040c7bfffb0b2bd06bc7f0c2db9b5979cb27" }, "downloads": -1, "filename": "jobs_done10-1.0.2.tar.gz", "has_sig": false, "md5_digest": "1a25c53599aedfb06e97006b2fb9e34f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 51524, "upload_time": "2018-06-26T11:24:08", "url": "https://files.pythonhosted.org/packages/ae/e0/8d7f404ad39c24b54f5c8c59748fb0d209bb9eb62c5d2abb205eabdb4d54/jobs_done10-1.0.2.tar.gz" } ], "1.0.4": [ { "comment_text": "", "digests": { "md5": "011096a0d4784e5cf4ea3e9afe8f626b", "sha256": "01e4e71b27f7e8cfc74017ccff91d3bb9d4c4a30a90d6a7e533f3c74cbc41d5c" }, "downloads": -1, "filename": "jobs_done10-1.0.4-py3-none-any.whl", "has_sig": false, "md5_digest": "011096a0d4784e5cf4ea3e9afe8f626b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 55250, "upload_time": "2018-06-26T11:43:11", "url": "https://files.pythonhosted.org/packages/f3/01/749798ebf8f570ad43761b7a584eb93ec9c5237439ea501c12c55d3cf420/jobs_done10-1.0.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "086b1f1029c800993fcb379ccebde56d", "sha256": "2caf9febf539bbd8e8252d286e4b745a12c0f864e212779294ac8356daeca45f" }, "downloads": -1, "filename": "jobs_done10-1.0.4.tar.gz", "has_sig": false, "md5_digest": "086b1f1029c800993fcb379ccebde56d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 57738, "upload_time": "2018-06-26T11:43:12", "url": "https://files.pythonhosted.org/packages/4b/77/31c04e71302c4252d5db8e54c082dad864424e8367b38ff277e9d4188ca4/jobs_done10-1.0.4.tar.gz" } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "f2d21860c5970d2bd2552591baf2b8a7", "sha256": "fac1977b3932c8b7f9a7f935291e1f6b97154c18d1e79de9f2d414cb84354304" }, "downloads": -1, "filename": "jobs_done10-1.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "f2d21860c5970d2bd2552591baf2b8a7", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 55717, "upload_time": "2018-06-27T11:50:54", "url": "https://files.pythonhosted.org/packages/61/ec/6c986654b9c24e44d87dbb2480057811d30e9e1697546f9cc89b044f77c7/jobs_done10-1.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e123085e12d72dfca7809c9af9ec24aa", "sha256": "a2e67a09ac500c19574e1a9c438620b3378ab73480fbd650555da27369b282c7" }, "downloads": -1, "filename": "jobs_done10-1.1.0.tar.gz", "has_sig": false, "md5_digest": "e123085e12d72dfca7809c9af9ec24aa", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 58629, "upload_time": "2018-06-27T11:50:55", "url": "https://files.pythonhosted.org/packages/43/cd/cada5c1cff62db9cb347de1acef0031786aea379d754ce46e11b51ff3ef7/jobs_done10-1.1.0.tar.gz" } ], "1.1.1": [ { "comment_text": "", "digests": { "md5": "6637ec689f54d80f0739fe0840e2ded8", "sha256": "aadd9a9508b5882bf617ed7f6fb0807d8e619d0382769a3e19de39930060e7af" }, "downloads": -1, "filename": "jobs_done10-1.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "6637ec689f54d80f0739fe0840e2ded8", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 55760, "upload_time": "2018-09-01T01:16:46", "url": "https://files.pythonhosted.org/packages/9a/fe/f357b42e05d185e4e4fb4278375ce603880e2ac85b5a38398d80f57c7e84/jobs_done10-1.1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6be4991e223070d877ccf0263a96ac52", "sha256": "3712b9da1fa8c71e4e946184503529a1d1b4529beb46b0b96080a81f69ca3e5f" }, "downloads": -1, "filename": "jobs_done10-1.1.1.tar.gz", "has_sig": false, "md5_digest": "6be4991e223070d877ccf0263a96ac52", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 58780, "upload_time": "2018-09-01T01:16:48", "url": "https://files.pythonhosted.org/packages/b5/97/3659b5740de0ab0268a20c73daefdc10b969422af947f96fbaf3341303ac/jobs_done10-1.1.1.tar.gz" } ], "1.2.0": [ { "comment_text": "", "digests": { "md5": "6b02f8c4b8d9ad9f2d19a71fda038f10", "sha256": "553a95f894acd15f917ec6d4a5ae4cf9f412d71149658acfb7c032899bc1d656" }, "downloads": -1, "filename": "jobs_done10-1.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "6b02f8c4b8d9ad9f2d19a71fda038f10", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 57538, "upload_time": "2019-09-11T17:08:12", "url": "https://files.pythonhosted.org/packages/d2/5c/493cb213868c2fa25ed4e7c5d852a2a6183b586954a3a09f47915d7c6fa5/jobs_done10-1.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2b0f0093c693ac2c4946e6cc8efea795", "sha256": "6f454412abde0e070712238ff1f2db1c93f94453cfad8240a14bd8a924b6b82d" }, "downloads": -1, "filename": "jobs_done10-1.2.0.tar.gz", "has_sig": false, "md5_digest": "2b0f0093c693ac2c4946e6cc8efea795", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 56642, "upload_time": "2019-09-11T17:08:14", "url": "https://files.pythonhosted.org/packages/d5/f5/1ed39377bf8e56bc89740273782fb9898950c518a7e0641e33c738079783/jobs_done10-1.2.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "6b02f8c4b8d9ad9f2d19a71fda038f10", "sha256": "553a95f894acd15f917ec6d4a5ae4cf9f412d71149658acfb7c032899bc1d656" }, "downloads": -1, "filename": "jobs_done10-1.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "6b02f8c4b8d9ad9f2d19a71fda038f10", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 57538, "upload_time": "2019-09-11T17:08:12", "url": "https://files.pythonhosted.org/packages/d2/5c/493cb213868c2fa25ed4e7c5d852a2a6183b586954a3a09f47915d7c6fa5/jobs_done10-1.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2b0f0093c693ac2c4946e6cc8efea795", "sha256": "6f454412abde0e070712238ff1f2db1c93f94453cfad8240a14bd8a924b6b82d" }, "downloads": -1, "filename": "jobs_done10-1.2.0.tar.gz", "has_sig": false, "md5_digest": "2b0f0093c693ac2c4946e6cc8efea795", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 56642, "upload_time": "2019-09-11T17:08:14", "url": "https://files.pythonhosted.org/packages/d5/f5/1ed39377bf8e56bc89740273782fb9898950c518a7e0641e33c738079783/jobs_done10-1.2.0.tar.gz" } ] }