{ "info": { "author": "Mojtaba Asadi", "author_email": "m.asadi.al@outlook.com", "bugtrack_url": null, "classifiers": [ "Framework :: Django", "License :: OSI Approved :: GNU General Public License v3 (GPLv3)", "Operating System :: OS Independent", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3" ], "description": "# Django Rule-base Validator [![image](https://img.shields.io/pypi/v/django-rulebase.svg)](https://pypi.python.org/pypi/django-rulebase) [![image](https://img.shields.io/pypi/pyversions/django-rulebase.svg)](https://pypi.python.org/pypi/django-rulebase) [![image](https://travis-ci.org/mojtabaasadi/django-rulebase.svg?branch=master)](https://travis-ci.org/mojtabaasadi/django-rulebase)\n\n\ninspired by laravel Requests , for making django validations painless.\n\n\n#### to use:\n```\npip install django-rulebase\n```\n\nin app.views:\n```python\nfrom django_rulebase.validator import require_validation\n\n@require_validation({\n \"egg\":\"file|mimetypes:application/octet-stream\"\n})\ndef view_function(request):\n ...\n\n```\nor \n```python\nfrom django.http import HttpResponse,HttpResponseBadRequest\nfrom django_rulebase import Request \n\ndef good_request(request,is_valid,errors):\n\tif is_valid:return HttpResponse(\"good request\")\n\treturn HttpResponseBadRequest(errors['date'])\n\nclass CustomRequest(Request):\n\tview = good_request\n\tdef rules(self):\n\t\treturn {\n\t\t\t\"date\":\"date|required|before:tomorrow|after:yesterday\"\n\t\t}\n```\nin app.urls\n```python\nfrom django.conf.urls import url\nfrom .views import CustomRequest \nurlpatterns = [\n\turl(r'^validate/$', CustomRequest.asView()),\n]\n``` \n#### with custom rule :\n```python \nfrom django_rulebase import Request,Rule\n\nclass divisible(Rule):\n name = \"divisible\"\n def passes(self, value):\n\t\t# should return boolean\n return all([value % self.parse_value(field)[1]==0 for field in self.options])\n\n def message(self):\n return \"{value} is not divisible to {options} \"\n\nclass CustomRequest(Request):\n view = good_request\n def rules(self):\n return {\n \"date\":\"date|required|string|before:tomorrow|after:yesterday\",\n \"some\":\"required|integer\",\n \"num\":[\"required|integer\",divisible([\"some\"])]\n }\n```\nor use everywhere:\n```python\nfrom django_rulebase import Validator\n\ndef good_request(request):\n data = json.loads(request.body)\n validator = Validator({\n \"date\":\"date|required|string|before:tomorrow|after:yesterday\",\n \"some\":\"required|integer\",\n \"num\":[\"required|integer\",divisible([\"some\"])]\n })\n validator.run_validation(data)\n if not validator.valid :\n return JsonResponse(validator.errors,safe=False)\n\n```\n\n# built-in rules\nBelow is a list of all available validation rules and their function:\n\nrule|rule|rule\n---|---|---\n[Accepted](#accepted)|[Active URL](#active-url)|[After (Date)](#afterdate)\n[After Or Equal (Date)](#after-or-equaldate)|[Alpha](#alpha)|[Alpha Dash](#alpha-dash)\n[Alpha Numeric](#alpha-num)|[Array](#array)|[Before (Date)](#beforedate)\n[Before Or Equal (Date)](#before-or-equaldate)|[Between](#betweenminmax)|[Boolean](#boolean)\n[Confirmed](#confirmed)|[Date](#date)|[Date Equals](#date-equalsdate)\n[Date Format](#date-formatformat)|[Different](#differentfield)|[Digits](#digitsvalue)\n[Digits Between](#digits-betweenminmax)|[Distinct](#distinct)|[EMail](#email)\n[Exists (Database)](#existstablecolumn)|[File](#file)|[Filled](#filled)\n[Greater Than](#gtfield)|[Greater Than Or Equal](#gtefield)|[Image (File)](#image)\n[In](#infoobar)|[In Array](#in-arrayanotherfield)|[Integer](#integer)\n[IP Address](#ip)|[JSON](#json)|[Less Than](#ltfield)\n[Less Than Or Equal](#ltefield)|[Max](#maxvalue)|[MIME Types](#mimetypestextplain)\n[MIME Type By File Extension](#mimesfoobar)|[Min](#minvalue)|[Not In](#not-infoobar)\n[Not Regex](#not-regexpattern)|[Nullable](#nullable)|[Numeric](#numeric)\n[Present](#present)|[Regular Expression](#regexpattern)|[Required](#required)\n[Required If](#required-ifanotherfieldvalue)|[Required Unless](#required-unlessanotherfieldvalue)|[Required With](#required-withfoobar)\n[Required With All](#required-with-allfoobar)|[Required Without](#required-withoutfoobar)|[Required Without All](#required-without-allfoobar)\n[Same](#samefield)|[Size](#sizevalue)|[String](#string)\n[Timezone](#timezone)|[Unique (Database)](#uniquetablecolumn)|[URL](#url)\n[UUID](#uuid)| - | -\n\n\n### accepted\n\nThe field under validation must be yes, on, 1, or true. This is useful for validating \"Terms of Service\" acceptance.\n\n### active-url\n\nThe field under validation must have a valid A or AAAA record according to the [dnspython](http://www.dnspython.org).\n\n### after:date\n\nThe field under validation must be a value after a given date. The dates will be passed into the [dateparser](https://dateparser.readthedocs.io):\n\n\n\n```python\n'finish_date' : 'required|date|after:start_date'\n'another_date' : 'required|date|after:tomorrow'\n```\n\n### after-or-equal:date\n\nThe field under validation must be a value after or equal to the given date. For more information, see the [after rule](#afterdate).\n\n### alpha\n\nThe field under validation must be entirely alphabetic characters.\n\n### alpha-dash\n\nThe field under validation may have alpha-numeric characters, as well as dashes and underscores.\n\n### alpha-num\n\nThe field under validation must be entirely alpha-numeric characters.\n\n### array\n\nThe field under validation must be a list array.\n\n### before:date\n\nThe field under validation must be a value preceding the given date. The dates will be passed into [dateparser](https://dateparser.readthedocs.io). In addition, like the [after rule](#afterdate), the name of another field under validation may be supplied as the value of date.\n\n### before-or-equal:date\n\nThe field under validation must be a value preceding or equal to the given date. The dates will be passed into [dateparser](https://dateparser.readthedocs.io). In addition, like the [after rule](#afterdate), the name of another field under validation may be supplied as the value of date.\n\n### between:min,max\n\nThe field under validation must have a size between the given min and max. Strings, numerics, arrays, and files are evaluated in the same fashion as the [size rule](#sizevalue).\n\n### boolean\n\nThe field under validation must be able to be cast as a boolean. Accepted input are true, false, 1, 0, \"1\", and \"0\".\n\n### confirmed\n\nThe field under validation must have a matching field of foo_confirmation. For example, if the field under validation is password, a matching password_confirmation field must be present in the input.\n\n### date\n|The field under validation must be a valid date according to the [dateparser](https://dateparser.readthedocs.io).\n\n### date-equals:date\n\nThe field under validation must be equal to the given date. The dates will be passed into [dateparser](https://dateparser.readthedocs.io).\n\n### date-format:format\n\nThe field under validation must match the given format. You should use either date or date_format when validating a field, not both.\n\n### different:field\n\nThe field under validation must have a different value than field.\n\n### digits:value\n\nThe field under validation must be numeric and must have an exact length of value.\n\n### digits-between:min,max\n\nThe field under validation must have a length between the given min and max.\n\n\n### distinct\n\nWhen working with arrays, the field under validation must not have any duplicate values.\n\n\n```python\n'foo.*.id' : 'distinct'\n```\n\n\n### email\n\nThe field under validation must be formatted as an e-mail address.\n\n### exists:table,column\n\nThe field under validation must exist on a given database table.\n\nBasic Usage Of Exists Rule\n```python\n'state' : 'exists:states'\n```\nIf the column option is not specified, the field name will be used.\n\nSpecifying A Custom Column Name\n```python\n'state' : 'exists:states,abbreviation'\n```\nSpecifying A Custom connection\n```python\n'state' : 'exists:connection.states,abbreviation'\n```\nor usring model:\n```python\nfrom app.models import SomeModel\nfrom django_rulebase.rule import exists\n...\n'state' : exists(SomeModel,\"attribute\")\n```\n### file\n\nThe field under validation must be a successfully uploaded file.\n\n### filled\n\nThe field under validation must not be empty when it is present.\n\n### gt:field\n\nThe field under validation must be greater than the given field. The two fields must be of the same type. Strings, numerics, arrays, and files are evaluated using the same conventions as the [size rule](#sizevalue).\n\n### gte:field\n\nThe field under validation must be greater than or equal to the given field. The two fields must be of the same type. Strings, numerics, arrays, and files are evaluated using the same conventions as the [size rule](#sizevalue).\n\n### image\n\nThe file under validation must be an image (jpeg, png, bmp, gif, or svg)\n\n### in:foo,bar,...\n\nThe field under validation must be included in the given list of values.\n Since this rule often requires you to implode an array,\n you can use _in() from .rule to fluently construct the rule:\n\n```python\nfrom djanfo_rulebase.rule import _in\n...\n\"field\" : [\"required\",_in(1,3,\"string\")]\n``` \n\n### in-array:anotherfield.*\n\nThe field under validation must exist in anotherfield's values.\n\n### integer\n\nThe field under validation must be an integer.\n\n### ip\n\nThe field under validation must be an IP address.\n\n\n\n### ipv4\n\nThe field under validation must be an IPv4 address.\n\n\n\n### ipv6\n\nThe field under validation must be an IPv6 address.\n\n### json\n\nThe field under validation must be a valid JSON string.\n\n### lt:field\n\nThe field under validation must be less than the given field. The two fields must be of the same type. Strings, numerics, arrays, and files are evaluated using the same conventions as the [size rule](#sizevalue).\n\n### lte:field\n\nThe field under validation must be less than or equal to the given field. The two fields must be of the same type. Strings, numerics, arrays, and files are evaluated using the same conventions as the [size rule](#sizevalue).\n\n### max:value\n\nThe field under validation must be less than or equal to a maximum value. Strings, numerics, arrays, and files are evaluated in the same fashion as the [size rule](#sizevalue).\n\n### mimetypes:text/plain,...\n\nThe file under validation must match one of the given MIME types:\n\n```python\n'video' : 'mimetypes:video/avi,video/mpeg,video/quicktime'\n```\n\nTo determine the MIME type of the uploaded file, the file's contents will be read and the framework will attempt to guess the MIME type, which may be different from the client provided MIME type.\n\n### mimes:foo,bar,...\n\nThe file under validation must have a MIME type corresponding to one of the listed extensions.\n\n\n\nBasic Usage Of MIME Rule\n\n```python\n'photo' : 'mimes:jpeg,bmp,png'\n```\n\nEven though you only need to specify the extensions, this rule actually validates against the MIME type of the file by reading the file's contents and guessing its MIME type.\n\n\n\nA full listing of MIME types and their corresponding extensions may be found at the following location: [read more](https://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types)\n\n### min:value\n\nThe field under validation must have a minimum value. Strings, numerics, arrays, and files are evaluated in the same fashion as the [size rule](#sizevalue).\n\n### not-in:foo,bar,...\n\nThe field under validation must not be included in the given list of values. The Rule::notIn method may be used to fluently construct the rule:\n\n\n\n### not-regex:pattern\n\nThe field under validation must not match the given regular expression.\n\n\n\nInternally, this rule uses the re.search. The pattern specified should obey the same formatting required by preg_match and thus also include valid delimiters. For example:\n\n```python\n'email' : 'not_regex:^.+$'.\n```\n\nNote: When using the regex / not_regex patterns, it may be necessary to specify rules in an array instead of using pipe delimiters, especially if the regular expression contains a pipe character.\n\n### nullable\n\nThe field under validation may be null. This is particularly useful when validating primitive such as strings and integers that can contain null values.\n\n### numeric\n\nThe field under validation must be numeric.\n\n### present\n\nThe field under validation must be present in the input data but can be empty.\n\n### regex:pattern\n\nThe field under validation must match the given regular expression.\n\n\n\nInternally, this rule uses the re.search. The pattern specified should obey the same formatting required by re.compile and thus also include valid delimiters. For example:\n\n```python\n'email' : 'regex:^.+@.+$'.\n```\n\nNote: When using the regex / not_regex patterns, it may be necessary to specify rules in an array instead of using pipe delimiters, especially if the regular expression contains a pipe character.\n\n### required\n\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\nThe value is null.\nThe value is an empty string.\nThe value is an empty array or empty Countable object.\nThe value is an uploaded file with no path.\n\n### required-if:anotherfield,value,...\n\nThe field under validation must be present and not empty if the anotherfield field is equal to any value.\n\n### required-unless:anotherfield,value,...\n\nThe field under validation must be present and not empty unless the anotherfield field is equal to any value.\n\n### required-with:foo,bar,...\n\nThe field under validation must be present and not empty only if any of the other specified fields are present.\n\n### required-with-all:foo,bar,...\n\nThe field under validation must be present and not empty only if all of the other specified fields are present.\n\n### required-without:foo,bar,...\n\nThe field under validation must be present and not empty only when any of the other specified fields are not present.\n\n### required-without-all:foo,bar,...\n\nThe field under validation must be present and not empty only when all of the other specified fields are not present.\n\n### same:field\n\nThe given field must match the field under validation.\n\n### size:value\n\nThe field under validation must have a size matching the given value. For string data, value corresponds to the number of characters. For numeric data, value corresponds to a given integer value. For an array, size corresponds to the count of the array. For files, size corresponds to the file size in kilobytes.\n\n### string\n\nThe field under validation must be a string. If you would like to allow the field to also be null, you should assign the [nullable rule](#nullable) to the field.\n\n### timezone\n\nThe field under validation must be a valid timezone identifier according to the pytz.\n\n### unique:table,column\n\nThe field under validation must be unique in a given database table. If the column option is not specified, the field name will be used.\n\n\n\nSpecifying A Custom Column Name:\n\n```python\n'email' : 'unique:users,email_address'\n```\n\n\n\n### url\n\nThe field under validation must be a valid URL.\n\n### uuid\n\nThe field under validation must be a valid RFC 4122 (version 1, 3, 4, or 5) universally unique identifier (UUID).\n\n## to do :\n\n- integrate with django form \n- integrate with rest_framwork\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/mojtabaasadi/django-rulebase", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "django-rulebase", "package_url": "https://pypi.org/project/django-rulebase/", "platform": "", "project_url": "https://pypi.org/project/django-rulebase/", "project_urls": { "Homepage": "https://github.com/mojtabaasadi/django-rulebase" }, "release_url": "https://pypi.org/project/django-rulebase/0.1.0/", "requires_dist": [ "dateparser", "dnspython", "pytz", "django" ], "requires_python": "", "summary": "Django rule base validation , inspired by laravel Request", "version": "0.1.0" }, "last_serial": 4585939, "releases": { "0.0.10": [ { "comment_text": "", "digests": { "md5": "f9ee4b5f7dbea8ff177cb0c817045d77", "sha256": "74642de8571b44b2e3ff9c11100ddd38a0a42161b8bb3456adf07cef2d3a5cb8" }, "downloads": -1, "filename": "django_rulebase-0.0.10-py3-none-any.whl", "has_sig": false, "md5_digest": "f9ee4b5f7dbea8ff177cb0c817045d77", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 14121, "upload_time": "2018-12-08T06:53:51", "url": "https://files.pythonhosted.org/packages/53/b4/2b1a534ce2e6c2bbda094718b5350822486d31d98af931f45b3f3d8b45c3/django_rulebase-0.0.10-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "229007f18aa1dcb187835c0f4a69a191", "sha256": "81cf49654e8dc2ef94e9e60b048d354e63e5db3761b85684a6cbaaa06b7cb6a6" }, "downloads": -1, "filename": "django_rulebase-0.0.10.tar.gz", "has_sig": false, "md5_digest": "229007f18aa1dcb187835c0f4a69a191", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16951, "upload_time": "2018-12-08T06:53:55", "url": "https://files.pythonhosted.org/packages/ff/7c/3d8a6d0ed9910763f3908bbcc0848653041a5d9c29fa3c01c655220ab635/django_rulebase-0.0.10.tar.gz" } ], "0.0.5": [ { "comment_text": "", "digests": { "md5": "f929267adc49ddd47700e9cc51491fa7", "sha256": "dcfcb1339ad508934ff569818d604ca29490af7a58899c62b814130ad791111f" }, "downloads": -1, "filename": "django_rulebase-0.0.5-py3-none-any.whl", "has_sig": false, "md5_digest": "f929267adc49ddd47700e9cc51491fa7", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 13581, "upload_time": "2018-11-23T09:05:03", "url": "https://files.pythonhosted.org/packages/5d/fe/b007fa484fc5273b3429698c5409e8102c3de44fc12685e30573fdef055c/django_rulebase-0.0.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5d44aa8a2aceacec34dff0bdad12d938", "sha256": "8f194b277dc9b52e1174092dd4e79a0718f4eedba657c4e21fa1b635a85af29b" }, "downloads": -1, "filename": "django_rulebase-0.0.5.tar.gz", "has_sig": false, "md5_digest": "5d44aa8a2aceacec34dff0bdad12d938", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16122, "upload_time": "2018-11-23T09:05:05", "url": "https://files.pythonhosted.org/packages/d2/68/414233415924521d3d154b98a69ac7d5f2780ca1e6fab5dd00794f58c796/django_rulebase-0.0.5.tar.gz" } ], "0.0.6": [ { "comment_text": "", "digests": { "md5": "d8fb2d92dba6e7932c48db3add9f28ef", "sha256": "6dab924016e4c6c7522a0a1f8161f5c2c398af94a641b34a93acb05000535022" }, "downloads": -1, "filename": "django_rulebase-0.0.6-py3-none-any.whl", "has_sig": false, "md5_digest": "d8fb2d92dba6e7932c48db3add9f28ef", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 13734, "upload_time": "2018-12-01T08:30:57", "url": "https://files.pythonhosted.org/packages/66/f7/e9b4be819d3c93d3c9f8e56c3c58e207bee600da79a052f43d19782fa20c/django_rulebase-0.0.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8871a6a886734f15f8035c2ef072b314", "sha256": "96c8aa1f2be54203ebc71482d3c96ec2753da8d4785940d70e1ded5591bea796" }, "downloads": -1, "filename": "django_rulebase-0.0.6.tar.gz", "has_sig": false, "md5_digest": "8871a6a886734f15f8035c2ef072b314", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16362, "upload_time": "2018-12-01T08:31:00", "url": "https://files.pythonhosted.org/packages/ef/a9/260f03ae914ed4ebabfd79ff0ce5e9c89520351b1ea4fcdf91760487936c/django_rulebase-0.0.6.tar.gz" } ], "0.0.7": [ { "comment_text": "", "digests": { "md5": "58d5f9571c9cf7e368c5de1ae7262f3f", "sha256": "acc386a7ab3038e63cf55e8b39a5ef18a8ede0c3ee907c6392dc0fde314c6487" }, "downloads": -1, "filename": "django_rulebase-0.0.7-py3-none-any.whl", "has_sig": false, "md5_digest": "58d5f9571c9cf7e368c5de1ae7262f3f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 26245, "upload_time": "2018-12-01T13:11:54", "url": "https://files.pythonhosted.org/packages/f2/1b/91418ddf6ad389071c309445904a47516b949caf8b27604b677d71a5e7cb/django_rulebase-0.0.7-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d392ef030154ad210681e8c8c6953ec5", "sha256": "2d2336d8cd21cbdef6838ce76ee745df165745891a803caa3f1e31cdddc39997" }, "downloads": -1, "filename": "django_rulebase-0.0.7.tar.gz", "has_sig": false, "md5_digest": "d392ef030154ad210681e8c8c6953ec5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16402, "upload_time": "2018-12-01T13:11:57", "url": "https://files.pythonhosted.org/packages/c7/68/a2b6e2782f9d079456f5f3ea229bc65b5692b91f07b4173cd7f1c3a22ef9/django_rulebase-0.0.7.tar.gz" } ], "0.0.8": [ { "comment_text": "", "digests": { "md5": "bebb37d295435266964cd197483f85c5", "sha256": "0a706afeca8621a793aef1a7ead12b4bba82c84dc56c5c55abe1cdb2a9f7c1e8" }, "downloads": -1, "filename": "django_rulebase-0.0.8-py3-none-any.whl", "has_sig": false, "md5_digest": "bebb37d295435266964cd197483f85c5", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 13758, "upload_time": "2018-12-01T18:48:53", "url": "https://files.pythonhosted.org/packages/2e/22/fce42d986f9689092b2906c59f30d2a03be7ae9127dc1515fb5f3be8ab80/django_rulebase-0.0.8-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "dc7078b28dc874a1d23df5de7dc6f85c", "sha256": "57b4014c0d31090e61f2966c6e32f70e9d2e742ead4e4a7013a196a1cac276e3" }, "downloads": -1, "filename": "django_rulebase-0.0.8.tar.gz", "has_sig": false, "md5_digest": "dc7078b28dc874a1d23df5de7dc6f85c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16431, "upload_time": "2018-12-01T18:48:56", "url": "https://files.pythonhosted.org/packages/1e/8e/657bba62e3aef23908624754ba6dbb0575dbf5b042d9406a58f802e410e5/django_rulebase-0.0.8.tar.gz" } ], "0.0.9": [ { "comment_text": "", "digests": { "md5": "de61a3c04a179994171adeb5c7c5a02b", "sha256": "a1f37793637c0122104babca0add977ef297b91b6a2fb5e0a2669bc79d79a893" }, "downloads": -1, "filename": "django_rulebase-0.0.9-py3-none-any.whl", "has_sig": false, "md5_digest": "de61a3c04a179994171adeb5c7c5a02b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 13839, "upload_time": "2018-12-02T13:15:16", "url": "https://files.pythonhosted.org/packages/07/cc/43ee097dc0bf2c23ad8dff5ef146e22ce72c7b3192859ef829837c0df943/django_rulebase-0.0.9-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "de0583010a3f9cdd6d4c6fcb3d4632d8", "sha256": "7b9751cd8a5eb2e5876d645dc8274825049251008705ffe31cacdef313c2f267" }, "downloads": -1, "filename": "django_rulebase-0.0.9.tar.gz", "has_sig": false, "md5_digest": "de0583010a3f9cdd6d4c6fcb3d4632d8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16534, "upload_time": "2018-12-02T13:15:19", "url": "https://files.pythonhosted.org/packages/12/ff/f4b784ad535471d94da6b16de1912f8155f5fe46bfe820dd6c2854550e87/django_rulebase-0.0.9.tar.gz" } ], "0.1.0": [ { "comment_text": "", "digests": { "md5": "0f69ad975753e776d463d9890da8a333", "sha256": "9092788082e720d416ad8b213e20bf1bb516aebb265da772f7c3795a166f3f0c" }, "downloads": -1, "filename": "django_rulebase-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "0f69ad975753e776d463d9890da8a333", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 14556, "upload_time": "2018-12-11T15:45:01", "url": "https://files.pythonhosted.org/packages/5a/af/ae45a19f95da655406b67e33ecf905466dfc91716d4fa24cf76cb7a5b556/django_rulebase-0.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "cec70fe4c352460167109d41dbcad363", "sha256": "69ab31ef8dcddab37212346d8bff840ca4f8b9619b6dd9b885b6a3c8cc03dbcb" }, "downloads": -1, "filename": "django_rulebase-0.1.0.tar.gz", "has_sig": false, "md5_digest": "cec70fe4c352460167109d41dbcad363", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17620, "upload_time": "2018-12-11T15:45:04", "url": "https://files.pythonhosted.org/packages/52/d1/e982eda5f917e9de181b3e84ec9d0a4c787bc1847ce1f52226edd1d3af69/django_rulebase-0.1.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "0f69ad975753e776d463d9890da8a333", "sha256": "9092788082e720d416ad8b213e20bf1bb516aebb265da772f7c3795a166f3f0c" }, "downloads": -1, "filename": "django_rulebase-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "0f69ad975753e776d463d9890da8a333", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 14556, "upload_time": "2018-12-11T15:45:01", "url": "https://files.pythonhosted.org/packages/5a/af/ae45a19f95da655406b67e33ecf905466dfc91716d4fa24cf76cb7a5b556/django_rulebase-0.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "cec70fe4c352460167109d41dbcad363", "sha256": "69ab31ef8dcddab37212346d8bff840ca4f8b9619b6dd9b885b6a3c8cc03dbcb" }, "downloads": -1, "filename": "django_rulebase-0.1.0.tar.gz", "has_sig": false, "md5_digest": "cec70fe4c352460167109d41dbcad363", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17620, "upload_time": "2018-12-11T15:45:04", "url": "https://files.pythonhosted.org/packages/52/d1/e982eda5f917e9de181b3e84ec9d0a4c787bc1847ce1f52226edd1d3af69/django_rulebase-0.1.0.tar.gz" } ] }