dot-properties 0.1.0 → 0.1.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: fd35e7534f70196e5b8a263cdeb5874b9e6bb394d9e623c5a1e301384f1932fa
4
+ data.tar.gz: 9077f79007f9588eb42896917bef78828a3ca536a97d28dadd33000d3c9db9c9
5
+ SHA512:
6
+ metadata.gz: 0c71ed6de04cb4db7ee34b67b64707f092e339b041ba788270b6085e0007a279966f66ff77899788027c75a913e830fca9bc69c790988414579b645fbc0aa231
7
+ data.tar.gz: ed8cb7d21c7148237b9afd497f979d1aa5b2e4558a895de98663cc68cd5398942ca0d4832f4212912de7972392b772f5f2b333b069239028ef62c0bb455318c0
data/.travis.yml CHANGED
@@ -1,6 +1,9 @@
1
1
  language: ruby
2
+ before_install:
3
+ - gem install bundler
2
4
  rvm:
3
- - 1.9.2
4
5
  - 1.9.3
5
6
  - 2.0.0
6
- - jruby-19mode
7
+ - 2.1.5
8
+ - 2.2.3
9
+ - jruby
data/README.md CHANGED
@@ -13,7 +13,7 @@ Reads and writes [Java .properties files](http://en.wikipedia.org/wiki/.properti
13
13
 
14
14
  Add this line to your application's Gemfile:
15
15
 
16
- gem 'dot_properties'
16
+ gem 'dot-properties'
17
17
 
18
18
  And then execute:
19
19
 
@@ -28,7 +28,7 @@ Or install it yourself as:
28
28
  require 'dot_properties'
29
29
 
30
30
  # Load a .properties file
31
- props = DotProperties.new('sample.properties')
31
+ props = DotProperties.load('sample.properties')
32
32
 
33
33
  # Get a value
34
34
  props['foo']
@@ -58,9 +58,12 @@ See the spec tests and fixture data for more examples.
58
58
 
59
59
  ## History
60
60
 
61
+ - <b>0.1.4</b> - Update bundler dependency due to [CVE-2019-3881](https://github.com/advisories/GHSA-g98m-96g9-wfjq)
62
+ - <b>0.1.3</b> - Explicitly require 'forwardable' (jruby / mri2.x compat) (from @billdueber)
63
+ - <b>0.1.2</b> - Improved escaping and Unicode (\uXXXX) support
64
+ - <b>0.1.1</b> - Fix mishandled keys with leading whitespace (#1)
61
65
  - <b>0.1.0</b> - Initial release
62
66
 
63
67
  ## Copyright
64
68
 
65
69
  Copyright (c) 2013 Michael B. Klein. See LICENSE.txt for further details.
66
-
@@ -18,7 +18,7 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
- spec.add_development_dependency "bundler", "~> 1.3"
21
+ spec.add_dependency "bundler", ">= 2.2.33"
22
22
  spec.add_development_dependency "rake"
23
23
  spec.add_development_dependency "rspec"
24
24
  spec.add_development_dependency "rdoc", ">= 2.4.2"
@@ -1,3 +1,3 @@
1
1
  class DotProperties
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.4"
3
3
  end
@@ -1,4 +1,5 @@
1
1
  require "dot_properties/version"
2
+ require 'forwardable'
2
3
 
3
4
  class DotProperties
4
5
  extend Forwardable
@@ -111,7 +112,7 @@ class DotProperties
111
112
  if item[:value].nil? or item[:value].empty?
112
113
  escape(item[:key])
113
114
  else
114
- "#{escape(item[:key])}#{item[:delimiter]}#{item[:value]}"
115
+ "#{escape(item[:key])}#{item[:delimiter]}#{encode(item[:value])}"
115
116
  end
116
117
  else
117
118
  item[:value]
@@ -124,8 +125,8 @@ class DotProperties
124
125
  elsif item =~ /^\s*$/
125
126
  { type: :blank, value: item }
126
127
  else
127
- key, delimiter, value = item.split /(\s*(?<!\\)[\s:=]\s*)/, 2
128
- { type: :value, key: unescape(key), delimiter: delimiter, value: value.to_s.gsub(/\\\n\s*/,'') }
128
+ key, delimiter, value = item.strip.split /(\s*(?<!\\)[\s:=]\s*)/, 2
129
+ { type: :value, key: unescape(decode(key)), delimiter: delimiter, value: unescape(decode(value.to_s.gsub(/\\\n\s*/,''))) }
129
130
  end
130
131
  end
131
132
 
@@ -133,12 +134,20 @@ class DotProperties
133
134
  @content.find { |item| item[:type] == :value and item[:key] == key }
134
135
  end
135
136
 
136
- def escape(key)
137
- key.gsub(/[\s:=]/) { |m| "\\#{m}" }
137
+ def encode(v)
138
+ v.gsub(/[\r\n]/) { |m| "\\u#{'%4.4X' % m.codepoints.to_a}" }.gsub(/\\/,'\\'*3)
138
139
  end
139
140
 
140
- def unescape(key)
141
- key.gsub(/\\/,'')
141
+ def decode(v)
142
+ v.gsub(/\\u([0-9A-Fa-f]{4})/) { |m| $1.hex.chr('UTF-8') }
143
+ end
144
+
145
+ def escape(v)
146
+ v.gsub(/[\s:=\\]/) { |m| "\\#{m}" }
147
+ end
148
+
149
+ def unescape(v)
150
+ v.gsub(/(?<!\\)\\/,'')
142
151
  end
143
152
 
144
153
  end
@@ -10,15 +10,15 @@ describe DotProperties do
10
10
  let(:propfile) { File.expand_path('../fixtures/sample.properties', __FILE__) }
11
11
  subject { DotProperties.load(propfile) }
12
12
 
13
- let(:properties) { 16 }
14
- let(:comments) { 14 }
15
- let(:blanks) { 8 }
13
+ let(:properties) { 21 }
14
+ let(:comments) { 16 }
15
+ let(:blanks) { 11 }
16
16
 
17
17
  it { should be_an_instance_of(DotProperties) }
18
18
 
19
19
  describe "values" do
20
20
  it "should have the right number of properties" do
21
- expect(subject.keys.length).to eq(16)
21
+ expect(subject.keys.length).to eq(properties)
22
22
  end
23
23
 
24
24
  it "should have the right values" do
@@ -32,6 +32,9 @@ describe DotProperties do
32
32
  expect(subject['foo bar:baz= quux']).to eq('this is getting ridiculous')
33
33
  expect(subject['lots of fruit']).to eq('apple, peach, kiwi, mango, banana, strawberry, raspberry')
34
34
  expect(subject['some.veggies']).to eq('carrot, potato, broccoli')
35
+ expect(subject['space.key1']).to eq('space.Value1')
36
+ expect(subject['space.key2']).to eq('space.Value2')
37
+ expect(subject['space.key3']).to eq('space.Multi word value')
35
38
  expect(subject['foo.empty']).to be_empty
36
39
  expect(subject['bar.empty']).to be_empty
37
40
  expect(subject['baz.empty']).to be_empty
@@ -107,6 +110,16 @@ describe DotProperties do
107
110
  end
108
111
  end
109
112
 
113
+ describe "content escapes" do
114
+ it "should parse Java-escaped unicode" do
115
+ expect(subject['unicode']).to eq("Command\t\u2318\nOption\t\u2325")
116
+ end
117
+
118
+ it "should unescape escaped entities" do
119
+ expect(subject['key with:several=escapes']).to eq('value with#several\escapes')
120
+ end
121
+ end
122
+
110
123
  describe "additional methods" do
111
124
  it "#<<" do
112
125
  subject << ""
@@ -31,12 +31,22 @@ some.veggies=carrot, \
31
31
  potato, \
32
32
  broccoli
33
33
 
34
+ # Leading spaces
35
+
36
+ space.key1 = space.Value1
37
+ space.key2:space.Value2
38
+ space.key3 :space.Multi word value
39
+
34
40
  # Empty values
35
41
  foo.empty
36
42
  bar.empty=
37
43
  baz.empty:
38
44
  quux.empty =
39
45
 
46
+ # Escapes
47
+ unicode=Command\u0009\u2318\u000AOption\u0009\u2325
48
+ key\ with\:several\=es\c\apes:value\ with\#several\\escapes
49
+
40
50
  # References
41
51
  present = This value contains two resolvable references, ${foo.normal} and ${bar.extraspace}
42
52
  missing = This value contains one resolvable reference, ${foo.normal}, and one unresolvable reference, ${quux.missing}
metadata CHANGED
@@ -1,94 +1,83 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dot-properties
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
5
- prerelease:
4
+ version: 0.1.4
6
5
  platform: ruby
7
6
  authors:
8
7
  - Michael B. Klein
9
- autorequire:
8
+ autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-11-27 00:00:00.000000000 Z
11
+ date: 2022-01-20 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: bundler
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ~>
17
+ - - ">="
20
18
  - !ruby/object:Gem::Version
21
- version: '1.3'
22
- type: :development
19
+ version: 2.2.33
20
+ type: :runtime
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: '1.3'
26
+ version: 2.2.33
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: rake
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ! '>='
31
+ - - ">="
36
32
  - !ruby/object:Gem::Version
37
33
  version: '0'
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
40
  version: '0'
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: rspec
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
- - - ! '>='
45
+ - - ">="
52
46
  - !ruby/object:Gem::Version
53
47
  version: '0'
54
48
  type: :development
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
- - - ! '>='
52
+ - - ">="
60
53
  - !ruby/object:Gem::Version
61
54
  version: '0'
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: rdoc
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
- - - ! '>='
59
+ - - ">="
68
60
  - !ruby/object:Gem::Version
69
61
  version: 2.4.2
70
62
  type: :development
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
- - - ! '>='
66
+ - - ">="
76
67
  - !ruby/object:Gem::Version
77
68
  version: 2.4.2
78
69
  - !ruby/object:Gem::Dependency
79
70
  name: simplecov
80
71
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
72
  requirements:
83
- - - ! '>='
73
+ - - ">="
84
74
  - !ruby/object:Gem::Version
85
75
  version: '0'
86
76
  type: :development
87
77
  prerelease: false
88
78
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
79
  requirements:
91
- - - ! '>='
80
+ - - ">="
92
81
  - !ruby/object:Gem::Version
93
82
  version: '0'
94
83
  description: Java-style .properties file manipulation with a light touch
@@ -98,8 +87,8 @@ executables: []
98
87
  extensions: []
99
88
  extra_rdoc_files: []
100
89
  files:
101
- - .gitignore
102
- - .travis.yml
90
+ - ".gitignore"
91
+ - ".travis.yml"
103
92
  - Gemfile
104
93
  - LICENSE.txt
105
94
  - README.md
@@ -113,33 +102,25 @@ files:
113
102
  homepage: https://github.com/mbklein/dot-properties
114
103
  licenses:
115
104
  - APACHE2
116
- post_install_message:
105
+ metadata: {}
106
+ post_install_message:
117
107
  rdoc_options: []
118
108
  require_paths:
119
109
  - lib
120
110
  required_ruby_version: !ruby/object:Gem::Requirement
121
- none: false
122
111
  requirements:
123
- - - ! '>='
112
+ - - ">="
124
113
  - !ruby/object:Gem::Version
125
114
  version: '0'
126
- segments:
127
- - 0
128
- hash: -1306251061274732022
129
115
  required_rubygems_version: !ruby/object:Gem::Requirement
130
- none: false
131
116
  requirements:
132
- - - ! '>='
117
+ - - ">="
133
118
  - !ruby/object:Gem::Version
134
119
  version: '0'
135
- segments:
136
- - 0
137
- hash: -1306251061274732022
138
120
  requirements: []
139
- rubyforge_project:
140
- rubygems_version: 1.8.23
141
- signing_key:
142
- specification_version: 3
121
+ rubygems_version: 3.1.2
122
+ signing_key:
123
+ specification_version: 4
143
124
  summary: Read/write .properties files, respecting comments and existing formatting
144
125
  as much as possible
145
126
  test_files: