Compare commits

..

1 Commits

Author SHA1 Message Date
Jonathon Broughton 89280acf53 Update fixtures.py
Minor upgrade of ruff breaks without this fix
2025-02-10 14:57:26 +00:00
13 changed files with 715 additions and 737 deletions
-2
View File
@@ -2,8 +2,6 @@
.envrc
reports/
.volumes/
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
+1 -1
View File
@@ -18,7 +18,7 @@ repos:
- id: isort
- repo: https://github.com/psf/black
rev: 25.1.0
rev: 24.10.0
hooks:
- id: black
# It is recommended to specify the latest version of Python
+14 -6
View File
@@ -6,14 +6,14 @@ services:
# Speckle Server dependencies
#######
postgres:
image: "postgres:16.4-alpine3.20@sha256:d898b0b78a2627cb4ee63464a14efc9d296884f1b28c841b0ab7d7c42f1fffdf"
image: "postgres:14.5-alpine"
restart: always
environment:
POSTGRES_DB: speckle
POSTGRES_USER: speckle
POSTGRES_PASSWORD: speckle
volumes:
- ./.volumes/postgres-data:/var/lib/postgresql/data/
- postgres-data:/var/lib/postgresql/data/
healthcheck:
# the -U user has to match the POSTGRES_USER value
test: ["CMD-SHELL", "pg_isready -U speckle"]
@@ -25,7 +25,7 @@ services:
image: "redis:6.0-alpine"
restart: always
volumes:
- ./.volumes/redis-data:/data
- redis-data:/data
healthcheck:
test: ["CMD", "redis-cli", "--raw", "incr", "ping"]
interval: 5s
@@ -37,7 +37,7 @@ services:
command: server /data --console-address ":9001"
restart: always
volumes:
- ./.volumes/minio-data:/data
- minio-data:/data
healthcheck:
test:
[
@@ -49,6 +49,16 @@ services:
retries: 30
start_period: 10s
####
# Speckle Server
#######
speckle-frontend:
image: speckle/speckle-frontend-2:latest
restart: always
ports:
- "0.0.0.0:8080:8080"
speckle-server:
image: speckle/speckle-server:latest
restart: always
@@ -75,7 +85,6 @@ services:
# TODO: Change this to the URL of the speckle server, as accessed from the network
CANONICAL_URL: "http://127.0.0.1:8080"
SPECKLE_AUTOMATE_URL: "http://127.0.0.1:3030"
FRONTEND_ORIGIN: "http://127.0.0.1:8081"
# TODO: Change thvolumes:
REDIS_URL: "redis://redis"
@@ -100,7 +109,6 @@ services:
POSTGRES_PASSWORD: "speckle"
POSTGRES_DB: "speckle"
ENABLE_MP: "false"
FRONTEND_ORIGIN: "http://127.0.0.1:8080"
networks:
default:
Generated
+644 -649
View File
File diff suppressed because it is too large Load Diff
+3 -2
View File
@@ -9,8 +9,8 @@ repository = "https://github.com/specklesystems/speckle-py"
documentation = "https://speckle.guide/dev/py-examples.html"
homepage = "https://speckle.systems/"
packages = [
{ include = "specklepy", from = "src" },
{ include = "speckle_automate", from = "src" },
{ include = "specklepy", from = "src" },
{ include = "speckle_automate", from = "src" },
]
@@ -21,6 +21,7 @@ appdirs = "^1.4.4"
gql = { extras = ["requests", "websockets"], version = "^3.3.0" }
ujson = "^5.3.0"
Deprecated = "^1.2.13"
stringcase = "^1.2.0"
attrs = "^23.1.0"
httpx = "^0.25.0"
+4 -4
View File
@@ -22,10 +22,10 @@ class TestAutomationEnvironment(BaseSettings):
extra="ignore",
)
token: str = Field()
server_url: str = Field()
project_id: str = Field()
automation_id: str = Field()
token: str = Field(default="")
server_url: str = Field(default="")
project_id: str = Field(default="")
automation_id: str = Field(default="")
@pytest.fixture()
+4 -4
View File
@@ -4,13 +4,13 @@ from enum import Enum
from typing import Any, Dict, List, Literal, Optional
from pydantic import BaseModel, ConfigDict, Field
from pydantic.alias_generators import to_camel
from stringcase import camelcase
class AutomateBase(BaseModel):
"""Use this class as a base model for automate related DTO."""
model_config = ConfigDict(alias_generator=to_camel, populate_by_name=True)
model_config = ConfigDict(alias_generator=camelcase, populate_by_name=True)
class VersionCreationTriggerPayload(AutomateBase):
@@ -39,7 +39,7 @@ class AutomationRunData(BaseModel):
triggers: List[VersionCreationTrigger]
model_config = ConfigDict(
alias_generator=to_camel, populate_by_name=True, protected_namespaces=()
alias_generator=camelcase, populate_by_name=True, protected_namespaces=()
)
@@ -52,7 +52,7 @@ class TestAutomationRunData(BaseModel):
triggers: List[VersionCreationTrigger]
model_config = ConfigDict(
alias_generator=to_camel, populate_by_name=True, protected_namespaces=()
alias_generator=camelcase, populate_by_name=True, protected_namespaces=()
)
+1 -2
View File
@@ -4,8 +4,7 @@ from enum import Enum
class ProjectVisibility(str, Enum):
PRIVATE = "PRIVATE"
PUBLIC = "PUBLIC"
UNLISTED = "UNLISTED"
WORKSPACE = "WORKSPACE"
UNLISTEd = "UNLISTED"
class UserProjectsUpdatedMessageType(str, Enum):
+2 -2
View File
@@ -16,7 +16,7 @@ from typing import (
)
from warnings import warn
from pydantic.alias_generators import to_pascal
from stringcase import pascalcase
from specklepy.logging.exceptions import SpeckleException, SpeckleInvalidUnitException
from specklepy.objects.units import Units
@@ -148,7 +148,7 @@ class _RegisteringBase:
# convert the module names to PascalCase to match c# namespace naming convention
# also drop specklepy from the beginning
namespace = ".".join(
to_pascal(m)
pascalcase(m)
for m in filter(lambda name: name != "specklepy", cls.__module__.split("."))
)
return f"{namespace}.{cls.__name__}"
+1 -6
View File
@@ -86,12 +86,6 @@ class ServerTransport(AbstractTransport):
self.session = requests.Session()
self.session.headers.update(
{
"Accept": "text/plain",
}
)
if self.account is not None:
self._batch_sender = BatchSender(
self.url, self.stream_id, self.account.token, max_batch_size_mb=1
@@ -99,6 +93,7 @@ class ServerTransport(AbstractTransport):
self.session.headers.update(
{
"Authorization": f"Bearer {self.account.token}",
"Accept": "text/plain",
}
)
@@ -3,7 +3,6 @@ from typing import Optional
import pytest
from specklepy.api.client import SpeckleClient
from specklepy.core.api.enums import ProjectVisibility
from specklepy.core.api.inputs.project_inputs import (
ProjectCreateInput,
ProjectInviteCreateInput,
@@ -23,9 +22,7 @@ class TestProjectInviteResource:
@pytest.fixture
def project(self, client: SpeckleClient):
return client.project.create(
ProjectCreateInput(
name="test", description=None, visibility=ProjectVisibility.PUBLIC
)
ProjectCreateInput(name="test", description=None, visibility=None)
)
@pytest.fixture
@@ -27,7 +27,6 @@ class TestProjectResource:
"name, description, visibility",
[
("Very private project", "My secret project", ProjectVisibility.PRIVATE),
("Very discoverable project", None, ProjectVisibility.UNLISTED),
("Very public project", None, ProjectVisibility.PUBLIC),
],
)
@@ -49,11 +48,7 @@ class TestProjectResource:
assert result.id is not None
assert result.name == name
assert result.description == (description or "")
# we've disabled creation of public projects for now, they fall back to unlisted
if visibility == ProjectVisibility.UNLISTED:
assert result.visibility == ProjectVisibility.PUBLIC
else:
assert result.visibility == visibility
assert result.visibility == visibility
def test_project_get(self, client: SpeckleClient, test_project: Project):
result = client.project.get(test_project.id)
@@ -68,7 +63,7 @@ class TestProjectResource:
def test_project_update(self, client: SpeckleClient, test_project: Project):
new_name = "MY new name"
new_description = "MY new desc"
new_visibility = ProjectVisibility.UNLISTED
new_visibility = ProjectVisibility.PUBLIC
update_data = ProjectUpdateInput(
id=test_project.id,
@@ -83,11 +78,7 @@ class TestProjectResource:
assert updated_project.id == test_project.id
assert updated_project.name == new_name
assert updated_project.description == new_description
# we've disabled creation of public projects for now, they fall back to unlisted
if new_visibility == ProjectVisibility.UNLISTED:
assert updated_project.visibility == ProjectVisibility.PUBLIC
else:
assert updated_project.visibility == new_visibility
assert updated_project.visibility == new_visibility
def test_project_delete(self, client: SpeckleClient):
"""Test deleting a project."""
@@ -1,58 +1,52 @@
import pytest
from specklepy.api.client import SpeckleClient
from specklepy.api.models import ServerInfo
@pytest.fixture(scope="module")
def token_info():
return {
"token": None,
"name": "super secret token",
"scopes": ["streams:read", "streams:write"],
"lifespan": 9001,
}
class TestServer:
@pytest.fixture(scope="module")
def token_info(self):
return {
"token": None,
"name": "super secret token",
"scopes": ["streams:read", "streams:write"],
"lifespan": 9001,
}
def test_server_get(self, client: SpeckleClient):
server = client.server.get()
# @pytest.skip(
# "Docker yml file is not configured to return the canonical url properly enough for server.get to fetch the fe2 headers"
# )
# def test_server_get(client: SpeckleClient):
# server = client.server.get()
assert isinstance(server, ServerInfo)
assert isinstance(server.frontend2, bool)
# assert isinstance(server, ServerInfo)
# assert isinstance(server.frontend2, bool)
def test_server_version(self, client: SpeckleClient):
version = client.server.version()
assert isinstance(version, tuple)
if len(version) == 1:
assert version[0] == "dev"
else:
assert isinstance(version[0], int)
assert len(version) >= 3
def test_server_version(client: SpeckleClient):
version = client.server.version()
def test_server_apps(self, client: SpeckleClient):
apps = client.server.apps()
assert isinstance(version, tuple)
if len(version) == 1:
assert version[0] == "dev"
else:
assert isinstance(version[0], int)
assert len(version) >= 3
assert isinstance(apps, list)
assert len(apps) >= 1
assert any(app["name"] == "Speckle Web Manager" for app in apps)
def test_server_create_token(self, client, token_info):
token_info["token"] = client.server.create_token(
name=token_info["name"],
scopes=token_info["scopes"],
lifespan=token_info["lifespan"],
)
def test_server_apps(client: SpeckleClient):
apps = client.server.apps()
assert isinstance(token_info["token"], str)
assert isinstance(apps, list)
assert len(apps) >= 1
assert any(app["name"] == "Speckle Web Manager" for app in apps)
def test_server_revoke_token(self, client, token_info):
revoked = client.server.revoke_token(token=token_info["token"])
def test_server_create_token(client, token_info):
token_info["token"] = client.server.create_token(
name=token_info["name"],
scopes=token_info["scopes"],
lifespan=token_info["lifespan"],
)
assert isinstance(token_info["token"], str)
def test_server_revoke_token(client, token_info):
revoked = client.server.revoke_token(token=token_info["token"])
assert revoked is True
assert revoked is True