{ "info": { "author": "Mark Vartanyan", "author_email": "kolypto@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "Natural Language :: English", "Operating System :: OS Independent", "Programming Language :: Python :: 3", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "[![Build Status](https://api.travis-ci.org/kolypto/py-exdoc.png?branch=master)](https://travis-ci.org/kolypto/py-exdoc)\n[![Pythons](https://img.shields.io/badge/python-3.5%E2%80%933.7-blue.svg)](.travis.yml)\n\nExDoc\n=====\n\nDocumentation extractor.\n\nExtracts pieces of documentation from your code to build a document which can be fed to template processors.\n\nOutput can be in JSON, YAML, whatever.\nUse any command-line templating engine, like [j2cli](https://github.com/kolypto/j2cli), to render templates from it.\n\nIt does not do any automatic background magic: it just offers helpers which allows you to extract the necessary pieces.\n\nCurrently supports parsing the following documentation formats:\n\n* [Sphinx (reST)](http://sphinx-doc.org/)\n* [Google](https://github.com/google/styleguide/blob/gh-pages/pyguide.md#38-comments-and-docstrings)\n\n\nCollectors\n==========\n\nExDoc is just a set of helper functions that collects information into dictionaries.\n\nPython\n------\n\nHelpers for Python objects\n\n### doc(obj, of_class=None)\nGet parsed documentation for an object as a dict.\n\nThis includes arguments spec, as well as the parsed data from the docstring.\n\n```python\nfrom exdoc import doc\n```\n\nThe `doc()` function simply fetches documentation for an object, which can be\n\n* Module\n* Class\n* Function or method\n* Property\n\nThe resulting dictionary includes argument specification, as well as parsed docstring:\n\n```python\ndef f(a, b=1, *args):\n ''' Simple function\n\n : param a: First\n : type a: int\n : param b: Second\n : type b: int\n : param args: More numbers\n : returns: nothing interesting\n : rtype: bool\n : raises ValueError: hopeless condition\n '''\n\nfrom exdoc import doc\n\ndoc(f) # ->\n{\n 'module': '__main__',\n 'name': 'f',\n 'qualname': 'f', # qualified name: e.g. .\n 'signature': 'f(a, b=1, *args)',\n 'qsignature': 'f(a, b=1, *args)', # qualified signature\n 'doc': 'Simple function',\n 'clsdoc': '', # doc from the class (used for constructors)\n # Exceptions\n 'exc': [\n {'doc': 'hopeless condition', 'name': 'ValueError'}\n ],\n # Return value\n 'ret': {'doc': 'nothing interesting', 'type': 'bool'},\n # Arguments\n 'args': [\n {'doc': 'First', 'name': 'a', 'type': 'int'},\n {'default': 1, 'doc': 'Second', 'name': 'b', 'type': 'int'},\n {'doc': 'More numbers', 'name': '*args', 'type': None}\n ],\n}\n```\n\nNote: in Python 3, when documenting a method of a class, pass the class to the `doc()` function as the second argument:\n\n```python\ndoc(cls.method, cls)\n```\n\nThis is necessary because in Python3 methods are not bound like they used to. Now, they are just functions.\n\n\n### getmembers(obj, *predicates)\n\nReturn all the members of an object as a list of `(key, value)` tuples, sorted by name.\n\nThe optional list of predicates can be used to filter the members.\n\nThe default predicate drops members whose name starts with '_'. To disable it, pass `None` as the first predicate.\n\n\n### subclasses(cls, leaves=False)\n\nList all subclasses of the given class, including itself.\n\nIf `leaves=True`, only returns classes which have no subclasses themselves.\n\n\n\nSqlAlchemy\n----------\n\nDocumenting SqlAlchemy models.\n\n```python\nfrom exdoc.sa import doc\n\ndoc(User) # ->\n{\n 'name': 'User',\n # List of tables the model uses\n 'table': ('users',),\n 'doc': 'User account',\n # PK: tuple[str]\n 'primary': ('uid',),\n # Unique keys\n 'unique': (\n # tuple[str]\n ('login',),\n ),\n # Foreign keys\n 'foreign': (\n {'key': 'uid', 'target': 'users.uid', 'onupdate': None, 'ondelete': 'CASCADE'},\n ),\n # Columns\n 'columns': [\n {'key': 'uid', 'type': 'INTEGER NOT NULL', 'doc': ''},\n {'key': 'login', 'type': 'VARCHAR NULL', 'doc': 'Login'},\n {'key': 'creator_uid', 'type': 'INTEGER NULL', 'doc': 'Creator'},\n {'key': 'meta', 'type': 'JSON NULL', 'doc': ''},\n ],\n # Relationships\n 'relations': [\n {'key': 'creator', 'model': 'User',\n 'target': 'User(creator_uid=uid)', 'doc': ''},\n {'key': 'devices[]', 'model': 'Device',\n 'target': 'Device(uid)', 'doc': ''},\n {'key': 'created[]', 'model': 'User',\n 'target': 'User(uid=creator_uid)', 'doc': ''},\n ]\n}\n```\n\n\nBuilding\n========\n\nCreate a python file that collects the necessary information and prints json:\n\n```python\n#! /usr/bin/env python\nfrom exdoc import doc\nimport json\n\nfrom project import User\n\nprint json.dumps({\n 'user': doc(User),\n})\n```\n\nAnd then use its output:\n\n```console\n./collect.py | j2 --format=json README.md.j2\n```\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://github.com/kolypto/py-exdoc", "keywords": "documentation", "license": "BSD", "maintainer": "", "maintainer_email": "", "name": "exdoc", "package_url": "https://pypi.org/project/exdoc/", "platform": "any", "project_url": "https://pypi.org/project/exdoc/", "project_urls": { "Homepage": "https://github.com/kolypto/py-exdoc" }, "release_url": "https://pypi.org/project/exdoc/0.1.2/", "requires_dist": null, "requires_python": "", "summary": "Documentation extractor.", "version": "0.1.2" }, "last_serial": 5841841, "releases": { "0.0.1-0": [ { "comment_text": "built for Linux-3.13.0-32-generic-x86_64-with-glibc2.4", "digests": { "md5": "f8de218cdd551ab00cf43dbcf9704d9f", "sha256": "1a043333431f550402f9fad0555ec1bc3be3cc9628276065b3c9ca7f6f88221e" }, "downloads": -1, "filename": "exdoc-0.0.1-0.linux-x86_64.tar.gz", "has_sig": false, "md5_digest": "f8de218cdd551ab00cf43dbcf9704d9f", "packagetype": "bdist_dumb", "python_version": "any", "requires_python": null, "size": 14007, "upload_time": "2014-08-05T11:28:32", "url": "https://files.pythonhosted.org/packages/2a/0a/b576f66cf6caf7ba8bdd5a63af0c8fbef2616946f3003d94e1dfe6daf9cd/exdoc-0.0.1-0.linux-x86_64.tar.gz" }, { "comment_text": "", "digests": { "md5": "411c5af2228030d78b069b26714569e4", "sha256": "3dc63b7faac8b23976eb01b76dd672bcb5e903618108367f1341105157d2a658" }, "downloads": -1, "filename": "exdoc-0.0.1-0.tar.gz", "has_sig": false, "md5_digest": "411c5af2228030d78b069b26714569e4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9576, "upload_time": "2014-08-05T11:28:28", "url": "https://files.pythonhosted.org/packages/aa/c9/ec667df8cd446fd1b4a89879a91319fbe523c668b9e25ffa89c7414363e3/exdoc-0.0.1-0.tar.gz" } ], "0.0.2-0": [ { "comment_text": "", "digests": { "md5": "bc0cf8041ec131eb1380647386a1f058", "sha256": "0eb5cbcd1201108d990a601d0794a11ebbdac6e453bcc83592a0feeaa9b3b5f6" }, "downloads": -1, "filename": "exdoc-0.0.2_0-py2-none-any.whl", "has_sig": false, "md5_digest": "bc0cf8041ec131eb1380647386a1f058", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 12429, "upload_time": "2014-08-14T10:03:26", "url": "https://files.pythonhosted.org/packages/8d/9b/55ec074ac9fb7b4f2a446e12c446386d5f8492d8b38e9f89f41cbfb541d8/exdoc-0.0.2_0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "fc66ee527bd116a6b15063358b817c16", "sha256": "81a8fc9de5db996d9c067a57806a08ef247a96e8da61c4655f3f6cdfc22bd1d6" }, "downloads": -1, "filename": "exdoc-0.0.2-0.tar.gz", "has_sig": false, "md5_digest": "fc66ee527bd116a6b15063358b817c16", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9794, "upload_time": "2014-08-14T10:03:23", "url": "https://files.pythonhosted.org/packages/cf/6b/b626b61a72e712d554f29997b1b1a0d0909442c4b69bf7dcd4b7455978d7/exdoc-0.0.2-0.tar.gz" } ], "0.0.3-0": [ { "comment_text": "", "digests": { "md5": "f7be968c3d03387e348969796a9029b3", "sha256": "550af565c831a085c4c60c0bb2f2d45e423c58bfe09e794756c6f5c1ca3d5c44" }, "downloads": -1, "filename": "exdoc-0.0.3_0-py2-none-any.whl", "has_sig": false, "md5_digest": "f7be968c3d03387e348969796a9029b3", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 12493, "upload_time": "2014-08-14T16:45:56", "url": "https://files.pythonhosted.org/packages/f3/72/6e9e11a8f8efdef46ba88a63598c2479d6c6ce8f2fe31bf0e042c68a6d30/exdoc-0.0.3_0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a5e7d42f74a43944e19f28943b6b1f26", "sha256": "b234455ccf2b37b9b016f8e076fb68c73ddb4f041abaac141fa506a24d3c7926" }, "downloads": -1, "filename": "exdoc-0.0.3-0.tar.gz", "has_sig": false, "md5_digest": "a5e7d42f74a43944e19f28943b6b1f26", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9902, "upload_time": "2014-08-14T16:45:49", "url": "https://files.pythonhosted.org/packages/3e/d7/8b427659ff18f7e45c4c0255621a4054609deafcf723c776970160a4dd46/exdoc-0.0.3-0.tar.gz" } ], "0.0.3-1": [ { "comment_text": "", "digests": { "md5": "cc621b2f70c99e7e6fd564d43b564073", "sha256": "a93ff0ca8de09f4a5925bb4ee33b18a1f2172f8be64448476a90140eb8e260f9" }, "downloads": -1, "filename": "exdoc-0.0.3_1-py2-none-any.whl", "has_sig": false, "md5_digest": "cc621b2f70c99e7e6fd564d43b564073", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 12518, "upload_time": "2014-08-28T18:06:01", "url": "https://files.pythonhosted.org/packages/54/f3/bd6f05b2489d61e683053d98e1633520b0cd0fa2fd144ffa701f170c56a0/exdoc-0.0.3_1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "bd3797562cf3fed8d38c6e21ca86b6e8", "sha256": "b8ceed8b20fccf77bb934074b55067a2daeb6445ae73457a5a9c4410030f579b" }, "downloads": -1, "filename": "exdoc-0.0.3-1.tar.gz", "has_sig": false, "md5_digest": "bd3797562cf3fed8d38c6e21ca86b6e8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9915, "upload_time": "2014-08-28T18:05:57", "url": "https://files.pythonhosted.org/packages/33/6c/3c3afe88d0b9c6527ebbbd38ed95b4420959146a76626cd91dc9cf5a9a5c/exdoc-0.0.3-1.tar.gz" } ], "0.0.4-0": [ { "comment_text": "", "digests": { "md5": "655b505c2e4cc1fd1f25e3e0979a2090", "sha256": "7101bd3d0b6ada548968afa7c941d5b487bbfa0ea7a9691f33e571357efef8da" }, "downloads": -1, "filename": "exdoc-0.0.4_0-py2-none-any.whl", "has_sig": false, "md5_digest": "655b505c2e4cc1fd1f25e3e0979a2090", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 12515, "upload_time": "2014-09-02T15:55:38", "url": "https://files.pythonhosted.org/packages/2a/12/e356e278d1ca57760e214cb313c6a1cc93feb386741b640b4f4768c59a64/exdoc-0.0.4_0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "fe80a1db094486fd78bd27b484b9611a", "sha256": "0dba80acf78d70d32f513392db0c203cb0065a67eb18a58de750932958de973b" }, "downloads": -1, "filename": "exdoc-0.0.4-0.tar.gz", "has_sig": false, "md5_digest": "fe80a1db094486fd78bd27b484b9611a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9919, "upload_time": "2014-09-02T15:55:35", "url": "https://files.pythonhosted.org/packages/cd/e6/aa6511ff7102c08182d3e409efa31fc960f2c6dedd81dc97bbdaa68f81c7/exdoc-0.0.4-0.tar.gz" } ], "0.0.5-0": [ { "comment_text": "", "digests": { "md5": "232248dfda6327f1f4b925f5ea07f71a", "sha256": "e70eeeb789bbab1697c03229ca4d0b2a1fd471591d3bd372fec42cb939ef9abe" }, "downloads": -1, "filename": "exdoc-0.0.5_0-py2-none-any.whl", "has_sig": false, "md5_digest": "232248dfda6327f1f4b925f5ea07f71a", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 12615, "upload_time": "2014-10-07T23:03:57", "url": "https://files.pythonhosted.org/packages/68/e5/0f15d4cbda914961eb7966e248213b4ebae6a9bab179ce99e1fed57395e1/exdoc-0.0.5_0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6cb12ce1773658eee39df95c5e57ee4f", "sha256": "64b770d04a75ecee2cee8258c7de02db247e01d45548f9fea86fd0d045e0d8a1" }, "downloads": -1, "filename": "exdoc-0.0.5-0.tar.gz", "has_sig": false, "md5_digest": "6cb12ce1773658eee39df95c5e57ee4f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9949, "upload_time": "2014-10-07T23:03:54", "url": "https://files.pythonhosted.org/packages/86/83/e31936d9f1a83326b39914ee3a61b617c8502dad2ebea968dc5222222ca2/exdoc-0.0.5-0.tar.gz" } ], "0.0.6.post0": [ { "comment_text": "", "digests": { "md5": "48f64eee3547e51b9ba2d0b57714a215", "sha256": "17eb92c60752eb070650dc90d69e69dcbf9e8f7ab92e8171a45aa44938ea03a8" }, "downloads": -1, "filename": "exdoc-0.0.6.post0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "48f64eee3547e51b9ba2d0b57714a215", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 11577, "upload_time": "2019-01-03T22:49:55", "url": "https://files.pythonhosted.org/packages/6b/2f/1ddc8954a33024c0c7d4585ad3a39f691664a80ff7725db6b908e77eccf4/exdoc-0.0.6.post0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b04ceb7ded7097d872c6ca98205802e9", "sha256": "189b957cafdd9e1a3ad0e616c603ba2249cc53a8dbc9dffaac4fee98326e266e" }, "downloads": -1, "filename": "exdoc-0.0.6.post0.tar.gz", "has_sig": false, "md5_digest": "b04ceb7ded7097d872c6ca98205802e9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10448, "upload_time": "2019-01-03T22:49:56", "url": "https://files.pythonhosted.org/packages/35/2f/8c9c98ae33f6c3dd92cbe05415ff3913aacd061a47920cf45c14b2fe80b8/exdoc-0.0.6.post0.tar.gz" } ], "0.1.0": [ { "comment_text": "", "digests": { "md5": "f67f5c4b04efe54004a5d37640447f1f", "sha256": "f7c20cd772b9a047cb5e2cb361e00b2a82131af8e920c72c11268b0e05cf0c0e" }, "downloads": -1, "filename": "exdoc-0.1.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "f67f5c4b04efe54004a5d37640447f1f", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 13299, "upload_time": "2019-06-18T18:07:42", "url": "https://files.pythonhosted.org/packages/2d/57/1f8fc21286f9df33853262739469088b32a4a6af8de87ac1c95c72582d75/exdoc-0.1.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "403093890ddeaac6445823e3002afd80", "sha256": "bb58c9221644c451dbe4e3cdfe9eb99d91a4f7c18f91fd9090c54679a5226866" }, "downloads": -1, "filename": "exdoc-0.1.0.tar.gz", "has_sig": false, "md5_digest": "403093890ddeaac6445823e3002afd80", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12983, "upload_time": "2019-06-18T18:07:44", "url": "https://files.pythonhosted.org/packages/62/cf/1e65a6b63746705e16a67fd405bf54f5672f1fbd1b0e04506cbbcaf0a494/exdoc-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "e1a560c9e5f61b7d2a4fb34a238b71ce", "sha256": "54d198c6c9ef9383a002412970dcf100a666bf7e6216afaece2b6c50de79a88b" }, "downloads": -1, "filename": "exdoc-0.1.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "e1a560c9e5f61b7d2a4fb34a238b71ce", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 13619, "upload_time": "2019-07-16T13:03:52", "url": "https://files.pythonhosted.org/packages/c6/2d/d74d394dba87bcb6c942af7d979f20baa0998266df82959551b574e03e46/exdoc-0.1.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6b91881d23b90881b4095705acbcdebf", "sha256": "30e1bd3e953bb80c6808e8f75833b30f59a574df4f6e8047c89655d70a2387be" }, "downloads": -1, "filename": "exdoc-0.1.1.tar.gz", "has_sig": false, "md5_digest": "6b91881d23b90881b4095705acbcdebf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13613, "upload_time": "2019-07-16T13:03:54", "url": "https://files.pythonhosted.org/packages/11/06/25dd4c1a9c75472cf31a2c4e43ef1b9363e46f13ade5522bbb3a7b0a9e5a/exdoc-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "9fe693b5bb8811238b8d23f059070c37", "sha256": "1f08624f0cf1cd8b657804acfbf1e0396edb339584e4c5f8048cc9bc862e7b3d" }, "downloads": -1, "filename": "exdoc-0.1.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "9fe693b5bb8811238b8d23f059070c37", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 13774, "upload_time": "2019-09-17T13:51:52", "url": "https://files.pythonhosted.org/packages/94/4b/4e8e27090f2ce334af5fb5ac7d7162c3c6205c7b6f6f41482ae150dbc663/exdoc-0.1.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0ee8a47e02407a14e40cbd008a644a9c", "sha256": "68ba7028850a4610a854eae7e2bad5a57db7c7a4bc04a1e57ef400dcdfce85a6" }, "downloads": -1, "filename": "exdoc-0.1.2.tar.gz", "has_sig": false, "md5_digest": "0ee8a47e02407a14e40cbd008a644a9c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13743, "upload_time": "2019-09-17T13:51:54", "url": "https://files.pythonhosted.org/packages/1d/b4/d3e15a812b0f0c871b75a6f143778a58aedb053f3b739c3aa57889afe117/exdoc-0.1.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "9fe693b5bb8811238b8d23f059070c37", "sha256": "1f08624f0cf1cd8b657804acfbf1e0396edb339584e4c5f8048cc9bc862e7b3d" }, "downloads": -1, "filename": "exdoc-0.1.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "9fe693b5bb8811238b8d23f059070c37", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 13774, "upload_time": "2019-09-17T13:51:52", "url": "https://files.pythonhosted.org/packages/94/4b/4e8e27090f2ce334af5fb5ac7d7162c3c6205c7b6f6f41482ae150dbc663/exdoc-0.1.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0ee8a47e02407a14e40cbd008a644a9c", "sha256": "68ba7028850a4610a854eae7e2bad5a57db7c7a4bc04a1e57ef400dcdfce85a6" }, "downloads": -1, "filename": "exdoc-0.1.2.tar.gz", "has_sig": false, "md5_digest": "0ee8a47e02407a14e40cbd008a644a9c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13743, "upload_time": "2019-09-17T13:51:54", "url": "https://files.pythonhosted.org/packages/1d/b4/d3e15a812b0f0c871b75a6f143778a58aedb053f3b739c3aa57889afe117/exdoc-0.1.2.tar.gz" } ] }