oarepo-runtime 1.5.59__py3-none-any.whl → 1.5.60__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,4 +1,4 @@
1
- from typing import Any, List
1
+ from typing import Any, Callable, List
2
2
 
3
3
 
4
4
  class Selector:
@@ -25,6 +25,71 @@ class FirstItemSelector(PathSelector):
25
25
  return []
26
26
 
27
27
 
28
+ class FilteredSelector(Selector):
29
+ """
30
+ Selector which filters output of another selector
31
+ Example:
32
+ FilteredSelector(PathSelector("metadata.creators", "metadata.contributors"),
33
+ filter=lambda x: x["nameType"] == "personal", projection="affiliations")
34
+
35
+ selects affiliations of creators with nameType personal from following data
36
+
37
+ data = {
38
+ "metadata": {
39
+ "creators": [
40
+ {"name": "hugo", "affiliations": ["uni1", "uni2"], "nameType": "personal"},
41
+ {"name": "uni3", "nameType": "organizational"},
42
+ ]
43
+ }
44
+ }
45
+ """
46
+
47
+ def __init__(
48
+ self,
49
+ selector: Selector,
50
+ filter: Callable[[Any], bool],
51
+ projection: Callable[[Any], Any] | str = None,
52
+ ):
53
+
54
+ self.selector = selector
55
+ self.filter = filter
56
+ self.projection = projection
57
+
58
+ def select(self, record):
59
+ selected = self.selector.select(record)
60
+ selected = filter(self.filter, selected)
61
+ if self.projection:
62
+ ret = []
63
+ for select_element in selected:
64
+ if isinstance(self.projection, str):
65
+ if isinstance(select_element, dict) and self.projection in select_element:
66
+ result = select_element[self.projection]
67
+ else:
68
+ result = []
69
+ else:
70
+ result = self.projection(select_element)
71
+ if isinstance(result, list):
72
+ ret += result
73
+ else:
74
+ ret.append(result)
75
+ else:
76
+ ret = list(selected)
77
+ return ret
78
+
79
+
80
+ class MultiSelector(Selector):
81
+ """Selector concatenating outputs of multiple selectors"""
82
+
83
+ def __init__(self, *selectors: Selector):
84
+ self.selectors = selectors
85
+
86
+ def select(self, record):
87
+ ret = []
88
+ for selector in self.selectors:
89
+ ret += selector.select(record)
90
+ return ret
91
+
92
+
28
93
  def getter(data, path: List):
29
94
  if len(path) == 0:
30
95
  if isinstance(data, list):
@@ -36,4 +101,4 @@ def getter(data, path: List):
36
101
  yield from getter(data[path[0]], path[1:])
37
102
  elif isinstance(data, list):
38
103
  for item in data:
39
- yield from getter(item, path)
104
+ yield from getter(item, path)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: oarepo-runtime
3
- Version: 1.5.59
3
+ Version: 1.5.60
4
4
  Summary: A set of runtime extensions of Invenio repository
5
5
  Description-Content-Type: text/markdown
6
6
  License-File: LICENSE
@@ -62,7 +62,7 @@ oarepo_runtime/records/systemfields/icu.py,sha256=sSGAgi5WhsAY4cCBL7-7nMpvHAuctp
62
62
  oarepo_runtime/records/systemfields/mapping.py,sha256=tXOK_jkdY1pOUO7_VfChfDNB8UTi21GUXaidpugTnO8,1017
63
63
  oarepo_runtime/records/systemfields/owner.py,sha256=dYRVBinniW7ECHuSnTAjeN6x1KhhJtNR9vxmD1KswMs,3805
64
64
  oarepo_runtime/records/systemfields/record_status.py,sha256=U3kem4-JkNsT17e0iAl3HIAZ2MvO5lY_0U757aZvTKE,935
65
- oarepo_runtime/records/systemfields/selectors.py,sha256=rXNioeyCHLiNGsA_zu8bfoFdu29ACSNN7zHRUm1rJ6Q,928
65
+ oarepo_runtime/records/systemfields/selectors.py,sha256=xQEMhmqiE1M466cMilVO85V2DkELbbM3Xa8oYSCli8o,2959
66
66
  oarepo_runtime/records/systemfields/synthetic.py,sha256=UustvhzcDGuaNZLDeHbWwshoxQR-qRIuHDCct5RXmrI,4287
67
67
  oarepo_runtime/resources/__init__.py,sha256=v8BGrOTu_FjKzd0eozV7Q4GoGxyfybsL2cI-tbP5Pys,185
68
68
  oarepo_runtime/resources/file_resource.py,sha256=Ta3bFce7l0xwqkkOMOEu9mxbB8BbKj5HUHRHmidhnl8,414
@@ -119,9 +119,9 @@ oarepo_runtime/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hS
119
119
  oarepo_runtime/utils/functools.py,sha256=gKS9YZtlIYcDvdNA9cmYO00yjiXBYV1jg8VpcRUyQyg,1324
120
120
  oarepo_runtime/utils/path.py,sha256=V1NVyk3m12_YLbj7QHYvUpE1wScO78bYsX1LOLeXDkI,3108
121
121
  tests/pkg_data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
122
- oarepo_runtime-1.5.59.dist-info/LICENSE,sha256=h2uWz0OaB3EN-J1ImdGJZzc7yvfQjvHVYdUhQ-H7ypY,1064
123
- oarepo_runtime-1.5.59.dist-info/METADATA,sha256=GcU89QZPX8iUv8YGhG_VbIp-k0xvccf6WJ-WkfSrtJQ,4720
124
- oarepo_runtime-1.5.59.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
125
- oarepo_runtime-1.5.59.dist-info/entry_points.txt,sha256=QrlXAKuPDVBinaSh_v3yO9_Nb9ZNmJCJ0VFcCW-z0Jg,327
126
- oarepo_runtime-1.5.59.dist-info/top_level.txt,sha256=bHhlkT1_RQC4IkfTQCqA3iN4KCB6cSFQlsXpQMSP-bE,21
127
- oarepo_runtime-1.5.59.dist-info/RECORD,,
122
+ oarepo_runtime-1.5.60.dist-info/LICENSE,sha256=h2uWz0OaB3EN-J1ImdGJZzc7yvfQjvHVYdUhQ-H7ypY,1064
123
+ oarepo_runtime-1.5.60.dist-info/METADATA,sha256=8HAOuGW8hqgI2E1df2A-ux-WdXPlA5fMM7TFvok8hTY,4720
124
+ oarepo_runtime-1.5.60.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
125
+ oarepo_runtime-1.5.60.dist-info/entry_points.txt,sha256=QrlXAKuPDVBinaSh_v3yO9_Nb9ZNmJCJ0VFcCW-z0Jg,327
126
+ oarepo_runtime-1.5.60.dist-info/top_level.txt,sha256=bHhlkT1_RQC4IkfTQCqA3iN4KCB6cSFQlsXpQMSP-bE,21
127
+ oarepo_runtime-1.5.60.dist-info/RECORD,,