Skip to content

Commit dbafa68

Browse files
tdsteinschloerke
andauthored
refactor: add resource protocols (#364)
Adds protocols `Resource` and `ResourceSequence`, which define the base interface for any resource type (e.g., `Job`, `Jobs`, `Package`, `Packages`.) Co-authored-by: Barret Schloerke <[email protected]>
1 parent e6809f3 commit dbafa68

File tree

19 files changed

+82
-87
lines changed

19 files changed

+82
-87
lines changed

src/posit/connect/bundles.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,11 @@
1111
from .context import Context
1212

1313

14-
class BundleMetadata(resources.Resource):
14+
class BundleMetadata(resources.BaseResource):
1515
pass
1616

1717

18-
class Bundle(resources.Resource):
18+
class Bundle(resources.BaseResource):
1919
@property
2020
def metadata(self) -> BundleMetadata:
2121
return BundleMetadata(self._ctx, **self.get("metadata", {}))

src/posit/connect/content.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
from .errors import ClientError
2525
from .oauth.associations import ContentItemAssociations
2626
from .permissions import Permissions
27-
from .resources import Active, Resource, Resources, _ResourceSequence
27+
from .resources import Active, BaseResource, Resources, _ResourceSequence
2828
from .tags import ContentItemTags
2929
from .vanities import VanityMixin
3030
from .variants import Variants
@@ -160,7 +160,7 @@ def update(
160160
)
161161

162162

163-
class ContentItemOAuth(Resource):
163+
class ContentItemOAuth(BaseResource):
164164
def __init__(self, ctx: Context, content_guid: str) -> None:
165165
super().__init__(ctx)
166166
self["content_guid"] = content_guid
@@ -170,11 +170,11 @@ def associations(self) -> ContentItemAssociations:
170170
return ContentItemAssociations(self._ctx, content_guid=self["content_guid"])
171171

172172

173-
class ContentItemOwner(Resource):
173+
class ContentItemOwner(BaseResource):
174174
pass
175175

176176

177-
class ContentItem(Active, VanityMixin, Resource):
177+
class ContentItem(Active, VanityMixin, BaseResource):
178178
class _AttrsBase(TypedDict, total=False):
179179
# # `name` will be set by other _Attrs classes
180180
# name: str
@@ -376,7 +376,7 @@ def restart(self) -> None:
376376
f"Restart not supported for this application mode: {self['app_mode']}. Did you need to use the 'render()' method instead? Note that some application modes do not support 'render()' or 'restart()'.",
377377
)
378378

