openstudio-analysis 1.0.3 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 81aece25f5a122f27d0ccd5b001cd140d231999f0b9b4746aefd2767f82c1942
4
- data.tar.gz: '0800f95fb398a0e4e7f106709dbaf94315d0501411b6ed4eac03edefb7850f3d'
3
+ metadata.gz: 96f9b0f5f3e8ae95a9efe4389c7d642764442072a18573bbedad60a3ae769252
4
+ data.tar.gz: a0b1b3a971e9fb51d95aef3c6e4e95f0da121d527e7dd43b204b2302a04e84c6
5
5
  SHA512:
6
- metadata.gz: fc49cd8f2ed4eb2b250be27f6d35882c73ae35f8df5ec139cf3109ea8882c5e9ad01b21295815ed845f8dc8d7e8089cf3035c2e64eb0dd4c0097bf170eb6f137
7
- data.tar.gz: 30d3bcc992f6934e6d7e8623c5e40d48b04554ca10947b9ef754c7929e4e94ae962ec49b66b6445c459f98b999b12f9d87cd7819ab247ff7dd26c8cadb1b9963
6
+ metadata.gz: 652a4113d0638a6c738d4f35b8daf96a00f972fa6c7886d7d1179dbccf73d06fcc768cb6f1952b973dadf29e5e7ee09bf687915a81545d7031adad590531167e
7
+ data.tar.gz: 652ad3b9699b047fa904394fd9b4e784952285daf753aba89d1ef6e64f4c3825d25ae22e7806f766005ccf5fcde7f8a000a0ecba0b5b3982628ed3b386c898f8
data/.rubocop.yml CHANGED
@@ -3,6 +3,7 @@ AllCops:
3
3
  - 'spec/files/measures/**/*'
4
4
  - 'spec/files/measures_second_path/**/*'
5
5
  - 'spec/files/worker_init/*'
6
+ - 'update_license.rb'
6
7
 
7
8
  inherit_from:
8
9
  - http://s3.amazonaws.com/openstudio-resources/styles/rubocop_v3.yml
data/CHANGELOG.md CHANGED
@@ -1,6 +1,25 @@
1
1
  OpenStudio Analysis Gem Change Log
2
2
  ==================================
3
3
 
4
+ Version 1.1.0
5
+ --------------------------
6
+ * Allow for blank :seed, :weather_file and :workflow sections of OSA
7
+
8
+ Version 1.0.6
9
+ -------------
10
+ * Always include ../lib to the file paths to search
11
+
12
+ Version 1.0.5
13
+ -------------
14
+ * Upgrade to latest BCL (0.6.1)
15
+ * Remove the need for the measure.json (which has been deprecated in BCL gem). Now parses the measure.xml.
16
+ * Upgrade Faraday (1.0.1)
17
+ * Remove dependency on Nokogiri.
18
+
19
+ Version 1.0.4
20
+ -------------
21
+ * Update dependency Nokogiri
22
+
4
23
  Version 1.0.3
5
24
  -------------
6
25
  * Update dependencies roo and rubyzip
@@ -70,6 +70,7 @@ require 'openstudio/analysis/translator/workflow'
70
70
  # helpers / core_ext
71
71
  require 'openstudio/helpers/string'
72
72
  require 'openstudio/helpers/hash'
73
+ require 'openstudio/helpers/utils'
73
74
 
74
75
  # weather file parsing
75
76
  require 'openstudio/weather/epw'
@@ -58,7 +58,7 @@ module OpenStudio
58
58
  attr_accessor :name
59
59
  attr_reader :analysis_name
60
60
 
61
- require 'nokogiri'
61
+ require 'rexml/document'
62
62
 
63
63
  # Pass in the filename to read
64
64
  def initialize(csv_filename)
@@ -368,16 +368,16 @@ module OpenStudio
368
368
  data = []
369
369
  measures.each_with_index do |measure, measure_index|
370
370
  data[measure_index] = {}
371
- measure_xml, measure_type = find_measure(measure.to_s)
371
+ measure_parsed = find_measure(measure.to_s)
372
372
 
373
- raise "Could not find measure #{measure} xml in measure_paths: '#{@measure_paths.join("\n")}'" unless measure_xml
373
+ raise "Could not find measure #{measure} xml in measure_paths: '#{@measure_paths.join("\n")}'" unless measure_parsed
374
374
  measure_data = {}
