finnhubrb 1.1.0 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 24f55e759933953990eb11d0047d58d31ba29fe6937d5c216001021c4f708589
4
- data.tar.gz: b3c5b08e7cb5a0b2383450eced49455176adbd5ac55ce99c45426baacd69611a
3
+ metadata.gz: 383edf0d15e683c1a6e52bbce6c6b0756a6fdbafee0061390d0b693b5da18a00
4
+ data.tar.gz: 34e0be3ce7451d96205052b310d11bd735a2f8d5579427c510a2b2edbbbf6902
5
5
  SHA512:
6
- metadata.gz: 8821e04829a448e35da18a8d3c0d6cf5281c82aeaa40a40306e9d504c691554109009cf3ef304c9418e90e5f0768b98bc6e7394c2dfaa05a6baa8365d74eaa10
7
- data.tar.gz: 2c78cd652e399426d40065367dbe367c0ae5f7cfb132c1db5d2b8e152bb1d5d779933021d731f9681c46bafc1625ee96bd6857c898ff80242604f7087f832bd5
6
+ metadata.gz: 25531899c47cdd8047bc39b2d71e2c71e86a84d94f9332b62aae32499bc60e09de3915065e878f21227c447956addfb8552935d13c6385c9b8fec8b2a3978b8f
7
+ data.tar.gz: 3702050c29d90930df21f4eb4e68d2ae96bab96bf5009c425989ed4583a7dba28817589dbc02080dda8d3219de6ae319083b2de029c6334e5d3c4120a10046ae
@@ -1,10 +1,9 @@
1
1
  # lib = File.expand_path("../lib", __FILE__)
2
2
  # $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
- require "rake"
4
3
 
5
4
  Gem::Specification.new do |s|
6
5
  s.name = "finnhubrb"
7
- s.version = "1.1.0"
6
+ s.version = "1.2.0"
8
7
  s.authors = ["Stefano Martin"]
9
8
  s.email = ["stefano.martin87@gmail.com"]
10
9
  s.homepage = "https://github.com/StefanoMartin/FinnhubRB"
@@ -13,12 +12,12 @@ Gem::Specification.new do |s|
13
12
  s.description = "A ruby wrapper for Finnhub's HTTP API"
14
13
  s.platform = Gem::Platform::RUBY
15
14
  s.require_paths = ["lib"]
16
- s.files = FileList["lib/*", "spec/**/*", "FinnhubRB.gemspec", "Gemfile", "LICENSE.md", "README.md"].to_a
17
- s.add_runtime_dependency "httparty", "~>0.17.0", ">= 0.17.0"
18
- s.add_runtime_dependency "oj", "~>3.9.0", ">= 3.9.0"
19
- s.add_runtime_dependency "faye-websocket", "~>0.10.9", ">= 0.10.9"
20
- s.add_development_dependency "pry-byebug", '~> 0'
21
- s.add_development_dependency "rspec", "~>3.5", ">=3.5"
22
- s.add_development_dependency "awesome_print", "~>1.7", ">= 1.7"
23
- s.add_development_dependency "eventmachine", "~>1.2.7", ">= 1.2.7"
15
+ s.files = Dir["lib/*"] + Dir["spec/**/*"] + ["FinnhubRB.gemspec", "Gemfile", "LICENSE.md", "README.md"]
16
+ s.add_runtime_dependency "httparty", ">= 0.17.0"
17
+ s.add_runtime_dependency "oj",">= 3.9.0"
18
+ s.add_runtime_dependency "faye-websocket", ">= 0.10.9"
19
+ s.add_development_dependency "pry-byebug"
20
+ s.add_development_dependency "rspec", ">=3.5"
21
+ s.add_development_dependency "awesome_print", ">= 1.7"
22
+ s.add_development_dependency "eventmachine", ">= 1.2.7"
24
23
  end
