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