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.
@@ -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
+