pysofra 0.1.0a1__tar.gz → 0.1.0a2__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 (108) hide show
  1. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/PKG-INFO +22 -29
  2. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/README.md +21 -28
  3. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/pyproject.toml +1 -1
  4. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/__init__.py +1 -1
  5. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/.gitignore +0 -0
  6. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/CHANGELOG.md +0 -0
  7. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/LICENSE +0 -0
  8. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/NOTICE +0 -0
  9. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/core/__init__.py +0 -0
  10. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/core/compose.py +0 -0
  11. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/core/format.py +0 -0
  12. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/core/frames.py +0 -0
  13. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/core/schema.py +0 -0
  14. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/core/table.py +0 -0
  15. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/io/__init__.py +0 -0
  16. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/models/__init__.py +0 -0
  17. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/models/extract.py +0 -0
  18. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/models/pool.py +0 -0
  19. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/models/regression.py +0 -0
  20. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/models/survival.py +0 -0
  21. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/models/uvregression.py +0 -0
  22. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/notebook/__init__.py +0 -0
  23. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/plot/__init__.py +0 -0
  24. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/plot/_backend.py +0 -0
  25. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/plot/forest.py +0 -0
  26. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/plot/inline.py +0 -0
  27. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/plot/km.py +0 -0
  28. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/render/__init__.py +0 -0
  29. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/render/_zip_determinism.py +0 -0
  30. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/render/base.py +0 -0
  31. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/render/docx.py +0 -0
  32. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/render/html.py +0 -0
  33. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/render/image.py +0 -0
  34. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/render/latex.py +0 -0
  35. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/render/markdown.py +0 -0
  36. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/render/pptx.py +0 -0
  37. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/render/xlsx.py +0 -0
  38. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/summary/__init__.py +0 -0
  39. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/summary/calibrate.py +0 -0
  40. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/summary/design.py +0 -0
  41. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/summary/effect_size.py +0 -0
  42. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/summary/extras.py +0 -0
  43. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/summary/smd.py +0 -0
  44. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/summary/stats.py +0 -0
  45. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/summary/tbl_cross.py +0 -0
  46. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/summary/tbl_one.py +0 -0
  47. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/summary/tbl_summary.py +0 -0
  48. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/summary/tests.py +0 -0
  49. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/summary/typing.py +0 -0
  50. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/summary/weights.py +0 -0
  51. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/themes/__init__.py +0 -0
  52. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/themes/registry.py +0 -0
  53. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/conftest.py +0 -0
  54. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/fixtures/scipy_validation/README.md +0 -0
  55. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/fixtures/scipy_validation/anova_oneway.json +0 -0
  56. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/fixtures/scipy_validation/chi_square.json +0 -0
  57. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/fixtures/scipy_validation/fisher_2x2.json +0 -0
  58. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/fixtures/scipy_validation/kruskal_wallis.json +0 -0
  59. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/fixtures/scipy_validation/student_t.json +0 -0
  60. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/fixtures/scipy_validation/svyttest.json +0 -0
  61. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/fixtures/scipy_validation/weighted_mean.json +0 -0
  62. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/fixtures/scipy_validation/welch_t_test.json +0 -0
  63. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/fixtures/scipy_validation/wilcoxon_rank_sum.json +0 -0
  64. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_compose.py +0 -0
  65. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_compose_edges.py +0 -0
  66. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_conditional_formatting.py +0 -0
  67. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_design_regression.py +0 -0
  68. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_extract_edges.py +0 -0
  69. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_extras_edges.py +0 -0
  70. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_extras_edges_2.py +0 -0
  71. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_format.py +0 -0
  72. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_joss_api_stability.py +0 -0
  73. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_joss_property_invariants.py +0 -0
  74. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_joss_renderer_consistency.py +0 -0
  75. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_joss_statistical_correctness.py +0 -0
  76. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_latex_pptx.py +0 -0
  77. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_misc_fixes.py +0 -0
  78. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_modifier_edges.py +0 -0
  79. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_multi_model.py +0 -0
  80. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_partial_modifiers.py +0 -0
  81. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_partials.py +0 -0
  82. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_plot_determinism.py +0 -0
  83. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_plot_embedding.py +0 -0
  84. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_plots.py +0 -0
  85. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_polars.py +0 -0
  86. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_pptx_overflow.py +0 -0
  87. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_rao_scott.py +0 -0
  88. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_regression.py +0 -0
  89. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_regressions.py +0 -0
  90. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_render_edges.py +0 -0
  91. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_render_edges_2.py +0 -0
  92. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_rendering.py +0 -0
  93. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_scipy_validation.py +0 -0
  94. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_snapshot.py +0 -0
  95. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_stats.py +0 -0
  96. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_summary_edges.py +0 -0
  97. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_summary_edges_2.py +0 -0
  98. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_survey_design.py +0 -0
  99. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_survey_extensions.py +0 -0
  100. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_survival.py +0 -0
  101. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_table_edges.py +0 -0
  102. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_tbl_one.py +0 -0
  103. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_test_overrides.py +0 -0
  104. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_uvregression_factors.py +0 -0
  105. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_validation_fixes.py +0 -0
  106. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_weights.py +0 -0
  107. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_wishlist.py +0 -0
  108. {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_xlsx.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pysofra
3
- Version: 0.1.0a1
3
+ Version: 0.1.0a2
4
4
  Summary: Statistical reporting and table preparation framework for Python — the missing reporting layer.
5
5
  Project-URL: Homepage, https://github.com/jturner-uofl/pysofra
6
6
  Project-URL: Documentation, https://github.com/jturner-uofl/pysofra
@@ -72,7 +72,7 @@ Description-Content-Type: text/markdown
72
72
 
73
73
  [![Coverage](https://img.shields.io/badge/coverage-100%25-brightgreen.svg)](https://github.com/jturner-uofl/pysofra)
74
74
  [![Python](https://img.shields.io/badge/python-3.11%20%7C%203.12%20%7C%203.13-blue.svg)](https://www.python.org/downloads/)
75
- [![License: GPL-3.0+](https://img.shields.io/badge/license-GPL--3.0--or--later-blue.svg)](LICENSE)
75
+ [![License: GPL-3.0+](https://img.shields.io/badge/license-GPL--3.0--or--later-blue.svg)](https://github.com/jturner-uofl/pysofra/blob/main/LICENSE)
76
76
  [![Style: ruff](https://img.shields.io/badge/style-ruff-purple.svg)](https://github.com/astral-sh/ruff)
77
77
  [![Types: mypy strict](https://img.shields.io/badge/types-mypy%20strict-blue.svg)](http://mypy-lang.org/)
78
78
  [![Tests: 886](https://img.shields.io/badge/tests-886%20passing-brightgreen.svg)](#status)
@@ -116,9 +116,9 @@ Description-Content-Type: text/markdown
116
116
 
117
117
  <div align="center">
118
118
 
119
- **[Showcase notebook](examples/pysofra_showcase.ipynb)** · [rendered HTML](examples/pysofra_showcase.html) — *47 cells, every section a side-by-side numeric proof. Start here if you have 60 seconds.*
119
+ **[Showcase notebook](https://github.com/jturner-uofl/pysofra/blob/main/examples/pysofra_showcase.ipynb)** — *47 cells, every section a side-by-side numeric proof. Start here if you have 60 seconds.*
120
120
 
121
- **[End-to-end tutorial](examples/pysofra_tutorial.ipynb)** · [rendered HTML](examples/pysofra_tutorial.html) — *126 cells walking every public feature on a synthetic two-arm trial.*
121
+ **[End-to-end tutorial](https://github.com/jturner-uofl/pysofra/blob/main/examples/pysofra_tutorial.ipynb)** — *126 cells walking every public feature on a synthetic two-arm trial.*
122
122
 
123
123
  </div>
124
124
 
@@ -171,10 +171,10 @@ fit = sm.Logit(df["event"], X).fit(disp=False)
171
171
  )
172
172
  ```
173
173
 
174
- The full worked example from the JSS paper — baseline table by
175
- treatment arm, regression table with forest plot, and Kaplan-Meier
176
- survival summary — is in
177
- [`paper/replication/example_trial.py`](paper/replication/example_trial.py).
174
+ The end-to-end worked example — baseline table by treatment arm,
175
+ regression table with forest plot, and Kaplan-Meier survival summary —
176
+ is in the
177
+ [showcase notebook](https://github.com/jturner-uofl/pysofra/blob/main/examples/pysofra_showcase.ipynb).
178
178
 
179
179
  ---
180
180
 
@@ -255,47 +255,40 @@ pip install "pysofra[dev]" # testing + linting (pytest, ruff, mypy, hypot
255
255
 
256
256
  ## Status
257
257
 
258
- PySofra is in **alpha** (`0.1.0a1`). The public API surface is pinned
258
+ PySofra is in **alpha** (`0.1.0a2`). The public API surface is pinned
259
259
  by an explicit
260
- [API-stability test](tests/test_joss_api_stability.py) so that any
261
- unintended rename, removal, or signature change surfaces as a failed
262
- test. Quality bar at this release:
260
+ [API-stability test](https://github.com/jturner-uofl/pysofra/blob/main/tests/test_joss_api_stability.py)
261
+ so that any unintended rename, removal, or signature change surfaces as
262
+ a failed test. Quality bar at this release:
263
263
 
264
264
  * **More than 800 tests passing**, **100% line coverage**, mypy strict, ruff clean.
265
265
  * Every numeric output is validated against `scipy`, `lifelines`,
266
266
  `statsmodels`, or a hand-computed textbook formula
267
- ([test_joss_statistical_correctness.py](tests/test_joss_statistical_correctness.py)).
267
+ ([test_joss_statistical_correctness.py](https://github.com/jturner-uofl/pysofra/blob/main/tests/test_joss_statistical_correctness.py)).
268
268
  * Universal invariants enforced via Hypothesis on 720 randomized
269
269
  examples per CI run
270
- ([test_joss_property_invariants.py](tests/test_joss_property_invariants.py)).
270
+ ([test_joss_property_invariants.py](https://github.com/jturner-uofl/pysofra/blob/main/tests/test_joss_property_invariants.py)).
271
271
  * Renderer output is byte-deterministic — identical input always
272
272
  produces identical HTML/Markdown/LaTeX, required for reproducible
273
273
  publication artifacts
274
- ([test_joss_renderer_consistency.py](tests/test_joss_renderer_consistency.py)).
274
+ ([test_joss_renderer_consistency.py](https://github.com/jturner-uofl/pysofra/blob/main/tests/test_joss_renderer_consistency.py)).
275
275
 
276
276
  Bug reports and use-case feedback are very welcome.
277
277
 
278
- A **Journal of Statistical Software** paper ([`paper/paper.tex`](paper/paper.tex),
279
- bibliography in [`paper/paper.bib`](paper/paper.bib)) is in
280
- preparation. The [`paper/replication/`](paper/replication/) directory
281
- regenerates every numeric output and figure shown in the paper and
282
- includes an R cross-check script (`example_trial.R`) using
283
- `gtsummary` for digit-level verification. The
284
- [`paper/figures/`](paper/figures/) directory holds the rendered PDF
285
- and PNG embedded in the manuscript via `\includegraphics{}`.
286
-
287
278
  ## Contributing
288
279
 
289
280
  Bug reports, feature requests, and pull requests are all very welcome.
290
- Please read [`CONTRIBUTING.md`](CONTRIBUTING.md) for the workflow, the
291
- quality gates, and the
292
- [Code of Conduct](CODE_OF_CONDUCT.md).
281
+ Please read
282
+ [`CONTRIBUTING.md`](https://github.com/jturner-uofl/pysofra/blob/main/CONTRIBUTING.md)
283
+ for the workflow, the quality gates, and the
284
+ [Code of Conduct](https://github.com/jturner-uofl/pysofra/blob/main/CODE_OF_CONDUCT.md).
293
285
 
294
286
  ## License
295
287
 
296
- GPL-3.0-or-later. See [`LICENSE`](LICENSE).
288
+ GPL-3.0-or-later. See
289
+ [`LICENSE`](https://github.com/jturner-uofl/pysofra/blob/main/LICENSE).
297
290
 
298
291
  ## Citation
299
292
 
300
293
  If you use PySofra in academic work, please cite the project — see
301
- [`CITATION.cff`](CITATION.cff).
294
+ [`CITATION.cff`](https://github.com/jturner-uofl/pysofra/blob/main/CITATION.cff).
@@ -6,7 +6,7 @@
6
6
 
7
7
  [![Coverage](https://img.shields.io/badge/coverage-100%25-brightgreen.svg)](https://github.com/jturner-uofl/pysofra)
8
8
  [![Python](https://img.shields.io/badge/python-3.11%20%7C%203.12%20%7C%203.13-blue.svg)](https://www.python.org/downloads/)
9
- [![License: GPL-3.0+](https://img.shields.io/badge/license-GPL--3.0--or--later-blue.svg)](LICENSE)
9
+ [![License: GPL-3.0+](https://img.shields.io/badge/license-GPL--3.0--or--later-blue.svg)](https://github.com/jturner-uofl/pysofra/blob/main/LICENSE)
10
10
  [![Style: ruff](https://img.shields.io/badge/style-ruff-purple.svg)](https://github.com/astral-sh/ruff)
11
11
  [![Types: mypy strict](https://img.shields.io/badge/types-mypy%20strict-blue.svg)](http://mypy-lang.org/)
12
12
  [![Tests: 886](https://img.shields.io/badge/tests-886%20passing-brightgreen.svg)](#status)
@@ -50,9 +50,9 @@
50
50
 
51
51
  <div align="center">
52
52
 
53
- **[Showcase notebook](examples/pysofra_showcase.ipynb)** · [rendered HTML](examples/pysofra_showcase.html) — *47 cells, every section a side-by-side numeric proof. Start here if you have 60 seconds.*
53
+ **[Showcase notebook](https://github.com/jturner-uofl/pysofra/blob/main/examples/pysofra_showcase.ipynb)** — *47 cells, every section a side-by-side numeric proof. Start here if you have 60 seconds.*
54
54
 
55
- **[End-to-end tutorial](examples/pysofra_tutorial.ipynb)** · [rendered HTML](examples/pysofra_tutorial.html) — *126 cells walking every public feature on a synthetic two-arm trial.*
55
+ **[End-to-end tutorial](https://github.com/jturner-uofl/pysofra/blob/main/examples/pysofra_tutorial.ipynb)** — *126 cells walking every public feature on a synthetic two-arm trial.*
56
56
 
57
57
  </div>
58
58
 
@@ -105,10 +105,10 @@ fit = sm.Logit(df["event"], X).fit(disp=False)
105
105
  )
106
106
  ```
107
107
 
108
- The full worked example from the JSS paper — baseline table by
109
- treatment arm, regression table with forest plot, and Kaplan-Meier
110
- survival summary — is in
111
- [`paper/replication/example_trial.py`](paper/replication/example_trial.py).
108
+ The end-to-end worked example — baseline table by treatment arm,
109
+ regression table with forest plot, and Kaplan-Meier survival summary —
110
+ is in the
111
+ [showcase notebook](https://github.com/jturner-uofl/pysofra/blob/main/examples/pysofra_showcase.ipynb).
112
112
 
113
113
  ---
114
114
 
@@ -189,47 +189,40 @@ pip install "pysofra[dev]" # testing + linting (pytest, ruff, mypy, hypot
189
189
 
190
190
  ## Status
191
191
 
192
- PySofra is in **alpha** (`0.1.0a1`). The public API surface is pinned
192
+ PySofra is in **alpha** (`0.1.0a2`). The public API surface is pinned
193
193
  by an explicit
194
- [API-stability test](tests/test_joss_api_stability.py) so that any
195
- unintended rename, removal, or signature change surfaces as a failed
196
- test. Quality bar at this release:
194
+ [API-stability test](https://github.com/jturner-uofl/pysofra/blob/main/tests/test_joss_api_stability.py)
195
+ so that any unintended rename, removal, or signature change surfaces as
196
+ a failed test. Quality bar at this release:
197
197
 
198
198
  * **More than 800 tests passing**, **100% line coverage**, mypy strict, ruff clean.
199
199
  * Every numeric output is validated against `scipy`, `lifelines`,
200
200
  `statsmodels`, or a hand-computed textbook formula
201
- ([test_joss_statistical_correctness.py](tests/test_joss_statistical_correctness.py)).
201
+ ([test_joss_statistical_correctness.py](https://github.com/jturner-uofl/pysofra/blob/main/tests/test_joss_statistical_correctness.py)).
202
202
  * Universal invariants enforced via Hypothesis on 720 randomized
203
203
  examples per CI run
204
- ([test_joss_property_invariants.py](tests/test_joss_property_invariants.py)).
204
+ ([test_joss_property_invariants.py](https://github.com/jturner-uofl/pysofra/blob/main/tests/test_joss_property_invariants.py)).
205
205
  * Renderer output is byte-deterministic — identical input always
206
206
  produces identical HTML/Markdown/LaTeX, required for reproducible
207
207
  publication artifacts
208
- ([test_joss_renderer_consistency.py](tests/test_joss_renderer_consistency.py)).
208
+ ([test_joss_renderer_consistency.py](https://github.com/jturner-uofl/pysofra/blob/main/tests/test_joss_renderer_consistency.py)).
209
209
 
210
210
  Bug reports and use-case feedback are very welcome.
211
211
 
212
- A **Journal of Statistical Software** paper ([`paper/paper.tex`](paper/paper.tex),
213
- bibliography in [`paper/paper.bib`](paper/paper.bib)) is in
214
- preparation. The [`paper/replication/`](paper/replication/) directory
215
- regenerates every numeric output and figure shown in the paper and
216
- includes an R cross-check script (`example_trial.R`) using
217
- `gtsummary` for digit-level verification. The
218
- [`paper/figures/`](paper/figures/) directory holds the rendered PDF
219
- and PNG embedded in the manuscript via `\includegraphics{}`.
220
-
221
212
  ## Contributing
222
213
 
223
214
  Bug reports, feature requests, and pull requests are all very welcome.
224
- Please read [`CONTRIBUTING.md`](CONTRIBUTING.md) for the workflow, the
225
- quality gates, and the
226
- [Code of Conduct](CODE_OF_CONDUCT.md).
215
+ Please read
216
+ [`CONTRIBUTING.md`](https://github.com/jturner-uofl/pysofra/blob/main/CONTRIBUTING.md)
217
+ for the workflow, the quality gates, and the
218
+ [Code of Conduct](https://github.com/jturner-uofl/pysofra/blob/main/CODE_OF_CONDUCT.md).
227
219
 
228
220
  ## License
229
221
 
230
- GPL-3.0-or-later. See [`LICENSE`](LICENSE).
222
+ GPL-3.0-or-later. See
223
+ [`LICENSE`](https://github.com/jturner-uofl/pysofra/blob/main/LICENSE).
231
224
 
232
225
  ## Citation
233
226
 
234
227
  If you use PySofra in academic work, please cite the project — see
235
- [`CITATION.cff`](CITATION.cff).
228
+ [`CITATION.cff`](https://github.com/jturner-uofl/pysofra/blob/main/CITATION.cff).
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "pysofra"
7
- version = "0.1.0a1"
7
+ version = "0.1.0a2"
8
8
  description = "Statistical reporting and table preparation framework for Python — the missing reporting layer."
9
9
  readme = "README.md"
10
10
  license = { text = "GPL-3.0-or-later" }
@@ -50,7 +50,7 @@ from .summary.tbl_summary import tbl_summary
50
50
  from .summary.tests import available_tests
51
51
  from .themes.registry import available_themes, register_theme
52
52
 
53
- __version__ = "0.1.0a1"
53
+ __version__ = "0.1.0a2"
54
54
 
55
55
  __all__ = [
56
56
  "CellPart",
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes