Skip to content

Commit bd7b13f

Browse files
committed
Work toward alignment with Java implementation
1 parent 28683de commit bd7b13f

File tree

6 files changed

+30
-79
lines changed

6 files changed

+30
-79
lines changed

src/appose/builder/__init__.py

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ def __init__(
8282
verb = "interrupted" if isinstance(cause, KeyboardInterrupt) else "failed"
8383
message = f"{noun} {verb}"
8484
super().__init__(message)
85-
self._builder: Builder | None = builder
85+
self.builder: Builder | None = builder
8686
self.__cause__: Exception | None = cause
8787

8888

@@ -253,20 +253,6 @@ def file(self, path: str | Path) -> Builder:
253253
except Exception as e:
254254
raise BuildException(self, cause=e)
255255

256-
@abstractmethod
257-
def content(self, content: str) -> Builder:
258-
"""
259-
Specifies configuration file content to build from.
260-
The scheme will be auto-detected from content syntax.
261-
262-
Args:
263-
content: Configuration file content
264-
265-
Returns:
266-
This builder instance, for fluent-style programming
267-
"""
268-
...
269-
270256
def url(self, url: str) -> Builder:
271257
"""
272258
Specifies a URL to fetch configuration content from.
@@ -288,6 +274,20 @@ def url(self, url: str) -> Builder:
288274
except Exception as e:
289275
raise BuildException(self, cause=e)
290276

277+
@abstractmethod
278+
def content(self, content: str) -> Builder:
279+
"""
280+
Specifies configuration file content to build from.
281+
The scheme will be auto-detected from content syntax.
282+
283+
Args:
284+
content: Configuration file content
285+
286+
Returns:
287+
This builder instance, for fluent-style programming
288+
"""
289+
...
290+
291291
@abstractmethod
292292
def scheme(self, scheme: str) -> Builder:
293293
"""
@@ -605,9 +605,6 @@ def __init__(self):
605605
super().__init__()
606606
self._custom_bin_paths: list[str] = []
607607

608-
def env_type(self) -> str:
609-
return "custom"
610-
611608
def bin_paths(self, *paths: str) -> SimpleBuilder:
612609
"""
613610
Appends additional binary paths to search for executables.
@@ -651,6 +648,9 @@ def inherit_running_java(self) -> SimpleBuilder:
651648
self._env_vars["JAVA_HOME"] = java_home
652649
return self
653650

651+
def env_type(self) -> str:
652+
return "custom"
653+
654654
def build(self) -> Environment:
655655
"""Build the simple environment."""
656656
base = self._resolve_env_dir()

src/appose/builder/mamba.py

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -51,19 +51,6 @@ class MambaBuilder(BaseBuilder):
5151
def env_type(self) -> str:
5252
return "mamba"
5353

54-
def channels(self, *channels: str) -> MambaBuilder:
55-
"""
56-
Adds conda channels to search for packages.
57-
58-
Args:
59-
channels: Channel names (e.g., "conda-forge", "bioconda")
60-
61-
Returns:
62-
This builder instance
63-
"""
64-
super().channels(*channels)
65-
return self
66-
6754
def build(self) -> Environment:
6855
"""
6956
Builds the Mamba environment.
@@ -95,7 +82,7 @@ def build(self) -> Environment:
9582
is_conda_dir = (env_dir / "conda-meta").is_dir()
9683
if is_conda_dir:
9784
# Environment already exists, just wrap it
98-
return self._create_environment(env_dir, mamba)
85+
return self._create_environment(mamba, env_dir)
9986

10087
# Building a new environment - config content is required
10188
if self._content is None:
@@ -153,7 +140,7 @@ def build(self) -> Environment:
153140
# Step 3: Update environment from yml
154141
mamba.update(env_dir, env_yaml)
155142

156-
return self._create_environment(env_dir, mamba)
143+
return self._create_environment(mamba, env_dir)
157144

158145
except (IOError, KeyboardInterrupt) as e:
159146
raise BuildException(self, cause=e)
@@ -186,7 +173,7 @@ def wrap(self, env_dir: str | Path) -> Environment:
186173
self.base(env_path)
187174
return self.build()
188175

189-
def _create_environment(self, env_dir: Path, mamba: Mamba) -> Environment:
176+
def _create_environment(self, mamba: Mamba, env_dir: Path) -> Environment:
190177
"""
191178
Creates an Environment for the given Mamba/conda directory.
192179

src/appose/builder/pixi.py

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -81,18 +81,6 @@ def pypi(self, *packages: str) -> PixiBuilder:
8181
self._pypi_packages.extend(packages)
8282
return self
8383

84-
def channels(self, *channels: str) -> PixiBuilder:
85-
"""
86-
Adds conda channels to search for packages.
87-
88-
Args:
89-
channels: Channel names (e.g., "conda-forge", "bioconda")
90-
91-
Returns:
92-
This builder instance
93-
"""
94-
return super().channels(*channels)
95-
9684
def build(self) -> Environment:
9785
"""
9886
Builds the Pixi environment.
@@ -153,7 +141,7 @@ def build(self) -> Environment:
153141
and not self._pypi_packages
154142
):
155143
# Environment already exists, just use it
156-
return self._create_environment(env_dir, pixi)
144+
return self._create_environment(pixi, env_dir)
157145

158146
# Handle source-based build (file or content)
159147
if self._content is not None:
@@ -197,7 +185,7 @@ def build(self) -> Environment:
197185
# Programmatic package building
198186
if is_pixi_dir:
199187
# Already initialized, just use it
200-
return self._create_environment(env_dir, pixi)
188+
return self._create_environment(pixi, env_dir)
201189

202190
if not env_dir.exists():
203191
env_dir.mkdir(parents=True, exist_ok=True)
@@ -239,7 +227,7 @@ def build(self) -> Environment:
239227
'Add .conda("appose") or .pypi("appose") to your builder.',
240228
)
241229

242-
return self._create_environment(env_dir, pixi)
230+
return self._create_environment(pixi, env_dir)
243231

244232
except (IOError, KeyboardInterrupt) as e:
245233
raise BuildException(self, cause=e)
@@ -281,7 +269,7 @@ def wrap(self, env_dir: str | Path) -> Environment:
281269
self.base(env_path)
282270
return self.build()
283271

284-
def _create_environment(self, env_dir: Path, pixi: Pixi) -> Environment:
272+
def _create_environment(self, pixi: Pixi, env_dir: Path) -> Environment:
285273
"""
286274
Creates an Environment for the given Pixi directory.
287275

src/appose/builder/uv.py

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,6 @@ def __init__(self):
5454
self._python_version: str | None = None
5555
self._packages: list[str] = []
5656

57-
def env_type(self) -> str:
58-
return "uv"
59-
6057
def python(self, version: str) -> UvBuilder:
6158
"""
6259
Specifies the Python version to use for the virtual environment.
@@ -83,19 +80,8 @@ def include(self, *packages: str) -> UvBuilder:
8380
self._packages.extend(packages)
8481
return self
8582

86-
def channels(self, *indexes: str) -> UvBuilder:
87-
"""
88-
Adds PyPI index URLs for package discovery.
89-
90-
These are alternative or additional package indexes beyond the default pypi.org.
91-
92-
Args:
93-
indexes: Index URLs (e.g., custom PyPI mirrors or private package repositories)
94-
95-
Returns:
96-
This builder instance
97-
"""
98-
return super().channels(*indexes)
83+
def env_type(self) -> str:
84+
return "uv"
9985

10086
def build(self) -> Environment:
10187
"""

src/appose/service.py

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -57,16 +57,6 @@ def __init__(self, message: str, task: "Task") -> None:
5757
super().__init__(message)
5858
self.task: Task = task
5959

60-
@property
61-
def status(self) -> "TaskStatus":
62-
"""Returns the status of the failed task."""
63-
return self.task.status
64-
65-
@property
66-
def task_error(self) -> str | None:
67-
"""Returns the error message from the task, if available."""
68-
return self.task.error
69-
7060

7161
class Service:
7262
"""

tests/test_task_exception.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,9 @@ def test_task_exception_on_failure():
6161

6262
# Verify we can access the task and its details through the exception
6363
assert e.task is task
64-
assert e.status == TaskStatus.FAILED
65-
assert e.task_error is not None
66-
assert "NameError" in e.task_error or "nameerror" in e.task_error.lower()
64+
assert e.task.status == TaskStatus.FAILED
65+
assert e.task.error is not None
66+
assert "NameError" in e.task.error or "nameerror" in e.task.error.lower()
6767

6868

6969
def test_no_exception_on_success():

0 commit comments

Comments
 (0)