bcl 0.1.7 → 0.1.8

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.
@@ -0,0 +1,239 @@
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
+ require 'yaml'
25
+ require 'base64'
26
+
27
+ # required gems
28
+ require 'json/pure'
29
+ require 'bcl/tar_ball'
30
+ require 'rest-client'
31
+
32
+ module BCL
33
+
34
+ class ComponentMethods
35
+
36
+ attr_accessor :config
37
+ attr_accessor :session
38
+
39
+ def initialize()
40
+ @config = nil
41
+ @session = nil
42
+ config_path = File.expand_path('~') + '/.bcl'
43
+ config_name = 'config.yml'
44
+ if File.exists?(config_path + "/" + config_name)
45
+ puts "loading config settings from #{config_path + "/" + config_name}"
46
+ @config = YAML.load_file(config_path + "/" + config_name)
47
+ else
48
+ #location of template file
49
+ FileUtils.mkdir_p(config_path)
50
+ File.open(config_path + "/" + config_name, 'w') do |file|
51
+ file << default_yaml.to_yaml
52
+ end
53
+ raise "******** Please fill in user credentials in #{config_path}/#{config_name} file. DO NOT COMMIT THIS FILE. **********"
54
+ end
55
+
56
+ end
57
+
58
+ def default_yaml
59
+ settings = { :admin_user => { :username => "ENTER_BCL_USERNAME", :password => "ENTER_BCL_PASSWORD"} }
60
+
61
+ settings
62
+ end
63
+
64
+ def login(username=nil, password=nil)
65
+ if username.nil? || password.nil?
66
+ # log in via cached creditials
67
+ username = @config[:server][:admin_user][:username]
68
+ password = @config[:server][:admin_user][:password]
69
+ end
70
+
71
+ data = {"username" => username, "password" => password}
72
+ res = RestClient.post "http://#{@config[:server][:url]}/api/user/login", data.to_json, :content_type => :json, :accept => :json
73
+
74
+ if res.code == 200
75
+ #pull out the session key
76
+ res_j = JSON.parse(res.body)
77
+
78
+ sessid = res_j["sessid"]
79
+ session_name = res_j["session_name"]
80
+
81
+ @session = { session_name => sessid }
82
+ end
83
+
84
+ res
85
+ end
86
+
87
+
88
+ # pushes component to the bcl and sets to published (for now). Username and password and
89
+ # set in ~/.bcl/config.yml file which determines the permissions and the group to which
90
+ # the component will be uploaded
91
+ def push_component(filename_and_path, write_receipt_file)
92
+ raise "Please login before pushing components" if @session.nil?
93
+
94
+ valid = false
95
+ res_j = nil
96
+ filename = File.basename(filename_and_path)
97
+ filepath = File.dirname(filename_and_path) + "/"
98
+
99
+ # TODO: BCL will be moving over to single endpoint to manage the file upload and node creation (update eventually)
100
+ file = File.open(filename_and_path, 'r')
101
+ file_b64 = Base64.encode64(file.read)
102
+ @data = {"file" =>
103
+ {
104
+ "file" => "#{file_b64}",
105
+ "filesize" => "#{File.size(filename_and_path)}",
106
+ "filename" => filename
107
+ }
108
+ }
109
+
110
+ res = RestClient.post "http://#{@config[:server][:url]}/api/file", @data.to_json, :content_type => :json, :cookies => @session, :accept => :json
111
+
112
+ if res.code == 200
113
+ fid = JSON.parse(res.body)["fid"]
114
+
115
+ #post the node now with reference to this fid
116
+ @data = {"node" =>
117
+ {"type" => "nrel_component",
118
+ "status" => 1, #NOTE THIS ONLY WORKS IF YOU ARE ADMIN
119
+ "field_tar_file" =>
120
+ {"und" => [
121
+ {"fid" => fid}
122
+ ]
123
+ }
124
+ }
125
+ }
126
+
127
+ res = RestClient.post "http://#{@config[:server][:url]}/api/node", @data.to_json, :content_type => :json, :cookies => @session, :accept => :json
128
+
129
+ res_j = JSON.parse(res.body)
130
+
131
+ if res.code == 200
132
+ valid = true
133
+ elsif res.code == 500
134
+ raise "server exception"
135
+ valid = false
136
+ else
137
+ valid = false
138
+ end
139
+ else
140
+ res = nil
141
+ end
142
+
143
+ if valid
144
+ #write out a receipt file into the same directory of the component with the same file name as
145
+ #the component
146
+ if write_receipt_file
147
+ File.open(filepath + File.basename(filename, '.tar.gz') + ".receipt", 'w') do |file|
148
+ file << Time.now.to_s
149
+ end
150
+ end
151
+ end
152
+
153
+ [valid, res_j]
154
+ end
155
+
156
+ def push_components(array_of_components, skip_files_with_receipts)
157
+ logs = []
158
+ array_of_components.each do |comp|
159
+ receipt_file = File.dirname(comp) + "/" + File.basename(comp, '.tar.gz') + ".receipt"
160
+ log_message = ""
161
+ if skip_files_with_receipts && File.exists?(receipt_file)
162
+ log_message = "skipping component because found receipt for #{comp}"
163
+ else
164
+ log_message = "pushing component #{comp}: "
165
+ puts log_message
166
+ valid, res = push_component(comp, true)
167
+ log_message += " #{valid} #{res.inspect.chomp}"
168
+ end
169
+ puts log_message
170
+ logs << log_message
171
+ end
172
+
173
+ logs
174
+ end
175
+
176
+ end
177
+
178
+ # TODO make this extend the component_xml class (or create a super class around components)
179
+
180
+ module_function
181
+
182
+ def gather_components(component_dir, chunk_size = 0, delete_previous_gather = false)
183
+ @dest_filename = "components"
184
+ @dest_file_ext = "tar.gz"
185
+
186
+ #store the starting directory
187
+ current_dir = Dir.pwd
188
+
189
+ #an array to hold reporting info about the batches
190
+ gather_components_report = []
191
+
192
+ #go to the directory containing the components
193
+ Dir.chdir(component_dir)
194
+
195
+ # delete any old versions of the component chunks
196
+ FileUtils.rm_rf("./_gather") if delete_previous_gather
197
+
198
+ #gather all the components into array
199
+ targzs = Pathname.glob("./**/*.tar.gz")
200
+ tar_cnt = 0
201
+ chunk_cnt = 0
202
+ targzs.each do |targz|
203
+ if chunk_size != 0 && (tar_cnt % chunk_size) == 0
204
+ chunk_cnt += 1
205
+ end
206
+ tar_cnt += 1
207
+
208
+ destination_path = "./_gather/#{chunk_cnt}"
209
+ FileUtils.mkdir_p(destination_path)
210
+ destination_file = "#{destination_path}/#{File.basename(targz.to_s)}"
211
+ puts "copying #{targz.to_s} to #{destination_file}"
212
+ FileUtils.cp(targz.to_s, destination_file)
213
+ end
214
+
215
+ #gather all the zip files into a single tar.gz
216
+ (1..chunk_cnt).each do |cnt|
217
+ currentdir = Dir.pwd
218
+
219
+ paths = []
220
+ Pathname.glob("./_gather/#{cnt}/*.tar.gz").each do |pt|
221
+ paths << File.basename(pt.to_s)
222
+ end
223
+
224
+ Dir.chdir("./_gather/#{cnt}")
225
+ destination = "#{@dest_filename}_#{cnt}.#{@dest_file_ext}"
226
+ BCL.tarball(destination, paths)
227
+ Dir.chdir(currentdir)
228
+
229
+ #move the tarball back a directory
230
+ FileUtils.move("./_gather/#{cnt}/#{destination}", "./_gather/#{destination}")
231
+ end
232
+
233
+ Dir.chdir(current_dir)
234
+
235
+ end
236
+
237
+
238
+
239
+ end # module BCL
@@ -21,14 +21,14 @@
21
21
  # Format of the Excel spreadsheet is documented in /doc/ComponentSpreadsheet.docx
22
22
 
23
23
  require 'rubygems'
24
-
25
24
  require 'pathname'
26
25
  require 'fileutils'
27
- require 'uuid' # gem install uuid
28
26
 
29
- require 'bcl/ComponentXml'
30
- require 'bcl/GatherComponents'
31
- require 'bcl/MasterTaxonomy'
27
+ # required gems
28
+ require 'uuid' # gem install uuid
29
+ require 'bcl/component_xml'
30
+ require 'bcl/component_methods'
31
+ require 'bcl/master_taxonomy'
32
32
 
33
33
  if RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/
34
34
  begin