data/README.md CHANGED
@@ -8,7 +8,7 @@ on the [HTTP API of Finnhub](https://finnhub.io/docs/api).
8
8
 
9
9
  To install FinnhubRB: `gem install finnhubrb`
10
10
 
11
- To use it in your application: `require "finnhubrb"`
11
+ To use it in your application: `require "finnhub"`
12
12
 
13
13
  ## How to test
14
14
 
@@ -70,10 +70,9 @@ Several methods are available under this class:
70
70
 
71
71
  ``` ruby
72
72
  stock.symbol # Return the symbol
73
- stock.profile # Retrieve profile of the stock
74
- stock.profile(isin: "US5949181045") # Retrieve profile of the stock by its isin
75
- stock.profile(cusip: "023135106") # Retrieve profile of the stock by its cusip
76
- stock.profile # Retrieve profile of the stock
73
+ stock.profile # (PREMIUM) Retrieve profile of the stock
74
+ stock.profile(isin: "US5949181045") # (PREMIUM) Retrieve profile of the stock by its isin
75
+ stock.profile(cusip: "023135106") # (PREMIUM) Retrieve profile of the stock by its cusip
77
76
  stock.ceo_compensation # Retrieve compensation of the stock's CEO
78
77
  stock.executive # Retrieve list of company's executives
79
78
  stock.recommendation # Retrieve recommendation about this stock
@@ -92,7 +91,12 @@ Several methods are available under this class:
92
91
  stock.peers # Like the previous one, but the results are Finnhub::Stock instances
93
92
  stock.pattern # Retrieve pattern
94
93
  stock.support_resistance # Retrieve support resistance
95
- stock.technical_indicators # Retrieve techinical indicators
94
+ stock.technical_indicators # Retrieve technical indicators
95
+ stock.revenue_estimate # Retrieve revenue estimate
96
+ stock.earnings_estimate # Retrieve earnings estimate
97
+ stock.earnings_calendar # Retrieve earnings calendar (you can add from and to)
98
+ stock.dividends(from: Time.now-24*30*3600, to: Time.now) # Retrieve dividends
99
+ stock.splits(from: Time.now-24*30*3600, to: Time.now) # Retrieve splits
96
100
  ```
97
101
 
98
102
  To create a timeseries you can use:
@@ -135,9 +139,22 @@ The methods "open", "high", "low", "close", "volume" and "status" will not work
135
139
  (PREMIUM) To retrieve transcripts you can use:
136
140
 
137
141
  ``` ruby
138
- stock.stock_exchanges # Retrieve the available stock exchanges on Finnhub (Finnhub::Stock_Exchange instances)
139
- client.stock_exchanges(plain: true) # As above, but it returns simply the output of the request
140
- stock_exchange = client.stock_exchanges(name: "NAME_CRYPTO_EXCHANGE") # Create a single instance of Finnhub::Stock_Exchange
142
+ client.transcripts # Retrieve the available transcripts on Finnhub (Finnhub::Transcript instances)
143
+ client.transcripts(plain: true) # As above, but it returns simply the output of the request
144
+ client.transcripts[0].transcript # Retrieve the specific transcript
145
+ ```
146
+
147
+ To handle indicators you can do:
148
+ ``` ruby
149
+ timeseries = stock.indicator(from: Time.now-24*30*3600, to: Time.now, resolution: 60, indicator: "sma", args: {timeperiod: 3})
150
+ timeseries.sma # Return technical values (in this case is sma since the indicator)
151
+ timeseries.output # Return output obtained from the request
152
+ timeseries.timestamps # Return timestamps obtained from the request
153
+ timeseries.open # Return open obtained from the request
154
+ timeseries.low # Return low obtained from the request
155
+ timeseries.close # Return close obtained from the request
156
+ timeseries.volume # Return volume obtained from the request
157
+ timeseries.status # Return status obtained from the request
141
158
  ```
142
159
 
143
160
  ## Crypto
@@ -145,9 +162,9 @@ The methods "open", "high", "low", "close", "volume" and "status" will not work
145
162
  To analyse a crypto currency you should start by choosing which crypto exchange you want to analyse.
146
163
 
147
164
  ``` ruby
148
- client.transcripts # Retrieve the available transcripts on Finnhub (Finnhub::Transcript instances)
149
- client.transcripts(plain: true) # As above, but it returns simply the output of the request
150
- client.transcripts[0].transcript # Retrieve the specific transcript
165
+ client.crypto_exchanges # Retrieve the available crypto exchanges on Finnhub (Finnhub::Crypto_Exchange instances)
166
+ client.crypto_exchanges(plain: true) # As above, but it returns simply the output of the request
167
+ crypto_exchange = client.crypto_exchange(name: "NAME_CRYPTO_EXCHANGE") # Create a single instance of Finnhub::Crypto_Exchange
151
168
  ```
152
169
 
153
170
  After that you can choose, in that crypto exchange which symbol you want to check.
@@ -279,6 +296,26 @@ websocket.unsubscribe("AAPL") # Unubscribe to a stock
279
296
 
280
297
  The symbol under subscribe/unsubscribe can be a string of a stock, a crypto_symbol or a forex_symbol. Or in alternative can be a Finnhub::Stock, Finnhub::Crypto_Symbol, or a Finnhub::Forex_Symbol instance.
281
298
 
299
+ # Webhook
300
+
301
+ You can manage the webhook in the following way.
302
+
303
+ ``` ruby
304
+ webhook = client.webhook # Instantiate a webhook
305
+ webhook.create(body: {'event': 'earnings', 'symbol': 'AAPL'}) # Create a new webhook
306
+ webhook.id #Retrieve id of the webhook
307
+ client.webhooks # List webhooks
308
+ client.webhooks(plain: true) # As above, but it returns simply the output of the request
309
+ webhook.delete # Delete webhook
310
+
311
+ ```
312
+
313
+ ## Other
314
+
315
+ ``` ruby
316
+ client.covid # Retrieve United States Covid-19 info
317
+ ```
318
+
282
319
  ## Errors
283
320
 
284
321
  Error from FinnhubRB are returned under Finnhub::Error exception. You can use e.code to retrieve the code returned to a not successful request.
@@ -4,8 +4,14 @@ module Finnhub
4
4
  request("/calendar/economic")
5
5
  end
6
6
 
7
- def earnings_calendar
8
- request("/calendar/earnings")
7
+ def earnings_calendar(from: nil, to: nil)
8
+ url = "/calendar/earnings?"
9
+ from = from.to_date.to_s if from.is_a?(Time)
10
+ url += "&from=#{from}" unless from.nil?
11
+ to = to.to_date.to_s if to.is_a?(Time)
12
+ url += "&to=#{to}" unless to.nil?
13
+ url[-1] = "" if url[-1] == "?"
14
+ request(url)
9
15
  end
10
16
 
11
17
  def ipo_calendar
@@ -12,13 +12,20 @@ module Finnhub
12
12
  attr_accessor :verbose
13
13
  attr_reader :apikey
14
14
 
15
- def request(url)
15
+ def request(url, method: :get, body: nil)
16
16
  send_url = "#{BASE_URI}#{url}"
17
17
  send_url += send_url.include?("?") ? "&" : "?"
18
18
  send_url += "token=#{@apikey}"
19
19
 
20
- puts "\nGET #{send_url}\n" if @verbose
21
- response = HTTParty.get(send_url)
20
+ case method
21
+ when :get
22
+ puts "\nGET #{send_url}\n" if @verbose
23
+ response = HTTParty.get(send_url)
24
+ when :post
25
+ puts "\nPOST #{send_url}, body: #{body}\n" if @verbose
26
+ response = HTTParty.post(send_url, body: Oj.dump(body, mode: :json))
27
+ end
28
+
22
29
  if @verbose
23
30
  puts "\nCODE: #{response.code}\n"
24
31
  puts "OUTPUT: #{response.body}\n"
@@ -48,6 +55,17 @@ module Finnhub
48
55
  Finnhub::Websocket.new(@apikey)
49
56
  end
50
57
 
58
+ def webhook
59
+ Finnhub::Webhook.new(client: self)
60
+ end
61
+
62
+ def webhooks(plain: false)
63
+ output = request("/webhook/list")
64
+ return output if plain
65
+
66
+ output.map{|o| Finnhub::Webhook.new(client: self, id: o[:id], hash: o)}
67
+ end
68
+
51
69
  def stock_exchanges(plain: false)
52
70
  output = request("/stock/exchange")
53
71
  return output if plain
@@ -102,12 +120,16 @@ module Finnhub
102
120
  output = request("/economic/code")
103
121
  return output if plain
104
122
 
105
- output.map{|o| Finnhub::Economic_Code.new(client: self, code: o[0], description: o[1])}
123
+ output.map{|o| Finnhub::Economic_Code.new(client: self, code: o[:code], hash: o)}
106
124
  end
107
125
 
108
- def economic_code(code:, description: nil)
126
+ def economic_code(code:, hash: nil)
109
127
  Finnhub::Economic_Code.new(client: self, code: code,
110
- description: description)
128
+ hash: hash)
129
+ end
130
+
131
+ def covid
132
+ request("/covid19/us")
111
133
  end
