trendify2 2.0.4__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.
Files changed (167) hide show
  1. trendify2-2.0.4/.github/workflows/docs.yml +31 -0
  2. trendify2-2.0.4/.github/workflows/publish.yml +80 -0
  3. trendify2-2.0.4/.gitignore +41 -0
  4. trendify2-2.0.4/.pre-commit-config.yaml +57 -0
  5. trendify2-2.0.4/.python-version +1 -0
  6. trendify2-2.0.4/CHANGELOG.md +130 -0
  7. trendify2-2.0.4/LICENSE.txt +21 -0
  8. trendify2-2.0.4/PKG-INFO +107 -0
  9. trendify2-2.0.4/README.md +65 -0
  10. trendify2-2.0.4/docs/assets/gh-social.png +0 -0
  11. trendify2-2.0.4/docs/assets/logo.svg +803 -0
  12. trendify2-2.0.4/docs/assets/logo_pink.svg +3 -0
  13. trendify2-2.0.4/docs/assets/logo_pink_white_bg.svg +11 -0
  14. trendify2-2.0.4/docs/assets/main-logo-white-bg.svg +75 -0
  15. trendify2-2.0.4/docs/assets/main-logo.svg +66 -0
  16. trendify2-2.0.4/docs/assets/read-me-banner.png +0 -0
  17. trendify2-2.0.4/docs/assets/read-me-banner.svg +157 -0
  18. trendify2-2.0.4/docs/assets/static/scatter_plot.jpg +0 -0
  19. trendify2-2.0.4/docs/assets/static/table_melted.csv +31 -0
  20. trendify2-2.0.4/docs/assets/static/table_pivot.csv +11 -0
  21. trendify2-2.0.4/docs/assets/static/table_stats.csv +4 -0
  22. trendify2-2.0.4/docs/assets/static/trace_plot.jpg +0 -0
  23. trendify2-2.0.4/docs/changelog.md +1 -0
  24. trendify2-2.0.4/docs/css/extra.css +122 -0
  25. trendify2-2.0.4/docs/example_data/.gitignore +2 -0
  26. trendify2-2.0.4/docs/example_data/trendify/assets/batch_means_table_melted.csv +61 -0
  27. trendify2-2.0.4/docs/example_data/trendify/assets/batch_means_table_melted.md +62 -0
  28. trendify2-2.0.4/docs/example_data/trendify/assets/batch_means_table_pivot.csv +21 -0
  29. trendify2-2.0.4/docs/example_data/trendify/assets/batch_means_table_pivot.md +22 -0
  30. trendify2-2.0.4/docs/example_data/trendify/assets/batch_means_table_stats.csv +4 -0
  31. trendify2-2.0.4/docs/example_data/trendify/assets/batch_means_table_stats.md +5 -0
  32. trendify2-2.0.4/docs/example_data/trendify/assets/harmonic_mean_distribution.svg +859 -0
  33. trendify2-2.0.4/docs/example_data/trendify/assets/run_means_tracking.svg +796 -0
  34. trendify2-2.0.4/docs/example_data/trendify/assets/signature_correlation.svg +2133 -0
  35. trendify2-2.0.4/docs/example_data/trendify/assets/time_series.svg +6255 -0
  36. trendify2-2.0.4/docs/example_generator.py +201 -0
  37. trendify2-2.0.4/docs/hooks.py +25 -0
  38. trendify2-2.0.4/docs/index.md +82 -0
  39. trendify2-2.0.4/docs/javascripts/katex.js +10 -0
  40. trendify2-2.0.4/docs/javascripts/tablesort.js +6 -0
  41. trendify2-2.0.4/docs/redraw_plots.sh +16 -0
  42. trendify2-2.0.4/docs/user-guide.md +213 -0
  43. trendify2-2.0.4/mkdocs.yml +175 -0
  44. trendify2-2.0.4/pyproject.toml +160 -0
  45. trendify2-2.0.4/requirements.txt +1159 -0
  46. trendify2-2.0.4/scripts/embed_demo.py +162 -0
  47. trendify2-2.0.4/scripts/gen_ts_models.py +243 -0
  48. trendify2-2.0.4/scripts/matrix_generator.py +910 -0
  49. trendify2-2.0.4/scripts/run.sh +17 -0
  50. trendify2-2.0.4/scripts/sweep_procs.py +40 -0
  51. trendify2-2.0.4/scripts/verify_changelog_by_tag.py +82 -0
  52. trendify2-2.0.4/src/trendify/__about__.py +14 -0
  53. trendify2-2.0.4/src/trendify/__init__.py +250 -0
  54. trendify2-2.0.4/src/trendify/base/__init__.py +36 -0
  55. trendify2-2.0.4/src/trendify/base/helpers.py +76 -0
  56. trendify2-2.0.4/src/trendify/base/pen.py +161 -0
  57. trendify2-2.0.4/src/trendify/base/record.py +148 -0
  58. trendify2-2.0.4/src/trendify/cli.py +403 -0
  59. trendify2-2.0.4/src/trendify/color.py +260 -0
  60. trendify2-2.0.4/src/trendify/examples.py +474 -0
  61. trendify2-2.0.4/src/trendify/formats/__init__.py +28 -0
  62. trendify2-2.0.4/src/trendify/formats/format2d.py +128 -0
  63. trendify2-2.0.4/src/trendify/formats/table.py +55 -0
  64. trendify2-2.0.4/src/trendify/generator/__init__.py +38 -0
  65. trendify2-2.0.4/src/trendify/generator/generate.py +167 -0
  66. trendify2-2.0.4/src/trendify/generator/histogrammer.py +62 -0
  67. trendify2-2.0.4/src/trendify/generator/render.py +195 -0
  68. trendify2-2.0.4/src/trendify/generator/table_builder.py +194 -0
  69. trendify2-2.0.4/src/trendify/generator/xy_data_plotter.py +195 -0
  70. trendify2-2.0.4/src/trendify/log.py +195 -0
  71. trendify2-2.0.4/src/trendify/pipeline.py +136 -0
  72. trendify2-2.0.4/src/trendify/plotting/__init__.py +48 -0
  73. trendify2-2.0.4/src/trendify/plotting/axline.py +122 -0
  74. trendify2-2.0.4/src/trendify/plotting/figure.py +389 -0
  75. trendify2-2.0.4/src/trendify/plotting/histogram.py +282 -0
  76. trendify2-2.0.4/src/trendify/plotting/point.py +89 -0
  77. trendify2-2.0.4/src/trendify/plotting/scatter.py +100 -0
  78. trendify2-2.0.4/src/trendify/plotting/trace.py +129 -0
  79. trendify2-2.0.4/src/trendify/progress.py +43 -0
  80. trendify2-2.0.4/src/trendify/store/__init__.py +30 -0
  81. trendify2-2.0.4/src/trendify/store/db.py +119 -0
  82. trendify2-2.0.4/src/trendify/store/record_store.py +448 -0
  83. trendify2-2.0.4/src/trendify/store/tags.py +65 -0
  84. trendify2-2.0.4/src/trendify/styling/__init__.py +30 -0
  85. trendify2-2.0.4/src/trendify/styling/grid.py +125 -0
  86. trendify2-2.0.4/src/trendify/styling/legend.py +217 -0
  87. trendify2-2.0.4/src/trendify/styling/marker.py +168 -0
  88. trendify2-2.0.4/src/trendify/typing.py +26 -0
  89. trendify2-2.0.4/src/trendify/viewer/__init__.py +41 -0
  90. trendify2-2.0.4/src/trendify/viewer/app.py +208 -0
  91. trendify2-2.0.4/src/trendify/viewer/hydration.py +181 -0
  92. trendify2-2.0.4/src/trendify/viewer/plot_config.py +102 -0
  93. trendify2-2.0.4/src/trendify/viewer/routes/__init__.py +6 -0
  94. trendify2-2.0.4/src/trendify/viewer/routes/api.py +360 -0
  95. trendify2-2.0.4/src/trendify/viewer/routes/pages.py +39 -0
  96. trendify2-2.0.4/src/trendify/viewer/tag_tree.py +148 -0
  97. trendify2-2.0.4/src/trendify/viewer/templates/base.html +63 -0
  98. trendify2-2.0.4/src/trendify/viewer/templates/index.html +131 -0
  99. trendify2-2.0.4/src/trendify/viewer/templates/partials/__init__.py +1 -0
  100. trendify2-2.0.4/src/trendify/viewer/templates/partials/footer.html +15 -0
  101. trendify2-2.0.4/src/trendify/viewer/templates/partials/nav.html +181 -0
  102. trendify2-2.0.4/src/trendify/viewer/templates/partials/plot_view.html +221 -0
  103. trendify2-2.0.4/src/trendify/viewer/templates/partials/sidebar.html +163 -0
  104. trendify2-2.0.4/src/trendify/viewer/templates/partials/table_view.html +43 -0
  105. trendify2-2.0.4/src/trendify/viewer/templates/static/__init__.py +1 -0
  106. trendify2-2.0.4/src/trendify/viewer/templates/static/assets/__init__.py +1 -0
  107. trendify2-2.0.4/src/trendify/viewer/templates/static/assets/main-logo-white-bg.svg +75 -0
  108. trendify2-2.0.4/src/trendify/viewer/templates/static/assets/main-logo.svg +66 -0
  109. trendify2-2.0.4/src/trendify/viewer/templates/static/css/app.css +75 -0
  110. trendify2-2.0.4/src/trendify/viewer/templates/static/js/main.js +2 -0
  111. trendify2-2.0.4/src/trendify/viewer/templates/static/ts/build.mjs +23 -0
  112. trendify2-2.0.4/src/trendify/viewer/templates/static/ts/package-lock.json +563 -0
  113. trendify2-2.0.4/src/trendify/viewer/templates/static/ts/package.json +16 -0
  114. trendify2-2.0.4/src/trendify/viewer/templates/static/ts/src/lib/api.ts +149 -0
  115. trendify2-2.0.4/src/trendify/viewer/templates/static/ts/src/lib/clipboard.ts +31 -0
  116. trendify2-2.0.4/src/trendify/viewer/templates/static/ts/src/lib/connection.ts +56 -0
  117. trendify2-2.0.4/src/trendify/viewer/templates/static/ts/src/lib/content-tabs.ts +27 -0
  118. trendify2-2.0.4/src/trendify/viewer/templates/static/ts/src/lib/fullscreen.ts +33 -0
  119. trendify2-2.0.4/src/trendify/viewer/templates/static/ts/src/lib/local-storage.ts +46 -0
  120. trendify2-2.0.4/src/trendify/viewer/templates/static/ts/src/lib/metadata-filter.ts +98 -0
  121. trendify2-2.0.4/src/trendify/viewer/templates/static/ts/src/lib/plot-config.generated.ts +105 -0
  122. trendify2-2.0.4/src/trendify/viewer/templates/static/ts/src/lib/plot-view.ts +374 -0
  123. trendify2-2.0.4/src/trendify/viewer/templates/static/ts/src/lib/plotly-toast-bridge.ts +31 -0
  124. trendify2-2.0.4/src/trendify/viewer/templates/static/ts/src/lib/prefetch.ts +142 -0
  125. trendify2-2.0.4/src/trendify/viewer/templates/static/ts/src/lib/resize.ts +62 -0
  126. trendify2-2.0.4/src/trendify/viewer/templates/static/ts/src/lib/schema-validate.ts +6 -0
  127. trendify2-2.0.4/src/trendify/viewer/templates/static/ts/src/lib/sidebar-filter.ts +30 -0
  128. trendify2-2.0.4/src/trendify/viewer/templates/static/ts/src/lib/sidebar-node.ts +49 -0
  129. trendify2-2.0.4/src/trendify/viewer/templates/static/ts/src/lib/table-view.ts +294 -0
  130. trendify2-2.0.4/src/trendify/viewer/templates/static/ts/src/lib/theme.ts +52 -0
  131. trendify2-2.0.4/src/trendify/viewer/templates/static/ts/src/lib/toast.ts +125 -0
  132. trendify2-2.0.4/src/trendify/viewer/templates/static/ts/src/lib/url-state.ts +57 -0
  133. trendify2-2.0.4/src/trendify/viewer/templates/static/ts/src/main.ts +108 -0
  134. trendify2-2.0.4/src/trendify/viewer/templates/static/ts/src/types/global.d.ts +22 -0
  135. trendify2-2.0.4/src/trendify/viewer/templates/static/ts/tsconfig.json +16 -0
  136. trendify2-2.0.4/src/trendify/viewer/templates/static/vendored/__init__.py +1 -0
  137. trendify2-2.0.4/src/trendify/viewer/templates/static/vendored/alpine-3.15.12.min.js +5 -0
  138. trendify2-2.0.4/src/trendify/viewer/templates/static/vendored/alpine-LICENSE.md +21 -0
  139. trendify2-2.0.4/src/trendify/viewer/templates/static/vendored/dataTables-LICENSE.txt +3 -0
  140. trendify2-2.0.4/src/trendify/viewer/templates/static/vendored/dataTables.dataTables.min.css +1 -0
  141. trendify2-2.0.4/src/trendify/viewer/templates/static/vendored/dataTables.min.js +4 -0
  142. trendify2-2.0.4/src/trendify/viewer/templates/static/vendored/jquery-3.7.1.min.js +2 -0
  143. trendify2-2.0.4/src/trendify/viewer/templates/static/vendored/jquery-LICENSE.txt +3 -0
  144. trendify2-2.0.4/src/trendify/viewer/templates/static/vendored/plotly-3.6.0.min.js +3882 -0
  145. trendify2-2.0.4/src/trendify/viewer/templates/static/vendored/plotly-LICENSE.txt +21 -0
  146. trendify2-2.0.4/src/trendify/viewer/templates/static/vendored/tailwind-4.3.2.global.js +947 -0
  147. trendify2-2.0.4/src/trendify/viewer/templates/static/vendored/tailwind-LICENSE +21 -0
  148. trendify2-2.0.4/tests/test_axline.py +100 -0
  149. trendify2-2.0.4/tests/test_cli.py +289 -0
  150. trendify2-2.0.4/tests/test_db.py +37 -0
  151. trendify2-2.0.4/tests/test_examples.py +104 -0
  152. trendify2-2.0.4/tests/test_figure.py +213 -0
  153. trendify2-2.0.4/tests/test_generate.py +131 -0
  154. trendify2-2.0.4/tests/test_histogram.py +131 -0
  155. trendify2-2.0.4/tests/test_hydration.py +178 -0
  156. trendify2-2.0.4/tests/test_marker.py +69 -0
  157. trendify2-2.0.4/tests/test_pen.py +109 -0
  158. trendify2-2.0.4/tests/test_pipeline.py +77 -0
  159. trendify2-2.0.4/tests/test_record.py +44 -0
  160. trendify2-2.0.4/tests/test_record_store.py +326 -0
  161. trendify2-2.0.4/tests/test_render.py +198 -0
  162. trendify2-2.0.4/tests/test_scatter.py +45 -0
  163. trendify2-2.0.4/tests/test_table_builder.py +138 -0
  164. trendify2-2.0.4/tests/test_viewer_api.py +278 -0
  165. trendify2-2.0.4/tests/test_viewer_embedding.py +349 -0
  166. trendify2-2.0.4/tests/test_xy_data_plotter.py +216 -0
  167. trendify2-2.0.4/uv.lock +1764 -0
