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
157
158
159
160
161
162
|
# File 'lib/cli.rb', line 83
def parse_feature(feature)
if feature.is_a?(String)
return {'comment' => feature}
end
left, right = Array(feature.each_pair)[0]
call = false
match = /^(?:(.*):)?(?:([^=]*)=)?([^=].*)?$/.match(left)
skip, assign, property = match[1], match[2], match[3]
if !!skip
filters = skip.split(':')
skip = (filters[0] == 'not') == (filters.include?('rb'))
end
if !assign and !property
raise Exception.new('Non-valid feature')
end
if !!property
call = true
if property.end_with?('==')
property = property[0..-3]
call = false
end
end
args = []
kwargs = {}
result = right
if !!call
result = nil
for item in right
if item.is_a?(Hash) && item.length == 1
item_left, item_right = Array(item.each_pair)[0]
if item_left == '=='
result = item_right
next
end
if item_left.end_with?('=')
kwargs[item_left[0..-2]] = item_right
next
end
end
args.push(item)
end
end
text = property
if !!assign
text = "#{assign} = #{property || JSON.generate(result)}"
end
if !!call
items = []
for item in args
items.push(JSON.generate(item))
end
for name, item in kwargs.each_pair
items.push("#{name}=#{JSON.generate(item)}")
end
text = "#{text}(#{items.join(', ')})"
end
if !!result && !assign
text = "#{text} == #{JSON.generate(result)}"
end
text = text.gsub(/{"([^{}]*?)": null}/, '\1')
return {
'comment' => nil,
'skip' => skip,
'call' => call,
'assign' => assign,
'property' => property,
'args' => args,
'kwargs' => kwargs,
'result' => result,
'text' => text,
}
end
|