fluent-plugin-record-reformer 0.8.0 → 0.8.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: bf0c0a50d2b8509f3fa6917e0f700abe30e5249a
4
- data.tar.gz: fba94b0ab7c6259354c70be688ef5ad81cc29efe
3
+ metadata.gz: 5c12a8d7d13aa7b7cd2774128c13b1ce7ed4473a
4
+ data.tar.gz: 7bf4dd5a13506bd3d9e89acf739d27322bb737e4
5
5
  SHA512:
6
- metadata.gz: 132876d93292dd82888bbf7a34010dbc3c9e99ea746952165c919a71be3ad8118b3572009f5a8c5deb18654b714142a9b100b39c07ff2e3e40ae9d1e1c014ca9
7
- data.tar.gz: 98e35238beb1848b8076ab6c66095a9cb15eb91301bd21f8eed18ad4f70e2eae2b932ad6c525c516f57794d0fee651a162d25a2b519c9fb19bceda90947aaad7
6
+ metadata.gz: 54d23d63dca07dad339103db47a0b7374ef6aef190f4d8e64b984a625ac40b1e158a46f2c9b6aa8c735f1701a19fe0fc16418ba39d4e06052307756d1e0f96b3
7
+ data.tar.gz: fda86acdd87b031272f229b8162a2b2b77caa07788e0db8076fb9e84f8cb74ab865aa6a15be579928aba42e38c904b7ae5eeddabb377596a50dbcf96b9a31e40
@@ -1,3 +1,13 @@
1
+ ## 0.8.1 (2016/03/09)
2
+
3
+ Fixes
4
+
5
+ * Fix to be thread-safe
6
+
7
+ Changes
8
+
9
+ * Relax conditions which auto_typecast is applied for enable_ruby yes
10
+
1
11
  ## 0.8.0 (2016/01/28)
2
12
 
3
13
  Enhancements
@@ -3,7 +3,7 @@ $:.push File.expand_path('../lib', __FILE__)
3
3
 
4
4
  Gem::Specification.new do |gem|
5
5
  gem.name = "fluent-plugin-record-reformer"
6
- gem.version = "0.8.0"
6
+ gem.version = "0.8.1"
7
7
  gem.authors = ["Naotoshi Seo"]
8
8
  gem.email = "sonots@gmail.com"
9
9
  gem.homepage = "https://github.com/sonots/fluent-plugin-record-reformer"
@@ -139,30 +139,31 @@ module Fluent
139
139
  end
140
140
 
141
141
  def reform(tag, record, placeholder_values)
142
- @placeholder_expander.prepare_placeholders(placeholder_values)
142
+ placeholders = @placeholder_expander.prepare_placeholders(placeholder_values)
143
143
 
144
- new_tag = expand_placeholders(tag)
144
+ new_tag = expand_placeholders(tag, placeholders)
145
145
 
146
146
  new_record = @renew_record ? {} : record.dup
147
147
  @keep_keys.each {|k| new_record[k] = record[k]} if @keep_keys and @renew_record
148
- new_record.merge!(expand_placeholders(@map))
148
+ new_record.merge!(expand_placeholders(@map, placeholders))
149
149
  @remove_keys.each {|k| new_record.delete(k) } if @remove_keys
150
150
 
151
151
  [new_tag, new_record]
152
152
  end
153
153
 
154
- def expand_placeholders(value)
154
+ def expand_placeholders(value, placeholders)
155
155
  if value.is_a?(String)
156
- new_value = @placeholder_expander.expand(value)
156
+ new_value = @placeholder_expander.expand(value, placeholders)
157
157
  elsif value.is_a?(Hash)
158
158
  new_value = {}
159
159
  value.each_pair do |k, v|
160
- new_value[@placeholder_expander.expand(k, true)] = expand_placeholders(v)
160
+ new_key = @placeholder_expander.expand(k, placeholders, true)
161
+ new_value[new_key] = expand_placeholders(v, placeholders)
161
162
  end
162
163
  elsif value.is_a?(Array)
163
164
  new_value = []
164
165
  value.each_with_index do |v, i|
165
- new_value[i] = expand_placeholders(v)
166
+ new_value[i] = expand_placeholders(v, placeholders)
166
167
  end
167
168
  else
168
169
  new_value = value
@@ -189,6 +190,7 @@ module Fluent
189
190
  rev_tag_suffix.reverse!
190
191
  end
191
192
 
193
+ # THIS CLASS MUST BE THREAD-SAFE
192
194
  class PlaceholderExpander
193
195
  attr_reader :placeholders, :log
194
196
 
@@ -225,36 +227,37 @@ module Fluent
225
227
  end
226
228
  end
227
229
 
228
- @placeholders = placeholders
230
+ placeholders
229
231
  end
230
232
 
231
233
  # Expand string with placeholders
232
234
  #
233
235
  # @param [String] str
234
236
  # @param [Boolean] force_stringify the value must be string, used for hash key
235
- def expand(str, force_stringify = false)
237
+ def expand(str, placeholders, force_stringify = false)
236
238
  if @auto_typecast and !force_stringify
237
239
  single_placeholder_matched = str.match(/\A(\${[^}]+}|__[A-Z_]+__)\z/)
238
240
  if single_placeholder_matched
239
- log_if_unknown_placeholder($1)
240
- return @placeholders[single_placeholder_matched[1]]
241
+ log_if_unknown_placeholder($1, placeholders)
242
+ return placeholders[single_placeholder_matched[1]]
241
243
  end
