kraken_ruby 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ba98315341ba3773c618f03b63eefc55b9a7b255
4
- data.tar.gz: 2b6626102a0ca88bcb48cd0fdc2d1e0e4f873fcc
3
+ metadata.gz: 0ffb806d88019bc391138ea85eb78acf492209f6
4
+ data.tar.gz: 0025cc093da95c4bc0feffdc9a01417db570fab5
5
5
  SHA512:
6
- metadata.gz: 69b20b69a1342f2be7e5145a71eca590f7ae450c347e7da78301f5ae033bf5fb61422b1ed1e6ffe6db71a3000f3f98c97065c2270b2826c838d0150b0a3d5e7b
7
- data.tar.gz: cbd54f67a9585601122bce841e20a97e13ccec70159f3912a6b1d6d47f0bb040d2d92b2c3ca0f9cbf50d16ba3c08431fcdfd0aacc91781636cb5b911794e24fc
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
@@ -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
- ###### Private Data: ##########
61
- ### Coming in Next Release ####
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
@@ -1,3 +1,3 @@
1
1
  module KrakenRuby
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -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.1.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-22 00:00:00.000000000 Z
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