8000 start to port to async · python-gitlab/python-gitlab@3cc21b6 · GitHub
[go: up one dir, main page]

Skip to content
65F6

Commit 3cc21b6

Browse files
committed
start to port to async
1 parent afdc43f commit 3cc21b6

File tree

3 files changed

+385
-292
lines changed

3 files changed

+385
-292
lines changed

gitlab/__init__.py

Lines changed: 48 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,14 @@
2222
import time
2323
import warnings
2424

25-
import requests
25+
import httpx
2626

2727
import gitlab.config
2828
from gitlab.const import * # noqa
29-
from gitlab.exceptions import * # noqa
29+
from gitlab.exceptions import (on_http_error, GitlabVerifyError,
30+
GitlabMarkdownError, GitlabLicenseError, RedirectError,
31+
GitlabHttpError, GitlabAuthenticationError,
32+
GitlabParsingError, GitlabSearchError)
3033
from gitlab import utils # noqa
3134

3235
__title__ = "python-gitlab"
@@ -82,7 +85,7 @@ def __init__(
8285
http_password=None,
8386
timeout=None,
8487
api_version="4",
85-
session=None,
88+
client=None,
8689
per_page=None,
8790
):
8891

@@ -105,8 +108,8 @@ def __init__(
105108
self.job_token = job_token
106109
self._set_auth_info()
107110

108-
#: Create a session object for requests
109-
self.session = session or requests.Session()
111+
#: Create a client object for requests
112+
self.client = client or httpx.AsyncClient()
110113

111114
self.per_page = per_page
112115

@@ -143,8 +146,8 @@ def __init__(
143146
def __enter__(self):
144147
return self
145148

146-
def __exit__(self, *args):
147-
self.session.close()
149+
async def __exit__(self, *args):
150+
await self.client.aclose()
148151

149152
def __getstate__(self):
150153
state = self.__dict__.copy()
@@ -211,7 +214,7 @@ def auth(self):
211214
"""
212215
self.user = self._objects.CurrentUserManager(self).get()
213216

214-
def version(self):
217+
async def version(self):
215218
"""Returns the version and revision of the gitlab server.
216219
217220
Note that self.version and self.revision will be set on the gitlab
@@ -224,7 +227,7 @@ def version(self):
224227
"""
225228
if self._server_version is None:
226229
try:
227-
data = self.http_get("/version")
230+
data = await self.http_get("/version")
228231
self._server_version = data["version"]
229232
self._server_revision = data["revision"]
230233
except Exception:
@@ -233,7 +236,7 @@ def version(self):
233236
return self._server_version, self._server_revision
234237

235238
@on_http_error(GitlabVerifyError)
236-
def lint(self, content, **kwargs):
239+
async def lint(self, content, **kwargs):
237240
"""Validate a gitlab CI configuration.
238241
239242
Args:
@@ -249,11 +252,11 @@ def lint(self, content, **kwargs):
249252
otherwise
250253
"""
251254
post_data = {"content": content}
252-
data = self.http_post("/ci/lint", post_data=post_data, **kwargs)
255+
data = await self.http_post("/ci/lint", post_data=post_data, **kwargs)
253256
return (data["status"] == "valid", data["errors"])
254257

255258
@on_http_error(GitlabMarkdownError)
256-
def markdown(self, text, gfm=False, project=None, **kwargs):
259+
async def markdown(self, text, gfm=False, project=None, **kwargs):
257260
"""Render an arbitrary Markdown document.
258261
259262
Args:
@@ -274,11 +277,11 @@ def markdown(self, text, gfm=False, project=None, **kwargs):
274277
post_data = {"text": text, "gfm": gfm}
275278
if project is not None:
276279
post_data["project"] = project
277-
data = self.http_post("/markdown", post_data=post_data, **kwargs)
280+
data = await self.http_post("/markdown", post_data=post_data, **kwargs)
278281
return data["html"]
279282

280283
@on_http_error(GitlabLicenseError)
281-
def get_license(self, **kwargs):
284+
async def get_license(self, **kwargs):
282285
"""Retrieve information about the current license.
283286
284287
Args:
@@ -291,10 +294,10 @@ def get_license(self, **kwargs):
291294
Returns:
292295
dict: The current license information
293296
"""
294-
return self.http_get("/license", **kwargs)
297+
return await self.http_get("/license", **kwargs)
295298

296299
@on_http_error(GitlabLicenseError)
297-
def set_license(self, license, **kwargs):
300+
async def set_license(self, license, **kwargs):
298301
"""Add a new license.
299302
300303
Args:
@@ -309,7 +312,7 @@ def set_license(self, license, **kwargs):
309312
dict: The new license information
310313
"""
311314
data = {"license": license}
312-
return self.http_post("/license", post_data=data, **kwargs)
315+
return await self.http_post("/license", post_data=data, **kwargs)
313316

314317
def _construct_url(self, id_, obj, parameters, action=None):
315318
if "next_url" in parameters:
@@ -369,7 +372,7 @@ def _set_auth_info(self):
369372
self.headers["JOB-TOKEN"] = self.job_token
370373

371374
if self.http_username:
372-
self._http_auth = requests.auth.HTTPBasicAuth(
375+
self._http_auth = httpx.auth.HTTPBasicAuth(
373376
self.http_username, self.http_password
374377
)
375378

@@ -436,7 +439,7 @@ def _check_redirects(self, result):
436439
if location and location.startswith("https://"):
437440
raise RedirectError(REDIRECT_MSG)
438441

439-
def http_request(
442+
async def http_request(
440443
self,
441444
verb,
442445
path,
@@ -508,12 +511,12 @@ def http_request(
508511
# The Requests behavior is right but it seems that web servers don't
509512
# always agree with this decision (this is the case with a default
510513
# gitlab installation)
511-
req = requests.Request(
514+
req = httpx.Request(
512515
verb, url, json=json, data=data, params=params, files=files, **opts
513516
)
514-
prepped = self.session.prepare_request(req)
517+
prepped = self.client.prepare_request(req)
515518
prepped.url = utils.sanitized_url(prepped.url)
516-
settings = self.session.merge_environment_settings(
519+
settings = self.client.merge_environment_settings(
517520
prepped.url, {}, streamed, verify, None
518521
)
519522

@@ -527,7 +530,7 @@ def http_request(
527530
cur_retries = 0
528531

529532
while True:
530-
result = self.session.send(prepped, timeout=timeout, **settings)
533+
result = await self.client.send(prepped, timeout=timeout, **settings)
531534

532535
self._check_redirects(result)
533536

@@ -567,7 +570,7 @@ def http_request(
567570
response_body=result.content,
568571
)
569572

570-
def http_get(self, path, query_data=None, streamed=False, raw=False, **kwargs):
573+
async def http_get(self, path, query_data=None, streamed=False, raw=False, **kwargs):
571574
"""Make a GET request to the Gitlab server.
572575
573576
Args:
@@ -588,7 +591,7 @@ def http_get(self, path, query_data=None, streamed=False, raw=False, **kwargs):
588591
GitlabParsingError: If the json data could not be parsed
589592
"""
590593
query_data = query_data or {}
591-
result = self.http_request(
594+
result = await self.http_request(
592595
"get", path, query_data=query_data, streamed=streamed, **kwargs
593596
)
594597

@@ -606,7 +609,7 @@ def http_get(self, path, query_data=None, streamed=False, raw=False, **kwargs):
606609
else:
607610
return result
608611

609-
def http_list(self, path, query_data=None, as_list=None, **kwargs):
612+
async def http_list(self, path, query_data=None, as_list=None, **kwargs):
610613
"""Make a GET request to the Gitlab server for list-oriented queries.
611614
612615
Args:
@@ -645,7 +648,8 @@ def http_list(self, path, query_data=None, as_list=None, **kwargs):
645648
# No pagination, generator requested
646649
return GitlabList(self, url, query_data, **kwargs)
647650

648-
def http_post(self, path, query_data=None, post_data=None, files=None, **kwargs):
651+
async def http_post(self, path, query_data=None,
652+
post_data=None, files=None, **kwargs):
649653
"""Make a POST request to the Gitlab server.
650654
651655
Args:
@@ -668,7 +672,7 @@ def http_post(self, path, query_data=None, post_data=None, files=None, **kwargs)
668672
query_data = query_data or {}
669673
post_data = post_data or {}
670674

671-
result = self.http_request(
675+
result = await self.http_request(
672676
"post",
673677
path,
674678
query_data=query_data,
@@ -683,7 +687,8 @@ def http_post(self, path, query_data=None, post_data=None, files=None, **kwargs)
683687
raise GitlabParsingError(error_message="Failed to parse the server message")
684688
return result
685689

686-
def http_put(self, path, query_data=None, post_data=None, files=None, **kwargs):
690+
async def http_put(self, path, query_data=None,
691+
post_data=None, files=None, **kwargs):
687692
"""Make a PUT request to the Gitlab server.
688693
689694
Args:
@@ -705,7 +710,7 @@ def http_put(self, path, query_data=None, post_data=None, files=None, **kwargs):
705710
query_data = query_data or {}
706711
post_data = post_data or {}
707712

708-
result = self.http_request(
713+
result = await self.http_request(
709714
"put",
710715
path,
711716
query_data=query_data,
@@ -718,7 +723,7 @@ def http_put(self, path, query_data=None, post_data=None, files=None, **kwargs):
718723
except Exception:
719724
raise GitlabParsingError(error_message="Failed to parse the server message")
720725

721-
def http_delete(self, path, **kwargs):
726+
async def http_delete(self, path, **kwargs):
722727
"""Make a PUT request to the Gitlab server.
723728
724729
Args:
@@ -732,10 +737,10 @@ def http_delete(self, path, **kwargs):
732737
Raises:
733738
GitlabHttpError: When the return code is not 2xx
734739
"""
735-
return self.http_request("delete", path, **kwargs)
740+
return await self.http_request("delete", path, **kwargs)
736741

737742
@on_http_error(GitlabSearchError)
738-
def search(self, scope, search, **kwargs):
743+
async def search(self, scope, search, **kwargs):
739744
"""Search GitLab resources matching the provided string.'
740745
741746
Args:
@@ -761,14 +766,17 @@ class GitlabList(object):
761766
the API again when needed.
762767
"""
763768

764-
def __init__(self, gl, url, query_data, get_next=True, **kwargs):
769+
async def __init__(self, gl, url, query_data, get_next=True, **kwargs):
765770
self._gl = gl
766-
self._query(url, query_data, **kwargs)
771+
await self._query(url, query_data, **kwargs)
767772
self._get_next = get_next
768773

769-
def _query(self, url, query_data=None, **kwargs):
774+
async def _query(self, url, query_data=None, **kwargs):
770775
query_data = query_data or {}
771-
result = self._gl.http_request("get", url, query_data=query_data, **kwargs)
776+
result = await self._gl.http_request("get",
777+
url,
778+
query_data=query_data,
779+
**kwargs)
772780
try:
773781
self._next_url = result.links["next"]["url"]
774782
except KeyError:
@@ -829,10 +837,10 @@ def __iter__(self):
829837
def __len__(self):
830838
return int(self._total)
831839

832-
def __next__(self):
840+
async def __next__(self):
833841
return self.next()
834842

835-
def next(self):
843+
async def next(self):
836844
try:
837845
item = self._data[self._current]
838846
self._current += 1
@@ -841,7 +849,7 @@ def next(self):
841849
pass
842850

843851
if self._next_url and self._get_next is True:
844-
self._query(self._next_url)
852+
await self._query(self._next_url)
845853
return self.next()
846854

847855
raise StopIteration

0 commit comments

Comments
 (0)
0