Passed
Push — develop ( 6fb855...7cfc9a )
by Dean
02:39
created

BackupArchive.__repr__()   A

Complexity

Conditions 4

Size

Total Lines 13

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 1
CRAP Score 14.0742
Metric Value
cc 4
dl 0
loc 13
ccs 1
cts 7
cp 0.1429
crap 14.0742
rs 9.2
1 1
from plugin.core.backup.models.revision import BackupRevision
2 1
from plugin.core.helpers.variable import json_date_serializer
3
4 1
from datetime import datetime
5 1
import json
6 1
import logging
7
8 1
log = logging.getLogger(__name__)
9
10
11 1
class BackupArchive(BackupRevision):
12 1
    def __init__(self, date, archive, files, tag=None, attributes=None, path=None):
13
        if type(date) is not tuple:
14
            raise ValueError('Invalid value provided for "date" parameter')
15
16
        # Set attributes
17
        if attributes is None:
18
            attributes = {}
19
20
        attributes['date'] = date
21
        attributes['files'] = files
22
23
        # Construct revision
24
        super(BackupArchive, self).__init__(None, [archive], tag, attributes, path)
25
26
        # Set class properties
27
        self.files = files
28
29
        # Parse "date" tuple into a datetime object
30
        if len(date) == 2:
31
            self.timestamp = datetime(date[0], date[1], 1)
32
            self.period = 'month'
33
        elif len(date) == 1:
34
            self.timestamp = datetime(date[0], 1, 1)
35
            self.period = 'year'
36
37 1
    @property
38
    def date(self):
39
        if self.period == 'month':
40
            return self.timestamp.year, self.timestamp.month
41
42
        if self.period == 'year':
43
            return self.timestamp.year,
44
45
        raise ValueError('Invalid period: %r' % self.period)
46
47 1
    @classmethod
48
    def load(cls, path):
49
        # Read json from `path`
50
        with open(path, 'rb') as fp:
51
            metadata = json.load(fp)
52
53
        if not metadata:
54
            return None
55
56
        # Parse date
57
        date = metadata.pop('date')
58
59
        # Construct `BackupRevision` object
60
        return cls(
61
            date,
62
            metadata.pop('contents')[0],
63
            metadata.pop('files'),
64
65
            tag=metadata.pop('tag', None),
66
            attributes=metadata,
67
            path=path
68
        )
69
70 1
    def save(self, path):
71
        log.debug('Writing backup revision metadata to %r', path)
72
73
        try:
74
            # Write revision metadata to disk
75
            with open(path, 'wb') as fp:
76
                json.dump(self.dict(), fp, default=json_date_serializer)
77
78
        except Exception, ex:
79
            log.warn('Unable to save metadata - %s', ex, exc_info=True)
80
            return False
81
82
        # Update current revision path
83
        self.path = path
84
85
        return True
86
87 1
    def __repr__(self):
88
        properties = []
89
90
        if self.date:
91
            properties.append(('date', self.date))
92
93
        if self.path:
94
            properties.append(('path', self.path))
95
96
        return '<BackupArchive %s>' % (
97
            ', '.join([
98
                '%s: %r' % (key, value)
99
                for key, value in properties
100
            ])
101
        )
102