shapeshifter-uftp 2.2.1__tar.gz → 2.3.0__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.
Files changed (71) hide show
  1. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/PKG-INFO +1 -1
  2. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/pyproject.toml +11 -1
  3. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/shapeshifter_uftp/__init__.py +145 -144
  4. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/shapeshifter_uftp/client/agr_cro_client.py +2 -3
  5. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/shapeshifter_uftp/client/agr_dso_client.py +14 -15
  6. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/shapeshifter_uftp/client/base_client.py +20 -24
  7. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/shapeshifter_uftp/client/cro_agr_client.py +4 -4
  8. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/shapeshifter_uftp/client/cro_dso_client.py +4 -4
  9. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/shapeshifter_uftp/client/dso_agr_client.py +16 -17
  10. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/shapeshifter_uftp/client/dso_cro_client.py +4 -4
  11. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/shapeshifter_uftp/service/agr_service.py +6 -3
  12. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/shapeshifter_uftp/service/base_service.py +28 -5
  13. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/shapeshifter_uftp/service/cro_service.py +6 -3
  14. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/shapeshifter_uftp/service/dso_service.py +6 -3
  15. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/shapeshifter_uftp/uftp/__init__.py +115 -115
  16. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/shapeshifter_uftp/uftp/messages/agr_portfolio_query.py +1 -3
  17. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/shapeshifter_uftp/uftp/messages/agr_portfolio_update.py +1 -3
  18. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/shapeshifter_uftp/uftp/messages/d_prognosis.py +2 -6
  19. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/shapeshifter_uftp/uftp/messages/dso_portfolio_query.py +1 -3
  20. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/shapeshifter_uftp/uftp/messages/dso_portfolio_update.py +1 -2
  21. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/shapeshifter_uftp/uftp/messages/flex_message.py +1 -2
  22. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/shapeshifter_uftp/uftp/messages/flex_offer.py +1 -5
  23. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/shapeshifter_uftp/uftp/messages/flex_offer_revocation.py +0 -7
  24. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/shapeshifter_uftp/uftp/messages/flex_order.py +1 -5
  25. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/shapeshifter_uftp/uftp/messages/flex_request.py +1 -4
  26. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/shapeshifter_uftp/uftp/messages/flex_reservation_update.py +2 -6
  27. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/shapeshifter_uftp/uftp/messages/flex_settlement.py +3 -5
  28. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/shapeshifter_uftp/uftp/messages/metering.py +0 -3
  29. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/shapeshifter_uftp/uftp/messages/payload_message.py +1 -3
  30. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/shapeshifter_uftp/uftp/messages/signed_message.py +0 -3
  31. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/shapeshifter_uftp/uftp/messages/test_message.py +1 -8
  32. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/shapeshifter_uftp.egg-info/PKG-INFO +1 -1
  33. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/shapeshifter_uftp.egg-info/SOURCES.txt +0 -4
  34. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/test/test_cli.py +1 -2
  35. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/test/test_client_errors.py +0 -5
  36. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/test/test_communications.py +72 -53
  37. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/test/test_default_responses.py +1 -1
  38. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/test/test_message_destination.py +6 -5
  39. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/test/test_oauth.py +0 -1
  40. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/test/test_presence_of_client_methods.py +4 -2
  41. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/test/test_roundtrip_serialization.py +3 -1
  42. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/test/test_service_errors.py +2 -7
  43. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/test/test_snake_case.py +1 -0
  44. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/test/test_ttl_cache.py +1 -0
  45. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/test/test_validations.py +1 -1
  46. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/test/test_xml_schema_compliance.py +4 -1
  47. shapeshifter_uftp-2.2.1/shapeshifter_uftp/uftp/agr_cro.py +0 -14
  48. shapeshifter_uftp-2.2.1/shapeshifter_uftp/uftp/agr_dso.py +0 -32
  49. shapeshifter_uftp-2.2.1/shapeshifter_uftp/uftp/common.py +0 -6
  50. shapeshifter_uftp-2.2.1/shapeshifter_uftp/uftp/cro_dso.py +0 -11
  51. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/README.rst +0 -0
  52. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/setup.cfg +0 -0
  53. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/shapeshifter_uftp/cli.py +0 -0
  54. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/shapeshifter_uftp/client/__init__.py +0 -0
  55. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/shapeshifter_uftp/exceptions.py +0 -0
  56. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/shapeshifter_uftp/logging.py +0 -0
  57. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/shapeshifter_uftp/oauth.py +0 -0
  58. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/shapeshifter_uftp/service/__init__.py +0 -0
  59. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/shapeshifter_uftp/transport.py +0 -0
  60. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/shapeshifter_uftp/uftp/defaults.py +0 -0
  61. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/shapeshifter_uftp/uftp/enums.py +0 -0
  62. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/shapeshifter_uftp/uftp/messages/__init__.py +0 -0
  63. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/shapeshifter_uftp/uftp/validations.py +0 -0
  64. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/shapeshifter_uftp.egg-info/dependency_links.txt +0 -0
  65. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/shapeshifter_uftp.egg-info/entry_points.txt +0 -0
  66. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/shapeshifter_uftp.egg-info/requires.txt +0 -0
  67. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/shapeshifter_uftp.egg-info/top_level.txt +0 -0
  68. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/test/test_client_with_workers.py +0 -0
  69. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/test/test_clients_from_service.py +0 -0
  70. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/test/test_presence_of_service_methods.py +0 -0
  71. {shapeshifter_uftp-2.2.1 → shapeshifter_uftp-2.3.0}/test/test_seal_and_unseal.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: shapeshifter_uftp
