urbanopt-geojson 0.11.1 → 1.0.0

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.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/nightly_build.yml +7 -5
  3. data/.gitignore +1 -0
  4. data/.rakeTasks +2 -2
  5. data/CHANGELOG.md +17 -0
  6. data/Gemfile +6 -10
  7. data/LICENSE.md +1 -1
  8. data/doc_templates/LICENSE.md +1 -1
  9. data/lib/measures/urban_geometry_creation/LICENSE.md +1 -1
  10. data/lib/measures/urban_geometry_creation/README.md +4 -34
  11. data/lib/measures/urban_geometry_creation/measure.rb +1 -1
  12. data/lib/measures/urban_geometry_creation/measure.xml +6 -5
  13. data/lib/measures/urban_geometry_creation_zoning/LICENSE.md +1 -1
  14. data/lib/measures/urban_geometry_creation_zoning/README.md +3 -25
  15. data/lib/measures/urban_geometry_creation_zoning/measure.rb +3 -2
  16. data/lib/measures/urban_geometry_creation_zoning/measure.xml +7 -6
  17. data/lib/urbanopt/geojson/building.rb +5 -6
  18. data/lib/urbanopt/geojson/district_system.rb +0 -4
  19. data/lib/urbanopt/geojson/feature.rb +7 -8
  20. data/lib/urbanopt/geojson/geo_file.rb +19 -17
  21. data/lib/urbanopt/geojson/helper.rb +10 -6
  22. data/lib/urbanopt/geojson/logging.rb +1 -1
  23. data/lib/urbanopt/geojson/mapper_classes.rb +4 -3
  24. data/lib/urbanopt/geojson/model.rb +1 -0
  25. data/lib/urbanopt/geojson/region.rb +0 -3
  26. data/lib/urbanopt/geojson/scale_area.rb +6 -14
  27. data/lib/urbanopt/geojson/schema/building_properties.json +13 -1
  28. data/lib/urbanopt/geojson/schema/site_properties.json +16 -4
  29. data/lib/urbanopt/geojson/schema/thermal_junction_properties.json +0 -4
  30. data/lib/urbanopt/geojson/update_areas.rb +3 -2
  31. data/lib/urbanopt/geojson/validate_geojson.rb +9 -8
  32. data/lib/urbanopt/geojson/version.rb +1 -1
  33. data/lib/urbanopt/geojson/zoning.rb +3 -2
  34. data/urbanopt-geojson-gem.gemspec +8 -8
  35. metadata +17 -45
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 32b936011feb9dbc9da74e001526895f70fffb05430d688edb3cb69a7a3c40ad
4
- data.tar.gz: b783738bf7351f774698a456e11ba9668acf6f3462e67e14acf616ab7f8c20d4
3
+ metadata.gz: 598a86cd6ea379dcc630e4728a308ca6d543acaf1d06f64df8681d3aec2e8dbe
4
+ data.tar.gz: 7828a7da042ee0094f7361bd3ce38c7564a4bdccc1a24a9690a720b65df2122a
5
5
  SHA512:
6
- metadata.gz: 45b454224a0e01c3a6a43d60de95f79ceb4bf75baf132ec5d63784c8f7252c8dfc7850f39031a764b5028578cd72ec3226ab312e5636a37f701951dc44ff755b
7
- data.tar.gz: 85468f42a01a44ad7b7a666c98867defbb3c095ac70bb4d1aa6a2ab7970e60c0ec70f97712135b5b025b3d195bddf47a4ef75423529523f7e4aaadddead30994
6
+ metadata.gz: f1216daf8552b6973230763fb5d8fbfb12eaa31c30143af8220fb2945d673c2e76e26075c15710b188c88fc8c7d3ecbed1206a711a9c7659c6e60d2f06682582
7
+ data.tar.gz: 8ae72ca2e05eb23c3f1bf31018ba272bc2839e10290c2ea21bc44b35aacc66f98496879f93f91cc04bff7a7e22ec63b3897db194f909a6716d3a1771243acf3c
@@ -1,13 +1,12 @@
1
1
  name: Geojson-gem CI
2
2
 
3
3
  on:
4
- # push:
4
+ workflow_dispatch:
5
+ push:
5
6
  schedule:
6
7
  # https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#schedule
7
8
  # 5 am UTC (11pm MDT the day before) every weekday night in MDT
8
9
  - cron: '21 5 * * 2-6'
9
- pull_request:
10
- types: [review_requested]
11
10
 
12
11
  env:
13
12
  # This env var should enforce develop branch of all dependencies
@@ -18,7 +17,7 @@ jobs:
18
17
  weeknight-tests:
19
18
  runs-on: ubuntu-latest
20
19
  container:
21
- image: docker://nrel/openstudio:3.7.0
20
+ image: docker://nrel/openstudio:3.9.0
22
21
  steps:
23
22
  - uses: actions/checkout@v4
24
23
  - name: set git config options
@@ -28,11 +27,14 @@ jobs:
28
27
  - name: Update gems
29
28
  run: |
30
29
  ruby --version
30
+ bundle install
31
31
  bundle update
32
32
  - name: List OpenStudio measures
33
33
  run: bundle exec rake openstudio:list_measures
34
34
  - name: Update OpenStudio measures
35
- run: bundle exec rake openstudio:update_measures
35
+ run: |
36
+ bundle install
37
+ bundle exec rake openstudio:update_measures
36
38
  - name: Test OpenStudio measures
37
39
  run: bundle exec rake openstudio:test_with_openstudio
38
40
  - name: Run Rspec
data/.gitignore CHANGED
@@ -5,6 +5,7 @@
5
5
  /gems
6
6
  /_yardoc/
7
7
  /coverage/
8
+ .coverage
8
9
  /doc/
9
10
  /pkg/
10
11
  /spec/reports/
data/.rakeTasks CHANGED
@@ -1,7 +1,7 @@
1
1
  <?xml version="1.0" encoding="UTF-8"?>
2
2
  <Settings><!--This file was automatically generated by Ruby plugin.
3
- You are allowed to:
3
+ You are allowed to:
4
4
  1. Remove rake task
5
5
  2. Add existing rake tasks
6
6
  To add existing rake tasks automatically delete this file and reload the project.
7
- --><RakeGroup description="" fullCmd="" taksId="rake" /></Settings>
7
+ --><RakeGroup description="" fullCmd="" taskId="rake" /></Settings>
data/CHANGELOG.md CHANGED
@@ -1,6 +1,22 @@
1
1
  # URBANopt GeoJSON Gem
2
2
 
3
+ ## Version 1.0.0
4
+
5
+ ## Exciting new features 🎉
6
+
7
+ * Upgrade to OpenStudio 3.9 and Ruby 3.2.2 by @vtnate in https://github.com/urbanopt/urbanopt-geojson-gem/pull/279
8
+
9
+ **Full Changelog**: https://github.com/urbanopt/urbanopt-geojson-gem/compare/v0.11.2...v1.0.0
10
+
11
+ ## Version 0.11.2
12
+
13
+ * Allow null for some optional fields by @vtnate in https://github.com/urbanopt/urbanopt-geojson-gem/pull/273
14
+ * Added UO-ResStock connection variable to the site properties schema by @rawadelkontar in https://github.com/urbanopt/urbanopt-geojson-gem/pull/270
15
+
16
+ **Full Changelog**: https://github.com/urbanopt/urbanopt-geojson-gem/compare/v0.11.1...v0.11.2
17
+
3
18
  ## Version 0.11.1
19
+
4
20
  Date Range: 01/09/24
5
21
 
6
22
  * downgrade json-schema to 2.7 by @vtnate in https://github.com/urbanopt/urbanopt-geojson-gem/pull/267
@@ -8,6 +24,7 @@ Date Range: 01/09/24
8
24
  **Full Changelog**: https://github.com/urbanopt/urbanopt-geojson-gem/compare/v0.11.0...v0.11.1
9
25
 
10
26
  ## Version 0.11.0
27
+
11
28
  Date Range: 7/19/23 - 01/09/24
12
29
 
13
30
  * Remove jenkins by @vtnate in https://github.com/urbanopt/urbanopt-geojson-gem/pull/260
data/Gemfile CHANGED
@@ -11,19 +11,15 @@ gemspec
11
11
  # checkout the latest version (develop) from github.
12
12
  allow_local = ENV['FAVOR_LOCAL_GEMS']
13
13
 
14
- # pin this dependency to avoid unicode_normalize error
15
- gem 'addressable', '2.8.1'
16
- # pin this dependency to avoid using racc dependency (which has native extensions)
17
- gem 'parser', '3.2.2.2'
18
-
14
+ # gem 'openstudio-extension', '~> 0.8.2'
19
15
  # if allow_local && File.exist?('../openstudio-extension-gem')
20
16
  # gem 'openstudio-extension', path: '../openstudio-extension-gem'
21
17
  # elsif allow_local
22
18
  # gem 'openstudio-extension', github: 'NREL/openstudio-extension-gem', branch: 'develop'
23
19
  # end
24
20
 
25
- if allow_local && File.exist?('../urbanopt-core-gem')
26
- gem 'urbanopt-core', path: '../urbanopt-core-gem'
27
- elsif allow_local
28
- gem 'urbanopt-core', github: 'URBANopt/urbanopt-core-gem', branch: 'develop'
29
- end
21
+ # if allow_local && File.exist?('../urbanopt-core-gem')
22
+ # gem 'urbanopt-core', path: '../urbanopt-core-gem'
23
+ # elsif allow_local
24
+ # gem 'urbanopt-core', github: 'URBANopt/urbanopt-core-gem', branch: 'master'
25
+ # end
data/LICENSE.md CHANGED
@@ -1,4 +1,4 @@
1
- URBANopt (tm), Copyright (c) 2019-2023, Alliance for Sustainable Energy, LLC, and other
1
+ URBANopt (tm), Copyright (c) 2019-2025, Alliance for Sustainable Energy, LLC, and other
2
2
  contributors. All rights reserved.
3
3
 
4
4
  Redistribution and use in source and binary forms, with or without modification,
@@ -1,4 +1,4 @@
1
- URBANopt (tm), Copyright (c) 2019-2024, Alliance for Sustainable Energy, LLC, and other
1
+ URBANopt (tm), Copyright (c) 2019-2025, Alliance for Sustainable Energy, LLC, and other
2
2
  contributors. All rights reserved.
3
3
 
4
4
  Redistribution and use in source and binary forms, with or without modification,
@@ -1,4 +1,4 @@
1
- URBANopt (tm), Copyright (c) 2019-2023, Alliance for Sustainable Energy, LLC, and other
1
+ URBANopt (tm), Copyright (c) 2019-2024, Alliance for Sustainable Energy, LLC, and other
2
2
  contributors. All rights reserved.
3
3
 
4
4
  Redistribution and use in source and binary forms, with or without modification,
@@ -2,13 +2,13 @@
2
2
 
3
3
  ###### (Automatically generated documentation)
4
4
 
5
- # UrbanGeometryCreation
5
+ #
6
6
 
7
7
  ## Description
8
- This measure reads an URBANopt GeoJSON and creates geometry for a particular building. Surrounding buildings are included as shading structures.
8
+
9
9
 
10
10
  ## Modeler Description
11
- This measure takes in the GeoJSON file, the feature_id of the building and the surrounding buildings as arguments and add has methods to create space types and add default construction sets.
11
+
12
12
 
13
13
  ## Measure Type
14
14
  ModelMeasure
@@ -19,38 +19,8 @@ ModelMeasure
19
19
  ## Arguments
20
20
 
21
21
 
22
- ### GeoJSON File
23
- GeoJSON File.
24
- **Name:** geojson_file,
25
- **Type:** String,
26
- **Units:** ,
27
- **Required:** true,
28
- **Model Dependent:** false
29
-
30
- ### Feature ID
31
- Feature ID.
32
- **Name:** feature_id,
33
- **Type:** String,
34
- **Units:** ,
35
- **Required:** true,
36
- **Model Dependent:** false
37
-
38
- ### Surrounding Buildings
39
- Select which surrounding buildings to include.
40
- **Name:** surrounding_buildings,
41
- **Type:** Choice,
42
- **Units:** ,
43
- **Required:** true,
44
- **Model Dependent:** false
45
-
46
- ### Scale Footprint Area by the Floor Area
47
- If true, the footprint area from GeoJSON will be scaled by the floor_area provided by the user in URBANopt.
48
- **Name:** scale_footprint_area_by_floor_area,
49
- **Type:** Boolean,
50
- **Units:** ,
51
- **Required:** false,
52
- **Model Dependent:** false
53
22
 
54
23
 
24
+ This measure does not have any user arguments
55
25
 
56
26
 
@@ -121,7 +121,7 @@ class UrbanGeometryCreation < OpenStudio::Measure::ModelMeasure
121
121
  if scale_footprint_area_by_floor_area
122
122
  building_hash = feature.to_hash
123
123
  if building_hash[:number_of_stories] && building_hash[:floor_area]
124
- scaled_footprint_area = building_hash[:floor_area].to_f / building_hash[:number_of_stories].to_f
124
+ scaled_footprint_area = building_hash[:floor_area].to_f / building_hash[:number_of_stories]
125
125
  @runner.registerInfo("Desired footprint area in ft2: #{scaled_footprint_area}")
126
126
  end
127
127
  end
@@ -1,10 +1,11 @@
1
1
  <?xml version="1.0"?>
2
2
  <measure>
3
3
  <schema_version>3.1</schema_version>
4
+ <error>Failed to infer measure name from '/Users/nmoore/github/urbanopt-geojson-gem/lib/measures/urban_geometry_creation/measure.rb'</error>
4
5
  <name>urban_geometry_creation</name>
5
6
  <uid>5ab85d6b-c9af-4361-8ab9-613ee99a5666</uid>
6
- <version_id>583499fb-4275-4787-9168-e3383dca0fc6</version_id>
7
- <version_modified>2023-11-20T17:10:01Z</version_modified>
7
+ <version_id>048231f4-ba53-4506-b922-35f13d8b806e</version_id>
8
+ <version_modified>2024-11-13T17:45:33Z</version_modified>
8
9
  <xml_checksum>D254E772</xml_checksum>
9
10
  <class_name>UrbanGeometryCreation</class_name>
10
11
  <display_name>UrbanGeometryCreation</display_name>
@@ -108,13 +109,13 @@
108
109
  <filename>LICENSE.md</filename>
109
110
  <filetype>md</filetype>
110
111
  <usage_type>license</usage_type>
111
- <checksum>9A4578CE</checksum>
112
+ <checksum>3C275955</checksum>
112
113
  </file>
113
114
  <file>
114
115
  <filename>README.md</filename>
115
116
  <filetype>md</filetype>
116
117
  <usage_type>readme</usage_type>
117
- <checksum>AA2D38B0</checksum>
118
+ <checksum>0B68E96D</checksum>
118
119
  </file>
119
120
  <file>
120
121
  <filename>README.md.erb</filename>
@@ -131,7 +132,7 @@
131
132
  <filename>measure.rb</filename>
132
133
  <filetype>rb</filetype>
133
134
  <usage_type>script</usage_type>
134
- <checksum>5D490083</checksum>
135
+ <checksum>D58B8040</checksum>
135
136
  </file>
136
137
  <file>
137
138
  <filename>nrel_stm_footprints.geojson</filename>
@@ -1,4 +1,4 @@
1
- URBANopt (tm), Copyright (c) 2019-2023, Alliance for Sustainable Energy, LLC, and other
1
+ URBANopt (tm), Copyright (c) 2019-2024, Alliance for Sustainable Energy, LLC, and other
2
2
  contributors. All rights reserved.
3
3
 
4
4
  Redistribution and use in source and binary forms, with or without modification,
@@ -2,10 +2,10 @@
2
2
 
3
3
  ###### (Automatically generated documentation)
4
4
 
5
- # UrbanGeometryCreationZoning
5
+ #
6
6
 
7
7
  ## Description
8
- This measure reads an URBANopt GeoJSON and creates geometry with zoning for a particular building. Surrounding buildings are included as shading structures.
8
+
9
9
 
10
10
  ## Modeler Description
11
11
 
@@ -19,30 +19,8 @@ ModelMeasure
19
19
  ## Arguments
20
20
 
21
21
 
22
- ### GeoJSON File
23
- GeoJSON File.
24
- **Name:** geojson_file,
25
- **Type:** String,
26
- **Units:** ,
27
- **Required:** true,
28
- **Model Dependent:** false
29
-
30
- ### Feature ID
31
- Feature ID.
32
- **Name:** feature_id,
33
- **Type:** String,
34
- **Units:** ,
35
- **Required:** true,
36
- **Model Dependent:** false
37
-
38
- ### Surrounding Buildings
39
- Select which surrounding buildings to include.
40
- **Name:** surrounding_buildings,
41
- **Type:** Choice,
42
- **Units:** ,
43
- **Required:** true,
44
- **Model Dependent:** false
45
22
 
46
23
 
24
+ This measure does not have any user arguments
47
25
 
48
26
 
@@ -110,7 +110,8 @@ class UrbanGeometryCreationZoning < OpenStudio::Measure::ModelMeasure
110
110
  @runner.registerWarning("Surface elevation not set for building '#{name}'")
111
111
  end
112
112
 
113
- if feature.type == 'Building'
113
+ case feature.type
114
+ when 'Building'
114
115
  # make requested building, zoning is set to true
115
116
  spaces = feature.create_building(:spaces_per_floor, model, @origin_lat_lon, @runner, true)
116
117
  if spaces.nil? || spaces.empty?
@@ -157,7 +158,7 @@ class UrbanGeometryCreationZoning < OpenStudio::Measure::ModelMeasure
157
158
  URBANopt::GeoJSON::Helper.convert_to_shading_surface_group(space)
158
159
  end
159
160
 
160
- elsif feature.type == 'District System'
161
+ when 'District System'
161
162
  district_system_type = feature[:properties][:district_system_type]
162
163
  if district_system_type == 'Community Photovoltaic'
163
164
  shading_surfaces = URBANopt::GeoJSON::Helper.create_photovoltaics(feature, 0, model, @origin_lat_lon, @runner)
@@ -1,10 +1,11 @@
1
1
  <?xml version="1.0"?>
2
2
  <measure>
3
3
  <schema_version>3.1</schema_version>
4
+ <error>Failed to infer measure name from '/Users/nmoore/github/urbanopt-geojson-gem/lib/measures/urban_geometry_creation_zoning/measure.rb'</error>
4
5
  <name>urban_geometry_creation_zoning</name>
5
6
  <uid>96ea1317-76ac-4670-b51d-71ee3f4fdd65</uid>
6
- <version_id>4d47bb3f-6e49-4309-a4e0-5f2c3748b947</version_id>
7
- <version_modified>2023-11-20T17:10:01Z</version_modified>
7
+ <version_id>f4e83153-b29e-4154-9ed0-7062896e7448</version_id>
8
+ <version_modified>2024-11-14T16:53:21Z</version_modified>
8
9
  <xml_checksum>D254E772</xml_checksum>
9
10
  <class_name>UrbanGeometryCreationZoning</class_name>
10
11
  <display_name>UrbanGeometryCreationZoning</display_name>
@@ -89,13 +90,13 @@
89
90
  <filename>LICENSE.md</filename>
90
91
  <filetype>md</filetype>
91
92
  <usage_type>license</usage_type>
92
- <checksum>9A4578CE</checksum>
93
+ <checksum>3C275955</checksum>
93
94
  </file>
94
95
  <file>
95
96
  <filename>README.md</filename>
96
97
  <filetype>md</filetype>
97
98
  <usage_type>readme</usage_type>
98
- <checksum>0458EE16</checksum>
99
+ <checksum>0B68E96D</checksum>
99
100
  </file>
100
101
  <file>
101
102
  <filename>README.md.erb</filename>
@@ -112,7 +113,7 @@
112
113
  <filename>measure.rb</filename>
113
114
  <filetype>rb</filetype>
114
115
  <usage_type>script</usage_type>
115
- <checksum>5827BCFA</checksum>
116
+ <checksum>1EA1A74B</checksum>
116
117
  </file>
117
118
  <file>
118
119
  <filename>OV_Buildings_Update_090420_res_eui_test.json</filename>
@@ -136,7 +137,7 @@
136
137
  <filename>urban_geometry_creation_zoning_test.rb</filename>
137
138
  <filetype>rb</filetype>
138
139
  <usage_type>test</usage_type>
139
- <checksum>FC65E7CE</checksum>
140
+ <checksum>3B495B27</checksum>
140
141
  </file>
141
142
  </files>
142
143
  </measure>
@@ -103,12 +103,13 @@ module URBANopt
103
103
  end
104
104
 
105
105
  spaces = []
106
- if create_method == :space_per_floor || create_method == :spaces_per_floor
106
+ case create_method
107
+ when :space_per_floor, :spaces_per_floor
107
108
  (-number_of_stories_below_ground + 1..number_of_stories_above_ground).each do |story_number|
108
109
  new_spaces = create_space_per_floor(story_number, floor_to_floor_height, model, origin_lat_lon, runner, zoning, scaled_footprint_area)
109
110
  spaces.concat(new_spaces)
110
111
  end
111
- elsif create_method == :space_per_building
112
+ when :space_per_building
112
113
  spaces = create_space_per_building(-number_of_stories_below_ground * floor_to_floor_height, number_of_stories_above_ground * floor_to_floor_height, model, origin_lat_lon, runner, zoning, other_building)
113
114
  end
114
115
  return spaces
@@ -417,10 +418,8 @@ module URBANopt
417
418
  space = space.get
418
419
  space.setName("Building Story #{story_number} Space")
419
420
  space.surfaces.each do |surface|
420
- if surface.surfaceType == 'Wall'
421
- if story_number < 1
422
- surface.setOutsideBoundaryCondition('Ground')
423
- end
421
+ if surface.surfaceType == 'Wall' && (story_number < 1)
422
+ surface.setOutsideBoundaryCondition('Ground')
424
423
  end
425
424
  end
426
425
  spaces << space
@@ -8,10 +8,6 @@ require 'urbanopt/geojson/feature'
8
8
  module URBANopt
9
9
  module GeoJSON # :nodoc: all
10
10
  class DistrictSystem < Feature
11
- def initialize(feature)
12
- super(feature)
13
- end
14
-
15
11
  ##
16
12
  # Used to describe the feature type using the base method from the Feature class.
17
13
  def feature_type
@@ -19,9 +19,7 @@ module URBANopt
19
19
  @feature_json = validate_feat(feature)
20
20
  end
21
21
 
22
- # rubocop:disable Style/MethodMissing
23
22
  def method_missing(name, *args, &blk)
24
- # rubocop:enable Style/MethodMissing
25
23
  if @feature_json[:properties].keys.map(&:to_sym).include? name.to_sym
26
24
 
27
25
  return @feature_json[:properties][name.to_sym]
@@ -196,10 +194,11 @@ module URBANopt
196
194
  def get_multi_polygons(json = @feature_json)
197
195
  geometry_type = json[:geometry][:type]
198
196
  multi_polygons = []
199
- if geometry_type == 'Polygon'
197
+ case geometry_type
198
+ when 'Polygon'
200
199
  polygons = json[:geometry][:coordinates]
201
200
  multi_polygons = [polygons]
202
- elsif geometry_type == 'MultiPolygon'
201
+ when 'MultiPolygon'
203
202
  multi_polygons = json[:geometry][:coordinates]
204
203
  end
205
204
  return multi_polygons
@@ -256,8 +255,7 @@ module URBANopt
256
255
  central_latitude = Math.atan2(z, central_square_root)
257
256
 
258
257
  [central_longitude * 180 / Math::PI,
259
- central_latitude * 180 / Math::PI]
260
-
258
+ central_latitude * 180 / Math::PI]
261
259
  end
262
260
 
263
261
  private
@@ -292,8 +290,9 @@ module URBANopt
292
290
  end
293
291
 
294
292
  geometry_type = feature[:geometry][:type]
295
- if geometry_type == 'Polygon'
296
- elsif geometry_type == 'MultiPolygon'
293
+ case geometry_type
294
+ when 'Polygon'
295
+ when 'MultiPolygon'
297
296
  else
298
297
  raise("Unknown geometry type '#{geometry_type}'")
299
298
  return false
@@ -47,7 +47,6 @@ module URBANopt
47
47
  symbolize_names: true
48
48
  )
49
49
 
50
-
51
50
  # validate geojson file against schema
52
51
  geojson_errors = validate(@@geojson_schema, geojson_file)
53
52
  unless geojson_errors.empty?
@@ -83,6 +82,7 @@ module URBANopt
83
82
  if feature[:properties][:name].nil?
84
83
  raise('No name found for Building Feature')
85
84
  end
85
+
86
86
  if feature[:properties][:number_of_stories].nil?
87
87
  @@logger.warn("Number of stories is required to calculate shading using the UrbanGeometryCreation measure.\n" \
88
88
  "Not validating #{feature[:properties][:id]} against schema and ignoring in shading calculations")
@@ -96,6 +96,7 @@ module URBANopt
96
96
  if feature[:properties][:name].nil?
97
97
  raise('No name found for Building Feature')
98
98
  end
99
+
99
100
  @@logger.warn("OS-HPXML files may not conform to schema, which is usually ok.\n" \
100
101
  "Not validating #{feature[:properties][:id]} against schema")
