honeymaker 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.
Files changed (73) hide show
  1. checksums.yaml +4 -4
  2. data/honeymaker-0.1.0.gem +0 -0
  3. data/lib/honeymaker/client.rb +74 -0
  4. data/lib/honeymaker/clients/binance.rb +240 -0
  5. data/lib/honeymaker/clients/binance_us.rb +9 -0
  6. data/lib/honeymaker/clients/bingx.rb +105 -0
  7. data/lib/honeymaker/clients/bitget.rb +128 -0
  8. data/lib/honeymaker/clients/bitmart.rb +117 -0
  9. data/lib/honeymaker/clients/bitrue.rb +114 -0
  10. data/lib/honeymaker/clients/bitvavo.rb +136 -0
  11. data/lib/honeymaker/clients/bybit.rb +136 -0
  12. data/lib/honeymaker/clients/coinbase.rb +184 -0
  13. data/lib/honeymaker/clients/gemini.rb +81 -0
  14. data/lib/honeymaker/clients/hyperliquid.rb +42 -0
  15. data/lib/honeymaker/clients/kraken.rb +132 -0
  16. data/lib/honeymaker/clients/kucoin.rb +147 -0
  17. data/lib/honeymaker/clients/mexc.rb +136 -0
  18. data/lib/honeymaker/exchanges/binance.rb +11 -17
  19. data/lib/honeymaker/exchanges/bitget.rb +2 -2
  20. data/lib/honeymaker/exchanges/bitrue.rb +6 -16
  21. data/lib/honeymaker/exchanges/bitvavo.rb +2 -2
  22. data/lib/honeymaker/exchanges/bybit.rb +2 -2
  23. data/lib/honeymaker/exchanges/coinbase.rb +5 -9
  24. data/lib/honeymaker/exchanges/gemini.rb +4 -6
  25. data/lib/honeymaker/exchanges/kraken.rb +5 -9
  26. data/lib/honeymaker/exchanges/kucoin.rb +2 -2
  27. data/lib/honeymaker/exchanges/mexc.rb +11 -17
  28. data/lib/honeymaker/utils.rb +9 -0
  29. data/lib/honeymaker/version.rb +1 -1
  30. data/lib/honeymaker.rb +38 -0
  31. data/test/fixtures/bingx_symbols.json +26 -0
  32. data/test/fixtures/bitget_symbols.json +28 -0
  33. data/test/fixtures/bitmart_symbols.json +26 -0
  34. data/test/fixtures/bitrue_exchange_info.json +34 -0
  35. data/test/fixtures/bitvavo_markets.json +16 -0
  36. data/test/fixtures/bybit_instruments.json +23 -0
  37. data/test/fixtures/coinbase_products.json +24 -0
  38. data/test/fixtures/gemini_symbol_detail.json +9 -0
  39. data/test/fixtures/gemini_symbols.json +1 -0
  40. data/test/fixtures/hyperliquid_spot_meta.json +12 -0
  41. data/test/fixtures/kucoin_symbols.json +17 -0
  42. data/test/fixtures/mexc_exchange_info.json +40 -0
  43. data/test/honeymaker/client_test.rb +53 -0
  44. data/test/honeymaker/clients/binance_client_test.rb +80 -0
  45. data/test/honeymaker/clients/binance_us_client_test.rb +25 -0
  46. data/test/honeymaker/clients/bingx_client_test.rb +64 -0
  47. data/test/honeymaker/clients/bitget_client_test.rb +85 -0
  48. data/test/honeymaker/clients/bitmart_client_test.rb +78 -0
  49. data/test/honeymaker/clients/bitrue_client_test.rb +63 -0
  50. data/test/honeymaker/clients/bitvavo_client_test.rb +87 -0
  51. data/test/honeymaker/clients/bybit_client_test.rb +84 -0
  52. data/test/honeymaker/clients/coinbase_client_test.rb +118 -0
  53. data/test/honeymaker/clients/gemini_client_test.rb +71 -0
  54. data/test/honeymaker/clients/honeymaker_client_registry_test.rb +44 -0
  55. data/test/honeymaker/clients/hyperliquid_client_test.rb +53 -0
  56. data/test/honeymaker/clients/kraken_client_test.rb +70 -0
  57. data/test/honeymaker/clients/kucoin_client_test.rb +88 -0
  58. data/test/honeymaker/clients/mexc_client_test.rb +75 -0
  59. data/test/honeymaker/exchanges/binance_us_test.rb +40 -0
  60. data/test/honeymaker/exchanges/bingx_test.rb +53 -0
  61. data/test/honeymaker/exchanges/bitget_test.rb +52 -0
  62. data/test/honeymaker/exchanges/bitmart_test.rb +52 -0
  63. data/test/honeymaker/exchanges/bitrue_test.rb +53 -0
  64. data/test/honeymaker/exchanges/bitvavo_test.rb +52 -0
  65. data/test/honeymaker/exchanges/bybit_test.rb +43 -0
  66. data/test/honeymaker/exchanges/coinbase_test.rb +52 -0
  67. data/test/honeymaker/exchanges/gemini_test.rb +48 -0
  68. data/test/honeymaker/exchanges/hyperliquid_test.rb +52 -0
  69. data/test/honeymaker/exchanges/kucoin_test.rb +43 -0
  70. data/test/honeymaker/exchanges/mexc_test.rb +64 -0
  71. data/test/honeymaker/utils_test.rb +38 -0
  72. data/test/test_helper.rb +1 -0
  73. metadata +74 -3
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
4
+
5
+ class Honeymaker::Exchanges::HyperliquidTest < Minitest::Test
6
+ include FixtureHelper
7
+
8
+ def setup
9
+ @exchange = Honeymaker::Exchanges::Hyperliquid.new
10
+ end
11
+
12
+ def test_get_tickers_info_parses_response
13
+ body = load_fixture("hyperliquid_spot_meta.json")
14
+ stub_connection(body)
15
+
16
+ result = @exchange.get_tickers_info
17
+
18
+ assert result.success?
19
+ assert_equal 1, result.data.size
20
+
21
+ ticker = result.data.first
22
+ assert_equal "PURR/USDC", ticker[:ticker]
23
+ assert_equal "PURR", ticker[:base]
24
+ assert_equal "USDC", ticker[:quote]
25
+ assert_nil ticker[:minimum_base_size]
26
+ assert_nil ticker[:minimum_quote_size]
27
+ assert_equal 2, ticker[:base_decimals]
28
+ assert_equal 2, ticker[:quote_decimals]
29
+ assert_equal 5, ticker[:price_decimals]
30
+ assert ticker[:available]
31
+ end
32
+
33
+ def test_skips_pairs_with_missing_tokens
34
+ body = load_fixture("hyperliquid_spot_meta.json")
35
+ body["universe"] << { "name" => "MISSING/PAIR", "tokens" => [99, 100] }
36
+ stub_connection(body)
37
+
38
+ result = @exchange.get_tickers_info
39
+
40
+ assert result.success?
41
+ assert_equal 1, result.data.size
42
+ end
43
+
44
+ private
45
+
46
+ def stub_connection(body)
47
+ response = stub(body: body)
48
+ connection = stub
49
+ connection.stubs(:post).with { |_, &block| block&.call(OpenStruct.new(body: nil)); true }.returns(response)
50
+ @exchange.instance_variable_set(:@connection, connection)
51
+ end
52
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
4
+
5
+ class Honeymaker::Exchanges::KucoinTest < Minitest::Test
6
+ include FixtureHelper
7
+
8
+ def setup
9
+ @exchange = Honeymaker::Exchanges::Kucoin.new
10
+ end
11
+
12
+ def test_get_tickers_info_parses_response
13
+ body = load_fixture("kucoin_symbols.json")
14
+ stub_connection(body)
15
+
16
+ result = @exchange.get_tickers_info
17
+
18
+ assert result.success?
19
+ assert_equal 1, result.data.size
20
+
21
+ ticker = result.data.first
22
+ assert_equal "BTC-USDT", ticker[:ticker]
23
+ assert_equal "BTC", ticker[:base]
24
+ assert_equal "USDT", ticker[:quote]
25
+ assert_equal "0.00001", ticker[:minimum_base_size]
26
+ assert_equal "0.1", ticker[:minimum_quote_size]
27
+ assert_equal "10000000000", ticker[:maximum_base_size]
28
+ assert_equal "99999999", ticker[:maximum_quote_size]
29
+ assert_equal 8, ticker[:base_decimals]
30
+ assert_equal 6, ticker[:quote_decimals]
31
+ assert_equal 1, ticker[:price_decimals]
32
+ assert ticker[:available]
33
+ end
34
+
35
+ private
36
+
37
+ def stub_connection(body)
38
+ response = stub(body: body)
39
+ connection = stub
40
+ connection.stubs(:get).returns(response)
41
+ @exchange.instance_variable_set(:@connection, connection)
42
+ end
43
+ end
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
4
+
5
+ class Honeymaker::Exchanges::MexcTest < Minitest::Test
6
+ include FixtureHelper
7
+
8
+ def setup
9
+ @exchange = Honeymaker::Exchanges::Mexc.new
10
+ end
11
+
12
+ def test_get_tickers_info_parses_response
13
+ body = load_fixture("mexc_exchange_info.json")
14
+ stub_connection(body)
15
+
16
+ result = @exchange.get_tickers_info
17
+
18
+ assert result.success?
19
+ assert_equal 2, result.data.size
20
+
21
+ ticker = result.data.first
22
+ assert_equal "BTCUSDT", ticker[:ticker]
23
+ assert_equal "BTC", ticker[:base]
24
+ assert_equal "USDT", ticker[:quote]
25
+ assert_equal "0.00001", ticker[:minimum_base_size]
26
+ assert_equal "5", ticker[:minimum_quote_size]
27
+ assert_equal "9000", ticker[:maximum_base_size]
28
+ assert_equal 5, ticker[:base_decimals]
29
+ assert_equal 8, ticker[:quote_decimals]
30
+ assert_equal 2, ticker[:price_decimals]
31
+ assert ticker[:available]
32
+ end
33
+
34
+ def test_halted_symbol_not_available
35
+ body = load_fixture("mexc_exchange_info.json")
36
+ stub_connection(body)
37
+
38
+ result = @exchange.get_tickers_info
39
+
40
+ halted = result.data.find { |t| t[:ticker] == "ETHUSDT" }
41
+ refute halted[:available]
42
+ end
43
+
44
+ def test_falls_back_to_precision_fields_when_no_filters
45
+ body = load_fixture("mexc_exchange_info.json")
46
+ stub_connection(body)
47
+
48
+ result = @exchange.get_tickers_info
49
+
50
+ # ETHUSDT has empty filters, should use baseAssetPrecision/quotePrecision
51
+ eth = result.data.find { |t| t[:ticker] == "ETHUSDT" }
52
+ assert_equal 6, eth[:base_decimals]
53
+ assert_equal 2, eth[:price_decimals]
54
+ end
55
+
56
+ private
57
+
58
+ def stub_connection(body)
59
+ response = stub(body: body)
60
+ connection = stub
61
+ connection.stubs(:get).returns(response)
62
+ @exchange.instance_variable_set(:@connection, connection)
63
+ end
64
+ end
@@ -23,4 +23,42 @@ class Honeymaker::UtilsTest < Minitest::Test
23
23
  assert_equal 0, Honeymaker::Utils.decimals("1")
