unitysvc-services 0.1.0__py3-none-any.whl → 0.1.1__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.
- unitysvc_services/models/base.py +118 -34
- unitysvc_services/models/listing_v1.py +8 -4
- unitysvc_services/models/provider_v1.py +13 -3
- unitysvc_services/models/seller_v1.py +11 -7
- unitysvc_services/publisher.py +169 -209
- unitysvc_services/query.py +31 -13
- unitysvc_services/update.py +6 -1
- unitysvc_services/utils.py +110 -8
- unitysvc_services/validator.py +183 -18
- {unitysvc_services-0.1.0.dist-info → unitysvc_services-0.1.1.dist-info}/METADATA +2 -1
- unitysvc_services-0.1.1.dist-info/RECORD +23 -0
- unitysvc_services-0.1.0.dist-info/RECORD +0 -23
- {unitysvc_services-0.1.0.dist-info → unitysvc_services-0.1.1.dist-info}/WHEEL +0 -0
- {unitysvc_services-0.1.0.dist-info → unitysvc_services-0.1.1.dist-info}/entry_points.txt +0 -0
- {unitysvc_services-0.1.0.dist-info → unitysvc_services-0.1.1.dist-info}/licenses/LICENSE +0 -0
- {unitysvc_services-0.1.0.dist-info → unitysvc_services-0.1.1.dist-info}/top_level.txt +0 -0
unitysvc_services/models/base.py
CHANGED
@@ -206,16 +206,38 @@ class UpstreamStatusEnum(StrEnum):
|
|
206
206
|
deprecated = "deprecated"
|
207
207
|
|
208
208
|
|
209
|
+
class ProviderStatusEnum(StrEnum):
|
210
|
+
"""Provider status enum."""
|
211
|
+
|
212
|
+
active = "active"
|
213
|
+
disabled = "disabled"
|
214
|
+
incomplete = "incomplete" # Provider information is incomplete
|
215
|
+
|
216
|
+
|
217
|
+
class SellerStatusEnum(StrEnum):
|
218
|
+
"""Seller status enum."""
|
219
|
+
|
220
|
+
active = "active"
|
221
|
+
disabled = "disabled"
|
222
|
+
incomplete = "incomplete" # Seller information is incomplete
|
223
|
+
|
224
|
+
|
209
225
|
class Document(BaseModel):
|
210
226
|
model_config = ConfigDict(extra="forbid")
|
211
227
|
|
212
228
|
# fields that will be stored in backend database
|
213
229
|
#
|
214
230
|
title: str = Field(min_length=5, max_length=255, description="Document title")
|
215
|
-
description: str | None = Field(
|
231
|
+
description: str | None = Field(
|
232
|
+
default=None, max_length=500, description="Document description"
|
233
|
+
)
|
216
234
|
mime_type: MimeTypeEnum = Field(description="Document MIME type")
|
217
|
-
version: str | None = Field(
|
218
|
-
|
235
|
+
version: str | None = Field(
|
236
|
+
default=None, max_length=50, description="Document version"
|
237
|
+
)
|
238
|
+
category: DocumentCategoryEnum = Field(
|
239
|
+
description="Document category for organization and filtering"
|
240
|
+
)
|
219
241
|
meta: dict[str, Any] | None = Field(
|
220
242
|
default=None,
|
221
243
|
description="JSON containing operation stats",
|
@@ -249,8 +271,12 @@ class RateLimit(BaseModel):
|
|
249
271
|
window: TimeWindowEnum = Field(description="Time window for the limit")
|
250
272
|
|
251
273
|
# Optional additional info
|
252
|
-
description: str | None = Field(
|
253
|
-
|
274
|
+
description: str | None = Field(
|
275
|
+
default=None, max_length=255, description="Human-readable description"
|
276
|
+
)
|
277
|
+
burst_limit: int | None = Field(
|
278
|
+
default=None, description="Short-term burst allowance"
|
279
|
+
)
|
254
280
|
|
255
281
|
# Status
|
256
282
|
is_active: bool = Field(default=True, description="Whether rate limit is active")
|
@@ -260,57 +286,105 @@ class ServiceConstraints(BaseModel):
|
|
260
286
|
model_config = ConfigDict(extra="forbid")
|
261
287
|
|
262
288
|
# Usage Quotas & Billing
|
263
|
-
monthly_quota: int | None = Field(
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
289
|
+
monthly_quota: int | None = Field(
|
290
|
+
default=None, description="Monthly usage quota (requests, tokens, etc.)"
|
291
|
+
)
|
292
|
+
daily_quota: int | None = Field(
|
293
|
+
default=None, description="Daily usage quota (requests, tokens, etc.)"
|
294
|
+
)
|
295
|
+
quota_unit: RateLimitUnitEnum | None = Field(
|
296
|
+
default=None, description="Unit for quota limits"
|
297
|
+
)
|
298
|
+
quota_reset_cycle: QuotaResetCycleEnum | None = Field(
|
299
|
+
default=None, description="How often quotas reset"
|
300
|
+
)
|
301
|
+
overage_policy: OveragePolicyEnum | None = Field(
|
302
|
+
default=None, description="What happens when quota is exceeded"
|
303
|
+
)
|
268
304
|
|
269
305
|
# Authentication & Security
|
270
|
-
auth_methods: list[AuthMethodEnum] | None = Field(
|
271
|
-
|
272
|
-
|
306
|
+
auth_methods: list[AuthMethodEnum] | None = Field(
|
307
|
+
default=None, description="Supported authentication methods"
|
308
|
+
)
|
309
|
+
ip_whitelist_required: bool | None = Field(
|
310
|
+
default=None, description="Whether IP whitelisting is required"
|
311
|
+
)
|
312
|
+
tls_version_min: str | None = Field(
|
313
|
+
default=None, description="Minimum TLS version required"
|
314
|
+
)
|
273
315
|
|
274
316
|
# Request/Response Constraints
|
275
|
-
max_request_size_bytes: int | None = Field(
|
276
|
-
|
277
|
-
|
278
|
-
|
317
|
+
max_request_size_bytes: int | None = Field(
|
318
|
+
default=None, description="Maximum request payload size in bytes"
|
319
|
+
)
|
320
|
+
max_response_size_bytes: int | None = Field(
|
321
|
+
default=None, description="Maximum response payload size in bytes"
|
322
|
+
)
|
323
|
+
timeout_seconds: int | None = Field(
|
324
|
+
default=None, description="Request timeout in seconds"
|
325
|
+
)
|
326
|
+
max_batch_size: int | None = Field(
|
327
|
+
default=None, description="Maximum number of items in batch requests"
|
328
|
+
)
|
279
329
|
|
280
330
|
# Content & Model Restrictions
|
281
331
|
content_filters: list[ContentFilterEnum] | None = Field(
|
282
332
|
default=None, description="Active content filtering policies"
|
283
333
|
)
|
284
|
-
input_languages: list[str] | None = Field(
|
285
|
-
|
286
|
-
|
334
|
+
input_languages: list[str] | None = Field(
|
335
|
+
default=None, description="Supported input languages (ISO 639-1 codes)"
|
336
|
+
)
|
337
|
+
output_languages: list[str] | None = Field(
|
338
|
+
default=None, description="Supported output languages (ISO 639-1 codes)"
|
339
|
+
)
|
340
|
+
max_context_length: int | None = Field(
|
341
|
+
default=None, description="Maximum context length in tokens"
|
342
|
+
)
|
287
343
|
region_restrictions: list[str] | None = Field(
|
288
344
|
default=None, description="Geographic restrictions (ISO country codes)"
|
289
345
|
)
|
290
346
|
|
291
347
|
# Availability & SLA
|
292
|
-
uptime_sla_percent: float | None = Field(
|
293
|
-
|
294
|
-
|
348
|
+
uptime_sla_percent: float | None = Field(
|
349
|
+
default=None, description="Uptime SLA percentage (e.g., 99.9)"
|
350
|
+
)
|
351
|
+
response_time_sla_ms: int | None = Field(
|
352
|
+
default=None, description="Response time SLA in milliseconds"
|
353
|
+
)
|
354
|
+
maintenance_windows: list[str] | None = Field(
|
355
|
+
default=None, description="Scheduled maintenance windows"
|
356
|
+
)
|
295
357
|
|
296
358
|
# Concurrency & Connection Limits
|
297
|
-
max_concurrent_requests: int | None = Field(
|
298
|
-
|
299
|
-
|
359
|
+
max_concurrent_requests: int | None = Field(
|
360
|
+
default=None, description="Maximum concurrent requests allowed"
|
361
|
+
)
|
362
|
+
connection_timeout_seconds: int | None = Field(
|
363
|
+
default=None, description="Connection timeout in seconds"
|
364
|
+
)
|
365
|
+
max_connections_per_ip: int | None = Field(
|
366
|
+
default=None, description="Maximum connections per IP address"
|
367
|
+
)
|
300
368
|
|
301
369
|
|
302
370
|
class AccessInterface(BaseModel):
|
303
371
|
model_config = ConfigDict(extra="allow")
|
304
372
|
|
305
|
-
access_method: AccessMethodEnum = Field(
|
373
|
+
access_method: AccessMethodEnum = Field(
|
374
|
+
default=AccessMethodEnum.http, description="Type of access method"
|
375
|
+
)
|
306
376
|
|
307
377
|
api_endpoint: str = Field(max_length=500, description="API endpoint URL")
|
308
378
|
|
309
|
-
api_key: str | None = Field(
|
379
|
+
api_key: str | None = Field(
|
380
|
+
default=None, max_length=2000, description="API key if required"
|
381
|
+
)
|
310
382
|
|
311
383
|
name: str | None = Field(default=None, max_length=100, description="Interface name")
|
312
384
|
|
313
|
-
description: str | None = Field(
|
385
|
+
description: str | None = Field(
|
386
|
+
default=None, max_length=500, description="Interface description"
|
387
|
+
)
|
314
388
|
|
315
389
|
request_transformer: dict[RequestTransformEnum, dict[str, Any]] | None = Field(
|
316
390
|
default=None, description="Request transformation configuration"
|
@@ -324,9 +398,13 @@ class AccessInterface(BaseModel):
|
|
324
398
|
default=None,
|
325
399
|
description="Rate limit",
|
326
400
|
)
|
327
|
-
constraint: ServiceConstraints | None = Field(
|
401
|
+
constraint: ServiceConstraints | None = Field(
|
402
|
+
default=None, description="Service constraints and conditions"
|
403
|
+
)
|
328
404
|
is_active: bool = Field(default=True, description="Whether interface is active")
|
329
|
-
is_primary: bool = Field(
|
405
|
+
is_primary: bool = Field(
|
406
|
+
default=False, description="Whether this is the primary interface"
|
407
|
+
)
|
330
408
|
sort_order: int = Field(default=0, description="Display order")
|
331
409
|
|
332
410
|
|
@@ -334,9 +412,13 @@ class Pricing(BaseModel):
|
|
334
412
|
model_config = ConfigDict(extra="forbid")
|
335
413
|
|
336
414
|
# Pricing tier name (Basic, Pro, Enterprise, etc.)
|
337
|
-
name: str | None = Field(
|
415
|
+
name: str | None = Field(
|
416
|
+
default=None, description="Pricing tier name (e.g., Basic, Pro, Enterprise)"
|
417
|
+
)
|
338
418
|
|
339
|
-
description: str | None = Field(
|
419
|
+
description: str | None = Field(
|
420
|
+
default=None, description="Pricing model description"
|
421
|
+
)
|
340
422
|
|
341
423
|
# Currency and description
|
342
424
|
currency: str | None = Field(default=None, description="Currency code (e.g., USD)")
|
@@ -349,4 +431,6 @@ class Pricing(BaseModel):
|
|
349
431
|
)
|
350
432
|
|
351
433
|
# Optional reference to upstream pricing
|
352
|
-
reference: str | None = Field(
|
434
|
+
reference: str | None = Field(
|
435
|
+
default=None, description="Reference URL to upstream pricing"
|
436
|
+
)
|
@@ -17,7 +17,9 @@ class ListingV1(BaseModel):
|
|
17
17
|
#
|
18
18
|
# fields for business data collection and maintenance
|
19
19
|
#
|
20
|
-
schema_version: str = Field(
|
20
|
+
schema_version: str = Field(
|
21
|
+
default="listing_v1", description="Schema identifier", alias="schema"
|
22
|
+
)
|
21
23
|
time_created: datetime
|
22
24
|
|
23
25
|
#
|
@@ -30,8 +32,8 @@ class ListingV1(BaseModel):
|
|
30
32
|
),
|
31
33
|
)
|
32
34
|
|
33
|
-
seller_name: str = Field(
|
34
|
-
description="Name of the seller offering this service listing"
|
35
|
+
seller_name: str | None = Field(
|
36
|
+
default=None, description="Name of the seller offering this service listing"
|
35
37
|
)
|
36
38
|
|
37
39
|
# unique name for each provider, usually following upstream naming convention
|
@@ -48,7 +50,9 @@ class ListingV1(BaseModel):
|
|
48
50
|
# - code_examples
|
49
51
|
# multiple access interfaces can be provided, for example, if the service
|
50
52
|
# is available through multiple interfaces or service groups
|
51
|
-
user_access_interfaces: list[AccessInterface] = Field(
|
53
|
+
user_access_interfaces: list[AccessInterface] = Field(
|
54
|
+
description="Dictionary of user access interfaces"
|
55
|
+
)
|
52
56
|
|
53
57
|
#
|
54
58
|
# how upstream charges for their services, which can include
|
@@ -3,7 +3,7 @@ from typing import Any
|
|
3
3
|
|
4
4
|
from pydantic import BaseModel, ConfigDict, EmailStr, Field, HttpUrl
|
5
5
|
|
6
|
-
from unitysvc_services.models.base import AccessInterface, Document
|
6
|
+
from unitysvc_services.models.base import AccessInterface, Document, ProviderStatusEnum
|
7
7
|
|
8
8
|
|
9
9
|
class ProviderV1(BaseModel):
|
@@ -12,13 +12,17 @@ class ProviderV1(BaseModel):
|
|
12
12
|
#
|
13
13
|
# fields for business data collection and maintenance
|
14
14
|
#
|
15
|
-
schema_version: str = Field(
|
15
|
+
schema_version: str = Field(
|
16
|
+
default="provider_v1", description="Schema identifier", alias="schema"
|
17
|
+
)
|
16
18
|
time_created: datetime
|
17
19
|
# how to automatically populate service data, if available
|
18
20
|
services_populator: dict[str, Any] | None = None
|
19
21
|
# parameters for accessing service provider, which typically
|
20
22
|
# include "api_endpoint" and "api_key"
|
21
|
-
provider_access_info: AccessInterface = Field(
|
23
|
+
provider_access_info: AccessInterface = Field(
|
24
|
+
description="Dictionary of upstream access interface"
|
25
|
+
)
|
22
26
|
#
|
23
27
|
# fields that will be stored in backend database
|
24
28
|
#
|
@@ -51,3 +55,9 @@ class ProviderV1(BaseModel):
|
|
51
55
|
homepage: HttpUrl
|
52
56
|
contact_email: EmailStr
|
53
57
|
secondary_contact_email: EmailStr | None = None
|
58
|
+
|
59
|
+
# Status field to track provider state
|
60
|
+
status: ProviderStatusEnum = Field(
|
61
|
+
default=ProviderStatusEnum.active,
|
62
|
+
description="Provider status: active, disabled, or incomplete",
|
63
|
+
)
|
@@ -2,7 +2,7 @@ from datetime import datetime
|
|
2
2
|
|
3
3
|
from pydantic import BaseModel, ConfigDict, EmailStr, Field, HttpUrl
|
4
4
|
|
5
|
-
from unitysvc_services.models.base import Document, SellerTypeEnum
|
5
|
+
from unitysvc_services.models.base import Document, SellerStatusEnum, SellerTypeEnum
|
6
6
|
|
7
7
|
|
8
8
|
class SellerV1(BaseModel):
|
@@ -17,7 +17,9 @@ class SellerV1(BaseModel):
|
|
17
17
|
#
|
18
18
|
# fields for business data collection and maintenance
|
19
19
|
#
|
20
|
-
schema_version: str = Field(
|
20
|
+
schema_version: str = Field(
|
21
|
+
default="seller_v1", description="Schema identifier", alias="schema"
|
22
|
+
)
|
21
23
|
time_created: datetime
|
22
24
|
|
23
25
|
#
|
@@ -47,7 +49,9 @@ class SellerV1(BaseModel):
|
|
47
49
|
# Contact information
|
48
50
|
contact_email: EmailStr = Field(description="Primary contact email for the seller")
|
49
51
|
|
50
|
-
secondary_contact_email: EmailStr | None = Field(
|
52
|
+
secondary_contact_email: EmailStr | None = Field(
|
53
|
+
default=None, description="Secondary contact email"
|
54
|
+
)
|
51
55
|
|
52
56
|
# Account manager
|
53
57
|
account_manager: str | None = Field(
|
@@ -98,10 +102,10 @@ class SellerV1(BaseModel):
|
|
98
102
|
# fields for business operation purposes
|
99
103
|
#
|
100
104
|
|
101
|
-
# Status
|
102
|
-
|
103
|
-
default=
|
104
|
-
description="
|
105
|
+
# Status field to track seller state
|
106
|
+
status: SellerStatusEnum = Field(
|
107
|
+
default=SellerStatusEnum.active,
|
108
|
+
description="Seller status: active, disabled, or incomplete",
|
105
109
|
)
|
106
110
|
|
107
111
|
is_verified: bool = Field(
|