nerdd-module 0.3.46__tar.gz → 0.3.48__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/PKG-INFO +1 -1
  2. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/input/depth_first_explorer.py +2 -4
  3. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/input/inchi_reader.py +23 -3
  4. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/input/sdf_reader.py +1 -1
  5. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/input/smiles_reader.py +23 -3
  6. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/tests/checks.py +4 -4
  7. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/tests/files.py +5 -4
  8. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/tests/models/AtomicMassModel.py +3 -3
  9. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/tests/models/MolWeightModel.py +4 -2
  10. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/tests/predictions.py +8 -3
  11. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/tests/representations.py +23 -13
  12. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module.egg-info/PKG-INFO +1 -1
  13. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/pyproject.toml +1 -2
  14. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/LICENSE +0 -0
  15. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/README.md +0 -0
  16. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/__init__.py +0 -0
  17. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/cli.py +0 -0
  18. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/config/__init__.py +0 -0
  19. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/config/configuration.py +0 -0
  20. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/config/default_configuration.py +0 -0
  21. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/config/dict_configuration.py +0 -0
  22. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/config/merged_configuration.py +0 -0
  23. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/config/models.py +0 -0
  24. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/config/package_configuration.py +0 -0
  25. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/config/search_yaml_configuration.py +0 -0
  26. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/config/yaml_configuration.py +0 -0
  27. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/converters/__init__.py +0 -0
  28. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/converters/basic_type_converter.py +0 -0
  29. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/converters/converter.py +0 -0
  30. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/converters/converter_config.py +0 -0
  31. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/converters/mol_converter.py +0 -0
  32. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/converters/problem_list_converter.py +0 -0
  33. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/converters/representation_converter.py +0 -0
  34. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/converters/source_list_converter.py +0 -0
  35. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/converters/void_converter.py +0 -0
  36. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/input/__init__.py +0 -0
  37. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/input/explorer.py +0 -0
  38. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/input/file_reader.py +0 -0
  39. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/input/gzip_reader.py +0 -0
  40. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/input/list_reader.py +0 -0
  41. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/input/mol_reader.py +0 -0
  42. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/input/reader.py +0 -0
  43. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/input/reader_config.py +0 -0
  44. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/input/stream_reader.py +0 -0
  45. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/input/string_reader.py +0 -0
  46. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/input/tar_reader.py +0 -0
  47. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/input/zip_reader.py +0 -0
  48. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/model/__init__.py +0 -0
  49. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/model/assign_name_step.py +0 -0
  50. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/model/convert_representations_step.py +0 -0
  51. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/model/enforce_schema_step.py +0 -0
  52. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/model/model.py +0 -0
  53. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/model/prediction_step.py +0 -0
  54. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/model/read_input_step.py +0 -0
  55. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/model/write_output_step.py +0 -0
  56. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/output/__init__.py +0 -0
  57. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/output/csv_writer.py +0 -0
  58. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/output/file_writer.py +0 -0
  59. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/output/iterator_writer.py +0 -0
  60. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/output/pandas_writer.py +0 -0
  61. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/output/record_list_writer.py +0 -0
  62. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/output/sdf_writer.py +0 -0
  63. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/output/writer.py +0 -0
  64. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/output/writer_config.py +0 -0
  65. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/polyfills/__init__.py +0 -0
  66. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/polyfills/block_logs.py +0 -0
  67. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/polyfills/files.py +0 -0
  68. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/polyfills/get_entry_points.py +0 -0
  69. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/polyfills/literal.py +0 -0
  70. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/polyfills/typed_dict.py +0 -0
  71. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/polyfills/types.py +0 -0
  72. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/polyfills/version.py +0 -0
  73. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/preprocessing/__init__.py +0 -0
  74. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/preprocessing/check_valid_smiles.py +0 -0
  75. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/preprocessing/chembl_structure_pipeline.py +0 -0
  76. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/preprocessing/filter_by_element.py +0 -0
  77. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/preprocessing/filter_by_weight.py +0 -0
  78. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/preprocessing/preprocessing_step.py +0 -0
  79. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/preprocessing/remove_small_fragments.py +0 -0
  80. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/preprocessing/remove_stereochemistry.py +0 -0
  81. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/preprocessing/sanitize.py +0 -0
  82. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/problem.py +0 -0
  83. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/py.typed +0 -0
  84. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/steps/__init__.py +0 -0
  85. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/steps/map_step.py +0 -0
  86. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/steps/output_step.py +0 -0
  87. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/steps/step.py +0 -0
  88. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/tests/__init__.py +0 -0
  89. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/tests/models/__init__.py +0 -0
  90. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/tests/preprocessing/DummyPreprocessingStep.py +0 -0
  91. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/tests/preprocessing/__init__.py +0 -0
  92. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/util/__init__.py +0 -0
  93. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/util/call_with_mappings.py +0 -0
  94. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/util/package.py +0 -0
  95. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module/version.py +0 -0
  96. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module.egg-info/SOURCES.txt +0 -0
  97. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module.egg-info/dependency_links.txt +0 -0
  98. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module.egg-info/requires.txt +0 -0
  99. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/nerdd_module.egg-info/top_level.txt +0 -0
  100. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/setup.cfg +0 -0
  101. {nerdd_module-0.3.46 → nerdd_module-0.3.48}/tests/test_features.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nerdd-module
