aemo 0.1.39 → 0.1.40

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,10 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'nokogiri'
2
4
  require 'json'
3
5
  require 'csv'
4
6
  require 'active_support/all'
5
7
 
6
8
  @path = Dir.pwd
7
- @files = Dir.entries(@path).reject { |f| %w(. ..).include?(f) }
9
+ @files = Dir.entries(@path).reject { |f| %w[. ..].include?(f) }
8
10
 
9
11
  @mlf_data = {}
10
12
  @dlf_data = {}
@@ -12,26 +14,38 @@ require 'active_support/all'
12
14
  # Let's get the CSV Data first
13
15
 
14
16
  # TNI to MLF
15
- file_contents = File.read(File.join(@path, 'tni-mlf-codes.csv')).encode('UTF-8', 'binary', invalid: :replace, undef: :replace, replace: '')
17
+ file_contents = File.read(File.join(@path, 'tni-mlf-codes.csv'))
18
+ .encode('UTF-8', 'binary', invalid: :replace,
19
+ undef: :replace, replace: '')
16
20
  CSV.parse(file_contents, headers: true, converters: :numeric).each do |row|
17
- @mlf_data[row['TNI']] ||= { location: row['Location'], voltage: row['Voltage'], loss_factors: [] }
18
- row.headers.select{|x| x =~ %r{^FY\d{2}$}}.sort.reverse.each do |fin_year|
21
+ @mlf_data[row['TNI']] ||= { location: row['Location'],
22
+ voltage: row['Voltage'],
23
+ loss_factors: [] }
24
+ row.headers.select { |x| x =~ /^FY\d{2}$/ }.sort.reverse.each do |fin_year|
19
25
  year = "20#{fin_year.match(/FY(\d{2})/)[1]}".to_i
20
- @mlf_data[row['TNI']][:loss_factors] << { start: DateTime.parse("#{year - 1}-07-01T00:00:00+1000"), finish: DateTime.parse("#{year}-07-01T00:00:00+1000"), value: row[fin_year] }
26
+ @mlf_data[row['TNI']][:loss_factors] << {
27
+ start: DateTime.parse("#{year - 1}-07-01T00:00:00+1000"),
28
+ finish: DateTime.parse("#{year}-07-01T00:00:00+1000"),
29
+ value: row[fin_year]
30
+ }
21
31
  end
22
32
  end
23
33
 
24
34
  # TNI to MLF
25
- CSV.open(File.join(@path, 'aemo-dlf-dnsp.csv'), headers: true, converters: :numeric).each do |row|
35
+ CSV.open(File.join(@path, 'aemo-dlf-dnsp.csv'),
36
+ headers: true, converters: :numeric).each do |row|
26
37
  @dlf_data[row['dlf_code']] ||= row['nsp_code']
27
38
  end
28
39
 
29
40
  # Now to create the DLF and TNI output JSON files for use
30
- @files.select { |x| ['aemo-tni.xml', 'aemo-dlf.xml'].include?(x) }.each do |file|
41
+ @files.select { |x| ['aemo-tni.xml', 'aemo-dlf.xml'].include?(x) }
42
+ .each do |file|
31
43
  output_file = file.gsub('.xml', '.json')
32
44
  output_data = {}
33
45
  open_file = File.open(File.join(@path, file))
34
- xml = Nokogiri::XML(open_file) { |c| c.options = Nokogiri::XML::ParseOptions::NOBLANKS }
46
+ xml = Nokogiri::XML(open_file) do |c|
47
+ c.options = Nokogiri::XML::ParseOptions::NOBLANKS
48
+ end
35
49
  open_file.close
36
50
 
37
51
  xml.xpath('//Row').each do |row|
@@ -47,10 +61,12 @@ end
47
61
  output_data_instance[:mlf_data] = {}
48
62
  unless @mlf_data[code].nil?
49
63
  output_data_instance[:mlf_data] = @mlf_data[code].deep_dup
