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.
- trendify2-2.0.4/.github/workflows/docs.yml +31 -0
- trendify2-2.0.4/.github/workflows/publish.yml +80 -0
- trendify2-2.0.4/.gitignore +41 -0
- trendify2-2.0.4/.pre-commit-config.yaml +57 -0
- trendify2-2.0.4/.python-version +1 -0
- trendify2-2.0.4/CHANGELOG.md +130 -0
- trendify2-2.0.4/LICENSE.txt +21 -0
- trendify2-2.0.4/PKG-INFO +107 -0
- trendify2-2.0.4/README.md +65 -0
- trendify2-2.0.4/docs/assets/gh-social.png +0 -0
- trendify2-2.0.4/docs/assets/logo.svg +803 -0
- trendify2-2.0.4/docs/assets/logo_pink.svg +3 -0
- trendify2-2.0.4/docs/assets/logo_pink_white_bg.svg +11 -0
- trendify2-2.0.4/docs/assets/main-logo-white-bg.svg +75 -0
- trendify2-2.0.4/docs/assets/main-logo.svg +66 -0
- trendify2-2.0.4/docs/assets/read-me-banner.png +0 -0
- trendify2-2.0.4/docs/assets/read-me-banner.svg +157 -0
- trendify2-2.0.4/docs/assets/static/scatter_plot.jpg +0 -0
- trendify2-2.0.4/docs/assets/static/table_melted.csv +31 -0
- trendify2-2.0.4/docs/assets/static/table_pivot.csv +11 -0
- trendify2-2.0.4/docs/assets/static/table_stats.csv +4 -0
- trendify2-2.0.4/docs/assets/static/trace_plot.jpg +0 -0
- trendify2-2.0.4/docs/changelog.md +1 -0
- trendify2-2.0.4/docs/css/extra.css +122 -0
- trendify2-2.0.4/docs/example_data/.gitignore +2 -0
- trendify2-2.0.4/docs/example_data/trendify/assets/batch_means_table_melted.csv +61 -0
- trendify2-2.0.4/docs/example_data/trendify/assets/batch_means_table_melted.md +62 -0
- trendify2-2.0.4/docs/example_data/trendify/assets/batch_means_table_pivot.csv +21 -0
- trendify2-2.0.4/docs/example_data/trendify/assets/batch_means_table_pivot.md +22 -0
- trendify2-2.0.4/docs/example_data/trendify/assets/batch_means_table_stats.csv +4 -0
- trendify2-2.0.4/docs/example_data/trendify/assets/batch_means_table_stats.md +5 -0
- trendify2-2.0.4/docs/example_data/trendify/assets/harmonic_mean_distribution.svg +859 -0
- trendify2-2.0.4/docs/example_data/trendify/assets/run_means_tracking.svg +796 -0
- trendify2-2.0.4/docs/example_data/trendify/assets/signature_correlation.svg +2133 -0
- trendify2-2.0.4/docs/example_data/trendify/assets/time_series.svg +6255 -0
- trendify2-2.0.4/docs/example_generator.py +201 -0
- trendify2-2.0.4/docs/hooks.py +25 -0
- trendify2-2.0.4/docs/index.md +82 -0
- trendify2-2.0.4/docs/javascripts/katex.js +10 -0
- trendify2-2.0.4/docs/javascripts/tablesort.js +6 -0
- trendify2-2.0.4/docs/redraw_plots.sh +16 -0
- trendify2-2.0.4/docs/user-guide.md +213 -0
- trendify2-2.0.4/mkdocs.yml +175 -0
- trendify2-2.0.4/pyproject.toml +160 -0
- trendify2-2.0.4/requirements.txt +1159 -0
- trendify2-2.0.4/scripts/embed_demo.py +162 -0
- trendify2-2.0.4/scripts/gen_ts_models.py +243 -0
- trendify2-2.0.4/scripts/matrix_generator.py +910 -0
- trendify2-2.0.4/scripts/run.sh +17 -0
- trendify2-2.0.4/scripts/sweep_procs.py +40 -0
- trendify2-2.0.4/scripts/verify_changelog_by_tag.py +82 -0
- trendify2-2.0.4/src/trendify/__about__.py +14 -0
- trendify2-2.0.4/src/trendify/__init__.py +250 -0
- trendify2-2.0.4/src/trendify/base/__init__.py +36 -0
- trendify2-2.0.4/src/trendify/base/helpers.py +76 -0
- trendify2-2.0.4/src/trendify/base/pen.py +161 -0
- trendify2-2.0.4/src/trendify/base/record.py +148 -0
- trendify2-2.0.4/src/trendify/cli.py +403 -0
- trendify2-2.0.4/src/trendify/color.py +260 -0
- trendify2-2.0.4/src/trendify/examples.py +474 -0
- trendify2-2.0.4/src/trendify/formats/__init__.py +28 -0
- trendify2-2.0.4/src/trendify/formats/format2d.py +128 -0
- trendify2-2.0.4/src/trendify/formats/table.py +55 -0
- trendify2-2.0.4/src/trendify/generator/__init__.py +38 -0
- trendify2-2.0.4/src/trendify/generator/generate.py +167 -0
- trendify2-2.0.4/src/trendify/generator/histogrammer.py +62 -0
- trendify2-2.0.4/src/trendify/generator/render.py +195 -0
- trendify2-2.0.4/src/trendify/generator/table_builder.py +194 -0
- trendify2-2.0.4/src/trendify/generator/xy_data_plotter.py +195 -0
- trendify2-2.0.4/src/trendify/log.py +195 -0
- trendify2-2.0.4/src/trendify/pipeline.py +136 -0
- trendify2-2.0.4/src/trendify/plotting/__init__.py +48 -0
- trendify2-2.0.4/src/trendify/plotting/axline.py +122 -0
- trendify2-2.0.4/src/trendify/plotting/figure.py +389 -0
- trendify2-2.0.4/src/trendify/plotting/histogram.py +282 -0
- trendify2-2.0.4/src/trendify/plotting/point.py +89 -0
- trendify2-2.0.4/src/trendify/plotting/scatter.py +100 -0
- trendify2-2.0.4/src/trendify/plotting/trace.py +129 -0
- trendify2-2.0.4/src/trendify/progress.py +43 -0
- trendify2-2.0.4/src/trendify/store/__init__.py +30 -0
- trendify2-2.0.4/src/trendify/store/db.py +119 -0
- trendify2-2.0.4/src/trendify/store/record_store.py +448 -0
- trendify2-2.0.4/src/trendify/store/tags.py +65 -0
- trendify2-2.0.4/src/trendify/styling/__init__.py +30 -0
- trendify2-2.0.4/src/trendify/styling/grid.py +125 -0
- trendify2-2.0.4/src/trendify/styling/legend.py +217 -0
- trendify2-2.0.4/src/trendify/styling/marker.py +168 -0
- trendify2-2.0.4/src/trendify/typing.py +26 -0
- trendify2-2.0.4/src/trendify/viewer/__init__.py +41 -0
- trendify2-2.0.4/src/trendify/viewer/app.py +208 -0
- trendify2-2.0.4/src/trendify/viewer/hydration.py +181 -0
- trendify2-2.0.4/src/trendify/viewer/plot_config.py +102 -0
- trendify2-2.0.4/src/trendify/viewer/routes/__init__.py +6 -0
- trendify2-2.0.4/src/trendify/viewer/routes/api.py +360 -0
- trendify2-2.0.4/src/trendify/viewer/routes/pages.py +39 -0
- trendify2-2.0.4/src/trendify/viewer/tag_tree.py +148 -0
- trendify2-2.0.4/src/trendify/viewer/templates/base.html +63 -0
- trendify2-2.0.4/src/trendify/viewer/templates/index.html +131 -0
- trendify2-2.0.4/src/trendify/viewer/templates/partials/__init__.py +1 -0
- trendify2-2.0.4/src/trendify/viewer/templates/partials/footer.html +15 -0
- trendify2-2.0.4/src/trendify/viewer/templates/partials/nav.html +181 -0
- trendify2-2.0.4/src/trendify/viewer/templates/partials/plot_view.html +221 -0
- trendify2-2.0.4/src/trendify/viewer/templates/partials/sidebar.html +163 -0
- trendify2-2.0.4/src/trendify/viewer/templates/partials/table_view.html +43 -0
- trendify2-2.0.4/src/trendify/viewer/templates/static/__init__.py +1 -0
- trendify2-2.0.4/src/trendify/viewer/templates/static/assets/__init__.py +1 -0
- trendify2-2.0.4/src/trendify/viewer/templates/static/assets/main-logo-white-bg.svg +75 -0
- trendify2-2.0.4/src/trendify/viewer/templates/static/assets/main-logo.svg +66 -0
- trendify2-2.0.4/src/trendify/viewer/templates/static/css/app.css +75 -0
- trendify2-2.0.4/src/trendify/viewer/templates/static/js/main.js +2 -0
- trendify2-2.0.4/src/trendify/viewer/templates/static/ts/build.mjs +23 -0
- trendify2-2.0.4/src/trendify/viewer/templates/static/ts/package-lock.json +563 -0
- trendify2-2.0.4/src/trendify/viewer/templates/static/ts/package.json +16 -0
- trendify2-2.0.4/src/trendify/viewer/templates/static/ts/src/lib/api.ts +149 -0
- trendify2-2.0.4/src/trendify/viewer/templates/static/ts/src/lib/clipboard.ts +31 -0
- trendify2-2.0.4/src/trendify/viewer/templates/static/ts/src/lib/connection.ts +56 -0
- trendify2-2.0.4/src/trendify/viewer/templates/static/ts/src/lib/content-tabs.ts +27 -0
- trendify2-2.0.4/src/trendify/viewer/templates/static/ts/src/lib/fullscreen.ts +33 -0
- trendify2-2.0.4/src/trendify/viewer/templates/static/ts/src/lib/local-storage.ts +46 -0
- trendify2-2.0.4/src/trendify/viewer/templates/static/ts/src/lib/metadata-filter.ts +98 -0
- trendify2-2.0.4/src/trendify/viewer/templates/static/ts/src/lib/plot-config.generated.ts +105 -0
- trendify2-2.0.4/src/trendify/viewer/templates/static/ts/src/lib/plot-view.ts +374 -0
- trendify2-2.0.4/src/trendify/viewer/templates/static/ts/src/lib/plotly-toast-bridge.ts +31 -0
- trendify2-2.0.4/src/trendify/viewer/templates/static/ts/src/lib/prefetch.ts +142 -0
- trendify2-2.0.4/src/trendify/viewer/templates/static/ts/src/lib/resize.ts +62 -0
- trendify2-2.0.4/src/trendify/viewer/templates/static/ts/src/lib/schema-validate.ts +6 -0
- trendify2-2.0.4/src/trendify/viewer/templates/static/ts/src/lib/sidebar-filter.ts +30 -0
- trendify2-2.0.4/src/trendify/viewer/templates/static/ts/src/lib/sidebar-node.ts +49 -0
- trendify2-2.0.4/src/trendify/viewer/templates/static/ts/src/lib/table-view.ts +294 -0
- trendify2-2.0.4/src/trendify/viewer/templates/static/ts/src/lib/theme.ts +52 -0
- trendify2-2.0.4/src/trendify/viewer/templates/static/ts/src/lib/toast.ts +125 -0
- trendify2-2.0.4/src/trendify/viewer/templates/static/ts/src/lib/url-state.ts +57 -0
- trendify2-2.0.4/src/trendify/viewer/templates/static/ts/src/main.ts +108 -0
- trendify2-2.0.4/src/trendify/viewer/templates/static/ts/src/types/global.d.ts +22 -0
- trendify2-2.0.4/src/trendify/viewer/templates/static/ts/tsconfig.json +16 -0
- trendify2-2.0.4/src/trendify/viewer/templates/static/vendored/__init__.py +1 -0
- trendify2-2.0.4/src/trendify/viewer/templates/static/vendored/alpine-3.15.12.min.js +5 -0
- trendify2-2.0.4/src/trendify/viewer/templates/static/vendored/alpine-LICENSE.md +21 -0
- trendify2-2.0.4/src/trendify/viewer/templates/static/vendored/dataTables-LICENSE.txt +3 -0
- trendify2-2.0.4/src/trendify/viewer/templates/static/vendored/dataTables.dataTables.min.css +1 -0
- trendify2-2.0.4/src/trendify/viewer/templates/static/vendored/dataTables.min.js +4 -0
- trendify2-2.0.4/src/trendify/viewer/templates/static/vendored/jquery-3.7.1.min.js +2 -0
- trendify2-2.0.4/src/trendify/viewer/templates/static/vendored/jquery-LICENSE.txt +3 -0
- trendify2-2.0.4/src/trendify/viewer/templates/static/vendored/plotly-3.6.0.min.js +3882 -0
- trendify2-2.0.4/src/trendify/viewer/templates/static/vendored/plotly-LICENSE.txt +21 -0
- trendify2-2.0.4/src/trendify/viewer/templates/static/vendored/tailwind-4.3.2.global.js +947 -0
- trendify2-2.0.4/src/trendify/viewer/templates/static/vendored/tailwind-LICENSE +21 -0
- trendify2-2.0.4/tests/test_axline.py +100 -0
- trendify2-2.0.4/tests/test_cli.py +289 -0
- trendify2-2.0.4/tests/test_db.py +37 -0
- trendify2-2.0.4/tests/test_examples.py +104 -0
- trendify2-2.0.4/tests/test_figure.py +213 -0
- trendify2-2.0.4/tests/test_generate.py +131 -0
- trendify2-2.0.4/tests/test_histogram.py +131 -0
- trendify2-2.0.4/tests/test_hydration.py +178 -0
- trendify2-2.0.4/tests/test_marker.py +69 -0
- trendify2-2.0.4/tests/test_pen.py +109 -0
- trendify2-2.0.4/tests/test_pipeline.py +77 -0
- trendify2-2.0.4/tests/test_record.py +44 -0
- trendify2-2.0.4/tests/test_record_store.py +326 -0
- trendify2-2.0.4/tests/test_render.py +198 -0
- trendify2-2.0.4/tests/test_scatter.py +45 -0
- trendify2-2.0.4/tests/test_table_builder.py +138 -0
- trendify2-2.0.4/tests/test_viewer_api.py +278 -0
- trendify2-2.0.4/tests/test_viewer_embedding.py +349 -0
- trendify2-2.0.4/tests/test_xy_data_plotter.py +216 -0
- 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.
|
trendify2-2.0.4/PKG-INFO
ADDED
|
@@ -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.
|
|
Binary file
|