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

Update structure, some names and imports #59

Closed
wants to merge 53 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
36835b8
Bump generator to 1.10.1
andrii-balitskyi May 7, 2024
fc1f19c
ci: Generate code
seambot May 7, 2024
7c8b2c1
Fix tests
andrii-balitskyi May 7, 2024
2d3e347
Bump generator to 1.10.2
andrii-balitskyi May 7, 2024
3ce4f0d
ci: Generate code
seambot May 7, 2024
b7bd046
Remove unnecessary import
andrii-balitskyi May 8, 2024
9d91987
Bump generator to 1.10.3 to fix circular imports with a separate file…
andrii-balitskyi May 8, 2024
37aafe7
ci: Generate code
seambot May 8, 2024
388d041
Add SeamMultiWorkspace
andrii-balitskyi May 8, 2024
2e29968
Add constants.py
andrii-balitskyi May 8, 2024
db19b7b
Add get_endpoint helper fn
andrii-balitskyi May 8, 2024
1d73c44
Add RequestMixin to define common make_request method
andrii-balitskyi May 8, 2024
9276aad
ci: Format code
seambot May 8, 2024
eac1681
Disable generate workflow
andrii-balitskyi May 8, 2024
9d27312
Add abstract classes, add helper for getting PAT, fix create ws test
andrii-balitskyi May 8, 2024
7529238
Enforce keyword only args in WorkspacesProxy methods
andrii-balitskyi May 9, 2024
89dfdb5
Merge branch 'main' of github.com:seamapi/python-next into seam-multi…
andrii-balitskyi May 9, 2024
6373714
Define WorkspacesProxy outside SeamMultiWorkspace
andrii-balitskyi May 10, 2024
231e60b
Fix proxy class usage
andrii-balitskyi May 10, 2024
38afb49
Add SeamHttpClient class
andrii-balitskyi May 14, 2024
50c7b7f
Adjust the routest to test new requests.Session
andrii-balitskyi May 14, 2024
5389a7a
Remove .yalc files
andrii-balitskyi May 15, 2024
f7a96c0
Remove yalc.lock
andrii-balitskyi May 15, 2024
10330ab
Update seam http client to inherit from requests.Session with custom …
andrii-balitskyi May 15, 2024
9a86df8
Remove endpoint rfom route clients as it's baked in the http client
andrii-balitskyi May 15, 2024
2989550
Mark certain files as not generated
andrii-balitskyi May 15, 2024
e04798e
Fix client_options default value to fix linting
andrii-balitskyi May 15, 2024
0582b6f
Merge branch 'main' of github.com:seamapi/python-next into request-se…
andrii-balitskyi May 16, 2024
5ebe841
Remove AbstractRequestMixin
andrii-balitskyi May 16, 2024
adb64da
Swap requests for niquests
andrii-balitskyi May 16, 2024
893d48b
Uncomment innit imports
andrii-balitskyi May 16, 2024
6233153
Remove duplicat SeamApiException definition
andrii-balitskyi May 16, 2024
e5cf412
Add docstring for client and client_options
andrii-balitskyi May 16, 2024
f9e888c
Revert generate-routes script
andrii-balitskyi May 16, 2024
e1af1de
Revert package.json
andrii-balitskyi May 16, 2024
257321f
Add AbstractSeamHttpClient
andrii-balitskyi May 17, 2024
b1deeb2
Update client_options docstring
andrii-balitskyi May 17, 2024
0b77f91
Add seam/exceptions.py
andrii-balitskyi May 17, 2024
3648637
Bump generator to 1.11.1 to update imports and structure
andrii-balitskyi May 17, 2024
dd0768b
Update generator's tarball link
andrii-balitskyi May 17, 2024
be94343
ci: Generate code
seambot May 17, 2024
2c66246
Add deep_attr_dict to /seam/utils
andrii-balitskyi May 17, 2024
710edff
Renam types.py to models.py
andrii-balitskyi May 17, 2024
e40ae9e
Update top level imports
andrii-balitskyi May 17, 2024
e905135
Remove seam/types.py, use seam/models.py
andrii-balitskyi May 17, 2024
3ddcdd4
Update test/events/test_events.py import
andrii-balitskyi May 17, 2024
ed6bfe2
Update response type on SeamApiException
andrii-balitskyi May 17, 2024
6d62541
Move SeamApiException to exceptions.py and update imports
andrii-balitskyi May 17, 2024
089e262
Update imports in tests
andrii-balitskyi May 20, 2024
3c31b65
More relative imports
andrii-balitskyi May 20, 2024
5555974
Merge branch 'main' of github.com:seamapi/python-next into request-se…
andrii-balitskyi May 21, 2024
a4a29f1
Merge branch 'main' of github.com:seamapi/python-next into update-str…
andrii-balitskyi May 21, 2024
ccdafe2
Merge branch 'request-session' of github.com:seamapi/python-next into…
andrii-balitskyi May 21, 2024
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 .github/workflows/generate.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ name: Generate
on:
push:
branches-ignore:
- main
- '**'
workflow_dispatch: {}

jobs:
Expand Down
8 changes: 4 additions & 4 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
"format": "prettier --write --ignore-path .gitignore ."
},
"devDependencies": {
"@seamapi/nextlove-sdk-generator": "1.11.0",
"@seamapi/nextlove-sdk-generator": "1.11.1",
"@seamapi/types": "1.172.0",
"del": "^7.1.0",
"prettier": "^3.2.5"
Expand Down
338 changes: 298 additions & 40 deletions poetry.lock

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ repository = "https://github.com/seamapi/python-next"
[tool.poetry.dependencies]
python = "^3.9.0"
dataclasses-json = "^0.6.4"
requests = "^2.26.0"
niquests = "^3.6.4"

[tool.poetry.group.dev.dependencies]
black = "^24.3.0"
Expand Down
12 changes: 6 additions & 6 deletions seam/__init__.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
# flake8: noqa
# type: ignore

from seam.seam import Seam
from seam.types import SeamHttpApiError
from seam.seam_multi_workspace import SeamMultiWorkspace
from seam.options import SeamHttpInvalidOptionsError
from seam.auth import SeamHttpInvalidTokenError
from seam.routes.action_attempts import (
from .seam import Seam
from .seam_multi_workspace import SeamMultiWorkspace
from .options import SeamHttpInvalidOptionsError
from .auth import SeamHttpInvalidTokenError
from .exceptions import (
SeamHttpApiError,
SeamActionAttemptError,
SeamActionAttemptFailedError,
SeamActionAttemptTimeoutError,
Expand Down
4 changes: 2 additions & 2 deletions seam/auth.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
from typing import Optional
from seam.options import (
from .options import (
SeamHttpInvalidOptionsError,
is_seam_http_options_with_api_key,
is_seam_http_options_with_personal_access_token,
)
from seam.token import (
from .token import (
is_jwt,
is_access_token,
is_client_session_token,
Expand Down
43 changes: 43 additions & 0 deletions seam/exceptions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
from niquests import Response
from .routes.models import ActionAttempt


# HTTP
class SeamHttpApiError(Exception):
def __init__(
self,
response: Response,
):
self.status_code = response.status_code
self.request_id = response.headers.get("seam-request-id", None)

self.metadata = None
if "application/json" in response.headers["content-type"]:
parsed_response = response.json()
self.metadata = parsed_response.get("error", None)

super().__init__(
f"SeamApiException: status={self.status_code}, request_id={self.request_id}, metadata={self.metadata}"
)


# Action Attempt
class SeamActionAttemptError(Exception):
def __init__(self, message: str, action_attempt: ActionAttempt):
super().__init__(message)
self.name = self.__class__.__name__
self.action_attempt = action_attempt


class SeamActionAttemptFailedError(SeamActionAttemptError):
def __init__(self, action_attempt: ActionAttempt):
super().__init__(action_attempt.error.message, action_attempt)
self.name = self.__class__.__name__
self.code = action_attempt.error.type


class SeamActionAttemptTimeoutError(SeamActionAttemptError):
def __init__(self, action_attempt: ActionAttempt, timeout: str):
message = f"Timed out waiting for action attempt after {timeout}s"
super().__init__(message, action_attempt)
self.name = self.__class__.__name__
35 changes: 13 additions & 22 deletions seam/types.py → seam/models.py
Original file line number Diff line number Diff line change
@@ -1,35 +1,26 @@
from typing import Any, Dict, List, Optional, Union
from typing import Dict, List, Optional, Union
import niquests as requests
from typing_extensions import Self
import abc

from seam.routes.types import AbstractRoutes, Workspace
from .routes.models import AbstractRoutes, Workspace


class SeamHttpApiError(Exception):
def __init__(
self,
response,
):
self.status_code = response.status_code
self.request_id = response.headers.get("seam-request-id", None)

self.metadata = None
if "application/json" in response.headers["content-type"]:
parsed_response = response.json()
self.metadata = parsed_response.get("error", None)

super().__init__(
f"SeamHttpApiError: status={self.status_code}, request_id={self.request_id}, metadata={self.metadata}"
)
class AbstractSeamHttpClient(abc.ABC):
@abc.abstractmethod
def __init__(self, base_url: str, auth_headers: Dict[str, str], **kwargs):
raise NotImplementedError

@abc.abstractmethod
def request(self, method: str, url: str, *args, **kwargs):
raise NotImplementedError

class AbstractRequestMixin(abc.ABC):
@abc.abstractmethod
def make_request(self, method: str, path: str, **kwargs):
def _handle_response(self, response: requests.Response):
raise NotImplementedError


class AbstractSeam(AbstractRoutes, AbstractRequestMixin):
class AbstractSeam(AbstractRoutes):
lts_version: str
wait_for_action_attempt: Optional[Union[bool, Dict[str, float]]]

Expand Down Expand Up @@ -89,7 +80,7 @@ def list(
raise NotImplementedError()


class AbstractSeamMultiWorkspace(AbstractRequestMixin):
class AbstractSeamMultiWorkspace:
lts_version: str
wait_for_action_attempt: Optional[Union[bool, Dict[str, float]]]

Expand Down
2 changes: 1 addition & 1 deletion seam/options.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import os
from typing import Optional

from seam.constants import DEFAULT_ENDPOINT
from .constants import DEFAULT_ENDPOINT


def get_endpoint(endpoint: Optional[str] = None):
Expand Down
4 changes: 2 additions & 2 deletions seam/parse_options.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import os
from typing import Optional

from seam.auth import get_auth_headers
from seam.options import get_endpoint
from .auth import get_auth_headers
from .options import get_endpoint


def parse_options(
Expand Down
66 changes: 29 additions & 37 deletions seam/request.py
Original file line number Diff line number Diff line change
@@ -1,43 +1,35 @@
import requests
from typing import Dict
from urllib.parse import urljoin
import niquests as requests
from importlib.metadata import version

from seam.types import AbstractRequestMixin, SeamHttpApiError


class RequestMixin(AbstractRequestMixin):
def make_request(self, method: str, path: str, **kwargs):
"""
Makes a request to the API

Parameters
----------
method : str
Request method
path : str
Request path
**kwargs
Keyword arguments passed to requests.request

Raises
------
SeamHttpApiError: If the response status code is not successful.
"""

url = self._endpoint + path
sdk_version = version("seam")
headers = {
**self._auth_headers,
"Content-Type": "application/json",
"User-Agent": "Python SDK v"
+ sdk_version
+ " (https://github.com/seamapi/python-next)",
"seam-sdk-name": "seamapi/python",
"seam-sdk-version": sdk_version,
"seam-lts-version": self.lts_version,
}

response = requests.request(method, url, headers=headers, **kwargs)
from .constants import LTS_VERSION
from .exceptions import SeamHttpApiError
from .models import AbstractSeamHttpClient

SDK_HEADERS = {
"seam-sdk-name": "seamapi/python",
"seam-sdk-version": version("seam"),
"seam-lts-version": LTS_VERSION,
}


class SeamHttpClient(requests.Session, AbstractSeamHttpClient):
def __init__(self, base_url: str, auth_headers: Dict[str, str], **kwargs):
super().__init__(**kwargs)

self.base_url = base_url
headers = {**auth_headers, **kwargs.get("headers", {}), **SDK_HEADERS}

self.headers.update(headers)

def request(self, method, url, *args, **kwargs):
url = urljoin(self.base_url, url)
response = super().request(method, url, *args, **kwargs)

return self._handle_response(response)

def _handle_response(self, response: requests.Response):
if response.status_code != 200:
raise SeamHttpApiError(response)

Expand Down
2 changes: 1 addition & 1 deletion seam/routes/routes.py → seam/routes/__init__.py

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

31 changes: 14 additions & 17 deletions seam/routes/access_codes.py

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 3 additions & 4 deletions seam/routes/access_codes_simulate.py

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading