Skip to content

Commit

Permalink
feat: Support datetime in Python (box/box-codegen#459)
Browse files Browse the repository at this point in the history
  • Loading branch information
box-sdk-build committed Mar 21, 2024
1 parent df95248 commit f73dcd5
Show file tree
Hide file tree
Showing 27 changed files with 510 additions and 380 deletions.
2 changes: 1 addition & 1 deletion .codegen.json
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{ "engineHash": "ce3d184", "specHash": "d50ab5f", "version": "0.6.2" }
{ "engineHash": "88dd8b0", "specHash": "d50ab5f", "version": "0.6.2" }
23 changes: 23 additions & 0 deletions box_sdk_gen/internal/base_object.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from datetime import datetime, date
from enum import EnumMeta, Enum
from typing import get_args, get_origin, Union, Optional

Expand Down Expand Up @@ -35,6 +36,10 @@ def to_dict(self) -> dict:
value = v.to_dict()
elif isinstance(v, Enum):
value = v.value
elif isinstance(v, date):
value = v.isoformat()
elif isinstance(v, datetime):
value = v.isoformat().replace('+00:00', 'Z')
else:
value = v
result_dict[self._fields_to_json_mapping.get(k, k)] = value
Expand All @@ -60,6 +65,10 @@ def _deserialize(cls, key, value, annotation=None):
return cls._deserialize_union(key, value, annotation)
elif isinstance(annotation, EnumMeta):
return cls._deserialize_enum(key, value, annotation)
elif annotation == datetime:
return cls._deserialize_datetime(key, value, annotation)
elif annotation == date:
return cls._deserialize_date(key, value, annotation)
else:
return cls._deserialize_nested_type(key, value, annotation)

Expand Down Expand Up @@ -104,6 +113,20 @@ def _deserialize_enum(cls, key, value, annotation):
except Exception:
return value

@classmethod
def _deserialize_datetime(cls, key, value, annotation):
try:
return datetime.fromisoformat(value.replace('Z', '+00:00'))
except Exception:
return value

@classmethod
def _deserialize_date(cls, key, value, annotation):
try:
return date.fromisoformat(value)
except Exception:
return value

@classmethod
def _deserialize_nested_type(cls, key, value, annotation):
try:
Expand Down
21 changes: 21 additions & 0 deletions box_sdk_gen/internal/utils.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import base64
import datetime
import hashlib
import os
import uuid
Expand Down Expand Up @@ -276,3 +277,23 @@ def create_jwt_assertion(claims: dict, key: JwtKey, options: JwtSignOptions) ->
algorithm=options.algorithm,
headers={'kid': options.keyid},
)


Date = datetime.date
DateTime = datetime.datetime


def date_to_string(date: Date) -> str:
return date.isoformat()


def date_from_string(date: str) -> Date:
return Date.fromisoformat(date)


def date_time_to_string(date_time: DateTime) -> str:
return date_time.isoformat().replace('+00:00', 'Z')


def date_time_from_string(date_time: str) -> DateTime:
return DateTime.fromisoformat(date_time.replace('Z', '+00:00'))
10 changes: 6 additions & 4 deletions box_sdk_gen/managers/events.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@

from box_sdk_gen.internal.utils import ByteStream

from box_sdk_gen.internal.utils import DateTime

from box_sdk_gen.serialization.json.json_data import sd_to_json

