alphavantagerb 1.2.0 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -94,8 +94,8 @@ module Alphavantage
94
94
  url += return_int_val(maximum, "maximum", "float")
95
95
  end
96
96
 
97
- @hash = @client.request(url)
98
- metadata = @hash.dig("Meta Data") || {}
97
+ @output = @client.request(url)
98
+ metadata = @output.dig("Meta Data") || {}
99
99
  metadata.each do |key, val|
100
100
  key_sym = recreate_metadata_key(key)
101
101
  define_singleton_method(key_sym) do
@@ -104,10 +104,10 @@ module Alphavantage
104
104
  end
105
105
 
106
106
  begin
107
- time_series = @hash.find{|key, val| key.include?("Technical Analysis")}[1]
107
+ time_series = @output.find{|key, val| key.include?("Technical Analysis")}[1]
108
108
  rescue Exception => e
109
109
  raise Alphavantage::Error.new message: "No Time Series found: #{e.message}",
110
- data: @hash
110
+ data: @output
111
111
  end
112
112
 
113
113
  series = {}
@@ -130,6 +130,6 @@ module Alphavantage
130
130
  end
131
131
  end
132
132
 
133
- attr_reader :hash
133
+ attr_reader :output
134
134
  end
135
135
  end
@@ -5,15 +5,15 @@ module Alphavantage
5
5
  def initialize key:, verbose: false
6
6
  check_argument([true, false], verbose, "verbose")
7
7
  @client = return_client(key, verbose)
8
- @hash = @client.request("function=SECTOR")
9
- metadata = @hash.dig("Meta Data") || {}
8
+ @output = @client.request("function=SECTOR")
9
+ metadata = @output.dig("Meta Data") || {}
10
10
  metadata.each do |key, val|
11
11
  key_sym = key.downcase.gsub(/[0-9.]/, "").lstrip.gsub(" ", "_").to_sym
12
12
  define_singleton_method(key_sym) do
13
13
  return val
14
14
  end
15
15
  end
16
- @hash.each do |key, val|
16
+ @output.each do |key, val|
17
17
  next if key == "Meta Data"
18
18
  key = key.split(":")[1].lstrip
19
19
  key = key.split(" ")
@@ -29,6 +29,6 @@ module Alphavantage
29
29
  end
30
30
  end
31
31
 
32
- attr_reader :hash
32
+ attr_reader :output
33
33
  end
34
34
  end
@@ -1,8 +1,7 @@
1
1
  module Alphavantage
2
2
  class Stock
3
3
  include HelperFunctions
4
-
5
- def initialize symbol:, datatype: "json", key:, verbose: false
4
+ def initialize symbol:, datatype: "json", key:, verbose: false
6
5
  check_argument([true, false], verbose, "verbose")
7
6
  @client = return_client(key, verbose)
8
7
  @symbol = symbol
@@ -17,6 +16,13 @@ module Alphavantage
17
16
  @datatype = datatype
18
17
  end
19
18
 
19
+ def quote file: nil, datatype: @datatype
20
+ check_datatype(datatype, file)
21
+ url = "function=GLOBAL_QUOTE&symbol=#{symbol}"
22
+ return @client.download(url, file) if datatype == "csv"
23
+ return open_struct(url, "Global Quote")
24
+ end
25
+
20
26
  def timeseries type: "daily", interval: nil, outputsize: "compact",
21
27
  file: nil, datatype: @datatype, adjusted: false
22
28
  Alphavantage::Timeseries.new type: type, interval: interval,
@@ -18,17 +18,14 @@ module Alphavantage
18
18
  end
19
19
  check_argument(["compact", "full"], outputsize, "outputsize")
20
20
  check_argument(["json", "csv"], datatype, "datatype")
21
- if datatype == "csv" && file.nil?
22
- raise Alphavantage::Error.new message: "No file specified where to save the CSV ata"
23
- elsif datatype != "csv" && !file.nil?
24
- raise Alphavantage::Error.new message: "Hash error: No file necessary"
25
- end
21
+ check_datatype(datatype, file)
26
22
 
27
- @selected_time_series = which_series(type, adjusted)
23
+ @selected_time_series = which_series(type, "TIME_SERIES",
24
+ adjusted: adjusted)
28
25
  url = "function=#{@selected_time_series}&symbol=#{symbol}#{interval}&outputsize=#{outputsize}"
29
26
  return @client.download(url, file) if datatype == "csv"
30
- @hash = @client.request(url)
31
- metadata = @hash.dig("Meta Data") || {}
27
+ @output = @client.request(url)
28
+ metadata = @output.dig("Meta Data") || {}
32
29
  metadata.each do |key, val|
33
30
  key_sym = recreate_metadata_key(key)
34
31
  define_singleton_method(key_sym) do
@@ -37,10 +34,10 @@ module Alphavantage
37
34
  end
38
35
 
39
36
  begin
40
- time_series = @hash.find{|key, val| key.include?("Time Series")}[1]
37
+ time_series = @output.find{|key, val| key.include?("Time Series")}[1]
41
38
  rescue Exception => e
42
39
  raise Alphavantage::Error.new message: "No Time Series found: #{e.message}",
43
- data: @hash
40
+ data: @output
44
41
  end
45
42
 
46
43
  series = {}
@@ -63,14 +60,6 @@ module Alphavantage
63
60
  end
64
61
  end
65
62
 
66
- attr_reader :hash
67
-
68
- def which_series(type, adjusted)
69
- check_argument(["intraday", "daily", "weekly", "monthly"], type, "type")
70
- series = "TIME_SERIES_"
71
- series += type.upcase
72
- series += "_ADJUSTED" if adjusted
73
- return series
74
- end
63
+ attr_reader :output
75
64
  end
76
65
  end
@@ -1,14 +1,15 @@
1
1
  require "httparty"
2
2
  require "humanize"
3
3
  require "open-uri"
4
+ require "ostruct"
4
5
  require_relative "helper_function"
5
6
  require_relative "Timeseries"
6
7
  require_relative "Indicator"
7
8
  require_relative "Stock"
8
9
  require_relative "Errors"
9
10
  require_relative "Exchange"
11
+ require_relative "Exchange_Timeseries"
10
12
  require_relative "Crypto"
11
13
  require_relative "Crypto_Timeseries"
12
14
  require_relative "Sector"
13
15
  require_relative "Client"
