Estoy jugando con esta biblioteca con la esperanza de poder automatizar las cosas en nuestro Github Enterprise. Una de las primeras cosas que debo hacer es establecer protecciones de rama para nuestros repositorios. Sin embargo, cuando inicio un objeto Branch desde un repositorio de prueba (que ya tenía configuradas las protecciones de rama, fíjate), el único atributo que ha asignado es "nombre", y la mayoría de los métodos enumerados en la documentación no existen en el 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
La salida:
...
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'
Tampoco hay ninguno de los métodos allí:
print master.get_required_status_checks()
OUTPUT:
AttributeError: 'Branch' object has no attribute 'get_required_status_checks'
O este atributo:
print master.protection
OUTPUT:
return self._protected.value
AttributeError: 'Branch' object has no attribute '_protected'
El objeto tiene este aspecto:
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 el objeto no se está creando correctamente.
¿Qué versión de PyGithub estás usando? Tenga en cuenta que el # 790 se fusionó recientemente, pero aún no se lanzó.
Estoy usando PyGithub-1.40 y Github Enterprise 2.8.6.
https://github.com/PyGithub/PyGithub/pull/790 definitivamente parece prometedor, aunque la versión GHE de mi empresa está un poco desactualizada, por lo que no estoy seguro de si los cambios en la API lo afectan.
ACTUALIZACIÓN: en el proceso de prueba del último maestro
Parece que la última combinación solucionó los problemas de los atributos y métodos faltantes, pero parece ser incompatible con mi versión de la API:
master = g.get_user("ganderson").get_repo('cookbook1').get_branch('master')
print master.protection_url
master.get_protection()
PRODUCCIÓN:
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 un problema separado, así que cerraré este ticket. Gracias.
Plantee un nuevo problema si el maestro se rompe.
Esto también me parece roto en 1.43.2 en api.github.com estándar
Tengo 2 ramas que están protegidas, pero los objetos Branch nunca obtienen el conjunto protection_url.
La URL de protección no se configura y genera errores para cualquier cosa que la use para crear URL.
[
{
"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"
}
}
]
Si utilizo branches?protected=true
, devuelve protection_url en la 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"
}
]
Reabriré el problema en nombre del último comentarista.
¿Puedes intentar obtener una sola rama con get_branch("master")
? Creo que el problema podría ser que el método actual get_branches
no admite el parámetro protected
.
Pasé un poco de tiempo depurando este problema y planteé un error en la API de GitHub v3.
Me encontré con este problema al desarrollar el código de protección de la rama: Repository.get_branches () devuelve una lista
de ramas, pero GitHub no devuelve suficiente información para que los métodos de Branch sean útiles. Si desea utilizar las funciones de protección, debe llamar a Repository.get_branch ('nombre').
Me encontré con este problema al desarrollar el código de protección de la rama: Repository.get_branches () devuelve una lista
de ramas, pero GitHub no devuelve suficiente información para que los métodos de Branch sean útiles. Si desea utilizar las funciones de protección, debe llamar a Repository.get_branch ('nombre').
Gracias, encontré este problema hoy, esta solución me ahorró mucho tiempo y frustración.
Este problema se ha marcado automáticamente como obsoleto porque no ha tenido actividad reciente. Se cerrará si no se produce más actividad. Gracias por sus aportaciones.
Comentario más útil
Me encontré con este problema al desarrollar el código de protección de la rama: Repository.get_branches () devuelve una lista
de ramas, pero GitHub no devuelve suficiente información para que los métodos de Branch sean útiles. Si desea utilizar las funciones de protección, debe llamar a Repository.get_branch ('nombre').