acts_as_amazon_product 1.2 → 1.3

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/README CHANGED
@@ -1,27 +1,29 @@
1
1
  = ActsAsAmazonProduct
2
2
 
3
- This "acts_as" module makes it extremely simple to add Amazon integration to an existing model.
3
+ This "acts_as" module makes it extremely simple to add Amazon integration to an
4
+ existing model.
4
5
 
5
6
  == Setup
6
7
 
7
- This code does not require changing any current database tables. It only requires adding one migration for a single new table used to cache responses from Amazon:
8
+ This code does not require changing any current database tables. It only requires
9
+ adding one migration for a single new table used to cache responses from Amazon.
10
+ Run the following to create the migration:
8
11
 
9
- ActiveRecord::Base.connection.create_table :amazon_products do |t|
10
- t.column :asin, :string
11
- t.column :xml, :text
12
- t.column :created_at, :datetime, :null => false
13
- t.column :amazonable_id, :integer, :default => 0, :null => false
14
- t.column :amazonable_type, :string, :limit => 15, :default => "", :null => false
15
- end
12
+ script/generate acts_as_amazon_product_migration
16
13
 
17
14
  == Using acts_as_amazon_product
18
15
 
19
- Add the "acts_as" line to your model. Only :access_key is required. The :asin and :name assignments override what attributes in your class should be used for a direct lookup (item_looup) or general search (item_search). If no value is assigned to :asin then a general search is made and the first item (sorted by salesrank) is assigned (this functionality will likely change).
16
+ Add the "acts_as" line to your model. Only :access_key is required. The :asin and
17
+ :name assignments override what attributes in your class should be used for a direct
18
+ lookup (item_looup) or general search (item_search). If no value is assigned to :asin
19
+ then a general search is made and the first item (sorted by salesrank) is assigned
20
+ (this functionality will likely change).
20
21
 
21
22
  require 'acts_as_amazon_product'
22
23
 
23
24
  class Book < ActiveRecord::Base
24
- acts_as_amazon_product :asin => 'isbn', :name => 'title', :access_key => '0123456', :associate_tag => 'assoc-20'
25
+ acts_as_amazon_product :asin => 'isbn', :name => 'title',
26
+ :access_key => '0123456', :associate_tag => 'assoc-20'
25
27
  end
26
28
 
27
29
  You can now access the Amazon data in your views like so (see):
@@ -37,12 +39,14 @@ You can now access the Amazon data in your views like so (see):
37
39
 
38
40
  == Unit tests
39
41
 
40
- There are tests you can run in the [gem]/test directory. Just create a test/config.yml from the example and run "Rake test" from the [gem] directory.
42
+ There are tests you can run in the [gem]/test directory. Just create a
43
+ test/config.yml from the example and run "Rake test" from the [gem] directory.
41
44
 
42
45
  = Credits
43
- acts_as_amazon_product was credited by Scott Nedderman and Chris Beck from netphase.com
46
+ acts_as_amazon_product was created by Scott Nedderman and Chris Beck from netphase.com
44
47
 
45
- We'd love to here how you like it. Also, if you'd like us to help out with your next project, let us know.
48
+ We'd love to here how you like it. Also, if you'd like us to help out with your next
49
+ project, let us know.
46
50
 
47
51
  http://netphase.com
48
52
 
@@ -1,54 +1,60 @@
1
1
  require 'hpricot'
2
2
 
3
3
  class AmazonProduct < ActiveRecord::Base
4
- # belongs_to :amazonable, :polymorphic => true
5
4
 
6
- def hdoc(key)
5
+ def get(key, separator = ', ')
7
6
  @doc ||= Hpricot.XML(xml)
8
- @doc.at(key).inner_html
9
- end
10
-
11
- def get(key)
12
- hdoc(key)
7
+ values = (@doc/key).collect {|e| e.inner_html }
8
+ values *= separator unless separator.nil?
9
+ values unless values.blank?
13
10
  end
14
11
 
15
12
  def isbn
16
- hdoc("itemattributes/isbn")
13
+ get("itemattributes/isbn")
17
14
  end
18
15
 
19
16
  def title
20
- hdoc("itemattributes/title")
17
+ get("itemattributes/title")
21
18
  end
22
19
 
23
20
  def author
24
- hdoc("itemattributes/author")
21
+ get("itemattributes/author")
25
22
  end
26
23
 
27
24
  def binding
28
- hdoc("itemattributes/binding")
25
+ get("itemattributes/binding")
29
26
  end
30
27
 
31
28
  def price
32
- hdoc("itemattributes/listprice/amount")
29
+ get("itemattributes/listprice/amount")
33
30
  end
34
31
 
35
32
  def pages
36
- hdoc("itemattributes/numberofpages")
33
+ get("itemattributes/numberofpages")
37
34
  end
38
35
 
39
36
  def small_image_url
40
- hdoc("smallimage/url")
37
+ get("smallimage/url")
41
38
  end
42
39
 
43
40
  def medium_image_url
44
- hdoc("mediumimage/url")
41
+ get("mediumimage/url")
45
42
  end
46
43
 
47
44
  def large_image_url
48
- hdoc("largeimage/url")
45
+ get("largeimage/url")
49
46
  end
50
47
 
51
48
  def detail_url
52
- hdoc("detailpageurl")
49
+ get("detailpageurl")
53
50
  end
51
+
52
+ def method_missing(symbol, *args)
53
+ begin
54
+ super(symbol, *args)
55
+ rescue NoMethodError
56
+ get(symbol, *args)
57
+ end
58
+ end
59
+
54
60
  end
@@ -15,6 +15,7 @@ ActiveRecord::Base.establish_connection(config["database"])
15
15
  ActiveRecord::Base.connection.drop_table :amazon_products rescue nil
16
16
  ActiveRecord::Base.connection.drop_table :books rescue nil
17
17
  ActiveRecord::Base.connection.drop_table :movies rescue nil
18
+ ActiveRecord::Base.connection.drop_table :magazines rescue nil
18
19
 
19
20
  ActiveRecord::Base.connection.create_table :books do |t|
20
21
  t.column :title, :string
@@ -47,72 +48,96 @@ class Book < ActiveRecord::Base
47
48
  end
48
49
 
49
50
  class Movie < ActiveRecord::Base
50
- acts_as_amazon_product
51
+ acts_as_amazon_product :access_key => @@access_key, :associate_tag => @@associate_tag
51
52
  end
52
53
 
53
54
  class Magazine < ActiveRecord::Base
54
- acts_as_amazon_product :search_index => 'Magazines'
55
+ acts_as_amazon_product :search_index => 'Magazines', :access_key => @@access_key,
56
+ :associate_tag => @@associate_tag
55
57
  end
56
58
 
57
59
  AmazonProduct.delete_all
58
60
 
59
61
  class ActAsAmazonProductTest < Test::Unit::TestCase
60
62
 