375
- measure_data[:classname] = measure_xml.xpath('/measure/class_name').text
376
- measure_data[:name] = measure_xml.xpath('/measure/name').text
377
- measure_data[:display_name] = measure_xml.xpath('/measure/display_name').text
378
- measure_data[:measure_type] = measure_type
379
- measure_data[:uid] = measure_xml.xpath('/measure/uid').text
380
- measure_data[:version_id] = measure_xml.xpath('/measure/version_id').text
375
+ measure_data[:classname] = measure_parsed[:classname]
376
+ measure_data[:name] = measure_parsed[:name]
377
+ measure_data[:display_name] = measure_parsed[:display_name]
378
+ measure_data[:measure_type] = measure_parsed[:measure_type]
379
+ measure_data[:uid] = measure_parsed[:uid]
380
+ measure_data[:version_id] = measure_parsed[:version_id]
381
381
  data[measure_index][:measure_data] = measure_data
382
382
  data[measure_index][:vars] = []
383
383
  vars = measure_map[measure]
@@ -389,8 +389,8 @@ module OpenStudio
389
389
  next if var.to_s == 'None'
390
390
  var_hash = {}
391
391
  found_arg = nil
392
- measure_xml.xpath('/measure/arguments/argument').each do |arg|
393
- if var.to_s == '__SKIP__' || arg.xpath('name').text == var.to_s
392
+ measure_parsed[:arguments].each do |arg|
393
+ if var.to_s == '__SKIP__' || arg[:name] == var.to_s
394
394
  found_arg = arg
395
395
  break
396
396
  end
@@ -404,8 +404,8 @@ module OpenStudio
404
404
  var_type = 'boolean'
405
405
  var_units = ''
406
406
  else
407
- var_type = found_arg.xpath('type').text.downcase
408
- var_units = found_arg.xpath('units')
407
+ var_type = found_arg[:variable_type].downcase
408
+ var_units = found_arg[:units]
409
409
  end
410
410
 
411
411
  var_hash[:name] = var.to_s
@@ -437,7 +437,8 @@ module OpenStudio
437
437
  var_hash[:distribution][:type] = 'discrete'
438
438
  var_hash[:distribution][:units] = var_hash[:units]
439
439
  if var_hash[:type] == 'choice'
440
- var_hash[:distribution][:enumerations] = found_arg.xpath('choices/choice').map { |s| s.xpath('value').text }
440
+ # var_hash[:distribution][:enumerations] = found_arg.xpath('choices/choice').map { |s| s.xpath('value').text }
441
+ # This would need to be updated if we want to do this again... sorry.
441
442
  elsif var_hash[:type] == 'bool'
442
443
  var_hash[:distribution][:enumerations] = []
443
444
  var_hash[:distribution][:enumerations] << true
@@ -447,13 +448,13 @@ module OpenStudio
447
448
  end
448
449
  data[measure_index][:args] = []
449
450
 
450
- measure_xml.xpath('/measure/arguments/argument').each do |arg_xml|
451
+ measure_parsed[:arguments].each do |arg_xml|
451
452
  arg = {}
452
- arg[:value_type] = arg_xml.xpath('type').text.downcase
453
- arg[:name] = arg_xml.xpath('name').text.downcase
454
- arg[:display_name] = arg_xml.xpath('display_name').text.downcase
453
+ arg[:value_type] = arg_xml[:variable_type]
454
+ arg[:name] = arg_xml[:name]
455
+ arg[:display_name] = arg_xml[:display_name].downcase
455
456
  arg[:display_name_short] = arg[:display_name]
456
- arg[:default_value] = arg_xml.xpath('default_value').text.downcase
457
+ arg[:default_value] = arg_xml[:default_value].downcase
457
458
  arg[:value] = arg[:default_value]
458
459
  data[measure_index][:args] << arg
459
460
  end
@@ -470,27 +471,12 @@ module OpenStudio
470
471
  measure_xml = File.join(mp, measure_name, 'measure.xml')
471
472
  measure_rb = File.join(mp, measure_name, 'measure.rb')
472
473
  if File.exist?(measure_xml) && File.exist?(measure_rb)
473
- return Nokogiri::XML File.read(measure_xml), parse_measure_type(measure_rb)
474
+ measure_parsed = parse_measure_xml(measure_xml)
475
+ return measure_parsed
474
476
  end
475
477
  end
476
478
 
