Stashify

Stashify is a common abstraction to interact with several different storage mediums in a uniform way. Provided in this gem is an implementation of the local filesystem, but other gems provide other implementations.

The uniform nature of these implementations allows results from one be passed to others. This not only affords you flexibility in your implementation and testing, but a simple way of transferring information from one storage provider to another.

Installation

Add this line to your application's Gemfile:

gem 'stashify'

And then execute:

$ bundle install

Or install it yourself as:

$ gem install stashify

Usage

Provided in this gem is an implementation of local storage. Here is an example of how to use that implementation:

> require "stashify/file/local"
=> true
> file = Stashify::File::Local.new(path: "/tmp/foo")
=> #<Stashify::File::Local:0x000055a2a62f53c0 @contents="", @name="foo", @path="/tmp/foo">
> file.contents
=> "1\n"
> file.delete
=> true
> file.write("100")
=> 3
> file.contents
=> "100"
> file.delete
=> 1
> file.exists?
=> false
> require "stashify/directory/local"
> dir = Stashify::Directory::Local.new(path: "/tmp")
> file2 = dir.find("bar")
=> #<Stashify::File::Local:0x000055a2a62ff000 @contents="", @name="bar", @path="/tmp/bar">
> file2.contents
=> "2\n"
> dir.exists?(file.name)
=> false
> dir.write(Stashify::File.new(name: "foo", contents: "1"))
> dir.exists?("foo")
=> true
> dir.find("foo").contents
=> "1"
> dir.exists?("bar")
=> true
> dir.delete("bar")
=> 1
> dir.exists?("bar")
=> false
> subdir = dir.find("foobar")
=> 
#<Stashify::Directory::Local:0x000055a2a5ffb660
...
> subdir.files.map(&:name)
=> ["baz"]
> subfile = subdir.files.first
=> 
#<Stashify::File::Local:0x000055a2a62937b0
...
> subfile.name
=> "baz"
> subfile.contents
=> "3\n"

To interact with Stashify::File implementations is through exists?, contents, write and delete. To interact with Stashify::Directory implementations, use the methods exists?, find, write, delete and files. Regardless of the implementation of Stashify::Directory, find will return and write will take implementations of Stashify::File.

This consistency allows a lot of portability. For instance, pulling in a couple other gems allows you to do cool things like this:

> require "stashify/directory/local"
=> true
> dir = Stashify::Directory::Local.new(path: "/tmp/foobar")
=> 
#<Stashify::Directory::Local:0x0000564d9e8f9f48
...
> dir.files.map(&:name)
=> ["baz"]
> require "stashify/directory/google/cloud/storage"
=> true
> gdir = Stashify::Directory::Google::Cloud::Storage.new(bucket: bucket, path
: "")
=> 
#<Stashify::Directory::Google::Cloud::Storage:0x0000564d9ee87140
...
> gdir.write(dir)
> gdir.files.map(&:name)
=> ["foobar"]
> require "stashify/directory/aws/s3"
=> true
> adir = Stashify::Directory::AWS::S3.new(bucket: bucket, path: "")
=> 
#<Stashify::Directory::AWS::S3:0x0000564da0851580
...
> adir.write(gdir)
> adir.files.map(&:name)
=> ["baz"]

As you can see in the above examples, Stashify::File and Stashify::Directory can be created directly to define in-memory objects. This helps avoid the need to do silly things like write files to disk in order to get them to the desired destination.

Development

After checking out the repo, run bin/setup to install dependencies. Then, run rake spec to run the tests. You can also run bin/console for an interactive prompt that will allow you to experiment.

To install this gem onto your local machine, run bundle exec rake install. To release a new version, update the version number in version.rb, and then run bundle exec rake release, which will create a git tag for the version, push git commits and the created tag, and push the .gem file to rubygems.org.

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/stashify. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the code of conduct.

If you wish to create an implementation for a new provider, the gem stashify-contract provides shared examples which verifies the consistency which maintains portability. To have your gem included in the list above, it must implement these examples in the way documented in that gem.

License

The gem is available as open source under the terms of the MIT License.

Code of Conduct

Everyone interacting in the Stashify project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the code of conduct.