vos 0.3.12 → 0.3.13

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,11 +1,11 @@
1
1
  class Ssh
2
2
  attr_reader :config
3
-
4
-
3
+
4
+
5
5
  def setstat(path, options)
6
6
  remote do |sh, sftp|
7
7
  sftp.setstat! path, options
8
8
  end
9
9
  end
10
-
10
+
11
11
  end
data/lib/vos.rb CHANGED
@@ -13,10 +13,10 @@ require 'open3'
13
13
  drivers/ssh
14
14
 
15
15
  box/shell
16
- box/marks
16
+ box/marks
17
17
  box/vfs
18
18
  box
19
-
19
+
20
20
  helpers/ubuntu
21
21
  ).each{|f| require "vos/#{f}"}
22
22
 
@@ -1,7 +1,7 @@
1
1
  module Vos
2
2
  class Box
3
3
  include Shell, Marks, Vfs
4
-
4
+
5
5
  def initialize *args
6
6
  first = args.first
7
7
  if args.empty?
@@ -10,12 +10,12 @@ module Vos
10
10
  if first.is_a? Hash
11
11
  options = first
12
12
  options[:host] ||= 'localhost'
13
- else
13
+ else
14
14
  options = args[1] || {}
15
15
  raise 'invalid arguments' unless options.is_a?(Hash)
16
16
  options[:host] = first.to_s
17
17
  end
18
-
18
+
19
19
  @driver = options[:host] == 'localhost' ? Drivers::Local.new : Drivers::Ssh.new(options)
20
20
  elsif args.size == 1
21
21
  @driver = first
@@ -25,30 +25,30 @@ module Vos
25
25
  end
26
26
 
27
27
 
28
- #
28
+ #
29
29
  # driver
30
- #
30
+ #
31
31
  attr_reader :driver
32
-
32
+
33
33
  def open &block
34
34
  driver.open &block
35
- end
35
+ end
36
36
  def close
37
37
  driver.close
38
38
  end
39
39
 
40
-
41
- #
40
+
41
+ #
42
42
  # Miscellaneous
43
- #
43
+ #
44
44
  def inspect; driver.to_s end
45
45
  alias_method :to_s, :inspect
46
-
46
+
47
47
  def host; driver.host end
48
-
48
+
49
49
  def local?; host == 'localhost' end
50
-
51
- class << self
50
+
51
+ class << self
52
52
  def local; @local ||= Box.new end
53
53
  end
54
54
  end
@@ -1,7 +1,7 @@
1
1
  module Vos
2
2
  class Box
3
3
  module Marks
4
- def mark! key
4
+ def mark! key
5
5
  marks_dir.file(key).create
6
6
  @marks_cache = nil
7
7
  end
@@ -10,18 +10,18 @@ module Vos
10
10
  marks_cache.include? key.to_s
11
11
  end
12
12
  alias_method :marked?, :has_mark?
13
-
13
+
14
14
  def clear_marks!
15
15
  marks_dir.destroy
16
16
  @marks_cache = nil
17
17
  end
18
-
18
+
19
19
  def marks_dir
20
20
  dir "/marks"
21
21
  end
22
-
22
+
23
23
  protected
24
- def marks_cache
24
+ def marks_cache
25
25
  @marks_cache ||= marks_dir.files(bang: false).collect{|file| file.name}
26
26
  end
27
27
  end
@@ -1,10 +1,10 @@
1
1
  module Vos
2
2
  class Box
3
- module Shell
3
+ module Shell
4
4
  def bash cmd, *args
5
5
  self['/'].bash cmd, *args
6
6
  end
7
-
7
+
8
8
  def bash_without_path cmd, *args
9
9
  check = args.shift if args.first.is_a?(Regexp)
10
10
  options = args.last || {}
@@ -14,7 +14,7 @@ module Vos
14
14
 
15
15
  unless code == 0
16
16
  puts stdout_and_stderr
17
- raise "can't execute '#{cmd}'!"
17
+ raise "can't execute '#{cmd}'!"
18
18
  end
19
19
 
20
20
  if check and (stdout_and_stderr !~ check)
@@ -24,18 +24,18 @@ module Vos
24
24
 
25
25
  stdout_and_stderr
26
26
  end
27
-
27
+
28
28
  def exec cmd
29
29
  open{driver.exec(env(cmd))}
30
30
  end
31
-
31
+
32
32
  attr_writer :env
33
33
  def env command_or_env_variables = nil, &block
34
34
  @env ||= default_env
35
-
36
- if block
35
+
36
+ if block
37
37
  before = env.clone
38
- begin
38
+ begin
39
39
  if variables = command_or_env_variables
40
40
  raise 'invalid arguments' unless variables.is_a? Hash
41
41
  @env.merge! variables
@@ -58,26 +58,26 @@ module Vos
58
58
  raise 'invalid arguments'
59
59
  end
60
60
  end
61
- end
61
+ end
62
62
  def default_env
63
63
  {}
64
64
  end
65
65
  def wrap_cmd env_str, cmd
66
66
  %(#{env_str}#{' && ' unless env_str.empty?}#{cmd})
67
67
  end
68
-
69
-
68
+
69
+
70
70
  def home path = nil
71
71
  open{@home = bash('cd ~; pwd').gsub("\n", '')} unless @home
72
72
  path ? self[@home][path] : self[@home]
73
- end
74
-
73
+ end
74
+
75
75
  # def generate_tmp_dir_name
76
76
  # open do
77
77
  # driver.generate_tmp_dir_name
78
78
  # end
79
79
  # end
80
-
80
+
81
81
  # def inspect
82
82
  # "<Box: #{options[:host]}>"
83
83
  # end
@@ -4,28 +4,28 @@ module Vos
4
4
  def open_fs &block
5
5
  open &block
6
6
  end
7
-
7
+
8
8
  def to_entry
9
9
  '/'.to_entry_on(self)
10
10
  end
11
-
11
+
12
12
  def to_file
13
13
  to_entry.file
14
14
  end
15
-
15
+
16
16
  def to_dir
17
17
  to_entry.dir
18
18
  end
19
-
19
+
20
20
  # def [] path
21
21
  # to_entry[path]
22
22
  # end
23
23
  # alias_method :/, :[]
24
-
24
+
25
25
  %w(
26
- entry dir file
26
+ entry dir file
27
27
  entries dirs files
28
- [] /
28
+ [] /
29
29
  tmp
30
30
  ).each do |m|
31
31
  script = <<-RUBY
@@ -41,7 +41,7 @@ end
41
41
 
42
42
  module Vfs
43
43
  class Dir
44
- def bash cmd, *args
44
+ def bash cmd, *args
45
45
  storage.bash_without_path "cd #{path} && #{cmd}", *args
46
46
  end
47
47
  end
@@ -2,7 +2,7 @@ module Vos
2
2
  module Drivers
3
3
  class Abstract
4
4
  attr_reader :options
5
-
5
+
6
6
  def initialize options = {}
7
7
  @options = options
8
8
  end
@@ -2,42 +2,42 @@ require 'vfs/storages/local'
2
2
 
3
3
  module Vos
4
4
  module Drivers
5
- class Local < Abstract
6
- #
5
+ class Local < Abstract
6
+ #
7
7
  # Vfs
8
- #
8
+ #
9
9
  include Vfs::Storages::Local::LocalVfsHelper
10
10
  def open &block
11
11
  block.call self if block
12
12
  end
13
13
  alias_method :open_fs, :open
14
14
  def close; end
15
-
16
-
17
- #
15
+
16
+
17
+ #
18
18
  # Shell
19
- #
20
- def exec command
21
- code, stdout, stderr = Open3.popen3 command do |stdin, stdout, stderr, waitth|
19
+ #
20
+ def exec command
21
+ code, stdout, stderr = Open3.popen3 command do |stdin, stdout, stderr, waitth|
22
22
  [waitth.value.to_i, stdout.read, stderr.read]
23
23
  end
24
-
24
+
25
25
  return code, stdout, stderr
26
26
  end
27
-
28
-
27
+
28
+
29
29
  def bash command
30
- code, stdout_and_stderr = Open3.popen2e command do |stdin, stdout_and_stderr, wait_thread|
30
+ code, stdout_and_stderr = Open3.popen2e command do |stdin, stdout_and_stderr, wait_thread|
31
31
  [wait_thread.value.to_i, stdout_and_stderr.read]
32
32
  end
33
-
33
+
34
34
  return code, stdout_and_stderr
35
35
  end
36
-
37
-
38
- #
36
+
37
+
38
+ #
39
39
  # Other
40
- #
40
+ #
41
41
  def to_s; '' end
42
42
  def host; 'localhost' end
43
43
  end
@@ -1,15 +1,15 @@
1
- shared_examples_for 'vos driver' do
1
+ shared_examples_for 'vos driver' do
2
2
  it 'should respond to :host' do
3
3
  @driver.host.should_not be_nil
4
4
  end
5
-
5
+
6
6
  describe "shell" do
7
7
  it 'exec' do
8
8
  @driver.open do |d|
9
9
  d.exec("echo 'ok'").should == [0, "ok\n", ""]
10
10
  end
11
- end
12
-
11
+ end
12
+
13
13
  it 'bash' do
14
14
  @driver.open do |d|
15
15
  d.bash("echo 'ok'").should == [0, "ok\n"]
@@ -3,31 +3,31 @@ require 'net/sftp'
3
3
 
4
4
  module Vos
5
5
  module Drivers
6
- class Ssh < Abstract
6
+ class Ssh < Abstract
7
7
  DEFAULT_OPTIONS = {
8
8
  config: true
9
9
  }
10
-
10
+
11
11
  def initialize options = {}
12
- super
12
+ super
13
13
  raise ":host not provided!" unless options[:host]
14
14
  @options = DEFAULT_OPTIONS.merge options
15
-
15
+
16
16
  # config_options = Net::SSH.configuration_for(options[:host])
17
17
  # options = DEFAULT_OPTIONS.merge(config_options).merge options
18
18
  # raise ":user not provided (provide explicitly or in .ssh/config)!" unless options[:user]
19
19
  end
20
-
21
-
22
- #
20
+
21
+
22
+ #
23
23
  # Establishing SSH channel
24
- #
24
+ #
25
25
  def open &block
26
26
  if block
27
27
  if @ssh
28
28
  block.call self
29
29
  else
30
- begin
30
+ begin
31
31
  open
32
32
  block.call self
33
33
  ensure
@@ -44,9 +44,9 @@ module Vos
44
44
  @sftp = @ssh.sftp.connect
45
45
  end
46
46
  end
47
- end
48
-
49
- def close
47
+ end
48
+
49
+ def close
50
50
  if @ssh
51
51
  @ssh.close
52
52
  # @sftp.close not needed
@@ -55,16 +55,16 @@ module Vos
55
55
  end
56
56
 
57
57
 
58
- #
58
+ #
59
59
  # Vfs
60
- #
60
+ #
61
61
  include SshVfsStorage
62
62
  alias_method :open_fs, :open
63
-
64
-
65
- #
63
+
64
+
65
+ #
66
66
  # Shell
67
- #
67
+ #
68
68
  def exec command
69
69
  # somehow net-ssh doesn't executes ~/.profile, so we need to execute it manually
70
70
  # command = ". ~/.profile && #{command}"
@@ -72,8 +72,8 @@ module Vos
72
72
  stdout, stderr, code, signal = hacked_exec! ssh, command
73
73
 
74
74
  return code, stdout, stderr
75
- end
76
-
75
+ end
76
+
77
77
  def bash command
78
78
  # somehow net-ssh doesn't executes ~/.profile, so we need to execute it manually
79
79
  # command = ". ~/.profile && #{command}"
@@ -81,55 +81,55 @@ module Vos
81
81
 
82
82
  return code, stdout_and_stderr
83
83
  end
84
-
85
-
86
- #
84
+
85
+
86
+ #
87
87
  # Miscellaneous
88
- #
88
+ #
89
89
  def to_s; options[:host] end
90
90
  def host; options[:host] end
91
-
91
+
92
92
  protected
93
93
  attr_accessor :ssh, :sftp
94
-
94
+
95
95
  def fix_path path
96
96
  path.sub(/^\~/, home)
97
97
  end
98
-
98
+
99
99
  def home
100
100
  unless @home
101
101
  command = 'cd ~; pwd'
102
102
  code, stdout, stderr = exec command
103
103
  raise "can't execute '#{command}'!" unless code == 0
104
- @home = stdout.gsub("\n", '')
104
+ @home = stdout.gsub("\n", '')
105
105
  end
106
106
  @home
107
107
  end
108
-
108
+
109
109
  # taken from here http://stackoverflow.com/questions/3386233/how-to-get-exit-status-with-rubys-netssh-library/3386375#3386375
110
110
  def hacked_exec!(ssh, command, merge_stdout_and_stderr = false, &block)
111
111
  stdout_data = ""
112
112
  stderr_data = ""
113
113
  exit_code = nil
114
114
  exit_signal = nil
115
-
115
+
116
116
  channel = ssh.open_channel do |channel|
117
117
  channel.exec(command) do |ch, success|
118
118
  raise "could not execute command: #{command.inspect}" unless success
119
119
 
120
120
  channel.on_data{|ch2, data| stdout_data << data}
121
- channel.on_extended_data do |ch2, type, data|
121
+ channel.on_extended_data do |ch2, type, data|
122
122
  stdout_data << data if merge_stdout_and_stderr
123
123
  stderr_data << data
124
124
  end
125
125
  channel.on_request("exit-status"){|ch,data| exit_code = data.read_long}
126
126
  channel.on_request("exit-signal"){|ch, data| exit_signal = data.read_long}
127
- end
128
- end
129
-
130
- channel.wait
127
+ end
128
+ end
129
+
130
+ channel.wait
131
131
  [stdout_data, stderr_data, exit_code, exit_signal]
132
- end
132
+ end
133
133
  end
134
134
  end
135
135
  end
@@ -10,10 +10,10 @@ module Vos
10
10
  @out.write data
11
11
  end
12
12
  end
13
-
14
- #
13
+
14
+ #
15
15
  # Attributes
16
- #
16
+ #
17
17
  def attributes path
18
18
 
19
19
  stat = sftp.stat! fix_path(path)
@@ -21,22 +21,22 @@ module Vos
21
21
  attrs[:file] = stat.file?
22
22
  attrs[:dir] = stat.directory?
23
23
  # stat.symlink?
24
-
24
+
25
25
  # attributes special for file system
26
26
  attrs[:updated_at] = stat.mtime
27
-
28
- attrs
27
+
28
+ attrs
29
29
  rescue Net::SFTP::StatusException
30
30
  {}
31
31
  end
32
32
 
33
- def set_attributes path, attrs
33
+ def set_attributes path, attrs
34
34
  raise 'not supported'
35
35
  end
36
36
 
37
- #
37
+ #
38
38
  # File
39
- #
39
+ #
40
40
  def read_file path, &block
41
41
  sftp.file.open fix_path(path), 'r' do |is|
42
42
  while buff = is.gets
@@ -45,15 +45,15 @@ module Vos
45
45
  end
46
46
  end
47
47
 
48
- def write_file path, append, &block
49
- # there's no support for :append in Net::SFTP, so we just mimic it
50
- if append
48
+ def write_file path, append, &block
49
+ # there's no support for :append in Net::SFTP, so we just mimic it
50
+ if append
51
51
  attrs = attributes(path)
52
52
  data = if attrs
53
53
  if attrs[:file]
54
54
  os = ""
55
55
  read_file(path){|buff| os << buff}
56
- delete_file path
56
+ delete_file path
57
57
  os
58
58
  else
59
59
  raise "can't append to dir!"
@@ -69,8 +69,8 @@ module Vos
69
69
  sftp.file.open fix_path(path), 'w' do |out|
70
70
  block.call Writer.new(out)
71
71
  end
72
- end
73
- end
72
+ end
73
+ end
74
74
 
75
75
  def delete_file remote_file_path
76
76
  sftp.remove! fix_path(remote_file_path)
@@ -81,9 +81,9 @@ module Vos
81
81
  # end
82
82
 
83
83
 
84
- #
84
+ #
85
85
  # Dir
86
- #
86
+ #
87
87
  def create_dir path
88
88
  sftp.mkdir! path
89
89
  end
@@ -94,7 +94,7 @@ module Vos
94
94
 
95
95
  def each_entry path, query, &block
96
96
  raise "SshVfsStorage not support :each_entry with query!" if query
97
-
97
+
98
98
  sftp.dir.foreach path do |stat|
99
99
  next if stat.name == '.' or stat.name == '..'
100
100
  if stat.directory?
@@ -104,13 +104,13 @@ module Vos
104
104
  end
105
105
  end
106
106
  end
107
-
107
+
108
108
  # def efficient_dir_copy from, to, override
109
109
  # return false if override # sftp doesn't support this behaviour
110
- #
111
- # from.storage.open_fs do |from_fs|
110
+ #
111
+ # from.storage.open_fs do |from_fs|
112
112
  # to.storage.open_fs do |to_fs|
113
- # if from_fs.local?
113
+ # if from_fs.local?
114
114
  # sftp.upload! from.path, fix_path(to.path)
115
115
  # true
116
116
  # elsif to_fs.local?
@@ -123,11 +123,11 @@ module Vos
123
123
  # end
124
124
  # end
125
125
 
126
- #
126
+ #
127
127
  # Special
128
- #
128
+ #
129
129
  def tmp &block
130
- tmp_dir = "/tmp/vfs_#{rand(10**3)}"
130
+ tmp_dir = "/tmp/vfs_#{rand(10**3)}"
131
131
  if block
132
132
  begin
133
133
  create_dir tmp_dir
@@ -140,7 +140,7 @@ module Vos
140
140
  tmp_dir
141
141
  end
142
142
  end
143
-
143
+
144
144
  def local?; false end
145
145
  end
146
146
  end
@@ -7,25 +7,25 @@ module Vos
7
7
  def wrap_cmd env_str, cmd
8
8
  %(source #{env_file.path} && #{env_str}#{' && ' unless env_str.empty?}#{cmd})
9
9
  end
10
-
10
+
11
11
  def env_file
12
12
  file '/etc/profile' ## file '/etc/environment'
13
13
  end
14
-
14
+
15
15
  # def append_to_environment file, reload = true
16
- # raise "#{file} must be an Entry" unless file.is_a? Vfs::Entry
17
- #
16
+ # raise "#{file} must be an Entry" unless file.is_a? Vfs::Entry
17
+ #
18
18
  # env_ext = dir '/etc/profile_ext'
19
- #
19
+ #
20
20
  # remote_file = env_ext[file.name]
21
21
  # file.copy_to! remote_file
22
- #
22
+ #
23
23
  # require_clause = "source #{remote_file.path}"
24
24
  # env_file.append "\n#{require_clause}\n" unless env_file.content.include? require_clause
25
- #
25
+ #
26
26
  # reload_env if reload
27
27
  # end
28
-
28
+
29
29
  def reload_env
30
30
  bash ". #{env_file.path}"
31
31
  end
@@ -41,32 +41,32 @@ module Vfs
41
41
  raise "symlink target '' not exist!" unless entry.exist?
42
42
  storage.bash "ln -s#{'f' if options[:override]} #{entry.path} #{path}"
43
43
  end
44
-
44
+
45
45
  def symlink_to! entry
46
46
  symlink_to entry, override: true
47
47
  end
48
48
  end
49
-
49
+
50
50
  class Dir
51
51
  def rsync_to entry
52
- raise "invalid argument!" unless entry.is_a? Entry
52
+ raise "invalid argument!" unless entry.is_a? Entry
53
53
  raise "#{path} must be a Dir" unless dir?
54
54
  raise "#{entry.path} can't be a File!" if entry.file?
55
-
55
+
56
56
  if local? and !entry.local?
57
57
  Box.local.bash("rsync -e 'ssh' -al --delete --stats --progress #{path}/ root@#{entry.storage.host}:#{entry.path}")
58
- elsif entry.local? and !local?
58
+ elsif entry.local? and !local?
59
59
  Box.local.bash("rsync -e 'ssh' -al --delete --stats --progress root@#{storage.host}:#{path}/ #{entry.path}")
60
60
  else
61
61
  raise "invalid usage!"
62
62
  end
63
63
  end
64
64
  end
65
-
65
+
66
66
  class File
67
67
  def append_to_environment_of box, reload = true
68
- raise "#{box} must be an Vos::Box" unless box.is_a? Vos::Box
69
-
68
+ raise "#{box} must be an Vos::Box" unless box.is_a? Vos::Box
69
+
70
70
  remote_file = box.dir('/etc/profile_ext').file(name)
71
71
  copy_to! remote_file
72
72
 
@@ -75,9 +75,9 @@ module Vfs
75
75
  # #{name}
76
76
  source #{remote_file.path}
77
77
  BASH
78
-
78
+
79
79
  box.env_file.append require_clause unless box.env_file.content.include? require_clause
80
-
80
+
81
81
  box.reload_env if reload
82
82
  end
83
83
  end
@@ -13,25 +13,25 @@ end
13
13
 
14
14
  # class File
15
15
  # class << self
16
- # def ensure_dir_exist directory, options = {}
17
- # options = options.symbolize_keys
16
+ # def ensure_dir_exist directory, options = {}
17
+ # options = options.symbolize_keys
18
18
  # clean = options.delete :clean
19
19
  # raise "unsupported options #{options.keys}!" unless options.empty?
20
- #
20
+ #
21
21
  # FileUtils.rm_r directory, force: true if clean and File.exist?(directory)
22
22
  # FileUtils.mkdir_p directory
23
23
  # end
24
- #
24
+ #
25
25
  # def copy_dir_content from, to
26
26
  # Dir.glob "#{from}/*" do |item|
27
27
  # FileUtils.cp_r item, to
28
28
  # end
29
29
  # end
30
- #
30
+ #
31
31
  # def copy_dir from, to
32
32
  # FileUtils.cp_r from, to
33
33
  # end
34
- #
34
+ #
35
35
  # def delete_dir dir
36
36
  # FileUtils.rm_r dir
37
37
  # end
data/readme.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Vos - Virtual Operating System
2
2
 
3
- Small abstraction over Operating System, mainly it should be used in conjunction with [Virtual File System][vfs] tool. Kind of
3
+ Small abstraction over Operating System, mainly it should be used in conjunction with [Virtual File System][vfs] tool. Kind of
4
4
  Capistrano but without extra stuff and more universal, not forcing You to follow 'The Rails Way'.
5
5
 
6
6
  Currently, there are following implementations available:
@@ -26,10 +26,14 @@ server.bash 'ls' # ls /
26
26
  server['apps/cool_app'].bash 'rails production' # cd /apps/cool_app && rails production
27
27
  ```
28
28
 
29
- For more details look also to [Virtual File System][vfs] project.
30
- Or checkout configuration I use to control my production servers [My Cluster][my_cluster] in conjunction with small
29
+ For more details look also to [Virtual File System][vfs] project.
30
+ Or checkout configuration I use to control my production servers [My Cluster][my_cluster] in conjunction with small
31
31
  configuration tool [Cluster Management][cluster_management].
32
-
32
+
33
+ ## Please let me know about bugs and Your proposals, there's the 'Issues' tab at the top, feel free to submit.
34
+
35
+ Copyright (c) Alexey Petrushin http://petrush.in, released under the MIT license.
36
+
33
37
  [vfs]: http://github.com/alexeypetrushin/vfs
34
38
  [cluster_management]: http://github.com/alexeypetrushin/cluster_management
35
39
  [my_cluster]: http://github.com/alexeypetrushin/my_cluster
@@ -1,55 +1,55 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Vos::Box do
3
+ describe Vos::Box do
4
4
  before do
5
5
  @box = Vos::Box.new
6
6
  @box.stub :puts
7
7
  end
8
-
8
+
9
9
  describe 'vfs integration' do
10
10
  it 'smoke test' do
11
- @box['/'].exist?.should be_true
11
+ @box['/'].exist?.should be_true
12
12
  end
13
-
13
+
14
14
  it 'vfs integration' do
15
15
  @box['/'].bash("echo 'ok'").should == "ok\n"
16
16
  end
17
17
  end
18
-
18
+
19
19
  describe "shell" do
20
20
  it 'bash' do
21
21
  @box.bash("echo 'ok'").should == "ok\n"
22
22
  end
23
-
23
+
24
24
  it 'bash working dir should be /' do
25
25
  @box.bash('pwd').should == "/\n"
26
26
  end
27
-
27
+
28
28
  it 'check with regex' do
29
29
  @box.bash "echo 'ok'", /ok/
30
30
  -> {@box.bash "echo 'ok'", /no/}.should raise_error(/not match/)
31
31
  end
32
-
32
+
33
33
  it "exec" do
34
34
  @box.exec("echo 'ok'").should == [0, "ok\n", ""]
35
35
  end
36
-
36
+
37
37
  it 'home' do
38
38
  @box.home.should_not be_nil
39
39
  end
40
-
40
+
41
41
  it 'env' do
42
42
  @box.env.should == {}
43
43
  @box.env = {a: 'b'}
44
-
44
+
45
45
  @box.env c: 'd' do
46
46
  @box.env.should == {a: 'b', c: 'd'}
47
47
  end
48
48
  @box.env.should == {a: 'b'}
49
-
49
+
50
50
  @box.env(c: 'd')
51
51
  @box.env.should == {a: 'b', c: 'd'}
52
-
52
+
53
53
  @box.env('ls').should == "a=b c=d && ls"
54
54
  end
55
55
  end
@@ -1,6 +1,6 @@
1
1
  :ssh:
2
2
  :host: some_host.com
3
-
3
+
4
4
  # optional, you can omit and use id_rsa key instead
5
5
  # :user: some_user
6
6
  # :password: some_password
@@ -2,8 +2,8 @@ require 'drivers/spec_helper'
2
2
 
3
3
  describe Vos::Drivers::Local do
4
4
  it_should_behave_like "vos driver"
5
- it_should_behave_like "vfs storage"
6
-
5
+ it_should_behave_like "vfs storage"
6
+
7
7
  before do
8
8
  @storage = @driver = Vos::Drivers::Local.new
9
9
  end
@@ -1,15 +1,15 @@
1
1
  require 'drivers/spec_helper'
2
2
 
3
3
  describe Vos::Drivers::Ssh do
4
- it_should_behave_like "vos driver"
4
+ it_should_behave_like "vos driver"
5
5
  it_should_behave_like "vfs storage"
6
6
 
7
7
  before :all do
8
8
  @storage = @driver = Vos::Drivers::Ssh.new(config[:ssh_driver])
9
9
  @driver.open
10
10
  end
11
-
11
+
12
12
  after :all do
13
13
  @driver.close
14
- end
14
+ end
15
15
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vos
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.12
4
+ version: 0.3.13
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2011-08-10 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: net-ssh
16
- requirement: &376740 !ruby/object:Gem::Requirement
16
+ requirement: &363240 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *376740
24
+ version_requirements: *363240
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: net-sftp
27
- requirement: &667020 !ruby/object:Gem::Requirement
27
+ requirement: &640270 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *667020
35
+ version_requirements: *640270
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: vfs
38
- requirement: &747540 !ruby/object:Gem::Requirement
38
+ requirement: &738060 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,7 +43,7 @@ dependencies:
43
43
  version: '0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *747540
46
+ version_requirements: *738060
47
47
  description:
48
48
  email:
49
49
  executables: []