openstudio-extension 0.2.1 → 0.2.2

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: 1cc5634df3c8c1a9c8a711707cd6b6a9d07b4a0f0f01aed1726576e244a0c5b2
4
- data.tar.gz: 8e433cbc4b7cc8b6737544771bb5273d8a7a267b8153ea936a2af3dccb61b486
3
+ metadata.gz: 27dbd08d5d11f58ea9839b1d8a3750e860964ad4f5075371cacb6f4c1c642c92
4
+ data.tar.gz: 3353e644a7b21fe23bd9e50dcc4f844e478237868f88001a2c6538c2092464ed
5
5
  SHA512:
6
- metadata.gz: 455200a3b2e03ae2b5ef3d15f67690297c04f7886ce31a5f358f02a907a394a5cc0f0ba57b7b44efa96633443f4d23316e391716548cbcaf70af11881389fe44
7
- data.tar.gz: 9f478fb250845c5e99b9d1d12ba4261b5b7c82fb2f69bffcd594c5ec1f8a5463d76c4de51202cac29b2f875d07bfffd35cc6fa53ae4e8d4baa3732a0d0c57e22
6
+ metadata.gz: 9c593e49a37e0851ee1886f54f1c1a7b6ed83ef882f6d25ff803c9aefc4067766299f0fa94845cb284101ba02766c6b4c0e8e572a41c25d954ebb4f14314052c
7
+ data.tar.gz: 10b1a4dade5d911b1611e0d7262fdd3f59d8b7671e1cef0b593e318b50ed4099227b024ed433fe3003d5270984d4e37dd46cf1924d2c978d0061e6a9d1483197
data/.gitignore CHANGED
@@ -13,6 +13,8 @@
13
13
  /test/
14
14
  /lib/measures/test_results
15
15
  /lib/measures/.rubocop*
