nullpol 0.1.1__tar.gz → 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 (268) hide show
  1. nullpol-0.2.0/.github/ISSUE_TEMPLATE/bug-report.md +56 -0
  2. nullpol-0.2.0/.github/ISSUE_TEMPLATE/config.yml +5 -0
  3. nullpol-0.2.0/.github/ISSUE_TEMPLATE/feature-request.md +47 -0
  4. nullpol-0.2.0/.github/pull_request_template.md +40 -0
  5. nullpol-0.2.0/.github/workflows/ci.yml +36 -0
  6. nullpol-0.2.0/.github/workflows/codeql.yml +29 -0
  7. nullpol-0.2.0/.github/workflows/documentation.yml +42 -0
  8. nullpol-0.2.0/.github/workflows/draft-release.yml +50 -0
  9. nullpol-0.2.0/.github/workflows/publish.yml +59 -0
  10. nullpol-0.2.0/.github/workflows/publish_testpypi.yml +76 -0
  11. nullpol-0.2.0/.github/workflows/release.yml +58 -0
  12. nullpol-0.2.0/.github/workflows/scheduled-release.yml +137 -0
  13. nullpol-0.2.0/.github/workflows/semantic-pr-check.yml +18 -0
  14. nullpol-0.2.0/.gitignore +194 -0
  15. nullpol-0.2.0/.markdownlint.yaml +46 -0
  16. nullpol-0.2.0/.pre-commit-config.yaml +59 -0
  17. nullpol-0.2.0/.prettierignore +1 -0
  18. nullpol-0.2.0/.prettierrc.yaml +7 -0
  19. nullpol-0.2.0/.typos.toml +24 -0
  20. nullpol-0.2.0/CITATION.cff +21 -0
  21. nullpol-0.2.0/CODE_OF_CONDUCT.md +131 -0
  22. nullpol-0.2.0/CONTRIBUTING.md +170 -0
  23. nullpol-0.2.0/LICENSE +674 -0
  24. nullpol-0.2.0/PKG-INFO +210 -0
  25. nullpol-0.2.0/README.md +171 -0
  26. nullpol-0.2.0/SECURITY.md +53 -0
  27. nullpol-0.2.0/cliff.toml +123 -0
  28. nullpol-0.2.0/docs/.gitignore +1 -0
  29. nullpol-0.2.0/docs/asimov.md +18 -0
  30. nullpol-0.2.0/docs/citing.md +16 -0
  31. nullpol-0.2.0/docs/contributing.md +1 -0
  32. nullpol-0.2.0/docs/examples/scalar-tensor.md +20 -0
  33. nullpol-0.2.0/docs/index.md +31 -0
  34. nullpol-0.2.0/docs/injections.md +13 -0
  35. nullpol-0.2.0/docs/installation.md +49 -0
  36. nullpol-0.2.0/docs/javascripts/mathjax.js +12 -0
  37. nullpol-0.2.0/docs/reference/index.md +21 -0
  38. nullpol-0.2.0/docs/reference/nullpol/analysis/antenna_patterns/index.md +11 -0
  39. nullpol-0.2.0/docs/reference/nullpol/analysis/clustering/index.md +11 -0
  40. nullpol-0.2.0/docs/reference/nullpol/analysis/index.md +11 -0
  41. nullpol-0.2.0/docs/reference/nullpol/analysis/likelihood/index.md +11 -0
  42. nullpol-0.2.0/docs/reference/nullpol/analysis/null_stream/index.md +11 -0
  43. nullpol-0.2.0/docs/reference/nullpol/analysis/prior/index.md +11 -0
  44. nullpol-0.2.0/docs/reference/nullpol/analysis/tf_transforms/index.md +11 -0
  45. nullpol-0.2.0/docs/reference/nullpol/cli/index.md +11 -0
  46. nullpol-0.2.0/docs/reference/nullpol/index.md +11 -0
  47. nullpol-0.2.0/docs/reference/nullpol/integrations/asimov/index.md +11 -0
  48. nullpol-0.2.0/docs/reference/nullpol/integrations/htcondor/index.md +11 -0
  49. nullpol-0.2.0/docs/reference/nullpol/integrations/index.md +11 -0
  50. nullpol-0.2.0/docs/reference/nullpol/simulation/index.md +11 -0
  51. nullpol-0.2.0/docs/reference/nullpol/utils/index.md +11 -0
  52. nullpol-0.2.0/docs/reference/nullpol/version.md +11 -0
  53. nullpol-0.2.0/examples/injection/scalar_tensor/generate_injection_file.sh +3 -0
  54. nullpol-0.2.0/examples/injection/scalar_tensor/injections.json +28 -0
  55. nullpol-0.2.0/examples/injection/scalar_tensor/outdir_scalar_tensor_injection/data/scalar_tensor_injection_data0_0_generation_data_dump.pickle +0 -0
  56. nullpol-0.2.0/examples/injection/scalar_tensor/outdir_scalar_tensor_injection/log_data_analysis/scalar_tensor_injection_data0_0_analysis_H1L1V1.err +41 -0
  57. nullpol-0.2.0/examples/injection/scalar_tensor/outdir_scalar_tensor_injection/log_data_analysis/scalar_tensor_injection_data0_0_analysis_H1L1V1.out +19 -0
  58. nullpol-0.2.0/examples/injection/scalar_tensor/outdir_scalar_tensor_injection/log_data_generation/scalar_tensor_injection_data0_0_generation.err +193 -0
  59. nullpol-0.2.0/examples/injection/scalar_tensor/outdir_scalar_tensor_injection/log_data_generation/scalar_tensor_injection_data0_0_generation.out +0 -0
  60. nullpol-0.2.0/examples/injection/scalar_tensor/outdir_scalar_tensor_injection/result/scalar_tensor_injection_data0_0_analysis_H1L1V1_dynesty.pickle +0 -0
  61. nullpol-0.2.0/examples/injection/scalar_tensor/outdir_scalar_tensor_injection/result/scalar_tensor_injection_data0_0_analysis_H1L1V1_resume.pickle +0 -0
  62. nullpol-0.2.0/examples/injection/scalar_tensor/outdir_scalar_tensor_injection/results_page/overview.html +1047 -0
  63. nullpol-0.2.0/examples/injection/scalar_tensor/outdir_scalar_tensor_injection/scalar_tensor_injection_config_complete.ini +213 -0
  64. nullpol-0.2.0/examples/injection/scalar_tensor/outdir_scalar_tensor_injection/submit/bash_scalar_tensor_injection.sh +25 -0
  65. nullpol-0.2.0/examples/injection/scalar_tensor/outdir_scalar_tensor_injection/submit/dag_scalar_tensor_injection.submit +13 -0
  66. nullpol-0.2.0/examples/injection/scalar_tensor/outdir_scalar_tensor_injection/submit/dag_scalar_tensor_injection.submit.condor.sub +20 -0
  67. nullpol-0.2.0/examples/injection/scalar_tensor/outdir_scalar_tensor_injection/submit/dag_scalar_tensor_injection.submit.dagman.out +253 -0
  68. nullpol-0.2.0/examples/injection/scalar_tensor/outdir_scalar_tensor_injection/submit/dag_scalar_tensor_injection.submit.lib.err +0 -0
  69. nullpol-0.2.0/examples/injection/scalar_tensor/outdir_scalar_tensor_injection/submit/dag_scalar_tensor_injection.submit.lib.out +1 -0
  70. nullpol-0.2.0/examples/injection/scalar_tensor/outdir_scalar_tensor_injection/submit/dag_scalar_tensor_injection.submit.metrics +30 -0
  71. nullpol-0.2.0/examples/injection/scalar_tensor/outdir_scalar_tensor_injection/submit/scalar_tensor_injection_data0_0_analysis_H1L1V1.submit +24 -0
  72. nullpol-0.2.0/examples/injection/scalar_tensor/outdir_scalar_tensor_injection/submit/scalar_tensor_injection_data0_0_analysis_H1L1V1_final_result.submit +16 -0
  73. nullpol-0.2.0/examples/injection/scalar_tensor/outdir_scalar_tensor_injection/submit/scalar_tensor_injection_data0_0_generation.submit +23 -0
  74. nullpol-0.2.0/examples/injection/scalar_tensor/prior.prior +2 -0
  75. nullpol-0.2.0/examples/injection/scalar_tensor/scalar_tensor_injection.ini +47 -0
  76. nullpol-0.2.0/examples/injection/scalar_tensor/scalar_tensor_injection.prior +21 -0
  77. nullpol-0.2.0/examples/injection/scalar_tensor_fractional_projection/generate_injection_file.sh +3 -0
  78. nullpol-0.2.0/examples/injection/scalar_tensor_fractional_projection/scalar_tensor_injection.ini +47 -0
  79. nullpol-0.2.0/examples/injection/scalar_tensor_fractional_projection/scalar_tensor_injection.prior +21 -0
  80. nullpol-0.2.0/examples/injection/scalar_tensor_gaussian/generate_injection_file.sh +3 -0
  81. nullpol-0.2.0/examples/injection/scalar_tensor_gaussian/scalar_tensor_injection.ini +46 -0
  82. nullpol-0.2.0/examples/injection/scalar_tensor_gaussian/scalar_tensor_injection.prior +21 -0
  83. nullpol-0.2.0/examples/injection/scalar_tensor_h_marginalized/generate_injection_file.sh +3 -0
  84. nullpol-0.2.0/examples/injection/scalar_tensor_h_marginalized/scalar_tensor_injection.ini +46 -0
  85. nullpol-0.2.0/examples/injection/scalar_tensor_h_marginalized/scalar_tensor_injection.prior +21 -0
  86. nullpol-0.2.0/examples/injection/scalar_tensor_weighted_gaussian/generate_injection_file.sh +3 -0
  87. nullpol-0.2.0/examples/injection/scalar_tensor_weighted_gaussian/scalar_tensor_injection.ini +49 -0
  88. nullpol-0.2.0/examples/injection/scalar_tensor_weighted_gaussian/scalar_tensor_injection.prior +21 -0
  89. nullpol-0.2.0/pyproject.toml +181 -0
  90. nullpol-0.2.0/renovate.json +79 -0
  91. nullpol-0.2.0/scripts/README.md +247 -0
  92. nullpol-0.2.0/scripts/auto_generate_init.py +379 -0
  93. nullpol-0.2.0/src/nullpol/__init__.py +41 -0
  94. nullpol-0.2.0/src/nullpol/analysis/__init__.py +26 -0
  95. nullpol-0.2.0/src/nullpol/analysis/antenna_patterns/__init__.py +41 -0
  96. nullpol-0.2.0/src/nullpol/analysis/antenna_patterns/base.py +152 -0
  97. nullpol-0.1.1/src/nullpol/detector/whiten.py → nullpol-0.2.0/src/nullpol/analysis/antenna_patterns/conditioning.py +30 -26
  98. nullpol-0.2.0/src/nullpol/analysis/antenna_patterns/encoding.py +101 -0
  99. nullpol-0.2.0/src/nullpol/analysis/antenna_patterns/processor.py +267 -0
  100. nullpol-0.2.0/src/nullpol/analysis/clustering/__init__.py +18 -0
  101. nullpol-0.2.0/src/nullpol/analysis/clustering/algorithm.py +121 -0
  102. nullpol-0.2.0/src/nullpol/analysis/clustering/application.py +106 -0
  103. nullpol-0.2.0/src/nullpol/analysis/clustering/coherent_sky_scan.py +115 -0
  104. nullpol-0.2.0/src/nullpol/analysis/clustering/plotting.py +79 -0
  105. nullpol-0.2.0/src/nullpol/analysis/clustering/threshold_filter.py +22 -0
  106. nullpol-0.2.0/src/nullpol/analysis/data_context.py +438 -0
  107. nullpol-0.2.0/src/nullpol/analysis/likelihood/__init__.py +11 -0
  108. nullpol-0.2.0/src/nullpol/analysis/likelihood/chi2_tf_likelihood.py +96 -0
  109. nullpol-0.2.0/src/nullpol/analysis/likelihood/time_frequency_likelihood.py +115 -0
  110. nullpol-0.2.0/src/nullpol/analysis/null_stream/__init__.py +17 -0
  111. nullpol-0.2.0/src/nullpol/analysis/null_stream/calculator.py +151 -0
  112. nullpol-0.2.0/src/nullpol/analysis/null_stream/projections.py +103 -0
  113. nullpol-0.2.0/src/nullpol/analysis/prior/__init__.py +10 -0
  114. nullpol-0.2.0/src/nullpol/analysis/prior/default.py +93 -0
  115. nullpol-0.2.0/src/nullpol/analysis/result.py +297 -0
  116. nullpol-0.2.0/src/nullpol/analysis/tf_transforms/__init__.py +37 -0
  117. nullpol-0.2.0/src/nullpol/analysis/tf_transforms/inverse_wavelet_freq.py +119 -0
  118. nullpol-0.2.0/src/nullpol/analysis/tf_transforms/inverse_wavelet_time.py +213 -0
  119. {nullpol-0.1.1/src/nullpol/time_frequency_transform → nullpol-0.2.0/src/nullpol/analysis/tf_transforms}/stft.py +15 -2
  120. nullpol-0.2.0/src/nullpol/analysis/tf_transforms/utils.py +38 -0
  121. nullpol-0.2.0/src/nullpol/analysis/tf_transforms/wavelet_freq.py +218 -0
  122. nullpol-0.2.0/src/nullpol/analysis/tf_transforms/wavelet_time.py +140 -0
  123. {nullpol-0.1.1/src/nullpol/time_frequency_transform → nullpol-0.2.0/src/nullpol/analysis/tf_transforms}/wavelet_transforms.py +45 -76
  124. nullpol-0.2.0/src/nullpol/cli/__init__.py +40 -0
  125. nullpol-0.2.0/src/nullpol/cli/create_injection.py +185 -0
  126. {nullpol-0.1.1/src/nullpol/tools → nullpol-0.2.0/src/nullpol/cli}/create_time_frequency_filter_from_sample.py +65 -71
  127. {nullpol-0.1.1/src/nullpol/tools → nullpol-0.2.0/src/nullpol/cli}/data_analysis.py +76 -88
  128. {nullpol-0.1.1/src/nullpol/tools → nullpol-0.2.0/src/nullpol/cli}/data_generation.py +188 -143
  129. {nullpol-0.1.1/src/nullpol/tools → nullpol-0.2.0/src/nullpol/cli}/get_asimov_yaml.py +11 -10
  130. {nullpol-0.1.1/src/nullpol/tools → nullpol-0.2.0/src/nullpol/cli}/input.py +73 -40
  131. {nullpol-0.1.1/src/nullpol/tools → nullpol-0.2.0/src/nullpol/cli}/main.py +32 -10
  132. nullpol-0.2.0/src/nullpol/cli/parser.py +271 -0
  133. nullpol-0.2.0/src/nullpol/cli/templates/__init__.py +1 -0
  134. {nullpol-0.1.1/src/nullpol/tools → nullpol-0.2.0/src/nullpol/cli/templates}/config.ini +1 -1
  135. nullpol-0.2.0/src/nullpol/cli/templates/example_signal_parameters_create_injection.json +19 -0
  136. nullpol-0.2.0/src/nullpol/integrations/__init__.py +23 -0
  137. nullpol-0.2.0/src/nullpol/integrations/asimov/__init__.py +24 -0
  138. {nullpol-0.1.1/src/nullpol → nullpol-0.2.0/src/nullpol/integrations}/asimov/asimov.py +60 -87
  139. {nullpol-0.1.1/src/nullpol → nullpol-0.2.0/src/nullpol/integrations}/asimov/pesummary.py +37 -53
  140. nullpol-0.2.0/src/nullpol/integrations/asimov/templates/__init__.py +1 -0
  141. nullpol-0.2.0/src/nullpol/integrations/asimov/templates/analysis_defaults.yaml +56 -0
  142. {nullpol-0.1.1/src/nullpol → nullpol-0.2.0/src/nullpol/integrations}/asimov/tgrflow.py +113 -237
  143. nullpol-0.2.0/src/nullpol/integrations/asimov/utility.py +284 -0
  144. nullpol-0.2.0/src/nullpol/integrations/htcondor/__init__.py +14 -0
  145. {nullpol-0.1.1/src/nullpol/job_creation → nullpol-0.2.0/src/nullpol/integrations/htcondor}/analysis_node.py +53 -41
  146. nullpol-0.2.0/src/nullpol/integrations/htcondor/generation_node.py +41 -0
  147. {nullpol-0.1.1/src/nullpol/job_creation → nullpol-0.2.0/src/nullpol/integrations/htcondor}/nullpol_pipe_dag_creator.py +53 -10
  148. nullpol-0.2.0/src/nullpol/simulation/__init__.py +11 -0
  149. nullpol-0.2.0/src/nullpol/simulation/injection.py +69 -0
  150. nullpol-0.2.0/src/nullpol/simulation/source.py +101 -0
  151. nullpol-0.2.0/src/nullpol/utils/__init__.py +19 -0
  152. {nullpol-0.1.1 → nullpol-0.2.0}/src/nullpol/utils/error.py +4 -0
  153. {nullpol-0.1.1 → nullpol-0.2.0}/src/nullpol/utils/filesystem.py +2 -12
  154. nullpol-0.2.0/src/nullpol/utils/imports.py +20 -0
  155. nullpol-0.2.0/src/nullpol/utils/json_utils.py +19 -0
  156. nullpol-0.2.0/src/nullpol/utils/log.py +53 -0
  157. nullpol-0.2.0/src/nullpol/version.py +7 -0
  158. nullpol-0.2.0/tests/.gitignore +3 -0
  159. nullpol-0.2.0/tests/analysis/__init__.py +27 -0
  160. nullpol-0.2.0/tests/analysis/antenna_patterns/__init__.py +42 -0
  161. nullpol-0.2.0/tests/analysis/antenna_patterns/test_base.py +350 -0
  162. nullpol-0.2.0/tests/analysis/antenna_patterns/test_conditioning.py +294 -0
  163. nullpol-0.2.0/tests/analysis/antenna_patterns/test_encoding.py +204 -0
  164. nullpol-0.2.0/tests/analysis/antenna_patterns/test_processor.py +395 -0
  165. nullpol-0.2.0/tests/analysis/clustering/__init__.py +16 -0
  166. nullpol-0.2.0/tests/analysis/clustering/test_algorithm.py +298 -0
  167. nullpol-0.2.0/tests/analysis/clustering/test_application.py +472 -0
  168. nullpol-0.2.0/tests/analysis/clustering/test_plotting.py +435 -0
  169. nullpol-0.2.0/tests/analysis/clustering/test_threshold_filter.py +143 -0
  170. nullpol-0.2.0/tests/analysis/fixtures/injections.json +28 -0
  171. nullpol-0.2.0/tests/analysis/likelihood/test_chi2_tf_likelihood.py +542 -0
  172. nullpol-0.2.0/tests/analysis/likelihood/test_time_frequency_likelihood.py +51 -0
  173. nullpol-0.2.0/tests/analysis/null_stream/__init__.py +37 -0
  174. nullpol-0.2.0/tests/analysis/null_stream/test_calculator.py +506 -0
  175. nullpol-0.2.0/tests/analysis/null_stream/test_projections.py +378 -0
  176. nullpol-0.2.0/tests/analysis/prior/__init__.py +10 -0
  177. nullpol-0.2.0/tests/analysis/prior/test_default.py +254 -0
  178. nullpol-0.2.0/tests/analysis/test_data_context.py +509 -0
  179. nullpol-0.2.0/tests/analysis/test_result.py +591 -0
  180. nullpol-0.2.0/tests/analysis/tf_transforms/__init__.py +60 -0
  181. nullpol-0.2.0/tests/analysis/tf_transforms/test_inverse_wavelet_freq.py +344 -0
  182. nullpol-0.2.0/tests/analysis/tf_transforms/test_inverse_wavelet_time.py +278 -0
  183. nullpol-0.2.0/tests/analysis/tf_transforms/test_stft.py +337 -0
  184. nullpol-0.2.0/tests/analysis/tf_transforms/test_utils.py +235 -0
  185. nullpol-0.2.0/tests/analysis/tf_transforms/test_wavelet_freq.py +440 -0
  186. nullpol-0.2.0/tests/analysis/tf_transforms/test_wavelet_time.py +315 -0
  187. nullpol-0.2.0/tests/analysis/tf_transforms/test_wavelet_transforms.py +208 -0
  188. nullpol-0.2.0/tests/cli/__init__.py +25 -0
  189. nullpol-0.2.0/tests/cli/fixtures/mock_psd.txt +32769 -0
  190. nullpol-0.2.0/tests/cli/test_create_injection.py +266 -0
  191. nullpol-0.2.0/tests/cli/test_create_time_frequency_filter.py +111 -0
  192. nullpol-0.2.0/tests/integrations/__init__.py +1 -0
  193. nullpol-0.2.0/tests/simulation/__init__.py +22 -0
  194. nullpol-0.2.0/tests/simulation/test_injection.py +122 -0
  195. nullpol-0.2.0/tests/simulation/test_source.py +312 -0
  196. nullpol-0.2.0/tests/smoke_test.py +42 -0
  197. nullpol-0.2.0/tests/test_import.py +147 -0
  198. nullpol-0.2.0/tests/test_version.py +28 -0
  199. nullpol-0.2.0/tests/utils/__init__.py +62 -0
  200. nullpol-0.2.0/tests/utils/test_error.py +36 -0
  201. nullpol-0.2.0/tests/utils/test_filesystem.py +33 -0
  202. nullpol-0.2.0/tests/utils/test_imports.py +68 -0
  203. nullpol-0.2.0/tests/utils/test_json_utils.py +96 -0
  204. nullpol-0.2.0/tests/utils/test_log.py +61 -0
  205. nullpol-0.2.0/uv.lock +3479 -0
  206. nullpol-0.2.0/zensical.toml +383 -0
  207. nullpol-0.1.1/LICENSE +0 -21
  208. nullpol-0.1.1/PKG-INFO +0 -72
  209. nullpol-0.1.1/README.rst +0 -16
  210. nullpol-0.1.1/pyproject.toml +0 -349
  211. nullpol-0.1.1/src/nullpol/__init__.py +0 -43
  212. nullpol-0.1.1/src/nullpol/asimov/analysis_defaults.yaml +0 -56
  213. nullpol-0.1.1/src/nullpol/asimov/utility.py +0 -281
  214. nullpol-0.1.1/src/nullpol/calibration/__init__.py +0 -3
  215. nullpol-0.1.1/src/nullpol/calibration/antenna_pattern.py +0 -32
  216. nullpol-0.1.1/src/nullpol/clustering/__init__.py +0 -7
  217. nullpol-0.1.1/src/nullpol/clustering/clustering.py +0 -60
  218. nullpol-0.1.1/src/nullpol/clustering/plot.ipynb +0 -120
  219. nullpol-0.1.1/src/nullpol/clustering/plot.py +0 -43
  220. nullpol-0.1.1/src/nullpol/clustering/single.py +0 -77
  221. nullpol-0.1.1/src/nullpol/clustering/sky_maximized_spectrogram.py +0 -70
  222. nullpol-0.1.1/src/nullpol/clustering/test.png +0 -0
  223. nullpol-0.1.1/src/nullpol/clustering/threshold_filter.py +0 -29
  224. nullpol-0.1.1/src/nullpol/detector/__init__.py +0 -4
  225. nullpol-0.1.1/src/nullpol/detector/networks.py +0 -103
  226. nullpol-0.1.1/src/nullpol/injection/__init__.py +0 -3
  227. nullpol-0.1.1/src/nullpol/injection/injection.py +0 -68
  228. nullpol-0.1.1/src/nullpol/job_creation/__init__.py +0 -5
  229. nullpol-0.1.1/src/nullpol/job_creation/generation_node.py +0 -17
  230. nullpol-0.1.1/src/nullpol/likelihood/__init__.py +0 -6
  231. nullpol-0.1.1/src/nullpol/likelihood/chi2_time_frequency_likelihood.py +0 -80
  232. nullpol-0.1.1/src/nullpol/likelihood/fractional_projection_time_frequency_likelihood.py +0 -78
  233. nullpol-0.1.1/src/nullpol/likelihood/gaussian_time_frequency_likelihood.py +0 -72
  234. nullpol-0.1.1/src/nullpol/likelihood/time_frequency_likelihood.py +0 -516
  235. nullpol-0.1.1/src/nullpol/null_stream/__init__.py +0 -7
  236. nullpol-0.1.1/src/nullpol/null_stream/antenna_pattern.py +0 -130
  237. nullpol-0.1.1/src/nullpol/null_stream/encoding.py +0 -23
  238. nullpol-0.1.1/src/nullpol/null_stream/null_stream.py +0 -94
  239. nullpol-0.1.1/src/nullpol/null_stream/projector.py +0 -61
  240. nullpol-0.1.1/src/nullpol/null_stream/signal_estimator.py +0 -37
  241. nullpol-0.1.1/src/nullpol/null_stream/time_shift.py +0 -52
  242. nullpol-0.1.1/src/nullpol/prior/__init__.py +0 -3
  243. nullpol-0.1.1/src/nullpol/prior/default.py +0 -24
  244. nullpol-0.1.1/src/nullpol/result/__init__.py +0 -3
  245. nullpol-0.1.1/src/nullpol/result/result.py +0 -257
  246. nullpol-0.1.1/src/nullpol/source/__init__.py +0 -3
  247. nullpol-0.1.1/src/nullpol/source/simple_map.py +0 -30
  248. nullpol-0.1.1/src/nullpol/time_frequency_transform/__init__.py +0 -5
  249. nullpol-0.1.1/src/nullpol/time_frequency_transform/helper.py +0 -34
  250. nullpol-0.1.1/src/nullpol/time_frequency_transform/inverse_wavelet_freq_funcs.py +0 -136
  251. nullpol-0.1.1/src/nullpol/time_frequency_transform/inverse_wavelet_time_funcs.py +0 -231
  252. nullpol-0.1.1/src/nullpol/time_frequency_transform/transform_freq_funcs.py +0 -268
  253. nullpol-0.1.1/src/nullpol/time_frequency_transform/transform_time_funcs.py +0 -168
  254. nullpol-0.1.1/src/nullpol/tools/create_injection.py +0 -180
  255. nullpol-0.1.1/src/nullpol/tools/example_signal_parameters_create_injection.json +0 -17
  256. nullpol-0.1.1/src/nullpol/tools/parser.py +0 -238
  257. nullpol-0.1.1/src/nullpol/utils/__init__.py +0 -9
  258. nullpol-0.1.1/src/nullpol/utils/config.py +0 -22
  259. nullpol-0.1.1/src/nullpol/utils/convert_type.py +0 -45
  260. nullpol-0.1.1/src/nullpol/utils/log.py +0 -58
  261. /nullpol-0.1.1/src/nullpol/asimov/__init__.py → /nullpol-0.2.0/examples/injection/scalar_tensor/outdir_scalar_tensor_injection/log_data_analysis/scalar_tensor_injection_data0_0_analysis_H1L1V1_final_result.err +0 -0
  262. /nullpol-0.1.1/src/nullpol/tools/__init__.py → /nullpol-0.2.0/examples/injection/scalar_tensor/outdir_scalar_tensor_injection/log_data_analysis/scalar_tensor_injection_data0_0_analysis_H1L1V1_final_result.out +0 -0
  263. {nullpol-0.1.1 → nullpol-0.2.0}/src/nullpol/.gitignore +0 -0
  264. {nullpol-0.1.1/src/nullpol → nullpol-0.2.0/src/nullpol/analysis}/prior/prior_files/polarization.prior +0 -0
  265. {nullpol-0.1.1/src/nullpol/tools → nullpol-0.2.0/src/nullpol/cli/templates}/default_config_create_injection.ini +0 -0
  266. {nullpol-0.1.1/src/nullpol/tools → nullpol-0.2.0/src/nullpol/cli/templates}/default_config_create_time_frequency_filter_from_sample.ini +0 -0
  267. {nullpol-0.1.1/src/nullpol/asimov → nullpol-0.2.0/src/nullpol/integrations/asimov/templates}/nullpol.ini +0 -0
  268. {nullpol-0.1.1/src/nullpol/asimov → nullpol-0.2.0/src/nullpol/integrations/asimov/templates}/nullpol_analysis.yaml +0 -0
@@ -0,0 +1,56 @@
1
+ ---
2
+ name: 🐛 Bug Report
3
+ about: Create a report to help us improve
4
+ title: '[BUG]: '
5
+ labels: bug
6
+ assignees: ''
7
+ ---
8
+
9
+ ## 📝 Description
10
+
11
+ A clear and concise description of what the bug is.
12
+
13
+ ## 🚀 Reproduction Steps
14
+
15
+ Steps to reproduce the behavior:
16
+
17
+ 1. '...'
18
+ 2. '...'
19
+ 3. '...'
20
+
21
+ ## 💻 Minimal Reproducible Example
22
+
23
+ Please provide a short snippet of Python code that demonstrates the issue. Use
24
+ code blocks for readability:
25
+
26
+ ```python
27
+ # Your code here
28
+ ```
29
+
30
+ ## 📋 Expected Behavior
31
+
32
+ A clear and concise description of what you expected to happen.
33
+
34
+ ## 💥 Actual Behavior / Traceback
35
+
36
+ If applicable, add the Python error traceback here **after redacting secrets**
37
+ (API keys, tokens, credentials, private URLs/paths, personal data). If this is a
38
+ potential security vulnerability, do **not** post it publicly; use the Security
39
+ reporting channel instead.
40
+
41
+ ```text
42
+ Traceback (most recent call last):
43
+ ...
44
+
45
+ ```
46
+
47
+ ## 🛠 Environment Information
48
+
49
+ - **Python Version:** (e.g., 3.13)
50
+ - **Package Version:** (e.g., 1.2.3)
51
+ - **Operating System:** (e.g., Windows 11, Ubuntu 22.04, macOS)
52
+ - **Relevant Dependencies:** (e.g., numpy, pandas version if applicable)
53
+
54
+ ## 📎 Additional Context
55
+
56
+ Add any other context about the problem here (e.g., screenshots, logs).
@@ -0,0 +1,5 @@
1
+ blank_issues_enabled: false
2
+ contact_links:
3
+ - name: GitHub Community Support
4
+ url: https://github.com/isaac-cf-wong/nullpol/discussions
5
+ about: Please ask and answer questions here.
@@ -0,0 +1,47 @@
1
+ ---
2
+ name: ✨ Feature Request
3
+ about: Suggest an idea or improvement for this package
4
+ title: '[FEATURE]: '
5
+ labels: enhancement
6
+ assignees: ''
7
+ ---
8
+
9
+ ## 🎯 Problem Statement
10
+
11
+ Is your feature request related to a problem? Please describe.
12
+
13
+ > _Ex: "I'm always frustrated when I have to manually loop over X to achieve
14
+ > Y..."_
15
+
16
+ ## 💡 Proposed Solution
17
+
18
+ A clear and concise description of what you want to happen. Describe the new
19
+ functionality or the change to existing behavior.
20
+
21
+ ## 💻 Proposed API / Usage Example
22
+
23
+ If applicable, show how you would imagine the Python code looking with this new
24
+ feature:
25
+
26
+ ```python
27
+ import nullpol
28
+
29
+ # How you'd like to use the new feature
30
+ result = nullpol.new_function(param="example")
31
+
32
+ ```
33
+
34
+ ## 🌈 Use Case & Benefits
35
+
36
+ Why is this feature important to you and other users? How does it improve the
37
+ package?
38
+
39
+ ## 🔄 Alternatives Considered
40
+
41
+ A clear and concise description of any alternative solutions or workarounds
42
+ you've considered (e.g., using a different library or a custom wrapper).
43
+
44
+ ## ⚠️ Additional Context
45
+
46
+ Add any other context, screenshots, or links to similar implementations in other
47
+ libraries here.
@@ -0,0 +1,40 @@
1
+ ---
2
+ name: 🚀 Pull Request
3
+ about: Submit your changes for review
4
+ ---
5
+
6
+ ## 📝 Summary
7
+
8
+ Briefly describe the changes introduced by this PR. Mention any related issues
9
+ using keywords (e.g., `Closes #123`).
10
+
11
+ ## ✨ Type of Change
12
+
13
+ - [ ] 🐛 Bug fix (non-breaking change which fixes an issue)
14
+ - [ ] ✨ New feature (non-breaking change which adds functionality)
15
+ - [ ] 💥 Breaking change (fix or feature that would cause existing functionality
16
+ to not work as expected)
17
+ - [ ] 📝 Documentation update
18
+ - [ ] 🎨 Refactoring (no functional changes, no API changes)
19
+
20
+ ## 🧪 How Has This Been Tested?
21
+
22
+ Please describe the tests that you ran to verify your changes.
23
+
24
+ - [ ] **Unit Tests:** `uv run pytest tests/test_feature.py`
25
+ - [ ] **Manual Test:** (Describe steps)
26
+
27
+ ## 🏗️ Checklist
28
+
29
+ - [ ] My code follows the style guidelines of this project (PEP 8).
30
+ - [ ] I have performed a self-review of my own code.
31
+ - [ ] I have commented my code, particularly in hard-to-understand areas.
32
+ - [ ] I have made corresponding changes to the documentation.
33
+ - [ ] My changes generate no new warnings.
34
+ - [ ] I have added tests that prove my fix is effective or that my feature
35
+ works.
36
+
37
+ ## 📷 Screenshots (if applicable)
38
+
39
+ If this is a UI change or produces a specific output/graph, add screenshots
40
+ here.
@@ -0,0 +1,36 @@
1
+ name: CI
2
+ on:
3
+ push:
4
+ branches: [main]
5
+ pull_request:
6
+ branches: [main]
7
+ workflow_dispatch:
8
+ workflow_call:
9
+
10
+ jobs:
11
+ test:
12
+ strategy:
13
+ matrix:
14
+ python-version: ['3.12', '3.13', '3.14']
15
+ os: [ubuntu-latest, macos-latest]
16
+ runs-on: ${{ matrix.os }}
17
+ steps:
18
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
19
+
20
+ - name: Install uv
21
+ uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
22
+ with:
23
+ python-version: ${{ matrix.python-version }}
24
+ enable-cache: 'true'
25
+
26
+ - name: Install dependencies
27
+ run: uv sync --group dev --frozen
28
+
29
+ - name: Run tests with pytest
30
+ run: uv run --frozen pytest
31
+
32
+ - name: Upload coverage to Codecov
33
+ if: ${{ !cancelled() }}
34
+ uses: codecov/codecov-action@0fb7174895f61a3b6b78fc075e0cd60383518dac # v5
35
+ with:
36
+ token: ${{ secrets.CODECOV_TOKEN }}
@@ -0,0 +1,29 @@
1
+ name: CodeQL
2
+ on:
3
+ push:
4
+ branches: [main]
5
+ pull_request:
6
+ branches: [main]
7
+ workflow_dispatch:
8
+ workflow_call:
9
+
10
+ permissions:
11
+ security-events: write
12
+
13
+ jobs:
14
+ codeql:
15
+ name: codeql
16
+ runs-on: ubuntu-latest
17
+ steps:
18
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
19
+
20
+ - name: Initialize CodeQL
21
+ uses: github/codeql-action/init@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4
22
+ with:
23
+ languages: python
24
+
25
+ - name: Autobuild
26
+ uses: github/codeql-action/autobuild@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4
27
+
28
+ - name: Perform CodeQL Analysis
29
+ uses: github/codeql-action/analyze@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4
@@ -0,0 +1,42 @@
1
+ name: Documentation
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ workflow_dispatch:
7
+
8
+ permissions:
9
+ contents: read
10
+ pages: write
11
+ id-token: write
12
+
13
+ concurrency:
14
+ group: pages
15
+ cancel-in-progress: false
16
+
17
+ jobs:
18
+ deploy:
19
+ runs-on: ubuntu-latest
20
+ environment:
21
+ name: github-pages
22
+ url: ${{ steps.deployment.outputs.page_url }}
23
+ steps:
24
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
25
+
26
+ - name: Install uv
27
+ uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
28
+ with:
29
+ python-version: '3.13'
30
+ enable-cache: 'true'
31
+
32
+ - name: Install dependencies
33
+ run: uv sync --group docs --frozen
34
+
35
+ - run: uv run --frozen zensical build
36
+
37
+ - uses: actions/upload-pages-artifact@7b1f4a764d45c48632c6b24a0339c27f5614fb0b # v4
38
+ with:
39
+ path: site
40
+
41
+ - id: deployment
42
+ uses: actions/deploy-pages@d6db90164ac5ed86f2b6aed7e0febac5b3c0c03e # v4
@@ -0,0 +1,50 @@
1
+ name: Draft Release
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+
7
+ permissions:
8
+ contents: write
9
+ pull-requests: read
10
+
11
+ concurrency:
12
+ group: draft-release
13
+ cancel-in-progress: true
14
+
15
+ jobs:
16
+ draft-release:
17
+ runs-on: ubuntu-latest
18
+ steps:
19
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
20
+ with:
21
+ fetch-depth: 0
22
+
23
+ - name: Generate changelog
24
+ id: changelog
25
+ uses: orhun/git-cliff-action@f50e11560dce63f7c33227798f90b924471a88b5 # v4.8.0
26
+ with:
27
+ config: cliff.toml
28
+ args: --unreleased --verbose
29
+ env:
30
+ OUTPUT: CHANGELOG.md
31
+
32
+ - name: Delete existing draft release
33
+ continue-on-error: true
34
+ run: |
35
+ gh release delete next-release --yes
36
+ env:
37
+ GH_TOKEN: ${{ github.token }}
38
+
39
+ - name: Create or Update Draft Release
40
+ uses: softprops/action-gh-release@3bb12739c298aeb8a4eeaf626c5b8d85266b0e65 # v2
41
+ with:
42
+ tag_name: next-release
43
+ name: 'Next Release (Draft)'
44
+ body: |
45
+ ${{ steps.changelog.outputs.content }}
46
+
47
+ ---
48
+ *This is an automatically generated draft release.*
49
+ draft: true
50
+ prerelease: false
@@ -0,0 +1,59 @@
1
+ name: Publish to PyPI
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ inputs:
6
+ tag_name:
7
+ description: 'Tag name for the publish (e.g., v1.2.3)'
8
+ required: true
9
+ type: string
10
+ workflow_call:
11
+ inputs:
12
+ tag_name:
13
+ description: 'Tag name for the publish (e.g., v1.2.3)'
14
+ required: true
15
+ type: string
16
+
17
+ jobs:
18
+ publish:
19
+ runs-on: ubuntu-latest
20
+ environment:
21
+ name: pypi
22
+ permissions:
23
+ id-token: write
24
+ contents: read
25
+ steps:
26
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
27
+ with:
28
+ ref: ${{ inputs.tag_name || github.event.inputs.tag_name }}
29
+ fetch-depth: 0
30
+
31
+ - name: Output build information
32
+ run: |
33
+ echo "### Publishing Build :package:" >> $GITHUB_STEP_SUMMARY
34
+ echo "- **Version tag**: ${{ inputs.tag_name || github.event.inputs.tag_name }}" >> $GITHUB_STEP_SUMMARY
35
+
36
+ - name: Install uv
37
+ uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
38
+ with:
39
+ python-version: '3.13'
40
+ enable-cache: 'true'
41
+
42
+ - name: Install dependencies
43
+ run: uv sync --group dev --frozen
44
+
45
+ - name: Build distribution
46
+ run: uv build
47
+
48
+ - name: Smoke test (wheel)
49
+ run:
50
+ uv run --isolated --no-project --with dist/*.whl
51
+ tests/smoke_test.py
52
+
53
+ - name: Smoke test (source distribution)
54
+ run:
55
+ uv run --isolated --no-project --with dist/*.tar.gz
56
+ tests/smoke_test.py
57
+
58
+ - name: Publish to PyPI
59
+ run: uv publish
@@ -0,0 +1,76 @@
1
+ name: Publish to TestPyPI
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+ workflow_dispatch:
8
+ inputs:
9
+ tag_name:
10
+ description: 'Tag name for the publish (e.g., v1.2.3)'
11
+ required: false
12
+ type: string
13
+ workflow_call:
14
+ inputs:
15
+ tag_name:
16
+ description: 'Tag name for the publish (e.g., v1.2.3)'
17
+ required: false
18
+ type: string
19
+
20
+ jobs:
21
+ publish:
22
+ runs-on: ubuntu-latest
23
+ environment:
24
+ name: testpypi
25
+ permissions:
26
+ id-token: write
27
+ contents: read
28
+ steps:
29
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
30
+ with:
31
+ ref: ${{ inputs.tag_name || github.sha }}
32
+ fetch-depth: 0
33
+
34
+ - name: Output build information
35
+ run: |
36
+ echo "### Publishing Build :package:" >> $GITHUB_STEP_SUMMARY
37
+ echo "- **Version tag**: ${{ inputs.tag_name || github.sha }}" >> $GITHUB_STEP_SUMMARY
38
+
39
+ - name: Install uv
40
+ uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
41
+ with:
42
+ python-version: '3.13'
43
+ enable-cache: 'true'
44
+
45
+ - name: Install dependencies
46
+ run: uv sync --group dev --group build --frozen
47
+
48
+ - name: Set version for publishing
49
+ run: |
50
+ if [ -n "${{ inputs.tag_name }}" ]; then
51
+ # Use the tag, stripping 'v' prefix if present
52
+ VERSION=$(echo "${{ inputs.tag_name }}" | sed 's/^v//')
53
+ else
54
+ # For untagged builds, use a dev version without local part
55
+ # Get the dev version from hatch-vcs, then strip +local
56
+ VERSION=$(uv run --frozen hatch version | sed 's/+.*//')
57
+ fi
58
+
59
+ # Update pyproject.toml with sed
60
+ sed -i "s/dynamic = \[\"version\"\]/version = \"$VERSION\"\ndynamic = []/" pyproject.toml
61
+
62
+ - name: Build distribution
63
+ run: uv build
64
+
65
+ - name: Smoke test (wheel)
66
+ run:
67
+ uv run --isolated --no-project --with dist/*.whl
68
+ tests/smoke_test.py
69
+
70
+ - name: Smoke test (source distribution)
71
+ run:
72
+ uv run --isolated --no-project --with dist/*.tar.gz
73
+ tests/smoke_test.py
74
+
75
+ - name: Publish to TestPyPI
76
+ run: uv publish --index testpypi
@@ -0,0 +1,58 @@
1
+ name: Release
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ inputs:
6
+ tag_name:
7
+ description: 'Tag name for the release (e.g., v1.2.3)'
8
+ required: true
9
+ type: string
10
+ workflow_call:
11
+ inputs:
12
+ tag_name:
13
+ description: 'Tag name for the release (e.g., v1.2.3)'
14
+ required: true
15
+ type: string
16
+
17
+ permissions:
18
+ contents: write
19
+
20
+ jobs:
21
+ release:
22
+ runs-on: ubuntu-latest
23
+ permissions:
24
+ contents: write
25
+ steps:
26
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
27
+ with:
28
+ fetch-depth: 0
29
+ ref: ${{ inputs.tag_name || github.event.inputs.tag_name }}
30
+
31
+ - name: Generate changelog
32
+ id: changelog
33
+ uses: orhun/git-cliff-action@f50e11560dce63f7c33227798f90b924471a88b5 # v4.8.0
34
+ with:
35
+ config: cliff.toml
36
+ args: --current --verbose
37
+ env:
38
+ OUTPUT: CHANGELOG.md
39
+
40
+ - name: Delete draft release
41
+ continue-on-error: true
42
+ run: |
43
+ gh release delete next-release --yes
44
+ env:
45
+ GH_TOKEN: ${{ github.token }}
46
+
47
+ - name: Create Release
48
+ uses: softprops/action-gh-release@3bb12739c298aeb8a4eeaf626c5b8d85266b0e65 # v2
49
+ with:
50
+ tag_name:
51
+ ${{ inputs.tag_name || github.event.inputs.tag_name }}
52
+ body: ${{ steps.changelog.outputs.content }}
53
+ draft: false
54
+ prerelease:
55
+ ${{ contains(inputs.tag_name ||
56
+ github.event.inputs.tag_name, 'alpha') ||
57
+ contains(inputs.tag_name || github.event.inputs.tag_name,
58
+ 'beta') }}
@@ -0,0 +1,137 @@
1
+ name: Scheduled Release
2
+
3
+ on:
4
+ schedule:
5
+ - cron: '0 0 * * 2'
6
+ workflow_dispatch:
7
+
8
+ permissions:
9
+ contents: write
10
+
11
+ jobs:
12
+ check_new_commits:
13
+ runs-on: ubuntu-latest
14
+ outputs:
15
+ has-changes: ${{ steps.check_commits.outputs.has-changes }}
16
+ steps:
17
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
18
+ with:
19
+ fetch-depth: 0
20
+
21
+ - name: Check for new commits
22
+ id: check_commits
23
+ uses: isaac-cf-wong/detect-git-changes-action@a67357ee6ce349a844983224faa2d0e3dfb29c7e # v0.0.12
24
+ with:
25
+ use-latest-tag: true
26
+
27
+ ci:
28
+ needs: check_new_commits
29
+ if: ${{ needs.check_new_commits.outputs.has-changes == 'true' }}
30
+ uses: ./.github/workflows/ci.yml
31
+
32
+ codeql:
33
+ needs: check_new_commits
34
+ if: ${{ needs.check_new_commits.outputs.has-changes == 'true'}}
35
+ uses: ./.github/workflows/codeql.yml
36
+ permissions:
37
+ security-events: write
38
+
39
+ create_tag:
40
+ needs: [ci, codeql]
41
+ runs-on: ubuntu-latest
42
+ outputs:
43
+ new_tag: ${{ steps.tag_version.outputs.new_tag }}
44
+ steps:
45
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
46
+ with:
47
+ fetch-depth: 0
48
+
49
+ - name: Install uv
50
+ uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
51
+ with:
52
+ python-version: '3.13'
53
+ enable-cache: 'true'
54
+
55
+ - name: Install dependencies
56
+ run: uv sync --group release --frozen
57
+
58
+ - name: Bump version and push tag
59
+ id: tag_version
60
+ run: |
61
+ PREVIOUS_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "none")
62
+ if [ "$PREVIOUS_TAG" = "none" ]; then
63
+ NEW_TAG="v0.1.0"
64
+ else
65
+ NEW_TAG=$(uv run --frozen git-cliff --bumped-version --config cliff.toml 2>/dev/null)
66
+ fi
67
+ if ! git rev-parse "$NEW_TAG" >/dev/null 2>&1; then
68
+ echo "Creating annotated tag $NEW_TAG"
69
+
70
+ git config user.name "github-actions[bot]"
71
+ git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
72
+
73
+ git tag -a "$NEW_TAG" -m "Release $NEW_TAG"
74
+ git push origin "$NEW_TAG"
75
+ else
76
+ echo "Tag $NEW_TAG already exists, skipping."
77
+ exit 1
78
+ fi
79
+ echo "new_tag=$NEW_TAG" >> $GITHUB_OUTPUT
80
+ echo "previous_tag=$PREVIOUS_TAG" >> $GITHUB_OUTPUT
81
+
82
+ - name: Output tag information
83
+ if: ${{ steps.check_commits.outputs.has-changes == 'true' }}
84
+ run: |
85
+ echo "### Tag Created :rocket:" >> $GITHUB_STEP_SUMMARY
86
+ echo "- **New tag**: ${{ steps.tag_version.outputs.new_tag }}" >> $GITHUB_STEP_SUMMARY
87
+ echo "- **Previous tag**: ${{ steps.tag_version.outputs.previous_tag }}" >> $GITHUB_STEP_SUMMARY
88
+ echo "- **Changelog**: ${{ steps.tag_version.outputs.changelog }}" >> $GITHUB_STEP_SUMMARY
89
+
90
+ release:
91
+ needs: create_tag
92
+ uses: ./.github/workflows/release.yml
93
+ permissions:
94
+ contents: write
95
+ id-token: write
96
+ with:
97
+ tag_name: ${{ needs.create_tag.outputs.new_tag }}
98
+
99
+ publish:
100
+ needs: release
101
+ runs-on: ubuntu-latest
102
+ environment:
103
+ name: pypi
104
+ permissions:
105
+ id-token: write
106
+ contents: read
107
+ steps:
108
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
109
+ with:
110
+ ref: ${{ needs.create_tag.outputs.new_tag }}
111
+ fetch-depth: 0
112
+
113
+ - name: Output build information
114
+ run: |
115
+ echo "### Publishing Build :package:" >> $GITHUB_STEP_SUMMARY
116
+ echo "- **Version tag**: ${{ needs.create_tag.outputs.new_tag }}" >> $GITHUB_STEP_SUMMARY
117
+
118
+ - name: Install uv
119
+ uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7
120
+ with:
121
+ python-version: '3.13'
122
+
123
+ - name: Build distribution
124
+ run: uv build
125
+
126
+ - name: Smoke test (wheel)
127
+ run:
128
+ uv run --isolated --no-project --with dist/*.whl
129
+ tests/smoke_test.py
130
+
131
+ - name: Smoke test (source distribution)
132
+ run:
133
+ uv run --isolated --no-project --with dist/*.tar.gz
134
+ tests/smoke_test.py
135
+
136
+ - name: Publish
137
+ run: uv publish
@@ -0,0 +1,18 @@
1
+ name: 'Semantic PR Check'
2
+
3
+ on:
4
+ pull_request_target:
5
+ types:
6
+ - opened
7
+ - reopened
8
+ - edited
9
+ - synchronize
10
+
11
+ jobs:
12
+ main:
13
+ name: Validate PR title
14
+ runs-on: ubuntu-latest
15
+ steps:
16
+ - uses: amannn/action-semantic-pull-request@48f256284bd46cdaab1048c3721360e808335d50 # v6.1.1
17
+ env:
18
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}