{"id":32139316,"url":"https://github.com/feneric/doxypypy","last_synced_at":"2026-02-21T15:01:50.145Z","repository":{"id":8699002,"uuid":"10363686","full_name":"Feneric/doxypypy","owner":"Feneric","description":"A more Pythonic version of doxypy, a Doxygen filter for Python.","archived":false,"fork":false,"pushed_at":"2024-01-24T07:37:28.000Z","size":217,"stargazers_count":154,"open_issues_count":52,"forks_count":48,"subscribers_count":8,"default_branch":"master","last_synced_at":"2026-02-13T21:58:48.491Z","etag":null,"topics":["documentation","doxygen","python"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Feneric.png","metadata":{"files":{"readme":"README.rst","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2013-05-29T16:08:25.000Z","updated_at":"2025-08-28T22:38:04.000Z","dependencies_parsed_at":"2024-06-18T18:27:27.546Z","dependency_job_id":"216a7c38-08e9-460a-aabc-e69fe06e11e9","html_url":"https://github.com/Feneric/doxypypy","commit_stats":{"total_commits":131,"total_committers":17,"mean_commits":7.705882352941177,"dds":"0.41984732824427484","last_synced_commit":"364981da1cab240595db853d190a0c7598ba2497"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Feneric/doxypypy","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Feneric%2Fdoxypypy","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Feneric%2Fdoxypypy/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Feneric%2Fdoxypypy/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Feneric%2Fdoxypypy/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Feneric","download_url":"https://codeload.github.com/Feneric/doxypypy/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Feneric%2Fdoxypypy/sbom","scorecard":{"id":49814,"data":{"date":"2025-08-11","repo":{"name":"github.com/Feneric/doxypypy","commit":"364981da1cab240595db853d190a0c7598ba2497"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.8,"checks":[{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Code-Review","score":6,"reason":"Found 6/10 approved changesets -- score normalized to 6","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE.txt:0","Info: FSF or OSI recognized license: GNU General Public License v2.0: LICENSE.txt:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 26 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-14T23:30:38.057Z","repository_id":8699002,"created_at":"2025-08-14T23:30:38.057Z","updated_at":"2025-08-14T23:30:38.057Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29684071,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-21T14:31:22.911Z","status":"ssl_error","status_checked_at":"2026-02-21T14:31:22.570Z","response_time":107,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["documentation","doxygen","python"],"created_at":"2025-10-21T05:38:10.858Z","updated_at":"2026-02-21T15:01:50.139Z","avatar_url":"https://github.com/Feneric.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"doxypypy\n========\n\n*A more Pythonic version of doxypy, a Doxygen filter for Python.*\n\nIntent\n------\n\nFor now Doxygen_ has limited support for Python.  It recognizes Python comments,\nbut otherwise treats the language as being more or less like Java.  It doesn't\nunderstand basic Python syntax constructs like docstrings, keyword arguments,\ngenerators, nested functions, decorators, or lambda expressions.  It likewise\ndoesn't understand conventional constructs like doctests or ZOPE-style\ninterfaces.  It does however support inline filters that can be used to make\ninput source code a little more like what it's expecting.\n\nThe excellent doxypy_ makes it possible to embed Doxygen commands in Python\ndocstrings, and have those docstrings converted to Doxygen-recognized comments\non the fly per Doxygen's regular input filtering process.  It however does not\naddress any of the other previously mentioned areas of difficulty.\n\nThis project started off as a fork of doxypy but quickly became quite distinct.\nIt shares little (if any) of the same code at this point (but maintains the\noriginal license just in case).  It is meant to support all the same command\nline options as doxypy, but handle additional Python syntax beyond docstrings.\n\nAdditional Syntax Supported\n---------------------------\n\nPython can have functions and classes within both functions and classes.\nDoxygen best understands this concept via its notion of namespaces.  This filter\nthus can supply Doxygen tags marking namespaces on every function and class.\nThis addresses the issue of Doxygen merging inner functions' documentation with\nthe documentation of the parent.\n\nPython class members whose names begin with a double-underscore are mangled\nand kept private by the language.  Doxygen does not understand this natively\nyet, so this filter additionally provides Doxygen tags to label such variables\nas private.\n\nPython frequently embeds doctests within docstrings.  This filter makes it\ntrivial to mark off such sections of the docstring so they get displayed as\ncode.\n\nZOPE-style interfaces overload class definitions to be interface definitions,\nuse embedded variable assignments to identify attributes, and use specific\nfunction calls to indicate interface adherence.  Furthermore, they frequently\ndon't have any code beyond their docstrings, so naively removing docstrings\nwould result in broken Python.  This filter has basic understanding of these\ninterfaces and treats them accordingly, supplying Doxygen tags as appropriate.\n\nFundamentally Python docstrings are meant for humans and not machines, and ought\nnot to have special mark-up beyond conventional structured text.  This filter\nheuristically examines Python docstrings, and ones like the sample for complex\nin `PEP 257`_ or that generally follow the stricter `Google Python Style Guide`_\nwill get appropriate Doxygen tags automatically added.\n\nHow It Works\n------------\n\nThis project takes a radically different approach than doxypy.  Rather than use\nregular expressions tied to a state machine to figure out syntax, Python's own\nAbstract Syntax Tree module is used to extract items of interest.  If the\n`autobrief` option is enabled, docstrings are parsed via a set of regular\nexpressions and a producer / consumer pair of coroutines.\n\nExample\n-------\n\nThis filter will correctly process code like the following working (albeit\ncontrived) example:\n\n.. code-block:: python\n\n    def myfunction(arg1, arg2, kwarg='whatever.'):\n        \"\"\"\n        Does nothing more than demonstrate syntax.\n\n        This is an example of how a Pythonic human-readable docstring can\n        get parsed by doxypypy and marked up with Doxygen commands as a\n        regular input filter to Doxygen.\n\n        Args:\n            arg1:   A positional argument.\n            arg2:   Another positional argument.\n\n        Kwargs:\n            kwarg:  A keyword argument.\n\n        Returns:\n            A string holding the result.\n\n        Raises:\n            ZeroDivisionError, AssertionError, \u0026 ValueError.\n\n        Examples:\n            \u003e\u003e\u003e myfunction(2, 3)\n            '5 - 0, whatever.'\n            \u003e\u003e\u003e myfunction(5, 0, 'oops.')\n            Traceback (most recent call last):\n                ...\n            ZeroDivisionError: integer division or modulo by zero\n            \u003e\u003e\u003e myfunction(4, 1, 'got it.')\n            '5 - 4, got it.'\n            \u003e\u003e\u003e myfunction(23.5, 23, 'oh well.')\n            Traceback (most recent call last):\n                ...\n            AssertionError\n            \u003e\u003e\u003e myfunction(5, 50, 'too big.')\n            Traceback (most recent call last):\n                ...\n            ValueError\n        \"\"\"\n        assert isinstance(arg1, int)\n        if arg2 \u003e 23:\n            raise ValueError\n        return '{0} - {1}, {2}'.format(arg1 + arg2, arg1 / arg2, kwarg)\n\nThere are a few points to note:\n\n1.  No special tags are used.  Best practice human-readable section headers\nare enough.\n\n2.  Some flexibility is allowed.  Most common names for sections are accepted,\nand items and descriptions may be separated by either colons or dashes.\n\n3.  The brief must be the first item and be no longer than one\nline.\n\n4.  Everything thrown into an examples section will be treated as code, so it's\nthe perfect place for doctests.\n\nAdditional more comprehensive examples can be found in the test area.\n\nInstalling doxypypy\n-------------------\n\nOne can use either :code:`pip` or :code:`easy_install` for installation.\nRunning either:\n\n.. code-block:: shell\n\n    pip install doxypypy\n\nor:\n\n.. code-block:: shell\n\n    easy_install doxypypy\n\nwith administrator privileges should do the trick.\n\nMany Linux distributions have packages for doxypypy, so if you are\nusing Linux you may find it more convenient to use :code:`aptitude`,\n:code:`apt`, :code:`apt-get`, :code:`yum`, :code:`dnf`, etc. as\nappropriate for your system to install the version tested by the\ndistribution maintainer. It will often be available as separate\npackages for both Python 3 and Python 2.\n\n\nPreviewing doxypypy Output\n--------------------------\n\nAfter successful installation, doxypypy can be run from the command line to\npreview the filtered results with:\n\n.. code-block:: shell\n\n    doxypypy -a -c file.py\n\nTypically you'll want to redirect output to a file for viewing in a text editor:\n\n.. code-block:: shell\n\n    doxypypy -a -c file.py \u003e file.py.out\n\nInvoking doxypypy from Doxygen\n------------------------------\n\nTo make Doxygen run your Python code through doxypypy, set the FILTER\\_PATTERNS\ntag in your Doxyfile as follows:\n\n.. code-block:: shell\n\n    FILTER_PATTERNS        = *.py=py_filter\n\n`py_filter` must be available in your path as a shell script (or Windows batch\nfile).  If you wish to run `py_filter` in a particular directory you can include\nthe full or relative path.\n\nFor Unix-like operating systems, `py_filter` should like something like this:\n\n.. code-block:: shell\n\n    #!/bin/bash\n    doxypypy -a -c $1\n\nIn Windows, the batch file should be named `py_filter.bat`, and need only\ncontain the one line:\n\n.. code-block:: shell\n\n    doxypypy -a -c %1\n\nRunning Doxygen as usual should now run all Python code through doxypypy.  Be\nsure to carefully browse the Doxygen output the first time to make sure that\nDoxygen properly found and executed doxypypy.\n\n.. _Doxygen: http://www.stack.nl/~dimitri/doxygen/\n.. _doxypy: https://github.com/Feneric/doxypy\n.. _PEP 257: http://www.python.org/dev/peps/pep-0257/\n.. _Google Python Style Guide: https://google.github.io/styleguide/pyguide.html?showone=Comments#Comments\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffeneric%2Fdoxypypy","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffeneric%2Fdoxypypy","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffeneric%2Fdoxypypy/lists"}