Passed
Branch master (604dcd)
by John
02:16
created

bbarchivist.jsonutils   B

Complexity

Total Complexity 37

Size/Duplication

Total Lines 208
Duplicated Lines 0 %

Test Coverage

Coverage 97.59%

Importance

Changes 0
Metric Value
eloc 84
dl 0
loc 208
ccs 81
cts 83
cp 0.9759
rs 8.6
c 0
b 0
f 0
wmc 37

12 Functions

Rating   Name   Duplication   Size   Complexity  
A list_available_certs() 0 11 4
A grab_json() 0 14 2
A list_devices() 0 11 4
A extract_cert_secret() 0 12 1
B certchecker_prep() 0 19 5
A fubar() 0 11 2
A read_family() 0 12 4
A list_prds() 0 11 3
A list_family() 0 9 4
A load_json() 0 15 3
B extract_cert() 0 23 4
A extract_cert_check() 0 16 1
1
#!/usr/bin/env python3
2 4
"""This module is used for JSON tools."""
3
4 5
import glob  # filenames
5 5
import os  # path work
6 5
import sys  # frozen status
7
8 5
from bbarchivist import bbconstants  # file location
9 5
from bbarchivist import decorators  # enter to exit
10 5
from bbarchivist import utilities  # lprint
11
12 5
try:
13 5
    import simplejson as json
14
except ImportError:
15
    import json
16
17 5
__author__ = "Thurask"
18 5
__license__ = "WTFPL v2"
19 5
__copyright__ = "2015-2018 Thurask"
20
21
22 5
def grab_json(filename):
23
    """
24
    Figure out where JSON is, local or system-supplied.
25
26
    :param filename: Desired JSON database name.
27
    :type filename: str
28
    """
29 5
    jfile = None
30 5
    try:
31 5
        jfile = glob.glob(os.path.join(os.getcwd(), "json"))[0]
32 5
    except IndexError:
33 5
        jfile = bbconstants.JSONDIR
34 5
    jfile = os.path.join(jfile, "{0}.json".format(filename))
35 5
    return os.path.abspath(jfile)
36
37
38 5
def load_json(table, jfile=None):
39
    """
40
    Load JSON file, return specific table (dict or list).
41
42
    :param table: Name of sub-structure to return.
43
    :type table: str
44
45
    :param jfile: Path to JSON file.
46
    :type jfile: str
47
    """
48 5
    if jfile is None:
49 5
        jfile = grab_json(table)
50 5
    with open(jfile) as thefile:
51 5
        data = json.load(thefile)
52 5
    return data[table]
53
54
55 5
def extract_cert_secret(key, device):
56
    """
57
    Check if device is marked as secret.
58
59
    :param key: Device entry.
60
    :type key: dict
61
62
    :param device: HWID, FCCID or name of device.
63
    :param device: str
64
    """
65 5
    not_secret = device in key['name'] and 'secret' not in key
66 5
    return not_secret
67
68
69 5
def extract_cert_check(key, device, not_secret):
70
    """
71
    Check function for extracting PTCRB info.
72
73
    :param key: Device entry.
74
    :type key: dict
75
76
    :param device: HWID, FCCID or name of device.
77
    :type device: str
78
79
    :param not_secret: If device is not market as secret.
80
    :type not_secret: bool
81
    """
82 5
    keylist = key['hwid'], key['fccid'], key['ptcrbid']
83 5
    goforit = (device in keylist or not_secret) and key['ptcrbid']
84 5
    return goforit
85
86
87 5
def extract_cert(table, device):
88
    """
89
    Extract PTCRB info from a list of dicts.
90
91
    :param table: List of device entries.
92
    :type table: list(dict)
93
94
    :param device: HWID, FCCID or name of device.
95
    :type device: str
96
    """
97 5
    for key in table:
98 5
        not_secret = extract_cert_secret(key, device)
99 5
        goforit = extract_cert_check(key, device, not_secret)
