Skip to content

Commit

Permalink
Merge pull request #1159 from lbarcziova/projects-forge-api
Browse files Browse the repository at this point in the history
Add /projects/{forge} API endpoint

Needed for packit/dashboard#61

Reviewed-by: Jiri Popelka <None>
Reviewed-by: Tomas Tomecek <tomas@tomecek.net>
Reviewed-by: Laura Barcziová <None>
  • Loading branch information
softwarefactory-project-zuul[bot] committed Jul 15, 2021
2 parents d9aa3bf + f9d39cc commit a645d96
Show file tree
Hide file tree
Showing 5 changed files with 92 additions and 0 deletions.
13 changes: 13 additions & 0 deletions packit_service/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -258,6 +258,19 @@ def get_projects(cls, first: int, last: int) -> Iterable["GitProjectModel"]:
)[first:last]
return projects

@classmethod
def get_forge(
cls, first: int, last: int, forge: str
) -> Iterable["GitProjectModel"]:
"""Return projects of given forge"""
with get_sa_session() as session:
projects = (
session.query(GitProjectModel)
.filter_by(instance_url=forge)
.order_by(GitProjectModel.namespace)[first:last]
)
return projects

@classmethod
def get_namespace(cls, forge: str, namespace: str) -> Iterable["GitProjectModel"]:
"""Return projects of given forge and namespace"""
Expand Down
35 changes: 35 additions & 0 deletions packit_service/service/api/projects.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,41 @@ def get(self, forge, namespace, repo_name):
return response_maker(project_info)


@ns.route("/<forge>")
@ns.param("forge", "Git Forge")
class ProjectsForge(Resource):
@ns.expect(pagination_arguments)
@ns.response(HTTPStatus.PARTIAL_CONTENT.value, "Projects list follows")
@ns.response(HTTPStatus.OK.value, "OK")
def get(self, forge):
"""List of projects of given forge (e.g. github.com, gitlab.com)"""

result = []
first, last = indices()

projects_list = GitProjectModel.get_forge(first, last, forge)
if not projects_list:
return response_maker([])
for project in projects_list:
project_info = {
"namespace": project.namespace,
"repo_name": project.repo_name,
"project_url": project.project_url,
"prs_handled": len(project.pull_requests),
"branches_handled": len(project.branches),
"releases_handled": len(project.releases),
"issues_handled": len(project.issues),
}
result.append(project_info)

resp = response_maker(
result,
status=HTTPStatus.PARTIAL_CONTENT.value,
)
resp.headers["Content-Range"] = f"git-projects {first + 1}-{last}/*"
return resp


@ns.route("/<forge>/<namespace>")
@ns.param("forge", "Git Forge")
@ns.param("namespace", "Namespace")
Expand Down
18 changes: 18 additions & 0 deletions tests_requre/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -802,6 +802,24 @@ def multiple_installation_entries(installation_events):
clean_db()


@pytest.fixture()
def multiple_forge_projects():
yield [
GitProjectModel.get_or_create(
"namespace", "repo", "https://github.com/namespace/repo"
),
GitProjectModel.get_or_create(
"namespace", "different-repo", "https://github.com/namespace/different-repo"
),
GitProjectModel.get_or_create(
"namespace", "repo", "https://gitlab.com/namespace/repo"
),
GitProjectModel.get_or_create(
"namespace", "repo", "https://git.stg.centos.org/namespace/repo"
),
]


@pytest.fixture()
def release_event_dict():
"""
Expand Down
12 changes: 12 additions & 0 deletions tests_requre/database/test_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -599,6 +599,18 @@ def test_get_project(clean_before_and_after, a_copr_build_for_pr):
assert project.project_url == "https://github.com/the-namespace/the-repo-name"


def test_get_forge(clean_before_and_after, multiple_forge_projects):
projects = GitProjectModel.get_forge(0, 10, "github.com")
assert projects
assert len(projects) == 2

projects = GitProjectModel.get_forge(0, 10, "gitlab.com")
assert len(projects) == 1

projects = GitProjectModel.get_forge(0, 10, "git.stg.centos.org")
assert len(projects) == 1


def test_get_namespace(clean_before_and_after, multiple_copr_builds):
projects = GitProjectModel.get_namespace("github.com", "the-namespace")
assert projects[0].namespace == "the-namespace"
Expand Down
14 changes: 14 additions & 0 deletions tests_requre/service/test_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -287,6 +287,20 @@ def test_get_projects_list(client, clean_before_and_after, a_copr_build_for_pr):
assert response_dict[0]["prs_handled"] == 1


def test_get_projects_list_forge(
client, clean_before_and_after, multiple_forge_projects
):
"""Test Get Projects by Forge"""
response = client.get(
url_for(
"api.projects_projects_forge",
forge="github.com",
)
)
response_dict = response.json
assert len(response_dict) == 2


def test_get_projects_list_namespace(
client, clean_before_and_after, multiple_copr_builds
):
Expand Down

0 comments on commit a645d96

Please sign in to comment.