Skip to content

Commit 6f60eab

Browse files
committed
capabilities_parser parse ast and json
1 parent bd05afc commit 6f60eab

File tree

1 file changed

+56
-43
lines changed

1 file changed

+56
-43
lines changed
Lines changed: 56 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,30 @@
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 _parse_ast(contents):
7+
try:
8+
return ast.literal_eval(contents)
9+
except SyntaxError:
10+
pass
11+
try:
12+
# remove anything before dict declaration like: "caps = { ..."
13+
# and try again
14+
match = re.match(r"^([^{]+)", contents)
15+
if match:
16+
contents = contents.replace(match.group(1), "")
17+
return ast.literal_eval(contents)
18+
except SyntaxError:
19+
pass
720

8-
f = open(cap_file, 'r')
9-
all_code = f.read()
10-
f.close()
21+
return False
1122

12-
desired_capabilities = {}
13-
num_capabilities = 0
1423

15-
code_lines = all_code.split('\n')
24+
def _parse_manual(contents):
25+
capabilities = {}
26+
27+
code_lines = contents.split('\n')
1628
for line in code_lines:
1729
if "desired_cap = {" in line:
1830
line = line.split("desired_cap = {")[1]
@@ -22,17 +34,15 @@ def get_desired_capabilities(cap_file):
2234
if data:
2335
key = data.group(1)
2436
value = data.group(2)
25-
desired_capabilities[key] = value
26-
num_capabilities += 1
37+
capabilities[key] = value
2738
continue
2839

2940
# "KEY" : "VALUE"
3041
data = re.match(r'^\s*"([\S\s]+)"\s*:\s*"([\S\s]+)"\s*[,}]?\s*$', line)
3142
if data:
3243
key = data.group(1)
3344
value = data.group(2)
34-
desired_capabilities[key] = value
35-
num_capabilities += 1
45+
capabilities[key] = value
3646
continue
3747

3848
# 'KEY' : "VALUE"
@@ -41,8 +51,7 @@ def get_desired_capabilities(cap_file):
4151
if data:
4252
key = data.group(1)
4353
value = data.group(2)
44-
desired_capabilities[key] = value
45-
num_capabilities += 1
54+
capabilities[key] = value
4655
continue
4756

4857
# "KEY" : 'VALUE'
@@ -51,8 +60,7 @@ def get_desired_capabilities(cap_file):
5160
if data:
5261
key = data.group(1)
5362
value = data.group(2)
54-
desired_capabilities[key] = value
55-
num_capabilities += 1
63+
capabilities[key] = value
5664
continue
5765

5866
# "KEY" : True
@@ -61,8 +69,7 @@ def get_desired_capabilities(cap_file):
6169
if data:
6270
key = data.group(1)
6371
value = True
64-
desired_capabilities[key] = value
65-
num_capabilities += 1
72+
capabilities[key] = value
6673
continue
6774

6875
# 'KEY' : True
@@ -71,8 +78,7 @@ def get_desired_capabilities(cap_file):
7178
if data:
7279
key = data.group(1)
7380
value = True
74-
desired_capabilities[key] = value
75-
num_capabilities += 1
81+
capabilities[key] = value
7682
continue
7783

7884
# "KEY" : False
@@ -81,8 +87,7 @@ def get_desired_capabilities(cap_file):
8187
if data:
8288
key = data.group(1)
8389
value = False
84-
desired_capabilities[key] = value
85-
num_capabilities += 1
90+
capabilities[key] = value
8691
continue
8792

8893
# 'KEY' : False
@@ -91,26 +96,23 @@ def get_desired_capabilities(cap_file):
9196
if data:
9297
key = data.group(1)
9398
value = False
94-
desired_capabilities[key] = value
95-
num_capabilities += 1
99+
capabilities[key] = value
96100
continue
97101

98102
# caps['KEY'] = 'VALUE'
99103
data = re.match(r"^\s*caps\['([\S\s]+)'\]\s*=\s*'([\S\s]+)'\s*$", line)
100104
if data:
101105
key = data.group(1)
102106
value = data.group(2)
103-
desired_capabilities[key] = value
104-
num_capabilities += 1
107+
capabilities[key] = value
105108
continue
106109

107110
# caps["KEY"] = "VALUE"
108111
data = re.match(r'^\s*caps\["([\S\s]+)"\]\s*=\s*"([\S\s]+)"\s*$', line)
109112
if data:
110113
key = data.group(1)
111114
value = data.group(2)
112-
desired_capabilities[key] = value
113-
num_capabilities += 1
115+
capabilities[key] = value
114116
continue
115117

116118
# caps['KEY'] = "VALUE"
@@ -119,8 +121,7 @@ def get_desired_capabilities(cap_file):
119121
if data:
120122
key = data.group(1)
121123
value = data.group(2)
122-
desired_capabilities[key] = value
123-
num_capabilities += 1
124+
capabilities[key] = value
124125
continue
125126

126127
# caps["KEY"] = 'VALUE'
@@ -129,8 +130,7 @@ def get_desired_capabilities(cap_file):
129130
if data:
130131
key = data.group(1)
131132
value = data.group(2)
132-
desired_capabilities[key] = value
133-
num_capabilities += 1
133+
capabilities[key] = value
134134
continue
135135

136136
# caps["KEY"] = True
@@ -139,8 +139,7 @@ def get_desired_capabilities(cap_file):
139139
if data:
140140
key = data.group(1)
141141
value = True
142-
desired_capabilities[key] = value
143-
num_capabilities += 1
142+
capabilities[key] = value
144143
continue
145144

146145
# caps['KEY'] = True
@@ -149,8 +148,7 @@ def get_desired_capabilities(cap_file):
149148
if data:
150149
key = data.group(1)
151150
value = True
152-
desired_capabilities[key] = value
153-
num_capabilities += 1
151+
capabilities[key] = value
154152
continue
155153

156154
# caps["KEY"] = False
@@ -159,8 +157,7 @@ def get_desired_capabilities(cap_file):
159157
if data:
160158
key = data.group(1)
161159
value = False
162-
desired_capabilities[key] = value
163-
num_capabilities += 1
160+
capabilities[key] = value
164161
continue
165162

166163
# caps['KEY'] = False
@@ -169,11 +166,27 @@ def get_desired_capabilities(cap_file):
169166
if data:
170167
key = data.group(1)
171168
value = False
172-
desired_capabilities[key] = value
173-
num_capabilities += 1
169+
capabilities[key] = value
174170
continue
175171

176-
if num_capabilities == 0:
172+
return capabilities
173+
174+
175+
def get_desired_capabilities(cap_file):
176+
f = open(cap_file, 'r')
177+
all_code = f.read()
178+
f.close()
179+
180+
if cap_file.endswith('.py'):
181+
capabilities = _parse_ast(all_code)
182+
if not capabilities:
183+
capabilities = _parse_manual(all_code)
184+
elif cap_file.endswith('.json'):
185+
capabilities = json.loads(all_code)
186+
else:
187+
raise Exception("\n\n`%s` is not a Python or JSON file!\n\n" % cap_file)
188+
189+
if len(capabilities.keys()) == 0:
177190
raise Exception("Unable to parse desired capabilities file!")
178191

179-
return desired_capabilities
192+
return capabilities

0 commit comments

Comments
 (0)