PyMetaAnalysis 0.2.0__tar.gz → 0.2.1__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 (101) hide show
  1. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/CHANGELOG.md +7 -0
  2. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/CITATION.cff +2 -2
  3. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/PKG-INFO +25 -19
  4. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/README.md +24 -18
  5. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/docs/index.md +5 -4
  6. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/docs/limitations.md +1 -1
  7. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/src/meta_analyze/_version.py +1 -1
  8. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/tests/test_documentation.py +10 -0
  9. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/.github/workflows/ci.yml +0 -0
  10. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/.github/workflows/pages.yml +0 -0
  11. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/.github/workflows/release.yml +0 -0
  12. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/.gitignore +0 -0
  13. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/CONTRIBUTING.md +0 -0
  14. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/LICENSE +0 -0
  15. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/SECURITY.md +0 -0
  16. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/benchmarks/README.md +0 -0
  17. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/benchmarks/benchmark_core.py +0 -0
  18. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/docs/adr/0001-optional-matplotlib.md +0 -0
  19. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/docs/adr/0002-statistical-policy.md +0 -0
  20. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/docs/citation.md +0 -0
  21. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/docs/development.md +0 -0
  22. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/docs/getting-started.md +0 -0
  23. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/docs/guides/binary-outcomes.md +0 -0
  24. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/docs/guides/continuous-outcomes.md +0 -0
  25. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/docs/guides/generic-effects.md +0 -0
  26. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/docs/guides/input-data.md +0 -0
  27. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/docs/guides/method-selection.md +0 -0
  28. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/docs/guides/plotting.md +0 -0
  29. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/docs/guides/provenance-reporting.md +0 -0
  30. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/docs/guides/r-interoperability.md +0 -0
  31. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/docs/guides/sensitivity-analysis.md +0 -0
  32. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/docs/guides/zero-events.md +0 -0
  33. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/docs/installation.md +0 -0
  34. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/docs/methods/statistical-methods.md +0 -0
  35. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/docs/reference/api.md +0 -0
  36. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/docs/reference/report-schema.md +0 -0
  37. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/docs/reference/results.md +0 -0
  38. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/docs/releasing.md +0 -0
  39. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/docs/stylesheets/extra.css +0 -0
  40. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/docs/validation.md +0 -0
  41. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/examples/README.md +0 -0
  42. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/examples/quickstart.ipynb +0 -0
  43. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/mkdocs.yml +0 -0
  44. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/pyproject.toml +0 -0
  45. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/src/meta_analyze/__init__.py +0 -0
  46. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/src/meta_analyze/api.py +0 -0
  47. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/src/meta_analyze/binary_api.py +0 -0
  48. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/src/meta_analyze/config.py +0 -0
  49. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/src/meta_analyze/continuous_api.py +0 -0
  50. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/src/meta_analyze/data.py +0 -0
  51. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/src/meta_analyze/effect_sizes/__init__.py +0 -0
  52. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/src/meta_analyze/effect_sizes/binary.py +0 -0
  53. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/src/meta_analyze/effect_sizes/continuous.py +0 -0
  54. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/src/meta_analyze/estimators/__init__.py +0 -0
  55. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/src/meta_analyze/estimators/inverse_variance.py +0 -0
  56. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/src/meta_analyze/estimators/mantel_haenszel.py +0 -0
  57. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/src/meta_analyze/estimators/tau2.py +0 -0
  58. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/src/meta_analyze/exceptions.py +0 -0
  59. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/src/meta_analyze/heterogeneity.py +0 -0
  60. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/src/meta_analyze/plotting/__init__.py +0 -0
  61. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/src/meta_analyze/plotting/_utils.py +0 -0
  62. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/src/meta_analyze/plotting/forest.py +0 -0
  63. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/src/meta_analyze/plotting/funnel.py +0 -0
  64. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/src/meta_analyze/plotting/subgroup_forest.py +0 -0
  65. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/src/meta_analyze/provenance.py +0 -0
  66. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/src/meta_analyze/py.typed +0 -0
  67. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/src/meta_analyze/reporting.py +0 -0
  68. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/src/meta_analyze/results.py +0 -0
  69. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/src/meta_analyze/sensitivity.py +0 -0
  70. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/src/meta_analyze/subgroups.py +0 -0
  71. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/tests/reference/README.md +0 -0
  72. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/tests/reference/binary_input.csv +0 -0
  73. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/tests/reference/binary_metafor.json +0 -0
  74. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/tests/reference/binary_sparse_input.csv +0 -0
  75. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/tests/reference/continuous_input.csv +0 -0
  76. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/tests/reference/continuous_metafor.json +0 -0
  77. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/tests/reference/generate_binary_metafor.R +0 -0
  78. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/tests/reference/generate_continuous_metafor.R +0 -0
  79. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/tests/reference/generate_generic_metafor.R +0 -0
  80. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/tests/reference/generate_workflow_metafor.R +0 -0
  81. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/tests/reference/generic_input.csv +0 -0
  82. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/tests/reference/generic_metafor.json +0 -0
  83. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/tests/reference/workflow_input.csv +0 -0
  84. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/tests/reference/workflow_metafor.json +0 -0
  85. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/tests/test_api.py +0 -0
  86. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/tests/test_binary.py +0 -0
  87. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/tests/test_continuous.py +0 -0
  88. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/tests/test_estimators.py +0 -0
  89. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/tests/test_funnel_plot.py +0 -0
  90. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/tests/test_numerical_stability.py +0 -0
  91. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/tests/test_plotting.py +0 -0
  92. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/tests/test_properties.py +0 -0
  93. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/tests/test_r_references.py +0 -0
  94. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/tests/test_reference_results.py +0 -0
  95. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/tests/test_release_readiness.py +0 -0
  96. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/tests/test_reporting.py +0 -0
  97. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/tests/test_sensitivity.py +0 -0
  98. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/tests/test_subgroups.py +0 -0
  99. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/tools/check_release.py +0 -0
  100. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/tools/execute_notebooks.py +0 -0
  101. {pymetaanalysis-0.2.0 → pymetaanalysis-0.2.1}/tools/inspect_distribution.py +0 -0
@@ -6,6 +6,13 @@ Changes planned for the next release accumulate under `Unreleased`.
6
6
 
7
7
  ## Unreleased
8
8
 
9
+ ## 0.2.1 - 2026-07-17
10
+
11
+ ### Fixed
12
+
13
+ - README documentation and repository links use absolute URLs so they resolve
14
+ correctly when the project description is rendered on PyPI.
15
+
9
16
  ## 0.2.0 - 2026-07-16
10
17
 
11
18
  ### Added
@@ -8,8 +8,8 @@ authors:
8
8
  - family-names: Ding
9
9
  given-names: Zhaobo
10
10
  email: ding.zb@yahoo.com
11
- version: 0.2.0
12
- date-released: 2026-07-16
11
+ version: 0.2.1
12
+ date-released: 2026-07-17
13
13
  repository-code: https://github.com/ZhaoboDing/PyMetaAnalysis
14
14
  url: https://zhaoboding.github.io/PyMetaAnalysis/
15
15
  license: MIT
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PyMetaAnalysis
3
- Version: 0.2.0
3
+ Version: 0.2.1
4
4
  Summary: A pandas-first, auditable meta-analysis library for Python
5
5
  Project-URL: Documentation, https://zhaoboding.github.io/PyMetaAnalysis/
6
6
  Project-URL: Source, https://github.com/ZhaoboDing/PyMetaAnalysis
@@ -51,7 +51,7 @@ Description-Content-Type: text/markdown
51
51
 
