reactorcheck 0.2.2__tar.gz → 0.2.3__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 (61) hide show
  1. reactorcheck-0.2.3/.github/ISSUE_TEMPLATE/bug-report.yml +72 -0
  2. reactorcheck-0.2.3/.github/ISSUE_TEMPLATE/config.yml +5 -0
  3. reactorcheck-0.2.3/.github/ISSUE_TEMPLATE/feature-request.yml +42 -0
  4. reactorcheck-0.2.3/.github/ISSUE_TEMPLATE/real-dataset-compatibility.yml +74 -0
  5. reactorcheck-0.2.3/.github/ISSUE_TEMPLATE/scientific-result-question.yml +56 -0
  6. reactorcheck-0.2.3/.github/PULL_REQUEST_TEMPLATE.md +16 -0
  7. reactorcheck-0.2.3/.github/dependabot.yml +22 -0
  8. {reactorcheck-0.2.2 → reactorcheck-0.2.3}/.github/workflows/ci.yml +3 -2
  9. {reactorcheck-0.2.2 → reactorcheck-0.2.3}/.github/workflows/release.yml +3 -1
  10. {reactorcheck-0.2.2 → reactorcheck-0.2.3}/CHANGELOG.md +7 -0
  11. {reactorcheck-0.2.2 → reactorcheck-0.2.3}/CITATION.cff +1 -1
  12. reactorcheck-0.2.3/CONTRIBUTING.md +60 -0
  13. {reactorcheck-0.2.2 → reactorcheck-0.2.3}/PKG-INFO +14 -9
  14. {reactorcheck-0.2.2 → reactorcheck-0.2.3}/README.md +12 -8
  15. {reactorcheck-0.2.2 → reactorcheck-0.2.3}/pyproject.toml +2 -1
  16. {reactorcheck-0.2.2 → reactorcheck-0.2.3}/src/reactorcheck/__init__.py +1 -1
  17. {reactorcheck-0.2.2 → reactorcheck-0.2.3}/src/reactorcheck/units.py +1 -1
  18. {reactorcheck-0.2.2 → reactorcheck-0.2.3}/tests/test_project_metadata.py +4 -3
  19. {reactorcheck-0.2.2 → reactorcheck-0.2.3}/tests/test_version.py +1 -1
  20. reactorcheck-0.2.2/CONTRIBUTING.md +0 -24
  21. {reactorcheck-0.2.2 → reactorcheck-0.2.3}/.gitignore +0 -0
  22. {reactorcheck-0.2.2 → reactorcheck-0.2.3}/LICENSE +0 -0
  23. {reactorcheck-0.2.2 → reactorcheck-0.2.3}/docs/assets/composition-result.png +0 -0
  24. {reactorcheck-0.2.2 → reactorcheck-0.2.3}/docs/assets/example-result.png +0 -0
  25. {reactorcheck-0.2.2 → reactorcheck-0.2.3}/docs/assets/social-preview.png +0 -0
  26. {reactorcheck-0.2.2 → reactorcheck-0.2.3}/docs/dependency-licenses.md +0 -0
  27. {reactorcheck-0.2.2 → reactorcheck-0.2.3}/docs/interchange.md +0 -0
  28. {reactorcheck-0.2.2 → reactorcheck-0.2.3}/docs/public-data-sources.md +0 -0
  29. {reactorcheck-0.2.2 → reactorcheck-0.2.3}/docs/scientific-definitions.md +0 -0
  30. {reactorcheck-0.2.2 → reactorcheck-0.2.3}/examples/synthetic_composition.csv +0 -0
  31. {reactorcheck-0.2.2 → reactorcheck-0.2.3}/examples/synthetic_composition.xlsx +0 -0
  32. {reactorcheck-0.2.2 → reactorcheck-0.2.3}/examples/synthetic_composition_config.json +0 -0
  33. {reactorcheck-0.2.2 → reactorcheck-0.2.3}/examples/synthetic_config.json +0 -0
  34. {reactorcheck-0.2.2 → reactorcheck-0.2.3}/examples/synthetic_reactor.csv +0 -0
  35. {reactorcheck-0.2.2 → reactorcheck-0.2.3}/schemas/reactorcheck-interchange.experimental.schema.json +0 -0
  36. {reactorcheck-0.2.2 → reactorcheck-0.2.3}/scripts/generate_example_assets.py +0 -0
  37. {reactorcheck-0.2.2 → reactorcheck-0.2.3}/scripts/validate_public_reactor_data.py +0 -0
  38. {reactorcheck-0.2.2 → reactorcheck-0.2.3}/src/reactorcheck/__main__.py +0 -0
  39. {reactorcheck-0.2.2 → reactorcheck-0.2.3}/src/reactorcheck/calculations.py +0 -0
  40. {reactorcheck-0.2.2 → reactorcheck-0.2.3}/src/reactorcheck/cli.py +0 -0
  41. {reactorcheck-0.2.2 → reactorcheck-0.2.3}/src/reactorcheck/composition.py +0 -0
  42. {reactorcheck-0.2.2 → reactorcheck-0.2.3}/src/reactorcheck/gui.py +0 -0
  43. {reactorcheck-0.2.2 → reactorcheck-0.2.3}/src/reactorcheck/gui_controller.py +0 -0
  44. {reactorcheck-0.2.2 → reactorcheck-0.2.3}/src/reactorcheck/io.py +0 -0
  45. {reactorcheck-0.2.2 → reactorcheck-0.2.3}/src/reactorcheck/models.py +0 -0
  46. {reactorcheck-0.2.2 → reactorcheck-0.2.3}/src/reactorcheck/plotting.py +0 -0
  47. {reactorcheck-0.2.2 → reactorcheck-0.2.3}/src/reactorcheck/py.typed +0 -0
  48. {reactorcheck-0.2.2 → reactorcheck-0.2.3}/src/reactorcheck/qc.py +0 -0
  49. {reactorcheck-0.2.2 → reactorcheck-0.2.3}/src/reactorcheck/service.py +0 -0
  50. {reactorcheck-0.2.2 → reactorcheck-0.2.3}/src/reactorcheck/species.py +0 -0
  51. {reactorcheck-0.2.2 → reactorcheck-0.2.3}/src/reactorcheck/steady.py +0 -0
  52. {reactorcheck-0.2.2 → reactorcheck-0.2.3}/tests/conftest.py +0 -0
  53. {reactorcheck-0.2.2 → reactorcheck-0.2.3}/tests/gui_widget_smoke.py +0 -0
  54. {reactorcheck-0.2.2 → reactorcheck-0.2.3}/tests/test_calculations.py +0 -0
  55. {reactorcheck-0.2.2 → reactorcheck-0.2.3}/tests/test_composition.py +0 -0
  56. {reactorcheck-0.2.2 → reactorcheck-0.2.3}/tests/test_io_cli_gui.py +0 -0
  57. {reactorcheck-0.2.2 → reactorcheck-0.2.3}/tests/test_public_data_regressions.py +0 -0
  58. {reactorcheck-0.2.2 → reactorcheck-0.2.3}/tests/test_service.py +0 -0
  59. {reactorcheck-0.2.2 → reactorcheck-0.2.3}/tests/test_species.py +0 -0
  60. {reactorcheck-0.2.2 → reactorcheck-0.2.3}/tests/test_steady.py +0 -0
  61. {reactorcheck-0.2.2 → reactorcheck-0.2.3}/tests/test_units.py +0 -0