112
134
  end
113
135
  end
@@ -9,8 +9,10 @@ module Finnhub
9
9
 
10
10
  def merger(from: nil, to: nil)
11
11
  url = "/merger?country=#{@country}"
12
- url += "&from=#{from}" unless from.nil?
13
- url += "&to=#{to}" unless to.nil?
12
+ from = from.to_date.to_s if from.is_a?(Time)
13
+ url += "&from=#{from}"
14
+ to = to.to_date.to_s if to.is_a?(Time)
15
+ url += "&to=#{to}"
14
16
  @client.request(url)
15
17
  end
16
18
  end
@@ -38,6 +38,7 @@ module Finnhub
38
38
  def timeseries(**args)
39
39
  Finnhub::Crypto_Timeseries.new(client: @client, symbol: @symbol, **args)
40
40
  end
41
+ alias :candles :timeseries
41
42
  end
42
43
 
43
44
  class Crypto_Timeseries < Finnhub::Timeseries
@@ -45,7 +46,9 @@ module Finnhub
45
46
  from: nil, to: nil, format: nil)
46
47
  url = "/crypto/candle?symbol=#{symbol}&resolution=#{resolution}"
47
48
  url += "&count=#{count}" unless count.nil?
49
+ from = from.to_i if from.is_a?(Time)
48
50
  url += "&from=#{from}" unless from.nil?
