pythonQEPest 2.0.0a3__tar.gz → 2.0.0a4__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 (64) hide show
  1. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/LICENSE +21 -21
  2. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/PKG-INFO +1 -1
  3. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/README.md +198 -198
  4. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pyproject.toml +46 -46
  5. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/.env.example +3 -3
  6. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/__init__.py +11 -11
  7. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/cli/__init__.py +7 -7
  8. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/cli/cli.py +101 -101
  9. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/config/__init__.py +11 -11
  10. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/config/config_provider.py +9 -9
  11. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/config/normalise.py +12 -12
  12. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/config/qepest_config.py +31 -31
  13. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/core/__init__.py +7 -7
  14. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/core/qepest.py +98 -98
  15. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/core/qepest_meta.py +28 -28
  16. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/data.txt +1 -1
  17. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/data.txt.out +2 -2
  18. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/dto/QEPestData.py +21 -21
  19. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/dto/QEPestFile.py +34 -34
  20. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/dto/QEPestInput.py +60 -60
  21. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/dto/QEPestOutput.py +13 -13
  22. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/dto/__init__.py +27 -27
  23. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/dto/coefficients/QEPestCoefficient.py +57 -57
  24. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/dto/coefficients/QEPestCoefficientList.py +29 -29
  25. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/dto/coefficients/QEPestCoefficientNumerics.py +44 -44
  26. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/dto/coefficients/__init__.py +7 -7
  27. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/dto/normalisation/Normaliser.py +15 -15
  28. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/dto/pest_type/PestTypeCoefficient.py +30 -30
  29. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/dto/pest_type/PestTypeConfig.py +9 -9
  30. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/dto/pest_type/__init__.py +4 -4
  31. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/gui/__init__.py +7 -7
  32. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/gui/actions/__init__.py +9 -9
  33. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/gui/actions/action_clicks.py +42 -42
  34. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/gui/actions/actions_crud.py +131 -131
  35. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/gui/actions/actions_other.py +126 -126
  36. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/gui/elements/ButtonsFrame.py +50 -50
  37. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/gui/elements/DataTree.py +23 -23
  38. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/gui/elements/EditWindow.py +63 -63
  39. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/gui/elements/Menu.py +12 -12
  40. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/gui/elements/ResultTree.py +22 -22
  41. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/gui/elements/SaveButton.py +10 -10
  42. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/gui/elements/__init__.py +17 -17
  43. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/gui/gui.py +87 -87
  44. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/gui/gui_meta.py +17 -17
  45. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/gui/utility/DataManager.py +76 -76
  46. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/gui/utility/DataManagerMeta.py +8 -8
  47. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/gui/utility/__init__.py +6 -6
  48. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/helpers/__init__.py +17 -17
  49. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/helpers/check_nan.py +8 -8
  50. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/helpers/compute_df.py +5 -5
  51. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/helpers/get_num_of_cols.py +2 -2
  52. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/helpers/get_values_from_line.py +5 -5
  53. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/helpers/round_to_4digs.py +2 -2
  54. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/logger.py +58 -58
  55. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/main.py +4 -4
  56. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/providers/__init__.py +6 -6
  57. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/providers/default_provider.py +23 -23
  58. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/providers/json_provider.py +30 -30
  59. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/services/QEPestFileService.py +125 -125
  60. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/services/__init__.py +3 -3
  61. pythonqepest-2.0.0a3/pythonQEPest/providers/txt_provider.py +0 -46
  62. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/config/qepest_default.py +0 -0
  63. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/dto/normalisation/__init__.py +0 -0
  64. {pythonqepest-2.0.0a3 → pythonqepest-2.0.0a4}/pythonQEPest/helpers/norm.py +0 -0
@@ -1,21 +1,21 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 PonyLianna
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ MIT License
2
+
3
+ Copyright (c) 2026 PonyLianna
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pythonQEPest
3
- Version: 2.0.0a3
3
+ Version: 2.0.0a4
4
4
  Summary: Java QEPest but written in Python
