finnhubrb 1.0.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 +7 -0
- data/FinnhubRB.gemspec +24 -0
- data/Gemfile +12 -0
- data/LICENSE.md +21 -0
- data/README.md +237 -0
- data/lib/Analysis.rb +15 -0
- data/lib/Calendar.rb +19 -0
- data/lib/Client.rb +106 -0
- data/lib/Country.rb +17 -0
- data/lib/Crypto.rb +59 -0
- data/lib/Economic.rb +18 -0
- data/lib/Error.rb +9 -0
- data/lib/Forex.rb +59 -0
- data/lib/Stock.rb +55 -0
- data/lib/Timeseries.rb +55 -0
- data/lib/Websocket.rb +29 -0
- data/lib/finnhubrb.rb +16 -0
- data/spec/1.0.0/crypto.rb +84 -0
- data/spec/1.0.0/forex.rb +84 -0
- data/spec/1.0.0/other.rb +62 -0
- data/spec/1.0.0/stock.rb +112 -0
- data/spec/1.0.0/websocket.rb +48 -0
- data/spec/all.rb +5 -0
- data/spec/config.yml +1 -0
- data/spec/spec_helper.rb +16 -0
- data/spec/test_all.rb +5 -0
- metadata +202 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 305ff27db99c18e1a76d1034fd69b568e89b45fd8cfba42a030199b03e4ba4f2
|
4
|
+
data.tar.gz: a65a7dc065c422855d5a4a6685349c6a634be771b517586541ab90e43e1c9fde
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: c8cc6932d02616b872f2ac87737acde0ce0d4b951d72f76875edf32f4fc8e1ac37d37dc67ba59570bdd1a0d5fe4ec9463939748e6dfd8e950a6f029e94c63478
|
7
|
+
data.tar.gz: b0323e588781a3eabd6f49347f0985e51dd5d0eb872a02e07790aaa20a8407aab5adc8d5ef7d1ff477ebd134a3e9ca5dbff750c8622388b78d5e4de284f6fd6f
|
data/FinnhubRB.gemspec
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# lib = File.expand_path("../lib", __FILE__)
|
2
|
+
# $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
require "rake"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "finnhubrb"
|
7
|
+
s.version = "1.0.0"
|
8
|
+
s.authors = ["Stefano Martin"]
|
9
|
+
s.email = ["stefano.martin87@gmail.com"]
|
10
|
+
s.homepage = "https://github.com/StefanoMartin/FinnhubRB"
|
11
|
+
s.license = "MIT"
|
12
|
+
s.summary = "A gem for Alpha Vantage"
|
13
|
+
s.description = "A ruby wrapper for Finnhub's HTTP API"
|
14
|
+
s.platform = Gem::Platform::RUBY
|
15
|
+
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"
|
24
|
+
end
|
data/Gemfile
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
source "https://rubygems.org"
|
2
|
+
|
3
|
+
gem "httparty", ">= 0.17.1"
|
4
|
+
gem "oj", ">= 3.9.2"
|
5
|
+
gem "faye-websocket", ">= 0.10.9"
|
6
|
+
gem "eventmachine", "1.2.7"
|
7
|
+
|
8
|
+
group :development, :test do
|
9
|
+
gem "pry-byebug"
|
10
|
+
gem "rspec", ">= 3.5"
|
11
|
+
gem "awesome_print", ">= 1.7"
|
12
|
+
end
|
data/LICENSE.md
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
MIT License
|
2
|
+
|
3
|
+
Copyright (c) 2019 Stefano Martin
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,237 @@
|
|
1
|
+
FinnhubRB
|
2
|
+
=========================================================
|
3
|
+
|
4
|
+
[Finnhub](https://finnhub.io/) is an API for retrieving Stock
|
5
|
+
market data in JSON or CSV format.
|
6
|
+
FinnhubRB is a wrapper Gem to use Finnhub with Ruby. FinnhubRB is based
|
7
|
+
on the [HTTP API of Finnhub](https://finnhub.io/docs/api).
|
8
|
+
|
9
|
+
To install FinnhubRB: `gem install finnhubrb`
|
10
|
+
|
11
|
+
To use it in your application: `require "finnhubrb"`
|
12
|
+
|
13
|
+
## How to test
|
14
|
+
|
15
|
+
To test the Gem create a config.yml file inside the folder /spec with inside a line
|
16
|
+
|
17
|
+
``` ruby
|
18
|
+
key: [YOUR KEY]
|
19
|
+
```
|
20
|
+
|
21
|
+
Then run "rspec spec/test_all.rb".
|
22
|
+
|
23
|
+
## Support
|
24
|
+
|
25
|
+
* Without a premium account, testing is hard and I could have missed something. Any bug, suggestions and improvements are more than welcome. Please do not be shy to create issues or pull requests.
|
26
|
+
* This is a personal project, any stars for giving your support will make a man happy.
|
27
|
+
|
28
|
+
## Client
|
29
|
+
|
30
|
+
To contact Alpha Vantage you need to use a valid key that you can require from [here](https://finnhub.io/register).
|
31
|
+
|
32
|
+
To setup your clients use:
|
33
|
+
|
34
|
+
``` ruby
|
35
|
+
client = Finnhub::Client.new(key: "YOURKEY")
|
36
|
+
```
|
37
|
+
|
38
|
+
If you want to see the request that the client will do to Finnhub you can
|
39
|
+
setup verbose equal to true.
|
40
|
+
|
41
|
+
``` ruby
|
42
|
+
client.verbose = true # You can setup this during the initialization too
|
43
|
+
```
|
44
|
+
|
45
|
+
## Stock
|
46
|
+
|
47
|
+
Finnhub::Stock is used to manage a stock class.
|
48
|
+
To create a new Stock class you can use a client.
|
49
|
+
|
50
|
+
``` ruby
|
51
|
+
stock = client.stock symbol: "AAPL"
|
52
|
+
```
|
53
|
+
|
54
|
+
Several methods are available under this class:
|
55
|
+
|
56
|
+
``` ruby
|
57
|
+
stock.symbol # Return the symbol
|
58
|
+
stock.profile # Retrieve profile of the stock
|
59
|
+
stock.ceo_compensation # Retrieve compensation of the stock's CEO
|
60
|
+
stock.recommendation # Retrieve recommendation about this stock
|
61
|
+
stock.price_target # Retrieve price target about this stock
|
62
|
+
stock.option_chain # Retrieve option chain about this stock
|
63
|
+
stock.earnings # Retrieve earnings about this stock
|
64
|
+
stock.news # Retrieve news about this stock (only US)
|
65
|
+
stock.sentiment # Retrieve social sentiment about this stock (only US)
|
66
|
+
stock.peers(plain: true) # Retrieve peers company similar to the one chosen
|
67
|
+
stock.peers # Like the previous one, but the results are Finnhub::Stock instances
|
68
|
+
stock.pattern # Retrieve pattern
|
69
|
+
stock.support_resistance # Retrieve support resistance
|
70
|
+
stock.technical_indicators # Retrieve techinical indicators
|
71
|
+
```
|
72
|
+
|
73
|
+
To create a timeseries you can use:
|
74
|
+
|
75
|
+
``` ruby
|
76
|
+
stock.timeseries(count: 100) # Return the last 100 entries (default count is 100)
|
77
|
+
stock.timeseries(resolution: "D") # Resolution is daily "D", alternative are 1, 5, 15, 30, 60, D, W, M) where the numeric one are for minutes (default resolution is "D")
|
78
|
+
stock.timeseries(from: Time.now-24*30*3600, to: Time.now) # Fetch from a date to another date (default from: nil, to: nil)
|
79
|
+
stock.timeseries(format: "json") # Return the output in json or in csv (default format: "json")
|
80
|
+
```
|
81
|
+
|
82
|
+
Remember count and from/to are exclusive. If you use one, you cannot use the other two.
|
83
|
+
The methods "open", "high", "low", "close", "volume" and "status" will not work if you use format csv.
|
84
|
+
|
85
|
+
``` ruby
|
86
|
+
timeseries = stock.timeseries(from: Time.now-24*30*3600, to: Time.now, resolution: 60)
|
87
|
+
timeseries.output # Return output obtained from the request
|
88
|
+
timeseris.timestamps # Return timestamps obtained from the request
|
89
|
+
timeseries.open # Return open obtained from the request
|
90
|
+
timeseries.low # Return low obtained from the request
|
91
|
+
timeseries.close # Return close obtained from the request
|
92
|
+
timeseries.volume # Return volume obtained from the request
|
93
|
+
timeseries.status # Return status obtained from the request
|
94
|
+
```
|
95
|
+
|
96
|
+
## Crypto
|
97
|
+
|
98
|
+
To analyse a crypto currency you should start by choosing which crypto exchange you want to analyse.
|
99
|
+
|
100
|
+
``` ruby
|
101
|
+
client.crypto_exchanges # Retrieve the available crypto exchanges on Finnhub (Finnhub::Crypto_Exchange instances)
|
102
|
+
client.crypto_exchanges(plain: true) # As above, but it returns simply the output of the request
|
103
|
+
crypto_exchange = client.crypto_exchange(name: "NAME_CRYPTO_EXCHANGE") # Create a single instance of Finnhub::Crypto_Exchange
|
104
|
+
```
|
105
|
+
|
106
|
+
After that you can choose, in that crypto exchange which symbol you want to check.
|
107
|
+
|
108
|
+
``` ruby
|
109
|
+
crypto_exchange.symbols # Retrieve the available crypto symbols on the chosen crypto exchange (Finnhub::Crypto_Symbol instances)
|
110
|
+
crypto_exchange.symbols(plain: true) # As above, but it returns simply the output of the request
|
111
|
+
crypto_symbol = crypto_exchange.symbol(symbol: "BTC") # Create a single instance of Finnhub::Crypto_Symbol
|
112
|
+
```
|
113
|
+
|
114
|
+
From crypto_symbol instance you can retrieve some interesting information.
|
115
|
+
|
116
|
+
``` ruby
|
117
|
+
crypto_symbol.exchange # Exchange of the crypto_symbol
|
118
|
+
crypto_symbol.hasWM # If it has week and month
|
119
|
+
crypto_symbol.displaySymbol # Displayed symbol
|
120
|
+
crypto_symbol.symbol # Symbol of the crypto currency
|
121
|
+
```
|
122
|
+
|
123
|
+
Furthermore you can create a timeseries with the same logic used for Stock timeseries.
|
124
|
+
|
125
|
+
``` ruby
|
126
|
+
timeseries = crypto_symbol.timeseries(from: Time.now-24*30*3600, to: Time.now, resolution: 60)
|
127
|
+
timeseries.output # Return output obtained from the request
|
128
|
+
timeseris.timestamps # Return timestamps obtained from the request
|
129
|
+
timeseries.open # Return open obtained from the request
|
130
|
+
timeseries.low # Return low obtained from the request
|
131
|
+
timeseries.close # Return close obtained from the request
|
132
|
+
timeseries.volume # Return volume obtained from the request
|
133
|
+
timeseries.status # Return status obtained from the request
|
134
|
+
```
|
135
|
+
|
136
|
+
## Forex
|
137
|
+
|
138
|
+
To analyse a forex exchange you should start by choosing which forex exchange you want to analyse.
|
139
|
+
|
140
|
+
``` ruby
|
141
|
+
client.forex_exchanges # Retrieve the available forex exchanges on Finnhub (Finnhub::Forex_Exchange instances)
|
142
|
+
client.forex_exchanges(plain: true) # As above, but it returns simply the output of the request
|
143
|
+
forex_exchange = client.forex_exchange(name: "NAME_FOREX_EXCHANGE") # Create a single instance of Finnhub::Forex_Exchange
|
144
|
+
```
|
145
|
+
|
146
|
+
After that you can choose, in that forex exchange which symbol you want to check.
|
147
|
+
|
148
|
+
``` ruby
|
149
|
+
forex_exchange.symbols # Retrieve the available forex symbols on the chosen forex exchange (Finnhub::Forex_Symbol instances)
|
150
|
+
forex_exchange.symbols(plain: true) # As above, but it returns simply the output of the request
|
151
|
+
forex_symbol = forex_exchange.symbol(symbol: "USD") # Create a single instance of Finnhub::Forex_Symbol
|
152
|
+
```
|
153
|
+
|
154
|
+
From forex_symbol instance you can retrieve some interesting information.
|
155
|
+
|
156
|
+
``` ruby
|
157
|
+
forex_symbol.exchange # Exchange of the crypto_symbol
|
158
|
+
forex_symbol.hasWM # If it has week and month
|
159
|
+
forex_symbol.displaySymbol # Displayed symbol
|
160
|
+
forex_symbol.symbol # Symbol of the crypto currency
|
161
|
+
```
|
162
|
+
|
163
|
+
Furthermore you can create a timeseries with the same logic used for Stock timeseries.
|
164
|
+
|
165
|
+
``` ruby
|
166
|
+
timeseries = forex_symbol.timeseries(from: Time.now-24*30*3600, to: Time.now, resolution: 60)
|
167
|
+
timeseries.output # Return output obtained from the request
|
168
|
+
timeseris.timestamps # Return timestamps obtained from the request
|
169
|
+
timeseries.open # Return open obtained from the request
|
170
|
+
timeseries.low # Return low obtained from the request
|
171
|
+
timeseries.close # Return close obtained from the request
|
172
|
+
timeseries.volume # Return volume obtained from the request
|
173
|
+
timeseries.status # Return status obtained from the request
|
174
|
+
```
|
175
|
+
|
176
|
+
## Merge
|
177
|
+
|
178
|
+
You can retrieve information about company that are merging in relation of a given country.
|
179
|
+
|
180
|
+
``` ruby
|
181
|
+
client.merge_countries # Retrieve the available merge countries on Finnhub (Finnhub::Merge_Country instances)
|
182
|
+
client.merge_countries(plain: true) # As above, but it returns simply the output of the request
|
183
|
+
country = client.merge_country(country: "France") # Create a single instance of Finnhub::Merge_Country
|
184
|
+
country.merger # Fetch information about the company that are going to merge
|
185
|
+
```
|
186
|
+
|
187
|
+
## Economic Code
|
188
|
+
|
189
|
+
You can retrieve information about economic_codes.
|
190
|
+
|
191
|
+
``` ruby
|
192
|
+
client.economic_codes # Retrieve the available economic_codes on Finnhub (Finnhub::Economic_Code instances)
|
193
|
+
client.economic_codes(plain: true) # As above, but it returns simply the output of the request
|
194
|
+
economic = client.economic_code(code: "CODE") # Create a single instance of Finnhub::Economic_Code
|
195
|
+
economic.data # Data of economic_code
|
196
|
+
economic.data(plaint: true) # As above, but it returns simply the output of the request
|
197
|
+
```
|
198
|
+
|
199
|
+
## News and calendar
|
200
|
+
|
201
|
+
You can retrieve news and calendar in the following way.
|
202
|
+
|
203
|
+
``` ruby
|
204
|
+
client.news(category: "forex") # Retrieve news by category (general, forex, crypto, merger) and by minId (default 0)
|
205
|
+
client.economic_calendar # Retrieve economic calendar
|
206
|
+
client.earnings_calendar # Retrieve earning calendar
|
207
|
+
client.ipo_calendar # Retrieve IPO calendar
|
208
|
+
client.ico_calendar # Retrieve ICO calendar
|
209
|
+
```
|
210
|
+
|
211
|
+
## Websocket
|
212
|
+
|
213
|
+
Here an example of how to create websocket.
|
214
|
+
|
215
|
+
``` ruby
|
216
|
+
Thread.new do
|
217
|
+
EM.run do
|
218
|
+
websocket = client.websocket # Create websocket
|
219
|
+
websocket.on :message do |event|
|
220
|
+
result = event.data # Result is not parsed
|
221
|
+
end
|
222
|
+
websocket.on :close do |event|
|
223
|
+
result = [:close, event.code, event.reason]
|
224
|
+
websocket = nil
|
225
|
+
end
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
229
|
+
websocket.subscribe("AAPL") # Subscribe to a stock
|
230
|
+
websocket.unsubscribe("AAPL") # Unubscribe to a stock
|
231
|
+
```
|
232
|
+
|
233
|
+
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.
|
234
|
+
|
235
|
+
## Errors
|
236
|
+
|
237
|
+
Error from FinnhubRB are returned under Finnhub::Error exception. You can use e.code to retrieve the code returned to a not successful request.
|
data/lib/Analysis.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
module Finnhub
|
2
|
+
module Analysis
|
3
|
+
def pattern(resolution: "D")
|
4
|
+
@client.request("/scan/pattern?symbol=#{@symbol}&resolution=#{resolution}")
|
5
|
+
end
|
6
|
+
|
7
|
+
def support_resistance(resolution: "D")
|
8
|
+
@client.request("/scan/support-resistance?symbol=#{@symbol}&resolution=#{resolution}")
|
9
|
+
end
|
10
|
+
|
11
|
+
def technical_indicators(resolution: "D")
|
12
|
+
@client.request("/scan/technical-indicator?symbol=#{@symbol}&resolution=#{resolution}")
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/lib/Calendar.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
module Finnhub
|
2
|
+
module Calendar
|
3
|
+
def economic_calendar
|
4
|
+
request("/calendar/economic")
|
5
|
+
end
|
6
|
+
|
7
|
+
def earnings_calendar
|
8
|
+
request("/calendar/earnings")
|
9
|
+
end
|
10
|
+
|
11
|
+
def ipo_calendar
|
12
|
+
request("/calendar/ipo")
|
13
|
+
end
|
14
|
+
|
15
|
+
def ico_calendar
|
16
|
+
request("/calendar/ico")
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/Client.rb
ADDED
@@ -0,0 +1,106 @@
|
|
1
|
+
module Finnhub
|
2
|
+
class Client
|
3
|
+
include Calendar
|
4
|
+
|
5
|
+
BASE_URI = 'https://finnhub.io/api/v1'
|
6
|
+
|
7
|
+
def initialize(key:, verbose: false)
|
8
|
+
@apikey = key
|
9
|
+
@verbose = verbose
|
10
|
+
end
|
11
|
+
|
12
|
+
attr_accessor :verbose
|
13
|
+
attr_reader :apikey
|
14
|
+
|
15
|
+
def request(url)
|
16
|
+
send_url = "#{BASE_URI}#{url}"
|
17
|
+
send_url += send_url.include?("?") ? "&" : "?"
|
18
|
+
send_url += "token=#{@apikey}"
|
19
|
+
|
20
|
+
puts "\nGET #{send_url}\n" if @verbose
|
21
|
+
response = HTTParty.get(send_url)
|
22
|
+
if @verbose
|
23
|
+
puts "\nCODE: #{response.code}\n"
|
24
|
+
puts "OUTPUT: #{response.body}\n"
|
25
|
+
end
|
26
|
+
|
27
|
+
if response.code == 200
|
28
|
+
data = response.body
|
29
|
+
if data[0] == "[" || data[0] == "{"
|
30
|
+
data = Oj.load(data, symbol_keys: true)
|
31
|
+
return data
|
32
|
+
elsif data.include?("\n")
|
33
|
+
return data
|
34
|
+
else
|
35
|
+
raise Finnhub::Error.new message: data, code: response.code
|
36
|
+
end
|
37
|
+
else
|
38
|
+
raise Finnhub::Error.new message: data, code: response.code
|
39
|
+
end
|
40
|
+
|
41
|
+
rescue Finnhub::Error => e
|
42
|
+
raise e
|
43
|
+
rescue StandardError => e
|
44
|
+
raise Finnhub::Error.new message: "Failed request: #{e.message}"
|
45
|
+
end
|
46
|
+
|
47
|
+
def websocket
|
48
|
+
Finnhub::Websocket.new(@apikey)
|
49
|
+
end
|
50
|
+
|
51
|
+
def stock(symbol:)
|
52
|
+
Finnhub::Stock.new(client: self, symbol: symbol)
|
53
|
+
end
|
54
|
+
|
55
|
+
def forex_exchanges(plain: false)
|
56
|
+
output = request("/forex/exchange")
|
57
|
+
return output if plain
|
58
|
+
|
59
|
+
output.map{|o| Finnhub::Forex_Exchange.new(client: self, name: o)}
|
60
|
+
end
|
61
|
+
|
62
|
+
def forex_exchange(name:)
|
63
|
+
Finnhub::Forex_Exchange.new(client: self, name: name)
|
64
|
+
end
|
65
|
+
|
66
|
+
def crypto_exchanges(plain: false)
|
67
|
+
output = request("/crypto/exchange")
|
68
|
+
return output if plain
|
69
|
+
|
70
|
+
output.map{|o| Finnhub::Crypto_Exchange.new(client: self, name: o)}
|
71
|
+
end
|
72
|
+
|
73
|
+
def crypto_exchange(name:)
|
74
|
+
Finnhub::Crypto_Exchange.new(client: self, name: name)
|
75
|
+
end
|
76
|
+
|
77
|
+
def news(category: "general", minId: nil)
|
78
|
+
url = "/news?category=#{category}"
|
79
|
+
url += "&minId=#{minId}" unless minId.nil?
|
80
|
+
request(url)
|
81
|
+
end
|
82
|
+
|
83
|
+
def merge_countries(plain: false)
|
84
|
+
output = request("/merger/country")
|
85
|
+
return output if plain
|
86
|
+
|
87
|
+
output.map{|o| Finnhub::Merge_Country.new(client: self, country: o)}
|
88
|
+
end
|
89
|
+
|
90
|
+
def merge_country(country:)
|
91
|
+
Finnhub::Merge_Country.new(client: self, country: country)
|
92
|
+
end
|
93
|
+
|
94
|
+
def economic_codes(plain: false)
|
95
|
+
output = request("/economic/code")
|
96
|
+
return output if plain
|
97
|
+
|
98
|
+
output.map{|o| Finnhub::Economic_Code.new(client: self, code: o[0], description: o[1])}
|
99
|
+
end
|
100
|
+
|
101
|
+
def economic_code(code:, description: nil)
|
102
|
+
Finnhub::Economic_Code.new(client: self, code: code,
|
103
|
+
description: description)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|