101
102
  # Else validate for all required properties in the schema
@@ -196,16 +197,17 @@ module URBANopt
196
197
  { site: :electricity_emissions_annual_historical_subregion, feature: :electricity_emissions_annual_historical_subregion },
197
198
  { site: :electricity_emissions_future_year, feature: :electricity_emissions_future_year },
198
199
  { site: :electricity_emissions_hourly_historical_year, feature: :electricity_emissions_hourly_historical_year },
199
- { site: :electricity_emissions_annual_historical_year, feature: :electricity_emissions_annual_historical_year }
200
+ { site: :electricity_emissions_annual_historical_year, feature: :electricity_emissions_annual_historical_year },
201
+ { site: :characterize_residential_buildings_from_buildstock_csv, feature: :characterize_residential_buildings_from_buildstock_csv },
202
+ { site: :resstock_buildstock_csv_path, feature: :resstock_buildstock_csv_path },
203
+ { site: :uo_buildstock_mapping_csv_path, feature: :uo_buildstock_mapping_csv_path }
200
204
  ]
201
205
 
202
206
  add_props.each do |prop|
203
- if project.key?(prop[:site]) && project[prop[:site]]
204
- # property exists in site
205
- if !feature[:properties].key?(prop[:feature]) || feature[:properties][prop[:feature]].nil? || feature[:properties][prop[:feature]].to_s.empty?
206
- # property does not exist in feature or is nil: add site property (don't overwrite)
207
- feature[:properties][prop[:feature]] = project[prop[:site]]
208
- end
207
+ # property exists in site
208
+ if project.key?(prop[:site]) && project[prop[:site]] && (!feature[:properties].key?(prop[:feature]) || feature[:properties][prop[:feature]].nil? || feature[:properties][prop[:feature]].to_s.empty?)
209
+ # property does not exist in feature or is nil: add site property (don't overwrite)
210
+ feature[:properties][prop[:feature]] = project[prop[:site]]
209
211
  end
210
212
  end
211
213
 
@@ -226,7 +228,7 @@ module URBANopt
226
228
  result = nil
227
229
  if @@geojson_schema.nil?
228
230
  @@schema_file_lock.synchronize do
229
- File.open(File.dirname(__FILE__) + '/schema/geojson_schema.json') do |f|
231
+ File.open("#{File.dirname(__FILE__)}/schema/geojson_schema.json") do |f|
230
232
  result = JSON.parse(f.read, symbolize_names: true)
231
233
  end
232
234
  end
@@ -236,7 +238,7 @@ module URBANopt
236
238
 
237
239
  def self.get_building_schema(strict)
238
240
  result = nil
239
- File.open(File.dirname(__FILE__) + '/schema/building_properties.json') do |f|
241
+ File.open("#{File.dirname(__FILE__)}/schema/building_properties.json") do |f|
240
242
  result = JSON.parse(f.read)
241
243
  end
242
244
  if strict
@@ -249,7 +251,7 @@ module URBANopt
249
251
 
250
252
  def self.get_district_system_schema(strict)
251
253
  result = nil
252
- File.open(File.dirname(__FILE__) + '/schema/district_system_properties.json') do |f|
254
+ File.open("#{File.dirname(__FILE__)}/schema/district_system_properties.json") do |f|
253
255
  result = JSON.parse(f.read)
254
256
  end
255
257
  if strict
@@ -262,7 +264,7 @@ module URBANopt
262
264
 
263
265
  def self.get_region_schema(strict)
264
266
  result = nil
265
- File.open(File.dirname(__FILE__) + '/schema/region_properties.json') do |f|
267
+ File.open("#{File.dirname(__FILE__)}/schema/region_properties.json") do |f|
266
268
  result = JSON.parse(f.read)
267
269
  end
268
270
  if strict
@@ -275,7 +277,7 @@ module URBANopt
275
277
 
276
278
  def self.get_site_schema(strict)
277
279
  result = nil
278
- File.open(File.dirname(__FILE__) + '/schema/site_properties.json') do |f|
280
+ File.open("#{File.dirname(__FILE__)}/schema/site_properties.json") do |f|
279
281
  result = JSON.parse(f.read)
280
282
  end
281
283
  if strict
@@ -288,7 +290,7 @@ module URBANopt
288
290
 
289
291
  def self.get_electrical_connector_schema(strict)
290
292
  result = nil
291
- File.open(File.dirname(__FILE__) + '/schema/electrical_connector_properties.json') do |f|
293
+ File.open("#{File.dirname(__FILE__)}/schema/electrical_connector_properties.json") do |f|
292
294
  result = JSON.parse(f.read)
293
295
  end
294
296
  if strict
@@ -301,7 +303,7 @@ module URBANopt
301
303
 
302
304
  def self.get_electrical_junction_schema(strict)
303
305
  result = nil
304
- File.open(File.dirname(__FILE__) + '/schema/electrical_junction_properties.json') do |f|
306
+ File.open("#{File.dirname(__FILE__)}/schema/electrical_junction_properties.json") do |f|
305
307
  result = JSON.parse(f.read)
306
308
  end
307
309
  if strict
@@ -314,7 +316,7 @@ module URBANopt
314
316
 
315
317
  def self.get_thermal_connector_schema(strict)
316
318
  result = nil
317
- File.open(File.dirname(__FILE__) + '/schema/thermal_connector_properties.json') do |f|
319
+ File.open("#{File.dirname(__FILE__)}/schema/thermal_connector_properties.json") do |f|
318
320
  result = JSON.parse(f.read)
319
321
  end
320
322
  if strict
@@ -327,7 +329,7 @@ module URBANopt
327
329
 
328
330
  def self.get_thermal_junction_schema(strict)
329
331
  result = nil
330
- File.open(File.dirname(__FILE__) + '/schema/thermal_junction_properties.json') do |f|
332
+ File.open("#{File.dirname(__FILE__)}/schema/thermal_junction_properties.json") do |f|
331
333
  result = JSON.parse(f.read)
332
334
  end
333
335
  if strict
@@ -242,6 +242,7 @@ module URBANopt
242
242
  other_buildings[:features].each do |other_building|
243
243
  other_id = other_building[:properties][:id]
244
244
  next if other_id == building.id
245
+
245
246
  # Consider building, if other building type is ShadingOnly and other id is not equal to building id
246
247
  if other_building_type == 'ShadingOnly' && other_id != building.id
247
248
  # Checks if any building point is shaded by any other building point.
@@ -277,6 +278,7 @@ module URBANopt
277
278
  runner.registerInfo("Feature #{other_building[:properties][:id]} is acting as shading object for #{building.id}")
278
279
  end
279
280
  next unless shadowed
281
+
280
282
  new_building = building.create_other_building(:space_per_building, model, origin_lat_lon, runner, zoning, 0, other_building)
281
283
  if new_building.nil? || new_building.empty?
282
284
  runner.registerWarning("Failed to create spaces for other building '#{name}'")
@@ -321,6 +323,7 @@ module URBANopt
321
323
  if is_shaded(min_pair[:building_point], min_pair[:other_building_point], origin_lat_lon)
322
324
  return true
323
325
  end
326
+
324
327
  return false
325
328
  end
326
329
 
@@ -339,7 +342,8 @@ module URBANopt
339
342
  if distance < 1
340
343
  return true
341
344
  end
342
- elevation_angle = 2.5 #not sure of best value maybe allow as project level argument
345
+
346
+ elevation_angle = 2.5 # not sure of best value maybe allow as project level argument
343
347
  height = vector.z
344
348
  apparent_angle_rad = Math.atan2(height, distance)
345
349
  apparent_angle = OpenStudio.radToDeg(apparent_angle_rad)
@@ -351,9 +355,9 @@ module URBANopt
351
355
  return result
352
356
  end
353
357
 
354
- class << self
355
- private :is_shaded
356
- end
357
- end
358
- end
358
+ class << self
359
+ private :is_shaded
359
360
  end
361
+ end
362
+ end
363
+ end
@@ -7,7 +7,7 @@ require 'logger'
7
7
 
8
8
  module URBANopt
9
9
  module GeoJSON
10
- @@logger = Logger.new(STDERR)
10
+ @@logger = Logger.new($stderr)
11
11
  @@logger.progname = 'URBANopt::GeoJSON'
12
12
 
13
13
  def self.logger
@@ -46,15 +46,16 @@ module URBANopt
46
46
  feature_file = scenario.feature_file
47
47
  feature = feature_file.get_feature_by_id(feature_id)
48
48
  raise "Cannot find feature '#{feature_id}' in '#{scenario.geometry_file}'" if feature.nil?
49
+
49
50
  # deep clone of @@osw before we configure it #:nodoc:
50
51
  osw = Marshal.load(Marshal.dump(@@osw))
51
52
  osw[:name] = feature_name
52
53
  osw[:description] = feature_name
53
- end
54
+ end
54
55
  # rubocop:disable Lint/ReturnInVoidContext
55
56
  return osw
56
- # rubocop:enable Lint/ReturnInVoidContext
57
- end
57
+ # rubocop:enable Lint/ReturnInVoidContext
58
+ end
58
59
  end
59
60
  end
60
61
  end
@@ -75,6 +75,7 @@ module URBANopt
75
75
  stories.each_index do |i|
76
76
  space_type = space_types[i]
77
77
  next if space_type.nil?
78
+
78
79
  stories[i].spaces.each do |space|
79
80
  space.setSpaceType(space_type)
80
81
  end
@@ -10,9 +10,6 @@ module URBANopt
10
10
  class Region < Feature
11
11
  ##
12
12
  # Used to initialize the feature. This method is inherited from the Feature class.
13
- def initialize(feature)
14
- super(feature)
15
- end
16
13
 
17
14
  ##
18
15
  # Used to describe the Region feature type using the base method from the Feature class.
@@ -30,6 +30,7 @@ module URBANopt
30
30
  @vertices = vertices
31
31
  @centroid = OpenStudio.getCentroid(vertices)
32
32
  raise "Cannot compute centroid for '#{vertices}'" if @centroid.empty?
33
+
33
34
  @centroid = @centroid.get
34
35
  @desired_area = desired_area
35
36
  @new_vertices = vertices
@@ -41,15 +42,7 @@ module URBANopt
41
42
  @eps = eps
42
43
  end
43
44
 
44
- attr_reader :zero
45
-
46
- attr_reader :one
47
-
48
- attr_reader :two
49
-
50
- attr_reader :ten
51
-
52
- attr_reader :eps
45
+ attr_reader :zero, :one, :two, :ten, :eps, :new_vertices
53
46
 
54
47
  ##
55
48
  # Used to determine new scaled vertices, by iteratively passing in the perimeter distance to
@@ -59,12 +52,11 @@ module URBANopt
59
52
  @new_vertices = URBANopt::GeoJSON::Zoning.divide_floor_print(@vertices, x[0].to_f, @runner, scale = true)
60
53
  new_area = OpenStudio.getArea(@new_vertices)
61
54
  raise "Cannot compute area for '#{@new_vertices}'" if new_area.empty?
55
+
62
56
  new_area = new_area.get
63
57
 
64
58
  return [new_area - @desired_area]
65
59
  end
66
-
67
- attr_reader :new_vertices
68
- end # ScaleArea
69
- end # GeoJSON
70
- end # URBANopt
60
+ end
61
+ end
62
+ end
@@ -283,6 +283,18 @@
283
283
  "ev_curtailment_frac": {
284
284
  "description": "Fraction between 0 and 1 that denotes curtailment of EV charging load to better align EV charging with expected energy production from a solar PV system",
285
285
  "type": "number"
286
+ },
287
+ "characterize_residential_buildings_from_buildstock_csv":{
288
+ "description" : "Enable UO and ResStock connection to characterize residential buildings by matching them (and their properties) with building from the BuildStock CSV. Optional for residential buildings.",
289
+ "type": "boolean"
290
+ },
291
+ "resstock_buildstock_csv_path":{
292
+ "description" : "Path to the buildstock CSV that the users want to sample from to find the closest match to their UO residential buildings features. Optional for residential buildings.",
293
+ "type": "string"
294
+ },
295
+ "uo_buildstock_mapping_csv_path":{
296
+ "description" : "Path to the uo_buildstock mapping CSV. IN this CSV users can set a match of the UO features with a buildstock building and its characteristics and the feature will run with the assigned buildstock characteristics. Optional for residential buildings.",
297
+ "type": "string"
286
298
  }
287
299
  },
288
300
  "required": [
@@ -515,4 +527,4 @@
515
527
  ]
516
528
  }
517
529
  }
518
- }
530
+ }
@@ -77,15 +77,15 @@
77
77
  },
78
78
  "underground_cables_ratio": {
79
79
  "description": "Ratio of overall cables that are underground vs. overhead for RNM analysis.",
80
- "type": "number"
80
+ "type": ["number", "null"]
81
81
  },
82
82
  "only_lv_consumers": {
83
83
  "description": "If true, only low voltage consumers will be considered in the RNM analysis.",
84
- "type": "boolean"
84
+ "type": ["boolean", "null"]
85
85
  },
86
86
  "max_number_of_lv_nodes_per_building": {
87
87
  "description": "Maximum number of low voltage nodes to represent a single building.",
88
- "type": "number"
88
+ "type": ["number", "null"]
89
89
  },
90
90
  "emissions": {
91
91
  "description": "Should be set to true to calculate electricity emissions for the associated building.",
@@ -211,9 +211,21 @@
211
211
  "2018",
212
212
  "2019"
213
213
  ]
214
+ },
215
+ "characterize_residential_buildings_from_buildstock_csv":{
216
+ "description" : "Enable UO and ResStock connection to characterize residential buildings by matching them (and their properties) with building from the BuildStock CSV.",
217
+ "type": "boolean"
218
+ },
219
+ "resstock_buildstock_csv_path":{
220
+ "description" : "Path to the buildstock CSV that the users want to sample from to find the closest match to their UO residential buildings features.",
221
+ "type": "string"
222
+ },
223
+ "uo_buildstock_mapping_csv_path":{
224
+ "description" : "Path to the uo_buildstock mapping CSV. IN this CSV users can set a match of the UO features with a buildstock building and its characteristics and the feature will run with the assigned buildstock characteristics",
225
+ "type": "string"
214
226
  }
215
227
  },
216
228
  "required": [
217
229
  ],
218
230
  "additionalProperties": false
219
- }
231
+ }
@@ -47,10 +47,6 @@
47
47
  "description": "Presence of pump: true if present, false if absent",
48
48
  "type": "boolean"
49
49
  },
50
- "is_ghe_start_loop": {
51
- "description": "Determines whether this junction is present at the start of the loop for a Ground Heat Exchanger Network.",
52
- "type": "boolean"
53
- },
54
50
  "connection_type": {
55
51
  "description": "Characterize the connection as series or parallel",
56
52
  "$ref": "#/definitions/ThermalJunctionConnectionType"
@@ -25,10 +25,11 @@ geojson[:features].each do |feature|
25
25
  # end
26
26
 
27
27
  multi_polygons = nil
28
- if geometry[:type] == 'Polygon'
28
+ case geometry[:type]
29
+ when 'Polygon'
29
30
  polygons = geometry[:coordinates]
30
31
  multi_polygons = [polygons]
31
- elsif geometry[:type] == 'MultiPolygon'
32
+ when 'MultiPolygon'
32
33
  multi_polygons = geometry[:coordinates]
33
34
  end
34
35
 
@@ -8,7 +8,7 @@ require 'json-schema'
8
8
 
9
9
  def get_building_schema(strict)
10
10
  result = nil
11
- File.open(File.dirname(__FILE__) + '/../schema/building_properties.json') do |f|
11
+ File.open("#{File.dirname(__FILE__)}/../schema/building_properties.json") do |f|
12
12
  result = JSON.parse(f.read)
13
13
  end
14
14
  if strict
@@ -21,7 +21,7 @@ end
21
21
 
22
22
  def get_taxlot_schema(strict)
23
23
  result = nil
24
- File.open(File.dirname(__FILE__) + '/../schema/taxlot_properties.json') do |f|
24
+ File.open("#{File.dirname(__FILE__)}/../schema/taxlot_properties.json") do |f|
25
25
  result = JSON.parse(f.read)
26
26
  end
27
27
  if strict
@@ -34,7 +34,7 @@ end
34
34
 
35
35
  def get_district_system_schema(strict)
36
36
  result = nil
37
- File.open(File.dirname(__FILE__) + '/../schema/district_system_properties.json') do |f|
37
+ File.open("#{File.dirname(__FILE__)}/../schema/district_system_properties.json") do |f|
38
38
  result = JSON.parse(f.read)
39
39
  end
40
40
  if strict
@@ -47,7 +47,7 @@ end
47
47
 
48
48
  def get_region_schema(strict)
49
49
  result = nil
50
- File.open(File.dirname(__FILE__) + '/../schema/region_properties.json') do |f|
50
+ File.open("#{File.dirname(__FILE__)}/../schema/region_properties.json") do |f|
51
51
  result = JSON.parse(f.read)
52
52
  end
53
53
  if strict
@@ -95,13 +95,14 @@ Dir.glob('denver_district*.geojson').each do |p|
95
95
  type = data['type']
96
96
  errors = []
97
97
 
98
- if /building/i.match(type)
98
+ case type
99
+ when /building/i
99
100
  errors = validate(building_schema, data)
100
- elsif /district system/i.match(type)
101
+ when /district system/i
101
102
  errors = validate(district_system_schema, data)
102
- elsif /taxlot/i.match(type)
103
+ when /taxlot/i
103
104
  errors = validate(taxlot_schema, data)
104
- elsif /region/i.match(type)
105
+ when /region/i
105
106
  errors = validate(region_schema, data)
106
107
  else
107
108
  raise("Unknown type: '#{type}'")
@@ -5,6 +5,6 @@
5
5
 
6
6
  module URBANopt
7
7
  module GeoJSON
8
- VERSION = '0.11.1'.freeze
8
+ VERSION = '1.0.0'.freeze
9
9
  end
10
10
  end
@@ -28,11 +28,12 @@ module URBANopt
28
28
  vertex_1 = nil
29
29
  vertex_2 = nil
30
30
  vertex_3 = nil
31
- if i == 0
31
+ case i
32
+ when 0
32
33
  vertex_1 = vertices[n - 1]
33
34
  vertex_2 = vertices[i]
34
35
  vertex_3 = vertices[i + 1]
35
- elsif i == (n - 1)
36
+ when n - 1
36
37
  vertex_1 = vertices[i - 1]
37
38
  vertex_2 = vertices[i]
38
39
  vertex_3 = vertices[0]
@@ -22,14 +22,14 @@ Gem::Specification.new do |spec|
22
22
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
23
23
  spec.require_paths = ['lib']
24
24
 
25
- spec.required_ruby_version = '~> 2.7.0'
25
+ # We support exactly Ruby v3.2.2 because os-extension requires bundler==2.4.10 and that requires Ruby 3.2.2: https://stdgems.org/bundler/
26
+ # It would be nice to be able to use newer patches of Ruby 3.2, which would require os-extension to relax its dependency on bundler.
27
+ spec.required_ruby_version = '3.2.2'
26
28
 
27
- spec.add_development_dependency 'bundler', '>= 2.1.0'
28
- spec.add_development_dependency 'rake', '~> 13.0'
29
- spec.add_development_dependency 'rspec', '~> 3.9'
30
- spec.add_development_dependency 'simplecov', '~> 0.18.2'
31
- spec.add_development_dependency 'simplecov-lcov', '~> 0.8.0'
29
+ spec.add_development_dependency 'rspec', '~> 3.13'
30
+ spec.add_development_dependency 'simplecov', '0.22.0'
31
+ spec.add_development_dependency 'simplecov-lcov', '0.8.0'
32
32
 
33
- spec.add_runtime_dependency 'json-schema', '~> 2.7'
34
- spec.add_runtime_dependency 'urbanopt-core', '~> 0.11.0'
33
+ spec.add_runtime_dependency 'json-schema', '~> 4.3.1'
34
+ spec.add_runtime_dependency 'urbanopt-core', '~> 1.0.0'
35
35
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: urbanopt-geojson
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.11.1
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tanushree Charan
@@ -10,76 +10,48 @@ authors:
10
10
  autorequire:
11
11
  bindir: exe
12
12
  cert_chain: []
13
- date: 2024-01-09 00:00:00.000000000 Z
13
+ date: 2025-01-22 00:00:00.000000000 Z
14
14
  dependencies:
15
- - !ruby/object:Gem::Dependency
16
- name: bundler
17
- requirement: !ruby/object:Gem::Requirement
18
- requirements:
19
- - - ">="
20
- - !ruby/object:Gem::Version
21
- version: 2.1.0
22
- type: :development
23
- prerelease: false
24
- version_requirements: !ruby/object:Gem::Requirement
25
- requirements:
26
- - - ">="
27
- - !ruby/object:Gem::Version
28
- version: 2.1.0
29
- - !ruby/object:Gem::Dependency
30
- name: rake
31
- requirement: !ruby/object:Gem::Requirement
32
- requirements:
33
- - - "~>"
34
- - !ruby/object:Gem::Version
35
- version: '13.0'
36
- type: :development
37
- prerelease: false
38
- version_requirements: !ruby/object:Gem::Requirement
39
- requirements:
40
- - - "~>"
41
- - !ruby/object:Gem::Version
42
- version: '13.0'
43
15
  - !ruby/object:Gem::Dependency
44
16
  name: rspec
45
17
  requirement: !ruby/object:Gem::Requirement
46
18
  requirements:
47
19
  - - "~>"
48
20
  - !ruby/object:Gem::Version
49
- version: '3.9'
21
+ version: '3.13'
50
22
  type: :development
51
23
  prerelease: false
52
24
  version_requirements: !ruby/object:Gem::Requirement
53
25
  requirements:
54
26
  - - "~>"
55
27
  - !ruby/object:Gem::Version
56
- version: '3.9'
28
+ version: '3.13'
57
29
  - !ruby/object:Gem::Dependency
58
30
  name: simplecov
59
31
  requirement: !ruby/object:Gem::Requirement
60
32
  requirements:
61
- - - "~>"
33
+ - - '='
62
34
  - !ruby/object:Gem::Version
63
- version: 0.18.2
35
+ version: 0.22.0
64
36
  type: :development
65
37
  prerelease: false
66
38
  version_requirements: !ruby/object:Gem::Requirement
67
39
  requirements:
68
- - - "~>"
40
+ - - '='
69
41
  - !ruby/object:Gem::Version
70
- version: 0.18.2
42
+ version: 0.22.0
71
43
  - !ruby/object:Gem::Dependency
72
44
  name: simplecov-lcov
73
45
  requirement: !ruby/object:Gem::Requirement
74
46
  requirements:
75
- - - "~>"
47
+ - - '='
76
48
  - !ruby/object:Gem::Version
77
49
  version: 0.8.0
78
50
  type: :development
79
51
  prerelease: false
80
52
  version_requirements: !ruby/object:Gem::Requirement
81
53
  requirements:
82
- - - "~>"
54
+ - - '='
83
55
  - !ruby/object:Gem::Version
84
56
  version: 0.8.0
85
57
  - !ruby/object:Gem::Dependency
@@ -88,28 +60,28 @@ dependencies:
88
60
  requirements:
89
61
  - - "~>"
90
62
  - !ruby/object:Gem::Version
91
- version: '2.7'
63
+ version: 4.3.1
92
64
  type: :runtime
93
65
  prerelease: false
94
66
  version_requirements: !ruby/object:Gem::Requirement
95
67
  requirements:
96
68
  - - "~>"
97
69
  - !ruby/object:Gem::Version
98
- version: '2.7'
70
+ version: 4.3.1
99
71
  - !ruby/object:Gem::Dependency
100
72
  name: urbanopt-core
101
73
  requirement: !ruby/object:Gem::Requirement
102
74
  requirements:
103
75
  - - "~>"
104
76
  - !ruby/object:Gem::Version
105
- version: 0.11.0
77
+ version: 1.0.0
106
78
  type: :runtime
107
79
  prerelease: false
108
80
  version_requirements: !ruby/object:Gem::Requirement
109
81
  requirements:
110
82
  - - "~>"
111
83
  - !ruby/object:Gem::Version
112
- version: 0.11.0
84
+ version: 1.0.0
113
85
  description: Library and measures to translate URBANopt GeoJSON format to OpenStudio
114
86
  email:
115
87
  - tanushree.charan@nrel.gov
@@ -233,16 +205,16 @@ require_paths:
233
205
  - lib
234
206
  required_ruby_version: !ruby/object:Gem::Requirement
235
207
  requirements:
236
- - - "~>"
208
+ - - '='
237
209
  - !ruby/object:Gem::Version
238
- version: 2.7.0
210
+ version: 3.2.2
239
211
  required_rubygems_version: !ruby/object:Gem::Requirement
240
212
  requirements:
241
213
  - - ">="
242
214
  - !ruby/object:Gem::Version
243
215
  version: '0'
244
216
  requirements: []
245
- rubygems_version: 3.1.4
217
+ rubygems_version: 3.4.10
246
218
  signing_key:
247
219
  specification_version: 4
248
220
  summary: Translate URBANopt GeoJSON format to OpenStudio