openmeter 1.0.0b54__py3-none-any.whl → 2.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

Files changed (132) hide show
  1. openmeter/__init__.py +89 -15
  2. openmeter/_base_client.py +2041 -0
  3. openmeter/_client.py +518 -70
  4. openmeter/_compat.py +221 -0
  5. openmeter/_constants.py +14 -0
  6. openmeter/_exceptions.py +108 -0
  7. openmeter/_files.py +127 -0
  8. openmeter/_models.py +777 -0
  9. openmeter/_qs.py +150 -0
  10. openmeter/_resource.py +43 -0
  11. openmeter/_response.py +820 -0
  12. openmeter/_streaming.py +333 -0
  13. openmeter/_types.py +222 -0
  14. openmeter/_utils/__init__.py +56 -0
  15. openmeter/_utils/_logs.py +25 -0
  16. openmeter/_utils/_proxy.py +63 -0
  17. openmeter/_utils/_reflection.py +42 -0
  18. openmeter/_utils/_streams.py +12 -0
  19. openmeter/_utils/_sync.py +81 -0
  20. openmeter/_utils/_transform.py +387 -0
  21. openmeter/_utils/_typing.py +120 -0
  22. openmeter/_utils/_utils.py +419 -0
  23. openmeter/_version.py +4 -0
  24. openmeter/lib/.keep +4 -0
  25. openmeter/py.typed +0 -1
  26. openmeter/resources/__init__.py +103 -0
  27. openmeter/resources/debug/__init__.py +33 -0
  28. openmeter/resources/debug/debug.py +102 -0
  29. openmeter/resources/debug/metrics.py +146 -0
  30. openmeter/resources/entitlements/__init__.py +47 -0
  31. openmeter/resources/entitlements/entitlements.py +450 -0
  32. openmeter/resources/entitlements/features.py +578 -0
  33. openmeter/resources/entitlements/grants.py +389 -0
  34. openmeter/resources/events.py +442 -0
  35. openmeter/resources/meters/__init__.py +33 -0
  36. openmeter/resources/meters/meters.py +666 -0
  37. openmeter/resources/meters/subjects.py +163 -0
  38. openmeter/resources/notifications/__init__.py +75 -0
  39. openmeter/resources/notifications/channels.py +686 -0
  40. openmeter/resources/notifications/events.py +365 -0
  41. openmeter/resources/notifications/notifications.py +198 -0
  42. openmeter/resources/notifications/rules.py +781 -0
  43. openmeter/resources/notifications/webhook.py +208 -0
  44. openmeter/resources/portal/__init__.py +47 -0
  45. openmeter/resources/portal/meters.py +230 -0
  46. openmeter/resources/portal/portal.py +112 -0
  47. openmeter/resources/portal/tokens.py +359 -0
  48. openmeter/resources/subjects/entitlements/__init__.py +33 -0
  49. openmeter/resources/subjects/entitlements/entitlements.py +1881 -0
  50. openmeter/resources/subjects/entitlements/grants.py +453 -0
  51. openmeter/resources/subjects.py +419 -0
  52. openmeter/types/__init__.py +21 -0
  53. openmeter/types/debug/__init__.py +5 -0
  54. openmeter/types/debug/metric_list_response.py +7 -0
  55. openmeter/types/entitlement.py +238 -0
  56. openmeter/types/entitlements/__init__.py +11 -0
  57. openmeter/types/entitlements/feature.py +61 -0
  58. openmeter/types/entitlements/feature_create_params.py +43 -0
  59. openmeter/types/entitlements/feature_list_params.py +23 -0
  60. openmeter/types/entitlements/grant_list_params.py +57 -0
  61. openmeter/types/entitlements/grant_list_response.py +11 -0
  62. openmeter/types/entitlements/grant_paginated_response.py +24 -0
  63. openmeter/types/entitlements/list_features_result.py +28 -0
  64. openmeter/types/event_ingest_params.py +46 -0
  65. openmeter/types/event_ingest_response.py +43 -0
  66. openmeter/types/event_list_params.py +22 -0
  67. openmeter/types/event_list_response.py +9 -0
  68. openmeter/types/ingested_event.py +59 -0
  69. openmeter/types/list_entitlements_result.py +28 -0
  70. openmeter/types/meter.py +53 -0
  71. openmeter/types/meter_create_params.py +50 -0
  72. openmeter/types/meter_list_response.py +9 -0
  73. openmeter/types/meter_query_params.py +50 -0
  74. openmeter/types/meter_query_result.py +35 -0
  75. openmeter/types/meters/__init__.py +5 -0
  76. openmeter/types/meters/subject_list_response.py +8 -0
  77. openmeter/types/notifications/__init__.py +18 -0
  78. openmeter/types/notifications/channel_create_params.py +34 -0
  79. openmeter/types/notifications/channel_list_params.py +41 -0
  80. openmeter/types/notifications/channel_list_response.py +24 -0
  81. openmeter/types/notifications/channel_update_params.py +34 -0
  82. openmeter/types/notifications/event_list_params.py +61 -0
  83. openmeter/types/notifications/event_list_response.py +24 -0
  84. openmeter/types/notifications/notification_channel.py +47 -0
  85. openmeter/types/notifications/notification_event.py +215 -0
  86. openmeter/types/notifications/notification_rule.py +70 -0
  87. openmeter/types/notifications/rule_create_params.py +39 -0
  88. openmeter/types/notifications/rule_list_params.py +54 -0
  89. openmeter/types/notifications/rule_list_response.py +24 -0
  90. openmeter/types/notifications/rule_update_params.py +39 -0
  91. openmeter/types/notifications/webhook_svix_params.py +26 -0
  92. openmeter/types/portal/__init__.py +10 -0
  93. openmeter/types/portal/meter_query_params.py +44 -0
  94. openmeter/types/portal/portal_token.py +28 -0
  95. openmeter/types/portal/token_create_params.py +17 -0
  96. openmeter/types/portal/token_invalidate_params.py +15 -0
  97. openmeter/types/portal/token_list_params.py +12 -0
  98. openmeter/types/portal/token_list_response.py +9 -0
  99. openmeter/types/shared/__init__.py +3 -0
  100. openmeter/types/subject.py +37 -0
  101. openmeter/types/subject_list_response.py +9 -0
  102. openmeter/types/subject_param.py +27 -0
  103. openmeter/types/subject_upsert_params.py +39 -0
  104. openmeter/types/subject_upsert_response.py +10 -0
  105. openmeter/types/subjects/__init__.py +13 -0
  106. openmeter/types/subjects/entitlement_history_params.py +35 -0
  107. openmeter/types/subjects/entitlement_history_response.py +98 -0
  108. openmeter/types/subjects/entitlement_list_response.py +10 -0
  109. openmeter/types/subjects/entitlements/__init__.py +8 -0
  110. openmeter/types/subjects/entitlements/entitlement_grant.py +103 -0
  111. openmeter/types/subjects/entitlements/grant_list_response.py +10 -0
  112. openmeter-2.0.0.dist-info/METADATA +396 -0
  113. openmeter-2.0.0.dist-info/RECORD +115 -0
  114. {openmeter-1.0.0b54.dist-info → openmeter-2.0.0.dist-info}/WHEEL +1 -1
  115. openmeter-2.0.0.dist-info/licenses/LICENSE +201 -0
  116. openmeter/_configuration.py +0 -36
  117. openmeter/_operations/__init__.py +0 -17
  118. openmeter/_operations/_operations.py +0 -2105
  119. openmeter/_operations/_patch.py +0 -20
  120. openmeter/_patch.py +0 -20
  121. openmeter/_serialization.py +0 -2008
  122. openmeter/_vendor.py +0 -24
  123. openmeter/aio/__init__.py +0 -21
  124. openmeter/aio/_client.py +0 -83
  125. openmeter/aio/_configuration.py +0 -36
  126. openmeter/aio/_operations/__init__.py +0 -17
  127. openmeter/aio/_operations/_operations.py +0 -1778
  128. openmeter/aio/_operations/_patch.py +0 -20
  129. openmeter/aio/_patch.py +0 -20
  130. openmeter/aio/_vendor.py +0 -24
  131. openmeter-1.0.0b54.dist-info/METADATA +0 -92
  132. openmeter-1.0.0b54.dist-info/RECORD +0 -21
