aemo 0.5.1 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
data/lib/aemo/nmi.rb CHANGED
@@ -5,7 +5,7 @@ require 'json'
5
5
  require 'time'
6
6
  require 'ostruct'
7
7
 
8
- require 'aemo/nmi/allocation.rb'
8
+ require 'aemo/nmi/allocation'
9
9
 
10
10
  module AEMO
11
11
  # [AEMO::NMI]
@@ -22,11 +22,11 @@ module AEMO
22
22
  'ACT' => 'Australian Capital Territory',
23
23
  'NSW' => 'New South Wales',
24
24
  'QLD' => 'Queensland',
25
- 'SA' => 'South Australia',
25
+ 'SA' => 'South Australia',
26
26
  'TAS' => 'Tasmania',
27
27
  'VIC' => 'Victoria',
28
- 'WA' => 'Western Australia',
29
- 'NT' => 'Northern Territory'
28
+ 'WA' => 'Western Australia',
29
+ 'NT' => 'Northern Territory'
30
30
  }.freeze
31
31
 
32
32
  # Transmission Node Identifier Codes are loaded from a json file
@@ -79,7 +79,7 @@ module AEMO
79
79
  # @param [String] nmi the nmi to be checked
80
80
  # @return [Boolean] whether or not the nmi is valid
81
81
  def valid_nmi?(nmi)
82
- ((nmi.length == 10) && !nmi.match(/^([A-HJ-NP-Z\d]{10})/).nil?)
82
+ (nmi.length == 10) && !nmi.match(/^([A-HJ-NP-Z\d]{10})/).nil?
83
83
  end
84
84
 
85
85
  # A function to calculate the checksum value for a given National Meter
@@ -159,14 +159,13 @@ module AEMO
159
159
  # Identifier
160
160
  def checksum
161
161
  summation = 0