61
- def setup
62
- Book.delete_all
63
- @book_gtd = Book.create(:title => 'Getting Things Done', :author => 'Dude', :isbn => '0142000280')
64
- @book_ror = Book.create(:title => 'Rails Recipes')
65
- @book_perl = Book.create(:title => 'Perl')
66
- @movie_dh = Movie.create(:name=>'Live Free or Die Hard', :asin=>'B000VNMMRA')
67
- Magazine.delete_all
68
- @mag_lci = Magazine.create(:name => 'La Cucina Italiana')
69
- end
70
-
71
- def test_isbn
72
- assert_not_nil(@book_gtd.amazon)
73
- assert_equal("0142000280", @book_gtd.amazon.isbn)
74
- end
75
-
76
- def test_title
77
- assert_not_nil(@book_gtd.amazon)
78
- assert_equal("Getting Things Done: The Art of Stress-Free Productivity", @book_gtd.amazon.title)
79
- end
80
-
81
- def test_magazine
82
- assert_not_nil(@mag_lci.amazon)
83
- assert_equal("B00009XFML", @mag_lci.amazon.asin)
84
- end
85
-
86
- def test_small_image
87
- assert_not_nil(@book_gtd.amazon)
88
- assert_match(/4104N6ME70L\._SL75_\.jpg/, @book_gtd.amazon.small_image_url)
89
- end
90
-
91
- def test_author
92
- assert_not_nil(@book_gtd.amazon)
93
- assert_equal("David Allen", @book_gtd.amazon.author)
94
- end
95
-
96
- def test_binding
97
- assert_not_nil(@book_gtd.amazon)
98
- assert_equal("Paperback", @book_gtd.amazon.binding)
99
- end
100
-
101
- def test_find_with_multiple
102
- assert_equal("Rails Recipes (Pragmatic Programmers)", @book_ror.amazon.title)
103
- assert_equal("Chad Fowler", @book_ror.amazon.author)
104
- end
105
-
106
- def test_update
107
- assert_not_nil(@book_perl.amazon)
108
- isbn = @book_perl.amazon.isbn
109
- @book_perl.title = "Websters"
110
- @book_perl.save
111
- assert_not_equal(isbn, @book_perl.amazon.isbn)
112
- end
113
-
114
- def test_product_with_all_defaults
115
- assert_not_nil(@movie_dh.amazon)
116
- assert_equal 'Bruce Willis', @movie_dh.amazon.get('itemattributes/actor')
117
- end
63
+ def setup
64
+ Book.delete_all
65
+ @book_gtd = Book.create(:title => 'Getting Things Done', :author => 'Dude', :isbn => '0142000280')
66
+ @book_ror = Book.create(:title => 'Rails Recipes')
67
+ @book_perl = Book.create(:title => 'Perl')
68
+ @movie_dh = Movie.create(:name=>'Live Free or Die Hard', :asin=>'B000VNMMRA')
69
+ Magazine.delete_all
70
+ @mag_lci = Magazine.create(:name => 'La Cucina Italiana')
71
+ end
72
+
73
+ def test_isbn
74
+ assert_not_nil(@book_gtd.amazon)
75
+ assert_equal("0142000280", @book_gtd.amazon.isbn)
76
+ end
77
+
78
+ def test_title
79
+ assert_not_nil(@book_gtd.amazon)
80
+ assert_equal("Getting Things Done: The Art of Stress-Free Productivity", @book_gtd.amazon.title)
81
+ end
82
+
83
+ def test_magazine
84
+ assert_not_nil(@mag_lci.amazon)
85
+ assert_equal("B00009XFML", @mag_lci.amazon.asin)
86
+ end
87
+
88
+ def test_small_image
89
+ assert_not_nil(@book_gtd.amazon)
90
+ assert_match(/4104N6ME70L\._SL75_\.jpg/, @book_gtd.amazon.small_image_url)
91
+ end
92
+
93
+ def test_author
94
+ assert_not_nil(@book_gtd.amazon)
95
+ assert_equal("David Allen", @book_gtd.amazon.author)
96
+ end
97
+
98
+ def test_binding
99
+ assert_not_nil(@book_gtd.amazon)
100
+ assert_equal("Paperback", @book_gtd.amazon.binding)
101
+ end
102
+
103
+ def test_find_with_multiple
104
+ assert_equal("Advanced Rails Recipes: 84 New Ways to Build Stunning Rails Apps (Pragmatic Programmers)", @book_ror.amazon.title)
105
+ assert_equal("Mike Clark", @book_ror.amazon.author)
106
+ end
107
+
108
+ def test_returns_nil_if_attribute_not_found
109
+ assert_equal(nil, @book_ror.amazon.get('contributor'))
110
+ end
111
+
112
+ def test_update
113
+ assert_not_nil(@book_perl.amazon)
114
+ isbn = @book_perl.amazon.isbn
115
+ @book_perl.title = "Websters"
116
+ @book_perl.save
117
+ assert_not_equal(isbn, @book_perl.amazon.isbn)
118
+ end
119
+
120
+ def test_product_with_all_defaults
121
+ assert_not_nil(@movie_dh.amazon)
122
+ assert_equal 'Bruce Willis, Timothy Olyphant, Justin Long, Maggie Q, Cliff Curtis',
123
+ @movie_dh.amazon.get('itemattributes/actor')
124
+ end
125
+
126
+ def test_accepts_a_custom_separator
127
+ assert_equal 'Bruce Willis | Timothy Olyphant | Justin Long | Maggie Q | Cliff Curtis',
128
+ @movie_dh.amazon.get('itemattributes/actor', ' | ')
129
+ end
130
+
131
+ def test_returns_array_if_separator_is_nil
132
+ assert_equal ['Bruce Willis', 'Timothy Olyphant', 'Justin Long', 'Maggie Q', 'Cliff Curtis'],
133
+ @movie_dh.amazon.get('itemattributes/actor', nil)
134
+ end
135
+
136
+ def test_method_missing
137
+ assert_equal 'Bruce Willis, Timothy Olyphant, Justin Long, Maggie Q, Cliff Curtis', @movie_dh.amazon.actor
138
+ end
139
+
140
+ def test_method_missing_with_separator
141
+ assert_equal 'Bruce Willis | Timothy Olyphant | Justin Long | Maggie Q | Cliff Curtis', @movie_dh.amazon.actor(' | ')
142
+ end
118
143
  end
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: acts_as_amazon_product
3
3
  version: !ruby/object:Gem::Version
4
- version: "1.2"
4
+ version: "1.3"
5
5
  platform: ruby
6
6
  authors:
7
7
  - Scott Nedderman
@@ -9,7 +9,7 @@ autorequire: acts_as_amazon_product
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-04-24 00:00:00 -04:00
12
+ date: 2008-08-11 00:00:00 -04:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency