-
Notifications
You must be signed in to change notification settings - Fork 8
feat: add environments #355
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
Show all changes
5 commits
Select commit
Hold shift + click to select a range
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or 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 hidden or 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,38 @@ | ||
| 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 hidden or 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 hidden or 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,211 @@ | ||
| from __future__ import annotations | ||
|
|
||
| from abc import abstractmethod | ||
| from collections.abc import Mapping, Sized | ||
| from typing import ( | ||
| Any, | ||
| List, | ||
| Literal, | ||
| Protocol, | ||
| TypedDict, | ||
| 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): | ||
| 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. | ||
| """ | ||
| ... |
This file contains hidden or 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
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is where the implicit type-checking occurs. The method signature returns the Environments protocol while the implementation returns _ResourceSequence.