algonquin_stocks 2.0.0 → 2.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: 260c32104c95783e164d37f55e07b5bf9e3c31a2fd08a79c2c8c6f20d68e5b5c
4
- data.tar.gz: 8146f1edbdfdc37924f555618d8171a2feb5e4d452b16069ec6f00d9ccee084a
3
+ metadata.gz: a853fc21135ba1200935b7ce64979a390eb1c2922ba179500fedb92da2504921
4
+ data.tar.gz: 639579beeb874967cd76a0e6d465dfa8b36b1ec061d57d016dfaf29ba6cb956b
5
5
  SHA512:
6
- metadata.gz: f50ec185ca901f025433155c4611ee5ca777bb7ec0e7915d619429ec7f21d5dbd912dcaea87431a4f1b9871afba4822d2180859d511f804f30cfaf62c4c24618
7
- data.tar.gz: c1f22651b66557a270945e0784cdca993bab152bc4ff430cad20f2fba1c811986b991e95d0cc3be3ee4ee271cc859c917e098a2e73d2ef2952f96ecdf0a89072
6
+ metadata.gz: 7f3974a9003813154409a4582f62c52080aa9c9307f3d46ffdd452958d3586a275cc4d8ed3d9b0fe0bd61083a68edba58c4feae2571f6090f67f5c5745bca44a
7
+ data.tar.gz: 6a0e4dae31a22042042f319a23392e62ec7a025929f188ca3d57aa6cce0acacf5dc4d0a03dff87baecc1d36a2cefbf60521bbb59eb518f9e08b423d044644828
data/README.md CHANGED
@@ -12,14 +12,15 @@ To install the 'algonquin_stocks' ruby gem:
12
12
 
13
13
  To use the gem in your Rails Application, include it in your Gemfile:
14
14
 
15
- `gem "algonquin_stocks", "~> 1.5.0"`
15
+ `gem "algonquin_stocks", "~> 2.1.0"`
16
16
 
17
17
  ## Initialization
18
18
 
19
19
  To initialize AlgonquinStocks with a valid API_KEY:
20
20
 
21
- `AlgonquinStocks::StockClient.new YOUR_API_KEY`
21
+ `AlgonquinStocks::StockClient.new YOUR_API_KEY, CACHE`
22
22
 
23
+ CACHE is optional and defaults to false. If set to true, the gem will cache the stock data in a SQLite database.
23
24
 
24
25
  ## Usage
25
26
 
@@ -37,6 +38,7 @@ Quote is the primary method, returning a AlgonquinStocks::Stock instance includi
37
38
  - close
38
39
  - change
39
40
  - percent
41
+ - data
40
42
 
41
43
 
42
44
  ### AlgonquinStocks::StockClient#data(symbol)
@@ -1,4 +1,5 @@
1
1
  require 'date'
2
+ require 'logger'
2
3
 
3
4
  module AlgonquinStocks
4
5
  # => AlgonquinStocks::Stock
@@ -6,32 +7,19 @@ module AlgonquinStocks
6
7
  # @param json [Hash] The JSON response from Alpha Vantage.
7
8
  # @return [AlgonquinStocks::Stock] The stock object.
8
9
  class Stock
9
- attr_reader :symbol, :data, :open, :high, :low, :price, :volume, :date, :close, :change, :percent
10
-
11
- # => AlgonquinStocks::Stock#initialize
12
- #
13
- # @param json [Hash] The JSON response from Alpha Vantage.
14
- # @return [AlgonquinStocks::Stock] The stock object.
15
10
  def initialize(json)
16
11
  update json
17
12
  end
18
-
19
- SYMBOL = '01. symbol'
20
- OPEN = '02. open'
21
- HIGH = '03. high'
22
- LOW = '04. low'
23
- PRICE = '05. price'
24
- VOLUME = '06. volume'
25
- DATE = '07. latest trading day'
26
- CLOSE = '08. previous close'
27
- CHANGE = '09. change'
28
- PERCENT = '10. change percent'
29
13
 
14
+ @@log = Logger.new(STDOUT)
15
+ @@log.level = Logger::INFO
16
+
30
17
  # => AlgonquinStocks::Stock#update
31
18
  #
32
19
  # @param json [Hash] The JSON response from Alpha Vantage.
33
20
  # @return [AlgonquinStocks::Stock] The stock object.
34
21
  def update(json)
22
+ @@log.info "update: #{json}"
35
23
  @symbol = json[SYMBOL]
36
24
  @open = json[OPEN].to_f
37
25
  @high = json[HIGH].to_f
@@ -55,11 +43,77 @@ module AlgonquinStocks
55
43
  }
56
44
  end
57
45
 
46
+ SYMBOL = '01. symbol'
47
+ OPEN = '02. open'
48
+ HIGH = '03. high'
49
+ LOW = '04. low'
50
+ PRICE = '05. price'
51
+ VOLUME = '06. volume'
52
+ DATE = '07. latest trading day'
53
+ CLOSE = '08. previous close'
54
+ CHANGE = '09. change'
55
+ PERCENT = '10. change percent'
56
+
58
57
  # => AlgonquinStocks::Stock#to_s
59
58
  #
60
59
  # @return [String] The stock object as a string.
61
60
  def to_s
62
61
  "#{symbol}: #{price} (#{change}, #{percent}) #{date}"
63
62
  end
63
+
64
+ # => AlgonquinStocks::Stock#symbol
65
+ #
66
+ # @return [String] The symbol of the stock.
67
+ attr_reader :symbol
68
+
69
+ # => AlgonquinStocks::Stock#data
70
+ #
71
+ # @return [Hash] The stock data.
72
+ attr_reader :data
73
+
74
+ # => AlgonquinStocks::Stock#open
75
+ #
76
+ # @return [Float] The open price of the stock.
77
+ attr_reader :open
78
+
79
+ # => AlgonquinStocks::Stock#high
80
+ #
81
+ # @return [Float] The high price of the stock.
82
+ attr_reader :high
83
+
84
+ # => AlgonquinStocks::Stock#low
85
+ #
86
+ # @return [Float] The low price of the stock.
87
+ attr_reader :low
88
+
89
+ # => AlgonquinStocks::Stock#price
90
+ #
91
+ # @return [Float] The price of the stock.
92
+ attr_reader :price
93
+
94
+ # => AlgonquinStocks::Stock#volume
95
+ #
96
+ # @return [Integer] The volume of the stock.
97
+ attr_reader :volume
98
+
99
+ # => AlgonquinStocks::Stock#date
100
+ #
101
+ # @return [Date] The latest trading day of the stock.
102
+ attr_reader :date
103
+
104
+ # => AlgonquinStocks::Stock#close
105
+ #
106
+ # @return [Float] The previous close price of the stock.
107
+ attr_reader :close
108
+
109
+ # => AlgonquinStocks::Stock#change
110
+ #
111
+ # @return [Float] The change of the stock price.
112
+ attr_reader :change
113
+
114
+ # => AlgonquinStocks::Stock#percent
115
+ #
116
+ # @return [Float] The percent change of the stock price.
117
+ attr_reader :percent
64
118
  end
65
119
  end
@@ -1,45 +1,104 @@
1
1
  require 'rest-client'
2
2
  require 'json'
3
+ require 'date'
4
+ require 'sqlite3'
5
+ require 'logger'
3
6
 
4
7
  module AlgonquinStocks
5
8
  # => AlgonquinStocks::StockClient
6
9
  #
7
10
  # @param api_key [String] The API key for Alpha Vantage.
11
+ # @param cached [Boolean] Whether to use cached data.
8
12
  # @return [AlgonquinStocks::StockClient] The stock client object.
9
13
  class StockClient
10
- URL_BASE = "https://www.alphavantage.co/query"
11
- FUNCTION = "GLOBAL_QUOTE"
12
-
13
- # => AlgonquinStocks::StockClient#initialize
14
- #
15
- # @param api_key [String] The API key for Alpha Vantage.
16
- # @return [AlgonquinStocks::StockClient] The stock client object.
17
- def initialize(api_key)
14
+ def initialize(api_key, cached = false)
18
15
  @api_key = api_key
16
+ @cached = cached
19
17
  @url = "#{URL_BASE}?apikey=#{@api_key}"
18
+ @db = SQLite3::Database.new 'cache.db'
19
+ @db.execute 'create table if not exists Stocks (Symbol text, Function text, Data text, Fetched datetime, primary key (Symbol, Function))'
20
+ end
21
+
22
+ @@log = Logger.new(STDOUT)
23
+ @@log.level = Logger::INFO
24
+
25
+ URL_BASE = 'https://www.alphavantage.co/query'
26
+ FUNCTION = 'GLOBAL_QUOTE'
27
+
28
+ SQL_SYMBOL = 0
29
+ SQL_FUNCTION = 1
30
+ SQL_DATA = 2
31
+ SQL_FETCHED = 3
32
+ # => AlgonquinStocks::StockClient#save_cached
33
+ #
34
+ # @param symbol [String] The symbol of the stock.
35
+ # @param function [String] The API function value.
36
+ # @param data [Hash] The data to save.
37
+ # @return [Boolean] Whether the data was saved.
38
+ def save_cached(symbol, function, data)
39
+ @@log.info "save_cached: #{symbol}, #{function}, #{data}"
40
+ return @db.execute 'insert into Stocks (Symbol, Function, Data, Fetched) values (?, ?, ?, ?)', [symbol, function, data, DateTime.now.to_s]
41
+ end
42
+
43
+ # => AlgonquinStocks::StockClient#get_cached
44
+ #
45
+ # @param symbol [String] The symbol of the stock.
46
+ # @param function [String] The API function value.
47
+ # @return [Hash, String] The cached data and fetched date.
48
+ def get_cached(symbol, function)
49
+ @@log.info "get_cached: #{symbol}, #{function}"
50
+ result = @db.execute 'select * from Stocks where Symbol = ? and Function = ?', [symbol, function]
51
+ if result.length > 0
52
+ @@log.info "cached data: #{result}"
53
+ return result[0][SQL_DATA], result[0][SQL_FETCHED]
54
+ end
55
+ @@log.info '*** no cached data found ***'
56
+ return nil
20
57
  end
21
58
 
22
59
  # => AlgonquinStocks::StockClient#data
23
60
  #
24
61
  # @param symbol [String] The symbol of the stock.
25
- # @param function [String] The function to use.
62
+ # @param function [String] The API function value.
26
63
  # @return [Hash] The JSON response from Alpha Vantage.
27
64
  def data(symbol, function=FUNCTION)
65
+ @@log.info "data: #{symbol}, #{function}"
28
66
  url = "#{@url}&function=#{function}&symbol=#{symbol}"
67
+ @@log.info "url: #{url}"
29
68
  RestClient::Request.execute url: url, method: :get, verify_ssl: false do |response|
30
69
  raise response.body unless response.code == 200
31
- JSON.parse response.body
70
+ response.body
32
71
  end
33
72
  end
34
73
 
35
74
  # => AlgonquinStocks::StockClient#quote
36
75
  #
37
76
  # @param symbol [String] The symbol of the stock.
38
- # @param function [String] The function to use.
77
+ # @param function [String] The API function value.
39
78
  # @return [AlgonquinStocks::Stock] The stock object.
40
79
  def quote(symbol, function=FUNCTION)
41
- json = data symbol, function
42
- Stock.new json['Global Quote']
80
+ @@log.info "quote: #{symbol}, #{function}"
81
+ if @cached
82
+ json_str, fetched = get_cached symbol, function
83
+ if fetched
84
+ fetched_date = DateTime.parse fetched
85
+ if fetched_date > DateTime.now - DateTime.parse('5 hours')
86
+ @@log.info '*** using cached data ***'
87
+ json = JSON.parse json_str
88
+ stock = Stock.new json
89
+ return stock
90
+ end
91
+ end
92
+ end
93
+ json_data = data symbol, function
94
+ json = (JSON.parse json_data)['Global Quote']
95
+ if !json
96
+ @@log.info '*** no data found ***'
97
+ return nil
98
+ end
99
+ stock = Stock.new json
100
+ save_cached symbol, function, json.to_json
101
+ return stock
43
102
  end
44
103
  end
45
104
  end
@@ -1,5 +1,5 @@
1
1
  # => AlgonquinStocks::VERSION
2
2
  module AlgonquinStocks
3
- VERSION = '2.0.0'
3
+ VERSION = '2.1.0'
4
4
  end
5
5
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: algonquin_stocks
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrei Grobnic
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2025-04-22 00:00:00.000000000 Z
11
+ date: 2025-04-25 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: A gem for retrieving stock information
14
14
  email: