nerdd-module 0.3.51__tar.gz → 0.3.53__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 (102) hide show
  1. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/PKG-INFO +1 -1
  2. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/cli.py +4 -5
  3. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/config/merged_configuration.py +16 -10
  4. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/config/models.py +26 -8
  5. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module.egg-info/PKG-INFO +1 -1
  6. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/pyproject.toml +2 -1
  7. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/LICENSE +0 -0
  8. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/README.md +0 -0
  9. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/__init__.py +0 -0
  10. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/config/__init__.py +0 -0
  11. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/config/configuration.py +0 -0
  12. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/config/default_configuration.py +0 -0
  13. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/config/dict_configuration.py +0 -0
  14. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/config/package_configuration.py +0 -0
  15. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/config/search_yaml_configuration.py +0 -0
  16. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/config/yaml_configuration.py +0 -0
  17. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/converters/__init__.py +0 -0
  18. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/converters/basic_type_converter.py +0 -0
  19. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/converters/converter.py +0 -0
  20. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/converters/converter_config.py +0 -0
  21. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/converters/mol_converter.py +0 -0
  22. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/converters/problem_list_converter.py +0 -0
  23. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/converters/representation_converter.py +0 -0
  24. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/converters/source_list_converter.py +0 -0
  25. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/converters/void_converter.py +0 -0
  26. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/input/__init__.py +0 -0
  27. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/input/depth_first_explorer.py +0 -0
  28. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/input/explorer.py +0 -0
  29. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/input/file_reader.py +0 -0
  30. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/input/gzip_reader.py +0 -0
  31. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/input/inchi_reader.py +0 -0
  32. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/input/list_reader.py +0 -0
  33. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/input/mol_reader.py +0 -0
  34. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/input/reader.py +0 -0
  35. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/input/reader_config.py +0 -0
  36. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/input/sdf_reader.py +0 -0
  37. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/input/smiles_reader.py +0 -0
  38. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/input/stream_reader.py +0 -0
  39. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/input/string_reader.py +0 -0
  40. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/input/tar_reader.py +0 -0
  41. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/input/zip_reader.py +0 -0
  42. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/model/__init__.py +0 -0
  43. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/model/assign_name_step.py +0 -0
  44. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/model/convert_representations_step.py +0 -0
  45. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/model/enforce_schema_step.py +0 -0
  46. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/model/model.py +0 -0
  47. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/model/prediction_step.py +0 -0
  48. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/model/read_input_step.py +0 -0
  49. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/model/write_output_step.py +0 -0
  50. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/output/__init__.py +0 -0
  51. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/output/csv_writer.py +0 -0
  52. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/output/file_writer.py +0 -0
  53. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/output/iterator_writer.py +0 -0
  54. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/output/pandas_writer.py +0 -0
  55. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/output/record_list_writer.py +0 -0
  56. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/output/sdf_writer.py +0 -0
  57. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/output/writer.py +0 -0
  58. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/output/writer_config.py +0 -0
  59. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/polyfills/__init__.py +0 -0
  60. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/polyfills/block_logs.py +0 -0
  61. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/polyfills/files.py +0 -0
  62. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/polyfills/get_entry_points.py +0 -0
  63. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/polyfills/literal.py +0 -0
  64. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/polyfills/typed_dict.py +0 -0
  65. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/polyfills/types.py +0 -0
  66. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/polyfills/version.py +0 -0
  67. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/preprocessing/__init__.py +0 -0
  68. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/preprocessing/check_valid_smiles.py +0 -0
  69. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/preprocessing/chembl_structure_pipeline.py +0 -0
  70. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/preprocessing/filter_by_element.py +0 -0
  71. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/preprocessing/filter_by_weight.py +0 -0
  72. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/preprocessing/preprocessing_step.py +0 -0
  73. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/preprocessing/remove_hydrogens.py +0 -0
  74. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/preprocessing/remove_small_fragments.py +0 -0
  75. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/preprocessing/remove_stereochemistry.py +0 -0
  76. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/preprocessing/sanitize.py +0 -0
  77. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/problem.py +0 -0
  78. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/py.typed +0 -0
  79. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/steps/__init__.py +0 -0
  80. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/steps/map_step.py +0 -0
  81. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/steps/output_step.py +0 -0
  82. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/steps/step.py +0 -0
  83. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/tests/__init__.py +0 -0
  84. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/tests/checks.py +0 -0
  85. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/tests/files.py +0 -0
  86. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/tests/models/AtomicMassModel.py +0 -0
  87. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/tests/models/MolWeightModel.py +0 -0
  88. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/tests/models/__init__.py +0 -0
  89. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/tests/predictions.py +0 -0
  90. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/tests/preprocessing/DummyPreprocessingStep.py +0 -0
  91. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/tests/preprocessing/__init__.py +0 -0
  92. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/tests/representations.py +0 -0
  93. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/util/__init__.py +0 -0
  94. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/util/call_with_mappings.py +0 -0
  95. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/util/package.py +0 -0
  96. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module/version.py +0 -0
  97. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module.egg-info/SOURCES.txt +0 -0
  98. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module.egg-info/dependency_links.txt +0 -0
  99. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module.egg-info/requires.txt +0 -0
  100. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/nerdd_module.egg-info/top_level.txt +0 -0
  101. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/setup.cfg +0 -0
  102. {nerdd_module-0.3.51 → nerdd_module-0.3.53}/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.51
3
+ Version: 0.3.53
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>
@@ -30,7 +30,7 @@ def infer_click_type(param: JobParameter) -> click.ParamType:
30
30
  choices = [str(c.value) for c in param.choices]
31
31
  return click.Choice(choices)
32
32
 
33
- type_map = {
33
+ type_map: dict[str, click.ParamType] = {
34
34
  "float": click.FLOAT,
35
35
  "integer": click.INT,
36
36
  "string": click.STRING,
@@ -67,10 +67,9 @@ def auto_cli(f: Callable[..., Model], *args: Any, **kwargs: Any) -> None:
67
67
 
68
68
  # compose footer with examples
69
69
  examples = []
70
- if hasattr(model, "config"):
71
- example_smiles = model.config.example_smiles
72
- if example_smiles is not None:
73
- examples.append(example_smiles)
70
+ example_smiles = model.config.example_smiles
71
+ if example_smiles is not None:
72
+ examples.append(example_smiles)
74
73
 
75
74
  for ReaderClass in Reader.get_reader_mapping():
76
75
  if hasattr(ReaderClass, "config"):
@@ -1,4 +1,5 @@
1
1
  from collections import Counter
2
+ from typing import Any
2
3
 
3
4
  from .configuration import Configuration
4
5
  from .dict_configuration import DictConfiguration
@@ -6,27 +7,32 @@ from .dict_configuration import DictConfiguration
6
7
  __all__ = ["MergedConfiguration"]
7
8
 
8
9
 
9
- def merge(*args: dict) -> dict:
10
+ def merge(*args: Any) -> Any:
10
11
  assert len(args) > 0
11
12
 
12
- first_entry = args[0]
13
- assert all(isinstance(d, type(first_entry)) for d in args)
13
+ if all(arg is None for arg in args):
14
+ return None
14
15
 
15
- if isinstance(first_entry, list):
16
- return [e for d in args for e in d]
17
- if isinstance(first_entry, dict):
18
- count_fields = Counter([k for d in args for k in d.keys()])
16
+ valid_args = [arg for arg in args if arg is not None]
17
+
18
+ first_valid_entry = valid_args[0]
19
+ assert all(isinstance(d, type(first_valid_entry)) for d in valid_args)
20
+
21
+ if isinstance(first_valid_entry, list):
22
+ return [e for d in valid_args for e in d]
23
+ if isinstance(first_valid_entry, dict):
24
+ count_fields = Counter([k for d in valid_args for k in d.keys()])
19
25
 
20
26
  # merge fields that occur in multiple dicts
21
27
  overlapping_fields = [k for k, v in count_fields.items() if v > 1]
22
28
  merged_overlapping_fields = {
23
- k: merge(*[d[k] for d in args if k in d]) for k in overlapping_fields
29
+ k: merge(*[d[k] for d in valid_args if k in d]) for k in overlapping_fields
24
30
  }
25
31
 
26
32
  # collect fields that occur in only one dict
27
33
  non_overlapping_fields = [k for k, v in count_fields.items() if v == 1]
28
34
  merged_non_overlapping_fields = {
29
- k: v for d in args for k, v in d.items() if k in non_overlapping_fields
35
+ k: v for d in valid_args for k, v in d.items() if k in non_overlapping_fields
30
36
  }
31
37
 
32
38
  return {
@@ -36,7 +42,7 @@ def merge(*args: dict) -> dict:
36
42
  else:
37
43
  # merge all configurations starting from the first one
38
44
  # --> last configuration has the highest priority
39
- return args[-1]
45
+ return valid_args[-1]
40
46
 
41
47
 
42
48
  class MergedConfiguration(DictConfiguration):
@@ -1,3 +1,5 @@
1
+ """Pydantic models describing module metadata, schema, and parameters."""
2
+
1
3
  from typing import Any, List, Optional, Union
2
4
 
3
5
  from pydantic import BaseModel, computed_field, model_validator
@@ -7,6 +9,8 @@ from ..polyfills import Literal
7
9
 
8
10
 
9
11
  class Partner(BaseModel):
12
+ """Partner organization metadata for module marketing/attribution."""
13
+
10
14
  name: str
11
15
  logo: str
12
16
  url: Optional[str] = None
@@ -31,14 +35,18 @@ class Author(BaseModel):
31
35
 
32
36
 
33
37
  class Publication(BaseModel):
34
- title: str
35
- authors: List[Author] = []
36
- journal: str
37
- year: int
38
+ """Reference to a publication related to the module or model."""
39
+
40
+ title: Optional[str] = None
41
+ authors: Optional[List[Author]] = None
42
+ journal: Optional[str] = None
43
+ year: Optional[int] = None
38
44
  doi: Optional[str]
39
45
 
40
46
 
41
47
  class ColorPalette(BaseModel):
48
+ """Optional color mapping for visualizing categorical or numeric outputs."""
49
+
42
50
  type: Optional[str] = None
43
51
  name: Optional[str] = None
44
52
  domain: Optional[Union[List[str], List[float], List[int], List[bool]]] = None
@@ -47,6 +55,8 @@ class ColorPalette(BaseModel):
47
55
 
48
56
 
49
57
  class Choice(BaseModel):
58
+ """Select options for job parameters or categorical result properties."""
59
+
50
60
  value: Union[str, int, float, bool]
51
61
  label: Optional[str] = None
52
62
 
@@ -55,6 +65,8 @@ JobType = Literal["int", "integer", "float", "bool", "boolean", "str", "string"]
55
65
 
56
66
 
57
67
  class JobParameter(BaseModel):
68
+ """Definition of a user-configurable parameter for a job run."""
69
+
58
70
  name: str
59
71
  type: JobType
60
72
  visible_name: Optional[str] = None
@@ -64,6 +76,7 @@ class JobParameter(BaseModel):
64
76
  choices: Optional[List[Choice]] = None
65
77
 
66
78
  def validate_value(self, value: Any) -> None:
79
+ """Validate a provided value against type and choices."""
67
80
  if self.type == ["int", "integer"]:
68
81
  if not isinstance(value, int):
69
82
  raise ValueError(
@@ -107,11 +120,15 @@ FormatSpec = Union[List[str], str]
107
120
 
108
121
 
109
122
  class IncludeExcludeFormatSpec(BaseModel):
123
+ """Visibility filter for result properties per output format."""
124
+
110
125
  include: Optional[FormatSpec]
111
126
  exclude: Optional[FormatSpec]
112
127
 
113
128
 
114
129
  class ResultProperty(BaseModel):
130
+ """Schema entry for a model output property."""
131
+
115
132
  name: str
116
133
  type: str
117
134
  visible_name: Optional[str] = None
@@ -129,6 +146,7 @@ class ResultProperty(BaseModel):
129
146
  color_palette: Optional[ColorPalette] = None
130
147
 
131
148
  def is_visible(self, output_format: str) -> bool:
149
+ """Return True if property should be shown for the given format."""
132
150
  formats = self.formats
133
151
 
134
152
  if formats is None:
@@ -144,6 +162,8 @@ class ResultProperty(BaseModel):
144
162
 
145
163
 
146
164
  class Module(BaseModel):
165
+ """Full module configuration: metadata, schema, parameters, and validation."""
166
+
147
167
  @computed_field # type: ignore[prop-decorator]
148
168
  @property
149
169
  def id(self) -> str:
@@ -194,6 +214,7 @@ class Module(BaseModel):
194
214
  @model_validator(mode="after")
195
215
  @classmethod
196
216
  def validate_model(cls, values: Any) -> Any:
217
+ """Enforce consistency between task type and declared result properties."""
197
218
  assert isinstance(values, Module)
198
219
 
199
220
  num_atom_properties = len(values.get_property_columns_of_type("atom"))
@@ -244,10 +265,7 @@ class Module(BaseModel):
244
265
  return values
245
266
 
246
267
  def validate_job_parameters(self, params: dict) -> None:
247
- """
248
- Validate the job parameters against the module's job parameters.
249
- Raises an error if a parameter is missing or has an invalid type.
250
- """
268
+ """Validate provided job parameters against the module declaration."""
251
269
  # make sure that all job parameters are present
252
270
  for param in self.job_parameters:
253
271
  if param.name not in params and param.required:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nerdd-module
3
- Version: 0.3.51
3
+ Version: 0.3.53
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.51"
7
+ version = "0.3.53"
8
8
  description = "Base package to create NERDD modules"
9
9
  readme = "README.md"
10
10
  license = "BSD-3-Clause"
@@ -88,6 +88,7 @@ Repository = "https://github.com/molinfo-vienna/nerdd-module"
88
88
  #
89
89
  # TOOLS
90
90
  #
91
+
91
92
  [tool.setuptools.packages.find]
92
93
  where = ["."]
93
94
  include = ["nerdd_module*"]
File without changes
File without changes
File without changes