{
"info": {
"author": "Benedikt Loeffler, Felix Schmidt, Simon Westphahl",
"author_email": "benedikt.loeffler@bmw.de, felix.fs.schmidt@bmw.de, simon.westphahl@bmw.de",
"bugtrack_url": null,
"classifiers": [
"Development Status :: 5 - Production/Stable",
"Framework :: Flask",
"License :: OSI Approved :: Apache Software License",
"Operating System :: POSIX",
"Programming Language :: Python :: 3 :: Only"
],
"description": "[](https://travis-ci.org/bmwcarit/zubbi)\n\n\n\n
\n\nThe Zuul Building Blocks Index (aka Zubbi) makes it easy to search for available\njobs and roles (\"Building Blocks\") within a [Zuul](https://zuul-ci.org/docs/zuul/)\nbased CI system - even if they are spread over multiple tenants or repositories.\n\n---\n\n*Contents:*\n**[Architecture](#architecture)** |\n**[Quickstart](#quickstart)** |\n**[Development](#development)** |\n**[Scraper usage](#scraper-usage)** |\n**[Configuration Examples](#configuration-examples)** |\n**[Available Connections](#available-connections)** |\n\n---\n\n## Architecture\n\n\nZubbi consists of two parts, **zubbi web** and **zubbi scraper**. It uses\n**Elasticsearch** as storage backend and needs **Git repositories** as\nsource for job and role definitions.\n\n### Zubbi web\nA web frontend based on Flask that reads the data from Elasticsearch. It allows\nsearching for roles and jobs used within the CI system and shows the results\nincluding their documentation, last updates, changelog and some additional meta\ndata.\n\n### Zubbi scraper\nA Python application that scrapes Git repositories, searches for job and\nrole definitions in specific files and stores them in Elasticsearch.\n\n## Quickstart\nPrerequisites: [Docker Compose](https://docs.docker.com/compose/)\n\nZubbi can simply be started by using the provided `docker-compose.yaml` file.\n\n---\n\n**NOTE**\nThe provided `Dockerfile` should only be used for demonstration purposes and not\nin a production system. Flask is running in development mode and listens on all\npublic IPs to make it reachable from outside the docker container.\n\n---\n\nTo get the whole stack up and running, do the following:\n```shell\n$ cd docker\n$ docker-compose build\n$ docker-compose up\n```\n\nThis will build the docker container with the newest Zubbi version, start all\nnecessary services (Elasticsearch, zubbi-scraper, zubbi-web) and does a full\nscrape of the `openstack-infra/zuul-jobs` repository to get an initial set of\ndata.\n\nWhen everything is up, you can visit `http://localhost:5000` and explore the jobs\nand roles from the `openstack-infra/zuul-jobs` repo.\n\n## Development\nPrerequisites: Python 3.6, [Tox](https://tox.readthedocs.io/en/latest/) and\n[Pipenv](https://docs.pipenv.org/) installed.\n\nTo install necessary dependencies for development, run:\n\n```shell\n$ pipenv shell\n$ pipenv install --dev\n```\n\nWe are using [black](https://black.readthedocs.io/en/stable/) to ensure\nwell-formatted Python code. To automatically ensure this on each commit, you can\nuse the included pre-commit hook. To install the hook, simply run:\n\n```shell\n$ pre-commit install\n```\n\nBefore submitting pull requests, run tests and static code checks using tox:\n\n```shell\n$ tox\n```\n\n### Installing & updating dependencies\n\nNew dependencies should be added to the `requires` list in the `setup.py` file:\n\n```python\nrequires = [\n \"arrow\",\n \"click\",\n ...,\n \"\",\n]\n```\n\nAfterwards, run the following command to update the `Pipfile.lock` and install the\nnew dependencies in your local pipenv environment:\n\n```shell\n$ pipenv update\n```\n\nTest dependencies should be installed as development dependencies:\n\n```shell\n$ pipenv install --dev my-test-dependency\n```\n\nTo update the dependencies to the latest version or after a new dependency was\ninstalled you have to run `tox -e update-requirements` and commit the changed\nPipenv and requirements files.\n\n### Configuring and starting Zubbi\nIf you followed the [Development](#development) guide so far, you should already\nhave a virtual environment with all required packages to run Zubbi. What's left,\nare a few configuration files and a local Elasticsearch instance for testing.\n\n#### Elasticsearch\nZubbi is currently depending on Elasticsearch as data backend. If you have\n[Docker Compose](https://docs.docker.com/compose/) installed, you can use\nthe provided `docker-compose.yaml` file to start Elasticsearch locally.\n\n```shell\n$ cd docker\n$ docker-compose up elasticsearch\n```\n\nIf not, we recommend to use the latest available Elasticsearch Docker image, to\nget a local instance up and running for development.\n\n#### Configuration\nBoth - Zubbi scraper and Zubbi web - read their configuration from the file path\ngiven via the `ZUBBI_SETTINGS` environment variable:\n\n```shell\n$ export ZUBBI_SETTINGS=$(pwd)/settings.cfg\n```\n\nIn order to show jobs and roles in Zubbi, we need to provide a minimal \n[tenant configuration](https://zuul-ci.org/docs/zuul/admin/tenants.html)\ncontaining at least a single repository (which is used as source).\nTherefore, put the following in a `tenant-config.yaml` file:\n\n```yaml\n- tenant:\n name: openstack\n source:\n openstack-gerrit:\n untrusted-projects:\n - openstack-infra/zuul-jobs\n```\n\nPut the following in your `settings.cfg` to allow scraping based on the tenant\nconfiguration above and store the results in the local Elasticsearch instance.\nPlease note, that the key in the `CONNECTIONS` dictionary must go in hand with\nthe `source` names in the tenant configuration.\n\n```ini\nELASTICSEARCH = {\n 'host': 'localhost',\n 'port': 9200,\n}\n\nTENANT_SOURCES_FILE = 'tenant-config.yaml'\n\nCONNECTIONS = {\n 'openstack-gerrit': {\n 'provider': 'git',\n 'git_host_url': 'https://git.openstack.org',\n },\n}\n```\n\n#### Running Zubbi\nNow we can scrape the `openstack-infra/zuul-jobs` repository to get a first set\nof jobs and roles into Elasticsearch and show them in Zubbi:\n\n```shell\n$ zubbi-scraper scrape --full\n```\n\nWhen the scraper run was successful, we can start Zubbi web to take a look at\nour data:\n\n```shell\n$ export FLASK_APP=zubbi\n$ export FLASK_DEBUG=true\n$ flask run\n```\n\n### Building the syntax highlighting stylesheet with pygments\n\nWe are using a pre-build pygments stylesheet to highlight the code examples in\njob and roles documentations. In case you want to rebuild this syntax highlighting\nstylesheet (e.g. to try out another highlighting style) you can run the following\ncommand:\n\n```shell\n$ pygmentize -S default -f html -a .highlight > zubbi/static/pygments.css\n```\n\n## Scraper usage\nThe Zubbi scraper supports two different modes: `periodic` (default) and `immediate`.\nTo start the scraper in periodic mode, simply run:\n\n```shell\n$ zubbi-scraper scrape\n```\n\nThis should also scrape all repositories specified in the tenant configuration\nfor the first time.\n\nTo immediately scrape one or more repositories, you can use the following command:\n\n```shell\n# Scrape one or more repositories\n$ zubbi-scraper scrape --repo 'orga1/repo1' --repo 'orga1/repo2'\n\n# Scrape all repositories\n$ zubbi-scraper scrape --full\n```\n\nAdditionally, the scraper provides a `list-repos` command to list all\navailable repositories together with some additional information like the\nlast scraping timestamp and the git provider (connection type):\n\n```shell\n$ zubbi-scraper list-repos\n```\n\n## Configuration examples\nExamples for all available settings can be found in `settings.cfg.example`.\n\n### Tenant Configuration\nZubbi needs to know which projects contain the job and role definitions that\nare used inside the CI system. To achieve this, it uses Zuul's\n[tenant configuration](https://zuul-ci.org/docs/zuul/admin/tenants.html).\nUsually, this tenant configuration is stored in a file that must be specified\nin the `settings.cfg`, but it could also come from a repository.\n\n```ini\n# Use only one of the following, not both\nTENANT_SOURCES_FILE = ''\nTENANT_SOURCES_REPO = '/'\n```\n\n### Elasticsearch Connection\nThe Elasticsearch connection can be configured in the `settings.cfg` like\nthe following:\n\n```ini\nELASTICSEARCH = {\n 'host': '',\n 'port': 9200, # default\n 'user': '',\n 'password': '',\n # Optional, to avoid name clashes with existing ES indices from other applications\n # E.g. 'zubbi' will result in indices like 'zubbi-zuul-jobs', 'zubbi-ansible-roles', ...\n index_prefix: '',\n # Optional, to enable SSL for the Elasticsearch connection.\n # You must at least set 'enabled' to True and provide other parameters if the default\n # values are not sufficient.\n 'tls': {\n 'enabled': False, # default\n 'check_hostname': True, # default\n 'verify_mode': 'CERT_REQUIRED', # default\n },\n}\n```\n\n## Available Connections\nCurrently, Zubbi supports the following connection types: **GitHub**, **Gerrit**\nand **Git**. The latter one can be used for repositories that are not hosted on\neither GitHub or Gerrit.\n\n### GitHub\nThe GitHub connection uses GitHub's REST API to scrape the repositories. To be\nable to use this connection, you need to create a GitHub App with the following\npermissions:\n\n```yaml\nRepository contents: Read-only\nRepository metadata: Read-only\n```\n\nIf you are unsure about how to set up a GitHub App, take a look at the\n[official guide](https://developer.github.com/apps/building-github-apps/creating-a-github-app/).\n\nOnce you have successfully created your GitHub App, you can define the connection\nwith the following parameters in your `settings.cfg` accordingly:\n\n```ini\nCONNECTIONS = {\n '': {\n 'provider': 'github',\n 'url': '',\n 'app_id': ,\n 'app_key': '',\n },\n ...\n}\n```\n\n#### Using GitHub Webhooks\nGitHub webhooks can be used to keep your Zubbi data up to date.\nTo activate GitHub webhooks, you have to provide a weebhook URL pointing to\nthe `/api/webhook` endpoint of your Zubbi web installation. The generated webhook\nsecret must be specified in the `GITHUB_WEBHOOK_SECRET` setting in your `settings.cfg`:\n\n**NOTE:** As of now, GitHub webhooks are not supported on a per-connection base.\nYou can only have one webhook active in zubbi.\n\n```ini\nGITHUB_WEBHOOK_SECRET = ''\n```\n\nZubbi web receives webhook events from GitHub, validates the secret and publishes\nrelevant events to the scraper via [ZMQ](https://pyzmq.readthedocs.io/en/latest/).\nThe Zubbi scraper on the other hand subscribes to the ZMQ socket and scrapes\nnecessary repositories whenever a event is received. In order to make this\ncommunication work, you need to specify the following parameters in your `settings.cfg`:\n\n```ini\n# Zubbi web (publish)\nZMQ_PUB_SOCKET_ADDRESS = 'tcp://*:5556'\n# Zubbi scraper (subscribe)\nZMQ_SUB_SOCKET_ADDRESS = 'tcp://localhost:5556'\n```\n\n### Gerrit\nIn contrary to GitHub, the Gerrit connection is based on\n[GitPython](https://gitpython.readthedocs.io/en/stable/) as the Gerrit REST API\ndoes not support all use cases. To use this connection, you have\nto provide the following parameters in your `settings.cfg`:\n\n```ini\nCONNECTIONS = {\n '': {\n 'provider': 'gerrit',\n 'url': '',\n # Only necessary if different from the git_remote_url\n 'web_url': '',\n # The web_type is necessary to build the correct URLs for Gerrit.\n # Currently supported types are 'cgit' (default) and 'gitweb'.\n 'web_type': 'cgit|gitweb',\n # Optional, if authentication is required\n 'user': '',\n 'password': '',\n },\n ...\n}\n```\n\n### Git\nThe Git connection is also based on\n[GitPython](https://gitpython.readthedocs.io/en/stable/) and can be used for Git\nrepositories that are not hosted on either GitHub or Gerrit. To use this connection,\nput the following in your `settings.cfg`:\n\n```ini\nCONNECTIONS = {\n '': {\n 'provider': 'git',\n 'url': '',\n # Optional, if authentication is required\n 'user': '',\n 'password': '=7.0.0)",
"pyyaml",
"pyjwt",
"pyzmq",
"cryptography",
"requests",
"flask",
"github3.py",
"zuul-sphinx",
"sphinx",
"jinja2",
"readme-renderer[md]",
"tabulate",
"gitpython"
],
"requires_python": ">=3.6",
"summary": "Index for finding jobs & roles used in a Zuul based CI system",
"version": "2.1.2"
},
"last_serial": 5588257,
"releases": {
"0.9.0": [
{
"comment_text": "",
"digests": {
"md5": "dc68cf2efd536504374aa6752240c671",
"sha256": "9ee55100bd05421c3166ce87b6c6483d18e599892945960b9f743162bd934ecf"
},
"downloads": -1,
"filename": "zubbi-0.9.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "dc68cf2efd536504374aa6752240c671",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.6",
"size": 1641633,
"upload_time": "2018-11-09T09:49:34",
"url": "https://files.pythonhosted.org/packages/bc/24/7448d62816b2192283fa73e37dc03694cb349031146b289cf3075cd9ab88/zubbi-0.9.0-py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "7d6f117a866b9ad290e3ef4da5550d8e",
"sha256": "fcd01df833cd56c9ab6d71d96465d2531f905bd3e5ef55e98decd0771bb79fe2"
},
"downloads": -1,
"filename": "zubbi-0.9.0.tar.gz",
"has_sig": false,
"md5_digest": "7d6f117a866b9ad290e3ef4da5550d8e",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.6",
"size": 1879323,
"upload_time": "2018-11-09T09:49:38",
"url": "https://files.pythonhosted.org/packages/09/a7/69527c5dde52a34d00f91c826235bba093c39c70c2185a32ce7965683c5a/zubbi-0.9.0.tar.gz"
}
],
"1.0.0": [
{
"comment_text": "",
"digests": {
"md5": "de59f53b6b1c31005a742ae2c491e73b",
"sha256": "097aaaa72c2e28526b1a082f37e1eb85472684fbd75cd4c1e0260d2090720642"
},
"downloads": -1,
"filename": "zubbi-1.0.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "de59f53b6b1c31005a742ae2c491e73b",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.6",
"size": 1646175,
"upload_time": "2019-01-09T08:54:17",
"url": "https://files.pythonhosted.org/packages/68/53/35b31b1877a26817f98096065a4729f0f4b3eb8846aaf1d258e71e005873/zubbi-1.0.0-py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "3f936469f1b8a8d71cdccd788571bdab",
"sha256": "e3efe5a0dbae6a0fc5a681cd1ee29ef8d53b65f3490b1f5fe7cdce25aba98ab7"
},
"downloads": -1,
"filename": "zubbi-1.0.0.tar.gz",
"has_sig": false,
"md5_digest": "3f936469f1b8a8d71cdccd788571bdab",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.6",
"size": 1892625,
"upload_time": "2019-01-09T08:54:21",
"url": "https://files.pythonhosted.org/packages/15/20/86c2665fd4998fe7e5c7b851f0c895a658f3662d3f6075fc49fbae5e0fba/zubbi-1.0.0.tar.gz"
}
],
"1.1.0": [
{
"comment_text": "",
"digests": {
"md5": "d10a098b8bd07e6ab14a582db52bed83",
"sha256": "177fb8a8667bc743e2539cba5223e6e60c01012fdf14b5d152b5d31c52bc3d55"
},
"downloads": -1,
"filename": "zubbi-1.1.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "d10a098b8bd07e6ab14a582db52bed83",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.6",
"size": 1647058,
"upload_time": "2019-01-21T11:41:09",
"url": "https://files.pythonhosted.org/packages/f5/7a/b852356d8cec7e6a7f6d8d90c329c4c0503a97b24943a8ab5e801bfb5e3d/zubbi-1.1.0-py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "0b735f65f0d1b6cfb104c6750eb5628c",
"sha256": "58b3c0d8e9f366974d850d468392a113daa658b982cdf418440501335586669c"
},
"downloads": -1,
"filename": "zubbi-1.1.0.tar.gz",
"has_sig": false,
"md5_digest": "0b735f65f0d1b6cfb104c6750eb5628c",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.6",
"size": 1898317,
"upload_time": "2019-01-21T11:41:13",
"url": "https://files.pythonhosted.org/packages/a1/04/d77aa486300db70e083074b48db36779c72dd13ba4477976322f36ac6d1c/zubbi-1.1.0.tar.gz"
}
],
"1.2.0": [
{
"comment_text": "",
"digests": {
"md5": "0eaa3e085aed282cd414ab8e84fc6afd",
"sha256": "371727f8ccdacb9d890a9a93e3c5211f189a381a6cef8981f574e1b241194e85"
},
"downloads": -1,
"filename": "zubbi-1.2.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "0eaa3e085aed282cd414ab8e84fc6afd",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.6",
"size": 1647198,
"upload_time": "2019-02-28T09:21:23",
"url": "https://files.pythonhosted.org/packages/9a/c7/9ddf86fa7c85f826a5ffdc7c72cde30d511c2122221229c34a9e6208b323/zubbi-1.2.0-py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "b1abb6dec701088fad50f32ff46a7fe2",
"sha256": "2861932b7ba84e35b3729c6a018a9a995f0392db78542d8b9002b860874aee17"
},
"downloads": -1,
"filename": "zubbi-1.2.0.tar.gz",
"has_sig": false,
"md5_digest": "b1abb6dec701088fad50f32ff46a7fe2",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.6",
"size": 1898692,
"upload_time": "2019-02-28T09:21:26",
"url": "https://files.pythonhosted.org/packages/8c/57/02f54501fab4a3d458828ba13aff9391b40446203fe2cd05fec6b0919c55/zubbi-1.2.0.tar.gz"
}
],
"1.3.0": [
{
"comment_text": "",
"digests": {
"md5": "60a76f102ce05cad60cc0c23da6dc7c6",
"sha256": "787743560c1c32e335f95c55a8bc557cd7de543e19b809bdb87db1036ac22c2b"
},
"downloads": -1,
"filename": "zubbi-1.3.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "60a76f102ce05cad60cc0c23da6dc7c6",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.6",
"size": 1647772,
"upload_time": "2019-03-19T09:22:53",
"url": "https://files.pythonhosted.org/packages/8e/bd/c438a3b5ad9060e8dd7c346dee6faba476a44cdb15404f5be9f6cca3886c/zubbi-1.3.0-py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "70d094237d86750996e921604e7f151f",
"sha256": "73b6890bfe79cc6fe571bd452de81090686d8b5c23b2936fb08153ed29faac04"
},
"downloads": -1,
"filename": "zubbi-1.3.0.tar.gz",
"has_sig": false,
"md5_digest": "70d094237d86750996e921604e7f151f",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.6",
"size": 1900096,
"upload_time": "2019-03-19T09:22:56",
"url": "https://files.pythonhosted.org/packages/67/19/b9f2b719367e37de452e5c8992ec754b97ebe72b1f1a33468cf87158dcd4/zubbi-1.3.0.tar.gz"
}
],
"2.0.0": [
{
"comment_text": "",
"digests": {
"md5": "3ce4dc6ed0ea1fdf7f2d0d44d5b15b40",
"sha256": "7323245b0892788a08ffa7b4ab25375994eb9aaf3699b056f8396545be2492a9"
},
"downloads": -1,
"filename": "zubbi-2.0.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "3ce4dc6ed0ea1fdf7f2d0d44d5b15b40",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.6",
"size": 1648002,
"upload_time": "2019-07-23T07:09:27",
"url": "https://files.pythonhosted.org/packages/8a/4f/2b1269769b698c4ca11895c04dd1426f6407b2ac89b20c53f7a9913324c2/zubbi-2.0.0-py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "8685e7b31234396d84d373ada7719efc",
"sha256": "6d5ea08cc7da186144400b9fefda3f55ad4e6a37474554e12ea3f5fe2f6c2a54"
},
"downloads": -1,
"filename": "zubbi-2.0.0.tar.gz",
"has_sig": false,
"md5_digest": "8685e7b31234396d84d373ada7719efc",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.6",
"size": 1903514,
"upload_time": "2019-07-23T07:09:31",
"url": "https://files.pythonhosted.org/packages/eb/6a/6dcd2b1a6d965471c88f862b04bc328d2b12b7dcaca1249db0d832d1562a/zubbi-2.0.0.tar.gz"
}
],
"2.1.1": [
{
"comment_text": "",
"digests": {
"md5": "8058fcea198850ef6aa825606dc51aca",
"sha256": "c68a19e342689f16dc7b6cf49769370ccbefdbc57edfdd438a76eb942fa4c7a2"
},
"downloads": -1,
"filename": "zubbi-2.1.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "8058fcea198850ef6aa825606dc51aca",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.6",
"size": 1648325,
"upload_time": "2019-07-25T08:52:25",
"url": "https://files.pythonhosted.org/packages/89/0e/93ee3f2e8a0bc5956bbebe10031e21c099229090dc8535db8b3cf9da22cd/zubbi-2.1.1-py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "6cbf40801624e358d0986d703eb6b955",
"sha256": "a436227255a4610475dbc2939910874ae07d1229b6c0d266c33464d58e057654"
},
"downloads": -1,
"filename": "zubbi-2.1.1.tar.gz",
"has_sig": false,
"md5_digest": "6cbf40801624e358d0986d703eb6b955",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.6",
"size": 1904953,
"upload_time": "2019-07-25T08:52:28",
"url": "https://files.pythonhosted.org/packages/15/e3/6e6ba506042fb2edfc8437bf1a8b4d0a542cf3e8735de54ef91042beb839/zubbi-2.1.1.tar.gz"
}
],
"2.1.2": [
{
"comment_text": "",
"digests": {
"md5": "bc092b9c1d6a4d1f6d3e646121aff155",
"sha256": "84ff3cf25914730da3421427e48e648f7ef88cd42f58dfca3ce972790b9ce4e9"
},
"downloads": -1,
"filename": "zubbi-2.1.2-py3-none-any.whl",
"has_sig": false,
"md5_digest": "bc092b9c1d6a4d1f6d3e646121aff155",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.6",
"size": 1648550,
"upload_time": "2019-07-26T10:10:54",
"url": "https://files.pythonhosted.org/packages/01/d5/4df872a2fce6d430ad5466fc790f256420d9c9aaab0210e87dcb16588af5/zubbi-2.1.2-py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "b8aebb38147dd0415c916ab17af00fdf",
"sha256": "329cd6bca516c5297175d7827bc03a321520ce063aacf9aa7da3168a32db6733"
},
"downloads": -1,
"filename": "zubbi-2.1.2.tar.gz",
"has_sig": false,
"md5_digest": "b8aebb38147dd0415c916ab17af00fdf",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.6",
"size": 1905609,
"upload_time": "2019-07-26T10:10:58",
"url": "https://files.pythonhosted.org/packages/e4/7d/0ea0d4a2acf8af6699a77ca8acdde83a18585cd4b06e480ed5f691b773f7/zubbi-2.1.2.tar.gz"
}
]
},
"urls": [
{
"comment_text": "",
"digests": {
"md5": "bc092b9c1d6a4d1f6d3e646121aff155",
"sha256": "84ff3cf25914730da3421427e48e648f7ef88cd42f58dfca3ce972790b9ce4e9"
},
"downloads": -1,
"filename": "zubbi-2.1.2-py3-none-any.whl",
"has_sig": false,
"md5_digest": "bc092b9c1d6a4d1f6d3e646121aff155",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.6",
"size": 1648550,
"upload_time": "2019-07-26T10:10:54",
"url": "https://files.pythonhosted.org/packages/01/d5/4df872a2fce6d430ad5466fc790f256420d9c9aaab0210e87dcb16588af5/zubbi-2.1.2-py3-none-any.whl"
},
{
"comment_text": "",
"digests": {
"md5": "b8aebb38147dd0415c916ab17af00fdf",
"sha256": "329cd6bca516c5297175d7827bc03a321520ce063aacf9aa7da3168a32db6733"
},
"downloads": -1,
"filename": "zubbi-2.1.2.tar.gz",
"has_sig": false,
"md5_digest": "b8aebb38147dd0415c916ab17af00fdf",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.6",
"size": 1905609,
"upload_time": "2019-07-26T10:10:58",
"url": "https://files.pythonhosted.org/packages/e4/7d/0ea0d4a2acf8af6699a77ca8acdde83a18585cd4b06e480ed5f691b773f7/zubbi-2.1.2.tar.gz"
}
]
}