ebird-api-requests 4.0.2__tar.gz → 4.1.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 (22) hide show
  1. {ebird_api_requests-4.0.2/src/ebird_api_requests.egg-info → ebird_api_requests-4.1.0}/PKG-INFO +9 -4
  2. {ebird_api_requests-4.0.2 → ebird_api_requests-4.1.0}/README.md +8 -3
  3. {ebird_api_requests-4.0.2 → ebird_api_requests-4.1.0}/pyproject.toml +2 -2
  4. {ebird_api_requests-4.0.2 → ebird_api_requests-4.1.0}/src/ebird/api/requests/__init__.py +1 -1
  5. {ebird_api_requests-4.0.2 → ebird_api_requests-4.1.0}/src/ebird/api/requests/utils.py +34 -6
  6. {ebird_api_requests-4.0.2 → ebird_api_requests-4.1.0/src/ebird_api_requests.egg-info}/PKG-INFO +9 -4
  7. {ebird_api_requests-4.0.2 → ebird_api_requests-4.1.0}/LICENSE.txt +0 -0
  8. {ebird_api_requests-4.0.2 → ebird_api_requests-4.1.0}/setup.cfg +0 -0
  9. {ebird_api_requests-4.0.2 → ebird_api_requests-4.1.0}/setup.py +0 -0
  10. {ebird_api_requests-4.0.2 → ebird_api_requests-4.1.0}/src/ebird/api/requests/checklists.py +0 -0
  11. {ebird_api_requests-4.0.2 → ebird_api_requests-4.1.0}/src/ebird/api/requests/client.py +0 -0
  12. {ebird_api_requests-4.0.2 → ebird_api_requests-4.1.0}/src/ebird/api/requests/constants.py +0 -0
  13. {ebird_api_requests-4.0.2 → ebird_api_requests-4.1.0}/src/ebird/api/requests/hotspots.py +0 -0
  14. {ebird_api_requests-4.0.2 → ebird_api_requests-4.1.0}/src/ebird/api/requests/observations.py +0 -0
  15. {ebird_api_requests-4.0.2 → ebird_api_requests-4.1.0}/src/ebird/api/requests/regions.py +0 -0
  16. {ebird_api_requests-4.0.2 → ebird_api_requests-4.1.0}/src/ebird/api/requests/species.py +0 -0
  17. {ebird_api_requests-4.0.2 → ebird_api_requests-4.1.0}/src/ebird/api/requests/statistics.py +0 -0
  18. {ebird_api_requests-4.0.2 → ebird_api_requests-4.1.0}/src/ebird/api/requests/taxonomy.py +0 -0
  19. {ebird_api_requests-4.0.2 → ebird_api_requests-4.1.0}/src/ebird/api/requests/validation.py +0 -0
  20. {ebird_api_requests-4.0.2 → ebird_api_requests-4.1.0}/src/ebird_api_requests.egg-info/SOURCES.txt +0 -0
  21. {ebird_api_requests-4.0.2 → ebird_api_requests-4.1.0}/src/ebird_api_requests.egg-info/dependency_links.txt +0 -0
  22. {ebird_api_requests-4.0.2 → ebird_api_requests-4.1.0}/src/ebird_api_requests.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ebird-api-requests
3
- Version: 4.0.2
3
+ Version: 4.1.0
4
4
  Summary: A python library for accessing the eBird API, version 2.0
5
5
  Author-email: Stuart MacKay <smackay@flagstonesoftware.com>
6
6
  License: MIT License
@@ -28,10 +28,10 @@ Description-Content-Type: text/markdown
28
28
  License-File: LICENSE.txt
29
29
  Dynamic: license-file
30
30
 
