3
3
import sys
4
4
import textwrap
5
5
from pathlib import Path
6
- from typing import Union , List , Iterator
6
+ from typing import Union , List , Iterator , Optional
7
7
8
8
from openeo .internal .processes .parse import Process , parse_all_from_dir
9
9
@@ -13,18 +13,20 @@ class PythonRenderer:
13
13
DEFAULT_WIDTH = 115
14
14
15
15
def __init__ (
16
- self ,
17
- oo_mode = False ,
18
- indent = " " ,
19
- body_template = "return _process({id!r}, {args})" ,
20
- optional_default = "None" ,
21
- return_type_hint : str = None
16
+ self ,
17
+ oo_mode : bool = False ,
18
+ indent : str = " " ,
19
+ body_template : str = "return _process({id!r}, {args})" ,
20
+ optional_default = "None" ,
21
+ return_type_hint : Optional [str ] = None ,
22
+ decorator : Optional [str ] = None ,
22
23
):
23
24
self .oo_mode = oo_mode
24
25
self .indent = indent
25
26
self .body_template = body_template
26
27
self .optional_default = optional_default
27
28
self .return_type_hint = return_type_hint
29
+ self .decorator = decorator
28
30
29
31
def render_process (self , process : Process , prefix : str = None , width : int = DEFAULT_WIDTH ) -> str :
30
32
if prefix is None :
@@ -45,11 +47,12 @@ def render_process(self, process: Process, prefix: str = None, width: int = DEFA
45
47
id = process .id , safe_name = self ._safe_name (process .id ), args = call_args
46
48
)
47
49
48
- return textwrap . indent ( " \n " . join ( [
50
+ lines = ([ self . decorator ] if self . decorator else []) + [
49
51
def_line ,
50
52
self .render_docstring (process , width = width - len (prefix ), prefix = self .indent ),
51
53
body
52
- ]), prefix = prefix )
54
+ ]
55
+ return textwrap .indent ("\n " .join (lines ), prefix = prefix )
53
56
54
57
def _safe_name (self , name : str ) -> str :
55
58
if keyword .iskeyword (name ):
@@ -106,45 +109,58 @@ def collect_processes(sources: List[Union[Path, str]]) -> List[Process]:
106
109
107
110
108
111
def generate_process_py (processes : List [Process ], output = sys .stdout , argv = None ):
109
- oo_src = textwrap .dedent ("""
112
+ oo_src = textwrap .dedent (
113
+ """
110
114
import builtins
111
115
from openeo.internal.processes.builder import ProcessBuilderBase, UNSET
116
+ from openeo.internal.documentation import openeo_process
112
117
113
118
114
119
class ProcessBuilder(ProcessBuilderBase):
115
120
116
121
_ITERATION_LIMIT = 100
117
122
123
+ @openeo_process(process_id="add", mode="operator")
118
124
def __add__(self, other) -> 'ProcessBuilder':
119
125
return self.add(other)
120
126
127
+ @openeo_process(process_id="add", mode="operator")
121
128
def __radd__(self, other) -> 'ProcessBuilder':
122
129
return add(other, self)
123
130
131
+ @openeo_process(process_id="subtract", mode="operator")
124
132
def __sub__(self, other) -> 'ProcessBuilder':
125
133
return self.subtract(other)
126
134
135
+ @openeo_process(process_id="subtract", mode="operator")
127
136
def __rsub__(self, other) -> 'ProcessBuilder':
128
137
return subtract(other, self)
129
138
139
+ @openeo_process(process_id="multiply", mode="operator")
130
140
def __mul__(self, other) -> 'ProcessBuilder':
131
141
return self.multiply(other)
132
142
143
+ @openeo_process(process_id="multiply", mode="operator")
133
144
def __rmul__(self, other) -> 'ProcessBuilder':
134
145
return multiply(other, self)
135
146
147
+ @openeo_process(process_id="divide", mode="operator")
136
148
def __truediv__(self, other) -> 'ProcessBuilder':
137
149
return self.divide(other)
138
150
151
+ @openeo_process(process_id="divide", mode="operator")
139
152
def __rtruediv__(self, other) -> 'ProcessBuilder':
140
153
return divide(other, self)
141
154
155
+ @openeo_process(process_id="multiply", mode="operator")
142
156
def __neg__(self) -> 'ProcessBuilder':
143
157
return self.multiply(-1)
144
158
159
+ @openeo_process(process_id="power", mode="operator")
145
160
def __pow__(self, other) -> 'ProcessBuilder':
146
161
return self.power(other)
147
162
163
+ @openeo_process(process_id="array_element", mode="operator")
148
164
def __getitem__(self, key) -> 'ProcessBuilder':
149
165
if isinstance(key, builtins.int):
150
166
if key > self._ITERATION_LIMIT:
@@ -157,43 +173,54 @@ def __getitem__(self, key) -> 'ProcessBuilder':
157
173
else:
158
174
return self.array_element(label=key)
159
175
176
+ @openeo_process(process_id="eq", mode="operator")
160
177
def __eq__(self, other) -> 'ProcessBuilder':
161
178
return eq(self, other)
162
179
180
+ @openeo_process(process_id="neq", mode="operator")
163
181
def __ne__(self, other) -> 'ProcessBuilder':
164
182
return neq(self, other)
165
183
184
+ @openeo_process(process_id="lt", mode="operator")
166
185
def __lt__(self, other) -> 'ProcessBuilder':
167
186
return lt(self, other)
168
187
188
+ @openeo_process(process_id="lte", mode="operator")
169
189
def __le__(self, other) -> 'ProcessBuilder':
170
190
return lte(self, other)
171
191
192
+ @openeo_process(process_id="ge", mode="operator")
172
193
def __ge__(self, other) -> 'ProcessBuilder':
173
194
return gte(self, other)
174
195
196
+ @openeo_process(process_id="gt", mode="operator")
175
197
def __gt__(self, other) -> 'ProcessBuilder':
176
198
return gt(self, other)
177
199
178
- """ )
179
- fun_src = textwrap .dedent ("""
200
+ """
201
+ )
202
+ fun_src = textwrap .dedent (
203
+ """
180
204
# Public shortcut
181
205
process = ProcessBuilder.process
182
206
# Private shortcut that has lower chance to collide with a process argument named `process`
183
207
_process = ProcessBuilder.process
184
208
185
209
186
- """ )
210
+ """
211
+ )
187
212
fun_renderer = PythonRenderer (
188
213
body_template = "return _process({id!r}, {args})" ,
189
214
optional_default = "UNSET" ,
190
- return_type_hint = "ProcessBuilder"
215
+ return_type_hint = "ProcessBuilder" ,
216
+ decorator = "@openeo_process" ,
191
217
)
192
218
oo_renderer = PythonRenderer (
193
219
oo_mode = True ,
194
220
body_template = "return {safe_name}({args})" ,
195
221
optional_default = "UNSET" ,
196
- return_type_hint = "'ProcessBuilder'"
222
+ return_type_hint = "'ProcessBuilder'" ,
223
+ decorator = "@openeo_process" ,
197
224
)
198
225
for p in processes :
199
226
fun_src += fun_renderer .render_process (p ) + "\n \n \n "
0 commit comments