inifile 2.0.2 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +1 -0
- data/README.md +23 -1
- data/Rakefile +1 -1
- data/inifile.gemspec +24 -0
- data/lib/inifile.rb +277 -201
- data/test/data/bad_2.ini +11 -0
- data/test/data/comment.ini +1 -1
- data/test/data/continuation.ini +6 -0
- data/test/data/good.ini +4 -4
- data/test/data/section.ini +4 -0
- data/test/test_inifile.rb +132 -63
- metadata +65 -41
data/test/data/bad_2.ini
ADDED
data/test/data/comment.ini
CHANGED
data/test/data/good.ini
CHANGED
@@ -3,15 +3,15 @@ one = 1
|
|
3
3
|
two = 2
|
4
4
|
|
5
5
|
[section_two]
|
6
|
-
three = 3
|
6
|
+
three = -3
|
7
7
|
multi = multiline \
|
8
8
|
support
|
9
9
|
|
10
10
|
; comments should be ignored
|
11
11
|
[section three]
|
12
|
-
four =
|
13
|
-
five=
|
14
|
-
six =6
|
12
|
+
four =true
|
13
|
+
five=false # comments can go here
|
14
|
+
six =6.0 ; and here, too
|
15
15
|
|
16
16
|
[section_four]
|
17
17
|
[section_five]
|
data/test/test_inifile.rb
CHANGED
@@ -11,13 +11,13 @@ class TestIniFile < Test::Unit::TestCase
|
|
11
11
|
def setup
|
12
12
|
@ini_file = IniFile.new(:filename => 'test/data/good.ini')
|
13
13
|
@contents = [
|
14
|
-
['section_one', 'one',
|
15
|
-
['section_one', 'two',
|
16
|
-
['section_two', 'three',
|
14
|
+
['section_one', 'one', 1],
|
15
|
+
['section_one', 'two', 2],
|
16
|
+
['section_two', 'three', -3],
|
17
17
|
['section_two', 'multi', "multiline support"],
|
18
|
-
['section three', 'four',
|
19
|
-
['section three', 'five',
|
20
|
-
['section three', 'six',
|
18
|
+
['section three', 'four', true],
|
19
|
+
['section three', 'five', false],
|
20
|
+
['section three', 'six', 6.0],
|
21
21
|
['section_five', 'seven and eight', '7 & 8']
|
22
22
|
].sort
|
23
23
|
|
@@ -84,7 +84,7 @@ class TestIniFile < Test::Unit::TestCase
|
|
84
84
|
def test_delete_section
|
85
85
|
assert_nil @ini_file.delete_section('section_nil')
|
86
86
|
|
87
|
-
h = {'one' =>
|
87
|
+
h = {'one' => 1, 'two' => 2}
|
88
88
|
assert_equal true, @ini_file.has_section?('section_one')
|
89
89
|
assert_equal h, @ini_file.delete_section('section_one')
|
90
90
|
assert_equal false, @ini_file.has_section?('section_one')
|
@@ -148,7 +148,7 @@ class TestIniFile < Test::Unit::TestCase
|
|
148
148
|
assert @ini_file.eql?(@ini_file)
|
149
149
|
assert @ini_file.eql?(@ini_file.clone)
|
150
150
|
assert !@ini_file.eql?('string')
|
151
|
-
assert !@ini_file.eql?(IniFile.new(''))
|
151
|
+
assert !@ini_file.eql?(IniFile.new(:content => ''))
|
152
152
|
end
|
153
153
|
|
154
154
|
def test_freeze
|
@@ -179,18 +179,18 @@ class TestIniFile < Test::Unit::TestCase
|
|
179
179
|
|
180
180
|
def test_index
|
181
181
|
expected = {
|
182
|
-
'one' =>
|
183
|
-
'two' =>
|
182
|
+
'one' => 1,
|
183
|
+
'two' => 2
|
184
184
|
}
|
185
185
|
assert_equal expected, @ini_file[:section_one]
|
186
186
|
|
187
|
-
expected = {'three' =>
|
187
|
+
expected = {'three' => -3, 'multi' => "multiline support"}
|
188
188
|
assert_equal expected, @ini_file['section_two']
|
189
189
|
|
190
190
|
expected = {
|
191
|
-
'four' =>
|
192
|
-
'five' =>
|
193
|
-
'six' =>
|
191
|
+
'four' => true,
|
192
|
+
'five' => false,
|
193
|
+
'six' => 6.0,
|
194
194
|
}
|
195
195
|
assert_equal expected, @ini_file['section three']
|
196
196
|
|
@@ -214,13 +214,11 @@ class TestIniFile < Test::Unit::TestCase
|
|
214
214
|
|
215
215
|
def test_match
|
216
216
|
expected = {
|
217
|
-
"section_two" =>
|
218
|
-
|
219
|
-
"three"=>"3", "multi"=>"multiline support"
|
217
|
+
"section_two" => {
|
218
|
+
"three" => -3, "multi" => "multiline support"
|
220
219
|
},
|
221
|
-
|
222
|
-
|
223
|
-
"four"=>"4", "five"=>"5", "six"=>"6"
|
220
|
+
"section three" => {
|
221
|
+
"four" => true, "five"=> false, "six" => 6.0
|
224
222
|
}
|
225
223
|
}
|
226
224
|
assert_equal expected, @ini_file.match(/(two|three)/)
|
@@ -245,8 +243,8 @@ class TestIniFile < Test::Unit::TestCase
|
|
245
243
|
|
246
244
|
ini_file = IniFile.new(:filename => 'test/data/param.ini', :parameter => ':')
|
247
245
|
assert ini_file.has_section?('section_one')
|
248
|
-
assert_equal
|
249
|
-
assert_equal
|
246
|
+
assert_equal 1, ini_file['section_one']['one']
|
247
|
+
assert_equal 2, ini_file['section_one']['two']
|
250
248
|
|
251
249
|
# make sure we error out on files with bad lines
|
252
250
|
assert_raise(IniFile::Error) {IniFile.new :filename => 'test/data/bad_1.ini'}
|
@@ -254,7 +252,7 @@ class TestIniFile < Test::Unit::TestCase
|
|
254
252
|
|
255
253
|
def test_initialize_from_string_without_ending_newline
|
256
254
|
content = "[section_one]\n foo=bar"
|
257
|
-
ini_file = IniFile.new(content)
|
255
|
+
ini_file = IniFile.new(:content => content)
|
258
256
|
assert ini_file.has_section?('section_one')
|
259
257
|
assert_equal 'bar', ini_file['section_one']['foo']
|
260
258
|
end
|
@@ -262,7 +260,7 @@ class TestIniFile < Test::Unit::TestCase
|
|
262
260
|
def test_initialize_from_string
|
263
261
|
content = File.read('test/data/good.ini')
|
264
262
|
|
265
|
-
ini_file = IniFile.new(content, :comment => ';')
|
263
|
+
ini_file = IniFile.new(:content => content, :comment => ';')
|
266
264
|
assert ini_file.has_section?('section_one')
|
267
265
|
assert ini_file.has_section?('section_two')
|
268
266
|
assert ini_file.has_section?('section three')
|
@@ -272,6 +270,35 @@ class TestIniFile < Test::Unit::TestCase
|
|
272
270
|
assert_equal '7 & 8', ini_file['section_five']['seven and eight']
|
273
271
|
end
|
274
272
|
|
273
|
+
def test_initialize_from_hash
|
274
|
+
hash = {
|
275
|
+
'section one' => {
|
276
|
+
'foo' => 'bar',
|
277
|
+
'baz' => 'buz'
|
278
|
+
},
|
279
|
+
'colors' => {
|
280
|
+
'perrywinkle' => '7e6ff3',
|
281
|
+
'steelblue' => '4682b4'
|
282
|
+
},
|
283
|
+
'empty' => nil
|
284
|
+
}
|
285
|
+
|
286
|
+
ini_file = IniFile.new(:content => hash)
|
287
|
+
assert ini_file.has_section?('section one')
|
288
|
+
assert ini_file.has_section?('colors')
|
289
|
+
assert ini_file.has_section?('empty')
|
290
|
+
|
291
|
+
assert_equal %w[baz foo], ini_file['section one'].keys.sort
|
292
|
+
assert_equal 'bar', ini_file['section one']['foo']
|
293
|
+
assert_equal 'buz', ini_file['section one']['baz']
|
294
|
+
|
295
|
+
assert_equal %w[perrywinkle steelblue], ini_file['colors'].keys.sort
|
296
|
+
assert_equal '7e6ff3', ini_file['colors']['perrywinkle']
|
297
|
+
assert_equal '4682b4', ini_file['colors']['steelblue']
|
298
|
+
|
299
|
+
assert_empty ini_file['empty']
|
300
|
+
end
|
301
|
+
|
275
302
|
def test_sections
|
276
303
|
expected = [
|
277
304
|
'section_one', 'section_two', 'section three',
|
@@ -323,8 +350,8 @@ class TestIniFile < Test::Unit::TestCase
|
|
323
350
|
assert_equal 42, @ini_file['section_one']['two']
|
324
351
|
|
325
352
|
@ini_file.read
|
326
|
-
assert_equal
|
327
|
-
assert_equal
|
353
|
+
assert_equal 1, @ini_file['section_one']['one']
|
354
|
+
assert_equal 2, @ini_file['section_one']['two']
|
328
355
|
|
329
356
|
@ini_file.read(:filename => 'test/data/mixed_comment.ini')
|
330
357
|
assert_equal false, @ini_file.has_section?('section_two')
|
@@ -392,61 +419,73 @@ class TestIniFile < Test::Unit::TestCase
|
|
392
419
|
assert_equal expected, multiple
|
393
420
|
|
394
421
|
multiple = ini_file['empty_lines']
|
395
|
-
expected = {'empty' =>
|
422
|
+
expected = {'empty' => nil, 'not_empty' => 'full'}
|
396
423
|
assert_equal expected, multiple
|
397
424
|
end
|
398
425
|
|
399
426
|
def test_merge
|
400
427
|
ini_file = @ini_file.merge(IniFile.load("test/data/merge.ini"))
|
401
|
-
assert_equal
|
402
|
-
assert_equal
|
428
|
+
assert_equal 3, ini_file['section_one']['one']
|
429
|
+
assert_equal 2, ini_file['section_one']['two']
|
403
430
|
|
404
431
|
# make sure that the rest haven't changed
|
405
|
-
assert_equal
|
432
|
+
assert_equal(-3, ini_file['section_two']['three'])
|
406
433
|
|
407
434
|
# and that we got any additional sections too
|
408
|
-
assert_equal
|
435
|
+
assert_equal 5, ini_file['section_five']['five']
|
409
436
|
|
410
437
|
# original object is unchanged
|
411
|
-
assert_equal
|
438
|
+
assert_equal 1, @ini_file['section_one']['one']
|
412
439
|
end
|
413
440
|
|
414
441
|
def test_merge_hash
|
415
442
|
ini_file = @ini_file.merge({
|
416
|
-
'section_one' => { 'one' =>
|
417
|
-
'section_five' => { 'five' =>
|
443
|
+
'section_one' => { 'one' => 3 },
|
444
|
+
'section_five' => { 'five' => 5 }
|
418
445
|
})
|
419
|
-
assert_equal
|
420
|
-
assert_equal
|
446
|
+
assert_equal 3, ini_file['section_one']['one']
|
447
|
+
assert_equal 2, ini_file['section_one']['two']
|
421
448
|
|
422
449
|
# make sure that the rest haven't changed
|
423
|
-
assert_equal
|
450
|
+
assert_equal(-3, ini_file['section_two']['three'])
|
424
451
|
|
425
452
|
# and that we got any additional sections too
|
426
|
-
assert_equal
|
453
|
+
assert_equal 5, ini_file['section_five']['five']
|
427
454
|
|
428
455
|
# original object is unchanged
|
429
|
-
assert_equal
|
456
|
+
assert_equal 1, @ini_file['section_one']['one']
|
430
457
|
end
|
431
458
|
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
assert_equal ini_file['www.substancia.com AutoHTTPAgent (ver *)']['Browser'], "Subst\xE2ncia".force_encoding('ISO-8859-1')
|
436
|
-
end
|
459
|
+
def test_merge_invalid_hash
|
460
|
+
bad_hash = { 'section_one' => [1, 2, 3, 4] }
|
461
|
+
assert_raise(IniFile::Error) { @ini_file.merge(bad_hash) }
|
437
462
|
|
438
|
-
|
439
|
-
|
440
|
-
File.delete tmp if Kernel.test(?f, tmp)
|
463
|
+
bad_hash = { 'foo' => 'bar' }
|
464
|
+
assert_raise(IniFile::Error) { @ini_file.merge(bad_hash) }
|
441
465
|
|
442
|
-
|
443
|
-
|
466
|
+
not_a_hash = [['section_one', ['foo','bar'], ['baz', 'buz']]]
|
467
|
+
assert_raise(IniFile::Error) { @ini_file.merge(not_a_hash) }
|
444
468
|
|
445
|
-
|
469
|
+
ini_file = @ini_file.merge nil
|
470
|
+
assert ini_file.eql?(@ini_file)
|
471
|
+
end
|
446
472
|
|
447
|
-
|
448
|
-
|
449
|
-
|
473
|
+
def test_parse_encoding
|
474
|
+
ini_file = IniFile.new(:filename => "test/data/browscap.ini", :encoding => 'ISO-8859-1')
|
475
|
+
assert_equal ini_file['www.substancia.com AutoHTTPAgent (ver *)']['Browser'], "Subst\xE2ncia".force_encoding('ISO-8859-1')
|
476
|
+
end
|
477
|
+
|
478
|
+
def test_write_encoding
|
479
|
+
tmp = 'test/data/tmp.ini'
|
480
|
+
File.delete tmp if Kernel.test(?f, tmp)
|
481
|
+
|
482
|
+
@ini_file = IniFile.new(:filename => tmp, :encoding => 'UTF-8')
|
483
|
+
@ini_file['testutf-8'] = {"utf-8" => "appr\u20accier"}
|
484
|
+
|
485
|
+
@ini_file.save(:filename => tmp)
|
486
|
+
|
487
|
+
test = File.open(tmp)
|
488
|
+
assert_equal test.external_encoding.to_s, 'UTF-8'
|
450
489
|
end
|
451
490
|
|
452
491
|
def test_value_escaping
|
@@ -461,32 +500,62 @@ class TestIniFile < Test::Unit::TestCase
|
|
461
500
|
assert_equal %Q{Escaping works\tinside quoted strings!}, escaped['quoted']
|
462
501
|
end
|
463
502
|
|
503
|
+
# disabling escaping is no longer supported
|
464
504
|
def test_value_escaping_disabled
|
465
505
|
ini_file = IniFile.load('test/data/escape.ini', :escape => false)
|
466
506
|
escaped = ini_file['escaped']
|
467
507
|
|
468
|
-
assert_equal %
|
469
|
-
assert_equal %
|
470
|
-
assert_equal %
|
471
|
-
assert_equal %Q{Who'd be silly enough to put
|
472
|
-
assert_equal %q{This string
|
473
|
-
assert_equal %
|
508
|
+
assert_equal %Q{There is a tab\tcharacter in here somewhere}, escaped['tabs']
|
509
|
+
assert_equal %Q{Who uses these anyways?\r}, escaped['carriage return']
|
510
|
+
assert_equal %Q{Trust newline!\nAlways there when you need him.\nSplittin' those lines.}, escaped['newline']
|
511
|
+
assert_equal %Q{Who'd be silly enough to put\0 a null character in the middle of a string? Stroustrup would not approve!}, escaped['null']
|
512
|
+
assert_equal %q{This string \t contains \n no \r special \0 characters!}, escaped['backslash']
|
513
|
+
assert_equal %Q{Escaping works\tinside quoted strings!}, escaped['quoted']
|
474
514
|
end
|
475
515
|
|
476
516
|
def test_global_section
|
477
517
|
ini_file = IniFile.load('test/data/global.ini')
|
478
518
|
|
479
519
|
assert_equal %w[global], ini_file.sections
|
480
|
-
assert_equal
|
481
|
-
assert_equal
|
520
|
+
assert_equal 1, ini_file['global']['one']
|
521
|
+
assert_equal 2, ini_file['global']['two']
|
482
522
|
end
|
483
523
|
|
484
524
|
def test_default_global_section
|
485
525
|
ini_file = IniFile.load('test/data/global.ini', :default => 'nonce')
|
486
526
|
|
487
527
|
assert_equal %w[nonce], ini_file.sections
|
488
|
-
assert_equal
|
489
|
-
assert_equal
|
528
|
+
assert_equal 1, ini_file['nonce']['one']
|
529
|
+
assert_equal 2, ini_file['nonce']['two']
|
530
|
+
end
|
531
|
+
|
532
|
+
def test_unescaped_section_header_as_value
|
533
|
+
ini_file = IniFile.load('test/data/section.ini')
|
534
|
+
|
535
|
+
assert_equal %w[section_one], ini_file.sections
|
536
|
+
assert_equal '[value]', ini_file['section_one']['one']
|
537
|
+
assert_equal 2, ini_file['section_one']['two']
|
538
|
+
end
|
539
|
+
|
540
|
+
def test_unmatched_quotes
|
541
|
+
# missing a closing quote should raise an error
|
542
|
+
assert_raise(IniFile::Error) { IniFile.load 'test/data/bad_2.ini' }
|
543
|
+
end
|
544
|
+
|
545
|
+
def test_continuation_at_end_of_file
|
546
|
+
ini_file = IniFile.load('test/data/continuation.ini')
|
547
|
+
|
548
|
+
assert_equal 1, ini_file['section_one']['one']
|
549
|
+
assert_equal 2, ini_file['section_one']['two']
|
550
|
+
|
551
|
+
assert_equal 'here is the last value', ini_file['section_two']['end-of-file']
|
552
|
+
end
|
553
|
+
|
554
|
+
def test_empty_comment_string
|
555
|
+
ini_file = IniFile.load('test/data/merge.ini', :comment => nil)
|
556
|
+
|
557
|
+
assert_equal 3, ini_file['section_one']['one']
|
558
|
+
assert_equal 5, ini_file['section_five']['five']
|
490
559
|
end
|
491
560
|
end
|
492
561
|
|
metadata
CHANGED
@@ -1,80 +1,104 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: inifile
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
5
|
-
prerelease:
|
4
|
+
version: 3.0.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Tim Pease
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2014-08-01 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: bones-git
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - "~>"
|
20
18
|
- !ruby/object:Gem::Version
|
21
|
-
version: '
|
19
|
+
version: '1.3'
|
22
20
|
type: :development
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - "~>"
|
28
25
|
- !ruby/object:Gem::Version
|
29
|
-
version: '
|
26
|
+
version: '1.3'
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: bones
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
|
-
- -
|
31
|
+
- - ">="
|
36
32
|
- !ruby/object:Gem::Version
|
37
|
-
version: 3.8.
|
33
|
+
version: 3.8.1
|
38
34
|
type: :development
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
|
-
- -
|
38
|
+
- - ">="
|
44
39
|
- !ruby/object:Gem::Version
|
45
|
-
version: 3.8.
|
46
|
-
description:
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
40
|
+
version: 3.8.1
|
41
|
+
description: |-
|
42
|
+
Although made popular by Windows, INI files can be used on any system thanks
|
43
|
+
to their flexibility. They allow a program to store configuration data, which
|
44
|
+
can then be easily parsed and changed. Two notable systems that use the INI
|
45
|
+
format are Samba and Trac.
|
46
|
+
|
47
|
+
More information about INI files can be found on the [Wikipedia Page](http://en.wikipedia.org/wiki/INI_file).
|
48
|
+
|
49
|
+
### Properties
|
50
|
+
|
51
|
+
The basic element contained in an INI file is the property. Every property has
|
52
|
+
a name and a value, delimited by an equals sign *=*. The name appears to the
|
53
|
+
left of the equals sign and the value to the right.
|
54
|
+
|
55
|
+
name=value
|
56
|
+
|
57
|
+
### Sections
|
58
|
+
|
59
|
+
Section declarations start with *[* and end with *]* as in `[section1]` and
|
60
|
+
`[section2]` shown in the example below. The section declaration marks the
|
61
|
+
beginning of a section. All properties after the section declaration will be
|
62
|
+
associated with that section.
|
63
|
+
|
64
|
+
### Comments
|
65
|
+
|
66
|
+
All lines beginning with a semicolon *;* or a number sign *#* are considered
|
67
|
+
to be comments. Comment lines are ignored when parsing INI files.
|
68
|
+
|
69
|
+
### Example File Format
|
70
|
+
|
71
|
+
A typical INI file might look like this:
|
72
|
+
|
73
|
+
[section1]
|
74
|
+
; some comment on section1
|
75
|
+
var1 = foo
|
76
|
+
var2 = doodle
|
77
|
+
var3 = multiline values \
|
78
|
+
are also possible
|
79
|
+
|
80
|
+
[section2]
|
81
|
+
# another comment
|
82
|
+
var1 = baz
|
83
|
+
var2 = shoodle
|
63
84
|
email: tim.pease@gmail.com
|
64
85
|
executables: []
|
65
86
|
extensions: []
|
66
87
|
extra_rdoc_files:
|
67
88
|
- History.txt
|
68
89
|
files:
|
69
|
-
- .gitignore
|
70
|
-
- .travis.yml
|
90
|
+
- ".gitignore"
|
91
|
+
- ".travis.yml"
|
71
92
|
- History.txt
|
72
93
|
- README.md
|
73
94
|
- Rakefile
|
95
|
+
- inifile.gemspec
|
74
96
|
- lib/inifile.rb
|
75
97
|
- test/data/bad_1.ini
|
98
|
+
- test/data/bad_2.ini
|
76
99
|
- test/data/browscap.ini
|
77
100
|
- test/data/comment.ini
|
101
|
+
- test/data/continuation.ini
|
78
102
|
- test/data/escape.ini
|
79
103
|
- test/data/global.ini
|
80
104
|
- test/data/good.ini
|
@@ -82,32 +106,32 @@ files:
|
|
82
106
|
- test/data/mixed_comment.ini
|
83
107
|
- test/data/multiline.ini
|
84
108
|
- test/data/param.ini
|
109
|
+
- test/data/section.ini
|
85
110
|
- test/test_inifile.rb
|
86
111
|
homepage: http://rubygems.org/gems/inifile
|
87
112
|
licenses: []
|
113
|
+
metadata: {}
|
88
114
|
post_install_message:
|
89
115
|
rdoc_options:
|
90
|
-
- --main
|
116
|
+
- "--main"
|
91
117
|
- README.md
|
92
118
|
require_paths:
|
93
119
|
- lib
|
94
120
|
required_ruby_version: !ruby/object:Gem::Requirement
|
95
|
-
none: false
|
96
121
|
requirements:
|
97
|
-
- -
|
122
|
+
- - ">="
|
98
123
|
- !ruby/object:Gem::Version
|
99
124
|
version: '0'
|
100
125
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
101
|
-
none: false
|
102
126
|
requirements:
|
103
|
-
- -
|
127
|
+
- - ">="
|
104
128
|
- !ruby/object:Gem::Version
|
105
129
|
version: '0'
|
106
130
|
requirements: []
|
107
131
|
rubyforge_project: inifile
|
108
|
-
rubygems_version:
|
132
|
+
rubygems_version: 2.2.2
|
109
133
|
signing_key:
|
110
|
-
specification_version:
|
134
|
+
specification_version: 4
|
111
135
|
summary: INI file reader and writer
|
112
136
|
test_files:
|
113
137
|
- test/test_inifile.rb
|