-
Notifications
You must be signed in to change notification settings - Fork 46
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
make replace parameter work in edit_dataset_metadata #146
base: main
Are you sure you want to change the base?
make replace parameter work in edit_dataset_metadata #146
Conversation
- fix replace documentation and parametrization in edit_dataset_metadata
Could someone review this? |
Update: I left AUSSDA, so my funding for pyDataverse development has stopped. I want to get some basic funding to implement the most urgent updates (PRs, Bug fixes, maintenance work). If you can support this, please reach out to me. (www.stefankasberger.at). If you have feature requests, the same. Another option would be, that someone else helps with the development and / or maintenance. For this, also get in touch with me (or comment here). |
@pallinger hi! Is this a fix for the following issue? |
@pdurbin Yes, it seems to be. |
Ok, thanks, I added "closes" to the description. |
Kudos, SonarCloud Quality Gate passed! |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks a lot for the PR!
The documentation strings are a good catch and should definitely be adjusted, however, I disagree with some of the code changes and added a few comments why.
@@ -185,7 +185,7 @@ def post_request(self, url, data=None, auth=False, params=None, files=None): | |||
"ERROR: POST - Could not establish connection to API: {0}".format(url) | |||
) | |||
|
|||
def put_request(self, url, data=None, auth=False, params=None): |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This should stay None
.
It is almost always better to use None
instead of {}
or []
, the common pattern being:
def fun(arg=None):
if arg is None:
arg = {}
The reason is, roughly speaking, that python will process the def-line at its first pass through the code, initializing all arguments given there once and storing the references.
If the underlying argument would then, e.g., be appended to, this would modify the same object for each call. Consider:
def fun(arg=[]):
arg.append(1)
print(arg)
fun()
fun()
fun()
This would print:
[1]
[1, 1]
[1, 1, 1]
However, if the expected output is [1], [1], [1], the code should be:
def fun(arg=None):
if arg is None:
arg = []
arg.append(1)
print(arg)
fun()
fun()
fun()
While it is not so important here, I would still recommend sticking with the convention unless there's good reason not to.
For more information, see https://docs.python.org/3/faq/programming.html#why-are-default-values-shared-between-objects.
@@ -1288,7 +1287,7 @@ def edit_dataset_metadata( | |||
url = "{0}/datasets/editMetadata/{1}".format( | |||
self.base_url_api_native, identifier | |||
) | |||
params = {"replace": True} if replace else {} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This can stay as it is. Maybe with requests this was necessary, but with httpx I tried this:
>>> import httpx
>>> httpx.get('https://example.org', params={'bool': True, 'string': 'true'}).url
URL('https://example.org?bool=true&string=true')
So both seem to result in the same outcome. One could even consider using params = {"replace": replace}
instead of the ternary. But I am not sure if the API supports it, so I would keep it as-is.
params
input_request
replace
documentation and parametrization inedit_dataset_metadata
The main problem was that
params
was overwritten by{}
input_request
at the beginning, effectively deleting any parameters passed. This caused thereplace
parameter inedit_dataset_metadata
to not work.There was also some confusion with
is_replace
in the documentation ofedit_dataset_metadata
, and also passing boolean instead of string "true" (although that may work, this is more in-line with https://guides.dataverse.org/en/latest/api/native-api.html#edit-dataset-metadata)