epb_view_models 1.1.0 → 1.1.1

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: bb1400b5f7e348d8faa00a740a05fda91b63508dc54848597150190091497f94
4
- data.tar.gz: 8227ef648550ae4bb20ebae33ad5699ff8f35130e8541856343afd1b445c751a
3
+ metadata.gz: 55af1696774f619abfd51d7e2dc91ad38e91544f4d5054a006e3ec40bbac0670
4
+ data.tar.gz: 7c8eb84beb1d7b9e9c7c1be32cd941fe3fdbe2733c26421e11e60535ac95f172
5
5
  SHA512:
6
- metadata.gz: 7cbbf2d87318be4ad27d66f050d6d5ff8a3ef28148a6cc143242796aab3e607d3ecc435df445451ddd31a776a39021b750a948c9bd7a3f06ab6a195ee95a29ea
7
- data.tar.gz: 42174b098a15ba44281c3172b6bc6e438c30f06513372af3b591f1b06664b6d29593b6b0a8ba9cdc44397d797386b5edd1f29fb2ce919887e21beee89c774c62
6
+ metadata.gz: 4aedfe8e74dc369c073b4c7a2e3b38ca7fccd8ed8407fe3166cd83191c59975f698aab5006e2ce33d744cfa8075745fe128e3bc5807b8d51a1042b5992e64cde
7
+ data.tar.gz: e86ba1d04baf7af22307a7078ba04541bbafb3630264fb65bfab25b914a89fbba4672436b49c04d296556c2de270933167382a0a90279553b2ff907e422acb9a
@@ -0,0 +1,50 @@
1
+ require "singleton"
2
+
3
+ module Accessor
4
+ class DomesticRecommendationsAccessor
5
+ include Singleton
6
+
7
+ RecommendationDetails = Struct.new(:summary, :description, keyword_init: true)
8
+
9
+ def fetch_details(schema_version:, improvement_number:)
10
+ unless memoized_schema?(schema_version)
11
+ assessment_type = schema_version.split("-").first
12
+ is_ni = schema_version.include? "-NI-"
13
+ definitions_document = Nokogiri::XML(File.open("api/schemas/xml/#{schema_version}/#{assessment_type}/ExternalDefinitions.xml"))
14
+ sub_object = {}
15
+ country_node = definitions_document.at_xpath("//Country[Country-Code[contains(text(), '#{is_ni ? 'NIR' : 'EAW'}')]]")
16
+ recommendations = country_node.search("Recommendation")
17
+ recommendations.each do |recommendation|
18
+ sub_object[recommendation.at_css("Improvement-Number").content] = {
19
+ summary: recommendation.at_css("Improvement-Summary[language='1']").content,
20
+ description: recommendation.at_css("Improvement-Description[language='1']").content,
21
+ }
22
+ end
23
+ memoize_schema_hash(schema_version, sub_object)
24
+ end
25
+ RecommendationDetails.new(**memoized_schema(schema_version)[improvement_number])
26
+ end
27
+
28
+ def reset!
29
+ @memo = nil
30
+ end
31
+
32
+ private
33
+
34
+ def memo
35
+ @memo ||= {}
36
+ end
37
+
38
+ def memoized_schema?(schema_version)
39
+ memo.key?(schema_version)
40
+ end
41
+
42
+ def memoize_schema_hash(schema_version, hash)
43
+ memo[schema_version] = hash
44
+ end
45
+
46
+ def memoized_schema(schema_version)
47
+ memo[schema_version]
48
+ end
49
+ end
50
+ end
@@ -5,7 +5,7 @@ loader = Zeitwerk::Loader.for_gem(warn_on_extra_files: false)
5
5
  loader.setup
6
6
 
7
7
  module EpbViewModels
8
- VERSION = "1.1.0"
8
+ VERSION = "1.1.1"
9
9
  end
10
10
 
11
11
  # Monkey patching to avoid using ActiveRecord::Type::Boolean.new.cast
@@ -10,8 +10,6 @@ module Presenter
10
10
  end
11
11
 
12
12
  def to_domestic_digest
13
-
14
-
15
13
  {
16
14
  type_of_assessment: TYPE_OF_ASSESSMENT,
17
15
  assessment_id: @view_model.assessment_id,
@@ -35,7 +35,7 @@ module Presenter
35
35
  total_floor_area: @view_model.total_floor_area.to_s,
36
36
  has_mains_gas: @view_model.mains_gas,
37
37
  current_energy_efficiency_rating: @view_model.current_energy_rating,
38
- type_of_property: Helper::XmlEnumsToOutput.property_type(@view_model.property_type),
38
+ type_of_property: Helper::XmlEnumsToOutput.property_type(@view_model.property_type),
39
39
  }
40
40
  end
41
41
  end
@@ -117,15 +117,16 @@ module ViewModel
117
117
  end
118
118
 
119
119
  def recommendations_for_report
120
+ accessor = Accessor::DomesticRecommendationsAccessor.instance
120
121
  @xml_doc
121
122
  .search("Suggested-Improvements Improvement")
122
123
  .map do |node|
