-
Notifications
You must be signed in to change notification settings - Fork 1
/
values.py
186 lines (118 loc) · 4.1 KB
/
values.py
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
from math import ceil
import os
import sys
def clamp(value, minimum, maximum):
"""
Return clamped value between minimum and maximum.
:param float value:
:param float minimum:
:param float maximum:
"""
if maximum < minimum:
raise ValueError(f"{maximum} is smaller than {minimum}")
return max(minimum, min(value, maximum))
def sign(value, threshold=0):
"""
Get sign value based on threshold that defaults to 0.
:param float value:
:param float threshold:
:return: -1, 0 or 1
"""
if value < threshold:
return -1
if value == threshold:
return 0
return 1
def inrange(value, minimum, maximum):
"""
Return whether value is between minimum and maximum.
:param float value:
:param float minimum:
:param float maximum:
"""
if maximum < minimum:
raise ValueError(f"{maximum} is smaller than {minimum}")
return minimum <= value <= maximum
def rectify(value, threshold):
"""
Return 0 if it's below threshold, otherwise difference.
:param float value:
:param float threshold:
"""
if value < threshold:
return 0
return value - threshold
def doubleRectify(value, minimum, maximum):
"""
Return 0 if it's between min and max, otherwise it returns difference from edge of range.
:param float value:
:param float minimum:
:param float maximum:
"""
if maximum < minimum:
raise ValueError(f"{maximum} is smaller than {minimum}")
if inrange(value, minimum, maximum):
return 0
if value < minimum:
return value - minimum
elif value > maximum:
return value - maximum
def confineTo(value, minimum, maximum, margin=0):
"""
Confine this value, but unlike clamp it subtracts diff * n to create an 'infinite' effect.
:param float value: Value to be confined
:param float minimum: Minimum value
:param float maximum: Maximum value
:param float margin: A value that represents how far outside min/max value can be before jumping.
A margin of 0.5 allows integer index searching to not skip any index for example.
:return: A confined value
"""
if maximum < minimum:
raise ValueError(f"{maximum} is smaller than {minimum}")
if maximum == minimum:
return maximum
if inrange(value, minimum, maximum):
return value
valueRange = maximum - minimum + margin * 2
rectifiedValue = doubleRectify(value, minimum - margin, maximum + margin)
jumps = ceil(abs(rectifiedValue) / valueRange)
signValue = sign(rectifiedValue) * -1
jumpValue = jumps * valueRange * signValue
return value + jumpValue
class EnvVar:
""" Handles environment variables.
actions_name has to be defined if the env var is used for unittesting in the workflow. """
def __init__(self, name, actions_name=None):
if actions_name is not None:
actions_name = "${{ " + actions_name + " }}"
self.name = name
self.actions_name = actions_name
@property
def value(self):
""" Get value of env var. """
if self.name not in os.environ:
raise KeyError(f"Env var '{self.name}' is not set.")
return os.environ[self.name]
@value.setter
def value(self, value):
""" Set value of an env var, both in instance and os.environ. """
os.environ[self.name] = value
def __str__(self):
return self.value
def __repr__(self):
return f"<{type(self).__name__}: {self.name}>"
def get_launch_options():
""" Return a dict of given args from launch options.
Uses sys.argv, attempts to split on '=', if missing then getFreeIndex is used as key.
WARNING: Removes all extra values in sys.argv (As unittest couldn't handle it) """
args = {}
while len(sys.argv) > 1:
arg = sys.argv[1]
if "=" in arg:
split = arg.split("=")
args[split[0]] = split[1]
else:
args[getFreeIndex(args)] = arg
del sys.argv[1]
return args
from generallibrary.iterables import getFreeIndex