@@ -0,0 +1,72 @@
1
+ name: Bug report
2
+ description: Report reproducible incorrect software behavior.
3
+ title: "bug: "
4
+ body:
5
+ - type: markdown
6
+ attributes:
7
+ value: |
8
+ Do not upload unpublished, confidential, proprietary, licensed, identifying, or sensitive research data. Never include credentials, tokens, or internal paths. Prefer a minimal synthetic reproducer.
9
+ - type: input
10
+ id: version
11
+ attributes:
12
+ label: ReactorCheck version
13
+ placeholder: "reactorcheck --version"
14
+ validations:
15
+ required: true
16
+ - type: input
17
+ id: python
18
+ attributes:
19
+ label: Python version
20
+ validations:
21
+ required: true
22
+ - type: dropdown
23
+ id: os
24
+ attributes:
25
+ label: Operating system
26
+ options: [Linux, macOS, Windows, Other]
27
+ validations:
28
+ required: true
29
+ - type: input
30
+ id: installation
31
+ attributes:
32
+ label: Installation method
33
+ placeholder: "PyPI, editable source install, or other"
34
+ validations:
35
+ required: true
36
+ - type: dropdown
37
+ id: interface
38
+ attributes:
39
+ label: Interface
40
+ options: [CLI, GUI, Python API]
41
+ validations:
42
+ required: true
43
+ - type: textarea
44
+ id: expected
45
+ attributes:
46
+ label: Expected behavior
47
+ validations:
48
+ required: true
49
+ - type: textarea
50
+ id: observed
51
+ attributes:
52
+ label: Observed behavior
53
+ validations:
54
+ required: true
55
+ - type: textarea
56
+ id: error
57
+ attributes:
58
+ label: Sanitized error message
59
+ - type: textarea
60
+ id: reproducer
61
+ attributes:
62
+ label: Minimal reproducer
63
+ description: Use synthetic or clearly redistributable data only.
64
+ validations:
65
+ required: true
66
+ - type: checkboxes
67
+ id: privacy
68
+ attributes:
69
+ label: Public-data safety
70
+ options:
71
+ - label: I have not included private research data, credentials, internal paths, or identifying metadata.
72
+ required: true
@@ -0,0 +1,5 @@
1
+ blank_issues_enabled: false
2
+ contact_links:
3
+ - name: Security vulnerability
4
+ url: https://github.com/hdkim99/ReactorCheck/security/advisories/new
5
+ about: Report security issues privately; never attach sensitive research data.
@@ -0,0 +1,42 @@
1
+ name: Feature request
2
+ description: Propose a change backed by a concrete research workflow.
3
+ title: "feature: "
4
+ body:
5
+ - type: textarea
6
+ id: workflow
7
+ attributes:
8
+ label: Research workflow requiring this feature
9
+ validations:
10
+ required: true
11
+ - type: input
12
+ id: instrument
13
+ attributes:
14
+ label: Instrument or data format involved
15
+ - type: input
16
+ id: public_data
17
+ attributes:
18
+ label: Public example dataset DOI / URL
19
+ - type: textarea
20
+ id: workaround
21
+ attributes:
22
+ label: Current manual workaround
23
+ validations:
24
+ required: true
25
+ - type: textarea
26
+ id: interpretation
27
+ attributes:
28
+ label: Scientific interpretation impact
29
+ description: Explain whether this could change definitions, units, assumptions, or numerical results.
30
+ validations:
31
+ required: true
32
+ - type: textarea
33
+ id: proposal
34
+ attributes:
35
+ label: Proposed behavior
36
+ - type: checkboxes
37
+ id: privacy
38
+ attributes:
39
+ label: Public-data safety
40
+ options:
41
+ - label: I have not included confidential research data, personal information, credentials, or proprietary files.
42
+ required: true
@@ -0,0 +1,74 @@
1
+ name: Real dataset compatibility
2
+ description: Report a laboratory export or public dataset that ReactorCheck cannot process as documented.
3
+ title: "compatibility: "
4
+ body:
5
+ - type: markdown
6
+ attributes:
7
+ value: |
8
+ Do not upload confidential, unpublished, proprietary, sensitive, or licensed raw files to this public issue. A sanitized header/schema or minimal synthetic reproducer is usually enough.
9
+ - type: input
10
+ id: version
11
+ attributes:
12
+ label: Project version
13
+ validations:
14
+ required: true
15
+ - type: input
16
+ id: python
17
+ attributes:
18
+ label: Python version
19
+ validations:
20
+ required: true
21
+ - type: input
22
+ id: os_install
23
+ attributes:
24
+ label: Operating system and installation method
25
+ validations:
26
+ required: true
27
+ - type: input
28
+ id: instrument
29
+ attributes:
30
+ label: Instrument / vendor
31
+ description: Omit serial numbers and institutional identifiers.
32
+ validations:
33
+ required: true
34
+ - type: input
35
+ id: file_type
36
+ attributes:
37
+ label: Input file type
38
+ placeholder: "CSV or XLSX; include worksheet layout when relevant"
39
+ validations:
40
+ required: true
41
+ - type: textarea
42
+ id: expected
43
+ attributes:
44
+ label: Expected behavior
45
+ validations:
46
+ required: true
47
+ - type: textarea
48
+ id: observed
49
+ attributes:
50
+ label: Observed behavior and sanitized error message
51
+ validations:
52
+ required: true
53
+ - type: dropdown
54
+ id: shareable
55
+ attributes:
56
+ label: Can the data be shared publicly under clear redistribution terms?
57
+ options: [Yes, No, Unsure]
58
+ validations:
59
+ required: true
60
+ - type: input
61
+ id: public_source
62
+ attributes:
63
+ label: Public dataset DOI / URL, if applicable
64
+ - type: textarea
65
+ id: reproducer
66
+ attributes:
67
+ label: Minimal reproducer or sanitized header/schema
68
+ - type: checkboxes
69
+ id: privacy
70
+ attributes:
71
+ label: Public-data safety
72
+ options:
73
+ - label: I have not uploaded confidential data, personal information, credentials, proprietary files, or internal paths.
74
+ required: true
@@ -0,0 +1,56 @@
1
+ name: Scientific definition or result question
2
+ description: Ask about a metric, basis, unit, equation, or numerical result.
3
+ title: "science: "
4
+ body:
5
+ - type: markdown
6
+ attributes:
7
+ value: Do not attach confidential or unpublished measurements. Use a hand-checkable minimal example.
8
+ - type: input
9
+ id: metric
10
+ attributes:
11
+ label: Metric / analysis
12
+ placeholder: "conversion, selectivity, balance, rate, flow reconstruction, ..."
13
+ validations:
14
+ required: true
15
+ - type: textarea
16
+ id: expected_definition
17
+ attributes:
18
+ label: Expected definition
19
+ validations:
20
+ required: true
21
+ - type: textarea
22
+ id: observed
23
+ attributes:
24
+ label: Observed result
25
+ validations:
26
+ required: true
27
+ - type: input
28
+ id: basis
29
+ attributes:
30
+ label: Input basis
31
+ placeholder: "wet/dry, raw/normalized, molar/carbon, internal standard, ..."
32
+ validations:
33
+ required: true
34
+ - type: input
35
+ id: units
36
+ attributes:
37
+ label: Units
38
+ validations:
39
+ required: true
40
+ - type: textarea
41
+ id: reference
42
+ attributes:
43
+ label: Reference, DOI, and relevant equation
44
+ - type: textarea
45
+ id: example
46
+ attributes:
47
+ label: Hand-checkable minimal example
48
+ validations:
49
+ required: true
50
+ - type: checkboxes
51
+ id: privacy
52
+ attributes:
53
+ label: Public-data safety
54
+ options:
55
+ - label: This report contains no confidential data or identifying research metadata.
56
+ required: true
@@ -0,0 +1,16 @@
1
+ ## What and why
2
+
3
+ <!-- Describe the focused change and the researcher workflow it addresses. -->
4
+
5
+ ## Scientific behavior
6
+
7
+ <!-- State definitions, equations, units, basis, assumptions, references/DOIs, and whether existing results change. Write "No scientific behavior change" when applicable. -->
8
+
9
+ ## Verification
10
+
11
+ - [ ] Formatting, Ruff, mypy, pytest, and package build pass.
12
+ - [ ] New behavior has normal, boundary, invalid, and regression coverage where applicable.
13
+ - [ ] CLI, GUI/service wiring, and exports remain consistent.
14
+ - [ ] Documentation and support claims match verified behavior.
15
+ - [ ] No confidential data, credentials, identifying metadata, or unlicensed fixtures are included.
16
+ - [ ] Dependency/license changes and public-data provenance are documented.
@@ -0,0 +1,22 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: github-actions
4
+ directory: "/"
5
+ schedule:
6
+ interval: weekly
7
+ day: monday
8
+ timezone: Asia/Seoul
9
+ open-pull-requests-limit: 5
10
+ groups:
11
+ github-actions:
12
+ patterns: ["*"]
13
+ - package-ecosystem: pip
14
+ directory: "/"
15
+ schedule:
16
+ interval: weekly
17
+ day: monday
18
+ timezone: Asia/Seoul
19
+ open-pull-requests-limit: 5
20
+ groups:
21
+ development-tools:
22
+ patterns: ["build", "mypy", "pandas-stubs", "pytest", "pytest-cov", "ruff", "twine", "types-*"]
@@ -17,10 +17,11 @@ concurrency:
17
17
  jobs:
