archieml 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +6 -1
- data/lib/archieml/loader.rb +4 -5
- data/lib/archieml/version.rb +1 -1
- data/spec/lib/archieml/loader_spec.rb +53 -2
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 20d1f2ce2e413edb046e36127d145f97d467b723
|
4
|
+
data.tar.gz: 6f84f4940d148c1e5d01e7e73e1b7f71ae514659
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 98ebe6f5d69d8bc03fb564b1f19b7d54fb2b70eb08526ba3d6d1165d8cd7ef2f7f8995d5ce87637b674265f2589c5cec8bfe6a9221ff21754399e14d54a6cebb
|
7
|
+
data.tar.gz: 94414bb4b8a3fd0d43d516fa130a4c39ec471d0dad7e2f3cb828405fb3344cedc8cba64aafd0fbc43a8906ba05953b95e7284cac89f573ca5159aa6f2182bfbe
|
data/README.md
CHANGED
@@ -4,7 +4,7 @@ Parse Archie Markup Language (ArchieML) documents into Ruby Hashes.
|
|
4
4
|
|
5
5
|
Read about the ArchieML specification at [archieml.org](http://archieml.org).
|
6
6
|
|
7
|
-
The current version is `v0.1.
|
7
|
+
The current version is `v0.1.1`.
|
8
8
|
|
9
9
|
## Installation
|
10
10
|
|
@@ -167,6 +167,11 @@ end
|
|
167
167
|
aml = Archieml.load(html_aml)
|
168
168
|
```
|
169
169
|
|
170
|
+
## Tests
|
171
|
+
|
172
|
+
There is a full test suite using rspec. `bundle install`, and then `rspec` to execute them.
|
173
|
+
|
170
174
|
## Changelog
|
171
175
|
|
176
|
+
* `0.1.1` - More consistent handling of newlines. Fixed bugs around detecting the scope of multi-line values.
|
172
177
|
* `0.1.0` - Initial release supporting the first version of the ArchieML spec, published [2015-03-06](http://archieml.org/spec/1.0/CR-20150306.html).
|
data/lib/archieml/loader.rb
CHANGED
@@ -3,9 +3,9 @@ module Archieml
|
|
3
3
|
|
4
4
|
NEXT_LINE = /.*((\r|\n)+)/
|
5
5
|
START_KEY = /^\s*([A-Za-z0-9\-_\.]+)[ \t\r]*:[ \t\r]*(.*(?:\n|\r|$))/
|
6
|
-
COMMAND_KEY = /^\s*:[ \t\r]*(endskip|ignore|skip|end)/i
|
6
|
+
COMMAND_KEY = /^\s*:[ \t\r]*(endskip|ignore|skip|end)(.*(?:\n|\r|$))/i
|
7
7
|
ARRAY_ELEMENT = /^\s*\*[ \t\r]*(.*(?:\n|\r|$))/
|
8
|
-
SCOPE_PATTERN = /^\s*(\[|\{)[ \t\r]*([A-Za-z0-9\-_\.]*)[ \t\r]*(?:\]|\})
|
8
|
+
SCOPE_PATTERN = /^\s*(\[|\{)[ \t\r]*([A-Za-z0-9\-_\.]*)[ \t\r]*(?:\]|\}).*?(\n|\r|$)/
|
9
9
|
|
10
10
|
def initialize
|
11
11
|
@data = @scope = {}
|
@@ -99,8 +99,6 @@ module Archieml
|
|
99
99
|
when "endskip"
|
100
100
|
@is_skipping = false
|
101
101
|
end
|
102
|
-
|
103
|
-
self.flush_buffer!
|
104
102
|
end
|
105
103
|
|
106
104
|
def parse_scope(scope_type, scope_key)
|
@@ -119,6 +117,7 @@ module Archieml
|
|
119
117
|
|
120
118
|
if scope_type == '['
|
121
119
|
@array = key_scope[key_bits.last] ||= []
|
120
|
+
@array = key_scope[key_bits.last] = [] if @array.class == String
|
122
121
|
|
123
122
|
if @array.length > 0
|
124
123
|
@array_type = @array.first.class == String ? 'simple' : 'complex'
|
@@ -165,7 +164,7 @@ module Archieml
|
|
165
164
|
end
|
166
165
|
|
167
166
|
def flush_scope!
|
168
|
-
@array = @array_type = @array_first_key = nil
|
167
|
+
@array = @array_type = @array_first_key = @buffer_key = nil
|
169
168
|
end
|
170
169
|
|
171
170
|
# type can be either :replace or :append.
|
data/lib/archieml/version.rb
CHANGED
@@ -56,10 +56,10 @@ describe Archieml::Loader do
|
|
56
56
|
@loader.load("scope.key:value\nscope.otherkey:value")['scope']['key'].should == 'value'
|
57
57
|
@loader.load("scope.key:value\nscope.otherkey:value")['scope']['otherkey'].should == 'value'
|
58
58
|
end
|
59
|
-
it "the value of key that used to be a
|
59
|
+
it "the value of key that used to be a string should be replaced with an object if necessary" do
|
60
60
|
@loader.load("scope.level:value\nscope.level.level:value")['scope']['level']['level'].should == 'value'
|
61
61
|
end
|
62
|
-
it "the value of key that used to be a
|
62
|
+
it "the value of key that used to be a parent object should be replaced with a string if necessary" do
|
63
63
|
@loader.load("scope.level.level:value\nscope.level:value")['scope']['level'].should == 'value'
|
64
64
|
end
|
65
65
|
|
@@ -257,12 +257,27 @@ describe Archieml::Loader do
|
|
257
257
|
@loader.load("key:value\n\\[comment]\n:end")['key'].should == "value"
|
258
258
|
@loader.load("key:value\n\\[[array]]\n:end")['key'].should == "value\n[array]"
|
259
259
|
end
|
260
|
+
it "arrays within a multi-line value breaks up the value" do
|
261
|
+
@loader.load("key:value\ntext\n[array]\nmore text\n:end")['key'].should == "value"
|
262
|
+
end
|
263
|
+
it "objects within a multi-line value breaks up the value" do
|
264
|
+
@loader.load("key:value\ntext\n{scope}\nmore text\n:end")['key'].should == "value"
|
265
|
+
end
|
266
|
+
it "bullets within a multi-line value do not break up the value" do
|
267
|
+
@loader.load("key:value\ntext\n* value\nmore text\n:end")['key'].should == "value\ntext\n* value\nmore text"
|
268
|
+
end
|
269
|
+
it "skips within a multi-line value do not break up the value" do
|
270
|
+
@loader.load("key:value\ntext\n:skip\n:endskip\nmore text\n:end")['key'].should == "value\ntext\nmore text"
|
271
|
+
end
|
260
272
|
it "allows escaping initial backslash at the beginning of lines" do
|
261
273
|
@loader.load("key:value\n\\\\:end\n:end")['key'].should == "value\n\\:end"
|
262
274
|
end
|
263
275
|
it "escapes only one initial backslash" do
|
264
276
|
@loader.load("key:value\n\\\\\\:end\n:end")['key'].should == "value\n\\\\:end"
|
265
277
|
end
|
278
|
+
it "allows escaping multiple lines in a value" do
|
279
|
+
@loader.load("key:value\n\\:end\n\\:ignore\n\\:endskip\n\\:skip\n:end'")['key'].should == "value\n:end\n:ignore\n:endskip\n:skip"
|
280
|
+
end
|
266
281
|
it "doesn't escape colons after beginning of lines" do
|
267
282
|
@loader.load("key:value\nLorem key2\\:value\n:end")['key'].should == "value\nLorem key2\\:value"
|
268
283
|
end
|
@@ -427,12 +442,30 @@ describe Archieml::Loader do
|
|
427
442
|
it "does not allow escaping of colons not at the beginning of lines" do
|
428
443
|
@loader.load("[array]\n*Value\nword key\\:value\n:end")['array'].first.should == "Value\nword key\\:value"
|
429
444
|
end
|
445
|
+
it "arrays within a multi-line value breaks up the value" do
|
446
|
+
@loader.load("[array]\n* value\n[array]\nmore text\n:end")['array'].first.should == "value"
|
447
|
+
end
|
448
|
+
it "objects within a multi-line value breaks up the value" do
|
449
|
+
@loader.load("[array]\n* value\n{scope}\nmore text\n:end")['array'].first.should == "value"
|
450
|
+
end
|
451
|
+
it "key/values within a multi-line value do not break up the value" do
|
452
|
+
@loader.load("[array]\n* value\nkey: value\nmore text\n:end")['array'].first.should == "value\nkey: value\nmore text"
|
453
|
+
end
|
454
|
+
it "bullets within a multi-line value break up the value" do
|
455
|
+
@loader.load("[array]\n* value\n* value\nmore text\n:end")['array'].first.should == "value"
|
456
|
+
end
|
457
|
+
it "skips within a multi-line value do not break up the value" do
|
458
|
+
@loader.load("[array]\n* value\n:skip\n:endskip\nmore text\n:end")['array'].first.should == "value\nmore text"
|
459
|
+
end
|
430
460
|
it "arrays that are reopened add to existing array" do
|
431
461
|
@loader.load("[array]\n*Value\n[]\n[array]\n*Value")['array'].should == ['Value', 'Value']
|
432
462
|
end
|
433
463
|
it "simple arrays that are reopened remain simple" do
|
434
464
|
@loader.load("[array]\n*Value\n[]\n[array]\nkey:value")['array'].should == ['Value']
|
435
465
|
end
|
466
|
+
it "simple arrays overwrite existing keys" do
|
467
|
+
@loader.load("a.b:complex value\n[a.b]\n*simple value")['a']['b'][0].should == 'simple value'
|
468
|
+
end
|
436
469
|
|
437
470
|
end
|
438
471
|
|
@@ -455,12 +488,30 @@ describe Archieml::Loader do
|
|
455
488
|
it "duplicate keys must match on dot-notation scope" do
|
456
489
|
@loader.load("[array]\nscope.key:value\nkey:value\notherscope.key:value")['array'].length.should == 1
|
457
490
|
end
|
491
|
+
it "arrays within a multi-line value breaks up the value" do
|
492
|
+
@loader.load("[array]\nkey:value\n[array]\nmore text\n:end")['array'].first['key'].should == "value"
|
493
|
+
end
|
494
|
+
it "objects within a multi-line value breaks up the value" do
|
495
|
+
@loader.load("[array]\nkey:value\n{scope}\nmore text\n:end")['array'].first['key'].should == "value"
|
496
|
+
end
|
497
|
+
it "key/values within a multi-line value break up the value" do
|
498
|
+
@loader.load("[array]\nkey:value\nother: value\nmore text\n:end")['array'].first['key'].should == "value"
|
499
|
+
end
|
500
|
+
it "bullets within a multi-line value do not break up the value" do
|
501
|
+
@loader.load("[array]\nkey:value\n* value\nmore text\n:end")['array'].first['key'].should == "value\n* value\nmore text"
|
502
|
+
end
|
503
|
+
it "skips within a multi-line value do not break up the value" do
|
504
|
+
@loader.load("[array]\nkey:value\n:skip\n:endskip\nmore text\n:end")['array'].first['key'].should == "value\nmore text"
|
505
|
+
end
|
458
506
|
it "arrays that are reopened add to existing array" do
|
459
507
|
@loader.load("[array]\nkey:value\n[]\n[array]\nkey:value")['array'].length.should == 2
|
460
508
|
end
|
461
509
|
it "complex arrays that are reopened remain complex" do
|
462
510
|
@loader.load("[array]\nkey:value\n[]\n[array]\n*Value")['array'].should == [{'key' => 'value'}]
|
463
511
|
end
|
512
|
+
it "complex arrays overwrite existing keys" do
|
513
|
+
@loader.load("a.b:complex value\n[a.b]\nkey:value")['a']['b'][0]['key'].should == 'value'
|
514
|
+
end
|
464
515
|
|
465
516
|
end
|
466
517
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: archieml
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Strickland
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-03-
|
11
|
+
date: 2015-03-17 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Parse Archie Markup Language documents
|
14
14
|
email:
|
@@ -17,7 +17,7 @@ executables: []
|
|
17
17
|
extensions: []
|
18
18
|
extra_rdoc_files: []
|
19
19
|
files:
|
20
|
-
- .gitignore
|
20
|
+
- ".gitignore"
|
21
21
|
- Gemfile
|
22
22
|
- LICENSE
|
23
23
|
- README.md
|
@@ -38,12 +38,12 @@ require_paths:
|
|
38
38
|
- lib
|
39
39
|
required_ruby_version: !ruby/object:Gem::Requirement
|
40
40
|
requirements:
|
41
|
-
- -
|
41
|
+
- - ">="
|
42
42
|
- !ruby/object:Gem::Version
|
43
43
|
version: '0'
|
44
44
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
45
45
|
requirements:
|
46
|
-
- -
|
46
|
+
- - ">="
|
47
47
|
- !ruby/object:Gem::Version
|
48
48
|
version: '0'
|
49
49
|
requirements: []
|