logstash-filter-mutate 3.3.1 → 3.3.2

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
  SHA256:
3
- metadata.gz: e5423b0b68566ee643d458b6fb38c40a2b0fd336d9e2f23dd8921431adb1e7af
4
- data.tar.gz: 470f2d561ea225dad08e4848146001fea9ba1eaba0f13ba652f00037703dd70e
3
+ metadata.gz: 7e984a5018bec5903f3731c447c9e1fffe4b149c0c2e27ce9055e14f21deb9c0
4
+ data.tar.gz: 2b3c094ca15d06ac17c6746673ca31e40b7ca41b2217bd3c0f0ea8476c27f4c6
5
5
  SHA512:
6
- metadata.gz: 43b35a6bbe4a59e4999eec61169812bf917e17b09e41d158078b09fc476965c37c0d75c05eff5fc21238631c1bd56743d9ddf31395d70905090e7f648273d27e
7
- data.tar.gz: f9e28cf3e4c431f8769106b9e856f9b85cb5218d5e713116354fc357947e561a2e0aebf9b054ff03a71204fb2b830e91705858dd43f2ff20de7704d2452a26ed
6
+ metadata.gz: e7286e1ea17e30d46e942a7c8d1a9107c57a11d0158dc7bb979b1ac09c0b85a94159480b8b568b197c73d922369c90c0c85ca8e356e6648b501cc007c28a7fab
7
+ data.tar.gz: 7480daecb2a3c584302b6296597bc3d0f8583286ace082d6106daf6555c28705ecc73e6d28c0e8b92d41374fedf210f5cac156f5c1e431fa9f33f6709774272d
@@ -1,3 +1,6 @@
1
+ ## 3.3.2
2
+ - Fix: when converting to `float` and `float_eu`, explicitly support same range of inputs as their integer counterparts; eliminates a regression introduced in 3.3.1 in which support for non-string inputs was inadvertently removed.
3
+
1
4
  ## 3.3.1
2
5
  - Fix: Number strings using a **decimal comma** (e.g. 1,23), added convert support to specify integer_eu and float_eu.
3
6
 
@@ -62,31 +62,38 @@ Convert a field's value to a different type, like turning a string to an
62
62
  integer. If the field value is an array, all members will be converted.
63
63
  If the field is a hash no action will be taken.
64
64
 
65
- If the conversion type is `boolean`, the acceptable values are:
66
-
67
- * **True:** `true`, `t`, `yes`, `y`, and `1`
68
- * **False:** `false`, `f`, `no`, `n`, and `0`
69
-
70
- If a value other than these is provided, it will pass straight through
71
- and log a warning message.
72
-
73
- If the conversion type is `integer` and the value is a boolean, it will be converted as:
74
- * **True:** `1`
75
- * **False:** `0`
76
-
77
- If you have numeric strings that have decimal commas (Europe and ex-colonies)
78
- e.g. "1.234,56" or "2.340", by using conversion targets of integer_eu or float_eu
79
- the convert function will treat "." as a group separator and "," as a decimal separator.
80
-
81
- Conversion targets of integer or float will now correctly handle "," as a group separator.
82
-
83
- Valid conversion targets are: integer, float, integer_eu, float_eu, string, and boolean.
65
+ Valid conversion targets, and their expected behaviour with different inputs are:
66
+
67
+ * `integer`:
68
+ - strings are parsed; comma-separators are supported (e.g., the string `"1,000"` produces an integer with value of one thousand); when strings have decimal parts, they are _truncated_.
69
+ - floats and decimals are _truncated_ (e.g., `3.99` becomes `3`, `-2.7` becomes `-2`)
70
+ - boolean true and boolean false are converted to `1` and `0` respectively
71
+ * `integer_eu`:
72
+ - same as `integer`, except string values support dot-separators and comma-decimals (e.g., `"1.000"` produces an integer with value of one thousand)
73
+ * `float`:
74
+ - integers are converted to floats
75
+ - strings are parsed; comma-separators and dot-decimals are supported (e.g., `"1,000.5"` produces an integer with value of one thousand and one half)
76
+ - boolean true and boolean false are converted to `1.0` and `0.0` respectively
77
+ * `float_eu`:
78
+ - same as `float`, except string values support dot-separators and comma-decimals (e.g., `"1.000,5"` produces an integer with value of one thousand and one half)
79
+ * `string`:
80
+ - all values are stringified and encoded with UTF-8
81
+ * `boolean`:
82
+ - strings `"true"`, `"t"`, `"yes"`, `"y"`, and `"1"` are converted to boolean `true`
83
+ - strings `"false"`, `"f"`, `"no"`, `"n"`, and `"0"` are converted to boolean `false`
84
+ - empty strings are converted to boolean `false`
85
+ - all other values pass straight through without conversion and log a warning message
86
+
87
+ This plugin can convert multiple fields in the same document, see the example below.
84
88
 