16
+ /lib/measures/staged
17
+ /lib/measures/staged/*
16
18
 
17
19
  # rspec failure tracking
18
20
  .rspec_status
data/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # OpenStudio Extension Gem
2
2
 
3
+ ## Version 0.2.2
4
+
5
+ * Exclude measure tests from being released with the gem (reduces the size of the installed gem significantly)
6
+ * Add BCL commands to upload measures
7
+ * Update GitHub changelog gem to use Octokit compared to github_api (which was last released 3 years ago)
8
+ * Promote GitHub changelog creation to a rake task to be inherited by all downstream extension gems
9
+
3
10
  ## Version 0.2.1
4
11
 
5
12
  * Changes from 0.1.5 (runner.conf bug)
@@ -40,4 +47,4 @@
40
47
 
41
48
  ## Version 0.1.1
42
49
 
43
- * Initial release
50
+ * Initial release
data/Rakefile CHANGED
@@ -36,7 +36,7 @@ RSpec::Core::RakeTask.new(:spec)
36
36
  require 'openstudio/extension/rake_task'
37
37
  require 'openstudio/extension'
38
38
  rake_task = OpenStudio::Extension::RakeTask.new
39
- rake_task.set_extension_class(OpenStudio::Extension::Extension)
39
+ rake_task.set_extension_class(OpenStudio::Extension::Extension, 'nrel/openstudio-extension-gem')
40
40
 
41
41
  require 'rubocop/rake_task'
42
42
  RuboCop::RakeTask.new
data/lib/change_log.rb CHANGED
@@ -1,148 +1,132 @@
1
1
  #!/usr/bin/env ruby
2
2
  # frozen_string_literal: true
3
3
 
4
- require 'github_api'
4
+ require 'octokit'
5
5
  require 'date'
6
6
  require 'optparse'
7
7
  require 'optparse/date'
8
8
 
9
9
  # Instructions:
10
- # Get a token from github's settings (https://github.com/settings/tokens)
11
10
  #
12
11
  # Example:
13
12
  # ruby change_log.rb -t abcdefghijklmnopqrstuvwxyz -s 2017-09-06
14
13
  #
14
+ #
15
15
 
16
- options = {}
17
- OptionParser.new do |opts|
18
- opts.banner = "Usage: change_log.rb [options]\n" \
19
- 'Prints New, Open, Closed Issues, and number of accepted PRs'
20
- opts.separator ''
21
-
22
- # defaults, go back 90 days
23
- options[:start_date] = Date.today - 90
24
- options[:end_date] = Date.today
25
-
26
- opts.on('-s', '--start-date [DATE]', Date, 'Start of data (e.g. 2017-09-06)') do |v|
27
- options[:start_date] = v
28
- end
29
- opts.on('-e', '--end-date [DATE]', Date, 'End of data (e.g. 2017-09-13)') do |v|
30
- options[:end_date] = v
31
- end
32
- opts.on('-t', '--token [String]', String, 'Github API Token') do |v|
33
- options[:token] = v
16
+ class ChangeLog
17
+ def initialize(user_and_repo, start_date = Date.today - 90, end_date = Date.today, apikey = nil)
18
+ @user_and_repo = user_and_repo
19
+ @apikey = apikey
20
+ @start_date = start_date
21
+ @end_date = end_date
22
+
23
+ # Convert dates to time objects
24
+ @start_date = Time.parse(@start_date.to_s) if start_date.is_a? String
25
+ @end_date = Time.parse(@end_date.to_s) if end_date.is_a? String
26
+ # GitHub API uses Time and not the Date class, so ensure that we have Time
27
+ @start_date = Time.parse(@start_date.to_s)
28
+ @end_date = Time.parse(@end_date.to_s)
29
+
30
+ @total_open_issues = []
31
+ @total_open_pull_requests = []
32
+ @new_issues = []
33
+ @closed_issues = []
34
+ @accepted_pull_requests = []
35
+
36
+ begin
37
+ @github = Octokit::Client.new
38
+ if apikey
39
+ @github = Octokit::Client.new(access_token: apikey)
40
+ end
41
+ @github.auto_paginate = true
42
+ rescue StandardError => e
43
+ puts e.message
44
+ # write out the help message
45
+ ChangeLog.help
46
+ exit(1)
47
+ end
34
48
  end
35
- end.parse!
36
-
37
- # Convert dates to time objects
38
- options[:start_date] = Time.parse(options[:start_date].to_s)
39
- options[:end_date] = Time.parse(options[:end_date].to_s)
40
- puts options
41
-
42
- ### Repository options
43
- repo_owner = 'NREL'
44
- repo = 'openstudio-extension-gem'
45
49
 
46
- github = Github.new
47
- if options[:token]
48
- puts 'Using github token'
49
- github = Github.new oauth_token: options[:token]
50
- end
51
-
52
- total_open_issues = []
53
- total_open_pull_requests = []
54
- new_issues = []
55
- closed_issues = []
56
- accepted_pull_requests = []
57
-
58
- def get_num(issue)
59
- issue.html_url.split('/')[-1].to_i
60
- end
61
-
62
- def get_issue_num(issue)
63
- "\##{get_num(issue)}"
64
- end
65
-
66
- def get_html_url(issue)
67
- issue.html_url
68
- end
69
-
70
- def get_title(issue)
71
- issue.title
72
- end
73
-
74
- def print_issue(issue)
75
- is_feature = false
76
- issue.labels.each { |label| is_feature = true if label.name == 'Feature Request' }
77
-
78
- if is_feature
79
- "- Improved [#{get_issue_num(issue)}]( #{get_html_url(issue)} ), #{get_title(issue)}"
80
- else
81
- "- Fixed [#{get_issue_num(issue)}]( #{get_html_url(issue)} ), #{get_title(issue)}"
50
+ # Class method to show how to use the API through Rake.
51
+ def self.help
52
+ puts 'Usage: bundle exec rake openstudio:change_log[<start_date>,<end_date>,<apikey>]'
53
+ puts ' <start_date> = [Optional] Start of data (e.g., 2020-09-06), defaults to 90 days before today'
54
+ puts ' <end_date> = [Optional] End of data (e.g., 2020-10-06), default to today'
55
+ puts ' <apikey> = [Optional] GitHub API Key (used for private repos)'
56
+ puts
57
+ puts ' Ensure that the GitHub user/repo is set in your Rakefile, for example, '
58
+ puts " rake_task.set_extension_class(OpenStudio::Extension::Extension, 'nrel/openstudio-extension-gem')"
59
+ puts
60
+ puts ' Example usages:'
61
+ puts ' bundle exec rake openstudio:change_log[2020-01-01]'
62
+ puts ' bundle exec rake openstudio:change_log[2020-01-01,2020-06-30]'
63
+ puts ' bundle exec rake openstudio:change_log[2020-01-01,2020-01-10,<private_api_key>]'
64
+ puts
65
+ puts ' Notes:'
66
+ puts ' For creating token, see https://github.com/settings/tokens.'
67
+ puts ' Note that if passing apikey, then you must pass start_date and end_date as well. There must be no spaces'
68
+ puts ' between the arguments (see examples above).'
82
69
  end
83
- end
84
70
 
85
- # Process Open Issues
86
- results = -1
87
- page = 1
88
- while results != 0
89
- resp = github.issues.list user: repo_owner, repo: repo, sort: 'created', direction: 'asc',
90
- state: 'open', per_page: 100, page: page
91
- results = resp.length
92
- resp.env[:body].each do |issue, _index|
93
- created = Time.parse(issue.created_at)
94
- if !issue.key?(:pull_request)
95
- total_open_issues << issue
96
- if created >= options[:start_date] && created <= options[:end_date]
97
- new_issues << issue
71
+ # Process Open Issues
72
+ def process
73
+ @github.list_issues(@user_and_repo, state: 'all').each do |issue|
74
+ if issue.state == 'open'
75
+ if issue.pull_request
76
+ if issue.created_at >= @start_date && issue.created_at <= @end_date
77
+ @total_open_pull_requests << issue
78
+ end
79
+ else
80
+ @total_open_issues << issue
81
+ if issue.created_at >= @start_date && issue.created_at <= @end_date
82
+ @new_issues << issue
83
+ end
84
+ end
85
+ else
86
+ # the issue is closed
87
+ if issue.closed_at >= @start_date && issue.closed_at <= @end_date
88
+ if issue.pull_request
89
+ @accepted_pull_requests << issue
90
+ else
91
+ @closed_issues << issue
92
+ end
93
+ end
98
94
  end
99
- else
100
- total_open_pull_requests << issue
101
95
  end
96
+
97
+ @closed_issues.sort! { |x, y| x.number <=> y.number }
98
+ @new_issues.sort! { |x, y| x.number <=> y.number }
99
+ @accepted_pull_requests.sort! { |x, y| x.number <=> y.number }
100
+ @total_open_pull_requests.sort! { |x, y| x.number <=> y.number }
101
+ rescue StandardError => e
102
+ puts e.message
103
+ ChangeLog.help
104
+ exit(1)
102
105
  end
103
106
 
104
- page += 1
105
- end
107
+ def print_issue(issue)
108
+ is_feature = false
109
+ issue.labels.each { |label| is_feature = true if label.name == 'Feature Request' }
106
110
 
107
- # Process Closed Issues
108
- results = -1
109
- page = 1
110
- while results != 0
111
- resp = github.issues.list user: repo_owner, repo: repo, sort: 'created', direction: 'asc',
112
- state: 'closed', per_page: 100, page: page
113
- results = resp.length
114
- resp.env[:body].each do |issue, _index|
115
- created = Time.parse(issue.created_at)
116
- closed = Time.parse(issue.closed_at)
117
- if !issue.key?(:pull_request)
118
- if created >= options[:start_date] && created <= options[:end_date]
119
- new_issues << issue
120
- end
121
- if closed >= options[:start_date] && closed <= options[:end_date]
122
- closed_issues << issue
123
- end
124
- elsif closed >= options[:start_date] && closed <= options[:end_date]
125
- accepted_pull_requests << issue
111
+ if is_feature
112
+ "- Improved [##{issue.number}]( #{issue.html_url} ), #{issue.title}"
113
+ else
114
+ "- Fixed [\##{issue.number}]( #{issue.html_url} ), #{issue.title}"
126
115
  end
127
116
  end
128
117
 
129
- page += 1
130
- end
131
-
132
- closed_issues.sort! { |x, y| get_num(x) <=> get_num(y) }
133
- new_issues.sort! { |x, y| get_num(x) <=> get_num(y) }
134
- accepted_pull_requests.sort! { |x, y| get_num(x) <=> get_num(y) }
135
- total_open_pull_requests.sort! { |x, y| get_num(x) <=> get_num(y) }
136
-
137
- puts "Total Open Issues: #{total_open_issues.length}"
138
- puts "Total Open Pull Requests: #{total_open_pull_requests.length}"
139
- puts "\nDate Range: #{options[:start_date].strftime('%m/%d/%y')} - #{options[:end_date].strftime('%m/%d/%y')}:"
140
- puts "\nNew Issues: #{new_issues.length} (" + new_issues.map { |issue| get_issue_num(issue) }.join(', ') + ')'
118
+ def print_issues
119
+ puts "Total Open Issues: #{@total_open_issues.length}"
120
+ puts "Total Open Pull Requests: #{@total_open_pull_requests.length}"
121
+ puts "\nDate Range: #{@start_date.strftime('%m/%d/%y')} - #{@end_date.strftime('%m/%d/%y')}:"
122
+ puts "\nNew Issues: #{@new_issues.length} (" + @new_issues.map { |issue| issue.number }.join(', ') + ')'
141
123
 
142
- puts "\nClosed Issues: #{closed_issues.length}"
143
- closed_issues.each { |issue| puts print_issue(issue) }
124
+ puts "\nClosed Issues: #{@closed_issues.length}"
125
+ @closed_issues.each { |issue| puts print_issue(issue) }
144
126
 
145
- puts "\nAccepted Pull Requests: #{accepted_pull_requests.length}"
146
- accepted_pull_requests.each { |issue| puts print_issue(issue) }
127
+ puts "\nAccepted Pull Requests: #{@accepted_pull_requests.length}"
128
+ @accepted_pull_requests.each { |issue| puts print_issue(issue) }
147
129
 
148
- puts "\nAll Open Issues: #{total_open_issues.length} (" + total_open_issues.map { |issue| get_issue_num(issue) }.join(', ') + ')'
130
+ puts "\nAll Open Issues: #{@total_open_issues.length} (" + @total_open_issues.map { |issue| "\##{issue.number}" }.join(', ') + ')'
131
+ end
132
+ end
@@ -1,17 +1,18 @@
1
+ <?xml version="1.0"?>
1
2
  <measure>
2
3
  <schema_version>3.0</schema_version>
3
4
  <name>openstudio_extension_test_measure</name>
4
5
  <uid>36b99a29-41e1-4d85-9272-85d43b966e5a</uid>
5
- <version_id>e9fedf04-7619-4c93-a865-0e54adfe3507</version_id>
6
- <version_modified>20190430T155209Z</version_modified>
6
+ <version_id>edf7f103-9f51-4944-a5af-1d8fa2b0c9b7</version_id>
7
+ <version_modified>20200427T230714Z</version_modified>
7
8
  <xml_checksum>49BEF039</xml_checksum>
8
9
  <class_name>OpenStudioExtensionTestMeasure</class_name>
9
10
  <display_name>OpenStudio Extension Test Measure</display_name>
10
- <description>Rotate your building relative to its current orientation. This will not rotate site shading objects.</description>
11
- <modeler_description>Get the North Axis field for the OS:Building object and adjusted it based on the user specified value. If the starting value is 20 degrees and the user value is 5 degrees, then the resulting value is 25 degrees.</modeler_description>
12
- <arguments/>
13
- <outputs/>
14
- <provenances/>
11
+ <description>A measure that tests OpenStudio Extension gem functionality</description>
12
+ <modeler_description>This is a test measure that tests OpenStudio Extension gem functionality.</modeler_description>
13
+ <arguments />
14
+ <outputs />
15
+ <provenances />
15
16
  <tags>
16
17
  <tag>Envelope.Form</tag>
17
18
  </tags>
@@ -38,12 +39,6 @@
38
39
  </attribute>
39
40
  </attributes>
40
41
  <files>
41
- <file>
42
- <filename>LICENSE.md</filename>
43
- <filetype>md</filetype>
44
- <usage_type>license</usage_type>
45
- <checksum>9640B6CB</checksum>
46
- </file>
47
42
  <file>
48
43
  <filename>README.md.erb</filename>
49
44
  <filetype>erb</filetype>
@@ -51,16 +46,16 @@
51
46
  <checksum>703C9964</checksum>
52
47
  </file>
53
48
  <file>
54
- <filename>README.md</filename>
49
+ <filename>LICENSE.md</filename>
55
50
  <filetype>md</filetype>
56
- <usage_type>readme</usage_type>
57
- <checksum>7258830F</checksum>
51
+ <usage_type>license</usage_type>
52
+ <checksum>E0468DD6</checksum>
58
53
  </file>
59
54
  <file>
60
55
  <filename>OpenStudioExtensionTestMeasure_Test.rb</filename>
61
56
  <filetype>rb</filetype>
62
57
  <usage_type>test</usage_type>
63
- <checksum>8452EA9A</checksum>
58
+ <checksum>66A00EA8</checksum>
64
59
  </file>
65
60
  <file>
66
61
  <version>
@@ -71,13 +66,19 @@
71
66
  <filename>measure.rb</filename>
72
67
  <filetype>rb</filetype>
73
68
  <usage_type>script</usage_type>
74
- <checksum>E5793A49</checksum>
69
+ <checksum>51BB85EF</checksum>
75
70
  </file>
76
71
  <file>
77
72
  <filename>os_lib_helper_methods.rb</filename>
78
73
  <filetype>rb</filetype>
79
74
  <usage_type>resource</usage_type>
80
- <checksum>22515A49</checksum>
75
+ <checksum>07B01D67</checksum>
76
+ </file>
77
+ <file>
78
+ <filename>README.md</filename>
79
+ <filetype>md</filetype>
80
+ <usage_type>readme</usage_type>
81
+ <checksum>7258830F</checksum>
81
82
  </file>
82
83
  </files>
83
84
  </measure>
@@ -51,14 +51,16 @@ module OpenStudio
51
51
  setup_subtasks(@name)
52
52
  end
53
53
 
54
- def set_extension_class(extension_class)
54
+ def set_extension_class(extension_class, github_repo='')
55
55
  @extension_class = extension_class
56
56
  @extension = extension_class.new
57
57
  @root_dir = @extension.root_dir
58
58
  @measures_dir = @extension.measures_dir
59
+ @staged_path = @measures_dir + '/staged'
59
60
  @core_dir = @extension.core_dir
60
61
  @doc_templates_dir = @extension.doc_templates_dir
61
62
  @files_dir = @extension.files_dir
63
+ @github_repo = github_repo
62
64
  end
63
65
 
64
66
  private
@@ -67,14 +69,14 @@ module OpenStudio
67
69
  namespace name do
68
70
  desc 'Run the CLI task to check for measure updates'
69
71
  task update_measures: ['measures:add_license', 'measures:add_readme', 'measures:copy_resources', 'update_copyright'] do
70
- puts 'updating measures...'
72
+ puts 'updating measures'
71
73
  runner = OpenStudio::Extension::Runner.new(Dir.pwd)
72
74
  runner.update_measures(@measures_dir)
73
75
  end
74
76
 
75
77
  desc 'List measures'
76
78
  task :list_measures do
77
- puts 'Listing measures...'
79
+ puts 'Listing measures'
78
80
  runner = OpenStudio::Extension::Runner.new(Dir.pwd)
79
81
  runner.list_measures(@measures_dir)
80
82
  end
@@ -92,12 +94,6 @@ module OpenStudio
92
94
  end
93
95
  end
94
96
 
95
- # TODO: Implement this eventually... comment out for now.
96
- # desc 'Use openstudio docker image to run tests'
97
- # task :test_with_docker do
98
- # puts 'testing with docker'
99
- # end
100
-
101
97
  # namespace for measure operations
102
98
  namespace 'measures' do
103
99
  desc 'Copy the resources files to individual measures'
@@ -145,14 +141,203 @@ module OpenStudio
145
141
  runner.update_copyright(@root_dir, @doc_templates_dir)
146
142
  end
147
143
 
148
- desc 'Copy the measures to a location that can be uploaded to BCL'
149
- task :stage_bcl do
150
- puts 'Staging measures for BCL'
144
+ desc 'Print the change log from GitHub'
145
+ task :change_log, [:start_date, :end_date, :apikey] do |t, args|
146
+ require 'change_log'
147
+ cl = ChangeLog.new(@github_repo, *args)
148
+ cl.process
149
+ cl.print_issues
151
150
  end
152
151
 
153
- desc 'Upload measures from the specified location.'
154
- task :push_bcl do
155
- puts 'Push measures to BCL'
152
+ namespace 'bcl' do
153
+ desc 'Test BCL login'
154
+ task :test_login do
155
+ puts 'test BCL login'
156
+ bcl = ::BCL::ComponentMethods.new
157
+ bcl.login
158
+ end
159
+
160
+ # for custom search, populate env var: bcl_search_keyword
161
+ desc 'Search BCL'
162
+ task :search_measures do
163
+ puts 'test search BCL'
164
+ bcl = ::BCL::ComponentMethods.new
165
+ bcl.login
166
+
167
+ # check for env var specifying keyword first
168
+ if ENV['bcl_search_keyword']
169
+ keyword = ENV['bcl_search_keyword']
170
+ else
171
+ keyword = 'Space'
172
+ end
173
+ num_results = 10
174
+ # bcl.search params: search_string, filter_string, return_all_results?
175
+ puts "searching BCL measures for keyword: #{keyword}"
176
+ results = bcl.search(keyword, "fq[]=bundle:nrel_measure&show_rows=#{num_results}", false)
177
+ puts "there are #{results[:result].count} results"
178
+ results[:result].each do |res|
179
+ puts (res[:measure][:name]).to_s
180
+ end
181
+ end
182
+
183
+ # to call with argument: "openstudio:bcl:stage[true]" (true = remove existing staged content)
184
+ desc 'Copy the measures/components to a location that can be uploaded to BCL'
185
+ task :stage, [:reset] do |t, args|
186
+ puts 'Staging measures for BCL'
187
+ # initialize BCL and login
188
+ bcl = ::BCL::ComponentMethods.new
189
+ bcl.login
190
+
191
+ # process reset options: true to clear out old staged content
192
+ options = { reset: false }
193
+ if args[:reset].to_s == 'true'
194
+ options[:reset] = true
195
+ end
196
+
197
+ # ensure staged dir exists
198
+ FileUtils.mkdir_p(@staged_path)
199
+
200
+ # delete existing tarballs if reset is true
201
+ if options[:reset]
202
+ puts 'Deleting existing staged content'
203
+ FileUtils.rm_rf(Dir.glob("#{@staged_path}/*"))
204
+ end
205
+
206
+ # create new and existing directories
207
+ FileUtils.mkdir_p(@staged_path.to_s + '/update')
208
+ FileUtils.mkdir_p(@staged_path.to_s + '/push/component')
209
+ FileUtils.mkdir_p(@staged_path.to_s + '/push/measure')
210
+
211
+ # keep track of noop, update, push
212
+ noops = 0
213
+ new_ones = 0
214
+ updates = 0
215
+
216
+ # get all content directories to process
217
+ dirs = Dir.glob("#{@measures_dir}/*")
218
+
219
+ dirs.each do |dir|
220
+ next if dir.include?('Rakefile') || File.basename(dir) == 'staged'
221
+ current_d = Dir.pwd
222
+ content_name = File.basename(dir)
223
+ puts '', '---'
224
+ puts "Generating #{content_name}"
225
+
226
+ Dir.chdir(dir)
227
+
228
+ # figure out whether to upload new or update existing
229
+ files = Pathname.glob('**/*')
230
+ uuid = nil
231
+ vid = nil
232
+ content_type = 'measure'
233
+
234
+ paths = []
235
+ files.each do |file|
236
+ # don't tar tests/outputs directory
237
+ next if file.to_s.start_with?('tests/output') # From measure testing process
238
+ next if file.to_s.start_with?('tests/test') # From openstudio-measure-tester-gem
239
+ next if file.to_s.start_with?('tests/coverage') # From openstudio-measure-tester-gem
240
+ next if file.to_s.start_with?('test_results') # From openstudio-measure-tester-gem
241
+ paths << file.to_s
242
+ if file.to_s =~ /^.{0,2}component.xml$/ || file.to_s =~ /^.{0,2}measure.xml$/
243
+ if file.to_s.match?(/^.{0,2}component.xml$/)
244
+ content_type = 'component'
245
+ end
246
+ # extract uuid and vid
247
+ uuid, vid = bcl.uuid_vid_from_xml(file)
248
+ end
249
+ end
250
+ puts "UUID: #{uuid}, VID: #{vid}"
251
+
252
+ # note: if uuid is missing, will assume new content
253
+ action = bcl.search_by_uuid(uuid, vid)
254
+ puts "#{content_name} ACTION TO TAKE: #{action}"
255
+ # new content functionality needs to know if measure or component. update is agnostic.
256
+ if action == 'noop' # ignore up-to-date content
257
+ puts " - WARNING: local #{content_name} uuid and vid match BCL... no update will be performed"
258
+ noops += 1
259
+ next
260
+ elsif action == 'update'
261
+ # puts "#{content_name} labeled as update for BCL"
262
+ destination = @staged_path + '/' + action + '/' + "#{content_name}.tar.gz"
263
+ updates += 1
264
+ elsif action == 'push'
265
+ # puts "#{content_name} labeled as new content for BCL"
266
+ destination = @staged_path + '/' + action + '/' + content_type + "/#{content_name}.tar.gz"
267
+ new_ones += 1
268
+ end
269
+
270
+ puts "destination: #{destination}"
271
+
272
+ # copy over only if 'reset_receipts' is set to TRUE. otherwise ignore if file exists already
273
+ if File.exist?(destination)
274
+ if reset
275
+ FileUtils.rm(destination)
276
+ ::BCL.tarball(destination, paths)
277
+ else
278
+ puts "*** WARNING: File #{content_name}.tar.gz already exists in staged directory... keeping existing file. To overwrite, set reset_receipts arg to true ***"
279
+ end
280
+ else
281
+ ::BCL.tarball(destination, paths)
282
+ end
283
+ Dir.chdir(current_d)
284
+ end
285
+ puts '', "****STAGING DONE**** #{new_ones} new content, #{updates} updates, #{noops} skipped (already up-to-date on BCL)", ''
286
+ end
287
+
288
+ desc 'Upload measures from the specified location.'
289
+ task :push do
290
+ puts 'Push measures to BCL'
291
+
292
+ # initialize BCL and login
293
+ bcl = ::BCL::ComponentMethods.new
294
+ bcl.login
295
+ reset = false
296
+
297
+ total_count = 0
298
+ successes = 0
299
+ errors = 0
300
+ skipped = 0
301
+
302
+ # grab all the new measure and component tar files and push to bcl
303
+ ['measure', 'component'].each do |content_type|
304
+ items = []
305
+ paths = Pathname.glob(@staged_path.to_s + "/push/#{content_type}/*.tar.gz")
306
+ paths.each do |path|
307
+ # puts path
308
+ items << path.to_s
309
+ end
310
+
311
+ items.each do |item|
312
+ puts item.split('/').last
313
+ total_count += 1
314
+
315
+ receipt_file = File.dirname(item) + '/' + File.basename(item, '.tar.gz') + '.receipt'
316
+ if !reset && File.exist?(receipt_file)
317
+ skipped += 1
318
+ puts 'SKIP: receipt file found'
319
+ next
320
+ end
321
+
322
+ valid, res = bcl.push_content(item, true, "nrel_#{content_type}")
323
+ if valid
324
+ successes += 1
325
+ else
326
+ errors += 1
327
+ if res.key?(:error)
328
+ puts " ERROR MESSAGE: #{res[:error]}"
329
+ else
330
+ puts "ERROR: #{res.inspect.chomp}"
331
+ end
332
+ end
333
+ puts '', '---'
334
+ end
335
+ end
336
+
337
+ # grab all the updated content (measures and components) tar files and push to bcl
338
+ items = []
339
+ paths = Pathname.glob(@staged_path.to_s + '/update/*.tar.gz')
340
+ end
156
341
  end
157
342
  end
158
343
  end
@@ -43,6 +43,7 @@ require 'openstudio'
43
43
  require 'yaml'
44
44
  require 'fileutils'
45
45
  require 'parallel'
46
+ require 'bcl'
46
47
 
47
48
  module OpenStudio
48
49
  module Extension
@@ -57,7 +58,7 @@ module OpenStudio
57
58
  # compatible with the OpenStudio CLI.
58
59
  ##
59
60
  # @param [String] dirname Directory to run commands in, defaults to Dir.pwd. If directory includes a Gemfile then create a local bundle.
60
- # @param bundle_without [Hash] Hash describing the distribution of the variable.
61
+ # @param bundle_without [Array] List of strings of the groups to exclude when running the bundle command
61
62
  # @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.
62
63
  # @option options [String] :max_datapoints Max number of datapoints to run
63
64
  # @option options [String] :num_parallel Number of simulations to run in parallel at a time
@@ -37,6 +37,6 @@
37
37
 
38
38
  module OpenStudio
39
39
  module Extension
40
- VERSION = '0.2.1'
40
+ VERSION = '0.2.2'
41
41
  end
42
42
  end
@@ -22,7 +22,7 @@ Gem::Specification.new do |spec|
22
22
  }
23
23
 
24
24
  spec.files = `git ls-files -z`.split("\x0").reject do |f|
25
- f.match(%r{^(test|spec|features)/})
25
+ f.match(%r{^(test|lib.measures.*tests|spec|features)/})
26
26
  end
27
27
  spec.bindir = 'exe'
28
28
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
@@ -30,12 +30,13 @@ Gem::Specification.new do |spec|
30
30
 
31
31
  spec.required_ruby_version = '~> 2.5.0'
32
32
 
33
+ spec.add_dependency 'bcl', '~> 0.6.0'
33
34
  spec.add_dependency 'bundler', '~> 2.1'
34
- spec.add_dependency 'openstudio-workflow', '~> 2.0.0'
35
+ spec.add_dependency 'octokit', '~> 4.18.0' # for change logs
35
36
  spec.add_dependency 'openstudio_measure_tester', '~> 0.2.2'
37
+ spec.add_dependency 'openstudio-workflow', '~> 2.0.0'
36
38
  spec.add_dependency 'parallel', '~> 1.19.1'
37
39
 
38
- spec.add_development_dependency 'github_api', '~> 0.18.0'
39
40
  spec.add_development_dependency 'rake', '~> 13.0'
40
41
  spec.add_development_dependency 'rspec', '~> 3.9'
41
42
  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.1
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Katherine Fleming
@@ -10,8 +10,22 @@ authors:
10
10
  autorequire:
11
11
  bindir: exe
12
12
  cert_chain: []
13
- date: 2020-04-07 00:00:00.000000000 Z
13
+ date: 2020-05-01 00:00:00.000000000 Z
14
14
  dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: bcl
17
+ requirement: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - "~>"
20
+ - !ruby/object:Gem::Version
21
+ version: 0.6.0
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - "~>"
27
+ - !ruby/object:Gem::Version
28
+ version: 0.6.0
15
29
  - !ruby/object:Gem::Dependency
16
30
  name: bundler
17
31
  requirement: !ruby/object:Gem::Requirement
@@ -27,19 +41,19 @@ dependencies:
27
41
  - !ruby/object:Gem::Version
28
42
  version: '2.1'
29
43
  - !ruby/object:Gem::Dependency
30
- name: openstudio-workflow
44
+ name: octokit
31
45
  requirement: !ruby/object:Gem::Requirement
32
46
  requirements:
33
47
  - - "~>"
34
48
  - !ruby/object:Gem::Version
35
- version: 2.0.0
49
+ version: 4.18.0
36
50
  type: :runtime
37
51
  prerelease: false
38
52
  version_requirements: !ruby/object:Gem::Requirement
39
53
  requirements:
40
54
  - - "~>"
41
55
  - !ruby/object:Gem::Version
42
- version: 2.0.0
56
+ version: 4.18.0
43
57
  - !ruby/object:Gem::Dependency
44
58
  name: openstudio_measure_tester
45
59
  requirement: !ruby/object:Gem::Requirement
@@ -55,33 +69,33 @@ dependencies:
55
69
  - !ruby/object:Gem::Version
56
70
  version: 0.2.2
57
71
  - !ruby/object:Gem::Dependency
58
- name: parallel
72
+ name: openstudio-workflow
59
73
  requirement: !ruby/object:Gem::Requirement
60
74
  requirements:
61
75
  - - "~>"
62
76
  - !ruby/object:Gem::Version
63
- version: 1.19.1
77
+ version: 2.0.0
64
78
  type: :runtime
65
79
  prerelease: false
66
80
  version_requirements: !ruby/object:Gem::Requirement
67
81
  requirements:
68
82
  - - "~>"
69
83
  - !ruby/object:Gem::Version
70
- version: 1.19.1
84
+ version: 2.0.0
71
85
  - !ruby/object:Gem::Dependency
72
- name: github_api
86
+ name: parallel
73
87
  requirement: !ruby/object:Gem::Requirement
74
88
  requirements:
75
89
  - - "~>"
76
90
  - !ruby/object:Gem::Version
77
- version: 0.18.0
78
- type: :development
91
+ version: 1.19.1
92
+ type: :runtime
79
93
  prerelease: false
