-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathextract.py
More file actions
156 lines (115 loc) · 4.3 KB
/
Copy pathextract.py
File metadata and controls
156 lines (115 loc) · 4.3 KB
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
156
import logging
import re
logger = logging.getLogger(__name__)
def cascade_all_eq(l: list):
l = [x for x in l if x]
if not all(x == l[0] for x in l):
# print("oops, contradictory information", l)
logger.debug("Can't cascade correctly: contradictory information in %s.", l)
return
for x in l:
if x:
return x
def infer_speed(gen: str, speed: int):
BANDWIDTHS = {
'DDR': (1600, 2100, 2700, 3200),
'DDR2': (3200, 4200, 5300, 6400, 8500),
'DDR3': (6400, 8500, 10600, 10666, 12800, 14900, 17000),
'DDR4': (12800, 14900, 17000, 19200, 21300, 23400, 25600, 28800),
'DDR5': (32000, 35200, 38400, 41600, 44800, 48000, 49600,
51200, 54400, 57600, 60800, 64000, 65600, 67200, 70400)
}
CONVERTIONS = {1600: 200, 2100: 266, 2700: 333, 3200: 400,
4200: 533, 5300: 667, 6400: 800, 8500: 1066,
10600: 1333, 10666: 1333, 12800: 1600, 14900: 1866, 17000: 2133,
19200: 2400, 21300: 2666, 23400: 2933, 25600: 3200, 28800: 3600, 32000: 4000,
35200: 4400, 38400: 4800, 41600: 5200, 44800: 5600, 48000: 6000,
49600: 6200, 51200: 6400, 54400: 6800, 57600: 7200, 60800: 7600,
64000: 8000, 65600: 8200, 67200: 8400, 70400: 8800}
if speed in BANDWIDTHS[gen]:
return CONVERTIONS[speed]
if speed in CONVERTIONS.values():
return speed
# print(f"I don't know speed {speed} for gen {gen}")
logger.debug("Speed %s was not found for generation %s.", speed, gen)
def extract_gen_and_speed(text: str):
# good for 90%
GEN_RE = re.compile(r"(?:pc|ddr)[-\s]?(?=\d)(?:(\d)l?(?:\D|$))?(?:[\s-]*(\d{3,5}))?", re.I)
matches = GEN_RE.findall(text)
gens = []
speeds = []
for m in matches:
gen, speed = m
gen = gen or ''
gen = '' if gen == '1' else gen
gen = "DDR" + gen
if speed:
speed = infer_speed(gen, int(speed))
gens.append(gen)
speeds.append(speed)
return cascade_all_eq(gens), cascade_all_eq(speeds)
def extract_speed(text: str):
SPEED_RE = re.compile(r"(\d{3,4})\s*(?:mhz|mt/?s)", re.I)
matches = SPEED_RE.findall(text)
speeds = []
for m in matches:
speed = int(m.replace('.', ''))
speeds.append(speed)
return cascade_all_eq(speeds)
def extract_speed_backup(gen: str, text: str):
SPEED_RE = re.compile(r"(\d{4,5})", re.I)
matches = SPEED_RE.findall(text)
speeds = []
for m in matches:
speed = int(m.replace('.', ''))
if gen:
speed = infer_speed(gen, speed)
speeds.append(speed)
return cascade_all_eq(speeds)
def extract_ram_type(text: str):
SERVER_RE = re.compile(r'(server|ecc|registered)', re.I)
LAPTOP_RE = re.compile(r'(so[-\s]?dimm|laptop)', re.I)
if SERVER_RE.search(text):
return 'server'
elif LAPTOP_RE.search(text):
return 'laptop'
return 'desktop'
def extract_latency(text: str):
LATENCY_RE = re.compile(r'[^a-z]cl?(\d{1,2})')
latency = cascade_all_eq(LATENCY_RE.findall(text))
if latency:
return int(latency)
def extract_gb(text: str):
get_size = lambda a, t: int(a) / 1024 if t and t.lower() == 'mb' else int(a)
TOTAL_RE = re.compile(r'(\d{1,3})\s*(gb|mb)', re.I)
STICKS_RE = re.compile(r'(\d{1,2})\s*x\s*(\d{1,2})\s*(gb|mb)?', re.I)
m = STICKS_RE.search(text)
if m:
amount = int(m.group(1))
size = get_size(m.group(2), m.group(3))
return amount, size, amount * size
sizes = []
for size, type in TOTAL_RE.findall(text):
sizes.append(get_size(size, type))
if not sizes:
return None, None, None
total = max(sizes)
return 1, total, total
def extract_ram_info(text: str):
gen, speed = extract_gen_and_speed(text)
if not speed:
speed = extract_speed(text)
if gen and not speed:
speed = extract_speed_backup(gen, text)
ram_type = extract_ram_type(text)
latency = extract_latency(text)
amount, size, total = extract_gb(text)
return {
'intended_for': ram_type,
'generation': gen,
'speed': speed,
'latency': latency,
'sticks': amount,
'stick_size': size,
'capacity': total
}