Skip to content

Commit a8f1493

Browse files
committed
Make gitlab objects serializable
With current implementation of API v3 and v4 support, some instances had properties of type module and are not serializable.
1 parent d6fa94e commit a8f1493

File tree

2 files changed

+33
-0
lines changed

2 files changed

+33
-0
lines changed

gitlab/__init__.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,17 @@ def __init__(self, url, private_token=None, email=None, password=None,
136136
manager = getattr(objects, cls_name)(self)
137137
setattr(self, var_name, manager)
138138

139+
def __getstate__(self):
140+
state = self.__dict__.copy()
141+
module = state.pop('_objects')
142+
return state
143+
144+
def __setstate__(self, state):
145+
self.__dict__.update(state)
146+
objects = importlib.import_module('gitlab.v%s.objects' %
147+
self._api_version)
148+
self._objects = objects
149+
139150
@property
140151
def api_version(self):
141152
return self._api_version

gitlab/base.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -416,6 +416,17 @@ def __init__(self, gl, data=None, **kwargs):
416416
if not hasattr(self, "id"):
417417
self.id = None
418418

419+
def __getstate__(self):
420+
state = self.__dict__.copy()
421+
module = state.pop('_module')
422+
state['_module_name'] = module.__name__
423+
return state
424+
425+
def __setstate__(self, state):
426+
module_name = state.pop('_module_name')
427+
self.__dict__.update(state)
428+
self._module = importlib.import_module(module_name)
429+
419430
def _set_manager(self, var, cls, attrs):
420431
manager = cls(self.gitlab, self, attrs)
421432
setattr(self, var, manager)
@@ -559,6 +570,17 @@ def __init__(self, manager, attrs):
559570

560571
self._create_managers()
561572

573+
def __getstate__(self):
574+
state = self.__dict__.copy()
575+
module = state.pop('_module')
576+
state['_module_name'] = module.__name__
577+
return state
578+
579+
def __setstate__(self, state):
580+
module_name = state.pop('_module_name')
581+
self.__dict__.update(state)
582+
self._module = importlib.import_module(module_name)
583+
562584
def __getattr__(self, name):
563585
try:
564586
return self.__dict__['_updated_attrs'][name]

0 commit comments

Comments
 (0)