80
94
  version_requirements: !ruby/object:Gem::Requirement
81
95
  requirements:
82
96
  - - "~>"
83
97
  - !ruby/object:Gem::Version
84
- version: 0.18.0
98
+ version: 1.19.1
85
99
  - !ruby/object:Gem::Dependency
86
100
  name: rake
87
101
  requirement: !ruby/object:Gem::Requirement
@@ -154,7 +168,6 @@ files:
154
168
  - lib/measures/openstudio_extension_test_measure/measure.rb
155
169
  - lib/measures/openstudio_extension_test_measure/measure.xml
156
170
  - lib/measures/openstudio_extension_test_measure/resources/os_lib_helper_methods.rb
157
- - lib/measures/openstudio_extension_test_measure/tests/openstudio_extension_test_measure_test.rb
158
171
  - lib/openstudio-extension.rb
159
172
  - lib/openstudio/extension.rb
160
173
  - lib/openstudio/extension/core/CreateResults.rb
@@ -205,7 +218,7 @@ licenses: []
205
218
  metadata:
206
219
  bug_tracker_uri: https://github.com/NREL/openstudio-extension-gem/issues
207
220
  changelog_uri: https://github.com/NREL/openstudio-extension-gem/blob/develop/CHANGELOG.md
208
- source_code_uri: https://github.com/NREL/openstudio-extension-gem/tree/v0.2.1
221
+ source_code_uri: https://github.com/NREL/openstudio-extension-gem/tree/v0.2.2
209
222
  post_install_message:
