rbbt-util 5.28.8 → 5.28.14

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/lib/rbbt/entity.rb +1 -1
  3. data/lib/rbbt/fix_width_table.rb +5 -4
  4. data/lib/rbbt/hpc.rb +6 -4
  5. data/lib/rbbt/persist.rb +9 -4
  6. data/lib/rbbt/persist/tsv/adapter.rb +0 -1
  7. data/lib/rbbt/persist/tsv/fix_width_table.rb +5 -3
  8. data/lib/rbbt/resource.rb +12 -6
  9. data/lib/rbbt/resource/path.rb +1 -1
  10. data/lib/rbbt/tsv/attach.rb +7 -4
  11. data/lib/rbbt/tsv/dumper.rb +6 -2
  12. data/lib/rbbt/tsv/parallel.rb +0 -3
  13. data/lib/rbbt/util/R.rb +2 -2
  14. data/lib/rbbt/util/cmd.rb +10 -0
  15. data/lib/rbbt/util/misc/bgzf.rb +1 -1
  16. data/lib/rbbt/util/misc/indiferent_hash.rb +8 -0
  17. data/lib/rbbt/util/misc/inspect.rb +11 -7
  18. data/lib/rbbt/util/named_array.rb +1 -1
  19. data/lib/rbbt/util/open.rb +17 -16
  20. data/lib/rbbt/workflow/accessor.rb +1 -1
  21. data/lib/rbbt/workflow/definition.rb +3 -1
  22. data/lib/rbbt/workflow/integration/ansible.rb +53 -0
  23. data/lib/rbbt/workflow/integration/ansible/workflow.rb +60 -0
  24. data/lib/rbbt/workflow/step.rb +8 -0
  25. data/lib/rbbt/workflow/step/accessor.rb +23 -13
  26. data/lib/rbbt/workflow/step/dependencies.rb +8 -2
  27. data/lib/rbbt/workflow/step/run.rb +22 -19
  28. data/lib/rbbt/workflow/util/archive.rb +2 -0
  29. data/lib/rbbt/workflow/util/orchestrator.rb +49 -11
  30. data/lib/rbbt/workflow/util/provenance.rb +7 -3
  31. data/share/rbbt_commands/ansible +55 -0
  32. data/share/rbbt_commands/purge_job +0 -1
  33. data/share/rbbt_commands/system/status +22 -22
  34. data/share/rbbt_commands/workflow/forget_deps +9 -0
  35. data/share/rbbt_commands/workflow/info +12 -9
  36. data/share/rbbt_commands/workflow/prov +2 -1
  37. data/test/rbbt/association/test_index.rb +6 -6
  38. data/test/rbbt/knowledge_base/test_query.rb +3 -3
  39. data/test/rbbt/knowledge_base/test_registry.rb +1 -1
  40. data/test/rbbt/persist/tsv/test_cdb.rb +0 -7
  41. data/test/rbbt/persist/tsv/test_kyotocabinet.rb +2 -8
  42. data/test/rbbt/persist/tsv/test_leveldb.rb +0 -6
  43. data/test/rbbt/persist/tsv/test_lmdb.rb +0 -6
  44. data/test/rbbt/persist/tsv/test_tokyocabinet.rb +15 -14
  45. data/test/rbbt/test_entity.rb +0 -1
  46. data/test/rbbt/test_knowledge_base.rb +3 -4
  47. data/test/rbbt/test_persist.rb +10 -6
  48. data/test/rbbt/test_workflow.rb +49 -16
  49. data/test/rbbt/tsv/test_accessor.rb +11 -0
  50. data/test/rbbt/tsv/test_attach.rb +86 -8
  51. data/test/rbbt/tsv/test_index.rb +6 -7
  52. data/test/rbbt/tsv/test_manipulate.rb +2 -3
  53. data/test/rbbt/util/R/test_model.rb +2 -1
  54. data/test/rbbt/util/R/test_plot.rb +0 -2
  55. data/test/rbbt/util/concurrency/test_processes.rb +1 -1
  56. data/test/rbbt/util/misc/test_bgzf.rb +11 -7
  57. data/test/rbbt/util/misc/test_lock.rb +0 -1
  58. data/test/rbbt/util/misc/test_multipart_payload.rb +1 -1
  59. data/test/rbbt/util/misc/test_pipes.rb +0 -5
  60. data/test/rbbt/util/test_R.rb +1 -0
  61. data/test/rbbt/util/test_log.rb +4 -6
  62. data/test/rbbt/util/test_misc.rb +0 -2
  63. data/test/rbbt/util/test_open.rb +0 -1
  64. data/test/rbbt/util/test_python.rb +17 -1
  65. data/test/rbbt/workflow/test_remote_workflow.rb +1 -1
  66. data/test/rbbt/workflow/test_step.rb +8 -3
  67. data/test/rbbt/workflow/util/test_orchestrator.rb +155 -18
  68. metadata +5 -4
  69. data/test/rbbt/workflow/remote/test_client.rb +0 -56
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4d77757da0912cd41138ff33b99e19b7ffa1449be515fb7a8742f9d69c134ffd
4
- data.tar.gz: 1edb139f92881591bbac18692dc6a0a739be9dfe0a820a4db2cffd30079fc328
3
+ metadata.gz: 74253d97dc17c890ce9022e38ccd514847e785b69f4cfd74a8a5333a9aa1c97d
4
+ data.tar.gz: d908fecdec1c5e6ccce81b3190883011d775f38cab689c136e7c90808c3c93ac
5
5
  SHA512:
