fletcher 0.2.0 → 0.3.0

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/.travis.yml CHANGED
@@ -1,6 +1,7 @@
1
1
  rvm: # list all the Rubies you want to test against
2
2
  - 1.8.7
3
3
  - 1.9.2
4
+ - 1.9.3
4
5
  - jruby
5
- - rbx
6
+ - ree
6
7
  script: "bundle exec rspec spec" # your test command goes here
data/Gemfile CHANGED
@@ -2,6 +2,7 @@ source "http://rubygems.org"
2
2
 
3
3
  gem "hashie"
4
4
  gem "nokogiri"
5
+ gem "money"
5
6
 
6
7
  group :development do
7
8
  gem "shoulda", ">= 0"
@@ -10,4 +11,5 @@ group :development do
10
11
  gem "rcov", ">= 0"
11
12
  gem "rspec"
12
13
  gem "factory_girl"
14
+ gem "i18n"
13
15
  end
data/Gemfile.lock CHANGED
@@ -8,10 +8,15 @@ GEM
8
8
  activesupport
9
9
  git (1.2.5)
10
10
  hashie (1.2.0)
11
+ i18n (0.6.0)
11
12
  jeweler (1.6.4)
12
13
  bundler (~> 1.0)
13
14
  git (>= 1.2.5)
14
15
  rake
16
+ json (1.6.4)
17
+ money (4.0.1)
18
+ i18n (~> 0.4)
19
+ json
15
20
  multi_json (1.0.4)
16
21
  nokogiri (1.5.0)
17
22
  rake (0.9.2)
@@ -33,7 +38,9 @@ DEPENDENCIES
33
38
  bundler (~> 1.0.0)
34
39
  factory_girl
35
40
  hashie
41
+ i18n
36
42
  jeweler (~> 1.6.4)
43
+ money
37
44
  nokogiri
38
45
  rcov
39
46
  rspec
