roxml 2.4.1 → 2.4.2

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 (43) hide show
  1. data/History.txt +21 -0
  2. data/MIT-LICENSE +1 -1
  3. data/Manifest.txt +27 -6
  4. data/Rakefile +2 -2
  5. data/TODO +35 -14
  6. data/config/website.yml +2 -0
  7. data/examples/amazon.rb +33 -0
  8. data/examples/current_weather.rb +27 -0
  9. data/examples/dashed_elements.rb +20 -0
  10. data/examples/posts.rb +27 -0
  11. data/examples/twitter.rb +37 -0
  12. data/examples/xml/amazon.xml +133 -0
  13. data/examples/xml/current_weather.xml +89 -0
  14. data/examples/xml/dashed_elements.xml +52 -0
  15. data/examples/xml/posts.xml +23 -0
  16. data/examples/xml/twitter.xml +422 -0
  17. data/lib/roxml.rb +35 -6
  18. data/lib/roxml/{options.rb → definition.rb} +60 -88
  19. data/lib/roxml/extensions.rb +3 -0
  20. data/lib/roxml/hash_definition.rb +59 -0
  21. data/lib/roxml/xml.rb +15 -272
  22. data/lib/roxml/xml/{libxml.rb → parsers/libxml.rb} +13 -5
  23. data/lib/roxml/xml/{rexml.rb → parsers/rexml.rb} +13 -4
  24. data/lib/roxml/xml/references.rb +290 -0
  25. data/roxml.gemspec +4 -4
  26. data/spec/examples/amazon_spec.rb +53 -0
  27. data/spec/examples/current_weather_spec.rb +37 -0
  28. data/spec/examples/dashed_elements_spec.rb +20 -0
  29. data/spec/examples/post_spec.rb +24 -0
  30. data/spec/examples/twitter_spec.rb +32 -0
  31. data/spec/spec.opts +1 -0
  32. data/spec/spec_helper.rb +16 -0
  33. data/tasks/rspec.rake +21 -0
  34. data/test/unit/definition_test.rb +160 -0
  35. data/test/unit/inheritance_test.rb +22 -1
  36. data/test/unit/roxml_test.rb +30 -1
  37. data/test/unit/xml_name_test.rb +29 -0
  38. data/test/unit/xml_namespace_test.rb +38 -1
  39. data/website/index.html +98 -0
  40. metadata +30 -9
  41. data/html/index.html +0 -278
  42. data/html/style.css +0 -79
  43. data/test/unit/options_test.rb +0 -103
@@ -1,3 +1,24 @@
1
+ == 2.4.2 (January 31, 2009)
2
+
3
+ * 1 major enhancement
4
+
5
+ * xml_namespace for declaring Class-level, inheritable default namespaces.
6
+
7
+ * 4 minor enhancements
8
+
9
+ * add :as => Time, DateTime, and Date support
10
+ * support Pathname, IO and URI objects as #from_xml arguments
11
+ * :as => :bool now supports all capitalizations of 'true', 'false', 'yes', 'no', as well as '1' and '0'
12
+ * For basic types (:as => Integer, Float, Date, &c.), interpret empty strings just
13
+ as missing elements (by returning nil), rather than raising. Raise behavior can be
14
+ accessed by supplying your own block or using the :required option.
15
+
16
+ * 3 bug fixes
17
+
18
+ * Arrays of attrs or elements :as => :bool weren't previously supported. An oversight.
19
+ * Don't apply xml_convention if name is explicitly set
20
+ * Protect xpath operators : and / from modification via String#camelcase & such
21
+
1
22
  == 2.4.1 (January 28, 2009)
2
23
 
3
24
  * 3 minor enhancements
@@ -1,6 +1,6 @@
1
1
  The MIT License
2
2
 
3
- Copyright (c) 2004-2008 by Ben Woosley, Zak Mandhro and Anders Engstrom
3
+ Copyright (c) 2004-2009 by Ben Woosley, Zak Mandhro and Anders Engstrom
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy of this software
6
6
  and associated documentation files (the "Software"), to deal in the Software without restriction,
@@ -4,9 +4,20 @@ Manifest.txt
4
4
  README.rdoc
5
5
  Rakefile
6
6
  TODO
