aws-codedeploy-agent 0.0.3 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,347 +0,0 @@
1
- require 'set'
2
-
3
- module JMESPath
4
- # @api private
5
- class Parser
6
-
7
- # @api private
8
- AFTER_DOT = Set.new([
9
- :identifier, # foo.bar
10
- :quoted_identifier, # foo."bar"
11
- :star, # foo.*
12
- :lbrace, # foo[1]
13
- :lbracket, # foo{a: 0}
14
- :function, # foo.*.to_string(@)
15
- :filter, # foo.[?bar==10]
16
- ])
17
-
18
- CURRENT_NODE = { type: :current }
19
-
20
- # @option options [Lexer] :lexer
21
- def initialize(options = {})
22
- @lexer = options[:lexer] || Lexer.new()
23
- end
24
-
25
- # @param [String<JMESPath>] expression
26
- def parse(expression)
27
- stream = TokenStream.new(expression, @lexer.tokenize(expression))
28
- result = expr(stream)
29
- if stream.token.type != :eof
30
- raise Errors::SyntaxError, "expected :eof got #{stream.token.type}"
31
- else
32
- result
33
- end
34
- end
35
-
36
- # @api private
37
- def method_missing(method_name, *args)
38
- if matches = method_name.match(/^(nud_|led_)(.*)/)
39
- raise Errors::SyntaxError, "unexpected token #{matches[2]}"
40
- else
41
- super
42
- end
43
- end
44
-
45
- private
46
-
47
- # @param [TokenStream] stream
48
- # @param [Integer] rbp Right binding power
49
- def expr(stream, rbp = 0)
50
- left = send("nud_#{stream.token.type}", stream)
51
- while rbp < stream.token.binding_power
52
- left = send("led_#{stream.token.type}", stream, left)
53
- end
54
- left
55
- end
56
-
57
- def nud_current(stream)
58
- stream.next
59
- CURRENT_NODE
60
- end
61
-
62
- def nud_expref(stream)
63
- stream.next
64
- {
65
- type: :expression,
66
- children: [expr(stream, 2)]
67
- }
68
- end
69
-
70
- def nud_filter(stream)
71
- led_filter(stream, CURRENT_NODE)
72
- end
73
-
74
- def nud_flatten(stream)
75
- led_flatten(stream, CURRENT_NODE)
76
- end
77
-
78
- def nud_identifier(stream)
79
- token = stream.token
80
- stream.next
81
- { type: :field, key: token.value }
82
- end
83
-
84
- def nud_lbrace(stream)
85
- valid_keys = Set.new([:quoted_identifier, :identifier])
86
- stream.next(match:valid_keys)
87
- pairs = []
88
- begin
89
- pairs << parse_key_value_pair(stream)
90
- if stream.token.type == :comma
91
- stream.next(match:valid_keys)
92
- end
93
- end while stream.token.type != :rbrace
94
- stream.next
95
- {
96
- type: :multi_select_hash,
97
- children: pairs
98
- }
99
- end
100
-
101
- def nud_lbracket(stream)
102
- stream.next
103
- type = stream.token.type
104
- if type == :number || type == :colon
105
- parse_array_index_expression(stream)
106
- elsif type == :star && stream.lookahead(1).type == :rbracket
107
- parse_wildcard_array(stream)
108
- else
109
- parse_multi_select_list(stream)
110
- end
111
- end
112
-
113
- def nud_literal(stream)
114
- value = stream.token.value
115
- stream.next
116
- {
117
- type: :literal,
118
- value: value
119
- }
120
- end
121
-
122
- def nud_quoted_identifier(stream)
123
- token = stream.token
124
- next_token = stream.next
125
- if next_token.type == :lparen
126
- msg = 'quoted identifiers are not allowed for function names'
127
- raise Errors::SyntaxError, msg
128
- else
129
- { type: :field, key: token[:value] }
130
- end
131
- end
132
-
133
- def nud_star(stream)
134
- parse_wildcard_object(stream, CURRENT_NODE)
135
- end
136
-
137
- def led_comparator(stream, left)
138
- token = stream.token
139
- stream.next
140
- {
141
- type: :comparator,
142
- relation: token.value,
143
- children: [
144
- left,
145
- expr(stream),
146
- ]
147
- }
148
- end
149
-
150
- def led_dot(stream, left)
151
- stream.next(match:AFTER_DOT)
152
- if stream.token.type == :star
153
- parse_wildcard_object(stream, left)
154
- else
155
- {
156
- type: :subexpression,
157
- children: [
158
- left,
159
- parse_dot(stream, Token::BINDING_POWER[:dot])
160
- ]
161
- }
162
- end
163
- end
164
-
165
- def led_filter(stream, left)
166
- stream.next
167
- expression = expr(stream)
168
- if stream.token.type != :rbracket
169
- raise Errors::SyntaxError, 'expected a closing rbracket for the filter'
170
- end
171
- stream.next
172
- rhs = parse_projection(stream, Token::BINDING_POWER[:filter])
173
- {
174
- type: :projection,
175
- from: :array,
176
- children: [
177
- left ? left : CURRENT_NODE,
178
- {
179
- type: :condition,
180
- children: [expression, rhs],
181
- }
182
- ]
183
- }
184
- end
185
-
186
- def led_flatten(stream, left)
187
- stream.next
188
- {
189
- type: :projection,
190
- from: :array,
191
- children: [
192
- { type: :flatten, children: [left] },
193
- parse_projection(stream, Token::BINDING_POWER[:flatten])
194
- ]
195
- }
196
- end
197
-
198
- def led_lbracket(stream, left)
199
- stream.next(match: Set.new([:number, :colon, :star]))
200
- type = stream.token.type
201
- if type == :number || type == :colon
202
- {
203
- type: :subexpression,
204
- children: [
205
- left,
206
- parse_array_index_expression(stream)
207
- ]
208
- }
209
- else
210
- parse_wildcard_array(stream, left)
211
- end
212
- end
213
-
214
- def led_lparen(stream, left)
215
- args = []
216
- name = left[:key]
217
- stream.next
218
- while stream.token.type != :rparen
219
- args << expr(stream, 0)
220
- if stream.token.type == :comma
221
- stream.next
222
- end
223
- end
224
- stream.next
225
- {
226
- type: :function,
227
- fn: name,
228
- children: args,
229
- }
230
- end
231
-
232
- def led_or(stream, left)
233
- stream.next
234
- {
235
- type: :or,
236
- children: [left, expr(stream, Token::BINDING_POWER[:or])]
237
- }
238
- end
239
-
240
- def led_pipe(stream, left)
241
- stream.next
242
- {
243
- type: :pipe,
244
- children: [left, expr(stream, Token::BINDING_POWER[:pipe])],
245
- }
246
- end
247
-
248
- def parse_array_index_expression(stream)
249
- pos = 0
250
- parts = [nil, nil, nil]
251
- begin
252
- if stream.token.type == :colon
253
- pos += 1
254
- else
255
- parts[pos] = stream.token.value
256
- end
257
- stream.next(match:Set.new([:number, :colon, :rbracket]))
258
- end while stream.token.type != :rbracket
259
- stream.next
260
- if pos == 0
261
- { type: :index, index: parts[0] }
262
- elsif pos > 2
263
- raise Errors::SyntaxError, 'invalid array slice syntax: too many colons'
264
- else
265
- { type: :slice, args: parts }
266
- end
267
- end
268
-
269
- def parse_dot(stream, binding_power)
270
- if stream.token.type == :lbracket
271
- stream.next
272
- parse_multi_select_list(stream)
273
- else
274
- expr(stream, binding_power)
275
- end
276
- end
277
-
278
- def parse_key_value_pair(stream)
279
- key = stream.token.value
280
- stream.next(match:Set.new([:colon]))
281
- stream.next
282
- {
283
- type: :key_value_pair,
284
- key: key,
285
- children: [expr(stream)]
286
- }
287
- end
288
-
289
- def parse_multi_select_list(stream)
290
- nodes = []
291
- begin
292
- nodes << expr(stream)
293
- if stream.token.type == :comma
294
- stream.next
295
- if stream.token.type == :rbracket
296
- raise Errors::SyntaxError, 'expression epxected, found rbracket'
297
- end
298
- end
299
- end while stream.token.type != :rbracket
300
- stream.next
301
- {
302
- type: :multi_select_list,
303
- children: nodes
304
- }
305
- end
306
-
307
- def parse_projection(stream, binding_power)
308
- type = stream.token.type
309
- if stream.token.binding_power < 10
310
- CURRENT_NODE
311
- elsif type == :dot
312
- stream.next(match:AFTER_DOT)
313
- parse_dot(stream, binding_power)
314
- elsif type == :lbracket || type == :filter
315
- expr(stream, binding_power)
316
- else
317
- raise Errors::SyntaxError, 'syntax error after projection'
318
- end
319
- end
320
-
321
- def parse_wildcard_array(stream, left = nil)
322
- stream.next(match:Set.new([:rbracket]))
323
- stream.next
324
- {
325
- type: :projection,
326
- from: :array,
327
- children: [
328
- left ? left : CURRENT_NODE,
329
- parse_projection(stream, Token::BINDING_POWER[:star])
330
- ]
331
- }
332
- end
333
-
334
- def parse_wildcard_object(stream, left = nil)
335
- stream.next
336
- {
337
- type: :projection,
338
- from: :object,
339
- children: [
340
- left ? left : CURRENT_NODE,
341
- parse_projection(stream, Token::BINDING_POWER[:star])
342
- ]
343
- }
344
- end
345
-
346
- end
347
- end
@@ -1,71 +0,0 @@
1
- module JMESPath
2
- # @api private
3
- class Runtime
4
-
5
- # @api private
6
- DEFAULT_PARSER = CachingParser.new
7
-
8
- # Constructs a new runtime object for evaluating JMESPath expressions.
9
- #
10
- # runtime = JMESPath::Runtime.new
11
- # runtime.search(expression, data)
12
- # #=> ...
13
- #
14
- # ## Caching
15
- #
16
- # When constructing a {Runtime}, the default parser caches expressions.
17
- # This significantly speeds up calls to {#search} multiple times
18
- # with the same expression but different data. To disable caching, pass
19
- # `:cache_expressions => false` to the constructor or pass a custom
20
- # `:parser`.
21
- #
22
- # @example Re-use a Runtime, caching enabled by default
23
- #
24
- # runtime = JMESPath::Runtime.new
25
- # runtime.parser
26
- # #=> #<JMESPath::CachingParser ...>
27
- #
28
- # @example Disable caching
29
- #
30
- # runtime = JMESPath::Runtime.new(cache_expressions: false)
31
- # runtime.parser
32
- # #=> #<JMESPath::Parser ...>
33
- #
34
- # @option options [Boolean] :cache_expressions (true) When `false`, a non
35
- # caching parser will be used. When `true`, a shared instance of
36
- # {CachingParser} is used. Defaults to `true`.
37
- #
38
- # @option options [Parser,CachingParser] :parser
39
- #
40
- # @option options [Interpreter] :interpreter
41
- #
42
- def initialize(options = {})
43
- @parser = options[:parser] || default_parser(options)
44
- @interpreter = options[:interpreter] || TreeInterpreter.new
45
- end
46
-
47
- # @return [Parser, CachingParser]
48
- attr_reader :parser
49
-
50
- # @return [Interpreter]
51
- attr_reader :interpreter
52
-
53
- # @param [String<JMESPath>] expression
54
- # @param [Hash] data
55
- # @return [Mixed,nil]
56
- def search(expression, data)
57
- @interpreter.visit(@parser.parse(expression), data)
58
- end
59
-
60
- private
61
-
62
- def default_parser(options)
63
- if options[:cache_expressions] == false
64
- Parser.new(options)
65
- else
66
- DEFAULT_PARSER
67
- end
68
- end
69
-
70
- end
71
- end
@@ -1,41 +0,0 @@
1
- module JMESPath
2
- # @api private
3
- class Token < Struct.new(:type, :value, :position, :binding_power)
4
-
5
- # @api private
6
- NULL_TOKEN = Token.new(:eof, '', nil)
7
-
8
- # binding power
9
- # @api private
10
- BINDING_POWER = {
11
- :eof => 0,
12
- :quoted_identifier => 0,
13
- :identifier => 0,
14
- :rbracket => 0,
15
- :rparen => 0,
16
- :comma => 0,
17
- :rbrace => 0,
18
- :number => 0,
19
- :current => 0,
20
- :expref => 0,
21
- :pipe => 1,
22
- :comparator => 2,
23
- :or => 5,
24
- :flatten => 6,
25
- :star => 20,
26
- :dot => 40,
27
- :lbrace => 50,
28
- :filter => 50,
29
- :lbracket => 50,
30
- :lparen => 60,
31
- }
32
-
33
- # @param [Symbol] type
34
- # @param [Mixed] value
35
- # @param [Integer] position
36
- def initialize(type, value, position)
37
- super(type, value, position, BINDING_POWER[type])
38
- end
39
-
40
- end
41
- end