hydroserverpy 0.4.0__py3-none-any.whl → 0.5.0b1__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 (65) hide show
  1. hydroserverpy/__init__.py +2 -3
  2. hydroserverpy/api/http.py +24 -0
  3. hydroserverpy/api/main.py +152 -0
  4. hydroserverpy/api/models/__init__.py +18 -0
  5. hydroserverpy/api/models/base.py +74 -0
  6. hydroserverpy/api/models/etl/__init__.py +0 -0
  7. hydroserverpy/api/models/iam/__init__.py +0 -0
  8. hydroserverpy/api/models/iam/account.py +12 -0
  9. hydroserverpy/api/models/iam/collaborator.py +34 -0
  10. hydroserverpy/api/models/iam/role.py +10 -0
  11. hydroserverpy/api/models/iam/workspace.py +203 -0
  12. hydroserverpy/api/models/sta/__init__.py +0 -0
  13. hydroserverpy/api/models/sta/datastream.py +336 -0
  14. hydroserverpy/api/models/sta/observed_property.py +72 -0
  15. hydroserverpy/api/models/sta/processing_level.py +50 -0
  16. hydroserverpy/api/models/sta/result_qualifier.py +49 -0
  17. hydroserverpy/api/models/sta/sensor.py +105 -0
  18. hydroserverpy/api/models/sta/thing.py +217 -0
  19. hydroserverpy/api/models/sta/unit.py +49 -0
  20. hydroserverpy/api/services/__init__.py +8 -0
  21. hydroserverpy/api/services/base.py +92 -0
  22. hydroserverpy/api/services/etl/__init__.py +0 -0
  23. hydroserverpy/api/services/iam/__init__.py +0 -0
  24. hydroserverpy/api/services/iam/workspace.py +126 -0
  25. hydroserverpy/api/services/sta/__init__.py +0 -0
  26. hydroserverpy/api/services/sta/datastream.py +354 -0
  27. hydroserverpy/api/services/sta/observed_property.py +98 -0
  28. hydroserverpy/api/services/sta/processing_level.py +78 -0
  29. hydroserverpy/api/services/sta/result_qualifier.py +74 -0
  30. hydroserverpy/api/services/sta/sensor.py +116 -0
  31. hydroserverpy/api/services/sta/thing.py +188 -0
  32. hydroserverpy/api/services/sta/unit.py +82 -0
  33. hydroserverpy/etl/loaders/hydroserver_loader.py +1 -1
  34. hydroserverpy/etl_csv/hydroserver_etl_csv.py +1 -1
  35. {hydroserverpy-0.4.0.dist-info → hydroserverpy-0.5.0b1.dist-info}/METADATA +4 -3
  36. hydroserverpy-0.5.0b1.dist-info/RECORD +59 -0
  37. {hydroserverpy-0.4.0.dist-info → hydroserverpy-0.5.0b1.dist-info}/WHEEL +1 -1
  38. hydroserverpy/core/endpoints/__init__.py +0 -9
  39. hydroserverpy/core/endpoints/base.py +0 -146
  40. hydroserverpy/core/endpoints/data_loaders.py +0 -93
  41. hydroserverpy/core/endpoints/data_sources.py +0 -93
  42. hydroserverpy/core/endpoints/datastreams.py +0 -225
  43. hydroserverpy/core/endpoints/observed_properties.py +0 -111
  44. hydroserverpy/core/endpoints/processing_levels.py +0 -111
  45. hydroserverpy/core/endpoints/result_qualifiers.py +0 -111
  46. hydroserverpy/core/endpoints/sensors.py +0 -111
  47. hydroserverpy/core/endpoints/things.py +0 -261
  48. hydroserverpy/core/endpoints/units.py +0 -111
  49. hydroserverpy/core/schemas/__init__.py +0 -9
  50. hydroserverpy/core/schemas/base.py +0 -124
  51. hydroserverpy/core/schemas/data_loaders.py +0 -73
  52. hydroserverpy/core/schemas/data_sources.py +0 -223
  53. hydroserverpy/core/schemas/datastreams.py +0 -330
  54. hydroserverpy/core/schemas/observed_properties.py +0 -43
  55. hydroserverpy/core/schemas/processing_levels.py +0 -31
  56. hydroserverpy/core/schemas/result_qualifiers.py +0 -26
  57. hydroserverpy/core/schemas/sensors.py +0 -68
  58. hydroserverpy/core/schemas/things.py +0 -346
  59. hydroserverpy/core/schemas/units.py +0 -29
  60. hydroserverpy/core/service.py +0 -200
  61. hydroserverpy-0.4.0.dist-info/RECORD +0 -51
  62. /hydroserverpy/{core → api}/__init__.py +0 -0
  63. {hydroserverpy-0.4.0.dist-info → hydroserverpy-0.5.0b1.dist-info/licenses}/LICENSE +0 -0
  64. {hydroserverpy-0.4.0.dist-info → hydroserverpy-0.5.0b1.dist-info}/top_level.txt +0 -0
  65. {hydroserverpy-0.4.0.dist-info → hydroserverpy-0.5.0b1.dist-info}/zip-safe +0 -0