379-
def update(
379+
def update( # type: ignore[reportIncompatibleMethodOverride]
380380
self,
381381
**attrs: Unpack[ContentItem._Attrs],
382382
) -> None:

src/posit/connect/environments.py

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,17 @@
11
from __future__ import annotations
22

33
from abc import abstractmethod
4-
from collections.abc import Mapping, Sized
4+
from typing import Protocol
55

66
from typing_extensions import (
7-
Any,
87
List,
98
Literal,
10-
Protocol,
11-
SupportsIndex,
129
TypedDict,
13-
overload,
1410
runtime_checkable,
1511
)
1612

13+
from .resources import Resource, ResourceSequence
14+
1715
MatchingType = Literal["any", "exact", "none"]
1816
"""Directions for how environments are considered for selection.
1917
@@ -40,7 +38,7 @@ class Installations(TypedDict):
4038
"""Interpreter installations in an execution environment."""
4139

4240

43-
class Environment(Mapping[str, Any]):
41+
class Environment(Resource):
4442
@abstractmethod
4543
def destroy(self) -> None:
4644
"""Destroy the environment.
@@ -95,13 +93,7 @@ def update(
9593

9694

9795
@runtime_checkable
98-
class Environments(Sized, Protocol):
99-
@overload
100-
def __getitem__(self, index: SupportsIndex) -> Environment: ...
101-
102-
@overload
103-
def __getitem__(self, index: slice) -> List[Environment]: ...
104-
96+
class Environments(ResourceSequence[Environment], Protocol):
10597
def create(
10698
self,
10799
*,
@@ -217,4 +209,3 @@ def find_by(
217209
----
218210
This action requires administrator or publisher privileges.
219211
"""
220-
...

src/posit/connect/groups.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from typing import TYPE_CHECKING, List, Optional, overload
66

77
from .paginator import Paginator
8-
from .resources import Resource, Resources
8+
from .resources import BaseResource, Resources
99

1010
if TYPE_CHECKING:
1111
import requests
@@ -14,7 +14,7 @@
1414
from .users import User
1515

1616

17-
class Group(Resource):
17+
class Group(BaseResource):
1818
def __init__(self, ctx: Context, **kwargs) -> None:
1919
super().__init__(ctx, **kwargs)
2020
self._ctx: Context = ctx

src/posit/connect/jobs.py

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,14 @@
11
from __future__ import annotations
22

3-
from abc import abstractmethod
4-
from collections.abc import Mapping, Sized
53
from typing import (
6-
Any,
74
Iterable,
8-
List,
95
Literal,
106
Protocol,
11-
SupportsIndex,
12-
overload,
137
runtime_checkable,
148
)
159

10+
from .resources import Resource, ResourceSequence
11+
1612
JobTag = Literal[
1713
"unknown",
1814
"build_report",
@@ -43,8 +39,7 @@
4339
StatusCode = Literal[0, 1, 2]
4440

4541

46-
class Job(Mapping[str, Any]):
47-
@abstractmethod
42+
class Job(Resource, Protocol):
4843
def destroy(self) -> None:
4944
"""Destroy the job.
5045
@@ -59,13 +54,7 @@ def destroy(self) -> None:
5954

6055

6156
@runtime_checkable
62-
class Jobs(Sized, Protocol):
63-
@overload
64-
def __getitem__(self, index: SupportsIndex) -> Job: ...
65-
66-
@overload
67-
def __getitem__(self, index: slice) -> List[Job]: ...
68-
57+
class Jobs(ResourceSequence[Job], Protocol):
6958
def fetch(self) -> Iterable[Job]:
7059
"""Fetch all jobs.
7160

src/posit/connect/metrics/shiny_usage.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33
from typing import List, overload
44

55
from ..cursors import CursorPaginator
6-
from ..resources import Resource, Resources
6+
from ..resources import BaseResource, Resources
77

88

9-
class ShinyUsageEvent(Resource):
9+
class ShinyUsageEvent(BaseResource):
1010
@property
1111
def content_guid(self) -> str:
1212
"""The associated unique content identifier.

src/posit/connect/metrics/usage.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from . import shiny_usage, visits
1111

1212

13-
class UsageEvent(resources.Resource):
13+
class UsageEvent(resources.BaseResource):
1414
@staticmethod
1515
def from_event(
1616
event: visits.VisitEvent | shiny_usage.ShinyUsageEvent,

src/posit/connect/metrics/visits.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33
from typing import List, overload
44

55
from ..cursors import CursorPaginator
6-
from ..resources import Resource, Resources
6+
from ..resources import BaseResource, Resources
77

88

9-
class VisitEvent(Resource):
9+
class VisitEvent(BaseResource):
1010
@property
1111
def content_guid(self) -> str:
1212
"""The associated unique content identifier.

src/posit/connect/oauth/associations.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33
from typing import List
44

55
from ..context import Context
6-
from ..resources import Resource, Resources
6+
from ..resources import BaseResource, Resources
77

88

9-
class Association(Resource):
9+
class Association(BaseResource):
1010
pass
1111

1212

src/posit/connect/oauth/integrations.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@
22

33
from typing import List, Optional, overload
44

5-
from ..resources import Resource, Resources
5+
from ..resources import BaseResource, Resources
66
from .associations import IntegrationAssociations
77

88

9-
class Integration(Resource):
9+
class Integration(BaseResource):
1010
"""OAuth integration resource."""
1111

1212
@property

0 commit comments

Comments
 (0)