51
+ to = to.to_i if to.is_a?(Time)
49
52
  url += "&to=#{to}" unless to.nil?
50
53
  url += "&format=#{format}" unless format.nil?
51
54
  @output = client.request(url)
@@ -1,12 +1,12 @@
1
1
  module Finnhub
2
2
  class Economic_Code
3
- def initialize(client:, code:, description:)
3
+ def initialize(client:, code:, hash:)
4
4
  @client = client
5
5
  @code = code
6
- @description = description
6
+ @hash = hash
7
7
  end
8
8
 
9
- attr_reader :code, :description
9
+ attr_reader :code, :hash
10
10
 
11
11
  def data(plain: false)
12
12
  output = @client.request("/economic?code=#{@code}")
@@ -38,6 +38,7 @@ module Finnhub
38
38
  def timeseries(**args)
39
39
  Finnhub::Forex_Timeseries.new(client: @client, symbol: @symbol, **args)
40
40
  end
41
+ alias :candles :timeseries
41
42
  end
42
43
 
43
44
  class Forex_Timeseries < Finnhub::Timeseries
@@ -45,7 +46,9 @@ module Finnhub
45
46
  from: nil, to: nil, format: nil)
46
47
  url = "/forex/candle?symbol=#{symbol}&resolution=#{resolution}"
47
48
  url += "&count=#{count}" unless count.nil?
49
+ from = from.to_i if from.is_a?(Time)
48
50
  url += "&from=#{from}" unless from.nil?
51
+ to = to.to_i if to.is_a?(Time)
49
52
  url += "&to=#{to}" unless to.nil?
50
53
  url += "&format=#{format}" unless format.nil?
51
54
  @output = client.request(url)
