roxml 2.4.1 → 2.4.2
Sign up to get free protection for your applications and to get access to all the features.
- 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>
|