kraken_ruby 0.1.0 → 0.2.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 +4 -4
- data/Gemfile.lock +35 -0
- data/kraken_ruby-0.1.0.gem +0 -0
- data/kraken_ruby-0.2.0.gem +0 -0
- data/kraken_ruby.gemspec +3 -0
- data/lib/kraken_ruby/client.rb +114 -7
- data/lib/kraken_ruby/version.rb +1 -1
- data/spec/client_spec.rb +61 -0
- metadata +50 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0ffb806d88019bc391138ea85eb78acf492209f6
|
4
|
+
data.tar.gz: 0025cc093da95c4bc0feffdc9a01417db570fab5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ddeaf904124a47f3c3b8d01ef4563e2af9f7b338d5f9358b7e669006a83027b9206c2686b9a0fd441983e8d43a6cb2b83925416d0ac8a0b641437163880a395a
|
7
|
+
data.tar.gz: 363d2daa1af9fe2ff36ce681fffd7a9ad670b364392352c31bd441b54cfe73449e9000764968fd10f4844ee151ccfe15f3bc7075af828dd97e645b16b1e9fcb6
|
data/Gemfile.lock
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
kraken_ruby (0.2.0)
|
5
|
+
hashie
|
6
|
+
httparty
|
7
|
+
|
8
|
+
GEM
|
9
|
+
remote: https://rubygems.org/
|
10
|
+
specs:
|
11
|
+
diff-lcs (1.2.5)
|
12
|
+
hashie (2.0.5)
|
13
|
+
httparty (0.12.0)
|
14
|
+
json (~> 1.8)
|
15
|
+
multi_xml (>= 0.5.2)
|
16
|
+
json (1.8.1)
|
17
|
+
multi_xml (0.5.5)
|
18
|
+
rake (10.1.1)
|
19
|
+
rspec (2.14.1)
|
20
|
+
rspec-core (~> 2.14.0)
|
21
|
+
rspec-expectations (~> 2.14.0)
|
22
|
+
rspec-mocks (~> 2.14.0)
|
23
|
+
rspec-core (2.14.7)
|
24
|
+
rspec-expectations (2.14.5)
|
25
|
+
diff-lcs (>= 1.1.3, < 2.0)
|
26
|
+
rspec-mocks (2.14.6)
|
27
|
+
|
28
|
+
PLATFORMS
|
29
|
+
ruby
|
30
|
+
|
31
|
+
DEPENDENCIES
|
32
|
+
bundler (~> 1.3)
|
33
|
+
kraken_ruby!
|
34
|
+
rake
|
35
|
+
rspec
|
Binary file
|
Binary file
|
data/kraken_ruby.gemspec
CHANGED
@@ -20,6 +20,9 @@ Gem::Specification.new do |spec|
|
|
20
20
|
|
21
21
|
spec.add_development_dependency "bundler", "~> 1.3"
|
22
22
|
spec.add_development_dependency "rake"
|
23
|
+
spec.add_development_dependency "rspec"
|
23
24
|
|
24
25
|
spec.add_dependency "httparty"
|
26
|
+
spec.add_dependency "hashie"
|
27
|
+
spec.add_dependency "addressable"
|
25
28
|
end
|
data/lib/kraken_ruby/client.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
|
-
require 'kraken_ruby/version'
|
2
1
|
require 'httparty'
|
3
2
|
require 'hashie'
|
3
|
+
require 'Base64'
|
4
|
+
require 'addressable/uri'
|
5
|
+
|
4
6
|
|
5
7
|
module Kraken
|
6
8
|
class Client
|
@@ -10,7 +12,7 @@ module Kraken
|
|
10
12
|
@api_key = api_key
|
11
13
|
@api_secret = api_secret
|
12
14
|
@api_version = options[:version] ||= '0'
|
13
|
-
@base_uri = options[:base_uri] ||= 'https://api.kraken.com
|
15
|
+
@base_uri = options[:base_uri] ||= 'https://api.kraken.com'
|
14
16
|
end
|
15
17
|
|
16
18
|
###########################
|
@@ -50,16 +52,121 @@ module Kraken
|
|
50
52
|
end
|
51
53
|
|
52
54
|
def get_public(method, opts={})
|
53
|
-
url = @base_uri + @api_version + '/public/' + method
|
55
|
+
url = @base_uri + '/' + @api_version + '/public/' + method
|
54
56
|
r = self.class.get(url, query: opts)
|
55
57
|
hash = Hashie::Mash.new(JSON.parse(r.body))
|
56
58
|
hash[:result]
|
57
59
|
end
|
58
60
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
61
|
+
######################
|
62
|
+
##### Private Data ###
|
63
|
+
######################
|
64
|
+
|
65
|
+
def balance(opts={})
|
66
|
+
post_private 'Balance', opts
|
67
|
+
end
|
68
|
+
|
69
|
+
def trade_balance(opts={})
|
70
|
+
post_private 'TradeBalance', opts
|
71
|
+
end
|
72
|
+
|
73
|
+
def open_orders(opts={})
|
74
|
+
post_private 'OpenOrders', opts
|
75
|
+
end
|
76
|
+
|
77
|
+
def query_orders(opts={})
|
78
|
+
post_private 'QueryOrders', opts
|
79
|
+
end
|
80
|
+
|
81
|
+
def trade_history(opts={})
|
82
|
+
post_private 'TradesHistory', opts
|
83
|
+
end
|
84
|
+
|
85
|
+
def query_trades(tx_ids, opts={})
|
86
|
+
opts['txid'] = tx_ids
|
87
|
+
post_private 'QueryTrades', opts
|
88
|
+
end
|
89
|
+
|
90
|
+
def open_positions(tx_ids, opts={})
|
91
|
+
opts['txid'] = tx_ids
|
92
|
+
post_private 'OpenPositions', opts
|
93
|
+
end
|
94
|
+
|
95
|
+
def ledgers_info(opts={})
|
96
|
+
post_private 'Ledgers', opts
|
97
|
+
end
|
98
|
+
|
99
|
+
def query_ledgers(ledger_ids, opts={})
|
100
|
+
opts['id'] = ledger_ids
|
101
|
+
post_private 'QueryLedgers', opts
|
102
|
+
end
|
103
|
+
|
104
|
+
def trade_volume(asset_pairs)
|
105
|
+
opts['pair'] = asset_pairs
|
106
|
+
post_private 'TradeVolume', opts
|
107
|
+
end
|
108
|
+
|
109
|
+
#### Private User Trading (Still experimental!) ####
|
110
|
+
|
111
|
+
def add_order(opts={})
|
112
|
+
required_opts = %w{pair, type, ordertype, volume}
|
113
|
+
opts.keys.each do |key|
|
114
|
+
unless required_opts.include?(1)
|
115
|
+
raise "Required options, not given. Input must include #{required_opts}"
|
116
|
+
end
|
117
|
+
end
|
118
|
+
post_private 'AddOrder', opts
|
119
|
+
end
|
120
|
+
|
121
|
+
#######################
|
122
|
+
#### Generate Signed ##
|
123
|
+
##### Post Request ####
|
124
|
+
#######################
|
125
|
+
|
126
|
+
private
|
127
|
+
|
128
|
+
def post_private(method, opts={})
|
129
|
+
opts['nonce'] = nonce
|
130
|
+
post_data = encode_options(opts)
|
131
|
+
|
132
|
+
headers = {
|
133
|
+
'API-Key' => @api_key,
|
134
|
+
'API-Sign' => generate_signature(method, post_data, opts)
|
135
|
+
}
|
136
|
+
|
137
|
+
url = @base_uri + url_path(method)
|
138
|
+
r = self.class.post(url, { headers: headers, body: post_data }).parsed_response
|
139
|
+
r['error'].empty? ? r['result'] : r['error']
|
140
|
+
end
|
141
|
+
|
142
|
+
def nonce
|
143
|
+
Time.now.to_i.to_s.ljust(16,'0')
|
144
|
+
end
|
145
|
+
|
146
|
+
def encode_options(opts)
|
147
|
+
uri = Addressable::URI.new
|
148
|
+
uri.query_values = opts
|
149
|
+
uri.query
|
150
|
+
end
|
151
|
+
|
152
|
+
def generate_signature(method, post_data, opts={})
|
153
|
+
key = Base64.decode64(@api_secret)
|
154
|
+
message = generate_message(method, opts, post_data)
|
155
|
+
generate_hmac(key, message)
|
156
|
+
end
|
157
|
+
|
158
|
+
def generate_message(method, opts, data)
|
159
|
+
digest = OpenSSL::Digest.new('sha256', opts['nonce'] + data).digest
|
160
|
+
url_path(method) + digest
|
161
|
+
end
|
162
|
+
|
163
|
+
def generate_hmac(key, message)
|
164
|
+
Base64.encode64(OpenSSL::HMAC.digest('sha512', key, message)).split.join # to remove '/n' inserted into signature by HMAc
|
165
|
+
end
|
166
|
+
|
167
|
+
def url_path(method)
|
168
|
+
'/' + @api_version + '/private/' + method
|
169
|
+
end
|
63
170
|
|
64
171
|
end
|
65
172
|
end
|
data/lib/kraken_ruby/version.rb
CHANGED
data/spec/client_spec.rb
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'kraken_ruby'
|
2
|
+
|
3
|
+
describe Kraken::Client do
|
4
|
+
|
5
|
+
# YOU MUST REPLACE THE PLACEHOLDERS BELOW WITH YOUR API KEYS
|
6
|
+
# TO TEST PRIVATE DATA QUERIES. PRIVATE TESTS WILL FAIL OTHERWISE
|
7
|
+
|
8
|
+
API_KEY = 'ADD YOUR KEY HERE'
|
9
|
+
API_SECRET = 'ADD YOUR SECRET HERE'
|
10
|
+
|
11
|
+
before :each do
|
12
|
+
sleep 0.3 # to prevent rapidly pinging the Kraken server
|
13
|
+
end
|
14
|
+
|
15
|
+
let(:kraken){Kraken::Client.new(API_KEY, API_SECRET)}
|
16
|
+
|
17
|
+
context "public data" do
|
18
|
+
it "gets the proper server time" do
|
19
|
+
kraken_time = DateTime.parse(kraken.server_time.rfc1123)
|
20
|
+
utc_time = Time.now.getutc
|
21
|
+
expect(kraken_time.day).to eq utc_time.day
|
22
|
+
expect(kraken_time.hour).to eq utc_time.hour
|
23
|
+
end
|
24
|
+
|
25
|
+
it "gets list of tradeable assets" do
|
26
|
+
expect(kraken.assets).to respond_to :XLTC
|
27
|
+
end
|
28
|
+
|
29
|
+
it "gets list of asset pairs" do
|
30
|
+
expect(kraken.asset_pairs).to respond_to :XLTCXXDG
|
31
|
+
end
|
32
|
+
|
33
|
+
it "gets public ticker data for given asset pairs" do
|
34
|
+
result = kraken.ticker('XLTCXXDG, ZEURXXDG')
|
35
|
+
expect(result).to respond_to :XLTCXXDG
|
36
|
+
expect(result).to respond_to :ZEURXXDG
|
37
|
+
end
|
38
|
+
|
39
|
+
it "gets order book data for a given asset pair" do
|
40
|
+
order_book = kraken.order_book('XLTCXXDG')
|
41
|
+
expect(order_book.XLTCXXDG).to respond_to :asks
|
42
|
+
end
|
43
|
+
|
44
|
+
it "gets an array of trades data for a given asset pair" do
|
45
|
+
trades = kraken.trades('XLTCXXDG')
|
46
|
+
expect(trades.XLTCXXDG).to be_instance_of(Array)
|
47
|
+
end
|
48
|
+
|
49
|
+
it "gets an array of spread data for a given asset pair" do
|
50
|
+
spread = kraken.spread('XLTCXXDG')
|
51
|
+
expect(spread.XLTCXXDG).to be_instance_of(Array)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
context "private data" do # More tests to come
|
56
|
+
it "gets the user's balance" do
|
57
|
+
expect(kraken.balance).to be_instance_of(Hash)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kraken_ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alexander Leishman
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-02-
|
11
|
+
date: 2014-02-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - '>='
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: httparty
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -52,6 +66,34 @@ dependencies:
|
|
52
66
|
- - '>='
|
53
67
|
- !ruby/object:Gem::Version
|
54
68
|
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: hashie
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: addressable
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - '>='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - '>='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
55
97
|
description: '"Wrapper for Kraken Exchange API"'
|
56
98
|
email:
|
57
99
|
- leishman3@gmail.com
|
@@ -61,13 +103,17 @@ extra_rdoc_files: []
|
|
61
103
|
files:
|
62
104
|
- .gitignore
|
63
105
|
- Gemfile
|
106
|
+
- Gemfile.lock
|
64
107
|
- LICENSE.txt
|
65
108
|
- README.md
|
66
109
|
- Rakefile
|
110
|
+
- kraken_ruby-0.1.0.gem
|
111
|
+
- kraken_ruby-0.2.0.gem
|
67
112
|
- kraken_ruby.gemspec
|
68
113
|
- lib/kraken_ruby.rb
|
69
114
|
- lib/kraken_ruby/client.rb
|
70
115
|
- lib/kraken_ruby/version.rb
|
116
|
+
- spec/client_spec.rb
|
71
117
|
homepage: https://www.kraken.com/help/api
|
72
118
|
licenses:
|
73
119
|
- MIT
|
@@ -92,4 +138,5 @@ rubygems_version: 2.1.11
|
|
92
138
|
signing_key:
|
93
139
|
specification_version: 4
|
94
140
|
summary: '"Wrapper for Kraken Exchange API"'
|
95
|
-
test_files:
|
141
|
+
test_files:
|
142
|
+
- spec/client_spec.rb
|