3
- Version: 0.3.46
3
+ Version: 0.3.48
4
4
  Summary: Base package to create NERDD modules
5
5
  Author-email: Steffen Hirte <steffen.hirte@univie.ac.at>
6
6
  Maintainer-email: Steffen Hirte <steffen.hirte@univie.ac.at>
@@ -85,11 +85,9 @@ class DepthFirstExplorer(Explorer):
85
85
 
86
86
  if (
87
87
  score > best_score
88
- # if the score is the same, prefer the reader with higher ratio
89
- # of valid entries
88
+ # if the score is the same, prefer the reader with higher ratio of valid entries
90
89
  or (score == best_score and ratio > best_ratio)
91
- # if the ratio is the same, prefer the reader with less invalid
92
- # results
90
+ # if the ratio is the same, prefer the reader with less invalid results
93
91
  or (
94
92
  score == best_score
95
93
  and ratio == best_ratio
@@ -12,8 +12,9 @@ __all__ = ["InchiReader"]
12
12
 
13
13
 
14
14
  class InchiReader(StreamReader):
15
- def __init__(self) -> None:
15
+ def __init__(self, max_length_inchi: int = 10_000) -> None:
16
16
  super().__init__()
17
+ self._max_length_inchi = max_length_inchi
17
18
 
18
19
  def _read_stream(self, input_stream: Any, explore: ExploreCallable) -> Iterator[MoleculeEntry]:
19
20
  # suppress RDKit warnings
@@ -27,6 +28,23 @@ class InchiReader(StreamReader):
27
28
  if line.strip().startswith("#"):
28
29
  continue
29
30
 
31
+ # avoid long InChI strings, because they might take veeeeery long to parse
32
+ if len(line) > self._max_length_inchi:
33
+ errors = [
34
+ Problem(
35
+ "line_too_long",
36
+ f"Line exceeds max length of {self._max_length_inchi} characters",
37
+ )
38
+ ]
39
+ yield MoleculeEntry(
40
+ raw_input=line.strip("\n")[: self._max_length_inchi - 3] + "...",
41
+ input_type="inchi",
42
+ source=("raw_input",),
43
+ mol=None,
44
+ errors=errors,
45
+ )
46
+ continue
47
+
30
48
  try:
31
49
  mol = MolFromInchi(line, sanitize=False)
32
50
  except: # noqa: E722 (allow bare except, because RDKit is unpredictable)
@@ -46,10 +64,12 @@ class InchiReader(StreamReader):
46
64
  )
47
65
 
48
66
  def __repr__(self) -> str:
49
- return "InchiReader()"
67
+ return f"InchiReader(max_length_inchi={self._max_length_inchi})"
50
68
 
51
69
  config = ReaderConfig(
52
70
  examples=[
53
- "InChI=1S/C18H16O3/c1-2-13(12-8-4-3-5-9-12)16-17(19)14-10-6-7-11-15(14)21-18(16)20/h3-11,13,19H,2H2,1H3"
71
+ # (this is one InChI string, split into two lines)
72
+ "InChI=1S/C18H16O3/c1-2-13(12-8-4-3-5-9-12)16-17(19)14-10-6-7-11-15(14)21-18(16)20"
73
+ "/h3-11,13,19H,2H2,1H3"
54
74
  ]
55
75
  )
@@ -11,7 +11,7 @@ __all__ = ["SdfReader"]
11
11
 
12
12
 
13
13
  class SdfReader(StreamReader):
14
- def __init__(self, max_num_lines_mol_block: int = 10000) -> None:
14
+ def __init__(self, max_num_lines_mol_block: int = 10_000) -> None:
15
15
  super().__init__()
16
16
  self.max_num_lines_mol_block = max_num_lines_mol_block
17
17
 
@@ -12,8 +12,9 @@ __all__ = ["SmilesReader"]
12
12
 
13
13
 
14
14
  class SmilesReader(StreamReader):
15
- def __init__(self) -> None:
15
+ def __init__(self, max_length_smiles: int = 10_000) -> None:
16
16
  super().__init__()
17
+ self._max_length_smiles = max_length_smiles
17
18
 
18
19
  def _read_stream(self, input_stream: Any, explore: ExploreCallable) -> Iterator[MoleculeEntry]:
19
20
  # suppress RDKit warnings
@@ -27,6 +28,25 @@ class SmilesReader(StreamReader):
27
28
  if line.strip().startswith("#"):
28
29
  continue
29
30
 
31
+ line = line.strip("\n")
32
+
33
+ # avoid long smiles strings, because they might take veeeeery long to parse
34
+ if len(line) > self._max_length_smiles:
35
+ errors = [
36
+ Problem(
37
+ "line_too_long",
38
+ f"Line exceeds max length of {self._max_length_smiles} characters",
39
+ )
40
+ ]
41
+ yield MoleculeEntry(
42
+ raw_input=line[: self._max_length_smiles - 3] + "...",
43
+ input_type="smiles",
44
+ source=("raw_input",),
45
+ mol=None,
46
+ errors=errors,
47
+ )
48
+ continue
49
+
30
50
  try:
31
51
  mol = MolFromSmiles(line, sanitize=False)
32
52
  except: # noqa: E722 (allow bare except, because RDKit is unpredictable)
@@ -48,7 +68,7 @@ class SmilesReader(StreamReader):
48
68
  errors = []
49
69
 
50
70
  yield MoleculeEntry(
51
- raw_input=line.strip("\n"),
71
+ raw_input=line,
52
72
  input_type="smiles",
53
73
  source=("raw_input",),
54
74
  mol=mol,
@@ -56,6 +76,6 @@ class SmilesReader(StreamReader):
56
76
  )
57
77
 
58
78
  def __repr__(self) -> str:
59
- return "SmilesReader()"
79
+ return f"SmilesReader(max_length={self._max_length_smiles})"
60
80
 
61
81
  config = ReaderConfig(examples=["C1=NC2=C(N1COCCO)N=C(NC2=O)N"])
@@ -46,7 +46,7 @@ def check_column_value_equality(subset, column_name, expected_value):
46
46
  # try to convert to float if possible
47
47
  try:
48
48
  expected_value = literal_eval(expected_value)
49
- except:
49
+ except: # noqa: E722
50
50
  pass
51
51
 
52
52
  if expected_value is None:
@@ -72,7 +72,7 @@ def check_column_value_inequality(subset, column_name, forbidden_value):
72
72
  # try to convert to float if possible
73
73
  try:
74
74
  forbidden_value = literal_eval(forbidden_value)
75
- except:
75
+ except: # noqa: E722
76
76
  pass
77
77
 
78
78
  if forbidden_value is None:
@@ -156,13 +156,13 @@ def check_conditional_column_value(
156
156
  # try to convert to float if possible
157
157
  try:
158
158
  expected_value = literal_eval(expected_value)
159
- except:
159
+ except: # noqa: E722
160
160
  pass
161
161
 
162
162
  # same for condition value
163
163
  try:
164
164
  condition_value = literal_eval(condition_value)
165
- except:
165
+ except: # noqa: E722
166
166
  pass
167
167
 
168
168
  # condition value can be (none) to indicate None
@@ -39,9 +39,7 @@ def representation_files(molecules, input_type, num_files):
39
39
  # choose num_files-1 numbers to split the representations into num_files parts
40
40
  # the while loop makes sure that each part contains at least one valid molecule
41
41
  while True:
42
- split_indices = np.random.choice(
43
- len(representations), size=num_files - 1, replace=False
44
- )
42
+ split_indices = np.random.choice(len(representations), size=num_files - 1, replace=False)
45
43
  split_indices = np.sort(split_indices)
46
44
 
47
45
  # split the representations
@@ -57,13 +55,16 @@ def representation_files(molecules, input_type, num_files):
57
55
  # write the representations to files
58
56
  representations_files = []
59
57
 
60
- for _, split_representation in enumerate(split_representations):
58
+ for split_representation in split_representations:
61
59
  with NamedTemporaryFile("w", delete=False) as f:
62
60
  for representation in split_representation:
61
+ # write representation
63
62
  if representation is None:
64
63
  f.write("None")
65
64
  else:
66
65
  f.write(representation)
66
+
67
+ # write separator
67
68
  if input_type in ["smiles", "inchi"]:
68
69
  f.write("\n")
69
70
  elif input_type == "mol_block":
@@ -8,7 +8,9 @@ allowed_versions = ["mol_ids", "mols", "iterator", "error"]
8
8
 
9
9
 
10
10
  class AtomicMassModel(Model):
11
- def __init__(self, preprocessing_steps=[Sanitize()], version="mol_ids", **kwargs):
11
+ def __init__(self, preprocessing_steps=None, version="mol_ids", **kwargs):
12
+ if preprocessing_steps is None:
13
+ preprocessing_steps = [Sanitize()]
12
14
  assert (
13
15
  version in allowed_versions
14
16
  ), f"version must be one of {allowed_versions}, got {version}"
@@ -64,5 +66,3 @@ class AtomicMassModel(Model):
64
66
  {"name": "mass", "type": "float", "level": "atom"},
65
67
  ],
66
68
  }