52
52
  [![CI](https://github.com/ZhaoboDing/PyMetaAnalysis/actions/workflows/ci.yml/badge.svg)](https://github.com/ZhaoboDing/PyMetaAnalysis/actions/workflows/ci.yml)
53
53
  [![Documentation](https://github.com/ZhaoboDing/PyMetaAnalysis/actions/workflows/pages.yml/badge.svg)](https://zhaoboding.github.io/PyMetaAnalysis/)
54
- [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
54
+ [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://github.com/ZhaoboDing/PyMetaAnalysis/blob/main/LICENSE)
55
55
 
56
56
  PyMetaAnalysis is an early-stage, pandas-first Python library for conventional
57
57
  study-level meta-analysis. It accepts DataFrames, NumPy arrays, and ordinary
@@ -178,18 +178,18 @@ are descriptive small-study-effect diagnostics, not proof of publication bias.
178
178
  The complete documentation is published at
179
179
  [zhaoboding.github.io/PyMetaAnalysis](https://zhaoboding.github.io/PyMetaAnalysis/).
180
180
 
181
- - [Installation](docs/installation.md)
182
- - [Getting started](docs/getting-started.md)
183
- - [Input data and row decisions](docs/guides/input-data.md)
184
- - [Generic](docs/guides/generic-effects.md), [binary](docs/guides/binary-outcomes.md), and [continuous](docs/guides/continuous-outcomes.md) guides
185
- - [Choosing methods](docs/guides/method-selection.md) and [statistical formulas](docs/methods/statistical-methods.md)
186
- - [Sensitivity analysis](docs/guides/sensitivity-analysis.md) and [plotting](docs/guides/plotting.md)
187
- - [Public API](docs/reference/api.md), [result objects](docs/reference/results.md), and [report schema](docs/reference/report-schema.md)
188
- - [Validation strategy](docs/validation.md) and [scope/limitations](docs/limitations.md)
189
- - [Citation guidance](docs/citation.md)
190
- - [R `meta`/`metafor` mapping](docs/guides/r-interoperability.md)
191
-
192
- An executable [end-to-end notebook](examples/quickstart.ipynb) uses synthetic
181
+ - [Installation](https://zhaoboding.github.io/PyMetaAnalysis/installation/)
182
+ - [Getting started](https://zhaoboding.github.io/PyMetaAnalysis/getting-started/)
183
+ - [Input data and row decisions](https://zhaoboding.github.io/PyMetaAnalysis/guides/input-data/)
184
+ - [Generic](https://zhaoboding.github.io/PyMetaAnalysis/guides/generic-effects/), [binary](https://zhaoboding.github.io/PyMetaAnalysis/guides/binary-outcomes/), and [continuous](https://zhaoboding.github.io/PyMetaAnalysis/guides/continuous-outcomes/) guides
185
+ - [Choosing methods](https://zhaoboding.github.io/PyMetaAnalysis/guides/method-selection/) and [statistical formulas](https://zhaoboding.github.io/PyMetaAnalysis/methods/statistical-methods/)
186
+ - [Sensitivity analysis](https://zhaoboding.github.io/PyMetaAnalysis/guides/sensitivity-analysis/) and [plotting](https://zhaoboding.github.io/PyMetaAnalysis/guides/plotting/)
187
+ - [Public API](https://zhaoboding.github.io/PyMetaAnalysis/reference/api/), [result objects](https://zhaoboding.github.io/PyMetaAnalysis/reference/results/), and [report schema](https://zhaoboding.github.io/PyMetaAnalysis/reference/report-schema/)
188
+ - [Validation strategy](https://zhaoboding.github.io/PyMetaAnalysis/validation/) and [scope/limitations](https://zhaoboding.github.io/PyMetaAnalysis/limitations/)
189
+ - [Citation guidance](https://zhaoboding.github.io/PyMetaAnalysis/citation/)
190
+ - [R `meta`/`metafor` mapping](https://zhaoboding.github.io/PyMetaAnalysis/guides/r-interoperability/)
191
+
192
+ An executable [end-to-end notebook](https://github.com/ZhaoboDing/PyMetaAnalysis/blob/main/examples/quickstart.ipynb) uses synthetic
193
193
  data to demonstrate analysis, provenance, reporting, sensitivity, and plotting.
194
194
 
195
195
  Build the complete site locally with:
@@ -207,16 +207,22 @@ edge cases, and committed R `metafor` reference fixtures. CI covers Python
207
207
  distribution builds.
208
208
 
209
209
  This is independent cross-software validation, not a formal external
210
- statistical audit. See [validation](docs/validation.md) for exact coverage.
210
+ statistical audit. See
211
+ [validation](https://zhaoboding.github.io/PyMetaAnalysis/validation/) for exact
212
+ coverage.
211
213
 
212
214
  ## Contributing
213
215
 
214
- See [CONTRIBUTING.md](CONTRIBUTING.md) and the full
215
- [development guide](docs/development.md). Statistical changes require formula
216
+ See
217
+ [CONTRIBUTING.md](https://github.com/ZhaoboDing/PyMetaAnalysis/blob/main/CONTRIBUTING.md)
218
+ and the full
219
+ [development guide](https://zhaoboding.github.io/PyMetaAnalysis/development/).
220
+ Statistical changes require formula
216
221
  documentation, boundary tests, and an independent comparison where available.
217
222
 
218
- Security-sensitive reports should follow [SECURITY.md](SECURITY.md).
223
+ Security-sensitive reports should follow
224
+ [SECURITY.md](https://github.com/ZhaoboDing/PyMetaAnalysis/blob/main/SECURITY.md).
219
225
 
220
226
  ## License
221
227
 
222
- [MIT](LICENSE)
228
+ [MIT](https://github.com/ZhaoboDing/PyMetaAnalysis/blob/main/LICENSE)
@@ -2,7 +2,7 @@
2
2
 
3
3
  [![CI](https://github.com/ZhaoboDing/PyMetaAnalysis/actions/workflows/ci.yml/badge.svg)](https://github.com/ZhaoboDing/PyMetaAnalysis/actions/workflows/ci.yml)
4
4
  [![Documentation](https://github.com/ZhaoboDing/PyMetaAnalysis/actions/workflows/pages.yml/badge.svg)](https://zhaoboding.github.io/PyMetaAnalysis/)
5
- [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
5
+ [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://github.com/ZhaoboDing/PyMetaAnalysis/blob/main/LICENSE)
6
6
 
7
7
  PyMetaAnalysis is an early-stage, pandas-first Python library for conventional
8
8
  study-level meta-analysis. It accepts DataFrames, NumPy arrays, and ordinary
@@ -129,18 +129,18 @@ are descriptive small-study-effect diagnostics, not proof of publication bias.
129
129
  The complete documentation is published at
130
130
  [zhaoboding.github.io/PyMetaAnalysis](https://zhaoboding.github.io/PyMetaAnalysis/).
131
131
 
132
- - [Installation](docs/installation.md)
133
- - [Getting started](docs/getting-started.md)
134
- - [Input data and row decisions](docs/guides/input-data.md)
135
- - [Generic](docs/guides/generic-effects.md), [binary](docs/guides/binary-outcomes.md), and [continuous](docs/guides/continuous-outcomes.md) guides
136
- - [Choosing methods](docs/guides/method-selection.md) and [statistical formulas](docs/methods/statistical-methods.md)
137
- - [Sensitivity analysis](docs/guides/sensitivity-analysis.md) and [plotting](docs/guides/plotting.md)
138
- - [Public API](docs/reference/api.md), [result objects](docs/reference/results.md), and [report schema](docs/reference/report-schema.md)
139
- - [Validation strategy](docs/validation.md) and [scope/limitations](docs/limitations.md)
140
- - [Citation guidance](docs/citation.md)
141
- - [R `meta`/`metafor` mapping](docs/guides/r-interoperability.md)
142
-
143
- An executable [end-to-end notebook](examples/quickstart.ipynb) uses synthetic
132
+ - [Installation](https://zhaoboding.github.io/PyMetaAnalysis/installation/)
133
+ - [Getting started](https://zhaoboding.github.io/PyMetaAnalysis/getting-started/)
134
+ - [Input data and row decisions](https://zhaoboding.github.io/PyMetaAnalysis/guides/input-data/)
135
+ - [Generic](https://zhaoboding.github.io/PyMetaAnalysis/guides/generic-effects/), [binary](https://zhaoboding.github.io/PyMetaAnalysis/guides/binary-outcomes/), and [continuous](https://zhaoboding.github.io/PyMetaAnalysis/guides/continuous-outcomes/) guides
136
+ - [Choosing methods](https://zhaoboding.github.io/PyMetaAnalysis/guides/method-selection/) and [statistical formulas](https://zhaoboding.github.io/PyMetaAnalysis/methods/statistical-methods/)
137
+ - [Sensitivity analysis](https://zhaoboding.github.io/PyMetaAnalysis/guides/sensitivity-analysis/) and [plotting](https://zhaoboding.github.io/PyMetaAnalysis/guides/plotting/)
138
+ - [Public API](https://zhaoboding.github.io/PyMetaAnalysis/reference/api/), [result objects](https://zhaoboding.github.io/PyMetaAnalysis/reference/results/), and [report schema](https://zhaoboding.github.io/PyMetaAnalysis/reference/report-schema/)
139
+ - [Validation strategy](https://zhaoboding.github.io/PyMetaAnalysis/validation/) and [scope/limitations](https://zhaoboding.github.io/PyMetaAnalysis/limitations/)
140
+ - [Citation guidance](https://zhaoboding.github.io/PyMetaAnalysis/citation/)
141
+ - [R `meta`/`metafor` mapping](https://zhaoboding.github.io/PyMetaAnalysis/guides/r-interoperability/)
142
+
143
+ An executable [end-to-end notebook](https://github.com/ZhaoboDing/PyMetaAnalysis/blob/main/examples/quickstart.ipynb) uses synthetic
144
144
  data to demonstrate analysis, provenance, reporting, sensitivity, and plotting.
145
145
 
146
146
  Build the complete site locally with:
@@ -158,16 +158,22 @@ edge cases, and committed R `metafor` reference fixtures. CI covers Python
158
158
  distribution builds.
159
159
 
160
160
  This is independent cross-software validation, not a formal external
161
- statistical audit. See [validation](docs/validation.md) for exact coverage.
161
+ statistical audit. See
162
+ [validation](https://zhaoboding.github.io/PyMetaAnalysis/validation/) for exact
163
+ coverage.
162
164
 
163
165
  ## Contributing
164
166
 
165
- See [CONTRIBUTING.md](CONTRIBUTING.md) and the full
166
- [development guide](docs/development.md). Statistical changes require formula
167
+ See
168
+ [CONTRIBUTING.md](https://github.com/ZhaoboDing/PyMetaAnalysis/blob/main/CONTRIBUTING.md)
169
+ and the full
170
+ [development guide](https://zhaoboding.github.io/PyMetaAnalysis/development/).
171
+ Statistical changes require formula
167
172
  documentation, boundary tests, and an independent comparison where available.
168
173
 
169
- Security-sensitive reports should follow [SECURITY.md](SECURITY.md).
174
+ Security-sensitive reports should follow
175
+ [SECURITY.md](https://github.com/ZhaoboDing/PyMetaAnalysis/blob/main/SECURITY.md).
170
176
 
171
177
  ## License
172
178
 
173
- [MIT](LICENSE)
179
+ [MIT](https://github.com/ZhaoboDing/PyMetaAnalysis/blob/main/LICENSE)
@@ -82,10 +82,11 @@ lists unsupported methods explicitly.
82
82
 
83
83
  ## Project status
84
84
 
85
- PyMetaAnalysis 0.2.0 adds direct generic standard-error input to the initial
86
- public analysis scope. It has not undergone a formal external statistical
87
- audit. Pin the package version for consequential work and independently check
88
- important analyses. See the repository
85
+ PyMetaAnalysis 0.2.1 fixes documentation and repository links in the PyPI
86
+ project description. Version 0.2.0 added direct generic standard-error input
87
+ to the initial public analysis scope. The project has not undergone a formal
88
+ external statistical audit. Pin the package version for consequential work
89
+ and independently check important analyses. See the repository
89
90
  [changelog](https://github.com/ZhaoboDing/PyMetaAnalysis/blob/main/CHANGELOG.md)
90
91
  and [contribution guide](development.md). For manuscripts and archived
91
92
  analyses, see [citing PyMetaAnalysis](citation.md).
@@ -69,7 +69,7 @@ workflow must version those artifacts separately.
69
69
 
70
70
  ## Stability and review status
71
71
 
72
- The package version is currently `0.2.0`. Public APIs and serialized schemas
72
+ The package version is currently `0.2.1`. Public APIs and serialized schemas
73
73
  may change during the 0.x series. Pin versions in analysis environments and
74
74
  inspect changelog/schema updates before upgrading.
75
75
 
@@ -1,3 +1,3 @@
1
1
  """Single source of truth for the package version."""
2
2
 
3
- __version__ = "0.2.0"
3
+ __version__ = "0.2.1"
@@ -51,3 +51,13 @@ def test_relative_markdown_links_resolve(path: Path) -> None:
51
51
  assert (path.parent / relative).exists(), (
52
52
  f"Broken relative link {target!r} in {path.relative_to(ROOT)}"
53
53
  )
54
+
55
+
56
+ def test_pypi_readme_links_are_absolute() -> None:
57
+ """PyPI resolves relative long-description links against its project URL."""
58
+ pattern = re.compile(r"\]\(([^)]+)\)")
59
+ for raw_target in pattern.findall((ROOT / "README.md").read_text(encoding="utf-8")):
60
+ target = raw_target.split(maxsplit=1)[0].strip("<>")
61
+ assert target.startswith(("https://", "http://", "#", "mailto:")), (
62
+ f"README link {target!r} must be absolute so it works on PyPI"
63
+ )
File without changes