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.
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/PKG-INFO +22 -29
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/README.md +21 -28
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/pyproject.toml +1 -1
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/__init__.py +1 -1
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/.gitignore +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/CHANGELOG.md +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/LICENSE +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/NOTICE +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/core/__init__.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/core/compose.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/core/format.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/core/frames.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/core/schema.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/core/table.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/io/__init__.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/models/__init__.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/models/extract.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/models/pool.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/models/regression.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/models/survival.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/models/uvregression.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/notebook/__init__.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/plot/__init__.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/plot/_backend.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/plot/forest.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/plot/inline.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/plot/km.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/render/__init__.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/render/_zip_determinism.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/render/base.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/render/docx.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/render/html.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/render/image.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/render/latex.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/render/markdown.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/render/pptx.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/render/xlsx.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/summary/__init__.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/summary/calibrate.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/summary/design.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/summary/effect_size.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/summary/extras.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/summary/smd.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/summary/stats.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/summary/tbl_cross.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/summary/tbl_one.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/summary/tbl_summary.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/summary/tests.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/summary/typing.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/summary/weights.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/themes/__init__.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/src/pysofra/themes/registry.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/conftest.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/fixtures/scipy_validation/README.md +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/fixtures/scipy_validation/anova_oneway.json +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/fixtures/scipy_validation/chi_square.json +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/fixtures/scipy_validation/fisher_2x2.json +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/fixtures/scipy_validation/kruskal_wallis.json +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/fixtures/scipy_validation/student_t.json +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/fixtures/scipy_validation/svyttest.json +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/fixtures/scipy_validation/weighted_mean.json +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/fixtures/scipy_validation/welch_t_test.json +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/fixtures/scipy_validation/wilcoxon_rank_sum.json +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_compose.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_compose_edges.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_conditional_formatting.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_design_regression.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_extract_edges.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_extras_edges.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_extras_edges_2.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_format.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_joss_api_stability.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_joss_property_invariants.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_joss_renderer_consistency.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_joss_statistical_correctness.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_latex_pptx.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_misc_fixes.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_modifier_edges.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_multi_model.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_partial_modifiers.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_partials.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_plot_determinism.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_plot_embedding.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_plots.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_polars.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_pptx_overflow.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_rao_scott.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_regression.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_regressions.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_render_edges.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_render_edges_2.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_rendering.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_scipy_validation.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_snapshot.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_stats.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_summary_edges.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_summary_edges_2.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_survey_design.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_survey_extensions.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_survival.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_table_edges.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_tbl_one.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_test_overrides.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_uvregression_factors.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_validation_fixes.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_weights.py +0 -0
- {pysofra-0.1.0a1 → pysofra-0.1.0a2}/tests/test_wishlist.py +0 -0
- {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.
|
|
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
|
[](https://github.com/jturner-uofl/pysofra)
|
|
74
74
|
[](https://www.python.org/downloads/)
|
|
75
|
-
[](LICENSE)
|
|
75
|
+
[](https://github.com/jturner-uofl/pysofra/blob/main/LICENSE)
|
|
76
76
|
[](https://github.com/astral-sh/ruff)
|
|
77
77
|
[](http://mypy-lang.org/)
|
|
78
78
|
[](#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)**
|
|
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)**
|
|
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
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
[
|
|
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.
|
|
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)
|
|
261
|
-
unintended rename, removal, or signature change surfaces as
|
|
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
|
|
291
|
-
|
|
292
|
-
|
|
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
|
|
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
|
[](https://github.com/jturner-uofl/pysofra)
|
|
8
8
|
[](https://www.python.org/downloads/)
|
|
9
|
-
[](LICENSE)
|
|
9
|
+
[](https://github.com/jturner-uofl/pysofra/blob/main/LICENSE)
|
|
10
10
|
[](https://github.com/astral-sh/ruff)
|
|
11
11
|
[](http://mypy-lang.org/)
|
|
12
12
|
[](#status)
|
|
@@ -50,9 +50,9 @@
|
|
|
50
50
|
|
|
51
51
|
<div align="center">
|
|
52
52
|
|
|
53
|
-
**[Showcase notebook](examples/pysofra_showcase.ipynb)**
|
|
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)**
|
|
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
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
[
|
|
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.
|
|
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)
|
|
195
|
-
unintended rename, removal, or signature change surfaces as
|
|
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
|
|
225
|
-
|
|
226
|
-
|
|
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
|
|
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.
|
|
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" }
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|