openstudio-extension 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -810,6 +810,7 @@ module OsLib_Reporting
810
810
  summary_types << ['Heating Capacity', 'maxHeatingCapacity', 'W', 1, 'Btu/hr', 1]
811
811
  summary_types << ['Cooling Capacity', 'maxCoolingCapacity', 'W', 1, 'ton', 1]
812
812
  summary_types << ['Water Flow Rate', 'maxWaterFlowRate', 'm^3/s', 4, 'gal/min', 2]
813
+ summary_types << ['Rated Power', 'ratedPower', 'W', 1, 'W', 1]
813
814
  summary_types.each do |s|
814
815
  val_name = s[0]
815
816
  val_method = s[1]
@@ -1212,37 +1213,34 @@ module OsLib_Reporting
1212
1213
  thermal_zones.each do |zone|
1213
1214
  total_loop_floor_area += zone.floorArea
1214
1215
  end
1215
- #julien
1216
+
1216
1217
  source_units = 'm^2'
1217
1218
  if is_ip_units
1218
1219
  target_units = 'ft^2'
1219
1220
  else
1220
1221
  target_units = source_units
1221
1222
  end
1222
- total_loop_floor_area_ip = OpenStudio.convert(total_loop_floor_area, source_units, target_units).get
1223
- total_loop_floor_area_ip_neat = OpenStudio.toNeatString(total_loop_floor_area_ip, 0, true)
1223
+ total_loop_floor_area = OpenStudio.convert(total_loop_floor_area, source_units, target_units).get
1224
+ total_loop_floor_area_neat = OpenStudio.toNeatString(total_loop_floor_area, 0, true)
1224
1225
 
1225
1226
  # output zone and terminal data
1226
- #julien
1227
1227
  if is_ip_units
1228
- output_data_air_loops[:data] << ['Thermal Zones', 'Total Floor Area', "#{total_loop_floor_area_ip_neat} ft^2", '', thermal_zones.size]
1228
+ output_data_air_loops[:data] << ['Thermal Zones', 'Total Floor Area', "#{total_loop_floor_area_neat} ft^2", '', thermal_zones.size]
1229
1229
  else
1230
- output_data_air_loops[:data] << ['Thermal Zones', 'Total Floor Area', "#{total_loop_floor_area_ip_neat} m^2", '', thermal_zones.size]
1230
+ output_data_air_loops[:data] << ['Thermal Zones', 'Total Floor Area', "#{total_loop_floor_area_neat} m^2", '', thermal_zones.size]
1231
+ end
1232
+
1233
+ # heating and cooling temperature range data
1234
+ source_units = 'C'
1235
+ if is_ip_units
1236
+ target_units = 'F'
1237
+ target_units_display = 'F'
1238
+ else
1239
+ target_units = source_units
1240
+ target_units_display = 'C'
1231
1241
  end
1232
1242
  if cooling_temp_ranges.empty?
1233
1243
  cooling_temp_ranges_pretty = "can't inspect schedules"
1234
-
1235
- #julien
1236
- source_units = 'C'
1237
- if is_ip_units
1238
- target_units = 'F'
1239
- target_units_display = "F"
1240
- else
1241
- target_units = source_units
1242
- target_units_display = "C"
1243
- end
1244
-
1245
-
1246
1244
  else
1247
1245
  cooling_temp_ranges_pretty = "#{OpenStudio.convert(cooling_temp_ranges.min, source_units, target_units).get.round(1)} to #{OpenStudio.convert(cooling_temp_ranges.max, source_units, target_units).get.round(1)}"
1248
1246
  end
@@ -1251,17 +1249,6 @@ module OsLib_Reporting
1251
1249
  else
1252
1250
  heating_temps_ranges_pretty = "#{OpenStudio.convert(heating_temps_ranges.min, source_units, target_units).get.round(1)} to #{OpenStudio.convert(heating_temps_ranges.max, source_units, target_units).get.round(1)}"
1253
1251
  end
1254
-
1255
- #julien
1256
- source_units = 'C'
1257
- if is_ip_units
1258
- target_units = 'F'
1259
- target_units_display = "F"
1260
- else
1261
- target_units = source_units
1262
- target_units_display = "C"
1263
- end
1264
- #julien => ok? Tjs dans la boucle?
1265
1252
  output_data_air_loops[:data] << ['Thermal Zones', 'Cooling Setpoint Range', "#{cooling_temp_ranges_pretty} #{target_units_display}", '', '']
1266
1253
  output_data_air_loops[:data] << ['Thermal Zones', 'Heating Setpoint Range', "#{heating_temps_ranges_pretty} #{target_units_display}", '', '']
1267
1254
  output_data_air_loops[:data] << ['Terminal Types Used', terminals.uniq.sort.join(', '), '', '', terminals.size]
@@ -3024,6 +3011,13 @@ module OsLib_Reporting
3024
3011
  ann_env_pd = OsLib_Reporting.ann_env_pd(sqlFile)
3025
3012
  if ann_env_pd
3026
3013
 
3014
+ # store values about humidity fir reguster values
3015
+ zone_max_hours_over_70_rh = 0
3016
+ zone_max_hours_over_55_rh = 0
3017
+ rh_hours_threshold = 10 #hr
3018
+ num_zones_x_hours_over_70 = 0
3019
+ num_zones_x_hours_over_55 = 0
3020
+
3027
3021
  # get keys
3028
3022
  keys = sqlFile.availableKeyValues(ann_env_pd, 'Hourly', 'Zone Air Relative Humidity')
3029
3023
  keys.each do |key|
@@ -3032,6 +3026,10 @@ module OsLib_Reporting
3032
3026
  humidity_bins[k] = 0
3033
3027
  end
3034
3028
 
3029
+ # reset humidity zone flag
3030
+ zone_rh_count_hr_55 = 0.0
3031
+ zone_rh_count_hr_70 = 0.0
3032
+
3035
3033
  # get desired variable
3036
3034
  output_timeseries = sqlFile.timeSeries(ann_env_pd, 'Hourly', 'Zone Air Relative Humidity', key)
3037
3035
  # loop through timeseries and move the data from an OpenStudio timeseries to a normal Ruby array (vector)
@@ -3079,11 +3077,34 @@ module OsLib_Reporting
3079
3077
  else
3080
3078
  row_color << ''
3081
3079
  end
3080
+
3081
+ # populate rh data for register_values
3082
+ # catch greater than 70 and 80 for runner.registerValue
3083
+ if ['55-60','60-65','65-70','70-75','75-80','>= 80'].include?(k)
3084
+ zone_rh_count_hr_55 += v
3085
+ end
3086
+ if ['70-75','75-80','>= 80'].include?(k)
3087
+ zone_rh_count_hr_70 += v
3088
+ end
3089
+
3082
3090
  end
3083
3091
  row_data += ["#{mean.round(1)} (%)"]
3084
3092
  row_color += ['']
3085
3093
  humidity_table[:data] << row_data
3086
3094
  humidity_table[:data_color] << row_color
3095
+
3096
+ # apply rh zones and max hours
3097
+ if zone_rh_count_hr_55 >= rh_hours_threshold then num_zones_x_hours_over_55 += 1 end
3098
+ if zone_rh_count_hr_70 >= rh_hours_threshold then num_zones_x_hours_over_70 += 1 end
3099
+ if zone_max_hours_over_55_rh < zone_rh_count_hr_55 then zone_max_hours_over_55_rh = zone_rh_count_hr_55 end
3100
+ if zone_max_hours_over_70_rh < zone_rh_count_hr_70 then zone_max_hours_over_70_rh = zone_rh_count_hr_70 end
3101
+
3102
+ # add rh runner.registerValues to be used as output in analyses
3103
+ runner.registerValue("zone_max_hours_over_70_rh",zone_max_hours_over_70_rh,"hr")
3104
+ runner.registerValue("zone_max_hours_over_55_rh",zone_max_hours_over_55_rh,"hr")
3105
+ runner.registerValue("num_zones_x_hours_over_70",num_zones_x_hours_over_70,"zones")
3106
+ runner.registerValue("num_zones_x_hours_over_55",num_zones_x_hours_over_55,"zones")
3107
+
3087
3108
  end
