• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

ripe-tech / ripe-api / 274

pending completion
274

push

travis-ci-com

web-flow
Merge pull request #49 from ripe-tech/hg/cleanup

style: cleanup

92 of 92 new or added lines in 1 file covered. (100.0%)

348 of 967 relevant lines covered (35.99%)

2.16 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

68.48
/src/ripe/util.py
1
#!/usr/bin/python
2
# -*- coding: utf-8 -*-
3

4
import appier
6✔
5

6

7
class UtilAPI(object):
6✔
8
    @classmethod
6✔
9
    def _query_to_spec(cls, query):
2✔
10
        options = cls._unpack_query(query)
6✔
11
        brand = options.get("brand", None)
6✔
12
        model = options.get("model", None)
6✔
13
        variant = options.get("variant", None)
6✔
14
        version = options.get("version", None)
6✔
15
        description = options.get("description", None)
6✔
16
        initials = options.get("initials", None)
6✔
17
        engraving = options.get("engraving", None)
6✔
18
        gender = options.get("gender", None)
6✔
19
        size = options.get("size", None)
6✔
20
        meta = options.get("meta", [])
6✔
21
        tuples = options.get("p", [])
6✔
22
        tuples = tuples if isinstance(tuples, list) else [tuples]
6✔
23
        initials_extra = options.get("initials_extra", [])
6✔
24
        initials_extra = (
6✔
25
            initials_extra if isinstance(initials_extra, list) else [initials_extra]
26
        )
27
        initials_extra = cls._parse_extra_s(initials_extra)
6✔
28
        parts = cls._tuples_to_parts(tuples)
6✔
29
        parts_m = cls._parts_to_parts_m(parts)
6✔
30
        spec = dict(
6✔
31
            brand=brand,
32
            model=model,
33
            parts=parts_m,
34
            initials=initials,
35
            engraving=engraving,
36
            initials_extra=initials_extra,
37
        )
38
        if variant:
6✔
39
            spec["variant"] = variant
×
40
        if version:
6✔
41
            spec["version"] = version
×
42
        if description:
6✔
43
            spec["description"] = description
×
44
        if gender:
6✔
45
            spec["gender"] = gender
×
46
        if size:
6✔
47
            spec["size"] = size
×
48
        if meta:
6✔
49
            spec["meta"] = cls._normalize_meta(meta)
×
50
        return spec
6✔
51

52
    @classmethod
6✔
53
    def _unpack_query(cls, query):
2✔
54
        query = query.strip("?")
6✔
55
        parts = appier.split_unescape(query, "&")
6✔
56
        options = dict()
6✔
57
        for part in parts:
6✔
58
            key, value = part.split("=")
6✔
59
            if not key in options:
6✔
60
                options[key] = value
6✔
61
            elif isinstance(options[key], list):
6✔
62
                options[key].append(value)
6✔
63
            else:
64
                options[key] = [options[key], value]
6✔
65
        return options
6✔
66

67
    @classmethod
6✔
68
    def _parse_extra_s(cls, extra_s):
2✔
69
        extra = dict()
6✔
70
        for extra_i in extra_s:
6✔
71
            name, initials, engraving = appier.split_unescape(extra_i, ":", 2)
6✔
72
            extra[name] = dict(initials=initials, engraving=engraving or None)
6✔
73
        return extra
6✔
74

75
    @classmethod
6✔
76
    def _tuples_to_parts(cls, tuples):
2✔
77
        parts = []
6✔
78
        for triplet in tuples:
6✔
79
            name, material, color = appier.split_unescape(triplet, ":", 2)
6✔
80
            part = dict(name=name, material=material, color=color)
6✔
81
            parts.append(part)
6✔
82
        return parts
6✔
83

84
    @classmethod
6✔
85
    def _parts_to_parts_m(cls, parts):
2✔
86
        parts_m = dict()
6✔
87
        for part in parts:
6✔
88
            name = part["name"]
6✔
89
            material = part["material"]
6✔
90
            color = part["color"]
6✔
91
            parts_m[name] = dict(material=material, color=color)
6✔
92
        return parts_m
6✔
93

94
    @classmethod
6✔
95
    def _normalize_meta(cls, meta):
2✔
96
        meta_d = {}
×
97
        meta_l = (
×
98
            [
99
                appier.split_unescape(element, ":", 2)
100
                if element.startswith("$")
101
                else appier.split_unescape(element, ":", 1)
102
                for element in meta
103
            ]
104
            if meta
105
            else []
106
        )
107
        for parts in meta_l:
×
108
            if len(parts) == 2:
×
109
                parts = None, parts[0], parts[1]
×
110
            type, key, value = parts
×
111
            if key in meta_d:
×
112
                old = meta_d[key]
×
113
                is_sequence = isinstance(old, (list, tuple))
×
114
                if not is_sequence:
×
115
                    old = [old]
×
116
                old.append(value)
×
117
                value = old
×
118
            if type == "$list" and not isinstance(value, list):
×
119
                value = [value]
×
120
            if type == "$int":
×
121
                value = int(value)
×
122
            if type == "$float":
×
123
                value = float(value)
×
124
            if type == "$bool":
×
125
                value = value in ("1", "true", "True")
×
126
            meta_d[key] = value
×
127
        return meta_d
×
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc