diff --git a/github/Organization.py b/github/Organization.py index adee8a3e..2f84f415 100644 --- a/github/Organization.py +++ b/github/Organization.py @@ -48,6 +48,8 @@ from typing import Any import github.Event import github.GithubObject import github.NamedUser +import github.OrganizationSecret +import github.OrganizationVariable import github.PaginatedList import github.Plan import github.Project @@ -618,12 +620,12 @@ class Organization(github.GithubObject.CompletableGithubObject): selected_repositories: github.GithubObject.Opt[list[github.Repository.Repository]] = github.GithubObject.NotSet, ): """ - :calls: `PUT /orgs/{org}/actions/secrets/{secret_name} `_ + :calls: `PUT /orgs/{org}/actions/secrets/{secret_name} `_ :param secret_name: string :param unencrypted_value: string :param visibility: string :param selected_repositories: Optional list of :class:`github.Repository.Repository` - :rtype: bool + :rtype: github.OrganizationSecret.OrganizationSecret """ assert isinstance(secret_name, str), secret_name assert isinstance(unencrypted_value, str), unencrypted_value @@ -645,10 +647,46 @@ class Organization(github.GithubObject.CompletableGithubObject): if selected_repositories is not github.GithubObject.NotSet: put_parameters["selected_repository_ids"] = [element.id for element in selected_repositories] - status, headers, data = self._requester.requestJson( - "PUT", f"{self.url}/actions/secrets/{secret_name}", input=put_parameters + self._requester.requestJsonAndCheck("PUT", f"{self.url}/actions/secrets/{secret_name}", input=put_parameters) + + return github.OrganizationSecret.OrganizationSecret( + requester=self._requester, + headers={}, + attributes={ + "name": secret_name, + "visibility": visibility, + "selected_repositories_url": f"{self.url}/actions/secrets/{secret_name}/repositories", + "url": f"{self.url}/actions/secrets/{secret_name}", + }, + completed=False, + ) + + def get_secrets(self): + """ + Gets all organization secrets + :rtype: :class:`github.PaginatedList.PaginatedList` of :class:`github.OrganizationSecret.OrganizationSecret` + """ + return github.PaginatedList.PaginatedList( + github.OrganizationSecret.OrganizationSecret, + self._requester, + f"{self.url}/actions/secrets", + None, + list_item="secrets", + ) + + def get_secret(self, secret_name: str): + """ + :calls: 'GET /orgs/{org}/actions/secrets/{secret_name} `_ + :param secret_name: string + :rtype: github.OrganizationSecret.OrganizationSecret + """ + assert isinstance(secret_name, str), secret_name + return github.OrganizationSecret.OrganizationSecret( + requester=self._requester, + headers={}, + attributes={"url": f"{self.url}/actions/secrets/{secret_name}"}, + completed=False, ) - return status == 201 def create_team( self, @@ -694,14 +732,14 @@ class Organization(github.GithubObject.CompletableGithubObject): value: str, visibility: str = "all", selected_repositories: github.GithubObject.Opt[list[github.Repository.Repository]] = github.GithubObject.NotSet, - ) -> bool: + ) -> github.OrganizationVariable.OrganizationVariable: """ - :calls: `PUT /orgs/{org}/actions/variables/ `_ + :calls: `POST /orgs/{org}/actions/variables/ `_ :param variable_name: string :param value: string :param visibility: string :param selected_repositories: list of :class:`github.Repository.Repository` - :rtype: bool + :rtype: github.OrganizationVariable.OrganizationVariable """ assert isinstance(variable_name, str), variable_name assert isinstance(value, str), value @@ -720,10 +758,48 @@ class Organization(github.GithubObject.CompletableGithubObject): } if selected_repositories is not github.GithubObject.NotSet: post_parameters["selected_repository_ids"] = [element.id for element in selected_repositories] - status, headers, data = self._requester.requestJson( - "POST", f"{self.url}/actions/variables", input=post_parameters + + self._requester.requestJsonAndCheck("POST", f"{self.url}/actions/variables", input=post_parameters) + + return github.OrganizationVariable.OrganizationVariable( + requester=self._requester, + headers={}, + attributes={ + "name": variable_name, + "visibility": visibility, + "value": value, + "selected_repositories_url": f"{self.url}/actions/variables/{variable_name}/repositories", + "url": self.url, + }, + completed=False, + ) + + def get_variables(self): + """ + Gets all organization variables + :rtype: :class:`github.PaginatedList.PaginatedList` of :class:`github.OrganizationVariable.OrganizationVariable` + """ + return github.PaginatedList.PaginatedList( + github.OrganizationVariable.OrganizationVariable, + self._requester, + f"{self.url}/actions/variables", + None, + list_item="variables", + ) + + def get_variable(self, variable_name: str): + """ + :calls: 'GET /orgs/{org}/actions/variables/{variable_name} `_ + :param variable_name: string + :rtype: github.OrganizationVariable.OrganizationVariable + """ + assert isinstance(variable_name, str), variable_name + return github.OrganizationVariable.OrganizationVariable( + requester=self._requester, + headers={}, + attributes={"url": f"{self.url}/actions/variables/{variable_name}"}, + completed=False, ) - return status == 201 def delete_hook(self, id): """ @@ -734,26 +810,6 @@ class Organization(github.GithubObject.CompletableGithubObject): assert isinstance(id, int), id headers, data = self._requester.requestJsonAndCheck("DELETE", f"{self.url}/hooks/{id}") - def delete_secret(self, secret_name): - """ - :calls: `DELETE /orgs/{org}/actions/secrets/{secret_name} `_ - :param secret_name: string - :rtype: bool - """ - assert isinstance(secret_name, str), secret_name - status, headers, data = self._requester.requestJson("DELETE", f"{self.url}/actions/secrets/{secret_name}") - return status == 204 - - def delete_variable(self, variable_name: str) -> bool: - """ - :calls: `DELETE /orgs/{org}/actions/variables/{variable_name} `_ - :param variable_name: string - :rtype: bool - """ - assert isinstance(variable_name, str), variable_name - status, headers, data = self._requester.requestJson("DELETE", f"{self.url}/actions/variables/{variable_name}") - return status == 204 - def edit( self, billing_email=github.GithubObject.NotSet, @@ -833,46 +889,6 @@ class Organization(github.GithubObject.CompletableGithubObject): headers, data = self._requester.requestJsonAndCheck("PATCH", f"{self.url}/hooks/{id}", input=post_parameters) return github.Hook.Hook(self._requester, headers, data, completed=True) - def update_variable( - self, - variable_name: str, - value: str, - visibility: str = "all", - selected_repositories: github.GithubObject.Opt[list[github.Repository.Repository]] = github.GithubObject.NotSet, - ) -> bool: - """ - :calls: `PATCH /orgs/{org}/actions/variables/{variable_name} `_ - :param variable_name: string - :param value: string - :param visibility: string - :param selected_repositories: Optional list of :class:`github.Repository.Repository` - :rtype: bool - """ - assert isinstance(variable_name, str), variable_name - assert isinstance(value, str), value - assert isinstance(visibility, str), visibility - if visibility == "selected": - assert isinstance(selected_repositories, list) and all( - isinstance(element, github.Repository.Repository) for element in selected_repositories - ), selected_repositories - else: - assert selected_repositories is github.GithubObject.NotSet - - patch_parameters = { - "name": variable_name, - "value": value, - "visibility": visibility, - } - if selected_repositories is not github.GithubObject.NotSet: - patch_parameters["selected_repository_ids"] = [element.id for element in selected_repositories] - - status, headers, data = self._requester.requestJson( - "PATCH", - f"{self.url}/actions/variables/{variable_name}", - input=patch_parameters, - ) - return status == 204 - def get_events(self): """ :calls: `GET /orgs/{org}/events `_ diff --git a/github/Organization.pyi b/github/Organization.pyi index 8822c4ff..6f6aa5be 100644 --- a/github/Organization.pyi +++ b/github/Organization.pyi @@ -9,6 +9,8 @@ from github.Issue import Issue from github.Label import Label from github.Migration import Migration from github.NamedUser import NamedUser +from github.OrganizationSecret import OrganizationSecret +from github.OrganizationVariable import OrganizationVariable from github.PaginatedList import PaginatedList from github.Plan import Plan from github.Project import Project @@ -70,13 +72,20 @@ class Organization(CompletableGithubObject): allow_merge_commit: Union[bool, _NotSetType] = ..., allow_rebase_merge: Union[bool, _NotSetType] = ..., ) -> Repository: ... + def get_secrets( + self, + ) -> PaginatedList[OrganizationSecret]: ... + def get_secret( + self, + secret_name: str, + ) -> OrganizationSecret: ... def create_secret( self, secret_name: str, unencrypted_value: str, visibility: str = ..., selected_repositories: Union[List[Repository], _NotSetType] = ..., - ) -> bool: ... + ) -> OrganizationSecret: ... def create_team( self, name: str, @@ -85,24 +94,29 @@ class Organization(CompletableGithubObject): privacy: Union[str, _NotSetType] = ..., description: Union[str, _NotSetType] = ..., ) -> Team: ... + def get_variables( + self, + ) -> PaginatedList[OrganizationVariable]: ... + def get_variable( + self, + variable_name: str, + ) -> OrganizationVariable: ... def create_variable( self, variable_name: str, value: str, visibility: str = ..., selected_repositories: Union[List[Repository], _NotSetType] = ..., - ) -> bool: ... + ) -> OrganizationVariable: ... @property def created_at(self) -> datetime: ... def delete_hook(self, id: int) -> None: ... @property def default_repository_permission(self) -> str: ... - def delete_secret(self, secret_name: str) -> bool: ... @property def description(self) -> str: ... @property def disk_usage(self) -> int: ... - def delete_variable(self, variable_name: str) -> bool: ... def edit( self, billing_email: Union[str, _NotSetType] = ..., @@ -121,13 +135,6 @@ class Organization(CompletableGithubObject): events: Union[_NotSetType, List[str]] = ..., active: Union[bool, _NotSetType] = ..., ) -> Hook: ... - def update_variable( - self, - variable_name: str, - value: str, - visibility: str = ..., - selected_repositories: Union[List[Repository], _NotSetType] = ..., - ) -> bool: ... @property def email(self) -> Optional[str]: ... @property diff --git a/github/OrganizationSecret.py b/github/OrganizationSecret.py new file mode 100644 index 00000000..5b606932 --- /dev/null +++ b/github/OrganizationSecret.py @@ -0,0 +1,126 @@ +############################ Copyrights and license ############################ +# # +# Copyright 2023 Mauricio Martinez # +# # +# This file is part of PyGithub. # +# http://pygithub.readthedocs.io/ # +# # +# PyGithub is free software: you can redistribute it and/or modify it under # +# the terms of the GNU Lesser General Public License as published by the Free # +# Software Foundation, either version 3 of the License, or (at your option) # +# any later version. # +# # +# PyGithub is distributed in the hope that it will be useful, but WITHOUT ANY # +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # +# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more # +# details. # +# # +# You should have received a copy of the GNU Lesser General Public License # +# along with PyGithub. If not, see . # +# # +################################################################################ + +from datetime import datetime +from typing import Any, Dict + +from github.GithubObject import Attribute, NotSet +from github.PaginatedList import PaginatedList +from github.Repository import Repository +from github.Secret import Secret + + +class OrganizationSecret(Secret): + """ + This class represents a org level GitHub secret. The reference can be found here https://docs.github.com/en/rest/actions/secrets + """ + + def _initAttributes(self) -> None: + self._name: Attribute[str] = NotSet + self._created_at: Attribute[datetime] = NotSet + self._updated_at: Attribute[datetime] = NotSet + self._visibility: Attribute[str] = NotSet + self._selected_repositories: Attribute[PaginatedList[Repository]] = NotSet + self._selected_repositories_url: Attribute[str] = NotSet + self._url: Attribute[str] = NotSet + + @property + def visibility(self) -> str: + """ + :type: string + """ + self._completeIfNotSet(self._visibility) + return self._visibility.value + + @property + def selected_repositories(self) -> PaginatedList[Repository]: + return PaginatedList( + Repository, + self._requester, + self._selected_repositories_url.value, + None, + list_item="repositories", + ) + + def edit( + self, + value: str, + visibility: str = "all", + ) -> bool: + """ + :calls: `PATCH /orgs/{org}/actions/secrets/{variable_name} `_ + :param variable_name: string + :param value: string + :param visibility: string + :rtype: bool + """ + assert isinstance(value, str), value + assert isinstance(visibility, str), visibility + + patch_parameters: Dict[str, Any] = { + "name": self.name, + "value": value, + "visibility": visibility, + } + + status, _, _ = self._requester.requestJson( + "PATCH", + f"{self.url}/actions/secrets/{self.name}", + input=patch_parameters, + ) + return status == 204 + + def add_repo(self, repo: Repository) -> bool: + """ + :calls: 'PUT {org_url}/actions/secrets/{secret_name} `_ + :param repo: github.Repository.Repository + :rtype: bool + """ + if self.visibility != "selected": + return False + self._requester.requestJsonAndCheck("PUT", f"{self._selected_repositories_url.value}/{repo.id}") + return True + + def remove_repo(self, repo: Repository) -> bool: + """ + :calls: 'DELETE {org_url}/actions/secrets/{secret_name} `_ + :param repo: github.Repository.Repository + :rtype: bool + """ + if self.visibility != "selected": + return False + self._requester.requestJsonAndCheck("DELETE", f"{self._selected_repositories_url.value}/{repo.id}") + return True + + def _useAttributes(self, attributes: Dict[str, Any]) -> None: + if "name" in attributes: + self._name = self._makeStringAttribute(attributes["name"]) + if "created_at" in attributes: + self._created_at = self._makeDatetimeAttribute(attributes["created_at"]) + if "updated_at" in attributes: + self._updated_at = self._makeDatetimeAttribute(attributes["updated_at"]) + if "visibility" in attributes: + self._visibility = self._makeStringAttribute(attributes["visibility"]) + if "selected_repositories_url" in attributes: + self._selected_repositories_url = self._makeStringAttribute(attributes["selected_repositories_url"]) + if "url" in attributes: + self._url = self._makeStringAttribute(attributes["url"]) diff --git a/github/OrganizationVariable.py b/github/OrganizationVariable.py new file mode 100644 index 00000000..3d7f9c2a --- /dev/null +++ b/github/OrganizationVariable.py @@ -0,0 +1,126 @@ +############################ Copyrights and license ############################ +# # +# Copyright 2023 Mauricio Martinez # +# # +# This file is part of PyGithub. # +# http://pygithub.readthedocs.io/ # +# # +# PyGithub is free software: you can redistribute it and/or modify it under # +# the terms of the GNU Lesser General Public License as published by the Free # +# Software Foundation, either version 3 of the License, or (at your option) # +# any later version. # +# # +# PyGithub is distributed in the hope that it will be useful, but WITHOUT ANY # +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # +# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more # +# details. # +# # +# You should have received a copy of the GNU Lesser General Public License # +# along with PyGithub. If not, see . # +# # +################################################################################ + +from datetime import datetime +from typing import Any, Dict + +from github.GithubObject import Attribute, NotSet +from github.PaginatedList import PaginatedList +from github.Repository import Repository +from github.Variable import Variable + + +class OrganizationVariable(Variable): + """ + This class represents a org level GitHub variable. The reference can be found here https://docs.github.com/en/rest/actions/variables + """ + + def _initAttributes(self) -> None: + self._name: Attribute[str] = NotSet + self._created_at: Attribute[datetime] = NotSet + self._updated_at: Attribute[datetime] = NotSet + self._visibility: Attribute[str] = NotSet + self._selected_repositories: Attribute[PaginatedList[Repository]] = NotSet + self._selected_repositories_url: Attribute[str] = NotSet + self._url: Attribute[str] = NotSet + + @property + def visibility(self) -> str: + """ + :type: string + """ + self._completeIfNotSet(self._visibility) + return self._visibility.value + + @property + def selected_repositories(self) -> PaginatedList[Repository]: + return PaginatedList( + Repository, + self._requester, + self._selected_repositories_url.value, + None, + list_item="repositories", + ) + + def edit( + self, + value: str, + visibility: str = "all", + ) -> bool: + """ + :calls: `PATCH /orgs/{org}/actions/variables/{variable_name} `_ + :param variable_name: string + :param value: string + :param visibility: string + :rtype: bool + """ + assert isinstance(value, str), value + assert isinstance(visibility, str), visibility + + patch_parameters: Dict[str, Any] = { + "name": self.name, + "value": value, + "visibility": visibility, + } + + status, _, _ = self._requester.requestJson( + "PATCH", + f"{self.url}/actions/variables/{self.name}", + input=patch_parameters, + ) + return status == 204 + + def add_repo(self, repo: Repository) -> bool: + """ + :calls: 'PUT {org_url}/actions/variables/{variable_name} `_ + :param repo: github.Repository.Repository + :rtype: bool + """ + if self.visibility != "selected": + return False + self._requester.requestJsonAndCheck("PUT", f"{self._selected_repositories_url.value}/{repo.id}") + return True + + def remove_repo(self, repo: Repository) -> bool: + """ + :calls: 'DELETE {org_url}/actions/variables/{variable_name} `_ + :param repo: github.Repository.Repository + :rtype: bool + """ + if self.visibility != "selected": + return False + self._requester.requestJsonAndCheck("DELETE", f"{self._selected_repositories_url.value}/{repo.id}") + return True + + def _useAttributes(self, attributes: Dict[str, Any]) -> None: + if "name" in attributes: + self._name = self._makeStringAttribute(attributes["name"]) + if "created_at" in attributes: + self._created_at = self._makeDatetimeAttribute(attributes["created_at"]) + if "updated_at" in attributes: + self._updated_at = self._makeDatetimeAttribute(attributes["updated_at"]) + if "visibility" in attributes: + self._visibility = self._makeStringAttribute(attributes["visibility"]) + if "selected_repositories_url" in attributes: + self._selected_repositories_url = self._makeStringAttribute(attributes["selected_repositories_url"]) + if "url" in attributes: + self._url = self._makeStringAttribute(attributes["url"]) diff --git a/github/Repository.py b/github/Repository.py index 6220e0f4..2ed911b9 100644 --- a/github/Repository.py +++ b/github/Repository.py @@ -1565,7 +1565,7 @@ class Repository(github.GithubObject.CompletableGithubObject): def create_repository_dispatch(self, event_type, client_payload=github.GithubObject.NotSet): """ - :calls: POST /repos/{owner}/{repo}/dispatches + :calls: POST /repos/{owner}/{repo}/dispatches :param event_type: string :param client_payload: dict :rtype: bool @@ -1580,10 +1580,10 @@ class Repository(github.GithubObject.CompletableGithubObject): def create_secret(self, secret_name, unencrypted_value): """ - :calls: `PUT /repos/{owner}/{repo}/actions/secrets/{secret_name} `_ + :calls: `PUT /repos/{owner}/{repo}/actions/secrets/{secret_name} `_ :param secret_name: string :param unencrypted_value: string - :rtype: bool + :rtype: github.Secret.Secret """ assert isinstance(secret_name, str), secret_name assert isinstance(unencrypted_value, str), unencrypted_value @@ -1593,14 +1593,47 @@ class Repository(github.GithubObject.CompletableGithubObject): "key_id": public_key.key_id, "encrypted_value": payload, } - status, headers, data = self._requester.requestJson( - "PUT", f"{self.url}/actions/secrets/{secret_name}", input=put_parameters + self._requester.requestJsonAndCheck("PUT", f"{self.url}/actions/secrets/{secret_name}", input=put_parameters) + return github.Secret.Secret( + requester=self._requester, + headers={}, + attributes={ + "name": secret_name, + "url": f"{self.url}/actions/secrets/{secret_name}", + }, + completed=False, + ) + + def get_secrets(self): + """ + Gets all repository secrets + :rtype: :class:`github.PaginatedList.PaginatedList` of :class:`github.Secret.Secret` + """ + return github.PaginatedList.PaginatedList( + github.Secret.Secret, + self._requester, + f"{self.url}/actions/secrets", + None, + list_item="secrets", + ) + + def get_secret(self, secret_name: str): + """ + :calls: 'GET /repos/{owner}/{repo}/actions/secrets/{secret_name} `_ + :param secret_name: string + :rtype: github.Secret.Secret + """ + assert isinstance(secret_name, str), secret_name + return github.Secret.Secret( + requester=self._requester, + headers={}, + attributes={"url": f"{self.url}/actions/secrets/{secret_name}"}, + completed=False, ) - return status == 201 def create_variable(self, variable_name: str, value: str) -> bool: """ - :calls: `POST /repos/{owner}/{repo}/actions/variables/{variable_name} `_ + :calls: `POST /repos/{owner}/{repo}/actions/variables/{variable_name} `_ :param variable_name: string :param value: string :rtype: bool @@ -1611,50 +1644,44 @@ class Repository(github.GithubObject.CompletableGithubObject): "name": variable_name, "value": value, } - status, headers, data = self._requester.requestJson( - "POST", f"{self.url}/actions/variables", input=post_parameters + self._requester.requestJsonAndCheck("POST", f"{self.url}/actions/variables", input=post_parameters) + return github.Variable.Variable( + self._requester, + headers={}, + attributes={ + "name": variable_name, + "value": value, + "url": self.url, + }, + completed=False, ) - return status == 201 - def update_variable(self, variable_name: str, value: str) -> bool: + def get_variables(self): """ - :calls: `PATCH /repos/{owner}/{repo}/actions/variables/{variable_name} `_ + Gets all repository variables + :rtype: :class:`github.PaginatedList.PaginatedList` of :class:`github.Variable.Variable` + """ + return github.PaginatedList.PaginatedList( + github.Variable.Variable, + self._requester, + f"{self.url}/actions/variables", + None, + list_item="variables", + ) + + def get_variable(self, variable_name: str): + """ + :calls: 'GET /orgs/{org}/actions/variables/{variable_name} `_ :param variable_name: string - :param value: string - :rtype: bool + :rtype: github.Variable.Variable """ assert isinstance(variable_name, str), variable_name - assert isinstance(value, str), value - patch_parameters = { - "name": variable_name, - "value": value, - } - status, headers, data = self._requester.requestJson( - "PATCH", - f"{self.url}/actions/variables/{variable_name}", - input=patch_parameters, + return github.Variable.Variable( + requester=self._requester, + headers={}, + attributes={"url": f"{self.url}/actions/variables/{variable_name}"}, + completed=False, ) - return status == 204 - - def delete_secret(self, secret_name): - """ - :calls: `DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name} `_ - :param secret_name: string - :rtype: bool - """ - assert isinstance(secret_name, str), secret_name - status, headers, data = self._requester.requestJson("DELETE", f"{self.url}/actions/secrets/{secret_name}") - return status == 204 - - def delete_variable(self, variable_name: str) -> bool: - """ - :calls: `DELETE /repos/{owner}/{repo}/actions/variables/{variable_name} `_ - :param variable_name: string - :rtype: bool - """ - assert isinstance(variable_name, str), variable_name - status, headers, data = self._requester.requestJson("DELETE", f"{self.url}/actions/variables/{variable_name}") - return status == 204 def create_source_import( self, diff --git a/github/Repository.pyi b/github/Repository.pyi index 2d2bc9c8..0c91c9a4 100644 --- a/github/Repository.pyi +++ b/github/Repository.pyi @@ -57,6 +57,7 @@ from github.RepositoryAdvisoryVulnerability import ( ) from github.RepositoryKey import RepositoryKey from github.RepositoryPreferences import RepositoryPreferences +from github.Secret import Secret from github.SelfHostedActionsRunner import SelfHostedActionsRunner from github.SourceImport import SourceImport from github.Stargazer import Stargazer @@ -67,6 +68,7 @@ from github.StatsParticipation import StatsParticipation from github.StatsPunchCard import StatsPunchCard from github.Tag import Tag from github.Team import Team +from github.Variable import Variable from github.View import View from github.Workflow import Workflow from github.WorkflowRun import WorkflowRun @@ -282,9 +284,12 @@ class Repository(CompletableGithubObject): def create_repository_dispatch( self, event_type: str, client_payload: Union[Dict[str, Any], _NotSetType] = ... ) -> bool: ... - def create_secret(self, secret_name: str, unencrypted_value: str) -> bool: ... - def create_variable(self, variable_name: str, value: str) -> bool: ... - def update_variable(self, variable_name: str, value: str) -> bool: ... + def get_secrets(self) -> PaginatedList[Secret]: ... + def get_secret(self, secret_name: str) -> Secret: ... + def create_secret(self, secret_name: str, unencrypted_value: str) -> Secret: ... + def get_variables(self) -> PaginatedList[Variable]: ... + def get_variable(self, variable_name: str) -> Variable: ... + def create_variable(self, variable_name: str, value: str) -> Variable: ... def delete_secret(self, secret_name: str) -> bool: ... def delete_variable(self, variable_name: str) -> bool: ... def create_source_import( diff --git a/github/Secret.py b/github/Secret.py new file mode 100644 index 00000000..0f46fec8 --- /dev/null +++ b/github/Secret.py @@ -0,0 +1,89 @@ +############################ Copyrights and license ############################ +# # +# Copyright 2023 Mauricio Martinez # +# # +# This file is part of PyGithub. # +# http://pygithub.readthedocs.io/ # +# # +# PyGithub is free software: you can redistribute it and/or modify it under # +# the terms of the GNU Lesser General Public License as published by the Free # +# Software Foundation, either version 3 of the License, or (at your option) # +# any later version. # +# # +# PyGithub is distributed in the hope that it will be useful, but WITHOUT ANY # +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # +# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more # +# details. # +# # +# You should have received a copy of the GNU Lesser General Public License # +# along with PyGithub. If not, see . # +# # +################################################################################ + +from datetime import datetime +from typing import Any, Dict + +from github.GithubObject import Attribute, CompletableGithubObject, NotSet + + +class Secret(CompletableGithubObject): + """ + This class represents a GitHub secret. The reference can be found here https://docs.github.com/en/rest/actions/secrets + """ + + def _initAttributes(self) -> None: + self._name: Attribute[str] = NotSet + self._created_at: Attribute[datetime] = NotSet + self._updated_at: Attribute[datetime] = NotSet + self._url: Attribute[str] = NotSet + + def __repr__(self) -> str: + return self.get__repr__({"name": self.name}) + + @property + def name(self) -> str: + """ + :type: string + """ + self._completeIfNotSet(self._name) + return self._name.value + + @property + def created_at(self) -> datetime: + """ + :type: datetime.datetime + """ + self._completeIfNotSet(self._created_at) + return self._created_at.value + + @property + def updated_at(self) -> datetime: + """ + :type: datetime.datetime + """ + self._completeIfNotSet(self._updated_at) + return self._updated_at.value + + @property + def url(self) -> str: + """ + :type: string + """ + return self._url.value + + def delete(self) -> None: + """ + :calls: `DELETE {secret_url} `_ + :rtype: None + """ + self._requester.requestJsonAndCheck("DELETE", self.url) + + def _useAttributes(self, attributes: Dict[str, Any]) -> None: + if "name" in attributes: + self._name = self._makeStringAttribute(attributes["name"]) + if "created_at" in attributes: + self._created_at = self._makeDatetimeAttribute(attributes["created_at"]) + if "updated_at" in attributes: + self._updated_at = self._makeDatetimeAttribute(attributes["updated_at"]) + if "url" in attributes: + self._url = self._makeStringAttribute(attributes["url"]) diff --git a/github/Variable.py b/github/Variable.py new file mode 100644 index 00000000..5e440ebd --- /dev/null +++ b/github/Variable.py @@ -0,0 +1,121 @@ +############################ Copyrights and license ############################ +# # +# Copyright 2023 Mauricio Martinez # +# # +# This file is part of PyGithub. # +# http://pygithub.readthedocs.io/ # +# # +# PyGithub is free software: you can redistribute it and/or modify it under # +# the terms of the GNU Lesser General Public License as published by the Free # +# Software Foundation, either version 3 of the License, or (at your option) # +# any later version. # +# # +# PyGithub is distributed in the hope that it will be useful, but WITHOUT ANY # +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # +# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more # +# details. # +# # +# You should have received a copy of the GNU Lesser General Public License # +# along with PyGithub. If not, see . # +# # +################################################################################ + +from __future__ import annotations + +from datetime import datetime +from typing import Any + +from github.GithubObject import Attribute, CompletableGithubObject, NotSet + + +class Variable(CompletableGithubObject): + """ + This class represents a GitHub variable. The reference can be found here https://docs.github.com/en/rest/actions/variables + """ + + def _initAttributes(self) -> None: + self._name: Attribute[str] = NotSet + self._value: Attribute[str] = NotSet + self._created_at: Attribute[datetime] = NotSet + self._updated_at: Attribute[datetime] = NotSet + self._url: Attribute[str] = NotSet + + def __repr__(self) -> str: + return self.get__repr__({"name": self.name}) + + @property + def name(self) -> str: + """ + :type: string + """ + self._completeIfNotSet(self._name) + return self._name.value + + @property + def value(self) -> str: + """ + :type: string + """ + self._completeIfNotSet(self._value) + return self._value.value + + @property + def created_at(self) -> datetime: + """ + :type: datetime.datetime + """ + self._completeIfNotSet(self._created_at) + return self._created_at.value + + @property + def updated_at(self) -> datetime: + """ + :type: datetime.datetime + """ + self._completeIfNotSet(self._updated_at) + return self._updated_at.value + + @property + def url(self) -> str: + """ + :type: string + """ + return self._url.value + + def edit(self, value: str) -> bool: + """ + :calls: `PATCH /repos/{owner}/{repo}/actions/variables/{variable_name} `_ + :param variable_name: string + :param value: string + :rtype: bool + """ + assert isinstance(value, str), value + patch_parameters = { + "name": self.name, + "value": value, + } + status, _, _ = self._requester.requestJson( + "PATCH", + f"{self.url}/actions/variables/{self.name}", + input=patch_parameters, + ) + return status == 204 + + def delete(self) -> None: + """ + :calls: `DELETE {variable_url} `_ + :rtype: None + """ + self._requester.requestJsonAndCheck("DELETE", f"{self.url}/actions/variables/{self.name}") + + def _useAttributes(self, attributes: dict[str, Any]) -> None: + if "name" in attributes: + self._name = self._makeStringAttribute(attributes["name"]) + if "value" in attributes: + self._value = self._makeStringAttribute(attributes["value"]) + if "created_at" in attributes: + self._created_at = self._makeDatetimeAttribute(attributes["created_at"]) + if "updated_at" in attributes: + self._updated_at = self._makeDatetimeAttribute(attributes["updated_at"]) + if "url" in attributes: + self._url = self._makeStringAttribute(attributes["url"]) diff --git a/tests/Organization.py b/tests/Organization.py index c81be1d1..2343b687 100644 --- a/tests/Organization.py +++ b/tests/Organization.py @@ -399,17 +399,32 @@ class Organization(Framework.TestCase): def testCreateSecret(self, encrypt): # encrypt returns a non-deterministic value, we need to mock it so the replay data matches encrypt.return_value = "M+5Fm/BqTfB90h3nC7F3BoZuu3nXs+/KtpXwxm9gG211tbRo0F5UiN0OIfYT83CKcx9oKES9Va4E96/b" - self.assertTrue(self.org.create_secret("secret-name", "secret-value", "all")) + secret = self.org.create_secret("secret-name", "secret-value", "all") + self.assertIsNotNone(secret) @mock.patch("github.PublicKey.encrypt") def testCreateSecretSelected(self, encrypt): - # encrypt returns a non-deterministic value, we need to mock it so the replay data matches repos = [self.org.get_repo("TestPyGithub"), self.org.get_repo("FatherBeaver")] + # encrypt returns a non-deterministic value, we need to mock it so the replay data matches encrypt.return_value = "M+5Fm/BqTfB90h3nC7F3BoZuu3nXs+/KtpXwxm9gG211tbRo0F5UiN0OIfYT83CKcx9oKES9Va4E96/b" - self.assertTrue(self.org.create_secret("secret-name", "secret-value", "selected", repos)) + secret = self.org.create_secret("secret-name", "secret-value", "selected", repos) + self.assertIsNotNone(secret) + self.assertEqual(secret.visibility, "selected") + self.assertEqual(list(secret.selected_repositories), repos) - def testDeleteSecret(self): - self.assertTrue(self.org.delete_secret("secret-name")) + def testGetSecret(self): + repos = [self.org.get_repo("TestPyGithub"), self.org.get_repo("FatherBeaver")] + secret = self.org.get_secret("secret-name") + self.assertEqual(secret.name, "secret-name") + self.assertEqual(secret.created_at, datetime(2019, 8, 10, 14, 59, 22, tzinfo=timezone.utc)) + self.assertEqual(secret.updated_at, datetime(2020, 1, 10, 14, 59, 22, tzinfo=timezone.utc)) + self.assertEqual(secret.visibility, "selected") + self.assertEqual(list(secret.selected_repositories), repos) + self.assertEqual(secret.url, "https://api.github.com/orgs/BeaverSoftware/actions/secrets/secret-name") + + def testGetSecrets(self): + secrets = self.org.get_secrets() + self.assertEqual(len(list(secrets)), 1) def testInviteUserWithNeither(self): with self.assertRaises(AssertionError) as raisedexp: @@ -461,8 +476,26 @@ class Organization(Framework.TestCase): self.assertEqual(installations[0].target_type, "User") self.assertEqual(installations.totalCount, 1) - def testOrgVariable(self): - self.org = self.g.get_organization("tecnoly") - self.assertTrue(self.org.create_variable("variable_name", "variable-value")) - self.assertTrue(self.org.update_variable("variable_name", "variable-value123")) - self.assertTrue(self.org.delete_variable("variable_name")) + def testCreateVariable(self): + variable = self.org.create_variable("variable-name", "variable-value", "all") + self.assertIsNotNone(variable) + + def testCreateVariableSelected(self): + repos = [self.org.get_repo("TestPyGithub"), self.org.get_repo("FatherBeaver")] + variable = self.org.create_variable("variable-name", "variable-value", "selected", repos) + self.assertIsNotNone(variable) + self.assertEqual(list(variable.selected_repositories), repos) + + def testGetVariable(self): + repos = [self.org.get_repo("TestPyGithub"), self.org.get_repo("FatherBeaver")] + variable = self.org.get_variable("variable-name") + self.assertEqual(variable.name, "variable-name") + self.assertEqual(variable.created_at, datetime(2019, 8, 10, 14, 59, 22, tzinfo=timezone.utc)) + self.assertEqual(variable.updated_at, datetime(2020, 1, 10, 14, 59, 22, tzinfo=timezone.utc)) + self.assertEqual(variable.visibility, "selected") + self.assertEqual(list(variable.selected_repositories), repos) + self.assertEqual(variable.url, "https://api.github.com/orgs/BeaverSoftware/actions/variables/variable-name") + + def testGetVariables(self): + variables = self.org.get_variables() + self.assertEqual(len(list(variables)), 1) diff --git a/tests/ReplayData/Organization.testCreateSecret.txt b/tests/ReplayData/Organization.testCreateSecret.txt index 3188f76c..be828cce 100644 --- a/tests/ReplayData/Organization.testCreateSecret.txt +++ b/tests/ReplayData/Organization.testCreateSecret.txt @@ -18,4 +18,4 @@ None {"encrypted_value": "M+5Fm/BqTfB90h3nC7F3BoZuu3nXs+/KtpXwxm9gG211tbRo0F5UiN0OIfYT83CKcx9oKES9Va4E96/b", "key_id": "568250167242549743", "visibility": "all"} 201 [('Date', 'Fri, 17 Apr 2020 00:12:33 GMT'), ('Server', 'GitHub.com'), ('Content-Length', '2'), ('Content-Type', 'application/json; charset=utf-8'), ('Status', '201 Created'), ('X-RateLimit-Limit', '5000'), ('X-RateLimit-Remaining', '4984'), ('X-RateLimit-Reset', '1587085388'), ('X-OAuth-Scopes', 'read:org, repo, user'), ('X-Accepted-OAuth-Scopes', ''), ('X-GitHub-Media-Type', 'github.v3; format=json'), ('Access-Control-Expose-Headers', 'ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, Deprecation, Sunset'), ('Access-Control-Allow-Origin', '*'), ('Strict-Transport-Security', 'max-age=31536000; includeSubdomains; preload'), ('X-Frame-Options', 'deny'), ('X-Content-Type-Options', 'nosniff'), ('X-XSS-Protection', '1; mode=block'), ('Referrer-Policy', 'origin-when-cross-origin, strict-origin-when-cross-origin'), ('Content-Security-Policy', "default-src 'none'"), ('Vary', 'Accept-Encoding, Accept, X-Requested-With'), ('X-GitHub-Request-Id', 'C290:52DA:50234:B404B:5E98F470')] -{} \ No newline at end of file +{} diff --git a/tests/ReplayData/Organization.testCreateSecretSelected.txt b/tests/ReplayData/Organization.testCreateSecretSelected.txt index 5f1fbdaa..b83840e8 100644 --- a/tests/ReplayData/Organization.testCreateSecretSelected.txt +++ b/tests/ReplayData/Organization.testCreateSecretSelected.txt @@ -41,3 +41,14 @@ None 201 [('Date', 'Fri, 17 Apr 2020 00:12:33 GMT'), ('Server', 'GitHub.com'), ('Content-Length', '2'), ('Content-Type', 'application/json; charset=utf-8'), ('Status', '201 Created'), ('X-RateLimit-Limit', '5000'), ('X-RateLimit-Remaining', '4984'), ('X-RateLimit-Reset', '1587085388'), ('X-OAuth-Scopes', 'read:org, repo, user'), ('X-Accepted-OAuth-Scopes', ''), ('X-GitHub-Media-Type', 'github.v3; format=json'), ('Access-Control-Expose-Headers', 'ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, Deprecation, Sunset'), ('Access-Control-Allow-Origin', '*'), ('Strict-Transport-Security', 'max-age=31536000; includeSubdomains; preload'), ('X-Frame-Options', 'deny'), ('X-Content-Type-Options', 'nosniff'), ('X-XSS-Protection', '1; mode=block'), ('Referrer-Policy', 'origin-when-cross-origin, strict-origin-when-cross-origin'), ('Content-Security-Policy', "default-src 'none'"), ('Vary', 'Accept-Encoding, Accept, X-Requested-With'), ('X-GitHub-Request-Id', 'C290:52DA:50234:B404B:5E98F470')] {} + +https +GET +api.github.com +None +/orgs/BeaverSoftware/actions/secrets/secret-name/repositories +{'Authorization': 'Basic login_and_password_removed', 'User-Agent': 'PyGithub/Python'} +None +200 +[('status', '200 OK'), ('x-ratelimit-remaining', '4978'), ('content-length', '487'), ('server', 'nginx/1.0.13'), ('connection', 'keep-alive'), ('x-ratelimit-limit', '5000'), ('etag', '"1dd282b50e691f8f162ef9355dad8771"'), ('date', 'Thu, 10 May 2012 19:03:19 GMT'), ('content-type', 'application/json; charset=utf-8')] +{"total_count": 2, "repositories": [{"clone_url":"https://github.com/BeaverSoftware/TestPyGithub.git","has_downloads":true,"watchers":1,"git_url":"git://github.com/BeaverSoftware/TestPyGithub.git","updated_at":"2012-04-25T06:51:38Z","permissions":{"pull":true,"admin":true,"push":true},"homepage":"http://vincent-jacques.net/PyGithub","url":"https://api.github.com/repos/BeaverSoftware/TestPyGithub","has_wiki":true,"has_pages":false,"has_issues":false,"fork":false,"forks":0,"mirror_url":null,"size":112,"private":false,"open_issues":0,"svn_url":"https://github.com/BeaverSoftware/TestPyGithub","owner":{"url":"https://api.github.com/users/BeaverSoftware","gravatar_id":"d563e337cac2fdc644e2aaaad1e23266","login":"BeaverSoftware","id":1424031,"avatar_url":"https://secure.gravatar.com/avatar/d563e337cac2fdc644e2aaaad1e23266?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-orgs.png"},"name":"TestPyGithub","language":null,"description":"Guinea-pig for PyGithub testing","ssh_url":"git@github.com:BeaverSoftware/TestPyGithub.git","pushed_at":"2012-03-03T08:57:40Z","created_at":"2012-03-03T07:53:19Z","id":3609352,"html_url":"https://github.com/BeaverSoftware/TestPyGithub","full_name":"BeaverSoftware/TestPyGithub"}, {"clone_url":"https://github.com/BeaverSoftware/FatherBeaver.git","has_downloads":true,"watchers":2,"git_url":"git://github.com/BeaverSoftware/FatherBeaver.git","updated_at":"2012-02-16T21:51:15Z","permissions":{"pull":true,"admin":true,"push":true},"homepage":"","url":"https://api.github.com/repos/BeaverSoftware/FatherBeaver","has_wiki":true,"has_pages":true,"has_issues":true,"fork":false,"forks":1,"mirror_url":null,"size":0,"private":false,"open_issues":0,"svn_url":"https://github.com/BeaverSoftware/FatherBeaver","owner":{"url":"https://api.github.com/users/BeaverSoftware","gravatar_id":"d563e337cac2fdc644e2aaaad1e23266","login":"BeaverSoftware","id":1424031,"avatar_url":"https://secure.gravatar.com/avatar/d563e337cac2fdc644e2aaaad1e23266?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-orgs.png"},"name":"FatherBeaver","language":null,"description":"","ssh_url":"git@github.com:BeaverSoftware/FatherBeaver.git","pushed_at":null,"created_at":"2012-02-09T19:32:21Z","id":3400397,"html_url":"https://github.com/BeaverSoftware/FatherBeaver","full_name":"BeaverSoftware/FatherBeaver"}]} diff --git a/tests/ReplayData/Organization.testCreateVariable.txt b/tests/ReplayData/Organization.testCreateVariable.txt new file mode 100644 index 00000000..3f0b2676 --- /dev/null +++ b/tests/ReplayData/Organization.testCreateVariable.txt @@ -0,0 +1,10 @@ +https +POST +api.github.com +None +/orgs/BeaverSoftware/actions/variables +{'Authorization': 'Basic login_and_password_removed', 'User-Agent': 'PyGithub/Python', 'Content-Type': 'application/json'} +{"name": "variable-name", "value": "variable-value", "visibility": "all"} +201 +[('Server', 'GitHub.com'), ('Date', 'Wed, 28 Jun 2023 19:19:26 GMT'), ('Content-Type', 'application/json; charset=utf-8'), ('Content-Length', '2'), ('Cache-Control', 'private, max-age=60, s-maxage=60'), ('Vary', 'Accept, Authorization, Cookie, X-GitHub-OTP, Accept-Encoding, Accept, X-Requested-With'), ('ETag', '"ab9b40dea6722e415dd424b31be226eac6da76ca693e83c73fed865610a4937e"'), ('X-OAuth-Scopes', 'admin:enterprise, admin:gpg_key, admin:org, admin:org_hook, admin:public_key, admin:repo_hook, admin:ssh_signing_key, audit_log, codespace, delete:packages, delete_repo, gist, notifications, project, repo, user, workflow, write:discussion, write:packages'), ('X-Accepted-OAuth-Scopes', 'admin:org'), ('github-authentication-token-expiration', '2023-07-05 17:42:21 UTC'), ('X-GitHub-Media-Type', 'github.v3; format=json'), ('x-github-api-version-selected', '2022-11-28'), ('X-RateLimit-Limit', '5000'), ('X-RateLimit-Remaining', '4905'), ('X-RateLimit-Reset', '1687981543'), ('X-RateLimit-Used', '95'), ('X-RateLimit-Resource', 'core'), ('Access-Control-Expose-Headers', 'ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset'), ('Access-Control-Allow-Origin', '*'), ('Strict-Transport-Security', 'max-age=31536000; includeSubdomains; preload'), ('X-Frame-Options', 'deny'), ('X-Content-Type-Options', 'nosniff'), ('X-XSS-Protection', '0'), ('Referrer-Policy', 'origin-when-cross-origin, strict-origin-when-cross-origin'), ('Content-Security-Policy', "default-src 'none'"), ('X-GitHub-Request-Id', '6FD1:95BE:1234AD:24C286:649C87BD')] +{} diff --git a/tests/ReplayData/Organization.testCreateVariableSelected.txt b/tests/ReplayData/Organization.testCreateVariableSelected.txt new file mode 100644 index 00000000..10b0e05b --- /dev/null +++ b/tests/ReplayData/Organization.testCreateVariableSelected.txt @@ -0,0 +1,43 @@ +https +GET +api.github.com +None +/repos/BeaverSoftware/TestPyGithub +{'Authorization': 'Basic login_and_password_removed', 'User-Agent': 'PyGithub/Python', 'Accept': 'application/vnd.github.nebula-preview+json'} +None +200 +[('status', '200 OK'), ('x-ratelimit-remaining', '4992'), ('content-length', '1431'), ('server', 'nginx/1.0.13'), ('connection', 'keep-alive'), ('x-ratelimit-limit', '5000'), ('etag', '"4ecd2c151a469cfa6cd45e6beff1269b"'), ('date', 'Fri, 01 Jun 2012 19:40:56 GMT'), ('content-type', 'application/json; charset=utf-8')] +{"clone_url":"https://github.com/BeaverSoftware/TestPyGithub.git","has_downloads":true,"watchers":1,"git_url":"git://github.com/BeaverSoftware/TestPyGithub.git","updated_at":"2012-04-25T06:51:38Z","permissions":{"pull":true,"admin":true,"push":true},"homepage":"http://vincent-jacques.net/PyGithub","url":"https://api.github.com/repos/BeaverSoftware/TestPyGithub","has_wiki":true,"has_pages":false,"has_issues":false,"fork":false,"forks":0,"mirror_url":null,"size":112,"private":false,"open_issues":0,"svn_url":"https://github.com/BeaverSoftware/TestPyGithub","owner":{"url":"https://api.github.com/users/BeaverSoftware","gravatar_id":"d563e337cac2fdc644e2aaaad1e23266","login":"BeaverSoftware","id":1424031,"avatar_url":"https://secure.gravatar.com/avatar/d563e337cac2fdc644e2aaaad1e23266?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-orgs.png"},"name":"TestPyGithub","language":null,"description":"Guinea-pig for PyGithub testing","ssh_url":"git@github.com:BeaverSoftware/TestPyGithub.git","pushed_at":"2012-03-03T08:57:40Z","created_at":"2012-03-03T07:53:19Z","id":3609352,"html_url":"https://github.com/BeaverSoftware/TestPyGithub","full_name":"BeaverSoftware/TestPyGithub"} + +https +GET +api.github.com +None +/repos/BeaverSoftware/FatherBeaver +{'Authorization': 'Basic login_and_password_removed', 'User-Agent': 'PyGithub/Python', 'Accept': 'application/vnd.github.nebula-preview+json'} +None +200 +[('status', '200 OK'), ('x-ratelimit-remaining', '4992'), ('content-length', '1431'), ('server', 'nginx/1.0.13'), ('connection', 'keep-alive'), ('x-ratelimit-limit', '5000'), ('etag', '"4ecd2c151a469cfa6cd45e6beff1269b"'), ('date', 'Fri, 01 Jun 2012 19:40:56 GMT'), ('content-type', 'application/json; charset=utf-8')] +{"clone_url":"https://github.com/BeaverSoftware/FatherBeaver.git","has_downloads":true,"watchers":2,"git_url":"git://github.com/BeaverSoftware/FatherBeaver.git","updated_at":"2012-02-16T21:51:15Z","permissions":{"pull":true,"admin":true,"push":true},"homepage":"","url":"https://api.github.com/repos/BeaverSoftware/FatherBeaver","has_wiki":true,"has_pages":true,"has_issues":true,"fork":false,"forks":1,"mirror_url":null,"size":0,"private":false,"open_issues":0,"svn_url":"https://github.com/BeaverSoftware/FatherBeaver","owner":{"url":"https://api.github.com/users/BeaverSoftware","gravatar_id":"d563e337cac2fdc644e2aaaad1e23266","login":"BeaverSoftware","id":1424031,"avatar_url":"https://secure.gravatar.com/avatar/d563e337cac2fdc644e2aaaad1e23266?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-orgs.png"},"name":"FatherBeaver","language":null,"description":"","ssh_url":"git@github.com:BeaverSoftware/FatherBeaver.git","pushed_at":null,"created_at":"2012-02-09T19:32:21Z","id":3400397,"html_url":"https://github.com/BeaverSoftware/FatherBeaver","full_name":"BeaverSoftware/FatherBeaver"} + +https +POST +api.github.com +None +/orgs/BeaverSoftware/actions/variables +{'Authorization': 'Basic login_and_password_removed', 'User-Agent': 'PyGithub/Python', 'Content-Type': 'application/json'} +{"name": "variable-name", "value": "variable-value", "visibility": "selected", "selected_repository_ids": [3609352, 3400397]} +201 +[('Server', 'GitHub.com'), ('Date', 'Wed, 28 Jun 2023 19:19:26 GMT'), ('Content-Type', 'application/json; charset=utf-8'), ('Content-Length', '2'), ('Cache-Control', 'private, max-age=60, s-maxage=60'), ('Vary', 'Accept, Authorization, Cookie, X-GitHub-OTP, Accept-Encoding, Accept, X-Requested-With'), ('ETag', '"ab9b40dea6722e415dd424b31be226eac6da76ca693e83c73fed865610a4937e"'), ('X-OAuth-Scopes', 'admin:enterprise, admin:gpg_key, admin:org, admin:org_hook, admin:public_key, admin:repo_hook, admin:ssh_signing_key, audit_log, codespace, delete:packages, delete_repo, gist, notifications, project, repo, user, workflow, write:discussion, write:packages'), ('X-Accepted-OAuth-Scopes', 'admin:org'), ('github-authentication-token-expiration', '2023-07-05 17:42:21 UTC'), ('X-GitHub-Media-Type', 'github.v3; format=json'), ('x-github-api-version-selected', '2022-11-28'), ('X-RateLimit-Limit', '5000'), ('X-RateLimit-Remaining', '4905'), ('X-RateLimit-Reset', '1687981543'), ('X-RateLimit-Used', '95'), ('X-RateLimit-Resource', 'core'), ('Access-Control-Expose-Headers', 'ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset'), ('Access-Control-Allow-Origin', '*'), ('Strict-Transport-Security', 'max-age=31536000; includeSubdomains; preload'), ('X-Frame-Options', 'deny'), ('X-Content-Type-Options', 'nosniff'), ('X-XSS-Protection', '0'), ('Referrer-Policy', 'origin-when-cross-origin, strict-origin-when-cross-origin'), ('Content-Security-Policy', "default-src 'none'"), ('X-GitHub-Request-Id', '6FD1:95BE:1234AD:24C286:649C87BD')] +{} + +https +GET +api.github.com +None +/orgs/BeaverSoftware/actions/variables/variable-name/repositories +{'Authorization': 'Basic login_and_password_removed', 'User-Agent': 'PyGithub/Python'} +None +200 +[('status', '200 OK'), ('x-ratelimit-remaining', '4978'), ('content-length', '487'), ('server', 'nginx/1.0.13'), ('connection', 'keep-alive'), ('x-ratelimit-limit', '5000'), ('etag', '"1dd282b50e691f8f162ef9355dad8771"'), ('date', 'Thu, 10 May 2012 19:03:19 GMT'), ('content-type', 'application/json; charset=utf-8')] +{"total_count": 2, "repositories": [{"clone_url":"https://github.com/BeaverSoftware/TestPyGithub.git","has_downloads":true,"watchers":1,"git_url":"git://github.com/BeaverSoftware/TestPyGithub.git","updated_at":"2012-04-25T06:51:38Z","permissions":{"pull":true,"admin":true,"push":true},"homepage":"http://vincent-jacques.net/PyGithub","url":"https://api.github.com/repos/BeaverSoftware/TestPyGithub","has_wiki":true,"has_pages":false,"has_issues":false,"fork":false,"forks":0,"mirror_url":null,"size":112,"private":false,"open_issues":0,"svn_url":"https://github.com/BeaverSoftware/TestPyGithub","owner":{"url":"https://api.github.com/users/BeaverSoftware","gravatar_id":"d563e337cac2fdc644e2aaaad1e23266","login":"BeaverSoftware","id":1424031,"avatar_url":"https://secure.gravatar.com/avatar/d563e337cac2fdc644e2aaaad1e23266?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-orgs.png"},"name":"TestPyGithub","language":null,"description":"Guinea-pig for PyGithub testing","ssh_url":"git@github.com:BeaverSoftware/TestPyGithub.git","pushed_at":"2012-03-03T08:57:40Z","created_at":"2012-03-03T07:53:19Z","id":3609352,"html_url":"https://github.com/BeaverSoftware/TestPyGithub","full_name":"BeaverSoftware/TestPyGithub"}, {"clone_url":"https://github.com/BeaverSoftware/FatherBeaver.git","has_downloads":true,"watchers":2,"git_url":"git://github.com/BeaverSoftware/FatherBeaver.git","updated_at":"2012-02-16T21:51:15Z","permissions":{"pull":true,"admin":true,"push":true},"homepage":"","url":"https://api.github.com/repos/BeaverSoftware/FatherBeaver","has_wiki":true,"has_pages":true,"has_issues":true,"fork":false,"forks":1,"mirror_url":null,"size":0,"private":false,"open_issues":0,"svn_url":"https://github.com/BeaverSoftware/FatherBeaver","owner":{"url":"https://api.github.com/users/BeaverSoftware","gravatar_id":"d563e337cac2fdc644e2aaaad1e23266","login":"BeaverSoftware","id":1424031,"avatar_url":"https://secure.gravatar.com/avatar/d563e337cac2fdc644e2aaaad1e23266?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-orgs.png"},"name":"FatherBeaver","language":null,"description":"","ssh_url":"git@github.com:BeaverSoftware/FatherBeaver.git","pushed_at":null,"created_at":"2012-02-09T19:32:21Z","id":3400397,"html_url":"https://github.com/BeaverSoftware/FatherBeaver","full_name":"BeaverSoftware/FatherBeaver"}]} diff --git a/tests/ReplayData/Organization.testDeleteSecret.txt b/tests/ReplayData/Organization.testDeleteSecret.txt deleted file mode 100644 index cee0237a..00000000 --- a/tests/ReplayData/Organization.testDeleteSecret.txt +++ /dev/null @@ -1,10 +0,0 @@ -https -DELETE -api.github.com -None -/orgs/BeaverSoftware/actions/secrets/secret-name -{'Authorization': 'Basic login_and_password_removed', 'User-Agent': 'PyGithub/Python'} -None -204 -[('Date', 'Fri, 17 Apr 2020 00:12:33 GMT'), ('Server', 'GitHub.com'), ('Content-Length', '2'), ('Content-Type', 'application/json; charset=utf-8'), ('Status', '201 Created'), ('X-RateLimit-Limit', '5000'), ('X-RateLimit-Remaining', '4984'), ('X-RateLimit-Reset', '1587085388'), ('X-OAuth-Scopes', 'read:org, repo, user'), ('X-Accepted-OAuth-Scopes', ''), ('X-GitHub-Media-Type', 'github.v3; format=json'), ('Access-Control-Expose-Headers', 'ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, Deprecation, Sunset'), ('Access-Control-Allow-Origin', '*'), ('Strict-Transport-Security', 'max-age=31536000; includeSubdomains; preload'), ('X-Frame-Options', 'deny'), ('X-Content-Type-Options', 'nosniff'), ('X-XSS-Protection', '1; mode=block'), ('Referrer-Policy', 'origin-when-cross-origin, strict-origin-when-cross-origin'), ('Content-Security-Policy', "default-src 'none'"), ('Vary', 'Accept-Encoding, Accept, X-Requested-With'), ('X-GitHub-Request-Id', 'C290:52DA:50234:B404B:5E98F470')] -{} \ No newline at end of file diff --git a/tests/ReplayData/Organization.testGetSecret.txt b/tests/ReplayData/Organization.testGetSecret.txt new file mode 100644 index 00000000..427f3f0b --- /dev/null +++ b/tests/ReplayData/Organization.testGetSecret.txt @@ -0,0 +1,43 @@ +https +GET +api.github.com +None +/repos/BeaverSoftware/TestPyGithub +{'Authorization': 'Basic login_and_password_removed', 'User-Agent': 'PyGithub/Python', 'Accept': 'application/vnd.github.nebula-preview+json'} +None +200 +[('status', '200 OK'), ('x-ratelimit-remaining', '4992'), ('content-length', '1431'), ('server', 'nginx/1.0.13'), ('connection', 'keep-alive'), ('x-ratelimit-limit', '5000'), ('etag', '"4ecd2c151a469cfa6cd45e6beff1269b"'), ('date', 'Fri, 01 Jun 2012 19:40:56 GMT'), ('content-type', 'application/json; charset=utf-8')] +{"clone_url":"https://github.com/BeaverSoftware/TestPyGithub.git","has_downloads":true,"watchers":1,"git_url":"git://github.com/BeaverSoftware/TestPyGithub.git","updated_at":"2012-04-25T06:51:38Z","permissions":{"pull":true,"admin":true,"push":true},"homepage":"http://vincent-jacques.net/PyGithub","url":"https://api.github.com/repos/BeaverSoftware/TestPyGithub","has_wiki":true,"has_pages":false,"has_issues":false,"fork":false,"forks":0,"mirror_url":null,"size":112,"private":false,"open_issues":0,"svn_url":"https://github.com/BeaverSoftware/TestPyGithub","owner":{"url":"https://api.github.com/users/BeaverSoftware","gravatar_id":"d563e337cac2fdc644e2aaaad1e23266","login":"BeaverSoftware","id":1424031,"avatar_url":"https://secure.gravatar.com/avatar/d563e337cac2fdc644e2aaaad1e23266?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-orgs.png"},"name":"TestPyGithub","language":null,"description":"Guinea-pig for PyGithub testing","ssh_url":"git@github.com:BeaverSoftware/TestPyGithub.git","pushed_at":"2012-03-03T08:57:40Z","created_at":"2012-03-03T07:53:19Z","id":3609352,"html_url":"https://github.com/BeaverSoftware/TestPyGithub","full_name":"BeaverSoftware/TestPyGithub"} + +https +GET +api.github.com +None +/repos/BeaverSoftware/FatherBeaver +{'Authorization': 'Basic login_and_password_removed', 'User-Agent': 'PyGithub/Python', 'Accept': 'application/vnd.github.nebula-preview+json'} +None +200 +[('status', '200 OK'), ('x-ratelimit-remaining', '4992'), ('content-length', '1431'), ('server', 'nginx/1.0.13'), ('connection', 'keep-alive'), ('x-ratelimit-limit', '5000'), ('etag', '"4ecd2c151a469cfa6cd45e6beff1269b"'), ('date', 'Fri, 01 Jun 2012 19:40:56 GMT'), ('content-type', 'application/json; charset=utf-8')] +{"clone_url":"https://github.com/BeaverSoftware/FatherBeaver.git","has_downloads":true,"watchers":2,"git_url":"git://github.com/BeaverSoftware/FatherBeaver.git","updated_at":"2012-02-16T21:51:15Z","permissions":{"pull":true,"admin":true,"push":true},"homepage":"","url":"https://api.github.com/repos/BeaverSoftware/FatherBeaver","has_wiki":true,"has_pages":true,"has_issues":true,"fork":false,"forks":1,"mirror_url":null,"size":0,"private":false,"open_issues":0,"svn_url":"https://github.com/BeaverSoftware/FatherBeaver","owner":{"url":"https://api.github.com/users/BeaverSoftware","gravatar_id":"d563e337cac2fdc644e2aaaad1e23266","login":"BeaverSoftware","id":1424031,"avatar_url":"https://secure.gravatar.com/avatar/d563e337cac2fdc644e2aaaad1e23266?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-orgs.png"},"name":"FatherBeaver","language":null,"description":"","ssh_url":"git@github.com:BeaverSoftware/FatherBeaver.git","pushed_at":null,"created_at":"2012-02-09T19:32:21Z","id":3400397,"html_url":"https://github.com/BeaverSoftware/FatherBeaver","full_name":"BeaverSoftware/FatherBeaver"} + +https +GET +api.github.com +None +/orgs/BeaverSoftware/actions/secrets/secret-name +{'Authorization': 'Basic login_and_password_removed', 'User-Agent': 'PyGithub/Python'} +None +200 +[('status', '200 OK'), ('x-ratelimit-remaining', '4978'), ('content-length', '487'), ('server', 'nginx/1.0.13'), ('connection', 'keep-alive'), ('x-ratelimit-limit', '5000'), ('etag', '"1dd282b50e691f8f162ef9355dad8771"'), ('date', 'Thu, 10 May 2012 19:03:19 GMT'), ('content-type', 'application/json; charset=utf-8')] +{"name": "secret-name","created_at": "2019-08-10T14:59:22Z","updated_at": "2020-01-10T14:59:22Z","visibility": "selected","selected_repositories_url": "https://api.github.com/orgs/BeaverSoftware/actions/secrets/secret-name/repositories"} + +https +GET +api.github.com +None +/orgs/BeaverSoftware/actions/secrets/secret-name/repositories +{'Authorization': 'Basic login_and_password_removed', 'User-Agent': 'PyGithub/Python'} +None +200 +[('status', '200 OK'), ('x-ratelimit-remaining', '4978'), ('content-length', '487'), ('server', 'nginx/1.0.13'), ('connection', 'keep-alive'), ('x-ratelimit-limit', '5000'), ('etag', '"1dd282b50e691f8f162ef9355dad8771"'), ('date', 'Thu, 10 May 2012 19:03:19 GMT'), ('content-type', 'application/json; charset=utf-8')] +{"total_count": 2, "repositories": [{"clone_url":"https://github.com/BeaverSoftware/TestPyGithub.git","has_downloads":true,"watchers":1,"git_url":"git://github.com/BeaverSoftware/TestPyGithub.git","updated_at":"2012-04-25T06:51:38Z","permissions":{"pull":true,"admin":true,"push":true},"homepage":"http://vincent-jacques.net/PyGithub","url":"https://api.github.com/repos/BeaverSoftware/TestPyGithub","has_wiki":true,"has_pages":false,"has_issues":false,"fork":false,"forks":0,"mirror_url":null,"size":112,"private":false,"open_issues":0,"svn_url":"https://github.com/BeaverSoftware/TestPyGithub","owner":{"url":"https://api.github.com/users/BeaverSoftware","gravatar_id":"d563e337cac2fdc644e2aaaad1e23266","login":"BeaverSoftware","id":1424031,"avatar_url":"https://secure.gravatar.com/avatar/d563e337cac2fdc644e2aaaad1e23266?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-orgs.png"},"name":"TestPyGithub","language":null,"description":"Guinea-pig for PyGithub testing","ssh_url":"git@github.com:BeaverSoftware/TestPyGithub.git","pushed_at":"2012-03-03T08:57:40Z","created_at":"2012-03-03T07:53:19Z","id":3609352,"html_url":"https://github.com/BeaverSoftware/TestPyGithub","full_name":"BeaverSoftware/TestPyGithub"}, {"clone_url":"https://github.com/BeaverSoftware/FatherBeaver.git","has_downloads":true,"watchers":2,"git_url":"git://github.com/BeaverSoftware/FatherBeaver.git","updated_at":"2012-02-16T21:51:15Z","permissions":{"pull":true,"admin":true,"push":true},"homepage":"","url":"https://api.github.com/repos/BeaverSoftware/FatherBeaver","has_wiki":true,"has_pages":true,"has_issues":true,"fork":false,"forks":1,"mirror_url":null,"size":0,"private":false,"open_issues":0,"svn_url":"https://github.com/BeaverSoftware/FatherBeaver","owner":{"url":"https://api.github.com/users/BeaverSoftware","gravatar_id":"d563e337cac2fdc644e2aaaad1e23266","login":"BeaverSoftware","id":1424031,"avatar_url":"https://secure.gravatar.com/avatar/d563e337cac2fdc644e2aaaad1e23266?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-orgs.png"},"name":"FatherBeaver","language":null,"description":"","ssh_url":"git@github.com:BeaverSoftware/FatherBeaver.git","pushed_at":null,"created_at":"2012-02-09T19:32:21Z","id":3400397,"html_url":"https://github.com/BeaverSoftware/FatherBeaver","full_name":"BeaverSoftware/FatherBeaver"}]} diff --git a/tests/ReplayData/Organization.testGetSecrets.txt b/tests/ReplayData/Organization.testGetSecrets.txt new file mode 100644 index 00000000..762cbccf --- /dev/null +++ b/tests/ReplayData/Organization.testGetSecrets.txt @@ -0,0 +1,10 @@ +https +GET +api.github.com +None +/orgs/BeaverSoftware/actions/secrets +{'Authorization': 'Basic login_and_password_removed', 'User-Agent': 'PyGithub/Python'} +None +200 +[('status', '200 OK'), ('x-ratelimit-remaining', '4978'), ('content-length', '487'), ('server', 'nginx/1.0.13'), ('connection', 'keep-alive'), ('x-ratelimit-limit', '5000'), ('etag', '"1dd282b50e691f8f162ef9355dad8771"'), ('date', 'Thu, 10 May 2012 19:03:19 GMT'), ('content-type', 'application/json; charset=utf-8')] +{"total_count": 1, "secrets": [{"name": "secret-name","created_at": "2019-08-10T14:59:22Z","updated_at": "2020-01-10T14:59:22Z","visibility": "selected","selected_repositories_url": "https://api.github.com/orgs/BeaverSoftware/actions/secrets/secret-name/repositories"}]} diff --git a/tests/ReplayData/Organization.testGetVariable.txt b/tests/ReplayData/Organization.testGetVariable.txt new file mode 100644 index 00000000..fdef0e85 --- /dev/null +++ b/tests/ReplayData/Organization.testGetVariable.txt @@ -0,0 +1,43 @@ +https +GET +api.github.com +None +/repos/BeaverSoftware/TestPyGithub +{'Authorization': 'Basic login_and_password_removed', 'User-Agent': 'PyGithub/Python', 'Accept': 'application/vnd.github.nebula-preview+json'} +None +200 +[('status', '200 OK'), ('x-ratelimit-remaining', '4992'), ('content-length', '1431'), ('server', 'nginx/1.0.13'), ('connection', 'keep-alive'), ('x-ratelimit-limit', '5000'), ('etag', '"4ecd2c151a469cfa6cd45e6beff1269b"'), ('date', 'Fri, 01 Jun 2012 19:40:56 GMT'), ('content-type', 'application/json; charset=utf-8')] +{"clone_url":"https://github.com/BeaverSoftware/TestPyGithub.git","has_downloads":true,"watchers":1,"git_url":"git://github.com/BeaverSoftware/TestPyGithub.git","updated_at":"2012-04-25T06:51:38Z","permissions":{"pull":true,"admin":true,"push":true},"homepage":"http://vincent-jacques.net/PyGithub","url":"https://api.github.com/repos/BeaverSoftware/TestPyGithub","has_wiki":true,"has_pages":false,"has_issues":false,"fork":false,"forks":0,"mirror_url":null,"size":112,"private":false,"open_issues":0,"svn_url":"https://github.com/BeaverSoftware/TestPyGithub","owner":{"url":"https://api.github.com/users/BeaverSoftware","gravatar_id":"d563e337cac2fdc644e2aaaad1e23266","login":"BeaverSoftware","id":1424031,"avatar_url":"https://secure.gravatar.com/avatar/d563e337cac2fdc644e2aaaad1e23266?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-orgs.png"},"name":"TestPyGithub","language":null,"description":"Guinea-pig for PyGithub testing","ssh_url":"git@github.com:BeaverSoftware/TestPyGithub.git","pushed_at":"2012-03-03T08:57:40Z","created_at":"2012-03-03T07:53:19Z","id":3609352,"html_url":"https://github.com/BeaverSoftware/TestPyGithub","full_name":"BeaverSoftware/TestPyGithub"} + +https +GET +api.github.com +None +/repos/BeaverSoftware/FatherBeaver +{'Authorization': 'Basic login_and_password_removed', 'User-Agent': 'PyGithub/Python', 'Accept': 'application/vnd.github.nebula-preview+json'} +None +200 +[('status', '200 OK'), ('x-ratelimit-remaining', '4992'), ('content-length', '1431'), ('server', 'nginx/1.0.13'), ('connection', 'keep-alive'), ('x-ratelimit-limit', '5000'), ('etag', '"4ecd2c151a469cfa6cd45e6beff1269b"'), ('date', 'Fri, 01 Jun 2012 19:40:56 GMT'), ('content-type', 'application/json; charset=utf-8')] +{"clone_url":"https://github.com/BeaverSoftware/FatherBeaver.git","has_downloads":true,"watchers":2,"git_url":"git://github.com/BeaverSoftware/FatherBeaver.git","updated_at":"2012-02-16T21:51:15Z","permissions":{"pull":true,"admin":true,"push":true},"homepage":"","url":"https://api.github.com/repos/BeaverSoftware/FatherBeaver","has_wiki":true,"has_pages":true,"has_issues":true,"fork":false,"forks":1,"mirror_url":null,"size":0,"private":false,"open_issues":0,"svn_url":"https://github.com/BeaverSoftware/FatherBeaver","owner":{"url":"https://api.github.com/users/BeaverSoftware","gravatar_id":"d563e337cac2fdc644e2aaaad1e23266","login":"BeaverSoftware","id":1424031,"avatar_url":"https://secure.gravatar.com/avatar/d563e337cac2fdc644e2aaaad1e23266?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-orgs.png"},"name":"FatherBeaver","language":null,"description":"","ssh_url":"git@github.com:BeaverSoftware/FatherBeaver.git","pushed_at":null,"created_at":"2012-02-09T19:32:21Z","id":3400397,"html_url":"https://github.com/BeaverSoftware/FatherBeaver","full_name":"BeaverSoftware/FatherBeaver"} + +https +GET +api.github.com +None +/orgs/BeaverSoftware/actions/variables/variable-name +{'Authorization': 'Basic login_and_password_removed', 'User-Agent': 'PyGithub/Python'} +None +200 +[('status', '200 OK'), ('x-ratelimit-remaining', '4978'), ('content-length', '487'), ('server', 'nginx/1.0.13'), ('connection', 'keep-alive'), ('x-ratelimit-limit', '5000'), ('etag', '"1dd282b50e691f8f162ef9355dad8771"'), ('date', 'Thu, 10 May 2012 19:03:19 GMT'), ('content-type', 'application/json; charset=utf-8')] +{"name": "variable-name","value": "variable-value123","created_at": "2019-08-10T14:59:22Z","updated_at": "2020-01-10T14:59:22Z","visibility": "selected","selected_repositories_url": "https://api.github.com/orgs/BeaverSoftware/actions/variables/variable-name/repositories"} + +https +GET +api.github.com +None +/orgs/BeaverSoftware/actions/variables/variable-name/repositories +{'Authorization': 'Basic login_and_password_removed', 'User-Agent': 'PyGithub/Python'} +None +200 +[('status', '200 OK'), ('x-ratelimit-remaining', '4978'), ('content-length', '487'), ('server', 'nginx/1.0.13'), ('connection', 'keep-alive'), ('x-ratelimit-limit', '5000'), ('etag', '"1dd282b50e691f8f162ef9355dad8771"'), ('date', 'Thu, 10 May 2012 19:03:19 GMT'), ('content-type', 'application/json; charset=utf-8')] +{"total_count": 2, "repositories": [{"clone_url":"https://github.com/BeaverSoftware/TestPyGithub.git","has_downloads":true,"watchers":1,"git_url":"git://github.com/BeaverSoftware/TestPyGithub.git","updated_at":"2012-04-25T06:51:38Z","permissions":{"pull":true,"admin":true,"push":true},"homepage":"http://vincent-jacques.net/PyGithub","url":"https://api.github.com/repos/BeaverSoftware/TestPyGithub","has_wiki":true,"has_pages":false,"has_issues":false,"fork":false,"forks":0,"mirror_url":null,"size":112,"private":false,"open_issues":0,"svn_url":"https://github.com/BeaverSoftware/TestPyGithub","owner":{"url":"https://api.github.com/users/BeaverSoftware","gravatar_id":"d563e337cac2fdc644e2aaaad1e23266","login":"BeaverSoftware","id":1424031,"avatar_url":"https://secure.gravatar.com/avatar/d563e337cac2fdc644e2aaaad1e23266?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-orgs.png"},"name":"TestPyGithub","language":null,"description":"Guinea-pig for PyGithub testing","ssh_url":"git@github.com:BeaverSoftware/TestPyGithub.git","pushed_at":"2012-03-03T08:57:40Z","created_at":"2012-03-03T07:53:19Z","id":3609352,"html_url":"https://github.com/BeaverSoftware/TestPyGithub","full_name":"BeaverSoftware/TestPyGithub"}, {"clone_url":"https://github.com/BeaverSoftware/FatherBeaver.git","has_downloads":true,"watchers":2,"git_url":"git://github.com/BeaverSoftware/FatherBeaver.git","updated_at":"2012-02-16T21:51:15Z","permissions":{"pull":true,"admin":true,"push":true},"homepage":"","url":"https://api.github.com/repos/BeaverSoftware/FatherBeaver","has_wiki":true,"has_pages":true,"has_issues":true,"fork":false,"forks":1,"mirror_url":null,"size":0,"private":false,"open_issues":0,"svn_url":"https://github.com/BeaverSoftware/FatherBeaver","owner":{"url":"https://api.github.com/users/BeaverSoftware","gravatar_id":"d563e337cac2fdc644e2aaaad1e23266","login":"BeaverSoftware","id":1424031,"avatar_url":"https://secure.gravatar.com/avatar/d563e337cac2fdc644e2aaaad1e23266?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-orgs.png"},"name":"FatherBeaver","language":null,"description":"","ssh_url":"git@github.com:BeaverSoftware/FatherBeaver.git","pushed_at":null,"created_at":"2012-02-09T19:32:21Z","id":3400397,"html_url":"https://github.com/BeaverSoftware/FatherBeaver","full_name":"BeaverSoftware/FatherBeaver"}]} diff --git a/tests/ReplayData/Organization.testGetVariables.txt b/tests/ReplayData/Organization.testGetVariables.txt new file mode 100644 index 00000000..4d66c175 --- /dev/null +++ b/tests/ReplayData/Organization.testGetVariables.txt @@ -0,0 +1,10 @@ +https +GET +api.github.com +None +/orgs/BeaverSoftware/actions/variables +{'Authorization': 'Basic login_and_password_removed', 'User-Agent': 'PyGithub/Python'} +None +200 +[('status', '200 OK'), ('x-ratelimit-remaining', '4978'), ('content-length', '487'), ('server', 'nginx/1.0.13'), ('connection', 'keep-alive'), ('x-ratelimit-limit', '5000'), ('etag', '"1dd282b50e691f8f162ef9355dad8771"'), ('date', 'Thu, 10 May 2012 19:03:19 GMT'), ('content-type', 'application/json; charset=utf-8')] +{"total_count": 1, "variables": [{"name": "variable-name","created_at": "2019-08-10T14:59:22Z","updated_at": "2020-01-10T14:59:22Z","visibility": "selected","selected_repositories_url": "https://api.github.com/orgs/BeaverSoftware/actions/variables/variable-name/repositories"}]} diff --git a/tests/Repository.py b/tests/Repository.py index 37caac22..59b23295 100644 --- a/tests/Repository.py +++ b/tests/Repository.py @@ -431,10 +431,8 @@ class Repository(Framework.TestCase): def testCreateSecret(self, encrypt): # encrypt returns a non-deterministic value, we need to mock it so the replay data matches encrypt.return_value = "M+5Fm/BqTfB90h3nC7F3BoZuu3nXs+/KtpXwxm9gG211tbRo0F5UiN0OIfYT83CKcx9oKES9Va4E96/b" - self.assertTrue(self.repo.create_secret("secret-name", "secret-value")) - - def testDeleteSecret(self): - self.assertTrue(self.repo.delete_secret("secret_name")) + secret = self.repo.create_secret("secret-name", "secret-value") + self.assertIsNotNone(secret) def testCodeScanAlerts(self): codescan_alerts = self.repo.get_codescan_alerts() @@ -1825,9 +1823,9 @@ class Repository(Framework.TestCase): self.assertEqual("refs/tags/v0.6", refs[5].ref) def testRepoVariable(self): - self.assertTrue(self.repo.create_variable("variable_name", "variable-value")) - self.assertTrue(self.repo.update_variable("variable_name", "variable-value123")) - self.assertTrue(self.repo.delete_variable("variable_name")) + variable = self.repo.create_variable("variable_name", "variable-value") + self.assertTrue(variable.edit("variable-value123")) + variable.delete() class LazyRepository(Framework.TestCase):