5
5
  License-File: LICENSE
6
6
  Author: Lina
@@ -1,198 +1,198 @@
1
- # pythonQEPest
2
-
3
- [![pythonQEPest](https://github.com/PonyLianna/pythonQEPest/actions/workflows/python-package.yml/badge.svg)](https://github.com/PonyLianna/pythonQEPest/actions/workflows/python-package.yml)
4
- [![PyPI Version](https://img.shields.io/pypi/v/pythonQEPest)](https://pypi.org/project/pythonQEPest/)
5
-
6
-
7
- Python implementation of QEPest (Quantitative Estimation of Pesticide), a program for scoring molecules as herbicides (QEH), insecticides (QEI), and fungicides (QEF).
8
-
9
- Originally published in: [J Cheminform - QEPest](https://jcheminf.biomedcentral.com/articles/10.1186/s13321-014-0042-6)
10
- Original Program Link is [here](https://static-content.springer.com/esm/art%3A10.1186%2Fs13321-014-0042-6/MediaObjects/13321_2014_42_MOESM2_ESM.zip)
11
-
12
- ## Features
13
-
14
- - Calculate pesticide scores for herbicidal, insecticidal, and fungicidal activity
15
- - Command-line interface (CLI)
16
- - Graphical User Interface (GUI)
17
- - Support for JSON and TXT output formats
18
-
19
- ### Pre-built binaries
20
-
21
- Download ready-to-use executables from [Releases](https://github.com/PonyLianna/pythonQEPest/releases):
22
-
23
- | Platform | Download |
24
- |----------|----------|
25
- | Windows CLI | [main.exe](https://github.com/PonyLianna/pythonQEPest/releases/download/v2.0.0-alpha/main.exe) |
26
- | Windows GUI | [gui.exe](https://github.com/PonyLianna/pythonQEPest/releases/download/v2.0.0-alpha/gui.exe) |
27
-
28
-
29
- ## Installation
30
-
31
- ```bash
32
- pip install pythonQEPest
33
- ```
34
-
35
- Or from source:
36
-
37
- ```bash
38
- git clone https://github.com/PonyLianna/pythonQEPest.git
39
- cd pythonQEPest
40
- poetry install
41
- ```
42
-
43
- ### With GUI support
44
-
45
- ```bash
46
- pip install pythonQEPest[gui]
47
- # or
48
- poetry install --extras ui
49
- ```
50
-
51
-
52
- ## Quick Start
53
-
54
- ### CLI
55
-
56
- ```bash
57
- pythonqepest -i data.txt -o result.txt
58
- pythonqepest --input data.txt --format json
59
- pythonqepest -v # show version
60
- ```
61
-
62
- ### GUI
63
-
64
- ```bash
65
- pythonqepest-gui
66
- # or
67
- python -m pythonQEPest.gui.gui
68
- ```
69
-
70
- ### Python API
71
-
72
- ```python
73
- from pythonQEPest import QEPest, QEPestInput
74
-
75
- # Create input data
76
- qepest = QEPest()
77
- qepest.initialize_coefficients()
78
- qepest.initialize_normalisers()
79
-
80
- # From individual values
81
- inp = QEPestInput(
82
- name="mol1",
83
- mol_weight=240.2127,
84
- log_p=3.2392,
85
- hbond_acceptors=5,
86
- hbond_donors=1,
87
- rotatable_bonds=4,
88
- aromatic_rings=1
89
- )
90
-
91
- result = qepest.compute_params(inp)
92
-
93
- print(result.name) # mol1
94
- print(result.data.qe_herb) # 0.8511
95
- print(result.data.qe_insect) # 0.5339
96
- print(result.data.qe_fung) # 0.6224
97
-
98
- # Convert to array
99
- print(result.to_array()) # ["mol1", 0.6224, 0.8511, 0.5339]
100
- ```
101
-
102
- ## Input Format
103
-
104
- The input file should be a tab-separated text file with the following columns:
105
-
106
- | Column | Description |
107
- |--------|-------------|
108
- | Name | Molecule name |
109
- | MW | Molecular weight (g/mol) |
110
- | LogP | Hydrophobicity (octanol-water partition coefficient) |
111
- | HBA | Number of hydrogen bond acceptors |
112
- | HBD | Number of hydrogen bond donors |
113
- | RB | Number of rotatable bonds |
114
- | arR | Number of aromatic rings |
115
-
116
- Example `data.txt`:
117
-
118
- ```
119
- Name MW LogP HBA HBD RB arR
120
- mol1 240.2127 3.2392 5 1 4 1
121
- mol2 249.091 3.0273 3 1 5 1
122
- mol3 308.354 2.1086 1 0 7 1
123
- ```
124
-
125
- ## Output Format
126
-
127
- ### TXT (default output for CLI)
128
-
129
- ```
130
- Name QEF QEH QEI
131
- mol1 0.6224 0.8511 0.5339
132
- mol2 0.7310 0.9750 0.6913
133
- ```
134
-
135
- ### JSON
136
-
137
- ```json
138
- [
139
- {"name": "mol1", "qe_fung": 0.6224, "qe_herb": 0.8511, "qe_insect": 0.5339},
140
- {"name": "mol2", "qe_fung": 0.731, "qe_herb": 0.975, "qe_insect": 0.6913}
141
- ]
142
- ```
143
-
144
- ## Configuration
145
-
146
- ### Custom Coefficients
147
-
148
- ```python
149
- from pythonQEPest import QEPest
150
-
151
- custom_coefficients = {
152
- "herb": [
153
- (70.77, 283.0, 84.97, -1.185),
154
- (93.81, 3.077, 1.434, 0.6164),
155
- # ... 6 tuples total
156
- ],
157
- "insect": [...],
158
- "fung": [...]
159
- }
160
-
161
- qepest = QEPest(coefficients=custom_coefficients)
162
- ```
163
-
164
- ### Custom Normalisers
165
-
166
- ```python
167
- from pythonQEPest import QEPest
168
- from pythonQEPest.dto.normalisation.Normaliser import Normaliser
169
-
170
- qepest = QEPest(normalisers={"herb": Normaliser(...), ...})
171
- ```
172
-
173
- ## CLI Options
174
-
175
- | Option | Description | Default |
176
- |--------|-------------|---------|
177
- | `-i`, `--input` | Input file path | data.txt |
178
- | `-o`, `--output` | Output file path | data.out.txt |
179
- | `-f`, `--format` | Output format (json, txt) | txt |
180
- | `-v`, `--version` | Show version | - |
181
-
182
- ## Development
183
-
184
- ### Run tests
185
-
186
- ```bash
187
- poetry run pytest
188
- ```
189
-
190
- ### Build
191
-
192
- ```bash
193
- # CLI executable
194
- poetry run poe build-simple
195
-
196
- # GUI executable
197
- poetry run poe build-gui
198
- ```
1
+ # pythonQEPest
2
+
3
+ [![pythonQEPest](https://github.com/PonyLianna/pythonQEPest/actions/workflows/python-package.yml/badge.svg)](https://github.com/PonyLianna/pythonQEPest/actions/workflows/python-package.yml)
4
+ [![PyPI Version](https://img.shields.io/pypi/v/pythonQEPest)](https://pypi.org/project/pythonQEPest/)
5
+
6
+
7
+ Python implementation of QEPest (Quantitative Estimation of Pesticide), a program for scoring molecules as herbicides (QEH), insecticides (QEI), and fungicides (QEF).
8
+
9
+ Originally published in: [J Cheminform - QEPest](https://jcheminf.biomedcentral.com/articles/10.1186/s13321-014-0042-6)
10
+ Original Program Link is [here](https://static-content.springer.com/esm/art%3A10.1186%2Fs13321-014-0042-6/MediaObjects/13321_2014_42_MOESM2_ESM.zip)
11
+
12
+ ## Features
13
+
14
+ - Calculate pesticide scores for herbicidal, insecticidal, and fungicidal activity
15
+ - Command-line interface (CLI)
16
+ - Graphical User Interface (GUI)
17
+ - Support for JSON and TXT output formats
18
+
19
+ ### Pre-built binaries
20
+
21
+ Download ready-to-use executables from [Releases](https://github.com/PonyLianna/pythonQEPest/releases):
22
+
23
+ | Platform | Download |
24
+ |----------|----------|
25
+ | Windows CLI | [main.exe](https://github.com/PonyLianna/pythonQEPest/releases/download/v2.0.0-alpha/main.exe) |
26
+ | Windows GUI | [gui.exe](https://github.com/PonyLianna/pythonQEPest/releases/download/v2.0.0-alpha/gui.exe) |
27
+
28
+
29
+ ## Installation
30
+
31
+ ```bash
32
+ pip install pythonQEPest
33
+ ```
34
+
35
+ Or from source:
36
+
37
+ ```bash
38
+ git clone https://github.com/PonyLianna/pythonQEPest.git
39
+ cd pythonQEPest
40
+ poetry install
41
+ ```
42
+
43
+ ### With GUI support
44
+
45
+ ```bash
46
+ pip install pythonQEPest[gui]
47
+ # or
48
+ poetry install --extras ui
49
+ ```
50
+
51
+
52
+ ## Quick Start
53
+
54
+ ### CLI
55
+
56
+ ```bash
57
+ pythonqepest -i data.txt -o result.txt
58
+ pythonqepest --input data.txt --format json
59
+ pythonqepest -v # show version
60
+ ```
61
+
62
+ ### GUI
63
+
64
+ ```bash
65
+ pythonqepest-gui
66
+ # or
67
+ python -m pythonQEPest.gui.gui
68
+ ```
69
+
70
+ ### Python API
71
+
72
+ ```python
73
+ from pythonQEPest import QEPest, QEPestInput
74
+
75
+ # Create input data
76
+ qepest = QEPest()
77
+ qepest.initialize_coefficients()
78
+ qepest.initialize_normalisers()
79
+
80
+ # From individual values
81
+ inp = QEPestInput(
82
+ name="mol1",
83
+ mol_weight=240.2127,
84
+ log_p=3.2392,
85
+ hbond_acceptors=5,
86
+ hbond_donors=1,
87
+ rotatable_bonds=4,
88
+ aromatic_rings=1
89
+ )
90
+
91
+ result = qepest.compute_params(inp)
92
+
93
+ print(result.name) # mol1
94
+ print(result.data.qe_herb) # 0.8511
95
+ print(result.data.qe_insect) # 0.5339
96
+ print(result.data.qe_fung) # 0.6224
97
+
98
+ # Convert to array
99
+ print(result.to_array()) # ["mol1", 0.6224, 0.8511, 0.5339]
100
+ ```
101
+
102
+ ## Input Format
103
+
104
+ The input file should be a tab-separated text file with the following columns:
105
+
106
+ | Column | Description |
107
+ |--------|-------------|
108
+ | Name | Molecule name |
109
+ | MW | Molecular weight (g/mol) |
110
+ | LogP | Hydrophobicity (octanol-water partition coefficient) |
111
+ | HBA | Number of hydrogen bond acceptors |
112
+ | HBD | Number of hydrogen bond donors |
113
+ | RB | Number of rotatable bonds |
114
+ | arR | Number of aromatic rings |
115
+
116
+ Example `data.txt`:
117
+
118
+ ```
119
+ Name MW LogP HBA HBD RB arR
120
+ mol1 240.2127 3.2392 5 1 4 1
121
+ mol2 249.091 3.0273 3 1 5 1
122
+ mol3 308.354 2.1086 1 0 7 1
123
+ ```
124
+
125
+ ## Output Format
126
+
127
+ ### TXT (default output for CLI)
128
+
129
+ ```
130
+ Name QEF QEH QEI
131
+ mol1 0.6224 0.8511 0.5339
132
+ mol2 0.7310 0.9750 0.6913
133
+ ```
134
+
135
+ ### JSON
136
+
137
+ ```json
138
+ [
139
+ {"name": "mol1", "qe_fung": 0.6224, "qe_herb": 0.8511, "qe_insect": 0.5339},
140
+ {"name": "mol2", "qe_fung": 0.731, "qe_herb": 0.975, "qe_insect": 0.6913}
141
+ ]
142
+ ```
143
+
144
+ ## Configuration
145
+
146
+ ### Custom Coefficients
147
+
148
+ ```python
149
+ from pythonQEPest import QEPest
150
+
151
+ custom_coefficients = {
152
+ "herb": [
153
+ (70.77, 283.0, 84.97, -1.185),
154
+ (93.81, 3.077, 1.434, 0.6164),
155
+ # ... 6 tuples total
156
+ ],
157
+ "insect": [...],
158
+ "fung": [...]
159
+ }
160
+
161
+ qepest = QEPest(coefficients=custom_coefficients)
162
+ ```
163
+
164
+ ### Custom Normalisers
165
+
166
+ ```python
167
+ from pythonQEPest import QEPest
168
+ from pythonQEPest.dto.normalisation.Normaliser import Normaliser
169
+
170
+ qepest = QEPest(normalisers={"herb": Normaliser(...), ...})
171
+ ```
172
+
173
+ ## CLI Options
174
+
175
+ | Option | Description | Default |
176
+ |--------|-------------|---------|
177
+ | `-i`, `--input` | Input file path | data.txt |
178
+ | `-o`, `--output` | Output file path | data.out.txt |
179
+ | `-f`, `--format` | Output format (json, txt) | txt |
180
+ | `-v`, `--version` | Show version | - |
181
+
182
+ ## Development
183
+
184
+ ### Run tests
185
+
186
+ ```bash
187
+ poetry run pytest
188
+ ```
189
+
190
+ ### Build
191
+
192
+ ```bash
193
+ # CLI executable
194
+ poetry run poe build-simple
195
+
196
+ # GUI executable
197
+ poetry run poe build-gui
198
+ ```
@@ -1,46 +1,46 @@
1
- [project]
2
- name = "pythonQEPest"
3
- version = "2.0.0a3"
4
- description = "Java QEPest but written in Python"
5
- readme = "README.md"
6
- requires-python = ">=3.12,<3.15"
7
- authors = [{ name = "Lina", email = "knocker767@gmail.com" }]
8
- dependencies = ["pydantic==2.12.5", "python-dotenv>=1.2.1,<2.0.0"]
9
-
10
- [project.optional-dependencies]
11
- gui = ["pyperclip>=1.11.0,<2.0.0"]
12
- rdkit = ["rdkit (>=2024.3.1,<2026.0.0)"]
13
-
14
- [project.scripts]
15
- pythonqepest = "pythonQEPest.cli.cli:main"
16
-
17
- [project.gui-scripts]
18
- pythonqepest-gui = "pythonQEPest.gui.gui:main"
19
-
20
- [tool.poetry]
21
- packages = [{ include = "pythonQEPest" }]
22
-
23
- [dependency-groups]
24
- dev = [
25
- "pytest (>=9.0.0)",
26
- "pre-commit (>=4.3.0,<5.0.0)",
27
- "pyinstaller (>=6.18.0,<7.0.0)",
28
- "poethepoet[poetry_plugin] (>=0.39.0)",
29
- "pytest-cov (>=7.0.0,<8.0.0)",
30
- "twine (>=6.2.0,<7.0.0)",
31
- ]
32
-
33
- [build-system]
34
- requires = ["poetry-core>=1.0.0", "setuptools>=40.8.0"]
35
- build-backend = "poetry.core.masonry.api"
36
-
37
- [tool.flake8]
38
- max-line-length = 88
39
- extend-ignore = ["E203", "W503"]
40
- exclude = [".venv", ".git", "__pycache__", "build", "dist"]
41
-
42
- [tool.poe.tasks]
43
- test = "pytest"
44
- build-simple = "pyinstaller --onefile pythonQEPest/main.py"
45
- build-gui = "pyinstaller --onefile --noconsole pythonQEPest/gui/gui.py"
46
- publish-pypi = "twine upload --repository pythonQEPest dist/*"
1
+ [project]
2
+ name = "pythonQEPest"
3
+ version = "2.0.0a4"
4
+ description = "Java QEPest but written in Python"
5
+ readme = "README.md"
6
+ requires-python = ">=3.12,<3.15"
7
+ authors = [{ name = "Lina", email = "knocker767@gmail.com" }]
8
+ dependencies = ["pydantic==2.12.5", "python-dotenv>=1.2.1,<2.0.0"]
9
+
10
+ [project.optional-dependencies]
11
+ gui = ["pyperclip>=1.11.0,<2.0.0"]
12
+ rdkit = ["rdkit (>=2024.3.1,<2026.0.0)"]
13
+
14
+ [project.scripts]
15
+ pythonqepest = "pythonQEPest.cli.cli:main"
16
+
17
+ [project.gui-scripts]
18
+ pythonqepest-gui = "pythonQEPest.gui.gui:main"
19
+
20
+ [tool.poetry]
21
+ packages = [{ include = "pythonQEPest" }]
22
+
23
+ [dependency-groups]
24
+ dev = [
25
+ "pytest (>=9.0.0)",
26
+ "pre-commit (>=4.3.0,<5.0.0)",
27
+ "pyinstaller (>=6.18.0,<7.0.0)",
28
+ "poethepoet[poetry_plugin] (>=0.39.0)",
29
+ "pytest-cov (>=7.0.0,<8.0.0)",
30
+ "twine (>=6.2.0,<7.0.0)",
31
+ ]
32
+
33
+ [build-system]
34
+ requires = ["poetry-core>=1.0.0", "setuptools>=40.8.0"]
35
+ build-backend = "poetry.core.masonry.api"
36
+
37
+ [tool.flake8]
38
+ max-line-length = 88
39
+ extend-ignore = ["E203", "W503"]
40
+ exclude = [".venv", ".git", "__pycache__", "build", "dist"]
41
+
42
+ [tool.poe.tasks]
43
+ test = "pytest"
44
+ build-simple = "pyinstaller --onefile pythonQEPest/main.py"
45
+ build-gui = "pyinstaller --onefile --noconsole pythonQEPest/gui/gui.py"
46
+ publish-pypi = "twine upload --repository pythonQEPest dist/*"
@@ -1,4 +1,4 @@
1
- LOG_LEVEL="INFO"
2
- LOG_FILE_LOCATION="logs/app.log"
3
-
1
+ LOG_LEVEL="INFO"
2
+ LOG_FILE_LOCATION="logs/app.log"
3
+
4
4
  APP_DEBUG_ENABLE="false"
@@ -1,11 +1,11 @@
1
- from pythonQEPest.core import QEPest
2
- from pythonQEPest.dto import QEPestData
3
- from pythonQEPest.dto import QEPestInput
4
- from pythonQEPest.dto import QEPestOutput
5
-
6
- __all__ = [
7
- "QEPest",
8
- "QEPestData",
9
- "QEPestInput",
10
- "QEPestOutput",
11
- ]
1
+ from pythonQEPest.core import QEPest
2
+ from pythonQEPest.dto import QEPestData
3
+ from pythonQEPest.dto import QEPestInput
4
+ from pythonQEPest.dto import QEPestOutput
5
+
6
+ __all__ = [
7
+ "QEPest",
8
+ "QEPestData",
9
+ "QEPestInput",
10
+ "QEPestOutput",
11
+ ]
@@ -1,7 +1,7 @@
1
- def main():
2
- from pythonQEPest.cli.cli import main as _main
3
-
4
- return _main()
5
-
6
-
7
- __all__ = ["main"]
1
+ def main():
2
+ from pythonQEPest.cli.cli import main as _main
3
+
4
+ return _main()
5
+
6
+
7
+ __all__ = ["main"]