stonk 1.0.0 → 1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9c8aaeb619986b3fff1bfa2de91c70796287bc96335c650a16b0ab98e9d9cbb9
4
- data.tar.gz: 757458f818e7a2bb9b4b6465a36b3b96299bb8d502ebb9883d63372e7bc7efc3
3
+ metadata.gz: 6df13acd8e9222a9d5cf5c0b923e332d5e28d7aae5d9c620d986593aec063cff
4
+ data.tar.gz: 7e93cdb1b1b04bb62b1728f64c68d1425c412f3e5dd06c0c03dacb9467d68808
5
5
  SHA512:
6
- metadata.gz: 10d76d734b74e04aa4e75d49a6ec9f64760ba70a15b494ddd26df0a9ada7707d4d2048d130bbb710154455ef70c5fb6ce72e58411d629c6db9fc350afd668251
7
- data.tar.gz: a6866306f9d9c118c42ae331f2f74360751f56687c4508a0d411e2e575b6af9df6eb18e291754ed55a16c661ff24ebe9197f47e17b1cc0fc612428963800a8c0
6
+ metadata.gz: 744313febc98fa0c6acce5594df23fa44e8be7d49934e5f3f976cbc832de74f8c01eaea8740bc651947e919ebd652bb8006cf3cee7bdf037cebe42aa9fafc5ab
7
+ data.tar.gz: c38853fb6493a2e11b8a01034b3e66432311a3d5e71c58801c9346f663ce402c6dd8061e4b4bc74cf18348bff4c5c9aaa5a5e9bcc5b15d3297e7005f6ae2e4a5
checksums.yaml.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## [1.1.0] - 2025-07-23
2
+
3
+ ### Data Sources
4
+ - **CoinGecko adapter** - Cryptocurrency price data via CoinGecko API
5
+ - Support for .CRYPTO suffix format (e.g., BTC.CRYPTO)
6
+
1
7
  ## [1.0.0] - 2025-07-22
2
8
 
3
9
  ### Core Features
data/README.md CHANGED
@@ -1,9 +1,10 @@
1
1
  # Stonk
2
2
 
3
- A Ruby gem for fetching real-time stock prices from multiple data sources with a unified interface. Stonk provides adapters for popular financial APIs and includes caching capabilities for improved performance.
3
+ A Ruby gem for fetching real-time stock and cryptocurrency prices from multiple data sources with a unified interface. Stonk provides adapters for popular financial APIs and includes caching capabilities for improved performance.
4
4
 
5
5
  ## Features
6
6
 
7
+ - **Multi-Asset Support**: Fetch both stock and cryptocurrency prices
7
8
  - **Caching**: Built-in file-based caching to reduce API calls
8
9
  - **Fallback Strategy**: Automatically tries multiple adapters if one fails
9
10
  - **Rate Limiting**: Built-in rate limit handling with retry logic
@@ -40,7 +41,8 @@ require 'stonk'
40
41
  cache_adapter = Stonk::Adapter::FileCacheAdapter.new('/tmp/stock_cache.json')
41
42
  service = Stonk::Service.new(
42
43
  lookup_adapters: [
43
- Stonk::Adapter::AlphaVantageAdapter.new(ENV['ALPHA_VANTAGE_API_KEY'])
44
+ Stonk::Adapter::AlphaVantageAdapter.new(ENV['ALPHA_VANTAGE_API_KEY']),
45
+ Stonk::Adapter::CoinGeckoAdapter.new(ENV['COIN_GECKO_API_KEY']),
44
46
  ],
45
47
  cache_adapter:
46
48
  )
