gitpulse-analytics 0.2.0__tar.gz → 0.2.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -11,5 +11,6 @@ venv/
11
11
 
12
12
  # Generated dashboards
13
13
  gitpulse-*.html
14
+ reports/
14
15
  dist/
15
16
  build/
@@ -0,0 +1,59 @@
1
+ # Changelog
2
+
3
+ All notable changes to GitPulse are documented here. The format is based on
4
+ [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project follows
5
+ [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
+
7
+ ## [Unreleased]
8
+
9
+ ## [0.2.1] - 2026-11-03
10
+
11
+ ### Security
12
+
13
+ - The Docker image is now built on the Alpine variant of
14
+ [Docker Hardened Images](https://dhi.io) for Python instead of `python:3.13-slim`.
15
+ Trivy findings drop from 193 (50 High, none fixable in Debian) to 0.
16
+ - The runtime image has no shell or package manager. GitPulse runs from its own
17
+ virtualenv containing only GitPulse and its dependencies, with no pip.
18
+ - `urllib3` is 2.8.0 in the Docker image and the Homebrew formula, fixing
19
+ CVE-2026-97687, CVE-2026-97688, and CVE-2026-97689.
20
+
21
+ ### Changed
22
+
23
+ - The container runs as the non-root UID 65532 instead of 1000.
24
+ - The Docker image is 105 MB, down from 227 MB.
25
+
26
+ ### Upgrading
27
+
28
+ If you kept snapshot history in a Docker volume or bind mount with 0.2.0, its files
29
+ belong to UID 1000. Saving with 0.2.1 then fails with
30
+ `attempt to write a readonly database`. Give the files to the new user once; your
31
+ history is kept:
32
+
33
+ ```sh
34
+ docker run --rm -v gitpulse-data:/data alpine chown -R 65532:65532 /data
35
+ ```
36
+
37
+ For a bind mount, run `sudo chown -R 65532:65532 DIR` on the host, or keep the old UID
38
+ with `--user 1000:1000`.
39
+
40
+ ## [0.2.0] - 2026-11-03
41
+
42
+ First public release.
43
+
44
+ ### Added
45
+
46
+ - `gitpulse org ORG` builds a dashboard for a whole organization or user account. It
47
+ prints a Rich summary in the terminal and writes a self-contained HTML dashboard
48
+ with daily traffic, the most viewed and most starred repositories, languages,
49
+ referrers, release downloads, and a sortable, filterable table of every repository.
50
+ - Per-repository commands: `repos`, `traffic`, `snapshot`, `history`, and `downloads`.
51
+ - Local SQLite snapshots to keep traffic history beyond GitHub's 14-day window.
52
+ - `gitpulse --version`.
53
+ - Releases on PyPI as `gitpulse-analytics`, in the
54
+ [`fullstackspectrum/gitpulse`](https://github.com/fullstackspectrum/homebrew-gitpulse)
55
+ Homebrew tap, and as the multi-arch `fullstackspectrum/gitpulse` Docker image.
56
+
57
+ [Unreleased]: https://github.com/fullstackspectrum/gitpulse/compare/v0.2.1...HEAD
58
+ [0.2.1]: https://github.com/fullstackspectrum/gitpulse/compare/v0.2.0...v0.2.1
59
+ [0.2.0]: https://github.com/fullstackspectrum/gitpulse/releases/tag/v0.2.0
@@ -1,10 +1,10 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: gitpulse-analytics
3
- Version: 0.2.0
3
+ Version: 0.2.1
4
4
  Summary: GitHub traffic, clones, referrers, and release downloads in your terminal, with org-wide HTML dashboards
5
5
  Project-URL: Homepage, https://github.com/fullstackspectrum/gitpulse
6
6
  Project-URL: Issues, https://github.com/fullstackspectrum/gitpulse/issues
7
- Project-URL: Changelog, https://github.com/fullstackspectrum/gitpulse/releases
7
+ Project-URL: Changelog, https://github.com/fullstackspectrum/gitpulse/blob/main/CHANGELOG.md
8
8
  Author-email: FullStackSpectrum <dev@fullstackspectrum.com>
9
9
  License-Expression: MIT
10
10
  License-File: LICENSE
@@ -32,6 +32,16 @@ Description-Content-Type: text/markdown
32
32
 
33
33
  # GitPulse
34
34
 
35
+ [![CI](https://img.shields.io/github/actions/workflow/status/fullstackspectrum/gitpulse/ci.yml?branch=main&style=for-the-badge&logo=githubactions&logoColor=white&label=CI)](https://github.com/fullstackspectrum/gitpulse/actions/workflows/ci.yml)
36
+ [![PyPI](https://img.shields.io/pypi/v/gitpulse-analytics?style=for-the-badge&logo=pypi&logoColor=white&color=3775A9)](https://pypi.org/project/gitpulse-analytics/)
37
+ [![Python](https://img.shields.io/pypi/pyversions/gitpulse-analytics?style=for-the-badge&logo=python&logoColor=white&color=3776AB)](https://pypi.org/project/gitpulse-analytics/)
38
+ [![Homebrew](https://img.shields.io/badge/dynamic/regex?url=https%3A%2F%2Fraw.githubusercontent.com%2Ffullstackspectrum%2Fhomebrew-gitpulse%2Fmain%2FFormula%2Fgitpulse.rb&search=gitpulse_analytics-%28%5B0-9.%5D%2B%29%5C.tar%5C.gz&replace=v%241&label=homebrew&style=for-the-badge&logo=homebrew&logoColor=white&color=FBB040)](https://github.com/fullstackspectrum/homebrew-gitpulse)
39
+ [![Docker](https://img.shields.io/docker/image-size/fullstackspectrum/gitpulse/latest?style=for-the-badge&logo=docker&logoColor=white&label=docker&color=2496ED)](https://hub.docker.com/r/fullstackspectrum/gitpulse)
40
+ [![License](https://img.shields.io/github/license/fullstackspectrum/gitpulse?style=for-the-badge&color=6E7781)](LICENSE)
41
+ <br>
42
+ [![PyPI downloads](https://img.shields.io/pepy/dt/gitpulse-analytics?style=for-the-badge&logo=pypi&logoColor=white&label=pypi%20downloads&color=3775A9)](https://pepy.tech/projects/gitpulse-analytics)
43
+ [![Docker pulls](https://img.shields.io/docker/pulls/fullstackspectrum/gitpulse?style=for-the-badge&logo=docker&logoColor=white&label=docker%20pulls&color=2496ED)](https://hub.docker.com/r/fullstackspectrum/gitpulse)
44
+
35
45
  A local Python CLI for GitHub repository traffic and release asset download stats. GitPulse can build a dashboard for a whole organization, and it keeps SQLite snapshots so you have history beyond GitHub's short traffic window.
36
46
 
37
47
  > **What GitHub can tell you:** aggregate daily views and clones, unique counts, popular paths, referrers, and release-asset download totals. It does **not** identify individual visitors or people who cloned a repository. GitHub's traffic data is generally available for the most recent 14 days. Release asset downloads are not Homebrew formula install counts.
@@ -75,7 +85,7 @@ python -m pip install gitpulse-analytics
75
85
  docker run --rm -e GITHUB_TOKEN -v "$PWD:/data" fullstackspectrum/gitpulse org ORG
76
86
  ```
77
87
 
78
- The container runs as UID 1000. On Linux, if your user can't write the mounted directory as that UID, add `--user "$(id -u):$(id -g)"`.
88
+ The image is built on a [Docker Hardened Image](https://dhi.io) (Alpine), so it has no shell or package manager and runs as the non-root UID 65532. On Linux, if that UID can't write the mounted directory, add `--user "$(id -u):$(id -g)"`.
79
89
 
80
90
  **From source**, for development:
81
91
 
@@ -167,7 +177,8 @@ Run tests with `pytest` and lint with `ruff check .`.
167
177
 
168
178
  ### Releasing
169
179
 
170
- 1. Bump `__version__` in `src/gitpulse/__init__.py` and merge to `main`.
171
- 2. Publish a GitHub release with the tag `vX.Y.Z` matching that version.
180
+ 1. Bump `__version__` in `src/gitpulse/__init__.py`.
181
+ 2. In [CHANGELOG.md](CHANGELOG.md), move the `Unreleased` entries under a new `X.Y.Z` heading with the date, and update the comparison links at the bottom. Merge to `main`.
182
+ 3. Publish a GitHub release with the tag `vX.Y.Z` matching that version, using that version's changelog section as the release notes.
172
183
 
173
184
  The `Release` workflow checks that the tag matches the version, then publishes to PyPI. After that it pushes the multi-arch Docker image and updates the formula in [homebrew-gitpulse](https://github.com/fullstackspectrum/homebrew-gitpulse). A release marked as a pre-release goes to PyPI and to Docker Hub under its exact version tag only, without moving `latest` or the Homebrew formula. The formula template lives in `packaging/homebrew/`; edit it there, not in the tap.
@@ -1,5 +1,15 @@
1
1
  # GitPulse
2
2
 
3
+ [![CI](https://img.shields.io/github/actions/workflow/status/fullstackspectrum/gitpulse/ci.yml?branch=main&style=for-the-badge&logo=githubactions&logoColor=white&label=CI)](https://github.com/fullstackspectrum/gitpulse/actions/workflows/ci.yml)
4
+ [![PyPI](https://img.shields.io/pypi/v/gitpulse-analytics?style=for-the-badge&logo=pypi&logoColor=white&color=3775A9)](https://pypi.org/project/gitpulse-analytics/)
5
+ [![Python](https://img.shields.io/pypi/pyversions/gitpulse-analytics?style=for-the-badge&logo=python&logoColor=white&color=3776AB)](https://pypi.org/project/gitpulse-analytics/)
6
+ [![Homebrew](https://img.shields.io/badge/dynamic/regex?url=https%3A%2F%2Fraw.githubusercontent.com%2Ffullstackspectrum%2Fhomebrew-gitpulse%2Fmain%2FFormula%2Fgitpulse.rb&search=gitpulse_analytics-%28%5B0-9.%5D%2B%29%5C.tar%5C.gz&replace=v%241&label=homebrew&style=for-the-badge&logo=homebrew&logoColor=white&color=FBB040)](https://github.com/fullstackspectrum/homebrew-gitpulse)
7
+ [![Docker](https://img.shields.io/docker/image-size/fullstackspectrum/gitpulse/latest?style=for-the-badge&logo=docker&logoColor=white&label=docker&color=2496ED)](https://hub.docker.com/r/fullstackspectrum/gitpulse)
8
+ [![License](https://img.shields.io/github/license/fullstackspectrum/gitpulse?style=for-the-badge&color=6E7781)](LICENSE)
9
+ <br>
10
+ [![PyPI downloads](https://img.shields.io/pepy/dt/gitpulse-analytics?style=for-the-badge&logo=pypi&logoColor=white&label=pypi%20downloads&color=3775A9)](https://pepy.tech/projects/gitpulse-analytics)
11
+ [![Docker pulls](https://img.shields.io/docker/pulls/fullstackspectrum/gitpulse?style=for-the-badge&logo=docker&logoColor=white&label=docker%20pulls&color=2496ED)](https://hub.docker.com/r/fullstackspectrum/gitpulse)
12
+
3
13
  A local Python CLI for GitHub repository traffic and release asset download stats. GitPulse can build a dashboard for a whole organization, and it keeps SQLite snapshots so you have history beyond GitHub's short traffic window.
4
14
 
5
15
  > **What GitHub can tell you:** aggregate daily views and clones, unique counts, popular paths, referrers, and release-asset download totals. It does **not** identify individual visitors or people who cloned a repository. GitHub's traffic data is generally available for the most recent 14 days. Release asset downloads are not Homebrew formula install counts.
@@ -43,7 +53,7 @@ python -m pip install gitpulse-analytics
43
53
  docker run --rm -e GITHUB_TOKEN -v "$PWD:/data" fullstackspectrum/gitpulse org ORG
44
54
  ```
45
55
 
46
- The container runs as UID 1000. On Linux, if your user can't write the mounted directory as that UID, add `--user "$(id -u):$(id -g)"`.
56
+ The image is built on a [Docker Hardened Image](https://dhi.io) (Alpine), so it has no shell or package manager and runs as the non-root UID 65532. On Linux, if that UID can't write the mounted directory, add `--user "$(id -u):$(id -g)"`.
47
57
 
48
58
  **From source**, for development:
49
59
 
@@ -135,7 +145,8 @@ Run tests with `pytest` and lint with `ruff check .`.
135
145
 
136
146
  ### Releasing
137
147
 
138
- 1. Bump `__version__` in `src/gitpulse/__init__.py` and merge to `main`.
139
- 2. Publish a GitHub release with the tag `vX.Y.Z` matching that version.
148
+ 1. Bump `__version__` in `src/gitpulse/__init__.py`.
149
+ 2. In [CHANGELOG.md](CHANGELOG.md), move the `Unreleased` entries under a new `X.Y.Z` heading with the date, and update the comparison links at the bottom. Merge to `main`.
150
+ 3. Publish a GitHub release with the tag `vX.Y.Z` matching that version, using that version's changelog section as the release notes.
140
151
 
141
152
  The `Release` workflow checks that the tag matches the version, then publishes to PyPI. After that it pushes the multi-arch Docker image and updates the formula in [homebrew-gitpulse](https://github.com/fullstackspectrum/homebrew-gitpulse). A release marked as a pre-release goes to PyPI and to Docker Hub under its exact version tag only, without moving `latest` or the Homebrew formula. The formula template lives in `packaging/homebrew/`; edit it there, not in the tap.
@@ -38,7 +38,7 @@ dev = ["pytest>=8,<9", "ruff>=0.6,<1"]
38
38
  [project.urls]
39
39
  Homepage = "https://github.com/fullstackspectrum/gitpulse"
40
40
  Issues = "https://github.com/fullstackspectrum/gitpulse/issues"
41
- Changelog = "https://github.com/fullstackspectrum/gitpulse/releases"
41
+ Changelog = "https://github.com/fullstackspectrum/gitpulse/blob/main/CHANGELOG.md"
42
42
 
43
43
  [project.scripts]
44
44
  gitpulse = "gitpulse.cli:app"
@@ -50,7 +50,7 @@ path = "src/gitpulse/__init__.py"
50
50
  packages = ["src/gitpulse"]
51
51
 
52
52
  [tool.hatch.build.targets.sdist]
53
- include = ["src", "tests", "README.md", "LICENSE"]
53
+ include = ["src", "tests", "README.md", "LICENSE", "CHANGELOG.md"]
54
54
 
55
55
  [tool.pytest.ini_options]
56
56
  pythonpath = ["src"]
@@ -1,3 +1,3 @@
1
1
  """Local GitHub repository analytics."""
2
2
 
3
- __version__ = "0.2.0"
3
+ __version__ = "0.2.1"