Estou brincando com esta biblioteca na esperança de poder automatizar as coisas em nosso Github Enterprise. Uma das primeiras coisas que preciso fazer é definir proteções de ramificação para nossos repositórios. No entanto, quando eu inicio um objeto Branch a partir de um repositório de teste (que já tinha proteções de ramificação definidas, veja bem), o único atributo atribuído é "nome", e a maioria dos métodos listados na documentação não existe no objeto:
import github
github.enable_console_debug_logging()
Github = github.Github
Github("myuser",
'mycreds',
base_url="https://ghe.workworkwork.com/api/v3")
master = g.get_user("myuser").get_repo('cookbook1').get_branch('master')
print master
print master.protection_url
A saída:
...
GET https://ghe.workworkwork.com/api/v3/repos/myuser/cookbook1/branches/master {'Authorization': 'Basic (login and password removed)', 'User-Agent': 'PyGithub/Python'} None ==> 200 {'status': '200 OK', 'content-length': '2925', 'x-github-media-type': 'github.v3', 'x-content-type-options': 'nosniff', 'content-security-policy': "default-src 'none'", 'access-control-expose-headers': 'ETag, Link, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval', 'x-github-request-id': '0ec6f4e8-2355-41dc-859d-0e7076a294b1', 'strict-transport-security': 'max-age=31536000; includeSubdomains', 'vary': 'Accept, Authorization, Cookie, X-GitHub-OTP', 'server': 'GitHub.com', 'access-control-allow-origin': '*', 'etag': '"965449c848ed3319d7e028c2a587f414"', 'x-xss-protection': '1; mode=block', 'cache-control': 'private, max-age=60, s-maxage=60', 'date': 'Thu, 16 Aug 2018 23:41:19 GMT', 'x-frame-options': 'deny', 'x-oauth-scopes': 'admin:org_hook, admin:pre_receive_hook, admin:repo_hook, repo', 'content-type': 'application/json; charset=utf-8', 'x-accepted-oauth-scopes': ''} {"name":"master","commit":{"sha":"3548233b67c8ec4cad703ff947fa0ba022df7c66","commit":{"author":{"name":"Garrett Anderson","email":"[email protected]","date":"2018-08-16T18:44:44Z"},"committer":{"name":"GitHub Enterprise","email":"[email protected]","date":"2018-08-16T18:44:44Z"},"message":"Merge pull request #8 from myuser/newfork\n\nwhat","tree":{"sha":"44b3a300094b2ccbbfb79ea7df5f82e627c12b42","url":"https://ghe.workworkwork.com/api/v3/repos/myuser/cookbook1/git/trees/44b3a300094b2ccbbfb79ea7df5f82e627c12b42"},"url":"https://ghe.workworkwork.com/api/v3/repos/myuser/cookbook1/git/commits/3548233b67c8ec4cad703ff947fa0ba022df7c66","comment_count":0},"url":"https://ghe.workworkwork.com/api/v3/repos/myuser/cookbook1/commits/3548233b67c8ec4cad703ff947fa0ba022df7c66","html_url":"https://ghe.workworkwork.com/myuser/cookbook1/commit/3548233b67c8ec4cad703ff947fa0ba022df7c66","comments_url":"https://ghe.workworkwork.com/api/v3/repos/myuser/cookbook1/commits/3548233b67c8ec4cad703ff947fa0ba022df7c66/comments","author":{"login":"myuser","id":593,"avatar_url":"https://ghe.workworkwork.com/avatars/u/593?","gravatar_id":"","url":"https://ghe.workworkwork.com/api/v3/users/myuser","html_url":"https://ghe.workworkwork.com/myuser","followers_url":"https://ghe.workworkwork.com/api/v3/users/myuser/followers","following_url":"https://ghe.workworkwork.com/api/v3/users/myuser/following{/other_user}","gists_url":"https://ghe.workworkwork.com/api/v3/users/myuser/gists{/gist_id}","starred_url":"https://ghe.workworkwork.com/api/v3/users/myuser/starred{/owner}{/repo}","subscriptions_url":"https://ghe.workworkwork.com/api/v3/users/myuser/subscriptions","organizations_url":"https://ghe.workworkwork.com/api/v3/users/myuser/orgs","repos_url":"https://ghe.workworkwork.com/api/v3/users/myuser/repos","events_url":"https://ghe.workworkwork.com/api/v3/users/myuser/events{/privacy}","received_events_url":"https://ghe.workworkwork.com/api/v3/users/myuser/received_events","type":"User","site_admin":true},"committer":null,"parents":[{"sha":"067642113fe45ee77160ee28cafc4870f2c06b6a","url":"https://ghe.workworkwork.com/api/v3/repos/myuser/cookbook1/commits/067642113fe45ee77160ee28cafc4870f2c06b6a","html_url":"https://ghe.workworkwork.com/myuser/cookbook1/commit/067642113fe45ee77160ee28cafc4870f2c06b6a"},{"sha":"3a9479c605617a9035cd986a4bf77880ac5dde64","url":"https://ghe.workworkwork.com/api/v3/repos/myuser/cookbook1/commits/3a9479c605617a9035cd986a4bf77880ac5dde64","html_url":"https://ghe.workworkwork.com/myuser/cookbook1/commit/3a9479c605617a9035cd986a4bf77880ac5dde64"}]},"_links":{"self":"https://ghe.workworkwork.com/api/v3/repos/myuser/cookbook1/branches/master","html":"https://ghe.workworkwork.com/myuser/cookbook1/tree/master"}}
Branch(name="master")
AttributeError: 'Branch' object has no attribute 'protection_url'
Não há nenhum dos métodos lá:
print master.get_required_status_checks()
OUTPUT:
AttributeError: 'Branch' object has no attribute 'get_required_status_checks'
Ou este atributo:
print master.protection
OUTPUT:
return self._protected.value
AttributeError: 'Branch' object has no attribute '_protected'
O objeto é parecido com este:
print dir(master)
OUTPUT:
['CHECK_AFTER_INIT_FLAG', '_GithubObject__makeSimpleAttribute', '_GithubObject__makeSimpleListAttribute', '_GithubObject__makeTransformedAttribute', '__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_commit', '_completeIfNeeded', '_headers', '_initAttributes', '_makeBoolAttribute', '_makeClassAttribute', '_makeDatetimeAttribute', '_makeDictAttribute', '_makeDictOfStringsToClassesAttribute', '_makeIntAttribute', '_makeListOfClassesAttribute', '_makeListOfIntsAttribute', '_makeListOfListOfStringsAttribute', '_makeListOfStringsAttribute', '_makeStringAttribute', '_makeTimestampAttribute', '_name', '_parentUrl', '_rawData', '_requester', '_storeAndUseAttributes', '_useAttributes', 'commit', 'contexts', 'enforcement_level', 'etag', 'get__repr__', 'last_modified', 'name', 'protected', 'raw_data', 'raw_headers', 'setCheckAfterInitFlag']
Parece que o objeto não está sendo criado corretamente.
Qual versão do PyGithub você está usando? Observe que o # 790 foi incorporado recentemente, mas ainda não foi lançado.
Estou usando o PyGithub-1.40 e o Github Enterprise 2.8.6.
https://github.com/PyGithub/PyGithub/pull/790 definitivamente parece promissor, embora a versão GHE da minha empresa esteja um pouco desatualizada, então não tenho certeza se as mudanças de API afetam isso.
ATUALIZAÇÃO: em processo de teste do último mestre
Parece que a fusão mais recente corrigiu os problemas de atributos e métodos ausentes, mas parece ser incompatível com minha versão da API:
master = g.get_user("ganderson").get_repo('cookbook1').get_branch('master')
print master.protection_url
master.get_protection()
SAÍDA:
None
Traceback (most recent call last):
File "test_pygithub.py", line 12, in <module>
master.get_protection()
File "/Users/me/tmp/ghe-python/venv/lib/python2.7/site-packages/github/Branch.py", line 102, in get_protection
self.protection_url
File "/Users/me/tmp/ghe-python/venv/lib/python2.7/site-packages/github/Requester.py", line 260, in requestJsonAndCheck
return self.__check(*self.requestJson(verb, url, parameters, headers, input, self.__customConnection(url)))
File "/Users/me/tmp/ghe-python/venv/lib/python2.7/site-packages/github/Requester.py", line 276, in __customConnection
if not url.startswith("/"):
AttributeError: 'NoneType' object has no attribute 'startswith'
Este parece ser um problema separado, então fecharei este tíquete. Obrigada.
Levante um novo problema se o mestre quebrar.
Isso também parece quebrado para mim em 1.43.2 no api.github.com padrão
Eu tenho 2 branches que estão protegidos, mas os objetos Branch nunca obtêm o conjunto protection_url.
O URL de proteção não é definido e resulta em erros para qualquer coisa que o use para construir URLs.
[
{
"name": "develop",
"commit": {
"sha": "XXXX",
"url": "https://api.github.com/repos/X/X/commits/X"
}
},
{
"name": "master",
"commit": {
"sha": "X",
"url": "https://api.github.com/repos/X/X/commits/X"
}
}
]
Se eu curl usando branches?protected=true
ele retorna o protection_url na carga útil.
[
{
"name": "develop",
"commit": {
"sha": "X",
"url": "https://api.github.com/repos/X/X/commits/X"
},
"protected": true,
"protection": {
"enabled": true,
"required_status_checks": {
"enforcement_level": "off",
"contexts": [
]
}
},
"protection_url": "https://api.github.com/repos/X/X/branches/develop/protection"
},
{
"name": "master",
"commit": {
"sha": "X",
"url": "https://api.github.com/repos/X/X/commits/X"
},
"protected": true,
"protection": {
"enabled": true,
"required_status_checks": {
"enforcement_level": "off",
"contexts": [
]
}
},
"protection_url": "https://api.github.com/repos/X/X/branches/master/protection"
}
]
Estou reabrindo o problema em nome do último comentador
Você pode tentar obter um único ramo com get_branch("master")
? Acho que o problema pode ser que o método get_branches
atual não oferece suporte ao parâmetro protected
.
Passei um pouco de tempo depurando esse problema e levantei um bug contra a API GitHub v3.
Eu encontrei esse problema ao desenvolver o código de proteção de ramificação - Repository.get_branches () retorna uma lista
de branches, mas o GitHub não retorna informações suficientes para que os métodos em Branch sejam úteis. Se você deseja utilizar os recursos de proteção, deve chamar Repository.get_branch ('nome').
Eu encontrei esse problema ao desenvolver o código de proteção de ramificação - Repository.get_branches () retorna uma lista
de branches, mas o GitHub não retorna informações suficientes para que os métodos em Branch sejam úteis. Se você deseja utilizar os recursos de proteção, deve chamar Repository.get_branch ('nome').
Obrigado, encontrei este problema hoje, esta solução alternativa me salvou muito tempo e frustração!
Este problema foi marcado automaticamente como obsoleto porque não teve atividades recentes. Ele será fechado se nenhuma outra atividade ocorrer. Obrigado por suas contribuições.
Comentários muito úteis
Eu encontrei esse problema ao desenvolver o código de proteção de ramificação - Repository.get_branches () retorna uma lista
de branches, mas o GitHub não retorna informações suficientes para que os métodos em Branch sejam úteis. Se você deseja utilizar os recursos de proteção, deve chamar Repository.get_branch ('nome').