bcl 0.3.3 → 0.3.4

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.
@@ -216,23 +216,20 @@ module BCL
216
216
  res_j = "could not get json from http post response"
217
217
  if res.code == '200'
218
218
  res_j = JSON.parse(res.body)
219
- puts "200 - Successful Upload"
219
+ puts " 200 - Successful Upload"
220
220
  valid = true
221
221
  elsif res.code == '404'
222
- puts "error code: #{res.code}"
223
- puts "error info: #{res.body}"
224
- puts "404 - check these common causes first:"
225
- puts " the filename contains periods (other than the ones before the file extension)"
226
- puts " you are not an 'administrator member' of the group you're trying to upload to"
222
+ puts " error code: #{res.code} - #{res.body}"
223
+ puts " 404 - check these common causes first:"
224
+ puts " the filename contains periods (other than the ones before the file extension)"
225
+ puts " you are not an 'administrator member' of the group you're trying to upload to"
227
226
  valid = false
228
227
  elsif res.code == '500'
229
- puts "error code: #{res.code}"
230
- puts "error info: #{res.body}"
228
+ puts " error code: #{res.code} - #{res.body}"
231
229
  raise "server exception"
232
230
  valid = false
233
231
  else
234
- puts "error code: #{res.code}"
235
- puts "error info: #{res.body}"
232
+ puts " error code: #{res.code} - #{res.body}"
236
233
  valid = false
237
234
  end
238
235
 
@@ -311,23 +308,20 @@ module BCL
311
308
  res_j = "could not get json from http post response"
312
309
  if res.code == '200'
313
310
  res_j = JSON.parse(res.body)
314
- puts "200 - Successful Upload"
311
+ puts " 200 - Successful Upload"
315
312
  valid = true
316
313
  elsif res.code == '404'
317
- puts "error code: #{res.code}"
318
- puts "error info: #{res.body}"
319
- puts "404 - check these common causes first:"
320
- puts " the filename contains periods (other than the ones before the file extension)"
321
- puts " you are not an 'administrator member' of the group you're trying to upload to"
314
+ puts " error code: #{res.code} - #{res.body}"
315
+ puts " 404 - check these common causes first:"
316
+ puts " the filename contains periods (other than the ones before the file extension)"
317
+ puts " you are not an 'administrator member' of the group you're trying to upload to"
322
318
  valid = false
323
319
  elsif res.code == '500'
324
- puts "error code: #{res.code}"
325
- puts "error info: #{res.body}"
320
+ puts " error code: #{res.code} - #{res.body}"
326
321
  raise "server exception"
327
322
  valid = false
328
323
  else
329
- puts "error code: #{res.code}"
330
- puts "error info: #{res.body}"
324
+ puts " error code: #{res.code} - #{res.body}"
331
325
  valid = false
332
326
  end
333
327
 
data/lib/bcl/tar_ball.rb CHANGED
@@ -27,6 +27,14 @@ module BCL
27
27
  module_function
28
28
 
29
29
  def tarball(destination, paths)
30
+
31
+ #check for filepath length limit
32
+ full_destination = File.expand_path(destination)
33
+ if full_destination.length > 259 #256 chars max; "C:\" doesn't count
34
+ puts "[TarBall] ERROR cannot generate #{destination} because path exceeds 256 char limit. shorten component name by at least by #{full_destination.length - 259} chars"
35
+ return
36
+ end
37
+
30
38
  Zlib::GzipWriter.open(destination) do |gzip|
31
39
  out = Archive::Tar::Minitar::Output.new(gzip)
32
40
 
data/lib/bcl/version.rb CHANGED
@@ -18,5 +18,5 @@
18
18
  ######################################################################
19
19
 
20
20
  module BCL
21
- VERSION = "0.3.3"
21
+ VERSION = "0.3.4"
22
22
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bcl
3
3
  version: !ruby/object:Gem::Version
4
- hash: 21
4
+ hash: 27
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 3
9
- - 3
10
- version: 0.3.3
9
+ - 4
10
+ version: 0.3.4
11
11
  platform: ruby
12
12
  authors:
13
13
  - Daniel Macumber
@@ -18,7 +18,7 @@ autorequire:
18
18
  bindir: bin
19
19
  cert_chain: []
20
20
 
21
- date: 2013-10-01 00:00:00 Z
21
+ date: 2013-10-16 00:00:00 Z
22
22
  dependencies:
23
23
  - !ruby/object:Gem::Dependency
24
24
  name: uuid
@@ -127,17 +127,12 @@ extensions: []
127
127
  extra_rdoc_files: []
128
128
 
129
129
  files:
130
- - lib/bcl/andrew changed/ComponentXml.rb
131
- - lib/bcl/andrew changed/current_taxonomy.json
132
- - lib/bcl/andrew changed/current_taxonomy.xml
133
- - lib/bcl/andrew changed/MasterTaxonomy.rb
134
130
  - lib/bcl/bcl_xml.rb
135
131
  - lib/bcl/component_methods.rb
136
132
  - lib/bcl/component_spreadsheet.rb
137
133
  - lib/bcl/component_xml.rb
138
134
  - lib/bcl/current_taxonomy.json
139
135
  - lib/bcl/current_taxonomy.xml
140
- - lib/bcl/GatherComponents_oldAndrew.rb
141
136
  - lib/bcl/master_taxonomy.rb
142
137
  - lib/bcl/measure_xml.rb
143
138
  - lib/bcl/mongo_to_component.rb
@@ -1,94 +0,0 @@
1
- ######################################################################
2
- # Copyright (c) 2008-2013, Alliance for Sustainable Energy.
3
- # All rights reserved.
4
- #
5
- # This library is free software; you can redistribute it and/or
6
- # modify it under the terms of the GNU Lesser General Public
7
- # License as published by the Free Software Foundation; either
8
- # version 2.1 of the License, or (at your option) any later version.
9
- #
10
- # This library is distributed in the hope that it will be useful,
11
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
- # Lesser General Public License for more details.
14
- #
15
- # You should have received a copy of the GNU Lesser General Public
16
- # License along with this library; if not, write to the Free Software
17
- # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18
- ######################################################################
19
-
20
- require 'rubygems'
21
- require 'pathname'
22
- require 'fileutils'
23
- require 'enumerator'
24
-
25
- require 'bcl/TarBall'
26
-
27
- module BCL
28
- module_function
29
-
30
- def gather_components(component_dir)
31
- #store the starting directory
32
- current_dir = Dir.pwd
33
-
34
- #an array to hold reporting info about the batches
35
- gather_components_report = []
36
-
37
- #go to the directory containing the components
38
- Dir.chdir(component_dir)
39
-
40
- #delete old gather files first
41
- gather_dest_base = "components.tar.gz"
42
- #File.delete("./gather/" + gather_dest_base) if File.exists?("./0_Package/" + gather_dest_base)
43
-
44
- #copy all the components' tar.gz files into a single directory
45
- targzs = Pathname.glob("./**/*.tar.gz")
46
- targzs.each do |targz|
47
- destination = "./0_Package/#{File.basename(targz.to_s)}"
48
- #puts "copying #{targz.to_s} to #{destination}"
49
- Dir.mkdir("./0_Package") unless File.directory?("./0_Package") #named so it will be at top of directory list
50
- File.delete(destination) if File.exists?(destination)
51
- FileUtils.cp(targz.to_s, destination)
52
- end
53
-
54
- #go into that directory
55
- Dir.chdir("./0_Package")
56
-
57
- #get a list of all the tar.gz files in the new directory
58
- targzs = Pathname.glob("*.tar.gz")
59
-
60
- #report the total number of components in the directory
61
- gather_components_report << "Total components = #{targzs.length}"
62
-
63
- #define an iterator to keep track of the number of batches
64
- batch_num = 1
65
-
66
- #package all the tar.gzs in the directory into a few master tar.gz files of 1000 components or less
67
- targzs.each_slice(100) do |batch|
68
-
69
- gather_components_report << " batch #{batch_num} contains #{batch.length} components"
70
-
71
- #put all the paths in the batch into an array
72
- paths = []
73
- batch.each do |targz|
74
- paths << File.basename(targz.to_s)
75
- end
76
-
77
- #path where the batch tarball is going
78
- gather_dest = "0_Package_#{batch_num}_#{gather_dest_base}" #prefix to move to top of directory
79
-
80
- #tar up the batch
81
- tarball(gather_dest, paths)
82
-
83
- batch_num += 1
84
- end
85
-
86
- #report out
87
- puts gather_components_report
88
-
89
- #change back to the directory where we started
90
- Dir.chdir(current_dir)
91
-
92
- end
93
-
94
- end # module BCL
@@ -1,461 +0,0 @@
1
- ######################################################################
2
- # Copyright (c) 2008-2013, Alliance for Sustainable Energy.
3
- # All rights reserved.
4
- #
5
- # This library is free software; you can redistribute it and/or
6
- # modify it under the terms of the GNU Lesser General Public
7
- # License as published by the Free Software Foundation; either
8
- # version 2.1 of the License, or (at your option) any later version.
9
- #
10
- # This library is distributed in the hope that it will be useful,
11
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
- # Lesser General Public License for more details.
14
- #
15
- # You should have received a copy of the GNU Lesser General Public
16
- # License along with this library; if not, write to the Free Software
17
- # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18
- ######################################################################
19
-
20
- # Provides programmatic access to the component.xsd schema needed for
21
- # generating the component information that will be uploaded to
22
- # the Building Component Library.
23
-
24
- require 'rubygems'
25
-
26
- require 'pathname'
27
- require 'csv'
28
- require 'builder' #gem install builder (creates xml files)
29
- require 'uuid' # gem install uuid
30
- require 'fileutils'
31
-
32
- require 'bcl/TarBall'
33
-
34
- module BCL
35
-
36
- SCHEMA_LOCATION = "component.xsd"
37
-
38
- ProvStruct = Struct.new(:author, :datetime, :comment)
39
- TagsStruct = Struct.new(:descriptor)
40
- AttrStruct = Struct.new(:name, :value, :datatype, :units)
41
- FileStruct = Struct.new(:version_software_program, :version_id, :fqp_file, :filename, :filetype)
42
- #cost_type is an enumeration (not enforced) of installation, material, operations and maintenance,
43
- #variable operations and maintenance, salvage
44
- CostStruct = Struct.new(:cost_name, :cost_type, :category, :value, :interval,
45
- :interval_units, :year, :location, :units, :currency, :source,
46
- :reference_component_name, :reference_component_id)
47
- ObjectStruct = Struct.new(:obj_type, :obj_instance)
48
-
49
- class Component
50
- attr_accessor :name
51
- attr_accessor :uid
52
- attr_accessor :comp_version_id
53
- attr_accessor :description
54
- attr_accessor :comment
55
- attr_accessor :fidelity_level
56
- attr_accessor :source_manufacturer
57
- attr_accessor :source_model
58
- attr_accessor :source_serial_no
59
- attr_accessor :source_year
60
- attr_accessor :source_url
61
- attr_accessor :tags
62
- attr_accessor :provenance
63
- attr_accessor :attributes
64
- attr_accessor :files
65
- attr_accessor :costs
66
- attr_accessor :objects
67
-
68
- public
69
-
70
- #the save path is where the component will be saved
71
- def initialize(save_path)
72
- @name = "" #this is also a unique identifier to the component...
73
- @uid = UUID.new.generate
74
- @comp_version_id = UUID.new.generate
75
- @description = ""
76
- @comment = ""
77
- @fidelity_level = 0 #restricted to level_1 to level_5
78
- @source_manufacturer = ""
79
- @source_model = ""
80
- @source_serial_no = ""
81
- @source_year = ""
82
- @source_url = ""
83
-
84
- #these items have multiple instances
85
- @provenance = []
86
- @tags = []
87
- @attributes = []
88
- @files = []
89
- @costs = []
90
- @objects = [] #container for saving the idf/osm snippets
91
-
92
- @path = save_path
93
-
94
- #puts "[ComponentXml] " + @path
95
- #need to hit a webservice to validate which tags and attributes are
96
- #available (including units?)
97
-
98
- #todo: validate against master taxonomy
99
- end
100
-
101
- def open_component(filename)
102
- read_component_xml(filename)
103
- end
104
-
105
- # savefile, save the component xml along with
106
- # the files that have been added to the object
107
- def save_tar_gz(delete_files = true)
108
- current_d = Dir.pwd
109
- paths = []
110
-
111
- save_component_xml
112
-
113
- paths << "./component.xml"
114
-
115
- #copy over the files to the directory
116
- @files.each do |file|
117
- src_path = Pathname.new(file.fqp_file)
118
- dest_path = Pathname.new("#{resolve_path}/#{file.filename}")
119
- if File.exists?(src_path)
120
- if src_path == dest_path
121
- #do nothing, file is already where it needs to be
122
- else
123
- #move the file where it needs to go
124
- FileUtils.cp(src_path, dest_path)
125
- end
126
- else
127
- puts "#{src_path} -> File does not exist"
128
- end
129
- paths << "./#{file.filename}"
130
- end
131
-
132
- #take all the files and tar.gz them -- name the file the same as
133
- #the directory
134
-
135
- Dir.chdir("#{resolve_path}")
136
- destination = "#{@name.gsub(/\W/,'_').gsub(/___/,'_').gsub(/__/,'_').chomp('_').strip}.tar.gz"
137
-
138
- File.delete(destination) if File.exists?(destination)
139
-
140
- BCL.tarball(destination, paths)
141
-
142
- Dir.chdir(current_d)
143
-
144
- if (delete_files)
145
- @files.each do |file|
146
- if File.exists?(File.dirname(file.fqp_file))
147
- puts "[ComponentXml] Deleting: #{File.dirname(file.fqp_file)}"
148
- FileUtils.rm_rf(File.dirname(file.fqp_file))
149
- end
150
- end
151
- end
152
-
153
- #puts "[ComponentXml] " + Dir.pwd
154
- end
155
-
156
- def add_provenance(author, datetime, comment)
157
- prov = ProvStruct.new
158
- prov.author = author
159
- prov.datetime = datetime
160
- prov.comment = comment
161
-
162
- @provenance << prov
163
- end
164
-
165
- def add_tag(tag_name)
166
- tag = TagsStruct.new
167
- tag.descriptor = tag_name
168
-
169
- @tags << tag
170
- end
171
-
172
- def add_attribute(name, value, units, datatype = nil)
173
- attr = AttrStruct.new
174
- attr.name = name
175
- attr.value = value
176
-
177
- if !datatype.nil?
178
- attribute.datatype = datatype
179
- else
180
- isint = true if Integer(value) rescue false
181
- isfloat = true if Float(value) rescue false
182
-
183
- if value.is_a? Fixnum
184
- attr.datatype = "int"
185
- elsif value.is_a? Float
186
- attr.datatype = "float"
187
- elsif isfloat
188
- attr.datatype = "float"
189
- elsif isint
190
- attr.datatype = "int"
191
- else
192
- attr.datatype = "string"
193
- end
194
- end
195
- attr.units = units
196
-
197
- @attributes << attr
198
- end
199
-
200
- def add_file(version_sp, version_id, fqp_file, filename, filetype)
201
- fs = FileStruct.new
202
- fs.version_software_program = version_sp
203
- fs.version_id = version_id
204
- fs.fqp_file = fqp_file
205
- fs.filename = filename
206
- fs.filetype = filetype
207
-
208
- @files << fs
209
- end
210
-
211
-
212
- def add_cost(cost_name, cost_type, category, value, units, interval, interval_units, year, location, currency,
213
- source, reference_component_name, reference_component_id)
214
- cs = CostStruct.new
215
- cs.cost_name = cost_name
216
- cs.cost_type = cost_type
217
- cs.category = category
218
- cs.value = value
219
- cs.interval = interval
220
- cs.interval_units = interval_units
221
- cs.year = year
222
- cs.location = location
223
- cs.units = units
224
- cs.currency = currency
225
- cs.source = source
226
- cs.reference_component_name = reference_component_name
227
- cs.reference_component_id = reference_component_id
228
-
229
- @costs << cs
230
- end
231
-
232
- def add_object(object_type, object_instance)
233
- ob = ObjectStruct.new
234
- ob.obj_type = object_type
235
- ob.obj_instance = object_instance
236
-
237
- @objects << ob
238
- end
239
-
240
- def resolve_path
241
- FileUtils.mkdir_p(@path) unless File.directory?(@path)
242
- new_path = "#{@path}/#{name.gsub(/\W/,'_').gsub(/___/,'_').gsub(/__/,'_').chomp('_').strip}"
243
- FileUtils.mkdir_p(new_path) unless File.directory?(new_path)
244
- result = new_path
245
- end
246
-
247
- def osm_resolve_path
248
- FileUtils.mkdir_p(@path) unless File.directory?(@path)
249
- new_path = "#{@path}/osm_#{name.gsub(/\W/,'_').gsub(/___/,'_').gsub(/__/,'_').chomp('_').strip}"
250
- FileUtils.mkdir_p(new_path) unless File.directory?(new_path)
251
- result = new_path
252
- end
253
-
254
- def osc_resolve_path
255
- FileUtils.mkdir_p(@path) unless File.directory?(@path)
256
- new_path = "#{@path}/osc_#{name.gsub(/\W/,'_').gsub(/___/,'_').gsub(/__/,'_').chomp('_').strip}"
257
- FileUtils.mkdir_p(new_path) unless File.directory?(new_path)
258
- result = new_path
259
- end
260
-
261
- def resolve_component_path(component_type)
262
- FileUtils.mkdir_p(@path) unless File.directory?(@path)
263
- new_path = @path + '/OpenStudio'
264
- FileUtils.mkdir_p(new_path) unless File.directory?(new_path)
265
- new_path = new_path + "/#{component_type}"
266
- FileUtils.mkdir_p(new_path) unless File.directory?(new_path)
267
- return new_path
268
- end
269
-
270
- def tmp_resolve_path
271
- FileUtils.mkdir_p(@path) unless File.directory?(@path)
272
- new_path = "#{@path}/tmp_#{name.gsub(/\W/,'_').gsub(/___/,'_').gsub(/__/,'_').chomp('_').strip}"
273
- FileUtils.mkdir_p(new_path) unless File.directory?(new_path)
274
- result = new_path
275
- end
276
-
277
-
278
- def create_os_component(osobj)
279
- osobj.getCostLineItems.each do |os|
280
- @costs.each do |cost|
281
- #figure out costs for constructions
282
- os.setMaterialCost(cost.value.to_f) if cost.category == "material"
283
- if cost.category == "installation"
284
- os.setInstallationCost(cost.value.to_f)
285
- os.setExpectedLife(cost.interval.to_i)
286
- end
287
- os.setFixedOM(cost.value.to_f) if cost.category == "operations and maintenance"
288
- os.setVariableOM(cost.value.to_f) if cost.category == "variable operations and maintenance"
289
- os.setSalvageCost(cost.value.to_f) if cost.category == "salvage"
290
- end
291
- end
292
- newcomp = osobj.createComponent
293
-
294
- cd = newcomp.componentData
295
- cd.setDescription(@description)
296
- cd.setFidelityLevel(@fidelity_level)
297
-
298
- at = newcomp.componentData.componentDataAttributes
299
- @attributes.each do |attrib|
300
- if (attrib.value.to_s != "") and (attrib.name.to_s != "")
301
- if attrib.units != ""
302
- at.addAttribute(tc(attrib.name), attrib.value, attrib.units)
303
- else
304
- at.addAttribute(tc(attrib.name), attrib.value)
305
- end
306
- end
307
- end
308
-
309
- tg = newcomp.componentData.componentDataTags
310
- comp_tag = ""
311
- @tags.each do |tag|
312
- tg.addTag(tc(tag.descriptor))
313
- if (tag.descriptor != "energyplus") and (tag.descriptor != "construction")
314
- #create a map of component tags to directories
315
- comp_tag = tag.descriptor
316
- if comp_tag == "interior wall"
317
- comp_tag = "interiorwalls"
318
- elsif comp_tag == "exterior wall"
319
- comp_tag = "exteriorwalls"
320
- elsif comp_tag == "exterior slab"
321
- comp_tag = "exteriorslabs"
322
- elsif comp_tag == "exposed floor"
323
- comp_tag = "exposedfloors"
324
- elsif comp_tag == "attic floor"
325
- comp_tag = "atticfloors"
326
- elsif comp_tag == "roof"
327
- comp_tag = "roofs"
328
- elsif comp_tag == "door"
329
- comp_tag = "doors"
330
- elsif comp_tag == "skylight"
331
- comp_tag = "skylights"
332
- elsif comp_tag == "window"
333
- comp_tag = "windows"
334
- end
335
- puts comp_tag
336
- end
337
- end
338
-
339
- return newcomp
340
- end
341
-
342
- def save_component_xml(dir_path = resolve_path)
343
- xmlfile = File.new(dir_path + '/component.xml', 'w')
344
- comp_xml = Builder::XmlMarkup.new(:target => xmlfile, :indent=>2)
345
-
346
- #setup the xml file
347
- comp_xml.instruct! :xml, :version=>"1.0", :encoding=>"UTF-8"
348
- comp_xml.component("xmlns:xsi"=>"http://www.w3.org/2001/XMLSchema-instance",
349
- "xsi:noNamespaceSchemaLocation"=>"#{SCHEMA_LOCATION}") {
350
- comp_xml.name @name
351
- comp_xml.uid @uid
352
- comp_xml.version_id @comp_version_id
353
- comp_xml.description @description if @description != ""
354
- comp_xml.comment @comment if @comment != ""
355
- comp_xml.fidelity_level @fidelity_level
356
-
357
- comp_xml.provenances {
358
- @provenance.each do |prov|
359
- comp_xml.provenance {
360
- comp_xml.author prov.author
361
- comp_xml.datetime prov.datetime
362
- comp_xml.comment prov.comment
363
- }
364
- end
365
- }
366
-
367
- comp_xml.tags {
368
- @tags.each do |tag|
369
- comp_xml.tag tag.descriptor
370
- end
371
- }
372
-
373
- comp_xml.attributes {
374
- @attributes.each do |attrib|
375
- if (attrib.value.to_s != "") and (attrib.name.to_s != "") then
376
- comp_xml.attribute {
377
- comp_xml.name attrib.name
378
- comp_xml.value attrib.value
379
- comp_xml.datatype attrib.datatype
380
- comp_xml.units attrib.units if attrib.units != ""
381
- }
382
- end
383
- end
384
- }
385
-
386
- comp_xml.source {
387
- comp_xml.manufacturer @source_manufacturer if @source_manufacturer != ""
388
- comp_xml.model @source_model if @source_model != ""
389
- comp_xml.serial_no @source_serial_no if @source_serial_no != ""
390
- comp_xml.year @source_year if @source_year != ""
391
- comp_xml.url @source_url if @source_url != ""
392
- }
393
-
394
- if not @files.nil?
395
- comp_xml.files {
396
- @files.each do |file|
397
- comp_xml.file {
398
- comp_xml.version {
399
- comp_xml.software_program file.version_software_program
400
- comp_xml.identifier file.version_id
401
- }
402
-
403
- comp_xml.filename file.filename
404
- comp_xml.filetype file.filetype
405
- }
406
- end
407
- }
408
- end
409
-
410
- #check if we should write out costs, don't write if all values are 0 or nil
411
- #DLM: schema always expects costs
412
- write_costs = true
413
- #if not @costs.nil?
414
- # @costs.each do |cost|
415
- # if (cost.value.nil?) && (not cost.value == 0)
416
- # write_costs = true
417
- # break
418
- # end
419
- # end
420
- #end
421
-
422
- if write_costs
423
- comp_xml.costs {
424
- @costs.each do |cost|
425
- comp_xml.cost {
426
- comp_xml.instance_name cost.cost_name
427
- comp_xml.cost_type cost.cost_type
428
- comp_xml.category cost.category
429
- comp_xml.value cost.value
430
- comp_xml.units cost.units if cost.units != ""
431
- comp_xml.interval cost.interval if cost.interval != ""
432
- comp_xml.interval_units cost.interval_units if cost.interval_units != ""
433
- comp_xml.year cost.year if cost.year != ""
434
- comp_xml.currency cost.currency if cost.currency != ""
435
- comp_xml.source cost.source if cost.source != ""
436
- comp_xml.reference_component_name cost.reference_component_name if cost.reference_component_name != ""
437
- comp_xml.reference_component_id cost.reference_component_id if cost.reference_component_id != ""
438
- }
439
- end
440
- }
441
- end
442
-
443
- }
444
-
445
- xmlfile.close
446
- end
447
-
448
- private
449
-
450
- #return the title case of the string
451
- def tc(input)
452
- val = input.gsub(/\b\w/){$&.upcase}
453
- if val.downcase == "energyplus"
454
- val = "EnergyPlus"
455
- end
456
- return val
457
- end
458
-
459
- end
460
-
461
- end # module BCL