477
- return nil, nil
478
- end
479
-
480
- def parse_measure_type(measure_filename)
481
- measure_string = File.read(measure_filename)
482
-
483
- if measure_string =~ /OpenStudio::Ruleset::WorkspaceUserScript/
484
- return 'EnergyPlusMeasure'
485
- elsif measure_string =~ /OpenStudio::Ruleset::ModelUserScript/
486
- return 'RubyMeasure'
487
- elsif measure_string =~ /OpenStudio::Ruleset::ReportingUserScript/
488
- return 'ReportingMeasure'
489
- elsif measure_string =~ /OpenStudio::Ruleset::UtilityUserScript/
490
- return 'UtilityUserScript'
491
- else
492
- raise "measure type is unknown with an inherited class in #{measure_filename}"
493
- end
479
+ return nil
494
480
  end
495
481
  end
496
482
  end
@@ -65,14 +65,15 @@ module OpenStudio
65
65
  @osw_version = '0.0.1'
66
66
  @options = options
67
67
  @file_paths = options[:file_paths] ? options[:file_paths] : []
68
+ @file_paths << '../lib'
68
69
  @measure_paths = options[:measure_paths] ? options[:measure_paths] : []
69
70
 
70
71
  # Initialize static inputs from the OSA
71
- @seed_file = File.basename(@osa[:seed][:path])
72
+ !@osa[:seed].nil? ? @seed_file = File.basename(@osa[:seed][:path]) : @seed_file = ''
72
73
  if @options[:seed]
73
74
  @seed_file = @options[:seed]
74
75
  end
75
- @weather_file = File.basename(@osa[:weather_file][:path])
76
+ !@osa[:weather_file].nil? ? @weather_file = File.basename(@osa[:weather_file][:path]) : @weather_file = ''
76
77
  @osa_id = @osa[:_id]
77
78
  @steps = []
78
79
  @osa[:problem][:workflow].each_with_index do |step, i|
@@ -96,7 +97,7 @@ module OpenStudio
96
97
  step_hash[:modeler_description] = step[:modeler_description] if step[:modeler_description]
97
98
  step_hash[:taxonomy] = step[:taxonomy] if step[:taxonomy]
98
99
  step_hash[:measure_type] = step[:measure_type]
99
- step_hash[:measure_type] = 'ModelMeasure' if step_hash[:measure_type] == 'RubyMeasure'
100
+ step_hash[:measure_type] = 'ModelMeasure'
100
101
  @steps << step_hash
101
102
  end
102
103
  end
@@ -35,6 +35,8 @@
35
35
 
36
36
  module OpenStudio
37
37
  module Analysis
38
- VERSION = '1.0.3'.freeze
38
+ # format should be ^.*\-{1}[a-z]+[0-9]+
39
+ # for example: -rc1, -beta6, -customusecase0
40
+ VERSION = '1.1.0'.freeze
39
41
  end
40
42
  end
@@ -53,8 +53,7 @@ module OpenStudio
53
53
  @items.clear
54
54
  end
55
55
 
56
- # Add a measure to the workflow from a path. Inside the path it is expecting to have a measure.json file
57
- # if not, the BCL gem is used to create the measure.json file.
56
+ # Add a measure to the workflow from a path. This will parse the measure.xml which must exist.
58
57
  #
59
58
  # @params instance_name [String] The name of the instance. This allows for multiple measures to be added to the workflow with uni que names
60
59
  # @params instance_display_name [String] The display name of the instance. This allows for multiple measures to be added to the workflow with unique names
@@ -69,19 +68,11 @@ module OpenStudio
69
68
  end
70
69
 
71
70
  if Dir.exist?(local_path_to_measure) && File.directory?(local_path_to_measure)
72
- # Watch out for namespace conflicts (use ::BCL)
73
- b = ::BCL::ComponentMethods.new
74
71
  measure_hash = nil
75
- unless File.exist?(File.join(local_path_to_measure, 'measure.json'))
76
- measure_hash = b.parse_measure_file(nil, File.join(local_path_to_measure, measure_filename))
77
- File.open(File.join(local_path_to_measure, 'measure.json'), 'w') { |f| f << JSON.pretty_generate(measure_hash) }
78
- warn("measure.json not found in #{local_path_to_measure}, will parse measure file using BCL gem")
79
- end
80
-
81
- if measure_hash.nil? && File.exist?(File.join(local_path_to_measure, 'measure.json'))
82
- measure_hash = JSON.parse(File.read(File.join(local_path_to_measure, 'measure.json')), symbolize_names: true)
83
- elsif measure_hash.nil?
84
- raise 'measure.json was not found and was not automatically created'
72
+ if File.exist?(File.join(local_path_to_measure, 'measure.xml'))
73
+ measure_hash = parse_measure_xml(File.join(local_path_to_measure, 'measure.xml'))
74
+ else
75
+ raise 'Could not find measure.xml'
85
76
  end
