Commit 1592ef46 authored by abuddenberg's avatar abuddenberg
Browse files

Found yet another bug in chapter processing (during merges). Changed merge...

Found yet another bug in chapter processing (during merges). Changed merge behavior to favor incoming object structure. Refactored base class merge to not rely on __dict__
parent 9c007088
...@@ -6,7 +6,7 @@ from copy import deepcopy ...@@ -6,7 +6,7 @@ from copy import deepcopy
import json import json
from dateutil.parser import parse from dateutil.parser import parse
import re import re
import inspect
class Gcisbase(object): class Gcisbase(object):
def __init__(self, data, fields=[], trans={}): def __init__(self, data, fields=[], trans={}):
...@@ -40,9 +40,13 @@ class Gcisbase(object): ...@@ -40,9 +40,13 @@ class Gcisbase(object):
setattr(self, k, data[k]) setattr(self, k, data[k])
def merge(self, other): def merge(self, other):
for k in self.__dict__: #This sucks
if self.__dict__[k] in (None, '') and hasattr(other, k): attrs_we_care_about = [(attr, v) for attr, v in inspect.getmembers(self, lambda a: not (inspect.isroutine(a)))
self.__dict__[k] = getattr(other, k) if not attr.startswith('__')]
for attr, value in attrs_we_care_about:
if value in (None, '') and hasattr(other, attr):
setattr(self, attr, value)
return self return self
def as_json(self, indent=0, omit_fields=[]): def as_json(self, indent=0, omit_fields=[]):
...@@ -69,7 +73,7 @@ class Figure(Gcisbase): ...@@ -69,7 +73,7 @@ class Figure(Gcisbase):
#Special case for chapter #Special case for chapter
chap_tree = data.pop('chapter', None) chap_tree = data.pop('chapter', None)
self.chapter = Chapter(chap_tree) if chap_tree else None self.chapter = Chapter(chap_tree) if chap_tree else self.chapter
#Special case for images #Special case for images
image_list = data.pop('images', None) image_list = data.pop('images', None)
...@@ -83,7 +87,7 @@ class Figure(Gcisbase): ...@@ -83,7 +87,7 @@ class Figure(Gcisbase):
if isinstance(self.chapter, Chapter) and self.chapter.number and self.ordinal: if isinstance(self.chapter, Chapter) and self.chapter.number and self.ordinal:
return '{0}.{1}'.format(self.chapter.number, self.ordinal) return '{0}.{1}'.format(self.chapter.number, self.ordinal)
else: else:
return self.ordinal return '{0}.{1}'.format(self.chapter, self.ordinal)
#TODO: Ordinal handling is unnecessarily complex #TODO: Ordinal handling is unnecessarily complex
@figure_num.setter @figure_num.setter
...@@ -114,7 +118,21 @@ class Figure(Gcisbase): ...@@ -114,7 +118,21 @@ class Figure(Gcisbase):
return string return string
def __repr__(self): def __repr__(self):
return super(Figure, self).__repr__() # return super(Figure, self).__repr__()
return self.__str__()
def merge(self, other):
#Special handling for Chapters
if isinstance(other.chapter, Chapter) and isinstance(self.chapter, Chapter):
self.chapter.merge(other.chapter)
#This might want to move to Chapter's merge()
elif isinstance(other.chapter, Chapter) and not isinstance(self.chapter, Chapter):
chapter_num = self.chapter
self.chapter = other.chapter
self.chapter.number = chapter_num
return super(Figure, self).merge(other)
class Chapter(Gcisbase): class Chapter(Gcisbase):
......
__author__ = 'abuddenberg'
...@@ -55,14 +55,16 @@ def test_chapter_parsing(): ...@@ -55,14 +55,16 @@ def test_chapter_parsing():
gcis_fig = Figure(json.loads(test_figure_json)) gcis_fig = Figure(json.loads(test_figure_json))
assert isinstance(webform_fig.ordinal, int) assert isinstance(webform_fig.ordinal, int)
assert webform_fig.figure_num == 17 assert webform_fig.figure_num == '2.17'
assert webform_fig.ordinal == 17 assert webform_fig.ordinal == 17
assert webform_fig.chapter is None assert webform_fig.chapter == 2
merged_figure = webform_fig.merge(gcis_fig) merged_figure = webform_fig.merge(gcis_fig)
#FYI, these are identical; I just wanted the variable name to reflect the merge #FYI, these are identical; I just wanted the variable name to reflect the merge
assert id(merged_figure) == id(webform_fig) assert id(merged_figure) == id(webform_fig)
assert isinstance(gcis_fig.chapter, Chapter)
assert merged_figure.figure_num == '2.17' assert merged_figure.figure_num == '2.17'
assert merged_figure.ordinal == 17 assert merged_figure.ordinal == 17
assert isinstance(merged_figure.chapter, Chapter) assert isinstance(merged_figure.chapter, Chapter)
...@@ -92,4 +94,4 @@ def test_dataset_special_properties(): ...@@ -92,4 +94,4 @@ def test_dataset_special_properties():
if __name__ == '__main__': if __name__ == '__main__':
test_dataset_special_properties() test_chapter_parsing()
\ No newline at end of file \ No newline at end of file
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment