drbqs 0.0.10 → 0.0.11

Sign up to get free protection for your applications and to get access to all the features.
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