summaryrefslogtreecommitdiff
path: root/gitlab/utils.py
diff options
context:
space:
mode:
authorNejc Habjan <nejc.habjan@siemens.com>2022-07-28 01:24:13 +0200
committerGitHub <noreply@github.com>2022-07-28 01:24:13 +0200
commit510ec30f30e7ff8466b58d2661b67076de9d234b (patch)
treeda3116aa356818cb2a865b047de9ef160bbfffa7 /gitlab/utils.py
parent194ee0100c2868c1a9afb161c15f3145efb01c7c (diff)
parent1af44ce8761e6ee8a9467a3e192f6c4d19e5cefe (diff)
downloadgitlab-510ec30f30e7ff8466b58d2661b67076de9d234b.tar.gz
Merge pull request #1699 from python-gitlab/jlvillal/arrays
fix: use the [] after key names for array variables in `params`
Diffstat (limited to 'gitlab/utils.py')
-rw-r--r--gitlab/utils.py39
1 files changed, 30 insertions, 9 deletions
diff --git a/gitlab/utils.py b/gitlab/utils.py
index 4d2ec8d..f3d97f7 100644
--- a/gitlab/utils.py
+++ b/gitlab/utils.py
@@ -55,34 +55,53 @@ def response_content(
def _transform_types(
- data: Dict[str, Any], custom_types: dict, *, transform_files: Optional[bool] = True
+ data: Dict[str, Any],
+ custom_types: dict,
+ *,
+ transform_data: bool,
+ transform_files: Optional[bool] = True,
) -> Tuple[dict, dict]:
"""Copy the data dict with attributes that have custom types and transform them
before being sent to the server.
- If ``transform_files`` is ``True`` (default), also populates the ``files`` dict for
+ ``transform_files``: If ``True`` (default), also populates the ``files`` dict for
FileAttribute types with tuples to prepare fields for requests' MultipartEncoder:
https://toolbelt.readthedocs.io/en/latest/user.html#multipart-form-data-encoder
+ ``transform_data``: If ``True`` transforms the ``data`` dict with fields
+ suitable for encoding as query parameters for GitLab's API:
+ https://docs.gitlab.com/ee/api/#encoding-api-parameters-of-array-and-hash-types
+
Returns:
A tuple of the transformed data dict and files dict"""
# Duplicate data to avoid messing with what the user sent us
data = data.copy()
+ if not transform_files and not transform_data:
+ return data, {}
+
files = {}
- for attr_name, type_cls in custom_types.items():
+ for attr_name, attr_class in custom_types.items():
if attr_name not in data:
continue
- type_obj = type_cls(data[attr_name])
+ gitlab_attribute = attr_class(data[attr_name])
- # if the type if FileAttribute we need to pass the data as file
- if transform_files and isinstance(type_obj, types.FileAttribute):
- key = type_obj.get_file_name(attr_name)
+ # if the type is FileAttribute we need to pass the data as file
+ if isinstance(gitlab_attribute, types.FileAttribute) and transform_files:
+ key = gitlab_attribute.get_file_name(attr_name)
files[attr_name] = (key, data.pop(attr_name))
- else:
- data[attr_name] = type_obj.get_for_api()
+ continue
+
+ if not transform_data:
+ continue
+
+ if isinstance(gitlab_attribute, types.GitlabAttribute):
+ key, value = gitlab_attribute.get_for_api(key=attr_name)
+ if key != attr_name:
+ del data[attr_name]
+ data[key] = value
return data, files
@@ -94,6 +113,8 @@ def copy_dict(
) -> None:
for k, v in src.items():
if isinstance(v, dict):
+ # NOTE(jlvillal): This provides some support for the `hash` type
+ # https://docs.gitlab.com/ee/api/#hash
# Transform dict values to new attributes. For example:
# custom_attributes: {'foo', 'bar'} =>
# "custom_attributes['foo']": "bar"