hydroserverpy 0.3.0__py3-none-any.whl → 0.4.0__py3-none-any.whl

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.

Potentially problematic release.


This version of hydroserverpy might be problematic. Click here for more details.

Files changed (49) hide show
  1. hydroserverpy/__init__.py +1 -1
  2. hydroserverpy/core/endpoints/base.py +44 -31
  3. hydroserverpy/core/endpoints/data_loaders.py +6 -5
  4. hydroserverpy/core/endpoints/data_sources.py +6 -5
  5. hydroserverpy/core/endpoints/datastreams.py +89 -52
  6. hydroserverpy/core/endpoints/observed_properties.py +36 -18
  7. hydroserverpy/core/endpoints/processing_levels.py +36 -18
  8. hydroserverpy/core/endpoints/result_qualifiers.py +37 -19
  9. hydroserverpy/core/endpoints/sensors.py +37 -19
  10. hydroserverpy/core/endpoints/things.py +58 -37
  11. hydroserverpy/core/endpoints/units.py +37 -19
  12. hydroserverpy/core/schemas/base.py +13 -6
  13. hydroserverpy/core/schemas/data_loaders.py +6 -4
  14. hydroserverpy/core/schemas/data_sources.py +73 -56
  15. hydroserverpy/core/schemas/datastreams.py +101 -70
  16. hydroserverpy/core/schemas/observed_properties.py +18 -10
  17. hydroserverpy/core/schemas/processing_levels.py +10 -6
  18. hydroserverpy/core/schemas/result_qualifiers.py +7 -4
  19. hydroserverpy/core/schemas/sensors.py +33 -18
  20. hydroserverpy/core/schemas/things.py +97 -60
  21. hydroserverpy/core/schemas/units.py +7 -8
  22. hydroserverpy/core/service.py +31 -17
  23. hydroserverpy/etl/__init__.py +21 -0
  24. hydroserverpy/etl/extractors/__init__.py +0 -0
  25. hydroserverpy/etl/extractors/base.py +13 -0
  26. hydroserverpy/etl/extractors/ftp_extractor.py +50 -0
  27. hydroserverpy/etl/extractors/http_extractor.py +84 -0
  28. hydroserverpy/etl/extractors/local_file_extractor.py +25 -0
  29. hydroserverpy/etl/hydroserver_etl.py +40 -0
  30. hydroserverpy/etl/loaders/__init__.py +0 -0
  31. hydroserverpy/etl/loaders/base.py +13 -0
  32. hydroserverpy/etl/loaders/hydroserver_loader.py +68 -0
  33. hydroserverpy/etl/transformers/__init__.py +0 -0
  34. hydroserverpy/etl/transformers/base.py +52 -0
  35. hydroserverpy/etl/transformers/csv_transformer.py +88 -0
  36. hydroserverpy/etl/transformers/json_transformer.py +62 -0
  37. hydroserverpy/etl/types.py +7 -0
  38. hydroserverpy/etl_csv/__init__.py +0 -0
  39. hydroserverpy/{etl/service.py → etl_csv/hydroserver_etl_csv.py} +92 -54
  40. hydroserverpy/quality/service.py +84 -70
  41. hydroserverpy-0.4.0.dist-info/METADATA +18 -0
  42. hydroserverpy-0.4.0.dist-info/RECORD +51 -0
  43. {hydroserverpy-0.3.0.dist-info → hydroserverpy-0.4.0.dist-info}/WHEEL +1 -1
  44. hydroserverpy-0.3.0.dist-info/METADATA +0 -18
  45. hydroserverpy-0.3.0.dist-info/RECORD +0 -36
  46. /hydroserverpy/{etl → etl_csv}/exceptions.py +0 -0
  47. {hydroserverpy-0.3.0.dist-info → hydroserverpy-0.4.0.dist-info}/LICENSE +0 -0
  48. {hydroserverpy-0.3.0.dist-info → hydroserverpy-0.4.0.dist-info}/top_level.txt +0 -0
  49. {hydroserverpy-0.3.0.dist-info → hydroserverpy-0.4.0.dist-info}/zip-safe +0 -0
@@ -20,33 +20,33 @@ from enum import Enum
20
20
  class TimeUnit(Enum):
21
21
  """Enumeration for time units."""