86
77
 
87
78
  add_measure(instance_name, instance_display_name, local_path_to_measure, measure_hash)
@@ -92,12 +83,12 @@ module OpenStudio
92
83
  @items.last
93
84
  end
94
85
 
95
- # Add a measure from the custom hash format without reading the measure.rb or measure.json file
86
+ # Add a measure from the custom hash format without reading the measure.rb or measure.xml file
96
87
  #
97
88
  # @params instance_name [String] The name of the instance. This allows for multiple measures to be added to the workflow with unique names
98
89
  # @params instance_display_name [String] The display name of the instance. This allows for multiple measures to be added to the workflow with unique names
99
90
  # @param local_path_to_measure [String] This is the local path to the measure directory, relative or absolute. It is used when zipping up all the measures.
100
- # @param measure_metadata [Hash] Format of the measure.json
91
+ # @param measure_metadata [Hash] Format of the measure.xml in JSON format
101
92
  # @return [Object] Returns the measure that was added as an OpenStudio::AnalysisWorkflowStep object
102
93
  def add_measure(instance_name, instance_display_name, local_path_to_measure, measure_metadata)
103
94
  @items << OpenStudio::Analysis::WorkflowStep.from_measure_hash(instance_name, instance_display_name, local_path_to_measure, measure_metadata)
@@ -110,7 +101,7 @@ module OpenStudio
110
101
  # @params instance_name [String] The name of the instance. This allows for multiple measures to be added to the workflow with unique names
111
102
  # @params instance_display_name [String] The display name of the instance. This allows for multiple measures to be added to the workflow with unique names
112
103
  # @param local_path_to_measure [String] This is the local path to the measure directory, relative or absolute. It is used when zipping up all the measures.
113
- # @param measure_metadata [Hash] Format of the measure.json
104
+ # @param measure_metadata [Hash] Format of the measure.xml in JSON format
114
105
  # @return [Object] Returns the measure that was added as an OpenStudio::AnalysisWorkflowStep object
115
106
  def add_measure_from_analysis_hash(instance_name, instance_display_name, local_path_to_measure, measure_metadata)
116
107
  @items << OpenStudio::Analysis::WorkflowStep.from_analysis_hash(instance_name, instance_display_name, local_path_to_measure, measure_metadata)
@@ -271,29 +262,30 @@ module OpenStudio
271
262
 
272
263
  o = OpenStudio::Analysis::Workflow.new
273
264
 
274
- h[:workflow].each do |wf|
275
- puts "Adding measure #{wf[:name]}"
276
-
277
- # Go though the defined measure paths and try and find the local measure
278
- local_measure_dir = nil
279
- if wf[:measure_definition_directory_local] && Dir.exist?(wf[:measure_definition_directory_local])
280
- local_measure_dir = wf[:measure_definition_directory_local]
281
- else
282
- # search in the measure paths for the measure
283
- OpenStudio::Analysis.measure_paths.each do |p|
284
- test_dir = File.join(p, File.basename(wf[:measure_definition_directory]))
285
- if Dir.exist?(test_dir)
286
- local_measure_dir = test_dir
287
- break
265
+ if h[:workflow]
266
+ h[:workflow].each do |wf|
267
+ puts "Adding measure #{wf[:name]}"
268
+
269
+ # Go though the defined measure paths and try and find the local measure
270
+ local_measure_dir = nil
271
+ if wf[:measure_definition_directory_local] && Dir.exist?(wf[:measure_definition_directory_local])
272
+ local_measure_dir = wf[:measure_definition_directory_local]
273
+ else
274
+ # search in the measure paths for the measure
275
+ OpenStudio::Analysis.measure_paths.each do |p|
276
+ test_dir = File.join(p, File.basename(wf[:measure_definition_directory]))
277
+ if Dir.exist?(test_dir)
278
+ local_measure_dir = test_dir
279
+ break
280
+ end
288
281
  end
289
282
  end
290
- end
291
283
 
