{ "info": { "author": "Daniel Kahn Gillmor", "author_email": "dkg@fifthhorseman.net", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Environment :: Console", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 3", "Topic :: Security", "Topic :: Security :: Cryptography" ], "description": "The Stateless OpenPGP Command-Line Interface\n============================================\n\nThe [Stateless OpenPGP Command-Line\nInterface](https://datatracker.ietf.org/doc/draft-dkg-openpgp-stateless-cli/)\n(or `sop`) is a specification that encourages OpenPGP implementors\nto provide a common, relatively simple command-line API for purposes\nof object security.\n\nThis Python module helps implementers build such a CLI from any\nimplementation accessible to the Python interpreter.\n\nIt does *not* provide such an implementation itself -- this is just\nthe scaffolding for the command line, which should make it relatively\neasy to supply a handful of python functions as methods to a class.\n\nNote that if the user has `argcomplete` installed, they should also\nget tab completion in standard shells like `bash` basically for free.\n\nExample\n-------\n\nHere is an example of a minimal command-line tool that just implements\nthe `extract_cert()` interface, using (imaginary) module `foo` that has the\nappropriate\n\n```\n#!/usr/bin/python3\n# PYTHON_ARGCOMPLETE_OK\nimport sop\nimport foo\n\nclass FooSop(sop.StatelessOpenPGP):\n def __init__(self):\n super().__init__(prog='FooPGP', version='0.17')\n # overrides go here...\n def extract_cert(self, key:bytes, armor:bool=True, **kwargs:Namespace) -> bytes:\n self.raise_on_unknown_options(**kwargs)\n return foo.bytes_to_openpgp_key(key).get_certificate(armor=armor)\n\nif __name__ = \"__main__\":\n foo = FooSop()\n foo.dispatch()\n```\n\nModule Goals\n------------\n\n### Extensibility\n\nAn implementer who wants to extend `sop` in a simple way (e.g. adding\nan option to an existing subcommand, or adding a special option)\nshould be able to do so without breaking this interface.\n\n### Minimal dependencies\n\nThe aim is to only depend on modules from stdlib. We make an\nexception for optional modules like `argcomplete`, which can be\nskipped.\n\n### Type-checking\n\nAll the code in here should be well-annotated\n\n### Self-documenting\n\nImplementers should learn what they need to know from the docstrings,\nlike so:\n\n import sop\n help(sop)\n help(sop.StatelessOpenPGP)\n\n### Semantic Versioning\n\nThe major version number will only change when backward-incompatible\nchanges are made.\n\nAs long as the major version number is 0, the same holds true for the\nminor version number.\n\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://gitlab.com/dkg/python-sop", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "sop", "package_url": "https://pypi.org/project/sop/", "platform": null, "project_url": "https://pypi.org/project/sop/", "project_urls": { "Homepage": "https://gitlab.com/dkg/python-sop" }, "release_url": "https://pypi.org/project/sop/0.3.0/", "requires_dist": null, "requires_python": ">=3.7", "summary": "A framework for implementing the Stateless OpenPGP CLI", "version": "0.3.0", "yanked": false, "yanked_reason": null }, "last_serial": 13667394, "releases": { "0.1.1": [ { "comment_text": "", "digests": { "md5": "0d79d3fc16cdfc260801581464064ffc", "sha256": "54aad8cfc5aaabe55ca3d0acbc751cb2393ebf5ab8c379828ac75448be3c7c58" }, "downloads": -1, "filename": "sop-0.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "0d79d3fc16cdfc260801581464064ffc", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 11142, "upload_time": "2019-10-29T01:55:09", "upload_time_iso_8601": "2019-10-29T01:55:09.385217Z", "url": "https://files.pythonhosted.org/packages/07/fb/5855b6442bd97231dbd2f1a0497050a6be26616667b1ebea7526b44bd99f/sop-0.1.1-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "c56bc01c1a38288569303c220a7e588a", "sha256": "388d2e2774f1ea8d690df9af5f887d9318932b14736feb249235e7ef9521785c" }, "downloads": -1, "filename": "sop-0.1.1.tar.gz", "has_sig": false, "md5_digest": "c56bc01c1a38288569303c220a7e588a", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 10662, "upload_time": "2019-10-29T01:55:12", "upload_time_iso_8601": "2019-10-29T01:55:12.197262Z", "url": "https://files.pythonhosted.org/packages/97/bc/faec6d73a5c7505fd74e0ea8fe97c86695bf9fb2f8ea521018011951f5fd/sop-0.1.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "ff8eaa8b3429bf8b0413c320853a599e", "sha256": "acae935570cd653f9e23fd8370ffb0876916e10dd095b34243e77296ba97794a" }, "downloads": -1, "filename": "sop-0.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "ff8eaa8b3429bf8b0413c320853a599e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 11139, "upload_time": "2019-10-29T02:29:48", "upload_time_iso_8601": "2019-10-29T02:29:48.093589Z", "url": "https://files.pythonhosted.org/packages/f3/2a/cc43f93f45b8dc0013af102f8a6f63804f0f14b2f33e69d36a9d5cbd86dc/sop-0.1.2-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "f9c60b935bf134f6f0ec6385cf167399", "sha256": "c9ee39a9bb8432d21ed6f89c2f3eb48246a71280b46077821641e3fc77373918" }, "downloads": -1, "filename": "sop-0.1.2.tar.gz", "has_sig": true, "md5_digest": "f9c60b935bf134f6f0ec6385cf167399", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 10663, "upload_time": "2019-10-29T02:29:49", "upload_time_iso_8601": "2019-10-29T02:29:49.422781Z", "url": "https://files.pythonhosted.org/packages/99/e8/83e03ec217f3a166114cda9632fe7d3da727dec4517dea82d109dedf0d15/sop-0.1.2.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "4dcff2103f5a57b42710b363edad5c85", "sha256": "bd9656989ebefb4c52650d89bca7913e8ae22e327ca29541bdc9712a31ed3b35" }, "downloads": -1, "filename": "sop-0.1.3-py3-none-any.whl", "has_sig": false, "md5_digest": "4dcff2103f5a57b42710b363edad5c85", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 11145, "upload_time": "2019-10-29T03:32:53", "upload_time_iso_8601": "2019-10-29T03:32:53.902434Z", "url": "https://files.pythonhosted.org/packages/37/01/e21abec0d17d5d01ee5eb52e9d951af7d09afe265654d24762c64a45930e/sop-0.1.3-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "3f2e08bf9d1136660c53b413b38f8f61", "sha256": "4abebbc3c32dd0232f8952cd422620431683faa45b767f0ed959bcf8d4706c1d" }, "downloads": -1, "filename": "sop-0.1.3.tar.gz", "has_sig": true, "md5_digest": "3f2e08bf9d1136660c53b413b38f8f61", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 10673, "upload_time": "2019-10-29T03:32:55", "upload_time_iso_8601": "2019-10-29T03:32:55.190042Z", "url": "https://files.pythonhosted.org/packages/61/53/464a0e1e7652e8c0608392efa769d56bbb6e6d1e9b407cd7249d57198e06/sop-0.1.3.tar.gz", "yanked": false, "yanked_reason": null } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "f26ef7136d719f772d184ca7aa5041a0", "sha256": "6607983caa5123a435a0bde1874a9715f5c123e12dc31b0a2fea10c9ef3eddc1" }, "downloads": -1, "filename": "sop-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "f26ef7136d719f772d184ca7aa5041a0", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 11223, "upload_time": "2019-11-08T05:47:36", "upload_time_iso_8601": "2019-11-08T05:47:36.912564Z", "url": "https://files.pythonhosted.org/packages/03/7e/90691db9ce341b4a9951103a2392e1712e0c3091d0c27182eae56238a673/sop-0.2.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "a8044de705aaa3f80e624f00e4997b3c", "sha256": "cecb329153c0f4341ab8ddedaa7e34370cc0802eaf2cce29af0d1adbb4f4923e" }, "downloads": -1, "filename": "sop-0.2.0.tar.gz", "has_sig": true, "md5_digest": "a8044de705aaa3f80e624f00e4997b3c", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 10827, "upload_time": "2019-11-08T05:47:38", "upload_time_iso_8601": "2019-11-08T05:47:38.007233Z", "url": "https://files.pythonhosted.org/packages/89/cf/fe354fd503a87b0cd3c9f85e9712c07ce45f3ee3264cbf815571b8fd0642/sop-0.2.0.tar.gz", "yanked": false, "yanked_reason": null } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "4cddc47f94da953a45b02bee56d0914f", "sha256": "4f9a09fdde02dda91e0463e9abfd97ab9f9bc311c18d4fe237f9b4f7d8a03ae4" }, "downloads": -1, "filename": "sop-0.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "4cddc47f94da953a45b02bee56d0914f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 11673, "upload_time": "2022-04-29T17:15:05", "upload_time_iso_8601": "2022-04-29T17:15:05.358509Z", "url": "https://files.pythonhosted.org/packages/01/83/d2188ef7ac51804b348c537845726c3f5e1126f70a70e81ad6f117509bcb/sop-0.3.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "925d5ea1800780df1923c9f752cfbe4d", "sha256": "f9c33c8a2f77fbd9f58079d89d6479e7026a5c24517c84b5f893ec23e9998e6d" }, "downloads": -1, "filename": "sop-0.3.0.tar.gz", "has_sig": false, "md5_digest": "925d5ea1800780df1923c9f752cfbe4d", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 11564, "upload_time": "2022-04-29T17:15:06", "upload_time_iso_8601": "2022-04-29T17:15:06.754474Z", "url": "https://files.pythonhosted.org/packages/63/ce/c081692002d90de968010a3081c5162e98868488c7cd9ecabf1fbd4aac8f/sop-0.3.0.tar.gz", "yanked": false, "yanked_reason": null } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "4cddc47f94da953a45b02bee56d0914f", "sha256": "4f9a09fdde02dda91e0463e9abfd97ab9f9bc311c18d4fe237f9b4f7d8a03ae4" }, "downloads": -1, "filename": "sop-0.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "4cddc47f94da953a45b02bee56d0914f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7", "size": 11673, "upload_time": "2022-04-29T17:15:05", "upload_time_iso_8601": "2022-04-29T17:15:05.358509Z", "url": "https://files.pythonhosted.org/packages/01/83/d2188ef7ac51804b348c537845726c3f5e1126f70a70e81ad6f117509bcb/sop-0.3.0-py3-none-any.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "925d5ea1800780df1923c9f752cfbe4d", "sha256": "f9c33c8a2f77fbd9f58079d89d6479e7026a5c24517c84b5f893ec23e9998e6d" }, "downloads": -1, "filename": "sop-0.3.0.tar.gz", "has_sig": false, "md5_digest": "925d5ea1800780df1923c9f752cfbe4d", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 11564, "upload_time": "2022-04-29T17:15:06", "upload_time_iso_8601": "2022-04-29T17:15:06.754474Z", "url": "https://files.pythonhosted.org/packages/63/ce/c081692002d90de968010a3081c5162e98868488c7cd9ecabf1fbd4aac8f/sop-0.3.0.tar.gz", "yanked": false, "yanked_reason": null } ], "vulnerabilities": [] }