hydroserverpy 0.5.0b2__tar.gz → 0.5.0b4__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.

Potentially problematic release.


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

Files changed (72) hide show
  1. {hydroserverpy-0.5.0b2/src/hydroserverpy.egg-info → hydroserverpy-0.5.0b4}/PKG-INFO +1 -1
  2. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/setup.cfg +1 -1
  3. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy/api/models/etl/data_source.py +12 -9
  4. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy/api/models/sta/datastream.py +6 -22
  5. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy/etl_csv/hydroserver_etl_csv.py +24 -11
  6. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4/src/hydroserverpy.egg-info}/PKG-INFO +1 -1
  7. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/LICENSE +0 -0
  8. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/README.md +0 -0
  9. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/pyproject.toml +0 -0
  10. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/setup.py +0 -0
  11. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy/__init__.py +0 -0
  12. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy/api/__init__.py +0 -0
  13. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy/api/http.py +0 -0
  14. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy/api/main.py +0 -0
  15. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy/api/models/__init__.py +0 -0
  16. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy/api/models/base.py +0 -0
  17. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy/api/models/etl/__init__.py +0 -0
  18. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy/api/models/etl/data_archive.py +0 -0
  19. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy/api/models/etl/orchestration_configuration.py +0 -0
  20. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy/api/models/etl/orchestration_system.py +0 -0
  21. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy/api/models/iam/__init__.py +0 -0
  22. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy/api/models/iam/account.py +0 -0
  23. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy/api/models/iam/collaborator.py +0 -0
  24. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy/api/models/iam/role.py +0 -0
  25. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy/api/models/iam/workspace.py +0 -0
  26. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy/api/models/sta/__init__.py +0 -0
  27. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy/api/models/sta/observed_property.py +0 -0
  28. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy/api/models/sta/processing_level.py +0 -0
  29. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy/api/models/sta/result_qualifier.py +0 -0
  30. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy/api/models/sta/sensor.py +0 -0
  31. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy/api/models/sta/thing.py +0 -0
  32. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy/api/models/sta/unit.py +0 -0
  33. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy/api/services/__init__.py +0 -0
  34. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy/api/services/base.py +0 -0
  35. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy/api/services/etl/__init__.py +0 -0
  36. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy/api/services/etl/data_archive.py +0 -0
  37. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy/api/services/etl/data_source.py +0 -0
  38. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy/api/services/etl/orchestration_system.py +0 -0
  39. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy/api/services/iam/__init__.py +0 -0
  40. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy/api/services/iam/workspace.py +0 -0
  41. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy/api/services/sta/__init__.py +0 -0
  42. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy/api/services/sta/datastream.py +0 -0
  43. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy/api/services/sta/observed_property.py +0 -0
  44. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy/api/services/sta/processing_level.py +0 -0
  45. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy/api/services/sta/result_qualifier.py +0 -0
  46. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy/api/services/sta/sensor.py +0 -0
  47. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy/api/services/sta/thing.py +0 -0
  48. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy/api/services/sta/unit.py +0 -0
  49. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy/etl/__init__.py +0 -0
  50. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy/etl/extractors/__init__.py +0 -0
  51. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy/etl/extractors/base.py +0 -0
  52. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy/etl/extractors/ftp_extractor.py +0 -0
  53. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy/etl/extractors/http_extractor.py +0 -0
  54. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy/etl/extractors/local_file_extractor.py +0 -0
  55. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy/etl/hydroserver_etl.py +0 -0
  56. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy/etl/loaders/__init__.py +0 -0
  57. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy/etl/loaders/base.py +0 -0
  58. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy/etl/loaders/hydroserver_loader.py +0 -0
  59. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy/etl/transformers/__init__.py +0 -0
  60. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy/etl/transformers/base.py +0 -0
  61. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy/etl/transformers/csv_transformer.py +0 -0
  62. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy/etl/transformers/json_transformer.py +0 -0
  63. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy/etl/types.py +0 -0
  64. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy/etl_csv/__init__.py +0 -0
  65. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy/etl_csv/exceptions.py +0 -0
  66. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy/quality/__init__.py +0 -0
  67. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy/quality/service.py +0 -0
  68. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy.egg-info/SOURCES.txt +0 -0
  69. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy.egg-info/dependency_links.txt +0 -0
  70. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy.egg-info/requires.txt +0 -0
  71. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy.egg-info/top_level.txt +0 -0
  72. {hydroserverpy-0.5.0b2 → hydroserverpy-0.5.0b4}/src/hydroserverpy.egg-info/zip-safe +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hydroserverpy
