mapricot 0.0.4 → 0.0.5

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.
@@ -1,4 +1,3 @@
1
- require 'open-uri'
2
1
  require 'hpricot'
3
2
  require 'libxml'
4
3
  require 'nokogiri'
@@ -13,30 +12,9 @@ module Mapricot
13
12
 
14
13
  class AbstractDoc
15
14
 
16
- def self.from_url(url)
17
- adoc = new
18
- adoc.url = url
19
- adoc
20
- end
21
-
22
- def self.from_string(string)
23
- adoc = new
24
- adoc.string = string
25
- adoc
26
- end
27
-
28
- def url=(url)
29
- if Mapricot.parser == :libxml
30
- @udoc = LibXML::XML::Parser.file(url).parse
31
- elsif Mapricot.parser == :hpricot
32
- @udoc = Hpricot::XML(open(url))
33
- elsif Mapricot.parser == :nokogiri
34
- @udoc = Nokogiri::HTML(open(url))
35
- end
36
- end
37
-
38
- def string=(string)
15
+ def initialize(string)
39
16
  if Mapricot.parser == :libxml
17
+ string = string.read if string.is_a?(StringIO)
40
18
  @udoc = LibXML::XML::Parser.string(string).parse
41
19
  elsif Mapricot.parser == :hpricot
42
20
  @udoc = Hpricot::XML(string)
@@ -68,7 +68,7 @@ module Mapricot
68
68
  @value = nil
69
69
  else
70
70
  if @type == :xml
71
- @value = class_from_name.new(:xml => node_list.first.to_s)
71
+ @value = class_from_name.new(node_list.first.to_s)
72
72
  else
73
73
  @value = node_list.first.contents
74
74
  typecast
@@ -88,7 +88,7 @@ module Mapricot
88
88
  @value = []
89
89
  node_list.each do |node|
90
90
  if @type == :xml
91
- @value << class_from_name.new(:xml => node.to_s)
91
+ @value << class_from_name.new(node.to_s)
92
92
  else
93
93
  @value << node.contents
94
94
  end
@@ -97,4 +97,4 @@ module Mapricot
97
97
  end
98
98
  end
99
99
 
100
- end
100
+ end
data/lib/mapricot/base.rb CHANGED
@@ -39,18 +39,31 @@ module Mapricot
39
39
  end
40
40
  end
41
41
 
42
- # class SomeClass < Mapricot::Base; end;
43
- # SomeClass.new :url => "http://some_url"
44
- # SomeClass.new :xml => %(<hi></hi>)
42
+ # class Foo < Mapricot::Base; end;
43
+ # Foo.new :url => "http://www.example.com"
44
+ # Foo.new :xml => %(<hi></hi>)
45
45
  # the class instance variable @association_list is duplicated in every instance of Feed, as the instance variable @associations.
46
46
  # i.e. Feed.association_list is the template for feed.associations
47
- def initialize(opts)
48
- @doc = AbstractDoc.from_url(opts[:url]) if opts[:url]
49
- @doc = AbstractDoc.from_string(opts[:xml]) if opts[:xml]
47
+ def initialize(str)
48
+ @doc = AbstractDoc.new(correct_input_for_legacy_interface(str))
50
49
  dup_associations_and_attributes
51
50
  map_associations
52
51
  map_attributes
53
52
  end
53
+
54
+ private
55
+
56
+ def correct_input_for_legacy_interface(opts)
57
+ return opts if !opts.is_a?(Hash)
58
+
59
+ $stderr.puts "Initializing with a hash is deprecated, please pass a String or StringIO, see http://github.com/lzell/mapricot for examples."
60
+ if opts[:url]
61
+ require 'open-uri'
62
+ open(opts[:url])
63
+ else
64
+ opts[:xml]
65
+ end
66
+ end
54
67
 
55
68
  def dup_associations_and_attributes
56
69
  @associations = self.class.association_list.collect {|x| x.dup} # do not do this: self.class.association_list.dup
@@ -78,4 +91,4 @@ module Mapricot
78
91
  self.class.name.downcase.match(/[^:]+$/)[0]
79
92
  end
80
93
  end
81
- end
94
+ end
data/mapricot.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "mapricot"
3
- s.version = "0.0.4"
3
+ s.version = "0.0.5"
4
4
  s.summary = "XML to object mapper"
5
5
  s.email = "lzell11@gmail.com"
6
6
  s.homepage = "http://github.com/lzell/mapricot"
@@ -34,7 +34,7 @@ Gem::Specification.new do |s|
34
34
  s.require_paths = ["lib"]
35
35
  s.rdoc_options = ["--main", "README.rdoc", "--title", "Mapricot"]
36
36
  s.extra_rdoc_files = ["README.rdoc"]
37
- s.add_dependency("hpricot")
38
- s.add_dependency("nokogiri")
39
- s.add_dependency("libxml-ruby")
37
+ s.add_dependency("hpricot", ">= 0.7")
38
+ s.add_dependency("nokogiri", ">= 1.4.1")
39
+ s.add_dependency("libxml-ruby", ">= 1.1.3")
40
40
  end
@@ -30,7 +30,7 @@ class TestResponse < Test::Unit::TestCase
30
30
  def test_response
31
31
  @parsers.each do |parser|
32
32
  Mapricot.parser = parser
33
- response = Response.new(:xml => @xml)
33
+ response = Response.new(@xml)
34
34
  assert_equal "New York", response.location.city
35
35
  assert_equal "NY", response.location.state
36
36
  assert_equal "nyc", response.location.code
@@ -23,7 +23,7 @@ class TestResponseWithManyIds < Test::Unit::TestCase
23
23
  def test_response
24
24
  @parsers.each do |parser|
25
25
  Mapricot.parser = parser
26
- response = ResponseWithManyIds.new(:xml => @xml)
26
+ response = ResponseWithManyIds.new(@xml)
27
27
  assert_equal 10, response.ids[0]
28
28
  assert_equal 20, response.ids[1]
29
29
  assert_equal 30, response.ids[2]
@@ -39,7 +39,7 @@ class TestResponseWithManyIds < Test::Unit::TestCase
39
39
 
40
40
 
41
41
  def test_internals
42
- response = ResponseWithManyIds.new(:xml => @xml)
42
+ response = ResponseWithManyIds.new(@xml)
43
43
  template = response.class.association_list.first
44
44
  assert_equal :ids, template.name
45
45
  assert_equal :integer, template.type
@@ -52,4 +52,4 @@ class TestResponseWithManyIds < Test::Unit::TestCase
52
52
  assert_nil ass.namespace
53
53
  assert_equal [10,20,30], ass.value
54
54
  end
55
- end
55
+ end
@@ -32,7 +32,7 @@ class TestResponseWithNesting < Test::Unit::TestCase
32
32
  def test_response
33
33
  @parsers.each do |parser|
34
34
  Mapricot.parser = parser
35
- response = ResponseWithNesting.new(:xml => @xml)
35
+ response = ResponseWithNesting.new(@xml)
36
36
  assert_equal 10, response.users[0].id
37
37
  assert_equal "bob", response.users[0].name
38
38
  assert_equal 20, response.users[1].id
@@ -48,7 +48,7 @@ class TestResponseWithNesting < Test::Unit::TestCase
48
48
 
49
49
 
50
50
  def test_response_internals
51
- response = ResponseWithNesting.new(:xml => @xml)
51
+ response = ResponseWithNesting.new(@xml)
52
52
  template = response.class.association_list.first
53
53
 
54
54
  assert_equal :users, template.name
@@ -64,7 +64,7 @@ class TestResponseWithNesting < Test::Unit::TestCase
64
64
  end
65
65
 
66
66
  def test_response_users_internals
67
- response = ResponseWithNesting.new(:xml => @xml)
67
+ response = ResponseWithNesting.new(@xml)
68
68
  template = response.users.first.class.association_list.first
69
69
  assert_equal :id, template.name
70
70
  assert_equal :integer, template.type
@@ -78,4 +78,4 @@ class TestResponseWithNesting < Test::Unit::TestCase
78
78
  assert_equal 10, ass.value
79
79
  end
80
80
 
81
- end
81
+ end
@@ -18,7 +18,7 @@ class TestReponseWithOneId < Test::Unit::TestCase
18
18
  def test_response
19
19
  @parsers.each do |parser|
20
20
  Mapricot.parser = parser
21
- response = ResponseWithOneId.new(:xml => @xml)
21
+ response = ResponseWithOneId.new(@xml)
22
22
  assert_equal 10, response.id
23
23
  end
24
24
  end
@@ -24,7 +24,7 @@ class TestReponseWithNesting < Test::Unit::TestCase
24
24
  def test_response
25
25
  @parsers.each do |parser|
26
26
  Mapricot.parser = parser
27
- response = ResponseWithNesting.new(:xml => @xml)
27
+ response = ResponseWithNesting.new(@xml)
28
28
  assert_equal "bob", response.user.name
29
29
  end
30
30
  end
data/test/suite.rb CHANGED
@@ -10,7 +10,7 @@ test_glob = File.join(path, "**", "test_*.rb")
10
10
  tests = Dir.glob(test_glob)
