Compare commits

...

10 Commits

Author SHA1 Message Date
761f4f2103 Create mail-queue project 2025-10-19 20:29:00 +02:00
dfbb0a8c1f Updated cpl structure model json handling
All checks were successful
Test before pr merge / test-lint (pull_request) Successful in 7s
Build on push / prepare (push) Successful in 12s
Build on push / query (push) Successful in 19s
Build on push / core (push) Successful in 19s
Build on push / cli (push) Successful in 19s
Build on push / dependency (push) Successful in 19s
Build on push / database (push) Successful in 16s
Build on push / application (push) Successful in 17s
Build on push / translation (push) Successful in 19s
Build on push / mail (push) Successful in 22s
Build on push / auth (push) Successful in 15s
Build on push / api (push) Successful in 15s
2025-10-19 20:17:17 +02:00
472aba5990 Removed ws with_parents
All checks were successful
Test before pr merge / test-lint (pull_request) Successful in 7s
Build on push / prepare (push) Successful in 10s
Build on push / query (push) Successful in 19s
Build on push / core (push) Successful in 22s
Build on push / cli (push) Successful in 16s
Build on push / dependency (push) Successful in 19s
Build on push / mail (push) Successful in 17s
Build on push / application (push) Successful in 21s
Build on push / translation (push) Successful in 20s
Build on push / database (push) Successful in 21s
Build on push / auth (push) Successful in 19s
Build on push / api (push) Successful in 15s
2025-10-19 20:03:43 +02:00
9c75008c9f Add cpl-mail project
All checks were successful
Test before pr merge / test-lint (pull_request) Successful in 8s
Build on push / prepare (push) Successful in 10s
Build on push / query (push) Successful in 18s
Build on push / core (push) Successful in 19s
Build on push / dependency (push) Successful in 19s
Build on push / cli (push) Successful in 24s
Build on push / mail (push) Successful in 17s
Build on push / translation (push) Successful in 16s
Build on push / database (push) Successful in 21s
Build on push / application (push) Successful in 21s
Build on push / auth (push) Successful in 15s
Build on push / api (push) Successful in 15s
2025-10-19 20:03:43 +02:00
df2c2b5b56 Workspace check project existence
All checks were successful
Test before pr merge / test-lint (pull_request) Successful in 6s
Build on push / prepare (push) Successful in 11s
Build on push / query (push) Successful in 19s
Build on push / core (push) Successful in 19s
Build on push / dependency (push) Successful in 19s
Build on push / cli (push) Successful in 19s
Build on push / application (push) Successful in 16s
Build on push / translation (push) Successful in 17s
Build on push / database (push) Successful in 20s
Build on push / mail (push) Successful in 20s
Build on push / auth (push) Successful in 15s
Build on push / api (push) Successful in 16s
2025-10-19 19:56:59 +02:00
e3b19c9984 Fixed init command regarding structure
All checks were successful
Test before pr merge / test-lint (pull_request) Successful in 7s
Build on push / prepare (push) Successful in 10s
Build on push / core (push) Successful in 19s
Build on push / query (push) Successful in 19s
Build on push / cli (push) Successful in 16s
Build on push / dependency (push) Successful in 19s
Build on push / application (push) Successful in 20s
Build on push / database (push) Successful in 21s
Build on push / translation (push) Successful in 20s
Build on push / mail (push) Successful in 23s
Build on push / auth (push) Successful in 15s
Build on push / api (push) Successful in 14s
2025-10-19 19:48:41 +02:00
91269f351b Fixed init command regarding package handling
All checks were successful
Test before pr merge / test-lint (pull_request) Successful in 7s
Build on push / prepare (push) Successful in 11s
Build on push / core (push) Successful in 19s
Build on push / query (push) Successful in 23s
Build on push / cli (push) Successful in 16s
Build on push / dependency (push) Successful in 19s
Build on push / database (push) Successful in 16s
Build on push / application (push) Successful in 18s
Build on push / mail (push) Successful in 20s
Build on push / translation (push) Successful in 20s
Build on push / auth (push) Successful in 19s
Build on push / api (push) Successful in 15s
2025-10-19 19:37:13 +02:00
5d07973940 Fixed init command regarding package handling
Some checks failed
Test before pr merge / test-lint (pull_request) Failing after 7s
Build on push / prepare (push) Successful in 11s
Build on push / core (push) Successful in 19s
Build on push / query (push) Successful in 20s
Build on push / cli (push) Successful in 19s
Build on push / dependency (push) Successful in 22s
Build on push / database (push) Successful in 16s
Build on push / translation (push) Successful in 16s
Build on push / mail (push) Successful in 17s
Build on push / application (push) Successful in 17s
Build on push / auth (push) Successful in 18s
Build on push / api (push) Successful in 16s
2025-10-19 19:32:14 +02:00
0a9b7b81be Fixed init command regarding name None
All checks were successful
Test before pr merge / test-lint (pull_request) Successful in 7s
Build on push / prepare (push) Successful in 11s
Build on push / query (push) Successful in 19s
Build on push / core (push) Successful in 24s
Build on push / cli (push) Successful in 19s
Build on push / dependency (push) Successful in 18s
Build on push / database (push) Successful in 17s
Build on push / mail (push) Successful in 18s
Build on push / application (push) Successful in 20s
Build on push / translation (push) Successful in 20s
Build on push / auth (push) Successful in 15s
Build on push / api (push) Successful in 15s
2025-10-19 19:27:18 +02:00
21c88bc442 Fixed install.sh after renaming
All checks were successful
Test before pr merge / test-lint (pull_request) Successful in 7s
Build on push / prepare (push) Successful in 10s
Build on push / query (push) Successful in 19s
Build on push / core (push) Successful in 20s
Build on push / dependency (push) Successful in 15s
Build on push / cli (push) Successful in 18s
Build on push / database (push) Successful in 20s
Build on push / translation (push) Successful in 20s
Build on push / application (push) Successful in 21s
Build on push / mail (push) Successful in 24s
Build on push / auth (push) Successful in 15s
Build on push / api (push) Successful in 18s
2025-10-19 19:17:14 +02:00
10 changed files with 97 additions and 29 deletions

View File

@@ -3,7 +3,8 @@
"projects": [
"src/cli/cpl.project.json",
"src/core/cpl.project.json",
"test/cpl.project.json"
"src/mail/cpl.project.json",
"src/mail-queue/cpl.project.json"
],
"defaultProject": "cpl-cli",
"scripts": {

View File

@@ -1,15 +1,15 @@
#!/usr/bin/env bash
set -euo pipefail
# Find and combine requirements from src/cpl-*/requirements.txt,
# Find and combine requirements from src/*/requirements.txt,
# filtering out lines whose *package name* starts with "cpl-".
# Works with pinned versions, extras, markers, editable installs, and VCS refs.
shopt -s nullglob
req_files=(src/cpl-*/requirements.txt)
req_files=(src/*/requirements.txt)
if ((${#req_files[@]} == 0)); then
echo "No requirements files found at src/cpl-*/requirements.txt" >&2
echo "No requirements files found at src/*/requirements.txt" >&2
exit 1
fi

View File

@@ -12,7 +12,8 @@ from cpl.core.console import Console
@click.command("init")
@click.argument("target", required=False)
@click.argument("name", required=False)
def init(target: str, name: str):
@click.option("--verbose", "-v", is_flag=True, help="Enable verbose output")
def init(target: str, name: str, verbose: bool = False):
workspace = None
project = None
@@ -30,9 +31,9 @@ def init(target: str, name: str):
if target in ["workspace", "ws"]:
workspace = Structure.init_workspace("./", name or click.prompt("Workspace name", default="my-workspace"))
elif target in PROJECT_TYPES:
workspace = Structure.find_workspace_in_path(Path(name).parent)
workspace = Structure.find_workspace_in_path(Path(name or "./").parent)
project = Structure.init_project(
"./", name or click.prompt("Project name", default=f"my-{target}"), target, workspace
"./", name or click.prompt("Project name", default=f"my-{target}"), target, workspace, verbose=verbose
)
else:
Console.error(f"Unknown target '{target}'")

View File

@@ -44,7 +44,7 @@ def new(type: str, name: str, in_name: str | None, project: list[str] | None, ve
path = Path(workspace.path).parent / Path(project[1]).parent
project_name = Path(project[1]).stem
workspace = Structure.find_workspace_in_path(path, with_parents=False)
workspace = Structure.find_workspace_in_path(path)
if workspace is None:
Console.error("No workspace found. Please run 'cpl init workspace' first.")
raise SystemExit(1)

View File

@@ -11,9 +11,13 @@ T = TypeVar("T", bound="CPLStructureModel")
class CPLStructureModel:
def __init__(self, path: Optional[str] = None):
def __init__(self, path: Optional[str] = None, ignore_fields: Optional[List[str]] = None):
self._path = path
self._ignore = {"_ignore", "_path"}
if ignore_fields is not None:
self._ignore.update(ignore_fields)
@property
def path(self) -> Optional[str]:
return self._path
@@ -68,7 +72,7 @@ class CPLStructureModel:
def to_json(self) -> Dict[str, Any]:
result: Dict[str, Any] = {}
for key, value in self.__dict__.items():
if not key.startswith("_") or key == "_path":
if not key.startswith("_") or key in self._ignore:
continue
out_key = _self_or_cls_snake_to_camel(key[1:])

View File

@@ -1,3 +1,4 @@
from pathlib import Path
from typing import Optional, List, Dict
from cpl.cli.model.cpl_structure_model import CPLStructureModel
@@ -23,11 +24,25 @@ class Workspace(CPLStructureModel):
default_project: Optional[str],
scripts: Dict[str, str],
):
CPLStructureModel.__init__(self, path)
CPLStructureModel.__init__(self, path, ["_actual_projects", "_project_names"])
self._name = name
self._projects = projects
self._default_project = default_project
self._actual_projects = []
self._project_names = []
for project in projects:
if Path(project).is_dir() or not Path(project).exists():
raise ValueError(f"Project path '{project}' does not exist or is a directory.")
p = Project.from_file(project)
self._actual_projects.append(p)
self._project_names.append(p.name)
if default_project is not None and default_project not in self._project_names:
raise ValueError(f"Default project '{default_project}' not found in workspace projects.")
self._scripts = scripts
@property
@@ -48,11 +63,11 @@ class Workspace(CPLStructureModel):
@property
def actual_projects(self) -> List[Project]:
return [Project.from_file(p) for p in self._projects]
return self._actual_projects
@property
def project_names(self) -> List[str]:
return [Project.from_file(p).name for p in self._projects]
return self._project_names
@property
def default_project(self) -> Optional[str]:

View File

@@ -32,11 +32,9 @@ class Structure:
}
@staticmethod
def find_workspace_in_path(path: Path, with_parents=False) -> Workspace | None:
def find_workspace_in_path(path: Path) -> Workspace | None:
current_path = path.resolve()
paths = [current_path]
if with_parents:
paths.extend(current_path.parents)
paths = [current_path, *current_path.parents]
for parent in paths:
workspace_file = parent / "cpl.workspace.json"
@@ -138,6 +136,16 @@ class Structure:
)
project.save()
Console.write_line(f"Created {project_type} project '{name}'")
if workspace is not None:
rel_path = str(path.resolve().absolute().relative_to(Path(workspace.path).parent)).replace("\\", "/")
if rel_path not in workspace.projects:
workspace.projects.append(rel_path)
workspace.save()
if verbose:
Console.write_line(f"Registered '{name}' in workspace.json")
from cpl.cli.command.package.install import install
@@ -149,17 +157,6 @@ class Structure:
install.callback(package, project.name, dev=False, verbose=verbose)
os.chdir(old_cwd)
if workspace is not None:
rel_path = str(path.resolve().absolute().relative_to(Path(workspace.path).parent))
if rel_path not in workspace.projects:
workspace.projects.append(rel_path)
workspace.save()
if verbose:
Console.write_line(f"Registered '{name}' in workspace.json")
Console.write_line(f"Created {project_type} project '{name}'")
return project
@staticmethod
@@ -199,4 +196,4 @@ class Structure:
shutil.copy(src_file, tgt_file)
Console.write_line()
Structure.init_project(str(path), name, project_type, workspace)
Structure.init_project(str(path), name, project_type, workspace, verbose=verbose)

3
src/mail-queue/class.py Normal file
View File

@@ -0,0 +1,3 @@
class Class1:
def __init__(self): ...

View File

@@ -0,0 +1,24 @@
{
"name": "mail-queue",
"version": "0.1.0",
"type": "library",
"license": "",
"author": "",
"description": "",
"homepage": "",
"keywords": [],
"dependencies": {
"cpl-core": "~2024.7.0",
"cpl-mail": "~2024.7.0"
},
"devDependencies": {
"cpl-cli": ">2024.7.0"
},
"references": [],
"main": null,
"directory": "./",
"build": {
"include": [],
"exclude": []
}
}

23
src/mail/cpl.project.json Normal file
View File

@@ -0,0 +1,23 @@
{
"name": "cpl-mail",
"version": "0.1.0",
"type": "library",
"license": "",
"author": "",
"description": "",
"homepage": "",
"keywords": [],
"dependencies": {
"cpl-core": "~2024.7.0"
},
"devDependencies": {
"cpl-cli": ">2024.7.0"
},
"references": [],
"main": null,
"directory": "./",
"build": {
"include": [],
"exclude": []
}
}