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.
- data/History.txt +21 -0
- data/MIT-LICENSE +1 -1
- data/Manifest.txt +27 -6
- data/Rakefile +2 -2
- data/TODO +35 -14
- data/config/website.yml +2 -0
- data/examples/amazon.rb +33 -0
- data/examples/current_weather.rb +27 -0
- data/examples/dashed_elements.rb +20 -0
- data/examples/posts.rb +27 -0
- data/examples/twitter.rb +37 -0
- data/examples/xml/amazon.xml +133 -0
- data/examples/xml/current_weather.xml +89 -0
- data/examples/xml/dashed_elements.xml +52 -0
- data/examples/xml/posts.xml +23 -0
- data/examples/xml/twitter.xml +422 -0
- data/lib/roxml.rb +35 -6
- data/lib/roxml/{options.rb → definition.rb} +60 -88
- data/lib/roxml/extensions.rb +3 -0
- data/lib/roxml/hash_definition.rb +59 -0
- data/lib/roxml/xml.rb +15 -272
- data/lib/roxml/xml/{libxml.rb → parsers/libxml.rb} +13 -5
- data/lib/roxml/xml/{rexml.rb → parsers/rexml.rb} +13 -4
- data/lib/roxml/xml/references.rb +290 -0
- data/roxml.gemspec +4 -4
- data/spec/examples/amazon_spec.rb +53 -0
- data/spec/examples/current_weather_spec.rb +37 -0
- data/spec/examples/dashed_elements_spec.rb +20 -0
- data/spec/examples/post_spec.rb +24 -0
- data/spec/examples/twitter_spec.rb +32 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +16 -0
- data/tasks/rspec.rake +21 -0
- data/test/unit/definition_test.rb +160 -0
- data/test/unit/inheritance_test.rb +22 -1
- data/test/unit/roxml_test.rb +30 -1
- data/test/unit/xml_name_test.rb +29 -0
- data/test/unit/xml_namespace_test.rb +38 -1
- data/website/index.html +98 -0
- metadata +30 -9
- data/html/index.html +0 -278
- data/html/style.css +0 -79
- data/test/unit/options_test.rb +0 -103
data/History.txt
CHANGED
@@ -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
|
data/MIT-LICENSE
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
The MIT License
|
2
2
|
|
3
|
-
Copyright (c) 2004-
|
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,
|
data/Manifest.txt
CHANGED
@@ -4,9 +4,20 @@ Manifest.txt
|
|
4
4
|
README.rdoc
|
5
5
|
Rakefile
|
6
6
|
TODO
|
7
|
-
|
8
|
-
|
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/
|
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.
|
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
|
-
*
|
15
|
-
|
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
|
-
*
|
21
|
-
|
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 :
|
24
|
-
xml_reader :
|
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 :
|
29
|
-
xml_reader :count, Integer,
|
45
|
+
xml_reader :some_object, :as => MyObject
|
46
|
+
xml_reader :count, :size, :as => Integer, :from => :attr
|
30
47
|
|
31
|
-
|
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
|
-
|
51
|
+
It also enables multiple declarations on a single call, ala attr_*
|
34
52
|
|
35
|
-
|
53
|
+
xml_reader :count, :size, :number, :as => Integer, :from => :attr
|
36
54
|
|
37
|
-
|
55
|
+
* Commandeer #parse to use opposite #from_xml, but in an unrooted, collection-friendly fashion,
|
56
|
+
ala HappyMapper's parse
|
38
57
|
|
39
|
-
*
|
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
|
-
*
|
62
|
+
* Consider class_inheritable_attribute rather than superclass.try stuff.
|
42
63
|
|
data/config/website.yml
ADDED
data/examples/amazon.rb
ADDED
@@ -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
|
data/examples/posts.rb
ADDED
@@ -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
|
data/examples/twitter.rb
ADDED
@@ -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>
|