# Sample Data Dump

This gem provides:
  - Use cases for sample data dump utility
  - Persistence interface for sample data dump utility

## Usage

1. Create a class that implements the CompressedDumpStorageGateway interface.
2. Create a class that implements the DataStoreGateway interface.
3. Initialize your gateway classes and a Settings class.
4. Pass the gateways and settings to the appropriate command.
5. Use the result to take your next action.

```
settings = SampleDataDump::Settings.new(
  compacted_dump_directory: '/tmp/compacted_dumps',
  config_file_path: 'config/sample_data_dump.yml'
)
local_file_system = SampleDataDump::Gateways::LocalFileSystem.new(settings)
s3_storage = AmazonS3CompressedDumpStorageGateway.new(my_amazon_settings)
postgres_db = PostgresDataStoreGateway.new(my_postgres_settings)

SampleDataDump::Commands::DownloadCompressedDataDumps.new(local_file_system, s3_storage, settings).result.bind do
  SampleDataDump::Commands::DecompressAndLoadSampleDataDumps.new(local_file_system, postgres_db, settings).result
end
```

Some useful source code for creating rake tasks:

```
namespace :sample_data do
  desc 'dumps sample data to files'
  task dump: :environment do
    settings = SampleDataDump::Entities::Settings.new
    local_file_system = SampleDataDump::Gateways::LocalFileSystem.new(settings)
    data_store = MySampleDataDumpDataStore::Gateway.new(ActiveRecord::Base.connection, settings)
    command = SampleDataDump::Commands::DumpSampleDataToFilesAndCompress.new(local_file_system, data_store)
    result = command.result
    puts result.failure if result.failure?
  end

  desc 'uploads compressed sample data files to storage'
  task upload: :environment do
    settings = SampleDataDump::Entities::Settings.new
    local_file_system = SampleDataDump::Gateways::LocalFileSystem.new(settings)
    compressed_dump_storage = MySampleDataRemoteStorage::Gateway.new(ActiveRecord::Base.connection, settings)
    command = SampleDataDump::Commands::UploadCompressedSampleDataDumps.new(local_file_system, compressed_dump_storage)
    result = command.result
    puts result.failure if result.failure?
  end

  desc 'downloads sample data files from storage'
  task download: :environment do
    settings = SampleDataDump::Entities::Settings.new
    local_file_system = SampleDataDump::Gateways::LocalFileSystem.new(settings)
    compressed_dump_storage = MySampleDataRemoteStorage::Gateway.new(ActiveRecord::Base.connection, settings)
    command = SampleDataDump::Commands::DownloadCompressedDataDumps.new(local_file_system, compressed_dump_storage)
    result = command.result
    puts result.failure if result.failure?
  end

  desc 'populates data store from downloaded sample data files'
  task load: :environment do
    settings = SampleDataDump::Entities::Settings.new
    local_file_system = SampleDataDump::Gateways::LocalFileSystem.new(settings)
    data_store = MySampleDataDumpDataStore::Gateway.new(ActiveRecord::Base.connection, settings)
    command = SampleDataDump::Commands::DecompressAndLoadSampleDataDumps.new(local_file_system, data_store)
    result = command.result
    puts result.failure if result.failure?
  end
end
```

## Installation

Add this line to your application's Gemfile:

```ruby
gem 'sample_data_dump', git: 'git@github.com:tricycle/sample_data_dump.git'
```

And then execute:

    $ bundle install