67
-
68
-
@@ -9,7 +9,9 @@ allowed_versions = ["order_based", "mol_ids", "mols", "iterator", "error"]
9
9
 
10
10
 
11
11
  class MolWeightModel(Model):
12
- def __init__(self, preprocessing_steps=[Sanitize()], version="order_based", **kwargs):
12
+ def __init__(self, preprocessing_steps=None, version="order_based", **kwargs):
13
+ if preprocessing_steps is None:
14
+ preprocessing_steps = [Sanitize()]
13
15
  assert (
14
16
  version in allowed_versions
15
17
  ), f"version must be one of {allowed_versions}, got {version}"
@@ -48,4 +50,4 @@ class MolWeightModel(Model):
48
50
  "result_properties": [
49
51
  {"name": "weight", "type": "float"},
50
52
  ],
51
- }
53
+ }
@@ -21,7 +21,8 @@ def mol_weight_model(version):
21
21
 
22
22
  @when(
23
23
  parsers.parse(
24
- "the mol weight model (version '{version}') generates predictions for the molecule representations"
24
+ "the mol weight model (version '{version}') generates predictions for the molecule "
25
+ "representations"
25
26
  ),
26
27
  target_fixture="predictions",
27
28
  )
@@ -36,7 +37,8 @@ def predictions_mol_weight_model(representations, version, multiplier):
36
37
 
