File: utils.py

package info (click to toggle)
python-jsondiff 2.1.2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 228 kB
  • sloc: python: 1,047; makefile: 164; sh: 5
file content (66 lines) | stat: -rw-r--r-- 2,202 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
def generate_random_string(rng):
    return ''.join(rng.choice('abcdefg098765$&.()[]{}\n') for _ in range(rng.randint(0, 6)))


def generate_random_json(rng, max_depth=4, sets=False, hashable=False):
    types = [None, bool, float, str]
    if max_depth > 1:
        types += [tuple]
        if not hashable:
            types += [list, dict]
            if sets:
                types += [set]
    ty = rng.choice(types)
    if ty is None:
        return None
    if ty is bool:
        return rng.randint(0, 1) == 1
    if ty is float:
        return round(rng.random(), 2)
    if ty is str:
        return generate_random_string(rng)
    if ty is list or ty is tuple:
        return ty(
            generate_random_json(rng, max_depth-1, sets=sets, hashable=hashable)
            for _ in range(rng.randint(0, 7))
        )
    if ty is set:
        return {
            generate_random_json(rng, max_depth-1, hashable=True)
            for _ in range(rng.randint(0, 7))
        }
    return {
        generate_random_string(rng): generate_random_json(rng, max_depth-1, sets=sets, hashable=hashable)
        for _ in range(5)
    }


def pertubate_string(s, rng):
    if rng.random() < 0.6:
        return s
    else:
        return generate_random_string(rng)


def perturbate_json(obj, rng, max_depth=4, sets=False, hashable=False):
    if rng.random() < 0.8:
        if type(obj) is dict:
            return {
                pertubate_string(k, rng): perturbate_json(v, rng, max_depth-1, sets=sets, hashable=hashable)
                for k, v in obj.items()
            }
        if type(obj) is set:
            return {
                perturbate_json(v, rng, max_depth-1, sets=sets, hashable=True)
                for v in obj
                if rng.random() < 0.9
            }
        if isinstance(obj, (tuple, list)):
            return type(obj)(
                perturbate_json(v, rng, max_depth-1, sets=sets, hashable=hashable)
                for v in obj
                if rng.random() < 0.9
            )
    if rng.random() > max_depth / 5.0:
        return type(obj)(obj) if obj is not None else None
    return generate_random_json(rng, max_depth, sets=sets, hashable=hashable)