{"id":13688886,"url":"https://github.com/nedbat/dinghy","last_synced_at":"2025-04-05T21:07:06.178Z","repository":{"id":38011005,"uuid":"461329349","full_name":"nedbat/dinghy","owner":"nedbat","description":"A GitHub activity digest tool","archived":false,"fork":false,"pushed_at":"2024-01-27T11:31:08.000Z","size":231,"stargazers_count":185,"open_issues_count":8,"forks_count":11,"subscribers_count":7,"default_branch":"main","last_synced_at":"2024-10-14T14:45:40.283Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/nedbat.png","metadata":{"files":{"readme":"README.rst","changelog":"CHANGELOG.rst","contributing":null,"funding":".github/FUNDING.yml","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},"funding":{"github":"nedbat"}},"created_at":"2022-02-19T22:33:18.000Z","updated_at":"2024-09-14T18:54:22.000Z","dependencies_parsed_at":"2024-01-14T08:04:21.854Z","dependency_job_id":"812d7c87-80b6-4fd6-b0e5-ec10af87ac44","html_url":"https://github.com/nedbat/dinghy","commit_stats":{"total_commits":212,"total_committers":5,"mean_commits":42.4,"dds":"0.037735849056603765","last_synced_commit":"22ec834979da3e0a0d81001763e133d0de5af091"},"previous_names":[],"tags_count":33,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nedbat%2Fdinghy","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nedbat%2Fdinghy/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nedbat%2Fdinghy/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nedbat%2Fdinghy/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nedbat","download_url":"https://codeload.github.com/nedbat/dinghy/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246724801,"owners_count":20823544,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":[],"created_at":"2024-08-02T15:01:26.498Z","updated_at":"2025-04-05T21:07:06.172Z","avatar_url":"https://github.com/nedbat.png","language":"Python","readme":"######\nDinghy\n######\n\nDinghy, a GitHub activity digest tool.\n\n| |pypi-badge| |pyversions-badge| |license-badge|\n| |sponsor-badge| |bluesky-nedbat| |mastodon-nedbat|\n\n--------------------\n\nDinghy uses the GitHub GraphQL API to find recent activity on releases, issues\nand pull requests, and writes a compact HTML digest `like this \u003csample_\u003e`_.\n\n\nSample Digest\n=============\n\nHere's a sample of a Dinghy digest reporting on `some PSF repos: black,\nrequests, and PEPs \u003csample_\u003e`_.\n\n\nGetting Started\n===============\n\n1. Install dinghy:\n\n   .. code-block:: bash\n\n    $ python -m pip install dinghy\n\n2. To run dinghy you will need a GitHub `personal access token`_. The scopes\n   you need to assign to it depend on what repos you'll be accessing.  If you\n   are only accessing public repos, then you don't need any scopes.  If you\n   will be accessing any private repos, then you need the \"repo\" scope.  Create\n   a token and define the GITHUB_TOKEN environment variable with the value:\n\n   .. code-block:: bash\n\n    $ export GITHUB_TOKEN=ghp_Y2oxDn9gHJ3W2NcQeyJsrMOez\n\n.. _personal access token: https://github.com/settings/tokens\n\n3. Then run dinghy with a GitHub URL:\n\n   .. code-block:: bash\n\n    $ dinghy https://github.com/Me/MyProject\n    Wrote digest: digest.html\n\n   You will have a digest of the repo's last week of activity in digest.html.\n   It will look `something like this \u003csample_\u003e`_.\n\n   You can also write a YAML configuration file to digest multiple sources, or\n   with different time periods:\n\n   .. code-block:: bash\n\n    $ dinghy my-dinghy-config.yaml\n    Wrote digest: proj1.html\n    Wrote digest: proj2-daily.html\n    Wrote digest: proj2-weekly.html\n\n   Extra arguments specify which digests to write:\n\n   .. code-block:: bash\n\n    $ dinghy my-dinghy-config.yaml proj1.html\n    Wrote digest: proj1.html\n\n\n\nConfiguration\n=============\n\nDinghy configuration is read from a YAML file (``dinghy.yaml`` by default).\nHere's an example:\n\n.. code-block:: yaml\n\n    digests:\n      - digest: lastweek.html\n        title: My projects last week\n        since: 1 week\n        items:\n          - https://github.com/orgs/myorg/projects/17\n          - https://github.com/orgs/anotherorg/projects/8\n          - https://github.com/myorg/myrepo/pulls\n\n      - digest: hotnews.html\n        title: Today's news\n        since: 1 day\n        items:\n          - url: https://github.com/orgs/anotherorg/projects/8\n            home_repo: anotherorg/wg\n          - https://github.com/myorg/churnchurn/issues\n\n      - digest: all_prs.html\n        since: 1 day\n        items:\n          - search: org:myorg is:pr\n            title: MyOrg pull requests\n\n    defaults:\n      ignore_users:\n        - app-user\n        - fake-bot\n\nThe ``digests`` clause is a list of digests to produce.  The ``defaults``\nclause sets defaults for the digest options in the rest of the file.  Each\n``digests`` clause specifies what to digest:\n\n- The ``digest`` setting is the HTML digest file to write.\n\n- The ``since`` setting indicates how far back to look for activity. It can use\n  units of weeks, days, hours, minutes and seconds, and can also be\n  abbreviated, like ``1d6h``. Using ``since: forever`` will include all\n  activity regardless of when it happened.  If ``since`` is omitted, it\n  defaults to one week.  You can specify ``--since=\u003cSINCE\u003e`` on the dinghy\n  command line to provide an explicit value.\n\n- The ``items`` setting is a list of things to report on, specified in a few\n  different ways:\n\n  - The ``url`` setting is a GitHub URL, in a number of forms:\n\n    - An organization project URL will report on the issues and pull requests\n      in the project. Your GitHub token will need the \"read:project\" scope.\n\n    - A URL to a repo will report on the issues, pull requests and releases in\n      the repo.\n\n    - A URL to a repo's issues will report on the issues in the repo.\n\n    - A URL to a repo's pull requests will report on the pull requests in the\n      repo.\n\n    - A URL to a repo's releases will report on the releases in the repo.\n\n    - Any of these URLs can point to a GitHub Enterprise installation instead\n      of https://github.com.\n\n  - The ``search`` setting can specify a GitHub search query to find issues or\n    pull requests. The query will have an ``updated:`` term added to it to\n    account for the ``since:`` setting.\n\n  - If an item only needs to specify a GitHub URL, then it can simply be the\n    URL string.\n\n- The optional ``title`` setting will be used to construct the title\n  and main header of the HTML page.\n\n- The ``template`` setting is the name of a Jinja2 template file to use to\n  produce the digest. It defaults to \"digest.html.j2\", which is packaged with\n  dinghy.  The data passed to the template is under-specified; if you want to\n  write a template of your own, model it on the built-in `digest.html.j2`_.\n\n.. _digest.html.j2: https://github.com/nedbat/dinghy/blob/main/src/dinghy/templates/digest.html.j2\n\n- For GitHub Enterprise, you can specify ``api_root``, which is the URL to\n  build on for GraphQL API requests. It defaults to\n  \"https://api.github.com/graphql\".\n\nItems can have additional options:\n\n- By default, no activity is reported for bot users.  If you want to include\n  them, use ``include_bots: true``.\n\n- Some applications perform actions using real user accounts, but you'd like to\n  ignore them anyway.  You can list those user names that should be ignored in\n  the ``ignore_users`` setting.\n\n- Digests can have an explicit title set with the ``title`` setting.\n\n- Options for organization projects include:\n\n  - ``home_repo`` is the owner/repo of the repo in which most issues will be\n    created.  Issues in other repos will have the repo indicated in the\n    digest.\n\n\nDaily Publishing\n================\n\nThe `sample digest \u003csample_\u003e`_ is published daily using a GitHub Action from\nits own repo: `nedbat/dinghy_sample \u003csample_repo_\u003e`_.  You can use it as a\nstarting point for your own publishing.\n\nThere's also a `separate project \u003cemail_project_\u003e`_ which sends a daily email\nof GitHub activity.\n\n\n.. _sample: https://nedbat.github.io/dinghy_sample/3day.html\n.. _sample_repo: https://github.com/nedbat/dinghy_sample\n.. _email_project: https://github.com/iloveitaly/github-digest\n\n\nContributors\n============\n\nThanks to all who have helped:\n\n- Ned Batchelder\n- Andreas Motl\n- Bill Mill\n- Doug Hellmann\n- Henry Gessau\n- Lucas Taylor\n- Quentin Pradet\n- Simon de Vlieger\n\n\n.. |pypi-badge| image:: https://img.shields.io/pypi/v/dinghy.svg\n    :target: https://pypi.python.org/pypi/dinghy/\n    :alt: PyPI\n.. |pyversions-badge| image:: https://img.shields.io/pypi/pyversions/dinghy.svg\n    :target: https://pypi.python.org/pypi/dinghy/\n    :alt: Supported Python versions\n.. |license-badge| image:: https://img.shields.io/github/license/nedbat/dinghy.svg\n    :target: https://github.com/nedbat/dinghy/blob/master/LICENSE.txt\n    :alt: License\n.. |bluesky-nedbat| image:: https://img.shields.io/badge/dynamic/json?style=flat\u0026color=96a3b0\u0026labelColor=3686f7\u0026logo=icloud\u0026logoColor=white\u0026label=@nedbat\u0026url=https%3A%2F%2Fpublic.api.bsky.app%2Fxrpc%2Fapp.bsky.actor.getProfile%3Factor=nedbat.com\u0026query=followersCount\n    :target: https://bsky.app/profile/nedbat.com\n    :alt: nedbat on Bluesky\n.. |mastodon-nedbat| image:: https://img.shields.io/badge/dynamic/json?style=flat\u0026labelColor=450657\u0026logo=mastodon\u0026logoColor=ffffff\u0026label=@nedbat\u0026query=followers_count\u0026url=https%3A%2F%2Fhachyderm.io%2Fapi%2Fv1%2Faccounts%2Flookup%3Facct=nedbat\n    :target: https://hachyderm.io/@nedbat\n    :alt: nedbat on Mastodon\n.. |sponsor-badge| image:: https://img.shields.io/badge/%E2%9D%A4-Sponsor%20me-brightgreen?style=flat\u0026logo=GitHub\n    :target: https://github.com/sponsors/nedbat\n    :alt: Sponsor me on GitHub\n","funding_links":["https://github.com/sponsors/nedbat"],"categories":["Python","others"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnedbat%2Fdinghy","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnedbat%2Fdinghy","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnedbat%2Fdinghy/lists"}