31
- [![PyPI version](https://badge.fury.io/py/ebird-api.svg)](https://badge.fury.io/py/ebird-api)
32
- [![Supported Python Versions](https://img.shields.io/pypi/pyversions/ebird-api.svg)](https://img.shields.io/pypi/pyversions/ebird-api)
31
+ [![PyPI version](https://badge.fury.io/py/ebird-api-requests.svg)](https://badge.fury.io/py/ebird-api-requests)
32
+ [![Supported Python Versions](https://img.shields.io/pypi/pyversions/ebird-api-requests.svg)](https://img.shields.io/pypi/pyversions/ebird-api-requests)
33
33
 
34
- # eBird API
34
+ # eBird API Requests
35
35
 
36
36
  eBird API Requests provides a set of wrapper functions for accessing the
37
37
  end-points in the eBird API 2.0.
@@ -375,6 +375,11 @@ socket.setdefaulttimeout(30)
375
375
  Thirty seconds is a reasonable figure, however you might change it if your
376
376
  internet connection is slow or the eBird servers are busy.
377
377
 
378
+ ## Project Information
379
+
380
+ * Issues: https://github.com/ebirders/ebird-api-requests
381
+ * Repository: https://github.com/ebirders/ebird-api-requests
382
+
378
383
  ## Links
379
384
 
380
385
  Documentation for the eBird API: https://documenter.getpostman.com/view/664302/S1ENwy59?version=latest#intro
@@ -1,7 +1,7 @@
1
- [![PyPI version](https://badge.fury.io/py/ebird-api.svg)](https://badge.fury.io/py/ebird-api)
2
- [![Supported Python Versions](https://img.shields.io/pypi/pyversions/ebird-api.svg)](https://img.shields.io/pypi/pyversions/ebird-api)
1
+ [![PyPI version](https://badge.fury.io/py/ebird-api-requests.svg)](https://badge.fury.io/py/ebird-api-requests)
2
+ [![Supported Python Versions](https://img.shields.io/pypi/pyversions/ebird-api-requests.svg)](https://img.shields.io/pypi/pyversions/ebird-api-requests)
3
3
 
4
- # eBird API
4
+ # eBird API Requests
5
5
 
6
6
  eBird API Requests provides a set of wrapper functions for accessing the
7
7
  end-points in the eBird API 2.0.
@@ -345,6 +345,11 @@ socket.setdefaulttimeout(30)
345
345
  Thirty seconds is a reasonable figure, however you might change it if your
346
346
  internet connection is slow or the eBird servers are busy.
347
347
 
348
+ ## Project Information
349
+
350
+ * Issues: https://github.com/ebirders/ebird-api-requests
351
+ * Repository: https://github.com/ebirders/ebird-api-requests
352
+
348
353
  ## Links
349
354
 
350
355
  Documentation for the eBird API: https://documenter.getpostman.com/view/664302/S1ENwy59?version=latest#intro
@@ -29,7 +29,7 @@ license = {text = "MIT License"}
29
29
  name = "ebird-api-requests"
30
30
  readme = "README.md"
31
31
  requires-python = ">= 3.10"
32
- version = "4.0.2"
32
+ version = "4.1.0"
33
33
 
34
34
  [project.urls]
35
35
  Repository = "https://github.com/StuartMacKay/ebird-api-requests.git"
@@ -37,7 +37,7 @@ Issues = "https://github.com/StuartMacKay/ebird-api-requests/issues"
37
37
  Changelog = "https://github.com/StuartMacKay/ebird-api-requests/blob/master/CHANGELOG.md"
38
38
 
39
39
  [tool.bumpversion]
40
- current_version = "4.0.2"
40
+ current_version = "4.1.0"
41
41
  parse = "(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<patch>\\d+)"
42
42
  serialize = ["{major}.{minor}.{patch}"]
43
43
  ignore_missing_version = false
@@ -2,7 +2,7 @@
2
2
 
3
3
  """A set of wrapper functions for accessing the eBird API."""
4
4
 
5
- __version__ = "4.0.2"
5
+ __version__ = "4.1.0"
6
6
 
7
7
  from ebird.api.requests.checklists import get_checklist, get_visits
8
8
  from ebird.api.requests.client import Client
@@ -1,6 +1,8 @@
1
1
  """Various functions used in the API."""
2
2
 
3
3
  import json
4
+ import time
5
+ from urllib.error import HTTPError
4
6
  from urllib.parse import urlencode
5
7
  from urllib.request import Request, urlopen
6
8
 
@@ -74,7 +76,7 @@ def filter_parameters(params):
74
76
  return filtered
75
77
 
76
78
 
77
- def get_response(url, params=None, headers=None):
79
+ def get_response(url, params=None, headers=None, max_retries=3, backoff_factor=1.0):
78
80
  """Get the content from the eBird API.
79
81
 
80
82
  :param url: the URL for the API call.
@@ -84,7 +86,14 @@ def get_response(url, params=None, headers=None):
84
86
  :type params: dict
85
87
 
86
88
  :param headers: the headers to add to the request.
87
- :type params: dict
89
+ :type headers: dict
90
+
91
+ :param max_retries: number of times to retry after an error response.
92
+ :type max_retries: int
93
+
94
+ :param backoff_factor: seconds to wait before the first retry; doubles
95
+ on each subsequent attempt.
96
+ :type backoff_factor: float
88
97
 
89
98
  :return: the content returned by the API
90
99
  :rtype: str
@@ -104,7 +113,15 @@ def get_response(url, params=None, headers=None):
104
113
  for name, value in headers.items():
105
114
  request.add_header(name, value)
106
115
 
107
- return urlopen(request).read()
116
+ for attempt in range(max_retries + 1):
117
+ try:
118
+ return urlopen(request).read()
119
+ except HTTPError as exc:
120
+ if attempt == max_retries:
121
+ raise
122
+ retry_after = exc.headers.get("Retry-After") if exc.code == 429 else None
123
+ delay = float(retry_after) if retry_after else backoff_factor * (2**attempt)
124
+ time.sleep(delay)
108
125
 
109
126
 
110
127
  def get_json(content):
@@ -138,7 +155,7 @@ def save_json(filename, data, indent=None):
138
155
  json.dump(data, outfile, indent=indent)
139
156
 
140
157
 
141
- def call(url, params, headers):
158
+ def call(url, params, headers, max_retries=3, backoff_factor=1.0):
142
159
  """Call the eBird API.
143
160
 
144
161
  :param url: the URL for the API call.
@@ -148,7 +165,14 @@ def call(url, params, headers):
148
165
  :type params: dict
149
166
 
150
167
  :param headers: the headers to add to the request.
151
- :type params: dict
168
+ :type headers: dict
169
+
170
+ :param max_retries: number of times to retry after an error response.
171
+ :type max_retries: int
172
+
173
+ :param backoff_factor: seconds to wait before the first retry; doubles
174
+ on each subsequent attempt.
175
+ :type backoff_factor: float
152
176
 
153
177
  :return: the content returned by the API
154
178
  :rtype: dict | list
@@ -161,4 +185,8 @@ def call(url, params, headers):
161
185
  """
162
186
  filtered = filter_parameters(params)
163
187
  mapped = map_parameters(filtered)
164
- return get_json(get_response(url, mapped, headers))
188
+ return get_json(
189
+ get_response(
190
+ url, mapped, headers, max_retries=max_retries, backoff_factor=backoff_factor
191
+ )
192
+ )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ebird-api-requests
3
- Version: 4.0.2
3
+ Version: 4.1.0
4
4
  Summary: A python library for accessing the eBird API, version 2.0
5
5
  Author-email: Stuart MacKay <smackay@flagstonesoftware.com>
6
6
  License: MIT License
@@ -28,10 +28,10 @@ Description-Content-Type: text/markdown
28
28
  License-File: LICENSE.txt
29
29
  Dynamic: license-file
30
30
 
31
- [![PyPI version](https://badge.fury.io/py/ebird-api.svg)](https://badge.fury.io/py/ebird-api)
32
- [![Supported Python Versions](https://img.shields.io/pypi/pyversions/ebird-api.svg)](https://img.shields.io/pypi/pyversions/ebird-api)
31
+ [![PyPI version](https://badge.fury.io/py/ebird-api-requests.svg)](https://badge.fury.io/py/ebird-api-requests)
32
+ [![Supported Python Versions](https://img.shields.io/pypi/pyversions/ebird-api-requests.svg)](https://img.shields.io/pypi/pyversions/ebird-api-requests)
33
33
 
34
- # eBird API
34
+ # eBird API Requests
35
35
 
36
36
  eBird API Requests provides a set of wrapper functions for accessing the
37
37
  end-points in the eBird API 2.0.
@@ -375,6 +375,11 @@ socket.setdefaulttimeout(30)
375
375
  Thirty seconds is a reasonable figure, however you might change it if your
376
376
  internet connection is slow or the eBird servers are busy.
377
377
 
378
+ ## Project Information
379
+
380
+ * Issues: https://github.com/ebirders/ebird-api-requests
381
+ * Repository: https://github.com/ebirders/ebird-api-requests
382
+
378
383
  ## Links
379
384
 
380
385
  Documentation for the eBird API: https://documenter.getpostman.com/view/664302/S1ENwy59?version=latest#intro