from box_sdk_gen.networking.fetch import FetchOptions
Expand Down Expand Up @@ -194,8 +196,8 @@ def get_events(
stream_position: Optional[str] = None,
limit: Optional[int] = None,
event_type: Optional[List[GetEventsEventType]] = None,
created_after: Optional[str] = None,
created_before: Optional[str] = None,
created_after: Optional[DateTime] = None,
created_before: Optional[DateTime] = None,
extra_headers: Optional[Dict[str, Optional[str]]] = None
) -> Events:
"""
Expand Down Expand Up @@ -263,11 +265,11 @@ def get_events(
:param created_after: The lower bound date and time to return events for. This can only be used
when requesting the events with a `stream_type` of `admin_logs`. For any
other `stream_type` this value will be ignored., defaults to None
:type created_after: Optional[str], optional
:type created_after: Optional[DateTime], optional
:param created_before: The upper bound date and time to return events for. This can only be used
when requesting the events with a `stream_type` of `admin_logs`. For any
other `stream_type` this value will be ignored., defaults to None
:type created_before: Optional[str], optional
:type created_before: Optional[DateTime], optional
:param extra_headers: Extra headers that will be included in the HTTP request., defaults to None
:type extra_headers: Optional[Dict[str, Optional[str]]], optional
"""
Expand Down
10 changes: 6 additions & 4 deletions box_sdk_gen/managers/file_requests.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@

from box_sdk_gen.serialization.json.serializer import serialize

from box_sdk_gen.internal.utils import DateTime

from box_sdk_gen.schemas import FileRequest