11
11
 
12
12
  if ARGV[0] != 'rg'
13
- tests.each {|test| system("ruby #{test}")}
13
+ tests.each {|test| system("ruby -rubygems #{test}")}
14
14
  else
15
15
  tests.each {|test| system("rg #{test}")}
16
16
  end
@@ -4,15 +4,10 @@ require File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib', 'maprico
4
4
 
5
5
  class TestAbstractDoc < Test::Unit::TestCase
6
6
 
7
- def test_initialize_from_string_or_url
8
- assert_respond_to Mapricot::AbstractDoc, :from_string
9
- assert_respond_to Mapricot::AbstractDoc, :from_url
10
- end
11
-
12
7
  def test_getting_node_contents
13
8
  [:libxml, :nokogiri, :hpricot].each do |parser|
14
9
  Mapricot.parser = parser
15
- @doc = Mapricot::AbstractDoc.from_string('<user>bob</user>')
10
+ @doc = Mapricot::AbstractDoc.new('<user>bob</user>')
16
11
  @node = @doc.find(:user).first
17
12
  assert_equal "bob", @node.contents
18
13
  assert_equal "<user>bob</user>", @node.to_s
@@ -22,7 +17,7 @@ class TestAbstractDoc < Test::Unit::TestCase
22
17
  def test_node_list
23
18
  [:libxml, :nokogiri, :hpricot].each do |parser|
24
19
  Mapricot.parser = parser
25
- @doc = Mapricot::AbstractDoc.from_string('<response><user>sally</user><user>bob</user></response>')
20
+ @doc = Mapricot::AbstractDoc.new('<response><user>sally</user><user>bob</user></response>')
26
21
  @node_list = @doc.find(:user)
27
22
  assert_instance_of Mapricot::AbstractNodeList, @node_list
28
23
  assert_respond_to @node_list, :each
@@ -5,52 +5,94 @@ require File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib', 'maprico
5
5
  # Please look at test_mapricot_readme.rb first!!
6
6
  # !!!!!!!!!!!!!!!!!!
7
7
 
8
+ # Add test to parse uri, I'll use Natural Inputs as the example:
9
+ module NI
10
+ class NaturalInputsResponse < Mapricot::Base
11
+ has_one :message
12
+ has_many :occurrences, :xml
13
+ end
14
+
15
+ class Occurrence < Mapricot::Base
16
+ has_one :type
17
+ has_one :start_date
18
+ has_one :end_date
19
+ has_one :start_time
20
+ has_one :end_time
21
+ has_one :day_of_week
22
+ has_one :week_of_month, :integer
23
+ has_one :date_of_month, :integer
24
+ has_one :interval, :integer
25
+ end
26
+ end
27
+
28
+ class TestNI < Test::Unit::TestCase
29
+
30
+ def setup
31
+ query = "go to the park tomorrow at 10am"
32
+ now = Time.local(2010, 'Apr', 6)
33
+ @url = "http://naturalinputs.com/query?q=#{URI.escape(query)}&t=#{now.strftime("%Y%m%dT%H%M%S")}"
34
+ end
35
+
36
+ def test_url_parsing
37
+ require 'open-uri'
38
+
39
+ [:hpricot, :nokogiri, :libxml].each do |parser|
40
+ Mapricot.parser = parser
41
+ response = NI::NaturalInputsResponse.new(open(@url))
42
+ assert_equal "go to the park", response.message
43
+ assert_equal "20100407", response.occurrences.first.start_date
44
+ assert_equal "10:00:00", response.occurrences.first.start_time
45
+ end
46
+ end
47
+ end
48
+
49
+
50
+
8
51
  class FeedA < Mapricot::Base
9
- has_one :bar
52
+ has_one :name
10
53
  end
11
54
 
12
55
  class TestFeedA < Test::Unit::TestCase
13
56
 
14
- def test_no_bar
15
- feeda = FeedA.new(:xml => "<no></no>")
16
- assert feeda.bar.nil?
57
+ def test_no_name
58
+ feeda = FeedA.new("<notag></notag>")
59
+ assert feeda.name.nil?
17
60
  end
18
61
 
19
- def test_empty_bar
20
- feeda = FeedA.new(:xml => "<bar></bar>")
21
- assert feeda.bar.empty?
62
+ def test_empty_name
63
+ feeda = FeedA.new("<name></name>")
64
+ assert feeda.name.empty?
22
65
  end
23
66
 
24
- def test_full_bar
25
- @feed = FeedA.new(:xml => "<bar>is full</bar>")
26
- assert_equal "is full", @feed.bar
67
+ def test_full_name
68
+ @feed = FeedA.new("<name>Lou</name>")
69
+ assert_equal "Lou", @feed.name
27
70
  end
28
71
  end
29
72
 
30
73
 
31
-
32
-
33
74
  class FeedB < Mapricot::Base
34
- has_many :bars
75
+ has_many :names
35
76
  end
36
77
 
37
78
  class TestFeedB < Test::Unit::TestCase
38
- def test_many_empty_bars
39
- feedb = FeedB.new(:xml => "<notag></notag>")
40
- assert feedb.bars.is_a?(Array)
41
- assert feedb.bars.empty?
79
+ def test_many_empty_names
80
+ feedb = FeedB.new("<notag></notag>")
81
+ assert feedb.names.is_a?(Array)
82
+ assert feedb.names.empty?
42
83
  end
43
84
 
44
- def test_full_bars
45
- feedb = FeedB.new(:xml => %(
85
+ def test_full_names
86
+ xml = %(
46
87
  <response>
47
- <bar>wet</bar>
48
- <bar>full</bar>
88
+ <name>Lou</name>
89
+ <name>Pizza the Hut</name>
49
90
  </response>
50
- ))
91
+ )
92
+ feedb = FeedB.new(xml)
51
93
 
52
- assert_equal "wet", feedb.bars.first
53
- assert_equal "full", feedb.bars.last
94
+ assert_equal "Lou", feedb.names.first
95
+ assert_equal "Pizza the Hut", feedb.names.last
54
96
  end
55
97
  end
56
98
 
@@ -67,12 +109,12 @@ end
67
109
 
68
110
  class TestFeedC < Test::Unit::TestCase
69
111
  def test_many_empty_bars
70
- feedc = FeedC.new(:xml => "<no></no>")
112
+ feedc = FeedC.new("<no></no>")
71
113
  assert feedc.bars.empty?
72
114
  end
73
115
 
74
116
  def test_many_bars
75
- feedc = FeedC.new(:xml => %(
117
+ feedc = FeedC.new(%(
76
118
  <response>
77
119
  <bar>
78
120
  <name>maroon saloon</name>
@@ -87,3 +129,7 @@ class TestFeedC < Test::Unit::TestCase
87
129
  assert_equal ['brett', 'chris', 'garon', 'mitch'], feedc.bars.first.patrons
88
130
  end
89
131
  end
132
+
133
+
134
+
135
+
@@ -21,7 +21,7 @@ class TestSimpleUser < Test::Unit::TestCase
21
21
  </user>
22
22
  )
23
23
 
24
- @user = SimpleUser.new(:xml => xml)
24
+ @user = SimpleUser.new(xml)
25
25
  end
26
26
 
27
27
  def test_mapping
@@ -77,7 +77,7 @@ class TestUser < Test::Unit::TestCase
77
77
  </user>
78
78
  )
79
79
 
80
- @user = User.new(:xml => xml)
80
+ @user = User.new(xml)
81
81
  end
82
82
 
83
83
  def test_id_and_name
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 0
8
- - 4
9
- version: 0.0.4
8
+ - 5
9
+ version: 0.0.5
10
10
  platform: ruby
11
11
  authors:
12
12
  - Lou Zell
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-03-31 00:00:00 -04:00
17
+ date: 2010-04-06 00:00:00 -04:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -26,7 +26,8 @@ dependencies:
26
26
  - !ruby/object:Gem::Version
27
27
  segments:
28
28
  - 0
29
- version: "0"
29
+ - 7
30
+ version: "0.7"
30
31
  type: :runtime
31
32
  version_requirements: *id001
32
33
  - !ruby/object:Gem::Dependency
@@ -37,8 +38,10 @@ dependencies:
37
38
  - - ">="
38
39
  - !ruby/object:Gem::Version
39
40
  segments:
40
- - 0
41
- version: "0"
41
+ - 1
42
+ - 4
43
+ - 1
44
+ version: 1.4.1
42
45
  type: :runtime
43
46
  version_requirements: *id002
44
47
  - !ruby/object:Gem::Dependency
@@ -49,8 +52,10 @@ dependencies:
49
52
  - - ">="
50
53
  - !ruby/object:Gem::Version
51
54
  segments:
52
- - 0
53
- version: "0"
55
+ - 1
56
+ - 1
57
+ - 3
58
+ version: 1.1.3
54
59
  type: :runtime
55
60
  version_requirements: *id003
56
61
  description: XML to object mapper with an interface similar to ActiveRecord associations.