xml-mapping 0.9.1 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +10 -53
  3. data/README.md +57 -0
  4. data/Rakefile +75 -85
  5. data/TODO.txt +12 -2
  6. data/examples/README +4 -4
  7. data/examples/cleanup.rb +11 -0
  8. data/examples/company_usage.intout +7 -7
  9. data/examples/documents_folders_usage.intout +2 -2
  10. data/examples/order_signature_enhanced_usage.intout +3 -3
  11. data/examples/order_usage.intout +26 -26
  12. data/examples/person.intout +3 -3
  13. data/examples/person_mm.intout +2 -2
  14. data/examples/publication.intout +2 -2
  15. data/examples/reader.intout +1 -1
  16. data/examples/stringarray_usage.intout +1 -1
  17. data/examples/time_augm.intout +6 -6
  18. data/examples/xpath_create_new.intout +13 -13
  19. data/examples/xpath_ensure_created.intout +2 -2
  20. data/examples/xpath_usage.intout +1 -1
  21. data/lib/xml/mapping.rb +0 -2
  22. data/lib/xml/mapping/base.rb +24 -9
  23. data/lib/xml/mapping/version.rb +1 -1
  24. data/test/company.rb +43 -0
  25. data/test/documents_folders.rb +7 -0
  26. data/test/multiple_mappings_test.rb +3 -1
  27. data/test/xml_mapping_adv_test.rb +20 -20
  28. data/test/xml_mapping_test.rb +31 -2
  29. data/{README → user_manual.md} +916 -154
  30. data/user_manual_xxpath.md +677 -0
  31. metadata +100 -112
  32. data/ChangeLog +0 -189
  33. data/README_XPATH +0 -202
  34. data/examples/company_usage.intin.rb +0 -19
  35. data/examples/documents_folders_usage.intin.rb +0 -18
  36. data/examples/order_signature_enhanced_usage.intin.rb +0 -12
  37. data/examples/order_usage.intin.rb +0 -120
  38. data/examples/person.intin.rb +0 -44
  39. data/examples/person_mm.intin.rb +0 -119
  40. data/examples/publication.intin.rb +0 -44
  41. data/examples/reader.intin.rb +0 -33
  42. data/examples/stringarray_usage.intin.rb +0 -11
  43. data/examples/time_augm.intin.rb +0 -19
  44. data/examples/time_augm_loading.intin.rb +0 -44
  45. data/examples/time_node.intin.rb +0 -79
  46. data/examples/time_node_w_marshallers.intin.rb +0 -48
  47. data/examples/xpath_create_new.intin.rb +0 -85
  48. data/examples/xpath_docvsroot.intin.rb +0 -30
  49. data/examples/xpath_ensure_created.intin.rb +0 -62
  50. data/examples/xpath_pathological.intin.rb +0 -42
  51. data/examples/xpath_usage.intin.rb +0 -51
  52. data/install.rb +0 -41
  53. data/test/xxpath_benchmark.result1.txt +0 -17
@@ -1,44 +0,0 @@
1
- #:invisible:
2
- $:.unshift "../lib"
3
- require 'xml/mapping'
4
- require 'xml/xxpath_methods'
5
-
6
- class Time
7
- include XML::Mapping
8
-
9
- numeric_node :year, "year"
10
- numeric_node :month, "month"
11
- numeric_node :day, "mday"
12
- numeric_node :hour, "hours"
13
- numeric_node :min, "minutes"
14
- numeric_node :sec, "seconds"
15
- end
16
-
17
- #<=
18
- #:invisible_retval:
19
- #:visible:
20
-
21
- def Time.load_from_xml(xml, options={:mapping=>:_default})
22
- year,month,day,hour,min,sec =
23
- [xml.first_xpath("year").text.to_i,
24
- xml.first_xpath("month").text.to_i,
25
- xml.first_xpath("mday").text.to_i,
26
- xml.first_xpath("hours").text.to_i,
27
- xml.first_xpath("minutes").text.to_i,
28
- xml.first_xpath("seconds").text.to_i]
29
- Time.local(year,month,day,hour,min,sec)
30
- end
31
- #<=
32
- #:invisible:
33
- require 'test/unit/assertions'
34
- include Test::Unit::Assertions
35
-
36
- t = Time.now
37
- t2 = Time.load_from_xml(t.save_to_xml)
38
-
39
- assert_equal t.year, t2.year
40
- assert_equal t.month, t2.month
41
- assert_equal t.day, t2.day
42
- assert_equal t.hour, t2.hour
43
- assert_equal t.min, t2.min
44
- assert_equal t.sec, t2.sec
@@ -1,79 +0,0 @@
1
- #:invisible:
2
- $:.unshift "../lib"
3
- #<=
4
- #:visible:
5
- #:invisible_retval:
6
- STDERR.puts "time_node top:\n#{$:.inspect}"
7
-
8
- require 'xml/mapping/base'
9
-
10
- STDERR.puts "time_node after require:\n#{$:.inspect}"
11
-
12
- class TimeNode < XML::Mapping::SingleAttributeNode
13
- def initialize(*args)
14
- STDERR.puts "TimeNode#initialize top:\n#{$:.inspect}"
15
- path,*args = super(*args)
16
- @y_path = XML::XXPath.new(path+"/year")
17
- @m_path = XML::XXPath.new(path+"/month")
18
- @d_path = XML::XXPath.new(path+"/day")
19
- args
20
- end
21
-
22
- def extract_attr_value(xml)
23
- y,m,d = default_when_xpath_err{ [@y_path.first(xml).text.to_i,
24
- @m_path.first(xml).text.to_i,
25
- @d_path.first(xml).text.to_i]
26
- }
27
- Time.local(y,m,d)
28
- end
29
-
30
- def set_attr_value(xml, value)
31
- @y_path.first(xml,:ensure_created=>true).text = value.year
32
- @m_path.first(xml,:ensure_created=>true).text = value.month
33
- @d_path.first(xml,:ensure_created=>true).text = value.day
34
- end
35
- end
36
-
37
- XML::Mapping.add_node_class TimeNode
38
-
39
- #<=
40
- #:invisible:
41
- require 'xml/mapping'
42
-
43
- class Signature
44
- include XML::Mapping
45
-
46
- text_node :name, "Name"
47
- text_node :position, "Position", :default_value=>"Some Employee"
48
- time_node :signed_on, "signed-on", :default_value=>Time.now
49
- end
50
-
51
-
52
- require 'test/unit/assertions'
53
- include Test::Unit::Assertions
54
-
55
- xml = REXML::Document.new('
56
- <Signature>
57
- <Name>John Doe</Name>
58
- <Position>product manager</Position>
59
- <signed-on>
60
- <day>13</day>
61
- <month>2</month>
62
- <year>2005</year>
63
- </signed-on>
64
- </Signature>
65
- ').root
66
-
67
-
68
- s = Signature.load_from_xml xml
69
- assert_equal Time.local(2005,2,13), s.signed_on
70
-
71
- s.signed_on = Time.local(2006,6,15)
72
- xml2 = s.save_to_xml
73
-
74
- require 'xml/xxpath_methods'
75
- assert_equal "15", xml2.first_xpath("signed-on/day").text
76
- assert_equal "6", xml2.first_xpath("signed-on/month").text
77
- assert_equal "2006", xml2.first_xpath("signed-on/year").text
78
-
79
- #<=
@@ -1,48 +0,0 @@
1
- #:invisible:
2
- #:invisible_retval:
3
- $:.unshift "../lib" #<=
4
- #:visible:
5
- require 'xml/mapping'
6
- require 'xml/xxpath_methods'
7
-
8
- class Signature
9
- include XML::Mapping
10
-
11
- text_node :name, "Name"
12
- text_node :position, "Position", :default_value=>"Some Employee"
13
- object_node :signed_on, "signed-on",
14
- :unmarshaller=>proc{|xml|
15
- y,m,d = [xml.first_xpath("year").text.to_i,
16
- xml.first_xpath("month").text.to_i,
17
- xml.first_xpath("day").text.to_i]
18
- Time.local(y,m,d)
19
- },
20
- :marshaller=>proc{|xml,value|
21
- e = xml.elements.add; e.name = "year"; e.text = value.year
22
- e = xml.elements.add; e.name = "month"; e.text = value.month
23
- e = xml.elements.add; e.name = "day"; e.text = value.day
24
-
25
- # xml.first("year",:ensure_created=>true).text = value.year
26
- # xml.first("month",:ensure_created=>true).text = value.month
27
- # xml.first("day",:ensure_created=>true).text = value.day
28
- }
29
- end #<=
30
- #:invisible:
31
- require 'test/unit/assertions'
32
-
33
- include Test::Unit::Assertions
34
-
35
- t=Time.local(2005,12,1)
36
-
37
- s=Signature.new
38
- s.name = "Olaf Klischat"; s.position="chief"; s.signed_on=t
39
- xml = s.save_to_xml
40
-
41
- assert_equal "2005", xml.first_xpath("signed-on/year").text
42
- assert_equal "12", xml.first_xpath("signed-on/month").text
43
- assert_equal "1", xml.first_xpath("signed-on/day").text
44
-
45
- s2 = Signature.load_from_xml xml
46
- assert_equal "Olaf Klischat", s2.name
47
- assert_equal "chief", s2.position
48
- assert_equal t, s2.signed_on
@@ -1,85 +0,0 @@
1
- #:invisible:
2
- $:.unshift "../lib" #<=
3
- #:visible:
4
- require 'xml/xxpath'
5
-
6
- d=REXML::Document.new <<EOS
7
- <foo>
8
- <bar>
9
- <baz key="work">Java</baz>
10
- <baz key="play">Ruby</baz>
11
- </bar>
12
- </foo>
13
- EOS
14
-
15
-
16
- rootelt=d.root
17
-
18
- #:invisible_retval:
19
- path1=XML::XXPath.new("/bar/baz[@key='work']")
20
-
21
- #:visible_retval:
22
- path1.create_new(rootelt)#<=
23
- #:invisible_retval:
24
- d.write($stdout,2)#<=
25
- ### a new element is created for *each* path element, regardless of
26
- ### what existed before. So a new "bar" element was added, with a new
27
- ### "baz" element inside it
28
-
29
- ### same call again...
30
- #:visible_retval:
31
- path1.create_new(rootelt)#<=
32
- #:invisible_retval:
33
- d.write($stdout,2)#<=
34
- ### same procedure -- new elements added for each path element
35
-
36
-
37
- #:visible_retval:
38
- ## get reference to 1st "baz" element
39
- firstbazelt=XML::XXPath.new("/bar/baz").first(rootelt)#<=
40
-
41
- #:invisible_retval:
42
- path2=XML::XXPath.new("@key2")
43
-
44
- #:visible_retval:
45
- path2.create_new(firstbazelt)#<=
46
- #:invisible_retval:
47
- d.write($stdout,2)#<=
48
- ### ok, new attribute node added
49
-
50
- ### same call again...
51
- #:visible_retval:
52
- #:handle_exceptions:
53
- path2.create_new(firstbazelt)#<=
54
- #:no_exceptions:
55
- ### can't create that path anew again -- an element can't have more
56
- ### than one attribute with the same name
57
-
58
- #:invisible_retval:
59
- ### the document hasn't changed
60
- d.write($stdout,2)#<=
61
-
62
-
63
-
64
- ### create_new the same path as in the ensure_created example
65
- #:visible_retval:
66
- baz6elt=XML::XXPath.new("/bar/baz[6]").create_new(rootelt)#<=
67
- #:invisible_retval:
68
- d.write($stdout,2)#<=
69
- ### ok, new "bar" element and 6th "baz" element inside it created
70
-
71
-
72
- #:visible_retval:
73
- #:handle_exceptions:
74
- XML::XXPath.new("baz[6]").create_new(baz6elt.parent)#<=
75
- #:no_exceptions:
76
- #:invisible_retval:
77
- ### yep, baz[6] already existed and thus couldn't be created once
78
- ### again
79
-
80
- ### but of course...
81
- #:visible_retval:
82
- XML::XXPath.new("/bar/baz[6]").create_new(rootelt)#<=
83
- #:invisible_retval:
84
- d.write($stdout,2)#<=
85
- ### this works because *all* path elements are newly created
@@ -1,30 +0,0 @@
1
- #:invisible:
2
- $:.unshift "../lib" #<=
3
- #:visible:
4
- require 'xml/xxpath'
5
-
6
- d=REXML::Document.new <<EOS
7
- <foo>
8
- <bar x="hello">
9
- <first>
10
- <second>pingpong</second>
11
- </first>
12
- </bar>
13
- <bar x="goodbye"/>
14
- </foo>
15
- EOS
16
-
17
- XML::XXPath.new("/foo/bar").all(d)#<=
18
-
19
- XML::XXPath.new("/bar").all(d)#<=
20
-
21
- XML::XXPath.new("/foo/bar").all(d.root)#<=
22
-
23
- XML::XXPath.new("/bar").all(d.root)#<=
24
-
25
-
26
- firstelt = XML::XXPath.new("/foo/bar/first").first(d)#<=
27
-
28
- XML::XXPath.new("/first/second").all(firstelt)#<=
29
-
30
- XML::XXPath.new("/second").all(firstelt)#<=
@@ -1,62 +0,0 @@
1
- #:invisible:
2
- $:.unshift "../lib" #<=
3
- #:visible:
4
- require 'xml/xxpath'
5
-
6
- d=REXML::Document.new <<EOS
7
- <foo>
8
- <bar>
9
- <baz key="work">Java</baz>
10
- <baz key="play">Ruby</baz>
11
- </bar>
12
- </foo>
13
- EOS
14
-
15
-
16
- rootelt=d.root
17
-
18
- #### ensuring that a specific path exists inside the document
19
-
20
- #:visible_retval:
21
- XML::XXPath.new("/bar/baz[@key='work']").first(rootelt,:ensure_created=>true)#<=
22
- #:invisible_retval:
23
- d.write($stdout,2)#<=
24
- ### no change (path existed before)
25
-
26
-
27
- #:visible_retval:
28
- XML::XXPath.new("/bar/baz[@key='42']").first(rootelt,:ensure_created=>true)#<=
29
- #:invisible_retval:
30
- d.write($stdout,2)#<=
31
- ### path was added
32
-
33
- #:visible_retval:
34
- XML::XXPath.new("/bar/baz[@key='42']").first(rootelt,:ensure_created=>true)#<=
35
- #:invisible_retval:
36
- d.write($stdout,2)#<=
37
- ### no change this time
38
-
39
- #:visible_retval:
40
- XML::XXPath.new("/bar/baz[@key2='hello']").first(rootelt,:ensure_created=>true)#<=
41
- #:invisible_retval:
42
- d.write($stdout,2)#<=
43
- ### this fit in the 1st "baz" element since
44
- ### there was no "key2" attribute there before.
45
-
46
- #:visible_retval:
47
- XML::XXPath.new("/bar/baz[2]").first(rootelt,:ensure_created=>true)#<=
48
- #:invisible_retval:
49
- d.write($stdout,2)#<=
50
- ### no change
51
-
52
- #:visible_retval:
53
- XML::XXPath.new("/bar/baz[6]/@haha").first(rootelt,:ensure_created=>true)#<=
54
- #:invisible_retval:
55
- d.write($stdout,2)#<=
56
- ### for there to be a 6th "baz" element, there must be 1st..5th "baz" elements
57
-
58
- #:visible_retval:
59
- XML::XXPath.new("/bar/baz[6]/@haha").first(rootelt,:ensure_created=>true)#<=
60
- #:invisible_retval:
61
- d.write($stdout,2)#<=
62
- ### no change this time
@@ -1,42 +0,0 @@
1
- #:invisible:
2
- $:.unshift "../lib" #<=
3
- #:visible:
4
- require 'xml/xxpath'
5
-
6
- d=REXML::Document.new <<EOS
7
- <foo>
8
- <bar/>
9
- <bar/>
10
- </foo>
11
- EOS
12
-
13
-
14
- rootelt=d.root
15
-
16
-
17
- XML::XXPath.new("*").all(rootelt)#<=
18
- ### ok
19
-
20
- XML::XXPath.new("bar/*").first(rootelt, :allow_nil=>true)#<=
21
- ### ok, nothing there
22
-
23
- ### the same call with :ensure_created=>true
24
- newelt = XML::XXPath.new("bar/*").first(rootelt, :ensure_created=>true)#<=
25
-
26
- #:invisible_retval:
27
- d.write($stdout,2)#<=
28
-
29
- #:visible_retval:
30
- ### a new "unspecified" element was created
31
- newelt.unspecified?#<=
32
-
33
- ### we must modify it to "specify" it
34
- newelt.name="new-one"
35
- newelt.text="hello!"
36
- newelt.unspecified?#<=
37
-
38
- #:invisible_retval:
39
- d.write($stdout,2)#<=
40
-
41
- ### you could also set unspecified to false explicitly, as in:
42
- newelt.unspecified=true
@@ -1,51 +0,0 @@
1
- #:invisible:
2
- $:.unshift "../lib" #<=
3
- #:visible:
4
- require 'xml/xxpath'
5
-
6
- d=REXML::Document.new <<EOS
7
- <foo>
8
- <bar>
9
- <baz key="work">Java</baz>
10
- <baz key="play">Ruby</baz>
11
- </bar>
12
- <bar>
13
- <baz key="ab">hello</baz>
14
- <baz key="play">scrabble</baz>
15
- <baz key="xy">goodbye</baz>
16
- </bar>
17
- <more>
18
- <baz key="play">poker</baz>
19
- </more>
20
- </foo>
21
- EOS
22
-
23
-
24
- ####read access
25
- path=XML::XXPath.new("/foo/bar[2]/baz")
26
-
27
- ## path.all(document) gives all elements matching path in document
28
- path.all(d)#<=
29
-
30
- ## loop over them
31
- path.each(d){|elt| puts elt.text}#<=
32
-
33
- ## the first of those
34
- path.first(d)#<=
35
-
36
- ## no match here (only three "baz" elements)
37
- path2=XML::XXPath.new("/foo/bar[2]/baz[4]")
38
- path2.all(d)#<=
39
-
40
- #:handle_exceptions:
41
- ## "first" raises XML::XXPathError in such cases...
42
- path2.first(d)#<=
43
- #:no_exceptions:
44
-
45
- ##...unless we allow nil returns
46
- path2.first(d,:allow_nil=>true)#<=
47
-
48
- ##attribute nodes can also be returned
49
- keysPath=XML::XXPath.new("/foo/*/*/@key")
50
-
51
- keysPath.all(d).map{|attr|attr.text}#<=