162
- @nmi.reverse.split(//).each_index do |i|
162
+ @nmi.reverse.chars.each_index do |i|
163
163
  value = nmi[nmi.length - i - 1].ord
164
164
  value *= 2 if i.even?
165
- value = value.to_s.split(//).map(&:to_i).reduce(:+)
165
+ value = value.to_s.chars.map(&:to_i).reduce(:+)
166
166
  summation += value
167
167
  end
168
- checksum = (10 - (summation % 10)) % 10
169
- checksum
168
+ (10 - (summation % 10)) % 10
170
169
  end
171
170
 
172
171
  # Provided MSATS is configured, gets the MSATS data for the NMI
@@ -174,6 +173,7 @@ module AEMO
174
173
  # @return [Hash] MSATS NMI Detail data
175
174
  def raw_msats_nmi_detail(options = {})
176
175
  raise ArgumentError, 'MSATS has no authentication credentials' unless AEMO::MSATS.can_authenticate?
176
+
177
177
  AEMO::MSATS.nmi_detail(@nmi, options)
178
178
  end
179
179
 
@@ -233,7 +233,7 @@ module AEMO
233
233
  data_streams = @msats_detail['DataStreams']['DataStream']
234
234
  data_streams = [data_streams] if data_streams.is_a?(Hash) # Deal with issue of only one existing
235
235
  data_streams.each do |stream|
236
- @data_streams << OpenStruct.new(
236
+ @data_streams << Struct::DataStream.new(
237
237
  suffix: stream['Suffix'],
238
238
  profile_name: stream['ProfileName'],
239
239
  averaged_daily_load: stream['AveragedDailyLoad'],
@@ -270,10 +270,10 @@ module AEMO
270
270
  @meters.select { |x| x.status == status.to_s }
271
271
  end
272
272
 
273
- # Returns the data_stream OpenStructs for the requested status (A/I)
273
+ # Returns the data_stream Structs for the requested status (A/I)
274
274
  #
275
275
  # @param [String] status the stateus [A|I]
276
- # @return [Array<OpenStruct>] Returns an array of OpenStructs for the
276
+ # @return [Array<Struct>] Returns an array of Structs for the
277
277
  # current Meters
278
278
  def data_streams_by_status(status = 'A')
279
279
  @data_streams.select { |x| x.status == status.to_s }
@@ -297,19 +297,20 @@ module AEMO
297
297
 
298
298
  # A function to return the distribution loss factor value for a given date
299
299
  #
300
- # @param [DateTime, Time] datetime the date for the distribution loss factor
300
+ # @param [DateTime, ::Time] datetime the date for the distribution loss factor
301
301
  # value
302
302
  # @return [nil, float] the distribution loss factor value
303
- def dlfc_value(datetime = Time.now)
303
+ def dlfc_value(datetime = ::Time.now)
304
304
  if @dlf.nil?
305
305
  raise 'No DLF set, ensure that you have set the value either via the' \
306
306
  'update_from_msats! function or manually'
307
307
  end
308
308
  raise 'DLF is invalid' unless DLF_CODES.keys.include?(@dlf)
309
- raise 'Invalid date' unless [DateTime, Time].include?(datetime.class)
309
+ raise 'Invalid date' unless [DateTime, ::Time].include?(datetime.class)
310
+
310
311
  possible_values = DLF_CODES[@dlf].select do |x|
311
- Time.parse(x['FromDate']) <= datetime &&
312
- Time.parse(x['ToDate']) >= datetime
312
+ ::Time.parse(x['FromDate']) <= datetime &&
313
+ ::Time.parse(x['ToDate']) >= datetime
313
314
  end
314
315
  if possible_values.empty?
315
316
  nil
@@ -320,61 +321,70 @@ module AEMO
320
321
 
321
322
  # A function to return the distribution loss factor value for a given date
322
323
  #
323
- # @param [DateTime, Time] start the date for the distribution loss factor value
324
- # @param [DateTime, Time] finish the date for the distribution loss factor value
324
+ # @param [DateTime, ::Time] start the date for the distribution loss factor value
325
+ # @param [DateTime, ::Time] finish the date for the distribution loss factor value
325
326
  # @return [Array(Hash)] array of hashes of start, finish and value
326
- def dlfc_values(start = Time.now, finish = Time.now)
327
+ def dlfc_values(start = ::Time.now, finish = ::Time.now)
327
328
  if @dlf.nil?
328
- raise 'No DLF set, ensure that you have set the value either via the '\
329
+ raise 'No DLF set, ensure that you have set the value either via the ' \
329
330
  'update_from_msats! function or manually'
330
331
  end
331
332
  raise 'DLF is invalid' unless DLF_CODES.keys.include?(@dlf)
332
- raise 'Invalid start' unless [DateTime, Time].include?(start.class)
333
- raise 'Invalid finish' unless [DateTime, Time].include?(finish.class)
333
+ raise 'Invalid start' unless [DateTime, ::Time].include?(start.class)
334
+ raise 'Invalid finish' unless [DateTime, ::Time].include?(finish.class)
334
335
  raise 'start cannot be after finish' if start > finish
335
- DLF_CODES[@dlf].reject { |x| start > Time.parse(x['ToDate']) || finish < Time.parse(x['FromDate']) }
336
+
337
+ DLF_CODES[@dlf].reject { |x| start > ::Time.parse(x['ToDate']) || finish < ::Time.parse(x['FromDate']) }
336
338
  .map { |x| { 'start' => x['FromDate'], 'finish' => x['ToDate'], 'value' => x['Value'].to_f } }
337
339
  end
338
340
 
339
341
  # A function to return the transmission node identifier loss factor value for a given date
340
342
  #
341
- # @param [DateTime, Time] datetime the date for the distribution loss factor value
343
+ # @param [DateTime, ::Time] datetime the date for the distribution loss factor value
342
344
  # @return [nil, float] the transmission node identifier loss factor value
343
- def tni_value(datetime = Time.now)
345
+ def tni_value(datetime = ::Time.now)
344
346
  if @tni.nil?
345
- raise 'No TNI set, ensure that you have set the value either via the '\
347
+ raise 'No TNI set, ensure that you have set the value either via the ' \
346
348
  'update_from_msats! function or manually'
347
349
  end
348
350
  raise 'TNI is invalid' unless TNI_CODES.keys.include?(@tni)
349
- raise 'Invalid date' unless [DateTime, Time].include?(datetime.class)
350
- possible_values = TNI_CODES[@tni].select { |x| Time.parse(x['FromDate']) <= datetime && datetime <= Time.parse(x['ToDate']) }
351
+ raise 'Invalid date' unless [DateTime, ::Time].include?(datetime.class)
352
+
353
+ possible_values = TNI_CODES[@tni].select do |x|
354
+ ::Time.parse(x['FromDate']) <= datetime && datetime <= ::Time.parse(x['ToDate'])
355
+ end
351
356
  return nil if possible_values.empty?
352
- possible_values = possible_values.first['mlf_data']['loss_factors'].select { |x| Time.parse(x['start']) <= datetime && datetime <= Time.parse(x['finish']) }
357
+
358
+ possible_values = possible_values.first['mlf_data']['loss_factors'].select do |x|
359
+ ::Time.parse(x['start']) <= datetime && datetime <= ::Time.parse(x['finish'])
360
+ end
353
361
  return nil if possible_values.empty?
362
+
354
363
  possible_values.first['value'].to_f
355
364
  end
356
365
 
357
366
  # A function to return the transmission node identifier loss factor value for a given date
358
367
  #
359
- # @param [DateTime, Time] start the date for the distribution loss factor value
360
- # @param [DateTime, Time] finish the date for the distribution loss factor value
368
+ # @param [DateTime, ::Time] start the date for the distribution loss factor value
369
+ # @param [DateTime, ::Time] finish the date for the distribution loss factor value
361
370
  # @return [Array(Hash)] array of hashes of start, finish and value
362
- def tni_values(start = Time.now, finish = Time.now)
371
+ def tni_values(start = ::Time.now, finish = ::Time.now)
363
372
  if @tni.nil?
364
- raise 'No TNI set, ensure that you have set the value either via the '\
373
+ raise 'No TNI set, ensure that you have set the value either via the ' \
365
374
  'update_from_msats! function or manually'
366
375
  end
367
376
  raise 'TNI is invalid' unless TNI_CODES.keys.include?(@tni)
368
- raise 'Invalid start' unless [DateTime, Time].include?(start.class)
369
- raise 'Invalid finish' unless [DateTime, Time].include?(finish.class)
377
+ raise 'Invalid start' unless [DateTime, ::Time].include?(start.class)
378
+ raise 'Invalid finish' unless [DateTime, ::Time].include?(finish.class)
370
379
  raise 'start cannot be after finish' if start > finish
371
380
 
372
381
  possible_values = TNI_CODES[@tni].reject do |tni_code|
373
- start > Time.parse(tni_code['ToDate']) ||
374
- finish < Time.parse(tni_code['FromDate'])
382
+ start > ::Time.parse(tni_code['ToDate']) ||
383
+ finish < ::Time.parse(tni_code['FromDate'])
375
384
  end
376
385
 
377
386
  return nil if possible_values.empty?
387
+
378
388
  possible_values.map { |x| x['mlf_data']['loss_factors'] }
379
389
  end
380
390
  end
data/lib/aemo/region.rb CHANGED
@@ -12,11 +12,11 @@ module AEMO
12
12
  'ACT' => 'Australian Capital Territory',
13
13
  'NSW' => 'New South Wales',
14
14
  'QLD' => 'Queensland',
15
- 'SA' => 'South Australia',
15
+ 'SA' => 'South Australia',
16
16
  'TAS' => 'Tasmania',
17
17
  'VIC' => 'Victoria',
18
- 'NT' => 'Northern Territory',
19
- 'WA' => 'Western Australia'
18
+ 'NT' => 'Northern Territory',
19
+ 'WA' => 'Western Australia'
20
20
  }.freeze
21
21
 
22
22
  attr_accessor :region
@@ -34,6 +34,7 @@ module AEMO
34
34
  # @return [self]
35
35
  def initialize(region)
36
36
  raise ArgumentError, "Region '#{region}' is not valid." unless valid_region?(region)
37
+
37
38
  @region = region.upcase
38
39
  @full_name = REGIONS[@region]
39
40
  @current_trading = []
data/lib/aemo/register.rb CHANGED
@@ -28,14 +28,14 @@ module AEMO
28
28
  # @return [AEMO::Register] description of returned object
29
29
  def self.from_hash(register)
30
30
  AEMO::Register.new(
31
- controlled_load: register['ControlledLoad'] == 'Y',
32
- dial_format: register['DialFormat'],
33
- multiplier: register['Multiplier'],
31
+ controlled_load: register['ControlledLoad'] == 'Y',
32
+ dial_format: register['DialFormat'],
33
+ multiplier: register['Multiplier'],
34
34
  network_tariff_code: register['NetworkTariffCode'],
35
- register_id: register['RegisterID'],
36
- status: register['Status'],
37
- time_of_day: register['TimeOfDay'],
38
- unit_of_measure: register['UnitOfMeasure']
35
+ register_id: register['RegisterID'],
36
+ status: register['Status'],
37
+ time_of_day: register['TimeOfDay'],
38
+ unit_of_measure: register['UnitOfMeasure']
39
39
  )
40
40
  end
41
41
  end
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ Struct.new('DataStream', :suffix, :profile_name, :averaged_daily_load, :data_stream_type, :status, keyword_init: true)
data/lib/aemo/time.rb ADDED
@@ -0,0 +1,112 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'time'
4
+ require 'active_support/all'
5
+
6
+ require_relative 'exceptions/time_error'
7
+
8
+ module AEMO
9
+ # [AEMO::Time] provides time helpers for AEMO services.
10
+ module Time
11
+ NEMTIMEZONE = 'Australia/Brisbane'
12
+ TIMESTAMP14 = '%Y%m%d%H%M%S'
13
+ TIMESTAMP14_PATTERN = /^\d{4}\d{2}\d{2}\d{2}\d{2}\d{2}$/
14
+ TIMESTAMP12 = '%Y%m%d%H%M'
15
+ TIMESTAMP12_PATTERN = /^\d{4}\d{2}\d{2}\d{2}\d{2}$/
16
+ TIMESTAMP8 = '%Y%m%d'
17
+ TIMESTAMP8_PATTERN = /^\d{4}\d{2}\d{2}$/
18
+
19
+ class << self
20
+ # Format a time to a timestamp 14.
21
+ #
22
+ # @param [Time] time
23
+ # @return [String]
24
+ def format_timestamp14(time)
25
+ time.in_time_zone(NEMTIMEZONE).strftime(TIMESTAMP14)
26
+ end
27
+
28
+ # Format a time to a timestamp 12.
29
+ #
30
+ # @param [Time] time
31
+ # @return [String]
32
+ def format_timestamp12(time)
33
+ time.in_time_zone(NEMTIMEZONE).strftime(TIMESTAMP12)
34
+ end
35
+
36
+ # Format a time to a timestamp 8.
37
+ #
38
+ # @param [Time] time
39
+ # @return [String]
40
+ def format_timestamp8(time)
41
+ time.in_time_zone(NEMTIMEZONE).strftime(TIMESTAMP8)
42
+ end
43
+
44
+ # Parse a 14 character timestamp.
45
+ #
46
+ # @param [String] string
47
+ # @raise [AEMO::TimeError]
48
+ # @return [Time]
49
+ def parse_timestamp14(string)
50
+ raise AEMO::TimeError unless string.match(TIMESTAMP14_PATTERN)
51
+
52
+ ::Time.find_zone(NEMTIMEZONE).strptime(string, TIMESTAMP14)
53
+ end
54
+
55
+ # Parse a 12 character timestamp.
56
+ #
57
+ # @param [String] string
58
+ # @return [Time]
59
+ def parse_timestamp12(string)
60
+ raise AEMO::TimeError unless string.match(TIMESTAMP12_PATTERN)
61
+
62
+ ::Time.find_zone(NEMTIMEZONE).strptime(string, TIMESTAMP12)
63
+ end
64
+
65
+ # Parse an 8 character date.
66
+ #
67
+ # @param [String] string
68
+ # @return [Time]
69
+ def parse_timestamp8(string)
70
+ raise AEMO::TimeError unless string.match(TIMESTAMP8_PATTERN)
71
+
72
+ ::Time.find_zone(NEMTIMEZONE).strptime(string, TIMESTAMP8)
73
+ end
74
+
75
+ # Check if a string is a valid timestamp 14.
76
+ #
77
+ # @param [String] string
78
+ # @return [Boolean]
79
+ def valid_timestamp14?(string)
80
+ parse_timestamp14(string)
81
+
82
+ true
83
+ rescue AEMO::TimeError
84
+ false
85
+ end
86
+
87
+ # Check if a string is a valid timestamp 12.
88
+ #
89
+ # @param [String] string
90
+ # @return [Boolean]
91
+ def valid_timestamp12?(string)
92
+ parse_timestamp12(string)
93
+
94
+ true
95
+ rescue AEMO::TimeError
96
+ false
97
+ end
98
+
99
+ # Check if a string is a valid timestamp 8.
100
+ #
101
+ # @param [String] string
102
+ # @return [Boolean]
103
+ def valid_timestamp8?(string)
104
+ parse_timestamp8(string)
105
+
106
+ true
107
+ rescue AEMO::TimeError
108
+ false
109
+ end
110
+ end
111
+ end
112
+ end
data/lib/aemo/version.rb CHANGED
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # -*- coding: UTF-8 -*-
4
3
  #
5
4
  # Copyright 2014 Joel Courtney
6
5
  #
@@ -24,7 +23,7 @@
24
23
  # @author Joel Courtney <euphemize@gmail.com>
25
24
  module AEMO
26
25
  # aemo version
27
- VERSION = '0.5.1'
26
+ VERSION = '0.7.0'
28
27
 
29
28
  # aemo version split amongst different revisions
30
29
  MAJOR_VERSION, MINOR_VERSION, REVISION = VERSION.split('.').map(&:to_i)
data/lib/aemo.rb CHANGED
@@ -4,17 +4,19 @@ require 'active_support/all'
4
4
  require 'httparty'
5
5
  require 'csv'
6
6
 
7
- require 'aemo/region.rb'
8
- require 'aemo/market.rb'
9
- require 'aemo/market/interval.rb'
10
- require 'aemo/market/node.rb'
11
- require 'aemo/meter.rb'
12
- require 'aemo/nem12.rb'
13
- require 'aemo/nmi.rb'
14
- require 'aemo/msats.rb'
15
- require 'aemo/register.rb'
16
- require 'aemo/version.rb'
17
- require 'aemo/exceptions/invalid_nmi_allocation_type.rb'
7
+ require 'aemo/struct'
8
+ require 'aemo/time'
9
+ require 'aemo/region'
10
+ require 'aemo/market'
11
+ require 'aemo/market/interval'
12
+ require 'aemo/market/node'
13
+ require 'aemo/meter'
14
+ require 'aemo/nem12'
15
+ require 'aemo/nmi'
16
+ require 'aemo/msats'
17
+ require 'aemo/register'
18
+ require 'aemo/version'
19
+ require 'aemo/exceptions/invalid_nmi_allocation_type'
18
20
 
19
21
  # AEMO Module to encapsulate all AEMO classes
20
22
  module AEMO
@@ -21,7 +21,7 @@ CSV.parse(file_contents, headers: true, converters: :numeric).each do |row|
21
21
  @mlf_data[row['TNI']] ||= { location: row['Location'],
22
22
  voltage: row['Voltage'],
23
23
  loss_factors: [] }
24
- row.headers.select { |x| x =~ /^FY\d{2}$/ }.sort.reverse.each do |fin_year|
24
+ row.headers.grep(/^FY\d{2}$/).sort.reverse.each do |fin_year|
25
25
  year = "20#{fin_year.match(/FY(\d{2})/)[1]}".to_i
26
26
  @mlf_data[row['TNI']][:loss_factors] << {
27
27
  start: Time.parse("#{year - 1}-07-01T00:00:00+1000"),
@@ -74,7 +74,5 @@ end
74
74
  output_data[code] << output_data_instance
75
75
  end
76
76
 
77
- File.open(File.join(@path, output_file), 'w') do |write_file|
78
- write_file.write(output_data.to_json)
79
- end
77
+ File.write(File.join(@path, output_file), output_data.to_json)
80
78
  end
data/spec/aemo_spec.rb CHANGED
@@ -1,10 +1,3 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require File.expand_path(File.join(File.dirname(__FILE__), 'spec_helper'))
4
-
5
- describe AEMO do
6
- before(:each) do
7
- @klass = Class.new
8
- @klass.instance_eval { include AEMO }
9
- end
10
- end
@@ -8,42 +8,60 @@ describe AEMO::Market::Interval do
8
8
  expect(AEMO::Market::Interval::INTERVALS).to eq(trading: 'Trading', dispatch: 'Dispatch')
9
9
  end
10
10
  end
11
+
11
12
  describe 'AEMO::Market::Interval instance methods' do
12
- before(:each) do
13
- @interval = AEMO::Market::Interval.new('2016-03-01T00:30:00', 'REGION' => 'NSW', 'TOTALDEMAND' => 1000.23, 'RRP' => 76.54, 'PERIODTYPE' => 'TRADING')
13
+ before do
14
+ @interval = described_class.new('2016-03-01T00:30:00', 'REGION' => 'NSW', 'TOTALDEMAND' => 1000.23,
15
+ 'RRP' => 76.54, 'PERIODTYPE' => 'TRADING')
14
16
  end
17
+
15
18
  it 'creates a valid interval' do
16
- expect { AEMO::Market::Interval.new('2016-03-01T00:30:00', 'REGION' => 'NSW', 'TOTALDEMAND' => 1000.23, 'RRP' => 76.54, 'PERIODTYPE' => 'TRADING') }.not_to raise_error
19
+ expect do
20
+ described_class.new('2016-03-01T00:30:00', 'REGION' => 'NSW', 'TOTALDEMAND' => 1000.23, 'RRP' => 76.54,
21
+ 'PERIODTYPE' => 'TRADING')
22
+ end.not_to raise_error
17
23
  end
24
+
18
25
  it 'has a trailing datetime' do
19
26
  expect(@interval.datetime).to eq(Time.parse('2016-03-01T00:30:00+1000'))
20
27
  end
28
+
21
29
  it 'has a leading datetime' do
22
- expect(@interval.datetime(false)).to eq(Time.parse('2016-03-01T00:00:00+1000'))
30
+ expect(@interval.datetime(trailing_edge: false)).to eq(Time.parse('2016-03-01T00:00:00+1000'))
23
31
  end
32
+
24
33
  it 'has a leading datetime for dispatch' do
25
- @interval = AEMO::Market::Interval.new('2016-03-01T00:30:00', 'REGION' => 'NSW', 'TOTALDEMAND' => 1000.23, 'RRP' => 76.54, 'PERIODTYPE' => '')
26
- expect(@interval.datetime(false)).to eq(Time.parse('2016-03-01T00:25:00+1000'))
34
+ @interval = described_class.new('2016-03-01T00:30:00', 'REGION' => 'NSW', 'TOTALDEMAND' => 1000.23,
35
+ 'RRP' => 76.54, 'PERIODTYPE' => '')
36
+ expect(@interval.datetime(trailing_edge: false)).to eq(Time.parse('2016-03-01T00:25:00+1000'))
27
37
  end
38
+
28
39
  it 'has an interval length' do
29
40
  expect(@interval.interval_length).to eq(Time.at(300))
30
41
  end
42
+
31
43
  it 'is a trading interval' do
32
44
  expect(@interval.interval_type).to eq(:trading)
33
45
  end
46
+
34
47
  it 'is a trading interval' do
35
- expect(@interval.trading?).to eq(true)
36
- expect(@interval.dispatch?).to eq(false)
48
+ expect(@interval.trading?).to be(true)
49
+ expect(@interval.dispatch?).to be(false)
37
50
  end
51
+
38
52
  it 'is a dispatch interval' do
39
- @interval = AEMO::Market::Interval.new('2016-03-01T00:30:00', 'REGION' => 'NSW', 'TOTALDEMAND' => 1000.23, 'RRP' => 76.54, 'PERIODTYPE' => '')
53
+ @interval = described_class.new('2016-03-01T00:30:00', 'REGION' => 'NSW', 'TOTALDEMAND' => 1000.23,
54
+ 'RRP' => 76.54, 'PERIODTYPE' => '')
40
55
  expect(@interval.interval_type).to eq(:dispatch)
41
56
  end
57
+
42
58
  it 'is a dispatch interval' do
43
- @interval = AEMO::Market::Interval.new('2016-03-01T00:30:00', 'REGION' => 'NSW', 'TOTALDEMAND' => 1000.23, 'RRP' => 76.54, 'PERIODTYPE' => '')
44
- expect(@interval.trading?).to eq(false)
45
- expect(@interval.dispatch?).to eq(true)
59
+ @interval = described_class.new('2016-03-01T00:30:00', 'REGION' => 'NSW', 'TOTALDEMAND' => 1000.23,
60
+ 'RRP' => 76.54, 'PERIODTYPE' => '')
61
+ expect(@interval.trading?).to be(false)
62
+ expect(@interval.dispatch?).to be(true)
46
63
  end
64
+
47
65
  it 'has a valid value' do
48
66
  expect(@interval.value).to eq((@interval.total_demand * @interval.rrp).round(2))
49
67
  end
@@ -4,30 +4,32 @@ require 'spec_helper'
4
4
 
5
5
  describe AEMO::Market::Node do
6
6
  describe '.IDENTIFIERS' do
7
- it 'should be an array' do
7
+ it 'is an array' do
8
8
  expect(AEMO::Market::Node::IDENTIFIERS).to be_instance_of(Array)
9
9
  end
10
10
  end
11
11
 
12
12
  describe 'creating a node' do
13
- it 'should raise an error if invalid region' do
14
- expect { AEMO::Market::Node.new('BOTTOMS') }.to raise_error(ArgumentError)
13
+ it 'raises an error if invalid region' do
14
+ expect { described_class.new('BOTTOMS') }.to raise_error(ArgumentError)
15
15
  end
16
- it 'should create if node valid' do
17
- expect { AEMO::Market::Node.new('NSW') }.not_to raise_error
16
+
17
+ it 'creates if node valid' do
18
+ expect { described_class.new('NSW') }.not_to raise_error
18
19
  end
19
20
  end
20
21
 
21
22
  describe 'AEMO::Region instance methods' do
22
- before(:each) do
23
- @nsw = AEMO::Market::Node.new('NSW')
23
+ before do
24
+ @nsw = described_class.new('NSW')
24
25
  end
25
26
 
26
27
  describe 'AEMO::Region dispatch information' do
27
- it 'should return current dispatch data' do
28
+ it 'returns current dispatch data' do
28
29
  expect(@nsw.current_dispatch.count).to eq(AEMO::Market.current_dispatch(@nsw.identifier).count)
29
30
  end
30
- it 'should return current trading data' do
31
+
32
+ it 'returns current trading data' do
31
33
  expect(@nsw.current_trading.count).to eq(AEMO::Market.current_trading(@nsw.identifier).count)
32
34
  end
33
35
  end
@@ -14,25 +14,26 @@ describe AEMO::Market do
14
14
 
15
15
  describe '.current_dispatch' do
16
16
  it 'has an array of data' do
17
- expect(AEMO::Market.current_dispatch('NSW').class).to eq(Array)
17
+ expect(described_class.current_dispatch('NSW').class).to eq(Array)
18
18
  end
19
19
  end
20
20
 
21
21
  describe '.current_trading' do
22
22
  it 'has an array of data' do
23
- expect(AEMO::Market.current_trading('NSW').class).to eq(Array)
23
+ expect(described_class.current_trading('NSW').class).to eq(Array)
24
24
  end
25
25
  end
26
26
 
27
27
  describe '.historic_trading_by_range' do
28
28
  it 'has an array of data' do
29
- expect(AEMO::Market.historic_trading_by_range('NSW', Date.parse('2015-01-01'), Date.parse('2015-02-28')).class).to eq(Array)
29
+ expect(described_class.historic_trading_by_range('NSW', Date.parse('2015-01-01'),
30
+ Date.parse('2015-02-28')).class).to eq(Array)
30
31
  end
31
32
  end
32
33
 
33
34
  describe '.historic_trading' do
34
35
  it 'has an array of data' do
35
- expect(AEMO::Market.historic_trading('NSW', 2015, 1).class).to eq(Array)
36
+ expect(described_class.historic_trading('NSW', 2015, 1).class).to eq(Array)
36
37
  end
37
38
  end
38
39
  end
@@ -5,14 +5,14 @@ require 'spec_helper'
5
5
  describe AEMO::Meter do
6
6
  describe 'instance methods' do
7
7
  it 'creates a new instance' do
8
- expect(AEMO::Meter.new).to be_a AEMO::Meter
8
+ expect(described_class.new).to be_a described_class
9
9
  end
10
10
 
11
11
  it 'can be initialized from MSATS mumbo jumbo' do
12
12
  AEMO::MSATS.authorize('ER', 'ER', 'ER')
13
13
  nmi_detail_query = AEMO::MSATS.nmi_detail('4001234567')
14
14
  meter = nmi_detail_query['MeterRegister']['Meter'].first
15
- expect(AEMO::Meter.from_hash(meter)).to be_a AEMO::Meter
15
+ expect(described_class.from_hash(meter)).to be_a described_class
16
16
  end
17
17
  end
18
18
  end