pyzotero 1.5.27__tar.gz → 1.6.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. {pyzotero-1.5.27 → pyzotero-1.6.0}/.github/workflows/tests.yml +1 -1
  2. {pyzotero-1.5.27/src/pyzotero.egg-info → pyzotero-1.6.0}/PKG-INFO +1 -1
  3. {pyzotero-1.5.27 → pyzotero-1.6.0}/doc/index.rst +1 -1
  4. {pyzotero-1.5.27 → pyzotero-1.6.0}/src/_version.py +2 -2
  5. {pyzotero-1.5.27 → pyzotero-1.6.0}/src/pyzotero/zotero.py +40 -15
  6. {pyzotero-1.5.27 → pyzotero-1.6.0/src/pyzotero.egg-info}/PKG-INFO +1 -1
  7. {pyzotero-1.5.27 → pyzotero-1.6.0}/.coveragerc +0 -0
  8. {pyzotero-1.5.27 → pyzotero-1.6.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  9. {pyzotero-1.5.27 → pyzotero-1.6.0}/.github/ISSUE_TEMPLATE/usage_question.md +0 -0
  10. {pyzotero-1.5.27 → pyzotero-1.6.0}/.github/dependabot.yml +0 -0
  11. {pyzotero-1.5.27 → pyzotero-1.6.0}/.github/pull_request_template.md +0 -0
  12. {pyzotero-1.5.27 → pyzotero-1.6.0}/.gitignore +0 -0
  13. {pyzotero-1.5.27 → pyzotero-1.6.0}/.readthedocs.yaml +0 -0
  14. {pyzotero-1.5.27 → pyzotero-1.6.0}/AUTHORS +0 -0
  15. {pyzotero-1.5.27 → pyzotero-1.6.0}/CITATION.cff +0 -0
  16. {pyzotero-1.5.27 → pyzotero-1.6.0}/CONTRIBUTING.md +0 -0
  17. {pyzotero-1.5.27 → pyzotero-1.6.0}/CONTRIBUTORS.md +0 -0
  18. {pyzotero-1.5.27 → pyzotero-1.6.0}/LICENSE.md +0 -0
  19. {pyzotero-1.5.27 → pyzotero-1.6.0}/README.md +0 -0
  20. {pyzotero-1.5.27 → pyzotero-1.6.0}/__init__.py +0 -0
  21. {pyzotero-1.5.27 → pyzotero-1.6.0}/doc/Makefile +0 -0
  22. {pyzotero-1.5.27 → pyzotero-1.6.0}/doc/_templates/layout.html +0 -0
  23. {pyzotero-1.5.27 → pyzotero-1.6.0}/doc/cat.png +0 -0
  24. {pyzotero-1.5.27 → pyzotero-1.6.0}/doc/conf.py +0 -0
  25. {pyzotero-1.5.27 → pyzotero-1.6.0}/dump_contributors.py +0 -0
  26. {pyzotero-1.5.27 → pyzotero-1.6.0}/pyproject.toml +0 -0
  27. {pyzotero-1.5.27 → pyzotero-1.6.0}/setup.cfg +0 -0
  28. {pyzotero-1.5.27 → pyzotero-1.6.0}/setup.py +0 -0
  29. {pyzotero-1.5.27 → pyzotero-1.6.0}/src/pyzotero/__init__.py +0 -0
  30. {pyzotero-1.5.27 → pyzotero-1.6.0}/src/pyzotero/zotero_errors.py +0 -0
  31. {pyzotero-1.5.27 → pyzotero-1.6.0}/src/pyzotero.egg-info/SOURCES.txt +0 -0
  32. {pyzotero-1.5.27 → pyzotero-1.6.0}/src/pyzotero.egg-info/dependency_links.txt +0 -0
  33. {pyzotero-1.5.27 → pyzotero-1.6.0}/src/pyzotero.egg-info/requires.txt +0 -0
  34. {pyzotero-1.5.27 → pyzotero-1.6.0}/src/pyzotero.egg-info/top_level.txt +0 -0
  35. {pyzotero-1.5.27 → pyzotero-1.6.0}/tests/api_responses/__init__.py +0 -0
  36. {pyzotero-1.5.27 → pyzotero-1.6.0}/tests/api_responses/attachments_doc.json +0 -0
  37. {pyzotero-1.5.27 → pyzotero-1.6.0}/tests/api_responses/citation_doc.xml +0 -0
  38. {pyzotero-1.5.27 → pyzotero-1.6.0}/tests/api_responses/collection_doc.json +0 -0
  39. {pyzotero-1.5.27 → pyzotero-1.6.0}/tests/api_responses/collection_tags.json +0 -0
  40. {pyzotero-1.5.27 → pyzotero-1.6.0}/tests/api_responses/collection_versions.json +0 -0
  41. {pyzotero-1.5.27 → pyzotero-1.6.0}/tests/api_responses/collections_doc.json +0 -0
  42. {pyzotero-1.5.27 → pyzotero-1.6.0}/tests/api_responses/creation_doc.json +0 -0
  43. {pyzotero-1.5.27 → pyzotero-1.6.0}/tests/api_responses/groups_doc.json +0 -0
  44. {pyzotero-1.5.27 → pyzotero-1.6.0}/tests/api_responses/item_doc.json +0 -0
  45. {pyzotero-1.5.27 → pyzotero-1.6.0}/tests/api_responses/item_fields.json +0 -0
  46. {pyzotero-1.5.27 → pyzotero-1.6.0}/tests/api_responses/item_file.pdf +0 -0
  47. {pyzotero-1.5.27 → pyzotero-1.6.0}/tests/api_responses/item_template.json +0 -0
  48. {pyzotero-1.5.27 → pyzotero-1.6.0}/tests/api_responses/item_types.json +0 -0
  49. {pyzotero-1.5.27 → pyzotero-1.6.0}/tests/api_responses/item_versions.json +0 -0
  50. {pyzotero-1.5.27 → pyzotero-1.6.0}/tests/api_responses/items_doc.json +0 -0
  51. {pyzotero-1.5.27 → pyzotero-1.6.0}/tests/api_responses/keys_doc.txt +0 -0
  52. {pyzotero-1.5.27 → pyzotero-1.6.0}/tests/api_responses/tags_doc.json +0 -0
  53. {pyzotero-1.5.27 → pyzotero-1.6.0}/tests/test_zotero.py +0 -0
  54. {pyzotero-1.5.27 → pyzotero-1.6.0}/uv.lock +0 -0
@@ -85,6 +85,6 @@ jobs:
85
85
  token: ${{ secrets.GITHUB_TOKEN }}
86
86
 
87
87
  - name: PyPI Publish
88
- uses: pypa/gh-action-pypi-publish@v1.12.2
88
+ uses: pypa/gh-action-pypi-publish@v1.12.3
89
89
  with:
90
90
  packages-dir: ${{ steps.download.outputs.download-path }}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pyzotero
3
- Version: 1.5.27
3
+ Version: 1.6.0
4
4
  Summary: Python wrapper for the Zotero API
5
5
  Author-email: Stephan Hügel <urschrei@gmail.com>
6
6
  License: # Blue Oak Model License
@@ -23,7 +23,7 @@ Getting started (short version)
23
23
  3. You'll also need [*]_ to get an **API key** from the Zotero `site <https://www.zotero.org/settings/keys/new>`_
24
24
  4. Are you accessing your own Zotero library? Set``library_type`` to ``'user'``
25
25
  5. Are you accessing a shared group library? Set``library_type`` to ``'group'``
26
- 6. **Read-only** access to your local Zotero library is available: set ``local=True`
26
+ 6. **Read-only** access to your local Zotero library is available: set ``local=True``
27
27
 
28
28
 
29
29
  .. _hello-world:
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '1.5.27'
16
- __version_tuple__ = version_tuple = (1, 5, 27)
15
+ __version__ = version = '1.6.0'
16
+ __version_tuple__ = version_tuple = (1, 6, 0)
@@ -24,8 +24,16 @@ import uuid
24
24
  import zipfile
25
25
  from collections import OrderedDict
26
26
  from functools import wraps
27
- from pathlib import Path
28
- from urllib.parse import parse_qs, parse_qsl, quote, urlencode, urlparse, urlunparse
27
+ from pathlib import Path, PurePosixPath
28
+ from urllib.parse import (
29
+ parse_qs,
30
+ parse_qsl,
31
+ quote,
32
+ unquote,
33
+ urlencode,
34
+ urlparse,
35
+ urlunparse,
36
+ )
29
37
 
30
38
  import bibtexparser
31
39
  import feedparser
@@ -153,11 +161,6 @@ def retrieve(func):
153
161
  """
154
162
  if kwargs:
155
163
  self.add_parameters(**kwargs)
156
- res = func(self, *args)
157
- parsed = urlparse(res)
158
- querydict = parse_qs(parsed.query)
159
- if not querydict.get("locale"):
160
- self.add_parameters(locale=self.locale)
161
164
  retrieved = self._retrieve_data(func(self, *args))
162
165
  # we now always have links in the header response
163
166
  self.links = self._extract_links()
@@ -277,8 +280,10 @@ class Zotero:
277
280
  """Store Zotero credentials"""
278
281
  if not local:
279
282
  self.endpoint = "https://api.zotero.org"
283
+ self.local = False
280
284
  else:
281
285
  self.endpoint = "http://localhost:23119/api"
286
+ self.local = True
282
287
  if library_id and library_type:
283
288
  self.library_id = library_id
284
289
  # library_type determines whether query begins w. /users or /groups
@@ -326,6 +331,21 @@ class Zotero:
326
331
  self.backoff = False
327
332
  self.backoff_duration = 0.0
328
333
 
334
+ def _check_for_component(self, url, component):
335
+ """Check a url path query fragment for a specific query parameter"""
336
+ if parse_qs(url).get(component):
337
+ return True
338
+ return False
339
+
340
+ def _striplocal(self, url):
341
+ if self.local:
342
+ parsed = urlparse(url)
343
+ purepath = PurePosixPath(unquote(parsed.path))
344
+ newpath = "/".join(purepath.parts[2:])
345
+ replaced = parsed._replace(path="/" + newpath)
346
+ return urlunparse(replaced)
347
+ return url
348
+
329
349
  def _set_backoff(self, duration):
330
350
  """
331
351
  Set a backoff
@@ -411,10 +431,15 @@ class Zotero:
411
431
  self.self_link = request
412
432
  # ensure that we wait if there's an active backoff
413
433
  self._check_backoff()
414
- if params:
415
- params["locale"] = self.locale
416
- if not params:
417
- params = {"locale": self.locale}
434
+ # don't set locale if the url already contains it
435
+ if params and self.links:
436
+ if not self._check_for_component(self.links.get("next"), "locale"):
437
+ params["locale"] = self.locale
438
+ if not params and self.links:
439
+ if not self._check_for_component(self.links.get("next"), "locale"):
440
+ params = {"locale": self.locale}
441
+ else:
442
+ params = {}
418
443
  self.request = requests.get(
419
444
  url=full_url, headers=self.default_headers(), params=params
420
445
  )
@@ -850,10 +875,10 @@ class Zotero:
850
875
  @retrieve
851
876
  def follow(self):
852
877
  """Return the result of the call to the URL in the 'Next' link"""
853
- if self.links.get("next"):
854
- return self.links.get("next")
855
- else:
856
- return
878
+ if n := self.links.get("next"):
879
+ newurl = self._striplocal(n)
880
+ return newurl
881
+ return
857
882
 
858
883
  def iterfollow(self):
859
884
  """Generator for self.follow()"""
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pyzotero
3
- Version: 1.5.27
3
+ Version: 1.6.0
4
4
  Summary: Python wrapper for the Zotero API
5
5
  Author-email: Stephan Hügel <urschrei@gmail.com>
6
6
  License: # Blue Oak Model License
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes