Skip to content

Commit 967db6c

Browse files
authored
Merge pull request #389 from Backblaze/remove_arrow_dependency
Remove arrow dependency
2 parents afa22c3 + dffe06b commit 967db6c

File tree

5 files changed

+43
-16
lines changed

5 files changed

+43
-16
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
99
### Added
1010
* Add support for custom upload timestamp
1111

12+
### Infrastructure
13+
* Remove dependency from `arrow`
14+
1215
## [1.20.0] - 2023-03-23
1316

1417
### Added

b2sdk/__init__.py

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,3 @@ def filter(self, record):
2424
import b2sdk.version
2525
__version__ = b2sdk.version.VERSION
2626
assert __version__ # PEP-0396
27-
28-
# https://github.com/crsmithdev/arrow/issues/612 - To get rid of the ArrowParseWarning messages in 0.14.3 onward.
29-
try:
30-
from arrow.factory import ArrowParseWarning
31-
except ImportError:
32-
pass
33-
else:
34-
import warnings
35-
warnings.simplefilter("ignore", ArrowParseWarning)

b2sdk/b2http.py

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,15 @@
99
######################################################################
1010

1111
from random import random
12+
from contextlib import contextmanager
13+
import datetime
1214
import io
1315
import json
16+
import locale
1417
import logging
1518
import socket
19+
import threading
1620

17-
import arrow
1821
import requests
1922
from requests.adapters import HTTPAdapter
2023
import time
@@ -30,6 +33,7 @@
3033
from .requests import NotDecompressingResponse
3134
from .version import USER_AGENT
3235

36+
LOCALE_LOCK = threading.Lock()
3337
logger = logging.getLogger(__name__)
3438

3539

@@ -47,6 +51,16 @@ def _print_exception(e, indent=''):
4751
_print_exception(a, indent + ' ')
4852

4953

54+
@contextmanager
55+
def setlocale(name):
56+
with LOCALE_LOCK:
57+
saved = locale.setlocale(locale.LC_ALL)
58+
try:
59+
yield locale.setlocale(locale.LC_ALL, name)
60+
finally:
61+
locale.setlocale(locale.LC_ALL, saved)
62+
63+
5064
class ResponseContextManager:
5165
"""
5266
A context manager that closes a requests.Response when done.
@@ -114,15 +128,16 @@ def post_request(self, method, url, headers, response):
114128

115129
# Convert the server time to a datetime object
116130
try:
117-
server_time = arrow.get(
118-
server_date_str, 'ddd, DD MMM YYYY HH:mm:ss ZZZ'
119-
) # this, unlike datetime.datetime.strptime, always uses English locale
120-
except arrow.parser.ParserError:
131+
with setlocale("C"):
132+
server_time = datetime.datetime.strptime(
133+
server_date_str, '%a, %d %b %Y %H:%M:%S %Z'
134+
)
135+
except ValueError:
121136
logger.exception('server returned date in an inappropriate format')
122137
raise BadDateFormat(server_date_str)
123138

124139
# Get the local time
125-
local_time = arrow.utcnow()
140+
local_time = datetime.datetime.utcnow()
126141

127142
# Check the difference.
128143
max_allowed = 10 * 60 # ten minutes, in seconds

requirements.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
arrow>=1.0.2,<2.0.0
21
importlib-metadata>=3.3.0; python_version < '3.8'
32
logfury>=1.0.1,<2.0.0
43
requests>=2.9.1,<3.0.0

test/unit/b2http/test_b2http.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import datetime
1212
import requests
1313
import socket
14+
import locale
1415

1516
from ..test_base import TestBase
1617

@@ -20,6 +21,7 @@
2021
from apiver_deps import B2Http
2122
from apiver_deps import B2HttpApiConfig
2223
from apiver_deps import ClockSkewHook
24+
from b2sdk.b2http import setlocale
2325

2426
from unittest.mock import call, MagicMock, patch
2527

@@ -294,6 +296,23 @@ class TestB2HttpUserAgentAppend(TestB2Http):
294296
}
295297

296298

299+
class TestSetLocaleContextManager(TestBase):
300+
def test_set_locale_context_manager(self):
301+
test_locale = locale.normalize(
302+
'C.utf8'
303+
) # C.UTF-8 on Ubuntu 18.04 Bionic, C.utf8 on Ubuntu 22.04 Jammy
304+
other_locale = 'C'
305+
306+
saved = locale.setlocale(locale.LC_ALL)
307+
if saved == test_locale:
308+
test_locale, other_locale = other_locale, test_locale
309+
310+
locale.setlocale(locale.LC_ALL, other_locale)
311+
with setlocale(test_locale):
312+
assert locale.setlocale(category=locale.LC_ALL) == test_locale
313+
locale.setlocale(locale.LC_ALL, saved)
314+
315+
297316
class TestClockSkewHook(TestBase):
298317
def test_bad_format(self):
299318
response = MagicMock()

0 commit comments

Comments
 (0)