3088
3109
  else
3089
3110
  runner.registerWarning('An annual simulation was not run. Cannot get annual timeseries data')
@@ -4649,4 +4670,86 @@ module OsLib_Reporting
4649
4670
 
4650
4671
  return @schedules_overview_section
4651
4672
  end
4652
- end
4673
+
4674
+ # create measure_warning_section (creates tables and runner.registerValues)
4675
+ def self.measure_warning_section(model, sqlFile, runner, name_only = false, is_ip_units = true)
4676
+ # array to hold tables
4677
+ measure_tables = []
4678
+
4679
+ # gather data for section
4680
+ @measure_warnings_section = {}
4681
+ @measure_warnings_section[:title] = 'Measure Warnings'
4682
+ @measure_warnings_section[:tables] = measure_tables
4683
+
4684
+ # stop here if only name is requested this is used to populate display name for arguments
4685
+ if name_only == true
4686
+ return @measure_warnings_section
4687
+ end
4688
+
4689
+ # will be used for registerValues
4690
+ num_measures_with_warnings = 0
4691
+ num_warnings = 0
4692
+ num_measures = 0
4693
+
4694
+ # loop through workflow steps
4695
+ runner.workflow.workflowSteps.each do |step|
4696
+ if step.to_MeasureStep.is_initialized
4697
+ measure_step = step.to_MeasureStep.get
4698
+ measure_name = measure_step.measureDirName
4699
+ num_measures += 1
4700
+ if measure_step.name.is_initialized
4701
+ measure_name = measure_step.name.get # this is instance name in PAT
4702
+ end
4703
+ if measure_step.result.is_initialized
4704
+ result = measure_step.result.get
4705
+ # create and populate table if warnings exist
4706
+ if result.warnings.size > 0
4707
+ measure_table_01 = {}
4708
+ measure_table_01[:title] = measure_name
4709
+ measure_table_01[:header] = ['Warning']
4710
+ measure_table_01[:data] = []
4711
+ num_measures_with_warnings += 1
4712
+
4713
+ # step through warnings
4714
+ start_counter = num_warnings
4715
+ result.warnings.each do |step|
4716
+ # add rows to table and register value
4717
+ num_warnings += 1
4718
+ if num_warnings < start_counter + 25
4719
+ measure_table_01[:data] << [step.logMessage]
4720
+ else
4721
+ measure_table_01[:data] << ["* See OSW file for full list of warnings. This measure has #{result.warnings.size} warnings."]
4722
+ end
4723
+ end
4724
+ # add table to section
4725
+ measure_tables << measure_table_01
4726
+ end
4727
+ else
4728
+ # puts "No result for #{measure_name}"
4729
+ end
4730
+ else
4731
+ # puts "This step is not a measure"
4732
+ end
4733
+ end
4734
+
4735
+ # add summary table (even when there are no warnings)
4736
+ measure_table_summary = {}
4737
+ measure_table_summary[:title] = "Measure Warning Summary"
4738
+ measure_table_summary[:header] = ['Description','Count']
4739
+ measure_table_summary[:data] = []
4740
+
4741
+ # add summary rows
4742
+ measure_table_summary[:data] << ['Number of measures in workflow',num_measures]
4743
+ measure_table_summary[:data] << ['Number of measures with warnings',num_measures_with_warnings]
4744
+ measure_table_summary[:data] << ['Total number of warnings',num_warnings]
4745
+
4746
+ # add table to section
4747
+ measure_tables << measure_table_summary
4748
+
4749
+ runner.registerValue("number_of_measures_with_warnings", num_measures_with_warnings)
4750
+ runner.registerValue("number_warnings", num_warnings)
4751
+
4752
+ return @measure_warnings_section
4753
+ end
4754
+
4755
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # *******************************************************************************
2
4
  # OpenStudio(R), Copyright (c) 2008-2020, Alliance for Sustainable Energy, LLC.
3
5
  # All rights reserved.
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # *******************************************************************************
2
4
  # OpenStudio(R), Copyright (c) 2008-2020, Alliance for Sustainable Energy, LLC.
3
5
  # All rights reserved.
