decision_engine.sources   A
last analyzed

Complexity

Total Complexity 17

Size/Duplication

Total Lines 85
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 17
eloc 58
dl 0
loc 85
rs 10
c 0
b 0
f 0

15 Methods

Rating   Name   Duplication   Size   Complexity  
A RandomIntSource.__repr__() 0 2 1
A PercentageSource.get_value() 0 2 1
A DictSource.__init__() 0 3 1
A FixedValueSource.__init__() 0 3 1
A Source.get_value() 0 3 1
A DictSource.__repr__() 0 2 1
A Source.__init__() 0 2 1
A RandomIntSource.__init__() 0 11 1
A RandomIntSource.get_value() 0 5 2
A FixedValueSource.get_value() 0 2 1
A PercentageSource.__repr__() 0 2 1
A DictSource.get_value() 0 4 2
A FixedValueSource.__repr__() 0 2 1
A Source.__repr__() 0 3 1
A PercentageSource.__init__() 0 6 1
1
# coding=utf-8
2
import random
3
from typing import Optional, Any
4
5
from abc import ABC, abstractmethod
6
7
8
class Source(ABC):
9
    def __init__(self, name: str = None):
10
        self.name = name
11
12
    @abstractmethod
13
    def __repr__(self):
14
        raise NotImplementedError  # pragma: no cover
15
16
    @abstractmethod
17
    def get_value(self, data: Optional[dict] = None) -> Any:
18
        raise NotImplementedError  # pragma: no cover
19
20
21
class DictSource(Source):
22
    def __init__(self, key: str, name: str = None) -> None:
23
        self.key = key
24
        super().__init__(name)
25
26
    def __repr__(self):
27
        return f"Name: '{self.name}' | key: '{self.key}'"
28
29
    def get_value(self, data: Optional[dict] = None) -> Any:
30
        if data is None:
31
            return None
32
        return data[self.key]
33
34
35
class FixedValueSource(Source):
36
    def __init__(self, value: Any, name: str = None) -> None:
37
        self.value: Any = value
38
        super().__init__(name)
39
40
    def __repr__(self):
41
        return f"Name: '{self.name}' | value: {self.value}"
42
43
    def get_value(self, data: Optional[dict] = None) -> Any:
44
        return self.value
45
46
47
class PercentageSource(Source):
48
    def __init__(
49
        self, percentage: float, source: Source, name: str = None
50
    ) -> None:
51
        self.percentage = float(percentage)
52
        self.source = source
53
        super().__init__(name)
54
55
    def __repr__(self):
56
        return f"Name: '{self.name}' | percentage: {self.percentage} | " \
57
               f"source: '{self.source.name}'"
58
59
    def get_value(self, data: Optional[dict] = None) -> float:
60
        return self.source.get_value(data) * self.percentage
61
62
63
class RandomIntSource(Source):
64
    def __init__(
65
        self,
66
        min_value: int,
67
        max_value: int,
68
        seed: int = None,
69
        name: str = None,
70
    ):
71
        self.min_value = min_value
72
        self.max_value = max_value
73
        self.seed = seed
74
        super().__init__(name)
75
76
    def __repr__(self):
77
        return f"Name: '{self.name}' | min_value: {self.min_value} | " \
78
               f"max_value: {self.max_value} | seed: {self.seed}"
79
80
    def get_value(self, data: Optional[dict] = None):
81
        if self.seed is not None:
82
            random.seed(self.seed)
83
84
        return random.randint(self.min_value, self.max_value)
85