Skip to content

a0s/separatum

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

13 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

(WIP) Separatum

Extract and transfer linked objects from one database into another.

How you can use it

  • Making seeds.rb as copy of production data for testing purposes
  • Making separate database for AB-testing (performance or marketing purposes)
  • Checking your data logical structure (it will raise on broken or unexisting links)
  • Freeze state of a set of objects in time and export them as Object.create ruby-code

UUID

It is better if you are using UUID primary key in every table you want to extract. This will allow you to avoid problems (with primary keys and sequences) during importing objects into a new database. Also UuidChanger can help you avoid collisions in case of importing same objects more than one time in the same database.

Examples

gem install separatum
require 'separatum'

Extract and export

Build new exporter

exporter = Separatum.build do
  use Separatum::Importers::ActiveRecord  # We are going to crawl ActiveRecord objects  
  use Separatum::Processors::UuidChanger  # Hide production's UUIDs with no broken links 
  use Separatum::Exporters::JsonFile, file_name: 'separate.json' # Export object to json file                                      
end

Define start object and extract all linked records into separate.json file

start_object = User.find('any_uuid_from_your_table')
exporter.(start_object)

Import into new database

Build new importer

importer = Separatum.build do
  use Separatum::Importers::JsonFile, file_name: 'separate.json' # We are going to import hashed objects from separate.json  
  use Separatum::Exporters::ActiveRecord # Save them (in one transaction for all objects in set)
end

Import records to a database from separate.json file

importer.() # It returns set of persisted objects

Extract and generate ruby code

seeds_generator = Separatum.build do
  use Separatum::Importers::ActiveRecord
  use Separatum::Processors::UuidChanger  
  use Separatum::Exporters::ActiveRecordCode
end

Return generated ruby code for creating objects in a database

start_object = User.find('any_uuid_you_want_to_start_from')
puts seeds_generator.(start_object)

Building parts

Separatum::Importers::ActiveRecord

Parameters:

  • max_depth (default: 3)
  • edge_classes
  • denied_classes
  • denied_class_transitions
  • svg_file_name
  • dot_file_name

Separatum::Importers::JsonFile

Parameters:

  • file_name

Separatum::Processors::FieldChanger

Parameters:

  • 1st/2nd - class and field to change
  • 3rd/4th - class and method that will make transformation
  • 3rd - Proc or Block

Separatum::Exporters::ActiveRecord

Separatum::Exporters::ActiveRecordCode

Parameters:

  • file_name
  • ignore_not_unique_classes

Separatum::Exporters::JsonFile

Parameters:

  • file_name
  • pretty_print

TODO

  • Better README.md :)

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 tags, and push the .gem file to rubygems.org.

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/a0s/separatum.

License

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

About

Extract and transfer linked objects from one database into another.

Resources

License

Stars

Watchers

Forks

Packages

No packages published