metaheader 1.3beta1 → 1.3beta2
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 +4 -4
- data/Gemfile +2 -0
- data/lib/metaheader/version.rb +1 -1
- data/lib/metaheader.rb +20 -16
- data/test/test_parser.rb +52 -5
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3eb042274d2edc78769525062d7cd315fad33275
|
4
|
+
data.tar.gz: feb8ef5aff9a4c9829363319b3ab7df601bae43b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b53340aa50e7f0468e55a217a29eeb6089b39fadc01327836fd3fc214688507d0e8a57c9c061d2a884c8a720661253381421bdd0a46ee84793d65c48823da775
|
7
|
+
data.tar.gz: a7c9be01c42161999999ecf46b33343c7314ec6116a6719d87843dc298e29443d3f0412c5bb655be266808f0a05e75356d43e4b01a6429a4da651a25d3083a4d
|
data/Gemfile
CHANGED
data/lib/metaheader/version.rb
CHANGED
data/lib/metaheader.rb
CHANGED
@@ -43,7 +43,7 @@ class MetaHeader
|
|
43
43
|
# @param path [String] path to the file to be read
|
44
44
|
# @return [MetaHeader]
|
45
45
|
def self.from_file(path)
|
46
|
-
|
46
|
+
File.open(path) {|file| self.new file }
|
47
47
|
end
|
48
48
|
|
49
49
|
# Construct a new MetaHeader object or return the object untouched
|
@@ -58,23 +58,23 @@ class MetaHeader
|
|
58
58
|
end
|
59
59
|
|
60
60
|
# Parse every tags found in input up to the first newline.
|
61
|
-
# @param input [String]
|
61
|
+
# @param input [String, IO]
|
62
62
|
def initialize(input)
|
63
63
|
@strict = false
|
64
64
|
@data = {}
|
65
65
|
|
66
66
|
@last_key = nil
|
67
|
+
@empty_lines = 0
|
67
68
|
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
parse line
|
74
|
-
end
|
75
|
-
}
|
69
|
+
unless input.is_a? IO
|
70
|
+
input = StringIO.new input.encode universal_newline: true
|
71
|
+
end
|
72
|
+
|
73
|
+
input.each_line {|line| break unless parse line }
|
76
74
|
|
77
75
|
Parser.each {|klass|
|
76
|
+
input.rewind
|
77
|
+
|
78
78
|
parser = klass.new
|
79
79
|
parser.instance_variable_set :@mh, self
|
80
80
|
parser.parse input
|
@@ -198,8 +198,8 @@ private
|
|
198
198
|
Tag = Struct.new :name, :value
|
199
199
|
|
200
200
|
REGEX = /\A(?<prefix>.*?)
|
201
|
-
(?:@(?<key>\w+)|(?<key>[\w][\w\s]*?)\s
|
202
|
-
(?:\s
|
201
|
+
(?:@(?<key>\w+)|(?<key>[\w][\w\s]*?)\s*(?<alt>:))
|
202
|
+
(?:\s*(?<value>[^\n]+))?
|
203
203
|
\Z/x.freeze
|
204
204
|
|
205
205
|
def parse(line)
|
@@ -208,7 +208,7 @@ private
|
|
208
208
|
# multiline value must have the same line prefix as the key
|
209
209
|
if @last_key && line.start_with?(@last_prefix.rstrip)
|
210
210
|
if append line
|
211
|
-
return
|
211
|
+
return true
|
212
212
|
else
|
213
213
|
@last_key = nil
|
214
214
|
end
|
@@ -216,7 +216,9 @@ private
|
|
216
216
|
|
217
217
|
line.rstrip!
|
218
218
|
|
219
|
-
return
|
219
|
+
return false if @empty_lines > 0
|
220
|
+
return !line.empty? unless match = REGEX.match(line)
|
221
|
+
return true if match[:alt] && match[:value].nil?
|
220
222
|
|
221
223
|
# single line
|
222
224
|
@last_prefix = match[:prefix]
|
@@ -231,8 +233,10 @@ private
|
|
231
233
|
end
|
232
234
|
|
233
235
|
def append(line)
|
234
|
-
|
236
|
+
prefix = line.rstrip
|
237
|
+
if prefix == @last_prefix.rstrip
|
235
238
|
@line_breaks += 1
|
239
|
+
@empty_lines += 1 if prefix.empty?
|
236
240
|
return true # add the line break later
|
237
241
|
elsif line.start_with? @last_prefix
|
238
242
|
mline = line[@last_prefix.size..-1]
|
@@ -248,7 +252,7 @@ private
|
|
248
252
|
|
249
253
|
@line_breaks += 1 unless tag.value.empty?
|
250
254
|
tag.value += "\n" * @line_breaks
|
251
|
-
@line_breaks = 0
|
255
|
+
@line_breaks = @empty_lines = 0
|
252
256
|
|
253
257
|
tag.value += stripped
|
254
258
|
stripped
|
data/test/test_parser.rb
CHANGED
@@ -22,7 +22,7 @@ class CustomParser < MetaHeader::Parser
|
|
22
22
|
|
23
23
|
header[:hello] = header[:hello].to_s * 2
|
24
24
|
|
25
|
-
@@input = input
|
25
|
+
@@input = input.read
|
26
26
|
@@instance = header
|
27
27
|
@@called = true
|
28
28
|
end
|
@@ -85,8 +85,8 @@ class TestParser < MiniTest::Test
|
|
85
85
|
|
86
86
|
def test_break_at_empty_line
|
87
87
|
mh = MetaHeader.new <<-IN
|
88
|
-
|
89
|
-
|
88
|
+
@hello world
|
89
|
+
\x20
|
90
90
|
@chunky bacon
|
91
91
|
IN
|
92
92
|
|
@@ -114,6 +114,16 @@ class TestParser < MiniTest::Test
|
|
114
114
|
assert_equal 'world', mh[:hello]
|
115
115
|
end
|
116
116
|
|
117
|
+
def test_empty_prefixed_line
|
118
|
+
mh = MetaHeader.new <<-IN
|
119
|
+
-- @first
|
120
|
+
--
|
121
|
+
-- @second
|
122
|
+
IN
|
123
|
+
|
124
|
+
refute_nil mh[:second]
|
125
|
+
end
|
126
|
+
|
117
127
|
def test_multiline
|
118
128
|
mh = MetaHeader.new <<-IN
|
119
129
|
@test Lorem
|
@@ -187,7 +197,7 @@ class TestParser < MiniTest::Test
|
|
187
197
|
assert_equal "true\ntest", mh[:test]
|
188
198
|
end
|
189
199
|
|
190
|
-
def
|
200
|
+
def test_multiline_empty_line_prefix
|
191
201
|
mh = MetaHeader.new <<-IN
|
192
202
|
--@test
|
193
203
|
-- Hello
|
@@ -199,7 +209,7 @@ class TestParser < MiniTest::Test
|
|
199
209
|
IN
|
200
210
|
|
201
211
|
assert_equal "Hello\n\nWorld", mh[:test]
|
202
|
-
assert_equal 'bacon', mh[:chunky]
|
212
|
+
assert_equal 'bacon', mh[:chunky]
|
203
213
|
end
|
204
214
|
|
205
215
|
def test_multiline_empty_line_space_prefix
|
@@ -213,6 +223,33 @@ class TestParser < MiniTest::Test
|
|
213
223
|
assert_equal "Hello\n\nWorld", mh[:test]
|
214
224
|
end
|
215
225
|
|
226
|
+
def test_multiline_empty_line
|
227
|
+
mh = MetaHeader.new <<-IN
|
228
|
+
@test
|
229
|
+
Hello
|
230
|
+
|
231
|
+
World
|
232
|
+
@chunky bacon
|
233
|
+
|
234
|
+
@foo
|
235
|
+
IN
|
236
|
+
|
237
|
+
assert_equal "Hello\n\nWorld", mh[:test]
|
238
|
+
assert_equal 'bacon', mh[:chunky]
|
239
|
+
assert_nil mh[:foo]
|
240
|
+
end
|
241
|
+
|
242
|
+
def test_multiline_break_at_empty_line
|
243
|
+
mh = MetaHeader.new <<-IN
|
244
|
+
-- @hello world
|
245
|
+
|
246
|
+
@chunky bacon
|
247
|
+
IN
|
248
|
+
|
249
|
+
assert_equal 'world', mh[:hello]
|
250
|
+
assert_nil mh[:chunky]
|
251
|
+
end
|
252
|
+
|
216
253
|
def test_read_file
|
217
254
|
path = File.expand_path '../input/basic_tag', __FILE__
|
218
255
|
mh = MetaHeader.from_file path
|
@@ -247,6 +284,16 @@ class TestParser < MiniTest::Test
|
|
247
284
|
assert_equal Hash[key_test: 'Value'], mh.to_h
|
248
285
|
end
|
249
286
|
|
287
|
+
def test_alternate_syntax_compact
|
288
|
+
mh = MetaHeader.new 'Key Test:Value'
|
289
|
+
assert_equal Hash[key_test: 'Value'], mh.to_h
|
290
|
+
end
|
291
|
+
|
292
|
+
def test_alternate_syntax_no_value
|
293
|
+
mh = MetaHeader.new 'Key Test:'
|
294
|
+
assert_equal Hash.new, mh.to_h
|
295
|
+
end
|
296
|
+
|
250
297
|
def test_inspect
|
251
298
|
mh = MetaHeader.new '@hello world'
|
252
299
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: metaheader
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3beta2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- cfillion
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-07-
|
11
|
+
date: 2016-07-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|