artesian-sdk 4.2.2.dev16__py3-none-any.whl → 4.2.3b2.dev54__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.
- Artesian/GMEPublicOffers/GMEPublicOfferQuery.py +7 -0
- Artesian/GMEPublicOffers/_Enum/Market.py +1 -0
- Artesian/GMEPublicOffers/_Enum/Status.py +1 -0
- Artesian/GMEPublicOffers/_Enum/UnitType.py +2 -0
- Artesian/MarketData/MarketDataService.py +49 -0
- Artesian/MarketData/_Dto/DerivedCfg.py +2 -1
- Artesian/MarketData/_Dto/DerivedTransformQueryValidation.py +34 -0
- Artesian/MarketData/_Dto/DerivedTransformQueryValidationResponse.py +30 -0
- Artesian/MarketData/_Dto/MarketDataEntityInput.py +25 -1
- Artesian/MarketData/_Dto/TimeSerieData.py +22 -0
- Artesian/MarketData/_Dto/__init__.py +2 -0
- Artesian/MarketData/_Enum/DerivedAlgorithm.py +1 -0
- Artesian/_ClientsExecutor/Client.py +8 -4
- Artesian/_version.py +8 -18
- {artesian_sdk-4.2.2.dev16.dist-info → artesian_sdk-4.2.3b2.dev54.dist-info}/METADATA +159 -29
- {artesian_sdk-4.2.2.dev16.dist-info → artesian_sdk-4.2.3b2.dev54.dist-info}/RECORD +19 -16
- {artesian_sdk-4.2.2.dev16.dist-info → artesian_sdk-4.2.3b2.dev54.dist-info}/WHEEL +1 -1
- {artesian_sdk-4.2.2.dev16.dist-info → artesian_sdk-4.2.3b2.dev54.dist-info}/licenses/LICENSE +0 -0
- {artesian_sdk-4.2.2.dev16.dist-info → artesian_sdk-4.2.3b2.dev54.dist-info}/top_level.txt +0 -0
|
@@ -384,6 +384,8 @@ class GMEPublicOfferQuery:
|
|
|
384
384
|
UnitType.UC: "UC",
|
|
385
385
|
UnitType.UPV: "UPV",
|
|
386
386
|
UnitType.UCV: "UCV",
|
|
387
|
+
UnitType.UVZi: "UVZi",
|
|
388
|
+
UnitType.UVZp: "UVZp",
|
|
387
389
|
}
|
|
388
390
|
vr = switcher.get(unitType, "DefunitType")
|
|
389
391
|
if vr == "DefunitType":
|
|
@@ -424,6 +426,11 @@ class GMEPublicOfferQuery:
|
|
|
424
426
|
Zone.SVIZ: "SVIZ",
|
|
425
427
|
Zone.CALA: "CALA",
|
|
426
428
|
Zone.MONT: "MONT",
|
|
429
|
+
Zone.XGRE: "XGRE",
|
|
430
|
+
Zone.XSVI: "XSVI",
|
|
431
|
+
Zone.BSP: "BSP",
|
|
432
|
+
Zone.XAUS: "XAUS",
|
|
433
|
+
Zone.XFRA: "XFRA",
|
|
427
434
|
}
|
|
428
435
|
vr = switcher.get(zone, "DefZone")
|
|
429
436
|
if vr == "DefZone":
|
|
@@ -2,6 +2,8 @@ from __future__ import annotations
|
|
|
2
2
|
from typing import List, Optional, cast, Dict
|
|
3
3
|
|
|
4
4
|
from Artesian.MarketData._Dto import DeleteData
|
|
5
|
+
from Artesian.MarketData._Dto.DerivedTransformQueryValidation import DerivedTransformQueryValidation
|
|
6
|
+
from Artesian.MarketData._Dto.DerivedTransformQueryValidationResponse import DerivedTransformQueryValidationResponse
|
|
5
7
|
from ._Dto.DerivedCfg import DerivedCfg
|
|
6
8
|
from .._ClientsExecutor.RequestExecutor import _RequestExecutor
|
|
7
9
|
from .._ClientsExecutor.Client import _Client
|
|
@@ -534,6 +536,53 @@ class MarketDataService:
|
|
|
534
536
|
def deleteData(self: MarketDataService, data: DeleteData) -> None:
|
|
535
537
|
return _get_event_loop().run_until_complete(self.deleteDataAsync(data))
|
|
536
538
|
|
|
539
|
+
async def derivedTransformQueryValidationAsync(
|
|
540
|
+
self: MarketDataService,
|
|
541
|
+
request: DerivedTransformQueryValidation
|
|
542
|
+
) -> DerivedTransformQueryValidationResponse:
|
|
543
|
+
"""
|
|
544
|
+
Derived Transform Query Validation.
|
|
545
|
+
|
|
546
|
+
Args:
|
|
547
|
+
request: Request containing TimeSerieData and the Query to be applied to verify the derived transformation
|
|
548
|
+
Returns:
|
|
549
|
+
DerivedTransformQueryValidationResponse Entity (Async).
|
|
550
|
+
"""
|
|
551
|
+
url = "/utils/derivedTransform/queryValidation"
|
|
552
|
+
|
|
553
|
+
with self.__client as c:
|
|
554
|
+
res = await asyncio.gather(
|
|
555
|
+
*[
|
|
556
|
+
self.__executor.exec(
|
|
557
|
+
c.exec,
|
|
558
|
+
"POST",
|
|
559
|
+
url,
|
|
560
|
+
request,
|
|
561
|
+
retcls=DerivedTransformQueryValidationResponse
|
|
562
|
+
)
|
|
563
|
+
]
|
|
564
|
+
)
|
|
565
|
+
|
|
566
|
+
return cast(DerivedTransformQueryValidationResponse, res[0])
|
|
567
|
+
|
|
568
|
+
def derivedTransformQueryValidation(
|
|
569
|
+
self: MarketDataService,
|
|
570
|
+
request: DerivedTransformQueryValidation
|
|
571
|
+
) -> DerivedTransformQueryValidationResponse:
|
|
572
|
+
"""
|
|
573
|
+
Derived Transform Query Validation.
|
|
574
|
+
|
|
575
|
+
Args:
|
|
576
|
+
request: Request containing TimeSerieData and the Query to be applied to verify the derived transformation
|
|
577
|
+
|
|
578
|
+
Returns:
|
|
579
|
+
DerivedTransformQueryValidationResponse Entity.
|
|
580
|
+
"""
|
|
581
|
+
|
|
582
|
+
return _get_event_loop().run_until_complete(
|
|
583
|
+
self.derivedTransformQueryValidationAsync(request)
|
|
584
|
+
)
|
|
585
|
+
|
|
537
586
|
|
|
538
587
|
def _get_event_loop() -> asyncio.AbstractEventLoop:
|
|
539
588
|
"""
|
|
@@ -9,7 +9,7 @@ class DerivedCfg:
|
|
|
9
9
|
Class for the Derived Configuration.
|
|
10
10
|
|
|
11
11
|
Attributes:
|
|
12
|
-
derivedAlgorithm: the derived configuration algorithm (MUV, Coalesce, Sum)
|
|
12
|
+
derivedAlgorithm: the derived configuration algorithm (MUV, Coalesce, Sum, Transform)
|
|
13
13
|
version: the derived configuration version
|
|
14
14
|
orderedReferencedMarketDataIds: the ordered reference MarketData Ids
|
|
15
15
|
used in the computation
|
|
@@ -19,3 +19,4 @@ class DerivedCfg:
|
|
|
19
19
|
derivedAlgorithm: DerivedAlgorithm
|
|
20
20
|
version: int
|
|
21
21
|
orderedReferencedMarketDataIds: Optional[List[int]]
|
|
22
|
+
transform: Optional[str] = None
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
from typing import Optional
|
|
3
|
+
|
|
4
|
+
from .TimeSerieData import TimeSerieData
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
@dataclass
|
|
8
|
+
class DerivedTransformQueryValidation:
|
|
9
|
+
"""
|
|
10
|
+
Class Derived transform query validation.
|
|
11
|
+
|
|
12
|
+
Attributes:
|
|
13
|
+
data: The time series data used for the query validation
|
|
14
|
+
transform: The Transform query to apply on the referenced timeseries.
|
|
15
|
+
The query is executed against the helper table `$table`.
|
|
16
|
+
For ActualTimeSerie the table exposes `Time` (datetime) and `Value` (double).
|
|
17
|
+
For VersionedTimeSerie it exposes `Version` (datetime), `Time` (datetime) and `Value` (double).
|
|
18
|
+
The transform query should return `Time` and `Value` columns in the response.
|
|
19
|
+
Query examples
|
|
20
|
+
SELECT Time + INTERVAL 1 DAY AS Time, Value FROM $table
|
|
21
|
+
SELECT Time, CASE WHEN EXTRACT(HOUR FROM (Time AT TIME ZONE 'UTC') AT TIME ZONE 'Europe/Rome')
|
|
22
|
+
< 10 THEN Value + 1 ELSE Value END AS Value FROM $table WHERE Time IS NOT NULL
|
|
23
|
+
SELECT Time, Value FROM $table WHERE Version IS NOT NULL AND((EXTRACT(hour FROM Version)
|
|
24
|
+
< 10 AND Time >= date_trunc('day', Version + interval '1 day')) OR(EXTRACT(hour FROM Version)
|
|
25
|
+
>= 10 AND Time >= date_trunc('day', Version + interval '2 day')))
|
|
26
|
+
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
data: TimeSerieData
|
|
30
|
+
transform: Optional[str] = None
|
|
31
|
+
|
|
32
|
+
def __post_init__(self: "DerivedTransformQueryValidation") -> None:
|
|
33
|
+
if self.transform is None:
|
|
34
|
+
raise ValueError("transform must be provided for query validation.")
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
from typing import Optional
|
|
3
|
+
from .TimeSerieData import TimeSerieData
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
@dataclass
|
|
7
|
+
class Error:
|
|
8
|
+
"""
|
|
9
|
+
Class Represents an error in the derived transform query validation response.
|
|
10
|
+
Attributes:
|
|
11
|
+
message: The Error message when the query validation is invalid.
|
|
12
|
+
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
message: Optional[str] = None
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@dataclass
|
|
19
|
+
class DerivedTransformQueryValidationResponse:
|
|
20
|
+
"""
|
|
21
|
+
Class Represents the response of a derived transform query validation.
|
|
22
|
+
Attributes:
|
|
23
|
+
data: The time series data transformed by the query.
|
|
24
|
+
error: The Error in case of invalid query validation.
|
|
25
|
+
valid: The transformation is valid or invalid.
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
data: TimeSerieData
|
|
29
|
+
valid: bool
|
|
30
|
+
error: Optional[Error] = None
|
|
@@ -70,7 +70,8 @@ class MarketDataEntityInput:
|
|
|
70
70
|
self.derivedCfg is not None
|
|
71
71
|
and self.derivedCfg.derivedAlgorithm in {
|
|
72
72
|
DerivedAlgorithm.Coalesce,
|
|
73
|
-
DerivedAlgorithm.Sum
|
|
73
|
+
DerivedAlgorithm.Sum,
|
|
74
|
+
DerivedAlgorithm.Transform
|
|
74
75
|
}
|
|
75
76
|
and self.type is not MarketDataType.ActualTimeSerie
|
|
76
77
|
):
|
|
@@ -88,3 +89,26 @@ class MarketDataEntityInput:
|
|
|
88
89
|
f"DerivedCfg with {self.derivedCfg.derivedAlgorithm} algorithm "
|
|
89
90
|
"must be set to MarketData of type Versioned only."
|
|
90
91
|
)
|
|
92
|
+
|
|
93
|
+
if (
|
|
94
|
+
self.derivedCfg is not None
|
|
95
|
+
and self.derivedCfg.derivedAlgorithm is DerivedAlgorithm.Transform
|
|
96
|
+
and self.derivedCfg.transform is None
|
|
97
|
+
):
|
|
98
|
+
raise Exception(
|
|
99
|
+
f"DerivedCfg with {self.derivedCfg.derivedAlgorithm} algorithm "
|
|
100
|
+
"must have transform set."
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
if (
|
|
104
|
+
self.derivedCfg is not None
|
|
105
|
+
and self.derivedCfg.derivedAlgorithm is DerivedAlgorithm.Transform
|
|
106
|
+
and (
|
|
107
|
+
self.derivedCfg.orderedReferencedMarketDataIds is None
|
|
108
|
+
or len(self.derivedCfg.orderedReferencedMarketDataIds) != 1
|
|
109
|
+
)
|
|
110
|
+
):
|
|
111
|
+
raise Exception(
|
|
112
|
+
f"DerivedCfg with {self.derivedCfg.derivedAlgorithm} algorithm "
|
|
113
|
+
"must have exactly one orderedReferencedMarketDataIds."
|
|
114
|
+
)
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
from typing import Dict, Optional
|
|
3
|
+
from datetime import datetime
|
|
4
|
+
from Artesian.MarketData._Enum.MarketDataType import MarketDataType
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
@dataclass
|
|
8
|
+
class TimeSerieData:
|
|
9
|
+
"""
|
|
10
|
+
Class Timeserie data.
|
|
11
|
+
|
|
12
|
+
Attributes:
|
|
13
|
+
rows: The timeserie data in OriginalTimezone or, when Hourly, UTC.
|
|
14
|
+
type: MarketDataEntity Type
|
|
15
|
+
version: The Version to operate on
|
|
16
|
+
timezone: The timezone of the Rows. Must be the OriginalTimezone or, when Hourly, must be "UTC".
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
type: MarketDataType
|
|
20
|
+
rows: Optional[Dict[datetime, Optional[float]]] = None
|
|
21
|
+
version: Optional[datetime] = None
|
|
22
|
+
timezone: Optional[str] = None
|
|
@@ -2,6 +2,7 @@ from .MarketDataEntityInput import MarketDataEntityInput
|
|
|
2
2
|
from .MarketDataEntityOutput import MarketDataEntityOutput
|
|
3
3
|
from .CheckConversionResult import CheckConversionResult
|
|
4
4
|
from .UnitOfMeasure import UnitOfMeasure
|
|
5
|
+
from .TimeSerieData import TimeSerieData
|
|
5
6
|
from .CurveRangeEntity import CurveRangeEntity
|
|
6
7
|
from .PagedResult import PagedResultCurveRangeEntity
|
|
7
8
|
from .ArtesianSearchResults import ArtesianSearchResults
|
|
@@ -35,4 +36,5 @@ __all__ = [
|
|
|
35
36
|
DerivedCfg.__name__,
|
|
36
37
|
CheckConversionResult.__name__,
|
|
37
38
|
UnitOfMeasure.__name__,
|
|
39
|
+
TimeSerieData.__name__,
|
|
38
40
|
] # type: ignore
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
|
-
import
|
|
3
|
-
from typing import Any, Optional
|
|
2
|
+
from email.message import Message
|
|
3
|
+
from typing import Any, Optional, cast
|
|
4
4
|
import requests
|
|
5
5
|
import platform
|
|
6
6
|
|
|
@@ -57,7 +57,7 @@ class _Client:
|
|
|
57
57
|
retcls: Optional[type] = None,
|
|
58
58
|
params: Optional[dict] = None,
|
|
59
59
|
) -> Any | None:
|
|
60
|
-
json = artesianJsonSerialize(obj)
|
|
60
|
+
json = cast(Any, artesianJsonSerialize(obj))
|
|
61
61
|
url = self.__baseUrl + url
|
|
62
62
|
r = requests.Request(method, url, json=json, params=params)
|
|
63
63
|
prep = self.__session.prepare_request(r)
|
|
@@ -68,7 +68,11 @@ class _Client:
|
|
|
68
68
|
"Unexpected error while calling {}|{}".format(method, url)
|
|
69
69
|
) from e
|
|
70
70
|
|
|
71
|
-
|
|
71
|
+
# Replaced the deprecated 'cgi' module (removed in Python 3.13) with 'email.message'.
|
|
72
|
+
msg = Message()
|
|
73
|
+
msg['content-type'] = res.headers.get("Content-Type", "")
|
|
74
|
+
mimetype = msg.get_content_type() # es. "text/html"
|
|
75
|
+
_ = msg.get_params()
|
|
72
76
|
|
|
73
77
|
if res.status_code >= 200 and res.status_code < 300:
|
|
74
78
|
if mimetype == "application/json":
|
Artesian/_version.py
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
# file generated by
|
|
1
|
+
# file generated by vcs-versioning
|
|
2
2
|
# don't change, don't track in version control
|
|
3
|
+
from __future__ import annotations
|
|
3
4
|
|
|
4
5
|
__all__ = [
|
|
5
6
|
"__version__",
|
|
@@ -10,25 +11,14 @@ __all__ = [
|
|
|
10
11
|
"commit_id",
|
|
11
12
|
]
|
|
12
13
|
|
|
13
|
-
TYPE_CHECKING = False
|
|
14
|
-
if TYPE_CHECKING:
|
|
15
|
-
from typing import Tuple
|
|
16
|
-
from typing import Union
|
|
17
|
-
|
|
18
|
-
VERSION_TUPLE = Tuple[Union[int, str], ...]
|
|
19
|
-
COMMIT_ID = Union[str, None]
|
|
20
|
-
else:
|
|
21
|
-
VERSION_TUPLE = object
|
|
22
|
-
COMMIT_ID = object
|
|
23
|
-
|
|
24
14
|
version: str
|
|
25
15
|
__version__: str
|
|
26
|
-
__version_tuple__:
|
|
27
|
-
version_tuple:
|
|
28
|
-
commit_id:
|
|
29
|
-
__commit_id__:
|
|
16
|
+
__version_tuple__: tuple[int | str, ...]
|
|
17
|
+
version_tuple: tuple[int | str, ...]
|
|
18
|
+
commit_id: str | None
|
|
19
|
+
__commit_id__: str | None
|
|
30
20
|
|
|
31
|
-
__version__ = version = '4.2.
|
|
32
|
-
__version_tuple__ = version_tuple = (4, 2,
|
|
21
|
+
__version__ = version = '4.2.3b2.dev54'
|
|
22
|
+
__version_tuple__ = version_tuple = (4, 2, 3, 'b2', 'dev54')
|
|
33
23
|
|
|
34
24
|
__commit_id__ = commit_id = None
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: artesian-sdk
|
|
3
|
-
Version: 4.2.
|
|
3
|
+
Version: 4.2.3b2.dev54
|
|
4
4
|
Summary: Library provides read access to the Artesian API
|
|
5
5
|
Author-email: ARK Lab <arklab@ark-energy.eu>
|
|
6
6
|
Maintainer-email: ARK Lab <arklab@ark-energy.eu>
|
|
@@ -466,23 +466,53 @@ res = mds.searchFacet(page, pageSize, searchText, filters, sorts, doNotLoadAddit
|
|
|
466
466
|
|
|
467
467
|
Artesian support Query over GME Public Offers which comes in a custom and dedicated format.
|
|
468
468
|
|
|
469
|
+
Note (performance):
|
|
470
|
+
GME Public Offer data is partitioned by date, offerType, status, and market. Requesting very narrow subsets (for example a single status or offerType in several separate requests) does not improve performance and can cause the same data to be fetched multiple times.
|
|
471
|
+
For this reason, the examples below:
|
|
472
|
+
• Use a large page size so that all data for a given (date, market, filters) is typically returned in a single page.
|
|
473
|
+
• Loop over markets explicitly to cover all required markets without redundant fetches.
|
|
474
|
+
|
|
469
475
|
### Extract GME Public Offer
|
|
470
476
|
|
|
471
477
|
```Python
|
|
472
478
|
from Artesian.GMEPublicOffers import GMEPublicOfferService, Market, Purpose, Status, Zone, Scope, UnitType, GenerationType, BAType
|
|
473
479
|
|
|
474
|
-
|
|
480
|
+
/* your Artesian configuration */;
|
|
481
|
+
|
|
482
|
+
var _cfg = new ArtesianServiceConfig(
|
|
483
|
+
new Uri("https://arkive.artesian.cloud/{TENANT_NAME}/"),
|
|
484
|
+
your_API_Key);
|
|
485
|
+
|
|
486
|
+
qs = GMEPublicOfferService(_cfg)
|
|
487
|
+
|
|
488
|
+
# Large page size: goal is to get all data for the given filters in one page
|
|
489
|
+
PAGE_SIZE = 250000
|
|
490
|
+
|
|
491
|
+
# List of markets to cover. Extend as needed for your use case.
|
|
492
|
+
markets = [
|
|
493
|
+
Market.MGP,
|
|
494
|
+
# Market.MSD,
|
|
495
|
+
# Market.MIT,
|
|
496
|
+
]
|
|
475
497
|
|
|
476
|
-
|
|
498
|
+
all_data = []
|
|
499
|
+
|
|
500
|
+
for market in markets:
|
|
501
|
+
|
|
502
|
+
data = (
|
|
503
|
+
qs.createQuery() \
|
|
477
504
|
.forDate("2020-04-01") \
|
|
478
505
|
.forMarket([Market.MGP]) \
|
|
479
506
|
.forStatus(Status.ACC) \
|
|
480
507
|
.forPurpose(Purpose.BID) \
|
|
481
508
|
.forZone([Zone.NORD]) \
|
|
482
|
-
.withPagination(1,
|
|
509
|
+
.withPagination(1,PAGE_SIZE) \
|
|
483
510
|
.execute()
|
|
511
|
+
)
|
|
512
|
+
print(f"Fetched {len(data)} offers for market {market}")
|
|
513
|
+
all_data.extend(data)
|
|
484
514
|
|
|
485
|
-
print(
|
|
515
|
+
print(f"Total offers fetched: {len(all_data)}")
|
|
486
516
|
```
|
|
487
517
|
|
|
488
518
|
To construct a GME Public Offer Extraction the following must be provided.
|
|
@@ -733,6 +763,76 @@ Extraction options for GME Public Offer queries.
|
|
|
733
763
|
.withAggregationRule(AggregationRule.SumAndDivide)
|
|
734
764
|
```
|
|
735
765
|
|
|
766
|
+
### DerivedTransform: Query Validation
|
|
767
|
+
|
|
768
|
+
Use the `DerivedTransformQueryValidation` to validate and execute a derived transform query against a sample TimeSerieData.
|
|
769
|
+
|
|
770
|
+
```Python
|
|
771
|
+
from Artesian.MarketData import MarketDataService
|
|
772
|
+
from Artesian.MarketData._Dto.DerivedTransformQueryValidation import DerivedTransformQueryValidation
|
|
773
|
+
from Artesian.MarketData._Dto.TimeSerieData import TimeSerieData
|
|
774
|
+
from Artesian import MarketDataType
|
|
775
|
+
from datetime import datetime
|
|
776
|
+
|
|
777
|
+
mds = MarketDataService(cfg)
|
|
778
|
+
|
|
779
|
+
request = DerivedTransformQueryValidation(
|
|
780
|
+
data=TimeSerieData(
|
|
781
|
+
rows=[
|
|
782
|
+
(datetime(2018, 10, 1, 0, 0), 100),
|
|
783
|
+
(datetime(2018, 10, 1, 1, 0), 100)
|
|
784
|
+
],
|
|
785
|
+
type=MarketDataType.ActualTimeSerie,
|
|
786
|
+
),
|
|
787
|
+
transform="SELECT Time, (Value + 1) as Value FROM $table"
|
|
788
|
+
)
|
|
789
|
+
|
|
790
|
+
derivedTransformResponse = mds.derivedTransformQueryValidation(request)
|
|
791
|
+
```
|
|
792
|
+
|
|
793
|
+
#### Available Columns
|
|
794
|
+
|
|
795
|
+
| Column | Type |
|
|
796
|
+
| ------ | -------- |
|
|
797
|
+
| Time | datetime |
|
|
798
|
+
| Value | double |
|
|
799
|
+
|
|
800
|
+
> `$table` is a virtual table exposed by the query engine.
|
|
801
|
+
|
|
802
|
+
**Returned Object: DerivedTransformQueryValidationResponse**
|
|
803
|
+
|
|
804
|
+
| Property | Description |
|
|
805
|
+
| -------- | ---------------------------------------------- |
|
|
806
|
+
| Data | Transformed time series generated by the query |
|
|
807
|
+
| Valid | Indicates whether the query is valid |
|
|
808
|
+
| Error | Validation error details when `Valid = false` |
|
|
809
|
+
|
|
810
|
+
#### Query examples
|
|
811
|
+
|
|
812
|
+
```sql
|
|
813
|
+
SELECT Time + INTERVAL 1 DAY AS Time, Value FROM $table
|
|
814
|
+
|
|
815
|
+
SELECT Time, CASE WHEN EXTRACT(HOUR FROM (Time AT TIME ZONE 'UTC') AT TIME ZONE 'Europe/Rome') < 10 THEN Value + 1 ELSE Value END AS Value FROM $table WHERE Time IS NOT NULL
|
|
816
|
+
|
|
817
|
+
SELECT Time, Value FROM $table WHERE Version IS NOT NULL AND ((EXTRACT(hour FROM Version) < 10 AND Time >= date_trunc('day', Version + interval '1 day')) OR (EXTRACT(hour FROM Version) >= 10 AND Time >= date_trunc('day', Version + interval '2 day')))
|
|
818
|
+
```
|
|
819
|
+
|
|
820
|
+
#### SQL Dialect & Execution Model
|
|
821
|
+
|
|
822
|
+
The query engine uses a DuckDB-compatible SQL dialect (PostgreSQL-like).
|
|
823
|
+
|
|
824
|
+
Queries are executed against a virtual table named `$table`, which represents the provided sample TimeSerieData.
|
|
825
|
+
|
|
826
|
+
The engine supports common SQL features including:
|
|
827
|
+
|
|
828
|
+
- SELECT expressions
|
|
829
|
+
- WHERE filtering
|
|
830
|
+
- CASE WHEN expressions
|
|
831
|
+
- Date/time arithmetic and functions
|
|
832
|
+
- Timezone conversion functions
|
|
833
|
+
|
|
834
|
+
Full DuckDB SQL reference: https://duckdb.org/docs/sql/introduction.html
|
|
835
|
+
|
|
736
836
|
## Write Data in Artesian
|
|
737
837
|
|
|
738
838
|
Using the MarketDataService is possible to register MarketData and write curves into it using the UpsertData method.
|
|
@@ -786,9 +886,11 @@ mkservice.upsertData(data)
|
|
|
786
886
|
```
|
|
787
887
|
|
|
788
888
|
Upsert has optional switches that can be applied
|
|
889
|
+
|
|
789
890
|
```
|
|
790
891
|
mkservice.upsertData(data, deferCommandExecution, deferDataGeneration, keepNulls, upsertMode)
|
|
791
892
|
```
|
|
893
|
+
|
|
792
894
|
The switch details are,
|
|
793
895
|
|
|
794
896
|
deferCommandExecution (true/false) choose between syncronoys and asyncronous command execution, default is false.
|
|
@@ -796,12 +898,11 @@ deferDataGeneration (true/false) choose between syncronoys and asyncronous preco
|
|
|
796
898
|
keepNulls (true/false) if true then nulls are written in the curve replacing any data present for the instant, default is false.
|
|
797
899
|
upsertMode (Merge/Replace) for ActualTimeSeries the two modes are equivalent. Leaving Null/None/Empty is equivalent to Merge.
|
|
798
900
|
|
|
799
|
-
|
|
800
|
-
DerivedCfg can be of algorithm type: Coalesce, Sum, Muv.
|
|
901
|
+
DerivedCfg can be of algorithm type: Coalesce, Sum, Muv, Transform.
|
|
801
902
|
|
|
802
903
|
Updating the DerivedCfg can be performed with `updateDerivedConfiguration` on MarketDataService. A validation will be done on the existing DerivedCfg of the MarketData, that should be not null and with same type as the one used for the update.
|
|
803
904
|
|
|
804
|
-
```
|
|
905
|
+
```Python
|
|
805
906
|
derivedCfgUpdate = DerivedCfg(
|
|
806
907
|
version=1,
|
|
807
908
|
derivedAlgorithm=DerivedAlgorithm.Coalesce,
|
|
@@ -814,6 +915,31 @@ marketDataUpdated = mkdservice.updateDerivedConfiguration(
|
|
|
814
915
|
False)
|
|
815
916
|
```
|
|
816
917
|
|
|
918
|
+
For DerivedCfg Transform, `orderedReferencedMarketDataIds` contains a single source series (the series where the transform is applied), and `transform` contains the query to apply.
|
|
919
|
+
|
|
920
|
+
```Python
|
|
921
|
+
derivedCfgUpdate = DerivedCfg(
|
|
922
|
+
version=1,
|
|
923
|
+
derivedAlgorithm=DerivedAlgorithm.Transform,
|
|
924
|
+
orderedReferencedMarketDataIds=[10001],
|
|
925
|
+
transform="SELECT Time, (Value + 1) as Value FROM $table"
|
|
926
|
+
)
|
|
927
|
+
|
|
928
|
+
marketDataUpdated = mkdservice.updateDerivedConfiguration(
|
|
929
|
+
registeredDerived.marketDataId,
|
|
930
|
+
derivedCfgUpdate,
|
|
931
|
+
False)
|
|
932
|
+
```
|
|
933
|
+
|
|
934
|
+
#### Available Columns
|
|
935
|
+
|
|
936
|
+
| Column | Type |
|
|
937
|
+
| ------ | -------- |
|
|
938
|
+
| Time | datetime |
|
|
939
|
+
| Value | double |
|
|
940
|
+
|
|
941
|
+
> `$table` is a virtual table exposed by the query engine.
|
|
942
|
+
|
|
817
943
|
In case we want to write an hourly (or lower) time series the timezone for the upsert data must be UTC:
|
|
818
944
|
|
|
819
945
|
```Python
|
|
@@ -896,9 +1022,11 @@ mkservice.upsertData(data)
|
|
|
896
1022
|
```
|
|
897
1023
|
|
|
898
1024
|
Upsert has optional switches that can be applied
|
|
1025
|
+
|
|
899
1026
|
```
|
|
900
1027
|
mkservice.upsertData(data, deferCommandExecution, deferDataGeneration, keepNulls, upsertMode)
|
|
901
1028
|
```
|
|
1029
|
+
|
|
902
1030
|
The switch details are,
|
|
903
1031
|
|
|
904
1032
|
deferCommandExecution (true/false) choose between syncronoys and asyncronous command execution, default is false.
|
|
@@ -906,25 +1034,24 @@ deferDataGeneration (true/false) choose between syncronoys and asyncronous preco
|
|
|
906
1034
|
keepNulls (true/false) if true then nulls are written in the curve replacing any data present for the instant, default is false.
|
|
907
1035
|
upsertMode (Merge/Replace) for VersionedTimeSeries the merge writes in to the curve replacing existing data for an existing instant, replace writes the payload removing any previous data for the version. Leaving Null/None/Empty is equivalent to Merge.
|
|
908
1036
|
|
|
909
|
-
| DATETIME
|
|
910
|
-
|
|
1037
|
+
| DATETIME | EXISTING | PAYLOAD | MERGE | REPLACE |
|
|
1038
|
+
| ------------ | ---------- | ---------- | ---------- | ---------- |
|
|
911
1039
|
| VERSION NAME | 2025-01-01 | 2025-01-01 | 2025-01-01 | 2025-01-01 |
|
|
912
|
-
| 2025-01-01
|
|
913
|
-
| 2025-01-02
|
|
914
|
-
| 2025-01-03
|
|
915
|
-
| 2025-01-04
|
|
916
|
-
| 2025-01-05
|
|
917
|
-
| 2025-01-06
|
|
918
|
-
| 2025-01-07
|
|
919
|
-
| 2025-01-08
|
|
920
|
-
| 2025-01-09
|
|
921
|
-
| 2025-01-10
|
|
922
|
-
| 2025-01-11
|
|
923
|
-
| 2025-01-12
|
|
924
|
-
| 2025-01-13
|
|
925
|
-
| 2025-01-14
|
|
926
|
-
| 2025-01-15
|
|
927
|
-
|
|
1040
|
+
| 2025-01-01 | | | | |
|
|
1041
|
+
| 2025-01-02 | 999.99 | 222.22 | 222.22 | 222.22 |
|
|
1042
|
+
| 2025-01-03 | 999.99 | 222.22 | 222.22 | 222.22 |
|
|
1043
|
+
| 2025-01-04 | 999.99 | 222.22 | 222.22 | 222.22 |
|
|
1044
|
+
| 2025-01-05 | 999.99 | 222.22 | 222.22 | 222.22 |
|
|
1045
|
+
| 2025-01-06 | 999.99 | 222.22 | 222.22 | 222.22 |
|
|
1046
|
+
| 2025-01-07 | 999.99 | 222.22 | 222.22 | 222.22 |
|
|
1047
|
+
| 2025-01-08 | | 222.22 | 222.22 | 222.22 |
|
|
1048
|
+
| 2025-01-09 | | | | |
|
|
1049
|
+
| 2025-01-10 | | | | |
|
|
1050
|
+
| 2025-01-11 | 999.99 | | 999.99 | |
|
|
1051
|
+
| 2025-01-12 | 999.99 | | 999.99 | |
|
|
1052
|
+
| 2025-01-13 | 999.99 | | 999.99 | |
|
|
1053
|
+
| 2025-01-14 | | | | |
|
|
1054
|
+
| 2025-01-15 | | | | |
|
|
928
1055
|
|
|
929
1056
|
### Write Data in a Market Assessment Time Series
|
|
930
1057
|
|
|
@@ -974,9 +1101,11 @@ mkservice.upsertData(marketAssessment)
|
|
|
974
1101
|
```
|
|
975
1102
|
|
|
976
1103
|
Upsert has optional switches that can be applied
|
|
1104
|
+
|
|
977
1105
|
```
|
|
978
1106
|
mkservice.upsertData(data, deferCommandExecution, deferDataGeneration, keepNulls, upsertMode)
|
|
979
1107
|
```
|
|
1108
|
+
|
|
980
1109
|
The switch details are,
|
|
981
1110
|
|
|
982
1111
|
deferCommandExecution (true/false) choose between syncronoys and asyncronous command execution, default is false.
|
|
@@ -984,7 +1113,6 @@ deferDataGeneration (true/false) choose between syncronoys and asyncronous preco
|
|
|
984
1113
|
keepNulls (true/false) if true then nulls are written in the curve replacing any data present for the instant, default is false.
|
|
985
1114
|
upsertMode (Merge/Replace) for MarketAssessment merge adds the new products to the existing and overwrites existing with the new ones while replace replaces all the existing products with the new ones. Leaving Null/None/Empty is equivalent to Merge.
|
|
986
1115
|
|
|
987
|
-
|
|
988
1116
|
### Write Data in a Bid Ask Time Series
|
|
989
1117
|
|
|
990
1118
|
```Python
|
|
@@ -1032,9 +1160,11 @@ mkservice.upsertData(bidAsk)
|
|
|
1032
1160
|
```
|
|
1033
1161
|
|
|
1034
1162
|
Upsert has optional switches that can be applied
|
|
1163
|
+
|
|
1035
1164
|
```
|
|
1036
1165
|
mkservice.upsertData(data, deferCommandExecution, deferDataGeneration, keepNulls, upsertMode)
|
|
1037
1166
|
```
|
|
1167
|
+
|
|
1038
1168
|
The switch details are,
|
|
1039
1169
|
|
|
1040
1170
|
deferCommandExecution (true/false) choose between syncronoys and asyncronous command execution, default is false.
|
|
@@ -1042,7 +1172,6 @@ deferDataGeneration (true/false) choose between syncronoys and asyncronous preco
|
|
|
1042
1172
|
keepNulls (true/false) if true then nulls are written in the curve replacing any data present for the instant, default is false.
|
|
1043
1173
|
upsertMode (Merge/Replace) for BidAsk merge adds the new products to the existing and overwrites existing with the new ones while replace replaces all the existing products with the new ones. Leaving Null/None/Empty is equivalent to Merge.
|
|
1044
1174
|
|
|
1045
|
-
|
|
1046
1175
|
### Write Data in an Auction Time Series
|
|
1047
1176
|
|
|
1048
1177
|
```Python
|
|
@@ -1090,9 +1219,11 @@ auctionRows = MarketData.UpsertData(MarketData.MarketDataIdentifier('PROVIDER',
|
|
|
1090
1219
|
```
|
|
1091
1220
|
|
|
1092
1221
|
Upsert has optional switches that can be applied
|
|
1222
|
+
|
|
1093
1223
|
```
|
|
1094
1224
|
mkservice.upsertData(data, deferCommandExecution, deferDataGeneration, keepNulls, upsertMode)
|
|
1095
1225
|
```
|
|
1226
|
+
|
|
1096
1227
|
The switch details are,
|
|
1097
1228
|
|
|
1098
1229
|
deferCommandExecution (true/false) choose between syncronoys and asyncronous command execution, default is false.
|
|
@@ -1100,7 +1231,6 @@ deferDataGeneration (true/false) choose between syncronoys and asyncronous preco
|
|
|
1100
1231
|
keepNulls (true/false) if true then nulls are written in the curve replacing any data present for the instant, default is false.
|
|
1101
1232
|
upsertMode (Merge/Replace) for Auction merge and replace are equivalent. Leaving Null/None/Empty is equivalent to Merge.
|
|
1102
1233
|
|
|
1103
|
-
|
|
1104
1234
|
## Delete Data in Artesian
|
|
1105
1235
|
|
|
1106
1236
|
Using the MarketDataService is possible to delete MarketData and its curves.
|
|
@@ -4,40 +4,43 @@ Artesian/ArtesianPolicyConfig.py,sha256=ULLngwH1762K8Kre08_JZ7aNYs4LZOxocTYLPJjX
|
|
|
4
4
|
Artesian/Exceptions.py,sha256=asPwxz8TaIpjZV4GJmWchGen_04Ib3Rdd7_Btud4X9E,6141
|
|
5
5
|
Artesian/Granularity.py,sha256=EOeBP9Wz-tAhdm3rVVJBXx9jAkiMH9OIMJUsrNawsNU,206
|
|
6
6
|
Artesian/__init__.py,sha256=c-Fu4VGOuvQCGRefF5C4CY9OxoGTDce7CgjipZN8lIo,1119
|
|
7
|
-
Artesian/_version.py,sha256=
|
|
7
|
+
Artesian/_version.py,sha256=YpmR3k6JV45o4OXs_A-oiFaVSKBeMpvKDmyG6VPeS0M,543
|
|
8
8
|
Artesian/GMEPublicOffers/ExtractionRangeConfig.py,sha256=pXVFdLpLqFvgzu2Y5UTckDWysFiJDKc0ZaXjuv46iJU,415
|
|
9
|
-
Artesian/GMEPublicOffers/GMEPublicOfferQuery.py,sha256=
|
|
9
|
+
Artesian/GMEPublicOffers/GMEPublicOfferQuery.py,sha256=zC2xChY1dug34japlfa9S-ehqCbIMXvPAboEiADNLGg,15590
|
|
10
10
|
Artesian/GMEPublicOffers/GMEPublicOfferQueryParameters.py,sha256=gs5SVNEYJTpwV9whZFw07jm5cIsion6TvgRDAeHj1Kw,3330
|
|
11
11
|
Artesian/GMEPublicOffers/GMEPublicOfferService.py,sha256=SSGng222MTLN7f7jXIk4uWPn5IMO77aiuAnsgJK4qZ0,1315
|
|
12
12
|
Artesian/GMEPublicOffers/__init__.py,sha256=eCFTipFo_M7XjnJDs46GUs7Q63a7tCPwwEvTL0__esE,667
|
|
13
13
|
Artesian/GMEPublicOffers/_Enum/BaType.py,sha256=HapOc1zeOzvzuBhxepl5aCu4DCEAi-oNonw2sgHEl70,95
|
|
14
14
|
Artesian/GMEPublicOffers/_Enum/GenerationType.py,sha256=nXZpBIrrIfj_JGuEGEkWQMLHIoObb69-oIhk8wiemqU,245
|
|
15
|
-
Artesian/GMEPublicOffers/_Enum/Market.py,sha256=
|
|
15
|
+
Artesian/GMEPublicOffers/_Enum/Market.py,sha256=ESEpY0rOw1VjhY06xLTpgRQKIzwW2sYyIeLJfWHECT0,342
|
|
16
16
|
Artesian/GMEPublicOffers/_Enum/Purpose.py,sha256=vE5TMsXFlvKS_gP13tU-UULEp6xo75VdIrmoh0Tuqw8,69
|
|
17
17
|
Artesian/GMEPublicOffers/_Enum/Scope.py,sha256=TnULjRZq-ptv8o8iHJDfcJXxEylUyPiKnRczsLBSSEE,149
|
|
18
|
-
Artesian/GMEPublicOffers/_Enum/Status.py,sha256=
|
|
19
|
-
Artesian/GMEPublicOffers/_Enum/UnitType.py,sha256=
|
|
18
|
+
Artesian/GMEPublicOffers/_Enum/Status.py,sha256=jvvFbXhY8Njey9Kl1Mo6KhxQlXUDtNBXwnl_FYdO9OU,154
|
|
19
|
+
Artesian/GMEPublicOffers/_Enum/UnitType.py,sha256=p4ERSxHpDYIAhyPM3xoTBa9pYWMOs02x24Jb5vkEJT8,135
|
|
20
20
|
Artesian/GMEPublicOffers/_Enum/Zone.py,sha256=dl_3io_JZ1F9R7t1iEjexLKeNY1HWvV-CMVgh8XlVnw,380
|
|
21
21
|
Artesian/GMEPublicOffers/_Enum/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
22
22
|
Artesian/MarketData/CommonUnitOfMeasure.py,sha256=mybttan-Zpcf8NNYj48_xWpJSgadSXh-6mn4ZPvHvKo,257
|
|
23
|
-
Artesian/MarketData/MarketDataService.py,sha256=
|
|
23
|
+
Artesian/MarketData/MarketDataService.py,sha256=hfzR8F-sVkcYnuM8Ih6iDMOY0pa209BTsHd0VXFRQAQ,20128
|
|
24
24
|
Artesian/MarketData/__init__.py,sha256=fchVl7COy5IV9Kbsfuh94DT2v_IknVmfp0XM_Y-VhGM,1589
|
|
25
25
|
Artesian/MarketData/_Dto/ArtesianMetadataFacet.py,sha256=Ib9YYpGp1_6LdHy2WjL5pUlUVNNGQiyXfCUeh6t5ky4,800
|
|
26
26
|
Artesian/MarketData/_Dto/ArtesianSearchResults.py,sha256=nazdj1G4jpOUhn1irML3Duafp4I0kNhyfnZZzL4496k,581
|
|
27
27
|
Artesian/MarketData/_Dto/CheckConversionResult.py,sha256=vXyKtb-ZpcIL7QMKhSNiz9iV_FkGMoxQ2_aDOOV3Apk,570
|
|
28
28
|
Artesian/MarketData/_Dto/CurveRangeEntity.py,sha256=_zjXxuueNoIG4Xg1K-5TeJQBF0ejcDpFkvW5R9siby8,891
|
|
29
29
|
Artesian/MarketData/_Dto/DeleteData.py,sha256=0hLz28pdnNdUG82DGtPgW6NcsCNBOxIhGBD_dc8HLTA,1307
|
|
30
|
-
Artesian/MarketData/_Dto/DerivedCfg.py,sha256=
|
|
31
|
-
Artesian/MarketData/_Dto/
|
|
30
|
+
Artesian/MarketData/_Dto/DerivedCfg.py,sha256=vMTkoh4FVgh02EwglewlVC2e1nSvloiOjnFKQVZXMbs,614
|
|
31
|
+
Artesian/MarketData/_Dto/DerivedTransformQueryValidation.py,sha256=0v0QT5hEKlPudBavxwZEHhqPfZAnn2f_tgAYSaNrDmw,1641
|
|
32
|
+
Artesian/MarketData/_Dto/DerivedTransformQueryValidationResponse.py,sha256=TXVMEz6ARt-zWb6LqRyV9rgZ6NkTcKXJJZIM7LQcrLM,772
|
|
33
|
+
Artesian/MarketData/_Dto/MarketDataEntityInput.py,sha256=6QYnq07HmQFljnQqsM0e4lL3Q1xhz1ycp3HG3d7n8aA,4482
|
|
32
34
|
Artesian/MarketData/_Dto/MarketDataEntityOutput.py,sha256=TKV4n0aBZzInFVY_yI8UASIyYnnHGqs7N18nUrfCfGM,2254
|
|
33
35
|
Artesian/MarketData/_Dto/MarketDataIdentifier.py,sha256=egNOuOI3qugbFl8_w3IUSV9mOdBj-akq7M4Gj0X4Ig8,289
|
|
34
36
|
Artesian/MarketData/_Dto/PagedResult.py,sha256=-o0zKOLTbLg2wdz8K4K4qQJTkarEl-4SYppS6cf6j2o,736
|
|
37
|
+
Artesian/MarketData/_Dto/TimeSerieData.py,sha256=24jYzjxlrmxLCWwPcILjgd28aA0lRddi8vpRkj_U4gI,677
|
|
35
38
|
Artesian/MarketData/_Dto/UnitOfMeasure.py,sha256=B6Axt5wxMhLsjdXIiK0K912REmbCaZcaxWMImxEjXXY,304
|
|
36
39
|
Artesian/MarketData/_Dto/UpsertData.py,sha256=abIA7kQTW-9u3D-sjgv7mMEiY6UCARnj8Z1dMNYc8hM,3998
|
|
37
|
-
Artesian/MarketData/_Dto/__init__.py,sha256=
|
|
40
|
+
Artesian/MarketData/_Dto/__init__.py,sha256=HMZiX_S4DUGNqsyc0nmv3ieIWlk6S499T_YG3hvVUlc,1358
|
|
38
41
|
Artesian/MarketData/_Enum/AggregationRule.py,sha256=fkYmouBQwC68rFMyG_j-D_0IQA5JVrJRfSA7KxsCF-4,120
|
|
39
42
|
Artesian/MarketData/_Enum/ArtesianMetadataFacetType.py,sha256=1wE9VOzZ4gHk5oBjwpJd_kCgrUIfyNQmxuOZevj4f28,92
|
|
40
|
-
Artesian/MarketData/_Enum/DerivedAlgorithm.py,sha256=
|
|
43
|
+
Artesian/MarketData/_Enum/DerivedAlgorithm.py,sha256=aW6zzbT8-BJEM6AKPprIjWJa2NIgiqvxuRBzESoLTDE,113
|
|
41
44
|
Artesian/MarketData/_Enum/MarketDataType.py,sha256=lIXV21b1wNWEah0q76OD4bMV1n_dtsUHQNSr8SbTBcE,159
|
|
42
45
|
Artesian/MarketData/_Enum/UpsertMode.py,sha256=UuAMKcvehXN8pagJ-UtadbVIer7mjJaYOoEop-QjvrU,78
|
|
43
46
|
Artesian/MarketData/_Enum/__init__.py,sha256=7YM19VPx7kz7prHe3fHj23aF3efievZziaND50AxKUA,485
|
|
@@ -65,11 +68,11 @@ Artesian/Query/_QueryParameters/VersionedQueryParameters.py,sha256=rAiZieHfm3awb
|
|
|
65
68
|
Artesian/Query/_QueryParameters/VersionsRangeSelectionConfig.py,sha256=OP6dTHiBbCLcL9eCtgoWh50UEP0muNwM3bw-AqbvbW4,1508
|
|
66
69
|
Artesian/Query/_QueryParameters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
67
70
|
Artesian/_ClientsExecutor/ArtesianJsonSerializer.py,sha256=CDnq1sgKLvxSampykFtF9iZHZjgV6BPZvED6MU3K74Y,3563
|
|
68
|
-
Artesian/_ClientsExecutor/Client.py,sha256=
|
|
71
|
+
Artesian/_ClientsExecutor/Client.py,sha256=il2vebcCVwlVgdMxSSAzu24iw49cX2WjtpE4Uxz3Wdo,4071
|
|
69
72
|
Artesian/_ClientsExecutor/RequestExecutor.py,sha256=KKq31g8GFS-Mdp3S1QXFm5tZhacjnIeWs1YFc3f8NkY,10613
|
|
70
73
|
Artesian/_ClientsExecutor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
71
|
-
artesian_sdk-4.2.
|
|
72
|
-
artesian_sdk-4.2.
|
|
73
|
-
artesian_sdk-4.2.
|
|
74
|
-
artesian_sdk-4.2.
|
|
75
|
-
artesian_sdk-4.2.
|
|
74
|
+
artesian_sdk-4.2.3b2.dev54.dist-info/licenses/LICENSE,sha256=Y27w-dSf1pHlXO4yNy70OCCO4VuYYVxUdDOQ-sLdXds,1074
|
|
75
|
+
artesian_sdk-4.2.3b2.dev54.dist-info/METADATA,sha256=Fffc1SaPB7HMJ0Byh8njDPg1OHq_qNc5gZUf0oI6aK8,42987
|
|
76
|
+
artesian_sdk-4.2.3b2.dev54.dist-info/WHEEL,sha256=K260EYznzXsJYBQGqmI8VTxEdiZYNvDZwW9cBh9-_MA,91
|
|
77
|
+
artesian_sdk-4.2.3b2.dev54.dist-info/top_level.txt,sha256=1Fv89OOnRKHLMmQEBRXPaNuPMoZytK4dnfrOFDdGGYI,9
|
|
78
|
+
artesian_sdk-4.2.3b2.dev54.dist-info/RECORD,,
|
{artesian_sdk-4.2.2.dev16.dist-info → artesian_sdk-4.2.3b2.dev54.dist-info}/licenses/LICENSE
RENAMED
|
File without changes
|
|
File without changes
|