3
- Version: 0.5.0b2
3
+ Version: 0.5.0b4
4
4
  Requires-Python: <4,>=3.9
5
5
  License-File: LICENSE
6
6
  Requires-Dist: requests>=2
@@ -1,6 +1,6 @@
1
1
  [metadata]
2
2
  name = hydroserverpy
3
- version = 0.5.0b2
3
+ version = 0.5.0b4
4
4
 
5
5
  [options]
6
6
  package_dir =
@@ -1,8 +1,8 @@
1
+ import requests
1
2
  import tempfile
2
3
  from typing import Union, List, Optional, TYPE_CHECKING
3
4
  from uuid import UUID
4
5
  from pydantic import BaseModel, Field
5
- from urllib.request import urlopen
6
6
  from hydroserverpy.etl_csv.hydroserver_etl_csv import HydroServerETLCSV
7
7
  from .orchestration_system import OrchestrationSystem
8
8
  from .orchestration_configuration import OrchestrationConfigurationFields
@@ -135,14 +135,17 @@ class DataSource(HydroServerModel, DataSourceFields, OrchestrationConfigurationF
135
135
  )
136
136
  loader.run()
137
137
  elif self.settings["extractor"]["type"] == "HTTP":
138
- with tempfile.NamedTemporaryFile(mode="w") as temp_file:
139
- with urlopen(self.settings["extractor"]["urlTemplate"]) as response:
140
- chunk_size = 1024 * 1024 * 10 # Use a 10mb chunk size.
141
- while True:
142
- chunk = response.read(chunk_size)
143
- if not chunk:
144
- break
145
- temp_file.write(chunk)
138
+ with tempfile.NamedTemporaryFile(mode="w+") as temp_file:
139
+ response = requests.get(
140
+ self.settings["extractor"]["urlTemplate"],
141
+ stream=True,
142
+ timeout=60,
143
+ )
144
+ response.raise_for_status()
145
+ chunk_size = 1024 * 1024 * 10 # Use a 10mb chunk size.
146
+ for chunk in response.iter_content(chunk_size=chunk_size):
147
+ if chunk:
148
+ temp_file.write(chunk.decode("utf-8"))
146
149
  temp_file.seek(0)
147
150
  loader = HydroServerETLCSV(
148
151
  self._connection, data_file=temp_file, data_source=self
@@ -141,20 +141,6 @@ class Datastream(HydroServerModel, DatastreamFields):
141
141
  _connection=_connection, _model_ref="datastreams", _uid=_uid, **data
142
142
  )
143
143
 
144
- self._workspace_id = str(
145
- data.get("workspace_id")
146
- or data.get("workspaceId")
147
- or data["properties"]["workspace"]["id"]
148
- )
149
- self._processing_level_id = str(
150
- data.get("workspace_id")
151
- or data.get("workspaceId")
152
- or data["properties"]["processingLevelId"]
153
- )
154
- self._unit_id = str(
155
- data.get("unit_id") or data.get("unitId") or data["properties"]["unitId"]
156
- )
157
-
158
144
  self._workspace = None
159
145
  self._thing = None
160
146
  self._observed_property = None
@@ -167,7 +153,8 @@ class Datastream(HydroServerModel, DatastreamFields):
167
153
  """The workspace this datastream belongs to."""
168
154
 
169
155
  if self._workspace is None:
170
- self._workspace = self._connection.workspaces.get(uid=self._workspace_id)
156
+ datastream = self._connection.request("get", f"/api/data/datastreams/{str(self.uid)}").json()
157
+ self._workspace = self._connection.workspaces.get(uid=datastream["workspaceId"])
171
158
 
172
159
  return self._workspace
173
160
 
@@ -246,7 +233,8 @@ class Datastream(HydroServerModel, DatastreamFields):
246
233
  """The unit this datastream uses."""
247
234
 
248
235
  if self._unit is None:
249
- self._unit = self._connection.units.get(uid=self._unit_id)
236
+ datastream = self._connection.request("get", f"/api/data/datastreams/{str(self.uid)}").json()
237
+ self._unit = self._connection.units.get(uid=datastream["unitId"])
250
238
  self._original_data["unit"] = self._unit
251
239
 
252
240
  return self._unit
@@ -263,9 +251,8 @@ class Datastream(HydroServerModel, DatastreamFields):
263
251
  """The processing level of this datastream."""
264
252
 
265
253
  if self._processing_level is None:
266
- self._processing_level = self._connection.processinglevels.get(
267
- uid=self._processing_level_id
268
- )
254
+ datastream = self._connection.request("get", f"/api/data/datastreams/{str(self.uid)}").json()
255
+ self._processing_level = self._connection.processinglevels.get(uid=datastream["processingLevelId"])
269
256
  self._original_data["processing_level"] = self._processing_level
270
257
 
271
258
  return self._processing_level
@@ -285,13 +272,10 @@ class Datastream(HydroServerModel, DatastreamFields):
285
272
  """Refresh this datastream from HydroServer."""
286
273
 
287
274
  self._workspace = None
288
- self._workspace_id = None
289
275
  self._thing = None
290
276
  self._observed_property = None
291
277
  self._unit = None
292
- self._unit_id = None
293
278
  self._processing_level = None
294
- self._processing_level_id = None
295
279
  self._sensor = None
296
280
  super()._refresh()
297
281
 
@@ -1,4 +1,5 @@
1
1
  import csv
2
+ import math
2
3
  import logging
3
4
  import croniter
4
5
  import pandas as pd
@@ -138,14 +139,27 @@ class HydroServerETLCSV:
138
139
  if str(datastream.uid) not in self._observations.keys():
139
140
  self._observations[str(datastream.uid)] = []
140
141
 
142
+ raw_result = row[
143
+ self._datastream_column_indexes[
144
+ self._datastream_mapping[str(datastream.uid)]
145
+ ]
146
+ ]
147
+
148
+ if isinstance(raw_result, (int, float)):
149
+ result = raw_result
150
+ else:
151
+ try:
152
+ result = float(raw_result)
153
+ except (TypeError, ValueError):
154
+ result = datastream.no_data_value
155
+
156
+ if math.isnan(result):
157
+ result = datastream.no_data_value
158
+
141
159
  self._observations[str(datastream.uid)].append(
142
160
  {
143
161
  "phenomenon_time": timestamp,
144
- "result": row[
145
- self._datastream_column_indexes[
146
- self._datastream_mapping[str(datastream.uid)]
147
- ]
148
- ],
162
+ "result": result,
149
163
  }
150
164
  )
151
165
 
@@ -200,8 +214,7 @@ class HydroServerETLCSV:
200
214
 
201
215
  try:
202
216
  if (
203
- self._data_source.settings["transformer"].get("timestampFormat")
204
- == "ISO8601"
217
+ self._data_source.settings["transformer"].get("timestampFormat") in ["utc", "constant", "ISO8601"]
205
218
  or self._data_source.settings["transformer"].get("timestampFormat")
206
219
  is None
207
220
  ):
@@ -228,11 +241,11 @@ class HydroServerETLCSV:
228
241
  timestamp = timestamp.replace(
229
242
  tzinfo=datetime.strptime(
230
243
  self._data_source.settings["transformer"].get(
231
- "timestampFormat"
244
+ "timestampOffset"
232
245
  )[:-2]
233
246
  + ":"
234
247
  + self._data_source.settings["transformer"].get(
235
- "timestampFormat"
248
+ "timestampOffset"
236
249
  )[3:],
237
250
  "%z",
238
251
  ).tzinfo
@@ -309,13 +322,13 @@ class HydroServerETLCSV:
309
322
 
310
323
  if self._data_source.crontab is not None:
311
324
  next_run = croniter.croniter(
312
- self._data_source.crontab, datetime.now()
325
+ self._data_source.crontab, datetime.now(timezone.utc)
313
326
  ).get_next(datetime)
314
327
  elif (
315
328
  self._data_source.interval is not None
316
329
  and self._data_source.interval_units is not None
317
330
  ):
318
- next_run = datetime.now() + timedelta(
331
+ next_run = datetime.now(timezone.utc) + timedelta(
319
332
  **{self._data_source.interval_units: self._data_source.interval}
320
333
  )
321
334
  else:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hydroserverpy
3
- Version: 0.5.0b2
3
+ Version: 0.5.0b4
4
4
  Requires-Python: <4,>=3.9
5
5
  License-File: LICENSE
6
6
  Requires-Dist: requests>=2
File without changes