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.
Files changed (281) hide show
  1. tif1-0.2.0/.codex +0 -0
  2. tif1-0.2.0/.github/RELEASE_CHECKLIST.md +131 -0
  3. tif1-0.2.0/.github/dependabot.yml +32 -0
  4. tif1-0.2.0/.github/workflows/ci.yml +60 -0
  5. tif1-0.2.0/.github/workflows/docs-preview.yml +89 -0
  6. tif1-0.2.0/.github/workflows/docs.yml +84 -0
  7. tif1-0.2.0/.github/workflows/publish.yml +104 -0
  8. tif1-0.2.0/.github/workflows/release.yml +53 -0
  9. tif1-0.2.0/.github/workflows/wheels.yml +66 -0
  10. tif1-0.2.0/.gitignore +221 -0
  11. tif1-0.2.0/.kiro/skills/mintlify/SKILL.md +343 -0
  12. tif1-0.2.0/AGENTS.md +51 -0
  13. tif1-0.2.0/CHANGELOG.md +181 -0
  14. tif1-0.2.0/COMPATIBILITY.md +32 -0
  15. tif1-0.2.0/CONTRIBUTING.md +153 -0
  16. tif1-0.2.0/LICENSE +21 -0
  17. tif1-0.2.0/MANIFEST.in +6 -0
  18. tif1-0.2.0/PKG-INFO +412 -0
  19. tif1-0.2.0/README.md +356 -0
  20. tif1-0.2.0/TOOLS.md +89 -0
  21. tif1-0.2.0/docs/README.md +119 -0
  22. tif1-0.2.0/docs/VERSIONING.md +141 -0
  23. tif1-0.2.0/docs/api-reference/async-fetch.mdx +387 -0
  24. tif1-0.2.0/docs/api-reference/cache.mdx +190 -0
  25. tif1-0.2.0/docs/api-reference/cdn.mdx +432 -0
  26. tif1-0.2.0/docs/api-reference/cli.mdx +367 -0
  27. tif1-0.2.0/docs/api-reference/config.mdx +839 -0
  28. tif1-0.2.0/docs/api-reference/core-utils.mdx +463 -0
  29. tif1-0.2.0/docs/api-reference/core.mdx +1012 -0
  30. tif1-0.2.0/docs/api-reference/events.mdx +636 -0
  31. tif1-0.2.0/docs/api-reference/exceptions.mdx +388 -0
  32. tif1-0.2.0/docs/api-reference/fastf1-compat.mdx +256 -0
  33. tif1-0.2.0/docs/api-reference/fuzzy.mdx +387 -0
  34. tif1-0.2.0/docs/api-reference/http-session.mdx +313 -0
  35. tif1-0.2.0/docs/api-reference/http.mdx +649 -0
  36. tif1-0.2.0/docs/api-reference/io-pipeline.mdx +429 -0
  37. tif1-0.2.0/docs/api-reference/jupyter.mdx +473 -0
  38. tif1-0.2.0/docs/api-reference/lap-operations.mdx +569 -0
  39. tif1-0.2.0/docs/api-reference/models.mdx +819 -0
  40. tif1-0.2.0/docs/api-reference/overview.mdx +358 -0
  41. tif1-0.2.0/docs/api-reference/plotting.mdx +259 -0
  42. tif1-0.2.0/docs/api-reference/retry.mdx +629 -0
  43. tif1-0.2.0/docs/api-reference/schedule.mdx +311 -0
  44. tif1-0.2.0/docs/api-reference/types.mdx +650 -0
  45. tif1-0.2.0/docs/api-reference/utilities.mdx +539 -0
  46. tif1-0.2.0/docs/api-reference/utils.mdx +320 -0
  47. tif1-0.2.0/docs/api-reference/validation.mdx +779 -0
  48. tif1-0.2.0/docs/architecture.mdx +101 -0
  49. tif1-0.2.0/docs/assets/annotated_speed_trace.png +0 -0
  50. tif1-0.2.0/docs/assets/downforce_levels.png +0 -0
  51. tif1-0.2.0/docs/assets/driver_laptimes_example.png +0 -0
  52. tif1-0.2.0/docs/assets/gear_shifts_on_track.png +0 -0
  53. tif1-0.2.0/docs/assets/generate_all_charts.py +1185 -0
  54. tif1-0.2.0/docs/assets/generate_annotated_speed_trace.py +73 -0
  55. tif1-0.2.0/docs/assets/generate_downforce_levels.py +94 -0
  56. tif1-0.2.0/docs/assets/generate_driver_laptimes.py +54 -0
  57. tif1-0.2.0/docs/assets/generate_gear_shifts.py +64 -0
  58. tif1-0.2.0/docs/assets/generate_gg_diagram.py +198 -0
  59. tif1-0.2.0/docs/assets/generate_lap_delta.py +84 -0
  60. tif1-0.2.0/docs/assets/generate_laptime_heatmap.py +63 -0
  61. tif1-0.2.0/docs/assets/generate_laptimes_distribution.py +95 -0
  62. tif1-0.2.0/docs/assets/generate_multi_driver_speed_comparison.py +74 -0
  63. tif1-0.2.0/docs/assets/generate_position_changes.py +48 -0
  64. tif1-0.2.0/docs/assets/generate_qualifying_grid.py +94 -0
  65. tif1-0.2.0/docs/assets/generate_speed_traces.py +51 -0
  66. tif1-0.2.0/docs/assets/generate_telemetry_comparison.py +230 -0
  67. tif1-0.2.0/docs/assets/generate_throttle_distance.py +104 -0
  68. tif1-0.2.0/docs/assets/generate_tire_degradation.py +119 -0
  69. tif1-0.2.0/docs/assets/generate_top_speeds.py +73 -0
  70. tif1-0.2.0/docs/assets/generate_track_acceleration_map.py +49 -0
  71. tif1-0.2.0/docs/assets/generate_track_brake_zones.py +44 -0
  72. tif1-0.2.0/docs/assets/generate_track_speed_map.py +43 -0
  73. tif1-0.2.0/docs/assets/generate_track_temperature.py +50 -0
  74. tif1-0.2.0/docs/assets/generate_track_throttle_map.py +43 -0
  75. tif1-0.2.0/docs/assets/gg_diagram.png +0 -0
  76. tif1-0.2.0/docs/assets/hero_banner.png +0 -0
  77. tif1-0.2.0/docs/assets/lap_delta.png +0 -0
  78. tif1-0.2.0/docs/assets/laptime_heatmap.png +0 -0
  79. tif1-0.2.0/docs/assets/laptimes_distribution.png +0 -0
  80. tif1-0.2.0/docs/assets/multi_driver_speed_comparison.png +0 -0
  81. tif1-0.2.0/docs/assets/qualifying_grid.png +0 -0
  82. tif1-0.2.0/docs/assets/race_pace_boxplot.png +0 -0
  83. tif1-0.2.0/docs/assets/race_position_changes.png +0 -0
  84. tif1-0.2.0/docs/assets/race_tire_strategy.png +0 -0
  85. tif1-0.2.0/docs/assets/speed_traces.png +0 -0
  86. tif1-0.2.0/docs/assets/telemetry_comparison.png +0 -0
  87. tif1-0.2.0/docs/assets/throttle_distance.png +0 -0
  88. tif1-0.2.0/docs/assets/tire_degradation.png +0 -0
  89. tif1-0.2.0/docs/assets/top_speeds.png +0 -0
  90. tif1-0.2.0/docs/assets/track_temperature.png +0 -0
  91. tif1-0.2.0/docs/concepts/backends.mdx +358 -0
  92. tif1-0.2.0/docs/concepts/caching-strategy.mdx +426 -0
  93. tif1-0.2.0/docs/concepts/cli.mdx +111 -0
  94. tif1-0.2.0/docs/concepts/data-flow.mdx +455 -0
  95. tif1-0.2.0/docs/concepts/jupyter.mdx +93 -0
  96. tif1-0.2.0/docs/concepts/sessions.mdx +248 -0
  97. tif1-0.2.0/docs/design_language.md +134 -0
  98. tif1-0.2.0/docs/docs.json +252 -0
  99. tif1-0.2.0/docs/examples.mdx +465 -0
  100. tif1-0.2.0/docs/favicon.svg +9 -0
  101. tif1-0.2.0/docs/getting-started.mdx +402 -0
  102. tif1-0.2.0/docs/guides/best-practices.mdx +524 -0
  103. tif1-0.2.0/docs/guides/common-use-cases.mdx +468 -0
  104. tif1-0.2.0/docs/guides/data-visualization.mdx +344 -0
  105. tif1-0.2.0/docs/guides/error-handling.mdx +428 -0
  106. tif1-0.2.0/docs/installation.mdx +115 -0
  107. tif1-0.2.0/docs/introduction.mdx +136 -0
  108. tif1-0.2.0/docs/logo/dark.svg +12 -0
  109. tif1-0.2.0/docs/logo/light.svg +13 -0
  110. tif1-0.2.0/docs/migration-from-fastf1.mdx +154 -0
  111. tif1-0.2.0/docs/quickstart.mdx +116 -0
  112. tif1-0.2.0/docs/reference/cli-commands.mdx +473 -0
  113. tif1-0.2.0/docs/reference/contributing.mdx +120 -0
  114. tif1-0.2.0/docs/reference/data-schema.mdx +135 -0
  115. tif1-0.2.0/docs/reference/environment-variables.mdx +317 -0
  116. tif1-0.2.0/docs/reference/faq.mdx +625 -0
  117. tif1-0.2.0/docs/reference/troubleshooting.mdx +149 -0
  118. tif1-0.2.0/docs/style.css +73 -0
  119. tif1-0.2.0/docs/tutorials/advanced-telemetry.mdx +339 -0
  120. tif1-0.2.0/docs/tutorials/annotated-speed-trace.mdx +201 -0
  121. tif1-0.2.0/docs/tutorials/data-export.mdx +339 -0
  122. tif1-0.2.0/docs/tutorials/downforce-levels.mdx +249 -0
  123. tif1-0.2.0/docs/tutorials/driver-laptimes.mdx +265 -0
  124. tif1-0.2.0/docs/tutorials/gear-shifts-on-track.mdx +168 -0
  125. tif1-0.2.0/docs/tutorials/gg-diagram.mdx +271 -0
  126. tif1-0.2.0/docs/tutorials/lap-delta-comparison.mdx +309 -0
  127. tif1-0.2.0/docs/tutorials/laptime-heatmap.mdx +291 -0
  128. tif1-0.2.0/docs/tutorials/laptimes-distribution.mdx +351 -0
  129. tif1-0.2.0/docs/tutorials/multi-driver-speed-comparison.mdx +236 -0
  130. tif1-0.2.0/docs/tutorials/position-changes.mdx +123 -0
  131. tif1-0.2.0/docs/tutorials/qualifying-analysis.mdx +346 -0
  132. tif1-0.2.0/docs/tutorials/qualifying-results.mdx +284 -0
  133. tif1-0.2.0/docs/tutorials/race-analysis.mdx +510 -0
  134. tif1-0.2.0/docs/tutorials/race-pace-analysis.mdx +102 -0
  135. tif1-0.2.0/docs/tutorials/speed-traces.mdx +127 -0
  136. tif1-0.2.0/docs/tutorials/telemetry-comparison.mdx +170 -0
  137. tif1-0.2.0/docs/tutorials/throttle-distance.mdx +254 -0
  138. tif1-0.2.0/docs/tutorials/tire-degradation.mdx +256 -0
  139. tif1-0.2.0/docs/tutorials/tire-strategy.mdx +109 -0
  140. tif1-0.2.0/docs/tutorials/top-speeds.mdx +191 -0
  141. tif1-0.2.0/docs/tutorials/track-acceleration-map.mdx +168 -0
  142. tif1-0.2.0/docs/tutorials/track-brake-zones.mdx +146 -0
  143. tif1-0.2.0/docs/tutorials/track-speed-map.mdx +151 -0
  144. tif1-0.2.0/docs/tutorials/track-temperature.mdx +135 -0
  145. tif1-0.2.0/docs/tutorials/track-throttle-map.mdx +129 -0
  146. tif1-0.2.0/docs/tutorials/weather-impact.mdx +370 -0
  147. tif1-0.2.0/examples/README.md +112 -0
  148. tif1-0.2.0/examples/async_loading.py +62 -0
  149. tif1-0.2.0/examples/basic_usage.py +57 -0
  150. tif1-0.2.0/examples/cache_management.py +84 -0
  151. tif1-0.2.0/examples/data_exploration.py +130 -0
  152. tif1-0.2.0/examples/error_handling.py +111 -0
  153. tif1-0.2.0/examples/event_lookup_examples.py +41 -0
  154. tif1-0.2.0/examples/fast_telemetry.py +68 -0
  155. tif1-0.2.0/examples/fastest_laps.py +124 -0
  156. tif1-0.2.0/examples/fastest_telemetry.py +59 -0
  157. tif1-0.2.0/examples/get_event_by_name_example.py +26 -0
  158. tif1-0.2.0/examples/get_event_by_round_example.py +20 -0
  159. tif1-0.2.0/examples/new_features_demo.py +173 -0
  160. tif1-0.2.0/examples/plotting_colors_demo.py +141 -0
  161. tif1-0.2.0/examples/polars_backend.py +90 -0
  162. tif1-0.2.0/examples/sqlite_cache.py +25 -0
  163. tif1-0.2.0/prek.toml +40 -0
  164. tif1-0.2.0/project-architecture.md +410 -0
  165. tif1-0.2.0/pyproject.toml +160 -0
  166. tif1-0.2.0/race_position_changes.png +0 -0
  167. tif1-0.2.0/scripts/baseline_benchmark.py +436 -0
  168. tif1-0.2.0/scripts/baseline_results/baseline_results.json +104 -0
  169. tif1-0.2.0/src/tif1/__init__.py +139 -0
  170. tif1-0.2.0/src/tif1/async_fetch.py +717 -0
  171. tif1-0.2.0/src/tif1/cache.py +529 -0
  172. tif1-0.2.0/src/tif1/cdn.py +155 -0
  173. tif1-0.2.0/src/tif1/cli.py +194 -0
  174. tif1-0.2.0/src/tif1/config.py +310 -0
  175. tif1-0.2.0/src/tif1/core.py +5960 -0
  176. tif1-0.2.0/src/tif1/core_utils/__init__.py +57 -0
  177. tif1-0.2.0/src/tif1/core_utils/backend_conversion.py +104 -0
  178. tif1-0.2.0/src/tif1/core_utils/constants.py +197 -0
  179. tif1-0.2.0/src/tif1/core_utils/helpers.py +362 -0
  180. tif1-0.2.0/src/tif1/core_utils/json_utils.py +51 -0
  181. tif1-0.2.0/src/tif1/core_utils/resource_manager.py +138 -0
  182. tif1-0.2.0/src/tif1/data/schedules/f1schedule/schedule_2018.json +439 -0
  183. tif1-0.2.0/src/tif1/data/schedules/f1schedule/schedule_2019.json +439 -0
  184. tif1-0.2.0/src/tif1/data/schedules/f1schedule/schedule_2020.json +401 -0
  185. tif1-0.2.0/src/tif1/data/schedules/f1schedule/schedule_2021.json +477 -0
  186. tif1-0.2.0/src/tif1/data/schedules/f1schedule/schedule_2022.json +496 -0
  187. tif1-0.2.0/src/tif1/data/schedules/f1schedule/schedule_2023.json +477 -0
  188. tif1-0.2.0/src/tif1/data/schedules/f1schedule/schedule_2024.json +515 -0
  189. tif1-0.2.0/src/tif1/data/schedules/f1schedule/schedule_2025.json +515 -0
  190. tif1-0.2.0/src/tif1/data/schedules/f1schedule/schedule_2026.json +496 -0
  191. tif1-0.2.0/src/tif1/events.py +613 -0
  192. tif1-0.2.0/src/tif1/exceptions.py +99 -0
  193. tif1-0.2.0/src/tif1/fastf1_compat.py +256 -0
  194. tif1-0.2.0/src/tif1/fuzzy.py +78 -0
  195. tif1-0.2.0/src/tif1/http_session.py +254 -0
  196. tif1-0.2.0/src/tif1/io_pipeline.py +19 -0
  197. tif1-0.2.0/src/tif1/jupyter.py +199 -0
  198. tif1-0.2.0/src/tif1/lap_ops.py +10 -0
  199. tif1-0.2.0/src/tif1/models.py +13 -0
  200. tif1-0.2.0/src/tif1/plotting.py +1063 -0
  201. tif1-0.2.0/src/tif1/plotting_constants.py +535 -0
  202. tif1-0.2.0/src/tif1/retry.py +238 -0
  203. tif1-0.2.0/src/tif1/schedule_schema.py +55 -0
  204. tif1-0.2.0/src/tif1/session.py +5 -0
  205. tif1-0.2.0/src/tif1/types.py +194 -0
  206. tif1-0.2.0/src/tif1/utils.py +42 -0
  207. tif1-0.2.0/src/tif1/validation.py +723 -0
  208. tif1-0.2.0/tests/benchmarks/__init__.py +1 -0
  209. tif1-0.2.0/tests/benchmarks/test_async_fetch_batch_benchmark.py +155 -0
  210. tif1-0.2.0/tests/benchmarks/test_async_fetch_cache_hit_benchmark.py +115 -0
  211. tif1-0.2.0/tests/benchmarks/test_async_parallelism_validation.py +331 -0
  212. tif1-0.2.0/tests/benchmarks/test_benchmarks.py +123 -0
  213. tif1-0.2.0/tests/benchmarks/test_cache_benchmark.py +266 -0
  214. tif1-0.2.0/tests/benchmarks/test_cache_memory_lookup_benchmark.py +124 -0
  215. tif1-0.2.0/tests/benchmarks/test_cache_performance.py +430 -0
  216. tif1-0.2.0/tests/benchmarks/test_cache_serialization_benchmark.py +108 -0
  217. tif1-0.2.0/tests/benchmarks/test_core_driver_benchmark.py +78 -0
  218. tif1-0.2.0/tests/benchmarks/test_core_driver_info_lookup_benchmark.py +86 -0
  219. tif1-0.2.0/tests/benchmarks/test_core_fastest_laps_cold_benchmark.py +118 -0
  220. tif1-0.2.0/tests/benchmarks/test_core_get_lap_benchmark.py +109 -0
  221. tif1-0.2.0/tests/benchmarks/test_core_notebook_workflow_benchmark.py +187 -0
  222. tif1-0.2.0/tests/benchmarks/test_core_real_cold_start_benchmark.py +399 -0
  223. tif1-0.2.0/tests/benchmarks/test_core_telemetry_batch_benchmark.py +128 -0
  224. tif1-0.2.0/tests/benchmarks/test_dataframe_performance.py +429 -0
  225. tif1-0.2.0/tests/benchmarks/test_events_performance_benchmark.py +57 -0
  226. tif1-0.2.0/tests/benchmarks/test_laptime_filter_benchmark.py +92 -0
  227. tif1-0.2.0/tests/benchmarks/test_retry_circuit_benchmark.py +157 -0
  228. tif1-0.2.0/tests/benchmarks/test_validation_anomaly_micro_benchmark.py +111 -0
  229. tif1-0.2.0/tests/benchmarks/test_validation_benchmark.py +107 -0
  230. tif1-0.2.0/tests/benchmarks/test_validation_lengths_check_benchmark.py +174 -0
  231. tif1-0.2.0/tests/benchmarks/test_validation_telemetry_flags_benchmark.py +114 -0
  232. tif1-0.2.0/tests/conftest.py +25 -0
  233. tif1-0.2.0/tests/integration/__init__.py +1 -0
  234. tif1-0.2.0/tests/integration/test_integration.py +118 -0
  235. tif1-0.2.0/tests/property/__init__.py +1 -0
  236. tif1-0.2.0/tests/property/test_async_properties.py +549 -0
  237. tif1-0.2.0/tests/property/test_cache_properties.py +617 -0
  238. tif1-0.2.0/tests/property/test_circuit_breaker_properties.py +423 -0
  239. tif1-0.2.0/tests/property/test_config_properties.py +429 -0
  240. tif1-0.2.0/tests/property/test_resource_properties.py +629 -0
  241. tif1-0.2.0/tests/property/test_sync_async_equivalence.py +503 -0
  242. tif1-0.2.0/tests/unit/__init__.py +1 -0
  243. tif1-0.2.0/tests/unit/test_async_fetch.py +933 -0
  244. tif1-0.2.0/tests/unit/test_async_fetch_cleanup.py +204 -0
  245. tif1-0.2.0/tests/unit/test_async_fetch_executor.py +137 -0
  246. tif1-0.2.0/tests/unit/test_async_fetch_rate_limit.py +145 -0
  247. tif1-0.2.0/tests/unit/test_backend_conversion.py +283 -0
  248. tif1-0.2.0/tests/unit/test_cache.py +447 -0
  249. tif1-0.2.0/tests/unit/test_cache_init.py +140 -0
  250. tif1-0.2.0/tests/unit/test_cdn.py +273 -0
  251. tif1-0.2.0/tests/unit/test_cli.py +168 -0
  252. tif1-0.2.0/tests/unit/test_compatibility_coverage.py +268 -0
  253. tif1-0.2.0/tests/unit/test_concurrent_cache_operations.py +231 -0
  254. tif1-0.2.0/tests/unit/test_config.py +640 -0
  255. tif1-0.2.0/tests/unit/test_connection_metrics.py +204 -0
  256. tif1-0.2.0/tests/unit/test_core.py +860 -0
  257. tif1-0.2.0/tests/unit/test_core_fastest_laps_cold.py +171 -0
  258. tif1-0.2.0/tests/unit/test_core_surface_coverage.py +550 -0
  259. tif1-0.2.0/tests/unit/test_core_ultra_cold.py +360 -0
  260. tif1-0.2.0/tests/unit/test_coverage_core.py +1868 -0
  261. tif1-0.2.0/tests/unit/test_coverage_core2.py +916 -0
  262. tif1-0.2.0/tests/unit/test_coverage_shims_and_utils.py +223 -0
  263. tif1-0.2.0/tests/unit/test_events.py +455 -0
  264. tif1-0.2.0/tests/unit/test_exceptions.py +99 -0
  265. tif1-0.2.0/tests/unit/test_fetch_driver_laps_parallel.py +210 -0
  266. tif1-0.2.0/tests/unit/test_fuzzing.py +98 -0
  267. tif1-0.2.0/tests/unit/test_helpers.py +415 -0
  268. tif1-0.2.0/tests/unit/test_http_session.py +675 -0
  269. tif1-0.2.0/tests/unit/test_http_session_pool_sizing.py +187 -0
  270. tif1-0.2.0/tests/unit/test_jupyter.py +227 -0
  271. tif1-0.2.0/tests/unit/test_laps_dtypes.py +222 -0
  272. tif1-0.2.0/tests/unit/test_plotting.py +494 -0
  273. tif1-0.2.0/tests/unit/test_pool_exhaustion.py +387 -0
  274. tif1-0.2.0/tests/unit/test_resource_cleanup.py +599 -0
  275. tif1-0.2.0/tests/unit/test_resource_manager.py +270 -0
  276. tif1-0.2.0/tests/unit/test_retry.py +171 -0
  277. tif1-0.2.0/tests/unit/test_schedule_schema.py +32 -0
  278. tif1-0.2.0/tests/unit/test_telemetry_dtypes.py +208 -0
  279. tif1-0.2.0/tests/unit/test_types.py +159 -0
  280. tif1-0.2.0/tests/unit/test_validation.py +664 -0
  281. 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/*