24
24
  assert_equal 0, Honeymaker::Utils.decimals("10")
25
25
  end
26
+
27
+ def test_decimals_with_nil
28
+ assert_equal 0, Honeymaker::Utils.decimals(nil)
29
+ end
30
+
31
+ def test_parse_filters
32
+ filters = [
33
+ { "filterType" => "PRICE_FILTER", "tickSize" => "0.01" },
34
+ { "filterType" => "LOT_SIZE", "stepSize" => "0.001" },
35
+ { "filterType" => "NOTIONAL", "minNotional" => "5" }
36
+ ]
37
+
38
+ result = Honeymaker::Utils.parse_filters(filters)
39
+
40
+ assert_equal "0.01", result[:price]["tickSize"]
41
+ assert_equal "0.001", result[:lot_size]["stepSize"]
42
+ assert_equal "5", result[:notional]["minNotional"]
43
+ end
44
+
45
+ def test_parse_filters_with_min_notional
46
+ filters = [
47
+ { "filterType" => "MIN_NOTIONAL", "minNotional" => "10" }
48
+ ]
49
+
50
+ result = Honeymaker::Utils.parse_filters(filters)
51
+
52
+ assert_nil result[:price]
53
+ assert_nil result[:lot_size]
54
+ assert_equal "10", result[:notional]["minNotional"]
55
+ end
56
+
57
+ def test_parse_filters_empty
58
+ result = Honeymaker::Utils.parse_filters([])
59
+
60
+ assert_nil result[:price]
61
+ assert_nil result[:lot_size]
62
+ assert_nil result[:notional]
63
+ end
26
64
  end