100 5
        if goforit:
101 5
            device = key['device']
102 5
            name = key['name']
103 5
            ptcrbid = key['ptcrbid']
104 5
            hwid = key['hwid']
105 5
            fccid = key['fccid']
106 5
            break
107
    else:
108 5
        fubar("NO PTCRBID!")
109 5
    return name, ptcrbid, hwid, fccid
4 ignored issues
show
introduced by
The variable name does not seem to be defined for all execution paths.
Loading history...
introduced by
The variable hwid does not seem to be defined for all execution paths.
Loading history...
introduced by
The variable fccid does not seem to be defined for all execution paths.
Loading history...
introduced by
The variable ptcrbid does not seem to be defined for all execution paths.
Loading history...
110
111
112 5
def list_available_certs(table):
113
    """
114
    List all certified devices in a device table.
115
116
    :param table: List of device entries.
117
    :type table: list(dict)
118
    """
119 5
    for key in table:
120 5
        if key['ptcrbid']:
121 5
            hwid = "NO HWID" if not key['hwid'] else key['hwid']
122 5
            print("{0} {1} - {2} - {3}".format(key['device'], key['name'], hwid, key['fccid']))
123
124
125 5
def list_devices(table):
126
    """
127
    List all devices, certified or not, in a device table.
128
129
    :param table: List of device entries.
130
    :type table: list(dict)
131
    """
132 5
    for key in table:
133 5
        hwid = "NO HWID" if not key['hwid'] else key['hwid']
134 5
        fccid = "NO FCCID" if not key['fccid'] else key['fccid']
135 5
        print("{0} {1} - {2} - {3}".format(key['device'], key['name'], hwid, fccid))
136
137
138 5
def list_prds(table):
139
    """
140
    List all PRDs in a PRD table.
141
142
    :param table: Dictionary of device : PRD list pairs.
143
    :type table: dict(str: list)
144
    """
145 5
    for key in table.keys():
146 5
        print("~{0}~".format(key))
147 5
        for prd in table[key]:
148 5
            print(prd)
149
150
151 5
def certchecker_prep(table, device):
152
    """
153
    Extract model, family and HWID from a device table.
154
155
    :param table: List of device entries.
156
    :type table: list(dict)
157
158
    :param device: HWID, FCCID or name of device.
159
    :type device: str
160
    """
161 5
    for key in table:
162 5
        if 'secret' not in key and key['name'] == device:
163 5
            model = key['device']
164 5
            family = key['family']
165 5
            hwid = key['hwid']
166 5
            break
167
    else:
168 5
        fubar("INVALID DEVICE!")
169 5
    return model, family, hwid
3 ignored issues
show
introduced by
The variable family does not seem to be defined for all execution paths.
Loading history...
introduced by
The variable hwid does not seem to be defined for all execution paths.
Loading history...
introduced by
The variable model does not seem to be defined for all execution paths.
Loading history...
170
171
172 5
def read_family(table, device):
173
    """
174
    Get all devices of a given family in a device table.
175
176
    :param table: List of device entries.
177
    :type table: list(dict)
178
179
    :param device: HWID, FCCID or name of device.
180
    :type device: str
181
    """
182 5
    famlist = [key['fccid'] for key in table if key['ptcrbid'] and key['device'] == device]
183 5
    return famlist
184
185
186 5
def list_family(table):
187
    """
188
    List all valid (certified) families in a device table.
189
190
    :param table: List of device entries.
191
    :type table: list(dict)
192
    """
193 5
    famlist = list({key['device'] for key in table if 'secret' not in key and key['ptcrbid']})
194 5
    utilities.lprint(famlist)
195
196
197 5
def fubar(message):
198
    """
199
    What to do when things go bad.
200
201
    :param message: Error message.
202
    :type message: str
203
    """
204 5
    print(message)
205 5
    decorators.enter_to_exit(True)
206 5
    if not getattr(sys, 'frozen', False):
207
        raise SystemExit
208