@@ -0,0 +1,60 @@
1
+ module Finnhub
2
+ class Indicator
3
+ def initialize(client:, stock:, resolution: "D", from:, to:, indicator:, args: {})
4
+ url = "/indicator?symbol=#{stock.symbol}&resolution=#{resolution}"
5
+ from = from.to_i if from.is_a?(Time)
6
+ url += "&from=#{from}"
7
+ to = to.to_i if to.is_a?(Time)
8
+ url += "&to=#{to}"
9
+ url += "&indicator=#{indicator}"
10
+ args.each do |attribute, value|
11
+ url += "&#{attribute}=#{value}"
12
+ end
13
+ @output = client.request(url)
14
+ if @output.is_a?(Hash) && @output[:s] == "ok"
15
+ @timestamps = @output[:t]&.map{|t| Time.strptime(t.to_s,'%s')}
16
+ else
17
+ @timestamps = []
18
+ end
19
+ end
20
+
21
+ attr_reader :output, :timestamps
22
+
23
+ def open
24
+ operation(:o)
25
+ end
26
+
27
+ def high
28
+ operation(:h)
29
+ end
30
+
31
+ def low
32
+ operation(:l)
33
+ end
34
+
35
+ def close
36
+ operation(:c)
37
+ end
38
+
39
+ def volume
40
+ operation(:v)
41
+ end
42
+
43
+ def status
44
+ raise Finnhub::Error message: "Output is not a hash" unless @output.is_a?(Hash)
45
+ @output[:s]
46
+ end
47
+
48
+ def method_missing(name, *args, &block)
49
+ operation(name.to_sym)
50
+ end
51
+
52
+ private
53
+
54
+ def operation(type)
55
+ raise Finnhub::Error message: "Output is not a hash" unless @output.is_a?(Hash)
56
+ return [] if @output[type].nil?
57
+ @timestamps.zip(@output[type])
58
+ end
59
+ end
60
+ end
@@ -116,14 +116,54 @@ module Finnhub
116
116
  @client.request("/news/#{@symbol}")
117
117
  end
118
118
 
119
- def major_development
120
- @client.request("/major-development?symbol=#{@symbol}")
119
+ def major_development(from: nil, to: nil)
120
+ url = "/major-development?symbol=#{@symbol}"
121
+ from = from.to_date.to_s if from.is_a?(Time)
122
+ url += "&from=#{from}" unless from.nil?
123
+ to = to.to_date.to_s if to.is_a?(Time)
124
+ url += "&to=#{to}" unless to.nil?
125
+ @client.request(url)
121
126
  end
122
127
 
123
128
  def sentiment
124
129
  @client.request("/news-sentiment?symbol=#{@symbol}")
125
130
  end
126
131
 
132
+ def revenue_estimate
133
+ @client.request("/stock/revenue-estimate?symbol=#{@symbol}")
134
+ end
135
+
136
+ def earnings_estimate
137
+ @client.request("/stock/eps-estimate?symbol=#{@symbol}")
138
+ end
139
+
140
+ def earnings_calendar(from: nil, to: nil)
141
+ url = "/calendar/earnings?symbol=#{@symbol}"
142
+ from = from.to_date.to_s if from.is_a?(Time)
143
+ url += "&from=#{from}" unless from.nil?
144
+ to = to.to_date.to_s if to.is_a?(Time)
145
+ url += "&to=#{to}" unless to.nil?
146
+ @client.request(url)
147
+ end
148
+
149
+ def dividends(from:, to:)
150
+ url = "/stock/dividend?symbol=#{@symbol}"
151
+ from = from.to_date.to_s if from.is_a?(Time)
152
+ url += "&from=#{from}"
153
+ to = to.to_date.to_s if to.is_a?(Time)
154
+ url += "&to=#{to}"
155
+ @client.request(url)
156
+ end
157
+
158
+ def splits(from:, to:)
159
+ url = "/stock/split?symbol=#{@symbol}"
160
+ from = from.to_date.to_s if from.is_a?(Time)
161
+ url += "&from=#{from}"
162
+ to = to.to_date.to_s if to.is_a?(Time)
163
+ url += "&to=#{to}"
164
+ @client.request(url)
165
+ end
166
+
127
167
  def transcripts(plain: false)
128
168
  output = @client.request("/stock/transcripts/list?symbol=#{@symbol}")
129
169
  return output if plain
@@ -139,5 +179,9 @@ module Finnhub
139
179
  def tick(**args)
140
180
  Finnhub::Tick.new(client: @client, stock: self, **args)
141
181
  end
182
+
183
+ def indicator(**args)
184
+ Finnhub::Indicator.new(client: @client, stock: self, **args)
185
+ end
142
186
  end
143
187
  end
@@ -0,0 +1,23 @@
1
+ module Finnhub
2
+ class Webhook
3
+ def initialize(client:, id: nil, hash: nil)
4
+ @client = client
5
+ @id = id
6
+ @hash = hash
7
+ end
8
+
9
+ attr_reader :id, :hash
10
+
11
+ def create(body:)
12
+ response = @client.request("/webhook/add", method: :post, body: body)
13
+ @id = response[:id]
14
+ response
15
+ end
16
+
17
+ def delete
18
+ response = @client.request("/webhook/delete", method: :post, body: {id: @id})
19
+ @id = nil
20
+ response
21
+ end
22
+ end
23
+ end
@@ -4,6 +4,7 @@ require "time"
4
4
  require 'em/pure_ruby'
5
5
  require "faye/websocket"
6
6
  require_relative "Analysis"
7
+ require_relative "Indicator"
7
8
  require_relative "Calendar"
8
9
  require_relative "Timeseries"
9
10
  require_relative "Client"
@@ -16,3 +17,4 @@ require_relative "Stock"
16
17
  require_relative "Websocket"
17
18
  require_relative "Tick"
18
19
  require_relative "Transcript"
20
+ require_relative "Webhook"
@@ -22,6 +22,7 @@ describe "1.0.0" do
22
22
  end
23
23
 
24
24
  it "can retrieve merge countries" do
25
+ skip "Premium" if @skip_premium
25
26
  country = @store[:client].merge_country(country: @store[:country])
26
27
  mergers = country.merger
27
28
  expect(mergers[0][:targetNation]).to eq @store[:country]
@@ -30,7 +31,7 @@ describe "1.0.0" do
30
31
  it "can retrieve economic codes" do
31
32
  output = @store[:client].economic_codes(plain: true)
32
33
  expect(output.size).to be > 100
33
- @store[:economic_code] = output[0][0]
34
+ @store[:economic_code] = output[0][:code]
34
35
 
35
36
  output = @store[:client].economic_codes
36
37
  expect(output[0].class).to be Finnhub::Economic_Code
@@ -13,6 +13,7 @@ describe "1.0.0" do
13
13
  end
14
14
 
15
15
  it "can retrieve a profile" do
16
+ skip "Premium" if @skip_premium
16
17
  output = @store[:stock].profile
17
18
 
18
19
  expect(output[:ticker]).to eq "AAPL"
@@ -45,9 +46,6 @@ describe "1.0.0" do
45
46
  it "can retrieve a peers" do
46
47
  output = @store[:stock].peers(plain: true)
47
48
  expect(output).to include "AAPL"
48
-
49
- output2 = @store[:stock].peers[0].profile
50
- expect(output2[:ticker]).to eq output[0]
51
49
  end
52
50
 
53
51
  it "can retrieve a earnings" do
@@ -59,7 +57,7 @@ describe "1.0.0" do
59
57
  it "can retrieve a news" do
60
58
  output = @store[:stock].news
61
59
 
62
- expect(output[0][:related]).to eq "AAPL"
60
+ expect(output[0][:related]).to include "AAPL"
63
61
  end
64
62
 
65
63
  it "can retrieve a sentiment" do