data/test/test_helper.rb CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  require "minitest/autorun"
4
4
  require "mocha/minitest"
5
+ require "ostruct"
5
6
  require "honeymaker"
6
7
 
7
8
  # Load fixture helpers
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: honeymaker
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
  - Deltabadger
@@ -51,8 +51,23 @@ dependencies:
51
51
  - - "~>"
52
52
  - !ruby/object:Gem::Version
53
53
  version: '4.0'
54
- description: Unified interface for fetching market data from cryptocurrency exchanges.
55
- Supports Binance, Kraken, Coinbase, Bybit, KuCoin, Bitget, MEXC, and more.
54
+ - !ruby/object:Gem::Dependency
55
+ name: jwt
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '2.0'
61
+ type: :runtime
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '2.0'
68
+ description: Unified interface for cryptocurrency exchange APIs — market data, trading,
69
+ balances, and orders. Supports Binance, Kraken, Coinbase, Bybit, KuCoin, Bitget,
70
+ MEXC, and more.
56
71
  email:
57
72
  - hello@deltabadger.com
58
73
  executables: []
@@ -63,7 +78,23 @@ files:
63
78
  - LICENSE
64
79
  - README.md
65
80
  - Rakefile
81
+ - honeymaker-0.1.0.gem
66
82
  - lib/honeymaker.rb
