epb_view_models 1.0.13 → 1.0.14

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8d6b7baac28f53821c21ca4a9e6517bb3f3f0b8abf990aa3899bc8a61ef3c982
4
- data.tar.gz: 9e1a9e515367fca063c6be4b06dc4a7a23ee3563f87fe5ae0d8a40a649d6d5ea
3
+ metadata.gz: ee84c9018a99e7ecc114cd9e16da64303f337d6d53ecd4f243510fdcdeeace59
4
+ data.tar.gz: f2a5ecdb96d373dfc64317ab94a626b9fab1c91b9957de9d765927fdca73f5b2
5
5
  SHA512:
6
- metadata.gz: 43c9884e01d2242b4d89d9cb0f0274a6721aecd484944f523a7aac399d5b890472728384fe35d2892bff273f396e82bf03ca1e5a2e68fc72d430b23509109394
7
- data.tar.gz: dbcdc6c7fac809075b206c908df02ee82affc3a4b13e8115b9e4dccc51ea673d11655a79de7374dd0d3fe54f83e43afbf91dbc3e3d8fa3625b201cb5ad927134
6
+ metadata.gz: bf9fc7e313914c1b34ba94c7ea3dd9f83c6a1ae47b80669e53f01b75b1721f57fb57b356e52eeac54d58d24ba3d03e561ff6e5725f4980a42b02b74d5e971345
7
+ data.tar.gz: cc89d10482409d65e7fadc02fb7db449e2d54bab4f2d7fa8bf45dcc293883201e81d618fbfa36f24eed6c980bd1e65651f89cdda616aa3bc3a75c2d81d40b602
@@ -5,7 +5,7 @@ loader = Zeitwerk::Loader.for_gem
5
5
  loader.setup
6
6
 
7
7
  module EpbViewModels
8
- VERSION = "1.0.13"
8
+ VERSION = "1.0.14"
9
9
  end
10
10
 
11
11
  # Monkey patching to avoid using ActiveRecord::Type::Boolean.new.cast
@@ -0,0 +1,29 @@
1
+ module Presenter::Export
2
+ class Statistics
3
+ def initialize(wrapper)
4
+ @wrapper = wrapper
5
+ @view_model = wrapper.view_model
6
+ end
7
+
8
+ def build
9
+ {
10
+ current_energy_rating: current_energy_rating,
11
+ transaction_type: @view_model.transaction_type,
12
+ }
13
+ rescue NoMethodError
14
+ nil
15
+ end
16
+
17
+ private
18
+
19
+ def current_energy_rating
20
+ view_model_type = @view_model.class.to_s.split("::")[1].downcase
21
+
22
+ if view_model_type.include?("sapschema")
23
+ @view_model.current_energy_rating
24
+ elsif view_model_type.include?("cepc")
25
+ @view_model.energy_efficiency_rating
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,23 @@
1
+ module Presenter
2
+ module ToWarehouse
3
+ class BaseConfiguration
4
+ def to_args
5
+ self.class.args
6
+ end
7
+
8
+ class << self
9
+ KEYS = %i[excludes includes bases preferred_keys list_nodes rootless_list_nodes].freeze
10
+
11
+ KEYS.each do |key|
12
+ define_method key do |arg|
13
+ args[key] = arg
14
+ end
15
+ end
16
+
17
+ def args
18
+ @args ||= {}
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,220 @@
1
+ module Presenter
2
+ module Xml
3
+ class Parser
4
+ def initialize(excludes: [], includes: [], bases: [], preferred_keys: {}, list_nodes: [], rootless_list_nodes: {})
5
+ @excludes = excludes
6
+ @includes = includes
7
+ @bases = bases
8
+ @preferred_keys = preferred_keys
9
+ @list_nodes = list_nodes
10
+ @rootless_list_nodes = rootless_list_nodes
11
+ end
12
+
13
+ def parse(xml)
14
+ sax_parser.parse xml
15
+ last_output
16
+ end
17
+
18
+ def sax_parser
19
+ @assessment_document ||= AssessmentDocument.new excludes: @excludes,
20
+ includes: @includes,
21
+ bases: @bases,
22
+ preferred_keys: @preferred_keys,
23
+ list_nodes: @list_nodes,
24
+ rootless_list_nodes: @rootless_list_nodes
25
+ @sax_parser ||= Nokogiri::XML::SAX::Parser.new @assessment_document
26
+ end
27
+
28
+ private
29
+
30
+ def last_output
31
+ @assessment_document.output
32
+ end
33
+ end
34
+
35
+ class AssessmentDocument < Nokogiri::XML::SAX::Document
36
+ def initialize(excludes: [], includes: [], bases: [], preferred_keys: {}, list_nodes: [], rootless_list_nodes: {})
37
+ @excludes = excludes
38
+ @includes = includes
39
+ @bases = bases
40
+ @preferred_keys = preferred_keys
41
+ @list_nodes = list_nodes
42
+ @rootless_list_nodes = rootless_list_nodes
43
+ super()
44
+ end
45
+
46
+ def start_document
47
+ init!
48
+ @output = {}
49
+ end
50
+
51
+ def end_document
52
+ init!
53
+ end
54
+
55
+ def start_element_namespace(name, attrs = nil, _prefix = nil, _uri = nil, _namespace = nil)
56
+ @source_position << name
57
+ @output_position << root_key_for_list if at_rootless_list_node_item?
58
+ @output_position << as_key(name) unless is_base?(name)
59
+ @is_excluding = true if @excludes.include?(name)
60
+ @is_including = true if @includes.include?(name)
61
+ super
62
+ if encountered_position? || at_list_node_item?
63
+ set_up_list
64
+ end
65
+ write_encounter
66
+ end
67
+
68
+ def start_element(_name, attrs = nil)
69
+ @attrs = attrs
70
+ end
71
+
72
+ def end_element_namespace(name, _prefix = nil, _uri = nil)
73
+ @output_position.pop unless is_base?(name)
74
+ @output_position.pop if at_rootless_list_node_item?
75
+ @source_position.pop
76
+ @is_excluding = false if @excludes.include?(name)
77
+ @is_including = false if @includes.include?(name)
78
+ end
79
+
80
+ def characters(string)
81
+ if @is_excluding && !@is_including
82
+ return
83
+ end
84
+
85
+ stripped = string.strip
86
+ if stripped.length.zero?
87
+ return
88
+ end
89
+
90
+ value = try_as_number stripped
91
+
92
+ if @attrs.length.positive?
93
+ value = @attrs.to_h.merge({ "value" => value })
94
+ end
95
+
96
+ set_value value
97
+ end
98
+
99
+ attr_reader :output
100
+
101
+ private
102
+
103
+ def init!
104
+ @source_position = []
105
+ @output_position = []
106
+ @is_excluding = false
107
+ @is_including = false
108
+ @attrs = []
109
+ @encountered = []
110
+ end
111
+
112
+ def as_key(name)
113
+ if @preferred_keys.key?(name)
114
+ return @preferred_keys[name]
115
+ end
116
+
117
+ name.downcase.gsub("-", "_")
118
+ end
119
+
120
+ def set_value(value)
121
+ set_value_with_keys(value, @output_position)
122
+ end
123
+
124
+ def set_value_with_keys(value, keys)
125
+ prepare_hash keys
126
+ *key, last = keys
127
+ key.inject(@output, :fetch)[last] = value
128
+ end
129
+
130
+ def value_at(keys)
131
+ keys.inject(@output, :fetch)
132
+ rescue IndexError
133
+ nil
134
+ end
135
+
136
+ def prepare_hash(keys)
137
+ cursor = @output
138
+ keys[..-2].each do |key|
139
+ cursor[key] = {} unless cursor[key] && cursor[key] != ""
140
+ cursor = cursor[key]
141
+ end
142
+ end
143
+
144
+ def is_base?(name)
145
+ @bases.concat(@excludes).include?(name) || name == @source_position[0]
146
+ end
147
+
148
+ def is_numeric?(string)
149
+ true if Float(string)
150
+ rescue StandardError
151
+ false
152
+ end
153
+
154
+ def try_as_number(string)
155
+ return string unless is_numeric?(string)
156
+
157
+ if string.include?(".")
158
+ string.to_f
159
+ else
160
+ string.to_i
161
+ end
162
+ end
163
+
164
+ def write_encounter
165
+ @encountered << source_position_string
166
+ end
167
+
168
+ def encountered_position?
169
+ @encountered.include? source_position_string
170
+ end
171
+
172
+ def source_position_string
173
+ @source_position.join(">")
174
+ end
175
+
176
+ def set_up_list
177
+ return if @output_position.any? { |x| x.is_a? Integer } && !at_list_node_item?
178
+
179
+ candidate_list = value_at @output_position[..-2]
180
+
181
+ case candidate_list
182
+ when Array
183
+ list_index = candidate_list.length
184
+ when nil
185
+ set_value_with_keys([], @output_position[..-2])
186
+ list_index = 0
187
+ else
188
+ set_value_with_keys([candidate_list.values[0]], @output_position[..-2])
189
+ list_index = 1
190
+ end
191
+
192
+ @output_position[-1] = list_index
193
+ end
194
+
195
+ def at_list_node_item?
196
+ @list_nodes.include?(@source_position[-2]) || at_rootless_list_node_item?
197
+ end
198
+
199
+ def at_rootless_list_node_item?
200
+ return unless @rootless_list_nodes.key?(@source_position[-1])
201
+
202
+ case value = @rootless_list_nodes[@source_position[-1]]
203
+ when String
204
+ true
205
+ else
206
+ value[:parents].all? { |val| @source_position.include? val }
207
+ end
208
+ end
209
+
210
+ def root_key_for_list
211
+ case value = @rootless_list_nodes[@source_position[-1]]
212
+ when String
213
+ value
214
+ else
215
+ value[:key]
216
+ end
217
+ end
218
+ end
219
+ end
220
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: epb_view_models
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.13
4
+ version: 1.0.14
5
5
  platform: ruby
6
6
  authors:
7
7
  - MHCLG Energy Performance of Buildings
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-10-19 00:00:00.000000000 Z
11
+ date: 2021-10-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri
@@ -1655,12 +1655,16 @@ files:
1655
1655
  - lib/presenter/export/base.rb
1656
1656
  - lib/presenter/export/commercial.rb
1657
1657
  - lib/presenter/export/domestic.rb
1658
+ - lib/presenter/export/statistics.rb
1659
+ - lib/presenter/rd_sap/export_configuration.rb
1658
1660
  - lib/presenter/rd_sap/recommendation_report.rb
1659
1661
  - lib/presenter/rd_sap/report.rb
1660
1662
  - lib/presenter/rd_sap/summary.rb
1661
1663
  - lib/presenter/sap/recommendation_report.rb
1662
1664
  - lib/presenter/sap/report.rb
1663
1665
  - lib/presenter/sap/summary.rb
1666
+ - lib/presenter/to_warehouse/base_configuration.rb
1667
+ - lib/presenter/xml/parser.rb
1664
1668
  - lib/presenter/xsd.rb
1665
1669
  - lib/view_model/ac_cert_wrapper.rb
1666
1670
  - lib/view_model/ac_report_wrapper.rb