Skip to content

Commit 924cce1

Browse files
committed
Merge branch 'main' into feature/import-endpoint
2 parents 84f77c8 + 9023264 commit 924cce1

28 files changed

+346
-209
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ The next sample code should print “Hello {username}” where {username} is rep
8282
```python
8383
from cytomine.models import ProjectCollection
8484

85-
print("Hello {}".format(cytomine.current_user))
85+
print(f"Hello {cytomine.current_user}")
8686
projects = ProjectCollection().fetch()
8787
print(projects)
8888
for project in projects:

cytomine/cytomine.py

+91-49
Original file line numberDiff line numberDiff line change
@@ -87,13 +87,18 @@ def __init__(self, public_key, private_key, base_url, base_path, sign_with_base_
8787

8888
def __call__(self, r):
8989
content_type = r.headers.get("content-type", "")
90-
token = "{}\n\n{}\n{}\n{}{}".format(r.method, content_type, r.headers['date'],
91-
self.base_path, r.url.replace(self.base_url, ""))
90+
token = (
91+
f"{r.method}\n\n"
92+
f"{content_type}\n"
93+
f"{r.headers['date']}\n"
94+
f"{self.base_path}"
95+
f"{r.url.replace(self.base_url, '')}"
96+
)
9297

9398
signature = base64.b64encode(hmac.new(bytes(self.private_key, 'utf-8'),
9499
token.encode('utf-8'), hashlib.sha1).digest())
95100

96-
authorization = "CYTOMINE {}:{}".format(self.public_key, signature.decode('utf-8'))
101+
authorization = f"CYTOMINE {self.public_key}:{signature.decode('utf-8')}"
97102
r.headers['authorization'] = authorization
98103
return r
99104

@@ -106,8 +111,11 @@ def deprecated(func):
106111
@functools.wraps(func)
107112
def new_func(*args, **kwargs):
108113
warnings.simplefilter('always', DeprecationWarning) # turn off filter
109-
warnings.warn("Call to deprecated function {}.".format(func.__name__), category=DeprecationWarning,
110-
stacklevel=2)
114+
warnings.warn(
115+
f"Call to deprecated function {func.__name__}.",
116+
category=DeprecationWarning,
117+
stacklevel=2
118+
)
111119
warnings.simplefilter('default', DeprecationWarning) # reset filter
112120
return func(*args, **kwargs)
113121

@@ -343,7 +351,7 @@ def _parse_url(host, provided_protocol=None):
343351
def _start(self):
344352
self._session = requests.session()
345353
if self._use_cache:
346-
self._session.mount('{}://'.format(self._protocol), CacheControlAdapter())
354+
self._session.mount(f"{self._protocol}://", CacheControlAdapter())
347355

348356
Cytomine.__instance = self
349357
self.wait_to_accept_connection()
@@ -381,7 +389,7 @@ def set_credentials(self, public_key, private_key):
381389
self.set_current_user()
382390

383391
def _base_url(self, with_base_path=True):
384-
url = "{}://{}".format(self._protocol, self._host)
392+
url = f"{self._protocol}://{self._host}"
385393
if with_base_path:
386394
url += self._base_path
387395
return url
@@ -403,15 +411,21 @@ def _headers(accept="application/json, */*", content_type=None):
403411

404412
def _log_response(self, response, message):
405413
try:
406-
msg = "[{}] {} | {} {}".format(response.request.method, message, response.status_code, response.reason)
414+
msg = (
415+
f"[{response.request.method}] {message} | "
416+
f"{response.status_code} {response.reason}"
417+
)
407418
if response.status_code == requests.codes.ok or response.status_code >= requests.codes.server_error:
408419
self.log(msg)
409420
elif response.status_code == 301 or response.status_code == 302:
410421
redirected_url = response.headers['Location']
411422
raise URLRedirectionException(response.status_code, redirected_url)
412423
else:
413-
self.log("{} ({})".format(msg, read_response_message(response, key="errors")), level=logging.ERROR)
414-
self._logger.debug("DUMP:\n{}".format(dump.dump_all(response).decode("utf-8")))
424+
self.log(
425+
f"{msg} ({read_response_message(response, key='errors')})",
426+
level=logging.ERROR,
427+
)
428+
self._logger.debug("DUMP:\n%s", dump.dump_all(response).decode("utf-8"))
415429
except (UnicodeDecodeError, JSONDecodeError) as e:
416430
self._logger.debug("DUMP:\nImpossible to decode.")
417431
except URLRedirectionException as e:
@@ -425,14 +439,18 @@ def logger(self):
425439
return self._logger
426440

427441
def _get(self, uri, query_parameters, with_base_path=True):
428-
return self._session.get("{}{}".format(self._base_url(with_base_path), uri),
429-
allow_redirects=False,
430-
auth=CytomineAuth(
431-
self._public_key, self._private_key,
432-
self._base_url(), self._base_path),
433-
headers=self._headers(),
434-
params=query_parameters)
435-
442+
return self._session.get(
443+
f"{self._base_url(with_base_path)}{uri}",
444+
allow_redirects=False,
445+
auth=CytomineAuth(
446+
self._public_key,
447+
self._private_key,
448+
self._base_url(),
449+
self._base_path,
450+
),
451+
headers=self._headers(),
452+
params=query_parameters,
453+
)
436454
def get(self, uri, query_parameters=None):
437455
response = self._get(uri, query_parameters)
438456
self._log_response(response, uri)
@@ -467,13 +485,18 @@ def get_collection(self, collection, query_parameters=None, append_mode=False):
467485
return collection
468486

469487
def _put(self, uri, data=None, query_parameters=None):
470-
return self._session.put("{}{}".format(self._base_url(), uri),
471-
auth=CytomineAuth(
472-
self._public_key, self._private_key,
473-
self._base_url(), self._base_path),
474-
headers=self._headers(content_type='application/json'),
475-
params=query_parameters,
476-
data=data)
488+
return self._session.put(
489+
f"{self._base_url()}{uri}",
490+
auth=CytomineAuth(
491+
self._public_key,
492+
self._private_key,
493+
self._base_url(),
494+
self._base_path,
495+
),
496+
headers=self._headers(content_type="application/json"),
497+
params=query_parameters,
498+
data=data,
499+
)
477500

478501
def put(self, uri, data=None, query_paramters=None):
479502
response = self._put(uri, data=data, query_parameters=query_paramters)
@@ -498,12 +521,17 @@ def put_model(self, model, query_parameters=None):
498521
return model
499522

500523
def _delete(self, uri, query_parameters=None):
501-
return self._session.delete("{}{}".format(self._base_url(), uri),
502-
auth=CytomineAuth(
503-
self._public_key, self._private_key,
504-
self._base_url(), self._base_path),
505-
headers=self._headers(content_type='application/json'),
506-
params=query_parameters)
524+
return self._session.delete(
525+
f"{self._base_url()}{uri}",
526+
auth=CytomineAuth(
527+
self._public_key,
528+
self._private_key,
529+
self._base_url(),
530+
self._base_path,
531+
),
532+
headers=self._headers(content_type="application/json"),
533+
params=query_parameters,
534+
)
507535

508536
def delete(self, uri, query_parameters=None):
509537
response = self._delete(uri, query_parameters)
@@ -522,13 +550,18 @@ def delete_model(self, model, query_parameters=None):
522550
return False
523551

524552
def _post(self, uri, data=None, query_parameters=None, with_base_path=True):
525-
return self._session.post("{}{}".format(self._base_url(with_base_path), uri),
526-
auth=CytomineAuth(
527-
self._public_key, self._private_key,
528-
self._base_url(), self._base_path),
529-
headers=self._headers(content_type='application/json'),
530-
params=query_parameters,
531-
data=data)
553+
return self._session.post(
554+
f"{self._base_url(with_base_path)}{uri}",
555+
auth=CytomineAuth(
556+
self._public_key,
557+
self._private_key,
558+
self._base_url(),
559+
self._base_path,
560+
),
561+
headers=self._headers(content_type="application/json"),
562+
params=query_parameters,
563+
data=data,
564+
)
532565

533566
def post(self, uri, data=None, query_parameters=None):
534567
response = self._post(uri, data=data, query_parameters=query_parameters)
@@ -607,26 +640,31 @@ def upload_file(self, model, filename, query_parameters=None, uri=None):
607640
uri = model.uri()
608641

609642
m = MultipartEncoder(fields={"files[]": (filename, open(filename, 'rb'))})
610-
response = self._session.post("{}{}".format(self._base_url(), uri),
611-
auth=CytomineAuth(
612-
self._public_key, self._private_key,
613-
self._base_url(), self._base_path),
614-
headers=self._headers(content_type=m.content_type),
615-
params=query_parameters,
616-
data=m)
643+
response = self._session.post(
644+
f"{self._base_url()}{uri}",
645+
auth=CytomineAuth(
646+
self._public_key,
647+
self._private_key,
648+
self._base_url(),
649+
self._base_path,
650+
),
651+
headers=self._headers(content_type=m.content_type),
652+
params=query_parameters,
653+
data=m,
654+
)
617655

618656
if response.status_code == requests.codes.ok:
619657
model = model.populate(response.json()) # [model.callback_identifier.lower()])
620-
self._logger.info("File uploaded successfully to {}".format(uri))
658+
self._logger.info("File uploaded successfully to %s", uri)
621659
else:
622660
model = False
623-
self._logger.error("Error during file uploading to {}".format(uri))
661+
self._logger.error("Error during file uploading to %s",uri)
624662

625663
return model
626664

627665
def download_file(self, url, destination, override=False, payload=None):
628666
if not url.startswith("http"):
629-
url = "{}{}".format(self._base_url(), url)
667+
url = f"{self._base_url()}{url}"
630668

631669
if override or not os.path.exists(destination):
632670
response = self._session.get(url,
@@ -646,7 +684,11 @@ def download_file(self, url, destination, override=False, payload=None):
646684
shutil.copyfileobj(response.raw, f)
647685

648686
parameters = str(dict(filter(lambda item: item[1] is not None, payload.items()))) if payload else {}
649-
self._logger.info("File downloaded successfully from {} with parameters {}".format(url, parameters))
687+
self._logger.info(
688+
"File downloaded successfully from %s with parameters %s",
689+
url,
690+
parameters,
691+
)
650692
return True
651693
else:
652694
return True

cytomine/cytomine_job.py

+4-3
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ def _to_bool(v):
7575
elif lv in {"1", "true", "yes"}:
7676
return True
7777
else:
78-
raise ValueError("unexpected value '{}' for a boolean".format(v))
78+
raise ValueError(f"unexpected value '{v}' for a boolean")
7979
else:
8080
return bool(v)
8181

@@ -416,8 +416,9 @@ def __init__(self, cytomine_logger, iterable, comment_prefix=None):
416416
def __iter__(self):
417417
for i, v in enumerate(self._iterable):
418418
self._cytomine_logger.update(
419-
"{} ({}/{}).".format(self._comment_prefix, i + 1, len(self)),
420-
current=i, total=len(self)
419+
f"{self._comment_prefix} ({i + 1}/{len(self)}).",
420+
current=i,
421+
total=len(self),
421422
)
422423
yield v
423424

cytomine/models/_utilities/dump.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ def generic_image_dump(dest_pattern, model, url_fn, override=True, check_extensi
6767

6868
if destination:
6969
makedirs(destination, exist_ok=True)
70-
files_to_download.append(os.path.join(destination, "{}.{}".format(filename, extension)))
70+
files_to_download.append(os.path.join(destination, f"{filename}.{extension}"))
7171

7272
if len(files_to_download) == 0:
7373
raise ValueError("Couldn't generate a dump path.")

0 commit comments

Comments
 (0)