@@ -0,0 +1,666 @@
1
+ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Dict, List, Union
6
+ from datetime import datetime
7
+ from typing_extensions import Literal
8
+
9
+ import httpx
10
+
11
+ from ...types import meter_query_params, meter_create_params
12
+ from ..._types import NOT_GIVEN, Body, Query, Headers, NoneType, NotGiven
13
+ from ..._utils import (
14
+ maybe_transform,
15
+ async_maybe_transform,
16
+ )
17
+ from .subjects import (
18
+ SubjectsResource,
19
+ AsyncSubjectsResource,
20
+ SubjectsResourceWithRawResponse,
21
+ AsyncSubjectsResourceWithRawResponse,
22
+ SubjectsResourceWithStreamingResponse,
23
+ AsyncSubjectsResourceWithStreamingResponse,
24
+ )
25
+ from ..._compat import cached_property
26
+ from ..._resource import SyncAPIResource, AsyncAPIResource
27
+ from ..._response import (
28
+ to_raw_response_wrapper,
29
+ to_streamed_response_wrapper,
30
+ async_to_raw_response_wrapper,
31
+ async_to_streamed_response_wrapper,
32
+ )
33
+ from ...types.meter import Meter
34
+ from ..._base_client import make_request_options
35
+ from ...types.meter_query_result import MeterQueryResult
36
+ from ...types.meter_list_response import MeterListResponse
37
+
38
+ __all__ = ["MetersResource", "AsyncMetersResource"]
39
+
40
+
41
+ class MetersResource(SyncAPIResource):
42
+ @cached_property
43
+ def subjects(self) -> SubjectsResource:
44
+ return SubjectsResource(self._client)
45
+
46
+ @cached_property
47
+ def with_raw_response(self) -> MetersResourceWithRawResponse:
48
+ """
49
+ This property can be used as a prefix for any HTTP method call to return the
50
+ the raw response object instead of the parsed content.
51
+
52
+ For more information, see https://www.github.com/openmeterio/openmeter-python#accessing-raw-response-data-eg-headers
53
+ """
54
+ return MetersResourceWithRawResponse(self)
55
+
56
+ @cached_property
57
+ def with_streaming_response(self) -> MetersResourceWithStreamingResponse:
58
+ """
59
+ An alternative to `.with_raw_response` that doesn't eagerly read the response body.
60
+
61
+ For more information, see https://www.github.com/openmeterio/openmeter-python#with_streaming_response
62
+ """
63
+ return MetersResourceWithStreamingResponse(self)
64
+
65
+ def create(
66
+ self,
67
+ *,
68
+ aggregation: Literal["SUM", "COUNT", "UNIQUE_COUNT", "AVG", "MIN", "MAX"],
69
+ event_type: str,
70
+ slug: str,
71
+ window_size: Literal["MINUTE", "HOUR", "DAY"],
72
+ description: str | NotGiven = NOT_GIVEN,
73
+ group_by: Dict[str, str] | NotGiven = NOT_GIVEN,
74
+ value_property: str | NotGiven = NOT_GIVEN,
75
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
76
+ # The extra values given here take precedence over values defined on the client or passed to this method.
77
+ extra_headers: Headers | None = None,
78
+ extra_query: Query | None = None,
79
+ extra_body: Body | None = None,
80
+ timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
81
+ ) -> Meter:
82
+ """
83
+ Create a meter.
84
+
85
+ Args:
86
+ aggregation: The aggregation type to use for the meter.
87
+
88
+ event_type: The event type to aggregate.
89
+
90
+ slug: A unique, human-readable identifier for the meter. Must consist only
91
+ alphanumeric and underscore characters.
92
+
93
+ window_size: Aggregation window size.
94
+
95
+ description: A description of the meter.
96
+
97
+ group_by: Named JSONPath expressions to extract the group by values from the event data.
98
+
99
+ Keys must be unique and consist only alphanumeric and underscore characters.
100
+
101
+ TODO: add key format enforcement
102
+
103
+ value_property: JSONPath expression to extract the value from the ingested event's data
104
+ property.
105
+
106
+ The ingested value for SUM, AVG, MIN, and MAX aggregations is a number or a
107
+ string that can be parsed to a number.
108
+
109
+ For UNIQUE_COUNT aggregation, the ingested value must be a string. For COUNT
110
+ aggregation the valueProperty is ignored.
111
+
112
+ extra_headers: Send extra headers
113
+
114
+ extra_query: Add additional query parameters to the request
115
+
116
+ extra_body: Add additional JSON properties to the request
117
+
118
+ timeout: Override the client-level default timeout for this request, in seconds
119
+ """
120
+ return self._post(
121
+ "/api/v1/meters",
122
+ body=maybe_transform(
123
+ {
124
+ "aggregation": aggregation,
125
+ "event_type": event_type,
126
+ "slug": slug,
127
+ "window_size": window_size,
128
+ "description": description,
129
+ "group_by": group_by,
130
+ "value_property": value_property,
131
+ },
132
+ meter_create_params.MeterCreateParams,
133
+ ),
134
+ options=make_request_options(
135
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
136
+ ),
137
+ cast_to=Meter,
138
+ )
139
+
140
+ def retrieve(
141
+ self,
142
+ meter_id_or_slug: str,
143
+ *,
144
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
145
+ # The extra values given here take precedence over values defined on the client or passed to this method.
146
+ extra_headers: Headers | None = None,
147
+ extra_query: Query | None = None,
148
+ extra_body: Body | None = None,
149
+ timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
150
+ ) -> Meter:
151
+ """
152
+ Get a meter by ID or slug.
153
+
154
+ Args:
155
+ extra_headers: Send extra headers
156
+
157
+ extra_query: Add additional query parameters to the request
158
+
159
+ extra_body: Add additional JSON properties to the request
160
+
161
+ timeout: Override the client-level default timeout for this request, in seconds
162
+ """
163
+ if not meter_id_or_slug:
164
+ raise ValueError(f"Expected a non-empty value for `meter_id_or_slug` but received {meter_id_or_slug!r}")
165
+ return self._get(
166
+ f"/api/v1/meters/{meter_id_or_slug}",
167
+ options=make_request_options(
168
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
169
+ ),
170
+ cast_to=Meter,
171
+ )
172
+
173
+ def list(
174
+ self,
175
+ *,
176
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
177
+ # The extra values given here take precedence over values defined on the client or passed to this method.
178
+ extra_headers: Headers | None = None,
179
+ extra_query: Query | None = None,
180
+ extra_body: Body | None = None,
181
+ timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
182
+ ) -> MeterListResponse:
183
+ """List meters."""
184
+ return self._get(
185
+ "/api/v1/meters",
186
+ options=make_request_options(
187
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
188
+ ),
189
+ cast_to=MeterListResponse,
190
+ )
191
+
192
+ def delete(
193
+ self,
194
+ meter_id_or_slug: str,
195
+ *,
196
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
197
+ # The extra values given here take precedence over values defined on the client or passed to this method.
198
+ extra_headers: Headers | None = None,
199
+ extra_query: Query | None = None,
200
+ extra_body: Body | None = None,
201
+ timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
202
+ ) -> None:
203
+ """
204
+ Delete a meter.
205
+
206
+ Args:
207
+ extra_headers: Send extra headers
208
+
209
+ extra_query: Add additional query parameters to the request
210
+
211
+ extra_body: Add additional JSON properties to the request
212
+
213
+ timeout: Override the client-level default timeout for this request, in seconds
214
+ """
215
+ if not meter_id_or_slug:
216
+ raise ValueError(f"Expected a non-empty value for `meter_id_or_slug` but received {meter_id_or_slug!r}")
217
+ extra_headers = {"Accept": "*/*", **(extra_headers or {})}
218
+ return self._delete(
219
+ f"/api/v1/meters/{meter_id_or_slug}",
220
+ options=make_request_options(
221
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
222
+ ),
223
+ cast_to=NoneType,
224
+ )
225
+
226
+ def query(
227
+ self,
228
+ meter_id_or_slug: str,
229
+ *,
230
+ filter_group_by: Dict[str, str] | NotGiven = NOT_GIVEN,
231
+ from_: Union[str, datetime] | NotGiven = NOT_GIVEN,
232
+ group_by: List[str] | NotGiven = NOT_GIVEN,
233
+ subject: List[str] | NotGiven = NOT_GIVEN,
234
+ to: Union[str, datetime] | NotGiven = NOT_GIVEN,
235
+ window_size: Literal["MINUTE", "HOUR", "DAY"] | NotGiven = NOT_GIVEN,
236
+ window_time_zone: str | NotGiven = NOT_GIVEN,
237
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
238
+ # The extra values given here take precedence over values defined on the client or passed to this method.
239
+ extra_headers: Headers | None = None,
240
+ extra_query: Query | None = None,
241
+ extra_body: Body | None = None,
242
+ timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
243
+ ) -> MeterQueryResult:
244
+ """Query meter for usage.
245
+
246
+ Query meter for usage.
247
+
248
+ Args:
249
+ filter_group_by: Simple filter for group bys with exact match.
250
+
251
+ from_: Start date-time in RFC 3339 format.
252
+
253
+ Inclusive.
254
+
255
+ group_by: If not specified a single aggregate will be returned for each subject and time
256
+ window. `subject` is a reserved group by value.
257
+
258
+ subject: Filtering by multiple subjects.
259
+
260
+ to: End date-time in RFC 3339 format.
261
+
262
+ Inclusive.
263
+
264
+ window_size: If not specified, a single usage aggregate will be returned for the entirety of
265
+ the specified period for each subject and group.
266
+
267
+ window_time_zone: The value is the name of the time zone as defined in the IANA Time Zone Database
268
+ (http://www.iana.org/time-zones). If not specified, the UTC timezone will be
269
+ used.
270
+
271
+ extra_headers: Send extra headers
272
+
273
+ extra_query: Add additional query parameters to the request
274
+
275
+ extra_body: Add additional JSON properties to the request
276
+
277
+ timeout: Override the client-level default timeout for this request, in seconds
278
+ """
279
+ if not meter_id_or_slug:
280
+ raise ValueError(f"Expected a non-empty value for `meter_id_or_slug` but received {meter_id_or_slug!r}")
281
+ return self._get(
282
+ f"/api/v1/meters/{meter_id_or_slug}/query",
283
+ options=make_request_options(
284
+ extra_headers=extra_headers,
285
+ extra_query=extra_query,
286
+ extra_body=extra_body,
287
+ timeout=timeout,
288
+ query=maybe_transform(
289
+ {
290
+ "filter_group_by": filter_group_by,
291
+ "from_": from_,
292
+ "group_by": group_by,
293
+ "subject": subject,
294
+ "to": to,
295
+ "window_size": window_size,
296
+ "window_time_zone": window_time_zone,
297
+ },
298
+ meter_query_params.MeterQueryParams,
299
+ ),
300
+ ),
301
+ cast_to=MeterQueryResult,
302
+ )
303
+
304
+
305
+ class AsyncMetersResource(AsyncAPIResource):
306
+ @cached_property
307
+ def subjects(self) -> AsyncSubjectsResource:
308
+ return AsyncSubjectsResource(self._client)
309
+
310
+ @cached_property
311
+ def with_raw_response(self) -> AsyncMetersResourceWithRawResponse:
312
+ """
313
+ This property can be used as a prefix for any HTTP method call to return the
314
+ the raw response object instead of the parsed content.
315
+
316
+ For more information, see https://www.github.com/openmeterio/openmeter-python#accessing-raw-response-data-eg-headers
317
+ """
318
+ return AsyncMetersResourceWithRawResponse(self)
319
+
320
+ @cached_property
321
+ def with_streaming_response(self) -> AsyncMetersResourceWithStreamingResponse:
322
+ """
323
+ An alternative to `.with_raw_response` that doesn't eagerly read the response body.
324
+
325
+ For more information, see https://www.github.com/openmeterio/openmeter-python#with_streaming_response
326
+ """
327
+ return AsyncMetersResourceWithStreamingResponse(self)
328
+
329
+ async def create(
330
+ self,
331
+ *,
332
+ aggregation: Literal["SUM", "COUNT", "UNIQUE_COUNT", "AVG", "MIN", "MAX"],
333
+ event_type: str,
334
+ slug: str,
335
+ window_size: Literal["MINUTE", "HOUR", "DAY"],
336
+ description: str | NotGiven = NOT_GIVEN,
337
+ group_by: Dict[str, str] | NotGiven = NOT_GIVEN,
338
+ value_property: str | NotGiven = NOT_GIVEN,
339
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
340
+ # The extra values given here take precedence over values defined on the client or passed to this method.
341
+ extra_headers: Headers | None = None,
342
+ extra_query: Query | None = None,
343
+ extra_body: Body | None = None,
344
+ timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
345
+ ) -> Meter:
346
+ """
347
+ Create a meter.
348
+
349
+ Args:
350
+ aggregation: The aggregation type to use for the meter.
351
+
352
+ event_type: The event type to aggregate.
353
+
354
+ slug: A unique, human-readable identifier for the meter. Must consist only
355
+ alphanumeric and underscore characters.
356
+
357
+ window_size: Aggregation window size.
358
+
359
+ description: A description of the meter.
360
+
361
+ group_by: Named JSONPath expressions to extract the group by values from the event data.
362
+
363
+ Keys must be unique and consist only alphanumeric and underscore characters.
364
+
365
+ TODO: add key format enforcement
366
+
367
+ value_property: JSONPath expression to extract the value from the ingested event's data
368
+ property.
369
+
370
+ The ingested value for SUM, AVG, MIN, and MAX aggregations is a number or a
371
+ string that can be parsed to a number.
372
+
373
+ For UNIQUE_COUNT aggregation, the ingested value must be a string. For COUNT
374
+ aggregation the valueProperty is ignored.
375
+
376
+ extra_headers: Send extra headers
377
+
378
+ extra_query: Add additional query parameters to the request
379
+
380
+ extra_body: Add additional JSON properties to the request
381
+
382
+ timeout: Override the client-level default timeout for this request, in seconds
383
+ """
384
+ return await self._post(
385
+ "/api/v1/meters",
386
+ body=await async_maybe_transform(
387
+ {
388
+ "aggregation": aggregation,
389
+ "event_type": event_type,
390
+ "slug": slug,
391
+ "window_size": window_size,
392
+ "description": description,
393
+ "group_by": group_by,
394
+ "value_property": value_property,
395
+ },
396
+ meter_create_params.MeterCreateParams,
397
+ ),
398
+ options=make_request_options(
399
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
400
+ ),
401
+ cast_to=Meter,
402
+ )
403
+
404
+ async def retrieve(
405
+ self,
406
+ meter_id_or_slug: str,
407
+ *,
408
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
409
+ # The extra values given here take precedence over values defined on the client or passed to this method.
410
+ extra_headers: Headers | None = None,
411
+ extra_query: Query | None = None,
412
+ extra_body: Body | None = None,
413
+ timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
414
+ ) -> Meter:
415
+ """
416
+ Get a meter by ID or slug.
417
+
418
+ Args:
419
+ extra_headers: Send extra headers
420
+
421
+ extra_query: Add additional query parameters to the request
422
+
423
+ extra_body: Add additional JSON properties to the request
424
+
425
+ timeout: Override the client-level default timeout for this request, in seconds
426
+ """
427
+ if not meter_id_or_slug:
428
+ raise ValueError(f"Expected a non-empty value for `meter_id_or_slug` but received {meter_id_or_slug!r}")
429
+ return await self._get(
430
+ f"/api/v1/meters/{meter_id_or_slug}",
431
+ options=make_request_options(
432
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
433
+ ),
434
+ cast_to=Meter,
435
+ )
436
+
437
+ async def list(
438
+ self,
439
+ *,
440
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
441
+ # The extra values given here take precedence over values defined on the client or passed to this method.
442
+ extra_headers: Headers | None = None,
443
+ extra_query: Query | None = None,
444
+ extra_body: Body | None = None,
445
+ timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
446
+ ) -> MeterListResponse:
447
+ """List meters."""
448
+ return await self._get(
449
+ "/api/v1/meters",
450
+ options=make_request_options(
451
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
452
+ ),
453
+ cast_to=MeterListResponse,
454
+ )
455
+
456
+ async def delete(
457
+ self,
458
+ meter_id_or_slug: str,
459
+ *,
460
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
461
+ # The extra values given here take precedence over values defined on the client or passed to this method.
462
+ extra_headers: Headers | None = None,
463
+ extra_query: Query | None = None,
464
+ extra_body: Body | None = None,
465
+ timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
466
+ ) -> None:
467
+ """
468
+ Delete a meter.
469
+
470
+ Args:
471
+ extra_headers: Send extra headers
472
+
473
+ extra_query: Add additional query parameters to the request
474
+
475
+ extra_body: Add additional JSON properties to the request
476
+
477
+ timeout: Override the client-level default timeout for this request, in seconds
478
+ """
479
+ if not meter_id_or_slug:
480
+ raise ValueError(f"Expected a non-empty value for `meter_id_or_slug` but received {meter_id_or_slug!r}")
481
+ extra_headers = {"Accept": "*/*", **(extra_headers or {})}
482
+ return await self._delete(
483
+ f"/api/v1/meters/{meter_id_or_slug}",
484
+ options=make_request_options(
485
+ extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout
486
+ ),
487
+ cast_to=NoneType,
488
+ )
489
+
490
+ async def query(
491
+ self,
492
+ meter_id_or_slug: str,
493
+ *,
494
+ filter_group_by: Dict[str, str] | NotGiven = NOT_GIVEN,
495
+ from_: Union[str, datetime] | NotGiven = NOT_GIVEN,
496
+ group_by: List[str] | NotGiven = NOT_GIVEN,
497
+ subject: List[str] | NotGiven = NOT_GIVEN,
498
+ to: Union[str, datetime] | NotGiven = NOT_GIVEN,
499
+ window_size: Literal["MINUTE", "HOUR", "DAY"] | NotGiven = NOT_GIVEN,
500
+ window_time_zone: str | NotGiven = NOT_GIVEN,
501
+ # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs.
502
+ # The extra values given here take precedence over values defined on the client or passed to this method.
503
+ extra_headers: Headers | None = None,
504
+ extra_query: Query | None = None,
505
+ extra_body: Body | None = None,
506
+ timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN,
507
+ ) -> MeterQueryResult:
508
+ """Query meter for usage.
509
+
510
+ Query meter for usage.
511
+
512
+ Args:
513
+ filter_group_by: Simple filter for group bys with exact match.
514
+
515
+ from_: Start date-time in RFC 3339 format.
516
+
517
+ Inclusive.
518
+
519
+ group_by: If not specified a single aggregate will be returned for each subject and time
520
+ window. `subject` is a reserved group by value.
521
+
522
+ subject: Filtering by multiple subjects.
523
+
524
+ to: End date-time in RFC 3339 format.
525
+
526
+ Inclusive.
527
+
528
+ window_size: If not specified, a single usage aggregate will be returned for the entirety of
529
+ the specified period for each subject and group.
530
+
531
+ window_time_zone: The value is the name of the time zone as defined in the IANA Time Zone Database
532
+ (http://www.iana.org/time-zones). If not specified, the UTC timezone will be
533
+ used.
534
+
535
+ extra_headers: Send extra headers
536
+
537
+ extra_query: Add additional query parameters to the request
538
+
539
+ extra_body: Add additional JSON properties to the request
540
+
541
+ timeout: Override the client-level default timeout for this request, in seconds
542
+ """
543
+ if not meter_id_or_slug:
544
+ raise ValueError(f"Expected a non-empty value for `meter_id_or_slug` but received {meter_id_or_slug!r}")
545
+ return await self._get(
546
+ f"/api/v1/meters/{meter_id_or_slug}/query",
547
+ options=make_request_options(
548
+ extra_headers=extra_headers,
549
+ extra_query=extra_query,
550
+ extra_body=extra_body,
551
+ timeout=timeout,
552
+ query=await async_maybe_transform(
553
+ {
554
+ "filter_group_by": filter_group_by,
555
+ "from_": from_,
556
+ "group_by": group_by,
557
+ "subject": subject,
558
+ "to": to,
559
+ "window_size": window_size,
560
+ "window_time_zone": window_time_zone,
561
+ },
562
+ meter_query_params.MeterQueryParams,
563
+ ),
564
+ ),
565
+ cast_to=MeterQueryResult,
566
+ )
567
+
568
+
569
+ class MetersResourceWithRawResponse:
570
+ def __init__(self, meters: MetersResource) -> None:
571
+ self._meters = meters
572
+
573
+ self.create = to_raw_response_wrapper(
574
+ meters.create,
575
+ )
576
+ self.retrieve = to_raw_response_wrapper(
577
+ meters.retrieve,
578
+ )
579
+ self.list = to_raw_response_wrapper(
580
+ meters.list,
581
+ )
582
+ self.delete = to_raw_response_wrapper(
583
+ meters.delete,
584
+ )
585
+ self.query = to_raw_response_wrapper(
586
+ meters.query,
587
+ )
588
+
589
+ @cached_property
590
+ def subjects(self) -> SubjectsResourceWithRawResponse:
591
+ return SubjectsResourceWithRawResponse(self._meters.subjects)
592
+
593
+
594
+ class AsyncMetersResourceWithRawResponse:
595
+ def __init__(self, meters: AsyncMetersResource) -> None:
596
+ self._meters = meters
597
+
598
+ self.create = async_to_raw_response_wrapper(
599
+ meters.create,
600
+ )
601
+ self.retrieve = async_to_raw_response_wrapper(
602
+ meters.retrieve,
603
+ )
604
+ self.list = async_to_raw_response_wrapper(
605
+ meters.list,
606
+ )
607
+ self.delete = async_to_raw_response_wrapper(
608
+ meters.delete,
609
+ )
610
+ self.query = async_to_raw_response_wrapper(
611
+ meters.query,
612
+ )
613
+
614
+ @cached_property
615
+ def subjects(self) -> AsyncSubjectsResourceWithRawResponse:
616
+ return AsyncSubjectsResourceWithRawResponse(self._meters.subjects)
617
+
618
+
619
+ class MetersResourceWithStreamingResponse:
620
+ def __init__(self, meters: MetersResource) -> None:
621
+ self._meters = meters
622
+
623
+ self.create = to_streamed_response_wrapper(
624
+ meters.create,
625
+ )
626
+ self.retrieve = to_streamed_response_wrapper(
627
+ meters.retrieve,
628
+ )
629
+ self.list = to_streamed_response_wrapper(
630
+ meters.list,
631
+ )
632
+ self.delete = to_streamed_response_wrapper(
633
+ meters.delete,
634
+ )
635
+ self.query = to_streamed_response_wrapper(
636
+ meters.query,
637
+ )
638
+
639
+ @cached_property
640
+ def subjects(self) -> SubjectsResourceWithStreamingResponse:
641
+ return SubjectsResourceWithStreamingResponse(self._meters.subjects)
642
+
643
+
644
+ class AsyncMetersResourceWithStreamingResponse:
645
+ def __init__(self, meters: AsyncMetersResource) -> None:
646
+ self._meters = meters
647
+
648
+ self.create = async_to_streamed_response_wrapper(
649
+ meters.create,
650
+ )
651
+ self.retrieve = async_to_streamed_response_wrapper(
652
+ meters.retrieve,
653
+ )
654
+ self.list = async_to_streamed_response_wrapper(
655
+ meters.list,
656
+ )
657
+ self.delete = async_to_streamed_response_wrapper(
658
+ meters.delete,
659
+ )
660
+ self.query = async_to_streamed_response_wrapper(
661
+ meters.query,
662
+ )
663
+
664
+ @cached_property
665
+ def subjects(self) -> AsyncSubjectsResourceWithStreamingResponse:
666
+ return AsyncSubjectsResourceWithStreamingResponse(self._meters.subjects)