anvl 0.1.3 → 0.2.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.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.3
1
+ 0.2.0
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{anvl}
8
- s.version = "0.1.3"
8
+ s.version = "0.2.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Chris Beer"]
12
- s.date = %q{2010-12-09}
12
+ s.date = %q{2010-12-12}
13
13
  s.email = %q{chris@cbeer.info}
14
14
  s.extra_rdoc_files = [
15
15
  "LICENSE.txt",
@@ -25,8 +25,13 @@ Gem::Specification.new do |s|
25
25
  "VERSION",
26
26
  "anvl.gemspec",
27
27
  "lib/anvl.rb",
28
+ "lib/anvl/document.rb",
29
+ "lib/anvl/element.rb",
30
+ "lib/anvl/erc.rb",
28
31
  "test/helper.rb",
29
- "test/test_anvl.rb"
32
+ "test/test_anvl.rb",
33
+ "test/test_element.rb",
34
+ "test/test_erc.rb"
30
35
  ]
31
36
  s.homepage = %q{http://github.com/cbeer/anvl}
32
37
  s.licenses = ["MIT"]
@@ -35,7 +40,9 @@ Gem::Specification.new do |s|
35
40
  s.summary = %q{Ruby implementation of A Name-Value Language (ANVL)}
36
41
  s.test_files = [
37
42
  "test/helper.rb",
38
- "test/test_anvl.rb"
43
+ "test/test_anvl.rb",
44
+ "test/test_element.rb",
45
+ "test/test_erc.rb"
39
46
  ]
40
47
 
41
48
  if s.respond_to? :specification_version then
@@ -1,115 +1,6 @@
1
+ require 'anvl/element'
2
+ require 'anvl/document'
1
3
  module ANVL
2
- class Document # < Hash
3
-
4
- def self.parse str
5
- anvl = ANVL::Document.new str
6
- anvl
7
- end
8
-
9
- attr_reader :entries
10
-
11
- def initialize obj = nil
12
- @entries = Hash.new { |h,k| h[k] = [] }
13
-
14
- case obj
15
- when Hash
16
- obj.each do |key, value|
17
- @entries[key.to_sym] = value
18
- end
19
- when String
20
- lines = obj.gsub(/\s?\n\s+/, ' ').split("\n")
21
-
22
- lines.each_with_index do |str, i|
23
- case str
24
- when /^#/
25
- parse_comment str, i
26
- when /:/
27
- parse_entry str, i
28
- else # something is wrong..
29
- nil
30
- end
31
- end
32
-
33
- end if obj
34
-
35
- add_entries_methods
36
-
37
- gc!
38
- end
39
-
40
- def to_s
41
- gc!
42
- @entries.map do |key, value|
43
- if value.is_a? Array
44
- value.map do |v|
45
- "#{key}: #{v.to_s.gsub(/\n/, "\n ")}"
46
- end
47
- else
48
- "#{key}: #{value.to_s.gsub(/\n/, "\n ")}"
49
- end
50
- end.join "\n"
51
- end
52
-
53
- def to_h
54
- gc!
55
- @entries
56
- end
57
-
58
- def [] key
59
- return @entries[key]
60
- end
61
-
62
- def []= key, value
63
- value = [value] unless value.is_a? Array
64
- @entries[key] = value
65
- end
66
-
67
- def push hash
68
- hash.each do |key, value|
69
- @entries[key] = [@entries[key]] unless @entries[key].is_a? Array
70
- if value.is_a? Array
71
- value.each do |v|
72
- @entries[key] << v
73
- end
74
- else
75
- @entries[key] << value
76
- end
77
- end
78
- gc!
79
- @entries
80
- end
81
- alias_method :'<<', :push
82
-
83
- private
84
-
85
- def parse_comment str, line=0
86
-
87
- end
88
-
89
- def parse_entry str, line=0
90
- key, value = str.split ":", 2
91
- @entries[key.to_sym] << value.strip
92
- end
93
-
94
- def add_entries_methods
95
- @entries.public_methods(false).reject { |x| self.respond_to? x }.each do |meth|
96
- (class << self; self; end).class_eval do
97
- define_method meth do |*args|
98
- @entries.send meth, *args
99
- end
100
- end
101
- end
102
- end
103
-
104
- def gc!
105
- @entries.delete_if { |key, value| value.nil? or (value.is_a? Array and value.empty?) }
106
-
107
- @entries.each do |key, value|
108
- @entries[key] = value.first if value.is_a? Array and value.length == 1
109
- end
110
- end
111
- end
112
-
113
4
  def self.parse *args
114
5
  Document.parse *args
115
6
  end
@@ -0,0 +1,130 @@
1
+ module ANVL
2
+ class Document # < Hash
3
+ def self.parse str
4
+ anvl = self.new str
5
+ anvl
6
+ end
7
+
8
+ attr_reader :entries
9
+
10
+ def initialize obj = nil
11
+ @entries = Array.new
12
+
13
+ case obj
14
+ when Hash
15
+ self.push obj
16
+
17
+ when String
18
+ lines = obj.gsub(/\s?\n\s+/, ' ').split("\n")
19
+
20
+ lines.each_with_index do |str, i|
21
+ case str
22
+ when /^#/
23
+ parse_comment str, i
24
+ when /:/
25
+ parse_entry str, i
26
+ else # something is wrong..
27
+ nil
28
+ end
29
+ end
30
+
31
+ end if obj
32
+
33
+ add_entries_methods
34
+
35
+ gc!
36
+ end
37
+
38
+ def to_s
39
+ gc!
40
+ @entries.map do |obj|
41
+ obj.to_anvl
42
+ end.join "\n"
43
+ end
44
+
45
+ def to_h
46
+ gc!
47
+ h = {}
48
+
49
+ @entries.map do |obj|
50
+ h[(obj.display_label || obj.label).to_sym] ||= []
51
+ h[(obj.display_label || obj.label).to_sym] << obj.to_s
52
+ end
53
+
54
+ h.each do |label, value|
55
+ h[label] = value.first if value.length == 1
56
+ end
57
+
58
+ h
59
+ end
60
+
61
+ def [] display_label, args = {}
62
+ v = @entries.select { |x| x =~ display_label }
63
+ v &&= v.map { |x| x.to_s } unless args[:raw]
64
+ v &&= v.first if v.length == 1
65
+ v
66
+ end
67
+ alias_method :fetch, :[]
68
+
69
+ def []= display_label, value, append = false
70
+ label = convert_label display_label
71
+ value = [value] unless value.is_a? Array
72
+ @entries.delete_if { |x| x =~ label } unless append
73
+ value.each do |v|
74
+ case v
75
+ when Hash
76
+ @entries << element_class.new({ :document => self, :label => label, :value => v }.merge(v))
77
+ else
78
+ @entries << element_class.new({ :document => self, :label => label, :value => v })
79
+ end
80
+ end
81
+ end
82
+
83
+ alias_method :store, :[]=
84
+
85
+ def push hash
86
+ hash.each do |label, value|
87
+ self.store label, value, true
88
+ end
89
+ gc!
90
+ @entries
91
+ end
92
+ alias_method :'<<', :push
93
+
94
+ protected
95
+ def element_class
96
+ ANVL::Element
97
+ end
98
+
99
+ def parse_comment str, line=0
100
+
101
+ end
102
+
103
+ def parse_entry str, line=0
104
+ label, value = str.split ":", 2
105
+ self.store label, value, true
106
+ end
107
+
108
+ def add_entries_methods
109
+ @entries.reject { |x| self.respond_to? x[:label] }.each do |obj|
110
+ (class << self; self; end).class_eval do
111
+ define_method obj.label do |*args|
112
+ @entries[obj.label]
113
+ end
114
+ end
115
+ end
116
+ end
117
+
118
+ def gc!
119
+ end
120
+
121
+ def format_value str = ''
122
+ str = str.to_s
123
+ str &&= str.gsub(/\n/, "\n ")
124
+ end
125
+
126
+ def convert_label label
127
+ label.to_s
128
+ end
129
+ end
130
+ end
@@ -0,0 +1,61 @@
1
+ module ANVL
2
+ class Element
3
+ attr_reader :document, :label, :display_label, :value
4
+ def initialize args
5
+ @document = args[:document]
6
+ @display_label = args[:display_label] || convert_label(args[:label])
7
+ @label = convert_label(args[:label])
8
+ @value = args[:value].to_s.strip
9
+ end
10
+
11
+ def [] key
12
+ self.send key.to_sym
13
+ end
14
+
15
+ def to_s
16
+ str = @value
17
+ str &&= str.gsub(/\s*\n\s+/, ' ')
18
+
19
+ str
20
+ end
21
+
22
+ def to_anvl
23
+ "#{@display_label || @label}:#{format_value_for_anvl}"
24
+ end
25
+
26
+ def <=> obj
27
+ @value <=> obj
28
+ end
29
+
30
+ def == obj
31
+ case obj
32
+ when String
33
+ return @value == obj if obj.is_a? String
34
+ when Element
35
+ @label == obj.label && @value = obj.display_label
36
+ else
37
+ false
38
+ end
39
+ end
40
+
41
+ def =~ str
42
+ str = str.to_s
43
+ str == @label or str == @display_label or convert_label(str) == @label
44
+ end
45
+
46
+ def push value
47
+ @document.store @display_label, value, true
48
+ end
49
+ alias_method :'<<', :push
50
+
51
+ private
52
+ def format_value_for_anvl
53
+ " " + @value.gsub(/\n/, "\n ")
54
+ end
55
+
56
+ def convert_label label
57
+ label
58
+ end
59
+
60
+ end
61
+ end
@@ -0,0 +1,109 @@
1
+ require 'anvl'
2
+ module ANVL
3
+ class Erc < Document
4
+ STORY_TO_OFFSET = { 'erc' => 0, 'about-erc' => 10, 'support-erc' => 20, 'meta-erc' => 30 }
5
+
6
+ LABEL_TO_SYN = {
7
+ 'who' => 'h1', 'what' => 'h2', 'when' => 'h3', 'where' => 'h4', 'how' => 'h5',
8
+ 'about-who' => 'h11', 'about-what' => 'h12', 'about-when' => 'h13', 'about-where' => 'h14', 'about-how' => 'h15',
9
+ 'support-who' => 'h21', 'support-what' => 'h22', 'support-when' => 'h23', 'support-where' => 'h24',
10
+ 'meta-who' => 'h31', 'meta-what' => 'h32', 'meta-when' => 'h33', 'meta-where' => 'h34'
11
+ }
12
+
13
+ SYN_TO_KERNEL = LABEL_TO_SYN.invert
14
+
15
+
16
+ class Element < ANVL::Element
17
+ def to_s
18
+ str = super
19
+ str &&= format_initial_comma_to_recover_word_order str
20
+ str &&= decode_element_value_encoding str
21
+ str
22
+ end
23
+
24
+ def =~ str
25
+ bool = super
26
+
27
+ label = convert_label str
28
+ bool ||= (label =~ Regexp.new("\\(#{Regexp.escape(@label)}\\)"))
29
+ end
30
+
31
+ private
32
+ def format_value_for_anvl
33
+ super.sub(/^\s+([,;\|])/, '\1')
34
+ end
35
+
36
+ def format_initial_comma_to_recover_word_order str, sort_point = ','
37
+ return str unless str[0, 1] == sort_point
38
+ arr = str.split(sort_point)
39
+ arr.shift
40
+
41
+ insig = nil
42
+ if str[-1,1] == sort_point
43
+ insig = arr.pop.strip
44
+ end
45
+
46
+ word = arr.pop
47
+ arr = [arr.join ","]
48
+ arr.unshift word
49
+ arr.unshift insig
50
+
51
+ arr.compact.map(&:strip).reject { |x| x.empty?}.join " "
52
+ end
53
+
54
+ def decode_element_value_encoding str
55
+ h = { '%sp' => ' ', '%ex' => '!', '%dq' => '"', '%ns' => '#', '%do' => '$', '%pe' => '%', '%am' => '&', '%sq' => '\'', '%op' => '(', '%cp' => ')', '%as' => '*', '%pl' => '+', '%co' => ',', '%sl' => '/', '%cn' => ':', '%sc' => ';', '%lt' => '<', '%eq' => '=', '%gt' => '>', '%qu' => '?', '%at' => '@', '%ox' => '[', '%ls' => '\\', '%cx' => ']', '%vb' => '|', '%nu' => "\0", '%%' => '%' }
56
+ s = str.dup
57
+ h.each do |key, value|
58
+ s.gsub! key, value
59
+ end
60
+ s
61
+ end
62
+
63
+ def convert_label label
64
+ str = label.to_s.downcase.gsub(' ', '_')
65
+
66
+ str = ANVL::Erc::LABEL_TO_SYN[str] if ANVL::Erc::LABEL_TO_SYN[str]
67
+
68
+ str
69
+ end
70
+
71
+ end
72
+
73
+ def []= display_label, value, append = false
74
+ if value[0,1] != '|' and STORY_TO_OFFSET[display_label] and !value.strip.empty?
75
+ process_abbr_form display_label, value
76
+ elsif value[0,1] != ';' and value =~ /;/
77
+ value.split(';').each do |v|
78
+ self.store display_label, v, true
79
+ end
80
+ else
81
+ super
82
+ end
83
+ end
84
+ alias_method :store, :[]=
85
+
86
+ def complete?
87
+ !(self.fetch(:h1).empty? or self.fetch(:h2).empty? or self.fetch(:h3).empty? or self.fetch(:h4).empty?) ||
88
+ !(self.fetch(:h11).empty? or self.fetch(:h12).empty? or self.fetch(:h13).empty? or self.fetch(:h14).empty?) ||
89
+ !(self.fetch(:h21).empty? or self.fetch(:h22).empty? or self.fetch(:h23).empty? or self.fetch(:h24).empty?) ||
90
+ !(self.fetch(:h31).empty? or self.fetch(:h32).empty? or self.fetch(:h33).empty? or self.fetch(:h34).empty?)
91
+ end
92
+
93
+ protected
94
+
95
+ def element_class
96
+ ANVL::Erc::Element
97
+ end
98
+
99
+ def process_abbr_form display_label, value
100
+ offset = STORY_TO_OFFSET[display_label]
101
+ elements = value.split('|')
102
+ elements.each_with_index do |e, i|
103
+ next if e.strip.empty?
104
+ self.store "h#{offset + i + 1}", e.strip
105
+ end
106
+ end
107
+
108
+ end
109
+ end
@@ -38,7 +38,8 @@ a: 2'
38
38
  assert_equal({:a => 'a' }, h.to_h)
39
39
  h[:a] = ['a', 'b']
40
40
  assert_equal({:a => ['a', 'b'] }, h.to_h)
41
- h[:a] << 'c'
41
+ h[:a].inspect
42
+ h.store :a, 'c', true
42
43
  assert_equal({:a => ['a', 'b', 'c'] }, h.to_h)
43
44
  assert_equal(['a', 'b', 'c'], h[:a])
44
45
 
@@ -49,10 +50,10 @@ a: 2'
49
50
  assert_equal({:a => ['a', 'b', 'c', 'd'] }, h.to_h)
50
51
 
51
52
  h << { :c => 1 }
52
- assert_equal(1, h[:c])
53
+ assert_equal("1", h[:c])
53
54
 
54
55
  h << { :c => 2 }
55
- assert_equal([1, 2], h[:c])
56
+ assert_equal(["1", "2"], h[:c])
56
57
 
57
58
  str = h.to_s
58
59
  assert_match(/^a: a$/, str)
@@ -76,9 +77,33 @@ a: 2'
76
77
 
77
78
  def test_fmt_first_draft
78
79
  str = ANVL.to_anvl({:entry => [""], :who => ['Gilbert, W.S. | Sullivan, Arthur'], :what => ["The Yeomen of the Guard"], :"when/created" => [1888]})
80
+ h = ANVL.parse({:entry => [""], :who => ['Gilbert, W.S. | Sullivan, Arthur'], :what => ["The Yeomen of the Guard"], :"when/created" => [1888]})
79
81
  assert_match(/entry:/, str)
80
82
  assert_match(/who: Gilbert, W.S. | Sullivan, Arthur/, str)
81
83
  assert_match(/what: The Yeomen of the Guard/, str)
82
84
  assert_match(/when\/created: 1888/, str)
83
85
  end
86
+
87
+ def test_display_label
88
+ h = ANVL::Document.new
89
+ h['a'] = {:display_label => 'A', :value => '123' }
90
+ assert_equal("123", h['a'])
91
+
92
+ assert_match(/A:/, h.to_s)
93
+ end
94
+
95
+ def test_str_vs_sym
96
+ str = 'erc:
97
+ who: Lederberg, Joshua
98
+ what: Studies of Human Families for Genetic Linkage
99
+ when: 1974
100
+ where: http://profiles.nlm.nih.gov/BB/AA/TT/tt.pdf
101
+ note: This is an arbitrary note inside a
102
+ small descriptive record.'
103
+ h = ANVL::Document.parse str
104
+
105
+ assert_equal("Lederberg, Joshua", h['who'])
106
+ assert_equal("Lederberg, Joshua", h[:who])
107
+ end
108
+
84
109
  end
@@ -0,0 +1,23 @@
1
+ require 'helper'
2
+
3
+ class TestErcElement < Test::Unit::TestCase
4
+ def test_basic
5
+ h = ANVL::Erc::Element.new :label => 'abc', :value => '123'
6
+ assert_equal('123', h.to_s)
7
+ assert_equal('abc: 123', h.to_anvl)
8
+ end
9
+
10
+ def test_initial_comma_to_recover_natural_word_order
11
+ h = ANVL::Erc::Element.new :label => 'abc', :value => ', van Gogh, Vincent'
12
+ assert_equal('Vincent van Gogh', h.to_s)
13
+ assert_equal('abc:, van Gogh, Vincent', h.to_anvl)
14
+
15
+ h = ANVL::Erc::Element.new :label => 'abc', :value => ', Howell, III, PhD, 1922-1987, Thurston'
16
+ assert_equal('Thurston Howell, III, PhD, 1922-1987', h.to_s)
17
+ assert_equal('abc:, Howell, III, PhD, 1922-1987, Thurston', h.to_anvl)
18
+
19
+ h = ANVL::Erc::Element.new :label => 'abc', :value => ', McCartney, Paul, Sir,'
20
+ assert_equal('Sir Paul McCartney', h.to_s)
21
+ assert_equal('abc:, McCartney, Paul, Sir,', h.to_anvl)
22
+ end
23
+ end
@@ -0,0 +1,134 @@
1
+ require 'helper'
2
+ require 'anvl/erc'
3
+
4
+ class TestErc < Test::Unit::TestCase
5
+ def test_parse_empty
6
+ h = ANVL::Erc.parse ''
7
+ assert_equal(0, h.entries.length)
8
+ end
9
+
10
+ def test_basic
11
+ str = 'erc:
12
+ who: Gibbon, Edward
13
+ what: The Decline and Fall of the Roman Empire
14
+ when: 1781
15
+ where: http://www.ccel.org/g/gibbon/decline/'
16
+
17
+ h = ANVL::Erc.parse str
18
+ assert_equal("", h[:erc])
19
+ assert_equal("Gibbon, Edward", h[:who])
20
+ assert_equal("The Decline and Fall of the Roman Empire", h[:what])
21
+ assert_equal("1781", h[:when])
22
+ assert_equal("http://www.ccel.org/g/gibbon/decline/", h[:where])
23
+ end
24
+
25
+ def test_complete
26
+ str = 'erc:
27
+ what: The Digital Dilemma
28
+ where: http://books.nap.edu/html/digital%5Fdilemma
29
+ '
30
+
31
+ h = ANVL::Erc.parse str
32
+ assert_equal(false, h.complete?)
33
+
34
+ h[:who] = '---'
35
+ h[:when] = '---'
36
+ assert(h.complete?)
37
+ end
38
+
39
+ def test_complete_meta
40
+ str = 'meta-erc: NLM | pm9546494 | 19980418
41
+ | http://ark.nlm.nih.gov/12025/pm9546494??'
42
+ h = ANVL::Erc.parse str
43
+ assert(h.complete?)
44
+ end
45
+
46
+ def test_missing_about
47
+ str = 'about-erc: | Bispectrum ; Nonlinearity ; Epilepsy
48
+ ; Cooperativity ; Subdural ; Hippocampus'
49
+ h = ANVL::Erc.parse str
50
+ assert_contains(h['about-what'], 'Bispectrum')
51
+ assert_contains(h['about-what'], 'Nonlinearity')
52
+ assert_contains(h['about-what'], 'Epilepsy')
53
+ assert_contains(h['about-what'], 'Cooperativity')
54
+ assert_contains(h['about-what'], 'Subdural')
55
+ assert_contains(h['about-what'], 'Hippocampus')
56
+ end
57
+
58
+ def test_abbr
59
+ str = 'erc: Gibbon, Edward | The Decline and Fall of the Roman Empire
60
+ | 1781 | http://www.ccel.org/g/gibbon/decline/'
61
+
62
+ h = ANVL::Erc.parse str
63
+ assert_equal("Gibbon, Edward", h[:who])
64
+ assert_equal("The Decline and Fall of the Roman Empire", h[:what])
65
+ assert_equal("1781", h[:when])
66
+ assert_equal("http://www.ccel.org/g/gibbon/decline/", h[:where])
67
+ end
68
+
69
+ def test_multiple_values
70
+ str = 'erc:
71
+ who: Smith, J; Wong, D; Khan, H'
72
+ h = ANVL::Erc.parse str
73
+
74
+ assert_contains(h[:who], 'Smith, J')
75
+ assert_contains(h[:who], 'Wong, D')
76
+ assert_contains(h[:who], 'Khan, H')
77
+ end
78
+
79
+ def test_intl
80
+ str = 'erc:
81
+ who: Lederberg, Joshua
82
+ h2: Studies of Human Families for Genetic Linkage'
83
+ h = ANVL::Erc.parse str
84
+ assert_equal("Lederberg, Joshua", h[:who])
85
+ assert_equal("Lederberg, Joshua", h['who'])
86
+ assert_equal("Lederberg, Joshua", h[:h1])
87
+ assert_equal("Lederberg, Joshua", h['wer(h1)'])
88
+ assert_equal("Studies of Human Families for Genetic Linkage", h[:h2])
89
+ assert_equal("Studies of Human Families for Genetic Linkage", h[:what])
90
+ assert_equal("Studies of Human Families for Genetic Linkage", h['was(h2)'])
91
+ end
92
+
93
+ def test_label_structure
94
+ str = 'erc:'
95
+ h = ANVL::Erc.parse str
96
+
97
+ h['marc_856'] = 'abc'
98
+
99
+ assert_equal("abc", h['marc_856'])
100
+ h['MARC 856'] = '123'
101
+
102
+ assert_equal("123", h['marc_856'])
103
+ end
104
+
105
+ def test_initial_comma
106
+ str = 'erc:
107
+ who:, van Gogh, Vincent
108
+ who:, Howell, III, PhD, 1922-1987, Thurston
109
+ who:, Acme Rocket Factory, Inc., The
110
+ who:, Mao Tse Tung
111
+ who:, McCartney, Pat, Ms,
112
+ who:, McCartney, Paul, Sir,
113
+ who:, McCartney, Petra, Dr,
114
+ what:, Health and Human Services, United States Government
115
+ Department of, The,'
116
+
117
+ h = ANVL::Erc.parse str
118
+ assert_contains(h[:who], "Vincent van Gogh")
119
+ assert_contains(h[:who], "Thurston Howell, III, PhD, 1922-1987")
120
+ assert_contains(h[:who], "The Acme Rocket Factory, Inc.")
121
+ assert_contains(h[:who], "Mao Tse Tung")
122
+ assert_contains(h[:who], "Ms Pat McCartney")
123
+ assert_contains(h[:who], "Sir Paul McCartney")
124
+ assert_contains(h[:who], "Dr Petra McCartney")
125
+ assert_equal(h[:what], "The United States Government Department of Health and Human Services")
126
+ end
127
+
128
+ def test_value_encoding
129
+ str = 'erc:
130
+ who: %sp%ex%dq'
131
+ h = ANVL::Erc.parse str
132
+ assert_contains(" !\"", h[:who])
133
+ end
134
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: anvl
3
3
  version: !ruby/object:Gem::Version
4
- hash: 29
4
+ hash: 23
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 1
9
- - 3
10
- version: 0.1.3
8
+ - 2
9
+ - 0
10
+ version: 0.2.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Chris Beer
@@ -15,10 +15,13 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-12-09 00:00:00 -05:00
18
+ date: 2010-12-12 00:00:00 -05:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
+ type: :development
23
+ prerelease: false
24
+ name: shoulda
22
25
  version_requirements: &id001 !ruby/object:Gem::Requirement
23
26
  none: false
24
27
  requirements:
@@ -28,11 +31,11 @@ dependencies:
28
31
  segments:
29
32
  - 0
30
33
  version: "0"
31
- name: shoulda
32
34
  requirement: *id001
35
+ - !ruby/object:Gem::Dependency
33
36
  type: :development
34
37
  prerelease: false
35
- - !ruby/object:Gem::Dependency
38
+ name: bundler
36
39
  version_requirements: &id002 !ruby/object:Gem::Requirement
37
40
  none: false
38
41
  requirements:
@@ -44,11 +47,11 @@ dependencies:
44
47
  - 0
45
48
  - 0
46
49
  version: 1.0.0
47
- name: bundler
48
50
  requirement: *id002
51
+ - !ruby/object:Gem::Dependency
49
52
  type: :development
50
53
  prerelease: false
51
- - !ruby/object:Gem::Dependency
54
+ name: jeweler
52
55
  version_requirements: &id003 !ruby/object:Gem::Requirement
53
56
  none: false
54
57
  requirements:
@@ -60,11 +63,11 @@ dependencies:
60
63
  - 5
61
64
  - 1
62
65
  version: 1.5.1
63
- name: jeweler
64
66
  requirement: *id003
67
+ - !ruby/object:Gem::Dependency
65
68
  type: :development
66
69
  prerelease: false
67
- - !ruby/object:Gem::Dependency
70
+ name: rcov
68
71
  version_requirements: &id004 !ruby/object:Gem::Requirement
69
72
  none: false
70
73
  requirements:
@@ -74,10 +77,7 @@ dependencies:
74
77
  segments:
75
78
  - 0
76
79
  version: "0"
77
- name: rcov
78
80
  requirement: *id004
79
- type: :development
80
- prerelease: false
81
81
  description:
82
82
  email: chris@cbeer.info
83
83
  executables: []
@@ -97,8 +97,13 @@ files:
97
97
  - VERSION
98
98
  - anvl.gemspec
99
99
  - lib/anvl.rb
100
+ - lib/anvl/document.rb
101
+ - lib/anvl/element.rb
102
+ - lib/anvl/erc.rb
100
103
  - test/helper.rb
101
104
  - test/test_anvl.rb
105
+ - test/test_element.rb
106
+ - test/test_erc.rb
102
107
  has_rdoc: true
103
108
  homepage: http://github.com/cbeer/anvl
104
109
  licenses:
@@ -136,3 +141,5 @@ summary: Ruby implementation of A Name-Value Language (ANVL)
136
141
  test_files:
137
142
  - test/helper.rb
138
143
  - test/test_anvl.rb
144
+ - test/test_element.rb
145
+ - test/test_erc.rb