schema_plus 0.1.2 → 0.1.3

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 CHANGED
@@ -23,4 +23,3 @@ pkg
23
23
  *.log
24
24
  *.sqlite3
25
25
  Gemfile.lock
26
- gemfiles/*.lock
data/README.rdoc CHANGED
@@ -86,17 +86,21 @@ Here are some examples:
86
86
  t.integer :author_id # automatically references table 'authors', key id
87
87
  t.integer :parent_id # special name parent_id automatically references its own table (for tree nodes)
88
88
  t.integer :author, :references => :authors # non-conventional column name needs :references for a constraint
89
- t.integer :author_id, :refences => :authors # same as automatic behavior
90
- t.integer :author_id, :refences => [:authors, :id] # same as automatic behavior
89
+ t.integer :author_id, :references => :authors # same as automatic behavior
90
+ t.integer :author_id, :references => [:authors, :id] # same as automatic behavior
91
91
  t.integer :author_id, :references => :people # override table name
92
92
  t.integer :author_id, :references => [:people, :ssn] # override table name and key
93
- t.integer :author_id, :referencs => nil # don't create a constraint
94
-
93
+ t.integer :author_id, :references => nil # don't create a constraint
95
94
 
96
95
  You can also modify the behavior using +:on_delete+, +:on_update+, and +:deferrable+
97
96
 
98
97
  t.integer :author_id, :on_delete => :cascade
99
98
 
99
+ SchemaPlus also creates foreign keys when used rails' <tt>t.references</tt>
100
+ or <tt>t.belongs_to</tt>< which take the singular of the referenced table
101
+ name and implicitly create the column suffixed with +_id+, and it accepts
102
+ the same arguments.
103
+
100
104
  The foreign key behavior can be configured globally (see Config) or per-table (see create_table).
101
105
 
102
106
  To examine your foreign key constraints, connection.foreign_keys returns a
@@ -143,14 +147,13 @@ running. Create database user "schema_plus" with permissions for database
143
147
  $ bundle install
144
148
  $ rake postgresql:build_databases
145
149
  $ rake mysql:build_databases
146
- $ ./runspecs --install # do this once to install gem dependencies for all versions (slow)
150
+ $ ./runspecs --install # do this once, it runs 'bundle install' for all versions (slow)
147
151
  $ ./runspecs # as many times as you like
148
152
 
149
153
  See <tt>./runspecs --help</tt> for more options. You can also manually pick a specific version of rails and ruby to use, such as:
150
154
  $ rvm use 1.9.2
151
- $ export SCHEMA_ASSOCIATIONS_RAILS_VERSION=3.1
152
- $ bundle update --local rails mysql2 # different versions of rails require different mysql2's
153
- $ rake spec
155
+ $ export BUNDLE_GEMFILE=gemfiles/Gemfile.rails-3.1
156
+ $ bundle exec rake spec
154
157
 
155
158
  And you can run the specs for a specific adapter:
156
159
  $ rake postgresql:spec # to run postgresql tests only
@@ -0,0 +1,65 @@
1
+ PATH
2
+ remote: /home/snatcher/projects/schema_plus
3
+ specs:
4
+ schema_plus (0.1.3)
5
+ rails
6
+ valuable
7
+
8
+ GEM
9
+ remote: http://rubygems.org/
10
+ specs:
11
+ actionmailer (2.3.14)
12
+ actionpack (= 2.3.14)
13
+ actionpack (2.3.14)
14
+ activesupport (= 2.3.14)
15
+ rack (~> 1.1.0)
16
+ activerecord (2.3.14)
17
+ activesupport (= 2.3.14)
18
+ activeresource (2.3.14)
19
+ activesupport (= 2.3.14)
20
+ activesupport (2.3.14)
21
+ diff-lcs (1.1.3)
22
+ multi_json (1.0.3)
23
+ mysql (2.8.1)
24
+ mysql2 (0.2.13)
25
+ pg (0.11.0)
26
+ rack (1.1.2)
27
+ rails (2.3.14)
28
+ actionmailer (= 2.3.14)
29
+ actionpack (= 2.3.14)
30
+ activerecord (= 2.3.14)
31
+ activeresource (= 2.3.14)
32
+ activesupport (= 2.3.14)
33
+ rake (>= 0.8.3)
34
+ rake (0.8.7)
35
+ rspec (2.6.0)
36
+ rspec-core (~> 2.6.0)
37
+ rspec-expectations (~> 2.6.0)
38
+ rspec-mocks (~> 2.6.0)
39
+ rspec-core (2.6.4)
40
+ rspec-expectations (2.6.0)
41
+ diff-lcs (~> 1.1.2)
42
+ rspec-mocks (2.6.0)
43
+ simplecov (0.5.3)
44
+ multi_json (~> 1.0.3)
45
+ simplecov-html (~> 0.5.3)
46
+ simplecov-gem-adapter (1.0.1)
47
+ simplecov
48
+ simplecov-html (0.5.3)
49
+ sqlite3 (1.3.4)
50
+ valuable (0.9.2)
51
+
52
+ PLATFORMS
53
+ ruby
54
+
55
+ DEPENDENCIES
56
+ mysql
57
+ mysql2 (~> 0.2.7)
58
+ pg
59
+ rails (~> 2.3)
60
+ rake (~> 0.8.7)
61
+ rspec
62
+ schema_plus!
63
+ simplecov
64
+ simplecov-gem-adapter
65
+ sqlite3
@@ -0,0 +1,111 @@
1
+ PATH
2
+ remote: /home/snatcher/projects/schema_plus
3
+ specs:
4
+ schema_plus (0.1.3)
5
+ rails
6
+ valuable
7
+
8
+ GEM
9
+ remote: http://rubygems.org/
10
+ specs:
11
+ abstract (1.0.0)
12
+ actionmailer (3.0.10)
13
+ actionpack (= 3.0.10)
14
+ mail (~> 2.2.19)
15
+ actionpack (3.0.10)
16
+ activemodel (= 3.0.10)
17
+ activesupport (= 3.0.10)
18
+ builder (~> 2.1.2)
19
+ erubis (~> 2.6.6)
20
+ i18n (~> 0.5.0)
21
+ rack (~> 1.2.1)
22
+ rack-mount (~> 0.6.14)
23
+ rack-test (~> 0.5.7)
24
+ tzinfo (~> 0.3.23)
25
+ activemodel (3.0.10)
26
+ activesupport (= 3.0.10)
27
+ builder (~> 2.1.2)
28
+ i18n (~> 0.5.0)
29
+ activerecord (3.0.10)
30
+ activemodel (= 3.0.10)
31
+ activesupport (= 3.0.10)
32
+ arel (~> 2.0.10)
33
+ tzinfo (~> 0.3.23)
34
+ activeresource (3.0.10)
35
+ activemodel (= 3.0.10)
36
+ activesupport (= 3.0.10)
37
+ activesupport (3.0.10)
38
+ arel (2.0.10)
39
+ builder (2.1.2)
40
+ diff-lcs (1.1.3)
41
+ erubis (2.6.6)
42
+ abstract (>= 1.0.0)
43
+ i18n (0.5.0)
44
+ mail (2.2.19)
45
+ activesupport (>= 2.3.6)
46
+ i18n (>= 0.4.0)
47
+ mime-types (~> 1.16)
48
+ treetop (~> 1.4.8)
49
+ mime-types (1.16)
50
+ multi_json (1.0.3)
51
+ mysql (2.8.1)
52
+ mysql2 (0.2.13)
53
+ pg (0.11.0)
54
+ polyglot (0.3.2)
55
+ rack (1.2.4)
56
+ rack-mount (0.6.14)
57
+ rack (>= 1.0.0)
58
+ rack-test (0.5.7)
59
+ rack (>= 1.0)
60
+ rails (3.0.10)
61
+ actionmailer (= 3.0.10)
62
+ actionpack (= 3.0.10)
63
+ activerecord (= 3.0.10)
64
+ activeresource (= 3.0.10)
65
+ activesupport (= 3.0.10)
66
+ bundler (~> 1.0)
67
+ railties (= 3.0.10)
68
+ railties (3.0.10)
69
+ actionpack (= 3.0.10)
70
+ activesupport (= 3.0.10)
71
+ rake (>= 0.8.7)
72
+ rdoc (~> 3.4)
73
+ thor (~> 0.14.4)
74
+ rake (0.8.7)
75
+ rdoc (3.9.4)
76
+ rspec (2.6.0)
77
+ rspec-core (~> 2.6.0)
78
+ rspec-expectations (~> 2.6.0)
79
+ rspec-mocks (~> 2.6.0)
80
+ rspec-core (2.6.4)
81
+ rspec-expectations (2.6.0)
82
+ diff-lcs (~> 1.1.2)
83
+ rspec-mocks (2.6.0)
84
+ simplecov (0.5.3)
85
+ multi_json (~> 1.0.3)
86
+ simplecov-html (~> 0.5.3)
87
+ simplecov-gem-adapter (1.0.1)
88
+ simplecov
89
+ simplecov-html (0.5.3)
90
+ sqlite3 (1.3.4)
91
+ thor (0.14.6)
92
+ treetop (1.4.10)
93
+ polyglot
94
+ polyglot (>= 0.3.1)
95
+ tzinfo (0.3.29)
96
+ valuable (0.9.2)
97
+
98
+ PLATFORMS
99
+ ruby
100
+
101
+ DEPENDENCIES
102
+ mysql
103
+ mysql2 (~> 0.2.7)
104
+ pg
105
+ rails (~> 3.0.0)
106
+ rake (~> 0.8.7)
107
+ rspec
108
+ schema_plus!
109
+ simplecov
110
+ simplecov-gem-adapter
111
+ sqlite3
@@ -1,5 +1,5 @@
1
1
  source "http://rubygems.org"
2
2
 
3
3
  gemspec :path => File.expand_path('../..', __FILE__)
4
- gem "rails", "~> 3.1.0.rc5"
4
+ gem "rails", "~> 3.1"
5
5
  gem "mysql2"
@@ -0,0 +1,123 @@
1
+ PATH
2
+ remote: /home/snatcher/projects/schema_plus
3
+ specs:
4
+ schema_plus (0.1.3)
5
+ rails
6
+ valuable
7
+
8
+ GEM
9
+ remote: http://rubygems.org/
10
+ specs:
11
+ actionmailer (3.1.0)
12
+ actionpack (= 3.1.0)
13
+ mail (~> 2.3.0)
14
+ actionpack (3.1.0)
15
+ activemodel (= 3.1.0)
16
+ activesupport (= 3.1.0)
17
+ builder (~> 3.0.0)
18
+ erubis (~> 2.7.0)
19
+ i18n (~> 0.6)
20
+ rack (~> 1.3.2)
21
+ rack-cache (~> 1.0.3)
22
+ rack-mount (~> 0.8.2)
23
+ rack-test (~> 0.6.1)
24
+ sprockets (~> 2.0.0)
25
+ activemodel (3.1.0)
26
+ activesupport (= 3.1.0)
27
+ bcrypt-ruby (~> 3.0.0)
28
+ builder (~> 3.0.0)
29
+ i18n (~> 0.6)
30
+ activerecord (3.1.0)
31
+ activemodel (= 3.1.0)
32
+ activesupport (= 3.1.0)
33
+ arel (~> 2.2.1)
34
+ tzinfo (~> 0.3.29)
35
+ activeresource (3.1.0)
36
+ activemodel (= 3.1.0)
37
+ activesupport (= 3.1.0)
38
+ activesupport (3.1.0)
39
+ multi_json (~> 1.0)
40
+ arel (2.2.1)
41
+ bcrypt-ruby (3.0.1)
42
+ builder (3.0.0)
43
+ diff-lcs (1.1.3)
44
+ erubis (2.7.0)
45
+ hike (1.2.1)
46
+ i18n (0.6.0)
47
+ mail (2.3.0)
48
+ i18n (>= 0.4.0)
49
+ mime-types (~> 1.16)
50
+ treetop (~> 1.4.8)
51
+ mime-types (1.16)
52
+ multi_json (1.0.3)
53
+ mysql (2.8.1)
54
+ mysql2 (0.3.7)
55
+ pg (0.11.0)
56
+ polyglot (0.3.2)
57
+ rack (1.3.3)
58
+ rack-cache (1.0.3)
59
+ rack (>= 0.4)
60
+ rack-mount (0.8.3)
61
+ rack (>= 1.0.0)
62
+ rack-ssl (1.3.2)
63
+ rack
64
+ rack-test (0.6.1)
65
+ rack (>= 1.0)
66
+ rails (3.1.0)
67
+ actionmailer (= 3.1.0)
68
+ actionpack (= 3.1.0)
69
+ activerecord (= 3.1.0)
70
+ activeresource (= 3.1.0)
71
+ activesupport (= 3.1.0)
72
+ bundler (~> 1.0)
73
+ railties (= 3.1.0)
74
+ railties (3.1.0)
75
+ actionpack (= 3.1.0)
76
+ activesupport (= 3.1.0)
77
+ rack-ssl (~> 1.3.2)
78
+ rake (>= 0.8.7)
79
+ rdoc (~> 3.4)
80
+ thor (~> 0.14.6)
81
+ rake (0.8.7)
82
+ rdoc (3.9.4)
83
+ rspec (2.6.0)
84
+ rspec-core (~> 2.6.0)
85
+ rspec-expectations (~> 2.6.0)
86
+ rspec-mocks (~> 2.6.0)
87
+ rspec-core (2.6.4)
88
+ rspec-expectations (2.6.0)
89
+ diff-lcs (~> 1.1.2)
90
+ rspec-mocks (2.6.0)
91
+ simplecov (0.5.3)
92
+ multi_json (~> 1.0.3)
93
+ simplecov-html (~> 0.5.3)
94
+ simplecov-gem-adapter (1.0.1)
95
+ simplecov
96
+ simplecov-html (0.5.3)
97
+ sprockets (2.0.0)
98
+ hike (~> 1.2)
99
+ rack (~> 1.0)
100
+ tilt (!= 1.3.0, ~> 1.1)
101
+ sqlite3 (1.3.4)
102
+ thor (0.14.6)
103
+ tilt (1.3.3)
104
+ treetop (1.4.10)
105
+ polyglot
106
+ polyglot (>= 0.3.1)
107
+ tzinfo (0.3.29)
108
+ valuable (0.9.2)
109
+
110
+ PLATFORMS
111
+ ruby
112
+
113
+ DEPENDENCIES
114
+ mysql
115
+ mysql2
116
+ pg
117
+ rails (~> 3.1)
118
+ rake (~> 0.8.7)
119
+ rspec
120
+ schema_plus!
121
+ simplecov
122
+ simplecov-gem-adapter
123
+ sqlite3
data/lib/schema_plus.rb CHANGED
@@ -2,7 +2,7 @@ require 'valuable'
2
2
 
3
3
  require 'schema_plus/version'
4
4
  require 'schema_plus/active_record/base'
5
- require 'schema_plus/active_record/migration'
5
+ require 'schema_plus/active_record/foreign_keys'
6
6
  require 'schema_plus/active_record/connection_adapters/table_definition'
7
7
  require 'schema_plus/active_record/connection_adapters/schema_statements'
8
8
  require 'schema_plus/active_record/schema'
@@ -128,7 +128,6 @@ module SchemaPlus
128
128
  @inserted = true
129
129
  insert_connection_adapters
130
130
  ::ActiveRecord::Base.send(:include, SchemaPlus::ActiveRecord::Base)
131
- ::ActiveRecord::Migration.send(:include, SchemaPlus::ActiveRecord::Migration)
132
131
  ::ActiveRecord::Schema.send(:include, SchemaPlus::ActiveRecord::Schema)
133
132
  ::ActiveRecord::SchemaDumper.send(:include, SchemaPlus::ActiveRecord::SchemaDumper)
134
133
  end
@@ -20,16 +20,9 @@ module SchemaPlus
20
20
  public
21
21
 
22
22
  def columns_with_schema_plus #:nodoc:
23
- unless @schema_plus_extended_columns
24
- @schema_plus_extended_columns = true
25
- cols = columns_hash
26
- indexes.each do |index|
27
- index.columns.each do |name|
28
- cols[name].indexes << index
29
- end
30
- end
31
- end
32
- columns_without_schema_plus
23
+ columns = columns_without_schema_plus
24
+ columns.each do |column| column.connection = self end unless @schema_plus_extended_columns
25
+ columns
33
26
  end
34
27
 
35
28
  def reset_column_information_with_schema_plus #:nodoc:
@@ -41,6 +41,7 @@ module SchemaPlus
41
41
  # if that constant exists, then include the patches
42
42
  ::ActiveRecord::ConnectionAdapters::Mysql2IndexDefinition.send(:include, SchemaPlus::ActiveRecord::ConnectionAdapters::IndexDefinition) if defined? ::ActiveRecord::ConnectionAdapters::Mysql2IndexDefinition
43
43
  end
44
+ extend(SchemaPlus::ActiveRecord::ForeignKeys)
44
45
  end
45
46
 
46
47
  # Create a view given the SQL definition
@@ -71,13 +72,22 @@ module SchemaPlus
71
72
 
72
73
  # Define a foreign key constraint. Valid options are :on_update,
73
74
  # :on_delete, and :deferrable, with values as described at
74
- # ForeignKeyDefinition
75
+ # ConnectionAdapters::ForeignKeyDefinition
76
+ #
77
+ # (NOTE: Sqlite3 does not support altering a table to add foreign-key
78
+ # constraints; they must be included in the table specification when
79
+ # it's created. If you're using Sqlite3, this method will raise an
80
+ # error.)
75
81
  def add_foreign_key(table_name, column_names, references_table_name, references_column_names, options = {})
76
82
  foreign_key = ForeignKeyDefinition.new(options[:name], table_name, column_names, ::ActiveRecord::Migrator.proper_table_name(references_table_name), references_column_names, options[:on_update], options[:on_delete], options[:deferrable])
77
83
  execute "ALTER TABLE #{quote_table_name(table_name)} ADD #{foreign_key.to_sql}"
78
84
  end
79
85
 
80
86
  # Remove a foreign key constraint
87
+ #
88
+ # (NOTE: Sqlite3 does not support altering a table to remove
89
+ # foreign-key constraints. If you're using Sqlite3, this method will
90
+ # raise an error.)
81
91
  def remove_foreign_key(table_name, foreign_key_name)
82
92
  execute "ALTER TABLE #{quote_table_name(table_name)} DROP CONSTRAINT #{foreign_key_name}"
83
93
  end
@@ -7,12 +7,13 @@ module SchemaPlus
7
7
  #
8
8
  module Column
9
9
 
10
+ attr_writer :connection # connection gets set by SchemaPlus::ActiveRecord::Base::columns_with_schema_plus
11
+
10
12
  # Returns the list of IndexDefinition instances for each index that
11
13
  # refers to this column. Returns an empty list if there are no
12
14
  # such indexes.
13
15
  def indexes
14
- # list get filled by SchemaPlus::ActiveRecord::Base::columns_with_schema_plus
15
- @indexes ||= []
16
+ @indexes ||= @connection.indexes.select{|index| index.columns.include? self.name}
16
17
  end
17
18
 
18
19
  # If the column is in a unique index, returns a list of names of other columns in