292
- raise "Could not find local measure when loading workflow for #{wf[:measure_definition_class_name]} in #{File.basename(wf[:measure_definition_directory])}. You may have to add measure paths to OpenStudio::Analysis.measure_paths" unless local_measure_dir
284
+ raise "Could not find local measure when loading workflow for #{wf[:measure_definition_class_name]} in #{File.basename(wf[:measure_definition_directory])}. You may have to add measure paths to OpenStudio::Analysis.measure_paths" unless local_measure_dir
293
285
 
294
- o.add_measure_from_analysis_hash(wf[:name], wf[:display_name], local_measure_dir, wf)
286
+ o.add_measure_from_analysis_hash(wf[:name], wf[:display_name], local_measure_dir, wf)
287
+ end
295
288
  end
296
-
297
289
  o
298
290
  end
299
291
 
@@ -60,7 +60,7 @@ module OpenStudio
60
60
  @name = ''
61
61
  @display_name = ''
62
62
 
63
- # The type of item being added (RubyMeasure, EnergyPlusMeasure, ...)
63
+ # The type of item being added (ModelMeasure, EnergyPlusMeasure, ...)
64
64
  @type = nil
65
65
 
66
66
  @measure_definition_class_name = nil
@@ -267,15 +267,12 @@ module OpenStudio
267
267
  #
268
268
  # @param instance_name [String] Machine name of the instance
269
269
  # @param instance_display_name [String] Display name of the instance
270
- # @param path_to_measure [String] This is the local path to the measure directroy, relative or absolute. It is used when zipping up all the measures.
271
- # @param hash [Hash] Measure hash in the format of the measure.json (from the Analysis Spreadsheet project)
270
+ # @param path_to_measure [String] This is the local path to the measure directory, relative or absolute. It is used when zipping up all the measures.
271
+ # @param hash [Hash] Measure hash in the format of a converted measure.xml hash (from the Analysis Spreadsheet project)
272
272
  # @param options [Hash] Optional arguments
273
273
  # @option options [Boolean] :ignore_not_found Do not raise an exception if the measure could not be found on the machine
274
274
  # @return [Object] Returns the OpenStudio::Analysis::WorkflowStep
275
275
  def self.from_measure_hash(instance_name, instance_display_name, path_to_measure, hash, options = {})
276
- # TODO: Validate the hash
277
- # TODO: validate that the measure exists?
278
-
279
276
  if File.directory? path_to_measure
280
277
  path_to_measure = File.join(path_to_measure, 'measure.rb')
281
278
  end
@@ -352,7 +349,7 @@ module OpenStudio
352
349
  # @param instance_name [String] Machine name of the instance
353
350
  # @param instance_display_name [String] Display name of the instance
354
351
  # @param path_to_measure [String] This is the local path to the measure directroy, relative or absolute. It is used when zipping up all the measures.
355
- # @param hash [Hash] Measure hash in the format of the measure.json (from the Analysis Spreadsheet project)
352
+ # @param hash [Hash] Measure hash in the format of the measure.xml converted to JSON (from the Analysis Spreadsheet project)
356
353
  # @param options [Hash] Optional arguments
357
354
  # @option options [Boolean] :ignore_not_found Do not raise an exception if the measure could not be found on the machine
358
355
  # @return [Object] Returns the OpenStudio::Analysis::WorkflowStep
