1
1
import re
2
+ import ast
3
+ import json
2
4
3
5
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
7
27
8
- f = open (cap_file , 'r' )
9
- all_code = f .read ()
10
- f .close ()
11
28
12
- desired_capabilities = {}
13
- num_capabilities = 0
29
+ def _analyze_manual ( contents ):
30
+ capabilities = {}
14
31
15
- code_lines = all_code .split ('\n ' )
32
+ code_lines = contents .split ('\n ' )
16
33
for line in code_lines :
17
34
if "desired_cap = {" in line :
18
35
line = line .split ("desired_cap = {" )[1 ]
@@ -22,17 +39,15 @@ def get_desired_capabilities(cap_file):
22
39
if data :
23
40
key = data .group (1 )
24
41
value = data .group (2 )
25
- desired_capabilities [key ] = value
26
- num_capabilities += 1
42
+ capabilities [key ] = value
27
43
continue
28
44
29
45
# "KEY" : "VALUE"
30
46
data = re .match (r'^\s*"([\S\s]+)"\s*:\s*"([\S\s]+)"\s*[,}]?\s*$' , line )
31
47
if data :
32
48
key = data .group (1 )
33
49
value = data .group (2 )
34
- desired_capabilities [key ] = value
35
- num_capabilities += 1
50
+ capabilities [key ] = value
36
51
continue
37
52
38
53
# 'KEY' : "VALUE"
@@ -41,8 +56,7 @@ def get_desired_capabilities(cap_file):
41
56
if data :
42
57
key = data .group (1 )
43
58
value = data .group (2 )
44
- desired_capabilities [key ] = value
45
- num_capabilities += 1
59
+ capabilities [key ] = value
46
60
continue
47
61
48
62
# "KEY" : 'VALUE'
@@ -51,8 +65,7 @@ def get_desired_capabilities(cap_file):
51
65
if data :
52
66
key = data .group (1 )
53
67
value = data .group (2 )
54
- desired_capabilities [key ] = value
55
- num_capabilities += 1
68
+ capabilities [key ] = value
56
69
continue
57
70
58
71
# "KEY" : True
@@ -61,8 +74,7 @@ def get_desired_capabilities(cap_file):
61
74
if data :
62
75
key = data .group (1 )
63
76
value = True
64
- desired_capabilities [key ] = value
65
- num_capabilities += 1
77
+ capabilities [key ] = value
66
78
continue
67
79
68
80
# 'KEY' : True
@@ -71,8 +83,7 @@ def get_desired_capabilities(cap_file):
71
83
if data :
72
84
key = data .group (1 )
73
85
value = True
74
- desired_capabilities [key ] = value
75
- num_capabilities += 1
86
+ capabilities [key ] = value
76
87
continue
77
88
78
89
# "KEY" : False
@@ -81,8 +92,7 @@ def get_desired_capabilities(cap_file):
81
92
if data :
82
93
key = data .group (1 )
83
94
value = False
84
- desired_capabilities [key ] = value
85
- num_capabilities += 1
95
+ capabilities [key ] = value
86
96
continue
87
97
88
98
# 'KEY' : False
@@ -91,26 +101,23 @@ def get_desired_capabilities(cap_file):
91
101
if data :
92
102
key = data .group (1 )
93
103
value = False
94
- desired_capabilities [key ] = value
95
- num_capabilities += 1
104
+ capabilities [key ] = value
96
105
continue
97
106
98
107
# caps['KEY'] = 'VALUE'
99
108
data = re .match (r"^\s*caps\['([\S\s]+)'\]\s*=\s*'([\S\s]+)'\s*$" , line )
100
109
if data :
101
110
key = data .group (1 )
102
111
value = data .group (2 )
103
- desired_capabilities [key ] = value
104
- num_capabilities += 1
112
+ capabilities [key ] = value
105
113
continue
106
114
107
115
# caps["KEY"] = "VALUE"
108
116
data = re .match (r'^\s*caps\["([\S\s]+)"\]\s*=\s*"([\S\s]+)"\s*$' , line )
109
117
if data :
110
118
key = data .group (1 )
111
119
value = data .group (2 )
112
- desired_capabilities [key ] = value
113
- num_capabilities += 1
120
+ capabilities [key ] = value
114
121
continue
115
122
116
123
# caps['KEY'] = "VALUE"
@@ -119,8 +126,7 @@ def get_desired_capabilities(cap_file):
119
126
if data :
120
127
key = data .group (1 )
121
128
value = data .group (2 )
122
- desired_capabilities [key ] = value
123
- num_capabilities += 1
129
+ capabilities [key ] = value
124
130
continue
125
131
126
132
# caps["KEY"] = 'VALUE'
@@ -129,8 +135,7 @@ def get_desired_capabilities(cap_file):
129
135
if data :
130
136
key = data .group (1 )
131
137
value = data .group (2 )
132
- desired_capabilities [key ] = value
133
- num_capabilities += 1
138
+ capabilities [key ] = value
134
139
continue
135
140
136
141
# caps["KEY"] = True
@@ -139,8 +144,7 @@ def get_desired_capabilities(cap_file):
139
144
if data :
140
145
key = data .group (1 )
141
146
value = True
142
- desired_capabilities [key ] = value
143
- num_capabilities += 1
147
+ capabilities [key ] = value
144
148
continue
145
149
146
150
# caps['KEY'] = True
@@ -149,8 +153,7 @@ def get_desired_capabilities(cap_file):
149
153
if data :
150
154
key = data .group (1 )
151
155
value = True
152
- desired_capabilities [key ] = value
153
- num_capabilities += 1
156
+ capabilities [key ] = value
154
157
continue
155
158
156
159
# caps["KEY"] = False
@@ -159,8 +162,7 @@ def get_desired_capabilities(cap_file):
159
162
if data :
160
163
key = data .group (1 )
161
164
value = False
162
- desired_capabilities [key ] = value
163
- num_capabilities += 1
165
+ capabilities [key ] = value
164
166
continue
165
167
166
168
# caps['KEY'] = False
@@ -169,11 +171,45 @@ def get_desired_capabilities(cap_file):
169
171
if data :
170
172
key = data .group (1 )
171
173
value = False
172
- desired_capabilities [key ] = value
173
- num_capabilities += 1
174
+ capabilities [key ] = value
174
175
continue
175
176
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 :
177
213
raise Exception ("Unable to parse desired capabilities file!" )
178
214
179
- return desired_capabilities
215
+ return capabilities
0 commit comments