@@ -1,346 +0,0 @@
1
- from pydantic import BaseModel, Field, AliasPath, AliasChoices, field_validator
2
- from typing import Optional, List, Literal, IO, TYPE_CHECKING
3
- from uuid import UUID
4
- from country_list import countries_for_language
5
- from hydroserverpy.core.schemas.base import HydroServerCoreModel, HydroServerBaseModel
6
-
7
- if TYPE_CHECKING:
8
- from hydroserverpy.core.schemas.datastreams import Datastream
9
-
10
-
11
- class ThingFields(BaseModel):
12
- name: str = Field(
13
- ...,
14
- strip_whitespace=True,
15
- max_length=200,
16
- description="The name of the site/thing.",
17
- )
18
- description: str = Field(
19
- ..., strip_whitespace=True, description="A description of the site/thing."
20
- )
21
- sampling_feature_type: str = Field(
22
- ...,
23
- strip_whitespace=True,
24
- max_length=200,
25
- description="The sampling feature type of the site/thing.",
26
- )
27
- sampling_feature_code: str = Field(
28
- ...,
29
- strip_whitespace=True,
30
- max_length=200,
31
- description="A code representing the sampling feature of the site/thing.",
32
- )
33
- site_type: str = Field(
34
- ...,
35
- strip_whitespace=True,
36
- max_length=200,
37
- description="The type of the site/thing.",
38
- )
39
- data_disclaimer: Optional[str] = Field(
40
- None,
41
- strip_whitespace=True,
42
- description="An optional data disclaimer to attach to observations collected at this site/thing.",
43
- )
44
-
45
-
46
- # Get a list of all ISO 3166-1 alpha-2 country codes
47
- valid_country_codes = [code for code, _ in countries_for_language("en")]
48
-
49
-
50
- class LocationFields(BaseModel):
51
- latitude: float = Field(
52
- ...,
53
- ge=-90,
54
- le=90,
55
- serialization_alias="latitude",
56
- validation_alias=AliasChoices("latitude", AliasPath("location", "latitude")),
57
- description="The WGS84 latitude of the location.",
58
- )
59
- longitude: float = Field(
60
- ...,
61
- ge=-180,
62
- le=180,
63
- serialization_alias="longitude",
64
- validation_alias=AliasChoices("longitude", AliasPath("location", "longitude")),
65
- description="The WGS84 longitude of the location.",
66
- )
67
- elevation_m: Optional[float] = Field(
68
- None,
69
- ge=-99999,
70
- le=99999,
71
- serialization_alias="elevation_m",
72
- validation_alias=AliasChoices(
73
- "elevation_m", AliasPath("location", "elevation_m")
74
- ),
75
- description="The elevation in meters of the location.",
76
- )
77
- elevation_datum: Optional[str] = Field(
78
- None,
79
- strip_whitespace=True,
80
- max_length=255,
81
- serialization_alias="elevationDatum",
82
- validation_alias=AliasChoices(
83
- "elevationDatum", AliasPath("location", "elevationDatum")
84
- ),
85
- description="The datum used to represent the elevation of the location.",
86
- )
87
- state: Optional[str] = Field(
88
- None,
89
- strip_whitespace=True,
90
- max_length=200,
91
- serialization_alias="state",
92
- validation_alias=AliasChoices("state", AliasPath("location", "state")),
93
- description="The state/province of the location.",
94
- )
95
- county: Optional[str] = Field(
96
- None,
97
- strip_whitespace=True,
98
- max_length=200,
99
- serialization_alias="county",
100
- validation_alias=AliasChoices("county", AliasPath("location", "county")),
101
- description="The county/district of the location.",
102
- )
103
- country: Optional[str] = Field(
104
- None,
105
- strip_whitespace=True,
106
- max_length=2,
107
- serialization_alias="country",
108
- validation_alias=AliasChoices("country", AliasPath("location", "country")),
109
- description="The ISO 3166-1 alpha-2 country code of the location.",
110
- )
111
-
112
- @field_validator("country", mode="after")
113
- def check_country_code(cls, value: str) -> str:
114
- """
115
- Validate the country code to ensure it is an ISO 3166-1 alpha-2 country code.
116
-
117
- :param value: The country code to validate.
118
- :type value: Optional[str]
119
- :raises ValueError: If the country code is invalid.
120
- :return: The validated country code.
121
- :rtype: Optional[str]
122
- """
123
-
124
- if value and value.upper() not in valid_country_codes:
125
- raise ValueError(
126
- f"Invalid country code: {value}. Must be an ISO 3166-1 alpha-2 country code."
127
- )
128
-
129
- return value
130
-
131
-
132
- class Thing(HydroServerCoreModel, ThingFields, LocationFields):
133
- """
134
- A model representing a site/thing, combining core attributes from ThingFields and LocationFields with methods for
135
- interacting with related entities.
136
-
137
- :ivar _datastreams: A private attribute to cache the list of datastreams associated with the thing.
138
- :ivar _tags: A private attribute to cache the list of tags associated with the thing.
139
- :ivar _photos: A private attribute to cache the list of photos associated with the thing.
140
- :ivar _archive: A private attribute to cache the archive associated with the thing.
141
- """
142
-
143
- def __init__(self, _endpoint, _uid: Optional[UUID] = None, **data):
144
- """
145
- Initialize a Thing instance.
146
-
147
- :param _endpoint: The endpoint associated with the thing.
148
- :type _endpoint: str
149
- :param _uid: The unique identifier for the thing.
150
- :type _uid: Optional[UUID]
151
- :param data: Additional attributes for the thing.
152
- """
153
-
154
- super().__init__(_endpoint=_endpoint, _uid=_uid, **data)
155
- self._datastreams = None
156
- self._tags = None
157
- self._photos = None
158
- self._archive = None
159
-
160
- @property
161
- def datastreams(self) -> List["Datastream"]:
162
- """
163
- The datastreams associated with the thing. If not already cached, fetch the datastreams from the
164
- server.
165
-
166
- :return: A list of datastreams associated with the thing.
167
- :rtype: List[Datastream]
168
- """
169
-
170
- if self._datastreams is None:
171
- self._datastreams = self._endpoint.list_datastreams(uid=self.uid)
172
-
173
- return self._datastreams
174
-
175
- @property
176
- def tags(self) -> List["Tag"]:
177
- """
178
- The tags associated with the thing. If not already cached, fetch the tags from the server.
179
-
180
- :return: A list of tags associated with the thing.
181
- :rtype: List[Tag]
182
- """
183
-
184
- if self._tags is None:
185
- self._tags = self._endpoint.list_tags(uid=self.uid)
186
-
187
- return self._tags
188
-
189
- @property
190
- def photos(self) -> List["Photo"]:
191
- """
192
- The photos associated with the thing. If not already cached, fetch the photos from the server.
193
-
194
- :return: A list of photos associated with the thing.
195
- :rtype: List[Photo]
196
- """
197
-
198
- if self._photos is None:
199
- self._photos = self._endpoint.list_photos(uid=self.uid)
200
-
201
- return self._photos
202
-
203
- @property
204
- def archive(self) -> "Archive":
205
- """
206
- The archive associated with the thing. If not already cached, fetch the archive from the server.
207
-
208
- :return: The archive associated with the thing.
209
- :rtype: Archive
210
- """
211
-
212
- if self._archive is None:
213
- self._archive = self._endpoint.get_archive(uid=self.uid)
214
-
215
- return self._archive
216
-
217
- def refresh(self) -> None:
218
- """
219
- Refresh the thing with the latest data from the server and update cached datastreams, tags, photos, and archive
220
- if they were previously loaded.
221
- """
222
-
223
- entity = self._endpoint.get(uid=self.uid).model_dump(exclude=["uid"])
224
- self._original_data = entity
225
- self.__dict__.update(entity)
226
- if self._datastreams is not None:
227
- self._datastreams = self._endpoint.list_datastreams(uid=self.uid)
228
- if self._tags is not None:
229
- self._tags = self._endpoint.list_tags(uid=self.uid)
230
- if self._photos is not None:
231
- self._photos = self._endpoint.list_photos(uid=self.uid)
232
- if self._archive is not None:
233
- self._archive = self._endpoint.get_archive(uid=self.uid)
234
-
235
- def add_tag(self, key: str, value: str) -> None:
236
- """
237
- Add a new tag to the thing.
238
-
239
- :param key: The key of the new tag.
240
- :param value: The value of the new tag.
241
- """
242
-
243
- if self.tags is not None:
244
- new_tag = self._endpoint.create_tag(uid=self.uid, key=key, value=value)
245
- self._tags.append(new_tag)
246
-
247
- def update_tag(self, key: str, value: str) -> None:
248
- """
249
- Update the value of an existing tag on the thing.
250
-
251
- :param key: The key of the tag to update.
252
- :param value: The new value for the tag.
253
- """
254
-
255
- selected_tag = next((tag for tag in self._tags if tag.key == key))
256
- updated_tag = self._endpoint.update_tag(
257
- uid=self.uid, tag_uid=selected_tag.uid, value=value
258
- )
259
- self._tags = [tag if tag.key != key else updated_tag for tag in self._tags]
260
-
261
- def delete_tag(self, key: str) -> None:
262
- """
263
- Delete a tag from the thing.
264
-
265
- :param key: The key of the tag to delete.
266
- """
267
-
268
- selected_tag = next((tag for tag in self._tags if tag.key == key))
269
- self._endpoint.delete_tag(uid=self.uid, tag_uid=selected_tag.uid)
270
- self._tags = [tag for tag in self._tags if tag.key != selected_tag.key]
271
-
272
- def add_photo(self, photo: IO) -> None:
273
- """
274
- Add a photo to the thing.
275
-
276
- :param photo: The photo file to upload.
277
- :type photo: IO
278
- """
279
-
280
- if self.photos is not None:
281
- photos = self._endpoint.upload_photo(uid=self.uid, file=photo)
282
- self._photos.extend(photos)
283
-
284
- def delete_photo(self, link: str) -> None:
285
- """
286
- Delete a photo from the thing.
287
-
288
- :param link: The link to the photo to delete.
289
- """
290
-
291
- selected_photo = next((photo for photo in self._photos if photo.link == link))
292
- self._endpoint.delete_photo(uid=self.uid, photo_uid=selected_photo.uid)
293
- self._photos = [
294
- photo for photo in self._photos if photo.link != selected_photo.link
295
- ]
296
-
297
-
298
- class Archive(HydroServerBaseModel):
299
- """
300
- A model representing an archive associated with a thing.
301
- """
302
-
303
- link: Optional[str] = Field(
304
- None,
305
- strip_whitespace=True,
306
- max_length=255,
307
- description="A link to the HydroShare resource containing the archived site/thing.",
308
- )
309
- frequency: Optional[Literal["daily", "weekly", "monthly"]] = Field(
310
- ...,
311
- description="The frequency at which the site/thing should be archived.",
312
- )
313
- path: str = Field(
314
- ...,
315
- strip_whitespace=True,
316
- max_length=255,
317
- description="The path within the HydroShare resource containing the archived data.",
318
- )
319
- datastream_ids: List[UUID] = Field(
320
- ...,
321
- description="The list of datastreams that are included in the archived data.",
322
- )
323
-
324
-
325
- class Tag(HydroServerBaseModel):
326
- """
327
- A model representing a tag associated with a thing.
328
- """
329
-
330
- key: str = Field(
331
- ..., strip_whitespace=True, max_length=255, description="The key of the tag."
332
- )
333
- value: str = Field(
334
- ..., strip_whitespace=True, max_length=255, description="The value of the tag."
335
- )
336
-
337
-
338
- class Photo(HydroServerBaseModel):
339
- """
340
- A model representing a photo associated with a thing.
341
- """
342
-
343
- file_path: str = Field(
344
- ..., strip_whitespace=True, description="The file path of the photo."
345
- )
346
- link: str = Field(..., strip_whitespace=True, description="The link to the photo.")
@@ -1,29 +0,0 @@
1
- from pydantic import Field
2
- from hydroserverpy.core.schemas.base import HydroServerCoreModel
3
-
4
-
5
- class UnitFields:
6
- name: str = Field(
7
- ..., strip_whitespace=True, max_length=255, description="The name of the unit."
8
- )
9
- symbol: str = Field(
10
- ...,
11
- strip_whitespace=True,
12
- max_length=255,
13
- description="The symbol of the unit.",
14
- )
15
- definition: str = Field(
16
- ..., strip_whitespace=True, description="The definition of the unit."
17
- )
18
- type: str = Field(
19
- ..., strip_whitespace=True, max_length=255, description="The type of the unit."
20
- )
21
-
22
-
23
- class Unit(HydroServerCoreModel, UnitFields):
24
- """
25
- A model representing a unit, extending the core functionality of HydroServerCoreModel with additional
26
- fields defined in UnitFields.
27
- """
28
-
29
- pass
@@ -1,200 +0,0 @@
1
- import requests
2
- from typing import Optional
3
- from hydroserverpy.core.endpoints import (
4
- DataLoaderEndpoint,
5
- DataSourceEndpoint,
6
- DatastreamEndpoint,
7
- ThingEndpoint,
8
- SensorEndpoint,
9
- UnitEndpoint,
10
- ProcessingLevelEndpoint,
11
- ObservedPropertyEndpoint,
12
- ResultQualifierEndpoint,
13
- )
14
-
15
-
16
- class HydroServer:
17
- """
18
- Connects to a HydroServer instance and used to interact with HydroServer's Data Management API endpoints.
19
-
20
- :param host: The base URL or host of the HydroServer API.
21
- :type host: str
22
- :param username: The username for basic authentication, if required.
23
- :type username: Optional[str]
24
- :param password: The password for basic authentication, if required.
25
- :type password: Optional[str]
26
- :param apikey: The API key for authentication, if using API key authentication.
27
- :type apikey: Optional[str]
28
- :param api_route: The API route to use, default is 'api'.
29
- :type api_route: str
30
- """
31
-
32
- def __init__(
33
- self,
34
- host: str,
35
- username: Optional[str] = None,
36
- password: Optional[str] = None,
37
- apikey: Optional[str] = None,
38
- api_route: str = "api",
39
- ):
40
- self.host = host.strip("/")
41
- self.auth = (
42
- (
43
- username or "__key__",
44
- password or apikey,
45
- )
46
- if (username and password) or apikey
47
- else None
48
- )
49
- self.api_route = api_route.strip("/")
50
- self._session = None
51
- self._timeout = 60
52
- self._initialize_session()
53
-
54
- def _initialize_session(self) -> None:
55
- """
56
- The _initialize_session function is used to initialize the session object.
57
-
58
- :param self
59
- :return: None
60
- """
61
-
62
- if self._session is not None:
63
- self._session.close()
64
-
65
- self._session = requests.Session()
66
-
67
- if self.auth and self.auth[0] == "__key__":
68
- self._session.headers.update({"key": self.auth[1]})
69
- elif self.auth:
70
- self._session.auth = self.auth
71
-
72
- def _request(self, method, path, *args, **kwargs) -> requests.Response:
73
- """
74
- The _request function is a helper function that makes it easier to make requests to the API.
75
- It takes in a method, path, and any other arguments you want to pass into the request.
76
- The method argument should be one of 'get', 'post', or 'delete'. The path argument should be
77
- the endpoint you are trying to reach (e.g., '/users/me'). Any additional arguments will be passed
78
- into the request as-is.
79
-
80
- :param self
81
- :param method: Specify the type of request that is being made
82
- :param path: Specify the path of the request
83
- :return: A response object
84
- """
85
-
86
- for attempt in range(2):
87
- try:
88
- response = getattr(self._session, method)(
89
- f'{self.host}/{path.strip("/")}',
90
- timeout=self._timeout,
91
- *args,
92
- **kwargs,
93
- )
94
- response.raise_for_status()
95
- return response
96
- except requests.exceptions.ConnectionError as e:
97
- if attempt == 0:
98
- self._initialize_session()
99
- continue
100
- else:
101
- raise e
102
-
103
- @property
104
- def dataloaders(self):
105
- """
106
- Data Loader Endpoint.
107
-
108
- :return: An instance of DataLoaderEndpoint.
109
- :rtype: DataLoaderEndpoint
110
- """
111
-
112
- return DataLoaderEndpoint(self)
113
-
114
- @property
115
- def datasources(self):
116
- """
117
- Data Source Endpoint.
118
-
119
- :return: An instance of DataSourceEndpoint.
120
- :rtype: DataSourceEndpoint
121
- """
122
-
123
- return DataSourceEndpoint(self)
124
-
125
- @property
126
- def datastreams(self):
127
- """
128
- Datastream Endpoint.
129
-
130
- :return: An instance of DatastreamEndpoint.
131
- :rtype: DatastreamEndpoint
132
- """
133
-
134
- return DatastreamEndpoint(self)
135
-
136
- @property
137
- def observedproperties(self):
138
- """
139
- Observed Property Endpoint.
140
-
141
- :return: An instance of ObservedPropertyEndpoint.
142
- :rtype: ObservedPropertyEndpoint
143
- """
144
-
145
- return ObservedPropertyEndpoint(self)
146
-
147
- @property
148
- def processinglevels(self):
149
- """
150
- Processing Level Endpoint.
151
-
152
- :return: An instance of ProcessingLevelEndpoint.
153
- :rtype: ProcessingLevelEndpoint
154
- """
155
-
156
- return ProcessingLevelEndpoint(self)
157
-
158
- @property
159
- def resultqualifiers(self):
160
- """
161
- Result Qualifier Endpoint.
162
-
163
- :return: An instance of ResultQualifierEndpoint.
164
- :rtype: ResultQualifierEndpoint
165
- """
166
-
167
- return ResultQualifierEndpoint(self)
168
-
169
- @property
170
- def sensors(self):
171
- """
172
- Sensor Endpoint.
173
-
174
- :return: An instance of SensorEndpoint.
175
- :rtype: SensorEndpoint
176
- """
177
-
178
- return SensorEndpoint(self)
179
-
180
- @property
181
- def things(self):
182
- """
183
- Thing Endpoint.
184
-
185
- :return: An instance of ThingEndpoint.
186
- :rtype: ThingEndpoint
187
- """
188
-
189
- return ThingEndpoint(self)
190
-
191
- @property
192
- def units(self):
193
- """
194
- Unit Endpoint.
195
-
196
- :return: An instance of UnitEndpoint.
197
- :rtype: UnitEndpoint
198
- """
199
-
200
- return UnitEndpoint(self)
@@ -1,51 +0,0 @@
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,,
File without changes