wowecon 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/wowecon.rb +41 -0
- data/lib/wowecon/currency.rb +52 -0
- data/spec/currency_spec.rb +35 -0
- data/spec/wowecon_spec.rb +45 -0
- metadata +81 -0
data/lib/wowecon.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'open-uri'
|
2
|
+
require 'nokogiri'
|
3
|
+
require 'wowecon/currency.rb'
|
4
|
+
|
5
|
+
module Wowecon
|
6
|
+
def self.price(item_name, opts={})
|
7
|
+
request_url = "http://data.wowecon.com/?type=price&item_name=#{uri_escape(item_name)}"
|
8
|
+
opts.each_pair {|name, value| request_url += "&#{name.to_s}=#{uri_escape(value)}" }
|
9
|
+
response = Nokogiri::HTML(open(request_url))
|
10
|
+
|
11
|
+
if response.css('table.wowecon_wowcurrency tr td').length > 0
|
12
|
+
currency_types = {:g => :gold, :s => :silver, :c => :copper}
|
13
|
+
currency_type = nil
|
14
|
+
currency = {:gold => 0, :silver => 0, :copper => 0}
|
15
|
+
|
16
|
+
cells = response.css('table.wowecon_wowcurrency tr td')
|
17
|
+
cells.reverse_each do |cell|
|
18
|
+
if img = cell.at_css('img')
|
19
|
+
coin = img.attribute('alt').content.match(/([gsc])/)
|
20
|
+
currency_type = currency_types[coin[0].to_sym]
|
21
|
+
next
|
22
|
+
end
|
23
|
+
|
24
|
+
value = cell.inner_text.strip.match(/([0-9]+)/)
|
25
|
+
if value
|
26
|
+
currency[currency_type] = value[0].to_i
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
currency.merge({:float => (currency[:gold] + (currency[:silver].to_f / 100) + (currency[:copper].to_f / 10000)).to_f})
|
31
|
+
else
|
32
|
+
{:error => "price not found"}
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def self.uri_escape(string)
|
39
|
+
URI.escape(string, Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module Wowecon
|
2
|
+
class Currency
|
3
|
+
|
4
|
+
attr_accessor :gold, :silver, :copper
|
5
|
+
|
6
|
+
def initialize(value)
|
7
|
+
if value.class == Float
|
8
|
+
f = sprintf("%.4f", value).split(".")
|
9
|
+
self.gold = f[0].to_i
|
10
|
+
self.silver = f[1][0,2].to_i
|
11
|
+
self.copper = f[1][2,2].to_i
|
12
|
+
elsif value.class == Hash
|
13
|
+
self.gold = value[:gold]
|
14
|
+
self.silver = value[:silver]
|
15
|
+
self.copper = value[:copper]
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.from_hash(denoms)
|
20
|
+
(denoms[:gold] + (denoms[:silver].to_f / 100) + (denoms[:copper].to_f / 10000)).to_f
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_hash
|
24
|
+
{:gold => @gold, :silver => @silver, :copper => @copper}
|
25
|
+
end
|
26
|
+
|
27
|
+
def to_f
|
28
|
+
(@gold + (@silver.to_f / 100) + (@copper.to_f / 10000)).to_f
|
29
|
+
end
|
30
|
+
|
31
|
+
def to_s
|
32
|
+
output = ""
|
33
|
+
self.to_hash.each do |denom, value|
|
34
|
+
if value > 0 || output.length > 0
|
35
|
+
output += "#{value.to_s.gsub(/(\d)(?=(\d\d\d)+(?!\d))/, "\\1,")}#{denom.to_s[0,1]} "
|
36
|
+
end
|
37
|
+
end
|
38
|
+
output.strip
|
39
|
+
end
|
40
|
+
|
41
|
+
def to_html
|
42
|
+
tags = ""
|
43
|
+
self.to_hash.each do |denom, value|
|
44
|
+
if value > 0 || tags.length > 0
|
45
|
+
tags += "<var class=\"#{denom.to_s}\">#{value.to_s.gsub(/(\d)(?=(\d\d\d)+(?!\d))/, "\\1,")}</var>"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
tags
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require_relative "../lib/wowecon/currency.rb"
|
2
|
+
|
3
|
+
describe Wowecon::Currency do
|
4
|
+
|
5
|
+
before :each do
|
6
|
+
@currency = Wowecon::Currency.new({:gold => 1420, :silver => 9, :copper => 10})
|
7
|
+
end
|
8
|
+
|
9
|
+
it "can be initialised using a floating point value" do
|
10
|
+
currency = Wowecon::Currency.new(1420.091)
|
11
|
+
currency.class.should == Wowecon::Currency
|
12
|
+
end
|
13
|
+
|
14
|
+
it "can be initialised using a hash" do
|
15
|
+
currency = Wowecon::Currency.new({:gold => 1420, :silver => 9, :copper => 10})
|
16
|
+
currency.class.should == Wowecon::Currency
|
17
|
+
end
|
18
|
+
|
19
|
+
it "responds to hash" do
|
20
|
+
(@currency.should respond_to :to_hash) && @currency.to_hash.should == {:gold => 1420, :silver => 9, :copper => 10}
|
21
|
+
end
|
22
|
+
|
23
|
+
it "responds to float" do
|
24
|
+
(@currency.should respond_to :to_f) && @currency.to_f.should == 1420.091
|
25
|
+
end
|
26
|
+
|
27
|
+
it "can create a string representation of the currency value" do
|
28
|
+
@currency.to_s.should == "1,420g 9s 10c"
|
29
|
+
end
|
30
|
+
|
31
|
+
it "can create a HTML tag representation of the currency value" do
|
32
|
+
@currency.to_html.should == '<var class="gold">1,420</var><var class="silver">9</var><var class="copper">10</var>'
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require_relative "../lib/wowecon.rb"
|
2
|
+
|
3
|
+
describe Wowecon do
|
4
|
+
realm = { :name => "Alonsus", :region => "EU", :faction => "alliance" }
|
5
|
+
|
6
|
+
describe "With a valid item" do
|
7
|
+
price = Wowecon.price("Rock Furrow Boots")
|
8
|
+
|
9
|
+
unless price.has_key? :error
|
10
|
+
describe "if price data was found" do
|
11
|
+
it "should have an integer gold value" do
|
12
|
+
(price.should have_key :gold) && price[:gold].class.should == Fixnum
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should have an integer silver value" do
|
16
|
+
(price.should have_key :silver) && price[:silver].class.should == Fixnum
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should have an integer copper value" do
|
20
|
+
(price.should have_key :copper) && price[:copper].class.should == Fixnum
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should have float value representing the complete price" do
|
24
|
+
(price.should have_key :float) && price[:float].class.should == Float
|
25
|
+
end
|
26
|
+
end
|
27
|
+
else
|
28
|
+
describe "if no price data was found" do
|
29
|
+
it "should return an error" do
|
30
|
+
price.should == {:error => "price not found"}
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
# use http://data.wowecon.com/?type=price&item_name=Rock%20Furrow%20Boots to confirm
|
38
|
+
describe "With known market data" do
|
39
|
+
it "should return a value of 7401.0 for this item" do
|
40
|
+
price = Wowecon.price("Rock Furrow Boots")
|
41
|
+
price.should == {:gold=>7401, :silver=>0, :copper=>0, :float=>7401.0}
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
metadata
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: wowecon
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease:
|
5
|
+
version: 0.1.0
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Ben Darlow
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
|
13
|
+
date: 2011-06-30 00:00:00 +01:00
|
14
|
+
default_executable:
|
15
|
+
dependencies:
|
16
|
+
- !ruby/object:Gem::Dependency
|
17
|
+
name: nokogiri
|
18
|
+
prerelease: false
|
19
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
20
|
+
none: false
|
21
|
+
requirements:
|
22
|
+
- - ~>
|
23
|
+
- !ruby/object:Gem::Version
|
24
|
+
version: "1.4"
|
25
|
+
type: :runtime
|
26
|
+
version_requirements: *id001
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rspec
|
29
|
+
prerelease: false
|
30
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
31
|
+
none: false
|
32
|
+
requirements:
|
33
|
+
- - ~>
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: "2.6"
|
36
|
+
type: :development
|
37
|
+
version_requirements: *id002
|
38
|
+
description: Ruby API to wowecon.com market data.
|
39
|
+
email: ben@kapowaz.net
|
40
|
+
executables: []
|
41
|
+
|
42
|
+
extensions: []
|
43
|
+
|
44
|
+
extra_rdoc_files: []
|
45
|
+
|
46
|
+
files:
|
47
|
+
- lib/wowecon/currency.rb
|
48
|
+
- lib/wowecon.rb
|
49
|
+
- spec/currency_spec.rb
|
50
|
+
- spec/wowecon_spec.rb
|
51
|
+
has_rdoc: true
|
52
|
+
homepage: http://github.com/kapowaz/wowecon
|
53
|
+
licenses: []
|
54
|
+
|
55
|
+
post_install_message:
|
56
|
+
rdoc_options: []
|
57
|
+
|
58
|
+
require_paths:
|
59
|
+
- lib
|
60
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - ">="
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: 1.9.2
|
66
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
67
|
+
none: false
|
68
|
+
requirements:
|
69
|
+
- - ">="
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: "0"
|
72
|
+
requirements: []
|
73
|
+
|
74
|
+
rubyforge_project:
|
75
|
+
rubygems_version: 1.6.2
|
76
|
+
signing_key:
|
77
|
+
specification_version: 3
|
78
|
+
summary: wowecon
|
79
|
+
test_files:
|
80
|
+
- spec/currency_spec.rb
|
81
|
+
- spec/wowecon_spec.rb
|