18
18
  required:
19
19
  name: CI / required
20
- # Public fork code must never execute on persistent self-hosted research hardware.
20
+ # Only owner-authored same-repository PRs may execute on persistent research hardware.
21
21
  if: >-
22
22
  github.event_name != 'pull_request' ||
23
- github.event.pull_request.head.repo.full_name == github.repository
23
+ (github.actor == github.repository_owner &&
24
+ github.event.pull_request.head.repo.full_name == github.repository)
24
25
  runs-on: [self-hosted, dgx-spark]
25
26
  timeout-minutes: 60
26
27
  env:
@@ -12,6 +12,8 @@ jobs:
12
12
  contents: read
13
13
  steps:
14
14
  - uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6
15
+ with:
16
+ persist-credentials: false
15
17
  - uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6
16
18
  with:
17
19
  python-version: "3.12"
@@ -61,4 +63,4 @@ jobs:
61
63
  with:
62
64
  name: python-package-distributions
63
65
  path: dist/
64
- - uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # release/v1
66
+ - uses: pypa/gh-action-pypi-publish@7245906fb61fa33a13554f9d5fb856fe61758086 # v1.14.3
@@ -3,6 +3,13 @@
3
3
  All notable changes follow [Keep a Changelog](https://keepachangelog.com/) and
4
4
  versions follow semantic versioning.
5
5
 
6
+ ## [0.2.3] - 2026-11-16
7
+
8
+ ### Security
9
+
10
+ - Update the PyPI publishing action to v1.14.3 (GHSA-5xjx-3w67-w9x9).
11
+ Scientific calculations and public APIs are unchanged.
12
+
6
13
  ## [0.2.2] - 2026-08-23
7
14
 
8
15
  ### Added
@@ -2,7 +2,7 @@ cff-version: 1.2.0
2
2
  message: "If you use ReactorCheck, please cite this software."
3
3
  title: "ReactorCheck"
4
4
  type: software
5
- version: 0.2.2
5
+ version: 0.2.3
6
6
  date-released: 2026-08-23
7
7
  license: MIT
8
8
  repository-code: "https://github.com/hdkim99/ReactorCheck"
@@ -0,0 +1,60 @@
1
+ # Contributing
2
+
3
+ Thank you for helping make catalytic-reactor calculations more transparent and
4
+ reproducible.
5
+
6
+ ## Before opening an issue
7
+
8
+ - Search existing issues and choose the dataset-compatibility or scientific-result
9
+ form when applicable.
10
+ - Never upload unpublished, confidential, proprietary, licensed, or identifying
11
+ research data to a public issue. Share a minimal synthetic reproducer or sanitized
12
+ headers/schema instead.
13
+ - Do not include credentials, internal paths, instrument serial numbers, or private
14
+ sample names.
15
+
16
+ ## Development checks
17
+
18
+ Install `.[dev]`, create a focused branch, and run:
19
+
20
+ ```bash
21
+ ruff format --check .
22
+ ruff check .
23
+ mypy src
24
+ pytest
25
+ python -m build
26
+ ```
27
+
28
+ ## Scientific changes
29
+
30
+ Keep equations in the core, never in GUI callbacks. A change to conversion,
31
+ selectivity, yield, rate, STY, GHSV/WHSV, unit conversion, flow reconstruction, or
32
+ mass/element balance must state:
33
+
34
+ - the scientific definition and equation;
35
+ - input/output units, basis, assumptions, and physical bounds;
36
+ - a primary reference or DOI when relevant;
37
+ - whether existing numerical results change and why; and
38
+ - a hand-calculated, synthetic, or legally usable regression case covering invalid
39
+ as well as normal inputs.
40
+
41
+ `pytest` passing alone does not establish scientific correctness. Do not weaken an
42
+ assertion to conceal a disagreement; classify the cause as implementation, test,
43
+ definition, unit, data model, or environment.
44
+
45
+ Use small Conventional Commit-style changes such as `feat:`, `fix:`, `test:`, and
46
+ `docs:`. Synthetic data must be redistributable, and public-data-derived fixtures must
47
+ identify their source, license, and reduction method.
48
+
49
+ After changing the public composition example, run
50
+ `python scripts/generate_example_assets.py` and inspect both PNG files before
51
+ committing the regenerated XLSX/visual assets.
52
+
53
+ ## Self-hosted CI safety
54
+
55
+ The required CI job runs on the persistent `dgx-spark` self-hosted runner.
56
+ Pushes and manual dispatches may use that runner. Pull requests run there only when
57
+ the current repository owner opens them from a same-repository branch. Fork and
58
+ bot-authored pull-request jobs are deliberately skipped so unreviewed code or dependency
59
+ updates cannot execute on research hardware. Maintainers must review those changes before
60
+ reproducing them in an owner-authored same-repository branch.
@@ -1,11 +1,12 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: reactorcheck
3
- Version: 0.2.2
3
+ Version: 0.2.3
4
4
  Summary: Unit-aware catalytic reactor analysis from compositions or measured species flows.
5
5
  Project-URL: Homepage, https://github.com/hdkim99/ReactorCheck
6
6
  Project-URL: Repository, https://github.com/hdkim99/ReactorCheck
7
7
  Project-URL: Issues, https://github.com/hdkim99/ReactorCheck/issues
8
8
  Project-URL: Documentation, https://github.com/hdkim99/ReactorCheck#readme
9
+ Project-URL: Releases, https://github.com/hdkim99/ReactorCheck/releases
9
10
  Author: Hyun Dong Kim
10
11
  License: MIT License
11
12
 
@@ -62,6 +63,7 @@ Description-Content-Type: text/markdown
62
63
  **Turn reactor compositions or measured species flows into auditable catalytic metrics and QC.**
63
64
 
64
65
  [![CI](https://github.com/hdkim99/ReactorCheck/actions/workflows/ci.yml/badge.svg)](https://github.com/hdkim99/ReactorCheck/actions/workflows/ci.yml)
66
+ [![PyPI](https://img.shields.io/pypi/v/reactorcheck)](https://pypi.org/project/reactorcheck/)
65
67
  [![Python 3.10+](https://img.shields.io/badge/python-3.10%2B-blue.svg)](https://www.python.org/)
66
68
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/hdkim99/ReactorCheck/blob/main/LICENSE)
67
69
 
@@ -88,22 +90,24 @@ Python 3.10 or newer is required. Tk is needed only for the desktop GUI.
88
90
  python -m pip install reactorcheck
89
91
  ```
90
92
 
91
- For the bundled example datasets, unreleased development code, or contributions,
92
- clone the public source and use an editable install instead:
93
+ ## 30-second example
93
94
 
94
- ## 30-second bundled example (source install)
95
+ Download the two public-safe example inputs and run them with the PyPI installation:
95
96
 
96
97
  ```bash
97
- git clone https://github.com/hdkim99/ReactorCheck.git
98
- cd ReactorCheck
99
- python -m pip install -e .
100
- reactorcheck analyze examples/synthetic_composition.csv \
101
- --config examples/synthetic_composition_config.json \
98
+ mkdir reactorcheck-demo && cd reactorcheck-demo
99
+ curl -LO https://raw.githubusercontent.com/hdkim99/ReactorCheck/main/examples/synthetic_composition.csv
100
+ curl -LO https://raw.githubusercontent.com/hdkim99/ReactorCheck/main/examples/synthetic_composition_config.json
101
+ reactorcheck analyze synthetic_composition.csv \
102
+ --config synthetic_composition_config.json \
102
103
  --output reactorcheck-composition.xlsx \
103
104
  --plot reactorcheck-composition.png
104
105
  reactorcheck-gui
105
106
  ```
106
107
 
108
+ If you are already in a source checkout, use the paths under `examples/` shown in
109
+ the repository instead. Clone the repository and install `-e .` only for development.
110
+
107
111
  The synthetic CO hydrogenation example is available as both
108
112
  [`CSV`](https://github.com/hdkim99/ReactorCheck/blob/main/examples/synthetic_composition.csv) and
109
113
  [`XLSX`](https://github.com/hdkim99/ReactorCheck/blob/main/examples/synthetic_composition.xlsx). Its hand calculation reconstructs
@@ -191,6 +195,7 @@ tabular/JSON schemas rather than shared private code.
191
195
  ## Development
192
196
 
193
197
  ```bash
198
+ python -m pip install -e .
194
199
  python -m pip install -e ".[dev]"
195
200
  ruff format --check .
196
201
  ruff check .
@@ -3,6 +3,7 @@
3
3
  **Turn reactor compositions or measured species flows into auditable catalytic metrics and QC.**
4
4
 
5
5
  [![CI](https://github.com/hdkim99/ReactorCheck/actions/workflows/ci.yml/badge.svg)](https://github.com/hdkim99/ReactorCheck/actions/workflows/ci.yml)
6
+ [![PyPI](https://img.shields.io/pypi/v/reactorcheck)](https://pypi.org/project/reactorcheck/)
6
7
  [![Python 3.10+](https://img.shields.io/badge/python-3.10%2B-blue.svg)](https://www.python.org/)
7
8
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/hdkim99/ReactorCheck/blob/main/LICENSE)
8
9
 
@@ -29,22 +30,24 @@ Python 3.10 or newer is required. Tk is needed only for the desktop GUI.
29
30
  python -m pip install reactorcheck
30
31
  ```
31
32
 
32
- For the bundled example datasets, unreleased development code, or contributions,
33
- clone the public source and use an editable install instead:
33
+ ## 30-second example
34
34
 
35
- ## 30-second bundled example (source install)
35
+ Download the two public-safe example inputs and run them with the PyPI installation:
36
36
 
37
37
  ```bash
38
- git clone https://github.com/hdkim99/ReactorCheck.git
39
- cd ReactorCheck
40
- python -m pip install -e .
41
- reactorcheck analyze examples/synthetic_composition.csv \
42
- --config examples/synthetic_composition_config.json \
38
+ mkdir reactorcheck-demo && cd reactorcheck-demo
39
+ curl -LO https://raw.githubusercontent.com/hdkim99/ReactorCheck/main/examples/synthetic_composition.csv
40
+ curl -LO https://raw.githubusercontent.com/hdkim99/ReactorCheck/main/examples/synthetic_composition_config.json
41
+ reactorcheck analyze synthetic_composition.csv \
42
+ --config synthetic_composition_config.json \
43
43
  --output reactorcheck-composition.xlsx \
44
44
  --plot reactorcheck-composition.png
45
45
  reactorcheck-gui
46
46
  ```
47
47
 
48
+ If you are already in a source checkout, use the paths under `examples/` shown in
49
+ the repository instead. Clone the repository and install `-e .` only for development.
50
+
48
51
  The synthetic CO hydrogenation example is available as both
49
52
  [`CSV`](https://github.com/hdkim99/ReactorCheck/blob/main/examples/synthetic_composition.csv) and
50
53
  [`XLSX`](https://github.com/hdkim99/ReactorCheck/blob/main/examples/synthetic_composition.xlsx). Its hand calculation reconstructs
@@ -132,6 +135,7 @@ tabular/JSON schemas rather than shared private code.
132
135
  ## Development
133
136
 
134
137
  ```bash
138
+ python -m pip install -e .
135
139
  python -m pip install -e ".[dev]"
136
140
  ruff format --check .
137
141
  ruff check .
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "reactorcheck"
7
- version = "0.2.2"
7
+ version = "0.2.3"
8
8
  description = "Unit-aware catalytic reactor analysis from compositions or measured species flows."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -59,6 +59,7 @@ Homepage = "https://github.com/hdkim99/ReactorCheck"
59
59
  Repository = "https://github.com/hdkim99/ReactorCheck"
60
60
  Issues = "https://github.com/hdkim99/ReactorCheck/issues"
61
61
  Documentation = "https://github.com/hdkim99/ReactorCheck#readme"
62
+ Releases = "https://github.com/hdkim99/ReactorCheck/releases"
62
63
 
63
64
  [tool.hatch.build.targets.wheel]
64
65
  packages = ["src/reactorcheck"]
@@ -18,4 +18,4 @@ __all__ = [
18
18
  "analyze_file",
19
19
  "analyze_frame",
20
20
  ]
21
- __version__ = "0.2.2"
21
+ __version__ = "0.2.3"
@@ -17,7 +17,7 @@ ureg.define("sccm = centimeter ** 3 / minute")
17
17
 
18
18
  STANDARD_TEMPERATURE = 273.15 * ureg.kelvin
19
19
  STANDARD_PRESSURE = 1.0 * ureg.atmosphere
20
- GAS_CONSTANT = 8.31446261815324 * ureg.joule / ureg.mole / ureg.kelvin
20
+ GAS_CONSTANT: pint.Quantity[Any] = 8.31446261815324 * ureg.joule / ureg.mole / ureg.kelvin
21
21
 
22
22
 
23
23
  class UnitError(ValueError):
@@ -16,12 +16,13 @@ def test_readme_leads_with_pypi_install_and_has_current_status() -> None:
16
16
  assert "publication is prepared but has not been performed" not in readme
17
17
 
18
18
 
19
- def test_general_ci_targets_dgx_and_blocks_fork_pull_requests() -> None:
19
+ def test_general_ci_targets_dgx_and_blocks_external_or_bot_pull_requests() -> None:
20
20
  workflow = (ROOT / ".github" / "workflows" / "ci.yml").read_text()
21
21
  assert "runs-on: [self-hosted, dgx-spark]" in workflow
22
22
  assert "ubuntu-latest" not in workflow
23
23
  assert "workflow_dispatch:" in workflow
24
- assert "github.event.pull_request.head.repo.full_name == github.repository" in workflow
24
+ assert workflow.count("github.actor == github.repository_owner") == 1
25
+ assert workflow.count("github.event.pull_request.head.repo.full_name == github.repository") == 1
25
26
  assert "PIP_NO_CACHE_DIR" in workflow
26
27
  assert "actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09" in workflow
27
28
  assert "actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1" in workflow
@@ -53,7 +54,7 @@ def test_release_workflow_is_trusted_publishing_only() -> None:
53
54
  assert "/tmp/reactorcheck-release-venv/bin/python -m pip check" in workflow
54
55
  assert "id-token: write" in workflow
55
56
  assert "name: pypi" in workflow
56
- assert "pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33" in workflow
57
+ assert "pypa/gh-action-pypi-publish@7245906fb61fa33a13554f9d5fb856fe61758086" in workflow
57
58
  assert "PYPI_API_TOKEN" not in workflow
58
59
  assert "secrets." not in workflow
59
60
  publish = workflow.split(" publish:\n", maxsplit=1)[1]
@@ -18,4 +18,4 @@ def _match(path: Path, pattern: str) -> str:
18
18
  def test_version_surfaces_are_consistent() -> None:
19
19
  pyproject = _match(ROOT / "pyproject.toml", r'^version = "([^"]+)"$')
20
20
  citation = _match(ROOT / "CITATION.cff", r"^version: ([^\s]+)$")
21
- assert __version__ == pyproject == citation == "0.2.2"
21
+ assert __version__ == pyproject == citation == "0.2.3"
@@ -1,24 +0,0 @@
1
- # Contributing
2
-
3
- Install `.[dev]`, create a focused branch, and run `ruff check .`, `mypy src`,
4
- `pytest`, and `python -m build` before opening a pull request. Keep scientific
5
- equations in the core, never in GUI callbacks. New equations require a definition,
6
- units, assumptions, a hand-calculated or synthetic regression case, and physical
7
- edge cases. Do not weaken assertions to conceal a scientific disagreement; record
8
- whether the cause is implementation, test, definition, unit, model, or environment.
9
-
10
- Use small Conventional Commit-style changes such as `feat:`, `fix:`, `test:`, and
11
- `docs:`. Synthetic data must be redistributable. Never commit private experimental
12
- data, credentials, or personally identifying metadata.
13
-
14
- After changing the public composition example, run
15
- `python scripts/generate_example_assets.py` and inspect both PNG files before
16
- committing the regenerated XLSX/visual assets.
17
-
18
- ## Self-hosted CI safety
19
-
20
- The required CI job runs on the persistent `dgx-spark` self-hosted runner.
21
- Pushes, manual dispatches, and pull requests from this repository may use that
22
- runner. Pull requests from forks are deliberately skipped so unreviewed fork
23
- code cannot execute on research hardware. Maintainers must not weaken this gate;
24
- review fork changes before reproducing them in a same-repository branch.
File without changes
File without changes