drbqs 0.0.10 → 0.0.11

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.
data/Rakefile CHANGED
@@ -23,6 +23,7 @@ Jeweler::Tasks.new do |gem|
23
23
  # and development dependencies are only needed for development (ie running rake tasks, tests, etc)
24
24
  gem.add_runtime_dependency 'net-ssh', '>= 2.1.3'
25
25
  gem.add_runtime_dependency 'net-ssh-shell', '>= 0.1.0'
26
+ gem.add_runtime_dependency 'filename', '>= 0.0.5'
26
27
  gem.add_development_dependency 'rspec', '>= 2.5.0'
27
28
  end
28
29
  Jeweler::RubygemsDotOrgTasks.new
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.10
1
+ 0.0.11
data/bin/drbqs-manage CHANGED
@@ -82,17 +82,15 @@ when 'exit-signal'
82
82
  when 'status'
83
83
  check_argument_size(argv, :==, 2)
84
84
  uri = argv[1]
85
- $stdout.puts manage.get_status(uri)
85
+ if status = manage.get_status(uri)
86
+ $stdout.puts status
87
+ end
86
88
  when 'initialize'
87
89
  check_argument_size(argv, :==, 1)
88
90
  manage.create_config
89
91
  when 'ssh'
90
92
  dest = argv[1]
91
93
  manage.execute_over_ssh(dest, options, command_args)
92
- when 'new-filename'
93
- check_argument_size(argv, :==, 2)
94
- fname = DRbQS::FileName.new(argv[1], :add => :auto, :type => :time, :position => :suffix)
95
- $stdout.puts fname.create(:directory => true)
96
94
  else
97
95
  raise "Invalid command: #{command}"
98
96
  end
data/bin/drbqs-node CHANGED
@@ -82,18 +82,17 @@ puts "Connect to #{uri}"
82
82
  puts "Execute #{process_num} processes"
83
83
 
84
84
  if options[:log_prefix]
85
- require 'fileutils'
86
85
  if /\/$/ =~ options[:log_prefix]
87
86
  options[:log_prefix] += 'out'
88
87
  end
89
- options[:log_prefix] = File.expand_path(options[:log_prefix])
90
- FileUtils.mkdir_p(File.dirname(options[:log_prefix]))
91
88
  end
92
89
 
93
90
  process_num.times do |i|
94
91
  fork do
95
92
  if options[:log_prefix]
96
- logfile = "#{options[:log_prefix]}_#{Time.now.strftime("%Y%m%d%H%M")}_#{Process.pid}.log"
93
+ logfile = FileName.create(options[:log_prefix], :position => :suffix, :type => :time,
94
+ :add => :always, :directory => true,
95
+ :format => lambda { |t| t.strftime("%Y%m%d_%H%M_#{Process.pid}.log") })
97
96
  else
98
97
  logfile = STDOUT
99
98
  end
data/bin/drbqs-server CHANGED
@@ -18,6 +18,8 @@ options = {
18
18
  :acl => DRbQS::Config.get_acl_file
19
19
  }
20
20
 
21
+ test_opts = {}
22
+
21
23
  command_argv, server_argv = DRbQS::Manage.split_arguments(ARGV)
22
24
 
23
25
  begin
@@ -39,6 +41,18 @@ begin
39
41
  raise "Invalid log level."
40
42
  end
41
43
  end
44
+ opt.on('--file-directory DIR', String, 'Set the file archive directory.') do |v|
45
+ options[:file_directory] = v
46
+ end
47
+ opt.on('--scp-user USER', String, 'Set the user of scp destination.') do |v|
48
+ options[:scp_user] = v
49
+ end
50
+ opt.on('--scp-host HOST', String, 'Set the host of scp destination.') do |v|
51
+ options[:scp_host] = v
52
+ end
53
+ opt.on('--profile', 'Use profile for test exec.') do |v|
54
+ test_opts[:profile] = true
55
+ end
42
56
  opt.on('--debug', 'Set $DEBUG true.') do |v|
43
57
  $DEBUG = true
44
58
  end
@@ -75,7 +89,7 @@ case options[:command_type]
75
89
  when /^test/
76
90
  s = options[:command_type].split('_')[1].split(',')
77
91
  type = s[0].intern
78
- DRbQS.test_server(options, type, s[1..-1])
92
+ DRbQS.test_server(options, type, s[1..-1], test_opts)
79
93
  else
80
94
  DRbQS.start_server(options)
81
95
  end
data/drbqs.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{drbqs}
8
- s.version = "0.0.10"
8
+ s.version = "0.0.11"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Takayuki YAMAGUCHI"]
12
- s.date = %q{2011-03-25}
12
+ s.date = %q{2011-04-09}
13
13
  s.description = %q{Task queuing system over network that is implemented by dRuby.}
14
14
  s.email = %q{d@ytak.info}
15
15
  s.executables = ["drbqs-manage", "drbqs-node", "drbqs-server"]
@@ -34,6 +34,8 @@ Gem::Specification.new do |s|
34
34
  "example/drbqs-manage-test.rb",
35
35
  "example/drbqs-node-test.rb",
36
36
  "example/drbqs-server-test.rb",
37
+ "example/error/error.rb",
38
+ "example/error/server_def.rb",
37
39
  "example/server/server.rb",
38
40
  "example/sum/server_def.rb",
39
41
  "example/sum/sum.rb",
@@ -60,12 +62,11 @@ Gem::Specification.new do |s|
60
62
  "lib/drbqs/task.rb",
61
63
  "lib/drbqs/task_client.rb",
62
64
  "lib/drbqs/task_generator.rb",
63
- "lib/drbqs/utils/filename.rb",
65
+ "lib/drbqs/utils.rb",
64
66
  "spec/acl_file_spec.rb",
65
67
  "spec/config_spec.rb",
66
68
  "spec/connection_spec.rb",
67
69
  "spec/data/acl.txt",
68
- "spec/filename_spec.rb",
69
70
  "spec/history_spec.rb",
70
71
  "spec/manage_spec.rb",
71
72
  "spec/message_spec.rb",
@@ -88,13 +89,12 @@ Gem::Specification.new do |s|
88
89
  s.homepage = %q{http://github.com/ytaka/drbqs}
89
90
  s.licenses = ["GPL3"]
90
91
  s.require_paths = ["lib"]
91
- s.rubygems_version = %q{1.5.2}
92
+ s.rubygems_version = %q{1.7.2}
92
93
  s.summary = %q{dRuby Queueing System}
93
94
  s.test_files = [
94
95
  "spec/acl_file_spec.rb",
95
96
  "spec/config_spec.rb",
96
97
  "spec/connection_spec.rb",
97
- "spec/filename_spec.rb",
98
98
  "spec/history_spec.rb",
99
99
  "spec/manage_spec.rb",
100
100
  "spec/message_spec.rb",
@@ -126,6 +126,7 @@ Gem::Specification.new do |s|
126
126
  s.add_development_dependency(%q<rcov>, [">= 0"])
127
127
  s.add_runtime_dependency(%q<net-ssh>, [">= 2.1.3"])
128
128
  s.add_runtime_dependency(%q<net-ssh-shell>, [">= 0.1.0"])
129
+ s.add_runtime_dependency(%q<filename>, [">= 0.0.5"])
129
130
  s.add_development_dependency(%q<rspec>, [">= 2.5.0"])
130
131
  else
131
132
  s.add_dependency(%q<rspec>, [">= 2.5.0"])
@@ -135,6 +136,7 @@ Gem::Specification.new do |s|
135
136
  s.add_dependency(%q<rcov>, [">= 0"])
136
137
  s.add_dependency(%q<net-ssh>, [">= 2.1.3"])
137
138
  s.add_dependency(%q<net-ssh-shell>, [">= 0.1.0"])
139
+ s.add_dependency(%q<filename>, [">= 0.0.5"])
138
140
  s.add_dependency(%q<rspec>, [">= 2.5.0"])
139
141
  end
140
142
  else
@@ -145,6 +147,7 @@ Gem::Specification.new do |s|
145
147
  s.add_dependency(%q<rcov>, [">= 0"])
146
148
  s.add_dependency(%q<net-ssh>, [">= 2.1.3"])
147
149
  s.add_dependency(%q<net-ssh-shell>, [">= 0.1.0"])
150
+ s.add_dependency(%q<filename>, [">= 0.0.5"])
148
151
  s.add_dependency(%q<rspec>, [">= 2.5.0"])
149
152
  end
150
153
  end
@@ -0,0 +1,5 @@
1
+ class TaskError
2
+ def exec
3
+ raise "Raise error"
4
+ end
5
+ end
@@ -0,0 +1,8 @@
1
+ require_relative 'error.rb'
2
+
3
+ DRbQS.define_server(:check_alive => 300) do |server, argv, opts|
4
+ server.queue.add(DRbQS::Task.new(TaskError, :exec))
5
+ server.add_hook(:finish) do |serv|
6
+ serv.exit
7
+ end
8
+ end
@@ -7,6 +7,8 @@ end
7
7
 
8
8
  server = DRbQS::Server.new(:port => 13501, :finish_exit => true)
9
9
  server.add_task_generator(task_generator)
10
+ server.set_initialization_task(DRbQS::Task.new(Kernel, :puts, ['hook: initialize']))
11
+ server.set_finalization_task(DRbQS::Task.new(Kernel, :puts, ['hook: finalize']))
10
12
  server.set_signal_trap
11
13
  server.start
12
14
  server.wait
@@ -1,5 +1,3 @@
1
- require 'fileutils'
2
-
3
1
  class CreateFile
4
2
  def initialize(n)
5
3
  @n = n
@@ -15,5 +15,5 @@ DRbQS.define_server(:finish_exit => true) do |server, argv, opts|
15
15
  end
16
16
  server.add_task_generator(tgen)
17
17
 
18
- server.set_file_transfer(ENV['USER'], 'localhost', '/tmp/drbqs_transfer_test/')
18
+ server.set_file_transfer('/tmp/drbqs_transfer_test/')
19
19
  end
data/lib/drbqs/client.rb CHANGED
@@ -9,15 +9,16 @@ module DRbQS
9
9
  PRIORITY_RESPOND = 10
10
10
  PRIORITY_CALCULATE = 0
11
11
  OUTPUT_NOT_SEND_RESULT = 'not_send_result'
12
+ DEFAULT_LOG_FILE = 'drbqs_client.log'
12
13
 
13
14
  # :continue
14
15
  def initialize(access_uri, opts = {})
15
16
  @access_uri = access_uri
16
- @logger = Logger.new(opts[:log_file] || 'drbqs_client.log')
17
- @logger.level = opts[:log_level] || Logger::ERROR
17
+ @logger = DRbQS::Utils.create_logger(opts[:log_file] || DEFAULT_LOG_FILE, opts[:log_level])
18
18
  @connection = nil
19
19
  @task_client = nil
20
20
  @process_continue = opts[:continue]
21
+ @signal_queue = Queue.new
21
22
  end
22
23
 
23
24
  def transfer_file
@@ -72,12 +73,39 @@ module DRbQS
72
73
  end
73
74
  private :process_exit
74
75
 
76
+ def execute_finalization
77
+ if ary = @connection.get_finalization
78
+ execute_task(*ary)
79
+ end
80
+ rescue => err
81
+ output_error(err)
82
+ end
83
+ private :execute_finalization
84
+
85
+ def send_error(err)
86
+ output_error(err)
87
+ @connection.send_node_error("#{err.to_s}\n#{err.backtrace.join("\n")}")
88
+ end
89
+ private :send_error
90
+
75
91
  def communicate_with_server
76
92
  @task_client.add_new_task
77
- if @connection.respond_signal == :exit
93
+ case @connection.respond_signal
94
+ when :exit
95
+ return nil
96
+ when :finalize
97
+ execute_finalization
78
98
  return nil
79
99
  end
80
100
  @task_client.send_result
101
+ until @signal_queue.empty?
102
+ signal, obj = @signal_queue.pop
103
+ case signal
104
+ when :node_error
105
+ send_error(obj)
106
+ process_exit
107
+ end
108
+ end
81
109
  return true
82
110
  end
83
111
  private :communicate_with_server
@@ -98,7 +126,7 @@ module DRbQS
98
126
  sleep(WAIT_NEW_TASK)
99
127
  end
100
128
  rescue => err
101
- output_error(err)
129
+ send_error(err)
102
130
  ensure
103
131
  process_exit
104
132
  end
@@ -113,14 +141,20 @@ module DRbQS
113
141
  calculate_task
114
142
  end
115
143
  rescue => err
116
- output_error(err)
117
- process_exit
144
+ @signal_queue.push([:node_error, err])
118
145
  end
119
146
  end
120
147
  end
121
148
  private :thread_calculate
122
149
 
150
+ def set_signal_trap
151
+ Signal.trap(:TERM) do
152
+ process_exit
153
+ end
154
+ end
155
+
123
156
  def calculate(opts = {})
157
+ set_signal_trap
124
158
  cn = thread_communicate
125
159
  exec = thread_calculate
126
160
  cn.priority = PRIORITY_RESPOND
data/lib/drbqs/config.rb CHANGED
@@ -1,4 +1,3 @@
1
- require 'fileutils'
2
1
  require 'singleton'
3
2
 
4
3
  module DRbQS
@@ -6,6 +5,9 @@ module DRbQS
6
5
  ACL_DEFAULT_PATH = 'acl.txt'
7
6
  ACL_SAMPLE_PATH = 'acl.txt.sample'
8
7
  HOST_FILE_DIRECTORY = 'host'
8
+ HOST_FILE_SAMPLE_PATH = 'host.yaml.sample'
9
+ SHELL_FILE_DIRECTORY = 'shell'
10
+ SHELL_BASHRC = 'bashrc'
9
11
 
10
12
  class Config
11
13
 
@@ -17,6 +19,22 @@ module DRbQS
17
19
  deny all
18
20
  allow localhost
19
21
  allow 127.0.0.1
22
+ SAMPLE
23
+
24
+ HOST_YAML_SAMPLE =<<SAMPLE
25
+ ---
26
+ :dest: user@example.com
27
+ :dir:
28
+ :shell: bash --noprofile --init-file ~/.drbqs/shell/bashrc
29
+ :rvm:
30
+ :rvm_init: ~/.rvm/scripts/rvm
31
+ :output:
32
+ SAMPLE
33
+
34
+ BASHRC_SAMPLE = <<SAMPLE
35
+ HISTFILE=$HOME/.drbqs/shell/bash_history
36
+ HISTSIZE=10000
37
+ HISTFILESIZE=20000
20
38
  SAMPLE
21
39
 
22
40
  class << self
@@ -33,23 +51,39 @@ SAMPLE
33
51
  get_path(HOST_FILE_DIRECTORY)
34
52
  end
35
53
 
54
+ def get_shell_file_directory
55
+ get_path(SHELL_FILE_DIRECTORY)
56
+ end
57
+
58
+ def make_directory(dir)
59
+ unless File.exist?(dir)
60
+ FileUtils.mkdir_p(dir)
61
+ end
62
+ end
63
+ private :make_directory
64
+
36
65
  def check_directory_create
37
66
  unless File.exist?(@@data[:dir])
38
67
  FileUtils.mkdir_p(@@data[:dir])
39
68
  FileUtils.chmod(0700, @@data[:dir])
40
69
  end
41
- host = get_host_file_directory
42
- unless File.exist?(host)
43
- FileUtils.mkdir_p(host)
70
+ [get_host_file_directory, get_shell_file_directory].each do |dir|
71
+ make_directory(dir)
44
72
  end
45
73
  end
46
74
 
47
- def save_sample
48
- path = get_path(ACL_SAMPLE_PATH)
75
+ def output_to_file(path, content)
49
76
  unless File.exist?(path)
50
- open(path, 'w') { |f| f.print ACL_SAMPLE }
77
+ open(path, 'w') { |f| f.print content }
51
78
  end
52
79
  end
80
+ private :output_to_file
81
+
82
+ def save_sample
83
+ output_to_file(get_path(ACL_SAMPLE_PATH), ACL_SAMPLE)
84
+ output_to_file("#{get_host_file_directory}/#{HOST_FILE_SAMPLE_PATH}", HOST_YAML_SAMPLE)
85
+ output_to_file("#{get_shell_file_directory}/#{SHELL_BASHRC}", BASHRC_SAMPLE)
86
+ end
53
87
 
54
88
  def get_acl_file
55
89
  path = File.join(@@data[:dir], ACL_DEFAULT_PATH)
@@ -25,14 +25,23 @@ module DRbQS
25
25
  @id_number
26
26
  end
27
27
 
28
- def get_initialization
28
+ def get_special_task(label)
29
29
  begin
30
- ary = @message.read([:initialize, nil, Symbol, nil], 0)
30
+ ary = @message.read([label, nil, Symbol, nil], 0)
31
31
  ary[1..-1]
32
32
  rescue Rinda::RequestExpiredError
33
33
  nil
34
34
  end
35
35
  end
36
+ private :get_special_task
37
+
38
+ def get_initialization
39
+ get_special_task(:initialize)
40
+ end
41
+
42
+ def get_finalization
43
+ get_special_task(:finalize)
44
+ end
36
45
 
37
46
  def respond_signal
38
47
  begin
@@ -42,11 +51,17 @@ module DRbQS
42
51
  when :alive_p
43
52
  @message.write([:server, :alive, @id_number])
44
53
  @logger.info("Send alive signal of node id #{@id_number}") if @logger
45
- when :exit
46
- return :exit
54
+ when :exit, :finalize
55
+ return sym
56
+ else
57
+ raise "Get invalid signal: #{sym.inspect}"
47
58
  end
48
59
  rescue Rinda::RequestExpiredError
49
60
  end
50
61
  end
62
+
63
+ def send_node_error(error_message)
64
+ @message.write([:server, :node_error, [@id_number, error_message]])
65
+ end
51
66
  end
52
67
  end
data/lib/drbqs/manage.rb CHANGED
@@ -53,15 +53,22 @@ module DRbQS
53
53
  def command_client(access_uri)
54
54
  obj = DRbObject.new_with_uri(access_uri)
55
55
  DRbQS::SendCommand.new(obj[:message])
56
+ rescue DRb::DRbConnError
57
+ $stderr.puts "Can not access #{access_uri}"
58
+ nil
56
59
  end
57
60
  private :command_client
58
61
 
59
62
  def send_exit_signal(access_uri)
60
- command_client(access_uri).send_exit_signal
63
+ if client = command_client(access_uri)
64
+ client.send_exit_signal
65
+ end
61
66
  end
62
67
 
63
68
  def get_status(access_uri)
64
- command_client(access_uri).get_status
69
+ if client = command_client(access_uri)
70
+ client.get_status
71
+ end
65
72
  end
66
73
 
67
74
  def execute_over_ssh(dest, opts, command)
data/lib/drbqs/message.rb CHANGED
@@ -32,11 +32,15 @@ module DRbQS
32
32
  @logger.info("Get exit message from #{arg.to_s}") if @logger
33
33
  when :request_status
34
34
  @logger.info("Get status request from #{arg.to_s}") if @logger
35
+ when :node_error
36
+ @node_list.delete(arg[0])
37
+ @logger.info("Node Error (#{arg[0]})") { arg[1] } if @logger
38
+ return [mes, arg[0]]
35
39
  else
36
40
  @logger.error("Invalid message from #{arg.to_s}") if @logger
37
41
  return nil
38
42
  end
39
- return mes
43
+ return [mes]
40
44
  end
41
45
  private :manage_message
42
46
 
@@ -50,11 +54,21 @@ module DRbQS
50
54
  deleted
51
55
  end
52
56
 
53
- def send_exit
57
+ def send_signal_to_all_nodes(signal)
54
58
  @node_list.each do |node_id, id_str|
55
- @message.write([node_id, :exit])
59
+ @message.write([node_id, signal])
56
60
  end
57
61
  end
62
+ private :send_signal_to_all_nodes
63
+
64
+ def send_exit
65
+ send_signal_to_all_nodes(:exit)
66
+ end
67
+
68
+ def send_finalization(task)
69
+ set_finalization(task)
70
+ send_signal_to_all_nodes(:finalize)
71
+ end
58
72
 
59
73
  def send_status(calculating_task_id)
60
74
  s = ''
@@ -82,16 +96,24 @@ module DRbQS
82
96
  @node_list.empty?
83
97
  end
84
98
 
85
- # If the task has already set,
86
- # the method overwrite old task of initialization by new task.
87
- def set_initialization(task)
99
+ def set_special_task(label, task)
88
100
  begin
89
- @message.take([:initialize, nil, Symbol, nil], 0)
101
+ @message.take([label, nil, Symbol, nil], 0)
90
102
  rescue Rinda::RequestExpiredError
91
103
  end
92
- @message.write(task.drb_args(:initialize))
104
+ @message.write(task.drb_args(label))
93
105
  end
106
+ private :set_special_task
94
107
 
108
+ # If the task has already set,
109
+ # the method overwrite old task of initialization by new task.
110
+ def set_initialization(task)
111
+ set_special_task(:initialize, task)
112
+ end
113
+
114
+ def set_finalization(task)
115
+ set_special_task(:finalization, task)
116
+ end
95
117
  end
96
118
 
97
119
  end
@@ -26,10 +26,14 @@ module DRbQS
26
26
  @check = @list.keys
27
27
  end
28
28
 
29
+ def delete(id)
30
+ @list.delete(id)
31
+ @history.set(id, :disconnect)
32
+ end
33
+
29
34
  def delete_not_alive
30
35
  @check.each do |id|
31
- @list.delete(id)
32
- @history.set(id, :disconnect)
36
+ delete(id)
33
37
  end
34
38
  deleted = @check
35
39
  @check = []
data/lib/drbqs/queue.rb CHANGED
@@ -72,19 +72,18 @@ module DRbQS
72
72
  end
73
73
  private :delete_task_id
74
74
 
75
- def exec_task_hook(task_id, result)
75
+ def exec_task_hook(main_server, task_id, result)
76
76
  if task = @cache.delete(task_id)
77
77
  if hook = task.hook
78
78
  @history.set(task_id, :hook)
79
- hook.call(self, result)
79
+ hook.call(main_server, result)
80
80
  end
81
81
  else
82
82
  @logger.error("Task #{task_id} is not cached.") if @logger
83
83
  end
84
84
  end
85
- private :exec_task_hook
86
85
 
87
- def get_result
86
+ def get_result(main_server)
88
87
  count = 0
89
88
  begin
90
89
  loop do
@@ -94,7 +93,7 @@ module DRbQS
94
93
  @history.set(task_id, :result, node_id)
95
94
  @logger.info("Get: result of #{task_id} from node #{node_id}.") if @logger
96
95
  delete_task_id(node_id, task_id)
97
- exec_task_hook(task_id, result)
96
+ exec_task_hook(main_server, task_id, result)
98
97
  end
99
98
  rescue Rinda::RequestExpiredError
100
99
  @logger.debug("Get: #{count} results.") if @logger
data/lib/drbqs/server.rb CHANGED
@@ -28,6 +28,7 @@ module DRbQS
28
28
  # empty_queue_hook is prior to task_generator.
29
29
  class Server
30
30
  WAIT_TIME_NODE_EXIT = 3
31
+ WAIT_TIME_NODE_FINALIZE = 10
31
32
  WAIT_TIME_NEW_RESULT = 1
32
33
 
33
34
  attr_reader :queue
@@ -46,6 +47,12 @@ module DRbQS
46
47
  # Exit programs in finish_hook.
47
48
  # :signal_trap
48
49
  # Set trapping signal.
50
+ # :scp_user
51
+ # Set user of scp.
52
+ # :scp_host
53
+ # Set host of scp.
54
+ # :file_directory
55
+ # Set the setting of file directory.
49
56
  def initialize(opts = {})
50
57
  @port = opts[:port] || ROOT_DEFAULT_PORT
51
58
  @acl = acl_init(opts[:acl])
@@ -55,20 +62,30 @@ module DRbQS
55
62
  :result => Rinda::TupleSpace.new,
56
63
  :transfer => nil
57
64
  }
58
- if opts[:log_file]
59
- @logger = Logger.new(opts[:log_file])
60
- @logger.level = opts[:log_level] || Logger::ERROR
61
- else
62
- @logger = nil
63
- end
65
+ @logger = DRbQS::Utils.create_logger(opts[:log_file], opts[:log_level])
64
66
  @message = MessageServer.new(@ts[:message], @logger)
65
67
  @queue= QueueServer.new(@ts[:queue], @ts[:result], @logger)
66
68
  @check_alive = CheckAlive.new(opts[:check_alive])
67
69
  @task_generator = []
68
70
  hook_init(opts[:finish_exit])
69
71
  set_signal_trap if opts[:signal_trap]
72
+ @finalization_task = nil
73
+ @transfer_setting = get_transfer_setting(opts[:scp_host], opts[:scp_user], opts[:file_directory])
74
+ end
75
+
76
+ def transfer_directory
77
+ @ts[:transfer] && @ts[:transfer].directory
70
78
  end
71
79
 
80
+ def get_transfer_setting(host, user, directory)
81
+ setting = { :directory => directory, :user => user, :host => host, :set => true }
82
+ if host || user || directory
83
+ setting[:set] = true
84
+ end
85
+ setting
86
+ end
87
+ private :get_transfer_setting
88
+
72
89
  def acl_init(acl_arg)
73
90
  case acl_arg
74
91
  when Array
@@ -88,6 +105,9 @@ module DRbQS
88
105
  private :hook_init
89
106
 
90
107
  def start
108
+ if @transfer_setting[:set] && @transfer_setting[:directory] && !@ts[:transfer]
109
+ set_file_transfer(@transfer_setting[:directory])
110
+ end
91
111
  DRb.install_acl(@acl) if @acl
92
112
  uri = "druby://:#{@port}"
93
113
  DRb.start_service(uri, @ts)
@@ -128,6 +148,10 @@ module DRbQS
128
148
  @message.set_initialization(task)
129
149
  end
130
150
 
151
+ def set_finalization_task(task)
152
+ @finalization_task = task
153
+ end
154
+
131
155
  # +key+ is :empty_queue or :finish_exit.
132
156
  # &block takes self as an argument.
133
157
  def add_hook(key, name = nil, &block)
@@ -138,6 +162,12 @@ module DRbQS
138
162
  @hook.delete(key, name)
139
163
  end
140
164
 
165
+ def exec_finish_hook
166
+ @logger.info("Execute finish hook.") if @logger
167
+ @hook.exec(:finish, self)
168
+ end
169
+ private :exec_finish_hook
170
+
141
171
  def exec_hook
142
172
  if @queue.empty?
143
173
  @logger.info("Execute empty queue hook.") if @logger
@@ -145,16 +175,21 @@ module DRbQS
145
175
  end
146
176
  add_tasks_from_generator
147
177
  if @queue.finished?
148
- @logger.info("Execute finish hook.") if @logger
149
- @hook.exec(:finish, self)
178
+ exec_finish_hook
150
179
  end
151
180
  end
152
181
  private :exec_hook
153
182
 
154
183
  def exit
155
- @message.send_exit
184
+ if @finalization_task
185
+ @message.send_finalization(@finalization_task)
186
+ wait_time = WAIT_TIME_NODE_FINALIZE
187
+ else
188
+ @message.send_exit
189
+ wait_time = WAIT_TIME_NODE_EXIT
190
+ end
156
191
  until @message.node_not_exist?
157
- sleep(WAIT_TIME_NODE_EXIT)
192
+ sleep(wait_time)
158
193
  check_connection(true)
159
194
  end
160
195
  @logger.info("History of tasks") { "\n" + @queue.all_logs } if @logger
@@ -167,17 +202,24 @@ module DRbQS
167
202
  end
168
203
  end
169
204
 
170
- def set_file_transfer(user, host, directory)
205
+ def set_file_transfer(directory, opts = {})
206
+ user = opts[:user] || @transfer_setting[:user] || ENV['USER']
207
+ host = opts[:host] || @transfer_setting[:host] || 'localhost'
171
208
  @ts[:transfer] = DRbQS::Transfer.new(user, host, directory)
209
+ @logger.info("File transfer") { @ts[:transfer].information } if @logger
172
210
  end
173
211
 
174
212
  def check_message
175
- while mes = @message.get_message
213
+ while mes_arg = @message.get_message
214
+ mes, arg = mes_arg
176
215
  case mes
177
216
  when :exit_server
178
217
  self.exit
179
218
  when :request_status
180
219
  @message.send_status(@queue.calculating)
220
+ when :node_error
221
+ @queue.get_accept_signal
222
+ @queue.requeue_for_deleted_node_id([arg])
181
223
  end
182
224
  end
183
225
  end
@@ -193,7 +235,7 @@ module DRbQS
193
235
  loop do
194
236
  check_message
195
237
  check_connection
196
- count_results = @queue.get_result
238
+ count_results = @queue.get_result(self)
197
239
  exec_hook
198
240
  @logger.debug("Calculating tasks: #{@queue.calculating_task_number}") if @logger
199
241
  if count_results <= 1
@@ -202,25 +244,48 @@ module DRbQS
202
244
  end
203
245
  end
204
246
 
247
+ def start_profile
248
+ require 'ruby-prof'
249
+ RubyProf.start
250
+ end
251
+ private :start_profile
252
+
253
+ def finish_profile
254
+ result = RubyProf.stop
255
+ printer = RubyProf::FlatPrinter.new(result)
256
+ # printer = RubyProf::GraphPrinter.new(result)
257
+ # printer = RubyProf::CallTreePrinter.new(result)
258
+ printer.print(STDOUT)
259
+ end
260
+ private :finish_profile
261
+
205
262
  def test_exec(opts = {})
206
263
  task_generator_init
207
264
  dummy_client = DRbQS::Client.new(nil, :log_file => $stdout, :log_level => opts[:log_level])
208
265
  dummy_task_client = DRbQS::TaskClient.new(nil, @ts[:queue], nil)
266
+ if @ts[:transfer]
267
+ dummy_client.instance_variable_set(:@transfer, DRbQS::TransferTest.new(@ts[:transfer].directory))
268
+ end
209
269
  num = 0
270
+ start_profile if opts[:profile]
210
271
  loop do
211
- num += 1
212
272
  exec_hook
213
273
  if ary = dummy_task_client.get_task
214
274
  task_id, marshal_obj, method_sym, args = ary
215
275
  result = dummy_client.instance_eval { execute_task(marshal_obj, method_sym, args) }
216
- @queue.instance_eval do
217
- exec_task_hook(task_id, result)
218
- end
276
+ @queue.exec_task_hook(self, task_id, result)
219
277
  end
220
- if opts[:limit] && num > opts[:limit]
278
+ num += 1
279
+ if opts[:limit] && num >= opts[:limit]
221
280
  break
222
281
  end
223
282
  end
283
+ finish_profile if opts[:profile]
284
+ if @finalization_task
285
+ args = @finalization_task.drb_args(nil)[1..-1]
286
+ dummy_client.instance_eval { execute_task(*args) }
287
+ end
288
+ exec_finish_hook
224
289
  end
225
290
 
226
291
  def test_task_generator(opts = {})
@@ -57,14 +57,14 @@ HELP
57
57
  server.wait
58
58
  end
59
59
 
60
- def test_server(options, type, arg = [])
60
+ def test_server(options, type, arg = [], test_opts = {})
61
61
  server = create_server(options)
62
62
  case type
63
63
  when :task
64
64
  puts "*** Test of Task Generators ***"
65
65
  server.test_task_generator(:limit => arg[0] ? arg[0].to_i : nil, :progress => true)
66
66
  when :exec
67
- server.test_exec(:limit => arg[0] ? arg[0].to_i : nil)
67
+ server.test_exec(:limit => arg[0] ? arg[0].to_i : nil, :profile => test_opts[:profile])
68
68
  else
69
69
  puts "*** Not be yet implemented ***"
70
70
  end
@@ -129,7 +129,7 @@ module DRbQS
129
129
  end
130
130
  execute_command do |sh|
131
131
  if @nohup
132
- pr, path = shell_exec_check(sh, "drbqs-manage new-filename #{@nohup_output}")
132
+ pr, path = shell_exec_check(sh, "filename-create new -p middle -D parent -t time #{@nohup_output}")
133
133
  cmd = "nohup #{cmd} > #{path.strip} 2>&1 &"
134
134
  end
135
135
  shell_exec(sh, cmd)
@@ -1,11 +1,10 @@
1
- require 'fileutils'
2
-
3
1
  module DRbQS
4
2
 
5
3
  # Transfer files to directory on DRbQS server.
6
4
  # In this class we use scp command.
7
5
  # Note that after we transfer files we delete the files.
8
6
  class Transfer
7
+ attr_reader :user, :host, :directory
9
8
 
10
9
  # options
11
10
  # :mkdir true or nil
@@ -16,17 +15,43 @@ module DRbQS
16
15
  FileUtils.mkdir_p(@directory)
17
16
  end
18
17
 
18
+ def transfer_file(path, name)
19
+ system("scp -r #{path} #{@user}@#{@host}:#{File.join(@directory, name)} > /dev/null 2>&1")
20
+ end
21
+ private :transfer_file
22
+
19
23
  def scp(path)
20
24
  name = File.basename(path)
21
25
  unless File.exist?(path)
22
26
  raise ArgumentError, "File #{path} does not exist."
23
27
  end
24
- if system("scp -r #{path} #{@user}@#{@host}:#{File.join(@directory, name)} > /dev/null 2>&1")
28
+ if transfer_file(path, name)
25
29
  FileUtils.rm_r(path)
26
30
  return true
27
31
  end
28
32
  return false
29
33
  end
34
+
35
+ def information
36
+ "#{@user}@#{@host} #{@directory}"
37
+ end
38
+ end
39
+
40
+ class TransferTest < Transfer
41
+ def initialize(directory)
42
+ @directory = File.expand_path(directory)
43
+ FileUtils.mkdir_p(@directory)
44
+ end
45
+
46
+ def transfer_file(path, name)
47
+ FileUtils.cp(path, File.join(@directory, name))
48
+ true
49
+ end
50
+ private :transfer_file
51
+
52
+ def information
53
+ @directory
54
+ end
30
55
  end
31
56
 
32
57
  # To compress files, we use gzip and tar command.
@@ -49,10 +74,12 @@ module DRbQS
49
74
  raise "Can not compress: #{path}"
50
75
  end
51
76
  FileUtils.rm_r(path) if File.exist?(path)
52
- @@files.enq(gz_path)
77
+ path_to_send = gz_path
53
78
  else
54
- @@files.enq(path)
79
+ path_to_send = path
55
80
  end
81
+ @@files.enq(path_to_send)
82
+ File.basename(path_to_send)
56
83
  end
57
84
 
58
85
  def self.compress_enqueue(path)
@@ -66,5 +93,21 @@ module DRbQS
66
93
  def self.empty?
67
94
  @@files.empty?
68
95
  end
96
+
97
+ def self.decompress(server, filename)
98
+ dir = server.transfer_directory
99
+ path = File.join(dir, filename)
100
+ if File.exist?(path)
101
+ case path
102
+ when /\.tar\.gz$/
103
+ cmd = "tar xvzf #{path} -C #{dir} > /dev/null 2>&1"
104
+ when /\.gz$/
105
+ cmd = "gunzip #{path} > /dev/null 2>&1"
106
+ else
107
+ cmd = nil
108
+ end
109
+ system(cmd) if cmd
110
+ end
111
+ end
69
112
  end
70
113
  end
@@ -30,8 +30,8 @@ module DRbQS
30
30
  private :dequeue_result
31
31
 
32
32
  def queue_task(task_id, ary)
33
- @task_queue.enq(ary)
34
33
  @calculating_task = task_id
34
+ @task_queue.enq(ary)
35
35
  end
36
36
 
37
37
  def dequeue_task
@@ -50,9 +50,9 @@ module DRbQS
50
50
  unless @calculating_task
51
51
  if ary = get_task
52
52
  task_id, obj, method_sym, args = ary
53
+ @logger.info("Send accept signal: node #{@node_id} caluclating #{task_id}") if @logger
54
+ @result.write([:accept, task_id, @node_id])
53
55
  queue_task(task_id, [obj, method_sym, args])
54
- @logger.info("Send accept signal: node #{@node_id} caluclating #{@calculating_task}") if @logger
55
- @result.write([:accept, @calculating_task, @node_id])
56
56
  end
57
57
  end
58
58
  end
@@ -0,0 +1,19 @@
1
+ module DRbQS
2
+ module Utils
3
+ def create_logger(log_file, log_level)
4
+ if log_file
5
+ if IO === log_file
6
+ log_output = log_file
7
+ else
8
+ log_output = FileName.create(log_file, :position => :middle, :directory => :parent, :type => :number)
9
+ end
10
+ logger = Logger.new(log_output)
11
+ logger.level = log_level || Logger::ERROR
12
+ return logger
13
+ end
14
+ return nil
15
+ end
16
+ module_function :create_logger
17
+ end
18
+
19
+ end
data/lib/drbqs.rb CHANGED
@@ -1,5 +1,4 @@
1
1
  require 'thread'
2
- require 'logger'
3
2
  require 'drb'
4
3
  require 'drb/acl'
5
4
  require 'rinda/tuplespace'
@@ -7,6 +6,12 @@ require 'rinda/rinda'
7
6
 
8
7
  require 'drbqs/server_define'
9
8
 
9
+ autoload :Logger, 'logger'
10
+ autoload :FileUtils, 'fileutils'
11
+
12
+ gem 'filename'
13
+ autoload :FileName, 'filename'
14
+
10
15
  module DRbQS
11
16
  autoload :Server, 'drbqs/server'
12
17
  autoload :Client, 'drbqs/client'
@@ -18,9 +23,9 @@ module DRbQS
18
23
  autoload :SSHHost, 'drbqs/ssh/host'
19
24
  autoload :CommandTask, 'drbqs/task'
20
25
  autoload :CommandExecute, 'drbqs/task'
21
- autoload :FileName, 'drbqs/utils/filename'
22
26
  autoload :Transfer, 'drbqs/ssh/transfer'
23
27
  autoload :FileTransfer, 'drbqs/ssh/transfer'
28
+ autoload :Utils, 'drbqs/utils'
24
29
 
25
30
  ROOT_DEFAULT_PORT = 13500
26
31
  end
@@ -26,6 +26,16 @@ describe DRbQS::ConnectionClient do
26
26
  @connection.get_initialization.should == ary[1..-1]
27
27
  end
28
28
 
29
+ it "should get no finalization method." do
30
+ @connection.get_finalization.should be_nil
31
+ end
32
+
33
+ it "should get finalization" do
34
+ ary = [:finalize, [1, 2], :size, []]
35
+ @message.write(ary)
36
+ @connection.get_finalization.should == ary[1..-1]
37
+ end
38
+
29
39
  it "should respond :alive_p signal" do
30
40
  @message.write([@node_id, :alive_p])
31
41
  @connection.respond_signal
data/spec/server_spec.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
2
 
3
3
  describe DRbQS::Server do
4
- context "when we setup ACL objects" do
4
+ context "when we initialize DRbQS::Server" do
5
5
  it "should initialize an ACL object by ACLFile.load" do
6
6
  path = File.dirname(__FILE__) + '/data/acl.txt'
7
7
  DRbQS::ACLFile.should_receive(:load).with(path)
@@ -14,4 +14,43 @@ describe DRbQS::Server do
14
14
  DRbQS::Server.new(:acl => ary, :log_file => nil)
15
15
  end
16
16
  end
17
+
18
+ context "when we start DRbQS::Server" do
19
+ it "should not set DRbQS::FileTransfer" do
20
+ server = DRbQS::Server.new
21
+ DRbQS::Transfer.should_not_receive(:new)
22
+ DRb.should_receive(:start_service).once
23
+ server.start
24
+ end
25
+
26
+ it "should set defalt settings of DRbQS::FileTransfer" do
27
+ server = DRbQS::Server.new(:file_directory => '/tmp')
28
+ DRbQS::Transfer.should_receive(:new).with(ENV['USER'], 'localhost', '/tmp')
29
+ DRb.should_receive(:start_service).once
30
+ server.start
31
+ end
32
+
33
+ it "should set DRbQS::FileTransfer" do
34
+ server = DRbQS::Server.new(:file_directory => '/tmp', :scp_user => 'hello', :scp_host => 'example.com')
35
+ DRbQS::Transfer.should_receive(:new).with('hello', 'example.com', '/tmp')
36
+ DRb.should_receive(:start_service).once
37
+ server.start
38
+ end
39
+
40
+ it "should set DRbQS::FileTransfer by DRbQS::Server#set_file_transfer" do
41
+ server = DRbQS::Server.new
42
+ DRbQS::Transfer.should_receive(:new).with(ENV['USER'], 'localhost', '/tmp')
43
+ DRb.should_receive(:start_service).once
44
+ server.set_file_transfer('/tmp')
45
+ server.start
46
+ end
47
+
48
+ it "should set DRbQS::FileTransfer by DRbQS::Server#set_file_transfer with optional arguments" do
49
+ server = DRbQS::Server.new
50
+ DRbQS::Transfer.should_receive(:new).with('hello', 'example.com', '/tmp')
51
+ DRb.should_receive(:start_service).once
52
+ server.set_file_transfer('/tmp', :user => 'hello', :host => 'example.com')
53
+ server.start
54
+ end
55
+ end
17
56
  end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: drbqs
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.10
5
+ version: 0.0.11
6
6
  platform: ruby
7
7
  authors:
8
8
  - Takayuki YAMAGUCHI
@@ -10,8 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-03-25 00:00:00 +09:00
14
- default_executable:
13
+ date: 2011-04-09 00:00:00 Z
15
14
  dependencies:
16
15
  - !ruby/object:Gem::Dependency
17
16
  name: rspec
@@ -91,8 +90,19 @@ dependencies:
91
90
  prerelease: false
92
91
  version_requirements: *id007
93
92
  - !ruby/object:Gem::Dependency
94
- name: rspec
93
+ name: filename
95
94
  requirement: &id008 !ruby/object:Gem::Requirement
95
+ none: false
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ version: 0.0.5
100
+ type: :runtime
101
+ prerelease: false
102
+ version_requirements: *id008
103
+ - !ruby/object:Gem::Dependency
104
+ name: rspec
105
+ requirement: &id009 !ruby/object:Gem::Requirement
96
106
  none: false
97
107
  requirements:
98
108
  - - ">="
@@ -100,7 +110,7 @@ dependencies:
100
110
  version: 2.5.0
101
111
  type: :development
102
112
  prerelease: false
103
- version_requirements: *id008
113
+ version_requirements: *id009
104
114
  description: Task queuing system over network that is implemented by dRuby.
105
115
  email: d@ytak.info
106
116
  executables:
@@ -129,6 +139,8 @@ files:
129
139
  - example/drbqs-manage-test.rb
130
140
  - example/drbqs-node-test.rb
131
141
  - example/drbqs-server-test.rb
142
+ - example/error/error.rb
143
+ - example/error/server_def.rb
132
144
  - example/server/server.rb
133
145
  - example/sum/server_def.rb
134
146
  - example/sum/sum.rb
@@ -155,12 +167,11 @@ files:
155
167
  - lib/drbqs/task.rb
156
168
  - lib/drbqs/task_client.rb
157
169
  - lib/drbqs/task_generator.rb
158
- - lib/drbqs/utils/filename.rb
170
+ - lib/drbqs/utils.rb
159
171
  - spec/acl_file_spec.rb
160
172
  - spec/config_spec.rb
161
173
  - spec/connection_spec.rb
162
174
  - spec/data/acl.txt
163
- - spec/filename_spec.rb
164
175
  - spec/history_spec.rb
165
176
  - spec/manage_spec.rb
166
177
  - spec/message_spec.rb
@@ -179,7 +190,6 @@ files:
179
190
  - spec/test1_spec.rb
180
191
  - spec/test2_spec.rb
181
192
  - spec/transfer_spec.rb
182
- has_rdoc: true
183
193
  homepage: http://github.com/ytaka/drbqs
184
194
  licenses:
185
195
  - GPL3
@@ -193,7 +203,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
193
203
  requirements:
194
204
  - - ">="
195
205
  - !ruby/object:Gem::Version
196
- hash: 4286900576171591504
206
+ hash: -783083245369623093
197
207
  segments:
198
208
  - 0
199
209
  version: "0"
@@ -206,7 +216,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
206
216
  requirements: []
207
217
 
208
218
  rubyforge_project:
209
- rubygems_version: 1.5.2
219
+ rubygems_version: 1.7.2
210
220
  signing_key:
211
221
  specification_version: 3
212
222
  summary: dRuby Queueing System
@@ -214,7 +224,6 @@ test_files:
214
224
  - spec/acl_file_spec.rb
215
225
  - spec/config_spec.rb
216
226
  - spec/connection_spec.rb
217
- - spec/filename_spec.rb
218
227
  - spec/history_spec.rb
219
228
  - spec/manage_spec.rb
220
229
  - spec/message_spec.rb
@@ -1,118 +0,0 @@
1
- require 'fileutils'
2
-
3
- module DRbQS
4
- class FileName
5
-
6
- # The options are following:
7
- # * :start
8
- # Fixnum
9
- # If ID string type is number, the ID starts from the specified number.
10
- #
11
- # * :digit
12
- # Fixnum
13
- # ID number converted to a string with specified digit.
14
- #
15
- # * :delimiter
16
- # String
17
- #
18
- # * :type
19
- # :number or :time
20
- # If the value is :number, use a number for ID string.
21
- # If the value is :time, use current time.
22
- #
23
- # * :position
24
- # :prefix, :suffix, or :middle
25
- # Set the position of an ID string.
26
- def initialize(basepath, opts = {})
27
- @basepath = File.expand_path(basepath)
28
- @number = opts[:start] || 0
29
- @digit = opts[:digit] || 2
30
- @type = opts[:type] || :number
31
- @position = opts[:position] || :suffix
32
- @delimiter = opts[:delimiter] || (@position == :suffix ? '.' : '_')
33
- end
34
-
35
- def get_basepath(extension = nil)
36
- if extension
37
- extension = '.' + extension unless extension[0] == '.'
38
- oldext = File.extname(@basepath)
39
- if oldext.size > 0
40
- @basepath.sub(Regexp.new("\\#{oldext}$"), extension)
41
- else
42
- @basepath + extension
43
- end
44
- else
45
- @basepath
46
- end
47
- end
48
- private :get_basepath
49
-
50
- def get_addition(add, filename)
51
- if add != :prohibit && (add == :always || File.exist?(filename))
52
- case @type
53
- when :time
54
- t = Time.now
55
- return t.strftime("%Y%m%d_%H%M%S_") + sprintf("%06d", t.usec)
56
- when :number
57
- s = sprintf("%0#{@digit}d", @number)
58
- @number += 1
59
- return s
60
- else
61
- raise "Invalid type of addition."
62
- end
63
- end
64
- nil
65
- end
66
- private :get_addition
67
-
68
- def add_addition(filename, addition)
69
- case @position
70
- when :prefix
71
- dir, base = File.split(filename)
72
- dir + '/' + addition + @delimiter + base
73
- when :middle
74
- dir, base = File.split(filename)
75
- ext = File.extname(base)
76
- if ext.size > 0
77
- filename.sub(Regexp.new("\\#{ext}$"), @delimiter + addition + ext)
78
- else
79
- filename + @delimiter + addition
80
- end
81
- else # :suffix
82
- filename + @delimiter + addition
83
- end
84
- end
85
- private :add_addition
86
-
87
- # The options are following:
88
- # * :extension
89
- # String of extension
90
- # Use the extension if the value is specified.
91
- #
92
- # * :add
93
- # :always Always add an ID string.
94
- # :auto If some file exists, add an ID string.
95
- # :prohibit Even if some file exists, add no ID string.
96
- #
97
- # * :directory
98
- # If the value is true and the parent directory does not exist,
99
- # create the directory.
100
- def create(opts = {})
101
- base = get_basepath(opts[:extension])
102
- FileUtils.mkdir_p(File.dirname(base)) if opts[:directory]
103
- if addition = get_addition(opts[:add], base)
104
- path = add_addition(base, addition)
105
- while File.exist?(path)
106
- if addition = get_addition(opts[:add], base)
107
- path = add_addition(base, addition)
108
- else
109
- raise "Can not create new filename."
110
- end
111
- end
112
- path
113
- else
114
- base
115
- end
116
- end
117
- end
118
- end
@@ -1,44 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
-
3
- describe DRbQS::FileName do
4
- it "should return unchanged filename" do
5
- filename = DRbQS::FileName.new("abc.txt")
6
- filename.create.should == File.expand_path(File.dirname('.') + '/abc.txt')
7
- end
8
-
9
- it "should return new filename with number" do
10
- filename = DRbQS::FileName.new(__FILE__)
11
- path = filename.create
12
- File.exist?(path).should_not be_true
13
- path.should match(/\.\d+$/)
14
- end
15
-
16
- it "should return new filename with time" do
17
- filename = DRbQS::FileName.new(__FILE__, :type => :time)
18
- path = filename.create
19
- File.exist?(path).should_not be_true
20
- path.should match(/\.[\d_]+$/)
21
- end
22
-
23
- it "should return same filename" do
24
- filename = DRbQS::FileName.new(__FILE__)
25
- path = filename.create(:add => :prohibit)
26
- path.should == File.expand_path(__FILE__)
27
- end
28
-
29
- it "should return filename with prefix" do
30
- filename = DRbQS::FileName.new(__FILE__, :position => :prefix)
31
- path = filename.create
32
- dir, name = File.split(path)
33
- name.should match(/^\d+_/)
34
- end
35
-
36
- it "should return filename with addition before extension" do
37
- filename = DRbQS::FileName.new(__FILE__, :position => :middle)
38
- path = filename.create
39
- dir, name = File.split(path)
40
- ext = File.extname(name)
41
- name.should match(Regexp.new("_\\d+\\#{ext}"))
42
- end
43
-
44
- end