210
223
  rdoc_options: []
211
224
  require_paths:
@@ -1,76 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # *******************************************************************************
4
- # OpenStudio(R), Copyright (c) 2008-2020, Alliance for Sustainable Energy, LLC.
5
- # All rights reserved.
6
- # Redistribution and use in source and binary forms, with or without
7
- # modification, are permitted provided that the following conditions are met:
8
- #
9
- # (1) Redistributions of source code must retain the above copyright notice,
10
- # this list of conditions and the following disclaimer.
11
- #
12
- # (2) Redistributions in binary form must reproduce the above copyright notice,
13
- # this list of conditions and the following disclaimer in the documentation
14
- # and/or other materials provided with the distribution.
15
- #
16
- # (3) Neither the name of the copyright holder nor the names of any contributors
17
- # may be used to endorse or promote products derived from this software without
18
- # specific prior written permission from the respective party.
19
- #
20
- # (4) Other than as required in clauses (1) and (2), distributions in any form
21
- # of modifications or other derivative works may not use the "OpenStudio"
22
- # trademark, "OS", "os", or any other confusingly similar designation without
23
- # specific prior written permission from Alliance for Sustainable Energy, LLC.
24
- #
25
- # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND ANY CONTRIBUTORS
26
- # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
27
- # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28
- # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER(S), ANY CONTRIBUTORS, THE
29
- # UNITED STATES GOVERNMENT, OR THE UNITED STATES DEPARTMENT OF ENERGY, NOR ANY OF
30
- # THEIR EMPLOYEES, BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
31
- # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
32
- # OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33
- # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
34
- # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
35
- # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36
- # *******************************************************************************
37
-
38
- require 'openstudio'
39
- require 'openstudio/measure/ShowRunnerOutput'
40
-
41
- require_relative '../measure.rb'
42
- require 'minitest/autorun'
43
-
44
- class OpenStudioExtensionTestMeasureTest < Minitest::Test
45
- # def setup
46
- # end
47
-
48
- # def teardown
49
- # end
50
-
51
- def test_OpenStudioExtensionTestMeasure
52
- # create an instance of the measure
53
- measure = OpenStudioExtensionTestMeasure.new
54
-
55
- # create an instance of a runner
56
- runner = OpenStudio::Measure::OSRunner.new(OpenStudio::WorkflowJSON.new)
57
-
58
- # make an empty model
59
- model = OpenStudio::Model::Model.new
60
-
61
- # get arguments and test that they are what we are expecting
62
- arguments = measure.arguments(model)
63
- assert_equal(0, arguments.size)
64
-
65
- # set argument values to good values and run the measure on model with spaces
66
- arguments = measure.arguments(model)
67
- argument_map = OpenStudio::Measure.convertOSArgumentVectorToMap(arguments)
68
-
69
- measure.run(model, runner, argument_map)
70
- result = runner.result
71
- # show_output(result)
72
- assert(result.value.valueName == 'Success')
73
- assert(result.warnings.empty?)
74
- assert(result.info.empty?)
75
- end
76
- end