{
"info": {
"author": "benjimor",
"author_email": "benjimor44@gmail.com",
"bugtrack_url": null,
"classifiers": [
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
"Programming Language :: Python :: 3"
],
"description": "# CaLi\n\n[](https://travis-ci.com/benjimor/CaLi)\n[](https://badge.fury.io/py/pycali)\n\nA python package that defines a partial order over RDF licenses\n\n# Introduction\n\nCaLi is a lattice-based model for license orderings. This repository contains a python package that implements this model.\n\n\nCode uses the ODRL CaLi ordering \u27e8A, LS, CL, C\u2192\u27e9 such that:\n* A is the set of 72 actions of ODRL (e.g., cc:Distribution, cc:ShareAlike, etc.),\n* LS is the restrictiveness lattice of status `Undefined <= Permissions <= Duty <= Prohibition` (actions can be either permitted, obliged, prohibited or not specified; in this LS, the undefined status is the least restrictive and the prohibited one the most restrictive),\n* CL and\n* C\u2192 are sets of constraints.\n\n[CaLi online demonstrator](http://cali.priloo.univ-nantes.fr/) Is an exemple of \nlicense compliant search engine using CaLi model.\n\n# Installation\n\nInstallation in a `virtualenv` is recommended.\n\nAssuming you already have `python 3` and `pip` installed\n\n```bash\npip install pycali\n```\n\nthis will automatically install [rdflib](https://github.com/RDFLib/rdflib) used to manipulate RDF.\n\n# Getting started\n\nThis section shows how to create a CaLi ordering with ease.\n\n## Load a vocabulary\n\nA vocabulary object is a set of URIs ([rdflib.term.URIRef](https://rdflib.readthedocs.io/en/stable/rdf_terms.html#urirefs)) identifying actions (e.g., cc:Distribution, cc:ShareAlike, odrl:play, etc.)\n\nCreate your own vocabulary inheriting from Vocabulary object or\nuse the implemented ODRL Vocabulary:\n\n```python\nfrom pycali.vocabulary import ODRLVocabulary\n\nodrl = ODRLVocabulary()\n# access the list of actions\nodrl.actions\n```\n\n## Load a Restrictiveness lattice of status (LS)\n\nLS is a lattice defining the restrictiveness order between statuses of the \nactions (permitted, obliged, prohibited).\nRepository contains [examples of LS](https://github.com/benjimor/CaLi/tree/master/pycali/examples/restrictiveness_lattice_of_status) in RDF.\nA Restrictiveness lattice of status is instantiated using a LS in RDF ([rdflib.Graph](https://rdflib.readthedocs.io/en/stable/apidocs/rdflib.html?highlight=graph#rdflib.graph.Graph)):\n\n```python\nfrom rdflib import Graph\nfrom pycali.restrictiveness_lattice_of_status import RestrictivenessLatticeOfStatus\nfrom pycali.examples.restrictiveness_lattice_of_status.DL1 import dl1_rdf\n\n# Load the LS in the examples\nDL1 = RestrictivenessLatticeOfStatus(Graph().parse(data=dl1_rdf, format='ttl'))\n```\nNote that you can parse your own file using [location parameter](https://rdflib.readthedocs.io/en/stable/apidocs/rdflib.html?highlight=graph#rdflib.graph.Graph.parse)\n\n## Load licenses\n\nA license i a set of statuses associated to actions of the vocabulary.\nYou can define your own license by creating a class inheriting from License object or \nuse the implemented ODRLLicense object.\nRepository contains [examples of ODRL licenses dataset](https://github.com/benjimor/CaLi/tree/master/pycali/examples/licenses).\n\n### Load a dataset of licenses\n\nODRLLicenses object is able to generate a set of ODRLlicense object from a rdf dataset of licenses\ndescribed using [ODRL Vocabulary](https://www.w3.org/TR/odrl-vocab/):\n\n\n```python\nfrom rdflib import Graph\nfrom pycali.license import ODRLLicenses\nfrom pycali.examples.licenses.ld_licenses_odrl import ld_licenses_rdf\n\nld_licenses_graph = Graph().parse(data=ld_licenses_rdf,\n format='ttl')\nlicenses = ODRLLicenses(vocabulary=odrl,\n ls=DL1,\n rdf_graph=ld_licenses_graph)\n```\nNote that you can parse your own file using [location parameter](https://rdflib.readthedocs.io/en/stable/apidocs/rdflib.html?highlight=graph#rdflib.graph.Graph.parse)\n\n### Load a specific license\n\nIRI of the license can be used to retrieve a specific license:\n\n```python\nfrom pycali.license import ODRLLicense\nfrom rdflib import Graph, URIRef\nfrom pycali.vocabulary import ODRL\nfrom pycali.ontologies.cali_onto import Permission\nfrom pycali.examples.licenses.ld_licenses_odrl import ld_licenses_rdf\n\nMIT = URIRef('http://cali.priloo.univ-nantes.fr/api/ld/licenses/65927752496731336041529177465061342556133156838395276')\n\nld_licenses_graph = Graph().parse(data=ld_licenses_rdf,\n format='ttl')\nmit_license = ODRLLicense(vocabulary=odrl,\n ls=DL1,\n rdf_graph=ld_licenses_graph,\n iri=MIT)\n# Returns a list of actions in the specified state\nactions = mit_license.get_action(vocabulary=odrl, status=Permission)\n# Returns the state of an action\nstate = mit_license.get_status(vocabulary=odrl, action=ODRL['derive'])\n```\n\n## Define constraints\n\nConstraints on license CL defines if a license is valid or not. Compatibility constraints C\u2192\ndefines if a restrictiveness relation is a compatibility relation or not.\nRepository contains [examples of license and compatibility constraints](https://github.com/benjimor/CaLi/tree/master/pycali/examples).\n\n### Constraints on licenses\n\nA constraints on license is a a python function that takes 2 parameters,\na vocabulary and a license and returns a boolean:\n\n```python\nfrom pycali.ontologies.cali_onto import Duty\nfrom pycali.vocabulary import CC\n\n# A License should not obligates the commercial use of a resource\ndef CommercialUse_Not_Duty(vocabulary, license):\n return license.get_status(vocabulary, CC['CommericalUse']) != Duty\n```\n\n### Compatibility constraints\n\nA compatibility constraint is a a python function that takes 3 parameters, a vocabulary and 2 licenses\nand returns a boolean:\n\n```python\nfrom pycali.ontologies.cali_onto import Duty\nfrom pycali.vocabulary import CC\n\n# A license that obligates to share alike should not be compatible with another license\ndef ShareAlike_Compatibility(vocabulary, license1, license2):\n return license1.get_status(vocabulary, CC['ShareAlike']) != Duty\n```\n\n### Instantiate constraints\n\nConstraints are instantiated using LicenseConstraints and CompatibilityConstraints objects.\nThey are initiated with a list of constraints (signature of functions (constraints) are tested during initialization).\n\n```python\nfrom pycali.constraints import LicenseConstraints, CompatibilityConstraints\nfrom pycali.examples.license_constraints import CommercialUse_Not_Duty, ShareAlike_Not_Prohibition, CommercialUse_Include_Use\nfrom pycali.examples.compatibility_constraints import ShareAlike_Compatibility, DerivativeWorks_Compatibility\n\nlicense_constraints = LicenseConstraints(odrl, [CommercialUse_Not_Duty, ShareAlike_Not_Prohibition, CommercialUse_Include_Use])\ncompatibility_constraints = CompatibilityConstraints(ODRL, [ShareAlike_Compatibility, DerivativeWorks_Compatibility])\n\n# Checks if license respects all constraints on license\nlicense_constraints.is_valid(license)\n# Checks if the restrictiveness relation between license1 and license2 repects all compatibility relations\ncompatibility_constraints.is_compatible(license1, license2)\n```\n\n## Instanciate a CaLi Ordering (Complete Example)\n\nCaLi ordering automatically defines compatibility relations between licenses.\nIt takes 4 parameters, the restrictiveness lattice of status (LS), the vocabulary, licenses constraints and compatibility constraints.\nThen, every license added in the cali_ordering is ordered among other using compatibility relation.\n\n```python\nfrom rdflib import Graph\nfrom pycali.cali_ordering import CaliOrdering\nfrom pycali.restrictiveness_lattice_of_status import RestrictivenessLatticeOfStatus\nfrom pycali.license import ODRLLicenses\nfrom pycali.vocabulary import ODRLVocabulary\nfrom pycali.constraints import LicenseConstraints, CompatibilityConstraints\nfrom pycali.examples.license_constraints import CommercialUse_Not_Duty, ShareAlike_Not_Prohibition, CommercialUse_Include_Use\nfrom pycali.examples.compatibility_constraints import ShareAlike_Compatibility, DerivativeWorks_Compatibility\nfrom pycali.examples.restrictiveness_lattice_of_status.DL1 import dl1_rdf\nfrom pycali.examples.licenses.ld_licenses_odrl import ld_licenses_rdf\n\n# instantiate a cali ordering\nodrl = ODRLVocabulary()\nDL1 = RestrictivenessLatticeOfStatus(Graph().parse(data=dl1_rdf, format='ttl'))\ncali_ordering = CaliOrdering(ls=DL1,\n vocabulary=odrl,\n license_constraints=LicenseConstraints(odrl, [CommercialUse_Not_Duty, ShareAlike_Not_Prohibition, CommercialUse_Include_Use]),\n compatibility_constraints=CompatibilityConstraints(odrl, [ShareAlike_Compatibility, DerivativeWorks_Compatibility]))\n# add licenses to order\nld_licenses_graph = Graph().parse(data=ld_licenses_rdf, format='ttl')\nlicenses = ODRLLicenses(vocabulary=odrl, ls=DL1, rdf_graph=ld_licenses_graph)\n# use cali_ordering.add_license(license) to add one license\ncali_ordering.add_licenses(licenses)\n```\n\n### Browse the CaLi Ordering\n\n```python\n# checks if license1 is compatible with license2\nboolean = cali_ordering.is_compatible(license1, license2)\n# checks if license2 is compatible with license1\nboolean = cali_ordering.is_compliant(license1, license2)\n# Returns all licenses that are compatible with license entered in parameter\nlicenses = cali_ordering.all_compatible(license)\n# Returns all licenses that are compliant with license entered in parameter\nlicenses = cali_ordering.all_compliant(license)\n# Returns an RDF graph containing license IRI's and compatibility relations\nrdf_graph = cali_ordering.get_rdf_graph()\n# serialize rdf graph in turtle\nturtle_string = rdf_graph.serialize(format='turtle')\n```\n\n\n",
"description_content_type": "text/markdown",
"docs_url": null,
"download_url": "",
"downloads": {
"last_day": -1,
"last_month": -1,
"last_week": -1
},
"home_page": "https://github.com/benjimor/CaLi",
"keywords": "license,rdf,semantic web,research",
"license": "MIT",
"maintainer": "",
"maintainer_email": "",
"name": "pycali",
"package_url": "https://pypi.org/project/pycali/",
"platform": "",
"project_url": "https://pypi.org/project/pycali/",
"project_urls": {
"Homepage": "https://github.com/benjimor/CaLi"
},
"release_url": "https://pypi.org/project/pycali/3.0.0/",
"requires_dist": [
"rdflib"
],
"requires_python": "",
"summary": "A python package that defines a partial order over RDF licenses",
"version": "3.0.0"
},
"last_serial": 4987626,
"releases": {
"0.1": [
{
"comment_text": "",
"digests": {
"md5": "004304398327ba3342c0bf1f0c7b5732",
"sha256": "5204684ba599fbb239214a718a48a2cdac447a6780fd42ce8097827810e88fc0"
},
"downloads": -1,
"filename": "pycali-0.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "004304398327ba3342c0bf1f0c7b5732",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 14008,
"upload_time": "2019-02-25T15:11:12",
"url": "https://files.pythonhosted.org/packages/c8/90/bb2738c5a42df73dfd0a514f307abb20e19139b7dcb9b85acd294dd75627/pycali-0.1-py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "32d0a52341f24b96cc4cb27a95d4f03f",
"sha256": "35fce483c3e1198cb6d10767308c8447d67937d105d5b249f4fca4031d013cde"
},
"downloads": -1,
"filename": "pycali-0.1.tar.gz",
"has_sig": false,
"md5_digest": "32d0a52341f24b96cc4cb27a95d4f03f",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 8018,
"upload_time": "2019-02-25T15:11:14",
"url": "https://files.pythonhosted.org/packages/0f/eb/ceedc04551f691b65c879f51e4ce6512a1edc63d6b08577fce3a385af393/pycali-0.1.tar.gz"
}
],
"1.0": [
{
"comment_text": "",
"digests": {
"md5": "546a06b85796bc64b90a932497df4abe",
"sha256": "485d208a6421ff95bb4d3138a66e3d41e7106bef290f0c949585ff3d1a812ef8"
},
"downloads": -1,
"filename": "pycali-1.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "546a06b85796bc64b90a932497df4abe",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 16022,
"upload_time": "2019-02-25T17:04:41",
"url": "https://files.pythonhosted.org/packages/a3/40/0e6a10c8a5b2dd9a340d45b220d960b99b6519d227225642a3e3ef4dbf4c/pycali-1.0-py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "ea53fe2bfa7d657ccb2333a5f6e5208c",
"sha256": "35901e513722a0acb876737f1e2f9a5c0b2f99e0816b4854f82b2859e0aea861"
},
"downloads": -1,
"filename": "pycali-1.0.tar.gz",
"has_sig": false,
"md5_digest": "ea53fe2bfa7d657ccb2333a5f6e5208c",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 11846,
"upload_time": "2019-02-25T17:04:43",
"url": "https://files.pythonhosted.org/packages/10/d1/733cb534872c4ab8190abcea5221e16be7586cc20d81c8bafe2fbfe1e2c8/pycali-1.0.tar.gz"
}
],
"1.0.1": [
{
"comment_text": "",
"digests": {
"md5": "00177279eb27c718bacc2c725818258a",
"sha256": "690eefc435a912ed865839c1bda9692624a2f686acd4378323afaf1c57e9b3b3"
},
"downloads": -1,
"filename": "pycali-1.0.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "00177279eb27c718bacc2c725818258a",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 22888,
"upload_time": "2019-02-25T20:40:45",
"url": "https://files.pythonhosted.org/packages/e9/24/6f7bde7542d3b28379a6d93b4739271a7596225915ed4edcdb2d1fdfdd2e/pycali-1.0.1-py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "80c675334fc3b31094934f8ca6fcaba0",
"sha256": "e42b8c7c267c7701e1675549b7c24986111ff893b1937ac84176978ce5169500"
},
"downloads": -1,
"filename": "pycali-1.0.1.tar.gz",
"has_sig": false,
"md5_digest": "80c675334fc3b31094934f8ca6fcaba0",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 11783,
"upload_time": "2019-02-25T20:40:47",
"url": "https://files.pythonhosted.org/packages/4d/9b/bc7487460dc1f37241b90ed4a2eb796d9f4ae7f5b0b74732a17623a4f06a/pycali-1.0.1.tar.gz"
}
],
"1.0.2": [
{
"comment_text": "",
"digests": {
"md5": "1f3f709037ba8fb895633299028f9363",
"sha256": "341952bd8ec6ad257fdce414af7374dbc51c550c97cb9dd016eaaeb38f0ae8ae"
},
"downloads": -1,
"filename": "pycali-1.0.2-py3-none-any.whl",
"has_sig": false,
"md5_digest": "1f3f709037ba8fb895633299028f9363",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 22919,
"upload_time": "2019-02-25T20:50:23",
"url": "https://files.pythonhosted.org/packages/32/65/fd94583d821c15fab7d1eafc184eedb9c4b2a47b1c585549eb55589a7926/pycali-1.0.2-py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "3ba4b3f0f47c09b37e2712c211837cf7",
"sha256": "d366ff3169b65ef71cfa0e2bd75c1febe889ad333341a7752f07c173a15d4748"
},
"downloads": -1,
"filename": "pycali-1.0.2.tar.gz",
"has_sig": false,
"md5_digest": "3ba4b3f0f47c09b37e2712c211837cf7",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 11812,
"upload_time": "2019-02-25T20:50:26",
"url": "https://files.pythonhosted.org/packages/23/b3/e6c54a7041f046b9dde526354b351424ca8988f8059721957c7fcef267a6/pycali-1.0.2.tar.gz"
}
],
"1.0.3": [
{
"comment_text": "",
"digests": {
"md5": "2f46c8c35c04a44fe4c0c634334ccc2e",
"sha256": "1527bec98a98379f553387a085df1caf5fa015c3f1089d52cbb7fdf52e23b997"
},
"downloads": -1,
"filename": "pycali-1.0.3-py3-none-any.whl",
"has_sig": false,
"md5_digest": "2f46c8c35c04a44fe4c0c634334ccc2e",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 22947,
"upload_time": "2019-02-26T14:48:31",
"url": "https://files.pythonhosted.org/packages/03/70/01d0d1860f502fcc76e0a83e9f90df46bdab41c3e4c1dbe4f4953543e7c5/pycali-1.0.3-py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "12b9a6a16e235a1ca6952b2ef2d5bcb9",
"sha256": "c77910dcf0ed75c56b0b4f49699384cad5693b40cc5ff8b5800bcdfa087620e9"
},
"downloads": -1,
"filename": "pycali-1.0.3.tar.gz",
"has_sig": false,
"md5_digest": "12b9a6a16e235a1ca6952b2ef2d5bcb9",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 11863,
"upload_time": "2019-02-26T14:48:32",
"url": "https://files.pythonhosted.org/packages/bd/0b/bdf35f1abdaa03304bd4dca0038f78ca2013d2bb09bcba3a4b0e28a4cb94/pycali-1.0.3.tar.gz"
}
],
"2.0.0": [
{
"comment_text": "",
"digests": {
"md5": "b48b1222feb2d800f5125dfb23290854",
"sha256": "d777510d1fa1aadb0b8700ffeca0858d819adad81e216e9884ea3d25f7914c76"
},
"downloads": -1,
"filename": "pycali-2.0.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "b48b1222feb2d800f5125dfb23290854",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 43061,
"upload_time": "2019-02-27T15:39:40",
"url": "https://files.pythonhosted.org/packages/e5/9a/ffcd3325f5d5be1b546b1798e030b9495533559f3de5d03a9979ac1e1ffb/pycali-2.0.0-py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "9aa8bf7e1a97af48c3aa9006b1dc9c67",
"sha256": "ce8d3f3c419a759291d02ebaa1f34a7768377fbaeaca285109108daa848a8580"
},
"downloads": -1,
"filename": "pycali-2.0.0.tar.gz",
"has_sig": false,
"md5_digest": "9aa8bf7e1a97af48c3aa9006b1dc9c67",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 30668,
"upload_time": "2019-02-27T15:39:43",
"url": "https://files.pythonhosted.org/packages/d5/27/b4c853415da9eab3a13eab99e5dd2a3eb319850e21523e9a4462dcff6cd2/pycali-2.0.0.tar.gz"
}
],
"2.0.1": [
{
"comment_text": "",
"digests": {
"md5": "90b43a02cb128653e64b0983616daa61",
"sha256": "b669fefffcbdb7a857f1ff49b57944cada530ec171df2b43db3abf225fb2f0b9"
},
"downloads": -1,
"filename": "pycali-2.0.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "90b43a02cb128653e64b0983616daa61",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 34698,
"upload_time": "2019-02-27T15:53:52",
"url": "https://files.pythonhosted.org/packages/3c/97/6ff41f858a4b1730bf61a0a3978d9d1b61c3a7cacf879ecfb0841c27fca4/pycali-2.0.1-py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "e2209e3c7d55cd844e32164bce340082",
"sha256": "1200ad6a0645887538ac6bba4c77f9ff1223e1faa12ca33d282b7a010af47bc5"
},
"downloads": -1,
"filename": "pycali-2.0.1.tar.gz",
"has_sig": false,
"md5_digest": "e2209e3c7d55cd844e32164bce340082",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 30661,
"upload_time": "2019-02-27T15:53:54",
"url": "https://files.pythonhosted.org/packages/50/7d/f9039dd0c45d506471b432824eb0cc83e550795cd65607fb81ea00973d06/pycali-2.0.1.tar.gz"
}
],
"2.0.2": [
{
"comment_text": "",
"digests": {
"md5": "5dcaaac3057381b5fd68930fb8147adc",
"sha256": "da07d1bc7374d619ddf53af0d9bde28f250b83aebe8796fd16962b3c365a9fab"
},
"downloads": -1,
"filename": "pycali-2.0.2-py3-none-any.whl",
"has_sig": false,
"md5_digest": "5dcaaac3057381b5fd68930fb8147adc",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 43578,
"upload_time": "2019-02-27T16:02:54",
"url": "https://files.pythonhosted.org/packages/6b/9e/c1d4dfa16dda6cfbe44498a6b004583f69307d20a968e9382830509cd4bd/pycali-2.0.2-py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "7c4f4f38f3367da02c6ebeb96969553f",
"sha256": "9ed37b4d37b23a2d4e6e341961c86d69ad83d2044816e23c70041b9b9be4fc67"
},
"downloads": -1,
"filename": "pycali-2.0.2.tar.gz",
"has_sig": false,
"md5_digest": "7c4f4f38f3367da02c6ebeb96969553f",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 37455,
"upload_time": "2019-02-27T16:02:56",
"url": "https://files.pythonhosted.org/packages/c6/fc/1fcf0dcabd29c6a9b11950458f2eaa5c26fe96145501c86ee34141cbf69b/pycali-2.0.2.tar.gz"
}
],
"2.0.3": [
{
"comment_text": "",
"digests": {
"md5": "4e8fd4d373221d80d048f6409d9f26e5",
"sha256": "e18dfd109b6a54c9ca9fc508822dfb7ea7a1f8e97adc2096bdbe9a917d22cf4c"
},
"downloads": -1,
"filename": "pycali-2.0.3-py3-none-any.whl",
"has_sig": false,
"md5_digest": "4e8fd4d373221d80d048f6409d9f26e5",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 43588,
"upload_time": "2019-02-27T16:19:20",
"url": "https://files.pythonhosted.org/packages/24/36/c606aace10b9f1309fe69649e1436865ff4e6b64e53f93f5742885279123/pycali-2.0.3-py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "afb4a1192a4cafc167fd69e605fff93e",
"sha256": "dd440728166984933d9ef3675434465f7ff206846a18ef0ac7519e526708b7cf"
},
"downloads": -1,
"filename": "pycali-2.0.3.tar.gz",
"has_sig": false,
"md5_digest": "afb4a1192a4cafc167fd69e605fff93e",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 37471,
"upload_time": "2019-02-27T16:19:23",
"url": "https://files.pythonhosted.org/packages/80/99/0700d48ebd53a0aced574882ada0c5f5bdd36f7eaf6398069bda2d8a90f1/pycali-2.0.3.tar.gz"
}
],
"3.0.0": [
{
"comment_text": "",
"digests": {
"md5": "9f0bdef83e35f64232b7f35f72a90fa6",
"sha256": "58050155a928a3e422575d86436ac55290130a7dc6162f84b0ea182539954d3e"
},
"downloads": -1,
"filename": "pycali-3.0.0-py2-none-any.whl",
"has_sig": false,
"md5_digest": "9f0bdef83e35f64232b7f35f72a90fa6",
"packagetype": "bdist_wheel",
"python_version": "py2",
"requires_python": null,
"size": 43831,
"upload_time": "2019-03-26T13:32:24",
"url": "https://files.pythonhosted.org/packages/00/dd/4cbd63bc8c7e3546cc8e8d97faad0d83eb0fea3e6a6039333040dd72e627/pycali-3.0.0-py2-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "c8830340e009c10c7d233c10d9b06e9c",
"sha256": "18d77af001c058d935e59d15b87df887453d05f71235ba78afaedbf9a17ba7c0"
},
"downloads": -1,
"filename": "pycali-3.0.0.tar.gz",
"has_sig": false,
"md5_digest": "c8830340e009c10c7d233c10d9b06e9c",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 37450,
"upload_time": "2019-03-26T13:32:25",
"url": "https://files.pythonhosted.org/packages/be/80/234fcadc571181a1954b8f0a08947f17b98175cd80ca6b762723f6a73c8c/pycali-3.0.0.tar.gz"
}
]
},
"urls": [
{
"comment_text": "",
"digests": {
"md5": "9f0bdef83e35f64232b7f35f72a90fa6",
"sha256": "58050155a928a3e422575d86436ac55290130a7dc6162f84b0ea182539954d3e"
},
"downloads": -1,
"filename": "pycali-3.0.0-py2-none-any.whl",
"has_sig": false,
"md5_digest": "9f0bdef83e35f64232b7f35f72a90fa6",
"packagetype": "bdist_wheel",
"python_version": "py2",
"requires_python": null,
"size": 43831,
"upload_time": "2019-03-26T13:32:24",
"url": "https://files.pythonhosted.org/packages/00/dd/4cbd63bc8c7e3546cc8e8d97faad0d83eb0fea3e6a6039333040dd72e627/pycali-3.0.0-py2-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "c8830340e009c10c7d233c10d9b06e9c",
"sha256": "18d77af001c058d935e59d15b87df887453d05f71235ba78afaedbf9a17ba7c0"
},
"downloads": -1,
"filename": "pycali-3.0.0.tar.gz",
"has_sig": false,
"md5_digest": "c8830340e009c10c7d233c10d9b06e9c",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 37450,
"upload_time": "2019-03-26T13:32:25",
"url": "https://files.pythonhosted.org/packages/be/80/234fcadc571181a1954b8f0a08947f17b98175cd80ca6b762723f6a73c8c/pycali-3.0.0.tar.gz"
}
]
}