50
- output_data_instance[:mlf_data][:loss_factors] = output_data_instance[:mlf_data][:loss_factors].reject do |x|
51
- DateTime.parse(output_data_instance['ToDate']) < x[:start] || DateTime.parse(output_data_instance['FromDate']) >= x[:finish]
64
+ output_data_instance[:mlf_data][:loss_factors].reject! do |x|
65
+ DateTime.parse(output_data_instance['ToDate']) < x[:start] ||
66
+ DateTime.parse(output_data_instance['FromDate']) >= x[:finish]
52
67
  end
53
- puts "output_data_instance[:mlf_data][:loss_factors]: #{output_data_instance[:mlf_data][:loss_factors].inspect}"
68
+ puts 'output_data_instance[:mlf_data][:loss_factors]: ' \
69
+ "#{output_data_instance[:mlf_data][:loss_factors].inspect}"
54
70
  end
55
71
  elsif file =~ /dlf/
56
72
  output_data_instance[:nsp_code] = @dlf_data[code]
data/spec/aemo_spec.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require File.expand_path(File.join(File.dirname(__FILE__), 'spec_helper'))
2
4
 
3
5
  describe AEMO do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe AEMO::Market::Interval do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe AEMO::Market::Node do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe AEMO::Market do
@@ -30,7 +32,7 @@ describe AEMO::Market do
30
32
 
31
33
  describe '.historic_trading' do
32
34
  it 'has an array of data' do
33
- expect(AEMO::Market.historic_trading('NSW', 2015, 01).class).to eq(Array)
35
+ expect(AEMO::Market.historic_trading('NSW', 2015, 1).class).to eq(Array)
34
36
  end
35
37
  end
36
38
  end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe AEMO::Meter do
6
+ describe 'instance methods' do
7
+ it 'creates a new instance' do
8
+ expect(AEMO::Meter.new).to be_a AEMO::Meter
9
+ end
10
+
11
+ it 'can be initialized from MSATS mumbo jumbo' do
12
+ AEMO::MSATS.authorize('ER', 'ER', 'ER')
13
+ nmi_detail_query = AEMO::MSATS.nmi_detail('4001234567')
14
+ meter = nmi_detail_query['MeterRegister']['Meter'].first
15
+ expect(AEMO::Meter.from_hash(meter)).to be_a AEMO::Meter
16
+ end
17
+ end
18
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe AEMO::MSATS do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
  require 'json'
3
5
 
@@ -10,12 +12,24 @@ describe AEMO::NEM12 do
10
12
  end
11
13
  end
12
14
 
15
+ describe '#nmi_identifier' do
16
+ it 'returns the NMI identifier or nil' do
17
+ Dir.entries(File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'NEM12'))
18
+ .reject { |f| %w[. .. .DS_Store].include?(f) }
19
+ .each do |file|
20
+ AEMO::NEM12.parse_nem12_file(fixture(File.join('NEM12', file))).each do |nem12|
21
+ expect(nem12.nmi_identifier).to be_a String
22
+ end
23
+ end
24
+ end
25
+ end
26
+
13
27
  describe '#parse_nem12' do
14
28
  end
15
29
 
16
30
  describe '.parse_nem12_file' do
17
31
  it 'should parse a file' do
18
- Dir.entries(File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'NEM12')).reject { |f| %w(. .. .DS_Store).include?(f) }.each do |file|
32
+ Dir.entries(File.join(File.dirname(__FILE__), '..', '..', 'fixtures', 'NEM12')).reject { |f| %w[. .. .DS_Store].include?(f) }.each do |file|
19
33
  expect(AEMO::NEM12.parse_nem12_file(fixture(File.join('NEM12', file))).length).not_to eq(0)
20
34
  end
21
35
  end
@@ -52,5 +66,11 @@ describe AEMO::NEM12 do
52
66
  end
53
67
 
54
68
  describe '#flag_to_s' do
69
+ it 'converts the flags to a string' do
70
+ flag = { quality_flag: 'S', method_flag: 11, reason_code: 53 }
71
+ nem12 = AEMO::NEM12.new('NEEE000010')
72
+ expect(nem12.flag_to_s(flag))
73
+ .to eq 'Substituted Data - Check - Bees/Wasp In Meter Box'
74
+ end
55
75
  end
56
76
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
  require 'json'
3
5
 
@@ -90,6 +92,7 @@ describe AEMO::NMI do
90
92
  end
91
93
  end
92
94
  end
95
+
93
96
  describe '#valid_nmi?' do
94
97
  it 'should validate nmi' do
95
98
  json.each do |nmi|
@@ -153,7 +156,7 @@ describe AEMO::NMI do
153
156
  end
154
157
  it 'should return a friendly address if the address is a nested hash' do
155
158
  nmi = AEMO::NMI.new('4001234567')
156
- nmi.address = { house: { number: '1', suffix: 'B' }, street: 'Bob', street_type: 'Street', }
159
+ nmi.address = { house: { number: '1', suffix: 'B' }, street: 'Bob', street_type: 'Street' }
157
160
  expect(nmi.friendly_address).to eq('1 B, Bob, Street')
158
161
  end
159
162
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe AEMO::Region do
data/spec/spec_helper.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'coveralls'
2
4
  require 'simplecov'
3
5
  require 'webmock/rspec'
@@ -21,6 +23,14 @@ RSpec.configure do |config|
21
23
  csv_headers = { 'Content-Type' => 'text/csv' }
22
24
  xml_headers = { 'Content-Type' => 'text/xml' }
23
25
 
26
+ # Updated Market Data
27
+ stub_request(:get, 'https://aemo.com.au/aemo/data/nem/priceanddemand/PRICE_AND_DEMAND_201501_NSW1.csv')
28
+ .with(headers: { 'Accept' => '*/*', 'User-Agent' => 'Ruby' })
29
+ .to_return(status: 200, body: File.new('spec/fixtures/Market/DATA201501_NSW1.csv'), headers: csv_headers)
30
+ stub_request(:get, 'https://aemo.com.au/aemo/data/nem/priceanddemand/PRICE_AND_DEMAND_201502_NSW1.csv')
31
+ .with(headers: { 'Accept' => '*/*', 'User-Agent' => 'Ruby' })
32
+ .to_return(status: 200, body: File.new('spec/fixtures/Market/DATA201502_NSW1.csv'), headers: csv_headers)
33
+
24
34
  # Market Data
25
35
  stub_request(:get, 'http://www.nemweb.com.au/mms.GRAPHS/GRAPHS/GRAPH_5NSW1.csv')
26
36
  .with(headers: { 'Accept' => '*/*', 'User-Agent' => 'Ruby' })
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aemo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.39
4
+ version: 0.1.40
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joel Courtney
@@ -46,26 +46,6 @@ dependencies:
46
46
  - - ">="
47
47
  - !ruby/object:Gem::Version
48
48
  version: 1.6.8
49
- - !ruby/object:Gem::Dependency
50
- name: rubyzip
51
- requirement: !ruby/object:Gem::Requirement
52
- requirements:
53
- - - "~>"
54
- - !ruby/object:Gem::Version
55
- version: '1.1'
56
- - - ">="
57
- - !ruby/object:Gem::Version
58
- version: 1.1.7
59
- type: :runtime
60
- prerelease: false
61
- version_requirements: !ruby/object:Gem::Requirement
62
- requirements:
63
- - - "~>"
64
- - !ruby/object:Gem::Version
65
- version: '1.1'
66
- - - ">="
67
- - !ruby/object:Gem::Version
68
- version: 1.1.7
69
49
  - !ruby/object:Gem::Dependency
70
50
  name: multi_xml
71
51
  requirement: !ruby/object:Gem::Requirement
@@ -92,40 +72,40 @@ dependencies:
92
72
  requirements:
93
73
  - - "~>"
94
74
  - !ruby/object:Gem::Version
95
- version: '0.13'
75
+ version: 0.13.0
96
76
  - - ">="
97
77
  - !ruby/object:Gem::Version
98
- version: 0.13.1
78
+ version: 0.13.7
99
79
  type: :runtime
100
80
  prerelease: false
101
81
  version_requirements: !ruby/object:Gem::Requirement
102
82
  requirements:
103
83
  - - "~>"
104
84
  - !ruby/object:Gem::Version
105
- version: '0.13'
85
+ version: 0.13.0
106
86
  - - ">="
107
87
  - !ruby/object:Gem::Version
108
- version: 0.13.1
88
+ version: 0.13.7
109
89
  - !ruby/object:Gem::Dependency
110
90
  name: activesupport
111
91
  requirement: !ruby/object:Gem::Requirement
112
92
  requirements:
113
- - - ">="
93
+ - - "~>"
114
94
  - !ruby/object:Gem::Version
115
- version: 4.0.0
116
- - - "<"
95
+ version: '4.2'
96
+ - - ">="
117
97
  - !ruby/object:Gem::Version
118
- version: '5.1'
98
+ version: 4.2.6
119
99
  type: :runtime
120
100
  prerelease: false
121
101
  version_requirements: !ruby/object:Gem::Requirement
122
102
  requirements:
123
- - - ">="
103
+ - - "~>"
124
104
  - !ruby/object:Gem::Version
125
- version: 4.0.0
126
- - - "<"
105
+ version: '4.2'
106
+ - - ">="
127
107
  - !ruby/object:Gem::Version
128
- version: '5.1'
108
+ version: 4.2.6
129
109
  - !ruby/object:Gem::Dependency
130
110
  name: listen
131
111
  requirement: !ruby/object:Gem::Requirement
@@ -372,20 +352,20 @@ dependencies:
372
352
  requirements:
373
353
  - - "~>"
374
354
  - !ruby/object:Gem::Version
375
- version: '0.41'
355
+ version: 0.41.0
376
356
  - - ">="
377
357
  - !ruby/object:Gem::Version
378
- version: 0.41.1
358
+ version: 0.41.2
379
359
  type: :development
380
360
  prerelease: false
381
361
  version_requirements: !ruby/object:Gem::Requirement
382
362
  requirements:
383
363
  - - "~>"
384
364
  - !ruby/object:Gem::Version
385
- version: '0.41'
365
+ version: 0.41.0
386
366
  - - ">="
387
367
  - !ruby/object:Gem::Version
388
- version: 0.41.1
368
+ version: 0.41.2
389
369
  - !ruby/object:Gem::Dependency
390
370
  name: timecop
391
371
  requirement: !ruby/object:Gem::Requirement
@@ -421,11 +401,13 @@ files:
421
401
  - lib/aemo/market.rb
422
402
  - lib/aemo/market/interval.rb
423
403
  - lib/aemo/market/node.rb
404
+ - lib/aemo/meter.rb
424
405
  - lib/aemo/msats.rb
425
406
  - lib/aemo/nem12.rb
426
407
  - lib/aemo/nem13.rb
427
408
  - lib/aemo/nmi.rb
428
409
  - lib/aemo/region.rb
410
+ - lib/aemo/register.rb
429
411
  - lib/aemo/version.rb
430
412
  - lib/data/TNI-MLF-Codes.csv
431
413
  - lib/data/aemo-dlf-dnsp.csv
@@ -548,6 +530,7 @@ files:
548
530
  - spec/lib/aemo/market/interval_spec.rb
549
531
  - spec/lib/aemo/market/node_spec.rb
550
532
  - spec/lib/aemo/market_spec.rb
533
+ - spec/lib/aemo/meter_spec.rb
551
534
  - spec/lib/aemo/msats_spec.rb
552
535
  - spec/lib/aemo/nem12_spec.rb
553
536
  - spec/lib/aemo/nmi_spec.rb
@@ -574,7 +557,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
574
557
  version: '0'
575
558
  requirements: []
576
559
  rubyforge_project:
577
- rubygems_version: 2.6.6
560
+ rubygems_version: 2.6.13
578
561
  signing_key:
579
562
  specification_version: 4
580
563
  summary: Gem providing functionality for the Australian Energy Market Operator data
@@ -693,6 +676,7 @@ test_files:
693
676
  - spec/lib/aemo/market/interval_spec.rb
694
677
  - spec/lib/aemo/market/node_spec.rb
695
678
  - spec/lib/aemo/market_spec.rb
679
+ - spec/lib/aemo/meter_spec.rb
696
680
  - spec/lib/aemo/msats_spec.rb
697
681
  - spec/lib/aemo/nem12_spec.rb
698
682
  - spec/lib/aemo/nmi_spec.rb