37
38
  @when(
38
39
  parsers.parse(
39
- "the atomic mass model (version '{version}') generates predictions for the molecule representations"
40
+ "the atomic mass model (version '{version}') generates predictions for the molecule "
41
+ "representations"
40
42
  ),
41
43
  target_fixture="predictions",
42
44
  )
@@ -48,6 +50,7 @@ def predictions_atomic_mass_model(representations, version, multiplier):
48
50
  output_format="record_list",
49
51
  )
50
52
 
53
+
51
54
  @when(
52
55
  "all results are considered",
53
56
  target_fixture="subset",
@@ -55,6 +58,7 @@ def predictions_atomic_mass_model(representations, version, multiplier):
55
58
  def all_results(predictions):
56
59
  return predictions
57
60
 
61
+
58
62
  @when(
59
63
  "the subset of the result where the input was not None is considered",
60
64
  target_fixture="subset",
@@ -63,10 +67,11 @@ def subset_without_input_none(predictions):
63
67
  # remove None entries
64
68
  return [p for p in predictions if p["input_mol"] is not None]
65
69
 
70
+
66
71
  @when(
67
72
  "the subset of the result where the preprocessed mol was not None is considered",
68
73
  target_fixture="subset",
69
74
  )
70
75
  def subset_without_preprocessed_none(predictions):
71
76
  # remove None entries
72
- return [p for p in predictions if p["preprocessed_mol"] is not None]
77
+ return [p for p in predictions if p["preprocessed_mol"] is not None]
@@ -1,3 +1,6 @@
1
+ import re
2
+ from functools import reduce
3
+
1
4
  import numpy as np
2
5
  from hypothesis import given as hgiven
3
6
  from hypothesis import seed, settings
@@ -5,10 +8,9 @@ from hypothesis import strategies as st
5
8
  from hypothesis_rdkit import mols
6
9
  from pytest_bdd import given, parsers
7
10
  from rdkit.Chem import MolToInchi, MolToMolBlock, MolToSmiles
8
- from ..polyfills import BlockLogs
9
11
  from rdkit.Chem.rdMolDescriptors import CalcExactMolWt
10
- import re
11
- from functools import reduce
12
+
13
+ from ..polyfills import BlockLogs
12
14
 
13
15
 
14
16
  @given(parsers.parse("a random seed set to {seed:d}"), target_fixture="random_seed")
@@ -38,7 +40,9 @@ def representations_from_molecules(molecules, input_type):
38
40
  elif input_type == "inchi":
39
41
  converter = MolToInchi
40
42
  elif input_type == "rdkit_mol":
41
- converter = lambda mol: mol
43
+
44
+ def converter(mol):
45
+ return mol
42
46
  else:
43
47
  raise ValueError(f"Unknown input_type: {input_type}")
44
48
 
@@ -49,9 +53,7 @@ def representations_from_molecules(molecules, input_type):
49
53
 
50
54
 
51
55
  @given(
52
- parsers.re(
53
- r"a list of (?P<num>\d+) random molecules(?:, where(?P<conditions>[\s\S]*))?"
54
- ),
56
+ parsers.re(r"a list of (?P<num>\d+) random molecules(?:, where(?P<conditions>[\s\S]*))?"),
55
57
  target_fixture="molecules",
56
58
  )
57
59
  def molecules(num, conditions, random_seed=0):
@@ -61,6 +63,7 @@ def molecules(num, conditions, random_seed=0):
61
63
  maps = []
62
64
 
63
65
  if conditions is not None:
66
+
64
67
  def filter_weight(min_weight, max_weight):
65
68
  min_weight = float(min_weight)
66
69
  max_weight = float(max_weight)
@@ -76,15 +79,19 @@ def molecules(num, conditions, random_seed=0):
76
79
 
77
80
  expressions = [
78
81
  # filters are functions that return True if the molecule should be kept
79
- ("filter", r"each mol has a weight between (?P<min_weight>\d+) and (?P<max_weight>\d+)", filter_weight),
82
+ (
83
+ "filter",
84
+ r"each mol has a weight between (?P<min_weight>\d+) and (?P<max_weight>\d+)",
85
+ filter_weight,
86
+ ),
80
87
  # maps are functions that modify the molecule
81
- ("map", r"(?P<num_none>\d+) entries are None", map_to_none)
88
+ ("map", r"(?P<num_none>\d+) entries are None", map_to_none),
82
89
  ]
83
90
 
84
91
  conditions_list = [c for c in conditions.split("\n") if c.strip() != ""]
85
92
 
86
93
  for condition in conditions_list:
87
- for kind, expression, f in expressions:
94
+ for kind, expression, f in expressions: # noqa: B007
88
95
  # conditions might be a markdown list (starting with a star character)
89
96
  expression = r"\s*(\*\s*)?" + expression + r"\s*"
90
97
 
@@ -92,7 +99,7 @@ def molecules(num, conditions, random_seed=0):
92
99
  if match:
93
100
  params = match.groupdict()
94
101
  break
95
-
102
+
96
103
  assert match is not None, f"Could not parse condition: {condition}"
97
104
 
98
105
  if kind == "filter":
@@ -102,8 +109,11 @@ def molecules(num, conditions, random_seed=0):
102
109
  else:
103
110
  raise ValueError(f"Unknown kind: {kind}")
104
111
 
105
- filter_func = lambda mol: all(f(mol) for f in filters)
106
- map_func = lambda ms: reduce(lambda ms, f: f(ms), maps, ms)
112
+ def filter_func(mol):
113
+ return all(f(mol) for f in filters)
114
+
115
+ def map_func(ms):
116
+ return reduce(lambda ms, f: f(ms), maps, ms)
107
117
 
108
118
  result = None
109
119
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nerdd-module
3
- Version: 0.3.46
3
+ Version: 0.3.48
4
4
  Summary: Base package to create NERDD modules
5
5
  Author-email: Steffen Hirte <steffen.hirte@univie.ac.at>
6
6
  Maintainer-email: Steffen Hirte <steffen.hirte@univie.ac.at>
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "nerdd-module"
7
- version = "0.3.46"
7
+ version = "0.3.48"
8
8
  description = "Base package to create NERDD modules"
9
9
  readme = "README.md"
10
10
  license = "BSD-3-Clause"
@@ -105,7 +105,6 @@ patterns = ["*.py", "*.feature", "pyproject.toml"]
105
105
 
106
106
  [tool.ruff]
107
107
  line-length = 100
108
- extend-exclude = ["tests", "nerdd_module/tests"]
109
108
 
110
109
  [tool.ruff.lint]
111
110
  select = [
File without changes
File without changes
File without changes