@@ -0,0 +1,31 @@
1
+ name: Documentation
2
+ on:
3
+ push:
4
+ branches:
5
+ - master
6
+ - main
7
+ permissions:
8
+ contents: read
9
+ pages: write
10
+ id-token: write
11
+ jobs:
12
+ deploy:
13
+ environment:
14
+ name: github-pages
15
+ url: ${{ steps.deployment.outputs.page_url }}
16
+ runs-on: ubuntu-latest
17
+ steps:
18
+ - uses: actions/configure-pages@v5
19
+ - uses: actions/checkout@v5
20
+ - name: Install uv
21
+ uses: astral-sh/setup-uv@v5
22
+ with:
23
+ enable-cache: true
24
+ - name: Install Python 3.14
25
+ run: uv python install 3.14
26
+ - run: uv run --locked --python 3.14 --group dev zensical build --clean
27
+ - uses: actions/upload-pages-artifact@v4
28
+ with:
29
+ path: site
30
+ - uses: actions/deploy-pages@v4
31
+ id: deployment
@@ -0,0 +1,80 @@
1
+ name: "Publish"
2
+
3
+ on:
4
+ push:
5
+ branches: ["main"] # Run tests on every push to main
6
+ tags: ["v*"] # Run tests AND publish on tags
7
+ pull_request:
8
+ branches: ["main"] # Run tests on PRs
9
+
10
+ jobs:
11
+ test:
12
+ name: "Test (Python ${{ matrix.python-version }})"
13
+ runs-on: ubuntu-latest
14
+ strategy:
15
+ matrix:
16
+ python-version: ["3.12", "3.13", "3.14", "3.15"]
17
+
18
+ steps:
19
+ - name: Checkout
20
+ uses: actions/checkout@v4
21
+
22
+ - name: Install uv
23
+ uses: astral-sh/setup-uv@v5
24
+ with:
25
+ enable-cache: true
26
+
27
+ - name: Install Python ${{ matrix.python-version }}
28
+ run: uv python install ${{ matrix.python-version }}
29
+
30
+ - name: Run unit tests
31
+ # Explicitly tells uv which python version to use for the test environment;
32
+ # --locked fails the job if uv.lock is out of date with pyproject.toml
33
+ run: uv run --locked --python ${{ matrix.python-version }} --group dev pytest
34
+ publish:
35
+ name: "Build and Publish"
36
+ needs: [test]
37
+ # ONLY run this job if the push was actually a tag
38
+ if: startsWith(github.ref, 'refs/tags/v')
39
+ runs-on: ubuntu-latest
40
+ environment:
41
+ name: pypi
42
+ permissions:
43
+ id-token: write # Required for PyPI Trusted Publishing
44
+ contents: write # Required to create GitHub Release and upload assets
45
+ steps:
46
+ - name: Checkout
47
+ uses: actions/checkout@v6
48
+ with:
49
+ # Fetch all history so we can see other branches
50
+ fetch-depth: 0
51
+
52
+ - name: Verify Tag is on Main
53
+ # Only perform this check if we were triggered by a tag
54
+ if: startsWith(github.ref, 'refs/tags/v')
55
+ run: |
56
+ # Check if 'main' branch contains the current commit
57
+ if ! git branch -r --contains ${{ github.sha }} | grep -q "origin/main"; then
58
+ echo "::error::Tag ${{ github.ref_name }} was pushed on a non-main branch. Skipping workflow."
59
+ exit 1
60
+ fi
61
+
62
+ - name: Install uv
63
+ uses: astral-sh/setup-uv@v7
64
+
65
+ - name: Install Python 3.14
66
+ run: uv python install 3.14
67
+
68
+ - name: Build
69
+ run: uv build
70
+
71
+ - name: Publish to PyPI
72
+ run: uv publish --check-url https://pypi.org/simple
73
+
74
+ - name: Create GitHub Release
75
+ uses: softprops/action-gh-release@v2
76
+ with:
77
+ generate_release_notes: true
78
+ files: |
79
+ dist/*.whl
80
+ dist/*.tar.gz
@@ -0,0 +1,41 @@
1
+ # Python-generated files
2
+ __pycache__/
3
+ *.py[oc]
4
+ build/
5
+ dist/
6
+ wheels/
7
+ *.egg-info
8
+
9
+ # Virtual environments
10
+ .venv
11
+
12
+ mojo.log
13
+ mojo.log.*
14
+
15
+ site
16
+ mojo-models
17
+ textures
18
+
19
+ typings
20
+
21
+ # TypeScript build artifacts (node_modules is dev-only; compiled .js files ARE committed)
22
+ node_modules/
23
+ *.js.map
24
+
25
+ .coverage
26
+
27
+ **/*.code-workspace
28
+
29
+ trendify.log*
30
+
31
+ # Test output files
32
+ discriminator_tests.json
33
+ discriminator_tests.log
34
+
35
+ /**/.DS_Store
36
+
37
+ *.prof
38
+
39
+ # Benchmark output (sweep results are large and machine specific)
40
+ benchmarks/results/
41
+ scripts/example_data
@@ -0,0 +1,57 @@
1
+ repos:
2
+ - repo: https://github.com/pre-commit/pre-commit-hooks
3
+ rev: v6.0.0
4
+ hooks:
5
+ - id: check-added-large-files
6
+ args: ["--maxkb=500"]
7
+ - repo: https://github.com/astral-sh/ruff-pre-commit
8
+ rev: v0.15.17
9
+ hooks:
10
+ - id: ruff-check
11
+ args: [--fix]
12
+ - id: ruff-format
13
+ - repo: https://github.com/astral-sh/uv-pre-commit
14
+ rev: 0.11.21
15
+ hooks:
16
+ - id: uv-lock
17
+ - repo: https://github.com/astral-sh/uv-pre-commit
18
+ rev: 0.11.21
19
+ hooks:
20
+ - id: uv-export
21
+ - repo: https://github.com/astral-sh/ty-pre-commit
22
+ # ty version.
23
+ rev: v0.0.89
24
+ hooks:
25
+ - id: ty
26
+ # ty checks against the project environment that `uv check` syncs from uv.lock, not
27
+ # pre-commit's own, so the optional extras must be installed for their imports to
28
+ # resolve (pydantic_ai, mjviser, viser); --frozen keeps uv.lock from being updated
29
+ args: [--frozen, --all-extras]
30
+ # - repo: https://github.com/RobertCraigie/pyright-python
31
+ # rev: v1.1.411
32
+ # hooks:
33
+ # - id: pyright
34
+ # - id: pyright
35
+ # name: Pyright (docs examples)
36
+ # args: [docs]
37
+ # pass_filenames: false
38
+ # always_run: true
39
+ # stages: [pre-commit]
40
+ - repo: local
41
+ hooks:
42
+ - id: act-test
43
+ name: Run GitHub Actions locally (act)
44
+ entry: act -j test
45
+ language: system
46
+ stages: [pre-push]
47
+ pass_filenames: false
48
+ files: ^(src/|tests/|pyproject\.toml|uv\.lock)
49
+ - repo: local
50
+ hooks:
51
+ - id: verify-changelog-tag
52
+ name: Verify CHANGELOG.md entry and date for current tag push
53
+ entry: python scripts/verify_changelog_by_tag.py
54
+ language: python
55
+ stages: [pre-push]
56
+ pass_filenames: false
57
+ always_run: true
@@ -0,0 +1 @@
1
+ 3.14
@@ -0,0 +1,130 @@
1
+ # Changelog
2
+
3
+ ## Version 2.0.4 (2026-10-17)
4
+
5
+ - Added support for Python 3.15
6
+ - Processing and rendering large sets of data is now up to 2.4x faster
7
+ - Saving results no longer slows down as more data is added (plot formatting is now looked up directly instead of searching through every saved record)
8
+ - Plots with lots of lines now draw faster (lines are drawn together in one batch instead of one at a time)
9
+ - The viewer can now be placed inside an existing FastAPI website (mount it at a path like `/viz` and show it in an `<iframe>`)
10
+ - Slow plots no longer freeze the rest of your site (the viewer's database work now runs on its own background thread)
11
+ - Optional settings to hide the database path and to let other sites use the viewer (`show_db_path`, `cors_origins`)
12
+ - Bad requests now get a clear error, and the viewer's memory use is capped
13
+ - Pressing Ctrl+C in the viewer now stops it right away instead of hanging for a minute or more
14
+ - Fixed console errors when switching plots or tables while one was still loading
15
+
16
+ ## Version 2.0.3 (2026-09-14)
17
+
18
+ - Added a changelog
19
+ - Patched dependency security vulnerabilities (`httpx2`, `httpcore2`, `tornado`)
20
+ - Removed unused MkDocs-only doc dependencies now that the docs build on Zensical
21
+
22
+ ## Version 2.0.0 (2026-07-05)
23
+
24
+ ### Core
25
+
26
+ - Now formally supporting Python 3.14
27
+ - Versioning is now controlled by `hatchling-vcs` (when a new tag "vX.Y.Z" is pushed to main the test+publish CI/CD automatically fires)
28
+ - Overhauled the pipeline for running and processing data products (now called records to reduce confusion)
29
+ - Records are stored in a SQLite database with concurrent write protection for multiprocessing
30
+ - Records are no longer serialized as JSON in the input directories
31
+ - Records are no longer sorted and duplicated into a `data_products` folder
32
+ - This change cut the storage required (and therefore runtime) more than in half
33
+ - SQLite database allows for better tag indexing and the reduced file size greatly improves runtime
34
+ - Format2D now supports a new `renderer` with options currently `Raster` (for JPG (default), PNG, etc.) and `Vector` (SVG)
35
+ - Logger has been completely redone to use `Rich` logs and a rolling file backup
36
+ - This includes a fix for concurrent logs being broken on Windows
37
+ - The CLI was completely rewritten using `typer` to allow for better scalability
38
+
39
+ ### Asset Generator
40
+
41
+ - Scatter2D was added as another option (Trace2D can also now optionally have no line style)
42
+ - Histograms can now be plotted with Trace2D, Point2D, and Scatter2D (previously they could only have AxLine)
43
+ - Table maker now uses `polars` instead of `pandas`
44
+ - Overhauled the previous interactive dashboard tool to use the new DB and also rewrote it to work as a FastAPI app (removing `streamlit`)
45
+ - The new dashboard is much more performant, user friendly, and now also include table views for `TableEntry` records
46
+ - It also comes with light/dark/system theming and a proper toast/notification system
47
+
48
+ ### Misc.
49
+
50
+ - Example data generator was updated to provide more "interesting" data (it is also now part of the `trendify` CLI namespace)
51
+ - The documentation site was transitioned to Zensical and branding was updated across the package
52
+ - User guide was rewritten to summarize how to use `trendify` and now include examples of the assets it produces
53
+ - The README/index was updated to match one another
54
+ - This also updated the CI/CD
55
+ - Pyright and Ruff are now part of the pre-commit to improve code quality
56
+ - Improved `__init__.py` to match [PEP 8](https://peps.python.org/pep-0008/#imports)
57
+ - Added a bunch of unit tests
58
+
59
+ ### Broke
60
+
61
+ - Format2D is now its own tagged Record (no longer an attribute of Trace2D, Point2D, etc.)
62
+ - This also removed the slow, and seldom used, union step that would be performed on every Format2D for every run
63
+ - Breaking this greatly reduces the DB size, especially since it usually just stored redundant information
64
+ - Trace2D.from_xy was removed since Point2D was removed from it (Trace2D now instantiated the same way as all other types)
65
+ - Trace2D was optimized to remove the ability to set a different style for each Point2D (which actually was never even possible but this includes a schema change)
66
+ - `trendify_make_sample_data` CLI exe moved to `trendify` (see Misc change)
67
+ - Python 3.11 no longer supported due to old generic typing system
68
+
69
+ ## v1.2.11 (2025-09-23)
70
+
71
+ - Added `figure_size` (width and height) support to `Format2D` (#30)
72
+
73
+ ## v1.2.7 (2025-09-23)
74
+
75
+ - Fixed nested quotes breaking generated histogram files
76
+ - Fixed the logo and favicon
77
+ - Added `zorder` control for Plotly traces/markers/histograms and Matplotlib histograms/legends
78
+ - Fixed log-scaled plots not displaying correctly in Plotly
79
+
80
+ ## v1.2.6 (2025-09-21)
81
+
82
+ - Changed plot title behavior
83
+ - Added a tooltip selector and improved tooltip button UX
84
+ - Added opacity/alpha support for traces, markers, and Plotly histogram edges
85
+ - Fixed tooltip text color not adapting to the line color, making it unreadable in some cases (#25)
86
+ - Dashboard tag keys are now sorted for easier browsing
87
+
88
+ ## v1.2.5 (2025-09-21)
89
+
90
+ - Now requires Python >= 3.11
91
+ - Fixed dashboard pushbuttons using the full tag name instead of a shorter key (#17)
92
+ - Fixed `trendify make dashboard` not treating the given path as a raw string (#18)
93
+ - Fixed the table builder, which was broken (#19)
94
+
95
+ ## v1.2.0 (2025-09-18)
96
+
97
+ - Added a Streamlit dashboard, reusing the existing `dashboard` CLI argument to launch it
98
+ - Added pushbutton controls for selecting a chart within nested expanders
99
+ - Fixed the documentation site build
100
+ - Adjusted logging levels
101
+
102
+ ## v1.1.16 (2025-09-10)
103
+
104
+ - Updated documentation and fixed an indexing bug
105
+
106
+ ## v1.1.15 (2025-09-10)
107
+
108
+ - Data products now record their source file in metadata
109
+
110
+ ## v1.1.14 (2025-09-10)
111
+
112
+ - Sorting now overwrites existing products for a given source directory instead of duplicating them
113
+
114
+ ## v1.1.6 (2025-08-02)
115
+
116
+ - Added a `Legend` object for customizing legend location and styling
117
+ - Added log-scale support for the x and y axes
118
+
119
+ ## v1.1.1 (2025-07-28)
120
+
121
+ - Added configurable logging with multiple verbosity levels
122
+ - Grid styling now uses the `Pen` object instead of one-off custom settings
123
+ - Added a tuple option for line style
124
+ - Added noise to the example data generator for more realistic sample output
125
+ - `XYDataPlot` can now be plotted together with histograms
126
+ - Fixed histogram bins with no values still showing their edges, making empty bins look populated
127
+ - Improved the auto-dashboard tool, including working Plotly support
128
+ - Added support for multiple tags, plus a product gallery view
129
+ - Fixed mean and max being swapped in the stats table
130
+ - Added the ability to specify the data products JSON filename
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 TalbotKnighton
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,107 @@
1
+ Metadata-Version: 2.5
2
+ Name: trendify2
3
+ Version: 2.0.4
4
+ Summary: Tools for generating data products, storing, and interacting with them
5
+ Project-URL: Homepage, https://github.com/Hydrowelder/trendify
6
+ Project-URL: Documentation, https://Hydrowelder.github.io/trendify/
7
+ Project-URL: Repository, https://github.com/Hydrowelder/trendify
8
+ Project-URL: Issues, https://github.com/Hydrowelder/trendify/issues
9
+ Project-URL: PyPI, https://pypi.org/project/trendify2/
10
+ Author-email: Talbot Knighton <talbotknighton@gmail.com>, David Gable <david@david-gable.com>
11
+ Maintainer-email: Talbot Knighton <talbotknighton@gmail.com>, David Gable <david@david-gable.com>
12
+ License: MIT
13
+ License-File: LICENSE.txt
14
+ Keywords: Dashboard,Data,Database,Matplotlib,Plotly,Plotting,Post,Process,Products,Trends,Visualization
15
+ Classifier: Development Status :: 3 - Alpha
16
+ Classifier: Environment :: Console
17
+ Classifier: Environment :: Web Environment
18
+ Classifier: Intended Audience :: Developers
19
+ Classifier: Intended Audience :: Science/Research
20
+ Classifier: License :: OSI Approved :: MIT License
21
+ Classifier: Natural Language :: English
22
+ Classifier: Operating System :: OS Independent
23
+ Classifier: Programming Language :: Python :: 3 :: Only
24
+ Classifier: Programming Language :: Python :: 3.12
25
+ Classifier: Programming Language :: Python :: 3.13
26
+ Classifier: Programming Language :: Python :: 3.14
27
+ Classifier: Programming Language :: Python :: 3.15
28
+ Classifier: Topic :: Scientific/Engineering :: Visualization
29
+ Classifier: Typing :: Typed
30
+ Requires-Python: >=3.12
31
+ Requires-Dist: fastapi>=0.134.0
32
+ Requires-Dist: matplotlib>=3.11.0
33
+ Requires-Dist: numpy>=2.4.1
34
+ Requires-Dist: numpydantic>=1.7.0
35
+ Requires-Dist: plotly>=6.8.0
36
+ Requires-Dist: polars>=1.39.0
37
+ Requires-Dist: pydantic>=2.12.5
38
+ Requires-Dist: rich>=14.3.3
39
+ Requires-Dist: typer>=0.24.1
40
+ Requires-Dist: uvicorn>=0.41.0
41
+ Description-Content-Type: text/markdown
42
+
43
+ <p align="center">
44
+ <img alt="Trendify" src="https://raw.githubusercontent.com/Hydrowelder/trendify/refs/heads/main/docs/assets/read-me-banner.png" style="width: 100%">
45
+ </p>
46
+
47
+ # trendify: Efficient Plotting and Table Building
48
+
49
+ <p align="center">
50
+ <a href="https://pypi.org/project/trendify2/" class="badge-link">
51
+ <img src="https://img.shields.io/pypi/v/trendify2.svg?cacheSeconds=300" alt="PyPI version">
52
+ </a>
53
+ <a href="https://pypi.org/project/trendify2/" class="badge-link">
54
+ <img src="https://img.shields.io/pypi/pyversions/trendify2.svg?cacheSeconds=86400" alt="Python versions">
55
+ </a>
56
+ <a href="https://github.com/Hydrowelder/trendify/actions/workflows/publish.yml" class="badge-link">
57
+ <img src="https://github.com/Hydrowelder/trendify/actions/workflows/publish.yml/badge.svg?branch=main" alt="Tests & Release Status">
58
+ </a>
59
+ <a href="https://github.com/Hydrowelder/trendify/actions/workflows/workflow.yml" class="badge-link">
60
+ <img src="https://raw.githubusercontent.com/Hydrowelder/trendify/refs/heads/main/docs/assets/coverage-badge.svg" alt="Coverage">
61
+ </a>
62
+ <a href="https://github.com/astral-sh/ruff" class="badge-link">
63
+ <img src="https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json" alt="Ruff">
64
+ </a>
65
+ <a href="https://docs.pydantic.dev/latest/" class="badge-link">
66
+ <img src="https://img.shields.io/badge/Pydantic-v2-FF43A1?logo=pydantic&logoColor=white" alt="Pydantic v2">
67
+ </a>
68
+ <a href="https://opensource.org/licenses/MIT" class="badge-link">
69
+ <img src="https://img.shields.io/badge/License-MIT-blue.svg" alt="License">
70
+ </a>
71
+ <a href="https://Hydrowelder.github.io/trendify/" class="badge-link">
72
+ <img src="https://img.shields.io/badge/docs-GitHub_Pages-blue.svg" alt="Documentation">
73
+ </a>
74
+ </p>
75
+
76
+ ---
77
+
78
+ ## Installation
79
+
80
+ Install the package via your preferred manager:
81
+
82
+ ```bash linenums="0"
83
+ uv add trendify2
84
+ ```
85
+
86
+ or with `pip`:
87
+
88
+ ```bash linenums="0"
89
+ pip install trendify2
90
+ ```
91
+
92
+ ---
93
+
94
+ ## Core Features
95
+
96
+ - **Built to scale**: process thousands of runs without holding every run's data in memory at once. Throughput stays flat whether you have dozens of runs or tens of thousands.
97
+ - **Typed records, no migrations**: points, traces, tables, and histograms are validated [Pydantic](https://docs.pydantic.dev/latest/) models. Add your own record types anytime without writing a schema migration.
98
+ - **Parallelizable**: `trendify generate` can fan your processing function out across multiple CPU cores with `--n-procs`, with multiprocessing-safe logging that funnels every worker's output through a single queue.
99
+ - **Static assets or a live dashboard**: render tagged data straight to Matplotlib images and CSV tables with `trendify render`, or launch an interactive FastAPI dashboard with `trendify viewer` to browse tags, tables, and interactive plots in the browser.
100
+
101
+ ---
102
+
103
+ ## Why use `trendify`?
104
+
105
+ - **Scalable.** Throughput stays flat whether you're processing dozens of runs or tens of thousands.
106
+ - **Memory efficient.** Each run is processed once and cached on disk, nothing needs to stay open or held in memory for the whole sweep. This is critical for processing large amounts of data with less memory than is available when batch processing.
107
+ - **Flexible output.** Render static Matplotlib images and CSV tables for a report, or browse the same data interactively in a live dashboard.
@@ -0,0 +1,65 @@
1
+ <p align="center">
2
+ <img alt="Trendify" src="https://raw.githubusercontent.com/Hydrowelder/trendify/refs/heads/main/docs/assets/read-me-banner.png" style="width: 100%">
3
+ </p>
4
+
5
+ # trendify: Efficient Plotting and Table Building
6
+
7
+ <p align="center">
8
+ <a href="https://pypi.org/project/trendify2/" class="badge-link">
9
+ <img src="https://img.shields.io/pypi/v/trendify2.svg?cacheSeconds=300" alt="PyPI version">
10
+ </a>
11
+ <a href="https://pypi.org/project/trendify2/" class="badge-link">
12
+ <img src="https://img.shields.io/pypi/pyversions/trendify2.svg?cacheSeconds=86400" alt="Python versions">
13
+ </a>
14
+ <a href="https://github.com/Hydrowelder/trendify/actions/workflows/publish.yml" class="badge-link">
15
+ <img src="https://github.com/Hydrowelder/trendify/actions/workflows/publish.yml/badge.svg?branch=main" alt="Tests & Release Status">
16
+ </a>
17
+ <a href="https://github.com/Hydrowelder/trendify/actions/workflows/workflow.yml" class="badge-link">
18
+ <img src="https://raw.githubusercontent.com/Hydrowelder/trendify/refs/heads/main/docs/assets/coverage-badge.svg" alt="Coverage">
19
+ </a>
20
+ <a href="https://github.com/astral-sh/ruff" class="badge-link">
21
+ <img src="https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json" alt="Ruff">
22
+ </a>
23
+ <a href="https://docs.pydantic.dev/latest/" class="badge-link">
24
+ <img src="https://img.shields.io/badge/Pydantic-v2-FF43A1?logo=pydantic&logoColor=white" alt="Pydantic v2">
25
+ </a>
26
+ <a href="https://opensource.org/licenses/MIT" class="badge-link">
27
+ <img src="https://img.shields.io/badge/License-MIT-blue.svg" alt="License">
28
+ </a>
29
+ <a href="https://Hydrowelder.github.io/trendify/" class="badge-link">
30
+ <img src="https://img.shields.io/badge/docs-GitHub_Pages-blue.svg" alt="Documentation">
31
+ </a>
32
+ </p>
33
+
34
+ ---
35
+
36
+ ## Installation
37
+
38
+ Install the package via your preferred manager:
39
+
40
+ ```bash linenums="0"
41
+ uv add trendify2
42
+ ```
43
+
44
+ or with `pip`:
45
+
46
+ ```bash linenums="0"
47
+ pip install trendify2
48
+ ```
49
+
50
+ ---
51
+
52
+ ## Core Features
53
+
54
+ - **Built to scale**: process thousands of runs without holding every run's data in memory at once. Throughput stays flat whether you have dozens of runs or tens of thousands.
55
+ - **Typed records, no migrations**: points, traces, tables, and histograms are validated [Pydantic](https://docs.pydantic.dev/latest/) models. Add your own record types anytime without writing a schema migration.
56
+ - **Parallelizable**: `trendify generate` can fan your processing function out across multiple CPU cores with `--n-procs`, with multiprocessing-safe logging that funnels every worker's output through a single queue.
57
+ - **Static assets or a live dashboard**: render tagged data straight to Matplotlib images and CSV tables with `trendify render`, or launch an interactive FastAPI dashboard with `trendify viewer` to browse tags, tables, and interactive plots in the browser.
58
+
59
+ ---
60
+
61
+ ## Why use `trendify`?
62
+
63
+ - **Scalable.** Throughput stays flat whether you're processing dozens of runs or tens of thousands.
64
+ - **Memory efficient.** Each run is processed once and cached on disk, nothing needs to stay open or held in memory for the whole sweep. This is critical for processing large amounts of data with less memory than is available when batch processing.
65
+ - **Flexible output.** Render static Matplotlib images and CSV tables for a report, or browse the same data interactively in a live dashboard.