apmex-price 0.1.1

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 6ae60dec8d6baec7159656a4d01a68a2b6d7efca
4
+ data.tar.gz: ea4aacbb141ae9665fbef74cc0860c6390089539
5
+ SHA512:
6
+ metadata.gz: 68ecada31c593ab14c9d4d79b7a56c19a875e22e7c82e713971e13c4a8d53ae7bad9d42618253cb08c2195171ba4865157ca134cadbae78e6b1b85c1e03fda5d
7
+ data.tar.gz: 71b6e993996aa5fcd2dec5f6780ea64581d3e8029b056877e090063d4ce826bc615a9eba6a4848b8dce21e5c5a1ed97f30ae91ae8f13e247dc23dd822db61a73
@@ -0,0 +1,60 @@
1
+ require 'rubygems'
2
+ require 'nokogiri'
3
+ require 'open-uri'
4
+
5
+ class ApmexPrice
6
+ attr_accessor :url, :page, :spot, :ounces_spot, :buy, :sell, :current_value
7
+
8
+ DOLLARS_REGEX = /(\d*,*\d+\.\d+)/
9
+ OUNCES_REGEX = /(\d*,*\d+\.?\d*)/
10
+ OUNCES_CSS = 'div.product-specs > table > tbody > tr:nth-child(7) > td'
11
+ SPOT_CSS = 'span.item-bid'
12
+ BUY_CSS = 'div.product-buy-price > h4 > a'
13
+ SELL_CSS = 'table.table-volume-pricing > tbody > tr:nth-child(1) > td:nth-child(2)'
14
+
15
+ def initialize(url)
16
+ @url = url
17
+ match()
18
+ calculate()
19
+ end
20
+
21
+ def match
22
+ @page = Nokogiri::HTML(open(@url))
23
+
24
+ # Get ounces
25
+ ounces_text = @page.css(OUNCES_CSS).text
26
+ ounces_match = OUNCES_REGEX.match(ounces_text)
27
+ @ounces = ounces_match[0].to_f
28
+
29
+ # Get the dollar amounts
30
+ @spot = match_dollars(SPOT_CSS)
31
+ @buy = match_dollars(BUY_CSS)
32
+ @sell = match_dollars(SELL_CSS)
33
+ end
34
+
35
+ def calculate
36
+ @ounces_spot = @spot * @ounces
37
+
38
+ if @buy != 0.0
39
+ @current_value = @buy
40
+ else
41
+ @current_value = @ounces_spot
42
+ end
43
+ end
44
+
45
+ def match_dollars(dollars_css)
46
+ dollars_text = @page.css(dollars_css).text
47
+ dollars_match = DOLLARS_REGEX.match(dollars_text)
48
+
49
+ if dollars_match != nil
50
+ dollars_match[1].gsub(',', '').to_f
51
+ else
52
+ 0.0
53
+ end
54
+ end
55
+
56
+ # Aid in creating CSV files
57
+ def to_s
58
+ @current_value.to_s + ',' + @spot.to_s + ',' + @buy.to_s + ',' + @sell.to_s
59
+ end
60
+ end
@@ -0,0 +1,80 @@
1
+ require 'minitest/autorun'
2
+ require 'apmex-price'
3
+
4
+ class ApmexPriceTest < Minitest::Unit::TestCase
5
+ def test
6
+ apmex_urls = [
7
+ 'http://www.apmex.com/product/3/1-4-oz-gold-american-eagle-random-year',
8
+ 'http://www.apmex.com/product/3/1-4-oz-gold-american-eagle-random-year',
9
+ 'http://www.apmex.com/product/3/1-4-oz-gold-american-eagle-random-year',
10
+ 'http://www.apmex.com/product/1/1-oz-gold-american-eagle-random-year',
11
+ 'http://www.apmex.com/product/23331/1-oz-silver-american-eagle-random-year',
12
+ 'http://www.apmex.com/product/23331/1-oz-silver-american-eagle-random-year',
13
+ 'http://www.apmex.com/product/23331/1-oz-silver-american-eagle-random-year',
14
+ 'http://www.apmex.com/product/23331/1-oz-silver-american-eagle-random-year',
15
+ 'http://www.apmex.com/product/79019/2014-1-oz-silver-american-eagle-bu',
16
+ 'http://www.apmex.com/product/79019/2014-1-oz-silver-american-eagle-bu',
17
+ 'http://www.apmex.com/product/79019/2014-1-oz-silver-american-eagle-bu',
18
+ 'http://www.apmex.com/product/79019/2014-1-oz-silver-american-eagle-bu',
19
+ 'http://www.apmex.com/product/79019/2014-1-oz-silver-american-eagle-bu',
20
+ 'http://www.apmex.com/product/79019/2014-1-oz-silver-american-eagle-bu',
21
+ 'http://www.apmex.com/product/79019/2014-1-oz-silver-american-eagle-bu',
22
+ 'http://www.apmex.com/product/54875/2010-australia-1-oz-silver-kookaburra-bu',
23
+ 'http://www.apmex.com/product/54875/2010-australia-1-oz-silver-kookaburra-bu',
24
+ 'http://www.apmex.com/product/54875/2010-australia-1-oz-silver-kookaburra-bu',
25
+ 'http://www.apmex.com/product/84445/2015-australia-1-oz-silver-kookaburra-bu',
26
+ 'http://www.apmex.com/product/84445/2015-australia-1-oz-silver-kookaburra-bu',
27
+ 'http://www.apmex.com/product/84445/2015-australia-1-oz-silver-kookaburra-bu',
28
+ 'http://www.apmex.com/product/84445/2015-australia-1-oz-silver-kookaburra-bu',
29
+ 'http://www.apmex.com/product/84445/2015-australia-1-oz-silver-kookaburra-bu',
30
+ 'http://www.apmex.com/product/84445/2015-australia-1-oz-silver-kookaburra-bu',
31
+ 'http://www.apmex.com/product/84445/2015-australia-1-oz-silver-kookaburra-bu',
32
+ 'http://www.apmex.com/product/79047/2014-1-10-oz-gold-austrian-philharmonic',
33
+ 'http://www.apmex.com/product/79021/2014-austria-1-oz-silver-philharmonic',
34
+ 'http://www.apmex.com/product/79021/2014-austria-1-oz-silver-philharmonic',
35
+ 'http://www.apmex.com/product/79021/2014-austria-1-oz-silver-philharmonic',
36
+ 'http://www.apmex.com/product/79021/2014-austria-1-oz-silver-philharmonic',
37
+ 'http://www.apmex.com/product/79021/2014-austria-1-oz-silver-philharmonic',
38
+ 'http://www.apmex.com/product/79021/2014-austria-1-oz-silver-philharmonic',
39
+ 'http://www.apmex.com/product/79021/2014-austria-1-oz-silver-philharmonic',
40
+ 'http://www.apmex.com/product/79021/2014-austria-1-oz-silver-philharmonic',
41
+ 'http://www.apmex.com/product/79021/2014-austria-1-oz-silver-philharmonic',
42
+ 'http://www.apmex.com/product/79021/2014-austria-1-oz-silver-philharmonic',
43
+ 'http://www.apmex.com/product/79573/2014-1-oz-silver-britannia-brilliant-uncirculated',
44
+ 'http://www.apmex.com/product/12/1-10-oz-gold-canadian-maple-leaf-random-year',
45
+ 'http://www.apmex.com/product/79041/2014-canada-1-4-oz-gold-maple-leaf-bu',
46
+ 'http://www.apmex.com/product/79041/2014-canada-1-4-oz-gold-maple-leaf-bu',
47
+ 'http://www.apmex.com/product/79041/2014-canada-1-4-oz-gold-maple-leaf-bu',
48
+ 'http://www.apmex.com/product/1090/1-oz-silver-canadian-maple-leaf-random-year',
49
+ 'http://www.apmex.com/product/79056/2014-1-10-oz-gold-chinese-panda-sealed',
50
+ 'http://www.apmex.com/product/72458/2013-china-1-oz-silver-panda-bu-in-capsule',
51
+ 'http://www.apmex.com/product/72458/2013-china-1-oz-silver-panda-bu-in-capsule',
52
+ 'http://www.apmex.com/product/1114/1-oz-silver-mexican-libertad-random-year',
53
+ 'http://www.apmex.com/product/1114/1-oz-silver-mexican-libertad-random-year',
54
+ 'http://www.apmex.com/product/1114/1-oz-silver-mexican-libertad-random-year',
55
+ 'http://www.apmex.com/product/1114/1-oz-silver-mexican-libertad-random-year',
56
+ 'http://www.apmex.com/product/11951/1-oz-pamp-suisse-gold-bar-9999-fine-in-assay',
57
+ 'http://www.apmex.com/product/57159/1-oz-perth-mint-gold-bar-9999-fine-in-assay',
58
+ 'http://www.apmex.com/product/21/10-oz-silver-bar-secondary-market-999-fine',
59
+ 'http://www.apmex.com/product/21/10-oz-silver-bar-secondary-market-999-fine',
60
+ 'http://www.apmex.com/product/21/10-oz-silver-bar-secondary-market-999-fine',
61
+ 'http://www.apmex.com/product/21/10-oz-silver-bar-secondary-market-999-fine',
62
+ 'http://www.apmex.com/product/72281/10-oz-sunshine-silver-bar-999-fine-v2',
63
+ 'http://www.apmex.com/product/72281/10-oz-sunshine-silver-bar-999-fine-v2',
64
+ 'http://www.apmex.com/product/72281/10-oz-sunshine-silver-bar-999-fine-v2',
65
+ 'http://www.apmex.com/product/72281/10-oz-sunshine-silver-bar-999-fine-v2',
66
+ 'http://www.apmex.com/product/72281/10-oz-sunshine-silver-bar-999-fine-v2'
67
+ ]
68
+
69
+ puts 'Current Value,Spot,Buy,Sell'
70
+
71
+ apmex_urls.each do |u|
72
+ a = ApmexPrice.new(u)
73
+ puts a.to_s
74
+ assert a.current_value.is_a? Float
75
+ assert a.spot.is_a? Float
76
+ assert a.buy.is_a? Float
77
+ assert a.sell.is_a? Float
78
+ end
79
+ end
80
+ end
metadata ADDED
@@ -0,0 +1,52 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: apmex-price
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - cscribn
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-06-30 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Do you own precious metals? Are you interested in getting the current
14
+ value of your collection? If so, this gem is for you. Simply find the URL of a product
15
+ you are interested in, pass it as an argument, and you will get back the spot, buy,
16
+ sell, and current value price. The current price is either the APMEX buy price or
17
+ the spot price if the buy price is not available. This program relies on CSS paths
18
+ of the apmex.com website, and will therefore need to be updated whenever the site
19
+ design changes.
20
+ email:
21
+ executables: []
22
+ extensions: []
23
+ extra_rdoc_files: []
24
+ files:
25
+ - lib/apmex-price.rb
26
+ - test/test-apmex-price.rb
27
+ homepage: http://rubygems.org/gems/apmex-price
28
+ licenses:
29
+ - MIT
30
+ metadata: {}
31
+ post_install_message:
32
+ rdoc_options: []
33
+ require_paths:
34
+ - lib
35
+ required_ruby_version: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - '>='
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ required_rubygems_version: !ruby/object:Gem::Requirement
41
+ requirements:
42
+ - - '>='
43
+ - !ruby/object:Gem::Version
44
+ version: '0'
45
+ requirements: []
46
+ rubyforge_project:
47
+ rubygems_version: 2.0.15
48
+ signing_key:
49
+ specification_version: 4
50
+ summary: Get spot, buy, sell, and current value prices of precious metals using apmex.com
51
+ URLs.
52
+ test_files: []