{ "info": { "author": "Tjelvar Olsson", "author_email": "tjelvar.olsson@jic.ac.uk", "bugtrack_url": null, "classifiers": [], "description": "Dtool Lookup Server\n===================\n\n.. image:: https://badge.fury.io/py/dtool-lookup-server.svg\n :target: http://badge.fury.io/py/dtool-lookup-server\n :alt: PyPi package\n\n.. image:: https://travis-ci.org/jic-dtool/dtool-lookup-server.svg?branch=master\n :target: https://travis-ci.org/jic-dtool/dtool-lookup-server\n :alt: Travis CI build status (Linux)\n\n.. image:: https://codecov.io/github/jic-dtool/dtool-lookup-server/coverage.svg?branch=master\n :target: https://codecov.io/github/jic-dtool/dtool-lookup-server?branch=master\n :alt: Code Coverage\n\n- GitHub: https://github.com/jic-dtool/dtool-lookup-server\n- PyPI: https://pypi.python.org/pypi/dtool-lookup-server\n- Free software: MIT License\n\n\nFeatures\n--------\n\n- Use a dataset UUID to lookup one more URIs where the dataset is stored\n- Search for datasets of interest using free text search\n- Built in support to manage users\n- Built in support to manage base URIs\n- Build in support to manage a user permissions on base URIs\n- Built in support for authentication using JSON web tokens\n\n\nIntroduction\n------------\n\n`dtool `_ is a command line tool for packaging\ndata and metadata into a dataset. A dtool dataset manages data and metadata\nwithout the need for a central database.\n\nHowever, if one has to manage more than a hundred datasets it can be helpful\nto have the datasets' metadata stored in a central server to enable one to\nquickly find datasets of interest.\n\nThe dtool-lookup-server provides a web API for registering datasets' metadata\nand provides functionality to lookup, list and search for datasets.\n\nWhen managing many groups data it can be useful to ensure that users can only\naccess metadata associated with datasets stored in base URI's that they have\nbeen given access to. The dtool-lookup-server therefore provides means to\nmanage users, base URIs and users' permissions on those base URIs.\n\nThe dtool-lookup-server is consumed by the `dtool-lookup-client\n`_.\n\n\nInstallation\n------------\n\nInstall the dtool lookup server::\n\n $ pip install dtool-lookup-server\n\nSetup and configuration\n-----------------------\n\nConfigure the Flask app\n^^^^^^^^^^^^^^^^^^^^^^^\n\nThe dtool lookup server is a Flask app. Flask needs to know where to look for\nthe app. One therefore needs to define the ``FLASK_APP`` environment variable::\n\n $ export FLASK_APP=dtool_lookup_server\n\nConfigure the SQL database\n^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nThe dtool lookup server stores administrative metadata in a SQL database.\nBy default it uses a SQLite database. However, this can be configured by\nsetting the ``SQLALCHEMY_DATABASE_URI``, i.e using something along the lines of::\n\n export SQLALCHEMY_DATABASE_URI=mysql://username:password@server/db\n\nFor more information see `flask-SQLAlchemy\n`_.\n\nVersioning of the relational database is handled using\n`flask-Migrate `_\n\nPopulate the SQL database with tables using the commands below::\n\n $ flask db init\n $ flask db migrate\n $ flask db upgrade\n\nConfigure the Mongo database\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nThe dtool lookup server stores descriptive data in a Mongo database. This is\nused for free text searching.\n\nCreate a directory where the MongoDB data will be stored::\n\n $ mkdir data\n\nStart Mongo DB, for example using docker::\n\n $ docker run -d -p 27017:27017 -v `pwd`/data:/data/db mongo\n\n\nConfigure a public and private key pair\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nThe dtool lookup server implements authentication using JSON Web Tokens.\nIt is possible to delegate the generation of JSON Web Tokens to a different\nservice as long as one has access to the public key::\n\n export JWT_PUBLIC_KEY_FILE=~/.ssh/id_rsa.pub\n\nIf one has access to the private key as well one can use the ``flask user\ntoken`` command line utility to generate a token for the user. To enable this\none has to set the ``JWT_PRIVATE_KEY_FILE`` environment variable::\n\n export JWT_PRIVATE_KEY_FILE=~/.ssh/id_rsa\n\nMac users be warned that the Mac's implementation ``ssh-keygen`` may result in\nfiles that do not adhere to the RFC standard. As such you may get a warning\nalong the lines of::\n\n ValueError: Could not deserialize key data.\n\nIn this case you need to find a version of ``ssh-keygen`` that generates files\nthat adhere to the RFC standard, the easiest is probably to generate them in Linux.\n\nMaking use of JSON Web Tokens from a different server\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nWhen making use of JSON Web Tokens from a different server it may be easier to\nuse configure the server using the pubic key directly rather than the public key\nfile::\n\n export JWT_PUBLIC_KEY=\"ssh-rsa XXXXXX user@localhost\"\n\nStarting the flask app\n^^^^^^^^^^^^^^^^^^^^^^\n\nThe Flask web app can be started using the command below::\n\n $ flask run\n\n\nPopulating the dtool lookup server using the CLI\n------------------------------------------------\n\nIndexing a base URI\n^^^^^^^^^^^^^^^^^^^\n\nDatasets can be stored on filesystem and in object storage such as AWS S3. In\nan AWS S3 bucket datasets are stored in a flat structure and the bucket itself\nis the base URI. To index all the datasets in the S3 bucket, the base URI, one\nfirst needs to register it in the dtool lookup server::\n\n flask base_uri add s3://dtool-demo\n\nOne can then index it using the command::\n\n $ flask base_uri index s3://dtool-demo\n Registered: s3://dtool-demo/8ecd8e05-558a-48e2-b563-0c9ea273e71e\n Registered: s3://dtool-demo/907e1b52-d649-476a-b0bc-643ef769a7d9\n Registered: s3://dtool-demo/af6727bf-29c7-43dd-b42f-a5d7ede28337\n Registered: s3://dtool-demo/ba92a5fa-d3b4-4f10-bcb9-947f62e652db\n Registered: s3://dtool-demo/c58038a4-3a54-425e-9087-144d0733387f\n Registered: s3://dtool-demo/faa44606-cb86-4877-b9ea-643a3777e021\n\nIt is possible to list all the base URIs registered in the dtool lookup server::\n\n $ flask base_uri list\n [\n {\n \"base_uri\": \"s3://dtool-demo\",\n \"users_with_search_permissions\": [],\n \"users_with_register_permissions\": []\n }\n ]\n\nIn the output above it is worth noting that there are two types of permissions\nassociated with a base URI. \"Search\" permissions allow a user to search for\ndatasets in a base URI. \"Register\" permissions allow a user to register a\ndataset in the dtool lookup server if it is stored in the specific base URI.\n\n\nAdding a user and managing permissions\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nThe command below adds the user ``olssont`` to the dtool lookup server::\n\n $ flask user add olssont\n\nThe command below gives the user ``olssont`` search permissions on the\n``s3://dtool-demo`` base URI::\n\n $ flask user search_permission olssont s3://dtool-demo\n\nThe command below gives the user ``olssont`` register permissions on the\n``s3://dtool-demo`` base URI::\n\n $ flask user register_permission olssont s3://dtool-demo\n\n\nCreating an admin user\n^^^^^^^^^^^^^^^^^^^^^^\n\nThe command below adds the user ``overlord``, with admin privileges, to the\ndtool lookup server::\n\n $ flask user add --is_admin overlord\n\n\nGenerating a JSON Web Token for a registered user\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nThe command below can be used to generate a token for a user to authenticate\nwith when using the web API.\n\n $ flask user token olssont\n eyJhbGciOiJSUzI1NiIsInR5... (truncated)\n\n\nListing the registered users\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nThe command below lists the users registered in the dtool lookup server::\n\n $ flask user list\n [\n {\n \"username\": \"olssont\",\n \"is_admin\": false,\n \"register_permissions_on_base_uris\": [\n \"s3://dtool-demo\"\n ],\n \"search_permissions_on_base_uris\": [\n \"s3://dtool-demo\"\n ]\n },\n {\n \"username\": \"overlord\",\n \"is_admin\": true,\n \"register_permissions_on_base_uris\": [],\n \"search_permissions_on_base_uris\": []\n }\n ]\n\n\nThe dtool lookup server API\n---------------------------\n\nThe dtool lookup server makes use of the Authrized header to pass through the\nJSON web token for authrization. Below we create environment variables for the\ntoken and the header used in the ``curl`` commands::\n\n $ TOKEN=$(flask user token olssont)\n $ HEADER=\"Authorization: Bearer $TOKEN\"\n\n\nStandard user usage\n^^^^^^^^^^^^^^^^^^^\n\nLooking up URIs based on a dataset's UUID\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nA dataset can be uniquely identified by it's UUID (Universally Unique\nIdentifier). Below we create an environment variable with the UUID of a dataset\nin the s3://dtool-demo bucket::\n\n $ UUID=8ecd8e05-558a-48e2-b563-0c9ea273e71e\n\nIt is possible to list all the location a dataset is located in using the\ncommand below::\n\n $ curl -H $HEADER http://localhost:5000/dataset/lookup/$UUID\n\nResponse content::\n\n [\n {\n \"base_uri\": \"s3://dtool-demo\",\n \"name\": \"Escherichia-coli-ref-genome\",\n \"uri\": \"s3://dtool-demo/8ecd8e05-558a-48e2-b563-0c9ea273e71e\",\n \"uuid\": \"8ecd8e05-558a-48e2-b563-0c9ea273e71e\"\n }\n ]\n\nNote that it is possible for a dataset to be registered in more than one base\nURI. As such looking up a dataset by UUID can result in multiple hits.\n\n\nSummary information about datasets\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nAn overall summary of datasets accessible to a user can be accessed using the request below::\n\n $ curl -H $HEADER http://localhost:5000/dataset/summary\n\nThe response will contain JSON content along the lines of::\n\n {\n \"number_of_datasets\": 3,\n \"creator_usernames\": [\"queen\"],\n \"base_uris\": [\"s3://mr-men\", \"s3://snow-white\"],\n \"datasets_per_creator\": {\"queen\": 3},\n \"datasets_per_base_uri\": {\"s3://mr-men\": 1, \"s3://snow-white\": 2}\n }\n\n\nListing all datasets\n~~~~~~~~~~~~~~~~~~~~\n\nAll the dataset's that a user has permissions to search for can be listed using\nthe request below::\n\n $ curl -H $HEADER http://localhost:5000/dataset/list\n\nSome of the output of the command above is displayed below::\n\n [\n {\n \"base_uri\": \"s3://dtool-demo\",\n \"name\": \"Escherichia-coli-ref-genome\",\n \"uri\": \"s3://dtool-demo/8ecd8e05-558a-48e2-b563-0c9ea273e71e\",\n \"uuid\": \"8ecd8e05-558a-48e2-b563-0c9ea273e71e\"\n },\n ... (truncated)\n {\n \"base_uri\": \"s3://dtool-demo\",\n \"name\": \"Escherichia-coli-reads-ERR022075\",\n \"uri\": \"s3://dtool-demo/faa44606-cb86-4877-b9ea-643a3777e021\",\n \"uuid\": \"faa44606-cb86-4877-b9ea-643a3777e021\"\n }\n ]\n\n\n\nSearching for specific datasets\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nThe command below does a full text search for the word \"microscopy\" in the descriptive metadata::\n\n $ curl -H $HEADER -H \"Content-Type: application/json\" \\\n -X POST -d '{\"free_text\": \"microscopy\"}' \\\n http://localhost:5000/dataset/search\n\nBelow is the result of this search::\n\n [\n {\n \"base_uri\": \"s3://dtool-demo\",\n \"created_at\": \"1530803916.74\",\n \"creator_username\": \"olssont\",\n \"dtoolcore_version\": \"3.3.0\",\n \"frozen_at\": \"1536749825.85\",\n \"name\": \"hypocotyl3\",\n \"readme\": {\n \"DataDOI\": \"https://doi.org/10.6084/m9.figshare.3438743.v1\",\n \"Device\": \"Zeiss LSM780\",\n \"Experiment Commentary\": \"Confocal microscopy image of hypocotyl.\\nCell walls stained using FM4-64 [5ug/ml].\\nNucelus marked using 35s::GFP:eIF3a (see reference for more detail).\\n\",\n \"Experiment Date\": \"28 Jan 2016\",\n \"Imaging probes\": \"FM4-64 + GFP-nucleus\",\n \"Notes\": \"Orignal file unpacked using bfconvert 5.0.2\",\n \"Objective Lens\": \"x40/1.2 water\",\n \"Organ/tissue type\": \"Hypocotyl\",\n \"ReferenceDOI\": \"http://dx.doi.org/10.1105/tpc.108.060434\",\n \"Species\": \"Arabidopsis thaliana (Thale cress)\"\n },\n \"type\": \"dataset\",\n \"uri\": \"s3://dtool-demo/ba92a5fa-d3b4-4f10-bcb9-947f62e652db\",\n \"uuid\": \"ba92a5fa-d3b4-4f10-bcb9-947f62e652db\"\n }\n ]\n\nBelow is a JSON string specifying a more complex query that will search for\ndatasets with \"aples\" in the \"s3://snow-white\" bucket created by either\n\"grumpy\" or \"dopey\"::\n\n {\n \"base_uris\": [\"s3://snow-white\"],\n \"creator_usernames\": [\"grumpy\", \"dopey\"],\n \"free_text\": \"apples\"\n }\n\n\nGetting information about one's own permissions\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nA user can find out about his/her own permissions using the command below::\n\n $ curl -H $HEADER http://localhost:5000/user/info/olssont\n\nResponse content::\n\n {\n \"is_admin\": false,\n \"register_permissions_on_base_uris\": [\n \"s3://dtool-demo\"\n ],\n \"search_permissions_on_base_uris\": [\n \"s3://dtool-demo\"\n ],\n \"username\": \"olssont\"\n }\n\n\nData champion user usage\n^^^^^^^^^^^^^^^^^^^^^^^^\n\nA data champion is different from a regular user in that he/she has\n\"register\" permissions on a base URI. This means that a data champion\ncan register metadata about a data to the dtool lookup server.\n\nRegistering a dataset\n~~~~~~~~~~~~~~~~~~~~~\n\nBelow is an example of how to register a dataset::\n\n $ DATASET_INFO='{\n \"base_uri\": \"s3://dtool-demo\",\n \"created_at\": 1537802877.62,\n \"creator_username\": \"olssont\",\n \"dtoolcore_version\": \"3.7.0\",\n \"frozen_at\": 1537916653.7,\n \"name\": \"Escherichia-coli-ref-genome\",\n \"readme\": {\n \"accession_id\": \"U00096.3\",\n \"description\": \"U00096.3 genome with Bowtie2 indices\",\n \"index_build_cmd\": \"bowtie2-build U00096.3.fasta reference\",\n \"index_builder\": \"bowtie2-build version 2.3.3\",\n \"link\": \"https://www.ebi.ac.uk/ena/data/view/U00096.3\",\n \"organism\": \"Escherichia coli str. K-12 substr. MG1655\"\n },\n \"type\": \"dataset\",\n \"uri\": \"s3://dtool-demo/8ecd8e05-558a-48e2-b563-0c9ea273e71e\",\n \"uuid\": \"8ecd8e05-558a-48e2-b563-0c9ea273e71e\"\n }'\n $ curl -H $HEADER -H \"Content-Type: application/json\" \\\n -X POST -d $DATASET_INFO \\\n http://localhost:5000/dataset/register\n\nNot all of the metadata above is required.\nThe required keys are defined in the variable\n``dtool_lookup_server.utils.DATASET_INFO_REQUIRED_KEYS``.\n\n\nAdmin user usage\n^^^^^^^^^^^^^^^^\n\nThe administrative user can register new users, base URIs and manage who has\npermissions to search for and register datasets. Below we update the header\nto use the token from the ``overlord`` admin user::\n\n $ TOKEN=$(flask user token overlord)\n $ HEADER=\"Authorization: Bearer $TOKEN\"\n\n\nListing registered users\n~~~~~~~~~~~~~~~~~~~~~~~~\n\nTo list all the registered users an admin user can use the below::\n\n $ curl -H $HEADER http://localhost:5000/admin/user/list\n\nResponse content::\n\n [\n {\n \"is_admin\": false,\n \"register_permissions_on_base_uris\": [\n \"s3://dtool-demo\"\n ],\n \"search_permissions_on_base_uris\": [\n \"s3://dtool-demo\"\n ],\n \"username\": \"olssont\"\n },\n {\n \"is_admin\": true,\n \"register_permissions_on_base_uris\": [],\n \"search_permissions_on_base_uris\": [],\n \"username\": \"overlord\"\n }\n ]\n\n\nRegistering users\n~~~~~~~~~~~~~~~~~\n\nAn admin user can register other users in batch::\n\n $ curl -H $HEADER -H \"Content-Type: application/json\" \\\n -X POST -d '[{\"username\": \"admin\", \"is_admin\": true}, {\"username\": \"joe\"}]' \\\n http://localhost:5000/admin/user/register\n\n\n\n\nRegistering a base URI\n~~~~~~~~~~~~~~~~~~~~~~\n\nAn admin user can register a new base URI::\n\n $ curl -H $HEADER -H \"Content-Type: application/json\" \\\n -X POST -d '{\"base_uri\": \"s3://another-bucket\"}' \\\n http://localhost:5000/admin/base_uri/register\n\n\nListing registered base URIs\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nAn admin user can list all registered base URIs::\n\n $ curl -H $HEADER http://localhost:5000/admin/base_uri/list\n\nResponse content::\n\n [\n {\n \"base_uri\": \"s3://dtool-demo\",\n \"users_with_register_permissions\": [\n \"olssont\"\n ],\n \"users_with_search_permissions\": [\n \"olssont\"\n ]\n },\n {\n \"base_uri\": \"s3://another-bucket\",\n \"users_with_register_permissions\": [],\n \"users_with_search_permissions\": []\n }\n ]\n\n\nUpdating the permissions on a base URI\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nAn admin user can update the permissions on a base URI::\n\n $ curl -H $HEADER -H \"Content-Type: application/json\" \\\n -X POST -d '{\n \"base_uri\": \"s3://another-bucket\",\n \"users_with_register_permissions\": [\n \"olssont\"\n ],\n \"users_with_search_permissions\": [\n \"olssont\"\n ]\n }' \\\n http://localhost:5000/admin/permission/update_on_base_uri\n\nNote that the request below can be used to clear all existing permissions::\n\n $ curl -H $HEADER -H \"Content-Type: application/json\" \\\n -X POST -d '{\n \"base_uri\": \"s3://another-bucket\",\n \"users_with_register_permissions\": [],\n \"users_with_search_permissions\": []}' \\\n http://localhost:5000/admin/permission/update_on_base_uri\n\n\nGetting informations about the permissions on a base URI\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nAn admin user can get information about the permissions on a base URI::\n\n $ curl -H $HEADER -H \"Content-Type: application/json\" \\\n -X POST -d '{\"base_uri\": \"s3://another-bucket\"}' \\\n http://localhost:5000/admin/permission/info\n\nResponse content::\n\n {\n \"base_uri\": \"s3://another-bucket\",\n \"users_with_register_permissions\": [],\n \"users_with_search_permissions\": []\n }\n\n", "description_content_type": "", "docs_url": null, "download_url": "https://github.com/jic-dtool/dtool-lookup-server/tarball/0.11.0", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/jic-dtool/dtool-lookup-server", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "dtool-lookup-server", "package_url": "https://pypi.org/project/dtool-lookup-server/", "platform": "", "project_url": "https://pypi.org/project/dtool-lookup-server/", "project_urls": { "Download": "https://github.com/jic-dtool/dtool-lookup-server/tarball/0.11.0", "Homepage": "https://github.com/jic-dtool/dtool-lookup-server" }, "release_url": "https://pypi.org/project/dtool-lookup-server/0.11.0/", "requires_dist": null, "requires_python": "", "summary": "Web API to register/lookup/search for dtool dataset metadata", "version": "0.11.0" }, "last_serial": 5500595, "releases": { "0.10.0": [ { "comment_text": "", "digests": { "md5": "083e088abaf7ae6e97d9f812c421be04", "sha256": "c8f91e6b7da859f301e95e59c125bd0a3c1ba5bdc81e66e74ce9d948b2b53e14" }, "downloads": -1, "filename": "dtool-lookup-server-0.10.0.tar.gz", "has_sig": false, "md5_digest": "083e088abaf7ae6e97d9f812c421be04", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21384, "upload_time": "2019-06-14T20:41:13", "url": "https://files.pythonhosted.org/packages/2b/15/0c0c3439a388d24045b9ec661cbbc8f8096c6995a5dbf6c994e457b9a24b/dtool-lookup-server-0.10.0.tar.gz" } ], "0.11.0": [ { "comment_text": "", "digests": { "md5": "0ebe887953b4f07e80d000aaf9ccc8b7", "sha256": "84ee998d85f85fc06b8545166d7fa622be483f8535c4cab990a1e81449108c1a" }, "downloads": -1, "filename": "dtool-lookup-server-0.11.0.tar.gz", "has_sig": false, "md5_digest": "0ebe887953b4f07e80d000aaf9ccc8b7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21484, "upload_time": "2019-07-08T12:41:08", "url": "https://files.pythonhosted.org/packages/7e/26/c19b448a7f27f5fbcff83de38b2462877a0aa619349b913366e9152a3f76/dtool-lookup-server-0.11.0.tar.gz" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "566eddc29db4a6459979d8697ec549be", "sha256": "f636765e6c760ec8f0e1f4915e7c96702a56b8cc6866d8fd665d88fee4aba92a" }, "downloads": -1, "filename": "dtool-lookup-server-0.5.0.tar.gz", "has_sig": false, "md5_digest": "566eddc29db4a6459979d8697ec549be", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13146, "upload_time": "2019-04-01T16:07:12", "url": "https://files.pythonhosted.org/packages/46/4f/7a1e183de75787583f5511eb6be55a35ae7336f6aa4569138814baf0c2d2/dtool-lookup-server-0.5.0.tar.gz" } ], "0.6.0": [ { "comment_text": "", "digests": { "md5": "2cf79d285b1ac753dca27add27ce6466", "sha256": "adb4fe046a2adb8a9c201ebd4850fa546de52416c66cf68f2c2f698af82110dc" }, "downloads": -1, "filename": "dtool-lookup-server-0.6.0.tar.gz", "has_sig": false, "md5_digest": "2cf79d285b1ac753dca27add27ce6466", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19242, "upload_time": "2019-05-02T12:08:53", "url": "https://files.pythonhosted.org/packages/83/e5/86656e65849b4957769498fd3977055da3c0426334ce9d0869eea8b31163/dtool-lookup-server-0.6.0.tar.gz" } ], "0.7.0": [ { "comment_text": "", "digests": { "md5": "fd418abd3c8ae5539fe1b0f8e489d971", "sha256": "5e2abbe107d090bed3e0e6d3163317cdf8d81fe98b71fea95c83a974f7bb65d6" }, "downloads": -1, "filename": "dtool-lookup-server-0.7.0.tar.gz", "has_sig": false, "md5_digest": "fd418abd3c8ae5539fe1b0f8e489d971", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19551, "upload_time": "2019-05-09T15:35:03", "url": "https://files.pythonhosted.org/packages/4a/a5/91662eef3ed245ecdd18dffde3c3507297e12a89d384a84b6901c7c1829e/dtool-lookup-server-0.7.0.tar.gz" } ], "0.7.1": [ { "comment_text": "", "digests": { "md5": "56417cff273ae1a82c02e6c355bf6d9e", "sha256": "6405e60bcfa48815756e94d77a891fca45d176901b7b5c45cfca0b244c1f7eaa" }, "downloads": -1, "filename": "dtool-lookup-server-0.7.1.tar.gz", "has_sig": false, "md5_digest": "56417cff273ae1a82c02e6c355bf6d9e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19647, "upload_time": "2019-05-10T11:22:14", "url": "https://files.pythonhosted.org/packages/e3/45/bc1a8470491e27869af7c8504cc81a68a8f7d58f389ad94cce6acd44fcab/dtool-lookup-server-0.7.1.tar.gz" } ], "0.8.0": [ { "comment_text": "", "digests": { "md5": "6782c865a07363bc59de603aabe5849d", "sha256": "83aac3d3a8fc1276ace316e909c488931b955547139ecf639d13ddf27074adcf" }, "downloads": -1, "filename": "dtool-lookup-server-0.8.0.tar.gz", "has_sig": false, "md5_digest": "6782c865a07363bc59de603aabe5849d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20204, "upload_time": "2019-06-03T14:43:59", "url": "https://files.pythonhosted.org/packages/16/6a/07fcca55822be6f82243e0a20d0d32a7ab5e2cc25f71ae64f5e274a253db/dtool-lookup-server-0.8.0.tar.gz" } ], "0.9.0": [ { "comment_text": "", "digests": { "md5": "5578db8614896aaa1d4b7378229c8f2c", "sha256": "68a733b578a3281ace56ec32e5214f198d16f25043d7067a01b8604bb6a815c2" }, "downloads": -1, "filename": "dtool-lookup-server-0.9.0.tar.gz", "has_sig": false, "md5_digest": "5578db8614896aaa1d4b7378229c8f2c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21095, "upload_time": "2019-06-06T10:26:17", "url": "https://files.pythonhosted.org/packages/21/ad/d19e8f74b132b5af0d9b21afad45be8ce5fd1c0c463182f7fe450f2a425a/dtool-lookup-server-0.9.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "0ebe887953b4f07e80d000aaf9ccc8b7", "sha256": "84ee998d85f85fc06b8545166d7fa622be483f8535c4cab990a1e81449108c1a" }, "downloads": -1, "filename": "dtool-lookup-server-0.11.0.tar.gz", "has_sig": false, "md5_digest": "0ebe887953b4f07e80d000aaf9ccc8b7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21484, "upload_time": "2019-07-08T12:41:08", "url": "https://files.pythonhosted.org/packages/7e/26/c19b448a7f27f5fbcff83de38b2462877a0aa619349b913366e9152a3f76/dtool-lookup-server-0.11.0.tar.gz" } ] }