@@ -0,0 +1,66 @@
1
+ # *******************************************************************************
2
+ # OpenStudio(R), Copyright (c) 2008-2020, Alliance for Sustainable Energy, LLC.
3
+ # All rights reserved.
4
+ # Redistribution and use in source and binary forms, with or without
5
+ # modification, are permitted provided that the following conditions are met:
6
+ #
7
+ # (1) Redistributions of source code must retain the above copyright notice,
8
+ # this list of conditions and the following disclaimer.
9
+ #
10
+ # (2) Redistributions in binary form must reproduce the above copyright notice,
11
+ # this list of conditions and the following disclaimer in the documentation
12
+ # and/or other materials provided with the distribution.
13
+ #
14
+ # (3) Neither the name of the copyright holder nor the names of any contributors
15
+ # may be used to endorse or promote products derived from this software without
16
+ # specific prior written permission from the respective party.
17
+ #
18
+ # (4) Other than as required in clauses (1) and (2), distributions in any form
19
+ # of modifications or other derivative works may not use the "OpenStudio"
20
+ # trademark, "OS", "os", or any other confusingly similar designation without
21
+ # specific prior written permission from Alliance for Sustainable Energy, LLC.
22
+ #
23
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
24
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
26
+ # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER, THE UNITED STATES
27
+ # GOVERNMENT, OR ANY CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
28
+ # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
29
+ # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
30
+ # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
31
+ # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
32
+ # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
33
+ # EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34
+ # *******************************************************************************
35
+
36
+ require 'rexml/document'
37
+
38
+ def parse_measure_xml(measure_xml_filename)
39
+ measure_hash = {}
40
+ xml_to_parse = File.open(measure_xml_filename)
41
+ xml_root = REXML::Document.new(xml_to_parse).root
42
+
43
+ # pull out some information
44
+ measure_hash[:classname] = xml_root.elements['//measure/class_name'].text
45
+ measure_hash[:name] = xml_root.elements['//measure/name'].text
46
+ measure_hash[:display_name] = xml_root.elements['//measure/display_name'].text
47
+ measure_hash[:display_name_titleized] = measure_hash[:name].titleize
48
+ measure_hash[:measure_type] = xml_root.elements['//measure/attributes/attribute[name="Measure Type"]/value'].text
49
+ measure_hash[:description] = xml_root.elements['//measure/description'].text
50
+ measure_hash[:modeler_description] = xml_root.elements['//measure/modeler_description'].text
51
+ measure_hash[:uid] = xml_root.elements['//measure/uid'].text
52
+ measure_hash[:version_id] = xml_root.elements['//measure/version_id'].text
53
+ measure_hash[:arguments] = []
54
+
55
+ REXML::XPath.each(xml_root, '//measure/arguments/argument') do |arg|
56
+ measure_hash[:arguments] << {
57
+ name: arg.elements['name'].text,
58
+ display_name: arg.elements['display_name'].text,
59
+ variable_type: arg.elements['type'].text.downcase,
60
+ default_value: arg.elements['default_value'].text,
61
+ units: arg.elements['units'] ? arg.elements['units'].text : ''
62
+ }
63
+ end
64
+
65
+ measure_hash
66
+ end
@@ -23,10 +23,9 @@ Gem::Specification.new do |s|
23
23
 
24
24
  s.required_ruby_version = '~> 2.5.0'
25
25
 
26
- s.add_dependency 'bcl', '= 0.5.8'
26
+ s.add_dependency 'bcl', '~> 0.6.1'
27
27
  s.add_dependency 'dencity', '~> 0.1.0'
28
- s.add_dependency 'faraday', '~> 0.14'
29
- s.add_dependency 'nokogiri', '~> 1.8.2'
28
+ s.add_dependency 'faraday', '~> 1.0.1'
30
29
  s.add_dependency 'roo', '~> 2.8.3'
31
30
  s.add_dependency 'rubyzip', '~> 2.3.0'
32
31
  s.add_dependency 'semantic', '~> 1.4'
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: openstudio-analysis
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nicholas Long
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-05-11 00:00:00.000000000 Z
11
+ date: 2021-04-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bcl
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '='
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 0.5.8
19
+ version: 0.6.1
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '='
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 0.5.8
26
+ version: 0.6.1
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: dencity
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -44,28 +44,14 @@ dependencies:
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '0.14'
48
- type: :runtime
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - "~>"
53
- - !ruby/object:Gem::Version
54
- version: '0.14'
55
- - !ruby/object:Gem::Dependency
56
- name: nokogiri
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - "~>"
60
- - !ruby/object:Gem::Version
61
- version: 1.8.2
47
+ version: 1.0.1
62
48
  type: :runtime
63
49
  prerelease: false
64
50
  version_requirements: !ruby/object:Gem::Requirement
65
51
  requirements:
66
52
  - - "~>"
67
53
  - !ruby/object:Gem::Version
68
- version: 1.8.2
54
+ version: 1.0.1
69
55
  - !ruby/object:Gem::Dependency
70
56
  name: roo
71
57
  requirement: !ruby/object:Gem::Requirement
@@ -194,6 +180,7 @@ files:
194
180
  - lib/openstudio/analysis/workflow_step.rb
195
181
  - lib/openstudio/helpers/hash.rb
196
182
  - lib/openstudio/helpers/string.rb
183
+ - lib/openstudio/helpers/utils.rb
197
184
  - lib/openstudio/weather/epw.rb
198
185
  - openstudio-analysis.gemspec
199
186
  - update_license.rb