data_transformation 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +7 -0
- data/.rvmrc +1 -0
- data/Gemfile +4 -0
- data/README +7 -0
- data/Rakefile +5 -0
- data/data_transformation.gemspec +28 -0
- data/lib/data_transformation/transformation.rb +9 -0
- data/lib/data_transformation/transformer.rb +37 -0
- data/lib/data_transformation/version.rb +3 -0
- data/lib/data_transformation.rb +11 -0
- data/lib/generators/data_transformation/USAGE +11 -0
- data/lib/generators/data_transformation/data_transformation_generator.rb +24 -0
- data/lib/generators/data_transformation/templates/transform.rb +4 -0
- data/lib/tasks/data_transformations.rake +46 -0
- data/spec/data_transformation_spec.rb +20 -0
- data/spec/database.yml +3 -0
- data/spec/db/migrate/123_create_person.rb +13 -0
- data/spec/db/transforms/123_change_peeps.rb +6 -0
- data/spec/spec_helper.rb +17 -0
- metadata +127 -0
data/.gitignore
ADDED
data/.rvmrc
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
rvm gemset use data_transformation
|
data/Gemfile
ADDED
data/README
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "data_transformation/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "data_transformation"
|
7
|
+
s.version = DataTransformations::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Chris Barton"]
|
10
|
+
s.email = ["cbarton@inigral.com"]
|
11
|
+
s.homepage = "https://github.com/inigral/data_transformation"
|
12
|
+
s.summary = "Rails 3 Data Transformations"
|
13
|
+
s.description = "To keep the necessity of changing data out of migrations, transformations keep track of that"
|
14
|
+
|
15
|
+
s.rubyforge_project = "data_transformation"
|
16
|
+
s.required_rubygems_version = ">= 1.3.6"
|
17
|
+
|
18
|
+
s.files = `git ls-files`.split("\n")
|
19
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
20
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
21
|
+
s.require_path = "lib"
|
22
|
+
|
23
|
+
s.add_dependency "activerecord", "~> 3.0.0"
|
24
|
+
s.add_development_dependency "bundler", "~> 1.0.0"
|
25
|
+
s.add_development_dependency "rspec", "~> 2.5.0"
|
26
|
+
s.add_development_dependency "generator_spec", "~> 0.8.2"
|
27
|
+
s.add_development_dependency "sqlite3"
|
28
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'active_record/migration'
|
2
|
+
|
3
|
+
module DataTransformation
|
4
|
+
class Transformer < ActiveRecord::Migrator
|
5
|
+
class << self
|
6
|
+
def transform(transforms_path, target_version=nil)
|
7
|
+
migrate(transforms_path, target_version)
|
8
|
+
end
|
9
|
+
|
10
|
+
def migrations_paths
|
11
|
+
@migrations_paths ||= ['db/transforms']
|
12
|
+
Array.wrap(@migrations_paths)
|
13
|
+
end
|
14
|
+
|
15
|
+
def migrations_path
|
16
|
+
migrations_paths.first
|
17
|
+
end
|
18
|
+
|
19
|
+
def down
|
20
|
+
raise "Unimplemented as a Transformation"
|
21
|
+
end
|
22
|
+
|
23
|
+
def forward
|
24
|
+
raise "Unimplemented as a Transformation"
|
25
|
+
end
|
26
|
+
|
27
|
+
def rollback
|
28
|
+
raise "Unimplemented as a Transformation"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
def schema_migrations_table_name
|
34
|
+
ActiveRecord::Base.table_name_prefix + "schema_transforms" + ActiveRecord::Base.table_name_suffix
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require "data_transformation/version"
|
2
|
+
require 'data_transformation/transformer'
|
3
|
+
require "data_transformation/transformation"
|
4
|
+
|
5
|
+
module DataTransformation
|
6
|
+
class Railtie < Rails::Railtie
|
7
|
+
rake_tasks do
|
8
|
+
load 'tasks/data_transformations.rake'
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
Description:
|
2
|
+
Stubs out a new database data transformation. Pass the transform name, either
|
3
|
+
CamelCased or under_scored, and an optional list of attribute pairs as arguments.
|
4
|
+
|
5
|
+
A transform class is generated in db/transforms prefixed by a timestamp of the current date and time.
|
6
|
+
|
7
|
+
Example:
|
8
|
+
`rails generate data_transformation PopulateUsers`
|
9
|
+
|
10
|
+
If the current date is May 14, 2008 and the current time 09:09:12, this creates the PopulateUsers transformation
|
11
|
+
db/tranforms/20080514090912_populate_users.rb
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'rails/generators'
|
2
|
+
require 'rails/generators/active_record'
|
3
|
+
require 'fileutils'
|
4
|
+
|
5
|
+
class DataTransformationGenerator < Rails::Generators::NamedBase
|
6
|
+
include Rails::Generators::Migration
|
7
|
+
|
8
|
+
def self.source_root
|
9
|
+
@source_root ||= File.dirname(__FILE__) + '/templates'
|
10
|
+
end
|
11
|
+
|
12
|
+
def create_transform_file
|
13
|
+
create_transforms_folder
|
14
|
+
migration_template "transform.rb", "db/transforms/#{file_name}.rb"
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.next_migration_number(dirname)
|
18
|
+
ActiveRecord::Generators::Base.next_migration_number(dirname)
|
19
|
+
end
|
20
|
+
|
21
|
+
def create_transforms_folder
|
22
|
+
FileUtils.mkdir("db/transforms") unless Dir.exists?("db/transforms")
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
namespace :db do
|
2
|
+
task :load_config => :rails_env do
|
3
|
+
DataTransformation::Transformer.migration_paths = Rails.application.paths['db/transforms'].to_a
|
4
|
+
end
|
5
|
+
|
6
|
+
desc "Transform the database (options: VERSION=x, VERBOSE=false)."
|
7
|
+
task :transform => :environment do
|
8
|
+
module ActiveRecord
|
9
|
+
class Migrator
|
10
|
+
def self.schema_migrations_table_name
|
11
|
+
Base.table_name_prefix + "schema_transforms" + Base.table_name_suffix
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
module ActiveRecord
|
17
|
+
module ConnectionAdapters
|
18
|
+
module SchemaStatements
|
19
|
+
def initialize_schema_migrations_table
|
20
|
+
sm_table = ActiveRecord::Migrator.schema_migrations_table_name
|
21
|
+
|
22
|
+
unless table_exists?(sm_table)
|
23
|
+
create_table(sm_table, :id => false) do |schema_migrations_table|
|
24
|
+
schema_migrations_table.column :version, :string, :null => false
|
25
|
+
end
|
26
|
+
add_index sm_table, :version, :unique => true,
|
27
|
+
:name => "#{Base.table_name_prefix}unique_schema_transforms#{Base.table_name_suffix}"
|
28
|
+
|
29
|
+
# Backwards-compatibility: if we find schema_info, assume we've
|
30
|
+
# migrated up to that point:
|
31
|
+
si_table = Base.table_name_prefix + 'schema_info' + Base.table_name_suffix
|
32
|
+
|
33
|
+
if table_exists?(si_table)
|
34
|
+
old_version = select_value("SELECT version FROM #{quote_table_name(si_table)}").to_i
|
35
|
+
assume_migrated_upto_version(old_version)
|
36
|
+
drop_table(si_table)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
DataTransformation::Transformation.verbose = ENV['VERBOSE'] ? ENV['VERBOSE'] == "true" : true
|
44
|
+
DataTransformation::Transformer.transform('db/transforms/', ENV['VERSION'] ? ENV['VERSION'].to_i : nil)
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class Person < ActiveRecord::Base
|
4
|
+
set_table_name :persons
|
5
|
+
end
|
6
|
+
|
7
|
+
describe DataTransformation do
|
8
|
+
before(:all) do
|
9
|
+
CreatePerson.up
|
10
|
+
end
|
11
|
+
after(:all) do
|
12
|
+
CreatePerson.down
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should transform the data" do
|
16
|
+
Person.first.name.should == "Bob Lee"
|
17
|
+
ChangePeeps.up
|
18
|
+
Person.first.name.should == "George Lee"
|
19
|
+
end
|
20
|
+
end
|
data/spec/database.yml
ADDED
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler'
|
3
|
+
require 'logger'
|
4
|
+
require 'rails/all'
|
5
|
+
require 'rspec'
|
6
|
+
|
7
|
+
require 'data_transformation'
|
8
|
+
require 'generators/data_transformation/data_transformation_generator'
|
9
|
+
|
10
|
+
Dir[File.expand_path(File.dirname(__FILE__) + '/db')+"/*/*.rb"].each { |f| require f}
|
11
|
+
ActiveRecord::Base.logger = Logger.new(File.dirname(__FILE__) + '/debug.log')
|
12
|
+
ActiveRecord::Base.configurations = YAML::load_file(File.dirname(__FILE__) + '/database.yml')
|
13
|
+
ActiveRecord::Base.establish_connection(ENV['DB'] || 'sqlite3')
|
14
|
+
|
15
|
+
RSpec.configure do |config|
|
16
|
+
config.mock_with :rspec
|
17
|
+
end
|
metadata
ADDED
@@ -0,0 +1,127 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: data_transformation
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.2
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Chris Barton
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2011-07-05 00:00:00.000000000 -07:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: activerecord
|
17
|
+
requirement: &2157659100 !ruby/object:Gem::Requirement
|
18
|
+
none: false
|
19
|
+
requirements:
|
20
|
+
- - ~>
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 3.0.0
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: *2157659100
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: bundler
|
28
|
+
requirement: &2157658640 !ruby/object:Gem::Requirement
|
29
|
+
none: false
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 1.0.0
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: *2157658640
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: rspec
|
39
|
+
requirement: &2157658180 !ruby/object:Gem::Requirement
|
40
|
+
none: false
|
41
|
+
requirements:
|
42
|
+
- - ~>
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: 2.5.0
|
45
|
+
type: :development
|
46
|
+
prerelease: false
|
47
|
+
version_requirements: *2157658180
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: generator_spec
|
50
|
+
requirement: &2157657720 !ruby/object:Gem::Requirement
|
51
|
+
none: false
|
52
|
+
requirements:
|
53
|
+
- - ~>
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: 0.8.2
|
56
|
+
type: :development
|
57
|
+
prerelease: false
|
58
|
+
version_requirements: *2157657720
|
59
|
+
- !ruby/object:Gem::Dependency
|
60
|
+
name: sqlite3
|
61
|
+
requirement: &2157657340 !ruby/object:Gem::Requirement
|
62
|
+
none: false
|
63
|
+
requirements:
|
64
|
+
- - ! '>='
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: '0'
|
67
|
+
type: :development
|
68
|
+
prerelease: false
|
69
|
+
version_requirements: *2157657340
|
70
|
+
description: To keep the necessity of changing data out of migrations, transformations
|
71
|
+
keep track of that
|
72
|
+
email:
|
73
|
+
- cbarton@inigral.com
|
74
|
+
executables: []
|
75
|
+
extensions: []
|
76
|
+
extra_rdoc_files: []
|
77
|
+
files:
|
78
|
+
- .gitignore
|
79
|
+
- .rvmrc
|
80
|
+
- Gemfile
|
81
|
+
- README
|
82
|
+
- Rakefile
|
83
|
+
- data_transformation.gemspec
|
84
|
+
- lib/data_transformation.rb
|
85
|
+
- lib/data_transformation/transformation.rb
|
86
|
+
- lib/data_transformation/transformer.rb
|
87
|
+
- lib/data_transformation/version.rb
|
88
|
+
- lib/generators/data_transformation/USAGE
|
89
|
+
- lib/generators/data_transformation/data_transformation_generator.rb
|
90
|
+
- lib/generators/data_transformation/templates/transform.rb
|
91
|
+
- lib/tasks/data_transformations.rake
|
92
|
+
- spec/data_transformation_spec.rb
|
93
|
+
- spec/database.yml
|
94
|
+
- spec/db/migrate/123_create_person.rb
|
95
|
+
- spec/db/transforms/123_change_peeps.rb
|
96
|
+
- spec/spec_helper.rb
|
97
|
+
has_rdoc: true
|
98
|
+
homepage: https://github.com/inigral/data_transformation
|
99
|
+
licenses: []
|
100
|
+
post_install_message:
|
101
|
+
rdoc_options: []
|
102
|
+
require_paths:
|
103
|
+
- lib
|
104
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
111
|
+
none: false
|
112
|
+
requirements:
|
113
|
+
- - ! '>='
|
114
|
+
- !ruby/object:Gem::Version
|
115
|
+
version: 1.3.6
|
116
|
+
requirements: []
|
117
|
+
rubyforge_project: data_transformation
|
118
|
+
rubygems_version: 1.6.2
|
119
|
+
signing_key:
|
120
|
+
specification_version: 3
|
121
|
+
summary: Rails 3 Data Transformations
|
122
|
+
test_files:
|
123
|
+
- spec/data_transformation_spec.rb
|
124
|
+
- spec/database.yml
|
125
|
+
- spec/db/migrate/123_create_person.rb
|
126
|
+
- spec/db/transforms/123_change_peeps.rb
|
127
|
+
- spec/spec_helper.rb
|