Skip to content

Commit 1b0aefc

Browse files
committed
Support naive datetimes in json encoder
1 parent a1eaad3 commit 1b0aefc

File tree

3 files changed

+44
-4
lines changed

3 files changed

+44
-4
lines changed

beaker/util.py

+14-2
Original file line numberDiff line numberDiff line change
@@ -462,11 +462,23 @@ def dumps(self, data):
462462

463463

464464
class JsonSerializer(object):
465+
DATETIME_PREFIX = "$DATETIME$"
466+
DATETIME_FORMAT = "%Y-%m-%dT%H:%M:%S"
467+
465468
def loads(self, data_string):
466-
return json.loads(zlib.decompress(data_string).decode('utf-8'))
469+
loaded_data = json.loads(zlib.decompress(data_string).decode('utf-8'))
470+
for k, v in loaded_data.items():
471+
if isinstance(v, str) and v.startswith(self.DATETIME_PREFIX):
472+
v = v[len(self.DATETIME_PREFIX):]
473+
loaded_data[k] = datetime.strptime(v, self.DATETIME_FORMAT)
474+
return loaded_data
467475

468476
def dumps(self, data):
469-
return zlib.compress(json.dumps(data).encode('utf-8'))
477+
dumpable_data = data.copy()
478+
for k, v in dumpable_data.items():
479+
if isinstance(v, datetime):
480+
dumpable_data[k] = self.DATETIME_PREFIX + v.strftime(self.DATETIME_FORMAT)
481+
return zlib.compress(json.dumps(dumpable_data).encode('utf-8'))
470482

471483

472484
def serialize(data, method):

setup.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@
5151
import sqlite3
5252
except ImportError:
5353
TESTS_REQUIRE.append('pysqlite')
54-
TESTS_REQUIRE.extend(['pylibmc', 'python-memcached'])
54+
TESTS_REQUIRE.extend(['python-memcached'])
5555

5656

5757
setup(name='Beaker',

tests/test_cookie_expires.py

+29-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from beaker.middleware import SessionMiddleware
2-
from beaker.session import Session
2+
from beaker.session import Session, CookieSession
33
import datetime
44
import re
55

@@ -75,3 +75,31 @@ def test_set_cookie_expires():
7575
assert cookie_expiration(session) is False
7676
session._set_cookie_expires(True)
7777
assert cookie_expiration(session) is True
78+
79+
def test_cookiesession_expires_values():
80+
BASE_OPTIONS = {
81+
'invalidate_corrupt': True,
82+
'type': 'cookie',
83+
'data_dir': None,
84+
'key': 'ckan',
85+
'timeout': None,
86+
'save_accessed_time': True,
87+
'secret': '12341234',
88+
'log_file': None,
89+
'data_serializer': 'json',
90+
'validate_key': 'asdfasdf',
91+
'httponly': True,
92+
'secure': False,
93+
'samesite': 'Strict',
94+
'auto': False,
95+
'cookie_domain': None
96+
}
97+
98+
for cookie_expires in (True, False, datetime.timedelta(seconds=10)):
99+
options = dict(BASE_OPTIONS, cookie_expires=cookie_expires)
100+
cookie_session = CookieSession(
101+
{},
102+
**options,
103+
)
104+
cookie_session.save()
105+
cookie_session.save()

0 commit comments

Comments
 (0)