Skip to content

Commit 340ad10

Browse files
authored
Merge pull request #459 from piotrkochan/feature/cap-parse-ast-json
capabilities_parser parse ast and json
2 parents bd05afc + 3c0f448 commit 340ad10

File tree

1 file changed

+79
-43
lines changed

1 file changed

+79
-43
lines changed
Lines changed: 79 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,35 @@
11
import re
2+
import ast
3+
import json
24

35

4-
def get_desired_capabilities(cap_file):
5-
if not cap_file.endswith('.py'):
6-
raise Exception("\n\n`%s` is not a Python file!\n\n" % cap_file)
6+
def _analyze_ast(contents):
7+
try:
8+
return ast.literal_eval(contents)
9+
except SyntaxError:
10+
pass
11+
try:
12+
# remove all comments
13+
contents = re.sub(re.compile(r"/\*.*?\*/", re.DOTALL), "", contents)
14+
contents = re.sub(re.compile(r"#.*?\n"), "", contents)
15+
16+
# remove anything before dict declaration like: "caps = { ..."
17+
match = re.match(r"^([^{]+)", contents)
18+
if match:
19+
contents = contents.replace(match.group(1), "")
20+
21+
# and try again
22+
return ast.literal_eval(contents)
23+
except SyntaxError:
24+
pass
25+
26+
return False
727

8-
f = open(cap_file, 'r')
9-
all_code = f.read()
10-
f.close()
1128

12-
desired_capabilities = {}
13-
num_capabilities = 0
29+
def _analyze_manual(contents):
30+
capabilities = {}
1431

15-
code_lines = all_code.split('\n')
32+
code_lines = contents.split('\n')
1633
for line in code_lines:
1734
if "desired_cap = {" in line:
1835
line = line.split("desired_cap = {")[1]
@@ -22,17 +39,15 @@ def get_desired_capabilities(cap_file):
2239
if data:
2340
key = data.group(1)
2441
value = data.group(2)
25-
desired_capabilities[key] = value
26-
num_capabilities += 1
42+
capabilities[key] = value
2743
continue
2844

2945
# "KEY" : "VALUE"
3046
data = re.match(r'^\s*"([\S\s]+)"\s*:\s*"([\S\s]+)"\s*[,}]?\s*$', line)
3147
if data:
3248
key = data.group(1)
3349
value = data.group(2)
34-
desired_capabilities[key] = value
35-
num_capabilities += 1
50+
capabilities[key] = value
3651
continue
3752

3853
# 'KEY' : "VALUE"
@@ -41,8 +56,7 @@ def get_desired_capabilities(cap_file):
4156
if data:
4257
key = data.group(1)
4358
value = data.group(2)
44-
desired_capabilities[key] = value
45-
num_capabilities += 1
59+
capabilities[key] = value
4660
continue
4761

4862
# "KEY" : 'VALUE'
@@ -51,8 +65,7 @@ def get_desired_capabilities(cap_file):
5165
if data:
5266
key = data.group(1)
5367
value = data.group(2)
54-
desired_capabilities[key] = value
55-
num_capabilities += 1
68+
capabilities[key] = value
5669
continue
5770

5871
# "KEY" : True
@@ -61,8 +74,7 @@ def get_desired_capabilities(cap_file):
6174
if data:
6275
key = data.group(1)
6376
value = True
64-
desired_capabilities[key] = value
65-
num_capabilities += 1
77+
capabilities[key] = value
6678
continue
6779

6880
# 'KEY' : True
@@ -71,8 +83,7 @@ def get_desired_capabilities(cap_file):
7183
if data:
7284
key = data.group(1)
7385
value = True
74-
desired_capabilities[key] = value
75-
num_capabilities += 1
86+
capabilities[key] = value
7687
continue
7788

7889
# "KEY" : False
@@ -81,8 +92,7 @@ def get_desired_capabilities(cap_file):
8192
if data:
8293
key = data.group(1)
8394
value = False
84-
desired_capabilities[key] = value
85-
num_capabilities += 1
95+
capabilities[key] = value
8696
continue
8797