data/README.md CHANGED
@@ -1,4 +1,6 @@
1
- # Fletcher
1
+ # Fletcher
2
+ [![Build Status](http://travis-ci.org/hulihanapplications/fletcher.png)](http://travis-ci.org/hulihanapplications/fletcher)
3
+
2
4
 
3
5
  Fletcher is a cross-website product/item information fetcher. Give fletcher a product url and you'll get back a nice, simple object that's easy to work with.
4
6
 
@@ -9,7 +11,7 @@ Fletcher is a cross-website product/item information fetcher. Give fletcher a pr
9
11
 
10
12
  ## Supported Websites
11
13
 
12
- * [Amazon](http://www.amazon.com) (name, description, images)
14
+ * [Amazon](http://www.amazon.com) (name, description, price, images)
13
15
  * [eBay](http://www.ebay.com) (name, images)
14
16
  * [ThinkGeek](http://www.thinkgeek.com) (name, description, images)
15
17
  * [Etsy](http://www.etsy.com) (name, description, images)
@@ -23,7 +25,9 @@ gem install fletcher
23
25
  ## Examples
24
26
 
25
27
  ```ruby
26
- item = Fletcher.fetch "http://www.amazon.com/Avenir-Deluxe-Unicycle-20-Inch-Wheel/dp/B00165Q9F8"
28
+ require "fletcher"
29
+
30
+ item = Fletcher.fetch # => "http://www.amazon.com/Avenir-Deluxe-Unicycle-20-Inch-Wheel/dp/B00165Q9F8"
27
31
 
28
32
  item.name # => "Avenir Deluxe Unicycle (20-Inch Wheel)"
29
33
 
@@ -33,6 +37,10 @@ item.image # => {:url => "http://ecx.images-amazon.com/images/I/41b3TNb3uCL._SL5
33
37
 
34
38
  item.image.url # => "http://ecx.images-amazon.com/images/I/41b3TNb3uCL._SL500_AA300_.jpg"
35
39
 
40
+ item.price # => #<Money cents:500 currency:USD>
41
+ item.price.to_f # => 5.0
42
+ item.price.format # => "$5.00"
43
+ item.price.currency.symbol # => "$"
36
44
 
37
45
  # Get Raw Nokogiri Document
38
46
  item.doc.class.name # => Nokogiri::HTML::Document
@@ -44,6 +52,7 @@ The following attributes are available from items:
44
52
 
45
53
  * title - (String) The name of the item/product
46
54
  * description - (String) The item/product description
55
+ * price - (Money) A [Money](https://github.com/RubyMoney/money) object representing the item price. This makes exchange rates and math functionality easy to use.
47
56
  * image - (Hash) The main image of the item
48
57
  * images - (Array) Any available images of the item
49
58
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.0
1
+ 0.3.0
data/fletcher.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{fletcher}
8
- s.version = "0.2.0"
8
+ s.version = "0.3.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Dave Hulihan", "Hulihan Applications"]
12
- s.date = %q{2011-12-15}
12
+ s.date = %q{2012-01-01}
13
13
  s.description = %q{Easily fetch product/item information from third party websites such as Amazon, eBay, etc.}
14
14
  s.email = %q{dave@hulihanapplications.com}
15
15
  s.extra_rdoc_files = [
@@ -62,31 +62,37 @@ Gem::Specification.new do |s|
62
62
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
63
63
  s.add_runtime_dependency(%q<hashie>, [">= 0"])
64
64
  s.add_runtime_dependency(%q<nokogiri>, [">= 0"])
65
+ s.add_runtime_dependency(%q<money>, [">= 0"])
65
66
  s.add_development_dependency(%q<shoulda>, [">= 0"])
66
67
  s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
67
68
  s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
68
69
  s.add_development_dependency(%q<rcov>, [">= 0"])
69
70
  s.add_development_dependency(%q<rspec>, [">= 0"])
70
71
  s.add_development_dependency(%q<factory_girl>, [">= 0"])
72
+ s.add_development_dependency(%q<i18n>, [">= 0"])
71
73
  else
72
74
  s.add_dependency(%q<hashie>, [">= 0"])
73
75
  s.add_dependency(%q<nokogiri>, [">= 0"])
76
+ s.add_dependency(%q<money>, [">= 0"])
74
77
  s.add_dependency(%q<shoulda>, [">= 0"])
75
78
  s.add_dependency(%q<bundler>, ["~> 1.0.0"])
76
79
  s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
77
80
  s.add_dependency(%q<rcov>, [">= 0"])
78
81
  s.add_dependency(%q<rspec>, [">= 0"])
79
82
  s.add_dependency(%q<factory_girl>, [">= 0"])
83
+ s.add_dependency(%q<i18n>, [">= 0"])
80
84
  end
81
85
  else
82
86
  s.add_dependency(%q<hashie>, [">= 0"])
83
87
  s.add_dependency(%q<nokogiri>, [">= 0"])
88
+ s.add_dependency(%q<money>, [">= 0"])
84
89
  s.add_dependency(%q<shoulda>, [">= 0"])
85
90
  s.add_dependency(%q<bundler>, ["~> 1.0.0"])
86
91
  s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
87
92
  s.add_dependency(%q<rcov>, [">= 0"])
88
93
  s.add_dependency(%q<rspec>, [">= 0"])
89
94
  s.add_dependency(%q<factory_girl>, [">= 0"])
95
+ s.add_dependency(%q<i18n>, [">= 0"])
90
96
  end
91
97
  end
92
98
 
data/lib/fletcher.rb CHANGED
@@ -55,4 +55,14 @@ module Fletcher
55
55
  item.parse(data)
56
56
  return item
57
57
  end
58
+
59
+ # Get gem version
60
+ def self.version
61
+ File.read(File.join(root, "VERSION"))
62
+ end
63
+
64
+ # Get gem root directory
65
+ def self.root
66
+ File.expand_path("../..", __FILE__)
67
+ end
58
68
  end
@@ -22,6 +22,9 @@ module Fletcher
22
22
  # Get description from meta title if not found
23
23
  self.description = doc.xpath("//meta[@name='description']/@content").first_string if description.nil?
24
24
 
25
+ # Get Price
26
+ parse_price(doc.css("b.priceLarge").first_string)
27
+
25
28
  # Get Images
26
29
  self.images = doc.xpath("//table[@class='productImageGrid']//img").attribute_array
27
30
  self.image = images.first
@@ -1,4 +1,5 @@
1
1
  require "hashie"
2
+ require "money"
2
3
 
3
4
  module Fletcher
4
5
  module Item
@@ -25,6 +26,15 @@ module Fletcher
25
26
  def parse(data)
26
27
  self.doc = data # save data for if user wants to access it later
27
28
  end
29
+
30
+ # Parse a raw price string to get usable data
31
+ # item.parse_price("$5.00") # => #<Money cents:500 currency:USD>
32
+ # item.price.to_f # => 5.0
33
+ # item.price.currency.symbol # => '$'
34
+ def parse_price(raw_price = nil)
35
+ return if raw_price.nil?
36
+ self.price = ::Money.parse(raw_price)
37
+ end
28
38
  end # Base
29
39
  end # Item
30
40
  end # Fletcher
@@ -18,6 +18,9 @@ module Fletcher
18
18
 
19
19
  # Get Description
20
20
  # OMITTED: This is tough to get because ebay item descriptions are custom html/content created by sellers
21
+
22
+ # Get Price
23
+ parse_price(doc.xpath("//span[@itemprop='price']").first_string.gsub(/US/, ""))
21
24
 
22
25
  # Get Image
23
26
  self.images = [{:url => doc.xpath("//span[@itemprop='image']/img").first_string}]
@@ -18,6 +18,9 @@ module Fletcher
18
18
 
19
19
  # Get Description
20
20
  self.description = doc.xpath("//div[@id='item-description']/div[@class='section-content']").first_string
21
+
22
+ # Get Price
23
+ parse_price(doc.xpath("//div[@class='item-amount']").first_string)
21
24
 
22
25
  # Get Images
23
26
  self.images = doc.xpath("//div[@id='item-main']//div[@id='fullimage_link1']//img").attribute_array
@@ -19,6 +19,9 @@ module Fletcher
19
19
  # Get Description
20
20
  self.description = doc.xpath("//meta[@property='og:description']/@content").first_string
21
21
 
22
+ # Get Price
23
+ parse_price(doc.xpath("//form[@id='buy']/h3").first_string)
24
+
22
25
  # Get Images
23
26
  self.images = [{:url => doc.xpath("//meta[@property='og:image']/@content").first_string}]
24
27
  self.image = images.first
@@ -1,9 +1,16 @@
1
1
  require "hashie"
2
2
 
3
- Factory.define :item, :class => Hashie::Mash do |o|
3
+ Factory.define :item, :class => Fletcher::Item::Base do |o|
4
4
  o.url "http://www.example.com"
5
5
  end
6
6
 
7
+ Factory.define :sample_item, :parent => :item do |o|
8
+ o.url "http://www.example.com"
9
+ o.name "Sample Item"
10
+ o.description "This is a sample description."
11
+ o.raw_price "$5.00"
12
+ end
13
+
7
14
  Factory.define :invalid_item, :parent => :item do |o|
8
15
  end
9
16
 
@@ -14,7 +14,7 @@ describe Fletcher::Data do
14
14
 
15
15
  # This is just a rough indicator of how long a data should take to download
16
16
  it "shouldn't take too long" do
17
- benchmark{ doc = Fletcher::Data.read(Factory(:valid_item).url)}.should_not be_slower_than(3.0)
17
+ # benchmark{ doc = Fletcher::Data.read(Factory(:valid_item).url)}.should_not be_slower_than(5.0)
18
18
  end
19
19
  end
20
20
  end
@@ -8,6 +8,7 @@ describe Fletcher::Item::Amazon do
8
8
  item.parse Fletcher::Data.read(Factory(:amazon_item).url)
9
9
  item.name.should_not be_nil
10
10
  item.description.should_not be_nil
11
+ item.price.should_not be_nil
11
12
  item.image.should_not be_nil
12
13
  end
13
14
  end
@@ -8,4 +8,13 @@ describe Fletcher::Item::Base do
8
8
  it "should create properly" do
9
9
  end
10
10
  end
11
+
12
+ describe "parse_price" do
13
+ it "should return a price float and currency" do
14
+ item = Factory.build(:sample_item)
15
+ item.parse_price(item.raw_price)
16
+ item.price.is_a?(Money).should == true
17
+ item.price.currency.should_not be_nil
18
+ end
19
+ end
11
20
  end
@@ -5,8 +5,9 @@ describe Fletcher::Item::Ebay do
5
5
  context "with valid data" do
6
6
  it "should return correct item info" do
7
7
  item = described_class.new
8
- item.parse Fletcher::Data.read(Factory(:ebay_item).url)
8
+ item.parse Fletcher::Data.read(Factory(:ebay_item).url)
9
9
  item.name.should_not be_nil
10
+ item.price.should_not be_nil
10
11
  item.image.should_not be_nil
11
12
  end
12
13
  end
@@ -8,6 +8,7 @@ describe Fletcher::Item::Etsy do
8
8
  item.parse Fletcher::Data.read(Factory(:etsy_item).url)
9
9
  item.name.should_not be_nil
10
10
  item.description.should_not be_nil
11
+ item.price.should_not be_nil
11
12
  item.image.should_not be_nil
12
13
  end
13
14
  end
@@ -7,6 +7,7 @@ describe Fletcher::Item::Thinkgeek do
7
7
  item = described_class.new
8
8
  item.parse Fletcher::Data.read(Factory(:thinkgeek_item).url)
9
9
  item.name.should_not be_nil
10
+ item.price.should_not be_nil
10
11
  item.image.should_not be_nil
11
12
  end
12
13
  end
@@ -49,4 +49,10 @@ describe Fletcher do
49
49
  end
50
50
  end
51
51
  end
52
+
53
+ describe :version do
54
+ it "should return a string" do
55
+ described_class.version.should_not be_nil
56
+ end
57
+ end
52
58
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fletcher
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,11 +10,11 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2011-12-15 00:00:00.000000000Z
13
+ date: 2012-01-01 00:00:00.000000000Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: hashie
17
- requirement: &72722980 !ruby/object:Gem::Requirement
17
+ requirement: &71525050 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ! '>='
@@ -22,10 +22,10 @@ dependencies:
22
22
  version: '0'
23
23
  type: :runtime
24
24
  prerelease: false
25
- version_requirements: *72722980
25
+ version_requirements: *71525050
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: nokogiri
28
- requirement: &72722640 !ruby/object:Gem::Requirement
28
+ requirement: &71524600 !ruby/object:Gem::Requirement
29
29
  none: false
30
30
  requirements:
31
31
  - - ! '>='
@@ -33,10 +33,21 @@ dependencies:
33
33
  version: '0'
34
34
  type: :runtime
35
35
  prerelease: false
36
- version_requirements: *72722640
36
+ version_requirements: *71524600
37
+ - !ruby/object:Gem::Dependency
38
+ name: money
39
+ requirement: &71524080 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ! '>='
43
+ - !ruby/object:Gem::Version
44
+ version: '0'
45
+ type: :runtime
46
+ prerelease: false
47
+ version_requirements: *71524080
37
48
  - !ruby/object:Gem::Dependency
38
49
  name: shoulda
39
- requirement: &72722400 !ruby/object:Gem::Requirement
50
+ requirement: &71523400 !ruby/object:Gem::Requirement
40
51
  none: false
41
52
  requirements:
42
53
  - - ! '>='
@@ -44,10 +55,10 @@ dependencies:
44
55
  version: '0'
45
56
  type: :development
46
57
  prerelease: false
47
- version_requirements: *72722400
58
+ version_requirements: *71523400
48
59
  - !ruby/object:Gem::Dependency
49
60
  name: bundler
50
- requirement: &72722160 !ruby/object:Gem::Requirement
61
+ requirement: &71522560 !ruby/object:Gem::Requirement
51
62
  none: false
52
63
  requirements:
53
64
  - - ~>
@@ -55,10 +66,10 @@ dependencies:
55
66
  version: 1.0.0
56
67
  type: :development
57
68
  prerelease: false
58
- version_requirements: *72722160
69
+ version_requirements: *71522560
59
70
  - !ruby/object:Gem::Dependency
60
71
  name: jeweler
61
- requirement: &72721910 !ruby/object:Gem::Requirement
72
+ requirement: &71521590 !ruby/object:Gem::Requirement
62
73
  none: false
63
74
  requirements:
64
75
  - - ~>
@@ -66,10 +77,10 @@ dependencies:
66
77
  version: 1.6.4
67
78
  type: :development
68
79
  prerelease: false
69
- version_requirements: *72721910
80
+ version_requirements: *71521590
70
81
  - !ruby/object:Gem::Dependency
71
82
  name: rcov
72
- requirement: &72721670 !ruby/object:Gem::Requirement
83
+ requirement: &71520830 !ruby/object:Gem::Requirement
73
84
  none: false
74
85
  requirements:
75
86
  - - ! '>='
@@ -77,10 +88,10 @@ dependencies:
77
88
  version: '0'
78
89
  type: :development
79
90
  prerelease: false
80
- version_requirements: *72721670
91
+ version_requirements: *71520830
81
92
  - !ruby/object:Gem::Dependency
82
93
  name: rspec
83
- requirement: &72721430 !ruby/object:Gem::Requirement
94
+ requirement: &71519900 !ruby/object:Gem::Requirement
84
95
  none: false
85
96
  requirements:
86
97
  - - ! '>='
@@ -88,10 +99,21 @@ dependencies:
88
99
  version: '0'
89
100
  type: :development
90
101
  prerelease: false
91
- version_requirements: *72721430
102
+ version_requirements: *71519900
92
103
  - !ruby/object:Gem::Dependency
93
104
  name: factory_girl
94
- requirement: &72721190 !ruby/object:Gem::Requirement
105
+ requirement: &71519240 !ruby/object:Gem::Requirement
106
+ none: false
107
+ requirements:
108
+ - - ! '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ type: :development
112
+ prerelease: false
113
+ version_requirements: *71519240
114
+ - !ruby/object:Gem::Dependency
115
+ name: i18n
116
+ requirement: &71518690 !ruby/object:Gem::Requirement
95
117
  none: false
96
118
  requirements:
97
119
  - - ! '>='
@@ -99,7 +121,7 @@ dependencies:
99
121
  version: '0'
100
122
  type: :development
101
123
  prerelease: false
102
- version_requirements: *72721190
124
+ version_requirements: *71518690
103
125
  description: Easily fetch product/item information from third party websites such
104
126
  as Amazon, eBay, etc.
105
127
  email: dave@hulihanapplications.com
@@ -156,7 +178,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
156
178
  version: '0'
157
179
  segments:
158
180
  - 0
159
- hash: 1392307
181
+ hash: -857180173
160
182
  required_rubygems_version: !ruby/object:Gem::Requirement
161
183
  none: false
162
184
  requirements: