cryptomkt-ruby 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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: '0696ba712fb05a61686d78f3224b23257dc13f515f8cbeaeee7585a12411afa8'
4
+ data.tar.gz: 30c3636447476587de0a35f82018784e7e3bf1403276801f972ce14b5b12bba9
5
+ SHA512:
6
+ metadata.gz: 98d37672d52490fc096200a8cf50ec68a94a0e2cbb73cd54aef0fe0591f9704739ea17fce385730b09a8b6856dc74b61a008b8222873feadc97da867b341ff96
7
+ data.tar.gz: c99d699a396d0bdc8e9c5341f147fdf13e007b0759c94e05a847389b9f8b6ce98cc04f936311d0c49aebb9defb69d1d1a5171db27a5cd6e1950c3ff9e17a16ea
@@ -0,0 +1,11 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+
10
+ # rspec failure tracking
11
+ .rspec_status
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
@@ -0,0 +1,5 @@
1
+ sudo: false
2
+ language: ruby
3
+ rvm:
4
+ - 2.5.1
5
+ before_install: gem install bundler -v 1.16.2
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source "https://rubygems.org"
2
+
3
+ git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
4
+
5
+ # Specify your gem's dependencies in cryptomkt-ruby.gemspec
6
+ gemspec
@@ -0,0 +1,41 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ cryptomkt-ruby (0.1.0)
5
+ faraday
6
+ json
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ diff-lcs (1.3)
12
+ faraday (0.15.2)
13
+ multipart-post (>= 1.2, < 3)
14
+ json (2.1.0)
15
+ multipart-post (2.0.0)
16
+ rake (10.5.0)
17
+ rspec (3.7.0)
18
+ rspec-core (~> 3.7.0)
19
+ rspec-expectations (~> 3.7.0)
20
+ rspec-mocks (~> 3.7.0)
21
+ rspec-core (3.7.1)
22
+ rspec-support (~> 3.7.0)
23
+ rspec-expectations (3.7.0)
24
+ diff-lcs (>= 1.2.0, < 2.0)
25
+ rspec-support (~> 3.7.0)
26
+ rspec-mocks (3.7.0)
27
+ diff-lcs (>= 1.2.0, < 2.0)
28
+ rspec-support (~> 3.7.0)
29
+ rspec-support (3.7.1)
30
+
31
+ PLATFORMS
32
+ ruby
33
+
34
+ DEPENDENCIES
35
+ bundler (~> 1.16)
36
+ cryptomkt-ruby!
37
+ rake (~> 10.0)
38
+ rspec (~> 3.0)
39
+
40
+ BUNDLED WITH
41
+ 1.16.2
@@ -0,0 +1,37 @@
1
+ # Cryptomkt Ruby wrapper
2
+
3
+ Wrapper for Cryptomkt API, check documentation at [https://developers.cryptomkt.com/es](https://developers.cryptomkt.com/es/?shell#obtener-balance) and get credentials in [www.cryptomkt.com](https://www.cryptomkt.com/account#api_tab)
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'cryptomkt-ruby'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install cryptomkt-ruby
20
+
21
+ ## Usage
22
+
23
+ client = CryptomktRuby::Client.new(key, secret)
24
+
25
+ ## Development
26
+
27
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
28
+
29
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
30
+
31
+ ## Contributing
32
+
33
+ Bug reports and pull requests are welcome on GitHub at https://github.com/ronzalo/cryptomkt-ruby.
34
+
35
+ ## TODO
36
+
37
+ Implement CryptoCompra
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "cryptomkt_ruby"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,31 @@
1
+
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "cryptomkt_ruby/version"
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "cryptomkt-ruby"
8
+ spec.version = CryptomktRuby::VERSION
9
+ spec.authors = ["Gonzalo Moreno"]
10
+ spec.email = ["goncab380@hotmail.com"]
11
+ spec.license = "MIT"
12
+ spec.summary = "Ruby SDK for Cryptomkt"
13
+ spec.description = "Wrapper for Cryptomkt API"
14
+ spec.homepage = "https://github.com/ronzalo/cryptomkt-ruby"
15
+
16
+ # Specify which files should be added to the gem when it is released.
17
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
18
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
19
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
20
+ end
21
+ spec.bindir = "exe"
22
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
23
+ spec.require_paths = ["lib"]
24
+
25
+ spec.add_development_dependency "bundler", "~> 1.16"
26
+ spec.add_development_dependency "rake", "~> 10.0"
27
+ spec.add_development_dependency "rspec", "~> 3.0"
28
+
29
+ spec.add_dependency "faraday"
30
+ spec.add_dependency "json"
31
+ end
@@ -0,0 +1,5 @@
1
+ require_relative 'cryptomkt_ruby/version'
2
+ require_relative 'cryptomkt_ruby/client'
3
+
4
+ module CryptomktRuby
5
+ end
@@ -0,0 +1,236 @@
1
+ require 'faraday'
2
+ require 'openssl'
3
+ require 'json'
4
+ require_relative 'error_handler'
5
+
6
+ API_URL = 'https://api.cryptomkt.com'.freeze
7
+
8
+ module CryptomktRuby
9
+ class Client
10
+ def initialize(key, secret, options = {})
11
+ @key = key
12
+ @secret = secret
13
+ @logger = options.delete(:logger)
14
+ end
15
+
16
+ # Retorna lista de órdenes activas en CryptoMarket.
17
+ # @param [String] market
18
+ # @param [String] type
19
+ # @param [String] page
20
+ # @param [String] limit
21
+ # @return [Hash]
22
+ def book(market:, type:, page: 1, limit: 20)
23
+ path = '/v1/book'
24
+
25
+ params = {
26
+ market: market,
27
+ type: type,
28
+ page: page,
29
+ limit: limit
30
+ }
31
+
32
+ public_get(path, params)
33
+ end
34
+
35
+ # Corresponden a las transacciones realizadas en CryptoMarket.
36
+ # @param [String] market
37
+ # @param [String] start_at
38
+ # @param [String] end_at
39
+ # @param [String] page
40
+ # @param [String] limit
41
+ # @return [Hash]
42
+ def trades(market:, start_at: Time.now, end_at: Time.now, page: 1, limit: 20)
43
+ path = '/v1/trades'
44
+
45
+ params = {
46
+ market: market,
47
+ start: start_at.strftime('%Y-%m-%d'),
48
+ end: end_at.strftime('%Y-%m-%d'),
49
+ page: page,
50
+ limit: limit
51
+ }
52
+
53
+ public_get(path, params)
54
+ end
55
+
56
+ # El mercado corresponde a los pares de mercados disponibles en CryptoMarket.
57
+ # @return [Array]
58
+ def market
59
+ path = '/v1/market'
60
+
61
+ public_get(path, {})
62
+ end
63
+
64
+ # Retorna una lista de objetos ticker de mercados activos. Si está presente parámetro market solo se retorna ticker de mercado especificado.
65
+ # @param [String] market
66
+ # @return [Array]
67
+ def ticker(market: nil)
68
+ path = '/v1/ticker'
69
+
70
+ public_get(path, market: market)
71
+ end
72
+
73
+ # Retorna lista de órdenes activas en CryptoMarket pertenecientes al usuario propietario de las credenciales.
74
+ # @param [String] market
75
+ # @param [String] page
76
+ # @param [String] limit
77
+ # @return [Hash]
78
+ def active_orders(market:, page: 0, limit: 20)
79
+ path = '/v1/orders/active'
80
+
81
+ params = {
82
+ market: market,
83
+ page: page,
84
+ limit: limit
85
+ }
86
+
87
+ private_get(path, params)
88
+ end
89
+
90
+ # Retorna lista de órdenes ejecutadas en CryptoMarket pertenecientes al usuario propietario de las credenciales.
91
+ # @param [String] market
92
+ # @param [String] page
93
+ # @param [String] limit
94
+ # @return [Hash]
95
+ def executed_orders(market:, page: 0, limit: 20)
96
+ path = '/v1/orders/executed'
97
+
98
+ params = {
99
+ market: market,
100
+ page: page,
101
+ limit: limit
102
+ }
103
+
104
+ private_get(path, params)
105
+ end
106
+
107
+ # Permite cancelar una orden
108
+ # @param [String] id
109
+ # @return [Hash]
110
+ def cancel_order(id)
111
+ path = '/v1/orders/cancel'
112
+
113
+ private_post(path, id: id)
114
+ end
115
+
116
+ # Retorna el estado de una orden
117
+ # @param [String] id
118
+ # @return [Hash]
119
+ def status_order(id)
120
+ path = '/v1/orders/status'
121
+
122
+ private_get(path, id: id)
123
+ end
124
+
125
+ # Permite obtener en base al estado actual del mercado, la cantidad de criptomonedas o moneda local a recibir si se ejecuta una compra o venta respectivamente.
126
+ # @param [String] market
127
+ # @param [String] type
128
+ # @param [String] amount
129
+ # @return [Hash]
130
+ def instant_order(market:, type:, amount:)
131
+ path = '/v1/orders/instant/get'
132
+
133
+ params = {
134
+ market: market,
135
+ type: type,
136
+ amount: amount
137
+ }
138
+
139
+ private_get(path, params)
140
+ end
141
+
142
+ # Permite crear una orden de compra o venta dentro de CryptoMarket
143
+ # @param [String] market
144
+ # @param [String] type
145
+ # @param [String] amount
146
+ # @param [String] price
147
+ # @return [Hash]
148
+ def create_market_order(market:, type:, amount:, price:)
149
+ path = '/v1/orders/create'
150
+
151
+ params = {
152
+ market: market,
153
+ type: type,
154
+ amount: amount,
155
+ price: price
156
+ }
157
+
158
+ private_post(path, params)
159
+ end
160
+
161
+ # Permite crear una orden instantánea en el Instant Exchange de CryptoMarket
162
+ # @param [String] market
163
+ # @param [String] type
164
+ # @param [String] amount
165
+ # @return [Hash]
166
+ def create_instant_order(market:, type:, amount:)
167
+ path = '/v1/orders/instant/create'
168
+
169
+ params = {
170
+ market: market,
171
+ type: type,
172
+ amount: amount
173
+ }
174
+
175
+ private_post(path, params)
176
+ end
177
+
178
+ # Permite obtener el balance actual de tus billeteras en CryptoMarket
179
+ # @return [Array]
180
+ def balance
181
+ path = '/v1/balance'
182
+
183
+ private_get(path)
184
+ end
185
+
186
+ private
187
+
188
+ def conn
189
+ @conn ||= Faraday.new(url: API_URL) do |faraday|
190
+ faraday.use ErrorHandler
191
+ faraday.response :logger if @logger
192
+ faraday.adapter Faraday.default_adapter # make requests with Net::HTTP
193
+ end
194
+ end
195
+
196
+ def parsed_response(response)
197
+ json = JSON.parse(response.body)
198
+ json['data']
199
+ end
200
+
201
+ def public_get(path, params)
202
+ response = conn.get path, params
203
+
204
+ parsed_response(response)
205
+ end
206
+
207
+ def private_get(path, params = {})
208
+ timestamp = Time.now.to_i.to_s
209
+ response = conn.get path, params do |req|
210
+ req.headers['X-MKT-APIKEY'] = @key
211
+ req.headers['X-MKT-SIGNATURE'] = signature(timestamp, path)
212
+ req.headers['X-MKT-TIMESTAMP'] = timestamp
213
+ end
214
+
215
+ parsed_response(response)
216
+ end
217
+
218
+ def private_post(path, params = {})
219
+ timestamp = Time.now.to_i.to_s
220
+ response = conn.post path, URI.encode_www_form(params) do |req|
221
+ req.headers['X-MKT-APIKEY'] = @key
222
+ req.headers['X-MKT-SIGNATURE'] = signature(timestamp, path, params)
223
+ req.headers['X-MKT-TIMESTAMP'] = timestamp
224
+ end
225
+
226
+ parsed_response(response)
227
+ end
228
+
229
+ def signature(timestamp, path, body = '')
230
+ body = body.sort.to_h.values.reduce(:+) if body.is_a? Hash
231
+
232
+ message = [timestamp, path, body].inject(:+)
233
+ OpenSSL::HMAC.hexdigest('SHA384', @secret, message)
234
+ end
235
+ end
236
+ end
@@ -0,0 +1,27 @@
1
+ require 'faraday'
2
+
3
+ class ErrorHandler < Faraday::Response::Middleware
4
+ CLIENT_ERROR_STATUSES = 400...600
5
+
6
+ def on_complete(env)
7
+ case env[:status]
8
+ when 404
9
+ raise Faraday::Error::ResourceNotFound, response_values(env)
10
+ when 407
11
+ # mimic the behavior that we get with proxy requests with HTTPS
12
+ raise Faraday::Error::ConnectionFailed, %(407 "Proxy Authentication Required ")
13
+ when CLIENT_ERROR_STATUSES
14
+ raise GenericError, response_values(env)
15
+ end
16
+ end
17
+
18
+ def response_values(env)
19
+ { status: env.status, headers: env.response_headers, body: env.body }
20
+ end
21
+ end
22
+
23
+ class GenericError < Faraday::Error::ClientError
24
+ def initialize(exception = nil)
25
+ super("the server responded with status #{exception[:status]}: #{exception[:body]}")
26
+ end
27
+ end
@@ -0,0 +1,3 @@
1
+ module CryptomktRuby
2
+ VERSION = '0.1.0'.freeze
3
+ end
metadata ADDED
@@ -0,0 +1,128 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cryptomkt-ruby
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Gonzalo Moreno
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2018-07-22 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.16'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.16'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.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: '3.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: faraday
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: json
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
+ description: Wrapper for Cryptomkt API
84
+ email:
85
+ - goncab380@hotmail.com
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - ".gitignore"
91
+ - ".rspec"
92
+ - ".travis.yml"
93
+ - Gemfile
94
+ - Gemfile.lock
95
+ - README.md
96
+ - Rakefile
97
+ - bin/console
98
+ - bin/setup
99
+ - cryptomkt-ruby.gemspec
100
+ - lib/cryptomkt_ruby.rb
101
+ - lib/cryptomkt_ruby/client.rb
102
+ - lib/cryptomkt_ruby/error_handler.rb
103
+ - lib/cryptomkt_ruby/version.rb
104
+ homepage: https://github.com/ronzalo/cryptomkt-ruby
105
+ licenses:
106
+ - MIT
107
+ metadata: {}
108
+ post_install_message:
109
+ rdoc_options: []
110
+ require_paths:
111
+ - lib
112
+ required_ruby_version: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ required_rubygems_version: !ruby/object:Gem::Requirement
118
+ requirements:
119
+ - - ">="
120
+ - !ruby/object:Gem::Version
121
+ version: '0'
122
+ requirements: []
123
+ rubyforge_project:
124
+ rubygems_version: 2.7.6
125
+ signing_key:
126
+ specification_version: 4
127
+ summary: Ruby SDK for Cryptomkt
128
+ test_files: []