14
- require_relative "Batch"
@@ -11,6 +11,25 @@ module HelperFunctions
11
11
  end
12
12
  end
13
13
 
14
+ def check_datatype(datatype, file)
15
+ if datatype == "csv" && file.nil?
16
+ raise Alphavantage::Error.new message: "No file specified where to save the CSV ata"
17
+ elsif datatype != "csv" && !file.nil?
18
+ raise Alphavantage::Error.new message: "Hash error: No file necessary"
19
+ end
20
+ end
21
+
22
+ def open_struct(url, type)
23
+ output = OpenStruct.new
24
+ output.output = @client.request(url)
25
+ global_quote = output.output.dig(type) || {}
26
+ global_quote.each do |key, val|
27
+ key_sym = recreate_metadata_key(key)
28
+ output[key_sym] = val
29
+ end
30
+ return output
31
+ end
32
+
14
33
  def return_matype(val, val_string)
15
34
  check_argument(["0", "1", "2", "3", "4", "5", "6", "7", "8", "SMA", "EMA", "WMA", "DEMA", "TEMA", "TRIMA", "T3", "KAMA", "MAMA"], val, "ma_type")
16
35
  hash = {"SMA" => "0", "EMA" => "1", "WMA" => "2", "DEMA" => "3",
@@ -69,4 +88,12 @@ module HelperFunctions
69
88
  key_sym = key_sym.to_sym
70
89
  return key_sym
71
90
  end
91
+
92
+ def which_series(type, name_series, adjusted: false)
93
+ check_argument(["intraday", "daily", "weekly", "monthly"], type, "type")
94
+ series = "#{name_series}_"
95
+ series += type.upcase
96
+ series += "_ADJUSTED" if adjusted
97
+ return series
98
+ end
72
99
  end
@@ -26,8 +26,13 @@ describe Alphavantage::Client do
26
26
  expect(stock.class).to eq Alphavantage::Stock
27
27
  end
28
28
 
29
+ it "can search a new stock from client" do
30
+ search = @client.search keywords: "MSFT"
31
+ expect(search.stocks[0].stock.class).to eq Alphavantage::Stock
32
+ end
33
+
29
34
  it "can create a new exchange from client" do
30
- sleep(1); exchange = @client.exchange from: "USD", to: "DKK"
35
+ exchange = @client.exchange from: "USD", to: "DKK"
31
36
  expect(exchange.class).to eq Alphavantage::Exchange
32
37
  end
33
38
 
@@ -37,7 +42,7 @@ describe Alphavantage::Client do
37
42
  end
38
43
 
39
44
  it "can create a new sector from client" do
40
- sleep(1); sector = @client.sector
45
+ sector = @client.sector
41
46
  expect(sector.class).to eq Alphavantage::Sector
42
47
  end
43
48
  end
@@ -3,17 +3,17 @@ require_relative './../../spec_helper'
3
3
  describe Alphavantage::Crypto_Timeseries do
4
4
  context "#new" do
5
5
  it "create a new timeseries without stock" do
6
- sleep(1); stock = Alphavantage::Crypto_Timeseries.new symbol: "BTC", key: @config["key"], verbose: false, market: "DKK", type: "daily"
6
+ stock = Alphavantage::Crypto_Timeseries.new symbol: "BTC", key: @config["key"], verbose: false, market: "DKK", type: "daily"
7
7
  expect(stock.class).to eq Alphavantage::Crypto_Timeseries
8
8
  end
9
9
 
10
10
  it "create a new stock from stock" do
11
- sleep(1); timeseries = @client.crypto(symbol: "BTC", market: "DKK").timeseries(type: "monthly")
11
+ timeseries = @client.crypto(symbol: "BTC", market: "DKK").timeseries(type: "monthly")
12
12
  expect(timeseries.class).to eq Alphavantage::Crypto_Timeseries
13
13
  end
14
14
 
15
15
  it "own multiple data" do
16
- sleep(1); timeseries = @client.crypto(symbol: "BTC", market: "DKK").timeseries(type: "monthly")
16
+ timeseries = @client.crypto(symbol: "BTC", market: "DKK").timeseries(type: "monthly")
17
17
  bool = []
18
18
  bool << timeseries.information.is_a?(String)
19
19
  bool << (timeseries.digital_currency_code == "BTC")
@@ -22,7 +22,7 @@ describe Alphavantage::Crypto_Timeseries do
22
22
  bool << timeseries.market_name.is_a?(String)
23
23
  bool << timeseries.last_refreshed.is_a?(String)
24
24
  bool << timeseries.time_zone.is_a?(String)
25
- bool << timeseries.hash.is_a?(Hash)
25
+ bool << timeseries.output.is_a?(Hash)
26
26
  bool << timeseries.open.is_a?(Array)
27
27
  bool << timeseries.high.is_a?(Array)
28
28
  bool << timeseries.low.is_a?(Array)
@@ -39,7 +39,7 @@ describe Alphavantage::Crypto_Timeseries do
39
39
  # it "cannot retrieve with wrong key" do
40
40
  # error = false
41
41
  # begin
42
- # sleep(1); stock = Alphavantage::Crypto_Timeseries.new symbol: "BTC", key: "wrong_key", market: "DKK"
42
+ # stock = Alphavantage::Crypto_Timeseries.new symbol: "BTC", key: "wrong_key", market: "DKK"
43
43
  # rescue Alphavantage::Error => e
44
44
  # error = true
45
45
  # end
@@ -49,7 +49,7 @@ describe Alphavantage::Crypto_Timeseries do
49
49
  it "cannot retrieve with wrong symbol" do
50
50
  error = false
51
51
  begin
52
- sleep(1); stock = Alphavantage::Crypto_Timeseries.new symbol: "wrong_symbol", key: @config["key"], market: "DKK", type: "daily"
52
+ stock = Alphavantage::Crypto_Timeseries.new symbol: "wrong_symbol", key: @config["key"], market: "DKK", type: "daily"
53
53
  rescue Alphavantage::Error => e
54
54
  error = true
55
55
  end
@@ -3,17 +3,17 @@ require_relative './../../spec_helper'
3
3
  describe Alphavantage::Exchange do
4
4
  context "#new" do
5
5
  it "create a new exchange without client" do
6
- sleep(1); exchange = Alphavantage::Exchange.new from: "USD", to: "DKK", key: @config["key"]
6
+ exchange = Alphavantage::Exchange.new from: "USD", to: "DKK", key: @config["key"]
7
7
  expect(exchange.class).to eq Alphavantage::Exchange
8
8
  end
9
9
 
10
10
  it "create a new exchange with client" do
11
- sleep(1); exchange = @client.exchange from: "USD", to: "DKK"
11
+ exchange = @client.exchange from: "USD", to: "DKK"
12
12
  expect(exchange.class).to eq Alphavantage::Exchange
13
13
  end
14
14
 
15
15
  it "has several parameters" do
16
- sleep(1); exchange = @client.exchange from: "USD", to: "DKK"
16
+ exchange = @client.exchange(from: "USD", to: "DKK").now
17
17
  bool = []
18
18
  bool << (exchange.from_currency_code == "USD")
19
19
  bool << exchange.from_currency_name.is_a?(String)
@@ -22,14 +22,14 @@ describe Alphavantage::Exchange do
22
22
  bool << exchange.exchange_rate.is_a?(String)
23
23
  bool << exchange.last_refreshed.is_a?(String)
24
24
  bool << exchange.time_zone.is_a?(String)
25
- bool << exchange.hash.is_a?(Hash)
25
+ bool << exchange.output.is_a?(Hash)
26
26
  expect(bool.all?{|e| e}).to eq true
27
27
  end
28
28
 
29
29
  # it "cannot retrieve with wrong key" do
30
30
  # error = false
31
31
  # begin
32
- # sleep(1); stock = Alphavantage::Exchange.new from: "USD", to: "DKK", key:"wrong_key"
32
+ # stock = Alphavantage::Exchange.new from: "USD", to: "DKK", key:"wrong_key"
33
33
  # rescue Alphavantage::Error => e
34
34
  # error = true
35
35
  # end
@@ -39,7 +39,9 @@ describe Alphavantage::Exchange do
39
39
  it "cannot retrieve with wrong symbol" do
40
40
  error = false
41
41
  begin
42
- sleep(1); stock = Alphavantage::Exchange.new from: "wrong_from", to: "DKK", key: @config["key"]
42
+ stock = Alphavantage::Exchange.new from: "wrong_from",
43
+ to: "DKK", key: @config["key"]
44
+ stock.now
43
45
  rescue Alphavantage::Error => e
44
46
  error = true
45
47
  end
@@ -0,0 +1,73 @@
1
+ require_relative './../../spec_helper'
2
+
3
+ describe Alphavantage::Stock do
4
+ context "#new" do
5
+ it "create a new timeseries without stock" do
6
+ stock = Alphavantage::Exchange_Timeseries.new from: "USD", to: "DKK", key: @config["key"], verbose: false
7
+ expect(stock.class).to eq Alphavantage::Exchange_Timeseries
8
+ end
9
+
10
+ it "create a new stock from stock" do
11
+ timeseries = @client.exchange(from: "USD", to: "DKK").timeseries(type: "daily", outputsize: "compact")
12
+ expect(timeseries.class).to eq Alphavantage::Exchange_Timeseries
13
+ end
14
+
15
+ it "own multiple data" do
16
+ timeseries = @client.exchange(from: "USD", to: "DKK").timeseries(type: "daily", outputsize: "full")
17
+ bool = []
18
+ bool << timeseries.information.is_a?(String)
19
+ bool << (timeseries.from_symbol == "USD")
20
+ bool << (timeseries.to_symbol == "DKK")
21
+ bool << timeseries.last_refreshed.is_a?(String)
22
+ bool << (timeseries.output_size == "Full size")
23
+ bool << timeseries.time_zone.is_a?(String)
24
+ bool << timeseries.output.is_a?(Hash)
25
+ bool << timeseries.open.is_a?(Array)
26
+ bool << timeseries.high.is_a?(Array)
27
+ bool << timeseries.low.is_a?(Array)
28
+ bool << timeseries.close.is_a?(Array)
29
+ expect(bool.all?{|e| e}).to eq true
30
+ end
31
+
32
+ it "can retrieve intraday" do
33
+ timeseries = @client.exchange(from: "USD", to: "DKK").timeseries(type: "intraday", interval: "30min")
34
+ bool = []
35
+ bool << timeseries.information.is_a?(String)
36
+ bool << (timeseries.from_symbol == "USD")
37
+ bool << (timeseries.to_symbol == "DKK")
38
+ bool << timeseries.last_refreshed.is_a?(String)
39
+ bool << (timeseries.interval == "30min")
40
+ bool << (timeseries.output_size == "Compact")
41
+ bool << timeseries.time_zone.is_a?(String)
42
+ bool << timeseries.output.is_a?(Hash)
43
+ bool << timeseries.open.is_a?(Array)
44
+ bool << timeseries.high.is_a?(Array)
45
+ bool << timeseries.low.is_a?(Array)
46
+ bool << timeseries.close.is_a?(Array)
47
+ expect(bool.all?{|e| e}).to eq true
48
+ end
49
+
50
+ it "can retrieve csv files" do
51
+ bool = []
52
+ directory = "#{__dir__}/test.csv"
53
+ bool << File.exists?(directory)
54
+ sleep(1);
55
+ @client.exchange(from: "USD", to: "DKK").timeseries(type: "intraday", interval: "30min",
56
+ datatype: "csv", file: directory)
57
+ bool << File.exists?(directory)
58
+ File.delete(directory)
59
+ expect(bool).to eq [false, true]
60
+ end
61
+
62
+ it "cannot retrieve with wrong symbol" do
63
+ error = false
64
+ begin
65
+ stock = Alphavantage::Exchange_Timeseries.new from: "wrong_symbol",
66
+ to: "USD", key: @config["key"]
67
+ rescue Alphavantage::Error => e
68
+ error = true
69
+ end
70
+ expect(error).to eq true
71
+ end
72
+ end
73
+ end
@@ -3,18 +3,18 @@
3
3
  describe Alphavantage::Indicator do
4
4
  context "#new" do
5
5
  it "create a new indicator without stock" do
6
- sleep(1); indicator = Alphavantage::Indicator.new function: "SMA", symbol: "MSFT", key: @config["key"], verbose: false
6
+ indicator = Alphavantage::Indicator.new function: "SMA", symbol: "MSFT", key: @config["key"], verbose: false
7
7
  expect(indicator.class).to eq Alphavantage::Indicator
8
8
  end
9
9
 
10
10
  it "create a new stock from stock" do
11
- sleep(1); indicator = @client.stock(symbol: "MSFT").indicator(function: "SMA")
11
+ indicator = @client.stock(symbol: "MSFT").indicator(function: "SMA")
12
12
  expect(indicator.class).to eq Alphavantage::Indicator
13
13
  end
14
14
 
15
15
  it "can be indicator SMA" do
16
16
  bool = []
17
- sleep(1); indicator = @stock.indicator(function: "SMA", interval: "weekly", time_period: "60", series_type: "close")
17
+ indicator = @stock.indicator(function: "SMA", interval: "weekly", time_period: "60", series_type: "close")
18
18
  bool << (indicator.symbol == "MSFT")
19
19
  bool << indicator.indicator.is_a?(String)
20
20
  bool << indicator.last_refreshed.is_a?(String)
@@ -28,7 +28,7 @@ describe Alphavantage::Indicator do
28
28
 
29
29
  it "can be indicator EMA" do
30
30
  bool = []
31
- sleep(1); indicator = @stock.indicator(function: "EMA", interval: "weekly", time_period: "60", series_type: "close")
31
+ indicator = @stock.indicator(function: "EMA", interval: "weekly", time_period: "60", series_type: "close")
32
32
  bool << (indicator.symbol == "MSFT")
33
33
  bool << indicator.indicator.is_a?(String)
34
34
  bool << indicator.last_refreshed.is_a?(String)
@@ -41,7 +41,7 @@ describe Alphavantage::Indicator do
41
41
 
42
42
  it "can be indicator WMA" do
43
43
  bool = []
44
- sleep(1); indicator = @stock.indicator(function: "WMA", interval: "weekly", time_period: "60", series_type: "close")
44
+ indicator = @stock.indicator(function: "WMA", interval: "weekly", time_period: "60", series_type: "close")
45
45
  bool << (indicator.symbol == "MSFT")
46
46
  bool << indicator.indicator.is_a?(String)
47
47
  bool << indicator.last_refreshed.is_a?(String)
@@ -54,7 +54,7 @@ describe Alphavantage::Indicator do
54
54
 
55
55
  it "can be indicator DEMA" do
56
56
  bool = []
57
- sleep(1); indicator = @stock.indicator(function: "DEMA", interval: "weekly", time_period: "60", series_type: "close")
57
+ indicator = @stock.indicator(function: "DEMA", interval: "weekly", time_period: "60", series_type: "close")
58
58
  bool << (indicator.symbol == "MSFT")
59
59
  bool << indicator.indicator.is_a?(String)
60
60
  bool << indicator.last_refreshed.is_a?(String)
@@ -67,7 +67,7 @@ describe Alphavantage::Indicator do
67
67
 
68
68
  it "can be indicator TEMA" do
69
69
  bool = []
70
- sleep(1); indicator = @stock.indicator(function: "TEMA", interval: "weekly", time_period: "60", series_type: "close")
70
+ indicator = @stock.indicator(function: "TEMA", interval: "weekly", time_period: "60", series_type: "close")
71
71
  bool << (indicator.symbol == "MSFT")
72
72
  bool << indicator.indicator.is_a?(String)
73
73
  bool << indicator.last_refreshed.is_a?(String)
@@ -80,7 +80,7 @@ describe Alphavantage::Indicator do
80
80
 
81
81
  it "can be indicator TRIMA" do
82
82
  bool = []
83
- sleep(1); indicator = @stock.indicator(function: "TRIMA", interval: "weekly", time_period: "60", series_type: "close")
83
+ indicator = @stock.indicator(function: "TRIMA", interval: "weekly", time_period: "60", series_type: "close")
84
84
  bool << (indicator.symbol == "MSFT")
85
85
  bool << indicator.indicator.is_a?(String)
86
86
  bool << indicator.last_refreshed.is_a?(String)
@@ -93,7 +93,7 @@ describe Alphavantage::Indicator do
93
93
 
94
94
  it "can be indicator KAMA" do
95
95
  bool = []
96
- sleep(1); indicator = @stock.indicator(function: "KAMA", interval: "weekly", time_period: "60", series_type: "close")
96
+ indicator = @stock.indicator(function: "KAMA", interval: "weekly", time_period: "60", series_type: "close")
97
97
  bool << (indicator.symbol == "MSFT")
98
98
  bool << indicator.indicator.is_a?(String)
99
99
  bool << indicator.last_refreshed.is_a?(String)
@@ -106,7 +106,7 @@ describe Alphavantage::Indicator do
106
106
 
107
107
  it "can be indicator MAMA" do
108
108
  bool = []
109
- sleep(1); indicator = @stock.indicator(function: "MAMA", interval: "weekly", series_type: "close", fastlimit: "0.02", slowlimit: "0.01")
109
+ indicator = @stock.indicator(function: "MAMA", interval: "weekly", series_type: "close", fastlimit: "0.02", slowlimit: "0.01")
110
110
  bool << (indicator.symbol == "MSFT")
111
111
  bool << indicator.indicator.is_a?(String)
112
112
  bool << indicator.last_refreshed.is_a?(String)
@@ -122,7 +122,7 @@ describe Alphavantage::Indicator do
122
122
 
123
123
  it "can be indicator T3" do
124
124
  bool = []
125
- sleep(1); indicator = @stock.indicator(function: "T3", interval: "weekly", time_period: "60", series_type: "close")
125
+ indicator = @stock.indicator(function: "T3", interval: "weekly", time_period: "60", series_type: "close")
126
126
  bool << (indicator.symbol == "MSFT")
127
127
  bool << indicator.indicator.is_a?(String)
128
128
  bool << indicator.last_refreshed.is_a?(String)
@@ -136,7 +136,7 @@ describe Alphavantage::Indicator do
136
136
 
137
137
  it "can be indicator MACD" do
138
138
  bool = []
139
- sleep(1); indicator = @stock.indicator(function: "MACD", interval: "weekly", time_period: "60", series_type: "close", fastperiod: "12", slowperiod: "26", signalperiod: "9")
139
+ indicator = @stock.indicator(function: "MACD", interval: "weekly", time_period: "60", series_type: "close", fastperiod: "12", slowperiod: "26", signalperiod: "9")
140
140
  bool << (indicator.symbol == "MSFT")
141
141
  bool << indicator.indicator.is_a?(String)
142
142
  bool << indicator.last_refreshed.is_a?(String)
@@ -154,7 +154,7 @@ describe Alphavantage::Indicator do
154
154
 
155
155
  it "can be indicator MACDEXT" do
156
156
  bool = []
157
- sleep(1); indicator = @stock.indicator(function: "MACDEXT", interval: "weekly", time_period: "60", series_type: "close", fastperiod: "12", slowperiod: "26", signalperiod: "9", fastmatype: "0", slowmatype: "0", signalmatype: "0")
157
+ indicator = @stock.indicator(function: "MACDEXT", interval: "weekly", time_period: "60", series_type: "close", fastperiod: "12", slowperiod: "26", signalperiod: "9", fastmatype: "0", slowmatype: "0", signalmatype: "0")
158
158
  bool << (indicator.symbol == "MSFT")
159
159
  bool << indicator.indicator.is_a?(String)
160
160
  bool << indicator.last_refreshed.is_a?(String)
@@ -175,7 +175,7 @@ describe Alphavantage::Indicator do
175
175
 
176
176
  it "can be indicator STOCH" do
177
177
  bool = []
178
- sleep(1); indicator = @stock.indicator(function: "STOCH", interval: "weekly", fastkperiod: "5", slowkperiod: "3", slowdperiod: "3", slowkmatype: "0", slowdmatype: "0")
178
+ indicator = @stock.indicator(function: "STOCH", interval: "weekly", fastkperiod: "5", slowkperiod: "3", slowdperiod: "3", slowkmatype: "0", slowdmatype: "0")
179
179
  bool << (indicator.symbol == "MSFT")
180
180
  bool << indicator.indicator.is_a?(String)
181
181
  bool << indicator.last_refreshed.is_a?(String)
@@ -193,7 +193,7 @@ describe Alphavantage::Indicator do
193
193
 
194
194
  it "can be indicator STOCHF" do
195
195
  bool = []
196
- sleep(1); indicator = @stock.indicator(function: "STOCHF", interval: "weekly", fastkperiod: "5", fastdperiod: "3", fastdmatype: "0")
196
+ indicator = @stock.indicator(function: "STOCHF", interval: "weekly", fastkperiod: "5", fastdperiod: "3", fastdmatype: "0")
197
197
  bool << (indicator.symbol == "MSFT")
198
198
  bool << indicator.indicator.is_a?(String)
199
199
  bool << indicator.last_refreshed.is_a?(String)
@@ -209,7 +209,7 @@ describe Alphavantage::Indicator do
209
209
 
210
210
  it "can be indicator RSI" do
211
211
  bool = []
212
- sleep(1); indicator = @stock.indicator(function: "RSI", interval: "weekly", time_period: "60", series_type: "close")
212
+ indicator = @stock.indicator(function: "RSI", interval: "weekly", time_period: "60", series_type: "close")
213
213
  bool << (indicator.symbol == "MSFT")
214
214
  bool << indicator.indicator.is_a?(String)
215
215
  bool << indicator.last_refreshed.is_a?(String)
@@ -222,7 +222,7 @@ describe Alphavantage::Indicator do
222
222
 
223
223
  it "can be indicator STOCHRSI" do
224
224
  bool = []
225
- sleep(1); indicator = @stock.indicator(function: "STOCHRSI", interval: "weekly", time_period: "60", fastkperiod: "5", fastdperiod: "3", fastdmatype: "0")
225
+ indicator = @stock.indicator(function: "STOCHRSI", interval: "weekly", time_period: "60", fastkperiod: "5", fastdperiod: "3", fastdmatype: "0")
226
226
  bool << (indicator.symbol == "MSFT")
227
227
  bool << indicator.indicator.is_a?(String)
228
228
  bool << indicator.last_refreshed.is_a?(String)
@@ -238,7 +238,7 @@ describe Alphavantage::Indicator do
238
238
 
239
239
  it "can be indicator WILLR" do
240
240
  bool = []
241
- sleep(1); indicator = @stock.indicator(function: "WILLR", interval: "weekly", time_period: "60")
241
+ indicator = @stock.indicator(function: "WILLR", interval: "weekly", time_period: "60")
242
242
  bool << (indicator.symbol == "MSFT")
243
243
  bool << indicator.indicator.is_a?(String)
244
244
  bool << indicator.last_refreshed.is_a?(String)
@@ -250,7 +250,7 @@ describe Alphavantage::Indicator do
250
250
 
251
251
  it "can be indicator ADX" do
252
252
  bool = []
253
- sleep(1); indicator = @stock.indicator(function: "ADX", interval: "weekly", time_period: "60")
253
+ indicator = @stock.indicator(function: "ADX", interval: "weekly", time_period: "60")
254
254
  bool << (indicator.symbol == "MSFT")
255
255
  bool << indicator.indicator.is_a?(String)
256
256
  bool << indicator.last_refreshed.is_a?(String)
@@ -262,7 +262,7 @@ describe Alphavantage::Indicator do
262
262
 
263
263
  it "can be indicator ADXR" do
264
264
  bool = []
265
- sleep(1); indicator = @stock.indicator(function: "ADXR", interval: "weekly", time_period: "60")
265
+ indicator = @stock.indicator(function: "ADXR", interval: "weekly", time_period: "60")
266
266
  bool << (indicator.symbol == "MSFT")
267
267
  bool << indicator.indicator.is_a?(String)
268
268
  bool << indicator.last_refreshed.is_a?(String)
@@ -274,7 +274,7 @@ describe Alphavantage::Indicator do
274
274
 
275
275
  it "can be indicator APO" do
276
276
  bool = []
277
- sleep(1); indicator = @stock.indicator(function: "APO", interval: "weekly", series_type: "close", fastperiod: "12", slowperiod: "26", signalperiod: "9", matype: "0")
277
+ indicator = @stock.indicator(function: "APO", interval: "weekly", series_type: "close", fastperiod: "12", slowperiod: "26", signalperiod: "9", matype: "0")
278
278
  bool << (indicator.symbol == "MSFT")
279
279
  bool << indicator.indicator.is_a?(String)
280
280
  bool << indicator.last_refreshed.is_a?(String)
@@ -290,7 +290,7 @@ describe Alphavantage::Indicator do
290
290
 
291
291
  it "can be indicator PPO" do
292
292
  bool = []
293
- sleep(1); indicator = @stock.indicator(function: "PPO", interval: "weekly", series_type: "close", fastperiod: "12", slowperiod: "26", signalperiod: "9", matype: "0")
293
+ indicator = @stock.indicator(function: "PPO", interval: "weekly", series_type: "close", fastperiod: "12", slowperiod: "26", signalperiod: "9", matype: "0")
294
294
  bool << (indicator.symbol == "MSFT")
295
295
  bool << indicator.indicator.is_a?(String)
296
296
  bool << indicator.last_refreshed.is_a?(String)
@@ -306,7 +306,7 @@ describe Alphavantage::Indicator do
306
306
 
307
307
  it "can be indicator MOM" do
308
308
  bool = []
309
- sleep(1); indicator = @stock.indicator(function: "MOM", interval: "weekly", time_period: "60", series_type: "close")
309
+ indicator = @stock.indicator(function: "MOM", interval: "weekly", time_period: "60", series_type: "close")
310
310
  bool << (indicator.symbol == "MSFT")
311
311
  bool << indicator.indicator.is_a?(String)
312
312
  bool << indicator.last_refreshed.is_a?(String)
@@ -319,7 +319,7 @@ describe Alphavantage::Indicator do
319
319
 
320
320
  it "can be indicator BOP" do
321
321
  bool = []
322
- sleep(1); indicator = @stock.indicator(function: "BOP", interval: "weekly")
322
+ indicator = @stock.indicator(function: "BOP", interval: "weekly")
323
323
  bool << (indicator.symbol == "MSFT")
324
324
  bool << indicator.indicator.is_a?(String)
325
325
  bool << indicator.last_refreshed.is_a?(String)
@@ -331,7 +331,7 @@ describe Alphavantage::Indicator do
331
331
 
332
332
  it "can be indicator CCI" do
333
333
  bool = []
334
- sleep(1); indicator = @stock.indicator(function: "CCI", interval: "weekly", time_period: "60")
334
+ indicator = @stock.indicator(function: "CCI", interval: "weekly", time_period: "60")
335
335
  bool << (indicator.symbol == "MSFT")
336
336
  bool << indicator.indicator.is_a?(String)
337
337
  bool << indicator.last_refreshed.is_a?(String)
@@ -343,7 +343,7 @@ describe Alphavantage::Indicator do
343
343
 
344
344
  it "can be indicator CMO" do
345
345
  bool = []
346
- sleep(1); indicator = @stock.indicator(function: "CMO", interval: "weekly", time_period: "60", series_type: "close")
346
+ indicator = @stock.indicator(function: "CMO", interval: "weekly", time_period: "60", series_type: "close")
347
347
  bool << (indicator.symbol == "MSFT")
348
348
  bool << indicator.indicator.is_a?(String)
349
349
  bool << indicator.last_refreshed.is_a?(String)
@@ -356,7 +356,7 @@ describe Alphavantage::Indicator do
356
356
 
357
357
  it "can be indicator ROC" do
358
358
  bool = []
359
- sleep(1); indicator = @stock.indicator(function: "ROC", interval: "weekly", time_period: "60", series_type: "close")
359
+ indicator = @stock.indicator(function: "ROC", interval: "weekly", time_period: "60", series_type: "close")
360
360
  bool << (indicator.symbol == "MSFT")
361
361
  bool << indicator.indicator.is_a?(String)
362
362
  bool << indicator.last_refreshed.is_a?(String)
@@ -369,7 +369,7 @@ describe Alphavantage::Indicator do
369
369
 
370
370
  it "can be indicator ROCR" do
371
371
  bool = []
372
- sleep(1); indicator = @stock.indicator(function: "ROCR", interval: "weekly", time_period: "60", series_type: "close")
372
+ indicator = @stock.indicator(function: "ROCR", interval: "weekly", time_period: "60", series_type: "close")
373
373
  bool << (indicator.symbol == "MSFT")
374
374
  bool << indicator.indicator.is_a?(String)
375
375
  bool << indicator.last_refreshed.is_a?(String)
@@ -382,7 +382,7 @@ describe Alphavantage::Indicator do
382
382
 
383
383
  it "can be indicator AROON" do
384
384
  bool = []
385
- sleep(1); indicator = @stock.indicator(function: "AROON", interval: "weekly", time_period: "60")
385
+ indicator = @stock.indicator(function: "AROON", interval: "weekly", time_period: "60")
386
386
  bool << (indicator.symbol == "MSFT")
387
387
  bool << indicator.indicator.is_a?(String)
388
388
  bool << indicator.last_refreshed.is_a?(String)
@@ -395,7 +395,7 @@ describe Alphavantage::Indicator do
395
395
 
396
396
  it "can be indicator AROONOSC" do
397
397
  bool = []
398
- sleep(1); indicator = @stock.indicator(function: "AROONOSC", interval: "weekly", time_period: "60")
398
+ indicator = @stock.indicator(function: "AROONOSC", interval: "weekly", time_period: "60")
399
399
  bool << (indicator.symbol == "MSFT")
400
400
  bool << indicator.indicator.is_a?(String)
401
401
  bool << indicator.last_refreshed.is_a?(String)
@@ -407,7 +407,7 @@ describe Alphavantage::Indicator do
407
407
 
408
408
  it "can be indicator MFI" do
409
409
  bool = []
410
- sleep(1); indicator = @stock.indicator(function: "MFI", interval: "weekly", time_period: "60")
410
+ indicator = @stock.indicator(function: "MFI", interval: "weekly", time_period: "60")
411
411
  bool << (indicator.symbol == "MSFT")
412
412
  bool << indicator.indicator.is_a?(String)
413
413
  bool << indicator.last_refreshed.is_a?(String)
@@ -419,7 +419,7 @@ describe Alphavantage::Indicator do
419
419
 
420
420
  it "can be indicator TRIX" do
421
421
  bool = []
422
- sleep(1); indicator = @stock.indicator(function: "TRIX", interval: "weekly", time_period: "60", series_type: "close")
422
+ indicator = @stock.indicator(function: "TRIX", interval: "weekly", time_period: "60", series_type: "close")
423
423
  bool << (indicator.symbol == "MSFT")
424
424
  bool << indicator.indicator.is_a?(String)
425
425
  bool << indicator.last_refreshed.is_a?(String)
@@ -432,7 +432,7 @@ describe Alphavantage::Indicator do
432
432
 
433
433
  it "can be indicator ULTOSC" do
434
434
  bool = []
435
- sleep(1); indicator = @stock.indicator(function: "ULTOSC", interval: "weekly", timeperiod1: "7", timeperiod2: "14", timeperiod3: "28")
435
+ indicator = @stock.indicator(function: "ULTOSC", interval: "weekly", timeperiod1: "7", timeperiod2: "14", timeperiod3: "28")
436
436
  bool << (indicator.symbol == "MSFT")
437
437
  bool << indicator.indicator.is_a?(String)
438
438
  bool << indicator.last_refreshed.is_a?(String)
@@ -447,7 +447,7 @@ describe Alphavantage::Indicator do
447
447
 
448
448
  it "can be indicator DX" do
449
449
  bool = []
450
- sleep(1); indicator = @stock.indicator(function: "DX", interval: "weekly", time_period: "60")
450
+ indicator = @stock.indicator(function: "DX", interval: "weekly", time_period: "60")
451
451
  bool << (indicator.symbol == "MSFT")
452
452
  bool << indicator.indicator.is_a?(String)
453
453
  bool << indicator.last_refreshed.is_a?(String)
@@ -459,7 +459,7 @@ describe Alphavantage::Indicator do
459
459
 
460
460
  it "can be indicator MINUS_DI" do
461
461
  bool = []
462
- sleep(1); indicator = @stock.indicator(function: "MINUS_DI", interval: "weekly", time_period: "60")
462
+ indicator = @stock.indicator(function: "MINUS_DI", interval: "weekly", time_period: "60")
463
463
  bool << (indicator.symbol == "MSFT")
464
464
  bool << indicator.indicator.is_a?(String)
465
465
  bool << indicator.last_refreshed.is_a?(String)
@@ -471,7 +471,7 @@ describe Alphavantage::Indicator do
471
471
 
472
472
  it "can be indicator PLUS_DI" do
473
473
  bool = []
474
- sleep(1); indicator = @stock.indicator(function: "PLUS_DI", interval: "weekly", time_period: "60")
474
+ indicator = @stock.indicator(function: "PLUS_DI", interval: "weekly", time_period: "60")
475
475
  bool << (indicator.symbol == "MSFT")
476
476
  bool << indicator.indicator.is_a?(String)
477
477
  bool << indicator.last_refreshed.is_a?(String)
@@ -483,7 +483,7 @@ describe Alphavantage::Indicator do
483
483
 
484
484
  it "can be indicator MINUS_DM" do
485
485
  bool = []
486
- sleep(1); indicator = @stock.indicator(function: "MINUS_DM", interval: "weekly", time_period: "60")
486
+ indicator = @stock.indicator(function: "MINUS_DM", interval: "weekly", time_period: "60")
487
487
  bool << (indicator.symbol == "MSFT")
488
488
  bool << indicator.indicator.is_a?(String)
489
489
  bool << indicator.last_refreshed.is_a?(String)
@@ -495,7 +495,7 @@ describe Alphavantage::Indicator do
495
495
 
496
496
  it "can be indicator PLUS_DM" do
497
497
  bool = []
498
- sleep(1); indicator = @stock.indicator(function: "PLUS_DM", interval: "weekly", time_period: "60")
498
+ indicator = @stock.indicator(function: "PLUS_DM", interval: "weekly", time_period: "60")
499
499
  bool << (indicator.symbol == "MSFT")
500
500
  bool << indicator.indicator.is_a?(String)
501
501
  bool << indicator.last_refreshed.is_a?(String)
@@ -507,7 +507,7 @@ describe Alphavantage::Indicator do
507
507
 
508
508
  it "can be indicator BBANDS" do
509
509
  bool = []
510
- sleep(1); indicator = @stock.indicator(function: "BBANDS", interval: "weekly", time_period: "60", series_type: "close", matype: "0", nbdevup: "2", nbdevdn: "2")
510
+ indicator = @stock.indicator(function: "BBANDS", interval: "weekly", time_period: "60", series_type: "close", matype: "0", nbdevup: "2", nbdevdn: "2")
511
511
  bool << (indicator.symbol == "MSFT")
512
512
  bool << indicator.indicator.is_a?(String)
513
513
  bool << indicator.last_refreshed.is_a?(String)
@@ -525,7 +525,7 @@ describe Alphavantage::Indicator do
525
525
 
526
526
  it "can be indicator MIDPOINT" do
527
527
  bool = []
528
- sleep(1); indicator = @stock.indicator(function: "MIDPOINT", interval: "weekly", time_period: "60", series_type: "close")
528
+ indicator = @stock.indicator(function: "MIDPOINT", interval: "weekly", time_period: "60", series_type: "close")
529
529
  bool << (indicator.symbol == "MSFT")
530
530
  bool << indicator.indicator.is_a?(String)
531
531
  bool << indicator.last_refreshed.is_a?(String)
@@ -538,7 +538,7 @@ describe Alphavantage::Indicator do
538
538
 
539
539
  it "can be indicator MIDPRICE" do
540
540
  bool = []
541
- sleep(1); indicator = @stock.indicator(function: "MIDPRICE", interval: "weekly", time_period: "60")
541
+ indicator = @stock.indicator(function: "MIDPRICE", interval: "weekly", time_period: "60")
542
542
  bool << (indicator.symbol == "MSFT")
543
543
  bool << indicator.indicator.is_a?(String)
544
544
  bool << indicator.last_refreshed.is_a?(String)
@@ -550,7 +550,7 @@ describe Alphavantage::Indicator do
550
550
 
551
551
  it "can be indicator SAR" do
552
552
  bool = []
553
- sleep(1); indicator = @stock.indicator(function: "SAR", interval: "weekly", acceleration: "0.01", maximum: "0.20")
553
+ indicator = @stock.indicator(function: "SAR", interval: "weekly", acceleration: "0.01", maximum: "0.20")
554
554
  bool << (indicator.symbol == "MSFT")
555
555
  bool << indicator.indicator.is_a?(String)
556
556
  bool << indicator.last_refreshed.is_a?(String)
@@ -564,7 +564,7 @@ describe Alphavantage::Indicator do
564
564
 
565
565
  it "can be indicator TRANGE" do
566
566
  bool = []
567
- sleep(1); indicator = @stock.indicator(function: "TRANGE", interval: "weekly")
567
+ indicator = @stock.indicator(function: "TRANGE", interval: "weekly")
568
568
  bool << (indicator.symbol == "MSFT")
569
569
  bool << indicator.indicator.is_a?(String)
570
570
  bool << indicator.last_refreshed.is_a?(String)
@@ -576,7 +576,7 @@ describe Alphavantage::Indicator do
576
576
 
577
577
  it "can be indicator ATR" do
578
578
  bool = []
579
- sleep(1); indicator = @stock.indicator(function: "ATR", interval: "weekly", time_period: "60")
579
+ indicator = @stock.indicator(function: "ATR", interval: "weekly", time_period: "60")
580
580
  bool << (indicator.symbol == "MSFT")
581
581
  bool << indicator.indicator.is_a?(String)
582
582
  bool << indicator.last_refreshed.is_a?(String)
@@ -588,7 +588,7 @@ describe Alphavantage::Indicator do
588
588
 
589
589
  it "can be indicator NATR" do
590
590
  bool = []
591
- sleep(1); indicator = @stock.indicator(function: "NATR", interval: "weekly", time_period: "60")
591
+ indicator = @stock.indicator(function: "NATR", interval: "weekly", time_period: "60")
592
592
  bool << (indicator.symbol == "MSFT")
593
593
  bool << indicator.indicator.is_a?(String)
594
594
  bool << indicator.last_refreshed.is_a?(String)
@@ -600,7 +600,7 @@ describe Alphavantage::Indicator do
600
600
 
601
601
  it "can be indicator AD" do
602
602
  bool = []
603
- sleep(1); indicator = @stock.indicator(function: "AD", interval: "weekly")
603
+ indicator = @stock.indicator(function: "AD", interval: "weekly")
604
604
  bool << (indicator.symbol == "MSFT")
605
605
  bool << indicator.indicator.is_a?(String)
606
606
  bool << indicator.last_refreshed.is_a?(String)
@@ -612,7 +612,7 @@ describe Alphavantage::Indicator do
612
612
 
613
613
  it "can be indicator ADOSC" do
614
614
  bool = []
615
- sleep(1); indicator = @stock.indicator(function: "ADOSC", interval: "weekly", fastperiod: "12", slowperiod: "26")
615
+ indicator = @stock.indicator(function: "ADOSC", interval: "weekly", fastperiod: "12", slowperiod: "26")
616
616
  bool << (indicator.symbol == "MSFT")
617
617
  bool << indicator.indicator.is_a?(String)
618
618
  bool << indicator.last_refreshed.is_a?(String)
@@ -626,7 +626,7 @@ describe Alphavantage::Indicator do
626
626
 
627
627
  it "can be indicator OBV" do
628
628
  bool = []
629
- sleep(1); indicator = @stock.indicator(function: "OBV", interval: "weekly")
629
+ indicator = @stock.indicator(function: "OBV", interval: "weekly")
630
630
  bool << (indicator.symbol == "MSFT")
631
631
  bool << indicator.indicator.is_a?(String)
632
632
  bool << indicator.last_refreshed.is_a?(String)
@@ -638,7 +638,7 @@ describe Alphavantage::Indicator do
638
638
 
639
639
  it "can be indicator HT_TRENDLINE" do
640
640
  bool = []
641
- sleep(1); indicator = @stock.indicator(function: "HT_TRENDLINE", interval: "weekly", series_type: "close")
641
+ indicator = @stock.indicator(function: "HT_TRENDLINE", interval: "weekly", series_type: "close")
642
642
  bool << (indicator.symbol == "MSFT")
643
643
  bool << indicator.indicator.is_a?(String)
644
644
  bool << indicator.last_refreshed.is_a?(String)
@@ -651,7 +651,7 @@ describe Alphavantage::Indicator do
651
651
 
652
652
  it "can be indicator HT_SINE" do
653
653
  bool = []
654
- sleep(1); indicator = @stock.indicator(function: "HT_SINE", interval: "weekly", series_type: "close")
654
+ indicator = @stock.indicator(function: "HT_SINE", interval: "weekly", series_type: "close")
655
655
  bool << (indicator.symbol == "MSFT")
656
656
  bool << indicator.indicator.is_a?(String)
657
657
  bool << indicator.last_refreshed.is_a?(String)
@@ -665,7 +665,7 @@ describe Alphavantage::Indicator do
665
665
 
666
666
  it "can be indicator HT_TRENDMODE" do
667
667
  bool = []
668
- sleep(1); indicator = @stock.indicator(function: "HT_TRENDMODE", interval: "weekly", series_type: "close")
668
+ indicator = @stock.indicator(function: "HT_TRENDMODE", interval: "weekly", series_type: "close")
669
669
  bool << (indicator.symbol == "MSFT")
670
670
  bool << indicator.indicator.is_a?(String)
671
671
  bool << indicator.last_refreshed.is_a?(String)
@@ -678,7 +678,7 @@ describe Alphavantage::Indicator do
678
678
 
679
679
  it "can be indicator HT_DCPERIOD" do
680
680
  bool = []
681
- sleep(1); indicator = @stock.indicator(function: "HT_DCPERIOD", interval: "weekly", series_type: "close")
681
+ indicator = @stock.indicator(function: "HT_DCPERIOD", interval: "weekly", series_type: "close")
682
682
  bool << (indicator.symbol == "MSFT")
683
683
  bool << indicator.indicator.is_a?(String)
684
684
  bool << indicator.last_refreshed.is_a?(String)
@@ -691,7 +691,7 @@ describe Alphavantage::Indicator do
691
691
 
692
692
  it "can be indicator HT_DCPHASE" do
693
693
  bool = []
694
- sleep(1); indicator = @stock.indicator(function: "HT_DCPHASE", interval: "weekly", series_type: "close")
694
+ indicator = @stock.indicator(function: "HT_DCPHASE", interval: "weekly", series_type: "close")
695
695
  bool << (indicator.symbol == "MSFT")
696
696
  bool << indicator.indicator.is_a?(String)
697
697
  bool << indicator.last_refreshed.is_a?(String)
@@ -704,7 +704,7 @@ describe Alphavantage::Indicator do
704
704
 
705
705
  it "can be indicator HT_PHASOR" do
706
706
  bool = []
707
- sleep(1); indicator = @stock.indicator(function: "HT_PHASOR", interval: "weekly", series_type: "close")
707
+ indicator = @stock.indicator(function: "HT_PHASOR", interval: "weekly", series_type: "close")
708
708
  bool << (indicator.symbol == "MSFT")
709
709
  bool << indicator.indicator.is_a?(String)
710
710
  bool << indicator.last_refreshed.is_a?(String)