vos 0.3.15 → 0.4.0

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
@@ -4,6 +4,7 @@ project(
4
4
  name: "vos",
5
5
  gem: true,
6
6
  summary: "Virtual Operating System",
7
+ version: '0.4.0',
7
8
 
8
9
  author: "Alexey Petrushin",
9
10
  homepage: "http://github.com/alexeypetrushin/vos"
data/lib/vos.rb CHANGED
@@ -2,14 +2,15 @@ raise 'ruby 1.9.2 or higher required!' if RUBY_VERSION < '1.9.2'
2
2
 
3
3
  require 'vos/gems'
4
4
 
5
- require 'open3'
5
+ require 'vfs'
6
6
 
7
- %w(
8
- support
7
+ module Vos
8
+ module Drivers
9
+ end
10
+ end
9
11
 
12
+ %w(
10
13
  drivers/local
11
- drivers/ssh_vfs_storage
12
- drivers/ssh
13
14
 
14
15
  box/shell
15
16
  box/marks
@@ -19,6 +20,14 @@ require 'open3'
19
20
  helpers/ubuntu
20
21
  ).each{|f| require "vos/#{f}"}
21
22
 
23
+ # Vos::Drivers.class_eval do
24
+ # autoload :SshVfsStorage, 'vos/drivers/ssh_vfs_storage'
25
+ # autoload :Ssh, 'vos/drivers/ssh'
26
+ #
27
+ # autoload :S3VfsStorage, 'vos/drivers/s3_vfs_storage'
28
+ # autoload :S3, 'vos/drivers/s3'
29
+ # end
30
+
22
31
  unless $vos_dont_mess_with_global_namespace
23
32
  Box = Vos::Box
24
33
  end
@@ -22,6 +22,7 @@ module Vos
22
22
  else
23
23
  raise 'invalid arguments'
24
24
  end
25
+ @driver.box = self
25
26
  end
26
27
 
27
28
 
@@ -2,7 +2,7 @@ module Vos
2
2
  class Box
3
3
  module Vfs
4
4
  def to_entry
5
- '/'.to_entry_on(self)
5
+ '/'.to_entry_on(self.driver)
6
6
  end
7
7
 
8
8
  def to_file
@@ -38,7 +38,13 @@ end
38
38
  module Vfs
39
39
  class Dir
40
40
  def bash cmd, *args
41
- storage.bash_without_path "cd #{path} && #{cmd}", *args
41
+ driver.box.bash_without_path "cd #{path} && #{cmd}", *args
42
+ end
43
+ end
44
+
45
+ class << self
46
+ def default_driver
47
+ ::Vos::Box.local.driver
42
48
  end
43
49
  end
44
50
  end
@@ -1,21 +1,12 @@
1
- require 'vfs/storages/local'
1
+ require 'open3'
2
+ require 'fileutils'
3
+
4
+ require 'vfs/drivers/local'
2
5
 
3
6
  module Vos
4
7
  module Drivers
5
- class Local
6
- def initialize root = ''
7
- @root = root
8
- end
9
-
10
- #
11
- # Vfs
12
- #
13
- include Vfs::Storages::Local::LocalVfsHelper
14
- def open &block
15
- block.call self if block
16
- end
17
- def close; end
18
-
8
+ class Local < Vfs::Drivers::Local
9
+ attr_accessor :box
19
10
 
20
11
  #
21
12
  # Shell
@@ -37,11 +28,9 @@ module Vos
37
28
  return code, stdout_and_stderr
38
29
  end
39
30
 
40
-
41
31
  #
42
32
  # Other
43
33
  #
44
- def to_s; '' end
45
34
  def host; 'localhost' end
46
35
  end
47
36
  end
@@ -4,14 +4,14 @@ require 'vos/drivers/s3_vfs_storage'
4
4
  module Vos
5
5
  module Drivers
6
6
  class S3
7
+ attr_accessor :box
7
8
  attr_reader :connection, :bucket
8
9
 
9
- DEFAULT_OPTIONS = {
10
- # public: true
11
- }
12
-
13
- def initialize initialization_options, options = {}
14
- @initialization_options, @options = initialization_options, DEFAULT_OPTIONS.merge(options)
10
+ def initialize options = {}
11
+ options = options.clone
12
+ @bucket_name = options.delete(:bucket) || raise("S3 bucket not provided!")
13
+ @acl = options.delete(:acl) || :public_read
14
+ @options = options
15
15
  end
16
16
 
17
17
 
@@ -32,11 +32,8 @@ module Vos
32
32
  end
33
33
  else
34
34
  unless connection
35
- @connection = ::AWS::S3.new self.initialization_options.clone
36
- unless bucket = options[:bucket]
37
- raise("S3 bucket not provided (use Vos::Drivers::S3.new({initialization options ...}, {bucket: '<bucket_name>'}))!")
38
- end
39
- @bucket = @connection.buckets[bucket]
35
+ @connection = ::AWS::S3.new self.options.clone
36
+ @bucket = @connection.buckets[bucket_name]
40
37
  end
41
38
  end
42
39
  end
@@ -52,7 +49,7 @@ module Vos
52
49
  #
53
50
  # Miscellaneous
54
51
  #
55
- def inspect; "<#{self.class.name} #{initialization_options.inspect}, #{options.inspect}>" end
52
+ def inspect; "<#{self.class.name} #{options.merge(bucket: bucket_name).inspect}>" end
56
53
  alias_method :to_s, :inspect
57
54
 
58
55
  def _clear
@@ -60,7 +57,7 @@ module Vos
60
57
  end
61
58
 
62
59
  protected
63
- attr_reader :initialization_options, :options
60
+ attr_reader :options, :bucket_name, :acl
64
61
  end
65
62
  end
66
63
  end
@@ -23,24 +23,19 @@ module Vos
23
23
  return {dir: true, file: false} if path.empty?
24
24
 
25
25
  file = bucket.objects[path]
26
-
27
- attrs = {}
28
- file_exists = file.exists?
29
- attrs[:file] = file_exists
30
- if file_exists
26
+ if file.exists?
27
+ attrs = {}
28
+ attrs[:file] = true
31
29
  attrs[:dir] = false
32
- elsif dir_exists? path
33
- attrs[:dir] = true
34
- else
35
- return nil
36
- end
37
-
38
- if file_exists
39
30
  attrs[:size] = file.content_length
40
31
  attrs[:updated_at] = file.last_modified
32
+ attrs
33
+ # There's no dirs, always returning false
34
+ # elsif dir_exists? path
35
+ # attrs[:dir] = true
36
+ else
37
+ return nil
41
38
  end
42
-
43
- attrs
44
39
  end
45
40
 
46
41
  def set_attributes path, attrs
@@ -58,21 +53,18 @@ module Vos
58
53
 
59
54
  def write_file original_path, append, &block
60
55
  path = normalize_path original_path
61
- # TODO2 Performance lost, extra call to check file existence
62
- file = bucket.objects[path]
63
- file_exist = file.exists?
64
- raise "can't write, file #{original_path} already exist!" if !append and file_exist
65
56
 
57
+ file = bucket.objects[path]
66
58
  if append
67
59
  # there's no support for :append in Fog, so we just mimic it
68
60
  writer = Writer.new
69
- writer.write file.read if file_exist
61
+ writer.write file.read if file.exists?
70
62
  block.call writer
71
- file.write writer.data
63
+ file.write writer.data, acl: acl
72
64
  else
73
65
  writer = Writer.new
74
66
  block.call writer
75
- file.write writer.data
67
+ file.write writer.data, acl: acl
76
68
  end
77
69
  end
78
70
 
@@ -1,16 +1,20 @@
1
1
  require 'net/ssh'
2
2
  require 'net/sftp'
3
+ require 'vos/drivers/ssh_vfs_storage'
3
4
 
4
5
  module Vos
5
6
  module Drivers
6
7
  class Ssh
8
+ attr_accessor :box
9
+
7
10
  DEFAULT_OPTIONS = {
8
11
  config: true
9
12
  }
10
13
 
11
- def initialize options = {}, root = ''
14
+ def initialize options = {}
15
+ options = options.clone
12
16
  raise ":host not provided!" unless options[:host]
13
- @root = root
17
+ @root = options.delete(:root) || ''
14
18
  @options = DEFAULT_OPTIONS.merge options
15
19
 
16
20
  # config_options = Net::SSH.configuration_for(options[:host])
@@ -1,6 +1,3 @@
1
- gem 'net-ssh'
2
- gem 'net-sftp'
3
-
4
1
  if respond_to? :fake_gem
5
2
  fake_gem 'vfs'
6
3
  end
@@ -37,13 +37,9 @@ module Vfs
37
37
  class Entry
38
38
  def symlink_to entry, options = {}
39
39
  raise "invalid argument!" unless entry.is_a? Entry
40
- raise "can't use symlink ('#{self}' and '#{entry}' are on different storages)!" if self.storage != entry.storage
41
- raise "symlink target '' not exist!" unless entry.exist?
42
- storage.bash "ln -s#{'f' if options[:override]} #{entry.path} #{path}"
43
- end
44
-
45
- def symlink_to! entry
46
- symlink_to entry, override: true
40
+ raise "can't use symlink ('#{self}' and '#{entry}' are on different storages)!" if self.driver != entry.driver
41
+ raise "symlink target '#{entry}' not exist!" unless entry.exist?
42
+ driver.box.bash "ln -sf #{entry.path} #{path}"
47
43
  end
48
44
  end
49
45
 
@@ -54,9 +50,9 @@ module Vfs
54
50
  raise "#{entry.path} can't be a File!" if entry.file?
55
51
 
56
52
  if local? and !entry.local?
57
- Box.local.bash("rsync -e 'ssh' -al --delete --stats --progress #{path}/ root@#{entry.storage.host}:#{entry.path}")
53
+ Box.local.bash("rsync -e 'ssh' -al --delete --stats --progress #{path}/ root@#{entry.driver.host}:#{entry.path}")
58
54
  elsif entry.local? and !local?
59
- Box.local.bash("rsync -e 'ssh' -al --delete --stats --progress root@#{storage.host}:#{path}/ #{entry.path}")
55
+ Box.local.bash("rsync -e 'ssh' -al --delete --stats --progress root@#{driver.host}:#{path}/ #{entry.path}")
60
56
  else
61
57
  raise "invalid usage!"
62
58
  end
@@ -4,8 +4,8 @@ describe Vos::Box do
4
4
  with_tmp_spec_dir
5
5
 
6
6
  before do
7
- storage = Vos::Drivers::Local.new spec_dir
8
- @box = Vos::Box.new storage
7
+ driver = Vos::Drivers::Local.new root: spec_dir
8
+ @box = Vos::Box.new driver
9
9
  @box.stub :puts
10
10
  end
11
11
 
@@ -6,8 +6,6 @@
6
6
  # :password: some_password
7
7
 
8
8
  :s3:
9
- :driver:
10
- :access_key_id: 'xxx'
11
- :secret_access_key: 'xxx'
12
-
13
- :bucket: :xxx
9
+ :access_key_id: 'xxx'
10
+ :secret_access_key: 'xxx'
11
+ :bucket: :xxx
@@ -2,8 +2,6 @@
2
2
  :host: universal.4ire.net
3
3
 
4
4
  :s3:
5
- :driver:
6
- :access_key_id: 'AKIAJRX4FEUREBQ6IYTQ'
7
- :secret_access_key: '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'
8
-
9
- :bucket: :vostest
5
+ :access_key_id: 'AKIAJRX4FEUREBQ6IYTQ'
6
+ :secret_access_key: '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'
7
+ :bucket: :vostest
@@ -4,17 +4,17 @@ describe Vos::Drivers::Local do
4
4
  with_tmp_spec_dir
5
5
 
6
6
  before do
7
- @storage = @driver = Vos::Drivers::Local.new(spec_dir)
7
+ @driver = Vos::Drivers::Local.new root: spec_dir
8
8
  end
9
9
 
10
10
  it_should_behave_like "vos driver"
11
11
 
12
- it_should_behave_like 'vfs storage basic'
13
- it_should_behave_like 'vfs storage attributes basic'
14
- it_should_behave_like 'vfs storage files'
15
- it_should_behave_like 'vfs storage full attributes for files'
16
- it_should_behave_like 'vfs storage dirs'
17
- it_should_behave_like 'vfs storage full attributes for dirs'
18
- it_should_behave_like 'vfs storage query'
19
- it_should_behave_like 'vfs storage tmp dir'
12
+ it_should_behave_like 'vfs driver basic'
13
+ it_should_behave_like 'vfs driver attributes basic'
14
+ it_should_behave_like 'vfs driver files'
15
+ it_should_behave_like 'vfs driver full attributes for files'
16
+ it_should_behave_like 'vfs driver dirs'
17
+ it_should_behave_like 'vfs driver full attributes for dirs'
18
+ it_should_behave_like 'vfs driver query'
19
+ it_should_behave_like 'vfs driver tmp dir'
20
20
  end
@@ -1,28 +1,25 @@
1
1
  require 'drivers/spec_helper'
2
2
 
3
3
  require 'aws' rescue LoadError
4
-
5
4
  if defined? AWS
6
- require 'vos/drivers/s3'
7
-
8
5
  describe 'S3' do
9
6
  before :all do
10
- @storage = Vos::Drivers::S3.new(config[:s3][:driver], bucket: config[:s3][:bucket])
11
- @storage.open
7
+ @driver = Vos::Drivers::S3.new config[:s3]
8
+ @driver.open
12
9
  end
13
- after(:all){@storage.close}
10
+ after(:all){@driver.close}
14
11
 
15
- before{@storage._clear}
16
- after{@storage._clear}
12
+ before{@driver._clear}
13
+ after{@driver._clear}
17
14
 
18
- it_should_behave_like 'vfs storage basic'
19
- it_should_behave_like 'vfs storage attributes basic'
20
- it_should_behave_like 'vfs storage files'
15
+ it_should_behave_like 'vfs driver basic'
16
+ it_should_behave_like 'vfs driver attributes basic'
17
+ it_should_behave_like 'vfs driver files'
21
18
 
22
19
  describe 'limited attributes' do
23
20
  it "attributes for files" do
24
- @storage.write_file('/file', false){|w| w.write 'something'}
25
- attrs = @storage.attributes('/file')
21
+ @driver.write_file('/file', false){|w| w.write 'something'}
22
+ attrs = @driver.attributes('/file')
26
23
  attrs[:file].should be_true
27
24
  attrs[:dir].should be_false
28
25
  # attrs[:created_at].class.should == Time
@@ -33,53 +30,46 @@ if defined? AWS
33
30
 
34
31
  describe 'limited tmp' do
35
32
  it "tmp dir" do
36
- @storage.tmp.should_not be_nil
33
+ @driver.tmp.should_not be_nil
37
34
 
38
35
  file_path = nil
39
- @storage.tmp do |tmp_dir|
36
+ @driver.tmp do |tmp_dir|
40
37
  file_path = "#{tmp_dir}/file"
41
- @storage.write_file(file_path, false){|w| w.write 'something'}
38
+ @driver.write_file(file_path, false){|w| w.write 'something'}
42
39
  end
43
40
  file_path.should_not be_nil
44
- @storage.attributes(file_path).should be_nil
41
+ @driver.attributes(file_path).should be_nil
45
42
  end
46
43
  end
47
44
 
48
45
  describe 'limited dirs' do
49
46
  def create_s3_fake_dir dir
50
- @storage.write_file("#{dir}/file.txt", false){|w| w.write 'something'}
47
+ @driver.write_file("#{dir}/file.txt", false){|w| w.write 'something'}
51
48
  end
52
49
 
53
- it "directory crud" do
54
- @storage.attributes('/dir').should be_nil
55
-
56
- create_s3_fake_dir('/dir')
57
- attrs = @storage.attributes('/dir')
58
- attrs[:file].should be_false
59
- attrs[:dir].should be_true
60
-
61
- @storage.delete_dir('/dir')
62
- @storage.attributes('/dir').should be_nil
50
+ it "there's no directories, so it should always return false" do
51
+ @driver.attributes('/dir').should be_nil
52
+ @driver.write_file('/dir/file.txt', false){|w| w.write 'something'}
53
+ @driver.attributes('/dir').should be_nil
63
54
  end
64
55
 
65
56
  it 'should delete not-empty directories' do
66
- create_s3_fake_dir('/dir')
67
- create_s3_fake_dir('/dir/dir2')
68
- @storage.write_file('/dir/dir2/file', false){|w| w.write 'something'}
69
- @storage.attributes('/dir').should_not be_nil
57
+ @driver.write_file('/dir/dir2/file', false){|w| w.write 'something'}
58
+ @driver.attributes('/dir/dir2/file').should_not be_nil
70
59
 
71
- @storage.delete_dir('/dir')
72
- @storage.attributes('/dir').should be_nil
60
+ @driver.delete_dir('/dir')
61
+ @driver.attributes('/dir/dir2/file').should be_nil
73
62
  end
74
63
 
75
64
  it 'each' do
76
- # -> {@storage.each_entry('/not_existing_dir', nil){|path, type| list[path] = type}}.should raise_error
65
+ # -> {@driver.each_entry('/not_existing_dir', nil){|path, type| list[path] = type}}.should raise_error
77
66
 
78
- create_s3_fake_dir('/dir/dir2')
79
- @storage.write_file('/dir/file', false){|w| w.write 'something'}
67
+ @driver.write_file('/dir/file', false){|w| w.write 'something'}
68
+ @driver.write_file('/dir/dir2/file', false){|w| w.write 'something'}
69
+ @driver.write_file('/other_dir/file', false){|w| w.write 'something'}
80
70
 
81
71
  list = {}
82
- @storage.each_entry('/dir', nil){|path, type| list[path] = type}
72
+ @driver.each_entry('/dir', nil){|path, type| list[path] = type}
83
73
  list.should == {'dir2' => :dir, 'file' => :file}
84
74
  end
85
75
  end
@@ -1,5 +1,5 @@
1
1
  require 'spec_helper'
2
2
  require 'yaml'
3
3
 
4
- require 'vfs/storages/specification'
4
+ require 'vfs/drivers/specification'
5
5
  require 'vos/drivers/specification'
@@ -2,7 +2,7 @@ require 'drivers/spec_helper'
2
2
 
3
3
  describe Vos::Drivers::Ssh do
4
4
  before :all do
5
- @storage = @driver = Vos::Drivers::Ssh.new(config[:ssh_driver], '/vos_test')
5
+ @driver = @driver = Vos::Drivers::Ssh.new(config[:ssh_driver].merge(root: '/vos_test'))
6
6
  @driver.open
7
7
  end
8
8
 
@@ -18,16 +18,16 @@ describe Vos::Drivers::Ssh do
18
18
 
19
19
  it_should_behave_like "vos driver"
20
20
 
21
- it_should_behave_like 'vfs storage basic'
22
- it_should_behave_like 'vfs storage attributes basic'
23
- it_should_behave_like 'vfs storage files'
24
- it_should_behave_like 'vfs storage dirs'
25
- it_should_behave_like 'vfs storage tmp dir'
21
+ it_should_behave_like 'vfs driver basic'
22
+ it_should_behave_like 'vfs driver attributes basic'
23
+ it_should_behave_like 'vfs driver files'
24
+ it_should_behave_like 'vfs driver dirs'
25
+ it_should_behave_like 'vfs driver tmp dir'
26
26
 
27
27
  describe 'limited ssh attributes' do
28
28
  it "attributes for dirs" do
29
- @storage.create_dir('/dir')
30
- attrs = @storage.attributes('/dir')
29
+ @driver.create_dir('/dir')
30
+ attrs = @driver.attributes('/dir')
31
31
  attrs[:file].should be_false
32
32
  attrs[:dir].should be_true
33
33
  # attrs[:created_at].class.should == Time
@@ -36,8 +36,8 @@ describe Vos::Drivers::Ssh do
36
36
  end
37
37
 
38
38
  it "attributes for files" do
39
- @storage.write_file('/file', false){|w| w.write 'something'}
40
- attrs = @storage.attributes('/file')
39
+ @driver.write_file('/file', false){|w| w.write 'something'}
40
+ attrs = @driver.attributes('/file')
41
41
  attrs[:file].should be_true
42
42
  attrs[:dir].should be_false
43
43
  # attrs[:created_at].class.should == Time
@@ -2,6 +2,10 @@ require 'rspec_ext'
2
2
  require 'ruby_ext'
3
3
  require 'vos'
4
4
 
5
+ require 'vos/drivers/local'
6
+ require 'vos/drivers/ssh'
7
+ require 'vos/drivers/s3'
8
+
5
9
  rspec do
6
10
  def config
7
11
  dir = File.dirname __FILE__
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.15
4
+ version: 0.4.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,33 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-08-25 00:00:00.000000000Z
12
+ date: 2011-09-08 00:00:00.000000000Z
13
13
  dependencies:
14
- - !ruby/object:Gem::Dependency
15
- name: net-ssh
16
- requirement: &2785270 !ruby/object:Gem::Requirement
17
- none: false
18
- requirements:
19
- - - ! '>='
20
- - !ruby/object:Gem::Version
21
- version: '0'
22
- type: :runtime
23
- prerelease: false
24
- version_requirements: *2785270
25
- - !ruby/object:Gem::Dependency
26
- name: net-sftp
27
- requirement: &2784970 !ruby/object:Gem::Requirement
28
- none: false
29
- requirements:
30
- - - ! '>='
31
- - !ruby/object:Gem::Version
32
- version: '0'
33
- type: :runtime
34
- prerelease: false
35
- version_requirements: *2784970
36
14
  - !ruby/object:Gem::Dependency
37
15
  name: vfs
38
- requirement: &2784680 !ruby/object:Gem::Requirement
16
+ requirement: &2832540 !ruby/object:Gem::Requirement
39
17
  none: false
40
18
  requirements:
41
19
  - - ! '>='
@@ -43,7 +21,7 @@ dependencies:
43
21
  version: '0'
44
22
  type: :runtime
45
23
  prerelease: false
46
- version_requirements: *2784680
24
+ version_requirements: *2832540
47
25
  description:
48
26
  email:
49
27
  executables: []
@@ -65,7 +43,6 @@ files:
65
43
  - lib/vos/drivers/ssh_vfs_storage.rb
66
44
  - lib/vos/gems.rb
67
45
  - lib/vos/helpers/ubuntu.rb
68
- - lib/vos/support.rb
69
46
  - lib/vos.rb
70
47
  - spec/box_spec/emptygit
71
48
  - spec/box_spec.rb
@@ -1,39 +0,0 @@
1
- require 'fileutils'
2
- require 'net/ssh'
3
- require 'net/sftp'
4
-
5
- require 'vfs'
6
- Vfs.class_eval do
7
- class << self
8
- def default_storage
9
- ::Vos::Box.local
10
- end
11
- end
12
- end
13
-
14
- # class File
15
- # class << self
16
- # def ensure_dir_exist directory, options = {}
17
- # options = options.symbolize_keys
18
- # clean = options.delete :clean
19
- # raise "unsupported options #{options.keys}!" unless options.empty?
20
- #
21
- # FileUtils.rm_r directory, force: true if clean and File.exist?(directory)
22
- # FileUtils.mkdir_p directory
23
- # end
24
- #
25
- # def copy_dir_content from, to
26
- # Dir.glob "#{from}/*" do |item|
27
- # FileUtils.cp_r item, to
28
- # end
29
- # end
30
- #
31
- # def copy_dir from, to
32
- # FileUtils.cp_r from, to
33
- # end
34
- #
35
- # def delete_dir dir
36
- # FileUtils.rm_r dir
37
- # end
38
- # end
39
- # end