roxml 2.5.3 → 3.1.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.
Files changed (76) hide show
  1. data/.gitignore +7 -0
  2. data/.gitmodules +3 -0
  3. data/History.txt +38 -1
  4. data/README.rdoc +8 -5
  5. data/Rakefile +35 -36
  6. data/TODO +12 -35
  7. data/VERSION +1 -0
  8. data/examples/amazon.rb +8 -6
  9. data/examples/posts.rb +1 -1
  10. data/examples/{active_record.rb → rails.rb} +2 -2
  11. data/examples/twitter.rb +1 -1
  12. data/lib/roxml.rb +86 -151
  13. data/lib/roxml/definition.rb +64 -152
  14. data/lib/roxml/hash_definition.rb +5 -40
  15. data/lib/roxml/xml.rb +12 -9
  16. data/lib/roxml/xml/parsers/libxml.rb +22 -17
  17. data/lib/roxml/xml/parsers/nokogiri.rb +77 -0
  18. data/lib/roxml/xml/references.rb +66 -57
  19. data/roxml.gemspec +170 -19
  20. data/spec/definition_spec.rb +121 -198
  21. data/spec/examples/active_record_spec.rb +2 -2
  22. data/spec/examples/amazon_spec.rb +3 -2
  23. data/spec/examples/current_weather_spec.rb +2 -2
  24. data/spec/examples/dashed_elements_spec.rb +2 -2
  25. data/spec/examples/library_spec.rb +11 -6
  26. data/spec/examples/post_spec.rb +3 -3
  27. data/spec/examples/twitter_spec.rb +2 -2
  28. data/spec/roxml_spec.rb +15 -15
  29. data/spec/shared_specs.rb +1 -1
  30. data/spec/spec_helper.rb +8 -27
  31. data/spec/support/libxml.rb +3 -0
  32. data/spec/support/nokogiri.rb +3 -0
  33. data/spec/xml/attributes_spec.rb +36 -0
  34. data/spec/xml/namespace_spec.rb +240 -0
  35. data/spec/xml/namespaces_spec.rb +32 -0
  36. data/spec/xml/parser_spec.rb +9 -30
  37. data/tasks/rdoc.rake +13 -0
  38. data/tasks/rspec.rake +21 -17
  39. data/tasks/test.rake +13 -20
  40. data/test/mocks/dictionaries.rb +8 -7
  41. data/test/mocks/mocks.rb +20 -20
  42. data/test/support/fixtures.rb +11 -0
  43. data/test/test_helper.rb +3 -14
  44. data/test/unit/definition_test.rb +21 -95
  45. data/test/unit/deprecations_test.rb +1 -74
  46. data/test/unit/to_xml_test.rb +3 -3
  47. data/test/unit/xml_attribute_test.rb +1 -1
  48. data/test/unit/xml_block_test.rb +3 -3
  49. data/test/unit/xml_bool_test.rb +4 -4
  50. data/test/unit/xml_convention_test.rb +3 -3
  51. data/test/unit/xml_hash_test.rb +5 -14
  52. data/test/unit/xml_initialize_test.rb +2 -6
  53. data/test/unit/xml_name_test.rb +5 -24
  54. data/test/unit/xml_namespace_test.rb +1 -46
  55. data/test/unit/xml_object_test.rb +6 -6
  56. data/test/unit/xml_required_test.rb +3 -2
  57. data/test/unit/xml_text_test.rb +2 -2
  58. data/website/index.html +1 -1
  59. metadata +68 -51
  60. data/Manifest.txt +0 -106
  61. data/lib/roxml/extensions.rb +0 -6
  62. data/lib/roxml/extensions/array.rb +0 -13
  63. data/lib/roxml/extensions/array/conversions.rb +0 -35
  64. data/lib/roxml/extensions/deprecation.rb +0 -33
  65. data/lib/roxml/extensions/string.rb +0 -21
  66. data/lib/roxml/extensions/string/conversions.rb +0 -43
  67. data/lib/roxml/extensions/string/iterators.rb +0 -12
  68. data/lib/roxml/xml/parsers/rexml.rb +0 -84
  69. data/spec/string_spec.rb +0 -15
  70. data/test/bugs/rexml_bugs.rb +0 -15
  71. data/test/release/dependencies_test.rb +0 -32
  72. data/test/unit/xml_construct_test.rb +0 -77
  73. data/vendor/override_rake_task/README +0 -30
  74. data/vendor/override_rake_task/init.rb +0 -1
  75. data/vendor/override_rake_task/install.rb +0 -46
  76. data/vendor/override_rake_task/lib/override_rake_task.rb +0 -16
