scout-gear 10.3.0 → 10.4.0

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: 2a7adf9c59ab3ce69e89dd2e02089b5287605a1b74c6a435a5bfa4ece17c1f75
4
- data.tar.gz: 65f9fa08d1b4a99e973d33eb5a7c0ddab85a98b5d6a675f8a2f5cfe381e664aa
3
+ metadata.gz: 4e4dbf9f73608dbc264f7f7584af04ac87bbeb2175b04a7ef50d2ef72cea8592
4
+ data.tar.gz: d423876c0f4cd1132128c519e9576afa7933f5c2f50b2f3498009a7dcba8ea30
5
5
  SHA512:
6
- metadata.gz: cd78580f6d0fd2a417f15f425602131d4e3150fc8a0f35a1d2f63f5868e29cae8a9f59244a2fdc5d642441051b8528bcd2f8596aaf4bc11414437e6d4dc4cd14
7
- data.tar.gz: ad61b8616e5029ff0ee748b48ef78928dc862bfbb0ba763610ad9f89f7e865975d816318ea388d30d774f1088894b9c2a3d42487b9a3c01c795c45cd5b37f2d7
6
+ metadata.gz: 8d53af5f2c84362e664ff33f0afafafd5bb92756e5843c68466b81b09b51830a03a99093c18103a3f6a7d26a70099a283fc4841c346b223691b9afd6774399ac
7
+ data.tar.gz: 3c3fbc75f0ad79395211eb198198aa5e6e31de6e00a5d54375cfff5197d5cacfb6e0755889d157e4671b43edbbb1535b020814881df83a34227d231c623b0461
data/.vimproject CHANGED
@@ -74,7 +74,6 @@ scout-gear=/$PWD filter="*.rb *.yaml" {
74
74
  tsv=tsv{
75
75
  util.rb
76
76
  util=util{
77
- process.rb
78
77
  select.rb
79
78
  process.rb
80
79
  unzip.rb
data/VERSION CHANGED
@@ -1 +1 @@
1
- 10.3.0
1
+ 10.4.0
@@ -40,12 +40,18 @@ module TSV
40
40
 
41
41
  def self.attach(source, other, target: nil, fields: nil, match_key: nil, other_key: nil, one2one: true, complete: false, insitu: nil, persist_input: false, bar: nil)
42
42
  source = TSV::Transformer.new source unless TSV === source || TSV::Parser === source
43
- other = TSV.open other, persist: persist_input unless TSV === other
43
+ other = TSV::Parser.new other unless TSV === other || TSV::Parser === other
44
44
 
45
45
  fields = [fields] if String === fields
46
46
 
47
47
  match_key, other_key = TSV.match_keys(source, other, match_key: match_key, other_key: other_key)
48
48
 
49
+ if ! (TSV === other)
50
+ other_key_name = other_key == :key ? other.key_field : other.fields[other_key]
51
+ other = TSV.open other, key_field: other_key_name, fields: fields, one2one: true, persist: persist_input
52
+ other_key = :key if other.key_field == source.key_field
53
+ end
54
+
49
55
  if TSV::Transformer === source
50
56
  source.dumper = case target
51
57
  when :stream
@@ -117,6 +123,7 @@ module TSV
117
123
  current_values[overlap] = v if current_values[overlap].nil? || String === current_values[overlap] && current_values[overlap].empty?
118
124
  else
119
125
  current_values[overlap] ||= []
126
+ next if v.nil?
120
127
  current_values[overlap].concat (v - current_values[overlap])
121
128
  end
122
129
  end
@@ -154,6 +161,7 @@ module TSV
154
161
  end
155
162
 
156
163
  other_values.zip(overlaps).each do |v,overlap|
164
+ next if v.nil?
157
165
  if false && overlap == :key
158
166
  other_key = Array === v ? v : v.first
159
167
  elsif source.type == :list
@@ -1,10 +1,10 @@
1
1
  module TSV
2
- def self.change_key(source, new_key_field, identifiers: nil, one2one: false, stream: false, keep: false, persist_identifiers: nil)
2
+ def self.change_key(source, new_key_field, identifiers: nil, one2one: false, merge: true, stream: false, keep: false, persist_identifiers: nil)
3
3
  source = TSV::Parser.new source if String === source
4
4
  if identifiers && source.identify_field(new_key_field, strict: true).nil?
5
5
  identifiers = identifiers.nil? ? source.identifiers : identifiers
6
6
  new = source.attach(identifiers, fields: [new_key_field], insitu: false, one2one: true, persist_input: persist_identifiers)
7
- new = new.change_key(new_key_field, keep: keep, stream: stream, one2one: one2one)
7
+ new = new.change_key(new_key_field, keep: keep, stream: stream, one2one: one2one, merge: merge)
8
8
  return new
9
9
  end
10
10
 
@@ -17,7 +17,7 @@ module TSV
17
17
  [k, v]
18
18
  end
19
19
 
20
- stream ? transformer : transformer.tsv
20
+ stream ? transformer : transformer.tsv(merge: merge, one2one: one2one)
21
21
  end
22
22
 
23
23
  def change_key(*args, **kwargs)
@@ -2,7 +2,7 @@ require_relative 'parser'
2
2
  require_relative 'transformer'
3
3
  require_relative 'persist/fix_width_table'
4
4
  module TSV
5
- def self.index(tsv_file, target: 0, fields: nil, order: true, bar: nil, **kwargs)
5
+ def self.index(tsv_file, target: :key, fields: nil, order: true, bar: nil, **kwargs)
6
6
  persist, type, persist_update, data_persist = IndiferentHash.process_options kwargs,
7
7
  :persist, :persist_type, :persist_update, :data_persist,
8
8
  :persist => false, :persist_type => "HDB"
@@ -10,7 +10,7 @@ module TSV
10
10
 
11
11
  fields = :all if fields.nil?
12
12
 
13
- Persist.persist(tsv_file, type, kwargs.merge(target: target, fields: fields, persist: persist, update: persist_update, :prefix => "Index", :other_options => kwargs)) do |filename|
13
+ Persist.persist(tsv_file, type, kwargs.merge(target: target, fields: fields, persist: persist, update: persist_update, prefix: "Index", other_options: {fields: fields, target: target, order: order})) do |filename|
14
14
  if filename
15
15
  index = ScoutCabinet.open(filename, true, type)
16
16
  TSV.setup(index, :type => :single)
@@ -276,6 +276,7 @@ module TSV
276
276
  end
277
277
  @fix = fix
278
278
  @options, @key_field, @fields, @first_line, @preamble = TSV.parse_header(@stream, fix:fix, header_hash:header_hash, sep:sep)
279
+ @options[:filename] = file if Path.is_filename?(file)
279
280
  @options[:sep] = sep if @options[:sep].nil?
280
281
  @options.merge!(:key_field => @key_field, :fields => @fields)
281
282
  @type = @options[:type] || type
@@ -374,7 +375,7 @@ module TSV
374
375
  end
375
376
 
376
377
  def self.parse(stream, fix: true, header_hash: "#", sep: "\t", filename: nil, namespace: nil, unnamed: false, serializer: nil, **kwargs, &block)
377
- parser = TSV::Parser.new stream, fix: fix, header_hash: header_hash, sep: sep
378
+ parser = TSV::Parser === stream ? stream : TSV::Parser.new(stream, fix: fix, header_hash: header_hash, sep: sep)
378
379
 
379
380
  cast = kwargs[:cast]
380
381
  cast = parser.options[:cast] if cast.nil?
@@ -407,8 +408,9 @@ module TSV
407
408
 
408
409
  data = parser.traverse **kwargs, &block
409
410
  data.type = type
410
- data.filename = filename
411
- data.namespace = namespace
411
+ data.filename = filename || parser.options[:filename]
412
+ data.namespace = namespace || parser.options[:namespace]
413
+ data.identifiers = parser.options[:identifiers]
412
414
  data.unnamed = unnamed
413
415
  data.save_extension_attr_hash if data.respond_to?(:save_extension_attr_hash)
414
416
  data
@@ -3,12 +3,12 @@ require_relative 'persist/adapter'
3
3
 
4
4
  begin
5
5
  require_relative 'persist/tokyocabinet'
6
- rescue
6
+ rescue Exception
7
7
  end
8
8
 
9
9
  begin
10
10
  require_relative 'persist/tkrzw'
11
- rescue
11
+ rescue Exception
12
12
  end
13
13
 
14
14
  Persist.save_drivers[:tsv] = proc do |file,content|
@@ -130,6 +130,27 @@ module TSV
130
130
  res
131
131
  end
132
132
 
133
+ def to_double
134
+ return self if self.type == :double
135
+ res = self.annotate({})
136
+ self.with_unnamed do
137
+ transformer = Transformer.new self, res
138
+ transformer.type = :double
139
+ transformer.traverse do |k,v|
140
+ case self.type
141
+ when :single
142
+ [k, [[v]]]
143
+ when :list
144
+ [k, v.collect{|v| [v] }]
145
+ when :flat
146
+ [k, [v]]
147
+ end
148
+ end
149
+ end
150
+ res
151
+ end
152
+
153
+
133
154
  def to_single
134
155
  res = self.annotate({})
135
156
  transformer = Transformer.new self, res
@@ -46,7 +46,7 @@ module TSV
46
46
  def add_field(name = nil)
47
47
  through do |key, values|
48
48
  new_values = yield(key, values)
49
- new_values = [new_values] if type == :double and not Array === new_values
49
+ new_values = [new_values].compact if type == :double and not Array === new_values
50
50
 
51
51
  case
52
52
  when (values.nil? and (fields.nil? or fields.empty?))
data/lib/scout/tsv.rb CHANGED
@@ -28,9 +28,43 @@ module TSV
28
28
  {:key_field => key, :fields => fields}.merge(rest_options)
29
29
  end
30
30
 
31
+ class << self
32
+ alias original_setup setup
33
+
34
+ def setup(obj, *rest, &block)
35
+
36
+ if rest.length == 1 && String === rest.first
37
+ options = TSV.str2options(rest.first)
38
+ if Array === obj
39
+ default_value = case options[:type]
40
+ when :double, :flat, :list, nil
41
+ []
42
+ when :single
43
+ nil
44
+ end
45
+ obj = Misc.array2hash(obj, default_value)
46
+ end
47
+ original_setup(obj, options, &block)
48
+ else
49
+ if Array === obj
50
+ options = rest.first if Hash === rest.first
51
+ options ||= {}
52
+ default_value = case options[:type]
53
+ when :double, :flat, :list, nil
54
+ []
55
+ when :single
56
+ nil
57
+ end
58
+ obj = Misc.array2hash(obj, default_value)
59
+ end
60
+ original_setup(obj, *rest, &block)
61
+ end
62
+ end
63
+ end
64
+
31
65
  def self.str_setup(option_str, obj)
32
66
  options = TSV.str2options(option_str)
33
- setup(obj, options)
67
+ setup(obj, **options)
34
68
  end
35
69
 
36
70
  def self.open(file, options = {})
@@ -40,7 +74,17 @@ module TSV
40
74
  persist_options = IndiferentHash.add_defaults persist_options, :prefix => "TSV", :type => :HDB
41
75
 
42
76
  file = StringIO.new file if String === file && ! (Path === file) && file.index("\n")
43
- Persist.persist(file, persist_options[:type], persist_options.merge(:other_options => options)) do |filename|
77
+
78
+ source_name, other_options = case file
79
+ when StringIO
80
+ [file.inspect, options]
81
+ when TSV::Parser
82
+ [file.options[:filename], file.options]
83
+ else
84
+ [file, options]
85
+ end
86
+
87
+ Persist.persist(source_name, persist_options[:type], persist_options.merge(:other_options => other_options)) do |filename|
44
88
  if filename
45
89
  data = case persist_options[:type]
46
90
  when :HDB, :BDB
@@ -52,7 +96,7 @@ module TSV
52
96
  data = nil
53
97
  end
54
98
  options[:data] = data if data
55
- options[:filename] = file
99
+ options[:filename] = TSV::Parser === file ? file.options[:filename] : file
56
100
 
57
101
  if data
58
102
  Log.debug "TSV open #{Log.fingerprint file} into #{Log.fingerprint data}"
@@ -60,8 +104,12 @@ module TSV
60
104
  Log.debug "TSV open #{Log.fingerprint file}"
61
105
  end
62
106
 
63
- Open.open(file, grep: grep, invert_grep: invert_grep) do |f|
64
- TSV.parse(f, **options)
107
+ if TSV::Parser === file
108
+ TSV.parse(file, **options)
109
+ else
110
+ Open.open(file, grep: grep, invert_grep: invert_grep) do |f|
111
+ TSV.parse(f, **options)
112
+ end
65
113
  end
66
114
  end
67
115
  end
@@ -103,7 +103,14 @@ module Workflow
103
103
  end
104
104
 
105
105
  def task(name_and_type, &block)
106
- name, type = name_and_type.collect.first
106
+ case name_and_type
107
+ when Hash
108
+ name, type = name_and_type.collect.first
109
+ when Symbol
110
+ name, type = [name_and_type, :binary]
111
+ when String
112
+ name, type = [name_and_type, :binary]
113
+ end
107
114
  type = type.to_sym if String === type
108
115
  name = name.to_sym if String === name
109
116
  @tasks ||= IndiferentHash.setup({})
data/scout-gear.gemspec CHANGED
@@ -2,16 +2,16 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Juwelier::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: scout-gear 10.3.0 ruby lib
5
+ # stub: scout-gear 10.4.0 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "scout-gear".freeze
9
- s.version = "10.3.0"
9
+ s.version = "10.4.0"
10
10
 
11
11
  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib".freeze]
13
13
  s.authors = ["Miguel Vazquez".freeze]
14
- s.date = "2023-08-01"
14
+ s.date = "2023-08-09"
15
15
  s.description = "Temporary files, logs, path, resources, persistence, workflows, TSV, etc.".freeze
16
16
  s.email = "mikisvaz@gmail.com".freeze
17
17
  s.executables = ["scout".freeze]
@@ -167,7 +167,7 @@ Gem::Specification.new do |s|
167
167
  ]
168
168
  s.homepage = "http://github.com/mikisvaz/scout-gear".freeze
169
169
  s.licenses = ["MIT".freeze]
170
- s.rubygems_version = "3.4.13".freeze
170
+ s.rubygems_version = "3.5.0.dev".freeze
171
171
  s.summary = "basic gear for scouts".freeze
172
172
 
173
173
  s.specification_version = 4
@@ -310,6 +310,9 @@ row2 b bbb bbbb bb
310
310
 
311
311
  tsv = TSV.str_setup("ID~ValueA,ValueB#:type=:flat", {})
312
312
  assert_equal "ID", tsv.key_field
313
+
314
+ tsv = TSV.setup({}, "ID~ValueA,ValueB#:type=:flat")
315
+ assert_equal "ID", tsv.key_field
313
316
  end
314
317
 
315
318
  def test_cast_in_header
@@ -328,4 +331,31 @@ c 3
328
331
  assert_include tsv.to_s, ":cast=:to_f"
329
332
  end
330
333
  end
334
+
335
+ def test_open_persist_parser
336
+ content =<<-'EOF'
337
+ #: :sep=/\s+/#:type=:double#:merge=:concat
338
+ #Id ValueA ValueB OtherID
339
+ row1 a|aa|aaa b Id1|Id2
340
+ row2 A B Id3
341
+ row2 a a id3
342
+ EOF
343
+
344
+ tsv = TmpFile.with_file(content) do |filename|
345
+ parser = TSV::Parser.new filename
346
+ tsv = TSV.open(parser, :persist => true)
347
+ tsv.close
348
+ Persist::CONNECTIONS.clear
349
+ TSV.open(filename, :persist => true)
350
+ end
351
+
352
+ assert_equal "Id", tsv.key_field
353
+
354
+ assert tsv.respond_to?(:persistence_class)
355
+ assert_equal TokyoCabinet::HDB, tsv.persistence_class
356
+
357
+ assert_include tsv.keys, 'row1'
358
+ assert_include tsv.keys, 'row2'
359
+ end
360
+
331
361
  end
@@ -1,123 +1,129 @@
1
1
  require File.expand_path(__FILE__).sub(%r(/test/.*), '/test/test_helper.rb')
2
- require File.expand_path(__FILE__).sub(%r(.*/test/), '').sub(/test_(.*)\.rb/,'\1')
3
2
 
4
3
  require 'scout/tsv'
5
4
 
6
- class TestScoutTKRZW < Test::Unit::TestCase
7
- def _test_open
8
- TmpFile.with_file nil do |tmp|
9
- db = ScoutTKRZW.open(tmp, true)
10
- 1000.times do |i|
11
- db["foo#{i}"] = "bar#{i}"
12
- end
13
- assert_include db, 'foo1'
14
- assert_equal 1000, db.keys.length
15
-
16
- db.close
17
- TmpFile.with_file nil do |tmp_alt|
18
- Open.cp tmp, tmp_alt
19
- db2 = ScoutTKRZW.open(tmp_alt, false)
20
- assert_include db2, 'foo1'
21
- assert_equal 1000, db2.keys.length
5
+ begin
6
+ require File.expand_path(__FILE__).sub(%r(.*/test/), '').sub(/test_(.*)\.rb/,'\1')
7
+ class TestScoutTKRZW < Test::Unit::TestCase
8
+ def setup
9
+ end
10
+
11
+ def test_open
12
+ TmpFile.with_file nil do |tmp|
13
+ db = ScoutTKRZW.open(tmp, true)
14
+ 1000.times do |i|
15
+ db["foo#{i}"] = "bar#{i}"
16
+ end
17
+ assert_include db, 'foo1'
18
+ assert_equal 1000, db.keys.length
19
+
20
+ db.close
21
+ TmpFile.with_file nil do |tmp_alt|
22
+ Open.cp tmp, tmp_alt
23
+ db2 = ScoutTKRZW.open(tmp_alt, false)
24
+ assert_include db2, 'foo1'
25
+ assert_equal 1000, db2.keys.length
26
+ end
22
27
  end
23
28
  end
24
- end
25
29
 
26
- def _test_tkrzw
27
- content =<<-'EOF'
30
+ def test_tkrzw
31
+ content =<<-'EOF'
28
32
  #: :sep=/\s+/#:type=:double#:merge=:concat
29
33
  #Id ValueA ValueB OtherID
30
34
  row1 a|aa|aaa b Id1|Id2
31
35
  row2 A B Id3
32
36
  row2 a a id3
33
- EOF
37
+ EOF
34
38
 
35
- tsv = TmpFile.with_file(content) do |filename|
36
- Persist.persist(__method__, 'tkh') do
37
- TSV.open(filename)
39
+ tsv = TmpFile.with_file(content) do |filename|
40
+ Persist.persist(__method__, 'tkh') do
41
+ TSV.open(filename)
42
+ end
38
43
  end
39
- end
40
44
 
41
45
 
42
- assert_equal %w(a aa aaa), tsv["row1"][0]
46
+ assert_equal %w(a aa aaa), tsv["row1"][0]
43
47
 
44
- assert TSVAdapter === tsv
45
- assert TSV === tsv
46
- assert_include tsv.instance_variable_get(:@extension_attrs), :key_field
47
- assert_include tsv.instance_variable_get(:@extension_attrs), :serializer
48
+ assert TSVAdapter === tsv
49
+ assert TSV === tsv
50
+ assert_include tsv.instance_variable_get(:@extension_attrs), :key_field
51
+ assert_include tsv.instance_variable_get(:@extension_attrs), :serializer
48
52
 
49
- tsv.close
50
- tsv_loaded = assert_nothing_raised do
51
- TmpFile.with_file(content) do |filename|
52
- Persist.persist(__method__, 'tkh') do
53
- raise
53
+ tsv.close
54
+ tsv_loaded = assert_nothing_raised do
55
+ TmpFile.with_file(content) do |filename|
56
+ Persist.persist(__method__, 'tkh') do
57
+ raise
58
+ end
54
59
  end
55
60
  end
61
+
62
+ assert_equal %w(a aa aaa), tsv_loaded["row1"][0]
56
63
  end
57
64
 
58
- assert_equal %w(a aa aaa), tsv_loaded["row1"][0]
59
- end
65
+ def __test_benchmark1
66
+ TmpFile.with_file nil do |tmp|
67
+
68
+ Misc.benchmark(1000) do
69
+ db = ScoutTKRZW.open(tmp, true)
70
+ 1000.times do |i|
71
+ db["foo#{i}"] = "bar#{i}"
72
+ end
73
+ 10.times do
74
+ db.keys
75
+ end
76
+ 10.times do |i|
77
+ db["foo#{i}"]
78
+ end
79
+ Open.rm tmp
80
+ end
81
+
82
+ Misc.benchmark(1000) do
83
+ db = ScoutCabinet.open(tmp, true)
84
+ 1000.times do |i|
85
+ db["foo#{i}"] = "bar#{i}"
86
+ end
87
+ 10.times do
88
+ db.keys
89
+ end
90
+ 10.times do |i|
91
+ db["foo#{i}"]
92
+ end
93
+ db.close
94
+ Open.rm tmp
95
+ end
96
+ end
97
+ end
60
98
 
61
- def __test_benchmark1
62
- TmpFile.with_file nil do |tmp|
99
+ def test_benchmark2
100
+ TmpFile.with_file nil do |tmp|
63
101
 
64
- Misc.benchmark(1000) do
65
102
  db = ScoutTKRZW.open(tmp, true)
66
- 1000.times do |i|
103
+ 10000.times do |i|
67
104
  db["foo#{i}"] = "bar#{i}"
68
105
  end
69
- 10.times do
70
- db.keys
71
- end
72
- 10.times do |i|
73
- db["foo#{i}"]
106
+
107
+ Misc.benchmark(1000) do
108
+ 100.times do |i|
109
+ db["foo#{i}"]
110
+ end
74
111
  end
75
- Open.rm tmp
76
- end
77
112
 
78
- Misc.benchmark(1000) do
113
+ Open.rm tmp
79
114
  db = ScoutCabinet.open(tmp, true)
80
- 1000.times do |i|
115
+ 10000.times do |i|
81
116
  db["foo#{i}"] = "bar#{i}"
82
117
  end
83
- 10.times do
84
- db.keys
85
- end
86
- 10.times do |i|
87
- db["foo#{i}"]
118
+ Misc.benchmark(1000) do
119
+ 100.times do |i|
120
+ db["foo#{i}"]
121
+ end
88
122
  end
89
- db.close
90
- Open.rm tmp
91
123
  end
92
124
  end
93
- end
94
125
 
95
- def test_benchmark2
96
- TmpFile.with_file nil do |tmp|
97
-
98
- db = ScoutTKRZW.open(tmp, true)
99
- 10000.times do |i|
100
- db["foo#{i}"] = "bar#{i}"
101
- end
102
-
103
- Misc.benchmark(1000) do
104
- 100.times do |i|
105
- db["foo#{i}"]
106
- end
107
- end
108
-
109
- Open.rm tmp
110
- db = ScoutCabinet.open(tmp, true)
111
- 10000.times do |i|
112
- db["foo#{i}"] = "bar#{i}"
113
- end
114
- Misc.benchmark(1000) do
115
- 100.times do |i|
116
- db["foo#{i}"]
117
- end
118
- end
119
- end
120
126
  end
121
-
127
+ rescue Exception
122
128
  end
123
129
 
@@ -117,4 +117,16 @@ row2 A2|A22 B2|B22
117
117
  tsv = TSV.open(content)
118
118
  assert_equal %w(A1 A11 B1 B11), tsv.to_flat["row1"]
119
119
  end
120
+
121
+ def test_to_double
122
+ content =<<-EOF
123
+ #: :sep=" "
124
+ #ID ValueA ValueB
125
+ row1 A1 B1
126
+ row2 A2 B2
127
+ EOF
128
+
129
+ tsv = TSV.open(content)
130
+ assert_equal %w(A1), tsv.to_double["row1"]["ValueA"]
131
+ end
120
132
  end
@@ -43,5 +43,25 @@ row2 AA BB Id33
43
43
  assert_equal %w(c cc ccc), tsv["row1"]["ValueC"]
44
44
  assert_equal %w(C CC), tsv["row2"]["ValueC"]
45
45
  end
46
+
47
+ def test_add_field_double_empty
48
+ content =<<-'EOF'
49
+ #: :sep=/\s+/#:type=:double
50
+ #Id ValueA ValueB OtherID
51
+ row1 a|aa|aaa b Id1|Id2
52
+ row2 A B Id3
53
+ row2 AA BB Id33
54
+ EOF
55
+
56
+ tsv = TmpFile.with_file(content) do |filename|
57
+ TSV.open(filename)
58
+ end
59
+
60
+ tsv.add_field "ValueC" do |k,v|
61
+ nil
62
+ end
63
+
64
+ assert_equal %w(), tsv["row1"]["ValueC"]
65
+ end
46
66
  end
47
67
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: scout-gear
3
3
  version: !ruby/object:Gem::Version
4
- version: 10.3.0
4
+ version: 10.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Miguel Vazquez
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-08-01 00:00:00.000000000 Z
11
+ date: 2023-08-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: scout-essentials
@@ -295,7 +295,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
295
295
  - !ruby/object:Gem::Version
296
296
  version: '0'
297
297
  requirements: []
298
- rubygems_version: 3.4.13
298
+ rubygems_version: 3.5.0.dev
299
299
  signing_key:
300
300
  specification_version: 4
301
301
  summary: basic gear for scouts