{ "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[![Build Status](https://travis-ci.com/benjimor/CaLi.svg?branch=master)](https://travis-ci.com/benjimor/CaLi)\n[![PyPI version](https://badge.fury.io/py/pycali.svg)](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" } ] }