reasonable


Namereasonable JSON
Version 0.2.6 PyPI version JSON
download
home_pagehttps://brickschema.org/
SummaryAn OWL 2 RL reasoner with reasonable performance
upload_time2023-07-04 15:41:36
maintainer
docs_urlNone
authorGabe Fierro <gtfierro@mines.edu>
requires_python
license
keywords
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Reasonable

![Nightly Build](https://github.com/gtfierro/reasonable/workflows/Nightly%20Build/badge.svg)
![Build](https://github.com/gtfierro/reasonable/workflows/Build/badge.svg)
[![PyPI version](https://badge.fury.io/py/reasonable.svg)](https://badge.fury.io/py/reasonable)

An OWL 2 RL reasoner with reasonable performance

## Performance

Comparing performance of `reasonable` with [OWLRL](https://github.com/RDFLib/OWL-RL) and [Allegro](https://franz.com/agraph/support/documentation/current/materializer.html). Evaluation consisted of loading Brick models of different sizes into the respective reasoning engine and timing how long it took to produce the materialization. `reasonable` is about 7x faster than Allegro and 38x faster than OWLRL on this workload.

![benchmark](img/benchmark.png)

## How to Use

### Command Line Interface

You can download a static build of the command line tool [here](https://github.com/gtfierro/reasonable/releases/download/nightly/reasonable-static) (this is automatically built from the latest master).

Usage as follows:

```
$ reasonable -h
An OWL 2 RL reasoner with reasonable performance

Usage: reasonable [OPTIONS] <INPUT_FILES>...

Arguments:
  <INPUT_FILES>...  

Options:
  -o, --output-file <OUTPUT_FILE>  [default: output.ttl]
  -h, --help                       Print help
  -V, --version                    Print version
```

Example:

```
$ reasonable example_models/ontologies/Brick.n3 example_models/small1.n3 -o myout.ttl
[2023-07-04T15:31:52Z INFO  reasonable] Loading file example_models/ontologies/Brick.n3
[2023-07-04T15:31:52Z INFO  reasonable::reasoner] Loaded 14803 triples from file example_models/ontologies/Brick.n3
[2023-07-04T15:31:52Z INFO  reasonable] Loading file example_models/small1.n3
[2023-07-04T15:31:52Z INFO  reasonable::reasoner] Loaded 14 triples from file example_models/small1.n3
[2023-07-04T15:31:52Z INFO  reasonable] Starting reasoning
[2023-07-04T15:32:11Z INFO  reasonable] Reasoning completed in 18.66sec
[2023-07-04T15:32:11Z INFO  reasonable] Writing to myout.ttl
```


### Python

To facilitate usage, we use the [pyo3](https://pyo3.rs/) project to generate Python 3.x bindings to this project.
Installing these *should* be as easy as `pip install reasonable`.

See also the [`brickschema`](https://github.com/BrickSchema/py-brickschema) package for working with Brick models. The package provides a generic interface to this reasoner and several others.

Usage looks like:

```python
import reasonable

# import triples from an rdflib Graph
import rdflib
g = rdflib.Graph()
g.parse("example_models/ontologies/Brick.n3", format="n3")
g.parse("example_models/small1.n3", format="n3")

r = reasonable.PyReasoner()
r.from_graph(g)
triples = r.reason()
print("from rdflib:", len(triples))

# import triples from files on disk
r = reasonable.PyReasoner()
r.load_file("example_models/ontologies/Brick.n3")
r.load_file("example_models/small1.n3")
triples = r.reason()
print("from files:", len(triples))
```

### Rust

See [Rust docs](https://docs.rs/reasonable)

Example of usage from Rust:

```rust
use ::reasonable::owl::Reasoner;
use std::env;
use std::time::Instant;
use log::info;

fn main() {
    env_logger::init();
    let mut r = Reasoner::new();
    env::args().skip(1).map(|filename| {
        info!("Loading file {}", &filename);
        r.load_file(&filename).unwrap()
    }).count();
    let reasoning_start = Instant::now();
    info!("Starting reasoning");
    r.reason();
    info!("Reasoning completed in {:.02}sec", reasoning_start.elapsed().as_secs_f64());
    r.dump_file("output.ttl").unwrap();
}
```


## OWL 2 Rules

Using rule definitions from [here](https://www.w3.org/TR/owl2-profiles/#Reasoning_in_OWL_2_RL_and_RDF_Graphs_using_Rules).

**TODO**: implement RDF/RDFS entailment semantics as described [here](https://www.w3.org/TR/rdf11-mt/)

**Note**: haven't implemented rules that produce exceptions; waiting to determine the best way of handling these errors.

### Equality Semantics

|Completed| Rule name | Notes |
|---------|----------|-------|
| no     | `eq-ref` | implementation is very inefficient; causes lots of flux       |
| **yes**| `eq-sym` |       |
| **yes**| `eq-trans` |       |
| **yes**| `eq-rep-s` |       |
| **yes**| `eq-rep-p` |       |
| **yes**| `eq-rep-o` |       |
| no     | `eq-diff1` | throws exception |
| no     | `eq-diff2` | throws exception |
| no     | `eq-diff3` | throws exception |

### Property Axiom Semantics

|Completed| Rule name | Notes |
|---------|----------|-------|
| no        | `prp-ap` |       |
| **yes**   | `prp-dom` |       |
| **yes**   | `prp-rng` |       |
| **yes**   | `prp-fp` |       |
| **yes**   | `prp-ifp` |       |
| **yes**   | `prp-irp` | throws exception |
| **yes**   | `prp-symp` |       |
| **yes**   | `prp-asyp` | throws exception |
| **yes**   | `prp-trp` |       |
| **yes**   | `prp-spo1` |       |
| no        | `prp-spo2` |       |
| **yes**   | `prp-eqp1` |       |
| **yes**   | `prp-eqp2` |       |
| **yes**   | `prp-pdw` | throws exception |
| no        | `prp-adp` | throws exception |
| **yes**   | `prp-inv1` |       |
| **yes**   | `prp-inv2` |       |
| no        | `prp-key` |       |
| no        | `prp-npa1` | throws exception |
| no        | `prp-npa2` | throws exception |

### Class Semantics

|Completed| Rule name | Notes |
|---------|----------|-------|
| **yes**| `cls-thing` |       |
| **yes**| `cls-nothing1` |       |
| **yes**| `cls-nothing2` | throws exception       |
| **yes**| `cls-int1` |       |
| **yes**| `cls-int2` |       |
| **yes**| `cls-uni` |       |
| **yes**| `cls-com` | throws exception    |
| **yes**| `cls-svf1` |       |
| **yes**| `cls-svf2` |       |
| **yes**| `cls-avf` |       |
| **yes**| `cls-hv1` |       |
| **yes**| `cls-hv2` |       |
| no     | `cls-maxc1` | throws exception       |
| no     | `cls-maxc2` |       |
| no     | `cls-maxqc1` | throws exception       |
| no     | `cls-maxqc2` | throws exception      |
| no     | `cls-maxqc3` |       |
| no     | `cls-maxqc4` |       |
| no     | `cls-oo` |       |

### Class Axiom Semantics

|Completed| Rule name | Notes |
|---------|----------|-------|
| **yes**| `cax-sco` |       |
| **yes**| `cax-eqc1` |       |
| **yes**| `cax-eqc2` |       |
| **yes**| `cax-dw` | throws exception      |
| no     | `cax-adc` |  throws exception     |

### Other

- no datatype semantics for now

## Development Notes

To publish new versions of `reasonable`, tag a commit with the version (e.g. `v1.3.2`) and push the tag to GitHub. This will execute the `publish` action which builds an uploads to PyPi.


            

Raw data

            {
    "_id": null,
    "home_page": "https://brickschema.org/",
    "name": "reasonable",
    "maintainer": "",
    "docs_url": null,
    "requires_python": "",
    "maintainer_email": "",
    "keywords": "",
    "author": "Gabe Fierro <gtfierro@mines.edu>",
    "author_email": "Gabe Fierro <gtfierro@mines.edu>",
    "download_url": "https://files.pythonhosted.org/packages/a2/56/7c9838902bbc2b54d64aae1a59498558d3a4efe3b3c37ee9edfefd79d404/reasonable-0.2.6.tar.gz",
    "platform": null,
    "description": "# Reasonable\n\n![Nightly Build](https://github.com/gtfierro/reasonable/workflows/Nightly%20Build/badge.svg)\n![Build](https://github.com/gtfierro/reasonable/workflows/Build/badge.svg)\n[![PyPI version](https://badge.fury.io/py/reasonable.svg)](https://badge.fury.io/py/reasonable)\n\nAn OWL 2 RL reasoner with reasonable performance\n\n## Performance\n\nComparing performance of `reasonable` with [OWLRL](https://github.com/RDFLib/OWL-RL) and [Allegro](https://franz.com/agraph/support/documentation/current/materializer.html). Evaluation consisted of loading Brick models of different sizes into the respective reasoning engine and timing how long it took to produce the materialization. `reasonable` is about 7x faster than Allegro and 38x faster than OWLRL on this workload.\n\n![benchmark](img/benchmark.png)\n\n## How to Use\n\n### Command Line Interface\n\nYou can download a static build of the command line tool [here](https://github.com/gtfierro/reasonable/releases/download/nightly/reasonable-static) (this is automatically built from the latest master).\n\nUsage as follows:\n\n```\n$ reasonable -h\nAn OWL 2 RL reasoner with reasonable performance\n\nUsage: reasonable [OPTIONS] <INPUT_FILES>...\n\nArguments:\n  <INPUT_FILES>...  \n\nOptions:\n  -o, --output-file <OUTPUT_FILE>  [default: output.ttl]\n  -h, --help                       Print help\n  -V, --version                    Print version\n```\n\nExample:\n\n```\n$ reasonable example_models/ontologies/Brick.n3 example_models/small1.n3 -o myout.ttl\n[2023-07-04T15:31:52Z INFO  reasonable] Loading file example_models/ontologies/Brick.n3\n[2023-07-04T15:31:52Z INFO  reasonable::reasoner] Loaded 14803 triples from file example_models/ontologies/Brick.n3\n[2023-07-04T15:31:52Z INFO  reasonable] Loading file example_models/small1.n3\n[2023-07-04T15:31:52Z INFO  reasonable::reasoner] Loaded 14 triples from file example_models/small1.n3\n[2023-07-04T15:31:52Z INFO  reasonable] Starting reasoning\n[2023-07-04T15:32:11Z INFO  reasonable] Reasoning completed in 18.66sec\n[2023-07-04T15:32:11Z INFO  reasonable] Writing to myout.ttl\n```\n\n\n### Python\n\nTo facilitate usage, we use the [pyo3](https://pyo3.rs/) project to generate Python 3.x bindings to this project.\nInstalling these *should* be as easy as `pip install reasonable`.\n\nSee also the [`brickschema`](https://github.com/BrickSchema/py-brickschema) package for working with Brick models. The package provides a generic interface to this reasoner and several others.\n\nUsage looks like:\n\n```python\nimport reasonable\n\n# import triples from an rdflib Graph\nimport rdflib\ng = rdflib.Graph()\ng.parse(\"example_models/ontologies/Brick.n3\", format=\"n3\")\ng.parse(\"example_models/small1.n3\", format=\"n3\")\n\nr = reasonable.PyReasoner()\nr.from_graph(g)\ntriples = r.reason()\nprint(\"from rdflib:\", len(triples))\n\n# import triples from files on disk\nr = reasonable.PyReasoner()\nr.load_file(\"example_models/ontologies/Brick.n3\")\nr.load_file(\"example_models/small1.n3\")\ntriples = r.reason()\nprint(\"from files:\", len(triples))\n```\n\n### Rust\n\nSee [Rust docs](https://docs.rs/reasonable)\n\nExample of usage from Rust:\n\n```rust\nuse ::reasonable::owl::Reasoner;\nuse std::env;\nuse std::time::Instant;\nuse log::info;\n\nfn main() {\n    env_logger::init();\n    let mut r = Reasoner::new();\n    env::args().skip(1).map(|filename| {\n        info!(\"Loading file {}\", &filename);\n        r.load_file(&filename).unwrap()\n    }).count();\n    let reasoning_start = Instant::now();\n    info!(\"Starting reasoning\");\n    r.reason();\n    info!(\"Reasoning completed in {:.02}sec\", reasoning_start.elapsed().as_secs_f64());\n    r.dump_file(\"output.ttl\").unwrap();\n}\n```\n\n\n## OWL 2 Rules\n\nUsing rule definitions from [here](https://www.w3.org/TR/owl2-profiles/#Reasoning_in_OWL_2_RL_and_RDF_Graphs_using_Rules).\n\n**TODO**: implement RDF/RDFS entailment semantics as described [here](https://www.w3.org/TR/rdf11-mt/)\n\n**Note**: haven't implemented rules that produce exceptions; waiting to determine the best way of handling these errors.\n\n### Equality Semantics\n\n|Completed| Rule name | Notes |\n|---------|----------|-------|\n| no     | `eq-ref` | implementation is very inefficient; causes lots of flux       |\n| **yes**| `eq-sym` |       |\n| **yes**| `eq-trans` |       |\n| **yes**| `eq-rep-s` |       |\n| **yes**| `eq-rep-p` |       |\n| **yes**| `eq-rep-o` |       |\n| no     | `eq-diff1` | throws exception |\n| no     | `eq-diff2` | throws exception |\n| no     | `eq-diff3` | throws exception |\n\n### Property Axiom Semantics\n\n|Completed| Rule name | Notes |\n|---------|----------|-------|\n| no        | `prp-ap` |       |\n| **yes**   | `prp-dom` |       |\n| **yes**   | `prp-rng` |       |\n| **yes**   | `prp-fp` |       |\n| **yes**   | `prp-ifp` |       |\n| **yes**   | `prp-irp` | throws exception |\n| **yes**   | `prp-symp` |       |\n| **yes**   | `prp-asyp` | throws exception |\n| **yes**   | `prp-trp` |       |\n| **yes**   | `prp-spo1` |       |\n| no        | `prp-spo2` |       |\n| **yes**   | `prp-eqp1` |       |\n| **yes**   | `prp-eqp2` |       |\n| **yes**   | `prp-pdw` | throws exception |\n| no        | `prp-adp` | throws exception |\n| **yes**   | `prp-inv1` |       |\n| **yes**   | `prp-inv2` |       |\n| no        | `prp-key` |       |\n| no        | `prp-npa1` | throws exception |\n| no        | `prp-npa2` | throws exception |\n\n### Class Semantics\n\n|Completed| Rule name | Notes |\n|---------|----------|-------|\n| **yes**| `cls-thing` |       |\n| **yes**| `cls-nothing1` |       |\n| **yes**| `cls-nothing2` | throws exception       |\n| **yes**| `cls-int1` |       |\n| **yes**| `cls-int2` |       |\n| **yes**| `cls-uni` |       |\n| **yes**| `cls-com` | throws exception    |\n| **yes**| `cls-svf1` |       |\n| **yes**| `cls-svf2` |       |\n| **yes**| `cls-avf` |       |\n| **yes**| `cls-hv1` |       |\n| **yes**| `cls-hv2` |       |\n| no     | `cls-maxc1` | throws exception       |\n| no     | `cls-maxc2` |       |\n| no     | `cls-maxqc1` | throws exception       |\n| no     | `cls-maxqc2` | throws exception      |\n| no     | `cls-maxqc3` |       |\n| no     | `cls-maxqc4` |       |\n| no     | `cls-oo` |       |\n\n### Class Axiom Semantics\n\n|Completed| Rule name | Notes |\n|---------|----------|-------|\n| **yes**| `cax-sco` |       |\n| **yes**| `cax-eqc1` |       |\n| **yes**| `cax-eqc2` |       |\n| **yes**| `cax-dw` | throws exception      |\n| no     | `cax-adc` |  throws exception     |\n\n### Other\n\n- no datatype semantics for now\n\n## Development Notes\n\nTo publish new versions of `reasonable`, tag a commit with the version (e.g. `v1.3.2`) and push the tag to GitHub. This will execute the `publish` action which builds an uploads to PyPi.\n\n",
    "bugtrack_url": null,
    "license": "",
    "summary": "An OWL 2 RL reasoner with reasonable performance",
    "version": "0.2.6",
    "project_urls": {
        "Homepage": "https://brickschema.org/",
        "Source Code": "https://github.com/gtfierro/reasonable"
    },
    "split_keywords": [],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "bd13d9182d7dfbbd35818c74c07dc2d33bbafc05ddab294c09411373afc54566",
                "md5": "3972668e6b2419cc1b0018adb79ba373",
                "sha256": "4aa6bf17159b96e42821cf7af6738d95330dbc4a88e09834378a28df3333c483"
            },
            "downloads": -1,
            "filename": "reasonable-0.2.6-cp37-abi3-macosx_10_7_x86_64.whl",
            "has_sig": false,
            "md5_digest": "3972668e6b2419cc1b0018adb79ba373",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": null,
            "size": 504360,
            "upload_time": "2023-07-04T15:41:12",
            "upload_time_iso_8601": "2023-07-04T15:41:12.402263Z",
            "url": "https://files.pythonhosted.org/packages/bd/13/d9182d7dfbbd35818c74c07dc2d33bbafc05ddab294c09411373afc54566/reasonable-0.2.6-cp37-abi3-macosx_10_7_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "bdf7070ce74598eff6c2c8e6759ad32063763b76cb575ee56f6c0fd51f707cfd",
                "md5": "1b72fd72fe1a3bff11407bd32ff160a2",
                "sha256": "f06bfde7d128f3fff653f042634f8c4e68ded0a6150e3fa398e288d993bffbd4"
            },
            "downloads": -1,
            "filename": "reasonable-0.2.6-cp37-abi3-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl",
            "has_sig": false,
            "md5_digest": "1b72fd72fe1a3bff11407bd32ff160a2",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": null,
            "size": 1006307,
            "upload_time": "2023-07-04T15:41:14",
            "upload_time_iso_8601": "2023-07-04T15:41:14.489845Z",
            "url": "https://files.pythonhosted.org/packages/bd/f7/070ce74598eff6c2c8e6759ad32063763b76cb575ee56f6c0fd51f707cfd/reasonable-0.2.6-cp37-abi3-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "8d2eac1327ac62d9fd267ccc857dc35e5630c2e9baccd0e44c3ac983002fe27d",
                "md5": "1c797483824761996eefd6d8a3218044",
                "sha256": "76b9f9279ca06cec734ae1d46494ec1ef9a003e528ca2029856e61ed6d6221c9"
            },
            "downloads": -1,
            "filename": "reasonable-0.2.6-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "1c797483824761996eefd6d8a3218044",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": null,
            "size": 4747527,
            "upload_time": "2023-07-04T15:41:16",
            "upload_time_iso_8601": "2023-07-04T15:41:16.742539Z",
            "url": "https://files.pythonhosted.org/packages/8d/2e/ac1327ac62d9fd267ccc857dc35e5630c2e9baccd0e44c3ac983002fe27d/reasonable-0.2.6-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "eae22009830cf7cf9a54d1fd43576604a94d6782ac01e92f5dd5a4780cc27088",
                "md5": "a1f9c5060f6ae3f71a74d9581bc5a61a",
                "sha256": "6efa7596329e0b45421b7dd10d5806021850f1e294c41371b601ac611bfbe42b"
            },
            "downloads": -1,
            "filename": "reasonable-0.2.6-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
            "has_sig": false,
            "md5_digest": "a1f9c5060f6ae3f71a74d9581bc5a61a",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": null,
            "size": 4530064,
            "upload_time": "2023-07-04T15:41:18",
            "upload_time_iso_8601": "2023-07-04T15:41:18.592370Z",
            "url": "https://files.pythonhosted.org/packages/ea/e2/2009830cf7cf9a54d1fd43576604a94d6782ac01e92f5dd5a4780cc27088/reasonable-0.2.6-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "f8bd9cf93e42daa7b14bc0699d0bd10665345eb1d387f04d0abf47f436662c2d",
                "md5": "d4836a3679d2f369dfbc0fcec9bb7508",
                "sha256": "5e6b5aea2bbf4cadcf26a8e256d76670f37848707849a9590f94d2aa1a9c2392"
            },
            "downloads": -1,
            "filename": "reasonable-0.2.6-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "d4836a3679d2f369dfbc0fcec9bb7508",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": null,
            "size": 4811256,
            "upload_time": "2023-07-04T15:41:20",
            "upload_time_iso_8601": "2023-07-04T15:41:20.770145Z",
            "url": "https://files.pythonhosted.org/packages/f8/bd/9cf93e42daa7b14bc0699d0bd10665345eb1d387f04d0abf47f436662c2d/reasonable-0.2.6-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "689d6838303de14493eaf33ddebc5fda4b8929907a390e42e12a8b4372e74d34",
                "md5": "6b9a1426c846196bbab47c8bf4a52f18",
                "sha256": "f0d9c8a15404cf3e385ee74db6fb06a7f8d04511cd5b69313162fb4068053b06"
            },
            "downloads": -1,
            "filename": "reasonable-0.2.6-cp37-abi3-manylinux_2_5_i686.manylinux1_i686.whl",
            "has_sig": false,
            "md5_digest": "6b9a1426c846196bbab47c8bf4a52f18",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": null,
            "size": 4820262,
            "upload_time": "2023-07-04T15:41:22",
            "upload_time_iso_8601": "2023-07-04T15:41:22.567926Z",
            "url": "https://files.pythonhosted.org/packages/68/9d/6838303de14493eaf33ddebc5fda4b8929907a390e42e12a8b4372e74d34/reasonable-0.2.6-cp37-abi3-manylinux_2_5_i686.manylinux1_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "405888cce25dbff5852549334f800ed334be2ca5c5a2814eb84250a08f7a0ffc",
                "md5": "ea820dc57f1e71ed5f8f542f9109eb86",
                "sha256": "53d8d7789f47ff777930448af82b24db081af4fe84e6a1bfd5448de74bb807a6"
            },
            "downloads": -1,
            "filename": "reasonable-0.2.6-cp37-abi3-musllinux_1_2_aarch64.whl",
            "has_sig": false,
            "md5_digest": "ea820dc57f1e71ed5f8f542f9109eb86",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": null,
            "size": 4924287,
            "upload_time": "2023-07-04T15:41:25",
            "upload_time_iso_8601": "2023-07-04T15:41:25.058048Z",
            "url": "https://files.pythonhosted.org/packages/40/58/88cce25dbff5852549334f800ed334be2ca5c5a2814eb84250a08f7a0ffc/reasonable-0.2.6-cp37-abi3-musllinux_1_2_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "43a11817c0ae46a09e5f5a829fc53f072557a648e9b7d314bb4d2a2e768d3a88",
                "md5": "09105dfd4dd22992b7fafa53ff7ae3d5",
                "sha256": "a32e66baa6a9d95186a042cab5cb5f250e7764b79da3721ef516726a9a947580"
            },
            "downloads": -1,
            "filename": "reasonable-0.2.6-cp37-abi3-musllinux_1_2_armv7l.whl",
            "has_sig": false,
            "md5_digest": "09105dfd4dd22992b7fafa53ff7ae3d5",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": null,
            "size": 4783600,
            "upload_time": "2023-07-04T15:41:27",
            "upload_time_iso_8601": "2023-07-04T15:41:27.733935Z",
            "url": "https://files.pythonhosted.org/packages/43/a1/1817c0ae46a09e5f5a829fc53f072557a648e9b7d314bb4d2a2e768d3a88/reasonable-0.2.6-cp37-abi3-musllinux_1_2_armv7l.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "d63da36dba287ca913587eebc242bbb546aa3beacd100ef57b6ae53ea990d00b",
                "md5": "e64e476addfcc1955ffe88315b5ce5e9",
                "sha256": "995ae5061cb31a38452d68e63dc6a301658e0bb0ef4e4efb98918927c7a73fb7"
            },
            "downloads": -1,
            "filename": "reasonable-0.2.6-cp37-abi3-musllinux_1_2_i686.whl",
            "has_sig": false,
            "md5_digest": "e64e476addfcc1955ffe88315b5ce5e9",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": null,
            "size": 4944281,
            "upload_time": "2023-07-04T15:41:29",
            "upload_time_iso_8601": "2023-07-04T15:41:29.740098Z",
            "url": "https://files.pythonhosted.org/packages/d6/3d/a36dba287ca913587eebc242bbb546aa3beacd100ef57b6ae53ea990d00b/reasonable-0.2.6-cp37-abi3-musllinux_1_2_i686.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "726f48f422c652fb4389a4c1077a88cc81a98efe20e9e705ff7e3f64fda86363",
                "md5": "12b40506de4dbc471aa448d2fdd7ce5c",
                "sha256": "e6d066a68672c53d9d28c670839664e860a9f070c007c1318f91800b074710d4"
            },
            "downloads": -1,
            "filename": "reasonable-0.2.6-cp37-abi3-musllinux_1_2_x86_64.whl",
            "has_sig": false,
            "md5_digest": "12b40506de4dbc471aa448d2fdd7ce5c",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": null,
            "size": 4966975,
            "upload_time": "2023-07-04T15:41:32",
            "upload_time_iso_8601": "2023-07-04T15:41:32.153087Z",
            "url": "https://files.pythonhosted.org/packages/72/6f/48f422c652fb4389a4c1077a88cc81a98efe20e9e705ff7e3f64fda86363/reasonable-0.2.6-cp37-abi3-musllinux_1_2_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "e1f74713769555161dac91d2f35e0c9638082f8c38f32835eb5114822d39e94a",
                "md5": "cd7bb30e71423a7fcd3899b5f4d53f9d",
                "sha256": "6a4260330d62705eb4ea49926cd007b7a9278a9cf6548079a9ea53a6f277a15d"
            },
            "downloads": -1,
            "filename": "reasonable-0.2.6-cp37-abi3-win32.whl",
            "has_sig": false,
            "md5_digest": "cd7bb30e71423a7fcd3899b5f4d53f9d",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": null,
            "size": 316846,
            "upload_time": "2023-07-04T15:41:33",
            "upload_time_iso_8601": "2023-07-04T15:41:33.650698Z",
            "url": "https://files.pythonhosted.org/packages/e1/f7/4713769555161dac91d2f35e0c9638082f8c38f32835eb5114822d39e94a/reasonable-0.2.6-cp37-abi3-win32.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "de74bec12904054932a3322ffd45da1e5b55d6e2d00c6789070b2aa50d7508b1",
                "md5": "92ead71dbca4a5e3ab56ca7309bef441",
                "sha256": "02332c2100748106be7580059d6e0a2769022fd687175594fe65ac8935cc32b6"
            },
            "downloads": -1,
            "filename": "reasonable-0.2.6-cp37-abi3-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "92ead71dbca4a5e3ab56ca7309bef441",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": null,
            "size": 323234,
            "upload_time": "2023-07-04T15:41:35",
            "upload_time_iso_8601": "2023-07-04T15:41:35.033588Z",
            "url": "https://files.pythonhosted.org/packages/de/74/bec12904054932a3322ffd45da1e5b55d6e2d00c6789070b2aa50d7508b1/reasonable-0.2.6-cp37-abi3-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "a2567c9838902bbc2b54d64aae1a59498558d3a4efe3b3c37ee9edfefd79d404",
                "md5": "30938f63225cc55ab7837ecdee3edec9",
                "sha256": "5d26aeb8b6c3f566aa2ef11c308b2208ec7669a30e9113728f243024c6276205"
            },
            "downloads": -1,
            "filename": "reasonable-0.2.6.tar.gz",
            "has_sig": false,
            "md5_digest": "30938f63225cc55ab7837ecdee3edec9",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": null,
            "size": 1461195,
            "upload_time": "2023-07-04T15:41:36",
            "upload_time_iso_8601": "2023-07-04T15:41:36.436448Z",
            "url": "https://files.pythonhosted.org/packages/a2/56/7c9838902bbc2b54d64aae1a59498558d3a4efe3b3c37ee9edfefd79d404/reasonable-0.2.6.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2023-07-04 15:41:36",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "gtfierro",
    "github_project": "reasonable",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "reasonable"
}
        
Elapsed time: 0.12955s