Skip to content

Commit

Permalink
feat(python): separated __init__ files
Browse files Browse the repository at this point in the history
  • Loading branch information
v.kozyar committed Feb 22, 2024
1 parent c03b665 commit a029fcb
Show file tree
Hide file tree
Showing 5 changed files with 131 additions and 90 deletions.
16 changes: 4 additions & 12 deletions flipt-python/flipt/__init__.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,5 @@
import typing
from .evaluation import Evaluation
from .authentication import AuthenticationStrategy
from .sync_client import FliptClient


class FliptClient:
def __init__(
self,
url: str = "http://localhost:8080",
timeout: int = 60,
authentication: typing.Optional[AuthenticationStrategy] = None,
):
self.evaluation = Evaluation(url, timeout, authentication)
__all__ = [
'FliptClient',
]
98 changes: 20 additions & 78 deletions flipt-python/flipt/evaluation/__init__.py
Original file line number Diff line number Diff line change
@@ -1,85 +1,27 @@
import httpx
import typing
import json
from .models import (
BatchEvaluationRequest,
BatchEvaluationResponse,
BooleanEvaluationResponse,
ErrorEvaluationReason,
ErrorEvaluationResponse,
EvaluationReason,
EvaluationRequest,
EvaluationResponse,
EvaluationResponseType,
VariantEvaluationResponse,
)
from ..authentication import AuthenticationStrategy


class Evaluation:
def __init__(
self,
url: str,
timeout: int,
authentication: typing.Optional[AuthenticationStrategy] = None,
):
self.url = url
self.headers = {}
self.timeout = timeout
if authentication:
authentication.authenticate(self.headers)

def variant(self, request: EvaluationRequest) -> VariantEvaluationResponse:
response = httpx.post(
f"{self.url}/evaluate/v1/variant",
headers=self.headers,
json=request.model_dump(),
timeout=self.timeout,
)

if response.status_code != 200:
body = response.json()
message = "internal error"

if "message" in body:
message = body["message"]

raise Exception(message)

variant_response = json.dumps(response.json()).encode("utf-8")
return VariantEvaluationResponse.model_validate_json(variant_response)

def boolean(self, request: EvaluationRequest) -> BooleanEvaluationResponse:
response = httpx.post(
f"{self.url}/evaluate/v1/boolean",
headers=self.headers,
json=request.model_dump(),
timeout=self.timeout,
)

if response.status_code != 200:
body = response.json()
message = "internal error"

if "message" in body:
message = body["message"]

raise Exception(message)

boolean_response = json.dumps(response.json()).encode("utf-8")
return BooleanEvaluationResponse.model_validate_json(boolean_response)

def batch(self, request: BatchEvaluationRequest) -> BatchEvaluationResponse:
response = httpx.post(
f"{self.url}/evaluate/v1/batch",
headers=self.headers,
json=request.model_dump(),
timeout=self.timeout,
)

if response.status_code != 200:
body = response.json()
message = "internal error"

if "message" in body:
message = body["message"]

raise Exception(message)

batch_response = json.dumps(response.json()).encode("utf-8")
return BatchEvaluationResponse.model_validate_json(batch_response)
from .sync_evaluation_client import Evaluation

__all__ = [
'Evaluation',
'EvaluationResponseType',
'EvaluationReason',
'ErrorEvaluationReason',
'EvaluationRequest',
'BatchEvaluationRequest',
'VariantEvaluationResponse',
'BooleanEvaluationResponse',
'ErrorEvaluationResponse',
'EvaluationResponse',
'BatchEvaluationResponse',
]
74 changes: 74 additions & 0 deletions flipt-python/flipt/evaluation/sync_evaluation_client.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
from http import HTTPStatus

import httpx

from ..authentication import AuthenticationStrategy
from ..exceptions import FliptApiError
from .models import (
BatchEvaluationRequest,
BatchEvaluationResponse,
BooleanEvaluationResponse,
EvaluationRequest,
VariantEvaluationResponse,
)


class Evaluation:
def __init__(
self,
url: str,
authentication: AuthenticationStrategy | None = None,
httpx_client: httpx.Client | None = None,
):
self.url = url
self.headers: dict[str, str] = {}

self._client = httpx_client or httpx.Client()

if authentication:
authentication.authenticate(self.headers)

def close(self) -> None:
self._client.close()

def variant(self, request: EvaluationRequest) -> VariantEvaluationResponse:
response = self._client.post(
f"{self.url}/evaluate/v1/variant",
headers=self.headers,
json=request.model_dump(),
)

if response.status_code != 200:
body = response.json()
message = body.get("message", HTTPStatus(response.status_code).description)
raise FliptApiError(message, response.status_code)

return VariantEvaluationResponse.model_validate_json(response.text)

def boolean(self, request: EvaluationRequest) -> BooleanEvaluationResponse:
response = self._client.post(
f"{self.url}/evaluate/v1/boolean",
headers=self.headers,
json=request.model_dump(),
)

if response.status_code != 200:
body = response.json()
message = body.get("message", HTTPStatus(response.status_code).description)
raise FliptApiError(message, response.status_code)

return BooleanEvaluationResponse.model_validate_json(response.text)

def batch(self, request: BatchEvaluationRequest) -> BatchEvaluationResponse:
response = self._client.post(
f"{self.url}/evaluate/v1/batch",
headers=self.headers,
json=request.model_dump(),
)

if response.status_code != 200:
body = response.json()
message = body.get("message", HTTPStatus(response.status_code).description)
raise FliptApiError(message, response.status_code)

return BatchEvaluationResponse.model_validate_json(response.text)
14 changes: 14 additions & 0 deletions flipt-python/flipt/exceptions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
class BaseFliptError(Exception):
pass


class FliptApiError(BaseFliptError):
message: str
status_code: int

def __init__(self, message: str, status_code: int):
self.message = message
self.status_code = status_code

def __repr__(self) -> str:
return f"<FliptApiError(message={self.message}, status_code={self.status_code})>"
19 changes: 19 additions & 0 deletions flipt-python/flipt/sync_client.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import httpx

from .authentication import AuthenticationStrategy
from .evaluation import Evaluation


class FliptClient:
def __init__(
self,
url: str = "http://localhost:8080",
timeout: int = 60,
authentication: AuthenticationStrategy | None = None,
):
self.httpx_client = httpx.Client(timeout=timeout)

self.evaluation = Evaluation(url, authentication, self.httpx_client)

def close(self) -> None:
self.httpx_client.close()

0 comments on commit a029fcb

Please sign in to comment.