dub 0.21.0__py3-none-any.whl → 0.22.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.
dub/_version.py CHANGED
@@ -3,10 +3,10 @@
3
3
  import importlib.metadata
4
4
 
5
5
  __title__: str = "dub"
6
- __version__: str = "0.21.0"
6
+ __version__: str = "0.22.1"
7
7
  __openapi_doc_version__: str = "0.0.1"
8
- __gen_version__: str = "2.588.0"
9
- __user_agent__: str = "speakeasy-sdk/python 0.21.0 2.588.0 0.0.1 dub"
8
+ __gen_version__: str = "2.593.4"
9
+ __user_agent__: str = "speakeasy-sdk/python 0.22.1 2.593.4 0.0.1 dub"
10
10
 
11
11
  try:
12
12
  if __package__ is not None:
@@ -4,7 +4,6 @@ from .analyticsbrowsers import AnalyticsBrowsers, AnalyticsBrowsersTypedDict
4
4
  from .analyticscities import (
5
5
  AnalyticsCities,
6
6
  AnalyticsCitiesCountry,
7
- AnalyticsCitiesRegion,
8
7
  AnalyticsCitiesTypedDict,
9
8
  )
10
9
  from .analyticscontinents import (
@@ -205,7 +204,6 @@ __all__ = [
205
204
  "AnalyticsBrowsersTypedDict",
206
205
  "AnalyticsCities",
207
206
  "AnalyticsCitiesCountry",
208
- "AnalyticsCitiesRegion",
209
207
  "AnalyticsCitiesTypedDict",
210
208
  "AnalyticsContinents",
211
209
  "AnalyticsContinentsTypedDict",
@@ -263,16 +263,13 @@ class AnalyticsCitiesCountry(str, Enum):
263
263
  XK = "XK"
264
264
 
265
265
 
266
- class AnalyticsCitiesRegion(str, Enum):
267
- WILDCARD_ = "*"
268
-
269
-
270
266
  class AnalyticsCitiesTypedDict(TypedDict):
271
267
  country: AnalyticsCitiesCountry
272
268
  r"""The 2-letter country code of the city: https://d.to/geo"""
269
+ region: str
270
+ r"""The 2-letter ISO 3166-2 region code representing the region associated with the location of the user."""
273
271
  city: str
274
272
  r"""The name of the city"""
275
- region: NotRequired[AnalyticsCitiesRegion]
276
273
  clicks: NotRequired[float]
277
274
  r"""The number of clicks from this city"""
278
275
  leads: NotRequired[float]
@@ -287,11 +284,12 @@ class AnalyticsCities(BaseModel):
287
284
  country: AnalyticsCitiesCountry
288
285
  r"""The 2-letter country code of the city: https://d.to/geo"""
289
286
 
287
+ region: str
288
+ r"""The 2-letter ISO 3166-2 region code representing the region associated with the location of the user."""
289
+
290
290
  city: str
291
291
  r"""The name of the city"""
292
292
 
293
- region: Optional[AnalyticsCitiesRegion] = AnalyticsCitiesRegion.WILDCARD_
294
-
295
293
  clicks: Optional[float] = 0
296
294
  r"""The number of clicks from this city"""
297
295
 
@@ -12,11 +12,17 @@ from typing_extensions import Annotated, NotRequired, TypedDict
12
12
 
13
13
  class GetCustomersRequestTypedDict(TypedDict):
14
14
  email: NotRequired[str]
15
- r"""A case-sensitive filter on the list based on the customer's `email` field. The value must be a string."""
15
+ r"""A case-sensitive filter on the list based on the customer's `email` field. The value must be a string. Takes precedence over `externalId`."""
16
16
  external_id: NotRequired[str]
17
- r"""A case-sensitive filter on the list based on the customer's `externalId` field. The value must be a string."""
17
+ r"""A case-sensitive filter on the list based on the customer's `externalId` field. The value must be a string. Takes precedence over `search`."""
18
+ search: NotRequired[str]
19
+ r"""A search query to filter customers by email, externalId, or name. If `email` or `externalId` is provided, this will be ignored."""
18
20
  include_expanded_fields: NotRequired[bool]
19
21
  r"""Whether to include expanded fields on the customer (`link`, `partner`, `discount`)."""
22
+ page: NotRequired[float]
23
+ r"""The page number for pagination."""
24
+ page_size: NotRequired[float]
25
+ r"""The number of items per page."""
20
26
 
21
27
 
22
28
  class GetCustomersRequest(BaseModel):
@@ -24,14 +30,20 @@ class GetCustomersRequest(BaseModel):
24
30
  Optional[str],
25
31
  FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
26
32
  ] = None
27
- r"""A case-sensitive filter on the list based on the customer's `email` field. The value must be a string."""
33
+ r"""A case-sensitive filter on the list based on the customer's `email` field. The value must be a string. Takes precedence over `externalId`."""
28
34
 
29
35
  external_id: Annotated[
30
36
  Optional[str],
31
37
  pydantic.Field(alias="externalId"),
32
38
  FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
33
39
  ] = None
34
- r"""A case-sensitive filter on the list based on the customer's `externalId` field. The value must be a string."""
40
+ r"""A case-sensitive filter on the list based on the customer's `externalId` field. The value must be a string. Takes precedence over `search`."""
41
+
42
+ search: Annotated[
43
+ Optional[str],
44
+ FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
45
+ ] = None
46
+ r"""A search query to filter customers by email, externalId, or name. If `email` or `externalId` is provided, this will be ignored."""
35
47
 
36
48
  include_expanded_fields: Annotated[
37
49
  Optional[bool],
@@ -40,6 +52,19 @@ class GetCustomersRequest(BaseModel):
40
52
  ] = None
41
53
  r"""Whether to include expanded fields on the customer (`link`, `partner`, `discount`)."""
42
54
 
55
+ page: Annotated[
56
+ Optional[float],
57
+ FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
58
+ ] = 1
59
+ r"""The page number for pagination."""
60
+
61
+ page_size: Annotated[
62
+ Optional[float],
63
+ pydantic.Field(alias="pageSize"),
64
+ FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
65
+ ] = 100
66
+ r"""The number of items per page."""
67
+
43
68
 
44
69
  class GetCustomersLinkTypedDict(TypedDict):
45
70
  id: str
@@ -22,7 +22,7 @@ class GetQRCodeRequestTypedDict(TypedDict):
22
22
  url: str
23
23
  r"""The URL to generate a QR code for."""
24
24
  logo: NotRequired[str]
25
- r"""The logo to include in the QR code. Can only be used with a paid plan on Dub.co."""
25
+ r"""The logo to include in the QR code. Can only be used with a paid plan on Dub."""
26
26
  size: NotRequired[float]
27
27
  r"""The size of the QR code in pixels. Defaults to `600` if not provided."""
28
28
  level: NotRequired[Level]
@@ -32,7 +32,7 @@ class GetQRCodeRequestTypedDict(TypedDict):
32
32
  bg_color: NotRequired[str]
33
33
  r"""The background color of the QR code in hex format. Defaults to `#ffffff` if not provided."""
34
34
  hide_logo: NotRequired[bool]
35
- r"""Whether to hide the logo in the QR code. Can only be used with a paid plan on Dub.co."""
35
+ r"""Whether to hide the logo in the QR code. Can only be used with a paid plan on Dub."""
36
36
  margin: NotRequired[float]
37
37
  r"""The size of the margin around the QR code. Defaults to 2 if not provided."""
38
38
  include_margin: NotRequired[bool]
@@ -49,7 +49,7 @@ class GetQRCodeRequest(BaseModel):
49
49
  Optional[str],
50
50
  FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
51
51
  ] = None
52
- r"""The logo to include in the QR code. Can only be used with a paid plan on Dub.co."""
52
+ r"""The logo to include in the QR code. Can only be used with a paid plan on Dub."""
53
53
 
54
54
  size: Annotated[
55
55
  Optional[float],
@@ -82,7 +82,7 @@ class GetQRCodeRequest(BaseModel):
82
82
  pydantic.Field(alias="hideLogo"),
83
83
  FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
84
84
  ] = True
85
- r"""Whether to hide the logo in the QR code. Can only be used with a paid plan on Dub.co."""
85
+ r"""Whether to hide the logo in the QR code. Can only be used with a paid plan on Dub."""
86
86
 
87
87
  margin: Annotated[
88
88
  Optional[float],
@@ -1,9 +1,10 @@
1
1
  """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
2
 
3
3
  from __future__ import annotations
4
- from dub.types import BaseModel
4
+ from dub.types import BaseModel, Nullable, OptionalNullable, UNSET, UNSET_SENTINEL
5
5
  from dub.utils import FieldMetadata, PathParamMetadata, RequestMetadata
6
6
  import pydantic
7
+ from pydantic import model_serializer
7
8
  from typing import List, Optional
8
9
  from typing_extensions import Annotated, NotRequired, TypedDict
9
10
 
@@ -11,7 +12,7 @@ from typing_extensions import Annotated, NotRequired, TypedDict
11
12
  class UpdateWorkspaceRequestBodyTypedDict(TypedDict):
12
13
  name: NotRequired[str]
13
14
  slug: NotRequired[str]
14
- logo: NotRequired[str]
15
+ logo: NotRequired[Nullable[str]]
15
16
  conversion_enabled: NotRequired[bool]
16
17
  allowed_hostnames: NotRequired[List[str]]
17
18
 
@@ -21,7 +22,7 @@ class UpdateWorkspaceRequestBody(BaseModel):
21
22
 
22
23
  slug: Optional[str] = None
23
24
 
24
- logo: Optional[str] = None
25
+ logo: OptionalNullable[str] = UNSET
25
26
 
26
27
  conversion_enabled: Annotated[
27
28
  Optional[bool], pydantic.Field(alias="conversionEnabled")
@@ -31,6 +32,42 @@ class UpdateWorkspaceRequestBody(BaseModel):
31
32
  Optional[List[str]], pydantic.Field(alias="allowedHostnames")
32
33
  ] = None
33
34
 
35
+ @model_serializer(mode="wrap")
36
+ def serialize_model(self, handler):
37
+ optional_fields = [
38
+ "name",
39
+ "slug",
40
+ "logo",
41
+ "conversionEnabled",
42
+ "allowedHostnames",
43
+ ]
44
+ nullable_fields = ["logo"]
45
+ null_default_fields = []
46
+
47
+ serialized = handler(self)
48
+
49
+ m = {}
50
+
51
+ for n, f in type(self).model_fields.items():
52
+ k = f.alias or n
53
+ val = serialized.get(k)
54
+ serialized.pop(k, None)
55
+
56
+ optional_nullable = k in optional_fields and k in nullable_fields
57
+ is_set = (
58
+ self.__pydantic_fields_set__.intersection({n})
59
+ or k in null_default_fields
60
+ ) # pylint: disable=no-member
61
+
62
+ if val is not None and val != UNSET_SENTINEL:
63
+ m[k] = val
64
+ elif val != UNSET_SENTINEL and (
65
+ not k in optional_fields or (optional_nullable and is_set)
66
+ ):
67
+ m[k] = val
68
+
69
+ return m
70
+
34
71
 
35
72
  class UpdateWorkspaceRequestTypedDict(TypedDict):
36
73
  id_or_slug: str
dub/sdk.py CHANGED
@@ -27,7 +27,7 @@ import weakref
27
27
 
28
28
 
29
29
  class Dub(BaseSDK):
30
- r"""Dub.co API: Dub is link management infrastructure for companies to create marketing campaigns, link sharing features, and referral programs."""
30
+ r"""Dub API: Dub is link management infrastructure for companies to create marketing campaigns, link sharing features, and referral programs."""
31
31
 
32
32
  links: Links
33
33
  analytics: Analytics
dub/utils/serializers.py CHANGED
@@ -1,13 +1,16 @@
1
1
  """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
2
 
3
3
  from decimal import Decimal
4
+ import functools
4
5
  import json
5
- from typing import Any, Dict, List, Union, get_args
6
- import httpx
6
+ import typing
7
+ from typing import Any, Dict, List, Tuple, Union, get_args
8
+ import typing_extensions
7
9
  from typing_extensions import get_origin
10
+
11
+ import httpx
8
12
  from pydantic import ConfigDict, create_model
9
13
  from pydantic_core import from_json
10
- from typing_inspection.typing_objects import is_union
11
14
 
12
15
  from ..types.basemodel import BaseModel, Nullable, OptionalNullable, Unset
13
16
 
@@ -185,6 +188,13 @@ def is_nullable(field):
185
188
  return False
186
189
 
187
190
 
191
+ def is_union(obj: object) -> bool:
192
+ """
193
+ Returns True if the given object is a typing.Union or typing_extensions.Union.
194
+ """
195
+ return any(obj is typing_obj for typing_obj in _get_typing_objects_by_name_of("Union"))
196
+
197
+
188
198
  def stream_to_text(stream: httpx.Response) -> str:
189
199
  return "".join(stream.iter_text())
190
200
 
@@ -217,3 +227,22 @@ def _contains_pydantic_model(data: Any) -> bool:
217
227
  return any(_contains_pydantic_model(value) for value in data.values())
218
228
 
219
229
  return False
230
+
231
+
232
+ @functools.cache
233
+ def _get_typing_objects_by_name_of(name: str) -> Tuple[Any, ...]:
234
+ """
235
+ Get typing objects by name from typing and typing_extensions.
236
+ Reference: https://typing-extensions.readthedocs.io/en/latest/#runtime-use-of-types
237
+ """
238
+ result = tuple(
239
+ getattr(module, name)
240
+ for module in (typing, typing_extensions)
241
+ if hasattr(module, name)
242
+ )
243
+ if not result:
244
+ raise ValueError(
245
+ f"Neither typing nor typing_extensions has an object called {name!r}"
246
+ )
247
+ return result
248
+
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: dub
3
- Version: 0.21.0
3
+ Version: 0.22.1
4
4
  Summary: Python Client SDK Generated by Speakeasy
5
5
  Author: Speakeasy
6
6
  Requires-Python: >=3.9
@@ -10,11 +10,9 @@ Classifier: Programming Language :: Python :: 3.10
10
10
  Classifier: Programming Language :: Python :: 3.11
11
11
  Classifier: Programming Language :: Python :: 3.12
12
12
  Classifier: Programming Language :: Python :: 3.13
13
- Requires-Dist: eval-type-backport (>=0.2.0)
14
13
  Requires-Dist: httpx (>=0.28.1)
15
14
  Requires-Dist: jsonpath-python (>=1.0.6)
16
15
  Requires-Dist: pydantic (>=2.11.2)
17
- Requires-Dist: typing-inspection (>=0.4.0)
18
16
  Project-URL: Repository, https://github.com/dubinc/dub-python.git
19
17
  Description-Content-Type: text/markdown
20
18
 
@@ -34,7 +32,7 @@ Learn more about the Dub.co Python SDK in the [official documentation](https://d
34
32
  <!-- Start Summary [summary] -->
35
33
  ## Summary
36
34
 
37
- Dub.co API: Dub is link management infrastructure for companies to create marketing campaigns, link sharing features, and referral programs.
35
+ Dub API: Dub is link management infrastructure for companies to create marketing campaigns, link sharing features, and referral programs.
38
36
  <!-- End Summary [summary] -->
39
37
 
40
38
  <!-- Start Table of Contents [toc] -->
@@ -3,7 +3,7 @@ dub/_hooks/__init__.py,sha256=9_7W5jAYw8rcO8Kfc-Ty-lB82BHfksAJJpVFb_UeU1c,146
3
3
  dub/_hooks/registration.py,sha256=tT-1Cjp5ax1DL-84HBNWPy4wAwgP-0aI4-asLfnkIlw,625
4
4
  dub/_hooks/sdkhooks.py,sha256=2rLEjSz1xFGWabNs1voFn0lXSCqkS38bdKVFdnBJufE,2553
5
5
  dub/_hooks/types.py,sha256=_f63z3zj-1mQYfbDbEgt_0Yzys8yQtKEivmhKxOPeU8,2806
6
- dub/_version.py,sha256=4UotZ9NYO4khzKvF4FgTXCqDvhACkqGCnqKpE_k6iIg,450
6
+ dub/_version.py,sha256=qh-P0HBky42lpYh9YTUMfsKB1gxXdeh7qZL7Y0P4YXE,450
7
7
  dub/analytics.py,sha256=vlYINh0VlD1myVlTz5GbsJxoTEk45avOATjpJ_P_b9I,12938
8
8
  dub/basesdk.py,sha256=rDM8sEHVtFjFSi7RgfDnl3T0gLUJzqguXrSxFOWFRqE,12105
9
9
  dub/customers.py,sha256=8iLNQxjcU2gpWJsZp43XwKGNl2S9ONJQeo9IYtgdc-0,63157
@@ -14,9 +14,9 @@ dub/folders.py,sha256=e39wo7b8GauhN5Qdd4CpCnBfVsma3Pfj-eklyM07DuQ,50332
14
14
  dub/httpclient.py,sha256=lC-YQ7q4yiJGKElxBeb3aZnr-4aYxjgEpZ6roeXYlyg,4318
15
15
  dub/links.py,sha256=-Di3mUKKLmbXNSl4xSr3fos8-sRApWz2ZCL9UObEt5Y,128486
16
16
  dub/models/__init__.py,sha256=HRiFG5CV9y2HvWWQl_JQNbYTPme0UYR1Mhh13Qc-5jE,84
17
- dub/models/components/__init__.py,sha256=RpnTO43TAuOJdUm6oSYJsLcOJAIfs6siJcUoDcfO8Xc,10766
17
+ dub/models/components/__init__.py,sha256=l2w2vvyhJTRJaSRPIxgqig8KphSuEuhiyvO4G1Lynf4,10710
18
18
  dub/models/components/analyticsbrowsers.py,sha256=f6qMrkPFf38u3_PIovvdIc0hsX1YpYEaPxNwbXzkoeY,1172
19
- dub/models/components/analyticscities.py,sha256=JISzgIOXCCIu3zcQT5IOAifvhTJIKx-NXYKSOigO5UE,5160
19
+ dub/models/components/analyticscities.py,sha256=4DLioMjQkwGDCGPtSJ_RQK24ZJx5B2xPhMHVlUDFm3Y,5231
20
20
  dub/models/components/analyticscontinents.py,sha256=D_SQTm1Xp_pOt7qZTLJVo2B3RQUP8k3MQmsYRQYbjlI,1616
21
21
  dub/models/components/analyticscount.py,sha256=GddRT9d1RznwWgzQC09i8ZAIJUa06k2NkBnb14v3RGs,953
22
22
  dub/models/components/analyticscountries.py,sha256=IHztB2-OISDD7j4QyXOnZpT6yx1MS0uvWloRy5TP59A,5312
@@ -80,11 +80,11 @@ dub/models/operations/deletefolder.py,sha256=lpetbObqu9jd-XLl-unlvmSTuztW8Ecn-dh
80
80
  dub/models/operations/deletelink.py,sha256=o3Uia06QBrKb--6OkShjKkcqaK0dpt_Jw3AClUqTQq4,1062
81
81
  dub/models/operations/deletetag.py,sha256=UJz-O6oTuvOdzuUXUQktw699hEv0cs1eJW9C3wQBQBc,785
82
82
  dub/models/operations/getcustomer.py,sha256=fkv5GKhy_cTAG7--v0QRyQD7XXhxtpFAxn71zOPSLok,10129
83
- dub/models/operations/getcustomers.py,sha256=Z35JXTzhT4MWWU0IW1qoIGwAqwxjaqKVMU4YUxBLQ-I,10311
83
+ dub/models/operations/getcustomers.py,sha256=HO_bTlVFc7N1x_WC8lZFr3m8H1u3OKi2TuPixlR17YA,11439
84
84
  dub/models/operations/getlinkinfo.py,sha256=I4bhM6HeW7IFg1J-68Uou5-OHA7XdQcM8I_lRBtXAJI,1530
85
85
  dub/models/operations/getlinks.py,sha256=sKKTfFVnWOGB6am_TQv4suRYj3QTvlhGtsSEe4Dwnr0,7470
86
86
  dub/models/operations/getlinkscount.py,sha256=mPzscUbOWoxVqW6TYp3iW8lnrv0H1Mmy1nEbT9nlESo,5849
87
- dub/models/operations/getqrcode.py,sha256=RkGvexoOLwO5zLeKgfjv4Q9OjwwfLK7NJ59qpl0TnJA,3860
87
+ dub/models/operations/getqrcode.py,sha256=ynCPJc8vy_QEt5FP8OU2s-u6UIt1BhmFSNZC-XPmO4I,3848
88
88
  dub/models/operations/gettags.py,sha256=c9p_JrHFnTDJURyR5iiKFKpXFHlzJDt3R5X1U-anyYg,2664
89
89
  dub/models/operations/getworkspace.py,sha256=V4-NfsEg3M1BTeoE13sDyazefb2_kI4yFxnzgvHPv4s,625
90
90
  dub/models/operations/listdomains.py,sha256=gbQrJyBIvTGKSeqJo0Jb08iE44Xu39NS9zbfetx4p-s,1936
@@ -101,13 +101,13 @@ dub/models/operations/updatefolder.py,sha256=dNvSPY67g58SWynB8ic5rcgT-h7THRmyxuz
101
101
  dub/models/operations/updatelink.py,sha256=pwDVaSicVIB2Nb5e4sSrhn2NuHNa_1_MXNoDOaN-cXI,17855
102
102
  dub/models/operations/updatepartnersale.py,sha256=GkykJPynsw2nWexos36ygnxvJX-EJY_sFNfwYFeeuCk,3415
103
103
  dub/models/operations/updatetag.py,sha256=0nGAU6if5BsetDArXCIn8YvlDgG17N1Cp8q1o9F6ff4,2101
104
- dub/models/operations/updateworkspace.py,sha256=OM1Oxqs7cb5lQsI-H1ZrTd-k_2fMZdYBAsC9mp05xOM,1550
104
+ dub/models/operations/updateworkspace.py,sha256=qdlmA-Rz8_fC3iQs7bzmcn0qL9Lu3a04ziEIYfX3Ugo,2690
105
105
  dub/models/operations/upsertlink.py,sha256=RdVy-L4I_mCqwaIhmU1DosYfndpW6yh_8OslaFs2v5s,16956
106
106
  dub/models/operations/upsertpartnerlink.py,sha256=h08QRwsQyiIvDTUKu1ANE9mrwikDCqIzP8hWAKnc38Y,16880
107
107
  dub/partners.py,sha256=a1V9Wy_BBOxg7_sVpElTPQ6DX-wNMXQNoTWu87_0-OU,77571
108
108
  dub/py.typed,sha256=zrp19r0G21lr2yRiMC0f8MFkQFGj9wMpSbboePMg8KM,59
109
109
  dub/qr_codes.py,sha256=E0qlx0gs5CWbcz4M-GMLjvoMlGmUmAtHb3dtEWUO8cY,12164
110
- dub/sdk.py,sha256=7dMJS5wratnxAOo4z_LfPzp6NCESONltNO3_UhJsZz0,6360
110
+ dub/sdk.py,sha256=29q0R5TMeRAf-Qd2qI0RIzTGtFDJsQ4v1AwBF8ie6eQ,6357
111
111
  dub/sdkconfiguration.py,sha256=iGOSRTCoNX5k8H98ONo6B8rS6v5CtjAUN69Z6t5ftPg,1762
112
112
  dub/tags.py,sha256=fp_qLI_0VYSXs2dB77TgMJT0uwpbaKLst_tIpPZctLo,49773
113
113
  dub/track.py,sha256=znqpHDO_LBQmIiN4BO3PXCklIUz4xR0S8SKd5oElTJg,25772
@@ -126,11 +126,11 @@ dub/utils/queryparams.py,sha256=MTK6inMS1_WwjmMJEJmAn67tSHHJyarpdGRlorRHEtI,5899
126
126
  dub/utils/requestbodies.py,sha256=ySjEyjcLi731LNUahWvLOrES2HihuA8VrOJx4eQ7Qzg,2101
127
127
  dub/utils/retries.py,sha256=6yhfZifqIat9i76xF0lTR2jLj1IN9BNGyqqxATlEFPU,6348
128
128
  dub/utils/security.py,sha256=ktep3HKwbFs-MLxUYTM8Jd4v-ZBum5_Z0u1PFIdYBX0,5516
129
- dub/utils/serializers.py,sha256=EGH40Pgp3sSK9uM4PxL7_SYzSHtmo-Uy6QIE5xLVg68,5198
129
+ dub/utils/serializers.py,sha256=hiHBXM1AY8_N2Z_rvFfNSYwvLBkSQlPGFp8poasdU4s,5986
130
130
  dub/utils/url.py,sha256=BgGPgcTA6MRK4bF8fjP2dUopN3NzEzxWMXPBVg8NQUA,5254
131
131
  dub/utils/values.py,sha256=CcaCXEa3xHhkUDROyXZocN8f0bdITftv9Y0P9lTf0YM,3517
132
132
  dub/workspaces.py,sha256=d4eBlOvwuYlENsGcYI0fHQKN-cpC8U9kekTbfNJ2C_4,25635
133
- dub-0.21.0.dist-info/LICENSE,sha256=kc_aZ6YHHcdSsRy-mGsT0Ehji0ZgR_zevXiUt05V2KY,1079
134
- dub-0.21.0.dist-info/METADATA,sha256=LipWrttc9qzxBBYW8Kut9ghqMXpyywCr1sgTLiacpA8,27677
135
- dub-0.21.0.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
136
- dub-0.21.0.dist-info/RECORD,,
133
+ dub-0.22.1.dist-info/LICENSE,sha256=kc_aZ6YHHcdSsRy-mGsT0Ehji0ZgR_zevXiUt05V2KY,1079
134
+ dub-0.22.1.dist-info/METADATA,sha256=ZULbBQQ-aSq_BTJC5y6O1ScWiB4LMopNM2_wSu1VPXw,27587
135
+ dub-0.22.1.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
136
+ dub-0.22.1.dist-info/RECORD,,
File without changes
File without changes