242
244
  end
243
245
  str.gsub(/(\${[^}]+}|__[A-Z_]+__)/) {
244
- log_if_unknown_placeholder($1)
245
- @placeholders[$1]
246
+ log_if_unknown_placeholder($1, placeholders)
247
+ placeholders[$1]
246
248
  }
247
249
  end
248
250
 
249
251
  private
250
252
 
251
- def log_if_unknown_placeholder(placeholder)
252
- unless @placeholders.include?(placeholder)
253
+ def log_if_unknown_placeholder(placeholder, placeholders)
254
+ unless placeholders.include?(placeholder)
253
255
  log.warn "record_reformer: unknown placeholder `#{placeholder}` found"
254
256
  end
255
257
  end
256
258
  end
257
259
 
260
+ # THIS CLASS MUST BE THREAD-SAFE
258
261
  class RubyPlaceholderExpander
259
262
  attr_reader :log
260
263
 
@@ -276,12 +279,13 @@ module Fluent
276
279
  new_value = nil
277
280
  if value.is_a?(String)
278
281
  if @auto_typecast and !force_stringify
279
- if single_placeholder_matched = value.match(/\A\${([^}]+)}\z/) # ${..} => ..
280
- new_value = single_placeholder_matched[1]
282
+ num_placeholders = value.scan('${').size
283
+ if num_placeholders == 1 and value.start_with?('${') && value.end_with?('}')
284
+ new_value = value[2..-2] # ${..} => ..
281
285
  end
282
286
  end
283
287
  unless new_value
284
- new_value = %Q{%Q[#{value.gsub(/\$\{([^}]+)\}/, '#{\1}')}]} # xx${..}xx => %Q[xx#{..}xx]
288
+ new_value = "%Q[#{value.gsub('${', '#{')}]" # xx${..}xx => %Q[xx#{..}xx]
285
289
  end
286
290
  elsif value.is_a?(Hash)
287
291
  new_value = {}
@@ -300,28 +304,22 @@ module Fluent
300
304
  end
301
305
 
302
306
  def prepare_placeholders(placeholder_values)
303
- @tag = placeholder_values['tag']
304
- @time = placeholder_values['time']
305
- @record = placeholder_values['record']
306
- @tag_parts = placeholder_values['tag_parts']
307
- @tag_prefix = placeholder_values['tag_prefix']
308
- @tag_suffix = placeholder_values['tag_suffix']
309
- @hostname = placeholder_values['hostname']
307
+ placeholder_values
310
308
  end
311
309
 
312
310
  # Expand string with placeholders
313
311
  #
314
312
  # @param [String] str
315
- def expand(str, force_stringify = false)
313
+ def expand(str, placeholders, force_stringify = false)
316
314
  @cleanroom_expander.expand(
317
315
  str,
318
- @tag,
319
- @time,
320
- @record,
321
- @tag_parts,
322
- @tag_prefix,
323
- @tag_suffix,
324
- @hostname,
316
+ placeholders['tag'],
317
+ placeholders['time'],
318
+ placeholders['record'],
319
+ placeholders['tag_parts'],
320
+ placeholders['tag_prefix'],
321
+ placeholders['tag_suffix'],
322
+ placeholders['hostname'],
325
323
  )
326
324
  rescue => e
327
325
  log.warn "record_reformer: failed to expand `#{str}`", :error_class => e.class, :error => e.message
@@ -332,15 +330,16 @@ module Fluent
332
330
  class CleanroomExpander
333
331
  def expand(__str_to_eval__, tag, time, record, tag_parts, tag_prefix, tag_suffix, hostname)
334
332
  tags = tag_parts # for old version compatibility
335
- @record = record # for old version compatibility
333
+ Thread.current[:record_reformer_record] = record # for old version compatibility
336
334
  instance_eval(__str_to_eval__)
337
335
  end
338
336
 
339
337
  # for old version compatibility
340
338
  def method_missing(name)
341
339
  key = name.to_s
342
- if @record.has_key?(key)
343
- @record[key]
340
+ record = Thread.current[:record_reformer_record]
341
+ if record.has_key?(key)
342
+ record[key]
344
343
  else
345
344
  raise NameError, "undefined local variable or method `#{key}'"
346
345
  end
@@ -554,6 +554,24 @@ EOC
554
554
  end
555
555
  end
556
556
 
557
+ # https://github.com/sonots/fluent-plugin-record-reformer/issues/35
558
+ test 'auto_typecast placeholder containing {} (enable_ruby yes)' do
559
+ config = %[
560
+ tag tag
561
+ enable_ruby yes
562
+ auto_typecast yes
563
+ <record>
564
+ foo ${record.map{|k,v|v}}
565
+ </record>
566
+ ]
567
+ d = create_driver(config, use_v1)
568
+ message = {"@timestamp" => "foo"}
569
+ d.run { d.emit(message, @time) }
570
+ d.emits.each do |(tag, time, record)|
571
+ assert_equal [message["@timestamp"]], record["foo"]
572
+ end
573
+ end
574
+
557
575
  test 'expand fields starting with @ (enable_ruby yes)' do
558
576
  config = %[
559
577
  tag tag
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-record-reformer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0
4
+ version: 0.8.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Naotoshi Seo
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-01-27 00:00:00.000000000 Z
11
+ date: 2016-03-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fluentd