@@ -1,106 +0,0 @@
1
- History.txt
2
- MIT-LICENSE
3
- Manifest.txt
4
- README.rdoc
5
- Rakefile
6
- TODO
7
- config/website.yml
8
- examples/active_record.rb
9
- examples/amazon.rb
10
- examples/current_weather.rb
11
- examples/dashed_elements.rb
12
- examples/library.rb
13
- examples/posts.rb
14
- examples/twitter.rb
15
- examples/xml/active_record.xml
16
- examples/xml/amazon.xml
17
- examples/xml/current_weather.xml
18
- examples/xml/dashed_elements.xml
19
- examples/xml/posts.xml
20
- examples/xml/twitter.xml
21
- lib/roxml.rb
22
- lib/roxml/definition.rb
23
- lib/roxml/extensions.rb
24
- lib/roxml/extensions/array.rb
25
- lib/roxml/extensions/array/conversions.rb
26
- lib/roxml/extensions/deprecation.rb
27
- lib/roxml/extensions/string.rb
28
- lib/roxml/extensions/string/conversions.rb
29
- lib/roxml/extensions/string/iterators.rb
30
- lib/roxml/hash_definition.rb
31
- lib/roxml/xml.rb
32
- lib/roxml/xml/parsers/libxml.rb
33
- lib/roxml/xml/parsers/rexml.rb
34
- lib/roxml/xml/references.rb
35
- roxml.gemspec
36
- spec/definition_spec.rb
37
- spec/examples/active_record_spec.rb
38
- spec/examples/amazon_spec.rb
39
- spec/examples/current_weather_spec.rb
40
- spec/examples/dashed_elements_spec.rb
41
- spec/examples/library_spec.rb
42
- spec/examples/post_spec.rb
43
- spec/examples/twitter_spec.rb
44
- spec/roxml_spec.rb
45
- spec/shared_specs.rb
46
- spec/spec.opts
47
- spec/spec_helper.rb
48
- spec/string_spec.rb
49
- spec/xml/parser_spec.rb
50
- tasks/rspec.rake
51
- tasks/test.rake
52
- test/bugs/rexml_bugs.rb
53
- test/fixtures/book_malformed.xml
54
- test/fixtures/book_pair.xml
55
- test/fixtures/book_text_with_attribute.xml
56
- test/fixtures/book_valid.xml
57
- test/fixtures/book_with_authors.xml
58
- test/fixtures/book_with_contributions.xml
59
- test/fixtures/book_with_contributors.xml
60
- test/fixtures/book_with_contributors_attrs.xml
61
- test/fixtures/book_with_default_namespace.xml
62
- test/fixtures/book_with_depth.xml
63
- test/fixtures/book_with_octal_pages.xml
64
- test/fixtures/book_with_publisher.xml
65
- test/fixtures/book_with_wrapped_attr.xml
66
- test/fixtures/dictionary_of_attr_name_clashes.xml
67
- test/fixtures/dictionary_of_attrs.xml
68
- test/fixtures/dictionary_of_guarded_names.xml
69
- test/fixtures/dictionary_of_mixeds.xml
70
- test/fixtures/dictionary_of_name_clashes.xml
71
- test/fixtures/dictionary_of_names.xml
72
- test/fixtures/dictionary_of_texts.xml
73
- test/fixtures/library.xml
74
- test/fixtures/library_uppercase.xml
75
- test/fixtures/muffins.xml
76
- test/fixtures/nameless_ageless_youth.xml
77
- test/fixtures/node_with_attr_name_conflicts.xml
78
- test/fixtures/node_with_name_conflicts.xml
79
- test/fixtures/numerology.xml
80
- test/fixtures/person.xml
81
- test/fixtures/person_with_guarded_mothers.xml
82
- test/fixtures/person_with_mothers.xml
83
- test/mocks/dictionaries.rb
84
- test/mocks/mocks.rb
85
- test/release/dependencies_test.rb
86
- test/test_helper.rb
87
- test/unit/definition_test.rb
88
- test/unit/deprecations_test.rb
89
- test/unit/to_xml_test.rb
90
- test/unit/xml_attribute_test.rb
91
- test/unit/xml_block_test.rb
92
- test/unit/xml_bool_test.rb
93
- test/unit/xml_construct_test.rb
94
- test/unit/xml_convention_test.rb
95
- test/unit/xml_hash_test.rb
96
- test/unit/xml_initialize_test.rb
97
- test/unit/xml_name_test.rb
98
- test/unit/xml_namespace_test.rb
99
- test/unit/xml_object_test.rb
100
- test/unit/xml_required_test.rb
101
- test/unit/xml_text_test.rb
102
- vendor/override_rake_task/README
103
- vendor/override_rake_task/init.rb
104
- vendor/override_rake_task/install.rb
105
- vendor/override_rake_task/lib/override_rake_task.rb
106
- website/index.html
@@ -1,6 +0,0 @@
1
- require 'rubygems'
2
- require 'active_support'
3
-
4
- %w(deprecation array string).each do |file|
5
- require File.join(File.dirname(__FILE__), 'extensions', file)
6
- end
@@ -1,13 +0,0 @@
1
- module Enumerable #:nodoc:all
2
- unless method_defined?(:one?)
3
- def one?
4
- size == 1
5
- end
6
- end
7
- end
8
-
9
- require File.join(File.dirname(__FILE__), 'array/conversions')
10
-
11
- class Array #:nodoc:
12
- include ROXML::CoreExtensions::Array::Conversions
13
- end
@@ -1,35 +0,0 @@
1
- module ROXML
2
- module CoreExtensions
3
- module Array #:nodoc:all
4
- module Conversions
5
- # Translates an array into a hash, where each element of the array is
6
- # an array with 2 elements:
7
- #
8
- # >> [[:key, :value], [1, 2], ['key', 'value']].to_h
9
- # => {:key => :value, 1 => 2, 'key' => 'value'}
10
- #
11
- def to_hash
12
- hash = inject({}) do |result, (k, v)|
13
- result[k] ||= []
14
- result[k] << v
15
- result
16
- end
17
- hash.each_pair do |k, v|
18
- hash[k] = v.first if v.one?
19
- end
20
- hash
21
- end
22
-
23
- def to_h #:nodoc:
24
- to_hash
25
- end
26
- deprecate :to_h => :to_hash
27
-
28
- def apply_to(val)
29
- # Only makes sense for arrays of blocks... maybe better outside Array...
30
- inject(val) {|val, block| block.call(val) }
31
- end
32
- end
33
- end
34
- end
35
- end
@@ -1,33 +0,0 @@
1
- require 'active_support/core_ext/kernel/reporting'
2
- require 'active_support/core_ext/module/attribute_accessors'
3
- require 'active_support/deprecation'
4
- require 'active_support/version'
5
-
6
- module ActiveSupport # :nodoc:all
7
- module Deprecation
8
- class << self
9
- def warn_with_internals_exclusion(message = nil, callstack = caller)
10
- warn_without_internals_exclusion(message, callstack.reject {|line| line =~ /\/roxml(-[\d\.]+)?\/lib\// })
11
- end
12
- alias_method_chain :warn, :internals_exclusion
13
-
14
- if VERSION::MAJOR <= 2 && VERSION::MINOR <= 1
15
- def deprecation_message(callstack, message = nil)
16
- message ||= "You are using deprecated behavior which will be removed from the next major or minor release"
17
- "DEPRECATION WARNING: #{message}. #{deprecation_caller_message(callstack)}"
18
- end
19
- end
20
- end
21
-
22
- module ClassMethods
23
- def deprecated_method_warning(method_name, message=nil)
24
- warning = "#{method_name} is deprecated and will be removed from the next major or minor release"
25
- case message
26
- when Symbol then "#{warning}. (use #{message} instead)"
27
- when String then "#{warning}. (#{message})"
28
- else warning
29
- end
30
- end
31
- end
32
- end
33
- end
@@ -1,21 +0,0 @@
1
- require File.join(File.dirname(__FILE__), 'string/conversions')
2
- require File.join(File.dirname(__FILE__), 'string/iterators')
3
-
4
- class String #:nodoc:
5
- include ROXML::CoreExtensions::String::Conversions
6
- include ROXML::CoreExtensions::String::Iterators
7
- end
8
-
9
- class Object #:nodoc:
10
- # Deprecated in favor of explicit #to_s.to_utf
11
- def to_utf
12
- ActiveSupport::Deprecation.warn "This method will be removed from Object please use String#to_utf instead via explicit #to_s"
13
- to_s.to_utf
14
- end
15
-
16
- # Deprecated in favor of explicit #to_s.to_latin
17
- def to_latin
18
- ActiveSupport::Deprecation.warn "This method will be removed from Object please use String#to_latin instead via explicit #to_s"
19
- to_s.to_latin
20
- end
21
- end
@@ -1,43 +0,0 @@
1
- module ROXML
2
- module CoreExtensions #:nodoc:
3
- module String
4
- # Extension of String class to handle conversion from/to
5
- # UTF-8/ISO-8869-1
6
- module Conversions
7
- require 'iconv'
8
-
9
- #
10
- # Return an utf-8 representation of this string.
11
- #
12
- def to_utf
13
- begin
14
- Iconv.new("utf-8", "iso-8859-1").iconv(to_s)
15
- rescue Iconv::IllegalSequence
16
- STDERR << "!! Failed converting from UTF-8 -> ISO-8859-1 (#{self}). Already the right charset?"
17
- self
18
- end
19
- end
20
- deprecate :to_utf
21
-
22
- #
23
- # Convert this string to iso-8850-1
24
- #
25
- def to_latin
26
- begin
27
- Iconv.new("iso-8859-1", "utf-8").iconv(to_s)
28
- rescue Iconv::IllegalSequence
29
- STDERR << "!! Failed converting from ISO-8859-1 -> UTF-8 (#{self}). Already the right charset?"
30
- self
31
- end
32
- end
33
- deprecate :to_latin
34
- end
35
- end
36
- end
37
- end
38
-
39
- class String
40
- def between(separator, &block)
41
- split(separator).collect(&block).join(separator)
42
- end
43
- end
@@ -1,12 +0,0 @@
1
- module ROXML
2
- module CoreExtensions
3
- module String #:nodoc:all
4
- module Iterators
5
- # Allows you to iterate over and modify the sub-strings between _separator_. Returns the joined result of the modification.
6
- def between(separator, &block)
7
- split(separator).collect(&block).join(separator)
8
- end
9
- end
10
- end
11
- end
12
- end
@@ -1,84 +0,0 @@
1
- require 'rexml/document'
2
-
3
- module ROXML
4
- module XML # :nodoc:all
5
- Document = REXML::Document
6
- Node = REXML::Element
7
-
8
- module Error
9
- def self.reset_handler
10
- # noop
11
- end
12
- end
13
- [REXML::ParseException, REXML::UndefinedNamespaceException, REXML::Validation::ValidationException].each do |exception|
14
- exception.send(:include, Error)
15
- end
16
-
17
- class Node
18
- class << self
19
- def new_cdata(content)
20
- REXML::CData.new(content)
21
- end
22
- end
23
-
24
- alias_attribute :content, :text
25
-
26
- def search(xpath)
27
- begin
28
- REXML::XPath.match(self, xpath)
29
- rescue Exception => ex
30
- raise ex, xpath
31
- end
32
- end
33
-
34
- def add_child(element)
35
- if element.is_a?(REXML::CData)
36
- REXML::CData.new(element, true, self)
37
- else
38
- add_element(element)
39
- end
40
- end
41
-
42
- def ==(other)
43
- to_s == other.to_s
44
- end
45
- end
46
-
47
- class Parser
48
- class << self
49
- def parse(source)
50
- REXML::Document.new(source, :ignore_whitespace_nodes => :all)
51
- end
52
-
53
- def parse_file(path) #:nodoc:
54
- path = path.sub('file:', '') if path.starts_with?('file:')
55
- parse(open(path))
56
- end
57
-
58
- def parse_io(path) #:nodoc:
59
- parse(path)
60
- end
61
-
62
- def register_error_handler(&block)
63
- end
64
- end
65
- ParseError = REXML::ParseException
66
- end
67
-
68
- class Document
69
- delegate :search, :to => :root
70
-
71
- def root=(node)
72
- raise ArgumentError, "Root is already defined" if root
73
- add(node)
74
- end
75
-
76
- def save(destination, opts = {:formatter => REXML::Formatters::Default.new})
77
- self << REXML::XMLDecl.new unless xml_decl != REXML::XMLDecl.default # always output xml declaration
78
- File.open(destination, "w") do |f|
79
- opts[:formatter].write(self, f)
80
- end
81
- end
82
- end
83
- end
84
- end
@@ -1,15 +0,0 @@
1
- require File.dirname(__FILE__) + '/spec_helper.rb'
2
-
3
- describe String do
4
- describe "#to_latin" do
5
- it "should be accessible" do
6
- "".should respond_to(:to_latin)
7
- end
8
- end
9
-
10
- describe "#to_utf" do
11
- it "should be accessible" do
12
- "".should respond_to(:to_utf)
13
- end
14
- end
15
- end
@@ -1,15 +0,0 @@
1
- require File.join(File.dirname(__FILE__), '..', 'test_helper')
2
-
3
- class RexmlBugs < ActiveSupport::TestCase
4
- def test_that_some_illegal_chars_are_parsed_without_complaint
5
- p "REXML ignores illegal ']]>' brackets in xml content"
6
- assert_nothing_raised do
7
- # The right angle bracket (>) may be represented using the string "&gt;", and MUST, for compatibility,
8
- # be escaped using either "&gt;" or a character reference when it appears in the string "]]>" in content,
9
- # when that string is not marking the end of a CDATA section.
10
- # - http://www.w3.org/TR/xml11/#syntax
11
- xml = "<title>The Big Book of ]]> everything more</title>"
12
- assert_equal xml, REXML::Document.new(xml).to_s
13
- end
14
- end
15
- end
@@ -1,32 +0,0 @@
1
- require 'test/unit'
2
-
3
- class TestDependencies < Test::Unit::TestCase
4
- def assert_dependency_included(*args)
5
- # assert methods are removed
6
- args.each do |type, method, source|
7
- type.send(:remove_method, method) if type.instance_methods.include?(method.to_s)
8
- assert !type.instance_methods.include?(method.to_s)
9
- end
10
-
11
- load File.join(File.dirname(__FILE__), '../../lib/roxml.rb')
12
-
13
- # assert_instance_methods returned to their rightful positions
14
- args.each do |type, method, source|
15
- assert type.instance_methods.include?(method.to_s)
16
- end
17
-
18
- #assert ROXML has what it needs
19
- assert_nothing_raised do
20
- Class.new do
21
- include ROXML
22
-
23
- xml_reader :deps
24
- end
25
- end
26
- end
27
-
28
- def test_symbol_to_proc_is_added_by_roxml
29
- assert_dependency_included([Symbol, :to_proc, 'active_support/core_ext/symbol.rb'],
30
- [Enumerable, :one?, 'extensions/enumerable.rb'])
31
- end
32
- end
@@ -1,77 +0,0 @@
1
- require File.join(File.dirname(__FILE__), '..', 'test_helper')
2
-
3
- class MeasurementWithXmlConstruct
4
- include ROXML
5
-
6
- xml_reader :units, :from => :attr
7
- xml_reader :value, :from => :content
8
-
9
- xml_construct_without_deprecation :value, :units
10
-
11
- def initialize(value, units = 'pixels')
12
- @value = Float(value)
13
- @units = units.to_s
14
- if @units.starts_with? 'hundredths-'
15
- @value /= 100
16
- @units = @units.split('hundredths-')[1]
17
- end
18
- end
19
-
20
- def ==(other)
21
- other.units == @units && other.value == @value
22
- end
23
- end
24
-
25
- class BookWithDepthWithXmlConstruct
26
- include ROXML
27
-
28
- xml_reader :isbn, :from => '@ISBN'
29
- xml_reader :title
30
- xml_reader :description, :cdata => true
31
- xml_reader :author
32
- xml_reader :depth, MeasurementWithXmlConstruct
33
- end
34
-
35
- class InheritedBookWithDepthWithXmlConstruct < Book
36
- xml_reader :depth, MeasurementWithXmlConstruct
37
- end
38
-
39
- class TestXMLConstruct < ActiveSupport::TestCase
40
- def test_is_deprecated
41
- assert_deprecated do
42
- MeasurementWithXmlConstruct.xml_construction_args
43
- end
44
- end
45
-
46
- def test_initialize_is_run
47
- m = MeasurementWithXmlConstruct.from_xml('<measurement units="hundredths-meters">1130</measurement>')
48
- assert_equal 11.3, m.value
49
- assert_equal 'meters', m.units
50
- end
51
-
52
- def test_initialize_is_run_for_nested_type
53
- b = BookWithDepthWithXmlConstruct.from_xml(fixture(:book_with_depth))
54
- assert_equal Measurement.new(11.3, 'meters'), b.depth
55
- end
56
-
57
- def test_initialize_is_run_for_nested_type_with_inheritance
58
- b = InheritedBookWithDepthWithXmlConstruct.from_xml(fixture(:book_with_depth))
59
- assert_equal Measurement.new(11.3, 'meters'), b.depth
60
- end
61
-
62
- def test_xml_name_uses_accessor_not_name
63
- assert_nothing_raised do
64
- Class.new do
65
- include ROXML
66
-
67
- xml_reader :bar, :from => '@Foo'
68
- xml_reader :foo, :text => 'Foo'
69
- xml_reader :baz, :from => '@Bar'
70
-
71
- xml_construct_without_deprecation :baz, :bar, :foo
72
- def initialize(baz, bar, foo)
73
- end
74
- end
75
- end
76
- end
77
- end