22
22
 
23
- SECOND = 's'
24
- MINUTE = 'm'
25
- HOUR = 'h'
26
- DAY = 'D'
27
- WEEK = 'W'
28
- MONTH = 'M'
29
- YEAR = 'Y'
23
+ SECOND = "s"
24
+ MINUTE = "m"
25
+ HOUR = "h"
26
+ DAY = "D"
27
+ WEEK = "W"
28
+ MONTH = "M"
29
+ YEAR = "Y"
30
30
 
31
31
 
32
32
  class FilterOperation(Enum):
33
33
  """Enumeration for filter operations."""
34
34
 
35
- LT = 'LT'
36
- LTE = 'LTE'
37
- GT = 'GT'
38
- GTE = 'GTE'
39
- E = 'E'
35
+ LT = "LT"
36
+ LTE = "LTE"
37
+ GT = "GT"
38
+ GTE = "GTE"
39
+ E = "E"
40
40
 
41
41
 
42
42
  class Operator(Enum):
43
43
  """Enumeration for mathematical operations."""
44
44
 
45
- MULT = 'MULT'
46
- DIV = 'DIV'
47
- ADD = 'ADD'
48
- SUB = 'SUB'
49
- ASSIGN = 'ASSIGN'
45
+ MULT = "MULT"
46
+ DIV = "DIV"
47
+ ADD = "ADD"
48
+ SUB = "SUB"
49
+ ASSIGN = "ASSIGN"
50
50
 
51
51
 
52
52
  class HydroServerQualityControl:
@@ -61,15 +61,23 @@ class HydroServerQualityControl:
61
61
 
62
62
  datastream_id: Union[UUID, str]
63
63
 
64
- def __init__(self, datastream_id: Union[UUID, str], observations: pd.DataFrame) -> None:
64
+ def __init__(
65
+ self, datastream_id: Union[UUID, str], observations: pd.DataFrame
66
+ ) -> None:
65
67
 
66
- assert 'timestamp' in observations.columns, "Observations must have a 'timestamp' column"
67
- assert pd.api.types.is_datetime64_any_dtype(observations['timestamp']), \
68
- "Observations 'timestamp' column must be of datetime type"
68
+ assert (
69
+ "timestamp" in observations.columns
70
+ ), "Observations must have a 'timestamp' column"
71
+ assert pd.api.types.is_datetime64_any_dtype(
72
+ observations["timestamp"]
73
+ ), "Observations 'timestamp' column must be of datetime type"
69
74
 
70
- assert 'value' in observations.columns, "Observations must have a 'value' column"
71
- assert pd.api.types.is_float_dtype(observations['value']), \
72
- "Observations 'value' column must be of float type"
75
+ assert (
76
+ "value" in observations.columns
77
+ ), "Observations must have a 'value' column"
78
+ assert pd.api.types.is_float_dtype(
79
+ observations["value"]
80
+ ), "Observations 'value' column must be of float type"
73
81
 
74
82
  self.datastream_id = str(datastream_id)
75
83
  self._df = observations
@@ -94,7 +102,9 @@ class HydroServerQualityControl:
94
102
  ###################
95
103
 
96
104
  @staticmethod
97
- def _has_filter(data_filter: Dict[str, Union[float, int]], key: FilterOperation) -> bool:
105
+ def _has_filter(
106
+ data_filter: Dict[str, Union[float, int]], key: FilterOperation
107
+ ) -> bool:
98
108
  """
99
109
  Checks if a given filter operation exists in the filter dictionary.
100
110
 
@@ -106,9 +116,9 @@ class HydroServerQualityControl:
106
116
  :rtype: bool
107
117
  """
108
118
 