@@ -48,13 +50,17 @@ service = Stonk::Service.new(
48
50
  # Get stock price (automatically cached if cache_adapter is provided)
49
51
  price = service.get_stock_price('AAPL')
50
52
  puts "Apple stock price: $#{price}" if price
53
+
54
+ # Get cryptocurrency price
55
+ crypto_price = service.get_stock_price('BTC.CRYPTO')
56
+ puts "Bitcoin price: $#{crypto_price}" if crypto_price
51
57
  ```
52
58
 
53
59
  ### Using Individual Adapters
54
60
 
55
61
  #### Alpha Vantage Adapter
56
62
 
57
- The Alpha Vantage adapter requires an API key from [Alpha Vantage](https://www.alphavantage.co/):
63
+ The Alpha Vantage adapter requires an API key from [Alpha Vantage](https://www.alphavantage.co/) and provides stock data:
58
64
 
59
65
  ```ruby
60
66
  require 'stonk'
@@ -104,6 +110,30 @@ end
104
110
  cache_adapter.clear_cache
105
111
  ```
106
112
 
113
+ #### CoinGecko Adapter
114
+
115
+ The CoinGecko adapter provides cryptocurrency price data and supports the `.CRYPTO` suffix format:
116
+
117
+ ```ruby
118
+ require 'stonk'
119
+
120
+ # Create CoinGecko adapter
121
+ coin_gecko_adapter = Stonk::Adapter::CoinGeckoAdapter.new
122
+
123
+ # Get cryptocurrency price (use .CRYPTO suffix)
124
+ begin
125
+ btc_price = coin_gecko_adapter.get_stock_price('BTC.CRYPTO')
126
+ puts "Bitcoin price: $#{btc_price}"
127
+
128
+ eth_price = coin_gecko_adapter.get_stock_price('ETH.CRYPTO')
129
+ puts "Ethereum price: $#{eth_price}"
130
+ rescue Stonk::Adapter::StockNotFound
131
+ puts "Cryptocurrency not found"
132
+ rescue Stonk::Adapter::ServerError => e
133
+ puts "Server error: #{e.message}"
134
+ end
135
+ ```
136
+
107
137
  ### Advanced Usage with Fallback Strategy
108
138
 
109
139
  ```ruby
@@ -112,6 +142,7 @@ require 'stonk'
112
142
  # Create adapters in order of preference
113
143
  cache_adapter = Stonk::Adapter::FileCacheAdapter.new('/tmp/stock_cache.json')
114
144
  alpha_adapter = Stonk::Adapter::AlphaVantageAdapter.new(ENV['ALPHA_VANTAGE_API_KEY'])
145
+ coin_gecko_adapter = Stonk::Adapter::CoinGeckoAdapter.new
115
146
  alpha_adapter_with_retry = Stonk::Adapter::AlphaVantageAdapter.new(
116
147
  ENV['ALPHA_VANTAGE_API_KEY'],
117
148
  retry_on_rate_limit: true
@@ -120,8 +151,9 @@ alpha_adapter_with_retry = Stonk::Adapter::AlphaVantageAdapter.new(
120
151
  # Service will try lookup adapters in order until one succeeds, and cache results
121
152
  service = Stonk::Service.new(
122
153
  lookup_adapters: [
123
- cache_adapter, # Try looknig up in the cache first
124
- alpha_adapter # Then Alpha Vantage
154
+ cache_adapter, # Try looking up in the cache first
155
+ alpha_adapter, # Then Alpha Vantage for stocks
156
+ coin_gecko_adapter # Then CoinGecko for cryptocurrencies
125
157
  alpha_adapter_with_retry # Then back to Alpha Vantage with a retry.
126
158
  ],
127
159
  cache_adapter: # Cache successful results
@@ -130,6 +162,10 @@ service = Stonk::Service.new(
130
162
  # Get stock price (will try each lookup adapter until one returns a price, then cache the result)
131
163
  price = service.get_stock_price('AAPL')
132
164
  puts "Apple stock price: $#{price}" if price
165
+
166
+ # Get cryptocurrency price (will use CoinGecko adapter)
167
+ crypto_price = service.get_stock_price('BTC.CRYPTO')
168
+ puts "Bitcoin price: $#{crypto_price}" if crypto_price
133
169
  ```
134
170
 
135
171
  ### Working with Money Objects
@@ -139,8 +175,8 @@ Stock prices are returned as `Stonk::Money` objects, which are based on `BigDeci
139
175
  ```ruby
140
176
  require 'stonk'
141
177
 
142
- yahoo_adapter = Stonk::Adapter::YahooFinanceAdapter.new
143
- price = yahoo_adapter.get_stock_price('AAPL')
178
+ alpha_adapter = Stonk::Adapter::AlphaVantageAdapter.new(ENV['ALPHA_VANTAGE_API_KEY'])
179
+ price = alpha_adapter.get_stock_price('AAPL')
144
180
 
145
181
  # Money objects support arithmetic operations
146
182
  puts "Price: $#{price}"
@@ -159,7 +195,7 @@ require 'stonk'
159
195
 
160
196
  service = Stonk::Service.new(
161
197
  lookup_adapters: [
162
- Stonk::Adapter::YahooFinanceAdapter.new
198
+ Stonk::Adapter::AlphaVantageAdapter.new(ENV['ALPHA_VANTAGE_API_KEY'])
163
199
  ]
164
200
  )
165
201
 
data/Rakefile CHANGED
@@ -8,6 +8,12 @@ RuboCop::RakeTask.new
8
8
 
9
9
  Minitest::TestTask.create do |t|
10
10
  t.warning = false
11
+ t.test_prelude = <<~RUBY if ENV["COVERAGE"]
12
+ require "simplecov"
13
+ SimpleCov.start do
14
+ add_filter %r{^/test/}
15
+ end
16
+ RUBY
11
17
  end
12
18
 
13
19
  task default: :test
data/bin/stonk CHANGED
@@ -15,7 +15,9 @@ def setup_service(use_cache:)
15
15
  retry_on_rate_limit: true,
16
16
  )
17
17
 
18
- lookup_adapters = [alpha_adapter, alpha_adapter_with_retry]
18
+ coin_gecko_adapter = Stonk::Adapter::CoinGeckoAdapter.new(ENV["COIN_GECKO_API_KEY"])
19
+
20
+ lookup_adapters = [alpha_adapter, coin_gecko_adapter, alpha_adapter_with_retry]
19
21
 
20
22
  lookup_adapters.unshift(cache_adapter) if use_cache
21
23
 
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Stonk
4
+ module Adapter
5
+ class CoinGeckoAdapter
6
+ def initialize(api_key)
7
+ @api_key = api_key
8
+ end
9
+
10
+ def get_stock_price(stock_symbol)
11
+ raise Stonk::Adapter::StockNotFound unless stock_symbol.end_with?(".CRYPTO")
12
+
13
+ coin = stock_symbol.gsub(".CRYPTO", "")
14
+
15
+ make_request(coin).then do |response|
16
+ raise Stonk::Adapter::StockNotFound if response.empty?
17
+
18
+ Stonk::Money.new(response.first.dig("current_price"))
19
+ end
20
+ end
21
+
22
+ private
23
+
24
+ def make_request(coin)
25
+ url = URI("https://api.coingecko.com/api/v3/coins/markets?vs_currency=USD&symbols=" + coin)
26
+
27
+ http = Net::HTTP.new(url.host, url.port)
28
+ http.use_ssl = true
29
+
30
+ request = Net::HTTP::Get.new(url)
31
+ request["accept"] = "application/json"
32
+ request["x-cg-demo-api-key"] = @api_key
33
+
34
+ response = http.request(request)
35
+
36
+ if response.is_a?(Net::HTTPSuccess)
37
+ JSON.parse(response.body)
38
+ elsif response.is_a?(Net::HTTPTooManyRequests)
39
+ raise Stonk::Adapter::RateLimitExceeded, "Too many requests"
40
+ else
41
+ raise Stonk::Adapter::ServerError, "Failed to fetch price for #{coin}: #{response.body}"
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
data/lib/stonk/adapter.rb CHANGED
@@ -11,7 +11,7 @@ module Stonk
11
11
  class ServerError < AdapterError; end
12
12
 
13
13
  autoload :AlphaVantageAdapter, "stonk/adapter/alpha_vantage_adapter"
14
+ autoload :CoinGeckoAdapter, "stonk/adapter/coin_gecko_adapter"
14
15
  autoload :FileCacheAdapter, "stonk/adapter/file_cache_adapter"
15
- autoload :YahooFinanceAdapter, "stonk/adapter/yahoo_finance_adapter"
16
16
  end
17
17
  end
data/lib/stonk/money.rb CHANGED
@@ -6,7 +6,7 @@ require "delegate"
6
6
  module Stonk
7
7
  class Money < SimpleDelegator
8
8
  def initialize(amount)
9
- super(BigDecimal(amount))
9
+ super(BigDecimal(amount, Float::DIG + 1))
10
10
  end
11
11
  end
12
12
  end
data/lib/stonk/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Stonk
4
- VERSION = "1.0.0"
4
+ VERSION = "1.1.0"
5
5
  end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stonk
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nick Jones
@@ -68,6 +68,7 @@ files:
68
68
  - lib/stonk.rb
69
69
  - lib/stonk/adapter.rb
70
70
  - lib/stonk/adapter/alpha_vantage_adapter.rb
71
+ - lib/stonk/adapter/coin_gecko_adapter.rb
71
72
  - lib/stonk/adapter/file_cache_adapter.rb
72
73
  - lib/stonk/money.rb
73
74
  - lib/stonk/service.rb
@@ -96,5 +97,6 @@ required_rubygems_version: !ruby/object:Gem::Requirement
96
97
  requirements: []
97
98
  rubygems_version: 3.6.7
98
99
  specification_version: 4
99
- summary: A Ruby gem that fetches real-time stock prices from multiple sources.
100
+ summary: A Ruby gem that fetches real-time stock and cryptocurrency prices from multiple
101
+ sources.
100
102
  test_files: []
metadata.gz.sig CHANGED
Binary file