{ "info": { "author": "Steve Cox", "author_email": "scox@renci.org", "bugtrack_url": null, "classifiers": [], "description": "See the Homepage for a better formatted version.\n \n\n\n## Overview\n\nRos executes graphs of queries to cooperatively compose knowledge networks.\n\nWhile the language provides common constructs supporting variables, modularity, extensibility, templates, and a type system, it is targeted at the distinctive challenges of creating **highly detailed knowledge graphs enabling reasoning and inference**.\n\n### Usage\n\nRunning a workflow locally from the command line produces output like this:\n\n\n\nAnd builds this knowledge graph:\n\n\n\n- [Overview](#overview)\n * [Usage](#usage)\n- [Language Reference](#language-reference)\n * [Overview](#overview-1)\n * [Variables](#variables)\n * [Operators](#operators)\n * [Graphs](#graphs)\n * [Metadata](#metadata)\n * [Templates](#templates)\n * [Modules](#modules)\n- [Putting it All Together](#putting-it-all-together)\n * [1. Define A Template](#1-define-a-template)\n * [2. Optionally Model Input and Output Types](#2-optionally-model-input-and-output-types)\n * [3. Build the Workflow](#3-build-the-workflow)\n- [Execution](#execution)\n- [Getting Started](#getting-started)\n * [Docker](#docker)\n + [Requirements](#requirements)\n + [Start](#start)\n * [Usage - Command Line](#usage---command-line)\n * [Usage - Programmatic](#usage---programmatic)\n * [Install](#install)\n * [NDEx](#ndex)\n * [Help](#help)\n\n## Language Reference\n\n### Overview\n\nA workflow is a series of steps.\nSteps can reference the output of previous steps.\nIn general they have access to a shared graph.\nThey can also exchange sub-graphs.\nSteps can have associated metadata describing their allowed input and output types.\n\nWorkflows compute a directed acyclic graph (DAG) modeling job dependencies which are then executed in the order indicated by a topological sort of the DAG.\n\n### Variables\n\nVariables passed to the workflow at the command line or via the API can be resolved dynamically. In this example, $disease_name refers to an argument provided by the execution context to this workflow. The provided value will be substituted at runtime. \n\nIn the example below, `disease_identifiers` is the job's name. It produces a graph. The JSON object representing that graph will be stored as the value of the job's name. The graph is also written to the shared graph database. Subsequent jobs can interact with either representation.\n\nThe `code` tag tells the engine which block of functionality to execute.\n\nThe `args` section lists inputs to this operator.\n\n```\n disease_identifiers:\n doc: |\n Resolve an English disease name to an ontology identifier.\n code: bionames\n args:\n type: disease\n input: $disease_name\n```\n\n### Operators\n\nThe workflow is organized around graph operators. Each has access to all facilities of the Ros framework including the shared graph.\n\nIn general, workflow jobs have the following fields:\n\n * **doc**: A documentation string.\n * **code**: The name of a component providing functionality.\n * **args**: Arguments to the operator.\n\nRos currently provides the following core operators:\n\n* **get**: Invokes an HTTP GET operation on a specified resource.\n* **union**: Unions two or more results into one object.\n\nIt also includes certain Translator specific modules. In the future, these will be implemented as Ros plugins: \n* **biothings**: BioThings modules. Currently modules 4 and 5 of workflow 1.\n* **gamma**: Invokes the Gamma reasoner. The example below calls Gamma a few times with different machine questions. It will be updated to use the new Quick API for added flexibility.\n* **xray**: XRay reasoner modules. Currently modules 1 and 2 of workflow 1.\n\n### Graphs\n\nRos provides graphs in two basic modalities:\n\n* **Results**: Results of previous workflow steps can be referenced as variables passed to subsequent steps. This graph can be queried using JSON Path query syntax. The following example uses the json select facility in the Ros framework to query a variable called *condition*:\n ```\n diseases = event.select (\n query = \"$.[*].result_list.[*].[*].result_graph.node_list.[*]\",\n obj = event.conditions)\n ```\n* **Shared**: A shared graph, accessible with the Cypher query language is available to all operators. This example uses the Ros framework's cypher query on the shared graph with biolink-model concepts.\n ```\n diseases = event.context.graph.query (\"match (a:disease) return a\")\n ```\n \nEach operator receives an event object provided by the Ros framework. The event provides framework services including the shared graph, graph manipulation tools, and arguments to the invocation of the operator.\n\nThese facilities allow the operator to query the graphs before executing their main logic and to update it as well.\n\n### Metadata\n\nThe language supports a metadata capability to enable modules to specify their inputs and outputs.\n\nInputs support these tags:\n\n* **doc**: Documentation\n* **type**: Types are currently derived from a standard library but in the future will be extensible and composable.\n* **required**: Whether or not the argument is required.\n\nOutputs support these tags:\n* **doc**: Documentation.\n* **type**: Type of the returned object.\n\nThe use of metadata is optional.\n\n### Templates\n\nTemplates allow extension of the language by specializing existing library functions into new capabilities through composition. Templates are defined in a template section separate from the workflow proper. They can also be defined in separate, reusable modules.\n\n### Modules\n\nExternal modules can be loaded via the `import` tag.\n\nA library path like those featured in other high level programming languages governs where libraries are loaded from.\n\n### Automated Validation\n\nWhen a workflow has run, we'd like to run validations that test the integrity of the answer we got. In this first Ros version, we support a limited form of automated validation. The limitations are motivated by making Ros secure. Since we execute queries remotely, it's not realistic to run arbitrary graph queries posted from clients on the internet. Instead, we provide a limited query syntax that still allows us to do a lot of validation. The query syntax is called Syfur - a less capable query system reminiscent of Cypher.\n\nThe example below from workflow_one shows Syfur's usage.\n\n ```\n automated_validation:\n doc: |\n Automated Validation\n We can test the knowledge network with constraints including all, match, and none.\n The depends arg ensures the validation runs only after the graph is built.\n Each test has a name, documentation, a query, and an operator defining the constraint to enforce\n Syfur\n A principal virtue of Ros is the ability to remotely execute workflows.\n To make this possible, it must be secured against remote code execution attacks\n This includes cypher injection.\n It may be possible to accomplish some of this in other ways, but for now, we provide Syfur\n Syfur is a restricted DSL that translates to a subset of Cypher. See examples below.\n code: validate\n args:\n depends: $biothings_module_4_and_5\n tests:\n test_type_2_diabetes_exists:\n doc: Ensure type 2 diabetes mellitus and other conditions are present.\n items: \"match type=disease return id\"\n all: [ \"OMIM:600001\", \"MONDO:0005148\", \"DOID:9352\" ]\n test_pioglitazone:\n doc: Test attributes of a specific chemical. Ensure type 2 diabetes mellitus is present.\n items: \"match type=chemical_substance id=CHEMBL.COMPOUND:CHEMBL595 return node_attributes\"\n match:\n - .*Thiazolidinedione.*\n - \".*{'name': 'EPC', 'value': 'Peroxisome Proliferator Receptor gamma Agonist'}.*\"\n test_absence_of_something:\n doc: Verify there is none of something in our graph.\n items: \"match return id\"\n none: [ 'BAD:123' ]\n ```\n \n## Putting it All Together\n\nHere's a usage example to put all of this in context.\n\n### 1. Define A Template\n\nWe begin with the common use case of converting user supplied text into ontology identifiers. We create a template task for this purpose.\n\n* It extends the builtin `get` http operator and sets the `pattern` argument to a defined value.\n* It's saved to a file called `bionames.ros` in a directory that's on the library path.\n\nThe bionames template is now a reusable component that can be imported into a variety of workflows.\n\n### 2. Optionally Model Input and Output Types\n\nThough currently optional, the template also specifies\n\n* The `meta` tag describes metadata about the operator.\n* The `main` operator is used when no sub-operators are specified.\n* Each operator has input and output sections.\n* The **input** section specifies a list of input values.\n* Each may have `doc`, `type`, and `required` tags.\n* The **output** section may contain `doc` and `type` tags.\n* In both cases, values of `type` must (currently) come from the Ros standard library, described elsewhere.\n\n```\ndoc: |\n This module defines a reusable template.\n It can be imported into other workflows via the import directive.\n\ntemplates:\n\n bionames:\n doc: |\n This template extends the built in get operator.\n code: get\n args:\n pattern: 'https://bionames.renci.org/lookup/{input}/{type}/'\n meta:\n main:\n args:\n input:\n doc: The name of the object to find identifiers for.\n type: string\n required: true\n type:\n doc: The intended biolink_model type of the resulting identifiers.\n type: biolink_model\n required: true\n output:\n doc: A Translator standard knowledge graph.\n type: knowledge_graph_standard\n```\n\nThe `biolink_model` and `knowledge_graph_standard` types are currently modeled directly in the Ros [standard library](https://github.com/NCATS-Tangerine/ros/blob/master/ros/stdlib.yaml):\n```\ntypes:\n string :\n doc: A primitive string of characters.\n extends: primitive\n biolink_model:\n doc: An element from the Biolink-model \n extends: string\n knowledge_graph_standard:\n doc: A Translator knowledge graph standard (KGS) knowledge graph.\n extends: primitive\n```\n\n### 3. Build the Workflow\n\nNext, we import the template above into a workflow definition.\n\n```\ndoc: |\n NCATS Biomedical Translator - Workflow One\n \nimport:\n - bionames\n \nworkflow:\n\n disease_identifiers:\n doc: |\n Resolve an English disease name to an ontology identifier.\n code: bionames\n args:\n type: disease\n input: $disease_name\n...\n```\n\nThe `disease_identifiers` task instantiates the bionames template. It supplies the required arguments, including resolving the `disease_name` input argument specific to this workflow.\n\nOnce this module has executed, subsequent steps can reference the graph it produced via the variable `$disease_identifiers`.\n\nThe next step in the workflow makes use of this by referencing the output of our template invocation. The workflow engine sees this reference and makes the new job depend on the referenced job. This is how the job DAG governing execution order is calculated.\n\n```\n condition_to_drug:\n doc: |\n Module 1\n * What are the defining symptoms / phenotypes of [condition x]?\n * What conditions present [symptoms]?\n * Filter [conditions] to only keep ones with defined genetic causes.\n * What subset of conditions are most representative of [conditions]? (find archetypes)\n Module 2\n * What genes are implicated in [condition]?\n * What subset of genes are most representative of [conditions]? (find archetypes)\n * What pathways/processes are [genes] involved in?\n * What genes are involved in [pathway/process]?\n * What drugs/compounds target gene products of [gene]?\n Invoke XRay module 1 and 2 given the disease identifier from bionames.\n The graph argument references the entire bionames response.\n The op argument specifies the XRay operation to execute.\n code: xray\n args:\n op: condition_expansion_to_gene_pathway_drug\n graph: $disease_identifiers\n```\n\nFor more details, see the whole [workflow](https://github.com/NCATS-Tangerine/ros/blob/master/ros/workflow_one.ros).\n\n## Execution\n\nFor all workflows, the engine builds a directed acyclic graph (DAG) of jobs by examining each job to determine its dependencies.\n\nA topological sort of the jobs provides the execution order.\n\nExecution is asynchronous. To the extent you subscribe to the [semantic distinction between 'concurrent' and 'parallel'](https://softwareengineering.stackexchange.com/questions/190719/the-difference-between-concurrent-and-parallel-execution) workflow execution is concurrent but not parallel.\n\nThe current implementation uses Python's [asyncio](https://docs.python.org/3/library/asyncio.html). This means multiple operations are able to make progress during the same time window. But it does not mean that the operations literally execute (run CPU operations) simultaneously. The current profile of operations is I/O bound rather than CPU bound so this approach is likely to be enough for a while. Several tasks can wait for an HTTP request to return while others use the processor to handle results.\n\nThe API also handles requests asynchronously using [Sanic](https://github.com/huge-success/sanic) and [Tornado](https://www.tornadoweb.org/en/stable/) \n\n## Getting Started\n\n### Docker\n\n#### Requirements\n\n * Docker\n * Docker Compose (included with Docker on Mac)\n * Git\n * Ports 7474, 7687, and 5002 available\n\n#### Start\n\n```\ngit clone git@github.com:NCATS-Tangerine/ros.git\ncd ros/deploy\nsource ros.env\ndocker-compose up\n```\n\n### Usage - Command Line\n\n * Connect to the [local Neo4J](http://localhost:7474/browser/)\n * Connect to the API docker container\n * Run a workflow via the API. \n ```\n $ cd ../ros\n $ PYTHONPATH=$PWD/.. python app.py --api --workflow workflows/workflow_one.ros -l workflows -i disease_name=\"type 2 diabetes mellitus\" --out stdout\n ```\n### Usage - Programmatic\n\nRos can execute workflows remotely and return the resulting knowledge network. The client currently supports JSON and NetowrkX representations.\n\n ```\n from ros.client import Client\n \n ros = Client (url=\"http://localhost:5002\")\n response = ros.run (workflow='workflows/workflow_one.ros',\n args = { \"disease_name\" : \"type 2 diabetes mellitus\" },\n library_path = [ 'workflows' ])\n\n graph = response.to_nx () \n for n in graph.nodes (data=True):\n print (n)\n ```\n\n\n### Install\n\n**Requirements:**\n\n * Python >3.7.x\n * Neo4J >3.3.4\n \n**Steps:**\n\nThese steps install the package, print help text, and execute workflow one. To run this, you'll need workflow_one.ros and bionames.ros from the repo. The `-l workflows` flag names the directory containing the workflows.\n\n```\n$ pip install ros\n$ ros --help\n$ ros --workflow workflow_one.ros --arg disease_name=\"diabetes mellitus type 2\" -l workflows\n```\n\n### NDEx\n\nTo save a workflow to NDEx.\n\n * Create an NDEx account.\n * Create an ~/.ndex credential file like this:\n\n ```\n {\n \"username\" : \"\",\n \"password\" : \"\"\n }\n ```\n * Run the workflow with NDEx output:\n\n ```\n ros flow --workflow workflow_one.ros --out output.json --ndex wf1\n ```\n\n### Help\n\n\n ```\n $ PYTHONPATH=$PWD/.. python app.py --help\n usage: app.py [-h] [-a] [-w WORKFLOW] [-s SERVER] [-i ARG] [-o OUT]\n [-l LIBPATH] [-n NDEX] [--validate]\n\n Ros Workflow CLI\n\n optional arguments:\n -h, --help show this help message and exit\n -a, --api URL of the remote Ros server to use.\n (default: False)\n -w WORKFLOW, --workflow WORKFLOW Workflow to execute. (default:\n workflow_one.ros)\n -s SERVER, --server SERVER Hostname of api server (default:\n http://localhost:5002)\n -i ARG, --arg ARG Add an argument expressed as key=val\n (default: [])\n -o OUT, --out OUT Output the workflow result graph to a\n file. Use 'stdout' to print to terminal.\n (default: None)\n -l LIBPATH, --libpath LIBPATH A directory containing workflow modules.\n (default: ['.'])\n -n NDEX, --ndex NDEX Name of the graph to publish to NDEx.\n Requires valid ~/.ndex credential file.\n (default: None)\n --validate Validate inputs and outputs (default:\n False)\n ```\n \n## Next\n\n* **Information Architecture**: Develop:\n * **Controlled vocabulary**: Especially regarding what the modules are and how they relate\n * **Input and Output Signatures**: For the modules\n * **Provenance**: Both in terms of workflow provenance (which user, how long, etc) and metadata about sources (SCEPIO?).\n* **Polymorphism**: It would be really helpful if multiple entities implementing a capability could implement the same OpenAPI interface to enable polymorphic invocation. This would also help with parallelism.\n* **[KGX](https://github.com/NCATS-Tangerine/kgx)**: Maybe KGX should be the shared graph, at least optionally. Just need to design that connection.\n* **Concurrent / Parallel / Distributed**: Ros now supports concurrent task execution via Python async. If this turns out not to be enough, explore running via something capable of parallel and maybe distributed execution.\n* **Composability**: Allow workflows to import and reuse other workflows.", "description_content_type": "text/markdown", "docs_url": null, "download_url": "http://github.com/NCATS-Tangerine/ros/archive/0.1.tar.gz", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://github.com/NCATS-Tangerine/ros.git", "keywords": "knowledge,network,graph,biomedical", "license": "", "maintainer": "", "maintainer_email": "", "name": "ros", "package_url": "https://pypi.org/project/ros/", "platform": "", "project_url": "https://pypi.org/project/ros/", "project_urls": { "Download": "http://github.com/NCATS-Tangerine/ros/archive/0.1.tar.gz", "Homepage": "http://github.com/NCATS-Tangerine/ros.git" }, "release_url": "https://pypi.org/project/ros/0.119/", "requires_dist": null, "requires_python": "", "summary": "Ros Knowledge Network", "version": "0.119" }, "last_serial": 4416860, "releases": { "0.01": [ { "comment_text": "", "digests": { "md5": "4a3b63d7bb1f57bf615be67704fd8491", "sha256": "8e923510a41fda2d6a573e4c00b71c5c7e70ab72afee373c1ef30b4eb77267aa" }, "downloads": -1, "filename": "ros-0.01.tar.gz", "has_sig": false, "md5_digest": "4a3b63d7bb1f57bf615be67704fd8491", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19786, "upload_time": "2018-10-02T21:45:27", "url": "https://files.pythonhosted.org/packages/6e/30/d6aaa726c195d24dbc39e7cdbded02adce7ed72200f215a08ecd7bda5515/ros-0.01.tar.gz" } ], "0.02": [ { "comment_text": "", "digests": { "md5": "63726d5e2d75d0950d37053bbfc8fa84", "sha256": "b54f496af26529aca802736cccfa80fe0dec7e71950f9995ae2220c3ffb8f56a" }, "downloads": -1, "filename": "ros-0.02.tar.gz", "has_sig": false, "md5_digest": "63726d5e2d75d0950d37053bbfc8fa84", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19785, "upload_time": "2018-10-02T21:45:42", "url": "https://files.pythonhosted.org/packages/ad/96/7b16556b16322d4c52265f5412f37b1982175c8fd5856dd0d31053b846fa/ros-0.02.tar.gz" } ], "0.03": [ { "comment_text": "", "digests": { "md5": "98fbf0275dde4da5c12f696643ba6e52", "sha256": "995bfbe84ce0e165fc3efeac8a9edf905d9e185c80180aae5469ed0ee19513fb" }, "downloads": -1, "filename": "ros-0.03.tar.gz", "has_sig": false, "md5_digest": "98fbf0275dde4da5c12f696643ba6e52", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19778, "upload_time": "2018-10-02T21:46:11", "url": "https://files.pythonhosted.org/packages/47/7a/a81b686ffb07cddf9bfa018752d7449ffa0244f265041d1b65ce8d04ebec/ros-0.03.tar.gz" } ], "0.04": [ { "comment_text": "", "digests": { "md5": "e393d66e9b8bc3e007b64c2c7867de62", "sha256": "254b4712d9b7bdd6bbff150c9bd77a4126ffde2aaf7db880f3b95735fc7bdd73" }, "downloads": -1, "filename": "ros-0.04.tar.gz", "has_sig": false, "md5_digest": "e393d66e9b8bc3e007b64c2c7867de62", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20463, "upload_time": "2018-10-02T21:51:49", "url": "https://files.pythonhosted.org/packages/52/fc/20b85e54241a8fcb5f572057ffa7ada5d6ca5fe8d3f8fa26bfeaf4acda9a/ros-0.04.tar.gz" } ], "0.05": [ { "comment_text": "", "digests": { "md5": "3f9b12584afb7b9ca3c13aafa1ac9d9d", "sha256": "e7bec92e27953359e0d8ec93983c026b59a72cc87c3b93ac94bcbeedf4a87fd5" }, "downloads": -1, "filename": "ros-0.05.tar.gz", "has_sig": false, "md5_digest": "3f9b12584afb7b9ca3c13aafa1ac9d9d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20463, "upload_time": "2018-10-02T21:54:04", "url": "https://files.pythonhosted.org/packages/0a/c5/57c7ff823a74cdda63347ecdcd6de99d6d00aea80ecee5e899ad22bf0a97/ros-0.05.tar.gz" } ], "0.06": [ { "comment_text": "", "digests": { "md5": "213db165c0caf828a44bdd3ffaf7243b", "sha256": "9ad3e87df7d171091c9e658bf230fab2fb0567f79262c3021e729f774b4aa7f5" }, "downloads": -1, "filename": "ros-0.06.tar.gz", "has_sig": false, "md5_digest": "213db165c0caf828a44bdd3ffaf7243b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20505, "upload_time": "2018-10-02T22:06:31", "url": "https://files.pythonhosted.org/packages/95/65/0cc9d235a44d0aa8fc4714177349396d76846f24d696abfffa508ce6cf7b/ros-0.06.tar.gz" } ], "0.07": [ { "comment_text": "", "digests": { "md5": "40908e1f4d1f34b37bae5fd2767423e6", "sha256": "20b51c3cfd4f554b237789d61c8b707508cf512a01503b310bf8e02c415b0dd5" }, "downloads": -1, "filename": "ros-0.07.tar.gz", "has_sig": false, "md5_digest": "40908e1f4d1f34b37bae5fd2767423e6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20503, "upload_time": "2018-10-02T22:19:14", "url": "https://files.pythonhosted.org/packages/1a/60/c0311e3e4cb02167f43704e1a509e61bcae9b109764f47a547dc58916654/ros-0.07.tar.gz" } ], "0.08": [ { "comment_text": "", "digests": { "md5": "aa40c0885591fc62eebeae1540ef7685", "sha256": "753a7ba9fdaa9c4908f0a5afe0f123fe4caaf8c01a299de32f989deccba925cc" }, "downloads": -1, "filename": "ros-0.08.tar.gz", "has_sig": false, "md5_digest": "aa40c0885591fc62eebeae1540ef7685", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20500, "upload_time": "2018-10-02T22:21:22", "url": "https://files.pythonhosted.org/packages/e8/f1/a8f5755c2a8af584f09dbfd9ca4e5aa64fafc9c6ce1f042cafbb41552b9e/ros-0.08.tar.gz" } ], "0.09": [ { "comment_text": "", "digests": { "md5": "f8aeb5d4e5792654253e3cf4c8ca8630", "sha256": "f9768db5f67157337ffedfd0e49440164092919c7a722d2992e4ac83d9e1fe35" }, "downloads": -1, "filename": "ros-0.09.tar.gz", "has_sig": false, "md5_digest": "f8aeb5d4e5792654253e3cf4c8ca8630", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25951, "upload_time": "2018-10-02T22:24:24", "url": "https://files.pythonhosted.org/packages/5c/ef/a90f41bc068e1ead5ed14188e84ad79825a94a9c34077d55fd5820aa549f/ros-0.09.tar.gz" } ], "0.091": [ { "comment_text": "", "digests": { "md5": "2e8ea3d5f2c88591c53b8573c9d8727c", "sha256": "80b12bee96807ae688ff86fafda69d2251b8efa898a8b16ee28db886a70a6051" }, "downloads": -1, "filename": "ros-0.091.tar.gz", "has_sig": false, "md5_digest": "2e8ea3d5f2c88591c53b8573c9d8727c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25971, "upload_time": "2018-10-02T23:14:58", "url": "https://files.pythonhosted.org/packages/7c/5f/6a4d13f723fb4c607f2b9fd69c03ee0adacbea009d77407004d1fe147368/ros-0.091.tar.gz" } ], "0.092": [ { "comment_text": "", "digests": { "md5": "e71551b9209f677b77e66a4d71b94c8d", "sha256": "b08dddb2665b8a7a0fd22fd12c6f93d301df3db0400c8d2e19bda3efa44f9e8c" }, "downloads": -1, "filename": "ros-0.092.tar.gz", "has_sig": false, "md5_digest": "e71551b9209f677b77e66a4d71b94c8d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25972, "upload_time": "2018-10-02T23:15:15", "url": "https://files.pythonhosted.org/packages/31/3b/8254ccc17a02ba2306e67180d316765da26b5cf74bc737fa6a3ed6f84d7e/ros-0.092.tar.gz" } ], "0.093": [ { "comment_text": "", "digests": { "md5": "560117adfb0a4d05df21520066d20d2b", "sha256": "b97b90d26f0f7760d5a823028bf2fbbfea2a8c5aaf28cb5a23978b8fa865efda" }, "downloads": -1, "filename": "ros-0.093.tar.gz", "has_sig": false, "md5_digest": "560117adfb0a4d05df21520066d20d2b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25968, "upload_time": "2018-10-02T23:17:08", "url": "https://files.pythonhosted.org/packages/db/db/17e6483abda450dc6556f270d337674cb5408c82f5e8b09372e1a4b03af3/ros-0.093.tar.gz" } ], "0.094": [ { "comment_text": "", "digests": { "md5": "9a199d5995a7e4da97f46d4ee36fcd70", "sha256": "d7ab9398920ca8beccd7cb728fd38474621f6dd491aaa0faf508f450b69e9e0b" }, "downloads": -1, "filename": "ros-0.094.tar.gz", "has_sig": false, "md5_digest": "9a199d5995a7e4da97f46d4ee36fcd70", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26027, "upload_time": "2018-10-03T00:19:16", "url": "https://files.pythonhosted.org/packages/b1/2b/09de44f009085b1fd37941f0d716b0b31ae9c6c8d9d14081f3c1d245cc56/ros-0.094.tar.gz" } ], "0.095": [ { "comment_text": "", "digests": { "md5": "291de311366cb18ec1b548424293787b", "sha256": "a696009afd4de9af8460622682a26825cb1fbbb169091e3ef9a2d10e60446566" }, "downloads": -1, "filename": "ros-0.095.tar.gz", "has_sig": false, "md5_digest": "291de311366cb18ec1b548424293787b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26039, "upload_time": "2018-10-03T00:24:49", "url": "https://files.pythonhosted.org/packages/9a/d1/d363abf1dc2285b16cd77acb657611eb916ec5598f848c6ea34ce5e7a69f/ros-0.095.tar.gz" } ], "0.096": [ { "comment_text": "", "digests": { "md5": "6b38363c18785e1315643d998202d4ba", "sha256": "0d2f32957af6de7824e98a576a60734bd5d6d90de4211071bec34ef78f530701" }, "downloads": -1, "filename": "ros-0.096.tar.gz", "has_sig": false, "md5_digest": "6b38363c18785e1315643d998202d4ba", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 33505, "upload_time": "2018-10-09T23:28:01", "url": "https://files.pythonhosted.org/packages/0d/d7/13b76d0b6c7eb8beb8b88dac83f702af645545cd6d60cfd0f6df109d489e/ros-0.096.tar.gz" } ], "0.097": [ { "comment_text": "", "digests": { "md5": "69b30579f82df6fef6d660110badcbb1", "sha256": "4f0e9d3453ad3f4d61e18e2da54794a2f041f72e33b13e92c3cc22090477c97e" }, "downloads": -1, "filename": "ros-0.097.tar.gz", "has_sig": false, "md5_digest": "69b30579f82df6fef6d660110badcbb1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 35718, "upload_time": "2018-10-13T18:52:35", "url": "https://files.pythonhosted.org/packages/f3/6d/bccac9555d754e919b512232d810ba454e9f50948241142da87800c02a44/ros-0.097.tar.gz" } ], "0.098": [ { "comment_text": "", "digests": { "md5": "1970f16298e0db96154d24ef6c931622", "sha256": "385ac68428be37ac9edb8494689a8c0a4908b4e5fd25d4471764ac1f997ed140" }, "downloads": -1, "filename": "ros-0.098.tar.gz", "has_sig": false, "md5_digest": "1970f16298e0db96154d24ef6c931622", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 35725, "upload_time": "2018-10-13T18:54:05", "url": "https://files.pythonhosted.org/packages/aa/7f/57f4ac7094c9aa3316d34aeaacec8e3e33739d1df02fc0bd80d178013d0d/ros-0.098.tar.gz" } ], "0.099": [ { "comment_text": "", "digests": { "md5": "9ce69b168949d80106cca9b98a24fa76", "sha256": "5651ea6e609f1cd5a0d5bdb18d09c89965236a7336b8876877c0772c3afe3c7a" }, "downloads": -1, "filename": "ros-0.099.tar.gz", "has_sig": false, "md5_digest": "9ce69b168949d80106cca9b98a24fa76", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 41398, "upload_time": "2018-10-13T18:57:38", "url": "https://files.pythonhosted.org/packages/09/42/8d95e770d5cdd0dba75a0b4a97777643709ab19bae9279531c17db5bdc6a/ros-0.099.tar.gz" } ], "0.11": [ { "comment_text": "", "digests": { "md5": "6c0ce670c39953949e999a9f263f2d23", "sha256": "7fca9d79def63416936821fa37152b33f6fc1f49cd103e20bbb11c3f640232c2" }, "downloads": -1, "filename": "ros-0.11.tar.gz", "has_sig": false, "md5_digest": "6c0ce670c39953949e999a9f263f2d23", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 41397, "upload_time": "2018-10-13T19:01:53", "url": "https://files.pythonhosted.org/packages/fe/30/b8018844d72ddad403867035997db1909fde235581cc3aaa9a6cd13d0eb1/ros-0.11.tar.gz" } ], "0.111": [ { "comment_text": "", "digests": { "md5": "739793a3ef16982bc9bb7e3058cbaf80", "sha256": "b885d46ca9ad4f4465b089919057d4d6826f377943aa0498c04b23909187730e" }, "downloads": -1, "filename": "ros-0.111.tar.gz", "has_sig": false, "md5_digest": "739793a3ef16982bc9bb7e3058cbaf80", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 41379, "upload_time": "2018-10-13T19:13:40", "url": "https://files.pythonhosted.org/packages/ac/73/17a0c73238eaa8354ae68a947a9ed7c0a29c56d8cd8ccfda358c66b652f9/ros-0.111.tar.gz" } ], "0.112": [ { "comment_text": "", "digests": { "md5": "90488883192b234bf1fe0f3c31221b55", "sha256": "ed45cf42e2fa49de09aea9252fd575e3d3150b8d250d61a5c468d404753fade2" }, "downloads": -1, "filename": "ros-0.112.tar.gz", "has_sig": false, "md5_digest": "90488883192b234bf1fe0f3c31221b55", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 41435, "upload_time": "2018-10-13T19:15:01", "url": "https://files.pythonhosted.org/packages/69/52/96da43670d0caca89197a3cad53d6198bc6c132de5eed0bd69b90fcfd848/ros-0.112.tar.gz" } ], "0.113": [ { "comment_text": "", "digests": { "md5": "d5456a20ca46db5408b20adee3bbfb84", "sha256": "008b39028a14c53545f916aa716a357ec71613b64656c1519875bdc045d742c0" }, "downloads": -1, "filename": "ros-0.113.tar.gz", "has_sig": false, "md5_digest": "d5456a20ca46db5408b20adee3bbfb84", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 34383, "upload_time": "2018-10-13T19:22:03", "url": "https://files.pythonhosted.org/packages/8d/69/5e0a30cab9027b4b6e1ed0e3999b4c2e0934ff5e4b1dfa4e3e5588475d11/ros-0.113.tar.gz" } ], "0.114": [ { "comment_text": "", "digests": { "md5": "6e245d641c98fc6220f82082278e20f4", "sha256": "12b9497d3a2cc6a9833bd0576f96589ceb334a0554196e506ce223d5bad3b505" }, "downloads": -1, "filename": "ros-0.114.tar.gz", "has_sig": false, "md5_digest": "6e245d641c98fc6220f82082278e20f4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 34384, "upload_time": "2018-10-13T19:23:14", "url": "https://files.pythonhosted.org/packages/5e/f1/52459216bdf2a8531cdb94db741292b52468725876d5337c449af800809e/ros-0.114.tar.gz" } ], "0.115": [ { "comment_text": "", "digests": { "md5": "082fd011d2eb14ace48078f0ae3757ab", "sha256": "d379caeea4340e7b1e7e2abf2ae215a0d78d579b8632c2d1f6a0a657002d035f" }, "downloads": -1, "filename": "ros-0.115.tar.gz", "has_sig": false, "md5_digest": "082fd011d2eb14ace48078f0ae3757ab", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 40219, "upload_time": "2018-10-25T16:17:15", "url": "https://files.pythonhosted.org/packages/42/01/817b0a59fff3c4750be0ccc049d7daf511303c1a41873275bfb30e6a14bb/ros-0.115.tar.gz" } ], "0.116": [ { "comment_text": "", "digests": { "md5": "9dac33e2f38947bb851769fb71e100e9", "sha256": "313dac8f11d3224fa242b12654bbc9c3901987e97547ce48851bc188f9cc7db9" }, "downloads": -1, "filename": "ros-0.116.tar.gz", "has_sig": false, "md5_digest": "9dac33e2f38947bb851769fb71e100e9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 40220, "upload_time": "2018-10-25T17:08:58", "url": "https://files.pythonhosted.org/packages/ac/4e/a37ae8b56056a6b56eab6420aa7457e6f75a33c66395839fe0cf1ab74e82/ros-0.116.tar.gz" } ], "0.117": [ { "comment_text": "", "digests": { "md5": "c9dec5d6e5dab9ca6d3e488fdf38fdcf", "sha256": "0247efaed37dd6e8e7f576a4ff68527cfc4d31b51e4cf1859d7b22fb6576b6e3" }, "downloads": -1, "filename": "ros-0.117.tar.gz", "has_sig": false, "md5_digest": "c9dec5d6e5dab9ca6d3e488fdf38fdcf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 47502, "upload_time": "2018-10-25T18:25:31", "url": "https://files.pythonhosted.org/packages/55/74/4ef72fed04824a5d04a74d1086b52d69720cb2f5d915745249ddc37b1c9d/ros-0.117.tar.gz" } ], "0.118": [ { "comment_text": "", "digests": { "md5": "59e529c31eafcc4465622210f12a1a12", "sha256": "7b362b9ada729ec73f2ae80006d209bd33f585b0eff23247227488fd7d50e455" }, "downloads": -1, "filename": "ros-0.118.tar.gz", "has_sig": false, "md5_digest": "59e529c31eafcc4465622210f12a1a12", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 47507, "upload_time": "2018-10-25T19:09:59", "url": "https://files.pythonhosted.org/packages/0b/b4/bbfad0700f9f89a947859d7464ebea015e84bdf8a4efa15394dca21e10d6/ros-0.118.tar.gz" } ], "0.119": [ { "comment_text": "", "digests": { "md5": "1c51ee4672359970ce3454d747131147", "sha256": "936206f67e020bd6ad1da74e6f86f8dc63cf1ef1bfc0f58c9ad19affee647563" }, "downloads": -1, "filename": "ros-0.119.tar.gz", "has_sig": false, "md5_digest": "1c51ee4672359970ce3454d747131147", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 47471, "upload_time": "2018-10-25T19:35:54", "url": "https://files.pythonhosted.org/packages/49/3f/6cda2e2226da8972d78426b57138445aecfada51367e37fa3b39f0ad4c90/ros-0.119.tar.gz" } ], "0.12": [ { "comment_text": "", "digests": { "md5": "962e897388a36ff4cddf209e40b14b16", "sha256": "c1a586eaad2f03b6163c3ad23e15904f4fd07c79977dd8d7aeb99c3e905c459b" }, "downloads": -1, "filename": "ros-0.12.tar.gz", "has_sig": false, "md5_digest": "962e897388a36ff4cddf209e40b14b16", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 47475, "upload_time": "2018-10-25T21:10:12", "url": "https://files.pythonhosted.org/packages/3e/4a/6a1113f3fbfae29c8bacbdbdcb2c053e2bd3ea0e471791331dce33551136/ros-0.12.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "1c51ee4672359970ce3454d747131147", "sha256": "936206f67e020bd6ad1da74e6f86f8dc63cf1ef1bfc0f58c9ad19affee647563" }, "downloads": -1, "filename": "ros-0.119.tar.gz", "has_sig": false, "md5_digest": "1c51ee4672359970ce3454d747131147", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 47471, "upload_time": "2018-10-25T19:35:54", "url": "https://files.pythonhosted.org/packages/49/3f/6cda2e2226da8972d78426b57138445aecfada51367e37fa3b39f0ad4c90/ros-0.119.tar.gz" } ] }