from box_sdk_gen.schemas import ClientError
Expand Down Expand Up @@ -139,7 +141,7 @@ def update_file_request_by_id(
status: Optional[UpdateFileRequestByIdStatus] = None,
is_email_required: Optional[bool] = None,
is_description_required: Optional[bool] = None,
expires_at: Optional[str] = None,
expires_at: Optional[DateTime] = None,
if_match: Optional[str] = None,
extra_headers: Optional[Dict[str, Optional[str]]] = None
) -> FileRequest:
Expand Down Expand Up @@ -199,7 +201,7 @@ def update_file_request_by_id(
`inactive`.
This will default to the value on the existing file request., defaults to None
:type expires_at: Optional[str], optional
:type expires_at: Optional[DateTime], optional
:param if_match: Ensures this item hasn't recently changed before
making changes.
Expand Down Expand Up @@ -295,7 +297,7 @@ def create_file_request_copy(
status: Optional[CreateFileRequestCopyStatus] = None,
is_email_required: Optional[bool] = None,
is_description_required: Optional[bool] = None,
expires_at: Optional[str] = None,
expires_at: Optional[DateTime] = None,
extra_headers: Optional[Dict[str, Optional[str]]] = None
) -> FileRequest:
"""
Expand Down Expand Up @@ -356,7 +358,7 @@ def create_file_request_copy(
`inactive`.
This will default to the value on the existing file request., defaults to None
:type expires_at: Optional[str], optional
:type expires_at: Optional[DateTime], optional
:param extra_headers: Extra headers that will be included in the HTTP request., defaults to None
:type extra_headers: Optional[Dict[str, Optional[str]]], optional
"""
Expand Down
14 changes: 8 additions & 6 deletions box_sdk_gen/managers/files.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@

from box_sdk_gen.serialization.json.json_data import SerializedData

from box_sdk_gen.internal.utils import DateTime


class UpdateFileByIdParent(BaseObject):
def __init__(self, *, id: Optional[str] = None, **kwargs):
Expand Down Expand Up @@ -74,7 +76,7 @@ def __init__(
access: Optional[UpdateFileByIdSharedLinkAccessField] = None,
password: Optional[str] = None,
vanity_name: Optional[str] = None,
unshared_at: Optional[str] = None,
unshared_at: Optional[DateTime] = None,
permissions: Optional[UpdateFileByIdSharedLinkPermissionsField] = None,
**kwargs
):
Expand Down Expand Up @@ -108,7 +110,7 @@ def __init__(
:param unshared_at: The timestamp at which this shared link will
expire. This field can only be set by
users with paid accounts., defaults to None
:type unshared_at: Optional[str], optional
:type unshared_at: Optional[DateTime], optional
"""
super().__init__(**kwargs)
self.access = access
Expand All @@ -127,15 +129,15 @@ def __init__(
self,
*,
access: Optional[UpdateFileByIdLockAccessField] = None,
expires_at: Optional[str] = None,
expires_at: Optional[DateTime] = None,
is_download_prevented: Optional[bool] = None,
**kwargs
):
"""
:param access: The type of this object., defaults to None
:type access: Optional[UpdateFileByIdLockAccessField], optional
:param expires_at: Defines the time at which the lock expires., defaults to None
:type expires_at: Optional[str], optional
:type expires_at: Optional[DateTime], optional
:param is_download_prevented: Defines if the file can be downloaded while it is locked., defaults to None
:type is_download_prevented: Optional[bool], optional
"""
Expand Down Expand Up @@ -326,7 +328,7 @@ def update_file_by_id(
parent: Optional[UpdateFileByIdParent] = None,
shared_link: Optional[UpdateFileByIdSharedLink] = None,
lock: Optional[UpdateFileByIdLock] = None,
disposition_at: Optional[str] = None,
disposition_at: Optional[DateTime] = None,
permissions: Optional[UpdateFileByIdPermissions] = None,
collections: Optional[List[UpdateFileByIdCollections]] = None,
tags: Optional[List[str]] = None,
Expand Down Expand Up @@ -364,7 +366,7 @@ def update_file_by_id(
:type lock: Optional[UpdateFileByIdLock], optional
:param disposition_at: The retention expiration timestamp for the given file. This
date cannot be shortened once set on a file., defaults to None
:type disposition_at: Optional[str], optional
:type disposition_at: Optional[DateTime], optional
:param permissions: Defines who can download a file., defaults to None
:type permissions: Optional[UpdateFileByIdPermissions], optional
:param collections: An array of collections to make this file
Expand Down
6 changes: 4 additions & 2 deletions box_sdk_gen/managers/folders.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@

from box_sdk_gen.serialization.json.json_data import SerializedData

from box_sdk_gen.internal.utils import DateTime


class GetFolderByIdSort(str, Enum):
ID = 'id'
Expand Down Expand Up @@ -94,7 +96,7 @@ def __init__(
access: Optional[UpdateFolderByIdSharedLinkAccessField] = None,
password: Optional[str] = None,
vanity_name: Optional[str] = None,
unshared_at: Optional[str] = None,
unshared_at: Optional[DateTime] = None,
permissions: Optional[UpdateFolderByIdSharedLinkPermissionsField] = None,
**kwargs
):
Expand Down Expand Up @@ -128,7 +130,7 @@ def __init__(
:param unshared_at: The timestamp at which this shared link will
expire. This field can only be set by
users with paid accounts., defaults to None
:type unshared_at: Optional[str], optional
:type unshared_at: Optional[DateTime], optional
"""
super().__init__(**kwargs)
self.access = access
Expand Down
10 changes: 6 additions & 4 deletions box_sdk_gen/managers/legal_hold_policies.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@

from box_sdk_gen.serialization.json.json_data import SerializedData

from box_sdk_gen.internal.utils import DateTime


class LegalHoldPoliciesManager:
def __init__(
Expand Down Expand Up @@ -115,8 +117,8 @@ def create_legal_hold_policy(
policy_name: str,
*,
description: Optional[str] = None,
filter_started_at: Optional[str] = None,
filter_ended_at: Optional[str] = None,
filter_started_at: Optional[DateTime] = None,
filter_ended_at: Optional[DateTime] = None,
is_ongoing: Optional[bool] = None,
extra_headers: Optional[Dict[str, Optional[str]]] = None
) -> LegalHoldPolicy:
Expand All @@ -135,7 +137,7 @@ def create_legal_hold_policy(
files, will ignore the date filter.
Required if `is_ongoing` is set to `false`., defaults to None
:type filter_started_at: Optional[str], optional
:type filter_started_at: Optional[DateTime], optional
:param filter_ended_at: The filter end date.
When this policy is applied using a `custodian` legal
Expand All @@ -145,7 +147,7 @@ def create_legal_hold_policy(
files, will ignore the date filter.
Required if `is_ongoing` is set to `false`., defaults to None
:type filter_ended_at: Optional[str], optional
:type filter_ended_at: Optional[DateTime], optional
:param is_ongoing: Whether new assignments under this policy should
continue applying to files even after initialization.
Expand Down
10 changes: 6 additions & 4 deletions box_sdk_gen/managers/shared_links_files.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@

from box_sdk_gen.serialization.json.json_data import SerializedData

from box_sdk_gen.internal.utils import DateTime


class AddShareLinkToFileSharedLinkAccessField(str, Enum):
OPEN = 'open'
Expand Down Expand Up @@ -83,7 +85,7 @@ def __init__(
access: Optional[AddShareLinkToFileSharedLinkAccessField] = None,
password: Optional[str] = None,
vanity_name: Optional[str] = None,
unshared_at: Optional[str] = None,
unshared_at: Optional[DateTime] = None,
permissions: Optional[AddShareLinkToFileSharedLinkPermissionsField] = None,
**kwargs
):
Expand Down Expand Up @@ -119,7 +121,7 @@ def __init__(
expire. This field can only be set by
users with paid accounts. The value must be greater than the
current date and time., defaults to None
:type unshared_at: Optional[str], optional
:type unshared_at: Optional[DateTime], optional
"""
super().__init__(**kwargs)
self.access = access
Expand Down Expand Up @@ -173,7 +175,7 @@ def __init__(
access: Optional[UpdateSharedLinkOnFileSharedLinkAccessField] = None,
password: Optional[str] = None,
vanity_name: Optional[str] = None,
unshared_at: Optional[str] = None,
unshared_at: Optional[DateTime] = None,
permissions: Optional[UpdateSharedLinkOnFileSharedLinkPermissionsField] = None,
**kwargs
):
Expand Down Expand Up @@ -209,7 +211,7 @@ def __init__(
expire. This field can only be set by
users with paid accounts. The value must be greater than the
current date and time., defaults to None
:type unshared_at: Optional[str], optional
:type unshared_at: Optional[DateTime], optional
"""
super().__init__(**kwargs)
self.access = access
Expand Down
10 changes: 6 additions & 4 deletions box_sdk_gen/managers/shared_links_folders.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@

from box_sdk_gen.serialization.json.json_data import SerializedData

from box_sdk_gen.internal.utils import DateTime


class AddShareLinkToFolderSharedLinkAccessField(str, Enum):
OPEN = 'open'
Expand Down Expand Up @@ -80,7 +82,7 @@ def __init__(
access: Optional[AddShareLinkToFolderSharedLinkAccessField] = None,
password: Optional[str] = None,
vanity_name: Optional[str] = None,
unshared_at: Optional[str] = None,
unshared_at: Optional[DateTime] = None,
permissions: Optional[AddShareLinkToFolderSharedLinkPermissionsField] = None,
**kwargs
):
Expand Down Expand Up @@ -116,7 +118,7 @@ def __init__(
expire. This field can only be set by
users with paid accounts. The value must be greater than the
current date and time., defaults to None
:type unshared_at: Optional[str], optional
:type unshared_at: Optional[DateTime], optional
"""
super().__init__(**kwargs)
self.access = access
Expand Down Expand Up @@ -167,7 +169,7 @@ def __init__(
access: Optional[UpdateSharedLinkOnFolderSharedLinkAccessField] = None,
password: Optional[str] = None,
vanity_name: Optional[str] = None,
unshared_at: Optional[str] = None,
unshared_at: Optional[DateTime] = None,
permissions: Optional[
UpdateSharedLinkOnFolderSharedLinkPermissionsField
] = None,
Expand Down Expand Up @@ -205,7 +207,7 @@ def __init__(
expire. This field can only be set by
users with paid accounts. The value must be greater than the
current date and time., defaults to None
:type unshared_at: Optional[str], optional
:type unshared_at: Optional[DateTime], optional
"""
super().__init__(**kwargs)
self.access = access
Expand Down
Loading

0 comments on commit f73dcd5

Please sign in to comment.