{ "info": { "author": "Michiel Doesburg", "author_email": "michiel@moddix.com", "bugtrack_url": null, "classifiers": [], "description": "# Spotlight\nLaravel style data validation for Python.\n\n## Table of Contents\n* [Installation](#installation)\n* [Dependencies](#dependencies)\n* [Usage](#usage)\n * [Simple Examples](#simple-examples)\n * [Direct Validation](#direct-validation)\n* [Available Rules](#available-rules)\n* [Advanced Usage](#advanced-usage)\n * [Custom Error Messages](#custom-error-messages)\n * [Custom Rules](#custom-rules)\n* [Plugins](#plugins)\n * [Spotlight SQLAlchemy](#spotlight-sqlalchemy)\n\n## Installation\nSpotlight can be installed via pip:\n```\npip install spotlight\n```\n\n## Dependencies\n* [python >= 3.6.0](https://www.python.org/)\n\n## Usage\n```python\nfrom spotlight.validator import Validator\n```\n\n### Simple Examples\n```python\nrules = {\n \"email\": \"required|email\",\n \"first_name\": \"required|string|max:255\",\n \"last_name\": \"required|string|max:255\",\n \"password\": \"required|min:8|max:255\"\n}\n\ndata = {\n \"email\": \"john.doe@example.com\",\n \"first_name\": \"John\",\n \"last_name\": \"Doe\",\n \"password\": \"test1234\"\n}\n\nvalidator = Validator()\nerrors = validator.validate(data, rules)\n```\n\nNested validation:\n```python\nrules = {\n \"token\": \"required|string\",\n \"person\": {\n \"first_name\": \"required|string|max:255\",\n \"last_name\": \"required|string|max:255\",\n \"email\": \"required|email\",\n \"password\": \"required|min:8|max:255\"\n }\n}\n\ndata = {\n \"token\": \"test-token\",\n \"person\": {\n \"first_name\": \"John\",\n \"last_name\": \"Doe\",\n \"email\": \"john.doe@example.com\",\n \"password\": \"test1234\"\n }\n}\n\nvalidator = Validator()\nerrors = validator.validate(data, rules)\n```\n\nList validation:\n```python\nrules = {\n \"players\": \"required|list|min:2\",\n \"players.*.username\": \"required\"\n}\n\ndata = {\n \"players\": [\n {\n \"username\": \"Player 1\"\n },\n {\n \"username\": \"Player 2\"\n }\n ]\n}\n\nvalidator = Validator()\nerrors = validator.validate(data, rules)\n```\n\n### Direct Validation\nSometimes there is a need for quick and simple validation, without having to create a rule set. The Validator class exposes several static methods that can be used for direct validation.\n\nExamples:\n```\nvalidator = Validator()\nemail = \"john.doe@example.com\"\n\nif validator.valid_email(email):\n print(\"This is a valid email!\")\n\n# Or like this:\n\nif Validator.valid_email(email):\n print(\"This is a valid email!\")\n```\n\nAvailable methods:\n* valid_alpha_num\n* valid_alpha_num_space\n* valid_boolean\n* valid_date_time\n* valid_dict\n* valid_email\n* valid_float\n* valid_integer\n* valid_ip\n* valid_json\n* valid_list\n* valid_string\n* valid_url\n* valid_uuid4\n\n## Available Rules\n* [accepted](#accepted)\n* [after](#after)\n* [alpha_num](#alpha_num)\n* [alpha_num_space](#alpha_num_space)\n* [before](#before)\n* [boolean](#boolean)\n* [date_time](#date_time)\n* [dict](#dict)\n* [email](#email)\n* [ends_with](#ends_with)\n* [filled](#filled)\n* [float](#float)\n* [in](#in)\n* [integer](#integer)\n* [ip](#ip)\n* [json](#json)\n* [list](#list)\n* [max](#max)\n* [min](#min)\n* [not_with](#not_with)\n* [required](#required)\n* [required_if](#required_if)\n* [required_unless](#required_unless)\n* [required_with](#required_without)\n* [required_without](#required_without)\n* [size](#size)\n* [starts_with](#starts_with)\n* [string](#string)\n* [url](#url)\n* [uuid4](#uuid4)\n\n### accepted\nThe field under validation must be yes, on, 1, or true. This is useful for validating \"Terms of Service\" acceptance.\n```\naccepted\n```\n\n### after\nThe field under validation must be a value after a given date/time. For more details about formatting see the [date_time](#date_time) rule.\n```\nafter:2019-12-31 12:00:00\n```\n\nIf the after rule is accompanied by the date_time rule, and a non default format is specified, the specified format will be assumed for the after rule as well:\n```\ndate_time:%H:%M:%S|after:12:00:00\n```\n\nInstead of passing a date/time string to be evaluated by the `strptime` Python function, you may specify another field to compare against the date/time:\n```\nafter:some_field\n```\n\n### alpha_num\nThe field under validation must be entirely alpha-numeric characters.\n```\nalpha_num\n```\n\n### alpha_num_space\nThe field under validation may have alpha-numeric characters, as well as spaces.\n```\nalpha_num_space\n```\n\n### before\nThe field under validation must be a value before a given date/time. For more details about formatting see the [date_time](#date_time) rule.\n```\nbefore:2019-12-31 12:00:00\n```\n\nIf the before rule is accompanied by the date_time rule, and a non default format is specified, the specified format will be assumed for the after rule as well:\n```\ndate_time:%H:%M:%S|before:12:00:00\n```\n\nInstead of passing a date/time string to be evaluated by the `strptime` Python function, you may specify another field to compare against the date/time:\n```\nbefore:some_field\n```\n\n### boolean\nThe field under validation must be a boolean.\n```\nboolean\n```\n\n### date_time\nThe field under validation must be a valid date/time matching the \"YYYY-MM-DD hh:mm:ss\" format, or a custom specified format. For example, a field being validated with the following format \"date_time:%m/%d/%Y\" must match the \"MM/DD/YYYY\" format. The date/time validation uses the `strptime` Python function. For more info on valid formatting symbols check the following [Python docs](https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior).\n```\ndate_time\n```\n```\ndate_time:format\n```\n\n### dict\nThe field under validation must be a dict.\n```\ndict\n```\n\n### email\nThe field under validation must be a valid email address.\n```\nemail\n```\n\n### ends_with\nThe field under validation must end with one of the given values.\n```\nends_with:value,other,...\n```\n\n### filled\nThe field under validation must not be empty when it is present.\n```\nfilled\n```\n\n### float\nThe field under validation must be a float.\n```\nfloat\n```\n\n### in\nThe field under validation must be included in the given list of values. \n```\nin:value,other,...\n```\n\n### integer\nThe field under validation must be an integer.\n```\ninteger\n```\n\n### ip\nThe field under validation must be an IP address.\n```\nip\n```\n\n### json\nThe field under validation must be a valid JSON string.\n```\njson\n```\n\n### list\nThe field under validation must be a list.\n```\nlist\n```\n\n### max\nThe field under validation must be less than or equal to the given maximum value. For strings, value corresponds to the number of characters. For integers, value corresponds to a given integer value. For floats, value corresponds to a given float value. For lists and dicts, value corresponds to the length of the list.\n```\nmax:value\n```\n\n### min\nThe field under validation must be greater than or equal to the given minimum value. For strings, value corresponds to the number of characters. For integers, value corresponds to a given integer value. For floats, value corresponds to a given float value. For lists and dicts, value corresponds to the length of the list.\n```\nmin:value\n```\n\n### not_with\nThe field under validation can't be present if the other specified field is present.\n```\nnot_with:other\n```\n\n### required\nThe field under validation must be present in the input data and not empty. A field is considered \"empty\" if one of the following conditions are true:\n* The value is _None_.\n* The value is an empty string.\n* The value is an empty list.\n```\nrequired\n```\n\n### required_if\nThe field under validation must be present and not empty if the other specified field equals a certain value.\n```\nrequired_if:other,value\n```\n\n### required_unless\nThe field under validation must be present and not empty unless the other specified field equals a certain value.\n```\nrequired_unless:other,value\n```\n\n### required_with\nThe field under validation must be present and not empty only if any of the other specified fields are present.\n```\nrequired_with:field1,field2,...\n```\n\n### required_without\nThe field under validation must be present and not empty only when any of the other specified fields are not present.\n```\nrequired_without:field1,field2,...\n```\n\n### size\nThe field under validation must have a size matching the given value. For strings, value corresponds to the number of characters. For integers, value corresponds to a given integer value. For floats, value corresponds to a given float value. For lists and dicts, value corresponds to the length of the list.\n```\nsize:value\n```\n\n### starts_with\nThe field under validation must start with one of the given values.\n```\nstarts_with:value,other,...\n```\n\n### string\nThe field under validation must be a string.\n```\nstring\n```\n\n### url\nThe field under validation must be a valid URL.\n```\nurl\n```\n\n### uuid4\nThe field under validation must be a valid uuid (version 4).\n```\nuuid4\n```\n\n## Advanced Usage\n### Custom Error Messages\nIf needed, you can specify custom error messages to overwrite the default error messages.\n\n**Messages**\n\nYou can overwrite all messages for a specific rule. In the example below we are overwriting all 'required' error messages:\n```\nvalidator = Validator()\nvalidator.overwrite_messages = {\n \"required\": \"Hey! This is a required field!\"\n}\n```\n\nYou can overwrite all messages for a specific field. In the example below we are overwriting all the error messages for the 'first_name' field:\n```\nvalidator = Validator()\nvalidator.overwrite_messages = {\n \"first_name\": \"Hey! This field contains an error!\"\n}\n```\n\nYou can overwrite an error message for a specific rule of a specific field. In the example below we are overwriting the 'first_name.required' error message:\n```\nvalidator = Validator()\nvalidator.overwrite_messages = {\n \"first_name.required\": \"Hey! This is a required field!\"\n}\n```\n\n**Fields**\n\nIf you would like the 'field' portion of your validation message to be replaced with a custom field name, you may do so like this:\n```\nvalidator = Validator()\nvalidator.overwrite_fields = {\n \"email\": \"e-mail address\"\n}\n```\n\n**Values**\n\nSometimes you may need the 'value' portion of your validation message to be replaced with a custom representation of the value. For example, consider the following rule that specifies that a credit card number is required if the payment_type has a value of cc:\n```\nrules = {\n \"credit_card_number\": \"required_if:payment_type,cc\"\n}\n```\n\nIf this validation rule fails, it will produce the following error message:\n```\nThe credit_card_number field is required if the payment_type field equals cc.\n```\n\nInstead of displaying cc as the payment type value, you may specify a custom value:\n```\nvalidator = Validator()\nvalidator.overwrite_values = {\n \"cc\": \"credit card\"\n}\n```\n\nNow if the validation rule fails it will produce the following message:\n```\nThe credit_card_number field is required if the payment_type field equals credit card.\n```\n\n### Custom Rules\nTo create a new rule, create a class that inherits from the Rule class. A rule is required to have the following specifications:\n- A rule should have a name attribute.\n- A rule should implement the passes() method which contains the logic that determines if a value passes the rule.\n- A rule should have a message property.\n\nHere is an example of an uppercase rule:\n```python\nfrom spotlight.rules import Rule\n\n\nclass UppercaseRule(Rule):\n \"\"\"Uppercase\"\"\"\n\n name = \"uppercase\"\n\n def passes(self, field: str, value: Any, parameters: List[str], validator) -> bool:\n self.message_fields = dict(field=field)\n\n return value.upper() == value\n\n @property\n def message(self) -> str:\n return \"The {field} field must be uppercase.\"\n```\n\nAs shown in the above example, the passes() method will receive the following arguments:\n\n- **field** -- name of the field under validation\n- **value** -- value of the field under validation\n- **parameters** -- list of rule parameters\n- **validator** -- instance of the validator\n\nAfter creating a custom rule it has to be registered with the validator:\n```python\nfrom custom_rules import UppercaseRule\n\nvalidator = Validator()\nvalidator.register_rule(UppercaseRule())\n```\n\nAfter registering the rule, it can be used:\n```\nrules = {\n \"test\": \"uppercase\"\n}\n\ndata = {\n \"test\": \"HELLO WORLD!\"\n}\n```\n\nIn addition to the name attribute, a rule has 2 additional attributes which are set to \"False\" by default: implicit & stop. These attributes may be overwritten. \n\n**Implicit**\n\nSetting implicit to \"True\" will cause the field under validation to be validated against the rule even if the field is not present. This is useful for rules such as \"required\".\n\n**Stop**\n\nSetting stop to \"True\" causes the validator to stop validating the rest of the rules specified for the current field if the current rule fails. \n\n**Message Fields**\n\nIf a rule contains a message property that contains keyword arguments (words surrounded by curly braces) like the one in the example below, the \"message_fields\" variable needs to be set in the passes method.\n```\n@property\ndef message(self) -> str:\n return \"The {field} field must be uppercase.\"\n```\n\nThe \"message_fields\" variable can be set as shown in the example below. The keyword arguments in the message property will be replaced with the values from the \"message_fields\" dictionary.\n```\ndef passes(self, field: str, value: Any, parameters: List[str], validator) -> bool:\n self.message_fields = dict(field=field)\n```\n\n## Plugins\n### Spotlight SQLAlchemy\nTo use database rules such as **unique** and **exists** checkout the [Spotlight SQLAlchemy](https://github.com/mdoesburg/spotlight-sqlalchemy) plugin.\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/mdoesburg/spotlight", "keywords": "spotlight validation validate", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "spotlight", "package_url": "https://pypi.org/project/spotlight/", "platform": "", "project_url": "https://pypi.org/project/spotlight/", "project_urls": { "Code": "https://github.com/mdoesburg/spotlight", "Documentation": "https://github.com/mdoesburg/spotlight", "Homepage": "https://github.com/mdoesburg/spotlight" }, "release_url": "https://pypi.org/project/spotlight/1.0.4/", "requires_dist": null, "requires_python": "", "summary": "Laravel style data validation for Python.", "version": "1.0.4" }, "last_serial": 5873341, "releases": { "0.1.2": [ { "comment_text": "", "digests": { "md5": "f14daaefa699fe1b8ae71d989c6bb072", "sha256": "cbde368a4400bf40db25dc88918f79493ada1ca0703458a9e86b446cf9616fcd" }, "downloads": -1, "filename": "spotlight-0.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "f14daaefa699fe1b8ae71d989c6bb072", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 24611, "upload_time": "2019-03-25T16:49:42", "url": "https://files.pythonhosted.org/packages/44/fd/53a40343c09c032a0d97d63aca733944d2902f186ac15942f4f75cb71914/spotlight-0.1.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "12299fb3c3bd77c333fdd4a7e8b46a0b", "sha256": "0046ddf77387e14b27a631f572261250340d271d39bebfc1ae02ea24383f8bee" }, "downloads": -1, "filename": "spotlight-0.1.2.tar.gz", "has_sig": false, "md5_digest": "12299fb3c3bd77c333fdd4a7e8b46a0b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12347, "upload_time": "2019-03-25T16:49:43", "url": "https://files.pythonhosted.org/packages/77/4b/9aa73b19c27c2862ff9f0e25c3f75e02e7c5c169710c4d639c1221a8bdca/spotlight-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "a026f854dff6ac90b1b54d8c232701be", "sha256": "139867561d457887cdc5ab91aba4845b80b5aaa9fbbc891f6f97283d2f08a9fd" }, "downloads": -1, "filename": "spotlight-0.1.3-py3-none-any.whl", "has_sig": false, "md5_digest": "a026f854dff6ac90b1b54d8c232701be", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 26762, "upload_time": "2019-03-26T00:26:47", "url": "https://files.pythonhosted.org/packages/cf/8d/4e01fe428e4dc4957c6a70bce4773789286cdc69a8f71da0680318b98faf/spotlight-0.1.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d4af0cf7b6a6af4e1a0aa203d30d6a6f", "sha256": "21c320728ab1c8c283d1720f7774c307b94793222c5bcc23438a6fc33fdcf33d" }, "downloads": -1, "filename": "spotlight-0.1.3.tar.gz", "has_sig": false, "md5_digest": "d4af0cf7b6a6af4e1a0aa203d30d6a6f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15709, "upload_time": "2019-03-26T00:26:48", "url": "https://files.pythonhosted.org/packages/cd/f9/f69fd02c4cf3da3c4d8f5cab4f14649b6bc158a2899757d27b843e6428f4/spotlight-0.1.3.tar.gz" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "e9650393d7ebf779734ec6baf4f51983", "sha256": "92b00cf7c2f140fee0e6f19e3375180c161e0113469174fe715f7f8b5b85d1e0" }, "downloads": -1, "filename": "spotlight-0.1.4-py3-none-any.whl", "has_sig": false, "md5_digest": "e9650393d7ebf779734ec6baf4f51983", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 28570, "upload_time": "2019-03-26T09:16:18", "url": "https://files.pythonhosted.org/packages/0f/be/a45340a81b070c27ba28a8479ab710f4e0c91a33fdd3710820c7a6c63074/spotlight-0.1.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "27d81c3374143665a5a525ba6639e8e2", "sha256": "0d79eb5a4966e54da24b057ec6f5cac8082cc61ab77dbbaa73e78acc2e1fd395" }, "downloads": -1, "filename": "spotlight-0.1.4.tar.gz", "has_sig": false, "md5_digest": "27d81c3374143665a5a525ba6639e8e2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16907, "upload_time": "2019-03-26T09:16:19", "url": "https://files.pythonhosted.org/packages/ca/3b/fe825e3d2ccc7565cfcbc288682bd2ebf6903d2c520c2c298e330eabe957/spotlight-0.1.4.tar.gz" } ], "0.1.5": [ { "comment_text": "", "digests": { "md5": "f55573ef726289d78e7fae00dcbefdab", "sha256": "fbef5963f37f7901dd2f434575737d437acdf8c60d152762a6e16b75f638114e" }, "downloads": -1, "filename": "spotlight-0.1.5-py3-none-any.whl", "has_sig": false, "md5_digest": "f55573ef726289d78e7fae00dcbefdab", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 28580, "upload_time": "2019-03-26T09:24:41", "url": "https://files.pythonhosted.org/packages/b8/0b/d6547af0d5b10b53e35a96c31de7b6d329471064b9b7b9ca1bcd0016f1db/spotlight-0.1.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b7fb012cd18831247e7defe9c3e0747c", "sha256": "6742dd28f1b3c4b7eb4b2bb8159639148cd7b1073b8e541ae0fd06b08e0c2cf0" }, "downloads": -1, "filename": "spotlight-0.1.5.tar.gz", "has_sig": false, "md5_digest": "b7fb012cd18831247e7defe9c3e0747c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16926, "upload_time": "2019-03-26T09:24:42", "url": "https://files.pythonhosted.org/packages/0d/cf/f8659a9460c67d7576dbdf6188f4579e49bf49219798e0ee9b4b138b54e6/spotlight-0.1.5.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "1d231a5b56c32fc925efc827eb6a1315", "sha256": "0efee09eb9504260eac24c4a4fdc71d0ead83747230df9a5f0ce92ed39deb953" }, "downloads": -1, "filename": "spotlight-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "1d231a5b56c32fc925efc827eb6a1315", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 27397, "upload_time": "2019-04-05T08:00:09", "url": "https://files.pythonhosted.org/packages/ba/2d/2ef14003128380eea4fba76e2bcb6f7d0a31c8c6edfb81fbc2d574f77855/spotlight-0.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b87b08d01d713828730bb830bff0082f", "sha256": "dc6ab6ea4e9607a1a50f272128132d0b6141795dceb763cfd2506d1136890c2d" }, "downloads": -1, "filename": "spotlight-0.2.0.tar.gz", "has_sig": false, "md5_digest": "b87b08d01d713828730bb830bff0082f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14791, "upload_time": "2019-04-05T08:00:11", "url": "https://files.pythonhosted.org/packages/a8/65/288bb35d6b65e8d5edb53f887df78caadfe99cfdc34093644f3d3c5bb48a/spotlight-0.2.0.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "238924921f9cdf6efabf94e423a59b40", "sha256": "0ca0976e0d05e8ec7d12b2af721349cf1c83834f77742df5dca8782dd3349a69" }, "downloads": -1, "filename": "spotlight-0.2.1-py3-none-any.whl", "has_sig": false, "md5_digest": "238924921f9cdf6efabf94e423a59b40", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 27991, "upload_time": "2019-04-08T08:07:56", "url": "https://files.pythonhosted.org/packages/1e/95/675fb74ee425a50ca11a17196e51b8904a1b5da44f7eff730a593853a493/spotlight-0.2.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3f55782abae2066e7f37982d2844fe53", "sha256": "693e03b04dd8e28685cea3e50cb182fddc6a655c3236b951aaa55b3163df52bc" }, "downloads": -1, "filename": "spotlight-0.2.1.tar.gz", "has_sig": false, "md5_digest": "3f55782abae2066e7f37982d2844fe53", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15001, "upload_time": "2019-04-08T08:07:58", "url": "https://files.pythonhosted.org/packages/a2/de/dd8b29df1298d335721544f6b8ac4c00db72d83513734049030d55b4d838/spotlight-0.2.1.tar.gz" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "2d52c96acd1445ffc3c338c67028287b", "sha256": "e6823b1f19eb39ea48d09bb7b81d048b950c958b986d6276e289db33d53c0740" }, "downloads": -1, "filename": "spotlight-0.2.2-py3-none-any.whl", "has_sig": false, "md5_digest": "2d52c96acd1445ffc3c338c67028287b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 28030, "upload_time": "2019-04-08T08:35:19", "url": "https://files.pythonhosted.org/packages/36/c9/c84a88f1c6e0b049957ce9e468b223f7275aa501cd8c63e5bb08b3c0c28f/spotlight-0.2.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b1940a3315f1ee3433393b21d43627e6", "sha256": "1be37c4bcf0ef3b0167d769a2f659a4dc33b9f49efefbe0a41ebc448ffd65208" }, "downloads": -1, "filename": "spotlight-0.2.2.tar.gz", "has_sig": false, "md5_digest": "b1940a3315f1ee3433393b21d43627e6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15043, "upload_time": "2019-04-08T08:35:21", "url": "https://files.pythonhosted.org/packages/c0/5a/ca0ad9ee3be874e2dcf36122f205b43bd2dc951b2b874be2480a6d61188e/spotlight-0.2.2.tar.gz" } ], "0.2.3": [ { "comment_text": "", "digests": { "md5": "12d62ce7e49c12288d03931f04f7a22a", "sha256": "37e81ad50dd6060509f47a793f3d5c4e9c01b8495bd996eaa9b4a0060445d198" }, "downloads": -1, "filename": "spotlight-0.2.3-py3-none-any.whl", "has_sig": false, "md5_digest": "12d62ce7e49c12288d03931f04f7a22a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 29860, "upload_time": "2019-04-12T08:52:45", "url": "https://files.pythonhosted.org/packages/2a/40/6118f54a3b361877c3114d9060631fcc3b45871c1976df6d0763cd8b4d81/spotlight-0.2.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c3fef71bf208f6f6499e17a8e8b0a5aa", "sha256": "755b93e658f722c21ebf96f730bfaa9b28918a34391ea66b921535f158ef51d1" }, "downloads": -1, "filename": "spotlight-0.2.3.tar.gz", "has_sig": false, "md5_digest": "c3fef71bf208f6f6499e17a8e8b0a5aa", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16293, "upload_time": "2019-04-12T08:52:46", "url": "https://files.pythonhosted.org/packages/25/3d/4c5e84967a335046667254a2c935ccd161a802fae21bc46e1d545673ee1e/spotlight-0.2.3.tar.gz" } ], "0.2.4": [ { "comment_text": "", "digests": { "md5": "a829d0d31581596c40ffe3387aa60f51", "sha256": "56c70fc0d49a8dc3159b5948e60eca1e4b1cadada675cee68bf2d64daec1e01a" }, "downloads": -1, "filename": "spotlight-0.2.4-py3-none-any.whl", "has_sig": false, "md5_digest": "a829d0d31581596c40ffe3387aa60f51", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 31916, "upload_time": "2019-04-25T08:42:10", "url": "https://files.pythonhosted.org/packages/35/0b/ef245a9515e945b832577c152a35abceb772fca0be24f0b369c9b0f56350/spotlight-0.2.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f448bfef90b8848266049d383b1b5f43", "sha256": "1aaa8154bbf8cb701f530757eda977e749eb43f05b0cb6b1b7dad4844b1876b8" }, "downloads": -1, "filename": "spotlight-0.2.4.tar.gz", "has_sig": false, "md5_digest": "f448bfef90b8848266049d383b1b5f43", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17798, "upload_time": "2019-04-25T08:42:12", "url": "https://files.pythonhosted.org/packages/11/4e/75408e59d6e45333073867b25f7d4a27bee86c4122d540bb7a72c3f2d177/spotlight-0.2.4.tar.gz" } ], "0.2.5": [ { "comment_text": "", "digests": { "md5": "256d91b871a77b43ee05e53204b19ff0", "sha256": "a7da1ffb3342372ed0051b3bca65a9620f325d89de83fd697d8feb5fcdd04f2e" }, "downloads": -1, "filename": "spotlight-0.2.5-py3-none-any.whl", "has_sig": false, "md5_digest": "256d91b871a77b43ee05e53204b19ff0", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 32212, "upload_time": "2019-04-26T11:26:34", "url": "https://files.pythonhosted.org/packages/e2/89/01fc1ddd3f632a086d00264e1d059e571fc849c41e9ee877551f8a757175/spotlight-0.2.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "29b08f6e35b596b7fc399af45c0a4aea", "sha256": "1c385d55cb4eca89c2c5252a32dbc00e1b8e7464b305bf2d85afc3bd17bda6cd" }, "downloads": -1, "filename": "spotlight-0.2.5.tar.gz", "has_sig": false, "md5_digest": "29b08f6e35b596b7fc399af45c0a4aea", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18044, "upload_time": "2019-04-26T11:26:35", "url": "https://files.pythonhosted.org/packages/c8/a8/7bc12575299222650be74d293ccb9d121051d8d57f661a8986d7bae64e24/spotlight-0.2.5.tar.gz" } ], "0.2.6": [ { "comment_text": "", "digests": { "md5": "7bbfb68a12ee20d900d55fd3527f5d32", "sha256": "aa9eca9ce078100616f4cb5637e7e1008b6d72788aa84d346c10a56ff04fcd66" }, "downloads": -1, "filename": "spotlight-0.2.6-py3-none-any.whl", "has_sig": false, "md5_digest": "7bbfb68a12ee20d900d55fd3527f5d32", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 32957, "upload_time": "2019-07-29T23:04:11", "url": "https://files.pythonhosted.org/packages/88/3c/2496354242aa682322ba849700a343a8c0eb6b02d9c67533a0c7de9779bd/spotlight-0.2.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c75e194993060b95cda093afb81770a9", "sha256": "31d07adf1216aa34357b326b615bc8bf9035ded776dfb33d4b30c0476249f18c" }, "downloads": -1, "filename": "spotlight-0.2.6.tar.gz", "has_sig": false, "md5_digest": "c75e194993060b95cda093afb81770a9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18492, "upload_time": "2019-07-29T23:04:13", "url": "https://files.pythonhosted.org/packages/5e/c6/8da99bb70052ff14cb5c2118557b24a1aa170d8072070cd4c1fcabe6115d/spotlight-0.2.6.tar.gz" } ], "1.0.0": [ { "comment_text": "", "digests": { "md5": "eca6b67fc97cf6b1def65fef1a5cb3cc", "sha256": "4f406bdec222d72e191cfb9f7e1a40d1c3f096830c7c0636ac7993684b65602d" }, "downloads": -1, "filename": "spotlight-1.0.0-py3-none-any.whl", "has_sig": false, "md5_digest": "eca6b67fc97cf6b1def65fef1a5cb3cc", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 42395, "upload_time": "2019-09-21T19:25:51", "url": "https://files.pythonhosted.org/packages/d7/82/cd6eff271776a9c0277e02c249570341942c324bf19cc73b60ecd8bd07f0/spotlight-1.0.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ed277954e362bac9e4a24c92e5a4028a", "sha256": "18659e662a94f1974dc59c84be44510b71cfae0a6d04845e60bf32fb4e0db7a8" }, "downloads": -1, "filename": "spotlight-1.0.0.tar.gz", "has_sig": false, "md5_digest": "ed277954e362bac9e4a24c92e5a4028a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28488, "upload_time": "2019-09-21T19:25:53", "url": "https://files.pythonhosted.org/packages/d5/c4/2be437fe84abbb6063cf6913ca7cedb5d706dab9465b4a484df3341b93a2/spotlight-1.0.0.tar.gz" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "e5a123e12a9d6e57fe3e2e44576a026d", "sha256": "bbf37e1af7c4b9f7b55eeff37c7d808bfbfe4709e4fb7af5bc2c5954f8e54fdc" }, "downloads": -1, "filename": "spotlight-1.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "e5a123e12a9d6e57fe3e2e44576a026d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 42540, "upload_time": "2019-09-22T07:32:49", "url": "https://files.pythonhosted.org/packages/66/28/844d7addc57ebd8802da8dd01c88d1a22efc5a6a77f76d3af2620178c6c2/spotlight-1.0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "10432e07010497d01d28072660a89b48", "sha256": "a404192708805790345d7ba9d2ab3063ec2c23996e7aacccfc5cf994164c1826" }, "downloads": -1, "filename": "spotlight-1.0.1.tar.gz", "has_sig": false, "md5_digest": "10432e07010497d01d28072660a89b48", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28648, "upload_time": "2019-09-22T07:32:51", "url": "https://files.pythonhosted.org/packages/f1/fc/42c5108a1ef41537c8519590c7df5677b09e037d45a85a9f5606facbdae7/spotlight-1.0.1.tar.gz" } ], "1.0.2": [ { "comment_text": "", "digests": { "md5": "4e07fa167ee8cd2992bef3a0cbfe8bf7", "sha256": "58343aae39c7fe8f7f1cd06787796fec0f402e35a7a7be6731d76b6a288d087c" }, "downloads": -1, "filename": "spotlight-1.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "4e07fa167ee8cd2992bef3a0cbfe8bf7", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 42759, "upload_time": "2019-09-22T15:01:55", "url": "https://files.pythonhosted.org/packages/35/18/83255a03eabe696fbc7bd972fd27b700a10f926529418647cd450689c90d/spotlight-1.0.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "da90ad2198163271510ae8b4e50e1785", "sha256": "512c08d21006eed50a362f1174a9f02cfd2207f50c59ab3e7a7895b58d36dfc8" }, "downloads": -1, "filename": "spotlight-1.0.2.tar.gz", "has_sig": false, "md5_digest": "da90ad2198163271510ae8b4e50e1785", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28905, "upload_time": "2019-09-22T15:01:57", "url": "https://files.pythonhosted.org/packages/b1/90/6fefc435603c562c0d0b6781cf268cfb8bb49b750bdb3250c9899c20a9a4/spotlight-1.0.2.tar.gz" } ], "1.0.3": [ { "comment_text": "", "digests": { "md5": "00a0a7b26ef6c5349d3d3c27e246b6ab", "sha256": "efee23221531dfbe4f061cb74f4146d5b636c23ce06a12c728f3821a3749780a" }, "downloads": -1, "filename": "spotlight-1.0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "00a0a7b26ef6c5349d3d3c27e246b6ab", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 42743, "upload_time": "2019-09-22T15:07:57", "url": "https://files.pythonhosted.org/packages/48/26/d6ab0c1307d5c651db6085dfbf062537016978ce03c84f7460c63bbd83c8/spotlight-1.0.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "847fa1b6bb9134e3ba67e7e03840b8c3", "sha256": "665992579d361b927f8f7911819efbec6f229b43af38bf05ff38ce8d4f731a93" }, "downloads": -1, "filename": "spotlight-1.0.3.tar.gz", "has_sig": false, "md5_digest": "847fa1b6bb9134e3ba67e7e03840b8c3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28893, "upload_time": "2019-09-22T15:07:59", "url": "https://files.pythonhosted.org/packages/54/e6/6734f8f798b294daf736fae4bb87e244cca364a0f7477e1c223d14a4f513/spotlight-1.0.3.tar.gz" } ], "1.0.4": [ { "comment_text": "", "digests": { "md5": "0c9938e0dd07c45931cda76227873681", "sha256": "55756838f9bbc7a4daf853b6b40749b923a26f3ef61709470f2195f04e02694e" }, "downloads": -1, "filename": "spotlight-1.0.4-py3-none-any.whl", "has_sig": false, "md5_digest": "0c9938e0dd07c45931cda76227873681", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 44148, "upload_time": "2019-09-23T12:34:50", "url": "https://files.pythonhosted.org/packages/a3/ff/eb8d2ff1d4eb2dce6ba57c2e6f5cf25162f2a4e845ee0e9e384eb4970061/spotlight-1.0.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e576a3319c46ec34154933696ca98c9a", "sha256": "6ac5fbb73e9d5ab8a66a709bc1008baac35c4b78d98b4ed7f4576833d35f1f34" }, "downloads": -1, "filename": "spotlight-1.0.4.tar.gz", "has_sig": false, "md5_digest": "e576a3319c46ec34154933696ca98c9a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 29560, "upload_time": "2019-09-23T12:34:52", "url": "https://files.pythonhosted.org/packages/ed/ec/09abd5ef2b87fb99e6e6435b8bbccc9d9513e8ba4bd3dc5235fc29133e4c/spotlight-1.0.4.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "0c9938e0dd07c45931cda76227873681", "sha256": "55756838f9bbc7a4daf853b6b40749b923a26f3ef61709470f2195f04e02694e" }, "downloads": -1, "filename": "spotlight-1.0.4-py3-none-any.whl", "has_sig": false, "md5_digest": "0c9938e0dd07c45931cda76227873681", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 44148, "upload_time": "2019-09-23T12:34:50", "url": "https://files.pythonhosted.org/packages/a3/ff/eb8d2ff1d4eb2dce6ba57c2e6f5cf25162f2a4e845ee0e9e384eb4970061/spotlight-1.0.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e576a3319c46ec34154933696ca98c9a", "sha256": "6ac5fbb73e9d5ab8a66a709bc1008baac35c4b78d98b4ed7f4576833d35f1f34" }, "downloads": -1, "filename": "spotlight-1.0.4.tar.gz", "has_sig": false, "md5_digest": "e576a3319c46ec34154933696ca98c9a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 29560, "upload_time": "2019-09-23T12:34:52", "url": "https://files.pythonhosted.org/packages/ed/ec/09abd5ef2b87fb99e6e6435b8bbccc9d9513e8ba4bd3dc5235fc29133e4c/spotlight-1.0.4.tar.gz" } ] }