Code Duplication    Length = 24-25 lines in 2 locations

yorm/bases/mappable.py 2 locations

@@ 15-39 (lines=25) @@
12
_STORE_AFTER_METHODS = set()
13
14
15
def load_before(method):
16
    """Decorator for methods that should load before call."""
17
18
    if getattr(method, '_load_before', False):
19
        return method
20
21
    _LOAD_BEFORE_METHODS.add(method.__name__)
22
23
    @functools.wraps(method)
24
    def wrapped(self, *args, **kwargs):
25
        """Decorated method."""
26
        if not _private_call(method, args):
27
            mapper = common.get_mapper(self)
28
            if mapper and mapper.modified:
29
                log.debug("Loading before call: %s", method.__name__)
30
                mapper.load()
31
                if mapper.auto_save_after_load:
32
                    mapper.save()
33
                    mapper.modified = False
34
35
        return method(self, *args, **kwargs)
36
37
    setattr(wrapped, '_load_before', True)
38
39
    return wrapped
40
41
42
def save_after(method):
@@ 42-65 (lines=24) @@
39
    return wrapped
40
41
42
def save_after(method):
43
    """Decorator for methods that should save after call."""
44
45
    if getattr(method, '_save_after', False):
46
        return method
47
48
    _STORE_AFTER_METHODS.add(method.__name__)
49
50
    @functools.wraps(method)
51
    def wrapped(self, *args, **kwargs):
52
        """Decorated method."""
53
        result = method(self, *args, **kwargs)
54
55
        if not _private_call(method, args):
56
            mapper = common.get_mapper(self)
57
            if mapper and mapper.auto_save:
58
                log.debug("Saving after call: %s", method.__name__)
59
                mapper.save()
60
61
        return result
62
63
    setattr(wrapped, '_save_after', True)
64
65
    return wrapped
66
67
68
def _private_call(method, args, prefix='_'):