Declaratively and iteratively build in-memory archive structures.
Add this line to your application's Gemfile:
gem 'and_feathers'
And then execute:
$ bundle
Or install it yourself as:
$ gem install and_feathers
The examples below focus on specifying an archive's structure using and_feathers
. See:
and_feathers-gzipped_tarball
for notes on writing a.tgz
file to diskand_feathers-zip
for notes on writing a.zip
file to disk
Once you're "inside" and_feathers
, either because you've called AndFeathers.build
or AndFeathers.from_path
, the two main methods you'll call on block parameters are file
and dir
. These, as you might suspect, create file and directory entries, respectively.
The examples below show how you might use these two methods to build up directory structures.
require 'and_feathers'
require 'json'
archive = AndFeathers.build('redis') do |redis|
redis.file('README.md') { "README content" }
redis.file('metadata.json') { JSON.dump({}) }
redis.file('metadata.rb') { "# metadata.rb content" }
redis.dir('attributes') do |attributes|
attributes.file('default.rb') { '# default.rb content' }
end
redis.dir('recipes') do |recipes|
recipes.file('default.rb') { '# default.rb content' }
end
redis.dir('templates') do |templates|
templates.dir('default')
end
end
require 'and_feathers'
archive = AndFeathers.build('rails_app') do |app|
app.file('README.md') { "README content" }
app.file('config/routes.rb') do
"root to: 'public#home'"
end
app.dir('app/controllers') do |controllers|
controllers.file('application_controller.rb') do
"class ApplicationController < ActionController:Base\nend"
end
controllers.file('public_controller.rb') do
"class PublicController < ActionController:Base\nend"
end
end
app.file('app/views/public/home.html.erb')
end
In the example below, we load the fixture directory at spec/fixtures/archiveme
, and then use and_feathers
to perform surgery on the in-memory archive. In particular, we add a test
directory and file to its archive, and update its lib
directory a couple of times.
require 'and_feathers'
archive = AndFeathers.from_path('spec/fixtures/archiveme')
archive.file('test/basic_test.rb') { '# TODO: tests' }
archive.file('lib/archiveme/version.rb') do
"module Archiveme\n VERSION = '1.0.0'\nend"
end
archive.file('lib/archiveme.rb') do
# The Archiveme fixture is a class, but we'll change it to a module
"module Archiveme\nend"
end