openstudio-extension 0.2.1 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 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