@@ -56,17 +58,18 @@ module OpenStudio
56
58
  ##
57
59
  # @param [String] dirname Directory to run commands in, defaults to Dir.pwd. If directory includes a Gemfile then create a local bundle.
58
60
  # @param bundle_without [Hash] Hash describing the distribution of the variable.
59
- # @param options [Hash] Hash describing options for running the simulation. These are the defaults for all runs unless overriden within the run_* methods.
61
+ # @param options [Hash] Hash describing options for running the simulation. These are the defaults for all runs unless overriden within the run_* methods. Note if options is used, then a local runner.conf file will not be loaded.
60
62
  # @option options [String] :max_datapoints Max number of datapoints to run
61
63
  # @option options [String] :num_parallel Number of simulations to run in parallel at a time
62
64
  # @option options [String] :run_simulations Set to true to run the simulations
63
65
  # @option options [String] :verbose Set to true to receive extra information while running simulations
64
66
  def initialize(dirname = Dir.pwd, bundle_without = [], options = {})
65
67
  # DLM: I am not sure if we want to use the main root directory to create these bundles
66
- # had the idea of passing in a Gemfile name/alias and path to Gemfile, then doing the bundle in ~/OpenStudio/#{alias} or something like that?
68
+ # had the idea of passing in a Gemfile name/alias and path to Gemfile, then doing the bundle
69
+ # in ~/OpenStudio/#{alias} or something like that?
67
70
 
68
71
  # if the dirname contains a runner.conf file, then use the config file to specify the parameters
69
- if File.exist?(File.join(dirname, OpenStudio::Extension::RunnerConfig::FILENAME)) && !options
72
+ if File.exist?(File.join(dirname, OpenStudio::Extension::RunnerConfig::FILENAME)) && options.empty?
70
73
  puts 'Using runner options from runner.conf file'
71
74
  runner_config = OpenStudio::Extension::RunnerConfig.new(dirname)
72
75
  @options = runner_config.options
@@ -562,14 +565,14 @@ module OpenStudio
562
565
  Dir[path[:glob]].each do |file|
563
566
  puts "Updating license in file #{file}"
564
567
  f = File.read(file)
565
- if f =~ path[:regex]
568
+ if f.match?(path[:regex])
566
569
  puts ' License found -- updating'
567
570
  File.open(file, 'w') { |write| write << f.gsub(path[:regex], path[:license]) }
568
571
  elsif f =~ /\(C\)/i || f =~ /\(Copyright\)/i
569
572
  puts ' File already has copyright -- skipping'
570
573
  else
571
574
  puts ' No license found -- adding'
