ruby-quilt 0.1.10 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2) hide show
  1. data/lib/quilt.rb +105 -70
  2. metadata +2 -2
data/lib/quilt.rb CHANGED
@@ -12,11 +12,14 @@ class Quilt
12
12
  OPTIONAL_KEY = "optional"
13
13
  FOOTER_KEY = "footer"
14
14
  PREFIX_KEY = "prefix"
15
+ DEPENDANCIES_KEY = "dependancies"
16
+ POSITION_KEY = "position"
15
17
  DEBUG_PREFIX_KEY = "debug_prefix"
16
18
  ARCHIVE_SUFFIX = ".tgz"
17
19
  DEFAULT_LRU_SIZE = 10
18
20
 
19
21
  def initialize(config = "quilt", log = Logger.new(STDOUT))
22
+ @@fetching_versions = {}
20
23
  config_prefix = config ? "#{config}:" : ""
21
24
  @config = {
22
25
  :local_path => Ecology.property("#{config_prefix}local_path", :as => String),
@@ -59,8 +62,9 @@ class Quilt
59
62
  matches[2]
60
63
  end
61
64
 
62
- def get_module(filename, dependancies, version_dir)
65
+ def get_module(filename, dependancies, position, version_dir)
63
66
  tmp_module = {}
67
+ tmp_module[:position] = position
64
68
  tmp_module[:dependancies] = dependancies.is_a?(Array) ? dependancies :
65
69
  (dependancies.is_a?(String) ? [ dependancies ] :
66
70
  [])
@@ -73,6 +77,14 @@ class Quilt
73
77
  tmp_module
74
78
  end
75
79
 
80
+ def version_exists_locally?(local_path, version_name)
81
+ begin
82
+ manifest = JSON.parse(File.read(File.join(File.join(local_path, version_name), "manifest.json")))
83
+ rescue Exception => e
84
+ return false
85
+ end
86
+ end
87
+
76
88
  def load_version(local_path, version_name)
77
89
  log_debug("Loading Version: "+version_name)
78
90
  manifest = {}
@@ -117,9 +129,13 @@ class Quilt
117
129
  # ],
118
130
  # "optional" : {
119
131
  # "<module file>" : [ "<dependancy module name>", ... ],
132
+ # "<module file>" : { "dependancies" : [ "<dependancy module name>", ... ], "position" : "<position>" }
120
133
  # ...
121
134
  # }
122
135
  # }
136
+ #
137
+ # where <position> can be one of: before_header, after_header, before_common, after_common,
138
+ # before_optional, optional, after_optional, before_footer, after_footer
123
139
  module_loader = Proc.new do |prefix|
124
140
  dir = new_version[prefix][:dir]
125
141
  if manifest[HEADER_KEY]
@@ -140,10 +156,18 @@ class Quilt
140
156
  end
141
157
  end
142
158
  if manifest[OPTIONAL_KEY] && manifest[OPTIONAL_KEY].is_a?(Hash)
143
- manifest[OPTIONAL_KEY].each do |filename, dependancies|
159
+ manifest[OPTIONAL_KEY].each do |filename, value|
160
+ dependancies = []
161
+ position = :optional
162
+ if (value.is_a?(Array))
163
+ dependancies = value
164
+ elsif (value.is_a?(Hash))
165
+ dependancies = value[DEPENDANCIES_KEY] || []
166
+ position = value[POSITION_KEY] ? value[POSITION_KEY].to_sym : :optional
167
+ end
144
168
  tmp_module_name = get_module_name(filename)
145
169
  if (tmp_module_name)
146
- tmp_module = get_module(filename, dependancies, dir)
170
+ tmp_module = get_module(filename, dependancies, position, dir)
147
171
  if (tmp_module)
148
172
  new_version[prefix][:optional][tmp_module_name] = tmp_module
149
173
  end
@@ -168,7 +192,7 @@ class Quilt
168
192
  new_version
169
193
  end
170
194
 
171
- def resolve_dependancies(modules, version, all_modules = {})
195
+ def resolve_dependancies(position, modules, version, all_modules = {})
172
196
  out = ''
173
197
  return out if !modules || !(modules.is_a?(Array)) || modules.empty?
174
198
  my_all_modules = all_modules
@@ -184,8 +208,8 @@ class Quilt
184
208
  break
185
209
  end
186
210
  my_all_modules[name] = 1
187
- out = "#{out}#{resolve_dependancies(version[:optional][name][:dependancies], version, my_all_modules)}"
188
- out = "#{out}#{version[:optional][name][:module]}"
211
+ out = "#{out}#{resolve_dependancies(position, version[:optional][name][:dependancies], version, my_all_modules)}"
212
+ out = "#{out}#{version[:optional][name][:module]}" if version[:optional][name][:position] == position
189
213
  my_all_modules[name] = 2
190
214
  end
191
215
  out
@@ -194,61 +218,70 @@ class Quilt
194
218
  def get_version(name)
195
219
  return @versions[name] if @versions[name]
196
220
  # check local path
197
- @versions[name] = load_version(@config[:local_path], name)
198
- return @versions[name] if @versions[name]
199
- # check remote path
200
- if (!@config[:remote_host] || !@config[:remote_path])
201
- log_error("unable to load from host: #{@config[:remote_host]}, path: #{@config[:remote_path]}")
202
- return nil
203
- end
204
- port = @config[:remote_port] ? @config[:remote_port].to_i : 80
205
- # Fetch the version
206
- filename = "#{name}#{ARCHIVE_SUFFIX}"
207
- version_dir = File.join(@config[:local_path], name)
208
- begin
209
- res = Net::HTTP.get_response(@config[:remote_host].to_s,
210
- File.join(@config[:remote_path].to_s, filename), port)
211
- if (res.code != "200")
212
- log_error("no version fetched : #{res.code}")
213
- return nil
221
+ # sleep at most 10 seconds to wait until a version is fetched and untared
222
+ @@fetching_versions[name] ||= Mutex.new
223
+ @@fetching_versions[name].synchronize do
224
+ if version_exists_locally?(@config[:local_path], name)
225
+ @versions[name] = load_version(@config[:local_path], name)
226
+ return @versions[name] if @versions[name]
214
227
  end
215
- FileUtils.mkdir(version_dir) unless File.exists?(version_dir)
216
- open(File.join(version_dir, filename), "wb") do |file|
217
- file.write(res.body)
228
+ # check remote path
229
+ if (!@config[:remote_host] || !@config[:remote_path])
230
+ log_error("unable to load from host: #{@config[:remote_host]}, path: #{@config[:remote_path]}")
231
+ return nil
218
232
  end
219
- rescue Exception => e
220
- log_error("could not fetch version", e)
221
- return nil
222
- end
223
- # Untar the version
224
- tar_stdout = nil
225
- tar_stderr = nil
226
- tar_status =
227
- POpen4::popen4("cd #{version_dir} && tar -xzf #{filename} && rm #{filename}") do |stdo, stde, stdi, pid|
228
- stdi.close
229
- tar_stdout = stdo.read.strip
230
- tar_stderr = stde.read.strip
231
- end
232
- if (!tar_status.exitstatus.zero?)
233
- log_error("unable to untar package: cd #{version_dir} && tar -xzf #{filename} && rm #{filename}")
234
- log_error("stdout: #{tar_stdout}")
235
- log_error("stderr: #{tar_stderr}")
233
+ port = @config[:remote_port] ? @config[:remote_port].to_i : 80
234
+ # Fetch the version
235
+ filename = "#{name}#{ARCHIVE_SUFFIX}"
236
+ version_dir = File.join(@config[:local_path], name)
236
237
  begin
237
- FileUtils.rm_r(version_dir)
238
+ res = Net::HTTP.get_response(@config[:remote_host].to_s,
239
+ File.join(@config[:remote_path].to_s, filename), port)
240
+ if (res.code != "200")
241
+ log_error("no version fetched : #{res.code}")
242
+ return nil
243
+ end
244
+ FileUtils.mkdir(version_dir) unless File.exists?(version_dir)
245
+ open(File.join(version_dir, filename), "wb") do |file|
246
+ file.write(res.body)
247
+ end
238
248
  rescue Exception => e
239
- # do nothing
249
+ log_error("could not fetch version", e)
250
+ return nil
240
251
  end
241
- return nil
242
- end
243
- # Load the version
244
- @versions[name] = load_version(@config[:local_path], name)
245
- if (!@versions[name])
246
- begin
247
- FileUtils.rm_r(version_dir)
248
- rescue Exception => e
249
- # do nothing
252
+ # Untar the version
253
+ tar_stdout = nil
254
+ tar_stderr = nil
255
+ tar_status =
256
+ POpen4::popen4("cd #{version_dir} && tar -xzf #{filename} && rm #{filename}") do |stdo, stde, stdi, pid|
257
+ stdi.close
258
+ tar_stdout = stdo.read.strip
259
+ tar_stderr = stde.read.strip
250
260
  end
251
- return nil
261
+ if (!tar_status.exitstatus.zero?)
262
+ log_error("unable to untar package: cd #{version_dir} && tar -xzf #{filename} && rm #{filename}")
263
+ log_error("stdout: #{tar_stdout}")
264
+ log_error("stderr: #{tar_stderr}")
265
+ begin
266
+ FileUtils.rm_r(version_dir)
267
+ rescue Exception => e
268
+ # do nothing
269
+ end
270
+ return nil
271
+ end
272
+ # Load the version
273
+ @versions[name] = load_version(@config[:local_path], name)
274
+ if (!@versions[name])
275
+ begin
276
+ FileUtils.rm_r(version_dir)
277
+ rescue Exception => e
278
+ # do nothing
279
+ end
280
+ return nil
281
+ end
282
+ end
283
+ @@fetching_versions.reject! do |key, value|
284
+ key == name
252
285
  end
253
286
  @versions[name]
254
287
  end
@@ -275,39 +308,40 @@ class Quilt
275
308
  # resolve dependancies
276
309
  dynamics = dynamic_modules && dynamic_modules.is_a?(Hash) ? dynamic_modules : {}
277
310
  output = "#{
278
- resolve_dynamic(:before_header, dynamics, outversion)
311
+ resolve_dynamic(:before_header, modules, dynamics, outversion)
279
312
  }#{
