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 +4 -4
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +6 -0
- data/README.md +44 -8
- data/Rakefile +6 -0
- data/bin/stonk +3 -1
- data/lib/stonk/adapter/coin_gecko_adapter.rb +46 -0
- data/lib/stonk/adapter.rb +1 -1
- data/lib/stonk/money.rb +1 -1
- data/lib/stonk/version.rb +1 -1
- data.tar.gz.sig +0 -0
- metadata +4 -2
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 6df13acd8e9222a9d5cf5c0b923e332d5e28d7aae5d9c620d986593aec063cff
|
|
4
|
+
data.tar.gz: 7e93cdb1b1b04bb62b1728f64c68d1425c412f3e5dd06c0c03dacb9467d68808
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 744313febc98fa0c6acce5594df23fa44e8be7d49934e5f3f976cbc832de74f8c01eaea8740bc651947e919ebd652bb8006cf3cee7bdf037cebe42aa9fafc5ab
|
|
7
|
+
data.tar.gz: c38853fb6493a2e11b8a01034b3e66432311a3d5e71c58801c9346f663ce402c6dd8061e4b4bc74cf18348bff4c5c9aaa5a5e9bcc5b15d3297e7005f6ae2e4a5
|
checksums.yaml.gz.sig
CHANGED
|
Binary file
|
data/CHANGELOG.md
CHANGED
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
|
|
124
|
-
alpha_adapter
|
|
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
|
-
|
|
143
|
-
price =
|
|
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::
|
|
198
|
+
Stonk::Adapter::AlphaVantageAdapter.new(ENV['ALPHA_VANTAGE_API_KEY'])
|
|
163
199
|
]
|
|
164
200
|
)
|
|
165
201
|
|
data/Rakefile
CHANGED
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
|
-
|
|
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
data/lib/stonk/version.rb
CHANGED
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.
|
|
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
|
|
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
|