tif1 0.2.0__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.
- tif1-0.2.0/.codex +0 -0
- tif1-0.2.0/.github/RELEASE_CHECKLIST.md +131 -0
- tif1-0.2.0/.github/dependabot.yml +32 -0
- tif1-0.2.0/.github/workflows/ci.yml +60 -0
- tif1-0.2.0/.github/workflows/docs-preview.yml +89 -0
- tif1-0.2.0/.github/workflows/docs.yml +84 -0
- tif1-0.2.0/.github/workflows/publish.yml +104 -0
- tif1-0.2.0/.github/workflows/release.yml +53 -0
- tif1-0.2.0/.github/workflows/wheels.yml +66 -0
- tif1-0.2.0/.gitignore +221 -0
- tif1-0.2.0/.kiro/skills/mintlify/SKILL.md +343 -0
- tif1-0.2.0/AGENTS.md +51 -0
- tif1-0.2.0/CHANGELOG.md +181 -0
- tif1-0.2.0/COMPATIBILITY.md +32 -0
- tif1-0.2.0/CONTRIBUTING.md +153 -0
- tif1-0.2.0/LICENSE +21 -0
- tif1-0.2.0/MANIFEST.in +6 -0
- tif1-0.2.0/PKG-INFO +412 -0
- tif1-0.2.0/README.md +356 -0
- tif1-0.2.0/TOOLS.md +89 -0
- tif1-0.2.0/docs/README.md +119 -0
- tif1-0.2.0/docs/VERSIONING.md +141 -0
- tif1-0.2.0/docs/api-reference/async-fetch.mdx +387 -0
- tif1-0.2.0/docs/api-reference/cache.mdx +190 -0
- tif1-0.2.0/docs/api-reference/cdn.mdx +432 -0
- tif1-0.2.0/docs/api-reference/cli.mdx +367 -0
- tif1-0.2.0/docs/api-reference/config.mdx +839 -0
- tif1-0.2.0/docs/api-reference/core-utils.mdx +463 -0
- tif1-0.2.0/docs/api-reference/core.mdx +1012 -0
- tif1-0.2.0/docs/api-reference/events.mdx +636 -0
- tif1-0.2.0/docs/api-reference/exceptions.mdx +388 -0
- tif1-0.2.0/docs/api-reference/fastf1-compat.mdx +256 -0
- tif1-0.2.0/docs/api-reference/fuzzy.mdx +387 -0
- tif1-0.2.0/docs/api-reference/http-session.mdx +313 -0
- tif1-0.2.0/docs/api-reference/http.mdx +649 -0
- tif1-0.2.0/docs/api-reference/io-pipeline.mdx +429 -0
- tif1-0.2.0/docs/api-reference/jupyter.mdx +473 -0
- tif1-0.2.0/docs/api-reference/lap-operations.mdx +569 -0
- tif1-0.2.0/docs/api-reference/models.mdx +819 -0
- tif1-0.2.0/docs/api-reference/overview.mdx +358 -0
- tif1-0.2.0/docs/api-reference/plotting.mdx +259 -0
- tif1-0.2.0/docs/api-reference/retry.mdx +629 -0
- tif1-0.2.0/docs/api-reference/schedule.mdx +311 -0
- tif1-0.2.0/docs/api-reference/types.mdx +650 -0
- tif1-0.2.0/docs/api-reference/utilities.mdx +539 -0
- tif1-0.2.0/docs/api-reference/utils.mdx +320 -0
- tif1-0.2.0/docs/api-reference/validation.mdx +779 -0
- tif1-0.2.0/docs/architecture.mdx +101 -0
- tif1-0.2.0/docs/assets/annotated_speed_trace.png +0 -0
- tif1-0.2.0/docs/assets/downforce_levels.png +0 -0
- tif1-0.2.0/docs/assets/driver_laptimes_example.png +0 -0
- tif1-0.2.0/docs/assets/gear_shifts_on_track.png +0 -0
- tif1-0.2.0/docs/assets/generate_all_charts.py +1185 -0
- tif1-0.2.0/docs/assets/generate_annotated_speed_trace.py +73 -0
- tif1-0.2.0/docs/assets/generate_downforce_levels.py +94 -0
- tif1-0.2.0/docs/assets/generate_driver_laptimes.py +54 -0
- tif1-0.2.0/docs/assets/generate_gear_shifts.py +64 -0
- tif1-0.2.0/docs/assets/generate_gg_diagram.py +198 -0
- tif1-0.2.0/docs/assets/generate_lap_delta.py +84 -0
- tif1-0.2.0/docs/assets/generate_laptime_heatmap.py +63 -0
- tif1-0.2.0/docs/assets/generate_laptimes_distribution.py +95 -0
- tif1-0.2.0/docs/assets/generate_multi_driver_speed_comparison.py +74 -0
- tif1-0.2.0/docs/assets/generate_position_changes.py +48 -0
- tif1-0.2.0/docs/assets/generate_qualifying_grid.py +94 -0
- tif1-0.2.0/docs/assets/generate_speed_traces.py +51 -0
- tif1-0.2.0/docs/assets/generate_telemetry_comparison.py +230 -0
- tif1-0.2.0/docs/assets/generate_throttle_distance.py +104 -0
- tif1-0.2.0/docs/assets/generate_tire_degradation.py +119 -0
- tif1-0.2.0/docs/assets/generate_top_speeds.py +73 -0
- tif1-0.2.0/docs/assets/generate_track_acceleration_map.py +49 -0
- tif1-0.2.0/docs/assets/generate_track_brake_zones.py +44 -0
- tif1-0.2.0/docs/assets/generate_track_speed_map.py +43 -0
- tif1-0.2.0/docs/assets/generate_track_temperature.py +50 -0
- tif1-0.2.0/docs/assets/generate_track_throttle_map.py +43 -0
- tif1-0.2.0/docs/assets/gg_diagram.png +0 -0
- tif1-0.2.0/docs/assets/hero_banner.png +0 -0
- tif1-0.2.0/docs/assets/lap_delta.png +0 -0
- tif1-0.2.0/docs/assets/laptime_heatmap.png +0 -0
- tif1-0.2.0/docs/assets/laptimes_distribution.png +0 -0
- tif1-0.2.0/docs/assets/multi_driver_speed_comparison.png +0 -0
- tif1-0.2.0/docs/assets/qualifying_grid.png +0 -0
- tif1-0.2.0/docs/assets/race_pace_boxplot.png +0 -0
- tif1-0.2.0/docs/assets/race_position_changes.png +0 -0
- tif1-0.2.0/docs/assets/race_tire_strategy.png +0 -0
- tif1-0.2.0/docs/assets/speed_traces.png +0 -0
- tif1-0.2.0/docs/assets/telemetry_comparison.png +0 -0
- tif1-0.2.0/docs/assets/throttle_distance.png +0 -0
- tif1-0.2.0/docs/assets/tire_degradation.png +0 -0
- tif1-0.2.0/docs/assets/top_speeds.png +0 -0
- tif1-0.2.0/docs/assets/track_temperature.png +0 -0
- tif1-0.2.0/docs/concepts/backends.mdx +358 -0
- tif1-0.2.0/docs/concepts/caching-strategy.mdx +426 -0
- tif1-0.2.0/docs/concepts/cli.mdx +111 -0
- tif1-0.2.0/docs/concepts/data-flow.mdx +455 -0
- tif1-0.2.0/docs/concepts/jupyter.mdx +93 -0
- tif1-0.2.0/docs/concepts/sessions.mdx +248 -0
- tif1-0.2.0/docs/design_language.md +134 -0
- tif1-0.2.0/docs/docs.json +252 -0
- tif1-0.2.0/docs/examples.mdx +465 -0
- tif1-0.2.0/docs/favicon.svg +9 -0
- tif1-0.2.0/docs/getting-started.mdx +402 -0
- tif1-0.2.0/docs/guides/best-practices.mdx +524 -0
- tif1-0.2.0/docs/guides/common-use-cases.mdx +468 -0
- tif1-0.2.0/docs/guides/data-visualization.mdx +344 -0
- tif1-0.2.0/docs/guides/error-handling.mdx +428 -0
- tif1-0.2.0/docs/installation.mdx +115 -0
- tif1-0.2.0/docs/introduction.mdx +136 -0
- tif1-0.2.0/docs/logo/dark.svg +12 -0
- tif1-0.2.0/docs/logo/light.svg +13 -0
- tif1-0.2.0/docs/migration-from-fastf1.mdx +154 -0
- tif1-0.2.0/docs/quickstart.mdx +116 -0
- tif1-0.2.0/docs/reference/cli-commands.mdx +473 -0
- tif1-0.2.0/docs/reference/contributing.mdx +120 -0
- tif1-0.2.0/docs/reference/data-schema.mdx +135 -0
- tif1-0.2.0/docs/reference/environment-variables.mdx +317 -0
- tif1-0.2.0/docs/reference/faq.mdx +625 -0
- tif1-0.2.0/docs/reference/troubleshooting.mdx +149 -0
- tif1-0.2.0/docs/style.css +73 -0
- tif1-0.2.0/docs/tutorials/advanced-telemetry.mdx +339 -0
- tif1-0.2.0/docs/tutorials/annotated-speed-trace.mdx +201 -0
- tif1-0.2.0/docs/tutorials/data-export.mdx +339 -0
- tif1-0.2.0/docs/tutorials/downforce-levels.mdx +249 -0
- tif1-0.2.0/docs/tutorials/driver-laptimes.mdx +265 -0
- tif1-0.2.0/docs/tutorials/gear-shifts-on-track.mdx +168 -0
- tif1-0.2.0/docs/tutorials/gg-diagram.mdx +271 -0
- tif1-0.2.0/docs/tutorials/lap-delta-comparison.mdx +309 -0
- tif1-0.2.0/docs/tutorials/laptime-heatmap.mdx +291 -0
- tif1-0.2.0/docs/tutorials/laptimes-distribution.mdx +351 -0
- tif1-0.2.0/docs/tutorials/multi-driver-speed-comparison.mdx +236 -0
- tif1-0.2.0/docs/tutorials/position-changes.mdx +123 -0
- tif1-0.2.0/docs/tutorials/qualifying-analysis.mdx +346 -0
- tif1-0.2.0/docs/tutorials/qualifying-results.mdx +284 -0
- tif1-0.2.0/docs/tutorials/race-analysis.mdx +510 -0
- tif1-0.2.0/docs/tutorials/race-pace-analysis.mdx +102 -0
- tif1-0.2.0/docs/tutorials/speed-traces.mdx +127 -0
- tif1-0.2.0/docs/tutorials/telemetry-comparison.mdx +170 -0
- tif1-0.2.0/docs/tutorials/throttle-distance.mdx +254 -0
- tif1-0.2.0/docs/tutorials/tire-degradation.mdx +256 -0
- tif1-0.2.0/docs/tutorials/tire-strategy.mdx +109 -0
- tif1-0.2.0/docs/tutorials/top-speeds.mdx +191 -0
- tif1-0.2.0/docs/tutorials/track-acceleration-map.mdx +168 -0
- tif1-0.2.0/docs/tutorials/track-brake-zones.mdx +146 -0
- tif1-0.2.0/docs/tutorials/track-speed-map.mdx +151 -0
- tif1-0.2.0/docs/tutorials/track-temperature.mdx +135 -0
- tif1-0.2.0/docs/tutorials/track-throttle-map.mdx +129 -0
- tif1-0.2.0/docs/tutorials/weather-impact.mdx +370 -0
- tif1-0.2.0/examples/README.md +112 -0
- tif1-0.2.0/examples/async_loading.py +62 -0
- tif1-0.2.0/examples/basic_usage.py +57 -0
- tif1-0.2.0/examples/cache_management.py +84 -0
- tif1-0.2.0/examples/data_exploration.py +130 -0
- tif1-0.2.0/examples/error_handling.py +111 -0
- tif1-0.2.0/examples/event_lookup_examples.py +41 -0
- tif1-0.2.0/examples/fast_telemetry.py +68 -0
- tif1-0.2.0/examples/fastest_laps.py +124 -0
- tif1-0.2.0/examples/fastest_telemetry.py +59 -0
- tif1-0.2.0/examples/get_event_by_name_example.py +26 -0
- tif1-0.2.0/examples/get_event_by_round_example.py +20 -0
- tif1-0.2.0/examples/new_features_demo.py +173 -0
- tif1-0.2.0/examples/plotting_colors_demo.py +141 -0
- tif1-0.2.0/examples/polars_backend.py +90 -0
- tif1-0.2.0/examples/sqlite_cache.py +25 -0
- tif1-0.2.0/prek.toml +40 -0
- tif1-0.2.0/project-architecture.md +410 -0
- tif1-0.2.0/pyproject.toml +160 -0
- tif1-0.2.0/race_position_changes.png +0 -0
- tif1-0.2.0/scripts/baseline_benchmark.py +436 -0
- tif1-0.2.0/scripts/baseline_results/baseline_results.json +104 -0
- tif1-0.2.0/src/tif1/__init__.py +139 -0
- tif1-0.2.0/src/tif1/async_fetch.py +717 -0
- tif1-0.2.0/src/tif1/cache.py +529 -0
- tif1-0.2.0/src/tif1/cdn.py +155 -0
- tif1-0.2.0/src/tif1/cli.py +194 -0
- tif1-0.2.0/src/tif1/config.py +310 -0
- tif1-0.2.0/src/tif1/core.py +5960 -0
- tif1-0.2.0/src/tif1/core_utils/__init__.py +57 -0
- tif1-0.2.0/src/tif1/core_utils/backend_conversion.py +104 -0
- tif1-0.2.0/src/tif1/core_utils/constants.py +197 -0
- tif1-0.2.0/src/tif1/core_utils/helpers.py +362 -0
- tif1-0.2.0/src/tif1/core_utils/json_utils.py +51 -0
- tif1-0.2.0/src/tif1/core_utils/resource_manager.py +138 -0
- tif1-0.2.0/src/tif1/data/schedules/f1schedule/schedule_2018.json +439 -0
- tif1-0.2.0/src/tif1/data/schedules/f1schedule/schedule_2019.json +439 -0
- tif1-0.2.0/src/tif1/data/schedules/f1schedule/schedule_2020.json +401 -0
- tif1-0.2.0/src/tif1/data/schedules/f1schedule/schedule_2021.json +477 -0
- tif1-0.2.0/src/tif1/data/schedules/f1schedule/schedule_2022.json +496 -0
- tif1-0.2.0/src/tif1/data/schedules/f1schedule/schedule_2023.json +477 -0
- tif1-0.2.0/src/tif1/data/schedules/f1schedule/schedule_2024.json +515 -0
- tif1-0.2.0/src/tif1/data/schedules/f1schedule/schedule_2025.json +515 -0
- tif1-0.2.0/src/tif1/data/schedules/f1schedule/schedule_2026.json +496 -0
- tif1-0.2.0/src/tif1/events.py +613 -0
- tif1-0.2.0/src/tif1/exceptions.py +99 -0
- tif1-0.2.0/src/tif1/fastf1_compat.py +256 -0
- tif1-0.2.0/src/tif1/fuzzy.py +78 -0
- tif1-0.2.0/src/tif1/http_session.py +254 -0
- tif1-0.2.0/src/tif1/io_pipeline.py +19 -0
- tif1-0.2.0/src/tif1/jupyter.py +199 -0
- tif1-0.2.0/src/tif1/lap_ops.py +10 -0
- tif1-0.2.0/src/tif1/models.py +13 -0
- tif1-0.2.0/src/tif1/plotting.py +1063 -0
- tif1-0.2.0/src/tif1/plotting_constants.py +535 -0
- tif1-0.2.0/src/tif1/retry.py +238 -0
- tif1-0.2.0/src/tif1/schedule_schema.py +55 -0
- tif1-0.2.0/src/tif1/session.py +5 -0
- tif1-0.2.0/src/tif1/types.py +194 -0
- tif1-0.2.0/src/tif1/utils.py +42 -0
- tif1-0.2.0/src/tif1/validation.py +723 -0
- tif1-0.2.0/tests/benchmarks/__init__.py +1 -0
- tif1-0.2.0/tests/benchmarks/test_async_fetch_batch_benchmark.py +155 -0
- tif1-0.2.0/tests/benchmarks/test_async_fetch_cache_hit_benchmark.py +115 -0
- tif1-0.2.0/tests/benchmarks/test_async_parallelism_validation.py +331 -0
- tif1-0.2.0/tests/benchmarks/test_benchmarks.py +123 -0
- tif1-0.2.0/tests/benchmarks/test_cache_benchmark.py +266 -0
- tif1-0.2.0/tests/benchmarks/test_cache_memory_lookup_benchmark.py +124 -0
- tif1-0.2.0/tests/benchmarks/test_cache_performance.py +430 -0
- tif1-0.2.0/tests/benchmarks/test_cache_serialization_benchmark.py +108 -0
- tif1-0.2.0/tests/benchmarks/test_core_driver_benchmark.py +78 -0
- tif1-0.2.0/tests/benchmarks/test_core_driver_info_lookup_benchmark.py +86 -0
- tif1-0.2.0/tests/benchmarks/test_core_fastest_laps_cold_benchmark.py +118 -0
- tif1-0.2.0/tests/benchmarks/test_core_get_lap_benchmark.py +109 -0
- tif1-0.2.0/tests/benchmarks/test_core_notebook_workflow_benchmark.py +187 -0
- tif1-0.2.0/tests/benchmarks/test_core_real_cold_start_benchmark.py +399 -0
- tif1-0.2.0/tests/benchmarks/test_core_telemetry_batch_benchmark.py +128 -0
- tif1-0.2.0/tests/benchmarks/test_dataframe_performance.py +429 -0
- tif1-0.2.0/tests/benchmarks/test_events_performance_benchmark.py +57 -0
- tif1-0.2.0/tests/benchmarks/test_laptime_filter_benchmark.py +92 -0
- tif1-0.2.0/tests/benchmarks/test_retry_circuit_benchmark.py +157 -0
- tif1-0.2.0/tests/benchmarks/test_validation_anomaly_micro_benchmark.py +111 -0
- tif1-0.2.0/tests/benchmarks/test_validation_benchmark.py +107 -0
- tif1-0.2.0/tests/benchmarks/test_validation_lengths_check_benchmark.py +174 -0
- tif1-0.2.0/tests/benchmarks/test_validation_telemetry_flags_benchmark.py +114 -0
- tif1-0.2.0/tests/conftest.py +25 -0
- tif1-0.2.0/tests/integration/__init__.py +1 -0
- tif1-0.2.0/tests/integration/test_integration.py +118 -0
- tif1-0.2.0/tests/property/__init__.py +1 -0
- tif1-0.2.0/tests/property/test_async_properties.py +549 -0
- tif1-0.2.0/tests/property/test_cache_properties.py +617 -0
- tif1-0.2.0/tests/property/test_circuit_breaker_properties.py +423 -0
- tif1-0.2.0/tests/property/test_config_properties.py +429 -0
- tif1-0.2.0/tests/property/test_resource_properties.py +629 -0
- tif1-0.2.0/tests/property/test_sync_async_equivalence.py +503 -0
- tif1-0.2.0/tests/unit/__init__.py +1 -0
- tif1-0.2.0/tests/unit/test_async_fetch.py +933 -0
- tif1-0.2.0/tests/unit/test_async_fetch_cleanup.py +204 -0
- tif1-0.2.0/tests/unit/test_async_fetch_executor.py +137 -0
- tif1-0.2.0/tests/unit/test_async_fetch_rate_limit.py +145 -0
- tif1-0.2.0/tests/unit/test_backend_conversion.py +283 -0
- tif1-0.2.0/tests/unit/test_cache.py +447 -0
- tif1-0.2.0/tests/unit/test_cache_init.py +140 -0
- tif1-0.2.0/tests/unit/test_cdn.py +273 -0
- tif1-0.2.0/tests/unit/test_cli.py +168 -0
- tif1-0.2.0/tests/unit/test_compatibility_coverage.py +268 -0
- tif1-0.2.0/tests/unit/test_concurrent_cache_operations.py +231 -0
- tif1-0.2.0/tests/unit/test_config.py +640 -0
- tif1-0.2.0/tests/unit/test_connection_metrics.py +204 -0
- tif1-0.2.0/tests/unit/test_core.py +860 -0
- tif1-0.2.0/tests/unit/test_core_fastest_laps_cold.py +171 -0
- tif1-0.2.0/tests/unit/test_core_surface_coverage.py +550 -0
- tif1-0.2.0/tests/unit/test_core_ultra_cold.py +360 -0
- tif1-0.2.0/tests/unit/test_coverage_core.py +1868 -0
- tif1-0.2.0/tests/unit/test_coverage_core2.py +916 -0
- tif1-0.2.0/tests/unit/test_coverage_shims_and_utils.py +223 -0
- tif1-0.2.0/tests/unit/test_events.py +455 -0
- tif1-0.2.0/tests/unit/test_exceptions.py +99 -0
- tif1-0.2.0/tests/unit/test_fetch_driver_laps_parallel.py +210 -0
- tif1-0.2.0/tests/unit/test_fuzzing.py +98 -0
- tif1-0.2.0/tests/unit/test_helpers.py +415 -0
- tif1-0.2.0/tests/unit/test_http_session.py +675 -0
- tif1-0.2.0/tests/unit/test_http_session_pool_sizing.py +187 -0
- tif1-0.2.0/tests/unit/test_jupyter.py +227 -0
- tif1-0.2.0/tests/unit/test_laps_dtypes.py +222 -0
- tif1-0.2.0/tests/unit/test_plotting.py +494 -0
- tif1-0.2.0/tests/unit/test_pool_exhaustion.py +387 -0
- tif1-0.2.0/tests/unit/test_resource_cleanup.py +599 -0
- tif1-0.2.0/tests/unit/test_resource_manager.py +270 -0
- tif1-0.2.0/tests/unit/test_retry.py +171 -0
- tif1-0.2.0/tests/unit/test_schedule_schema.py +32 -0
- tif1-0.2.0/tests/unit/test_telemetry_dtypes.py +208 -0
- tif1-0.2.0/tests/unit/test_types.py +159 -0
- tif1-0.2.0/tests/unit/test_validation.py +664 -0
- tif1-0.2.0/uv.lock +2375 -0
tif1-0.2.0/.codex
ADDED
|
File without changes
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
# Release Checklist
|
|
2
|
+
|
|
3
|
+
Use this checklist before creating a new release.
|
|
4
|
+
|
|
5
|
+
## Pre-Release
|
|
6
|
+
|
|
7
|
+
### Code Quality
|
|
8
|
+
- [ ] All tests pass: `uv run pytest tests/ -v`
|
|
9
|
+
- [ ] Linting passes: `uv run ruff check src/ tests/`
|
|
10
|
+
- [ ] Formatting is correct: `uv run ruff format --check src/ tests/`
|
|
11
|
+
- [ ] Type checking passes: `uv run ty check src/tif1`
|
|
12
|
+
- [ ] Coverage meets threshold (80%): Check coverage report
|
|
13
|
+
- [ ] No TODO/FIXME comments in critical paths
|
|
14
|
+
- [ ] All deprecation warnings addressed
|
|
15
|
+
|
|
16
|
+
### Documentation
|
|
17
|
+
- [ ] README.md is up to date
|
|
18
|
+
- [ ] CHANGELOG.md has entry for this version
|
|
19
|
+
- [ ] API documentation is current
|
|
20
|
+
- [ ] Examples work with new version
|
|
21
|
+
- [ ] Migration guide (if breaking changes)
|
|
22
|
+
|
|
23
|
+
### Version & Metadata
|
|
24
|
+
- [ ] Version bumped in `pyproject.toml`
|
|
25
|
+
- [ ] Version follows semantic versioning
|
|
26
|
+
- [ ] Dependencies are up to date
|
|
27
|
+
- [ ] License information is correct
|
|
28
|
+
- [ ] Author/maintainer info is current
|
|
29
|
+
|
|
30
|
+
### Testing
|
|
31
|
+
- [ ] Unit tests pass
|
|
32
|
+
- [ ] Integration tests pass
|
|
33
|
+
- [ ] Property-based tests pass
|
|
34
|
+
- [ ] Benchmarks show no regression
|
|
35
|
+
- [ ] Manual smoke test completed
|
|
36
|
+
- [ ] Tested on Python 3.10, 3.11, 3.12, 3.13, 3.14
|
|
37
|
+
|
|
38
|
+
### Build & Package
|
|
39
|
+
- [ ] Package builds successfully: `uv build`
|
|
40
|
+
- [ ] Package contents verified: `tar -tzf dist/tif1-*.tar.gz`
|
|
41
|
+
- [ ] Wheel builds correctly
|
|
42
|
+
- [ ] No unnecessary files in distribution
|
|
43
|
+
- [ ] Package size is reasonable
|
|
44
|
+
|
|
45
|
+
## Release Process
|
|
46
|
+
|
|
47
|
+
### TestPyPI (Recommended First)
|
|
48
|
+
- [ ] Published to TestPyPI
|
|
49
|
+
- [ ] Installed from TestPyPI successfully
|
|
50
|
+
- [ ] Basic functionality tested from TestPyPI install
|
|
51
|
+
- [ ] Dependencies resolve correctly
|
|
52
|
+
|
|
53
|
+
### PyPI
|
|
54
|
+
- [ ] Published to PyPI
|
|
55
|
+
- [ ] Package visible on PyPI: https://pypi.org/project/tif1/
|
|
56
|
+
- [ ] Metadata displays correctly
|
|
57
|
+
- [ ] README renders properly
|
|
58
|
+
- [ ] Links work (homepage, docs, issues)
|
|
59
|
+
|
|
60
|
+
### Git
|
|
61
|
+
- [ ] Changes committed
|
|
62
|
+
- [ ] Version tag created: `v0.2.0`
|
|
63
|
+
- [ ] Tag pushed to GitHub
|
|
64
|
+
- [ ] Branch is clean
|
|
65
|
+
|
|
66
|
+
### GitHub
|
|
67
|
+
- [ ] GitHub release created
|
|
68
|
+
- [ ] Release notes added
|
|
69
|
+
- [ ] Changelog linked
|
|
70
|
+
- [ ] Assets uploaded (if any)
|
|
71
|
+
|
|
72
|
+
## Post-Release
|
|
73
|
+
|
|
74
|
+
### Verification
|
|
75
|
+
- [ ] Install from PyPI works: `pip install tif1`
|
|
76
|
+
- [ ] Import works: `python -c "import tif1"`
|
|
77
|
+
- [ ] Version correct: `python -c "import tif1; print(tif1.__version__)"`
|
|
78
|
+
- [ ] Basic functionality works
|
|
79
|
+
- [ ] CLI works: `tif1 --version`
|
|
80
|
+
|
|
81
|
+
### Communication
|
|
82
|
+
- [ ] Announcement prepared
|
|
83
|
+
- [ ] Social media posts scheduled
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
### Maintenance
|
|
87
|
+
- [ ] Monitor PyPI download stats
|
|
88
|
+
- [ ] Watch for bug reports
|
|
89
|
+
- [ ] Check CI/CD status
|
|
90
|
+
- [ ] Update project board
|
|
91
|
+
- [ ] Close milestone (if using)
|
|
92
|
+
|
|
93
|
+
### Next Version
|
|
94
|
+
- [ ] Bump to next dev version in `pyproject.toml`
|
|
95
|
+
- [ ] Create new CHANGELOG.md section
|
|
96
|
+
- [ ] Update roadmap
|
|
97
|
+
- [ ] Plan next release
|
|
98
|
+
|
|
99
|
+
## Emergency Rollback
|
|
100
|
+
|
|
101
|
+
If critical issues are found:
|
|
102
|
+
|
|
103
|
+
1. **Yank the release on PyPI** (doesn't delete, but prevents new installs)
|
|
104
|
+
```bash
|
|
105
|
+
# Not directly supported by uv, use twine or PyPI web interface
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
2. **Create hotfix release**
|
|
109
|
+
- Fix the issue
|
|
110
|
+
- Bump patch version (e.g., 0.2.0 → 0.2.1)
|
|
111
|
+
- Follow release process
|
|
112
|
+
|
|
113
|
+
3. **Communicate**
|
|
114
|
+
- Update GitHub release with warning
|
|
115
|
+
- Post announcement about issue
|
|
116
|
+
- Provide workaround if available
|
|
117
|
+
|
|
118
|
+
## Version-Specific Notes
|
|
119
|
+
|
|
120
|
+
### v0.2.0 (Package Rename Release)
|
|
121
|
+
- [ ] Verify PyPI/TestPyPI package name is `tif1`
|
|
122
|
+
- [ ] Confirm install docs no longer reference `tifone`
|
|
123
|
+
- [ ] Validate `import tif1` and `tif1.__version__ == "0.2.0"`
|
|
124
|
+
- [ ] Check release notes mention the package rename
|
|
125
|
+
- [ ] Performance benchmarks documented
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
**Release Manager:** _________________
|
|
130
|
+
**Date:** _________________
|
|
131
|
+
**Version:** _________________
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
version: 2
|
|
2
|
+
updates:
|
|
3
|
+
- package-ecosystem: "pip"
|
|
4
|
+
directory: "/"
|
|
5
|
+
schedule:
|
|
6
|
+
interval: "weekly"
|
|
7
|
+
open-pull-requests-limit: 10
|
|
8
|
+
versioning-strategy: increase
|
|
9
|
+
groups:
|
|
10
|
+
python-dependencies:
|
|
11
|
+
patterns:
|
|
12
|
+
- "*"
|
|
13
|
+
labels:
|
|
14
|
+
- "dependencies"
|
|
15
|
+
- "python"
|
|
16
|
+
commit-message:
|
|
17
|
+
prefix: "chore(deps)"
|
|
18
|
+
|
|
19
|
+
- package-ecosystem: "github-actions"
|
|
20
|
+
directory: "/"
|
|
21
|
+
schedule:
|
|
22
|
+
interval: "weekly"
|
|
23
|
+
open-pull-requests-limit: 10
|
|
24
|
+
groups:
|
|
25
|
+
github-actions:
|
|
26
|
+
patterns:
|
|
27
|
+
- "*"
|
|
28
|
+
labels:
|
|
29
|
+
- "dependencies"
|
|
30
|
+
- "github-actions"
|
|
31
|
+
commit-message:
|
|
32
|
+
prefix: "chore(deps)"
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
name: CI/CD
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main]
|
|
8
|
+
|
|
9
|
+
env:
|
|
10
|
+
UV_VERSION: "0.10.2"
|
|
11
|
+
DEFAULT_PYTHON: "3.10"
|
|
12
|
+
|
|
13
|
+
jobs:
|
|
14
|
+
lint:
|
|
15
|
+
runs-on: ubuntu-latest
|
|
16
|
+
steps:
|
|
17
|
+
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
|
|
18
|
+
|
|
19
|
+
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
|
|
20
|
+
uses: actions/setup-python@v6.2.0
|
|
21
|
+
with:
|
|
22
|
+
python-version: ${{ env.DEFAULT_PYTHON }}
|
|
23
|
+
|
|
24
|
+
- name: Install uv
|
|
25
|
+
run: python -m pip install --disable-pip-version-check "uv==${UV_VERSION}"
|
|
26
|
+
|
|
27
|
+
- name: Install dependencies
|
|
28
|
+
run: python -m uv sync --all-extras
|
|
29
|
+
|
|
30
|
+
- name: Run prek checks
|
|
31
|
+
run: python -m uv run prek run --all-files --show-diff-on-failure
|
|
32
|
+
|
|
33
|
+
test:
|
|
34
|
+
runs-on: ubuntu-latest
|
|
35
|
+
strategy:
|
|
36
|
+
matrix:
|
|
37
|
+
python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"]
|
|
38
|
+
|
|
39
|
+
steps:
|
|
40
|
+
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
|
|
41
|
+
|
|
42
|
+
- name: Set up Python ${{ matrix.python-version }}
|
|
43
|
+
uses: actions/setup-python@v6.2.0
|
|
44
|
+
with:
|
|
45
|
+
python-version: ${{ matrix.python-version }}
|
|
46
|
+
|
|
47
|
+
- name: Install uv
|
|
48
|
+
run: python -m pip install --disable-pip-version-check "uv==${UV_VERSION}"
|
|
49
|
+
|
|
50
|
+
- name: Install dependencies
|
|
51
|
+
run: python -m uv sync --all-extras
|
|
52
|
+
|
|
53
|
+
- name: Run unit tests
|
|
54
|
+
run: |
|
|
55
|
+
python -m uv run pytest -o addopts='' tests/ -v -n auto --dist=loadfile --cov=src/tif1 --cov-report=xml --cov-report=term --cov-fail-under=80 -m "not slow and not integration and not benchmark"
|
|
56
|
+
|
|
57
|
+
- name: Run integration tests
|
|
58
|
+
if: matrix.python-version == env.DEFAULT_PYTHON
|
|
59
|
+
run: |
|
|
60
|
+
python -m uv run pytest -o addopts='' tests/ -v -n 0 --cov=src/tif1 --cov-append --cov-report=xml --cov-report=term -m integration
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
name: Documentation Preview
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
paths:
|
|
6
|
+
- 'docs/**'
|
|
7
|
+
- '.github/workflows/docs-preview.yml'
|
|
8
|
+
|
|
9
|
+
permissions:
|
|
10
|
+
contents: read
|
|
11
|
+
pull-requests: write
|
|
12
|
+
|
|
13
|
+
jobs:
|
|
14
|
+
preview:
|
|
15
|
+
name: Validate Documentation
|
|
16
|
+
runs-on: ubuntu-latest
|
|
17
|
+
|
|
18
|
+
steps:
|
|
19
|
+
- uses: actions/checkout@v6
|
|
20
|
+
|
|
21
|
+
- name: Check for broken links (basic)
|
|
22
|
+
run: |
|
|
23
|
+
cd docs
|
|
24
|
+
# Check for common issues in MDX files
|
|
25
|
+
echo "Checking for broken internal links..."
|
|
26
|
+
|
|
27
|
+
# Find all .mdx files and check for broken relative links
|
|
28
|
+
find . -name "*.mdx" -type f | while read file; do
|
|
29
|
+
echo "Checking $file"
|
|
30
|
+
# This is a basic check - you can enhance it
|
|
31
|
+
grep -n '\[.*\](\.\.*/.*\.mdx)' "$file" || true
|
|
32
|
+
done
|
|
33
|
+
|
|
34
|
+
- name: Validate docs.json
|
|
35
|
+
run: |
|
|
36
|
+
cd docs
|
|
37
|
+
# Check if docs.json is valid JSON
|
|
38
|
+
if ! jq empty docs.json 2>/dev/null; then
|
|
39
|
+
echo "Error: docs.json is not valid JSON"
|
|
40
|
+
exit 1
|
|
41
|
+
fi
|
|
42
|
+
echo "docs.json is valid"
|
|
43
|
+
|
|
44
|
+
- name: Comment on PR
|
|
45
|
+
uses: actions/github-script@v9
|
|
46
|
+
with:
|
|
47
|
+
script: |
|
|
48
|
+
const message = `## 📚 Documentation Preview
|
|
49
|
+
|
|
50
|
+
Your documentation changes have been validated! ✅
|
|
51
|
+
|
|
52
|
+
**Deployment:** Documentation will be automatically deployed to Mintlify when this PR is merged and a new release is published.
|
|
53
|
+
|
|
54
|
+
**Preview locally:**
|
|
55
|
+
\`\`\`bash
|
|
56
|
+
cd docs
|
|
57
|
+
npx mintlify dev
|
|
58
|
+
\`\`\`
|
|
59
|
+
|
|
60
|
+
**Note:** Mintlify auto-deploys from the \`docs-production\` branch. Changes will go live after the next release.
|
|
61
|
+
`;
|
|
62
|
+
|
|
63
|
+
// Check if we already commented
|
|
64
|
+
const { data: comments } = await github.rest.issues.listComments({
|
|
65
|
+
issue_number: context.issue.number,
|
|
66
|
+
owner: context.repo.owner,
|
|
67
|
+
repo: context.repo.repo,
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
const botComment = comments.find(comment =>
|
|
71
|
+
comment.user.type === 'Bot' &&
|
|
72
|
+
comment.body.includes('📚 Documentation Preview')
|
|
73
|
+
);
|
|
74
|
+
|
|
75
|
+
if (botComment) {
|
|
76
|
+
await github.rest.issues.updateComment({
|
|
77
|
+
comment_id: botComment.id,
|
|
78
|
+
owner: context.repo.owner,
|
|
79
|
+
repo: context.repo.repo,
|
|
80
|
+
body: message
|
|
81
|
+
});
|
|
82
|
+
} else {
|
|
83
|
+
await github.rest.issues.createComment({
|
|
84
|
+
issue_number: context.issue.number,
|
|
85
|
+
owner: context.repo.owner,
|
|
86
|
+
repo: context.repo.repo,
|
|
87
|
+
body: message
|
|
88
|
+
});
|
|
89
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
name: Deploy Documentation
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
release:
|
|
5
|
+
types: [published]
|
|
6
|
+
workflow_dispatch:
|
|
7
|
+
inputs:
|
|
8
|
+
version:
|
|
9
|
+
description: 'Version to deploy (e.g., v0.2.0)'
|
|
10
|
+
required: true
|
|
11
|
+
|
|
12
|
+
permissions:
|
|
13
|
+
contents: write
|
|
14
|
+
|
|
15
|
+
jobs:
|
|
16
|
+
deploy-docs:
|
|
17
|
+
name: Push to docs-production branch
|
|
18
|
+
runs-on: ubuntu-latest
|
|
19
|
+
|
|
20
|
+
steps:
|
|
21
|
+
- uses: actions/checkout@v6
|
|
22
|
+
with:
|
|
23
|
+
fetch-depth: 0
|
|
24
|
+
|
|
25
|
+
- name: Determine version
|
|
26
|
+
id: version
|
|
27
|
+
run: |
|
|
28
|
+
if [ "${{ github.event_name }}" = "release" ]; then
|
|
29
|
+
VERSION="${GITHUB_REF_NAME#v}"
|
|
30
|
+
echo "version=${VERSION}" >> $GITHUB_OUTPUT
|
|
31
|
+
elif [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
|
|
32
|
+
VERSION="${{ github.event.inputs.version }}"
|
|
33
|
+
VERSION="${VERSION#v}"
|
|
34
|
+
echo "version=${VERSION}" >> $GITHUB_OUTPUT
|
|
35
|
+
fi
|
|
36
|
+
echo "Deploying version: ${VERSION}"
|
|
37
|
+
|
|
38
|
+
- name: Install jq
|
|
39
|
+
run: sudo apt-get update && sudo apt-get install -y jq
|
|
40
|
+
|
|
41
|
+
- name: Update version in docs config
|
|
42
|
+
run: |
|
|
43
|
+
VERSION="${{ steps.version.outputs.version }}"
|
|
44
|
+
cd docs
|
|
45
|
+
|
|
46
|
+
# Update docs.json with version information
|
|
47
|
+
jq --arg version "$VERSION" '.version = $version' docs.json > docs.json.tmp
|
|
48
|
+
mv docs.json.tmp docs.json
|
|
49
|
+
|
|
50
|
+
# Add version to versions array if not already present
|
|
51
|
+
if ! jq -e --arg version "$VERSION" '.versions | index($version)' docs.json > /dev/null; then
|
|
52
|
+
jq --arg version "$VERSION" '.versions += [$version]' docs.json > docs.json.tmp
|
|
53
|
+
mv docs.json.tmp docs.json
|
|
54
|
+
fi
|
|
55
|
+
|
|
56
|
+
- name: Configure Git
|
|
57
|
+
run: |
|
|
58
|
+
git config user.name "github-actions[bot]"
|
|
59
|
+
git config user.email "github-actions[bot]@users.noreply.github.com"
|
|
60
|
+
|
|
61
|
+
- name: Create or update docs-production branch
|
|
62
|
+
run: |
|
|
63
|
+
VERSION="${{ steps.version.outputs.version }}"
|
|
64
|
+
|
|
65
|
+
# Fetch all branches
|
|
66
|
+
git fetch origin
|
|
67
|
+
|
|
68
|
+
# Check if docs-production branch exists
|
|
69
|
+
if git ls-remote --heads origin docs-production | grep -q docs-production; then
|
|
70
|
+
echo "Branch docs-production exists, checking out"
|
|
71
|
+
git checkout docs-production
|
|
72
|
+
git pull origin docs-production
|
|
73
|
+
|
|
74
|
+
# Copy updated docs from main
|
|
75
|
+
git checkout ${{ github.sha }} -- docs/
|
|
76
|
+
else
|
|
77
|
+
echo "Creating new docs-production branch"
|
|
78
|
+
git checkout -b docs-production
|
|
79
|
+
fi
|
|
80
|
+
|
|
81
|
+
# Commit and push changes
|
|
82
|
+
git add docs/
|
|
83
|
+
git commit -m "Deploy documentation for version ${VERSION}" || echo "No changes to commit"
|
|
84
|
+
git push origin docs-production
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
name: Publish to PyPI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
release:
|
|
5
|
+
types: [published]
|
|
6
|
+
workflow_dispatch:
|
|
7
|
+
inputs:
|
|
8
|
+
environment:
|
|
9
|
+
description: 'Publish to TestPyPI or PyPI'
|
|
10
|
+
required: true
|
|
11
|
+
default: 'testpypi'
|
|
12
|
+
type: choice
|
|
13
|
+
options:
|
|
14
|
+
- testpypi
|
|
15
|
+
- pypi
|
|
16
|
+
|
|
17
|
+
permissions:
|
|
18
|
+
contents: read
|
|
19
|
+
id-token: write # For trusted publishing
|
|
20
|
+
|
|
21
|
+
jobs:
|
|
22
|
+
build:
|
|
23
|
+
name: Build distribution
|
|
24
|
+
runs-on: ubuntu-latest
|
|
25
|
+
|
|
26
|
+
steps:
|
|
27
|
+
- uses: actions/checkout@v6
|
|
28
|
+
|
|
29
|
+
- name: Install uv
|
|
30
|
+
uses: astral-sh/setup-uv@v7
|
|
31
|
+
with:
|
|
32
|
+
enable-cache: true
|
|
33
|
+
|
|
34
|
+
- name: Set up Python
|
|
35
|
+
run: uv python install 3.10
|
|
36
|
+
|
|
37
|
+
- name: Install dependencies
|
|
38
|
+
run: uv sync --all-extras
|
|
39
|
+
|
|
40
|
+
- name: Run tests
|
|
41
|
+
run: uv run pytest tests/ -v
|
|
42
|
+
|
|
43
|
+
- name: Run linting
|
|
44
|
+
run: uv run ruff check src/ tests/
|
|
45
|
+
|
|
46
|
+
- name: Run formatting check
|
|
47
|
+
run: uv run ruff format --check src/ tests/
|
|
48
|
+
|
|
49
|
+
- name: Build package
|
|
50
|
+
run: uv build
|
|
51
|
+
|
|
52
|
+
- name: Store distribution packages
|
|
53
|
+
uses: actions/upload-artifact@v7
|
|
54
|
+
with:
|
|
55
|
+
name: python-package-distributions
|
|
56
|
+
path: dist/
|
|
57
|
+
|
|
58
|
+
publish-testpypi:
|
|
59
|
+
name: Publish to TestPyPI
|
|
60
|
+
if: github.event_name == 'workflow_dispatch' && github.event.inputs.environment == 'testpypi'
|
|
61
|
+
needs: build
|
|
62
|
+
runs-on: ubuntu-latest
|
|
63
|
+
environment:
|
|
64
|
+
name: testpypi
|
|
65
|
+
url: https://test.pypi.org/p/tif1
|
|
66
|
+
|
|
67
|
+
steps:
|
|
68
|
+
- name: Download distributions
|
|
69
|
+
uses: actions/download-artifact@v8
|
|
70
|
+
with:
|
|
71
|
+
name: python-package-distributions
|
|
72
|
+
path: dist/
|
|
73
|
+
|
|
74
|
+
- name: Install uv
|
|
75
|
+
uses: astral-sh/setup-uv@v7
|
|
76
|
+
|
|
77
|
+
- name: Publish to TestPyPI
|
|
78
|
+
run: uv publish --publish-url https://test.pypi.org/legacy/
|
|
79
|
+
env:
|
|
80
|
+
UV_PUBLISH_TOKEN: ${{ secrets.TEST_PYPI_API_TOKEN }}
|
|
81
|
+
|
|
82
|
+
publish-pypi:
|
|
83
|
+
name: Publish to PyPI
|
|
84
|
+
if: github.event_name == 'release' || (github.event_name == 'workflow_dispatch' && github.event.inputs.environment == 'pypi')
|
|
85
|
+
needs: build
|
|
86
|
+
runs-on: ubuntu-latest
|
|
87
|
+
environment:
|
|
88
|
+
name: pypi
|
|
89
|
+
url: https://pypi.org/p/tif1
|
|
90
|
+
|
|
91
|
+
steps:
|
|
92
|
+
- name: Download distributions
|
|
93
|
+
uses: actions/download-artifact@v8
|
|
94
|
+
with:
|
|
95
|
+
name: python-package-distributions
|
|
96
|
+
path: dist/
|
|
97
|
+
|
|
98
|
+
- name: Install uv
|
|
99
|
+
uses: astral-sh/setup-uv@v7
|
|
100
|
+
|
|
101
|
+
- name: Publish to PyPI
|
|
102
|
+
run: uv publish
|
|
103
|
+
env:
|
|
104
|
+
UV_PUBLISH_TOKEN: ${{ secrets.PYPI_API_TOKEN }}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags:
|
|
6
|
+
- "v*"
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: write
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
release:
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
steps:
|
|
15
|
+
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
|
|
16
|
+
with:
|
|
17
|
+
fetch-depth: 0
|
|
18
|
+
|
|
19
|
+
- name: Generate release notes
|
|
20
|
+
run: |
|
|
21
|
+
PREV_TAG=$(git describe --tags --abbrev=0 HEAD^ 2>/dev/null || echo "")
|
|
22
|
+
VERSION="${GITHUB_REF_NAME#v}"
|
|
23
|
+
|
|
24
|
+
{
|
|
25
|
+
echo "## Changes"
|
|
26
|
+
echo
|
|
27
|
+
if [ -z "$PREV_TAG" ]; then
|
|
28
|
+
git log --pretty=format:"- %s (%h)" --no-merges
|
|
29
|
+
else
|
|
30
|
+
git log "${PREV_TAG}..HEAD" --pretty=format:"- %s (%h)" --no-merges
|
|
31
|
+
fi
|
|
32
|
+
echo
|
|
33
|
+
echo
|
|
34
|
+
echo "## Installation"
|
|
35
|
+
echo
|
|
36
|
+
echo '```bash'
|
|
37
|
+
echo "pip install tif1==${VERSION}"
|
|
38
|
+
echo '```'
|
|
39
|
+
} > RELEASE_NOTES.md
|
|
40
|
+
|
|
41
|
+
- name: Create or update GitHub release
|
|
42
|
+
env:
|
|
43
|
+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
44
|
+
run: |
|
|
45
|
+
if gh release view "$GITHUB_REF_NAME" >/dev/null 2>&1; then
|
|
46
|
+
gh release edit "$GITHUB_REF_NAME" \
|
|
47
|
+
--title "Release $GITHUB_REF_NAME" \
|
|
48
|
+
--notes-file RELEASE_NOTES.md
|
|
49
|
+
else
|
|
50
|
+
gh release create "$GITHUB_REF_NAME" \
|
|
51
|
+
--title "Release $GITHUB_REF_NAME" \
|
|
52
|
+
--notes-file RELEASE_NOTES.md
|
|
53
|
+
fi
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
name: Publish Package
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
release:
|
|
5
|
+
types: [published]
|
|
6
|
+
workflow_dispatch:
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: read
|
|
10
|
+
|
|
11
|
+
concurrency:
|
|
12
|
+
group: pypi-publish-${{ github.event.release.tag_name || github.ref_name }}
|
|
13
|
+
cancel-in-progress: false
|
|
14
|
+
|
|
15
|
+
env:
|
|
16
|
+
UV_VERSION: "0.10.2"
|
|
17
|
+
DEFAULT_PYTHON: "3.10"
|
|
18
|
+
|
|
19
|
+
jobs:
|
|
20
|
+
quality:
|
|
21
|
+
runs-on: ubuntu-latest
|
|
22
|
+
steps:
|
|
23
|
+
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
|
|
24
|
+
|
|
25
|
+
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
|
|
26
|
+
uses: actions/setup-python@v6.2.0
|
|
27
|
+
with:
|
|
28
|
+
python-version: ${{ env.DEFAULT_PYTHON }}
|
|
29
|
+
|
|
30
|
+
- name: Install uv
|
|
31
|
+
run: python -m pip install --disable-pip-version-check "uv==${UV_VERSION}"
|
|
32
|
+
|
|
33
|
+
- name: Install dependencies
|
|
34
|
+
run: python -m uv sync --all-extras
|
|
35
|
+
|
|
36
|
+
- name: Run prek checks
|
|
37
|
+
run: python -m uv run prek run --all-files --show-diff-on-failure
|
|
38
|
+
|
|
39
|
+
- name: Run unit tests
|
|
40
|
+
run: |
|
|
41
|
+
python -m uv run pytest -o addopts='' tests/test_*.py -v -n auto --dist=loadfile --cov=src/tif1 --cov-report=xml --cov-report=term --cov-fail-under=80 -m "not slow and not integration and not benchmark"
|
|
42
|
+
|
|
43
|
+
publish:
|
|
44
|
+
needs: quality
|
|
45
|
+
runs-on: ubuntu-latest
|
|
46
|
+
steps:
|
|
47
|
+
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
|
|
48
|
+
|
|
49
|
+
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
|
|
50
|
+
uses: actions/setup-python@v6.2.0
|
|
51
|
+
with:
|
|
52
|
+
python-version: ${{ env.DEFAULT_PYTHON }}
|
|
53
|
+
|
|
54
|
+
- name: Install uv
|
|
55
|
+
run: python -m pip install --disable-pip-version-check "uv==${UV_VERSION}"
|
|
56
|
+
|
|
57
|
+
- name: Install dependencies
|
|
58
|
+
run: python -m uv sync --all-extras
|
|
59
|
+
|
|
60
|
+
- name: Build distributions
|
|
61
|
+
run: python -m uv build
|
|
62
|
+
|
|
63
|
+
- name: Publish to PyPI
|
|
64
|
+
env:
|
|
65
|
+
UV_PUBLISH_TOKEN: ${{ secrets.PYPI_API_TOKEN }}
|
|
66
|
+
run: python -m uv publish --token "$UV_PUBLISH_TOKEN" dist/*
|