Skip to content

Commit 0719038

Browse files
authored
Allow skipping the extraction of organization members and/or repositories. (#13)
* feat: allow skipping org repos or members * chore: refactor args
1 parent 666ab81 commit 0719038

File tree

4 files changed

+110
-17
lines changed

4 files changed

+110
-17
lines changed

nodestream_github/orgs.py

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,18 @@
1919

2020

2121
class GithubOrganizationsExtractor(Extractor):
22-
def __init__(self, **github_client_kwargs: any):
23-
self.client = GithubRestApiClient(**github_client_kwargs)
22+
def __init__(
23+
self,
24+
*,
25+
include_members: bool | None = True,
26+
include_repositories: bool | None = True,
27+
**kwargs: any,
28+
):
29+
30+
self.include_members = include_members is True
31+
self.include_repositories = include_repositories is True
32+
33+
self.client = GithubRestApiClient(**kwargs)
2434

2535
async def extract_records(self) -> AsyncGenerator[OrgRecord]:
2636
async for org in self.client.fetch_all_organizations():
@@ -34,14 +44,23 @@ async def _extract_organization(self, login: str) -> OrgRecord | None:
3444
if not full_org:
3545
return None
3646

37-
full_org["members"] = [user async for user in self._fetch_all_members(login)]
47+
if self.include_members:
48+
full_org["members"] = [
49+
user async for user in self._fetch_all_members(login)
50+
]
51+
else:
52+
full_org["members"] = []
53+
54+
if self.include_repositories:
55+
full_org["repositories"] = [
56+
simplify_repo(
57+
repo, permission=full_org.get("default_repository_permission")
58+
)
59+
async for repo in self.client.fetch_repos_for_org(login)
60+
]
61+
else:
62+
full_org["repositories"] = []
3863

39-
full_org["repositories"] = [
40-
simplify_repo(
41-
repo, permission=full_org.get("default_repository_permission")
42-
)
43-
async for repo in self.client.fetch_repos_for_org(login)
44-
]
4564
return full_org
4665

4766
async def _fetch_all_members(self, login: str) -> AsyncGenerator[SimplifiedUser]:

poetry.lock

Lines changed: 7 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "nodestream-plugin-github"
3-
version = "0.13.1-beta.8"
3+
version = "0.13.1-beta.9"
44
description = ""
55
authors = ["Jon Bristow <[email protected]>"]
66
packages = [

tests/test_orgs.py

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,3 +268,77 @@ async def test_get_orgs(
268268
}],
269269
}
270270
]
271+
272+
273+
@pytest.mark.asyncio
274+
async def test_skip_members(
275+
gh_rest_mock: GithubHttpxMock,
276+
):
277+
org_client = GithubOrganizationsExtractor(
278+
auth_token="test-token",
279+
github_hostname=DEFAULT_HOSTNAME,
280+
user_agent="test-agent",
281+
max_retries=0,
282+
per_page=DEFAULT_PER_PAGE,
283+
include_members=False,
284+
)
285+
286+
gh_rest_mock.all_orgs(json=[GITHUB_ORG_SUMMARY])
287+
gh_rest_mock.get_org("github", json=GITHUB_ORG)
288+
gh_rest_mock.get_repos_for_org("github", json=[HELLO_WORLD_REPO])
289+
290+
all_records = [record async for record in org_client.extract_records()]
291+
assert all_records == [
292+
BASE_EXPECTED_GITHUB_ORG
293+
| {
294+
"members": [],
295+
"repositories": [{
296+
"full_name": "octocat/Hello-World",
297+
"html_url": "https://github.com/octocat/Hello-World",
298+
"id": 1296269,
299+
"name": "Hello-World",
300+
"node_id": "MDEwOlJlcG9zaXRvcnkxMjk2MjY5",
301+
"permission": "read",
302+
"url": "https://HOSTNAME/repos/octocat/Hello-World",
303+
}],
304+
}
305+
]
306+
307+
308+
@pytest.mark.asyncio
309+
async def test_skip_repositories(gh_rest_mock: GithubHttpxMock):
310+
org_client = GithubOrganizationsExtractor(
311+
auth_token="test-token",
312+
github_hostname=DEFAULT_HOSTNAME,
313+
include_repositories=False, # putting the here to test kwargs interaction
314+
user_agent="test-agent",
315+
max_retries=0,
316+
per_page=DEFAULT_PER_PAGE,
317+
)
318+
319+
gh_rest_mock.all_orgs(json=[GITHUB_ORG_SUMMARY])
320+
gh_rest_mock.get_org("github", json=GITHUB_ORG)
321+
gh_rest_mock.get_members_for_org("github", json=[OCTOCAT_USER], role="admin")
322+
gh_rest_mock.get_members_for_org("github", json=[TURBO_USER], role="member")
323+
324+
all_records = [record async for record in org_client.extract_records()]
325+
assert all_records == [
326+
BASE_EXPECTED_GITHUB_ORG
327+
| {
328+
"members": [
329+
{
330+
"id": 1,
331+
"login": "octocat",
332+
"node_id": "MDQ6VXNlcjE=",
333+
"role": "admin",
334+
},
335+
{
336+
"id": 2,
337+
"login": "turbo",
338+
"node_id": "MDQ6VXNlcjI=",
339+
"role": "member",
340+
},
341+
],
342+
"repositories": [],
343+
}
344+
]

0 commit comments

Comments
 (0)