280
313
  outversion[:header]
281
314
  }#{
282
- resolve_dynamic(:after_header, dynamics, outversion)
315
+ resolve_dynamic(:after_header, modules, dynamics, outversion)
283
316
  }#{
284
- resolve_dynamic(:before_common, dynamics, outversion)
317
+ resolve_dynamic(:before_common, modules, dynamics, outversion)
285
318
  }#{
286
319
  outversion[:common]
287
320
  }#{
288
- resolve_dynamic(:after_common, dynamics, outversion)
321
+ resolve_dynamic(:after_common, modules, dynamics, outversion)
289
322
  }#{
290
- resolve_dynamic(:before_optional, dynamics, outversion)
323
+ resolve_dynamic(:before_optional, modules, dynamics, outversion)
291
324
  }#{
292
- resolve_dependancies(modules, outversion, {})
325
+ resolve_dynamic(:optional, modules, dynamics, outversion)
293
326
  }#{
294
- resolve_dynamic(:after_optional, dynamics, outversion)
327
+ resolve_dynamic(:after_optional, modules, dynamics, outversion)
295
328
  }#{
296
- resolve_dynamic(:before_footer, dynamics, outversion)
329
+ resolve_dynamic(:before_footer, modules, dynamics, outversion)
297
330
  }#{
298
331
  outversion[:footer]
299
332
  }#{
300
- resolve_dynamic(:after_footer, dynamics, outversion)
333
+ resolve_dynamic(:after_footer, modules, dynamics, outversion)
301
334
  }"
302
335
  end
303
336
 
304
- def resolve_dynamic(sym, dynamics, version)
305
- dynamics[sym].is_a?(Array) ? resolve_dependancies(dynamics[sym], version, {}) : (dynamics[sym] || '')
337
+ def resolve_dynamic(position, modules, dynamics, version)
338
+ dynamics[position].is_a?(Array) ? resolve_dependancies(position, dynamics[position] + modules, version, {}) :
339
+ "#{(dynamics[position] || '')}#{resolve_dependancies(position, modules, version, {})}"
306
340
  end
307
341
 
308
342
  def health
309
343
  # return true if no remote info
310
- return [true, nil] if !@config[:remote_host] || !@config[:remote_path]
344
+ return [true, nil, nil] if !@config[:remote_host] || !@config[:remote_path]
311
345
  # fetch health_check.txt from remote URL
312
346
  host = @config[:remote_host].to_s
313
347
  port = @config[:remote_port] ? @config[:remote_port].to_i : 80
@@ -315,12 +349,13 @@ class Quilt
315
349
  begin
316
350
  res = Net::HTTP.get_response(host, path, port)
317
351
  if (res.code != "200")
318
- return [false, "Could not fetch heath check file: http://#{host}:#{port}#{path} - status #{res.code}"]
352
+ return [false, "Could not fetch heath check file: http://#{host}:#{port}#{path} - status #{res.code}",
353
+ nil]
319
354
  end
320
355
  rescue Exception => e
321
- return [false, "Could not fetch heath check file: http://#{host}:#{port}#{path} - #{e.message}"]
356
+ return [false, "Could not fetch heath check file: http://#{host}:#{port}#{path} - #{e.message}", e]
322
357
  end
323
- [true, nil]
358
+ [true, nil, nil]
324
359
  end
325
360
 
326
361
  def status
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-quilt
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.10
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-06-25 00:00:00.000000000 Z
12
+ date: 2012-06-27 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: json