6
- metadata.gz: 2219bd7152eda55f2c3c9b1e5d10d9593dd29232e7e77fe0707496031030455663983256930f35c2bcabd8b80e15c05d99f3bcdc9644135ee4a75d0267334c33
7
- data.tar.gz: e4021aab6574fc10e960eec29f630075c8e95b27d6648ba47e1f76ecbf1a12b84a5859ad7b61ffde8591466ddcfec8ee5cfd27f6f82997648d712225ac099e1b
6
+ metadata.gz: 7c6b8f81e5f814a35ed3b738ad85d4e7314b9fb24b36ecdb3828d1d4644cc8b9ce4117c862ae7baa0bd7f60362e93be2aff282a2d24c474e327d1d5948f56fff
7
+ data.tar.gz: 3a6235b141f139f245935b8858b175b2d54302b89dc3ac10101ffddfd10d1161760aaf0f176114a4fc6d8f0b8aa17556b8637e2f2ab815dcf875ea98c4825921
@@ -38,7 +38,7 @@ module Entity
38
38
  if value.to_s == k.to_s
39
39
  found = k
40
40
  break
41
- elsif value =~ /\(#{Regexp.quote k}\)/
41
+ elsif value.to_s =~ /\(#{Regexp.quote k}\)/
42
42
  found = k
43
43
  break
44
44
  end
@@ -67,7 +67,7 @@ class FixWidthTable
67
67
 
68
68
  def format(pos, value)
69
69
  padding = value_size - value.length
70
- if range
70
+ if @range
71
71
  (pos + [padding, value + ("\0" * padding)]).pack("llll#{mask}")
72
72
  else
73
73
  [pos, padding, value + ("\0" * padding)].pack("ll#{mask}")
@@ -105,7 +105,7 @@ class FixWidthTable
105
105
 
106
106
  def idx_value(index)
107
107
  return nil if index < 0 or index >= size
108
- @file.seek((range ? 17 : 9 ) + (record_size) * index, IO::SEEK_SET)
108
+ @file.seek((@range ? 17 : 9 ) + (record_size) * index, IO::SEEK_SET)
109
109
  padding = @file.read(4).unpack("l").first+1
110
110
  txt = @file.read(value_size)
111
111
  str = txt.unpack(mask).first
@@ -277,7 +277,8 @@ class FixWidthTable
277
277
 
278
278
  def [](pos)
279
279
  return [] if size == 0
280
- if range
280
+ self.read
281
+ if @range
281
282
  get_range(pos)
282
283
  else
283
284
  get_point(pos)
@@ -286,7 +287,7 @@ class FixWidthTable
286
287
 
287
288
  def overlaps(pos, value = false)
288
289
  return [] if size == 0
289
- idxs = if range
290
+ idxs = if @range
290
291
  get_range(pos, true)
291
292
  else
292
293
  get_point(pos, true)
@@ -98,6 +98,8 @@ module Marenostrum
98
98
  #SBATCH --nodes="#{nodes}"
99
99
  EOF
100
100
 
101
+ prep = ""
102
+
101
103
  if highmem
102
104
  header +=<<-EOF
103
105
  #SBATCH --constraint=highmem
@@ -122,7 +124,7 @@ module Marenostrum
122
124
  module load java
123
125
 
124
126
  # Calculate max available memory
125
- let "MAX_MEMORY=$SLURM_MEM_PER_CPU * $SLURM_CPUS_ON_NODE"
127
+ let "MAX_MEMORY=$SLURM_MEM_PER_CPU * $SLURM_CPUS_PER_TASK"
126
128
  EOF
127
129
 
128
130
 
@@ -146,8 +148,6 @@ SINGULARITY_RUBY_INLINE="$HOME/.singularity_ruby_inline"
146
148
  mkdir -p "$SINGULARITY_RUBY_INLINE"
147
149
  EOF
148
150
 
149
- prep = ""
150
-
151
151
  if contain
152
152
  scratch_group_dir = File.join('/gpfs/scratch/', group)
153
153
  projects_group_dir = File.join('/gpfs/projects/', group)
@@ -172,7 +172,7 @@ cp ~/.rbbt/etc/environment $CONTAINER_DIR/.rbbt/etc/
172
172
  # Set search_paths
173
173
  echo "singularity: /singularity_opt/{PKGDIR}/{TOPLEVEL}/{SUBPATH}" > $CONTAINER_DIR/.rbbt/etc/search_paths
174
174
  echo "rbbt_user: /home/rbbt/.rbbt/{TOPLEVEL}/{SUBPATH}" >> $CONTAINER_DIR/.rbbt/etc/search_paths
175
- echo "home: $CONTAINER_DIR/home/{TOPLEVEL}/{SUBPATH}" >> $CONTAINER_DIR/.rbbt/etc/search_paths
175
+ echo "outside_home: $CONTAINER_DIR/home/{TOPLEVEL}/{SUBPATH}" >> $CONTAINER_DIR/.rbbt/etc/search_paths
176
176
  echo "group_projects: #{projects_group_dir}/{PKGDIR}/{TOPLEVEL}/{SUBPATH}" >> $CONTAINER_DIR/.rbbt/etc/search_paths
177
177
  echo "group_scratch: #{scratch_group_dir}/{PKGDIR}/{TOPLEVEL}/{SUBPATH}" >> $CONTAINER_DIR/.rbbt/etc/search_paths
178
178
  echo "user_projects: #{projects_group_dir}/#{user}/{PKGDIR}/{TOPLEVEL}/{SUBPATH}" >> $CONTAINER_DIR/.rbbt/etc/search_paths
@@ -214,6 +214,8 @@ singularity exec -e -C -H "$CONTAINER_DIR" "$SINGULARITY_IMG" rm -Rfv .rbbt/var/
214
214
  singularity exec -e -C -H "$CONTAINER_DIR" "$SINGULARITY_IMG" rbbt system clean -f &>> #{fsync}
215
215
  singularity exec -e -C -H "$CONTAINER_DIR" "$SINGULARITY_IMG" rm -Rfv tmp/ &>> #{fsync}
216
216
  EOF
217
+ else
218
+ prep = ""
217
219
  end
218
220
  end
219
221
  end
@@ -25,13 +25,18 @@ module Persist
25
25
  MEMORY = {} unless defined? MEMORY
26
26
  MAX_FILE_LENGTH = 150
27
27
 
28
- # Return non-false if the first file is newer than the second file
29
- def self.newer?(path, file)
28
+ # Is 'file' newer than 'path'? return non-true if path is newer than file
29
+ def self.newer?(path, file, by_link = false)
30
30
  return true if not Open.exists?(file)
31
31
  path = path.find if Path === path
32
32
  file = file.find if Path === file
33
- patht = Open.mtime(path)
34
- filet = Open.mtime(file)
33
+ if by_link
34
+ patht = File.exists?(path) ? File.lstat(path).mtime : nil
35
+ filet = File.exists?(file) ? File.lstat(file).mtime : nil
36
+ else
37
+ patht = Open.mtime(path)
38
+ filet = Open.mtime(file)
39
+ end
35
40
  return true if patht.nil? || filet.nil?
36
41
  diff = patht - filet
37
42
  return diff if diff < 0
@@ -52,7 +52,6 @@ module Persist
52
52
  def lock
53
53
  return yield if @locked
54
54
  lock_filename = Persist.persistence_path(persistence_path, {:dir => TSV.lock_dir})
55
- Log.stack caller if $LOG
56
55
  Misc.lock(lock_filename) do
57
56
  begin
58
57
  @locked = true
@@ -52,7 +52,7 @@ module Persist
52
52
  if TSV::ENTRY_KEYS.include? key
53
53
  set_metadata(key, value)
54
54
  else
55
- if range
55
+ if @range
56
56
  add_range_point key, value
57
57
  else
58
58
  add key, value
@@ -61,7 +61,7 @@ module Persist
61
61
  end
62
62
 
63
63
  def add(key, value)
64
- key = pos_function.call(key) if pos_function and not (range and Array === key)
64
+ key = pos_function.call(key) if pos_function and not (@range and Array === key)
65
65
  super(key, value)
66
66
  end
67
67
 
@@ -85,8 +85,10 @@ module Persist
85
85
  end
86
86
 
87
87
  def each
88
+ read
88
89
  @size.times do |i|
89
- yield i, value(i)
90
+ v = idx_value(i)
91
+ yield i, v
90
92
  end
91
93
  end
92
94
 
@@ -112,13 +112,19 @@ module Resource
112
112
  end
113
113
  when Net::HTTPRedirection, Net::HTTPFound
114
114
  location = response['location']
115
- Log.debug("Feching directory from: #{location}. Into: #{final_path}")
116
- FileUtils.mkdir_p final_path unless File.exist? final_path
117
- TmpFile.with_file do |tmp_dir|
118
- Misc.in_dir tmp_dir do
119
- CMD.cmd('tar xvfz -', :in => Open.open(location, :nocache => true))
115
+ if location.include? 'get_directory'
116
+ Log.debug("Feching directory from: #{location}. Into: #{final_path}")
117
+ FileUtils.mkdir_p final_path unless File.exist? final_path
118
+ TmpFile.with_file do |tmp_dir|
119
+ Misc.in_dir tmp_dir do
120
+ CMD.cmd('tar xvfz -', :in => Open.open(location, :nocache => true))
121
+ end
122
+ FileUtils.mv tmp_dir, final_path
123
+ end
124
+ else
125
+ Open.open(location, :nocache => true) do |s|
126
+ Misc.sensiblewrite(final_path, s)
120
127
  end
121
- FileUtils.mv tmp_dir, final_path
122
128
  end
123
129
  when Net::HTTPInternalServerError
124
130
  @server_missing_resource_cache << url
@@ -297,7 +297,7 @@ module Path
297
297
 
298
298
  raise "No resource defined to produce file: #{ self }" if resource.nil?
299
299
 
300
- resource.produce self, force
300
+ resource.produce self, force if Resource === resource
301
301
 
302
302
  self
303
303
  end
@@ -243,6 +243,7 @@ module TSV
243
243
  Log.debug("Attachment of fields:#{Misc.fingerprint fields } from #{other.filename.inspect} finished.")
244
244
 
245
245
  if complete
246
+ Log.warn "Attaching through index and completing empty rows; keys with wrong format may appear (#{other.key_field} insted of #{self.key_field})" if index
246
247
  fill = TrueClass === complete ? nil : complete
247
248
  field_length = self.fields.length
248
249
  common_fields = (other.fields & self.fields)
@@ -255,11 +256,11 @@ module TSV
255
256
  case type
256
257
  when :single
257
258
  missing.each do |k|
258
- self[k] = nil
259
+ self[k] = fill
259
260
  end
260
261
  when :list
261
262
  missing.each do |k|
262
- values = [nil] * field_length
263
+ values = [fill] * field_length
263
264
  other_values = other[k]
264
265
  other_common_pos.zip(this_common_pos).each do |o,t|
265
266
  values[t] = other_values[o]
@@ -267,8 +268,9 @@ module TSV
267
268
  self[k] = values
268
269
  end
269
270
  when :double
271
+ fill = [] if fill.nil?
270
272
  missing.each do |k|
271
- values = [[]] * field_length
273
+ values = [fill] * field_length
272
274
  other_values = other[k]
273
275
  other_common_pos.zip(this_common_pos).each do |o,t|
274
276
  values[t] = other_values[o]
@@ -276,8 +278,9 @@ module TSV
276
278
  self[k] = values
277
279
  end
278
280
  when :flat
281
+ fill = [] if fill.nil?
279
282
  missing.each do |k|
280
- self[k] = []
283
+ self[k] = fill
281
284
  end
282
285
  end
283
286
  end
@@ -32,13 +32,17 @@ module TSV
32
32
  sep + ([""] * fields.length) * sep << "\n"
33
33
  end
34
34
  when Array
35
- if fields.nil? or fields.empty?
35
+ if fields.nil?
36
+ sep + (values.collect{|v| Array === v ? v * "|" : v} * sep) << "\n"
37
+ elsif fields.empty?
36
38
  "\n"
37
39
  else
38
40
  sep + (values.collect{|v| Array === v ? v * "|" : v} * sep) << "\n"
39
41
  end
40
42
  else
41
- if fields.nil? or fields.empty?
43
+ if fields.nil?
44
+ sep + values.to_s + "\n"
45
+ elsif fields.empty?
42
46
  "\n"
43
47
  else
44
48
  sep + values.to_s << "\n"
@@ -2,6 +2,3 @@ require 'rbbt/util/concurrency'
2
2
 
3
3
  require 'rbbt/tsv/parallel/through'
4
4
  require 'rbbt/tsv/parallel/traverse'
5
-
6
- module TSV
7
- end
@@ -41,7 +41,7 @@ source('#{UTIL}');
41
41
 
42
42
  if monitor
43
43
  #io = CMD.cmd('R --no-save --quiet', options.merge(:in => cmd, :pipe => true, :log => true))
44
- io = CMD.cmd('R --no-save --quiet', options.merge(:in => cmd, :pipe => true, :log => true))
44
+ io = CMD.cmd('R --no-save --quiet', options.merge(:in => cmd, :pipe => true, :log => true, :xvfb => true))
45
45
  while line = io.gets
46
46
  case monitor
47
47
  when Proc
@@ -52,7 +52,7 @@ source('#{UTIL}');
52
52
  end
53
53
  nil
54
54
  else
55
- CMD.cmd('R --no-save --slave --quiet', options.merge(:in => cmd))
55
+ CMD.cmd('R --no-save --slave --quiet', options.merge(:in => cmd, :xvfb => true))
56
56
  end
57
57
  end
58
58
 
@@ -98,7 +98,9 @@ module CMD
98
98
  post = options.delete(:post)
99
99
  log = options.delete(:log)
100
100
  no_fail = options.delete(:no_fail)
101
+ no_fail = options.delete(:nofail) if no_fail.nil?
101
102
  no_wait = options.delete(:no_wait)
103
+ xvfb = options.delete(:xvfb)
102
104
 
103
105
  dont_close_in = options.delete(:dont_close_in)
104
106
 
@@ -116,6 +118,14 @@ module CMD
116
118
 
117
119
  end
118
120
 
121
+ case xvfb
122
+ when TrueClass
123
+ cmd = "xvfb-run --server-args='-screen 0 1024x768x24' --auto-servernum #{cmd}"
124
+ when String
125
+ cmd = "xvfb-run --server-args='#{xvfb}' --auto-servernum --server-num=1 #{cmd}"
126
+ when String
127
+ end
128
+
119
129
  if stderr == true
120
130
  stderr = Log::HIGH
121
131
  end
@@ -7,7 +7,7 @@ module Bgzf
7
7
 
8
8
  def self.bgzip_cmd
9
9
  @@bgzip_cmd ||= begin
10
- path = `bash -c "type -p bgzips"`.strip
10
+ path = `bash -c "type -p bgzip"`.strip
11
11
  if path.empty?
12
12
  Rbbt.claim Rbbt.software.opt.htslib, :install, Rbbt.share.install.software.HTSLIB.find(:lib)
13
13
  Rbbt.software.opt.htslib.produce
@@ -61,6 +61,14 @@ module IndiferentHash
61
61
  super(key)
62
62
  end
63
63
  end
64
+
65
+ def clean_version
66
+ clean = {}
67
+ each do |k,v|
68
+ clean[k.to_s] = v unless clean.include? k.to_s
69
+ end
70
+ clean
71
+ end
64
72
  end
65
73
 
66
74
  module CaseInsensitiveHash
@@ -287,15 +287,19 @@ module Misc
287
287
  when Symbol
288
288
  obj.to_s
289
289
  when (defined?(Path) and Path)
290
- if obj.exists?
291
- if obj.directory?
292
- files = obj.glob("**/*")
293
- "directory: #{Misc.fingerprint(files)}"
290
+ if Step === obj.resource
291
+ "Step file: " + obj
292
+ else
293
+ if obj.exists?
294
+ if obj.directory?
295
+ files = obj.glob("**/*")
296
+ "directory: #{Misc.fingerprint(files)}"
297
+ else
298
+ "file: " << Open.realpath(obj) << "--" << mtime_str(obj)
299
+ end
294
300
  else
295
- "file: " << Open.realpath(obj) << "--" << mtime_str(obj)
301
+ obj + " (file missing)"
296
302
  end
297
- else
298
- obj + " (file missing)"
299
303
  end
300
304
  when String
301
305
  if Misc.is_filename?(obj) and ! %w(. ..).include?(obj)
@@ -117,7 +117,7 @@ module NamedArray
117
117
  #end
118
118
 
119
119
  def each(&block)
120
- if defined?(Entity) and not @fields.nil? and not @fields.empty?
120
+ if defined?(Entity) && ! (@fields.nil? || @fields.empty?)
121
121
  i = 0
122
122
  super do |elem|
123
123
  field = @fields[i]
@@ -16,9 +16,9 @@ module Open
16
16
  GREP_CMD = begin
17
17
  if ENV["GREP_CMD"]
18
18
  ENV["GREP_CMD"]
19
- elsif File.exists?('/bin/grep')
19
+ elsif File.exist?('/bin/grep')
20
20
  "/bin/grep"
21
- elsif File.exists?('/usr/bin/grep')
21
+ elsif File.exist?('/usr/bin/grep')
22
22
  "/usr/bin/grep"
23
23
  else
24
24
  "grep"
@@ -262,7 +262,7 @@ module Open
262
262
  if (dir_sub_path = find_repo_dir(file))
263
263
  remove_from_repo(*dir_sub_path)
264
264
  else
265
- FileUtils.rm(file) if File.exists?(file) or Open.broken_link?(file)
265
+ FileUtils.rm(file) if File.exist?(file) or Open.broken_link?(file)
266
266
  end
267
267
  end
268
268
 
@@ -333,7 +333,7 @@ module Open
333
333
  nil
334
334
  else
335
335
  target = target.find if Path === target
336
- if ! File.exists?(target)
336
+ if ! File.exist?(target)
337
337
  FileUtils.mkdir_p target
338
338
  end
339
339
  end
@@ -344,8 +344,8 @@ module Open
344
344
  target = target.find if Path === target
345
345
 
346
346
  target = File.join(target, File.basename(source)) if File.directory? target
347
- FileUtils.mkdir_p File.dirname(target) unless File.exists?(File.dirname(target))
348
- FileUtils.rm target if File.exists?(target)
347
+ FileUtils.mkdir_p File.dirname(target) unless File.exist?(File.dirname(target))
348
+ FileUtils.rm target if File.exist?(target)
349
349
  FileUtils.ln_s source, target
350
350
  end
351
351
 
@@ -353,8 +353,8 @@ module Open
353
353
  source = source.find if Path === source
354
354
  target = target.find if Path === target
355
355
 
356
- FileUtils.mkdir_p File.dirname(target) unless File.exists?(File.dirname(target))
357
- FileUtils.rm target if File.exists?(target)
356
+ FileUtils.mkdir_p File.dirname(target) unless File.exist?(File.dirname(target))
357
+ FileUtils.rm target if File.exist?(target)
358
358
  FileUtils.ln source, target
359
359
  end
360
360
 
@@ -362,8 +362,8 @@ module Open
362
362
  source = source.find if Path === source
363
363
  target = target.find if Path === target
364
364
 
365
- FileUtils.mkdir_p File.dirname(target) unless File.exists?(File.dirname(target))
366
- FileUtils.rm target if File.exists?(target)
365
+ FileUtils.mkdir_p File.dirname(target) unless File.exist?(File.dirname(target))
366
+ FileUtils.rm target if File.exist?(target)
367
367
  begin
368
368
  CMD.cmd("ln -L '#{ source }' '#{ target }'")
369
369
  rescue ProcessFailed
@@ -475,6 +475,7 @@ module Open
475
475
  File.exist?(file) #|| File.symlink?(file)
476
476
  end
477
477
  end
478
+
478
479
  class << self
479
480
  alias exist? exists?
480
481
  end
@@ -747,7 +748,7 @@ module Open
747
748
  if (dir_sub_path = find_repo_dir(path))
748
749
  writable_repo?(*dir_sub_path)
749
750
  else
750
- if File.exists?(path)
751
+ if File.exist?(path)
751
752
  File.writable?(path)
752
753
  else
753
754
  File.writable?(File.dirname(File.expand_path(path)))
@@ -776,14 +777,14 @@ module Open
776
777
  file = file.find if Path === file
777
778
  begin
778
779
  if File.symlink?(file) || File.stat(file).nlink > 1
779
- if File.exists?(file + '.info') && defined?(Step)
780
+ if File.exist?(file + '.info') && defined?(Step)
780
781
  done = Step::INFO_SERIALIZER.load(Open.open(file + '.info'))[:done]
781
782
  return done if done
782
783
  end
783
784
 
784
785
  file = Pathname.new(file).realpath.to_s
785
786
  end
786
- return nil unless File.exists?(file)
787
+ return nil unless File.exist?(file)
787
788
  File.mtime(file)
788
789
  rescue
789
790
  nil
@@ -793,7 +794,7 @@ module Open
793
794
 
794
795
  def self.update_mtime(path, target)
795
796
  if File.symlink?(target) || File.stat(target).nlink > 1
796
- if File.exists?(target + '.info')
797
+ if File.exist?(target + '.info')
797
798
  target = target + '.info'
798
799
  else
799
800
  target = Pathname.new(target).realpath.to_s
@@ -801,7 +802,7 @@ module Open
801
802
  end
802
803
 
803
804
  CMD.cmd("touch -r '#{path}' '#{target}'")
804
- CMD.cmd("touch -r '#{path}.info' '#{target}'") if File.exists?(path + '.info')
805
+ CMD.cmd("touch -r '#{path}.info' '#{target}'") if File.exist?(path + '.info')
805
806
  end
806
807
 
807
808
  def self.atime(file)
@@ -823,7 +824,7 @@ module Open
823
824
  end
824
825
 
825
826
  def self.broken_link?(path)
826
- File.symlink?(path) && ! File.exists?(File.readlink(path))
827
+ File.symlink?(path) && ! File.exist?(File.readlink(path))
827
828
  end
828
829
 
829
830
  def self.download(url, path)