{ "info": { "author": "Robert Kaussow", "author_email": "mail@geeklabor.de", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Environment :: Console", "Intended Audience :: Developers", "Intended Audience :: Information Technology", "Intended Audience :: System Administrators", "License :: OSI Approved :: MIT License", "Natural Language :: English", "Operating System :: POSIX", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Topic :: Utilities" ], "description": "# ansible-later\n\n[![Build Status](https://cloud.drone.io/api/badges/xoxys/ansible-later/status.svg)](https://cloud.drone.io/xoxys/ansible-later)\n[![](https://img.shields.io/pypi/pyversions/ansible-later.svg)](https://pypi.org/project/ansible-later/)\n[![](https://img.shields.io/pypi/status/ansible-later.svg)](https://pypi.org/project/ansible-later/)\n[![](https://img.shields.io/pypi/v/ansible-later.svg)](https://pypi.org/project/ansible-later/)\n[![codecov](https://codecov.io/gh/xoxys/ansible-later/branch/master/graph/badge.svg)](https://codecov.io/gh/xoxys/ansible-later)\n\nThis is a fork of Will Thames [ansible-review](https://github.com/willthames/ansible-review) so credits goes to him\nfor his work on ansible-review and ansible-lint.\n\n`ansible-later` is a best pratice scanner and linting tool. In most cases, if you write ansibel roles in a team,\nit helps to have a coding or best practice guideline in place. This will make ansible roles more readable for all\nmaintainers and can reduce the troubleshooting time.\n\n`ansible-later` does _**not**_ ensure that your role will work as expected. For Deployment test you can use other tools\nlike [molecule](https://github.com/ansible/molecule).\n\nThe project name is an acronym for **L**ovely **A**utomation **TE**sting f**R**mework.\n\n## Table of Content\n\n- [Setup](#setup)\n - [Using pip](#using-pip)\n - [From source](#from-source)\n- [Configuration](#configuration)\n - [Default settings](#default-settings)\n - [CLI Options](#cli-options)\n- [Usage](#usage)\n- [Buildin rules](#buildin-rules)\n- [Build your own rules](#build-your-own-rules)\n - [The standards file](#the-standards-file)\n - [Candidates](#candidates)\n - [Minimal standards checks](#minimal-standards-checks)\n- [License](#license)\n- [Maintainers and Contributors](#maintainers-and-contributors)\n\n---\n\n### Setup\n\n#### Using pip\n\n```Shell\n# From internal pip repo as user\npip install ansible-later --user\n\n# .. or as root\nsudo pip install ansible-later\n```\n\n#### From source\n\n```Shell\n# Install dependency\ngit clone https://github.com/xoxys/ansible-later\nexport PYTHONPATH=$PYTHONPATH:`pwd`/ansible-later/ansiblelater\nexport PATH=$PATH:`pwd`/ansible-later/bin\n```\n\n### Configuration\n\nansible-later comes with some default settigs which should be sufficent for most users to start,\nbut you can adjust most settings to your needs.\n\nChanges can be made in a yaml configuration file or through cli options\nwhich will be processed in the following order (last wins):\n\n- default config (build-in)\n- global config file (this will depend on your operating system)\n- folderbased config file (`.later.yml` file in current working folder)\n- cli options\n\nBe careful! YAML Attributes will be overwritten while lists in any\nconfig file will be merged.\n\nTo make it easier to review a singel file e.g. for debugging purpose, amsible-later\nwill ignore `exclude_files` and `ignore_dotfiles` options.\n\n#### Default settings\n\n```YAML\n---\nansible:\n # Add the name of used custom ansible modules.\n # Otherwise ansible-later can't detect unknown modules\n # and will through an error.\n custom_modules: []\n # Settings for variable formatting rule (ANSIBLE0004)\n double-braces:\n max-spaces-inside: 1\n min-spaces-inside: 1\n\n# Global logging configuration\n# If you would like to force colored output (e.g. non-tty)\n# set emvironment variable `PY_COLORS=1`\nlogging:\n # You can enable json logging if a parsable output is required\n json: False\n # Possible options debug | info | warning | error | critical\n level: \"warning\"\n\n# Global settings for all defined rules\nrules:\n # list of files to exclude\n exclude_files: []\n # Examples:\n # - molecule/\n # - files/**/*.py\n\n # Limit checks to given rule ID's\n # If empty all rules will be used.\n filter: []\n\n # Exclude given rule ID's from checks\n exclude_filter: []\n\n # All dotfiles (including hidden folders) are excluded by default.\n # You can disable this setting and handle dotfiles by yourself with `exclude_files`.\n ignore_dotfiles: True\n # Path to the folder containing your custom standards file\n standards: ansiblelater/data\n\n# Block to control included yamlllint rules.\n# See https://yamllint.readthedocs.io/en/stable/rules.html\nyamllint:\n colons:\n max-spaces-after: 1\n max-spaces-before: 0\n document-start:\n present: True\n empty-lines:\n max: 1\n max-end: 1\n max-start: 0\n hyphens:\n max-spaces-after: 1\n indentation:\n check-multi-line-strings: False\n indent-sequences: True\n spaces: 2\n```\n\n#### CLI Options\n\nYou can get all available cli options by running `ansible-later --help`:\n\n```Shell\n$ ansible-later --help\nusage: ansible-later [-h] [-c CONFIG_FILE] [-r RULES.STANDARDS]\n [-s RULES.FILTER] [-v] [-q] [--version]\n [rules.files [rules.files ...]]\n\nValidate ansible files against best pratice guideline\n\npositional arguments:\n rules.files\n\noptional arguments:\n -h, --help show this help message and exit\n -c CONFIG_FILE, --config CONFIG_FILE\n location of configuration file\n -r RULES.STANDARDS, --rules RULES.STANDARDS\n location of standards rules\n -s RULES.FILTER, --standards RULES.FILTER\n limit standards to given ID's\n -x RULES.EXCLUDE_FILTER, --exclude-standards RULES.EXCLUDE_FILTER\n exclude standards by given ID's\n -v increase log level\n -q decrease log level\n --version show program's version number and exit\n```\n\n### Usage\n\n```Shell\nansible-later FILES\n```\n\nIf you don't pass any file to ansible-later it will review all files including subdirs in\nthe current working directory (hidden files and folders are excluded by default).\n\nOtherwise you can pass a space delimited list of files to review. You can also pass glob\npatterns to ansible-later:\n\n```Shell\n# Review single files\nansible-later meta/main.yml tasks/install.yml\n\n# Review all yml files (including subfolders)\nansible-later **/*.yml\n```\n\nansible-later will review inventory files, role files, python code (modules, plugins)\nand playbooks.\n\n- The goal is that each file that changes in a\n changeset should be reviewable simply by passing\n those files as the arguments to ansible-later.\n- Using `{{ playbook_dir }}` in sub roles is so far\n very hard.\n- This should work against various repository styles\n - per-role repository\n - roles with sub-roles\n - per-playbook repository\n- It should work with roles requirement files and with local roles\n\n### Buildin rules\n\nReviews are nothing without some rules or standards against which to review. ansible-later\ncomes with a couple of built-in checks explained in the following table.\n\n| Rule | ID | Description | Parameter |\n|---------------------------------|-------------|-------------------------------------------------------------------|----------------------------------------------------------------------|\n| check_yaml_empty_lines | LINT0001 | YAML should not contain unnecessarily empty lines. | {max: 1, max-start: 0, max-end: 1} |\n| check_yaml_indent | LINT0002 | YAML should be correctly indented. | {spaces: 2, check-multi-line-strings: false, indent-sequences: true} |\n| check_yaml_hyphens | LINT0003 | YAML should use consitent number of spaces after hyphens (-). | {max-spaces-after: 1} |\n| check_yaml_document_start | LINT0004 | YAML should contain document start marker. | {document-start: {present: true}} |\n| check_yaml_colons | LINT0005 | YAML should use consitent number of spaces around colons. | {colons: {max-spaces-before: 0, max-spaces-after: 1}} |\n| check_yaml_file | LINT0006 | Roles file should be in yaml format. | |\n| check_yaml_has_content | LINT0007 | Files should contain useful content. | |\n| check_native_yaml | LINT0008 | Use YAML format for tasks and handlers rather than key=value. | |\n| check_line_between_tasks | ANSIBLE0001 | Single tasks should be separated by an empty line. | |\n| check_meta_main | ANSIBLE0002 | Meta file should contain a basic subset of parameters. | author, description, min_ansible_version, platforms, dependencies |\n| check_unique_named_task | ANSIBLE0003 | Tasks and handlers must be uniquely named within a file. | |\n| check_braces | ANSIBLE0004 | YAML should use consitent number of spaces around variables. | |\n| check_scm_in_src | ANSIBLE0005 | Use scm key rather than src: scm+url in requirements file. | |\n| check_named_task | ANSIBLE0006 | Tasks and handlers must be named. | excludes: meta, debug, include\\_\\*, import\\_\\*, block |\n| check_name_format | ANSIBLE0007 | Name of tasks and handlers must be formatted. | formats: first letter capital |\n| check_command_instead_of_module | ANSIBLE0008 | Commands should not be used in place of modules. | |\n| check_install_use_latest | ANSIBLE0009 | Package managers should not install with state=latest. | |\n| check_shell_instead_command | ANSIBLE0010 | Use Shell only when piping, redirecting or chaining commands. | |\n| check_command_has_changes | ANSIBLE0011 | Commands should be idempotent and only used with some checks. | |\n| check_empty_string_compare | ANSIBLE0012 | Don't compare to \"\" - use `when: var` or `when: not var`. | |\n| check_compare_to_literal_bool | ANSIBLE0013 | Don't compare to True/False - use `when: var` or `when: not var`. | |\n| check_literal_bool_format | ANSIBLE0014 | Literal bools should be written as `True/False` or `yes/no`. | forbidden values are `true false TRUE FALSE Yes No YES NO` |\n| check_become_user | ANSIBLE0015 | `become` should be always used combined with `become_user`. | |\n| check_filter_separation | ANSIBLE0016 | Jinja2 filters should be separated with spaces. | |\n\n### Build your own rules\n\n#### The standards file\n\nA standards file comprises a list of standards, and optionally some methods to\ncheck those standards.\n\nCreate a file called standards.py (this can import other modules)\n\n```Python\nfrom ansiblelater include Standard, Result\n\ntasks_are_uniquely_named = Standard(dict(\n # ID's are optional but if you use ID's they have to be unique\n id=\"ANSIBLE0003\",\n # Short description of the standard goal\n name=\"Tasks and handlers must be uniquely named within a single file\",\n check=check_unique_named_task,\n version=\"0.1\",\n types=[\"playbook\", \"task\", \"handler\"],\n))\n\nstandards = [\n tasks_are_uniquely_named,\n role_must_contain_meta_main,\n]\n```\n\nWhen you add new standards, you should increment the version of your standards.\nYour playbooks and roles should declare what version of standards you are\nusing, otherwise ansible-later assumes you're using the latest. The declaration\nis done by adding standards version as first line in the file. e.g.\n\n```INI\n# Standards: 1.2\n```\n\nTo add standards that are advisory, don't set the version. These will cause\na message to be displayed but won't constitute a failure.\n\nWhen a standard version is higher than declared version, a message will be\ndisplayed 'WARN: Future standard' and won't constitute a failure.\n\nAn example standards file is available at\n[ansiblelater/examples/standards.py](ansiblelater/examples/standards.py)\n\nIf you only want to check one or two standards quickly (perhaps you want\nto review your entire code base for deprecated bare words), you can use the\n`-s` flag with the name of your standard. You can pass `-s` multiple times.\n\n```Shell\ngit ls-files | xargs ansible-later -s \"bare words are deprecated for with_items\"\n```\n\nYou can see the name of the standards being checked for each different file by running\n`ansible-later` with the `-v` option.\n\n#### Candidates\n\nEach file passed to `ansible-later` will be classified. The result is a `Candidate` object\nwhich contains some meta informations and is an instance of one of following object types.\n\n| Object type | Description |\n|-------------|------------------------------------------------------------------------------------------------------------------------------|\n| Task | all files within the parent dir `tasks` |\n| Handler | all files within the parent dir `handler` |\n| RoleVars | all files within the parent dir `vars` or `default` |\n| GroupVars | all files (including subdirs) within the parent dir `group_vars` |\n| HostVars | all files (including subdirs) within the parent dir `host_vars` |\n| Meta | all files within the parent dir `meta` |\n| Code | all files within the parent dir `library`, `lookup_plugins`, `callback_plugins` and `filter_plugins` or python files (`.py`) |\n| Inventory | all files within the parent dir `inventories` and `inventory` or `hosts` as filename |\n| Rolesfile | all files with `rolesfile` or `requirements` in filename |\n| Makefile | all files with `Makefile` in filename |\n| Template | all files (including subdirs) within the parent dir `templates` or jinja2 files (`.j2`) |\n| File | all files (including subdirs) within the parent dir `files` |\n| Playbook | all yaml files (`.yml` or `.yaml`) not maching a previous object type |\n| Doc | all files with `README` in filename |\n\n#### Minimal standards checks\n\nA typical standards check will look like:\n\n```Python\ndef check_playbook_for_something(candidate, settings):\n result = Result(candidate.path) # empty result is a success with no output\n with open(candidate.path, 'r') as f:\n for (lineno, line) in enumerate(f):\n if line is dodgy:\n # enumerate is 0-based so add 1 to lineno\n result.errors.append(Error(lineno+1, \"Line is dodgy: reasons\"))\n return result\n```\n\nAll standards check take a candidate object, which has a path attribute.\nThe type can be inferred from the class name (i.e. `type(candidate).__name__`)\nor from the table [here](#candidates).\n\nThey return a `Result` object, which contains a possibly empty list of `Error`\nobjects. `Error` objects are formed of a line number and a message. If the\nerror applies to the whole file being reviewed, set the line number to `None`.\nLine numbers are important as `ansible-later` can review just ranges of files\nto only review changes (e.g. through piping the output of `git diff` to\n`ansible-later`).\n\n### License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n\n### Maintainers and Contributors\n\n[Robert Kaussow](https://github.com/xoxys)\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/xoxys/ansible-later", "keywords": "ansible code review", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "ansible-later", "package_url": "https://pypi.org/project/ansible-later/", "platform": "", "project_url": "https://pypi.org/project/ansible-later/", "project_urls": { "Homepage": "https://github.com/xoxys/ansible-later" }, "release_url": "https://pypi.org/project/ansible-later/0.2.7/", "requires_dist": [ "ansible", "six", "pyyaml", "appdirs", "unidiff", "flake8", "yamllint", "nested-lookup", "colorama", "anyconfig", "python-json-logger", "jsonschema", "pathspec", "toolz" ], "requires_python": ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,,!=3.4.*", "summary": "Reviews ansible playbooks, roles and inventories and suggests improvements.", "version": "0.2.7" }, "last_serial": 5430132, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "c3bbbf398f96586178511895eb5d987e", "sha256": "817477723c45a0d54ed81a806de8eb3a69fe7883a0bf4120c0b35dd841fe503f" }, "downloads": -1, "filename": "ansible_later-0.1.0-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "c3bbbf398f96586178511895eb5d987e", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,,!=3.4.*", "size": 25499, "upload_time": "2018-12-19T13:06:33", "url": "https://files.pythonhosted.org/packages/21/36/a7e97a93e7e16a0c71d9acfadb76a052129932f3bf9968186fce1d453f6c/ansible_later-0.1.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "299a109d5cc18dc8709c3f0ee0adee26", "sha256": "6f3929705e0cc22e0111917c50d5093d53f9fae512266da73311f89c1de0bf74" }, "downloads": -1, "filename": "ansible-later-0.1.0.tar.gz", "has_sig": true, "md5_digest": "299a109d5cc18dc8709c3f0ee0adee26", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,,!=3.4.*", "size": 23554, "upload_time": "2018-12-19T13:06:35", "url": "https://files.pythonhosted.org/packages/51/2f/72412b30a97cba1fce8548134f3b22ffffd577f5062a3523e6b283e6c149/ansible-later-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "4b194e63855c216e73faf4d1941c8ae0", "sha256": "43f2c7322eecf3a8987583d4baff35a87d3ef0a672a1fce5cb7cbb8d5bc47433" }, "downloads": -1, "filename": "ansible_later-0.1.1-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "4b194e63855c216e73faf4d1941c8ae0", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,,!=3.4.*", "size": 25510, "upload_time": "2019-01-08T22:18:21", "url": "https://files.pythonhosted.org/packages/27/ff/80b7ef5fd94c9133c53282ded1ccc8af8e4ead6eb5a661b822657db38822/ansible_later-0.1.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ad23d6912580da21577debde44d07ae3", "sha256": "3bc3e12aacd73edeb8d100781d0d2fb67fef22887b37398f92b8b699dee84496" }, "downloads": -1, "filename": "ansible-later-0.1.1.tar.gz", "has_sig": true, "md5_digest": "ad23d6912580da21577debde44d07ae3", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,,!=3.4.*", "size": 23586, "upload_time": "2019-01-08T22:18:23", "url": "https://files.pythonhosted.org/packages/3a/9e/09174784044815e85789eae4cb383804910796808ca62e61fa5d40fe92f6/ansible-later-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "199a243ca216227f0564df0073601a17", "sha256": "3ca15f109b655c4e0eaa6562202e1edf83a054bea4777796308efb3909b33cc7" }, "downloads": -1, "filename": "ansible_later-0.1.2-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "199a243ca216227f0564df0073601a17", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,,!=3.4.*", "size": 26337, "upload_time": "2019-01-30T09:38:53", "url": "https://files.pythonhosted.org/packages/60/67/eed574af9ad3de0e143037a3b9911ac14ecd19ff78124a77c4ab0a771f72/ansible_later-0.1.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f06f792a508de9941e73987ea142e593", "sha256": "09dcfc603337173f20d518b9035e2c7b3f518cf4f8cf414c63d95fb455e68303" }, "downloads": -1, "filename": "ansible-later-0.1.2.tar.gz", "has_sig": true, "md5_digest": "f06f792a508de9941e73987ea142e593", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,,!=3.4.*", "size": 24608, "upload_time": "2019-01-30T09:38:55", "url": "https://files.pythonhosted.org/packages/6e/ce/146a2f009a1628917a9dd9a4b6634fcb17b050dddb9632d629a63123a1f5/ansible-later-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "d38e3aa2ca4a415c201f9eab424fd22c", "sha256": "2d6ec8921cebf0ffb1079a4aded0b2f3da48518d48d33d79a3c03a28f326d454" }, "downloads": -1, "filename": "ansible_later-0.1.3-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "d38e3aa2ca4a415c201f9eab424fd22c", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,,!=3.4.*", "size": 26310, "upload_time": "2019-01-30T10:52:22", "url": "https://files.pythonhosted.org/packages/85/1d/8ce1b456d44eb0c004d00660f0e6196ad35a916add4a4ae38abc1a68ce70/ansible_later-0.1.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "fbeb129a5cb68363ada95c20aa69b642", "sha256": "fab6a2155f1c3262aa1d9c4402a10d917838ddfbe5e887481589ac3a70b3c5de" }, "downloads": -1, "filename": "ansible-later-0.1.3.tar.gz", "has_sig": true, "md5_digest": "fbeb129a5cb68363ada95c20aa69b642", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,,!=3.4.*", "size": 24559, "upload_time": "2019-01-30T10:52:24", "url": "https://files.pythonhosted.org/packages/bd/00/781c69d0ae1f2fe437390007bb04a33f9181d9c6edfedc016709104a7bb3/ansible-later-0.1.3.tar.gz" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "c6b17116bdd9334e5ce948a2f0124aa8", "sha256": "58055e27b6526470df183ff7db08f6e343881b3774a57b69ec9a348390819613" }, "downloads": -1, "filename": "ansible_later-0.1.4-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "c6b17116bdd9334e5ce948a2f0124aa8", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,,!=3.4.*", "size": 26446, "upload_time": "2019-02-19T10:21:23", "url": "https://files.pythonhosted.org/packages/e3/38/7cc428f892d04194dded8105d9ead62ce06b0223a7a54da786028f988a7d/ansible_later-0.1.4-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a989ed1403e9e3a57d3565d68da566ab", "sha256": "d7844f92eea43d7d67e7445c95ecbef55db181c43ab2568f7bedeeb9855ad817" }, "downloads": -1, "filename": "ansible-later-0.1.4.tar.gz", "has_sig": true, "md5_digest": "a989ed1403e9e3a57d3565d68da566ab", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,,!=3.4.*", "size": 24690, "upload_time": "2019-02-19T10:21:25", "url": "https://files.pythonhosted.org/packages/d0/6a/5a73d1d0a3216264d08e3c9d2401a51899ee5c07269bf955b157809d8fa6/ansible-later-0.1.4.tar.gz" } ], "0.1.5": [ { "comment_text": "", "digests": { "md5": "2d028ef0bb2e575046195c11098197e1", "sha256": "2be2b348c04b10eef3b5a47e33579961fcdce5dc82e85a8958680132a5a87ddf" }, "downloads": -1, "filename": "ansible_later-0.1.5-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "2d028ef0bb2e575046195c11098197e1", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,,!=3.4.*", "size": 26639, "upload_time": "2019-03-25T10:34:49", "url": "https://files.pythonhosted.org/packages/4c/5a/24001b293069ed035df4c405d2b957ce3b86393a9f16b93e758d9421c931/ansible_later-0.1.5-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "71361b4f778e66d8d871ffb92b4ec468", "sha256": "4dc4517369f480c0d35c0d1085b632dee06b4db0b7a6bc1359f17184b9ee8eda" }, "downloads": -1, "filename": "ansible-later-0.1.5.tar.gz", "has_sig": true, "md5_digest": "71361b4f778e66d8d871ffb92b4ec468", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,,!=3.4.*", "size": 24863, "upload_time": "2019-03-25T10:34:50", "url": "https://files.pythonhosted.org/packages/56/8a/4fe547a9dfead90586d28cc1cc170cec357e4639fdb908a3cba20955b27b/ansible-later-0.1.5.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "b85c1996237bfaad0e53f0464ac26af7", "sha256": "7bb23443e3be9f435707c5c74bfd63cca9441a65af4cfcb090ab307a48f0a99b" }, "downloads": -1, "filename": "ansible_later-0.2.0-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "b85c1996237bfaad0e53f0464ac26af7", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,,!=3.4.*", "size": 31123, "upload_time": "2019-04-15T10:45:37", "url": "https://files.pythonhosted.org/packages/f0/36/4a37b82c291c182e82cf23bcdafe1e1c18c49851ab63b5602c4391155d60/ansible_later-0.2.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5735db6f8b5b86e0049085c251ac032d", "sha256": "54ebc1fe178443e5024ebf9f687a6f1203eb6b09f4a2a6df8bd929370acbb51d" }, "downloads": -1, "filename": "ansible-later-0.2.0.tar.gz", "has_sig": true, "md5_digest": "5735db6f8b5b86e0049085c251ac032d", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,,!=3.4.*", "size": 28414, "upload_time": "2019-04-15T10:45:38", "url": "https://files.pythonhosted.org/packages/a2/ff/4224c833ce201703328a40c66f931c9790c8563fd36315f06847f7ada092/ansible-later-0.2.0.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "cde6b0a4d0bc9bb73037a4beff5f85be", "sha256": "7c5f1690f95c2f78fe2567711c2776a821de2af5a77a1920a480370f4d1e0a40" }, "downloads": -1, "filename": "ansible_later-0.2.1-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "cde6b0a4d0bc9bb73037a4beff5f85be", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,,!=3.4.*", "size": 31130, "upload_time": "2019-04-15T13:16:44", "url": "https://files.pythonhosted.org/packages/d7/1d/943db1a8501897c35246eaa299c541fbec6c94bc558e358af7427fb3ea20/ansible_later-0.2.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "66173f72beada20be5258f02525d9a47", "sha256": "ee73476b0bb535c48ff02b5ff9d691abdab27801bd69d6ae0887b2bd497d250b" }, "downloads": -1, "filename": "ansible-later-0.2.1.tar.gz", "has_sig": true, "md5_digest": "66173f72beada20be5258f02525d9a47", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,,!=3.4.*", "size": 28427, "upload_time": "2019-04-15T13:16:45", "url": "https://files.pythonhosted.org/packages/9b/9b/fa68d322414c7ead95816dd36bc4d93cb2a9a3d0120fb5586afe6f3111ae/ansible-later-0.2.1.tar.gz" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "64434161b729709a720ac15bcf42a312", "sha256": "cc2c8da57fcf49d4d4962e14f11075823dcc851839efb0ac36b84e50d88d92c0" }, "downloads": -1, "filename": "ansible_later-0.2.2-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "64434161b729709a720ac15bcf42a312", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,,!=3.4.*", "size": 31228, "upload_time": "2019-04-15T17:35:41", "url": "https://files.pythonhosted.org/packages/6d/3b/fa5b1c3d11d1ccb327a89f4f07fa81cbae2ad3e9d9093787f8a6f3e305af/ansible_later-0.2.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6c02824d2ea99413332b1b0bc3408803", "sha256": "b087d85ba0b70c8944150e75a3dd03f9f44a147a5c81e3320f752672e98b3ebe" }, "downloads": -1, "filename": "ansible-later-0.2.2.tar.gz", "has_sig": true, "md5_digest": "6c02824d2ea99413332b1b0bc3408803", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,,!=3.4.*", "size": 28500, "upload_time": "2019-04-15T17:35:43", "url": "https://files.pythonhosted.org/packages/8d/4b/1a0b04dffd4223fe2ecf505a29d38e83c8cb8c1a84c1c6fe83e3e6286bb2/ansible-later-0.2.2.tar.gz" } ], "0.2.3": [ { "comment_text": "", "digests": { "md5": "54ba597d6bc79d94b92677aa0a8134bf", "sha256": "1c9b8c6c0c079b4d258e6ef3602581f925e21092748d7ac4baee6a371a66eb5a" }, "downloads": -1, "filename": "ansible_later-0.2.3-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "54ba597d6bc79d94b92677aa0a8134bf", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,,!=3.4.*", "size": 31281, "upload_time": "2019-04-16T09:47:06", "url": "https://files.pythonhosted.org/packages/e8/03/342395da36c08ba32e14186b963b8d0229ac94e0be654ac1175e2a3a69d9/ansible_later-0.2.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "042751cf92d38083fe58470bb2ac1555", "sha256": "9e6e38a83132f5066e686f11f8eedb5e159daf371e7b335334f099de0d9da83f" }, "downloads": -1, "filename": "ansible-later-0.2.3.tar.gz", "has_sig": true, "md5_digest": "042751cf92d38083fe58470bb2ac1555", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,,!=3.4.*", "size": 28565, "upload_time": "2019-04-16T09:47:08", "url": "https://files.pythonhosted.org/packages/1d/57/3a252b80cbb588d8cc97371049f08861f49dbaf94d8d1cc724ae5cd929cf/ansible-later-0.2.3.tar.gz" } ], "0.2.4": [ { "comment_text": "", "digests": { "md5": "9dc4c73c1c93878e1c4d28d037e22695", "sha256": "12cab1a042c17bd67f12a8d7bd22ba27fe25df7fb4dd28765124eeb38f082845" }, "downloads": -1, "filename": "ansible_later-0.2.4-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "9dc4c73c1c93878e1c4d28d037e22695", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,,!=3.4.*", "size": 31384, "upload_time": "2019-04-17T10:53:36", "url": "https://files.pythonhosted.org/packages/f0/13/076b62262b3ee4ce6fe3188687db2a4ce0a5e79f03b23fc23537a3015ad9/ansible_later-0.2.4-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1f57f0028d1609545df87fee7ffc7e6c", "sha256": "aab742a98a8ff60bb65fd110c50d562036caf09e2f2c73531752f6de31664d77" }, "downloads": -1, "filename": "ansible-later-0.2.4.tar.gz", "has_sig": true, "md5_digest": "1f57f0028d1609545df87fee7ffc7e6c", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,,!=3.4.*", "size": 28703, "upload_time": "2019-04-17T10:53:37", "url": "https://files.pythonhosted.org/packages/4f/78/978e24a50de51aeb275f8bdbd24beec726fa99f4cce67f3406754c78790e/ansible-later-0.2.4.tar.gz" } ], "0.2.5": [ { "comment_text": "", "digests": { "md5": "328cb5a81ced4a69bf892d81228eefbb", "sha256": "985848fb9b8f6c8197380e658a0d2aefa95bfb01c549a365c27af894a4f2b77f" }, "downloads": -1, "filename": "ansible_later-0.2.5-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "328cb5a81ced4a69bf892d81228eefbb", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,,!=3.4.*", "size": 36797, "upload_time": "2019-04-23T13:05:02", "url": "https://files.pythonhosted.org/packages/f4/4c/6be2f63bb4e86eafad55e23ed59faa0b058093817f24b5e9418013689ed4/ansible_later-0.2.5-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ee847c5c0445754c25a00057f588459a", "sha256": "239d3ad6764f2942ce511ebaa9caeb3202bdf7a522deaec6a58c51999eb42ed5" }, "downloads": -1, "filename": "ansible-later-0.2.5.tar.gz", "has_sig": true, "md5_digest": "ee847c5c0445754c25a00057f588459a", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,,!=3.4.*", "size": 32428, "upload_time": "2019-04-23T13:05:03", "url": "https://files.pythonhosted.org/packages/e3/15/23df26ee7a56aefeaa7018d93f52d3c25357271f5f5f79ddd2330a56b014/ansible-later-0.2.5.tar.gz" } ], "0.2.6": [ { "comment_text": "", "digests": { "md5": "42aa1c4f92f58ee3c8afbd734e07084a", "sha256": "0d4bdfe0f262e0586003b145d7d6ed715750a02497c598629809541753bc879d" }, "downloads": -1, "filename": "ansible_later-0.2.6-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "42aa1c4f92f58ee3c8afbd734e07084a", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,,!=3.4.*", "size": 32967, "upload_time": "2019-04-25T12:53:27", "url": "https://files.pythonhosted.org/packages/3a/bc/c5a8cde06fe0dcf2dc5b0a7642ea1cfa9c503c08adb6cf03b131851c2386/ansible_later-0.2.6-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1341be26d4399a75c8f1fd799fb34b7b", "sha256": "27f521ead0a4ae15f9773030c9596d9bc76f6f8cf7f56f0fcbcb871cf9ea7020" }, "downloads": -1, "filename": "ansible-later-0.2.6.tar.gz", "has_sig": true, "md5_digest": "1341be26d4399a75c8f1fd799fb34b7b", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,,!=3.4.*", "size": 29985, "upload_time": "2019-04-25T12:53:29", "url": "https://files.pythonhosted.org/packages/4f/43/25082954d66d67a1bb2afe8d481dd4695f9941d4635c76ddc7670c5f4c73/ansible-later-0.2.6.tar.gz" } ], "0.2.7": [ { "comment_text": "", "digests": { "md5": "0b2ca3849f468c19440274f1d3f92dec", "sha256": "02bb4f120c1311d4c7d6d9cdb649252435361976c8aee02b6c337a8a45f21f7d" }, "downloads": -1, "filename": "ansible_later-0.2.7-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "0b2ca3849f468c19440274f1d3f92dec", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,,!=3.4.*", "size": 32764, "upload_time": "2019-06-21T10:18:10", "url": "https://files.pythonhosted.org/packages/f1/5c/ce5aada9d0863b6fbf0cdf90986636d12278a8457bace14a1a8ca58cc048/ansible_later-0.2.7-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ca1dd2813603fa7f8e037ef8dc0e3316", "sha256": "934e18f55d854abbbd697e02e43cd6d8f4bace10eed649b403b372f777037f4c" }, "downloads": -1, "filename": "ansible-later-0.2.7.tar.gz", "has_sig": true, "md5_digest": "ca1dd2813603fa7f8e037ef8dc0e3316", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,,!=3.4.*", "size": 29798, "upload_time": "2019-06-21T10:18:12", "url": "https://files.pythonhosted.org/packages/17/55/0d0943a3971e6a4c05a12a977df0a214f0d0b9266623ccb5d3144754b2bf/ansible-later-0.2.7.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "0b2ca3849f468c19440274f1d3f92dec", "sha256": "02bb4f120c1311d4c7d6d9cdb649252435361976c8aee02b6c337a8a45f21f7d" }, "downloads": -1, "filename": "ansible_later-0.2.7-py2.py3-none-any.whl", "has_sig": true, "md5_digest": "0b2ca3849f468c19440274f1d3f92dec", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,,!=3.4.*", "size": 32764, "upload_time": "2019-06-21T10:18:10", "url": "https://files.pythonhosted.org/packages/f1/5c/ce5aada9d0863b6fbf0cdf90986636d12278a8457bace14a1a8ca58cc048/ansible_later-0.2.7-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ca1dd2813603fa7f8e037ef8dc0e3316", "sha256": "934e18f55d854abbbd697e02e43cd6d8f4bace10eed649b403b372f777037f4c" }, "downloads": -1, "filename": "ansible-later-0.2.7.tar.gz", "has_sig": true, "md5_digest": "ca1dd2813603fa7f8e037ef8dc0e3316", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,,!=3.4.*", "size": 29798, "upload_time": "2019-06-21T10:18:12", "url": "https://files.pythonhosted.org/packages/17/55/0d0943a3971e6a4c05a12a977df0a214f0d0b9266623ccb5d3144754b2bf/ansible-later-0.2.7.tar.gz" } ] }