8898
# 'KEY' : False
@@ -91,26 +101,23 @@ def get_desired_capabilities(cap_file):
91101
if data:
92102
key = data.group(1)
93103
value = False
94-
desired_capabilities[key] = value
95-
num_capabilities += 1
104+
capabilities[key] = value
96105
continue
97106

98107
# caps['KEY'] = 'VALUE'
99108
data = re.match(r"^\s*caps\['([\S\s]+)'\]\s*=\s*'([\S\s]+)'\s*$", line)
100109
if data:
101110
key = data.group(1)
102111
value = data.group(2)
103-
desired_capabilities[key] = value
104-
num_capabilities += 1
112+
capabilities[key] = value
105113
continue
106114

107115
# caps["KEY"] = "VALUE"
108116
data = re.match(r'^\s*caps\["([\S\s]+)"\]\s*=\s*"([\S\s]+)"\s*$', line)
109117
if data:
110118
key = data.group(1)
111119
value = data.group(2)
112-
desired_capabilities[key] = value
113-
num_capabilities += 1
120+
capabilities[key] = value
114121
continue
115122

116123
# caps['KEY'] = "VALUE"
@@ -119,8 +126,7 @@ def get_desired_capabilities(cap_file):
119126
if data:
120127
key = data.group(1)
121128
value = data.group(2)
122-
desired_capabilities[key] = value
123-
num_capabilities += 1
129+
capabilities[key] = value
124130
continue
125131

126132
# caps["KEY"] = 'VALUE'
@@ -129,8 +135,7 @@ def get_desired_capabilities(cap_file):
129135
if data:
130136
key = data.group(1)
131137
value = data.group(2)
132-
desired_capabilities[key] = value
133-
num_capabilities += 1
138+
capabilities[key] = value
134139
continue
135140

136141
# caps["KEY"] = True
@@ -139,8 +144,7 @@ def get_desired_capabilities(cap_file):
139144
if data:
140145
key = data.group(1)
141146
value = True
142-
desired_capabilities[key] = value
143-
num_capabilities += 1
147+
capabilities[key] = value
144148
continue
145149

146150
# caps['KEY'] = True
@@ -149,8 +153,7 @@ def get_desired_capabilities(cap_file):
149153
if data:
150154
key = data.group(1)
151155
value = True
152-
desired_capabilities[key] = value
153-
num_capabilities += 1
156+
capabilities[key] = value
154157
continue
155158

156159
# caps["KEY"] = False
@@ -159,8 +162,7 @@ def get_desired_capabilities(cap_file):
159162
if data:
160163
key = data.group(1)
161164
value = False
162-
desired_capabilities[key] = value
163-
num_capabilities += 1
165+
capabilities[key] = value
164166
continue
165167

166168
# caps['KEY'] = False
@@ -169,11 +171,45 @@ def get_desired_capabilities(cap_file):
169171
if data:
170172
key = data.group(1)
171173
value = False
172-
desired_capabilities[key] = value
173-
num_capabilities += 1
174+
capabilities[key] = value
174175
continue
175176

176-
if num_capabilities == 0:
177+
return capabilities
178+
179+
180+
def _read_file(file):
181+
f = open(file, 'r')
182+
data = f.read()
183+
f.close()
184+
185+
return data
186+
187+
188+
def _parse_py_file(cap_file):
189+
all_code = _read_file(cap_file)
190+
capabilities = _analyze_ast(all_code)
191+
192+
if not capabilities:
193+
capabilities = _analyze_manual(all_code)
194+
195+
return capabilities
196+
197+
198+
def _parse_json_file(cap_file):
199+
all_code = _read_file(cap_file)
200+
201+
return json.loads(all_code)
202+
203+
204+
def get_desired_capabilities(cap_file):
205+
if cap_file.endswith('.py'):
206+
capabilities = _parse_py_file(cap_file)
207+
elif cap_file.endswith('.json'):
208+
capabilities = _parse_json_file(cap_file)
209+
else:
210+
raise Exception("\n\n`%s` is not a Python or JSON file!\n" % cap_file)
211+
212+
if len(capabilities.keys()) == 0:
177213
raise Exception("Unable to parse desired capabilities file!")
178214

179-
return desired_capabilities
215+
return capabilities

0 commit comments

Comments
 (0)