Code Duplication    Length = 24-25 lines in 2 locations

yorm/bases/mappable.py 2 locations

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