readme.md in vos-0.0.4 vs readme.md in vos-0.1.0

- old
+ new

@@ -1,21 +1,122 @@ -# Rsh - Tiny wrapper over Net::SSH/SFTP +# Vfs - Virtual File System -Because they are too hard to use and have terrible API design. +Handy and simple abstraction over any storage that can represent concept of File and Directory (or at least part of it). +The Vfs for File System Storages is the same as ActiveRecord is for Relational Databases. - box = Rsh::Box.new host: 'webapp.com', ssh: {user: 'root', password: 'secret'} +Currently, there are following implementations available: - box.upload_directory '/my_project', '/apps/my_project' - box.bash 'nohup /apps/my_project/server_start' - -Honestly my wrapper also not very good. I would like to make API looks like the ['rush'][rush] gem (made by Adam Wiggins) -but it requires a lots of time, maybe I'll do it later. -So, for now it's just a small wrapper to do ssh/io operations not so painfull. +- local file system +- remote file system (over ssh) +## Goals + +- **handy, simple and clean** API. +- **high performance** - the same as by using low-level storage API, there should be no extra calls **. +- same API for different storages (Local FS, SSH, Hadoop, or any other , ...). +- should work **simultaneously with different storages**. +- small codebase, easy to extend by others. +- simple storage-driver implementation, easy add new storage types (Hadoop DFS, LDAP, Document Oriented DB, In-Memory, ...). + +** all methods should have the same performance as native system calls, except for :move and :rename. Right now they are implemented +ASAP by using copy+destroy approach, will be fixed as soon as I'll have free time to do it. + +## Installation + + $ gem install vfs + $ gem install vos + +## Code samples: + gem 'vfs' # Virtual File System + require 'vfs' + + gem 'vos' # Virtual Operating System + require 'vos' + + + # Connections, let's deploy our 'cool_app' project from our local box to remote server + server = Vfs::Box.new(host: 'cool_app.com', ssh: {user: 'me', password: 'secret'}) + me = '~'.to_dir + + cool_app = server['apps/cool_app'] + projects = me['projects'] + + + # Working with dirs, copying dir from any source to any destination (local/remote/custom_storage_type) + projects['cool_app'].copy_to cool_app + + + # Working with files + dbc = cool_app.file('config/database.yml') # <= the 'config' dir not exist yet + dbc.write("user: root\npassword: secret") # <= now the 'database.yml' and parent 'config' has been created + dbc.content =~ /database/ # => false, we forgot to add the database + dbc.append("\ndatabase: mysql") # let's do it + + dbc.update do |content| # and add host info + content + "\nhost: cool_app.com " + end + + projects['cool_app/config/database.yml']. # or just overwrite it with our local dev version + copy_to! dbc + + # there are also streaming support (read/write/append), please go to specs for docs + + + # Checks + cool_app['config'].exist? # => true + cool_app.dir('config').exist? # => true + cool_app.file('config').exist? # => false + + cool_app['config'].dir? # => true + cool_app['config'].file? # => false + + + # Navigation + config = cool_app['config'] + config.parent # => </apps/cool_app> + config['../..'] # => </> + config['../..'].dir? # => true + + cool_app.entries # => list of dirs and files, also support &block + cool_app.files # => list of files, also support &block + cool_app.dirs # => list of dirs, also support &block + + + # For more please go to specs (create/update/move/copy/destroy/...) + +## Integration with [Vos][vos] (Virtual Operating System) + + server['apps/cool_app'].bash 'rails production' + +For more details please go to [Vos][vos] project page. + +# Why? + +To easy my work: with local FS, remote FS (cluster management, deployment automation), and some specific systems like Hadoop DFS. + +Because the API of standard File/Dir/FileUtils classes are just terrible. And there's the reason for it - the goal of thouse tools +is to provide 1-to-1 clone of underlying OS API, instead of provididing handy tool. + +And if you want to use remote FS - things are getting even worse and more complicated (Net::SSH & Net::SFTP use a little +different API than local FS, and you has to remember all thouse little quirks). + ## TODO -- remove ssh.remote and use only open/close -- introduce Entity/Dir/File (the same as in Rush) -- allow to move files between any Boxes, not only between local and remote. -- add support for moving dirs. +### v 0.1 (all done) -[rush]: http://github.com/adamwiggins/rush +- bash & basic support for +- File.append +- list of entries/files/dirs +- support for efficient copy for Local and SSH storages + +### v 0.2 (not started) + +- efficient (not copy/destroy) versions of move_to, rename +- glob search for directories: Dir['**/*.yml'] +- access via attributes and helpers for unix chmod +- add storages: remote FS over HTTP. + +### future + +- add storages: Hadoop DFS, MongoDB, Amazon S3 + +[vfs]: http://github.com/alexeypetrushin/vfs \ No newline at end of file