572
- if f =~ /#!/
575
+ if f.match?(/#!/)
573
576
  puts ' CANNOT add license to file automatically, add it manually and it will update automatically in the future'
574
577
  next
575
578
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # *******************************************************************************
2
4
  # OpenStudio(R), Copyright (c) 2008-2020, Alliance for Sustainable Energy, LLC.
3
5
  # All rights reserved.
@@ -38,7 +40,7 @@ require 'json'
38
40
  module OpenStudio
39
41
  module Extension
40
42
  class RunnerConfig
41
- FILENAME = 'runner.conf'.freeze
43
+ FILENAME = 'runner.conf'
42
44
 
43
45
  ##
44
46
  # Class to store configuration of the runner options.
@@ -104,6 +106,19 @@ module OpenStudio
104
106
  end
105
107
  end
106
108
 
109
+ ##
110
+ # Update a runner config value
111
+ #
112
+ # @param [String] key, The name of the key to update
113
+ # @param [Variant] new_value, The new value to set the `key` to.
114
+ def update_config(key, new_value)
115
+ if @data.key? key.to_sym
116
+ @data[key.to_sym] = new_value
117
+ else
118
+ raise "Could not find key '#{key}' to update in RunnerConfig."
119
+ end
120
+ end
121
+
107
122
  ##
108
123
  # Return the options as hash
109
124
  def options
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # *******************************************************************************
2
4
  # OpenStudio(R), Copyright (c) 2008-2020, Alliance for Sustainable Energy, LLC.
3
5
  # All rights reserved.
@@ -35,6 +37,6 @@
35
37
 
36
38
  module OpenStudio
37
39
  module Extension
38
- VERSION = '0.2.0'.freeze
40
+ VERSION = '0.2.1'
39
41
  end
40
42
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  lib = File.expand_path('lib', __dir__)
2
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
5
  require 'openstudio/extension/version'
@@ -13,10 +15,10 @@ Gem::Specification.new do |spec|
13
15
  spec.summary = 'openstudio base gem for creating generic extensions with encapsulated data and measures.'
14
16
  spec.description = 'openstudio base gem for creating generic extensions with encapsulated data and measures.'
15
17
  spec.metadata = {
16
- 'bug_tracker_uri' => 'https://github.com/NREL/openstudio-extension-gem/issues',
17
- 'changelog_uri' => 'https://github.com/NREL/openstudio-extension-gem/blob/develop/CHANGELOG.md',
18
- #'documentation_uri' => 'https://www.rubydoc.info/gems/openstudio-extension-gem/#{gem.version}',
19
- 'source_code_uri' => "https://github.com/NREL/openstudio-extension-gem/tree/v#{spec.version}"
18
+ 'bug_tracker_uri' => 'https://github.com/NREL/openstudio-extension-gem/issues',
19
+ 'changelog_uri' => 'https://github.com/NREL/openstudio-extension-gem/blob/develop/CHANGELOG.md',
20
+ # 'documentation_uri' => 'https://www.rubydoc.info/gems/openstudio-extension-gem/#{gem.version}',
21
+ 'source_code_uri' => "https://github.com/NREL/openstudio-extension-gem/tree/v#{spec.version}"
20
22
  }
21
23
 
22
24
  spec.files = `git ls-files -z`.split("\x0").reject do |f|
@@ -29,12 +31,11 @@ Gem::Specification.new do |spec|
29
31
  spec.required_ruby_version = '~> 2.5.0'
30
32
 
31
33
  spec.add_dependency 'bundler', '~> 2.1'
32
- spec.add_dependency 'openstudio-workflow', '~> 1.3.4'
33
- spec.add_dependency 'openstudio_measure_tester', '~> 0.2.0'
34
- spec.add_dependency 'parallel', '~> 1.12.0'
34
+ spec.add_dependency 'openstudio-workflow', '~> 2.0.0'
35
+ spec.add_dependency 'openstudio_measure_tester', '~> 0.2.2'
36
+ spec.add_dependency 'parallel', '~> 1.19.1'
35
37
 
36
38
  spec.add_development_dependency 'github_api', '~> 0.18.0'
37
- spec.add_development_dependency 'rake', '~> 12.3'
38
- spec.add_development_dependency 'rspec', '~> 3.7'
39
- spec.add_development_dependency 'rubocop', '~> 0.54.0'
39
+ spec.add_development_dependency 'rake', '~> 13.0'
40
+ spec.add_development_dependency 'rspec', '~> 3.9'
40
41
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: openstudio-extension
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Katherine Fleming
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: exe
12
12
  cert_chain: []
13
- date: 2020-02-18 00:00:00.000000000 Z
13
+ date: 2020-04-07 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: bundler
@@ -32,42 +32,42 @@ dependencies:
32
32
  requirements:
33
33
  - - "~>"
34
34
  - !ruby/object:Gem::Version
35
- version: 1.3.4
35
+ version: 2.0.0
36
36
  type: :runtime
37
37
  prerelease: false
38
38
  version_requirements: !ruby/object:Gem::Requirement
39
39
  requirements:
40
40
  - - "~>"
41
41
  - !ruby/object:Gem::Version
42
- version: 1.3.4
42
+ version: 2.0.0
43
43
  - !ruby/object:Gem::Dependency
44
44
  name: openstudio_measure_tester
45
45
  requirement: !ruby/object:Gem::Requirement
46
46
  requirements:
47
47
  - - "~>"
48
48
  - !ruby/object:Gem::Version
49
- version: 0.2.0
49
+ version: 0.2.2
50
50
  type: :runtime
51
51
  prerelease: false
52
52
  version_requirements: !ruby/object:Gem::Requirement
53
53
  requirements:
54
54
  - - "~>"
55
55
  - !ruby/object:Gem::Version
56
- version: 0.2.0
56
+ version: 0.2.2
57
57
  - !ruby/object:Gem::Dependency
58
58
  name: parallel
59
59
  requirement: !ruby/object:Gem::Requirement
60
60
  requirements:
61
61
  - - "~>"
62
62
  - !ruby/object:Gem::Version
63
- version: 1.12.0
63
+ version: 1.19.1
64
64
  type: :runtime
65
65
  prerelease: false
66
66
  version_requirements: !ruby/object:Gem::Requirement
67
67
  requirements:
68
68
  - - "~>"
69
69
  - !ruby/object:Gem::Version
70
- version: 1.12.0
70
+ version: 1.19.1
71
71
  - !ruby/object:Gem::Dependency
72
72
  name: github_api
73
73
  requirement: !ruby/object:Gem::Requirement
@@ -88,42 +88,28 @@ dependencies:
88
88
  requirements:
89
89
  - - "~>"
90
90
  - !ruby/object:Gem::Version
91
- version: '12.3'
91
+ version: '13.0'
92
92
  type: :development
93
93
  prerelease: false
94
94
  version_requirements: !ruby/object:Gem::Requirement
95
95
  requirements:
96
96
  - - "~>"
97
97
  - !ruby/object:Gem::Version
98
- version: '12.3'
98
+ version: '13.0'
99
99
  - !ruby/object:Gem::Dependency
100
100
  name: rspec
101
101
  requirement: !ruby/object:Gem::Requirement
102
102
  requirements:
103
103
  - - "~>"
104
104
  - !ruby/object:Gem::Version
105
- version: '3.7'
105
+ version: '3.9'
106
106
  type: :development
107
107
  prerelease: false
108
108
  version_requirements: !ruby/object:Gem::Requirement
109
109
  requirements:
110
110
  - - "~>"
111
111
  - !ruby/object:Gem::Version
112
- version: '3.7'
113
- - !ruby/object:Gem::Dependency
114
- name: rubocop
115
- requirement: !ruby/object:Gem::Requirement
116
- requirements:
117
- - - "~>"
118
- - !ruby/object:Gem::Version
119
- version: 0.54.0
120
- type: :development
121
- prerelease: false
122
- version_requirements: !ruby/object:Gem::Requirement
123
- requirements:
124
- - - "~>"
125
- - !ruby/object:Gem::Version
126
- version: 0.54.0
112
+ version: '3.9'
127
113
  description: openstudio base gem for creating generic extensions with encapsulated
128
114
  data and measures.
129
115
  email:
@@ -198,7 +184,6 @@ files:
198
184
  - lib/openstudio/extension/core/check_weather_files.rb
199
185
  - lib/openstudio/extension/core/deer_vintages.rb
200
186
  - lib/openstudio/extension/core/os_lib_aedg_measures.rb
201
- - lib/openstudio/extension/core/os_lib_cofee.rb
202
187
  - lib/openstudio/extension/core/os_lib_constructions.rb
203
188
  - lib/openstudio/extension/core/os_lib_geometry.rb
204
189
  - lib/openstudio/extension/core/os_lib_helper_methods.rb
@@ -220,7 +205,7 @@ licenses: []
220
205
  metadata:
221
206
  bug_tracker_uri: https://github.com/NREL/openstudio-extension-gem/issues
222
207
  changelog_uri: https://github.com/NREL/openstudio-extension-gem/blob/develop/CHANGELOG.md
223
- source_code_uri: https://github.com/NREL/openstudio-extension-gem/tree/v0.2.0
208
+ source_code_uri: https://github.com/NREL/openstudio-extension-gem/tree/v0.2.1
224
209
  post_install_message:
225
210
  rdoc_options: []
226
211
  require_paths:
@@ -237,7 +222,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
237
222
  version: '0'
238
223
  requirements: []
239
224
  rubyforge_project:
240
- rubygems_version: 2.7.6
225
+ rubygems_version: 2.7.6.2
241
226
  signing_key:
242
227
  specification_version: 4
243
228
  summary: openstudio base gem for creating generic extensions with encapsulated data