-
Notifications
You must be signed in to change notification settings - Fork 4
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'main' into client_requests
- Loading branch information
Showing
14 changed files
with
611 additions
and
510 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,8 +1,9 @@ | ||
# This file contains the configuration settings for the coverage report generated. | ||
|
||
[report] | ||
# exclude '...' (ellipsis literal). This option uses regex, so an escaped literal is required. | ||
exclude_also = | ||
\.\.\. | ||
exclude_lines = | ||
if TYPE_CHECKING: | ||
|
||
fail_under = 80 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
import pytest | ||
from packaging import version | ||
|
||
from posit import connect | ||
|
||
from . import CONNECT_VERSION | ||
|
||
|
||
@pytest.mark.skipif( | ||
CONNECT_VERSION < version.parse("2023.05.0"), | ||
reason="Environments API unavailable", | ||
) | ||
class TestEnvironments: | ||
@classmethod | ||
def setup_class(cls): | ||
cls.client = connect.Client() | ||
cls.environment = cls.client.environments.create( | ||
title="title", | ||
name="name", | ||
cluster_name="Kubernetes", | ||
) | ||
|
||
@classmethod | ||
def teardown_class(cls): | ||
cls.environment.destroy() | ||
assert len(cls.client.environments) == 0 | ||
|
||
def test_find(self): | ||
uid = self.environment["guid"] | ||
environment = self.client.environments.find(uid) | ||
assert environment == self.environment | ||
|
||
def test_find_by(self): | ||
environment = self.client.environments.find_by(name="name") | ||
assert environment == self.environment | ||
|
||
def test_update(self): | ||
assert self.environment["title"] == "title" | ||
self.environment.update(title="new-title") | ||
assert self.environment["title"] == "new-title" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,220 @@ | ||
from __future__ import annotations | ||
|
||
from abc import abstractmethod | ||
from collections.abc import Mapping, Sized | ||
|
||
from typing_extensions import ( | ||
Any, | ||
List, | ||
Literal, | ||
Protocol, | ||
SupportsIndex, | ||
TypedDict, | ||
overload, | ||
runtime_checkable, | ||
) | ||
|
||
MatchingType = Literal["any", "exact", "none"] | ||
"""Directions for how environments are considered for selection. | ||
- any: The image may be selected by Connect if not defined in the bundle manifest. | ||
- exact: The image must be defined in the bundle manifest | ||
- none: Never use this environment | ||
""" | ||
|
||
|
||
class Installation(TypedDict): | ||
"""Interpreter installation in an execution environment.""" | ||
|
||
path: str | ||
"""The absolute path to the interpreter's executable.""" | ||
|
||
version: str | ||
"""The semantic version of the interpreter.""" | ||
|
||
|
||
class Installations(TypedDict): | ||
"""Interpreter installations in an execution environment.""" | ||
|
||
installations: List[Installation] | ||
"""Interpreter installations in an execution environment.""" | ||
|
||
|
||
class Environment(Mapping[str, Any]): | ||
@abstractmethod | ||
def destroy(self) -> None: | ||
"""Destroy the environment. | ||
Warnings | ||
-------- | ||
This operation is irreversible. | ||
Note | ||
---- | ||
This action requires administrator privileges. | ||
""" | ||
|
||
@abstractmethod | ||
def update( | ||
self, | ||
*, | ||
title: str, | ||
description: str | None = ..., | ||
matching: MatchingType | None = ..., | ||
supervisor: str | None = ..., | ||
python: Installations | None = ..., | ||
quarto: Installations | None = ..., | ||
r: Installations | None = ..., | ||
tensorflow: Installations | None = ..., | ||
) -> None: | ||
"""Update the environment. | ||
Parameters | ||
---------- | ||
title : str | ||
A human-readable title. | ||
description : str | None, optional, not required | ||
A human-readable description. | ||
matching : MatchingType, optional, not required | ||
Directions for how the environment is considered for selection | ||
supervisor : str | None, optional, not required | ||
Path to the supervisor script. | ||
python : Installations, optional, not required | ||
The Python installations available in this environment | ||
quarto : Installations, optional, not required | ||
The Quarto installations available in this environment | ||
r : Installations, optional, not required | ||
The R installations available in this environment | ||
tensorflow : Installations, optional, not required | ||
The Tensorflow installations available in this environment | ||
Note | ||
---- | ||
This action requires administrator privileges. | ||
""" | ||
|
||
|
||
@runtime_checkable | ||
class Environments(Sized, Protocol): | ||
@overload | ||
def __getitem__(self, index: SupportsIndex) -> Environment: ... | ||
|
||
@overload | ||
def __getitem__(self, index: slice) -> List[Environment]: ... | ||
|
||
def create( | ||
self, | ||
*, | ||
title: str, | ||
name: str, | ||
cluster_name: str | Literal["Kubernetes"], | ||
matching: MatchingType = "any", | ||
description: str | None = ..., | ||
supervisor: str | None = ..., | ||
python: Installations | None = ..., | ||
quarto: Installations | None = ..., | ||
r: Installations | None = ..., | ||
tensorflow: Installations | None = ..., | ||
) -> Environment: | ||
"""Create an environment. | ||
Parameters | ||
---------- | ||
title : str | ||
A human-readable title. | ||
name : str | ||
The container image name used for execution in this environment. | ||
cluster_name : str | Literal["Kubernetes"] | ||
The cluster identifier for this environment. Defaults to "Kubernetes" when Off-Host-Execution is enabled. | ||
description : str, optional | ||
A human-readable description. | ||
matching : MatchingType | ||
Directions for how the environment is considered for selection, by default is "any". | ||
supervisor : str, optional | ||
Path to the supervisor script | ||
python : Installations, optional | ||
The Python installations available in this environment | ||
quarto : Installations, optional | ||
The Quarto installations available in this environment | ||
r : Installations, optional | ||
The R installations available in this environment | ||
tensorflow : Installations, optional | ||
The Tensorflow installations available in this environment | ||
Returns | ||
------- | ||
Environment | ||
Note | ||
---- | ||
This action requires administrator privileges. | ||
""" | ||
... | ||
|
||
def find(self, guid: str, /) -> Environment: ... | ||
|
||
def find_by( | ||
self, | ||
*, | ||
id: str = ..., # noqa: A002 | ||
guid: str = ..., | ||
created_time: str = ..., | ||
updated_time: str = ..., | ||
title: str = ..., | ||
name: str = ..., | ||
description: str | None = ..., | ||
cluster_name: str | Literal["Kubernetes"] = ..., | ||
environment_type: str | Literal["Kubernetes"] = ..., | ||
matching: MatchingType = ..., | ||
supervisor: str | None = ..., | ||
python: Installations | None = ..., | ||
quarto: Installations | None = ..., | ||
r: Installations | None = ..., | ||
tensorflow: Installations | None = ..., | ||
) -> Environment | None: | ||
"""Find the first record matching the specified conditions. | ||
There is no implied ordering, so if order matters, you should specify it yourself. | ||
Parameters | ||
---------- | ||
id : str | ||
The numerical identifier. | ||
guid : str | ||
The unique identifier. | ||
created_time : str | ||
The timestamp (RFC3339) when the environment was created. | ||
updated_time : str | ||
The timestamp (RFC3339) when the environment was updated. | ||
title : str | ||
A human-readable title. | ||
name : str | ||
The container image name used for execution in this environment. | ||
description : str, optional | ||
A human-readable description. | ||
cluster_name : str | Literal["Kubernetes"] | ||
The cluster identifier for this environment. Defaults to "Kubernetes" when Off-Host-Execution is enabled. | ||
environment_type : str | Literal["Kubernetes"] | ||
The cluster environment type. Defaults to "Kubernetes" when Off-Host-Execution is enabled. | ||
matching : MatchingType | ||
Directions for how the environment is considered for selection. | ||
supervisor : str, optional | ||
Path to the supervisor script | ||
python : Installations, optional | ||
The Python installations available in this environment | ||
quarto : Installations, optional | ||
The Quarto installations available in this environment | ||
r : Installations, optional | ||
The R installations available in this environment | ||
tensorflow : Installations, optional | ||
The Tensorflow installations available in this environment | ||
Returns | ||
------- | ||
Environment | None | ||
Note | ||
---- | ||
This action requires administrator or publisher privileges. | ||
""" | ||
... |
Oops, something went wrong.