Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions pendulum/tz/timezone.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ def __init__(self, name, transitions,
"""
self._name = name
self._transitions = transitions
self.__tzinfos = tzinfos
self._tzinfos = tuple(
map(lambda tzinfo: TimezoneInfo(self, *tzinfo), tzinfos)
)
Expand Down Expand Up @@ -449,6 +450,11 @@ def _find_utc_index(self, dt):
def __repr__(self):
return '<Timezone [{}]>'.format(self._name)

def __getinitargs__(self):
return (self._name, self._transitions,
self.__tzinfos, self._default_tzinfo_index,
self._utc_transition_times)


class FixedTimezone(Timezone):
"""
Expand Down Expand Up @@ -486,6 +492,8 @@ def __init__(self, offset, name=None, transition_type=None):
)
self._tzinfo = self._tzinfos[0]

self._offset = offset

@classmethod
def load(cls, name):
if name not in cls._cache:
Expand Down Expand Up @@ -513,6 +521,9 @@ def fromutc(self, dt):

return (dt + self._tzinfo.adjusted_offset).replace(tzinfo=self._tzinfo)

def __getinitargs__(self):
return self._offset


class _UTC(FixedTimezone):

Expand All @@ -524,4 +535,8 @@ def __init__(self):
def fromutc(self, dt):
return dt.replace(tzinfo=UTC)

def __getinitargs__(self):
return ()


UTCTimezone = _UTC()
2 changes: 2 additions & 0 deletions pendulum/tz/timezone_info.py
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,8 @@ def __repr__(self):
'DST' if self.is_dst else 'STD',
)

def __getinitargs__(self):
return self._tz, self._utc_offset, self._is_dst, self._dst, self._abbrev

class _UTC(TimezoneInfo):

Expand Down
25 changes: 25 additions & 0 deletions tests/pendulum_tests/test_behavior.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@

import pickle
import pendulum
from copy import deepcopy
from datetime import datetime, date, time, timedelta
from pendulum import Pendulum, timezone
from pendulum.tz.timezone import Timezone
from .. import AbstractTestCase


Expand Down Expand Up @@ -103,3 +105,26 @@ def test_proper_dst(self):
dt = pendulum.create(1941, 7, 1, tz='Europe/Amsterdam')

self.assertEqual(timedelta(0, 6000), dt.dst())

def test_deepcopy(self):
dt = pendulum.create(1941, 7, 1, tz='Europe/Amsterdam')

self.assertEqual(dt, deepcopy(dt))

def test_deepcopy_datetime(self):
dt = pendulum.create(1941, 7, 1, tz='Europe/Amsterdam')

self.assertEqual(dt._datetime, deepcopy(dt._datetime))

def test_pickle_timezone(self):
dt1 = pendulum.timezone('Europe/Amsterdam')
s = pickle.dumps(dt1)
dt2 = pickle.loads(s)

self.assertTrue(isinstance(dt2, Timezone))

dt1 = pendulum.timezone('UTC')
s = pickle.dumps(dt1)
dt2 = pickle.loads(s)

self.assertTrue(isinstance(dt2, Timezone))