Skip to content

Commit f16a90c

Browse files
authored
feat: Content repository resource (#300)
1 parent e361a28 commit f16a90c

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+1294
-482
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,3 +169,4 @@ cython_debug/
169169
.ruff_cache/
170170

171171
/.luarc.json
172+
_dev/

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,8 @@ it: $(UV_LOCK)
6565
$(MAKE) -C ./integration
6666

6767
lint: dev
68-
$(UV) run pyright
6968
$(UV) run ruff check
69+
$(UV) run pyright
7070

7171
test: dev
7272
$(UV) run coverage run --source=src -m pytest tests

integration/tests/posit/connect/__init__.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,6 @@
33
from posit import connect
44

55
client = connect.Client()
6-
CONNECT_VERSION = version.parse(client.version)
6+
client_version = client.version
7+
assert client_version is not None
8+
CONNECT_VERSION = version.parse(client_version)

integration/tests/posit/connect/test_content.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ def test_find(self):
2929
assert self.client.content.find()
3030

3131
def test_find_by(self):
32-
assert self.client.content.find_by(guid=self.content["guid"]) == self.content
32+
assert self.client.content.find_by(name=self.content["name"]) == self.content
3333

3434
def test_find_one(self):
3535
assert self.client.content.find_one()
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
import pytest
2+
from packaging import version
3+
4+
from posit import connect
5+
from posit.connect.content import ContentItem, ContentItemRepository
6+
7+
from . import CONNECT_VERSION
8+
9+
10+
class TestContentItemRepository:
11+
content: ContentItem
12+
13+
@classmethod
14+
def setup_class(cls):
15+
cls.client = connect.Client()
16+
cls.content = cls.client.content.create(name="example")
17+
18+
@classmethod
19+
def teardown_class(cls):
20+
cls.content.delete()
21+
assert cls.client.content.count() == 0
22+
23+
@property
24+
def repo_repository(self):
25+
return "https://github.com/posit-dev/posit-sdk-py"
26+
27+
@property
28+
def repo_branch(self):
29+
return "1dacc4dd"
30+
31+
@property
32+
def repo_directory(self):
33+
return "integration/resources/connect/bundles/example-quarto-minimal"
34+
35+
@property
36+
def repo_polling(self):
37+
return False
38+
39+
@property
40+
def default_repository(self):
41+
return {
42+
"repository": self.repo_repository,
43+
"branch": self.repo_branch,
44+
"directory": self.repo_directory,
45+
"polling": self.repo_polling,
46+
}
47+
48+
@pytest.mark.skipif(
49+
# Added to the v2022.12.0 milestone
50+
# https://github.com/rstudio/connect/issues/22242#event-7859377097
51+
CONNECT_VERSION < version.parse("2022.12.0"),
52+
reason="Repository routes not implemented",
53+
)
54+
def test_create_get_update_delete(self):
55+
content = self.content
56+
57+
# None by default
58+
assert content.repository is None
59+
60+
# Create
61+
new_repo = content.create_repository(**self.default_repository)
62+
63+
# Get
64+
content_repo = content.repository
65+
assert content_repo is not None
66+
67+
def assert_repo(r: ContentItemRepository):
68+
assert isinstance(content_repo, ContentItemRepository)
69+
assert r["repository"] == self.repo_repository
70+
assert r["branch"] == self.repo_branch
71+
assert r["directory"] == self.repo_directory
72+
assert r["polling"] is self.repo_polling
73+
74+
assert_repo(new_repo)
75+
assert_repo(content_repo)
76+
77+
# Update
78+
ex_branch = "main"
79+
updated_repo = content_repo.update(branch=ex_branch)
80+
assert updated_repo["branch"] == ex_branch
81+
82+
assert updated_repo["repository"] == self.repo_repository
83+
assert updated_repo["directory"] == self.repo_directory
84+
assert updated_repo["polling"] is self.repo_polling
85+
86+
# Delete
87+
content_repo.destroy()
88+
assert content.repository is None

pyproject.toml

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ Source = "https://github.com/posit-dev/posit-sdk-py"
2626
Issues = "https://github.com/posit-dev/posit-sdk-py/issues"
2727

2828
[tool.pyright]
29-
include = ["src"]
29+
include = ["src", "tests", "integration/tests"]
3030

3131
[tool.pytest.ini_options]
3232
testpaths = ["tests"]
@@ -70,6 +70,7 @@ extend-select = [
7070
# Check docstring formatting. Many of these rules are intentionally ignored below.
7171
"D",
7272

73+
"ARG", # ARG; flake8-argparse: https://docs.astral.sh/ruff/rules/#flake8-unused-arguments-arg
7374
"E", # E; pycodestyle: https://docs.astral.sh/ruff/rules/#pycodestyle-e-w
7475
"F", # F; Pyflakes: https://docs.astral.sh/ruff/rules/#pyflakes-f
7576
"I", # I; isort: https://docs.astral.sh/ruff/rules/#isort-i
@@ -111,8 +112,8 @@ ignore = [
111112
]
112113

113114
[tool.ruff.lint.per-file-ignores]
114-
"examples/*" = ["D"]
115-
"tests/*" = ["D"]
115+
"examples/connect*" = ["D", "ARG"]
116+
"tests/posit/connect/*" = ["D", "ARG"]
116117

117118

118119
[tool.ruff.lint.pydocstyle]
@@ -130,7 +131,7 @@ exclude = ".*"
130131
[dependency-groups]
131132
build = ["build"]
132133
coverage = ["coverage"]
133-
examples = ["rsconnect-python", "pandas"]
134+
examples = ["rsconnect-python", "pandas", "databricks", "shiny"]
134135
git = ["pre-commit"]
135136
lint = ["ruff", "pyright"]
136137
test = ["rsconnect-python", "responses", "pytest", "pyjson5"]

0 commit comments

Comments
 (0)