@@ -0,0 +1,40 @@
1
+ require_relative '../spec_helper'
2
+
3
+ describe "1.2.0" do
4
+ context "Client" do
5
+ it "can retrieve information about Covid-19" do
6
+ @store[:client] = Finnhub::Client.new(key: @key, verbose: true)
7
+ output = @store[:client].covid
8
+ expect(output.size).to be >= 50
9
+ end
10
+ end
11
+
12
+ context "Stock" do
13
+ it "retrieve estimate" do
14
+ @store[:stock] = @store[:client].stock(symbol: "AAPL")
15
+ response = @store[:stock].revenue_estimate
16
+ expect(response[:symbol]).to eq "AAPL"
17
+
18
+ response = @store[:stock].earnings_estimate
19
+ expect(response[:symbol]).to eq "AAPL"
20
+
21
+ response = @store[:stock].earnings_calendar(from: Time.now-24*3600*365, to: Time.now)
22
+ expect(response[:earningsCalendar].size).to be >= 1
23
+ end
24
+
25
+ it "retrieve dividends and splits" do
26
+ response = @store[:stock].dividends(from: Time.now-24*3600*365, to: Time.now)
27
+ expect(response.size).to be >= 1
28
+
29
+ response = @store[:stock].splits(from: Time.now-10*24*3600*365, to: Time.now)
30
+ expect(response.size).to be >= 1
31
+ end
32
+
33
+ it "can use indicators" do
34
+ indicator = @store[:stock].indicator(from: Time.now-24*30*3600, to: Time.now, resolution: 60, indicator: "sma", args: {timeperiod: 3})
35
+ expect(indicator.sma.size).to be >= 1
36
+ expect(indicator.o).to eq indicator.open
37
+ expect(indicator.ciao).to eq []
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,25 @@
1
+ require_relative '../spec_helper'
2
+
3
+ describe "1.2.0" do
4
+ context "Webhook" do
5
+ it "can create webhook" do
6
+ @store[:client] = Finnhub::Client.new(key: @key, verbose: true)
7
+ @store[:webhook] = @store[:client].webhook
8
+ end
9
+
10
+ it "can add a webhook" do
11
+ @store[:webhook].create(body: {'event': 'earnings', 'symbol': 'AAPL'})
12
+ expect(@store[:webhook].id).not_to be nil
13
+ end
14
+
15
+ it "can list webhooks" do
16
+ webhooks = @store[:client].webhooks
17
+ expect(webhooks[0].id).to eq @store[:webhook].id
18
+ end
19
+
20
+ it "can delete a webhook" do
21
+ @store[:webhook].delete
22
+ expect(@store[:webhook].id).to eq nil
23
+ end
24
+ end
25
+ end
@@ -1,7 +1,7 @@
1
1
  require "rspec"
2
2
  require "pry-byebug"
3
3
  require "yaml"
4
- require_relative "../lib/finnhub"
4
+ require "finnhub"
5
5
 
6
6
  RSpec.configure do |config|
7
7
  config.color = true
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: finnhubrb
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stefano Martin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-03-05 00:00:00.000000000 Z
11
+ date: 2020-04-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: httparty
@@ -17,9 +17,6 @@ dependencies:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: 0.17.0
20
- - - "~>"
21
- - !ruby/object:Gem::Version
22
- version: 0.17.0
23
20
  type: :runtime
24
21
  prerelease: false
25
22
  version_requirements: !ruby/object:Gem::Requirement
@@ -27,9 +24,6 @@ dependencies:
27
24
  - - ">="
28
25
  - !ruby/object:Gem::Version
29
26
  version: 0.17.0
30
- - - "~>"
31
- - !ruby/object:Gem::Version
32
- version: 0.17.0
33
27
  - !ruby/object:Gem::Dependency
34
28
  name: oj
35
29
  requirement: !ruby/object:Gem::Requirement
@@ -37,9 +31,6 @@ dependencies:
37
31
  - - ">="
38
32
  - !ruby/object:Gem::Version
39
33
  version: 3.9.0
40
- - - "~>"
41
- - !ruby/object:Gem::Version
42
- version: 3.9.0
43
34
  type: :runtime
44
35
  prerelease: false
45
36
  version_requirements: !ruby/object:Gem::Requirement
@@ -47,9 +38,6 @@ dependencies:
47
38
  - - ">="
48
39
  - !ruby/object:Gem::Version
49
40
  version: 3.9.0
50
- - - "~>"
51
- - !ruby/object:Gem::Version
52
- version: 3.9.0
53
41
  - !ruby/object:Gem::Dependency
54
42
  name: faye-websocket
55
43
  requirement: !ruby/object:Gem::Requirement
@@ -57,9 +45,6 @@ dependencies:
57
45
  - - ">="
58
46
  - !ruby/object:Gem::Version
59
47
  version: 0.10.9
60
- - - "~>"
61
- - !ruby/object:Gem::Version
62
- version: 0.10.9
63
48
  type: :runtime
64
49
  prerelease: false
65
50
  version_requirements: !ruby/object:Gem::Requirement
@@ -67,21 +52,18 @@ dependencies:
67
52
  - - ">="
68
53
  - !ruby/object:Gem::Version