7
- html/index.html
8
- html/style.css
7
+ config/website.yml
8
+ examples/amazon.rb
9
+ examples/current_weather.rb
10
+ examples/dashed_elements.rb
11
+ examples/posts.rb
12
+ examples/twitter.rb
13
+ examples/xml/amazon.xml
14
+ examples/xml/current_weather.xml
15
+ examples/xml/dashed_elements.xml
16
+ examples/xml/posts.xml
17
+ examples/xml/twitter.xml
9
18
  lib/roxml.rb
19
+ lib/roxml/definition.rb
20
+ lib/roxml/extensions.rb
10
21
  lib/roxml/extensions/active_support.rb
11
22
  lib/roxml/extensions/array.rb
12
23
  lib/roxml/extensions/array/conversions.rb
@@ -14,11 +25,20 @@ lib/roxml/extensions/deprecation.rb
14
25
  lib/roxml/extensions/string.rb
15
26
  lib/roxml/extensions/string/conversions.rb
16
27
  lib/roxml/extensions/string/iterators.rb
17
- lib/roxml/options.rb
28
+ lib/roxml/hash_definition.rb
18
29
  lib/roxml/xml.rb
19
- lib/roxml/xml/libxml.rb
20
- lib/roxml/xml/rexml.rb
30
+ lib/roxml/xml/parsers/libxml.rb
31
+ lib/roxml/xml/parsers/rexml.rb
32
+ lib/roxml/xml/references.rb
21
33
  roxml.gemspec
34
+ spec/examples/amazon_spec.rb
35
+ spec/examples/current_weather_spec.rb
36
+ spec/examples/dashed_elements_spec.rb
37
+ spec/examples/post_spec.rb
38
+ spec/examples/twitter_spec.rb
39
+ spec/spec.opts
40
+ spec/spec_helper.rb
41
+ tasks/rspec.rake
22
42
  tasks/test.rake
23
43
  test/bugs/rexml_bugs.rb
24
44
  test/fixtures/book_malformed.xml
@@ -56,9 +76,9 @@ test/mocks/mocks.rb
56
76
  test/release/dependencies_test.rb
57
77
  test/test_helper.rb
58
78
  test/unit/array_test.rb
79
+ test/unit/definition_test.rb
59
80
  test/unit/freeze_test.rb
60
81
  test/unit/inheritance_test.rb
61
- test/unit/options_test.rb
62
82
  test/unit/overriden_output_test.rb
63
83
  test/unit/roxml_test.rb
64
84
  test/unit/string_test.rb
@@ -79,3 +99,4 @@ vendor/override_rake_task/README
79
99
  vendor/override_rake_task/init.rb
80
100
  vendor/override_rake_task/install.rb
81
101
  vendor/override_rake_task/lib/override_rake_task.rb
102
+ website/index.html
data/Rakefile CHANGED
@@ -1,7 +1,7 @@
1
1
  ENV['RUBY_FLAGS'] = '-W1'
2
2
 
3
3
  %w[rubygems rake rake/clean fileutils newgem rubigen].each { |f| require f }
4
- require File.join(File.dirname(__FILE__), 'lib/roxml')
4
+ require File.expand_path(File.dirname(__FILE__) + '/lib/roxml')
5
5
 
6
6
  # Generate all the Rake tasks
7
7
  # Run 'rake -T' to see list of generated tasks (from gem root directory)
@@ -38,7 +38,7 @@ require 'newgem/tasks' # load /tasks/*.rake
38
38
 
39
39
  Dir['tasks/**/*.rake'].each { |t| load t }
40
40
 
41
- task :default => :test
41
+ task :default => [:test, :spec]
42
42
 
43
43
  ## Provide the username used to upload website etc.
44
44
  #RubyForgeConfig = {
data/TODO CHANGED
@@ -11,32 +11,53 @@ v 2.5
11
11
  * Ensure (perhaps optionally) that references are unambiguous. That is error/warn
12
12
  a singular specification has multiple possible node references
13
13
 
14
- * Ensure support for nodes which aren't merely children, which hang out deep
15
- in the file, but are accessible via xpath
14
+ * Automatically use Date or DateTime for accessors ending in '_on' and '_at', respectively
15
+
16
+ * Add xml_in helper to share :in declarations between several attributes. E.g.:
17
+
18
+ xml_reader :count, :in => 'Attributes', :as => Integer
19
+ xml_reader :something_else, :in => 'Attributes', :as => Date
20
+
21
+ becomes:
22
+
23
+ xml_in 'Attributes' do |xml|
24
+ xml.reader :count, :as => Integer
25
+ xml.reader :something_else, :as => Date
26
+ end
27
+
28
+ * :self => true for sending method_missing to this attribute?
29
+
30
+ * :attributes extensions ala HappyMapper?
16
31
 
17
32
  v 3.0
18
33
  * remove deprecated functionality
19
34
 
20
- * Perhaps provide cleaner separation between the specification
21
- of type vs its source in the XML. For example,
35
+ * Clarify API via seperation of concerns. :as for Type, :from and :in for location,
36
+ All other options as named options, e.g. :cdata => true rather than :as => :cdata.
37
+ A few not so great examples...:
22
38
 
23
- xml_reader :count, :from => 'Count, :in => 'Attributes', :as => Integer
24
- xml_reader :count, :attr => 'Count, :in => 'Attributes', :as => Integer
39
+ xml_reader :some_objce, MyObject
40
+ xml_reader :size, :attr, :as => Integer
41
+ xml_reader :count, :attr, :as => Integer
25
42
 
26
43
  become:
27
44
 
28
- xml_reader :count, Integer, 'Atributes/Count'
29
- xml_reader :count, Integer, 'Atributes/@Count'
45
+ xml_reader :some_object, :as => MyObject
46
+ xml_reader :count, :size, :as => Integer, :from => :attr
30
47
 
31
- potentially backward-incompatible change. Needs some thought...
48
+ This will significantly simplify the internals and will also cleanly split
49
+ element type, location, name and options, for a more predictable API.
32
50
 
33
- * Back with XmlSimple/FasterXmlSimple to minimize need for specifications
51
+ It also enables multiple declarations on a single call, ala attr_*
34
52
 
35
- * Use lazy evaluation to minimize parsing time for large files
53
+ xml_reader :count, :size, :number, :as => Integer, :from => :attr
36
54
 
37
- Potential:
55
+ * Commandeer #parse to use opposite #from_xml, but in an unrooted, collection-friendly fashion,
56
+ ala HappyMapper's parse
38
57
 
39
- * Add shorthand support to hash declaration
58
+ * Back with http://xml-object.rubyforge.org/doc/ to minimize need for specifications?
59
+
60
+ * Use lazy evaluation to minimize parsing time for large files
40
61
 
41
- * :as => :self for sending method_missing to this attribute
62
+ * Consider class_inheritable_attribute rather than superclass.try stuff.
42
63
 
@@ -0,0 +1,2 @@
1
+ host: empact@rubyforge.org
2
+ remote_dir: /var/www/gforge-projects/roxml
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/env ruby
2
+ require File.expand_path(File.dirname(__FILE__) + '/../spec/spec_helper')
3
+
4
+ # The document `pita.xml` contains both a default namespace and the 'georss'
5
+ # namespace (for the 'point' xml_reader).
6
+ module PITA
7
+ class Base
8
+ include ROXML
9
+ xml_convention :camelcase
10
+ end
11
+
12
+ class Item < Base
13
+ xml_reader :asin, :from => 'ASIN'
14
+ xml_reader :detail_page_url, :from => 'DetailPageURL'
15
+ xml_reader :manufacturer, :in => './'
16
+ # this is the only xml_reader that exists in a different namespace, so it
17
+ # must be explicitly specified
18
+ xml_reader :point, :from => 'georss:point'
19
+ end
20
+
21
+ class ItemSearchResponse < Base
22
+ xml_reader :total_results, :as => Integer, :in => 'Items'
23
+ xml_reader :total_pages, :as => Integer, :in => 'Items'
24
+ xml_reader :items, [Item]
25
+ end
26
+ end
27
+
28
+ unless defined?(Spec)
29
+ item = PITA::ItemSearchResponse.from_xml(xml_for('amazon'))
30
+ item.items.each do |i|
31
+ puts i.asin, i.detail_page_url, i.manufacturer, ''
32
+ end
33
+ end
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env ruby
2
+ require File.expand_path(File.dirname(__FILE__) + '/../spec/spec_helper')
3
+
4
+ class Base
5
+ include ROXML
6
+ xml_convention :dasherize
7
+ xml_namespace 'aws'
8
+ end
9
+
10
+ class WeatherObservation < Base
11
+ xml_name 'ob'
12
+ xml_reader :temperature, :as => Float, :from => 'aws:temp'
13
+ xml_reader :feels_like, :as => Integer
14
+ xml_reader :current_condition #, :attributes => {:icon => String} # pending
15
+ end
16
+
17
+ class Weather < Base
18
+ xml_reader :observation, WeatherObservation, :required => true
19
+ end
20
+
21
+ unless defined?(Spec)
22
+ current_weather = Weather.from_xml(xml_for('current_weather')).observation
23
+ puts "temperature: #{current_weather.temperature}"
24
+ puts "feels_like: #{current_weather.feels_like}"
25
+ puts "current_condition: #{current_weather.current_condition}"
26
+ # puts "current_condition.icon: #{current_weather.current_condition.icon}" # pending
27
+ end
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env ruby
2
+ require File.expand_path(File.dirname(__FILE__) + '/../spec/spec_helper')
3
+
4
+ module GitHub
5
+ class Commit
6
+ include ROXML
7
+ xml_convention :dasherize
8
+
9
+ xml_reader :url
10
+ xml_reader :tree
11
+ xml_reader :message
12
+ xml_reader :id
13
+ xml_reader :committed_date, :as => Date
14
+ end
15
+ end
16
+
17
+ unless defined?(Spec)
18
+ commit = GitHub::Commit.from_xml(xml_for('dashed_elements'))
19
+ puts commit.committed_date, commit.url, commit.id, ''
20
+ end
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env ruby
2
+ require File.expand_path(File.dirname(__FILE__) + '/../spec/spec_helper')
3
+
4
+ class Post
5
+ include ROXML
6
+
7
+ xml_reader :href, :attr
8
+ xml_reader :hash, :attr
9
+ xml_reader :description, :attr
10
+ xml_reader :tag, :attr
11
+ xml_reader :time, :attr, :as => DateTime
12
+ xml_reader :others, :attr, :as => Integer
13
+ xml_reader :extended, :attr
14
+ end
15
+
16
+ class Posts
17
+ include ROXML
18
+
19
+ xml_reader :posts, [Post]
20
+ end
21
+
22
+ unless defined?(Spec)
23
+ posts = Posts.from_xml(xml_for('posts'))
24
+ posts.posts.each do |post|
25
+ puts post.description, post.href, post.extended, ''
26
+ end
27
+ end
@@ -0,0 +1,37 @@
1
+ #!/usr/bin/env ruby
2
+ require File.expand_path(File.dirname(__FILE__) + '/../spec/spec_helper')
3
+ require 'time'
4
+
5
+ class User
6
+ include ROXML
7
+
8
+ xml_reader :id, :as => Integer
9
+ xml_reader :name
10
+ xml_reader :screen_name
11
+ xml_reader :location
12
+ xml_reader :description
13
+ xml_reader :profile_image_url
14
+ xml_reader :url
15
+ xml_reader :protected?
16
+ xml_reader :followers_count, :as => Integer
17
+ end
18
+
19
+ class Status
20
+ include ROXML
21
+
22
+ xml_reader :id, :as => Integer
23
+ xml_reader :text
24
+ xml_reader :created_at, :as => Time
25
+ xml_reader :source
26
+ xml_reader :truncated?
27
+ xml_reader :in_reply_to_status_id, :as => Integer
28
+ xml_reader :in_reply_to_user_id, :as => Integer
29
+ xml_reader :favorited?
30
+ xml_reader :user, User
31
+ end
32
+
33
+ class Statuses
34
+ include ROXML
35
+
36
+ xml_reader :statuses, [Status]
37
+ end
@@ -0,0 +1,133 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <ItemSearchResponse xmlns="http://webservices.amazon.com/AWSECommerceService/2005-10-05" xmlns:georss="http://www.georss.org/georss">
3
+ <OperationRequest>
4
+ <HTTPHeaders>
5
+ <Header Name="UserAgent">
6
+ </Header>
7
+ </HTTPHeaders>
8
+ <RequestId>16WRJBVEM155Q026KCV1</RequestId>
9
+ <Arguments>
10
+ <Argument Name="SearchIndex" Value="Books"></Argument>
11
+ <Argument Name="Service" Value="AWSECommerceService"></Argument>
12
+ <Argument Name="Title" Value="Ruby on Rails"></Argument>
13
+ <Argument Name="Operation" Value="ItemSearch"></Argument>
14
+ <Argument Name="AWSAccessKeyId" Value="dontbeaswoosh"></Argument>
15
+ </Arguments>
16
+ <RequestProcessingTime>0.064924955368042</RequestProcessingTime>
17
+ </OperationRequest>
18
+ <Items>
19
+ <Request>
20
+ <IsValid>True</IsValid>
21
+ <ItemSearchRequest>
22
+ <SearchIndex>Books</SearchIndex>
23
+ <Title>Ruby on Rails</Title>
24
+ </ItemSearchRequest>
25
+ </Request>
26
+ <TotalResults>22</TotalResults>
27
+ <TotalPages>3</TotalPages>
28
+ <Item>
29
+ <ASIN>0321480791</ASIN>
30
+ <georss:point>38.5351715088 -121.7948684692</georss:point>
31
+ <DetailPageURL>http://www.amazon.com/gp/redirect.html%3FASIN=0321480791%26tag=ws%26lcode=xm2%26cID=2025%26ccmID=165953%26location=/o/ASIN/0321480791%253FSubscriptionId=dontbeaswoosh</DetailPageURL>
32
+ <ItemAttributes>
33
+ <Author>Michael Hartl</Author>
34
+ <Author>Aurelius Prochazka</Author>
35
+ <Manufacturer>Addison-Wesley Professional</Manufacturer>
36
+ <ProductGroup>Book</ProductGroup>
37
+ <Title>RailsSpace: Building a Social Networking Website with Ruby on Rails (Addison-Wesley Professional Ruby Series)</Title>
38
+ </ItemAttributes>
39
+ </Item>
40
+ <Item>
41
+ <ASIN>047022388X</ASIN>
42
+ <DetailPageURL>http://www.amazon.com/gp/redirect.html%3FASIN=047022388X%26tag=ws%26lcode=xm2%26cID=2025%26ccmID=165953%26location=/o/ASIN/047022388X%253FSubscriptionId=dontbeaswoosh</DetailPageURL>
43
+ <ItemAttributes>
44
+ <Author>Noel Rappin</Author>
45
+ <Manufacturer>Wrox</Manufacturer>
46
+ <ProductGroup>Book</ProductGroup>
47
+ <Title>Professional Ruby on Rails</Title>
48
+ </ItemAttributes>
49
+ </Item>
50
+ <Item>
51
+ <ASIN>1590598814</ASIN>
52
+ <DetailPageURL>http://www.amazon.com/gp/redirect.html%3FASIN=1590598814%26tag=ws%26lcode=xm2%26cID=2025%26ccmID=165953%26location=/o/ASIN/1590598814%253FSubscriptionId=dontbeaswoosh</DetailPageURL>
53
+ <ItemAttributes>
54
+ <Author>Ola Bini</Author>
55
+ <Manufacturer>Apress</Manufacturer>
56
+ <ProductGroup>Book</ProductGroup>
57
+ <Title>Practical JRuby on Rails Web 2.0 Projects: Bringing Ruby on Rails to Java</Title>
58
+ </ItemAttributes>
59
+ </Item>
60
+ <Item>
61
+ <ASIN>0596101325</ASIN>
62
+ <DetailPageURL>http://www.amazon.com/gp/redirect.html%3FASIN=0596101325%26tag=ws%26lcode=xm2%26cID=2025%26ccmID=165953%26location=/o/ASIN/0596101325%253FSubscriptionId=dontbeaswoosh</DetailPageURL>
63
+ <ItemAttributes>
64
+ <Author>Bruce Tate</Author>
65
+ <Author>Curt Hibbs</Author>
66
+ <Manufacturer>O'Reilly Media, Inc.</Manufacturer>
67
+ <ProductGroup>Book</ProductGroup>
68
+ <Title>Ruby on Rails: Up and Running</Title>
69
+ </ItemAttributes>
70
+ </Item>
71
+ <Item>
72
+ <ASIN>0470081201</ASIN>
73
+ <DetailPageURL>http://www.amazon.com/gp/redirect.html%3FASIN=0470081201%26tag=ws%26lcode=xm2%26cID=2025%26ccmID=165953%26location=/o/ASIN/0470081201%253FSubscriptionId=dontbeaswoosh</DetailPageURL>
74
+ <ItemAttributes>
75
+ <Author>Barry Burd</Author>
76
+ <Manufacturer>For Dummies</Manufacturer>
77
+ <ProductGroup>Book</ProductGroup>
78
+ <Title>Ruby on Rails For Dummies (For Dummies (Computer/Tech))</Title>
79
+ </ItemAttributes>
80
+ </Item>
81
+ <Item>
82
+ <ASIN>0975841955</ASIN>
83
+ <DetailPageURL>http://www.amazon.com/gp/redirect.html%3FASIN=0975841955%26tag=ws%26lcode=xm2%26cID=2025%26ccmID=165953%26location=/o/ASIN/0975841955%253FSubscriptionId=dontbeaswoosh</DetailPageURL>
84
+ <ItemAttributes>
85
+ <Author>Patrick Lenz</Author>
86
+ <Manufacturer>SitePoint</Manufacturer>
87
+ <ProductGroup>Book</ProductGroup>
88
+ <Title>Build Your Own Ruby on Rails Web Applications</Title>
89
+ </ItemAttributes>
90
+ </Item>
91
+ <Item>
92
+ <ASIN>0470069155</ASIN>
93
+ <DetailPageURL>http://www.amazon.com/gp/redirect.html%3FASIN=0470069155%26tag=ws%26lcode=xm2%26cID=2025%26ccmID=165953%26location=/o/ASIN/0470069155%253FSubscriptionId=dontbeaswoosh</DetailPageURL>
94
+ <ItemAttributes>
95
+ <Author>Steve, Ph.D. Holzner</Author>
96
+ <Manufacturer>Wrox</Manufacturer>
97
+ <ProductGroup>Book</ProductGroup>
98
+ <Title>Beginning Ruby on Rails (Wrox Beginning Guides)</Title>
99
+ </ItemAttributes>
100
+ </Item>
101
+ <Item>
102
+ <ASIN>1590597362</ASIN>
103
+ <DetailPageURL>http://www.amazon.com/gp/redirect.html%3FASIN=1590597362%26tag=ws%26lcode=xm2%26cID=2025%26ccmID=165953%26location=/o/ASIN/1590597362%253FSubscriptionId=dontbeaswoosh</DetailPageURL>
104
+ <ItemAttributes>
105
+ <Author>Christian Hellsten</Author>
106
+ <Author>Jarkko Laine</Author>
107
+ <Manufacturer>Apress</Manufacturer>
108
+ <ProductGroup>Book</ProductGroup>
109
+ <Title>Beginning Ruby on Rails E-Commerce: From Novice to Professional (Rails)</Title>
110
+ </ItemAttributes>
111
+ </Item>
112
+ <Item>
113
+ <ASIN>1590597524</ASIN>
114
+ <DetailPageURL>http://www.amazon.com/gp/redirect.html%3FASIN=1590597524%26tag=ws%26lcode=xm2%26cID=2025%26ccmID=165953%26location=/o/ASIN/1590597524%253FSubscriptionId=dontbeaswoosh</DetailPageURL>
115
+ <ItemAttributes>
116
+ <Author>Justin Williams</Author>
117
+ <Manufacturer>friends of ED</Manufacturer>
118
+ <ProductGroup>Book</ProductGroup>
119
+ <Title>Rails Solutions: Ruby on Rails Made Easy (Solutions)</Title>
120
+ </ItemAttributes>
121
+ </Item>
122
+ <Item>
123
+ <ASIN>0321517067</ASIN>
124
+ <DetailPageURL>http://www.amazon.com/gp/redirect.html%3FASIN=0321517067%26tag=ws%26lcode=xm2%26cID=2025%26ccmID=165953%26location=/o/ASIN/0321517067%253FSubscriptionId=dontbeaswoosh</DetailPageURL>
125
+ <ItemAttributes>
126
+ <Author>Aurelius Prochazka</Author>
127
+ <Manufacturer>Addison-Wesley Professional</Manufacturer>
128
+ <ProductGroup>Book</ProductGroup>
129
+ <Title>RailsSpace Ruby on Rails Tutorial (Video Training) (LiveLessons)</Title>
130
+ </ItemAttributes>
131
+ </Item>
132
+ </Items>
133
+ </ItemSearchResponse>