83
+ - lib/honeymaker/client.rb
84
+ - lib/honeymaker/clients/binance.rb
85
+ - lib/honeymaker/clients/binance_us.rb
86
+ - lib/honeymaker/clients/bingx.rb
87
+ - lib/honeymaker/clients/bitget.rb
88
+ - lib/honeymaker/clients/bitmart.rb
89
+ - lib/honeymaker/clients/bitrue.rb
90
+ - lib/honeymaker/clients/bitvavo.rb
91
+ - lib/honeymaker/clients/bybit.rb
92
+ - lib/honeymaker/clients/coinbase.rb
93
+ - lib/honeymaker/clients/gemini.rb
94
+ - lib/honeymaker/clients/hyperliquid.rb
95
+ - lib/honeymaker/clients/kraken.rb
96
+ - lib/honeymaker/clients/kucoin.rb
97
+ - lib/honeymaker/clients/mexc.rb
67
98
  - lib/honeymaker/exchange.rb
68
99
  - lib/honeymaker/exchanges/binance.rb
69
100
  - lib/honeymaker/exchanges/binance_us.rb
@@ -84,10 +115,50 @@ files:
84
115
  - lib/honeymaker/version.rb
85
116
  - sig/honeymaker.rbs
86
117
  - test/fixtures/binance_exchange_info.json
118
+ - test/fixtures/bingx_symbols.json
119
+ - test/fixtures/bitget_symbols.json
120
+ - test/fixtures/bitmart_symbols.json
121
+ - test/fixtures/bitrue_exchange_info.json
122
+ - test/fixtures/bitvavo_markets.json
123
+ - test/fixtures/bybit_instruments.json
124
+ - test/fixtures/coinbase_products.json
125
+ - test/fixtures/gemini_symbol_detail.json
126
+ - test/fixtures/gemini_symbols.json
127
+ - test/fixtures/hyperliquid_spot_meta.json
87
128
  - test/fixtures/kraken_asset_pairs.json
129
+ - test/fixtures/kucoin_symbols.json
130
+ - test/fixtures/mexc_exchange_info.json
131
+ - test/honeymaker/client_test.rb
132
+ - test/honeymaker/clients/binance_client_test.rb
133
+ - test/honeymaker/clients/binance_us_client_test.rb
134
+ - test/honeymaker/clients/bingx_client_test.rb
135
+ - test/honeymaker/clients/bitget_client_test.rb
136
+ - test/honeymaker/clients/bitmart_client_test.rb
137
+ - test/honeymaker/clients/bitrue_client_test.rb
138
+ - test/honeymaker/clients/bitvavo_client_test.rb
139
+ - test/honeymaker/clients/bybit_client_test.rb
140
+ - test/honeymaker/clients/coinbase_client_test.rb
141
+ - test/honeymaker/clients/gemini_client_test.rb
142
+ - test/honeymaker/clients/honeymaker_client_registry_test.rb
143
+ - test/honeymaker/clients/hyperliquid_client_test.rb
144
+ - test/honeymaker/clients/kraken_client_test.rb
145
+ - test/honeymaker/clients/kucoin_client_test.rb
146
+ - test/honeymaker/clients/mexc_client_test.rb
88
147
  - test/honeymaker/exchange_test.rb
89
148
  - test/honeymaker/exchanges/binance_test.rb
149
+ - test/honeymaker/exchanges/binance_us_test.rb
150
+ - test/honeymaker/exchanges/bingx_test.rb
151
+ - test/honeymaker/exchanges/bitget_test.rb
152
+ - test/honeymaker/exchanges/bitmart_test.rb
153
+ - test/honeymaker/exchanges/bitrue_test.rb
154
+ - test/honeymaker/exchanges/bitvavo_test.rb
155
+ - test/honeymaker/exchanges/bybit_test.rb
156
+ - test/honeymaker/exchanges/coinbase_test.rb
157
+ - test/honeymaker/exchanges/gemini_test.rb
158
+ - test/honeymaker/exchanges/hyperliquid_test.rb
90
159
  - test/honeymaker/exchanges/kraken_test.rb
160
+ - test/honeymaker/exchanges/kucoin_test.rb
161
+ - test/honeymaker/exchanges/mexc_test.rb
91
162
  - test/honeymaker/honeymaker_test.rb
92
163
  - test/honeymaker/result_test.rb
93
164
  - test/honeymaker/utils_test.rb