Sutto-reversible_data 0.0.4 → 0.0.5

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.
@@ -17,12 +17,35 @@ module ReversibleData
17
17
  Table.known_models[name]
18
18
  end
19
19
 
20
+ def self.remove(name)
21
+ table = self[name]
22
+ table.down!
23
+ table.destroy
24
+ end
25
+
26
+ def self.remove_all
27
+ Table.known_models.each_value do |t|
28
+ t.down!
29
+ t.destroy
30
+ end
31
+ end
32
+
20
33
  def self.manager_for(*tables)
21
34
  TableManager.new(*tables)
22
35
  end
23
36
 
24
37
  def self.in_memory!
25
- ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :dbfile => ":memory:")
38
+ if connected?
39
+ ActiveRecord::Base.connection.disconnect!
40
+ ActiveRecord::Base.remove_connection
41
+ end
42
+ ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
43
+ end
44
+
45
+ def self.connected?
46
+ ActiveRecord::Base.connection.active?
47
+ rescue ActiveRecord::ConnectionNotEstablished
48
+ false
26
49
  end
27
50
 
28
51
  end
@@ -4,40 +4,60 @@ module ReversibleData
4
4
  cattr_accessor :known_models
5
5
  self.known_models = {}
6
6
 
7
- attr_accessor :table_name, :model_name, :options
7
+ attr_accessor :name, :table_name, :model_name, :options
8
8
 
9
- def initialize(table_name, opts = {}, &blk)
10
- @table_name = table_name.to_s.tableize.to_sym
11
- @model_name = (opts[:class_name] || @table_name).to_s.classify
9
+ def initialize(name, opts = {}, &blk)
10
+ @name = name.to_s.underscore.to_sym
11
+ @table_name = (opts[:table_name] || @name.to_s.tableize).to_s
12
+ @model_name = (opts[:class_name] || @name.to_s.classify).to_s
12
13
  @migrator = blk
13
14
  @model_definition = nil
14
- default_options = {:skip_model => Object.const_defined?(@model_name), :skip_table => connection.table_exists?(@table_name)}
15
+ default_options = {:skip_model => Object.const_defined?(@model_name),
16
+ :skip_table => (connected? && connection.table_exists?(@table_name))}
15
17
  @options = opts.reverse_merge(default_options)
16
18
  @blueprint = nil
17
- self.known_models[table_name.to_sym] = self
19
+ self.known_models[@name] = self
20
+ end
21
+
22
+ def skip_model?
23
+ !!@options[:skip_model]
24
+ end
25
+
26
+ def skip_table?
27
+ !!@options[:skip_table]
28
+ end
29
+
30
+ def up!
31
+ create_table
32
+ create_model
33
+ end
34
+
35
+ def down!
36
+ remove_model
37
+ drop_table
18
38
  end
19
39
 
20
40
  def drop_table
21
- return if @options[:skip_table]
41
+ return if skip_table? || !connected?
22
42
  connection.drop_table(@table_name) if connection.table_exists?(@table_name)
23
43
  end
24
44
 
25
45
  def create_table(autodrop = true)
26
- return if @options[:skip_table]
46
+ return if skip_table? || !connected?
27
47
  drop_table if autodrop
28
48
  return if connection.table_exists?(@table_name)
29
49
  connection.create_table(table_name, &@migrator)
30
50
  end
31
51
 
32
52
  def remove_model
33
- return if @options[:skip_model]
53
+ return if skip_model?
34
54
  if Object.const_defined?(@model_name)
35
55
  silence_warnings { Object.send(:remove_const, @model_name) }
36
56
  end
37
57
  end
38
58
 
39
59
  def create_model(autoremove = true)
40
- return if @options[:skip_model]
60
+ return if skip_model?
41
61
  remove_model if autoremove
42
62
  return if Object.const_defined?(@model_name)
43
63
  @model = Class.new(ActiveRecord::Base)
@@ -59,7 +79,7 @@ module ReversibleData
59
79
  end
60
80
 
61
81
  def destroy
62
- self.known_models[@table_name] = nil
82
+ self.known_models.delete(@name)
63
83
  end
64
84
 
65
85
  protected
@@ -68,5 +88,9 @@ module ReversibleData
68
88
  ActiveRecord::Base.connection
69
89
  end
70
90
 
91
+ def connected?
92
+ ReversibleData.connected?
93
+ end
94
+
71
95
  end
72
96
  end
@@ -1,32 +1,30 @@
1
1
  module ReversibleData
2
2
  class TableManager
3
3
 
4
- def initialize(*names)
5
- @names = names.map { |n| n.to_s.tableize.to_sym }
4
+ attr_reader :managed_tables
5
+
6
+ def initialize(*managed_tables)
7
+ @managed_tables = managed_tables.map { |n| n.to_sym }.freeze
6
8
  end
7
9
 
8
10
  def up!
9
- @names.each do |name|
10
- unless (table = table_for(name)).nil?
11
- table.create_table
12
- table.create_model
13
- end
11
+ @managed_tables.each do |name|
12
+ table = table_for(name)
13
+ table.up! unless table.nil?
14
14
  end
15
15
  end
16
16
 
17
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
18
+ @managed_tables.each do |name|
19
+ table = table_for(name)
20
+ table.down! unless table.nil?
23
21
  end
24
22
  end
25
23
 
26
24
  protected
27
25
 
28
26
  def table_for(name)
29
- Table.known_models[name.to_sym]
27
+ Table.known_models[name]
30
28
  end
31
29
 
32
30
  end
@@ -0,0 +1,47 @@
1
+ require 'test_helper'
2
+
3
+ class ReversibleDataTest < Test::Unit::TestCase
4
+
5
+ should 'have add as a shortcut to Table.new' do
6
+ mock(ReversibleData::Table).new(:awesome, {})
7
+ ReversibleData.add(:awesome)
8
+ mock(ReversibleData::Table).new(:rocket, :table_name => "awesomesauces")
9
+ ReversibleData.add(:rocket, :table_name => "awesomesauces")
10
+ end
11
+
12
+ should 'have [] as a shortcut to find' do
13
+ mock(ReversibleData::Table.known_models)[:awesome]
14
+ ReversibleData[:awesome]
15
+ end
16
+
17
+ should 'have remove to remove a specific table' do
18
+ ReversibleData.add(:awesome) { |t| t.string :name }
19
+ assert !ReversibleData[:awesome].nil?
20
+ ReversibleData.remove(:awesome)
21
+ assert ReversibleData[:awesome].nil?
22
+ end
23
+
24
+ should 'let you remove all definitions with remove_all' do
25
+ ReversibleData.add(:awesome) { |t| t.string :name }
26
+ ReversibleData.add(:ninjas) { |t| t.string :name }
27
+ assert !ReversibleData[:awesome].nil?
28
+ assert !ReversibleData[:ninjas].nil?
29
+ ReversibleData.remove_all
30
+ assert ReversibleData[:awesome].nil?
31
+ assert ReversibleData[:ninjas].nil?
32
+ end
33
+
34
+ should 'let you create a Table Manager with manager_for' do
35
+ ReversibleData.add(:awesome) { |t| t.string :name }
36
+ ReversibleData.add(:ninjas) { |t| t.string :name }
37
+ mock(ReversibleData::TableManager).new(:awesome, :ninjas)
38
+ ReversibleData.manager_for(:awesome, :ninjas)
39
+ end
40
+
41
+ should 'let you establish an in-memory connection' do
42
+ assert !ReversibleData.connected?
43
+ ReversibleData.in_memory!
44
+ assert ReversibleData.connected?
45
+ end
46
+
47
+ end
@@ -0,0 +1,28 @@
1
+ require 'test_helper'
2
+
3
+ class TableManagerTest < Test::Unit::TestCase
4
+ context 'table managers in general' do
5
+
6
+ setup do
7
+ @table_a = ReversibleData.add(:a) { |t| t.string :name }
8
+ @table_b = ReversibleData.add(:b) { |t| t.string :name }
9
+ @table_c = ReversibleData.add(:c) { |t| t.string :name }
10
+ @manager = ReversibleData::TableManager.new(:a, :b, :c)
11
+ end
12
+
13
+ should 'let you create a manager for a set of tables' do
14
+ assert_equal [:a, :b, :c], @manager.managed_tables
15
+ end
16
+
17
+ should 'let you run up! on all managed tables' do
18
+ [@table_a, @table_b, @table_c].each { |t| mock(t).up! }
19
+ @manager.up!
20
+ end
21
+
22
+ should 'let you run down! on all managed tables' do
23
+ [@table_a, @table_b, @table_c].each { |t| mock(t).down! }
24
+ @manager.down!
25
+ end
26
+
27
+ end
28
+ end
@@ -0,0 +1,113 @@
1
+ require 'test_helper'
2
+
3
+ class TableTest < Test::Unit::TestCase
4
+ context '' do
5
+
6
+ setup { ReversibleData.in_memory! }
7
+
8
+ teardown { ReversibleData.remove_all }
9
+
10
+ should 'automatically add it to a list of known models' do
11
+ table = ReversibleData::Table.new(:user) { |t| t.string :name }
12
+ assert_equal table, ReversibleData::Table.known_models[:user]
13
+ end
14
+
15
+ should 'default the table name' do
16
+ table = ReversibleData::Table.new(:user) { |t| t.string :name }
17
+ assert_equal "users", table.table_name
18
+ table = ReversibleData::Table.new(:users) { |t| t.string :name }
19
+ assert_equal "users", table.table_name
20
+ end
21
+
22
+ should 'default the model class name' do
23
+ table = ReversibleData::Table.new(:user) { |t| t.string :name }
24
+ assert_equal "User", table.model_name
25
+ table = ReversibleData::Table.new(:users) { |t| t.string :name }
26
+ assert_equal "User", table.model_name
27
+ end
28
+
29
+ should 'let you override the table name' do
30
+ table = ReversibleData::Table.new(:user, :table_name => "awesomesauce") { |t| t.string :name }
31
+ assert_equal "awesomesauce", table.table_name
32
+ end
33
+
34
+ should 'let you override the model class name' do
35
+ table = ReversibleData::Table.new(:user, :class_name => "Ninja") { |t| t.string :name }
36
+ assert_equal "Ninja", table.model_name
37
+ end
38
+
39
+ should 'let you skip creating the model' do
40
+ table = ReversibleData::Table.new(:user, :skip_model => true) { |t| t.string :name }
41
+ table.create_model
42
+ assert !defined?(User)
43
+ end
44
+
45
+ should 'let you skip creating the table' do
46
+ table = ReversibleData::Table.new(:user, :skip_table => true) { |t| t.string :name }
47
+ table.create_table
48
+ assert !ActiveRecord::Base.connection.table_exists?(:users)
49
+ end
50
+
51
+ should 'let you create the table' do
52
+ table = ReversibleData::Table.new(:user) { |t| t.string :name }
53
+ table.create_table
54
+ assert ActiveRecord::Base.connection.table_exists?(:users)
55
+ end
56
+
57
+ should 'let you drop the table' do
58
+ table = ReversibleData::Table.new(:user) { |t| t.string :name }
59
+ table.create_table
60
+ table.drop_table
61
+ assert !ActiveRecord::Base.connection.table_exists?(:users)
62
+ end
63
+
64
+ should 'let you create the model' do
65
+ assert !defined?(::User)
66
+ table = ReversibleData::Table.new(:user) { |t| t.string :name }
67
+ table.create_model
68
+ assert defined?(::User)
69
+ end
70
+
71
+ should 'let you remove the model' do
72
+ assert !defined?(::User)
73
+ table = ReversibleData::Table.new(:user) { |t| t.string :name }
74
+ table.create_model
75
+ table.remove_model
76
+ assert !defined?(::User)
77
+ end
78
+
79
+ should 'let you call up! to create the table and the model'
80
+
81
+ should 'let you call down! to clean up'
82
+
83
+ should 'default to skipping model if the constant exists' do
84
+ ::Awesome = true
85
+ table = ReversibleData::Table.new(:awesome)
86
+ assert table.skip_model?
87
+ Object.send(:remove_const, :Awesome)
88
+ end
89
+
90
+ should 'default to skipping the table if connected and the table exists' do
91
+ ActiveRecord::Base.connection.create_table(:ninjas) { |t| t.string :name }
92
+ table = ReversibleData::Table.new(:ninja)
93
+ assert table.skip_table?
94
+ ActiveRecord::Base.connection.drop_table(:ninjas)
95
+ end
96
+
97
+ should 'let you define a model block' do
98
+ table = ReversibleData::Table.new(:ninja)
99
+ table.define_model do
100
+ cattr_accessor :ninjariffic
101
+ self.ninjariffic = "felafel"
102
+ end
103
+ table.create_model
104
+ assert Ninja.respond_to?(:ninjariffic)
105
+ assert Ninja.respond_to?(:ninjariffic=)
106
+ assert_equal "felafel", Ninja.ninjariffic
107
+ table.remove_model
108
+ end
109
+
110
+ should 'let you specify a blueprint for machinist'
111
+
112
+ end
113
+ end
@@ -0,0 +1,10 @@
1
+ require 'rubygems'
2
+ require 'test/unit'
3
+ require 'shoulda'
4
+ require 'rr'
5
+ require 'redgreen'
6
+ require 'reversible_data'
7
+
8
+ class Test::Unit::TestCase
9
+ include RR::Adapters::TestUnit
10
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: Sutto-reversible_data
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Darcy Laycock
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-08-05 00:00:00 -07:00
12
+ date: 2009-08-06 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -27,6 +27,10 @@ files:
27
27
  - lib/reversible_data/table.rb
28
28
  - lib/reversible_data/table_manager.rb
29
29
  - lib/reversible_data.rb
30
+ - test/reversible_data_test.rb
31
+ - test/table_manager_test.rb
32
+ - test/table_test.rb
33
+ - test/test_helper.rb
30
34
  has_rdoc: false
31
35
  homepage: http://sutto.net/
32
36
  licenses: