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 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