{ "info": { "author": "Bo Lopker", "author_email": "blopker@23andme.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4" ], "description": "Yamale (ya\u00b7ma\u00b7l\u0113)\n=================\n![Hot Yamale](https://raw.githubusercontent.com/23andMe/Yamale/master/yamale.png)\n\nA schema and validator for YAML.\n\nWhat's YAML? See the current spec [here](http://www.yaml.org/spec/1.2/spec.html) and an introduction to the syntax [here](https://github.com/Animosity/CraftIRC/wiki/Complete-idiot's-introduction-to-yaml).\n\n[![Build Status](https://travis-ci.org/23andMe/Yamale.svg?branch=master)](https://travis-ci.org/23andMe/Yamale)\n[![PyPI](https://img.shields.io/pypi/v/yamale.svg)](https://pypi.python.org/pypi/yamale)\n\nRequirements\n------------\n* Python 2.7+\n* Python 3.4+ (Only tested on 3.4, may work on older versions)\n* PyYAML\n* ruamel.yaml (optional)\n\nInstall\n-------\n### pip\n```bash\n$ pip install yamale\n```\n\n### Manual\n1. Download Yamale from: https://github.com/23andMe/Yamale/archive/master.zip\n2. Unzip somewhere temporary\n3. Run `python setup.py install` (may have to prepend `sudo`)\n\nUsage\n-----\n### Command line\nYamale can be run from the command line to validate one or many YAML files. Yamale will search the directory you supply (current directory is default) for YAML files.\nEach YAML file it finds it will look in the same directory as that file for its schema, if there is no schema Yamale will keep looking up the directory tree until it finds one.\nIf Yamale can not find a schema it will tell you.\n\nUsage:\n\n```bash\nusage: yamale [-h] [-s SCHEMA] [-n CPU_NUM] [-p PARSER] [--strict] [PATH]\n\nValidate yaml files.\n\npositional arguments:\n PATH folder to validate. Default is current directory.\n\noptional arguments:\n -h, --help show this help message and exit\n -s SCHEMA, --schema SCHEMA\n filename of schema. Default is schema.yaml.\n -n CPU_NUM, --cpu-num CPU_NUM\n number of CPUs to use. Default is 4.\n -p PARSER, --parser PARSER\n YAML library to load files. Choices are \"ruamel\" or\n \"pyyaml\" (default).\n --strict Enable strict mode, unexpected elements in the data\n will not be accepted.\n```\n\n### API\nThere are several ways to feed Yamale schema and data files. The simplest way is to let Yamale take care of reading and parsing your YAML files.\n\nAll you need to do is supply the files' path:\n```python\n# Import Yamale and make a schema object:\nimport yamale\nschema = yamale.make_schema('./schema.yaml')\n\n# Create a Data object\ndata = yamale.make_data('./data.yaml')\n\n# Validate data against the schema. Throws a ValueError if data is invalid.\nyamale.validate(schema, data)\n```\n\nIf `data` is valid, nothing will happen. However, if `data` is invalid Yamale will throw a `ValueError` with a message containing all the invalid nodes.\n\nYou can also specifiy an optional `parser` if you'd like to use the `ruamel.yaml` (YAML 1.2 support) instead:\n```python\n# Import Yamale and make a schema object, make sure ruamel.yaml is installed already.\nimport yamale\nschema = yamale.make_schema('./schema.yaml', parser='ruamel')\n\n# Create a Data object\ndata = yamale.make_data('./data.yaml', parser='ruamel')\n\n# Validate data against the schema same as before.\nyamale.validate(schema, data)\n```\n\n### Schema\nTo use Yamale you must make a schema. A schema is a valid YAML file with one or more documents inside. Each node terminates in a string which contains valid Yamale syntax. For example, `str()` represents a [String validator](#validators).\n\nA basic schema:\n```yaml\nname: str()\nage: int(max=200)\nheight: num()\nawesome: bool()\n```\n\nAnd some YAML that validates:\n```yaml\nname: Bill\nage: 26\nheight: 6.2\nawesome: True\n```\n\nTake a look at the [Examples](#examples) section for more complex schema ideas.\n\n#### Includes\nSchema files may contain more than one YAML document (nodes separated by `---`). The first document found will be the base schema. Any additional documents will be treated as Includes. Includes allow you to define a valid structure once and use it several times. They also allow you to do recursion.\n\nA schema with an Include validator:\n```yaml\nperson1: include('person')\nperson2: include('person')\n---\nperson:\n name: str()\n age: int()\n```\n\nSome valid YAML:\n```yaml\nperson1:\n name: Bill\n age: 70\n\nperson2:\n name: Jill\n age: 20\n```\n\nEvery root node not in the first YAML document will be treated like an include:\n```yaml\nperson: include('friend')\ngroup: include('family')\n---\nfriend:\n name: str()\nfamily:\n name: str()\n```\n\nIs equivalent to:\n```yaml\nperson: include('friend')\ngroup: include('family')\n---\nfriend:\n name: str()\n---\nfamily:\n name: str()\n```\n\n##### Recursion\nYou can get recursion using the Include validator.\n\nThis schema:\n```yaml\nperson: include('human')\n---\nhuman:\n name: str()\n age: int()\n friend: include('human', required=False)\n```\n\nWill validate this data:\n```yaml\nperson:\n name: Bill\n age: 50\n friend:\n name: Jill\n age: 20\n friend:\n name: Will\n age: 10\n```\n\n##### Adding external includes\nAfter you construct a schema you can add extra, external include definitions by calling `schema.add_include(dict)`. This method takes a dictionary and adds each key as another include.\n\n### Strict mode\nBy default Yamale will not give any error for extra elements present in lists and maps that are not covered by the schema. With strict mode any additional element will give an error. Strict mode is enabled by passing the strict=True flag to the validate function.\n\nIt is possible to mix strict and non-strict mode by setting the strict=True/False flag in the include validator, setting the option only for the included validators.\n\nValidators\n----------\nHere are all the validators Yamale knows about. Every validator takes a `required` keyword telling Yamale whether or not that node must exist. By default every node is required. Example: `str(required=False)`\n\nYou can also require that an optional value is not `None` by using the `none` keyword. By default Yamale will accept `None` as a valid value for a key that's not required. Reject `None` values with `none=False` in any validator. Example: `str(required=False, none=False)`.\n\nSome validators take keywords and some take arguments, some take both. For instance the `enum()` validator takes one or more constants as arguments and the `required` keyword: `enum('a string', 1, False, required=False)`\n\n### String - `str(min=int, max=int, exclude=string)`\nValidates strings.\n- keywords\n - `min`: len(string) >= min\n - `max`: len(string) <= max\n - `exclude`: Rejects strings that contains any character in the excluded value.\n\nExamples:\n- `str(max=10, exclude='?!')`: Allows only strings less than 11 characters that don't contain `?` or `!`.\n\n### Regex - `regex([patterns], name=string, ignore_case=False, multiline=False, dotall=False)`\nValidates strings against one or more regular expressions.\n- arguments: one or more Python regular expression patterns\n- keywords:\n - `name`: A friendly description for the patterns.\n - `ignore_case`: Validates strings in a case-insensitive manner.\n - `multiline`: `^` and `$` in a pattern match at the beginning and end of each line in a string in addition to matching at the beginning and end of the entire string. (A pattern matches at [the beginning of a string](https://docs.python.org/3/library/re.html#re.match) even in multiline mode; see below for a workaround.)\n - `dotall`: `.` in a pattern matches newline characters in a validated string in addition to matching every character that *isn't* a newline.\n\nExamples:\n- `regex('^[^?!]{,10}$')`: Allows only strings less than 11 characters that don't contain `?` or `!`.\n- `regex(r'^(\\d+)(\\s\\1)+$', name='repeated natural')`: Allows only strings that contain two or more identical digit sequences, each separated by a whitespace character. Non-matching strings like `sugar` are rejected with a message like `'sugar' is not a repeated natural.`\n- `regex('.*^apples$', multiline=True, dotall=True)`: Allows the string `apples` as well as multiline strings that contain the line `apples`.\n\n### Integer - `int(min=int, max=int)`\nValidates integers.\n- keywords\n - `min`: int >= min\n - `max`: int <= max\n\n### Number - `num(min=float, max=float)`\nValidates integers and floats.\n- keywords\n - `min`: num >= min\n - `max`: num <= max\n\n### Boolean - `bool()`\nValidates booleans.\n\n### Null - `null()`\nValidates null values.\n\n### Enum - `enum([primitives])`\nValidates from a list of constants.\n- arguments: constants to test equality with\n\nExamples:\n- `enum('a string', 1, False)`: a value can be either `'a string'`, `1` or `False`\n\n### Day - `day(min=date, max=date)`\nValidates a date in the form of YYYY-MM-DD.\n- keywords\n - `min`: date >= min\n - `max`: date <= max\n\nExamples:\n- `day(min='2001-01-01', max='2100-01-01')`: Only allows dates between 2001-01-01 and 2100-01-01.\n\n### Timestamp - `timestamp(min=time, max=time)`\nValidates a timestamp in the form of YYYY-MM-DD HH:MM:SS.\n- keywords\n - `min`: time >= min\n - `max`: time <= max\n\nExamples:\n- `timestamp(min='2001-01-01 01:00:00', max='2100-01-01 23:00:00')`: Only allows times between 2001-01-01 01:00:00 and 2100-01-01 23:00:00.\n\n### List - `list([validators])`\nValidates lists. If one or more validators are passed to `list()` only nodes that pass at least one of those validators will be accepted.\n- arguments: one or more validators to test values with\n\n- keywords\n - `min`: len(list) >= min\n - `max`: len(list) <= max\n\nExamples:\n- `list()`: Validates any list\n- `list(include('custom'), int(), min=4)`: Only validates lists that contain the `custom` include or integers and contains a minimum of 4 items.\n\n### Map - `map([validators])`\nValidates maps. Use when you want a node to contain freeform data. Similar to `List`, `Map` also takes a number of validators to\nrun against its children nodes. A child validates if at least one validator passes.\n\nExamples:\n- `map()`: Validates any map\n- `map(str(), int())`: Only validates maps whose children are strings or integers.\n\n### IP Address - `ip()`\nValidates IPv4 and IPv6 addresses.\n\n- keywords\n - `version`: 4 or 6; explicitly force IPv4 or IPv6 validation\n\nExamples:\n- `ip()`: Allows any valid IPv4 or IPv6 address\n- `ip(version=4)`: Allows any valid IPv4 address\n- `ip(version=6)`: Allows any valid IPv6 address\n\n### MAC Address - `mac()`\nValidates MAC addresses.\n\nExamples:\n- `mac()`: Allows any valid MAC address\n\n\n### Any - `any([validators])`\nValidates against a union of types. Use when a node can contain one of several types. It is valid if at least one of the listed validators is valid.\n- arguments: one or more validators to test values with\n\nExamples:\n- `any(int(), null())`: Validates an integer or a null value.\n- `any(num(), include('vector'))`: Validates a number or an included 'vector' type.\n\n### Include - `include(include_name)`\nValidates included structures. Must supply the name of a valid include.\n- arguments: single name of a defined include, surrounded by quotes.\n\nExamples:\n- `include('person')`\n\n### Custom validators\nIt is also possible to add your own custom validators. This is an advanced topic, but here is an example of adding a `Date` validator and using it in a schema as `date()`\n\n```python\nimport yamale\nfrom yamale.validators import DefaultValidators, Validator\n\nclass Date(Validator):\n \"\"\" Custom Date validator \"\"\"\n tag = 'date'\n\n def _is_valid(self, value):\n return isinstance(value, datetime.date)\n\nvalidators = DefaultValidators.copy() # This is a dictionary\nvalidators[Date.tag] = Date\nschema = yamale.make_schema('./schema.yaml' validators=validators)\n# Then use `schema` as normal\n```\n\nExamples\n--------\n### Using keywords\n#### Schema:\n```yaml\noptional: str(required=False)\noptional_min: int(min=1, required=False)\nmin: num(min=1.5)\nmax: int(max=100)\n```\n#### Valid Data:\n```yaml\noptional_min: 10\nmin: 1.6\nmax: 100\n```\n\n### Includes and recursion\n#### Schema:\n```yaml\ncustomerA: include('customer')\ncustomerB: include('customer')\nrecursion: include('recurse')\n---\ncustomer:\n name: str()\n age: int()\n custom: include('custom_type')\n\ncustom_type:\n integer: int()\n\nrecurse:\n level: int()\n again: include('recurse', required=False)\n```\n#### Valid Data:\n```yaml\ncustomerA:\n name: bob\n age: 900\n custom:\n integer: 1\ncustomerB:\n name: jill\n age: 1\n custom:\n integer: 3\nrecursion:\n level: 1\n again:\n level: 2\n again:\n level: 3\n again:\n level: 4\n```\n\n### Lists\n#### Schema:\n```yaml\nlist_with_two_types: list(str(), include('variant'))\nquestions: list(include('question'))\n---\nvariant:\n rsid: str()\n name: str()\n\nquestion:\n choices: list(include('choices'))\n questions: list(include('question'), required=False)\n\nchoices:\n id: str()\n```\n#### Valid Data:\n```yaml\nlist_with_two_types:\n - 'some'\n - rsid: 'rs123'\n name: 'some SNP'\n - 'thing'\n - rsid: 'rs312'\n name: 'another SNP'\nquestions:\n - choices:\n - id: 'id_str'\n - id: 'id_str1'\n questions:\n - choices:\n - id: 'id_str'\n - id: 'id_str1'\n```\n\nWriting Tests\n-------------\nTo validate YAML files when you run your program's tests use Yamale's YamaleTestCase\n\nExample:\n\n```python\nclass TestYaml(YamaleTestCase):\n base_dir = os.path.dirname(os.path.realpath(__file__))\n schema = 'schema.yaml'\n yaml = 'data.yaml'\n # or yaml = ['data-*.yaml', 'some_data.yaml']\n\n def runTest(self):\n self.assertTrue(self.validate())\n```\n\n`base_dir`: String path to prepend to all other paths. This is optional.\n\n`schema`: String of path to the schema file to use. One schema file per test case.\n\n`yaml`: String or list of yaml files to validate. Accepts globs.\n\n\nDevelopers\n----------\n### Testing\nYamale uses [Tox](https://tox.readthedocs.org/en/latest/) to run its tests against multiple Python versions. To run tests, first checkout Yamale, install Tox, then run `make test` in the Yamale's root directory. You may also have to install the correct Python versions to test with as well.\n\n### Releasing\nYamale uses Travis to upload new tags to PyPi.\nTo release a new version:\n\n1. Make a commit with the new version in `setup.py`.\n1. Run tests for good luck.\n1. Run `make release`.\n\nTravis will take care of the rest.", "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/23andMe/Yamale", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "yamale", "package_url": "https://pypi.org/project/yamale/", "platform": "", "project_url": "https://pypi.org/project/yamale/", "project_urls": { "Homepage": "https://github.com/23andMe/Yamale" }, "release_url": "https://pypi.org/project/yamale/2.0.1/", "requires_dist": null, "requires_python": "", "summary": "A schema and validator for YAML.", "version": "2.0.1" }, "last_serial": 5806230, "releases": { "1.1.3": [ { "comment_text": "", "digests": { "md5": "f057dae52055dab8de7ebdd2eb740519", "sha256": "c2bc0b3f0a6d91a9e9c4309de27224b2797aac8c412fbd67de626d67cae6ac2d" }, "downloads": -1, "filename": "yamale-1.1.3.tar.gz", "has_sig": false, "md5_digest": "f057dae52055dab8de7ebdd2eb740519", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15951, "upload_time": "2014-06-30T08:11:55", "url": "https://files.pythonhosted.org/packages/aa/9a/0a2e41ec6ff42d63eee10bcf5580dfd3aaf3fadafa73adbee536e63038a3/yamale-1.1.3.tar.gz" } ], "1.10.0": [ { "comment_text": "", "digests": { "md5": "3fa23d70ee286116cfdff59ad5d6f2b0", "sha256": "0d77ed01ae30a0f4537dfd268e809118f86251ce4a6ab989f888f5f30890373e" }, "downloads": -1, "filename": "yamale-1.10.0.tar.gz", "has_sig": false, "md5_digest": "3fa23d70ee286116cfdff59ad5d6f2b0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28507, "upload_time": "2019-03-18T20:42:18", "url": "https://files.pythonhosted.org/packages/a7/aa/ac2cdf57e9c0489e801a98f5f41577e748c052e28001e154e029ebf41b81/yamale-1.10.0.tar.gz" } ], "1.10.1": [ { "comment_text": "", "digests": { "md5": "ee4e1ba6b594bd688f8e6964bc594c51", "sha256": "8aa522fce82b70c30a29b2282eacfd5f965a7fbb5d6115dca84c5854f91d434e" }, "downloads": -1, "filename": "yamale-1.10.1.tar.gz", "has_sig": false, "md5_digest": "ee4e1ba6b594bd688f8e6964bc594c51", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25307, "upload_time": "2019-08-09T21:05:27", "url": "https://files.pythonhosted.org/packages/c4/0a/a467b8a98930427d2164980096d136af53e7402c84fec8b58cf807e60dbd/yamale-1.10.1.tar.gz" } ], "1.2.0": [ { "comment_text": "built for Darwin-14.0.0", "digests": { "md5": "949d70c7fe448cc509b111b1b5ebb0d8", "sha256": "ff375fec20615ee785bdd97ada1a47acf09220ccf3c8f675342692e7dd3ee639" }, "downloads": -1, "filename": "yamale-1.2.0.macosx-10.10-intel.tar.gz", "has_sig": false, "md5_digest": "949d70c7fe448cc509b111b1b5ebb0d8", "packagetype": "bdist_dumb", "python_version": "any", "requires_python": null, "size": 23180, "upload_time": "2014-11-07T01:26:35", "url": "https://files.pythonhosted.org/packages/e2/10/65c31d0f4926c9cfac8f87946f4ebecba08e4d138dd7c2332069050706d6/yamale-1.2.0.macosx-10.10-intel.tar.gz" }, { "comment_text": "", "digests": { "md5": "bda4e46b71a7e3d5b358b12692688942", "sha256": "cd2cdb19be330e74b0575313a18d5583828c72742c8cc78e3a78784563742dd4" }, "downloads": -1, "filename": "yamale-1.2.0.tar.gz", "has_sig": false, "md5_digest": "bda4e46b71a7e3d5b358b12692688942", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16455, "upload_time": "2014-11-07T01:26:33", "url": "https://files.pythonhosted.org/packages/ce/4e/9679687465dbd58a547f2f4a2b3387cc09d957aaccac69843b971150ae56/yamale-1.2.0.tar.gz" } ], "1.2.1": [ { "comment_text": "", "digests": { "md5": "2d755b70af5db11df1dc6216d62cf39d", "sha256": "d73d4795d86cc50db7ca9e8371056ddc87f7be50790cbc0c8bd43b89e963643f" }, "downloads": -1, "filename": "yamale-1.2.1.tar.gz", "has_sig": false, "md5_digest": "2d755b70af5db11df1dc6216d62cf39d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16709, "upload_time": "2014-11-12T23:08:46", "url": "https://files.pythonhosted.org/packages/eb/8f/ca80f155e17c05f87ee2fdc87f4a33822cb49da8b426de1ea8ba7cfa18ef/yamale-1.2.1.tar.gz" } ], "1.3.0": [ { "comment_text": "built for Darwin-14.1.0", "digests": { "md5": "e967f9c3885366b02086a1de04bfa092", "sha256": "32d7d5b4d5b159279dd44f5dd3c957bab7585eaed0352f3eace428259b77b71b" }, "downloads": -1, "filename": "yamale-1.3.0.macosx-10.10-intel.tar.gz", "has_sig": false, "md5_digest": "e967f9c3885366b02086a1de04bfa092", "packagetype": "bdist_dumb", "python_version": "any", "requires_python": null, "size": 12330, "upload_time": "2015-02-18T03:19:26", "url": "https://files.pythonhosted.org/packages/d0/84/3ed46d40692e1349c56a5e7b3659b34aa504312954c655bc2c7684819144/yamale-1.3.0.macosx-10.10-intel.tar.gz" }, { "comment_text": "", "digests": { "md5": "2c17e2073209d9f6a0d26ebf14a4a4c7", "sha256": "f12a0a9692f53764845ebd1918c525f3c2ceb07a6ee00d216d5bbf711c38c9a5" }, "downloads": -1, "filename": "yamale-1.3.0.tar.gz", "has_sig": false, "md5_digest": "2c17e2073209d9f6a0d26ebf14a4a4c7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17301, "upload_time": "2015-02-18T03:19:23", "url": "https://files.pythonhosted.org/packages/e0/7c/362712707780b83701d48a7e17482622a924bbdb1bca50c76ea59cbf672e/yamale-1.3.0.tar.gz" } ], "1.3.1": [ { "comment_text": "built for Darwin-14.1.0", "digests": { "md5": "c4b1e989650f837e07b7c87413cecc14", "sha256": "a8d2b29fbbafc4aca65f73f782a991f0f6d7251a694eb8bb3d58c2d9780828e4" }, "downloads": -1, "filename": "yamale-1.3.1.macosx-10.10-intel.tar.gz", "has_sig": false, "md5_digest": "c4b1e989650f837e07b7c87413cecc14", "packagetype": "bdist_dumb", "python_version": "any", "requires_python": null, "size": 12183, "upload_time": "2015-03-16T02:34:07", "url": "https://files.pythonhosted.org/packages/ab/34/032204d47e7650f21120f7fa5e75c713a346844c94ec62c63fff247c08f3/yamale-1.3.1.macosx-10.10-intel.tar.gz" }, { "comment_text": "", "digests": { "md5": "eb97778b86d2842229db1ead03bb15fd", "sha256": "ea779b153d50119109b4b04890b080bd5832e9ba716405550be754e472f3c168" }, "downloads": -1, "filename": "yamale-1.3.1.tar.gz", "has_sig": false, "md5_digest": "eb97778b86d2842229db1ead03bb15fd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17332, "upload_time": "2015-03-16T02:34:02", "url": "https://files.pythonhosted.org/packages/87/f9/dc2f626d336cc07c202c53d8f8d39c3ee048cff764f7573c215e2ecfc1da/yamale-1.3.1.tar.gz" } ], "1.4.0": [ { "comment_text": "", "digests": { "md5": "48d872d08cfdff5478b9bb36cf52f345", "sha256": "35ddd60330e78184b036d08c6f39c8407c220f31fcd58cceb0893b7ce0d18582" }, "downloads": -1, "filename": "yamale-1.4.0.tar.gz", "has_sig": false, "md5_digest": "48d872d08cfdff5478b9bb36cf52f345", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18540, "upload_time": "2015-03-16T07:47:35", "url": "https://files.pythonhosted.org/packages/d7/a8/643aacdce890f78e54a780a79c5c0e60a376f49b8093971bf5724564b8da/yamale-1.4.0.tar.gz" } ], "1.4.1": [ { "comment_text": "", "digests": { "md5": "3d1fffb57f50cf4237cd06ad1654541a", "sha256": "232ae7b78a22dd98220579a8fbbc721a7509d65b590bfbdf09a76639052e3a7a" }, "downloads": -1, "filename": "yamale-1.4.1.tar.gz", "has_sig": false, "md5_digest": "3d1fffb57f50cf4237cd06ad1654541a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18597, "upload_time": "2015-03-17T18:46:38", "url": "https://files.pythonhosted.org/packages/4b/90/287b924f9ade4779742b83f624e5a7046f4a00e52b44de00a4c9198d2914/yamale-1.4.1.tar.gz" } ], "1.5.0": [ { "comment_text": "", "digests": { "md5": "0fbf68c08b740e17fe2001e4ae53f7df", "sha256": "a9dd707e7d7478960fb8098b61e8d4de5f67356b99bb44fdd0ff43179431d7aa" }, "downloads": -1, "filename": "yamale-1.5.0.tar.gz", "has_sig": false, "md5_digest": "0fbf68c08b740e17fe2001e4ae53f7df", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19769, "upload_time": "2015-05-26T19:38:23", "url": "https://files.pythonhosted.org/packages/af/77/1ab8ad3e0a9e7be1fcf94aab276b421db3ebe5fb134f999be5ce5546ab11/yamale-1.5.0.tar.gz" } ], "1.5.2": [ { "comment_text": "", "digests": { "md5": "62276441c3f81225adf3b2a91d9a62c7", "sha256": "af771d5d499b6e3a19ba4d294e699a81cea6c1b1c100144a354c0347dbde719c" }, "downloads": -1, "filename": "yamale-1.5.2.tar.gz", "has_sig": false, "md5_digest": "62276441c3f81225adf3b2a91d9a62c7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19968, "upload_time": "2015-09-28T21:44:43", "url": "https://files.pythonhosted.org/packages/9f/de/204301379c0c47b6a33d2f0653feca4fe0c24f8b618d3a5222ab1e35678a/yamale-1.5.2.tar.gz" } ], "1.5.3": [ { "comment_text": "", "digests": { "md5": "a3cf00dadd29129f0cf72f6234526259", "sha256": "64a2eedbec7b1caae9ca0ce787a289cd1649fb8871faaae65b334205a0a51c80" }, "downloads": -1, "filename": "yamale-1.5.3.tar.gz", "has_sig": false, "md5_digest": "a3cf00dadd29129f0cf72f6234526259", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17834, "upload_time": "2015-10-19T04:05:46", "url": "https://files.pythonhosted.org/packages/b7/df/8d7245f2cbe072532bdf1d4da67c0dcfaaaf3a0d609cf01ac4fd5fd6e617/yamale-1.5.3.tar.gz" } ], "1.5.4": [ { "comment_text": "", "digests": { "md5": "0506e9406534d21ba2cb8b0fb8c752ec", "sha256": "4971ddde5c1f391f8051866d7e745e4e77c2ed75508da8b342f4e5c895a9bc49" }, "downloads": -1, "filename": "yamale-1.5.4.tar.gz", "has_sig": false, "md5_digest": "0506e9406534d21ba2cb8b0fb8c752ec", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18241, "upload_time": "2015-12-17T04:03:37", "url": "https://files.pythonhosted.org/packages/e0/55/165bc155097159b3029ececc357b89eafe5154a20bcef7d5470e13b71e52/yamale-1.5.4.tar.gz" } ], "1.5.5": [ { "comment_text": "", "digests": { "md5": "e4de53673e5392ee63cf10498409d0ae", "sha256": "2ef9a3ce3f201b2e180013309410b360f8d7d143aea72a6f4f08217fb8b89fbb" }, "downloads": -1, "filename": "yamale-1.5.5.tar.gz", "has_sig": false, "md5_digest": "e4de53673e5392ee63cf10498409d0ae", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18407, "upload_time": "2015-12-17T04:08:58", "url": "https://files.pythonhosted.org/packages/e8/ac/05125cdee13c5b6d987e22981d49c74c217b7c960a79e1fa1bbd3c777a54/yamale-1.5.5.tar.gz" } ], "1.5.6": [ { "comment_text": "", "digests": { "md5": "f008b3618bea43abf08b156b3437fc44", "sha256": "f6de907bf4aa70a7e47e683bd1197f3ea1797d0335dc7e73d460502c0e76cc82" }, "downloads": -1, "filename": "yamale-1.5.6.tar.gz", "has_sig": false, "md5_digest": "f008b3618bea43abf08b156b3437fc44", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18462, "upload_time": "2016-03-10T01:57:47", "url": "https://files.pythonhosted.org/packages/6d/14/abe02274793b1d8a05e58963646f5eeeb6d3a217c6cb9d59d8451c1d83f7/yamale-1.5.6.tar.gz" } ], "1.6.0": [ { "comment_text": "", "digests": { "md5": "52ebd52a2d5cffc738ecdcb4fc43a575", "sha256": "11bad51a8ace9c009be70bd210d48a883a78ed7e57f14f4d30bc3f5e86cbf68c" }, "downloads": -1, "filename": "yamale-1.6.0.tar.gz", "has_sig": false, "md5_digest": "52ebd52a2d5cffc738ecdcb4fc43a575", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19938, "upload_time": "2017-02-13T20:34:09", "url": "https://files.pythonhosted.org/packages/13/b3/ab21f04ce1f5046a8982c842323579e247adf76b2982563ae6c0782be149/yamale-1.6.0.tar.gz" } ], "1.6.1": [ { "comment_text": "", "digests": { "md5": "48c868c8fd61a1cde51a987718d89207", "sha256": "22dda48c4c712c564ab7f50ee4079118b9c2a38dce79564ec6acd1aa069a1974" }, "downloads": -1, "filename": "yamale-1.6.1.tar.gz", "has_sig": false, "md5_digest": "48c868c8fd61a1cde51a987718d89207", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20070, "upload_time": "2017-02-15T21:04:52", "url": "https://files.pythonhosted.org/packages/2a/75/4dd7ded3699fcbe7e6e548bf08c01039039d8e43b901839656901322ae98/yamale-1.6.1.tar.gz" } ], "1.6.2": [ { "comment_text": "", "digests": { "md5": "475a055cacdd00a5684dbe25f92e2840", "sha256": "9f05c0772eb5fbcecb7d01fdea0f00374b4258f371ec54ebede294560361799b" }, "downloads": -1, "filename": "yamale-1.6.2.tar.gz", "has_sig": false, "md5_digest": "475a055cacdd00a5684dbe25f92e2840", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20302, "upload_time": "2017-02-16T00:24:52", "url": "https://files.pythonhosted.org/packages/2a/40/6158e905c46d3bf7e06612236d6a678ee5c5ba51ef899c944e816a95628b/yamale-1.6.2.tar.gz" } ], "1.6.3": [ { "comment_text": "", "digests": { "md5": "ca325379a34c049d9a8b120196175679", "sha256": "5bb3d3da2d5639858e6ecbe3427f5bbffe76824771953c3fcc93a3729feda223" }, "downloads": -1, "filename": "yamale-1.6.3.tar.gz", "has_sig": false, "md5_digest": "ca325379a34c049d9a8b120196175679", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20246, "upload_time": "2017-02-16T00:30:47", "url": "https://files.pythonhosted.org/packages/5a/11/74f71dd2e1848513750294138b85b9b6aa51e87266f2fb34b6cc2f1ddf7f/yamale-1.6.3.tar.gz" } ], "1.6.4": [ { "comment_text": "", "digests": { "md5": "af5a7cd444d7b164c685738b41a52bf5", "sha256": "708d0575ec1ea970e30dd5fd6ade4c7cb0a891ed1cef9fd6f09ea0f2b159c360" }, "downloads": -1, "filename": "yamale-1.6.4.tar.gz", "has_sig": false, "md5_digest": "af5a7cd444d7b164c685738b41a52bf5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20500, "upload_time": "2017-07-19T20:15:59", "url": "https://files.pythonhosted.org/packages/35/41/63bf15edf85e64872be5d08ce9826f70b1da2ac6002e3a4f2787a3772883/yamale-1.6.4.tar.gz" } ], "1.7.0": [ { "comment_text": "", "digests": { "md5": "da7a95a16aed394614c01f014ed1853e", "sha256": "18f921a8272b85b1d74df19e18f8656254c4561ef8abee323bbdbf411f79ec0b" }, "downloads": -1, "filename": "yamale-1.7.0.tar.gz", "has_sig": false, "md5_digest": "da7a95a16aed394614c01f014ed1853e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21219, "upload_time": "2017-07-25T20:56:57", "url": "https://files.pythonhosted.org/packages/13/89/39ec1debc17f466b6336485ab7b9573660cd3ea48ca86f11f070697544c4/yamale-1.7.0.tar.gz" } ], "1.7.1": [ { "comment_text": "", "digests": { "md5": "3bae689c5c93a68c3fbfcccd2967ffff", "sha256": "0884d8e73a3ad694e8c87078d526167a8f6388a6fe6c9332920cdb108aa2c4b9" }, "downloads": -1, "filename": "yamale-1.7.1.tar.gz", "has_sig": false, "md5_digest": "3bae689c5c93a68c3fbfcccd2967ffff", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21251, "upload_time": "2018-11-06T00:39:36", "url": "https://files.pythonhosted.org/packages/68/b0/3f663379c5823633387728697fd4f9e163683acdd23acc3132d636c2e053/yamale-1.7.1.tar.gz" } ], "1.8.0": [ { "comment_text": "", "digests": { "md5": "516f143f4cfded13c790aa7985d5b747", "sha256": "c6362b2f4e7b082a3c326853713431aae952368ac191056a1fd254d5d442029d" }, "downloads": -1, "filename": "yamale-1.8.0.tar.gz", "has_sig": false, "md5_digest": "516f143f4cfded13c790aa7985d5b747", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21506, "upload_time": "2018-11-26T19:03:26", "url": "https://files.pythonhosted.org/packages/e0/fb/7a877c7fc19e8b48fed3e979feff49bb5db7569af41077570d4e0bf6a6b4/yamale-1.8.0.tar.gz" } ], "1.8.1": [ { "comment_text": "", "digests": { "md5": "74849e091a535ab87fc19ee2bb327d4d", "sha256": "2453c4932b507f3964d2bf6aae39bc8c07c944cca649fba52519a52ab4652510" }, "downloads": -1, "filename": "yamale-1.8.1.tar.gz", "has_sig": false, "md5_digest": "74849e091a535ab87fc19ee2bb327d4d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25133, "upload_time": "2019-02-19T02:32:20", "url": "https://files.pythonhosted.org/packages/bb/9a/9928e8b7579373e650c91b384b1dd5decc47ff99cc02b6b9e09f896366dd/yamale-1.8.1.tar.gz" } ], "1.9.0": [ { "comment_text": "", "digests": { "md5": "8c399f46e316313945f7caba7c2ab920", "sha256": "aa1b9b58a69bc736363878ff8779631db37970c86b817254c6087eafcbdf6f08" }, "downloads": -1, "filename": "yamale-1.9.0.tar.gz", "has_sig": false, "md5_digest": "8c399f46e316313945f7caba7c2ab920", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27091, "upload_time": "2019-03-04T22:44:54", "url": "https://files.pythonhosted.org/packages/3e/0e/ff9f8a2a2cae83c20738fac096086f6459cef507b3b92dd4f3d756b8ae10/yamale-1.9.0.tar.gz" } ], "2.0": [ { "comment_text": "", "digests": { "md5": "88f993e86555e97a81cc27427e88a33d", "sha256": "532897422b590f617a075d47badde4874c0b1d49ac10e151c1f04f73d0524b03" }, "downloads": -1, "filename": "yamale-2.0.tar.gz", "has_sig": false, "md5_digest": "88f993e86555e97a81cc27427e88a33d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26700, "upload_time": "2019-08-20T03:46:16", "url": "https://files.pythonhosted.org/packages/ab/32/37ac86663fff511d2459e722643737274bb0d561c26aeb2155a71a72e9be/yamale-2.0.tar.gz" } ], "2.0.1": [ { "comment_text": "", "digests": { "md5": "a35fd811989ca3b2fb75ced2c58cf1a5", "sha256": "ac7dbb7b01c9fc61a5954d61fc6deb66b177c1f84146925add92dc0fa2b7e4c3" }, "downloads": -1, "filename": "yamale-2.0.1.tar.gz", "has_sig": false, "md5_digest": "a35fd811989ca3b2fb75ced2c58cf1a5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26931, "upload_time": "2019-09-10T00:38:25", "url": "https://files.pythonhosted.org/packages/c9/dd/6f559c5738f5e6616393e2163aa3c538bdec8b7f3755af12182a032727f2/yamale-2.0.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "a35fd811989ca3b2fb75ced2c58cf1a5", "sha256": "ac7dbb7b01c9fc61a5954d61fc6deb66b177c1f84146925add92dc0fa2b7e4c3" }, "downloads": -1, "filename": "yamale-2.0.1.tar.gz", "has_sig": false, "md5_digest": "a35fd811989ca3b2fb75ced2c58cf1a5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26931, "upload_time": "2019-09-10T00:38:25", "url": "https://files.pythonhosted.org/packages/c9/dd/6f559c5738f5e6616393e2163aa3c538bdec8b7f3755af12182a032727f2/yamale-2.0.1.tar.gz" } ] }