85
89
  Example:
86
90
  [source,ruby]
87
91
  filter {
88
92
  mutate {
89
- convert => { "fieldname" => "integer" }
93
+ convert => {
94
+ "fieldname" => "integer"
95
+ "booleanfield" => "boolean"
96
+ }
90
97
  }
91
98
  }
92
99
 
@@ -341,22 +341,29 @@ class LogStash::Filters::Mutate < LogStash::Filters::Base
341
341
  end
342
342
 
343
343
  def convert_float(value)
344
- value.tr(",", "").to_f
344
+ return 1.0 if value == true
345
+ return 0.0 if value == false
346
+ value = value.delete(",") if value.kind_of?(String)
347
+ value.to_f
345
348
  end
346
349
 
347
350
  def convert_integer_eu(value)
348
- return 1 if value == true
349
- return 0 if value == false
350
- cnv_replace_eu(value).to_i
351
+ us_value = cnv_replace_eu(value)
352
+ convert_integer(us_value)
351
353
  end
352
354
 
353
355
  def convert_float_eu(value)
354
- cnv_replace_eu(value).to_f
356
+ us_value = cnv_replace_eu(value)
357
+ convert_float(us_value)
355
358
  end
356
359
 
360
+ # When given a String, returns a new String whose contents have been converted from
361
+ # EU-style comma-decimals and dot-separators to US-style dot-decimals and comma-separators.
362
+ #
363
+ # For all other values, returns value unmodified.
357
364
  def cnv_replace_eu(value)
358
365
  return value if !value.is_a?(String)
359
- value.tr(".", "").tr(",", ".")
366
+ value.tr(",.", ".,")
360
367
  end
361
368
 
362
369
  def gsub(event)
@@ -1,7 +1,7 @@
1
1
  Gem::Specification.new do |s|
2
2
 
3
3
  s.name = 'logstash-filter-mutate'
4
- s.version = '3.3.1'
4
+ s.version = '3.3.2'
5
5
  s.licenses = ['Apache License (2.0)']
6
6
  s.summary = "Performs mutations on fields"
7
7
  s.description = "This gem is a Logstash plugin required to be installed on top of the Logstash core pipeline using $LS_HOME/bin/logstash-plugin install gemname. This gem is not a stand-alone program"
@@ -415,6 +415,152 @@ describe LogStash::Filters::Mutate do
415
415
  end
416
416
  end
417
417
 