124
+ improvement_code = xpath(%w[Improvement-Details Improvement-Number], node)
123
125
  {
124
126
  sequence: xpath(%w[Sequence], node).to_i,
125
- improvement_summary: xpath(%w[Improvement-Summary], node),
126
- improvement_description: xpath(%w[Improvement-Description], node),
127
- improvement_code:
128
- xpath(%w[Improvement-Details Improvement-Number], node),
127
+ improvement_code: xpath(%w[Improvement-Details Improvement-Number], node),
128
+ improvement_summary: improvement_code ? accessor.fetch_details(schema_version: "RdSAP-Schema-20.0.0", improvement_number: improvement_code).summary : xpath(%w[Improvement-Summary], node),
129
+ improvement_description: improvement_code ? accessor.fetch_details(schema_version: "RdSAP-Schema-20.0.0", improvement_number: improvement_code).description : xpath(%w[Improvement-Description], node),
129
130
  indicative_cost: xpath(%w[Indicative-Cost], node),
130
131
  }
131
132
  end
@@ -112,13 +112,15 @@ module ViewModel
112
112
  end
113
113
 
114
114
  def recommendations_for_report
115
+ accessor = Accessor::DomesticRecommendationsAccessor.instance
115
116
  @xml_doc
116
117
  .search("Suggested-Improvements Improvement")
117
118
  .map do |node|
119
+ improvement_code = xpath(%w[Improvement-Details Improvement-Number], node)
118
120
  {
119
121
  sequence: xpath(%w[Sequence], node).to_i,
120
- improvement_summary: xpath(%w[Improvement-Summary], node),
121
- improvement_description: xpath(%w[Improvement-Description], node),
122
+ improvement_summary: improvement_code ? accessor.fetch_details(schema_version: "SAP-Schema-18.0.0", improvement_number: improvement_code).summary : xpath(%w[Improvement-Summary], node),
123
+ improvement_description: improvement_code ? accessor.fetch_details(schema_version: "SAP-Schema-18.0.0", improvement_number: improvement_code).description : xpath(%w[Improvement-Description], node),
122
124
  improvement_code:
123
125
  xpath(%w[Improvement-Details Improvement-Number], node),
124
126
  indicative_cost: xpath(%w[Indicative-Cost], node),
@@ -114,13 +114,15 @@ module ViewModel
114
114
  end
115
115
 
116
116
  def recommendations_for_report
117
+ accessor = Accessor::DomesticRecommendationsAccessor.instance
117
118
  @xml_doc
118
119
  .search("Suggested-Improvements Improvement")
119
120
  .map do |node|
121
+ improvement_code = xpath(%w[Improvement-Details Improvement-Number], node)
120
122
  {
121
123
  sequence: xpath(%w[Sequence], node).to_i,
122
- improvement_summary: xpath(%w[Improvement-Summary], node),
123
- improvement_description: xpath(%w[Improvement-Description], node),
124
+ improvement_summary: improvement_code ? accessor.fetch_details(schema_version: "SAP-Schema-19.0.0", improvement_number: improvement_code).summary : xpath(%w[Improvement-Summary], node),
125
+ improvement_description: improvement_code ? accessor.fetch_details(schema_version: "SAP-Schema-19.0.0", improvement_number: improvement_code).description : xpath(%w[Improvement-Description], node),
124
126
  improvement_code:
125
127
  xpath(%w[Improvement-Details Improvement-Number], node),
126
128
  indicative_cost: xpath(%w[Indicative-Cost], node),
@@ -114,13 +114,15 @@ module ViewModel
114
114
  end
115
115
 
116
116
  def recommendations_for_report
117
+ accessor = Accessor::DomesticRecommendationsAccessor.instance
117
118
  @xml_doc
118
119
  .search("Suggested-Improvements Improvement")
119
120
  .map do |node|
121
+ improvement_code = xpath(%w[Improvement-Details Improvement-Number], node)
120
122
  {
121
123
  sequence: xpath(%w[Sequence], node).to_i,
122
- improvement_summary: xpath(%w[Improvement-Summary], node),
123
- improvement_description: xpath(%w[Improvement-Description], node),
124
+ improvement_summary: improvement_code ? accessor.fetch_details(schema_version: "SAP-Schema-19.1.0", improvement_number: improvement_code).summary : xpath(%w[Improvement-Summary], node),
125
+ improvement_description: improvement_code ? accessor.fetch_details(schema_version: "SAP-Schema-19.1.0", improvement_number: improvement_code).description : xpath(%w[Improvement-Description], node),
124
126
  improvement_code:
125
127
  xpath(%w[Improvement-Details Improvement-Number], node),
126
128
  indicative_cost: xpath(%w[Indicative-Cost], node),
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.1.0
4
+ version: 1.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - DLUHC Energy Performance of Buildings
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-04-12 00:00:00.000000000 Z
11
+ date: 2023-04-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri
@@ -1658,6 +1658,7 @@ files:
1658
1658
  - api/schemas/xml/examples/SAP-18.0.0.xml
1659
1659
  - api/schemas/xml/examples/SAP-NI-18.0.0.xml
1660
1660
  - epb_view_models.gemspec
1661
+ - lib/accessor/domestic_recommendations_accessor.rb
1661
1662
  - lib/epb_view_models.rb
1662
1663
  - lib/helper/ac_report_extraction.rb
1663
1664
  - lib/helper/energy_band_calculator.rb
@@ -1883,7 +1884,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
1883
1884
  - !ruby/object:Gem::Version
1884
1885
  version: '0'
1885
1886
  requirements: []
1886
- rubygems_version: 3.3.7
1887
+ rubygems_version: 3.3.26
1887
1888
  signing_key:
1888
1889
  specification_version: 4
1889
1890
  summary: Library used to parse Energy Performance Certificates (EPC)