3
- Version: 2.2.1
3
+ Version: 2.3.0
4
4
  Summary: Implementation of the Shapeshifter (UFTP) protocol
5
5
  Project-URL: Repository, https://github.com/shapeshifter/shapeshifter-library-python
6
6
  Project-URL: Documentation, https://github.com/shapeshifter/shapeshifter-library-python/README.md
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "shapeshifter_uftp"
3
- version = "2.2.1"
3
+ version = "2.3.0"
4
4
  description = "Implementation of the Shapeshifter (UFTP) protocol"
5
5
  dependencies = [
6
6
  "xsdata[lxml]>=25.0,<27.0",
@@ -71,3 +71,13 @@ packages = [
71
71
  "shapeshifter_uftp.uftp",
72
72
  "shapeshifter_uftp.uftp.messages"
73
73
  ]
74
+
75
+ [tool.ruff.lint]
76
+ select = [
77
+ "I",
78
+ "W191",
79
+ "W291",
80
+ "W292",
81
+ "W293",
82
+ "F401",
83
+ ]
@@ -1,144 +1,145 @@
1
- from .client import (
2
- ShapeshifterAgrCroClient,
3
- ShapeshifterAgrDsoClient,
4
- ShapeshifterCroAgrClient,
5
- ShapeshifterCroDsoClient,
6
- ShapeshifterDsoAgrClient,
7
- ShapeshifterDsoCroClient,
8
- )
9
- from .oauth import OAuthClient
10
- from .service import (
11
- ShapeshifterAgrService,
12
- ShapeshifterCroService,
13
- ShapeshifterDsoService,
14
- )
15
- from .uftp import (
16
- AcceptedRejected,
17
- AgrPortfolioQuery,
18
- AgrPortfolioQueryResponse,
19
- AgrPortfolioQueryResponseCongestionPoint,
20
- AgrPortfolioQueryResponseConnection,
21
- AgrPortfolioQueryResponseDSOPortfolio,
22
- AgrPortfolioQueryResponseDSOView,
23
- AgrPortfolioUpdate,
24
- AgrPortfolioUpdateConnection,
25
- AgrPortfolioUpdateResponse,
26
- ContractSettlement,
27
- ContractSettlementISP,
28
- ContractSettlementPeriod,
29
- DPrognosis,
30
- DPrognosisISP,
31
- DPrognosisResponse,
32
- DsoPortfolioQuery,
33
- DsoPortfolioQueryCongestionPoint,
34
- DsoPortfolioQueryConnection,
35
- DsoPortfolioQueryResponse,
36
- DsoPortfolioUpdate,
37
- DsoPortfolioUpdateCongestionPoint,
38
- DsoPortfolioUpdateConnection,
39
- DsoPortfolioUpdateResponse,
40
- FlexMessage,
41
- FlexOffer,
42
- FlexOfferOption,
43
- FlexOfferOptionISP,
44
- FlexOfferResponse,
45
- FlexOfferRevocation,
46
- FlexOfferRevocationResponse,
47
- FlexOrder,
48
- FlexOrderISP,
49
- FlexOrderResponse,
50
- FlexOrderSettlement,
51
- FlexOrderSettlementISP,
52
- FlexOrderSettlementStatus,
53
- FlexOrderStatus,
54
- FlexRequest,
55
- FlexRequestISP,
56
- FlexRequestResponse,
57
- FlexReservationUpdate,
58
- FlexReservationUpdateISP,
59
- FlexReservationUpdateResponse,
60
- FlexSettlement,
61
- FlexSettlementResponse,
62
- Metering,
63
- MeteringISP,
64
- MeteringProfile,
65
- MeteringProfileEnum,
66
- MeteringResponse,
67
- MeteringUnit,
68
- PayloadMessage,
69
- PayloadMessageResponse,
70
- SignedMessage,
71
- TestMessage,
72
- TestMessageResponse,
73
- UsefRole,
74
- )
75
-
76
- __all__ = [
77
- "ShapeshifterAgrCroClient",
78
- "ShapeshifterAgrDsoClient",
79
- "ShapeshifterCroAgrClient",
80
- "ShapeshifterCroDsoClient",
81
- "ShapeshifterDsoAgrClient",
82
- "ShapeshifterDsoCroClient",
83
- "ShapeshifterAgrService",
84
- "ShapeshifterDsoService",
85
- "ShapeshifterCroService",
86
- "AcceptedRejected",
87
- "AgrPortfolioQuery",
88
- "AgrPortfolioQueryResponse",
89
- "AgrPortfolioQueryResponseCongestionPoint",
90
- "AgrPortfolioQueryResponseConnection",
91
- "AgrPortfolioQueryResponseDSOPortfolio",
92
- "AgrPortfolioQueryResponseDSOView",
93
- "AgrPortfolioUpdate",
94
- "AgrPortfolioUpdateConnection",
95
- "AgrPortfolioUpdateResponse",
96
- "ContractSettlement",
97
- "ContractSettlementISP",
98
- "ContractSettlementPeriod",
99
- "DPrognosis",
100
- "DPrognosisISP",
101
- "DPrognosisResponse",
102
- "DsoPortfolioQuery",
103
- "DsoPortfolioQueryCongestionPoint",
104
- "DsoPortfolioQueryConnection",
105
- "DsoPortfolioQueryResponse",
106
- "DsoPortfolioUpdate",
107
- "DsoPortfolioUpdateCongestionPoint",
108
- "DsoPortfolioUpdateConnection",
109
- "DsoPortfolioUpdateResponse",
110
- "FlexMessage",
111
- "FlexOffer",
112
- "FlexOfferOption",
113
- "FlexOfferOptionISP",
114
- "FlexOfferResponse",
115
- "FlexOfferRevocation",
116
- "FlexOfferRevocationResponse",
117
- "FlexOrder",
118
- "FlexOrderISP",
119
- "FlexOrderResponse",
120
- "FlexOrderSettlement",
121
- "FlexOrderSettlementISP",
122
- "FlexOrderSettlementStatus",
123
- "FlexOrderStatus",
124
- "FlexRequest",
125
- "FlexRequestISP",
126
- "FlexRequestResponse",
127
- "FlexReservationUpdate",
128
- "FlexReservationUpdateISP",
129
- "FlexReservationUpdateResponse",
130
- "FlexSettlement",
131
- "FlexSettlementResponse",
132
- "Metering",
133
- "MeteringISP",
134
- "MeteringProfile",
135
- "MeteringProfileEnum",
136
- "MeteringResponse",
137
- "MeteringUnit",
138
- "PayloadMessage",
139
- "PayloadMessageResponse",
140
- "SignedMessage",
141
- "TestMessage",
142
- "TestMessageResponse",
143
- "UsefRole",
144
- ]
1
+ from .client import (
2
+ ShapeshifterAgrCroClient,
3
+ ShapeshifterAgrDsoClient,
4
+ ShapeshifterCroAgrClient,
5
+ ShapeshifterCroDsoClient,
6
+ ShapeshifterDsoAgrClient,
7
+ ShapeshifterDsoCroClient,
8
+ )
9
+ from .oauth import OAuthClient
10
+ from .service import (
11
+ ShapeshifterAgrService,
12
+ ShapeshifterCroService,
13
+ ShapeshifterDsoService,
14
+ )
15
+ from .uftp import (
16
+ AcceptedRejected,
17
+ AgrPortfolioQuery,
18
+ AgrPortfolioQueryResponse,
19
+ AgrPortfolioQueryResponseCongestionPoint,
20
+ AgrPortfolioQueryResponseConnection,
21
+ AgrPortfolioQueryResponseDSOPortfolio,
22
+ AgrPortfolioQueryResponseDSOView,
23
+ AgrPortfolioUpdate,
24
+ AgrPortfolioUpdateConnection,
25
+ AgrPortfolioUpdateResponse,
26
+ ContractSettlement,
27
+ ContractSettlementISP,
28
+ ContractSettlementPeriod,
29
+ DPrognosis,
30
+ DPrognosisISP,
31
+ DPrognosisResponse,
32
+ DsoPortfolioQuery,
33
+ DsoPortfolioQueryCongestionPoint,
34
+ DsoPortfolioQueryConnection,
35
+ DsoPortfolioQueryResponse,
36
+ DsoPortfolioUpdate,
37
+ DsoPortfolioUpdateCongestionPoint,
38
+ DsoPortfolioUpdateConnection,
39
+ DsoPortfolioUpdateResponse,
40
+ FlexMessage,
41
+ FlexOffer,
42
+ FlexOfferOption,
43
+ FlexOfferOptionISP,
44
+ FlexOfferResponse,
45
+ FlexOfferRevocation,
46
+ FlexOfferRevocationResponse,
47
+ FlexOrder,
48
+ FlexOrderISP,
49
+ FlexOrderResponse,
50
+ FlexOrderSettlement,
51
+ FlexOrderSettlementISP,
52
+ FlexOrderSettlementStatus,
53
+ FlexOrderStatus,
54
+ FlexRequest,
55
+ FlexRequestISP,
56
+ FlexRequestResponse,
57
+ FlexReservationUpdate,
58
+ FlexReservationUpdateISP,
59
+ FlexReservationUpdateResponse,
60
+ FlexSettlement,
61
+ FlexSettlementResponse,
62
+ Metering,
63
+ MeteringISP,
64
+ MeteringProfile,
65
+ MeteringProfileEnum,
66
+ MeteringResponse,
67
+ MeteringUnit,
68
+ PayloadMessage,
69
+ PayloadMessageResponse,
70
+ SignedMessage,
71
+ TestMessage,
72
+ TestMessageResponse,
73
+ UsefRole,
74
+ )
75
+
76
+ __all__ = [
77
+ "ShapeshifterAgrCroClient",
78
+ "ShapeshifterAgrDsoClient",
79
+ "ShapeshifterCroAgrClient",
80
+ "ShapeshifterCroDsoClient",
81
+ "ShapeshifterDsoAgrClient",
82
+ "ShapeshifterDsoCroClient",
83
+ "ShapeshifterAgrService",
84
+ "ShapeshifterDsoService",
85
+ "ShapeshifterCroService",
86
+ "AcceptedRejected",
87
+ "AgrPortfolioQuery",
88
+ "AgrPortfolioQueryResponse",
89
+ "AgrPortfolioQueryResponseCongestionPoint",
90
+ "AgrPortfolioQueryResponseConnection",
91
+ "AgrPortfolioQueryResponseDSOPortfolio",
92
+ "AgrPortfolioQueryResponseDSOView",
93
+ "AgrPortfolioUpdate",
94
+ "AgrPortfolioUpdateConnection",
95
+ "AgrPortfolioUpdateResponse",
96
+ "ContractSettlement",
97
+ "ContractSettlementISP",
98
+ "ContractSettlementPeriod",
99
+ "DPrognosis",
100
+ "DPrognosisISP",
101
+ "DPrognosisResponse",
102
+ "DsoPortfolioQuery",
103
+ "DsoPortfolioQueryCongestionPoint",
104
+ "DsoPortfolioQueryConnection",
105
+ "DsoPortfolioQueryResponse",
106
+ "DsoPortfolioUpdate",
107
+ "DsoPortfolioUpdateCongestionPoint",
108
+ "DsoPortfolioUpdateConnection",
109
+ "DsoPortfolioUpdateResponse",
110
+ "FlexMessage",
111
+ "FlexOffer",
112
+ "FlexOfferOption",
113
+ "FlexOfferOptionISP",
114
+ "FlexOfferResponse",
115
+ "FlexOfferRevocation",
116
+ "FlexOfferRevocationResponse",
117
+ "FlexOrder",
118
+ "FlexOrderISP",
119
+ "FlexOrderResponse",
120
+ "FlexOrderSettlement",
121
+ "FlexOrderSettlementISP",
122
+ "FlexOrderSettlementStatus",
123
+ "FlexOrderStatus",
124
+ "FlexRequest",
125
+ "FlexRequestISP",
126
+ "FlexRequestResponse",
127
+ "FlexReservationUpdate",
128
+ "FlexReservationUpdateISP",
129
+ "FlexReservationUpdateResponse",
130
+ "FlexSettlement",
131
+ "FlexSettlementResponse",
132
+ "Metering",
133
+ "MeteringISP",
134
+ "MeteringProfile",
135
+ "MeteringProfileEnum",
136
+ "MeteringResponse",
137
+ "MeteringUnit",
138
+ "OAuthClient",
139
+ "PayloadMessage",
140
+ "PayloadMessageResponse",
141
+ "SignedMessage",
142
+ "TestMessage",
143
+ "TestMessageResponse",
144
+ "UsefRole",
145
+ ]
@@ -1,7 +1,6 @@
1
1
  from ..uftp import (
2
2
  AgrPortfolioQuery,
3
3
  AgrPortfolioUpdate,
4
- PayloadMessageResponse,
5
4
  UsefRole,
6
5
  )
7
6
  from .base_client import ShapeshifterClient
@@ -15,14 +14,14 @@ class ShapeshifterAgrCroClient(ShapeshifterClient):
15
14
  sender_role = UsefRole.AGR
16
15
  recipient_role = UsefRole.CRO
17
16
 
18
- def send_agr_portfolio_update(self, message: AgrPortfolioUpdate) -> PayloadMessageResponse:
17
+ def send_agr_portfolio_update(self, message: AgrPortfolioUpdate) -> None:
19
18
  """
20
19
  The AGRPortfolioUpdate is used by the AGR to indicate on which
21
20
  Connections it represents prosumers.
22
21
  """
23
22
  return self._send_message(message)
24
23
 
25
- def send_agr_portfolio_query(self, message: AgrPortfolioQuery) -> PayloadMessageResponse:
24
+ def send_agr_portfolio_query(self, message: AgrPortfolioQuery) -> None:
26
25
  """
27
26
  The AGRPortfolioQuery is used by the AGR to retrieve additional
28
27
  information on the connections.
@@ -7,7 +7,6 @@ from ..uftp import (
7
7
  FlexReservationUpdateResponse,
8
8
  FlexSettlementResponse,
9
9
  Metering,
10
- PayloadMessageResponse,
11
10
  UsefRole,
12
11
  )
13
12
  from .base_client import ShapeshifterClient
@@ -21,7 +20,7 @@ class ShapeshifterAgrDsoClient(ShapeshifterClient):
21
20
  sender_role = UsefRole.AGR
22
21
  recipient_role = UsefRole.DSO
23
22
 
24
- def send_d_prognosis(self, message: DPrognosis) -> PayloadMessageResponse:
23
+ def send_d_prognosis(self, message: DPrognosis) -> None:
25
24
  """
26
25
  D-Prognosis messages are used to communicate D-prognoses between AGRs
27
26
  and DSOs. D-Prognosis messages always contain data for all ISPs for the
@@ -32,7 +31,7 @@ class ShapeshifterAgrDsoClient(ShapeshifterClient):
32
31
  """
33
32
  return self._send_message(message)
34
33
 
35
- def send_flex_request_response(self, message: FlexRequestResponse) -> PayloadMessageResponse:
34
+ def send_flex_request_response(self, message: FlexRequestResponse) -> None:
36
35
  """
37
36
  Upon receiving and processing a FlexRequest message, the receiving
38
37
  implementation must reply with a FlexRequestResponse, indicating
@@ -40,7 +39,7 @@ class ShapeshifterAgrDsoClient(ShapeshifterClient):
40
39
  """
41
40
  return self._send_message(message)
42
41
 
43
- def send_flex_offer(self, message: FlexOffer) -> PayloadMessageResponse:
42
+ def send_flex_offer(self, message: FlexOffer) -> None:
44
43
  """
45
44
  FlexOffer messages are used by AGRs to make DSOs an offer for provision
46
45
  of flexibility. A FlexOffer message contains a list of ISPs and, for
@@ -53,24 +52,24 @@ class ShapeshifterAgrDsoClient(ShapeshifterClient):
53
52
  sure that it can actually provide the flexibility offered across all of
54
53
  its FlexOffers.
55
54
  """
56
- return self._send_message(message)
55
+ self._send_message(message)
57
56
 
58
- def send_flex_offer_revocation(self, message: FlexOfferRevocation) -> PayloadMessageResponse:
57
+ def send_flex_offer_revocation(self, message: FlexOfferRevocation) -> None:
59
58
  """
60
59
  The FlexOfferRevocation message is used by the AGR to revoke a FlexOffer
61
60
  previously sent to a DSO. It voids the FlexOffer, even if its validity
62
61
  time has not yet expired. Revocation is not allowed for FlexOffers that
63
62
  already have associated accepted FlexOrders.
64
63
  """
65
- return self._send_message(message)
64
+ self._send_message(message)
66
65
 
67
- def send_flex_order_response(self, message: FlexOrderResponse) -> PayloadMessageResponse:
66
+ def send_flex_order_response(self, message: FlexOrderResponse) -> None:
68
67
  """
69
68
  Confirm the flex order.
70
69
  """
71
- return self._send_message(message)
70
+ self._send_message(message)
72
71
 
73
- def send_flex_settlement_response(self, message: FlexSettlementResponse) -> PayloadMessageResponse:
72
+ def send_flex_settlement_response(self, message: FlexSettlementResponse) -> None:
74
73
  """
75
74
  Upon receiving and processing a FlexSettlement message, the AGR must
76
75
  reply with a FlexSettlementResponse, indicating whether the initial
@@ -78,16 +77,16 @@ class ShapeshifterAgrDsoClient(ShapeshifterClient):
78
77
  rejected, the DSO should consider all FlexOrderSettlement elements of
79
78
  that message related to potential dispute.
80
79
  """
81
- return self._send_message(message)
80
+ self._send_message(message)
82
81
 
83
- def send_flex_reservation_update_response(self, message: FlexReservationUpdateResponse) -> PayloadMessageResponse:
82
+ def send_flex_reservation_update_response(self, message: FlexReservationUpdateResponse) -> None:
84
83
  """
85
84
  Confirm the flex reservation update.
86
85
  """
87
- return self._send_message(message)
86
+ self._send_message(message)
88
87
 
89
- def send_metering(self, message: Metering) -> PayloadMessageResponse:
88
+ def send_metering(self, message: Metering) -> None:
90
89
  """
91
90
  Send metering data to the DSO.
92
91
  """
93
- return self._send_message(message)
92
+ self._send_message(message)
@@ -11,7 +11,13 @@ from .. import transport
11
11
  from ..exceptions import ClientTransportException
12
12
  from ..logging import logger
13
13
  from ..oauth import OAuthClient, PassthroughOAuthClient
14
- from ..uftp import PayloadMessage, PayloadMessageResponse, SignedMessage, UsefRole
14
+ from ..uftp import (
15
+ PayloadMessage,
16
+ SignedMessage,
17
+ TestMessage,
18
+ TestMessageResponse,
19
+ UsefRole,
20
+ )
15
21
 
16
22
 
17
23
  class ShapeshifterClient:
@@ -80,7 +86,19 @@ class ShapeshifterClient:
80
86
  else:
81
87
  self.oauth_client = PassthroughOAuthClient()
82
88
 
83
- def _send_message(self, message: PayloadMessage) -> PayloadMessageResponse:
89
+ # ------------------------------------------------------------ #
90
+ # Test Messages #
91
+ # ------------------------------------------------------------ #
92
+ def send_test_message(self, message: TestMessage | None = None):
93
+ if message is None:
94
+ message = TestMessage()
95
+
96
+ return self._send_message(message)
97
+
98
+ def send_test_message_response(self, message: TestMessageResponse):
99
+ return self._send_message(message)
100
+
101
+ def _send_message(self, message: PayloadMessage) -> None:
84
102
  """
85
103
  Perform an operation. This will take the message object, pack
86
104
  it up into a SignedMessage, sign and seal it, and send it to
@@ -145,28 +163,6 @@ class ShapeshifterClient:
145
163
  logger.error(error_msg)
146
164
  raise ClientTransportException(error_msg, response=response)
147
165
 
148
- # If the response was empty, don't attempt to parse it
149
- if len(response.content) == 0:
150
- return None
151
-
152
- # Instantiate a SignedMessage object from the response bytes.
153
- sealed_response = transport.parser.from_bytes(response.content)
154
-
155
- # Use the static key that was provided when the client was
156
- # initialized, or retrieve the key using DNS. The DNS
157
- # implementation caches the DNS lookups so they are not that
158
- # expensive after the first time.
159
- if not (recipient_signing_key := self.recipient_signing_key):
160
- recipient_signing_key = transport.get_key(
161
- self.recipient_domain, self.recipient_role
162
- )
163
-
164
- # Unseal the response using the other party's public signing
165
- # key and return the response message within it
166
- return transport.unseal_message(
167
- message=sealed_response.body, public_key=recipient_signing_key
168
- )
169
-
170
166
  # ------------------------------------------------------------ #
171
167
  # Methods related to queueing and scheduling outgoing #
172
168
  # messages. #
@@ -10,16 +10,16 @@ class ShapeshifterCroAgrClient(ShapeshifterClient):
10
10
  sender_role = UsefRole.CRO
11
11
  recipient_role = UsefRole.AGR
12
12
 
13
- def send_agr_portfolio_update_response(self, message: AgrPortfolioUpdateResponse):
13
+ def send_agr_portfolio_update_response(self, message: AgrPortfolioUpdateResponse) -> None:
14
14
  """
15
15
  The DSOPortfolioUpdate is used by the DSO to indicate on which
16
16
  congestion points it wants to engage in flexibility trading.
17
17
  """
18
- return self._send_message(message)
18
+ self._send_message(message)
19
19
 
20
- def send_agr_portfolio_query_response(self, message: AgrPortfolioQueryResponse):
20
+ def send_agr_portfolio_query_response(self, message: AgrPortfolioQueryResponse) -> None:
21
21
  """
22
22
  DSOPortfolioQuery is used by DSOs to discover which AGRs represent
23
23
  connections on its registered congestion point(s).
24
24
  """
25
- return self._send_message(message)
25
+ self._send_message(message)
@@ -18,16 +18,16 @@ class ShapeshifterCroDsoClient(ShapeshifterClient):
18
18
  sender_role = UsefRole.CRO
19
19
  recipient_role = UsefRole.DSO
20
20
 
21
- def send_dso_portfolio_update_response(self, message: DsoPortfolioUpdateResponse):
21
+ def send_dso_portfolio_update_response(self, message: DsoPortfolioUpdateResponse) -> None:
22
22
  """
23
23
  The DSOPortfolioUpdate is used by the DSO to indicate on which
24
24
  congestion points it wants to engage in flexibility trading.
25
25
  """
26
- return self._send_message(message)
26
+ self._send_message(message)
27
27
 
28
- def send_dso_portfolio_query_response(self, message: DsoPortfolioQueryResponse):
28
+ def send_dso_portfolio_query_response(self, message: DsoPortfolioQueryResponse) -> None:
29
29
  """
30
30
  DSOPortfolioQuery is used by DSOs to discover which AGRs represent
31
31
  connections on its registered congestion point(s).
32
32
  """
33
- return self._send_message(message)
33
+ self._send_message(message)
@@ -7,7 +7,6 @@ from ..uftp import (
7
7
  FlexReservationUpdate,
8
8
  FlexSettlement,
9
9
  MeteringResponse,
10
- PayloadMessageResponse,
11
10
  UsefRole,
12
11
  )
13
12
  from .base_client import ShapeshifterClient
@@ -21,13 +20,13 @@ class ShapeshifterDsoAgrClient(ShapeshifterClient):
21
20
  sender_role = UsefRole.DSO
22
21
  recipient_role = UsefRole.AGR
23
22
 
24
- def send_d_prognosis_response(self, message: DPrognosisResponse) -> PayloadMessageResponse:
23
+ def send_d_prognosis_response(self, message: DPrognosisResponse) -> None:
25
24
  """
26
25
  Confirm reception of the D-prognosis.
27
26
  """
28
- return self._send_message(message)
27
+ self._send_message(message)
29
28
 
30
- def send_flex_request(self, message: FlexRequest) -> PayloadMessageResponse:
29
+ def send_flex_request(self, message: FlexRequest) -> None:
31
30
  """
32
31
  FlexRequest messages are used by DSOs to request flexibility from AGRs.
33
32
  In addition to one or more ISP elements with Disposition=Requested,
@@ -35,15 +34,15 @@ class ShapeshifterDsoAgrClient(ShapeshifterClient):
35
34
  message should also include the remaining ISPs for the current period
36
35
  where Disposition=Available.
37
36
  """
38
- return self._send_message(message)
37
+ self._send_message(message)
39
38
 
40
- def send_flex_offer_response(self, message: FlexOfferResponse) -> PayloadMessageResponse:
39
+ def send_flex_offer_response(self, message: FlexOfferResponse) -> None:
41
40
  """
42
41
  Confirm reception of a flex offer.
43
42
  """
44
- return self._send_message(message)
43
+ self._send_message(message)
45
44
 
46
- def send_flex_order(self, message: FlexOrder) -> PayloadMessageResponse:
45
+ def send_flex_order(self, message: FlexOrder) -> None:
47
46
  """
48
47
  FlexOrder messages are used by DSOs to purchase flexibility from an AGR
49
48
  based on a previous FlexOffer. A FlexOrder message contains a list of
@@ -54,9 +53,9 @@ class ShapeshifterDsoAgrClient(ShapeshifterClient):
54
53
  (and must) reject FlexOrder messages where the ISP list is not exactly
55
54
  the same as offered.
56
55
  """
57
- return self._send_message(message)
56
+ self._send_message(message)
58
57
 
59
- def send_flex_reservation_update(self, message: FlexReservationUpdate) -> PayloadMessageResponse:
58
+ def send_flex_reservation_update(self, message: FlexReservationUpdate) -> None:
60
59
  """
61
60
  For bilateral contracts, FlexReservationUpdate messages are used by DSOs
62
61
  to signal to an AGR which part of the contracted volume is still
@@ -65,27 +64,27 @@ class ShapeshifterDsoAgrClient(ShapeshifterClient):
65
64
  power is still reserved. Zero power means that no power is reserved for
66
65
  that ISP and the sign of the power indicates the direction.
67
66
  """
68
- return self._send_message(message)
67
+ self._send_message(message)
69
68
 
70
- def send_flex_settlement(self, message: FlexSettlement) -> PayloadMessageResponse:
69
+ def send_flex_settlement(self, message: FlexSettlement) -> None:
71
70
  """
72
71
  The FlexSettlement message is sent by DSOs on a regular basis
73
72
  (typically monthly) to AGRs, in order to initiate settlement.
74
73
  It includes a list of all FlexOrders placed by the
75
74
  originating party during the settlement period.
76
75
  """
77
- return self._send_message(message)
76
+ self._send_message(message)
78
77
 
79
- def send_flex_offer_revocation_response(self, message: FlexOfferRevocationResponse) -> PayloadMessageResponse:
78
+ def send_flex_offer_revocation_response(self, message: FlexOfferRevocationResponse) -> None:
80
79
  """
81
80
  Upon receiving and processing a FlexOfferRevocation message, the
82
81
  receiving implementation must reply with a FlexOfferRevocationResponse,
83
82
  indicating whether the revocation was handled successfully.
84
83
  """
85
- return self._send_message(message)
84
+ self._send_message(message)
86
85
 
87
- def send_metering_response(self, message: MeteringResponse) -> PayloadMessageResponse:
86
+ def send_metering_response(self, message: MeteringResponse) -> None:
88
87
  """
89
88
  Confirm reception of metering data.
90
89
  """
91
- return self._send_message(message)
90
+ self._send_message(message)
@@ -10,16 +10,16 @@ class ShapeshifterDsoCroClient(ShapeshifterClient):
10
10
  sender_role = UsefRole.DSO
11
11
  recipient_role = UsefRole.CRO
12
12
 
13
- def send_dso_portfolio_update(self, message: DsoPortfolioUpdate):
13
+ def send_dso_portfolio_update(self, message: DsoPortfolioUpdate) -> None:
14
14
  """
15
15
  The DSOPortfolioUpdate is used by the DSO to indicate on which
16
16
  congestion points it wants to engage in flexibility trading.
17
17
  """
18
- return self._send_message(message)
18
+ self._send_message(message)
19
19
 
20
- def send_dso_portfolio_query(self, message: DsoPortfolioQuery):
20
+ def send_dso_portfolio_query(self, message: DsoPortfolioQuery) -> None:
21
21
  """
22
22
  DSOPortfolioQuery is used by DSOs to discover which AGRs represent
23
23
  connections on its registered congestion point(s).
24
24
  """
25
- return self._send_message(message)
25
+ self._send_message(message)