109
- return (
110
- key.value in data_filter and
111
- (isinstance(data_filter[key.value], float) or isinstance(data_filter[key.value], int))
119
+ return key.value in data_filter and (
120
+ isinstance(data_filter[key.value], float)
121
+ or isinstance(data_filter[key.value], int)
112
122
  )
113
123
 
114
124
  def filter(self, data_filter: Dict[str, Union[float, int]]) -> None:
@@ -122,24 +132,19 @@ class HydroServerQualityControl:
122
132
  query = []
123
133
 
124
134
  if self._has_filter(data_filter, FilterOperation.LT):
125
- query.append(
126
- f'`value` < {data_filter[FilterOperation.LT.value]}')
135
+ query.append(f"`value` < {data_filter[FilterOperation.LT.value]}")
127
136
 
128
137
  if self._has_filter(data_filter, FilterOperation.LTE):
129
- query.append(
130
- f'`value` <= {data_filter[FilterOperation.LTE.value]}')
138
+ query.append(f"`value` <= {data_filter[FilterOperation.LTE.value]}")
131
139
 
132
140
  if self._has_filter(data_filter, FilterOperation.GT):
133
- query.append(
134
- f'`value` > {data_filter[FilterOperation.GT.value]}')
141
+ query.append(f"`value` > {data_filter[FilterOperation.GT.value]}")
135
142
 
136
143
  if self._has_filter(data_filter, FilterOperation.GTE):
137
- query.append(
138
- f'`value` >= {data_filter[FilterOperation.GTE.value]}')
144
+ query.append(f"`value` >= {data_filter[FilterOperation.GTE.value]}")
139
145
 
140
146
  if self._has_filter(data_filter, FilterOperation.E):
141
- query.append(
142
- f'`value` == {data_filter[FilterOperation.E.value]}')
147
+ query.append(f"`value` == {data_filter[FilterOperation.E.value]}")
143
148
 
144
149
  if len(query):
145
150
  self._filtered_observations = self._df.query(" | ".join(query))
@@ -162,9 +167,13 @@ class HydroServerQualityControl:
162
167
  :rtype: pd.DataFrame
163
168
  """
164
169
 
165
- return self.observations[self._df['timestamp'].diff() > np.timedelta64(time_value, time_unit)]
170
+ return self.observations[
171
+ self._df["timestamp"].diff() > np.timedelta64(time_value, time_unit)
172
+ ]
166
173
 
167
- def fill_gap(self, gap: Tuple[int, str], fill: Tuple[int, str], interpolate_values: bool) -> pd.DataFrame:
174
+ def fill_gap(
175
+ self, gap: Tuple[int, str], fill: Tuple[int, str], interpolate_values: bool
176
+ ) -> pd.DataFrame:
168
177
  """
169
178
  Fills identified gaps in the observations with placeholder values and optionally interpolates the values.
170
179
 
@@ -188,8 +197,8 @@ class HydroServerQualityControl:
188
197
  gap_end_index = gap_row[0]
189
198
  gap_start_index = gap_end_index - 1
190
199
 
191
- gap_start_date = self._df.iloc[gap_start_index]['timestamp']
192
- gap_end_date = self._df.iloc[gap_end_index]['timestamp']
200
+ gap_start_date = self._df.iloc[gap_start_index]["timestamp"]
201
+ gap_end_date = self._df.iloc[gap_end_index]["timestamp"]
193
202
 
194
203
  start = gap_start_date + time_gap
195
204
  end = gap_end_date
@@ -210,15 +219,15 @@ class HydroServerQualityControl:
210
219
  self.interpolate(added_index)
211
220
 
212
221
  # Return the list of points that filled the gaps
213
- return pd.DataFrame(
214
- points, columns=['timestamp', 'value']
215
- )
222
+ return pd.DataFrame(points, columns=["timestamp", "value"])
216
223
 
217
224
  ######################################
218
225
  # Data point operations
219
226
  ######################################
220
227
 
221
- def add_points(self, points: List[List[Union[str, float]]], index: Optional[List[int]] = None) -> None:
228
+ def add_points(
229
+ self, points: List[List[Union[str, float]]], index: Optional[List[int]] = None
230
+ ) -> None:
222
231
  """
223
232
  Adds new points to the observations, optionally at specified indices.
224
233
 
@@ -251,8 +260,7 @@ class HydroServerQualityControl:
251
260
  df1 = self._df.iloc[:idx, :]
252
261
  df2 = self._df.iloc[idx:, :]
253
262
 
254
- points_df = pd.DataFrame(
255
- val, columns=['timestamp', 'value'])
263
+ points_df = pd.DataFrame(val, columns=["timestamp", "value"])
256
264
  self._df = pd.concat([df1, points_df, df2]).reset_index(drop=True)
257
265
 
258
266
  else:
@@ -260,17 +268,18 @@ class HydroServerQualityControl:
260
268
  # data in the DataFrame is pre-sorted.
261
269
 
262
270
  # Create a new dataframe with the points
263
- points_df = pd.DataFrame(
264
- points, columns=['timestamp', 'value'])
271
+ points_df = pd.DataFrame(points, columns=["timestamp", "value"])
265
272
 
266
273
  # Concatenate both dataframes. New rows will be at the end.
267
274
  self._df = pd.concat([self._df, points_df])
268
275
 
269
276
  # Sort and reset index
270
- self._df = self._df.sort_values('timestamp')
277
+ self._df = self._df.sort_values("timestamp")
271
278
  self._df.reset_index(drop=True, inplace=True)
272
279
 
273
- def change_values(self, index_list: List[int], operator: str, value: Union[int, float]) -> None:
280
+ def change_values(
281
+ self, index_list: List[int], operator: str, value: Union[int, float]
282
+ ) -> None:
274
283
  """
275
284
  Changes the values of observations based on the specified operator and value.
276
285
 
@@ -299,7 +308,9 @@ class HydroServerQualityControl:
299
308
  else:
300
309
  return x
301
310
 
302
- self._df.loc[index_list, 'value'] = self._df.loc[index_list, 'value'].apply(operation)
311
+ self._df.loc[index_list, "value"] = self._df.loc[index_list, "value"].apply(
312
+ operation
313
+ )
303
314
 
304
315
  def delete_points(self, index_list: List[int]) -> None:
305
316
  """
@@ -312,7 +323,9 @@ class HydroServerQualityControl:
312
323
  self._df.drop(index=index_list, inplace=True)
313
324
  self._df.reset_index(drop=True, inplace=True)
314
325
 
315
- def shift_points(self, index_list: List[int], time_value: int, time_unit: str) -> None:
326
+ def shift_points(
327
+ self, index_list: List[int], time_value: int, time_unit: str
328
+ ) -> None:
316
329
  """
317
330
  Shifts the timestamps of the observations at the specified indices by a given time value and unit.
318
331
 
@@ -328,8 +341,10 @@ class HydroServerQualityControl:
328
341
  condition = self._df.index.isin(index_list)
329
342
 
330
343
  # Apply the shift
331
- self._df.loc[condition, 'timestamp'] = self._df.loc[condition, 'timestamp'] + shift_value
332
- self._df = self._df.sort_values('timestamp')
344
+ self._df.loc[condition, "timestamp"] = (
345
+ self._df.loc[condition, "timestamp"] + shift_value
346
+ )
347
+ self._df = self._df.sort_values("timestamp")
333
348
  self._df.reset_index(drop=True, inplace=True)
334
349
 
335
350
  def interpolate(self, index_list: List[int]) -> None:
@@ -341,8 +356,8 @@ class HydroServerQualityControl:
341
356
  """
342
357
 
343
358
  condition = self._df.index.isin(index_list)
344
- self._df['value'].mask(condition, inplace=True)
345
- self._df['value'].interpolate(method='linear', inplace=True)
359
+ self._df["value"].mask(condition, inplace=True)
360
+ self._df["value"].interpolate(method="linear", inplace=True)
346
361
 
347
362
  def drift_correction(self, start: int, end: int, gap_width: float) -> pd.DataFrame:
348
363
  """
@@ -360,32 +375,31 @@ class HydroServerQualityControl:
360
375
 
361
376
  # validate range
362
377
  if start >= end:
363
- print('Start and end index cannot overlap')
378
+ print("Start and end index cannot overlap")
364
379
  return self._df
365
380
  elif end > len(self._df) - 1:
366
- print('End index out of range')
381
+ print("End index out of range")
367
382
  return self._df
368
383
  elif start < 0:
369
- print('Start index must be greater than or equal to 0')
384
+ print("Start index must be greater than or equal to 0")
370
385
  return self._df
371
386
 
372
- points = self._df.iloc[start:end + 1]
373
- start_date = points.iloc[0]['timestamp']
374
- end_date = points.iloc[-1]['timestamp']
387
+ points = self._df.iloc[start : end + 1]
388
+ start_date = points.iloc[0]["timestamp"]
389
+ end_date = points.iloc[-1]["timestamp"]
375
390
 
376
391
  x_l = (end_date - start_date).total_seconds()
377
392
  ndv = -9999
378
393
  # y_n = y_0 + G(x_i / x_l)
379
394
 
380
395
  def f(row):
381
- if row['value'] != ndv:
382
- return (
383
- row['value'] +
384
- (gap_width * ((row['timestamp'] - start_date).total_seconds() / x_l))
396
+ if row["value"] != ndv:
397
+ return row["value"] + (
398
+ gap_width * ((row["timestamp"] - start_date).total_seconds() / x_l)
385
399
  )
386
400
  else:
387
- return row['value']
401
+ return row["value"]
388
402
 
389
- self._df.loc[points.index, 'value'] = points.apply(f, axis=1)
403
+ self._df.loc[points.index, "value"] = points.apply(f, axis=1)
390
404
 
391
405
  return self._df
@@ -0,0 +1,18 @@
1
+ Metadata-Version: 2.1
2
+ Name: hydroserverpy
3
+ Version: 0.4.0
4
+ Requires-Python: <4,>=3.9
5
+ License-File: LICENSE
6
+ Requires-Dist: requests>=2
7
+ Requires-Dist: pydantic>=2.6
8
+ Requires-Dist: pandas>=2.2
9
+ Requires-Dist: numpy>=2.0
10
+ Requires-Dist: pyyaml>=5
11
+ Requires-Dist: simplejson>=3
12
+ Requires-Dist: crontab>=1
13
+ Requires-Dist: python-dateutil>=2.8.2
14
+ Requires-Dist: croniter>=2.0.1
15
+ Requires-Dist: country-list>=1.1.0
16
+ Requires-Dist: jmespath>=1.0.1
17
+ Provides-Extra: docs
18
+ Requires-Dist: sphinx_autodoc_typehints; extra == "docs"
@@ -0,0 +1,51 @@
1
+ hydroserverpy/__init__.py,sha256=6DIpIX9JiKm5FFHCvT6HdLN3sNkwXIf-fDPeLG6OM8c,231
2
+ hydroserverpy/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
+ hydroserverpy/core/service.py,sha256=L5klm7KfmcgjNJChh7ZrHA0xeLS78Yy2S2pWdhtS6H0,5356
4
+ hydroserverpy/core/endpoints/__init__.py,sha256=SpN1WLX0R8HOLHBv1cp3VZcIEiKD4BBbgFGQppdA_mw,404
5
+ hydroserverpy/core/endpoints/base.py,sha256=1LKmlMqki0wPsZfo78Fmjo-t_N-3EXbMSOd7m0rGjxI,5088
6
+ hydroserverpy/core/endpoints/data_loaders.py,sha256=L2-smADgOIsUTfh6KS8ty6JQgvad7flPWzrydE_ptf8,3022
7
+ hydroserverpy/core/endpoints/data_sources.py,sha256=lBximQw-UkCkix_ESx2QuwLeO3eIT9GWw23LsmvzslY,3020
8
+ hydroserverpy/core/endpoints/datastreams.py,sha256=k1o5y-WdKjFqGd3pZv46_vd8cOLzlNrJmK5Roo3dkIc,7651
9
+ hydroserverpy/core/endpoints/observed_properties.py,sha256=p_vQUxJE58-YDu1bt3n854vGoNr0yK66G_3fqh3flgo,3512
10
+ hydroserverpy/core/endpoints/processing_levels.py,sha256=sy89Lgdr3kdXCq9W6nqM-_BCBqVmU5TQ5rcF91j-KlU,3489
11
+ hydroserverpy/core/endpoints/result_qualifiers.py,sha256=VHImVsoqylnW4kpziKueDBxguVixoKVIp7O1wo3v2fw,3504
12
+ hydroserverpy/core/endpoints/sensors.py,sha256=vF4p2I-7UioDEbIBfHrTgDtznI7ANTRJtgdQiyQ2RbQ,3325
13
+ hydroserverpy/core/endpoints/things.py,sha256=KOlea2LxXd2qoeZafnsixNDOHdZZsG2AYIHGdfzfPNE,8597
14
+ hydroserverpy/core/endpoints/units.py,sha256=HKgAlyC5kKi4GgnzxvHKnQcwth1IGBsImq1wFG3eV8M,3287
15
+ hydroserverpy/core/schemas/__init__.py,sha256=gUFAim1jcUWAvj0IqpR8UKaCdXT1v11SmFnOzEmcwJM,353
16
+ hydroserverpy/core/schemas/base.py,sha256=weVvt4b3csRVDXUl6dT5v5B_ujijA8nm69BNpJNEtSI,3720
17
+ hydroserverpy/core/schemas/data_loaders.py,sha256=1EdZqXaHUqamh6IHguakdPzkkaEMHhcqq12EnEJv_sY,2487
18
+ hydroserverpy/core/schemas/data_sources.py,sha256=T23nB8xlyu7X59EHjf4k4p7QEvcGk3MMK5_LL2sJV2Q,8262
19
+ hydroserverpy/core/schemas/datastreams.py,sha256=eUU9KqeBxL6y3_l7rlKysNpdzqPVOCLBjVPiruYb8Gw,11782
20
+ hydroserverpy/core/schemas/observed_properties.py,sha256=cT7SLtSXv52ywUjeWl5x7p0S0LqmwXGo2y4nQ2YjFEo,1230
21
+ hydroserverpy/core/schemas/processing_levels.py,sha256=zJ-yOgUQaLjY4N1oahRWetI2BMY0ot7OC0826gjiVus,902
22
+ hydroserverpy/core/schemas/result_qualifiers.py,sha256=ONKs4Cry9YqnOH3JFyDyBVfOTv9k3iXR_D3xlJ1mWrE,748
23
+ hydroserverpy/core/schemas/sensors.py,sha256=1sGlAOs97zaN-oId227EQlsNipu9vwA_RufrymESP-Q,1963
24
+ hydroserverpy/core/schemas/things.py,sha256=q9xAv_-A6aVRP8dNutFU4gDhrS4mN4FrcTA9-gfjEGo,11489
25
+ hydroserverpy/core/schemas/units.py,sha256=TmSez08JadMa5se8_1egG9oKdyG-tV4PZn5JGKEDAho,819
26
+ hydroserverpy/etl/__init__.py,sha256=qK2m4LZl8czR3VE8SxrlipSy5tLGLNB60lxD7dD0GjU,659
27
+ hydroserverpy/etl/hydroserver_etl.py,sha256=FSdvM3T7QHEWWulWRT8t-FMHSxAGB4GvleUXtSk5IWc,1507
28
+ hydroserverpy/etl/types.py,sha256=4PY3CM-uoXIsf2lhcqtLC6HaRGXe7HKGDU22R8-H35c,135
29
+ hydroserverpy/etl/extractors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
+ hydroserverpy/etl/extractors/base.py,sha256=GZKJfAhfJedRcNagnoqUiDZn286r-JzM7dW_F1dWsfY,275
31
+ hydroserverpy/etl/extractors/ftp_extractor.py,sha256=5LwvHuvLk6LwRSVyE9EkV3DPgVlAvRrOBpl1a8B7dLg,1387
32
+ hydroserverpy/etl/extractors/http_extractor.py,sha256=-duQwnsFBk4NQS2qhO55evcCUOnrBe3JX_LU9RyysX4,2709
33
+ hydroserverpy/etl/extractors/local_file_extractor.py,sha256=T_Y9NTO0cC5L9mDPbIG6wYlXDQoatg8MobP97liFl4U,692
34
+ hydroserverpy/etl/loaders/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
+ hydroserverpy/etl/loaders/base.py,sha256=DrA9u7SNBxkPKqaszlP368yNbxihdqIGzP8rA6NAp6U,295
36
+ hydroserverpy/etl/loaders/hydroserver_loader.py,sha256=8BMsSKAL1YHSCeO4hgbFkX47QmFiI4mGgSomykw5Whk,2562
37
+ hydroserverpy/etl/transformers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
38
+ hydroserverpy/etl/transformers/base.py,sha256=237oVBhS3HQ3fcE4bZT5U1437WzV2x5kOFC229DY53M,1741
39
+ hydroserverpy/etl/transformers/csv_transformer.py,sha256=9DKSO4NfUUDlr_c6UnH4AU3-7LxwSSeuQdou0iiCjdM,3238
40
+ hydroserverpy/etl/transformers/json_transformer.py,sha256=ity0MXcYjEnlun4Y6cVSrnjrglKrK4JOXXHxWHIHN2A,2323
41
+ hydroserverpy/etl_csv/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
42
+ hydroserverpy/etl_csv/exceptions.py,sha256=0UY8YUlNepG0y6FfH36hJyR1bOhwYHSZIdUSSMTg7GA,314
43
+ hydroserverpy/etl_csv/hydroserver_etl_csv.py,sha256=9pu37ZmcpjVHfGTopfhw1oNvRNMx1uCPMOJJC-3wxn4,13244
44
+ hydroserverpy/quality/__init__.py,sha256=GGBMkFSXciJLYrbV-NraFrj_mXWCy_GTcy9KKrKXU4c,84
45
+ hydroserverpy/quality/service.py,sha256=U02UfLKVmFvr5ySiH0n0JYzUIabq5uprrHIiwcqBlqY,13879
46
+ hydroserverpy-0.4.0.dist-info/LICENSE,sha256=xVqFxDw3QOEJukakL7gQCqIMTQ1dlSCTo6Oc1otNW80,1508
47
+ hydroserverpy-0.4.0.dist-info/METADATA,sha256=gpws0OQEo2rfwLHQ_gFSjS7f5-fHld36y5hqrKJjYg8,507
48
+ hydroserverpy-0.4.0.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
49
+ hydroserverpy-0.4.0.dist-info/top_level.txt,sha256=Zf37hrncXLOYvXhgCrf5mZdeq81G9fShdE2LfYbtb7w,14
50
+ hydroserverpy-0.4.0.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
51
+ hydroserverpy-0.4.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.1.0)
2
+ Generator: setuptools (75.6.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,18 +0,0 @@
1
- Metadata-Version: 2.1
2
- Name: hydroserverpy
3
- Version: 0.3.0
4
- Requires-Python: <4,>=3.9
5
- License-File: LICENSE
6
- Requires-Dist: requests >=2
7
- Requires-Dist: pydantic >=2.6
8
- Requires-Dist: pandas >=2.2
9
- Requires-Dist: numpy >=2.0
10
- Requires-Dist: pyyaml >=5
11
- Requires-Dist: simplejson >=3
12
- Requires-Dist: crontab >=1
13
- Requires-Dist: python-dateutil >=2.8.2
14
- Requires-Dist: croniter >=2.0.1
15
- Requires-Dist: country-list >=1.1.0
16
- Provides-Extra: docs
17
- Requires-Dist: sphinx-autodoc-typehints ; extra == 'docs'
18
-
@@ -1,36 +0,0 @@
1
- hydroserverpy/__init__.py,sha256=oVxU_pSr5RZx4s5UHYYNCrjXQAP5lujlosB2a3qG260,223
2
- hydroserverpy/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
- hydroserverpy/core/service.py,sha256=ch6rwNM8oM3L-9phE474grofCR3QkTQ8AopkMyn9sjo,5339
4
- hydroserverpy/core/endpoints/__init__.py,sha256=SpN1WLX0R8HOLHBv1cp3VZcIEiKD4BBbgFGQppdA_mw,404
5
- hydroserverpy/core/endpoints/base.py,sha256=Ay0a8rucNo9x8h1MMMuMaISkBAgc9DK_kouLGtnHPjk,4925
6
- hydroserverpy/core/endpoints/data_loaders.py,sha256=boUdmn9_9QDJS38nBXwKXYiX_We_rfK1OFjCU8ptQUE,3009
7
- hydroserverpy/core/endpoints/data_sources.py,sha256=c9hwlFUUY-Ae84TrlB2boLjKIIhN_fzxHSYvPSb9PKA,3007
8
- hydroserverpy/core/endpoints/datastreams.py,sha256=z8NX21L2qcj07Cotm5sTT3GrNEV2jS0-AjLQDRHeRq8,6899
9
- hydroserverpy/core/endpoints/observed_properties.py,sha256=7_BtjsCyyGaQ1EMhlQXhWupTs85q7i85LdRLejVUb9o,3309
10
- hydroserverpy/core/endpoints/processing_levels.py,sha256=pDolo_BqkSufs3w_ykRbsg-93xWME7vYIA6BAwzdT7A,3286
11
- hydroserverpy/core/endpoints/result_qualifiers.py,sha256=977r3Vf6Y3kkoRcHQwTbQPSCxxeWsJkcDCPhFI30Tss,3301
12
- hydroserverpy/core/endpoints/sensors.py,sha256=niF6eY8dFdfowqW_dLq9-7CPolWO__lFwElMDJTYtsM,3122
13
- hydroserverpy/core/endpoints/things.py,sha256=n0nSq2AgJ7zFwAerkTtYlFvc1EzgUfHsu_nNTcVxqr0,8357
14
- hydroserverpy/core/endpoints/units.py,sha256=UZKizV8ZLMCPZQ0ol5U8UON_MB80uhxL2PUwDbtQLXA,3084
15
- hydroserverpy/core/schemas/__init__.py,sha256=gUFAim1jcUWAvj0IqpR8UKaCdXT1v11SmFnOzEmcwJM,353
16
- hydroserverpy/core/schemas/base.py,sha256=k5ctiVXLm5A0TI-Nkz9l3oDGsq16B3yKcQgnZcJVDds,3683
17
- hydroserverpy/core/schemas/data_loaders.py,sha256=BJv0-IUkgsNisuwyOooUAHaAv1DLCF5SVVnBjpfahYM,2470
18
- hydroserverpy/core/schemas/data_sources.py,sha256=oearfow10p-JJ5d_3-S2IEJ4039d4SMQlVA0N4dNOH0,8058
19
- hydroserverpy/core/schemas/datastreams.py,sha256=OEVc7xMVaFSHvLMyunt2g0u6xAfv5xg0fO6Uz8VjOSU,11413
20
- hydroserverpy/core/schemas/observed_properties.py,sha256=1ibOAYbsf1DQAos68V8KEmvBUoS2WO73dd5MhSWCC90,1161
21
- hydroserverpy/core/schemas/processing_levels.py,sha256=K4N5by5bfSD3iPcx6Jv1x-xOPxW3_gwhZcEfaqwSDmQ,867
22
- hydroserverpy/core/schemas/result_qualifiers.py,sha256=ejUMPCDOq3cuq3a6j2uvQNRdVNEVQ1jJAacYv-o9NZI,722
23
- hydroserverpy/core/schemas/sensors.py,sha256=8nXSEyD1kGAL2Wi76kHvjXNSgh2VFTfMgBkFP8ACsZw,1835
24
- hydroserverpy/core/schemas/things.py,sha256=Pkr3bIo4VjLML7o53_R2lXwBmx0Z7aoGlvJKC9Diw60,11139
25
- hydroserverpy/core/schemas/units.py,sha256=EB4HATC-C2RxPC0EpcVN--aQa6nl1O9Lj1jkpXlJ-8Y,826
26
- hydroserverpy/etl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
27
- hydroserverpy/etl/exceptions.py,sha256=0UY8YUlNepG0y6FfH36hJyR1bOhwYHSZIdUSSMTg7GA,314
28
- hydroserverpy/etl/service.py,sha256=g-zp89KK4MDIdcTWQDNKbCg485ByAg0Ui01ooFldxhI,12414
29
- hydroserverpy/quality/__init__.py,sha256=GGBMkFSXciJLYrbV-NraFrj_mXWCy_GTcy9KKrKXU4c,84
30
- hydroserverpy/quality/service.py,sha256=3y6hjt1jcRcQSx9xRw37YLFBNCch488MHhn-p5nmR6E,13830
31
- hydroserverpy-0.3.0.dist-info/LICENSE,sha256=xVqFxDw3QOEJukakL7gQCqIMTQ1dlSCTo6Oc1otNW80,1508
32
- hydroserverpy-0.3.0.dist-info/METADATA,sha256=8n1ZsmvItJmbNl7EgTtOGE4zr-MqY4xE-H5CUMZ3zgU,488
33
- hydroserverpy-0.3.0.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
34
- hydroserverpy-0.3.0.dist-info/top_level.txt,sha256=Zf37hrncXLOYvXhgCrf5mZdeq81G9fShdE2LfYbtb7w,14
35
- hydroserverpy-0.3.0.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
36
- hydroserverpy-0.3.0.dist-info/RECORD,,
File without changes