Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Support datetime in Python (box/box-codegen#459) #95

Closed
wants to merge 5 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .codegen.json
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{ "engineHash": "3d3d072", "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
Loading