tickerpicker 0.1.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.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +92 -0
- data/Rakefile +20 -0
- data/lib/tickerpicker/configuration.rb +38 -0
- data/lib/tickerpicker/factory/bitstamp.rb +30 -0
- data/lib/tickerpicker/factory/btce.rb +30 -0
- data/lib/tickerpicker/factory/btcturk.rb +30 -0
- data/lib/tickerpicker/factory/mtgox.rb +30 -0
- data/lib/tickerpicker/price.rb +67 -0
- data/lib/tickerpicker/stocks.yml +26 -0
- data/lib/tickerpicker/ticker.rb +123 -0
- data/lib/tickerpicker/version.rb +3 -0
- data/lib/tickerpicker.rb +20 -0
- data/test/test_helper.rb +2 -0
- data/test/unit/factory/developer.rb +30 -0
- data/test/unit/factory/tester.rb +32 -0
- data/test/unit/json/developer.json +1 -0
- data/test/unit/json/tester.json +1 -0
- data/test/unit/stocks.yml +9 -0
- data/test/unit/ticker_test.rb +77 -0
- data/tickerpicker.gemspec +24 -0
- metadata +116 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 00f099b7d1bf241107b8f190bd1ac33035bbcac6
|
4
|
+
data.tar.gz: c1814d7cb4f770092de723acd7942daa4bdcb2b7
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 8038240dd655305453a7b15edc3fac7ad46fc2bcfe9f4ab0975490de8610da6c8df6753ac1f88dd7ac5bf7a4ed5831228eb94bca1d544f87be085ffe3f5e6efc
|
7
|
+
data.tar.gz: 02d521026b877b8363488b6538c7a7001f960fcc323361e32c25ffa12523fc84e54da7a5b96bd772e0c2452e13ebf2db4e3b5d807a2163b6fb86211cfe3ff781
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2014 Mustafa Turan
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,92 @@
|
|
1
|
+
# TickerPicker
|
2
|
+
|
3
|
+
[](https://travis-ci.org/mustafaturan/tickerpicker) [](https://codeclimate.com/github/mustafaturan/tickerpicker)
|
4
|
+
|
5
|
+
A generalized ticker picker for crypto currency stock exchanges.
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
|
9
|
+
Add this line to your application's Gemfile:
|
10
|
+
|
11
|
+
gem 'tickerpicker'
|
12
|
+
|
13
|
+
And then execute:
|
14
|
+
|
15
|
+
$ bundle
|
16
|
+
|
17
|
+
Or install it yourself as:
|
18
|
+
|
19
|
+
$ gem install tickerpicker
|
20
|
+
|
21
|
+
## Usage
|
22
|
+
Register stocks from avaliable stock list
|
23
|
+
TickerPicker::Ticker.register "mtgox"
|
24
|
+
Or register multiple stocks:
|
25
|
+
TickerPicker::Ticker.register_list ["mtgox", "btce", "bitstamp"]
|
26
|
+
|
27
|
+
Get prices from the stock's specific market:
|
28
|
+
prices = TickerPicker::Ticker.get_prices 'mtgox', 'btc_usd'
|
29
|
+
|
30
|
+
Print all prices as hash:
|
31
|
+
puts prices.to_dh
|
32
|
+
|
33
|
+
Print specific info from prices:
|
34
|
+
puts prices.ask
|
35
|
+
puts prices.bid
|
36
|
+
puts prices.last
|
37
|
+
puts prices.timestamp
|
38
|
+
puts prices.currency
|
39
|
+
|
40
|
+
Get prices from the stock
|
41
|
+
mtgox_markets = TickerPicker::Ticker.get_all_stock_prices 'mtgox'
|
42
|
+
|
43
|
+
Get prices from all avaliable stock-markets
|
44
|
+
all_stock_markets = TickerPicker::Ticker.get_all_stock_market_prices
|
45
|
+
|
46
|
+
## Configuration (optional & advanced)
|
47
|
+
Set your stocks.yml file path if you need to modify default
|
48
|
+
TickerPicker.configure do |config|
|
49
|
+
config.stock_configuration_file = "#{File.dirname(__FILE__)}/stocks.yml" # your stocks.yml path
|
50
|
+
end
|
51
|
+
|
52
|
+
Add new markets to the stocks(sample: your stocks.yml)
|
53
|
+
bitstamp:
|
54
|
+
btc_usd:
|
55
|
+
url: 'https://www.bitstamp.net/api/ticker/'
|
56
|
+
currency: 'USD'
|
57
|
+
btce:
|
58
|
+
btc_usd:
|
59
|
+
url: 'https://btc-e.com/api/2/btc_usd/ticker'
|
60
|
+
currency: 'USD'
|
61
|
+
btc_eur:
|
62
|
+
url: 'https://btc-e.com/api/2/btc_eur/ticker'
|
63
|
+
currency: 'EUR'
|
64
|
+
btc_rub:
|
65
|
+
url: 'https://btc-e.com/api/2/btc_rub/ticker'
|
66
|
+
currency: 'RUB'
|
67
|
+
btcturk:
|
68
|
+
btc_try:
|
69
|
+
url: 'https://btcturk.com/api/ticker/'
|
70
|
+
currency: 'TRY'
|
71
|
+
mtgox:
|
72
|
+
btc_usd:
|
73
|
+
url: 'http://data.mtgox.com/api/2/BTCUSD/money/ticker_fast'
|
74
|
+
currency: 'USD'
|
75
|
+
btc_eur:
|
76
|
+
url: 'http://data.mtgox.com/api/2/BTCEUR/money/ticker_fast'
|
77
|
+
currency: 'EUR'
|
78
|
+
|
79
|
+
|
80
|
+
## Available Stocks
|
81
|
+
MTGOX
|
82
|
+
BTC-E
|
83
|
+
BITSTAMP
|
84
|
+
BTCTURK
|
85
|
+
|
86
|
+
## Contributing
|
87
|
+
|
88
|
+
1. Fork it
|
89
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
90
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
91
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
92
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'bundler/gem_tasks'
|
2
|
+
require 'rake'
|
3
|
+
require 'rake/testtask'
|
4
|
+
|
5
|
+
desc 'Default Task'
|
6
|
+
task :default => [ :test ]
|
7
|
+
|
8
|
+
# Run the unit tests
|
9
|
+
desc 'Run all unit tests'
|
10
|
+
Rake::TestTask.new do |t|
|
11
|
+
t.libs << 'lib'
|
12
|
+
t.test_files = FileList['test/unit/*_test.rb']
|
13
|
+
t.verbose = true
|
14
|
+
end
|
15
|
+
|
16
|
+
# Make a console for testing purposes
|
17
|
+
desc 'Generate a test console'
|
18
|
+
task :console do
|
19
|
+
verbose( false ) { sh 'irb -I lib/ -r "tickerpicker"' }
|
20
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'singleton'
|
2
|
+
require 'logger'
|
3
|
+
require 'yaml'
|
4
|
+
|
5
|
+
module TickerPicker
|
6
|
+
class Configuration
|
7
|
+
include Singleton
|
8
|
+
attr_accessor :logger
|
9
|
+
attr_accessor :stock_configuration_file
|
10
|
+
|
11
|
+
|
12
|
+
class << self
|
13
|
+
def default_logger
|
14
|
+
logger = Logger.new(STDOUT)
|
15
|
+
logger.progname = 'tickerpicker'
|
16
|
+
logger
|
17
|
+
end
|
18
|
+
|
19
|
+
def defaults
|
20
|
+
@@defaults
|
21
|
+
end
|
22
|
+
|
23
|
+
def avaliable_stocks
|
24
|
+
@avaliable_stocks ||= YAML.load_file(TickerPicker.config.stock_configuration_file)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def initialize
|
29
|
+
@@defaults.each_pair{ |k,v| self.send("#{k}=",v) }
|
30
|
+
end
|
31
|
+
|
32
|
+
@@defaults = {
|
33
|
+
logger: default_logger,
|
34
|
+
stock_configuration_file: "#{File.dirname(__FILE__)}/stocks.yml"
|
35
|
+
}
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module TickerPicker
|
2
|
+
module Factory
|
3
|
+
class Bitstamp < TickerPicker::Price
|
4
|
+
class << self
|
5
|
+
# Get prices for the market
|
6
|
+
#
|
7
|
+
# === Returns
|
8
|
+
#
|
9
|
+
# * Hash of markets
|
10
|
+
#
|
11
|
+
def markets
|
12
|
+
TickerPicker::Configuration.avaliable_stocks['bitstamp']
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
# nodoc
|
18
|
+
def instance_mapping(res_hash, currency)
|
19
|
+
new({
|
20
|
+
ask: ("%f" % res_hash['ask']).to_f,
|
21
|
+
bid: ("%f" % res_hash['bid']).to_f,
|
22
|
+
currency: currency,
|
23
|
+
last: ("%f" % res_hash['last']).to_f,
|
24
|
+
timestamp: res_hash['timestamp']
|
25
|
+
})
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module TickerPicker
|
2
|
+
module Factory
|
3
|
+
class Btce < TickerPicker::Price
|
4
|
+
class << self
|
5
|
+
# Get prices for the market
|
6
|
+
#
|
7
|
+
# === Returns
|
8
|
+
#
|
9
|
+
# * Hash of markets
|
10
|
+
#
|
11
|
+
def markets
|
12
|
+
TickerPicker::Configuration.avaliable_stocks['btce']
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
# nodoc
|
18
|
+
def instance_mapping(res_hash, currency)
|
19
|
+
new({
|
20
|
+
ask: ("%f" % res_hash['ticker']['sell']).to_f,
|
21
|
+
bid: ("%f" % res_hash['ticker']['buy']).to_f,
|
22
|
+
currency: currency,
|
23
|
+
last: ("%f" % res_hash['ticker']['last']).to_f,
|
24
|
+
timestamp: res_hash['ticker']['updated']
|
25
|
+
})
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module TickerPicker
|
2
|
+
module Factory
|
3
|
+
class Btcturk < TickerPicker::Price
|
4
|
+
class << self
|
5
|
+
# Get prices for the market
|
6
|
+
#
|
7
|
+
# === Returns
|
8
|
+
#
|
9
|
+
# * Hash of markets
|
10
|
+
#
|
11
|
+
def markets
|
12
|
+
TickerPicker::Configuration.avaliable_stocks['btcturk']
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
# nodoc
|
18
|
+
def instance_mapping(res_hash, currency)
|
19
|
+
new({
|
20
|
+
ask: ("%f" % res_hash['ask']).to_f,
|
21
|
+
bid: ("%f" % res_hash['bid']).to_f,
|
22
|
+
currency: currency,
|
23
|
+
last: ("%f" % res_hash['last']).to_f,
|
24
|
+
timestamp: res_hash['timestamp']
|
25
|
+
})
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module TickerPicker
|
2
|
+
module Factory
|
3
|
+
class Mtgox < TickerPicker::Price
|
4
|
+
class << self
|
5
|
+
# Get prices for the market
|
6
|
+
#
|
7
|
+
# === Returns
|
8
|
+
#
|
9
|
+
# * Hash of markets
|
10
|
+
#
|
11
|
+
def markets
|
12
|
+
TickerPicker::Configuration.avaliable_stocks['mtgox']
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
# nodoc
|
18
|
+
def instance_mapping(res_hash, currency)
|
19
|
+
new({
|
20
|
+
ask: ("%f" % res_hash['data']['sell']['value']).to_f,
|
21
|
+
bid: ("%f" % res_hash['data']['buy']['value']).to_f,
|
22
|
+
currency: currency,
|
23
|
+
last: ("%f" % res_hash['data']['last']['value']).to_f,
|
24
|
+
timestamp: res_hash['data']['now'].to_f / 1000000
|
25
|
+
})
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module TickerPicker
|
2
|
+
class Price
|
3
|
+
include Hashable
|
4
|
+
|
5
|
+
attr_accessor :ask
|
6
|
+
attr_accessor :bid
|
7
|
+
attr_accessor :currency
|
8
|
+
attr_accessor :last
|
9
|
+
attr_accessor :timestamp
|
10
|
+
|
11
|
+
def initialize(price_hash = {})
|
12
|
+
@ask = price_hash[:ask] || 0.0
|
13
|
+
@bid = price_hash[:bid] || 0.0
|
14
|
+
@currency = price_hash[:currency] || ''
|
15
|
+
@last = price_hash[:last] || 0.0
|
16
|
+
@timestamp = price_hash[:timestamp].to_f || Time.now.to_f
|
17
|
+
end
|
18
|
+
|
19
|
+
class << self
|
20
|
+
# Get prices for the market
|
21
|
+
#
|
22
|
+
# ==== Parameters
|
23
|
+
#
|
24
|
+
# * +market+ - string
|
25
|
+
#
|
26
|
+
# === Returns
|
27
|
+
#
|
28
|
+
# * +TickerPicker::Price+ - TickerPicker::Price instance object
|
29
|
+
#
|
30
|
+
def get_prices(market)
|
31
|
+
instance_mapping gather_info(markets[market]['url']), markets[market]['currency']
|
32
|
+
end
|
33
|
+
|
34
|
+
# Abstact method for list of markets in the stock
|
35
|
+
#
|
36
|
+
def markets
|
37
|
+
raise NotImplementedError.new("#{self.class.name}##{__callee__} method is not implemented!")
|
38
|
+
end
|
39
|
+
|
40
|
+
# Abstact method for mapping foreign data with local instance
|
41
|
+
#
|
42
|
+
def instance_mapping
|
43
|
+
raise NotImplementedError.new("#{self.class.name}##{__callee__} method is not implemented!")
|
44
|
+
end
|
45
|
+
|
46
|
+
# Get information from stock-market uri and convert it into Hash
|
47
|
+
#
|
48
|
+
# ==== Parameters
|
49
|
+
#
|
50
|
+
# * +url+ - Stock market URI
|
51
|
+
#
|
52
|
+
# === Returns
|
53
|
+
#
|
54
|
+
# * +Hash+ - Hash of information for given stock-market uri
|
55
|
+
#
|
56
|
+
def gather_info(url)
|
57
|
+
response = open(url, 'User-Agent' => user_agent, read_timeout: 2).read
|
58
|
+
JSON.parse(response)
|
59
|
+
end
|
60
|
+
|
61
|
+
# nodoc
|
62
|
+
def user_agent
|
63
|
+
"TickerPicker Bot v#{TickerPicker::VERSION}"
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
bitstamp:
|
2
|
+
btc_usd:
|
3
|
+
url: 'https://www.bitstamp.net/api/ticker/'
|
4
|
+
currency: 'USD'
|
5
|
+
btce:
|
6
|
+
btc_usd:
|
7
|
+
url: 'https://btc-e.com/api/2/btc_usd/ticker'
|
8
|
+
currency: 'USD'
|
9
|
+
btc_eur:
|
10
|
+
url: 'https://btc-e.com/api/2/btc_eur/ticker'
|
11
|
+
currency: 'EUR'
|
12
|
+
btc_rub:
|
13
|
+
url: 'https://btc-e.com/api/2/btc_rub/ticker'
|
14
|
+
currency: 'RUB'
|
15
|
+
btcturk:
|
16
|
+
btc_try:
|
17
|
+
url: 'https://btcturk.com/api/ticker/'
|
18
|
+
currency: 'TRY'
|
19
|
+
mtgox:
|
20
|
+
btc_usd:
|
21
|
+
url: 'http://data.mtgox.com/api/2/BTCUSD/money/ticker_fast'
|
22
|
+
currency: 'USD'
|
23
|
+
btc_eur:
|
24
|
+
url: 'http://data.mtgox.com/api/2/BTCEUR/money/ticker_fast'
|
25
|
+
currency: 'EUR'
|
26
|
+
|
@@ -0,0 +1,123 @@
|
|
1
|
+
module TickerPicker
|
2
|
+
class Ticker
|
3
|
+
@@factories = {}
|
4
|
+
|
5
|
+
class << self
|
6
|
+
# Get factories hash
|
7
|
+
#
|
8
|
+
# === Returns
|
9
|
+
#
|
10
|
+
# * +factories+ - Hash
|
11
|
+
#
|
12
|
+
def factories
|
13
|
+
@@factories
|
14
|
+
end
|
15
|
+
|
16
|
+
# Register a ticker factory
|
17
|
+
#
|
18
|
+
# ==== Parameters
|
19
|
+
#
|
20
|
+
# * +stock+ - Factory object name
|
21
|
+
# * +file_path+ - Optional load path for stock handler factory for new dev purposes
|
22
|
+
#
|
23
|
+
# === Returns
|
24
|
+
#
|
25
|
+
# * +true+ - Boolean
|
26
|
+
#
|
27
|
+
def register(stock, file_path = nil)
|
28
|
+
require (file_path || "#{File.dirname(__FILE__)}/factory/#{stock}")
|
29
|
+
factories[stock] = eval("TickerPicker::Factory::#{stock.capitalize}.markets")
|
30
|
+
true
|
31
|
+
end
|
32
|
+
|
33
|
+
# Register multiple ticker factories
|
34
|
+
#
|
35
|
+
# ==== Parameters
|
36
|
+
#
|
37
|
+
# * +stocks+ - Factory object name list
|
38
|
+
#
|
39
|
+
# === Returns
|
40
|
+
#
|
41
|
+
# * +true+ - Boolean
|
42
|
+
#
|
43
|
+
def register_list(stocks)
|
44
|
+
stocks.each { |stock| register(stock) }
|
45
|
+
true
|
46
|
+
end
|
47
|
+
|
48
|
+
# Get prices for market in stock
|
49
|
+
#
|
50
|
+
# ==== Parameters
|
51
|
+
#
|
52
|
+
# * +stock+ - String which must be a valid stock name
|
53
|
+
# * +market+ - String which should include valid market name
|
54
|
+
#
|
55
|
+
# === Returns
|
56
|
+
#
|
57
|
+
# * +TickerPicker::Price+ - Extended version of TickerPicker::Price with factory key
|
58
|
+
#
|
59
|
+
def get_prices(stock, market)
|
60
|
+
return stock_market_does_not_exists unless (factories[stock] || {}).has_key?(market)
|
61
|
+
get_price_without_check(stock, market)
|
62
|
+
end
|
63
|
+
|
64
|
+
# Get all market prices in a stock
|
65
|
+
#
|
66
|
+
# ==== Parameters
|
67
|
+
#
|
68
|
+
# * +stock+ - String which must be a valid stock name
|
69
|
+
#
|
70
|
+
# === Returns
|
71
|
+
#
|
72
|
+
# * +Hash+ - Hash of TickerPicker::Price
|
73
|
+
#
|
74
|
+
def get_all_stock_prices(stock)
|
75
|
+
return stock_does_not_exists unless factories.has_key?(stock)
|
76
|
+
get_all_stock_prices_without_check(stock)
|
77
|
+
end
|
78
|
+
|
79
|
+
# Get all market prices in avaliable stocks
|
80
|
+
#
|
81
|
+
# ==== Parameters
|
82
|
+
#
|
83
|
+
# * +stock+ - String which must be a valid stock name
|
84
|
+
#
|
85
|
+
# === Returns
|
86
|
+
#
|
87
|
+
# * +Hash+ - Hash of TickerPicker::Price
|
88
|
+
#
|
89
|
+
def get_all_stock_market_prices
|
90
|
+
stock_market_prices = {}
|
91
|
+
factories.each do |stock_key, _|
|
92
|
+
stock_market_prices.merge!({ stock_key => get_all_stock_prices_without_check(stock_key) })
|
93
|
+
end
|
94
|
+
stock_market_prices
|
95
|
+
end
|
96
|
+
|
97
|
+
private
|
98
|
+
# nodoc
|
99
|
+
def get_price_without_check(stock, market)
|
100
|
+
eval("TickerPicker::Factory::#{stock.capitalize}.get_prices(market)")
|
101
|
+
end
|
102
|
+
|
103
|
+
# nodoc
|
104
|
+
def get_all_stock_prices_without_check(stock)
|
105
|
+
stock_prices = {}
|
106
|
+
factories[stock].each do |key, _|
|
107
|
+
stock_prices[key] = get_price_without_check(stock, key)
|
108
|
+
end
|
109
|
+
stock_prices
|
110
|
+
end
|
111
|
+
|
112
|
+
# nodoc
|
113
|
+
def stock_does_not_exists
|
114
|
+
raise StandardError, 'Stock does not exists!'
|
115
|
+
end
|
116
|
+
|
117
|
+
# nodoc
|
118
|
+
def stock_market_does_not_exists
|
119
|
+
raise StandardError, 'Stock-market does not exists!'
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
data/lib/tickerpicker.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'open-uri'
|
2
|
+
require 'json'
|
3
|
+
require 'hashable'
|
4
|
+
require 'tickerpicker/version'
|
5
|
+
require 'tickerpicker/configuration'
|
6
|
+
require 'tickerpicker/price'
|
7
|
+
require 'tickerpicker/ticker'
|
8
|
+
module TickerPicker
|
9
|
+
def self.config
|
10
|
+
TickerPicker::Configuration.instance
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.configure
|
14
|
+
yield config
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.logger
|
18
|
+
config.logger
|
19
|
+
end
|
20
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
module TickerPicker
|
2
|
+
module Factory
|
3
|
+
class Developer < TickerPicker::Price
|
4
|
+
class << self
|
5
|
+
# Get prices for the market
|
6
|
+
#
|
7
|
+
# === Returns
|
8
|
+
#
|
9
|
+
# * Hash of markets
|
10
|
+
#
|
11
|
+
def markets
|
12
|
+
TickerPicker::Configuration.avaliable_stocks['developer']
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
# nodoc
|
18
|
+
def instance_mapping(res_hash, currency)
|
19
|
+
new({
|
20
|
+
ask: ("%f" % res_hash['ask']).to_f,
|
21
|
+
bid: ("%f" % res_hash['bid']).to_f,
|
22
|
+
currency: currency,
|
23
|
+
last: ("%f" % res_hash['last']).to_f,
|
24
|
+
timestamp: res_hash['timestamp']
|
25
|
+
})
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module TickerPicker
|
2
|
+
module Factory
|
3
|
+
class Tester < TickerPicker::Price
|
4
|
+
class << self
|
5
|
+
|
6
|
+
|
7
|
+
# Get prices for the market
|
8
|
+
#
|
9
|
+
# === Returns
|
10
|
+
#
|
11
|
+
# * Hash of markets
|
12
|
+
#
|
13
|
+
def markets
|
14
|
+
TickerPicker::Configuration.avaliable_stocks['tester']
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
# nodoc
|
20
|
+
def instance_mapping(res_hash, currency)
|
21
|
+
new({
|
22
|
+
ask: ("%f" % res_hash['ask']).to_f,
|
23
|
+
bid: ("%f" % res_hash['bid']).to_f,
|
24
|
+
currency: currency,
|
25
|
+
last: ("%f" % res_hash['last']).to_f,
|
26
|
+
timestamp: res_hash['timestamp']
|
27
|
+
})
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
{"high": "757.99", "last": "744.90", "timestamp": "1388595315", "bid": "742.58", "volume": "8262.66376093", "low": "726.62", "ask": "744.90"}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"high": "757.99", "last": "744.90", "timestamp": "1388595315", "bid": "742.58", "volume": "8262.66376093", "low": "726.62", "ask": "744.94"}
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'test_helper'))
|
2
|
+
|
3
|
+
|
4
|
+
class TickerTest < Test::Unit::TestCase
|
5
|
+
def setup
|
6
|
+
TickerPicker.configure do |config|
|
7
|
+
config.stock_configuration_file = "#{File.dirname(__FILE__)}/stocks.yml"
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_register
|
12
|
+
register_developer
|
13
|
+
assert_equal(
|
14
|
+
true,
|
15
|
+
TickerPicker::Ticker.factories.has_key?('developer')
|
16
|
+
)
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_register_list
|
20
|
+
assert_equal(
|
21
|
+
true,
|
22
|
+
true
|
23
|
+
)
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_get_prices
|
27
|
+
register_developer
|
28
|
+
prices = TickerPicker::Ticker.get_prices('developer', 'btc_xxx')
|
29
|
+
assert_equal(
|
30
|
+
744.90,
|
31
|
+
prices.ask
|
32
|
+
)
|
33
|
+
assert_equal(
|
34
|
+
1388595315.0,
|
35
|
+
prices.timestamp
|
36
|
+
)
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_get_all_stock_prices
|
40
|
+
register_all
|
41
|
+
stock_prices = TickerPicker::Ticker.get_all_stock_prices('developer')
|
42
|
+
assert_equal(
|
43
|
+
744.90,
|
44
|
+
stock_prices['btc_xxx'].ask
|
45
|
+
)
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_get_all_stock_market_prices
|
49
|
+
register_all
|
50
|
+
stock_market_prices = TickerPicker::Ticker.get_all_stock_market_prices
|
51
|
+
assert_equal(
|
52
|
+
742.58,
|
53
|
+
stock_market_prices['developer']['btc_xxx'].bid
|
54
|
+
)
|
55
|
+
assert_equal(
|
56
|
+
744.94,
|
57
|
+
stock_market_prices['tester']['btc_xyz'].ask
|
58
|
+
)
|
59
|
+
end
|
60
|
+
|
61
|
+
private
|
62
|
+
def register_developer
|
63
|
+
TickerPicker::Ticker.register('developer', File.expand_path(File.join(File.dirname(__FILE__), 'factory', 'developer')))
|
64
|
+
TickerPicker::Ticker.factories['developer']['btc_xxx']['url'] = "#{File.dirname(__FILE__)}/json/developer.json"
|
65
|
+
end
|
66
|
+
|
67
|
+
def register_tester
|
68
|
+
TickerPicker::Ticker.register('tester', File.expand_path(File.join(File.dirname(__FILE__), 'factory', 'tester')))
|
69
|
+
TickerPicker::Ticker.factories['tester']['btc_xyz']['url'] = "#{File.dirname(__FILE__)}/json/tester.json"
|
70
|
+
end
|
71
|
+
|
72
|
+
def register_all
|
73
|
+
register_developer
|
74
|
+
register_tester
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'tickerpicker/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "tickerpicker"
|
8
|
+
spec.version = TickerPicker::VERSION
|
9
|
+
spec.authors = ["Mustafa Turan"]
|
10
|
+
spec.email = ["mustafaturan.net@gmail.com"]
|
11
|
+
spec.description = %q{Ticker Picker for cryto currencies like BTC, LTC in world stocks}
|
12
|
+
spec.summary = %q{Ticker Picker for cryto currencies like BTC, LTC}
|
13
|
+
spec.homepage = "https://github.com/mustafaturan/tickerpicker"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
22
|
+
spec.add_development_dependency "rake"
|
23
|
+
spec.add_dependency "hashable", "~> 0.1.2"
|
24
|
+
end
|
metadata
ADDED
@@ -0,0 +1,116 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: tickerpicker
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Mustafa Turan
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-01-01 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ~>
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.3'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.3'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: hashable
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ~>
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.1.2
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.1.2
|
55
|
+
description: Ticker Picker for cryto currencies like BTC, LTC in world stocks
|
56
|
+
email:
|
57
|
+
- mustafaturan.net@gmail.com
|
58
|
+
executables: []
|
59
|
+
extensions: []
|
60
|
+
extra_rdoc_files: []
|
61
|
+
files:
|
62
|
+
- .gitignore
|
63
|
+
- Gemfile
|
64
|
+
- LICENSE.txt
|
65
|
+
- README.md
|
66
|
+
- Rakefile
|
67
|
+
- lib/tickerpicker.rb
|
68
|
+
- lib/tickerpicker/configuration.rb
|
69
|
+
- lib/tickerpicker/factory/bitstamp.rb
|
70
|
+
- lib/tickerpicker/factory/btce.rb
|
71
|
+
- lib/tickerpicker/factory/btcturk.rb
|
72
|
+
- lib/tickerpicker/factory/mtgox.rb
|
73
|
+
- lib/tickerpicker/price.rb
|
74
|
+
- lib/tickerpicker/stocks.yml
|
75
|
+
- lib/tickerpicker/ticker.rb
|
76
|
+
- lib/tickerpicker/version.rb
|
77
|
+
- test/test_helper.rb
|
78
|
+
- test/unit/factory/developer.rb
|
79
|
+
- test/unit/factory/tester.rb
|
80
|
+
- test/unit/json/developer.json
|
81
|
+
- test/unit/json/tester.json
|
82
|
+
- test/unit/stocks.yml
|
83
|
+
- test/unit/ticker_test.rb
|
84
|
+
- tickerpicker.gemspec
|
85
|
+
homepage: https://github.com/mustafaturan/tickerpicker
|
86
|
+
licenses:
|
87
|
+
- MIT
|
88
|
+
metadata: {}
|
89
|
+
post_install_message:
|
90
|
+
rdoc_options: []
|
91
|
+
require_paths:
|
92
|
+
- lib
|
93
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - '>='
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: '0'
|
98
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - '>='
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '0'
|
103
|
+
requirements: []
|
104
|
+
rubyforge_project:
|
105
|
+
rubygems_version: 2.0.3
|
106
|
+
signing_key:
|
107
|
+
specification_version: 4
|
108
|
+
summary: Ticker Picker for cryto currencies like BTC, LTC
|
109
|
+
test_files:
|
110
|
+
- test/test_helper.rb
|
111
|
+
- test/unit/factory/developer.rb
|
112
|
+
- test/unit/factory/tester.rb
|
113
|
+
- test/unit/json/developer.json
|
114
|
+
- test/unit/json/tester.json
|
115
|
+
- test/unit/stocks.yml
|
116
|
+
- test/unit/ticker_test.rb
|