{ "info": { "author": "Brendan Abolivier", "author_email": "babolivier@matrix.org", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: GNU General Public License v3 (GPLv3)", "Operating System :: OS Independent", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7" ], "description": "# Install Party\n\n![PyPI](https://img.shields.io/pypi/v/install-party?style=flat-square) ![PyPI - Python Version](https://img.shields.io/pypi/pyversions/install-party?style=flat-square) [![#install-party:abolivier.bzh on Matrix](https://img.shields.io/matrix/install-party:abolivier.bzh.svg?server_fqdn=matrix.org&logo=matrix&style=flat-square)](https://matrix.to/#/#install-party:abolivier.bzh)\n\nThis is a project that creates and manages ephemeral servers for install\nparties/workshops of [Matrix](https://matrix.org) homeservers.\n\n## Install and run\n\nInstall Party can be installed via `pip`:\n\n```bash\npip install install-party\n```\n\nThen it can be run with:\n\n```bash\npython -m install_party [mode] [arguments]\n```\n\nEvery mode can be run with the `-h` argument to display the list of\narguments it supports.\n\n## Creation mode\n\nThe creation mode (`create`) uses creates a new server by creating a\nnew instance (virtual/physical machine), attaching a domain to it, and\nruning a script that installs [Riot](https://about.riot.im/) and\n[Caddy](https://caddyserver.com/) on it, so that an attendee can log in\n(with SSH) with the configured username and password, install a new\nhomeserver, and directly use it with the Riot instance.\n\nThe instance name will be `{namespace}-{name}` and the domain name will\nbe `{name}.{namespace}.{zone}`, where:\n\n* `{namespace}` is a configured namespace (e.g. the event's name as a slug)\n* `{zone}` is a configured DNS zone (must be managed by the configured DNS provider)\n* `{name}` is the host's name (either provided, e.g. `install_party create -n/--name foo`, or a randomly generated 5-letter string)\n\nNote: currently, if attendees wish/need to use a homeserver's built-in\nACME support, they must set the post the ACME support listener is\nlistening to to `8888`.\n\nCreating multiple servers in the same run is possible by using the\ncommand-line argument `-N/--number x` where `x` is the number of servers\nto create. If one or more creation(s) failed, Install Party will not\nautomatically attempt to recreate them.\n\nThis mode also accepts the command-line argument\n`-s/--post-install-script` that points to a script to run after the\nserver's creation and its initial setup (i.e. after the installation of\nRiot and Caddy).\n\n## List mode\n\nThe list mode (`list`) prints a table listing the existing servers and\ndomains under the namespace and DNS zone configured in the configuration\nfile, along with their status.\n\nIf an instance has no domain attached, or if a domain isn't attached to\nan existing instance, they will be listed in separate tables (named\n`ORPHANED INSTANCES` and `ORPHANED DOMAINS`). These additional tables\ncan be hidden by using the command-line flag `-H/--hide-orphans`.\n\nThis mode also accepts the command-line argument `-v/--verbose` to print\nout additional logging.\n\n## Deletion mode\n\nThe deletion mode (`delete`) deletes one or more instance(s) along with\nthe associated domain name(s). The instances to delete are defined by\nthe command-line arguments. This mode currently accepts the following\narguments:\n\n* `-a/--all`: delete all instances and domains in the configured namespace. Can't be used together with `-s/--server NAME`.\n* `-e/--exclude NAME`: exclude one or more server(s) from the deletion. Can only be used with `-a/--all`. Repeat this argument for every server you want to exclude from the deletion. `NAME` is the name of the server (without the namespace).\n* `-s/--server NAME`: only delete this or these server(s). Repeat this argument for every server you want to delete. `NAME` is the name of the server (without the namespace). Can't be used together with `-a/--all`.\n* `-d/--dry-run`: run the deletion in dry run mode, i.e. no deletion will actually happen but Install Party will act as if, so that the user can check if it's doing the right thing before performing the actual operation.\n\nOne of `-a/--all` or `-s/--server NAME` must be provided.\n\nFor example, deleting every server but the ones named `matrixtest1` and\n`matrixtest2` would look like this:\n\n```\ninstall_party delete --all --exclude matrixtest1 --exclude matrixtest2\n```\n\nOn the other hand, deleting only the servers named `matrixtest1` and\n`matrixtest2` would look like this:\n\n```\ninstall_party delete --server matrixtest1 --server matrixtest2\n```\n\nThis mode also accepts the command-line argument `-v/--verbose` to print\nout additional logging.\n\n## Configuration\n\nThe configuration is provided as a YAML configuration file. By default,\na file named `config.yaml` in the current directory will be used, but\nthis can be overridden by setting the environment variable\n`INSTALL_PARTY_CONFIG` to the path of the desired file.\n\nThe configuration file's content must follow the following structure.\nCurrently, all fields are mandatory.\n\n```yaml\n# General configuration that's not specific to a section.\ngeneral:\n # Namespace to use when creating/listing the instances and DNS records.\n namespace: my-super-event\n # The version of Riot to install on the hosts.\n riot_version: v1.4.2\n # Maximum number of seconds to seconds to spend on checking if the\n # server is online after its creation. If this duration is reached,\n # the check will be aborted and the creation will be considered a\n # failure. \n connectivity_check_timeout: 300\n\n# Configuration specific to the instances.\ninstances:\n # User the attendee will use when logging into the host with SSH.\n # Will be created if it doesn't exist on the system.\n user: superevent\n # Password the attendee will use when logging into the host with SSH.\n password: superevent2019\n # Instances provider to use. Must be a supported provider. See which\n # providers are supported in install_party/instances/providers (there\n # is a file for each supported provider).\n provider: myinstancesprovider\n # Arguments to provide to the instances provider's API client. See the\n # documentation below.\n args:\n arg1: value1\n arg2: value2\n\n# Configuration for connecting to the DNS provider and creating the DNS\n# record.\ndns:\n # DNS zone to create the DNS records on.\n zone: example.com\n # DNS provider to use. Must be a supported provider. See which\n # providers are supported in install_party/dns/providers (there is a\n # file for each supported provider).\n provider: mydnsprovider\n # Arguments to provide to the DNS provider's API client. See the\n # documentation below.\n args:\n arg1: value1\n arg2: value2\n```\n\n## Instances provider\n\nInstall Party will use the configured instances provider (if supported)\nto provision instances (i.e. virtual/physical machines) for the servers\nit creates, and also to list and delete instances.\n\n### Supported providers\n\nHere are the instances providers supported by Install Party, along with\ntheir name (i.e. what to write under `provider` in the configuration\nfile) and their API client's configuration arguments (i.e. what to write\nin `args` in the `instances` section of the configuration file).\n\n#### OpenStack\n\n**Provider name:** `openstack`\n\n**Configuration arguments:**\n\nYou first need to create an OpenStack account with your OpenStack\nprovider (or on your OpenStack cluster if you're self-hosting it).\n\nThen provide the authentication credentials along with the configuration\nof the instances to create:\n\n```yaml\n# Version of the OpenStack compute API. Currently, only versions 2 and\n# above are supported.\napi_version: 2\n# The URL of the authentication (keystone) endpoint.\nauth_url: https://auth.example.com/v2.0/\n# The project's tenant name.\ntenant_name: somesecret\n# The project's tenant identifier.\ntenant_id: somesecret\n# The project's region.\nregion_name: SOMEREGION\n# The account's username.\nusername: somesecret\n# The account's password.\npassword: somesecret\n# ID of the image to use to create the instances.\nimage_id: my_super_image\n# ID of the flavor to use to create the instances.\nflavor_id: my_super_flavor\n```\n\nSee https://docs.openstack.org/ for a full documentation of OpenStack's\nAPIs.\n\n### Adding support for an instances provider\n\nTo add support for an instances provider, simply add a Python code file\nin `install_party/instances/providers` which inherits from the\n`install_party.instances.instances_provider.InstancesProviderClient`\nclass and implements its methods. It must then expose this class in a\nvariable named `provider_client_class` (i.e. add\n`provider_class = MyProviderClient` at the end of the file).\n\nYou can then use this provider by providing the name of the Python file\n(without the `.py` extension) as the instances provider in the\nconfiguration file. The provided class will be instantiated with the\nconfigured arguments, as a `dict` containing the `args` section of the\n`instances` configuration.\n\n## DNS providers\n\nInstall Party will use the configured DNS provider (if supported) to\ncreate DNS records for the servers it creates, and also to list and\ndelete DNS records.\n\n### Supported providers\n\nHere are the DNS providers supported by Install Party, along with their\nname (i.e. what to write under `provider` in the configuration file) and\ntheir API client's configuration arguments (i.e. what to write in `args`\nin the `dns` section of the configuration file).\n\n#### OVH\n\n**Provider name:** `ovh`\n\n**Configuration arguments:**\n\nYou first need to create an app on the OVH library to use this provider,\nsee https://docs.ovh.com/gb/en/customer/first-steps-with-ovh-api/ for\nmore information. If you want to limit the app's access, you can\nrestrict it to use only the methods `GET`, `POST` and `DELETE` on the\nroutes `/domain/zone/*`.\n\nThen provide your app's application key, application secret key and\nconsumer key (along with the API endpoint to use):\n\n```yaml\nendpoint: ovh-eu\napplication_key: SOME_KEY\napplication_secret: SOME_SECRET\nconsumer_key: SOME_KEY\n```\n\n### Adding support for a DNS provider\n\nTo add support for a DNS provider, simply add a Python code file in\n`install_party/dns/providers` which inherits from the\n`install_party.dns.dns_provider.DNSProviderClient` class and implements\nits methods. It must then expose this class in a variable named\n`provider_client_class` (i.e. add `provider_class = MyProviderClient` at\nthe end of the file).\n\nYou can then use this provider by providing the name of the Python file\n(without the `.py` extension) as the DNS provider in the configuration\nfile. The provided class will be instantiated with the configured\narguments, as a `dict` containing the `args` section of the `dns`\nconfiguration.\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/babolivier/install-party", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "install-party", "package_url": "https://pypi.org/project/install-party/", "platform": "", "project_url": "https://pypi.org/project/install-party/", "project_urls": { "Homepage": "https://github.com/babolivier/install-party" }, "release_url": "https://pypi.org/project/install-party/1.0.0/", "requires_dist": [ "ovh (==0.5.0)", "python-novaclient (==15.1.0)", "PyYAML (==5.1.2)", "requests (==2.22.0)", "tabulate (==0.8.5)" ], "requires_python": ">=3.6", "summary": "Instantiate and manage hosts for Matrix homeserver install parties", "version": "1.0.0", "yanked": false, "yanked_reason": null }, "last_serial": 6065094, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "002367fef08705264b32548ae171a21b", "sha256": "c19121fadc1fa31d48be39539cb6faa5bba35aeb34a3854b44aad6abaeb65411" }, "downloads": -1, "filename": "install_party-0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "002367fef08705264b32548ae171a21b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 17935, "upload_time": "2019-10-15T14:47:15", "upload_time_iso_8601": "2019-10-15T14:47:15.091677Z", "url": "https://files.pythonhosted.org/packages/5c/4e/35d59be476ff3a3944b196f4e41f86c9650f3f0e42e45eff35bd950025fd/install_party-0.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "989cc23524e732d04e8f672815865346", "sha256": "417a3c77dc1e783e53d74f5e57e64406c47591d633da3f135b3ae1c4906a3d76" }, "downloads": -1, "filename": "install-party-0.1.tar.gz", "has_sig": false, "md5_digest": "989cc23524e732d04e8f672815865346", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 5801, "upload_time": "2019-10-15T14:47:19", "upload_time_iso_8601": "2019-10-15T14:47:19.125552Z", "url": "https://files.pythonhosted.org/packages/a2/60/91452d6b3492143ed45d99032a09faf8a2589ac6a4152296d29f6c60df1a/install-party-0.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "fb605b9e691a54423ec391246edc1b72", "sha256": "c485d980735d38dd329ef4d5428a31c6f5acc5ab33259b1d17ce0f53437e70de" }, "downloads": -1, "filename": "install_party-0.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "fb605b9e691a54423ec391246edc1b72", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 17880, "upload_time": "2019-10-15T14:54:24", "upload_time_iso_8601": "2019-10-15T14:54:24.550778Z", "url": "https://files.pythonhosted.org/packages/43/f7/8eaa5731bd63e154be8c21f01294d817e25f108ac937795aab4d7695c467/install_party-0.1.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "11261cff11ac95ac146f731a37f65be5", "sha256": "6a31ad7ee4df2487341e772324338958c8f4b99fe723b7c6aadfaadd11fd06bd" }, "downloads": -1, "filename": "install-party-0.1.1.tar.gz", "has_sig": false, "md5_digest": "11261cff11ac95ac146f731a37f65be5", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 5684, "upload_time": "2019-10-15T14:54:28", "upload_time_iso_8601": "2019-10-15T14:54:28.034880Z", "url": "https://files.pythonhosted.org/packages/88/1f/b0df88c679949a89052bdd9c013b07b3667a93a4f21bd1e81d533beb2ec6/install-party-0.1.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "6f6c12d868780863c04e4d058dd4db16", "sha256": "f8f30254ec612c043546c6b288ca65f98c71f0f702d1480649d45705cb2c9239" }, "downloads": -1, "filename": "install_party-0.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "6f6c12d868780863c04e4d058dd4db16", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 18735, "upload_time": "2019-10-15T15:07:02", "upload_time_iso_8601": "2019-10-15T15:07:02.958912Z", "url": "https://files.pythonhosted.org/packages/65/1f/9d1d3a6a386f216dee86c2a8f0f26ff697d749d2f882f1a1a417b3bd83d1/install_party-0.1.2-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "26bded2fbb13337678b1c49b64af820b", "sha256": "7657b929e67186e55e4656cc787b823033890e4393387ebf2ac2fe80c2cdce84" }, "downloads": -1, "filename": "install-party-0.1.2.tar.gz", "has_sig": false, "md5_digest": "26bded2fbb13337678b1c49b64af820b", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 5733, "upload_time": "2019-10-15T15:07:14", "upload_time_iso_8601": "2019-10-15T15:07:14.478369Z", "url": "https://files.pythonhosted.org/packages/46/25/aaf03c3266d71917a7c1e5f4856ce8f308450983b9abea606a2dce70fc69/install-party-0.1.2.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "a746e7157adaf0c169d8f53fbe71aaf9", "sha256": "71ab4bb32be171d86ce7f6f7797fcbf825ae356a87e98c5a36e7442b026bbbe0" }, "downloads": -1, "filename": "install_party-0.1.3-py3-none-any.whl", "has_sig": false, "md5_digest": "a746e7157adaf0c169d8f53fbe71aaf9", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 18721, "upload_time": "2019-10-15T15:14:16", "upload_time_iso_8601": "2019-10-15T15:14:16.598778Z", "url": "https://files.pythonhosted.org/packages/e6/3c/2ce28dbed32503057bd066dce98c7b640c7afb3ee7f8628bd732c1eec6d8/install_party-0.1.3-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "5048cdf14254375b8eec0c358f70807b", "sha256": "330a8069cfd48f68b22a245cc8eb79e7bd9f4db3965704e762544894e11355f7" }, "downloads": -1, "filename": "install-party-0.1.3.tar.gz", "has_sig": false, "md5_digest": "5048cdf14254375b8eec0c358f70807b", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 5730, "upload_time": "2019-10-15T15:14:27", "upload_time_iso_8601": "2019-10-15T15:14:27.170785Z", "url": "https://files.pythonhosted.org/packages/57/87/2434693580c1227ce73d763e096ea9aaa3d423caab5b6ebed9cca63ebe32/install-party-0.1.3.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "0e1f326cfdf45f2db0aafcb4e4d05c55", "sha256": "faeb72c843b4c097ab52d60795fda03930403d2622f21bc9c56e0111dc2c662a" }, "downloads": -1, "filename": "install_party-0.1.4-py3-none-any.whl", "has_sig": false, "md5_digest": "0e1f326cfdf45f2db0aafcb4e4d05c55", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 18723, "upload_time": "2019-10-15T15:16:40", "upload_time_iso_8601": "2019-10-15T15:16:40.834783Z", "url": "https://files.pythonhosted.org/packages/f4/95/00e9f53ea5eee875da0581cd71d8f3be4a881ed9531f65bb701e1dd48b4c/install_party-0.1.4-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "039d8d42e2fc2f8f8cbfc4f3800c7fd6", "sha256": "6e92108dd9b81de04ce7892617b27a250a352085e380ba8a48a541f57ce0b73e" }, "downloads": -1, "filename": "install-party-0.1.4.tar.gz", "has_sig": false, "md5_digest": "039d8d42e2fc2f8f8cbfc4f3800c7fd6", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 5730, "upload_time": "2019-10-15T15:16:58", "upload_time_iso_8601": "2019-10-15T15:16:58.990509Z", "url": "https://files.pythonhosted.org/packages/2d/3d/c69e14bfb23bbe182eb93682be462d1dc6a0e304dc78ef7428e29deef30a/install-party-0.1.4.tar.gz", "yanked": false, "yanked_reason": null } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "10f64e313027afd6127c0aa5fe9dbde0", "sha256": "9618ad28ec04409c27d769cb715669f49e3aeb200d089ddd2f65097725b4e1e3" }, "downloads": -1, "filename": "install_party-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "10f64e313027afd6127c0aa5fe9dbde0", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 22409, "upload_time": "2019-10-17T16:41:54", "upload_time_iso_8601": "2019-10-17T16:41:54.684803Z", "url": "https://files.pythonhosted.org/packages/2b/89/b72cee1195dcf0d924656eff5f169ab137d4759f962876aa00d84bda65de/install_party-0.2.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "8e352b0472f2102ae0ac04ed6365b9aa", "sha256": "6cc5cf65a615b5e76de044cde8659e4064affd009c88198a2d299d4a709ec76b" }, "downloads": -1, "filename": "install-party-0.2.0.tar.gz", "has_sig": false, "md5_digest": "8e352b0472f2102ae0ac04ed6365b9aa", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 8578, "upload_time": "2019-10-17T16:41:58", "upload_time_iso_8601": "2019-10-17T16:41:58.390788Z", "url": "https://files.pythonhosted.org/packages/55/08/6f9ed302dcf7bebbea3082318f12781d0edc4b7ab991ef70bdd7bcff2d48/install-party-0.2.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "9426fcb1676e371fce89bb86ad4b6ffb", "sha256": "0dae222de9d006d9e8f7539e9019a99044bbe043fdd117ceff925f6123a5c325" }, "downloads": -1, "filename": "install_party-0.2.1-py3-none-any.whl", "has_sig": false, "md5_digest": "9426fcb1676e371fce89bb86ad4b6ffb", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 22497, "upload_time": "2019-10-17T16:53:48", "upload_time_iso_8601": "2019-10-17T16:53:48.533664Z", "url": "https://files.pythonhosted.org/packages/17/0f/5d53f88208e305a1a80e42dc2f50e92f6dfab790d713f97c4af00444597c/install_party-0.2.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "f5e89275b607ec6b93f2f7ac9461b175", "sha256": "d30379b9d5fd691fab2ef2f86e526a6a498c72063769851bc7550c2352c04392" }, "downloads": -1, "filename": "install-party-0.2.1.tar.gz", "has_sig": false, "md5_digest": "f5e89275b607ec6b93f2f7ac9461b175", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 8757, "upload_time": "2019-10-17T16:53:50", "upload_time_iso_8601": "2019-10-17T16:53:50.170781Z", "url": "https://files.pythonhosted.org/packages/a6/33/0d0ee3fd13d08dc85f83c355bd51577811ad4d1e7606814f01df562aa8d7/install-party-0.2.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "990e6ee70360d1fa6131bb03ab217a4e", "sha256": "159ccade947db0780a2279c5e3025632e0d03513fe4ff1af70b32a0112c7e0ef" }, "downloads": -1, "filename": "install_party-0.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "990e6ee70360d1fa6131bb03ab217a4e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 25781, "upload_time": "2019-10-21T22:05:49", "upload_time_iso_8601": "2019-10-21T22:05:49.651150Z", "url": "https://files.pythonhosted.org/packages/89/40/cedbc3900cecd729128c56084b96c3e28c5c9f77e0b21be294733493d391/install_party-0.3.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "5a196d40ee6d000511edbe23b374d429", "sha256": "1f0a596888a1b05c3d709397fa525837ef4b8b4e4e7a9e08e0c455d04fc2e7b7" }, "downloads": -1, "filename": "install-party-0.3.0.tar.gz", "has_sig": false, "md5_digest": "5a196d40ee6d000511edbe23b374d429", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 12538, "upload_time": "2019-10-21T22:05:51", "upload_time_iso_8601": "2019-10-21T22:05:51.230591Z", "url": "https://files.pythonhosted.org/packages/dd/e0/00e2c4724c83c93c23a4022d8a87aaadb0e555068bd766d7f8e91a386f28/install-party-0.3.0.tar.gz", "yanked": false, "yanked_reason": null } ], "1.0.0": [ { "comment_text": "", "digests": { "md5": "4bbc9dcc6377a14093281d85cf266815", "sha256": "2e1f5527d1e8fce44e8158f07a9e1724e0adee63c735fd96fc402f4c0187546a" }, "downloads": -1, "filename": "install_party-1.0.0-py3-none-any.whl", "has_sig": false, "md5_digest": "4bbc9dcc6377a14093281d85cf266815", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 33575, "upload_time": "2019-11-01T16:57:46", "upload_time_iso_8601": "2019-11-01T16:57:46.687670Z", "url": "https://files.pythonhosted.org/packages/e0/7f/0d3c53096dcb07730e896fa7741a7a6c4cb6a74da7dc53e7ec43b496d5bd/install_party-1.0.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "3ef434b0854d42dc3525cb18854dceb5", "sha256": "38ecf70fc4cd2632ec480e05e4744fa2e05feab6c7c3c9efe6de5f74ee4b948d" }, "downloads": -1, "filename": "install-party-1.0.0.tar.gz", "has_sig": false, "md5_digest": "3ef434b0854d42dc3525cb18854dceb5", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 19532, "upload_time": "2019-11-01T16:57:48", "upload_time_iso_8601": "2019-11-01T16:57:48.198244Z", "url": "https://files.pythonhosted.org/packages/fd/75/c6d5ea751a1ac2146036f2fb4478ac43aedd369676d87e84b1d320c522a6/install-party-1.0.0.tar.gz", "yanked": false, "yanked_reason": null } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "4bbc9dcc6377a14093281d85cf266815", "sha256": "2e1f5527d1e8fce44e8158f07a9e1724e0adee63c735fd96fc402f4c0187546a" }, "downloads": -1, "filename": "install_party-1.0.0-py3-none-any.whl", "has_sig": false, "md5_digest": "4bbc9dcc6377a14093281d85cf266815", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6", "size": 33575, "upload_time": "2019-11-01T16:57:46", "upload_time_iso_8601": "2019-11-01T16:57:46.687670Z", "url": "https://files.pythonhosted.org/packages/e0/7f/0d3c53096dcb07730e896fa7741a7a6c4cb6a74da7dc53e7ec43b496d5bd/install_party-1.0.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "3ef434b0854d42dc3525cb18854dceb5", "sha256": "38ecf70fc4cd2632ec480e05e4744fa2e05feab6c7c3c9efe6de5f74ee4b948d" }, "downloads": -1, "filename": "install-party-1.0.0.tar.gz", "has_sig": false, "md5_digest": "3ef434b0854d42dc3525cb18854dceb5", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 19532, "upload_time": "2019-11-01T16:57:48", "upload_time_iso_8601": "2019-11-01T16:57:48.198244Z", "url": "https://files.pythonhosted.org/packages/fd/75/c6d5ea751a1ac2146036f2fb4478ac43aedd369676d87e84b1d320c522a6/install-party-1.0.0.tar.gz", "yanked": false, "yanked_reason": null } ], "vulnerabilities": [] }