Passed
Push — develop ( 09a48b...79b39d )
by Dean
02:57
created

TraktPlaylistHandler   A

Complexity

Total Complexity 16

Size/Duplication

Total Lines 66
Duplicated Lines 0 %

Test Coverage

Coverage 86.11%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 16
dl 0
loc 66
ccs 31
cts 36
cp 0.8611
rs 10
c 1
b 0
f 0

5 Methods

Rating   Name   Duplication   Size   Complexity  
A __init__() 0 5 1
A keys_ordered() 0 5 3
A load() 0 15 3
A parse() 0 13 4
B build_key() 0 17 5
1 1
from plugin.sync.core.playlist.mapper.handlers.base import PlaylistHandler
2
3 1
from trakt.objects import Movie, Show, Season, Episode
4 1
import logging
5
6 1
log = logging.getLogger(__name__)
7
8
9 1
class TraktPlaylistHandler(PlaylistHandler):
10 1
    def __init__(self, task):
11 1
        super(TraktPlaylistHandler, self).__init__(task)
12
13 1
        self.playlist = None
14 1
        self.items = None
15
16 1
    def load(self, playlist=None, items=None):
17 1
        if items is None:
18 1
            if playlist is None:
19
                raise ValueError('Either the "playlist" or "items" parameter is required')
20
21
            # Fetch playlist items
22 1
            items = playlist.items()
23
24 1
        self.playlist = playlist
25
26 1
        self.items = {}
27 1
        self.table = {}
28
29
        # Parse items into the `items` and `table` attribute
30 1
        self.parse(items)
31
32 1
    def keys_ordered(self):
33 1
        return [
34
            key for key, _ in sorted(
35
                self.items.items(),
36
                key=lambda (k, i): i.index
37
            )
38
        ]
39
40
    #
41
    # Item parser
42
    #
43
44 1
    def build_key(self, item):
45 1
        i_type = type(item)
46
47 1
        if i_type is Movie:
48 1
            return [item.pk]
49
50 1
        if i_type is Show:
51 1
            return [item.pk]
52
53 1
        if i_type is Season:
54 1
            return [item.show.pk, item.pk]
55
56 1
        if i_type is Episode:
57 1
            return [item.show.pk] + list(item.pk)
58
59
        log.debug('Ignoring unsupported list item: %r', item)
60
        return None
61
62 1
    def parse(self, items):
63 1
        for item in items:
64 1
            keys = self.build_key(item)
65
66 1
            if keys is None:
67
                continue
68
69
            # Update `items`
70 1
            self.items[tuple(keys)] = item
71
72
            # Update `table`
73 1
            if not self.path_set(self.table, keys, item):
74
                log.info('Unable to update table (keys: %r)', keys)
75