69
54
  version: 0.10.9
70
- - - "~>"
71
- - !ruby/object:Gem::Version
72
- version: 0.10.9
73
55
  - !ruby/object:Gem::Dependency
74
56
  name: pry-byebug
75
57
  requirement: !ruby/object:Gem::Requirement
76
58
  requirements:
77
- - - "~>"
59
+ - - ">="
78
60
  - !ruby/object:Gem::Version
79
61
  version: '0'
80
62
  type: :development
81
63
  prerelease: false
82
64
  version_requirements: !ruby/object:Gem::Requirement
83
65
  requirements:
84
- - - "~>"
66
+ - - ">="
85
67
  - !ruby/object:Gem::Version
86
68
  version: '0'
87
69
  - !ruby/object:Gem::Dependency
@@ -91,9 +73,6 @@ dependencies:
91
73
  - - ">="
92
74
  - !ruby/object:Gem::Version
93
75
  version: '3.5'
94
- - - "~>"
95
- - !ruby/object:Gem::Version
96
- version: '3.5'
97
76
  type: :development
98
77
  prerelease: false
99
78
  version_requirements: !ruby/object:Gem::Requirement
@@ -101,9 +80,6 @@ dependencies:
101
80
  - - ">="
102
81
  - !ruby/object:Gem::Version
103
82
  version: '3.5'
104
- - - "~>"
105
- - !ruby/object:Gem::Version
106
- version: '3.5'
107
83
  - !ruby/object:Gem::Dependency
108
84
  name: awesome_print
109
85
  requirement: !ruby/object:Gem::Requirement
@@ -111,9 +87,6 @@ dependencies:
111
87
  - - ">="
112
88
  - !ruby/object:Gem::Version
113
89
  version: '1.7'
114
- - - "~>"
115
- - !ruby/object:Gem::Version
116
- version: '1.7'
117
90
  type: :development
118
91
  prerelease: false
119
92
  version_requirements: !ruby/object:Gem::Requirement
@@ -121,9 +94,6 @@ dependencies:
121
94
  - - ">="
122
95
  - !ruby/object:Gem::Version
123
96
  version: '1.7'
124
- - - "~>"
125
- - !ruby/object:Gem::Version
126
- version: '1.7'
127
97
  - !ruby/object:Gem::Dependency
128
98
  name: eventmachine
129
99
  requirement: !ruby/object:Gem::Requirement
@@ -131,9 +101,6 @@ dependencies:
131
101
  - - ">="
132
102
  - !ruby/object:Gem::Version
133
103
  version: 1.2.7
134
- - - "~>"
135
- - !ruby/object:Gem::Version
136
- version: 1.2.7
137
104
  type: :development
138
105
  prerelease: false
139
106
  version_requirements: !ruby/object:Gem::Requirement
@@ -141,9 +108,6 @@ dependencies:
141
108
  - - ">="
142
109
  - !ruby/object:Gem::Version
143
110
  version: 1.2.7
144
- - - "~>"
145
- - !ruby/object:Gem::Version
146
- version: 1.2.7
147
111
  description: A ruby wrapper for Finnhub's HTTP API
148
112
  email:
149
113
  - stefano.martin87@gmail.com
@@ -163,10 +127,12 @@ files:
163
127
  - lib/Economic.rb
164
128
  - lib/Error.rb
165
129
  - lib/Forex.rb
130
+ - lib/Indicator.rb
166
131
  - lib/Stock.rb
167
132
  - lib/Tick.rb
168
133
  - lib/Timeseries.rb
169
134
  - lib/Transcript.rb
135
+ - lib/Webhook.rb
170
136
  - lib/Websocket.rb
171
137
  - lib/finnhub.rb
172
138
  - spec/1.0.0/crypto.rb
@@ -175,6 +141,8 @@ files:
175
141
  - spec/1.0.0/stock.rb
176
142
  - spec/1.0.0/websocket.rb
177
143
  - spec/1.1.0/stock.rb
144
+ - spec/1.2.0/stock.rb
145
+ - spec/1.2.0/webhook.rb
178
146
  - spec/all.rb
179
147
  - spec/config.yml
180
148
  - spec/spec_helper.rb