Skip to content
Open
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
3 changes: 2 additions & 1 deletion visual_regression_tracker/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,10 @@
from .exceptions import VisualRegressionTrackerError, ServerError, TestRunError, MissingConfigurationError
from .config import Config
from .visualRegressionTracker import VisualRegressionTracker
from .client import Client, ClientConfig

__all__ = [
'Config', 'Build', 'IgnoreArea', 'TestRun', 'TestRunResponse', 'TestRunStatus',
'VisualRegressionTrackerError', 'ServerError', 'TestRunError', 'MissingConfigurationError',
'VisualRegressionTracker',
'VisualRegressionTracker', 'Client', 'ClientConfig',
]
83 changes: 83 additions & 0 deletions visual_regression_tracker/client.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
import dataclasses

from visual_regression_tracker import types
from visual_regression_tracker.visualRegressionTracker import _http_request

from .config import _from_dict


@dataclasses.dataclass
class ClientConfig:
project: str
email: str
password: str
apiUrl: str = "http://localhost:4200"


class Client:
def __init__(self, config: ClientConfig):
"""
Creates a new Client

:param config: The configuration to use.
"""
self.config = config
# retrieve token
response = _http_request(
f"{self.config.apiUrl}/users/login",
"post",
data={
"email": self.config.email,
"password": self.config.password,
},
headers={},
)
self.headers = {"Authorization": f"Bearer {response['token']}"}
# retrieve project id
self.project = self.get_project(self.config.project)

def get_projects(self) -> list[types.Project]:
response = _http_request(
f"{self.config.apiUrl}/projects",
"get",
data={},
headers=self.headers,
)
projects = [_from_dict(item, types.Project) for item in response]
return projects

def get_project(self, name: str) -> types.Project:
projects = self.get_projects()
for project in projects:
if project.name == name:
return project
raise ValueError(f'Project with name "{name}" not found.')

def get_builds(self) -> list[types.Build]:
response = _http_request(
f"{self.config.apiUrl}/builds?projectId={self.project.id}&take=1000&skip=0",
"get",
data={},
headers=self.headers,
)
builds = [_from_dict(item, types.Build) for item in response["data"]]
return builds

def get_build(
self, id: str | None = None, ciBuildId: str | None = None
) -> types.Build:
if (id is None) == (ciBuildId is None):
raise ValueError("Either 'id' or 'ciBuildId' must be provided.")
builds = self.get_builds()
for build in builds:
if (
id is not None
and build.id == id
or ciBuildId is not None
and build.ciBuildId == ciBuildId
):
return build
if id is not None:
raise ValueError(f'Build with id "{id}" not found.')
else:
raise ValueError(f'Build with ciBuildId "{ciBuildId}" not found.')
7 changes: 7 additions & 0 deletions visual_regression_tracker/types.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,17 @@ class TestRun:
ignoreAreas: typing.List[IgnoreArea] = None


@dataclasses.dataclass
class Project:
id: str = None
name: str = None

@dataclasses.dataclass
class Build:
id: str = None
ciBuildId: str | None = None
projectId: str = None
status: str = None


class TestRunStatus(enum.Enum):
Expand Down