Sutto-reversible_data 0.0.1
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/lib/reversible_data/shoulda_macros.rb +14 -0
- data/lib/reversible_data/table.rb +65 -0
- data/lib/reversible_data/table_manager.rb +33 -0
- data/lib/reversible_data.rb +24 -0
- metadata +58 -0
@@ -0,0 +1,14 @@
|
|
1
|
+
module ReversibleData
|
2
|
+
module ShouldaMacros
|
3
|
+
|
4
|
+
def with_tables(*args, &blk)
|
5
|
+
table_manager = ReversibleData.manager_for(*args)
|
6
|
+
context '' do
|
7
|
+
setup { table_manager.up! }
|
8
|
+
context('', &blk)
|
9
|
+
teardown { table_manager.down! }
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module ReversibleData
|
2
|
+
class Table
|
3
|
+
|
4
|
+
cattr_accessor :known_models
|
5
|
+
self.known_models = {}
|
6
|
+
|
7
|
+
attr_accessor :table_name, :model_name, :options
|
8
|
+
|
9
|
+
def initialize(table_name, model_name = nil, opts = {}, &blk)
|
10
|
+
@table_name = table_name.to_s.tableize.to_sym
|
11
|
+
@model_name = (model_name || @table_name).to_s.classify
|
12
|
+
@migrator = blk
|
13
|
+
@model_definition = nil
|
14
|
+
@options = opts
|
15
|
+
self.known_models[table_name.to_sym] = self
|
16
|
+
end
|
17
|
+
|
18
|
+
def drop_table
|
19
|
+
return if @options[:skip_model]
|
20
|
+
connection.drop_table(@table_name) if connection.table_exists?(@table_name)
|
21
|
+
end
|
22
|
+
|
23
|
+
def create_table(autodrop = true)
|
24
|
+
return if @options[:skip_table]
|
25
|
+
drop_table if autodrop
|
26
|
+
return if connection.table_exists?(@table_name)
|
27
|
+
connection.create_table(table_name, &blk)
|
28
|
+
end
|
29
|
+
|
30
|
+
def remove_model
|
31
|
+
return if @options[:skip_model]
|
32
|
+
if Object.const_defined?(@model_name)
|
33
|
+
silence_warnings { Object.send(:remove_const, @model_name) }
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def create_model(autoremove = true)
|
38
|
+
return if @options[:skip_model]
|
39
|
+
remove_model if autoremove
|
40
|
+
return if Object.const_defined?(@model_name)
|
41
|
+
@model = Class.new(ActiveRecord::Base)
|
42
|
+
@model.class_eval(&@model_definition) unless @model_definition.nil?
|
43
|
+
Object.const_set(@model_name, @model)
|
44
|
+
end
|
45
|
+
|
46
|
+
def define_model(&blk)
|
47
|
+
@model_definition = blk unless blk.nil?
|
48
|
+
end
|
49
|
+
|
50
|
+
def clear_model_definition!
|
51
|
+
@model_definition = nil
|
52
|
+
end
|
53
|
+
|
54
|
+
def destroy
|
55
|
+
self.known_models[@table_name] = nil
|
56
|
+
end
|
57
|
+
|
58
|
+
protected
|
59
|
+
|
60
|
+
def connection
|
61
|
+
ActiveRecord::Base.connection
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module ReversibleData
|
2
|
+
class TableManager
|
3
|
+
|
4
|
+
def initialize(*names)
|
5
|
+
@names = names.map { |n| n.to_s.tableize.to_sym }
|
6
|
+
end
|
7
|
+
|
8
|
+
def up!
|
9
|
+
@names.each do |name|
|
10
|
+
unless (table = table_for(name)).nil?
|
11
|
+
table.create_table
|
12
|
+
table.create_model
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def down!
|
18
|
+
@names.each do |name|
|
19
|
+
unless (table = table_for(name)).nil?
|
20
|
+
table.drop_table
|
21
|
+
table.remove_model
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
protected
|
27
|
+
|
28
|
+
def table_for(name)
|
29
|
+
Table.known_models[name.to_sym]
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
$:.unshift File.dirname(__FILE__)
|
2
|
+
|
3
|
+
require 'active_support'
|
4
|
+
require 'active_record'
|
5
|
+
|
6
|
+
module ReversibleData
|
7
|
+
|
8
|
+
autoload :Table, 'reversible_data/table'
|
9
|
+
autoload :TableManager, 'reversible_data/table_manager'
|
10
|
+
autoload :ShouldaMacros, 'reversible_data/shoulda_macros'
|
11
|
+
|
12
|
+
def self.add(name, model_name = nil, &blk)
|
13
|
+
Table.new(name, model_name, &blk)
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.manager_for(*tables)
|
17
|
+
TableManager.new(*tables)
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.in_memory!
|
21
|
+
ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :dbfile => ":memory:")
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
metadata
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: Sutto-reversible_data
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Darcy Laycock
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-08-05 00:00:00 -07:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description:
|
17
|
+
email: sutto@sutto.net
|
18
|
+
executables: []
|
19
|
+
|
20
|
+
extensions: []
|
21
|
+
|
22
|
+
extra_rdoc_files: []
|
23
|
+
|
24
|
+
files:
|
25
|
+
- lib/reversible_data
|
26
|
+
- lib/reversible_data/shoulda_macros.rb
|
27
|
+
- lib/reversible_data/table.rb
|
28
|
+
- lib/reversible_data/table_manager.rb
|
29
|
+
- lib/reversible_data.rb
|
30
|
+
has_rdoc: false
|
31
|
+
homepage: http://sutto.net/
|
32
|
+
licenses:
|
33
|
+
post_install_message:
|
34
|
+
rdoc_options: []
|
35
|
+
|
36
|
+
require_paths:
|
37
|
+
- lib
|
38
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
39
|
+
requirements:
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: "0"
|
43
|
+
version:
|
44
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - ">="
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: "0"
|
49
|
+
version:
|
50
|
+
requirements: []
|
51
|
+
|
52
|
+
rubyforge_project:
|
53
|
+
rubygems_version: 1.3.5
|
54
|
+
signing_key:
|
55
|
+
specification_version: 3
|
56
|
+
summary: Reversible Data provides migration-like functionality for tests etc - All with temporary models.
|
57
|
+
test_files: []
|
58
|
+
|