418
+ describe "convert to float" do
419
+
420
+ config <<-CONFIG
421
+ filter {
422
+ mutate {
423
+ convert => {
424
+ "field" => "float"
425
+ }
426
+ }
427
+ }
428
+ CONFIG
429
+
430
+ context 'when field is a string with no separator and dot decimal' do
431
+ sample({'field' => '3141.5926'}) do
432
+ expect(subject.get('field')).to be_within(0.0001).of(3141.5926)
433
+ end
434
+ end
435
+
436
+ context 'when field is a string with a comma separator and dot decimal' do
437
+ sample({'field' => '3,141.5926'}) do
438
+ expect(subject.get('field')).to be_within(0.0001).of(3141.5926)
439
+ end
440
+ end
441
+
442
+ context 'when field is a string comma separator and no decimal' do
443
+ sample({'field' => '3,141'}) do
444
+ expect(subject.get('field')).to be_within(0.0001).of(3141.0)
445
+ end
446
+ end
447
+
448
+ context 'when field is a string no separator and no decimal' do
449
+ sample({'field' => '3141'}) do
450
+ expect(subject.get('field')).to be_within(0.0001).of(3141.0)
451
+ end
452
+ end
453
+
454
+ context 'when field is a float' do
455
+ sample({'field' => 3.1415926}) do
456
+ expect(subject.get('field')).to be_within(0.000001).of(3.1415926)
457
+ end
458
+ end
459
+
460
+ context 'when field is an integer' do
461
+ sample({'field' => 3}) do
462
+ expect(subject.get('field')).to be_within(0.000001).of(3)
463
+ end
464
+ end
465
+
466
+ context 'when field is the true value' do
467
+ sample('field' => true) do
468
+ expect(subject.get('field')).to eq(1.0)
469
+ end
470
+ end
471
+
472
+ context 'when field is the false value' do
473
+ sample('field' => false) do
474
+ expect(subject.get('field')).to eq(0.0)
475
+ end
476
+ end
477
+
478
+ context 'when field is nil' do
479
+ sample('field' => nil) do
480
+ expect(subject.get('field')).to be_nil
481
+ end
482
+ end
483
+
484
+ context 'when field is not set' do
485
+ sample('field' => nil) do
486
+ expect(subject.get('field')).to be_nil
487
+ end
488
+ end
489
+ end
490
+
491
+
492
+ describe "convert to float_eu" do
493
+ config <<-CONFIG
494
+ filter {
495
+ mutate {
496
+ convert => {
497
+ "field" => "float_eu"
498
+ }
499
+ }
500
+ }
501
+ CONFIG
502
+
503
+ context 'when field is a string with no separator and comma decimal' do
504
+ sample({'field' => '3141,5926'}) do
505
+ expect(subject.get('field')).to be_within(0.0001).of(3141.5926)
506
+ end
507
+ end
508
+
509
+ context 'when field is a string with a dot separator and comma decimal' do
510
+ sample({'field' => '3.141,5926'}) do
511
+ expect(subject.get('field')).to be_within(0.0001).of(3141.5926)
512
+ end
513
+ end
514
+
515
+ context 'when field is a string dot separator and no decimal' do
516
+ sample({'field' => '3.141'}) do
517
+ expect(subject.get('field')).to be_within(0.0001).of(3141.0)
518
+ end
519
+ end
520
+
521
+ context 'when field is a string no separator and no decimal' do
522
+ sample({'field' => '3141'}) do
523
+ expect(subject.get('field')).to be_within(0.0001).of(3141.0)
524
+ end
525
+ end
526
+
527
+ context 'when field is a float' do
528
+ sample({'field' => 3.1415926}) do
529
+ expect(subject.get('field')).to be_within(0.000001).of(3.1415926)
530
+ end
531
+ end
532
+
533
+ context 'when field is an integer' do
534
+ sample({'field' => 3}) do
535
+ expect(subject.get('field')).to be_within(0.000001).of(3)
536
+ end
537
+ end
538
+
539
+ context 'when field is the true value' do
540
+ sample('field' => true) do
541
+ expect(subject.get('field')).to eq(1.0)
542
+ end
543
+ end
544
+
545
+ context 'when field is the false value' do
546
+ sample('field' => false) do
547
+ expect(subject.get('field')).to eq(0.0)
548
+ end
549
+ end
550
+
551
+ context 'when field is nil' do
552
+ sample('field' => nil) do
553
+ expect(subject.get('field')).to be_nil
554
+ end
555
+ end
556
+
557
+ context 'when field is not set' do
558
+ sample('field' => nil) do
559
+ expect(subject.get('field')).to be_nil
560
+ end
561
+ end
562
+ end
563
+
418
564
  describe "gsub on a String" do
419
565
  config '
420
566
  filter {
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-filter-mutate
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.3.1
4
+ version: 3.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Elastic
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-02-02 00:00:00.000000000 Z
11
+ date: 2018-05-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement