schema_plus 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -4,7 +4,7 @@ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
4
4
  describe 'get_references method' do
5
5
 
6
6
  before(:all) do
7
- @target = ActiveRecord::Migration
7
+ @target = ActiveRecord::Migration.connection
8
8
  @table_name = 'comments'
9
9
  @column_name = 'post_id'
10
10
  @destination_table = 'posts'
@@ -13,4 +13,8 @@ module SchemaPlusHelpers
13
13
  ActiveRecord::Base.connection.adapter_name =~ /^sqlite/i
14
14
  end
15
15
 
16
+ def suppress_messages
17
+ ActiveRecord::Migration.suppress_messages { yield }
18
+ end
19
+
16
20
  end
metadata CHANGED
@@ -1,129 +1,126 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: schema_plus
3
- version: !ruby/object:Gem::Version
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.3
4
5
  prerelease:
5
- version: 0.1.2
6
6
  platform: ruby
7
- authors:
7
+ authors:
8
8
  - Ronen Barzel
9
- - "Micha\xC5\x82 \xC5\x81omnicki"
9
+ - Michał Łomnicki
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
-
14
- date: 2011-08-04 00:00:00 -07:00
15
- default_executable:
16
- dependencies:
17
- - !ruby/object:Gem::Dependency
13
+ date: 2011-09-28 00:00:00.000000000Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
18
16
  name: rails
19
- prerelease: false
20
- requirement: &id001 !ruby/object:Gem::Requirement
17
+ requirement: &69439930 !ruby/object:Gem::Requirement
21
18
  none: false
22
- requirements:
23
- - - ">="
24
- - !ruby/object:Gem::Version
25
- version: "0"
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: '0'
26
23
  type: :runtime
27
- version_requirements: *id001
28
- - !ruby/object:Gem::Dependency
29
- name: valuable
30
24
  prerelease: false
31
- requirement: &id002 !ruby/object:Gem::Requirement
25
+ version_requirements: *69439930
26
+ - !ruby/object:Gem::Dependency
27
+ name: valuable
28
+ requirement: &69439700 !ruby/object:Gem::Requirement
32
29
  none: false
33
- requirements:
34
- - - ">="
35
- - !ruby/object:Gem::Version
36
- version: "0"
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
37
34
  type: :runtime
38
- version_requirements: *id002
39
- - !ruby/object:Gem::Dependency
40
- name: rake
41
35
  prerelease: false
42
- requirement: &id003 !ruby/object:Gem::Requirement
36
+ version_requirements: *69439700
37
+ - !ruby/object:Gem::Dependency
38
+ name: rake
39
+ requirement: &69439390 !ruby/object:Gem::Requirement
43
40
  none: false
44
- requirements:
41
+ requirements:
45
42
  - - ~>
46
- - !ruby/object:Gem::Version
43
+ - !ruby/object:Gem::Version
47
44
  version: 0.8.7
48
45
  type: :development
49
- version_requirements: *id003
50
- - !ruby/object:Gem::Dependency
51
- name: rspec
52
46
  prerelease: false
53
- requirement: &id004 !ruby/object:Gem::Requirement
47
+ version_requirements: *69439390
48
+ - !ruby/object:Gem::Dependency
49
+ name: rspec
50
+ requirement: &69439120 !ruby/object:Gem::Requirement
54
51
  none: false
55
- requirements:
56
- - - ">="
57
- - !ruby/object:Gem::Version
58
- version: "0"
52
+ requirements:
53
+ - - ! '>='
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
59
56
  type: :development
60
- version_requirements: *id004
61
- - !ruby/object:Gem::Dependency
62
- name: pg
63
57
  prerelease: false
64
- requirement: &id005 !ruby/object:Gem::Requirement
58
+ version_requirements: *69439120
59
+ - !ruby/object:Gem::Dependency
60
+ name: pg
61
+ requirement: &69438750 !ruby/object:Gem::Requirement
65
62
  none: false
66
- requirements:
67
- - - ">="
68
- - !ruby/object:Gem::Version
69
- version: "0"
63
+ requirements:
64
+ - - ! '>='
65
+ - !ruby/object:Gem::Version
66
+ version: '0'
70
67
  type: :development
71
- version_requirements: *id005
72
- - !ruby/object:Gem::Dependency
73
- name: mysql
74
68
  prerelease: false
75
- requirement: &id006 !ruby/object:Gem::Requirement
69
+ version_requirements: *69438750
70
+ - !ruby/object:Gem::Dependency
71
+ name: mysql
72
+ requirement: &69438370 !ruby/object:Gem::Requirement
76
73
  none: false
77
- requirements:
78
- - - ">="
79
- - !ruby/object:Gem::Version
80
- version: "0"
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
81
78
  type: :development
82
- version_requirements: *id006
83
- - !ruby/object:Gem::Dependency
84
- name: sqlite3
85
79
  prerelease: false
86
- requirement: &id007 !ruby/object:Gem::Requirement
80
+ version_requirements: *69438370
81
+ - !ruby/object:Gem::Dependency
82
+ name: sqlite3
83
+ requirement: &69437940 !ruby/object:Gem::Requirement
87
84
  none: false
88
- requirements:
89
- - - ">="
90
- - !ruby/object:Gem::Version
91
- version: "0"
85
+ requirements:
86
+ - - ! '>='
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
92
89
  type: :development
93
- version_requirements: *id007
94
- - !ruby/object:Gem::Dependency
95
- name: simplecov
96
90
  prerelease: false
97
- requirement: &id008 !ruby/object:Gem::Requirement
91
+ version_requirements: *69437940
92
+ - !ruby/object:Gem::Dependency
93
+ name: simplecov
94
+ requirement: &69437700 !ruby/object:Gem::Requirement
98
95
  none: false
99
- requirements:
100
- - - ">="
101
- - !ruby/object:Gem::Version
102
- version: "0"
96
+ requirements:
97
+ - - ! '>='
98
+ - !ruby/object:Gem::Version
99
+ version: '0'
103
100
  type: :development
104
- version_requirements: *id008
105
- - !ruby/object:Gem::Dependency
106
- name: simplecov-gem-adapter
107
101
  prerelease: false
108
- requirement: &id009 !ruby/object:Gem::Requirement
102
+ version_requirements: *69437700
103
+ - !ruby/object:Gem::Dependency
104
+ name: simplecov-gem-adapter
105
+ requirement: &69437420 !ruby/object:Gem::Requirement
109
106
  none: false
110
- requirements:
111
- - - ">="
112
- - !ruby/object:Gem::Version
113
- version: "0"
107
+ requirements:
108
+ - - ! '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
114
111
  type: :development
115
- version_requirements: *id009
116
- description: "SchemaPlus is an ActiveRecord extension that provides enhanced capabilities for schema definition and querying, including: enhanced and more DRY index capabilities, support and automation for foreign key constraints, and support for views."
117
- email:
112
+ prerelease: false
113
+ version_requirements: *69437420
114
+ description: ! 'SchemaPlus is an ActiveRecord extension that provides enhanced capabilities
115
+ for schema definition and querying, including: enhanced and more DRY index capabilities,
116
+ support and automation for foreign key constraints, and support for views.'
117
+ email:
118
118
  - ronen@barzel.org
119
119
  - michal.lomnicki@gmail.com
120
120
  executables: []
121
-
122
121
  extensions: []
123
-
124
122
  extra_rdoc_files: []
125
-
126
- files:
123
+ files:
127
124
  - .gitignore
128
125
  - .travis.yml
129
126
  - Gemfile
@@ -131,8 +128,11 @@ files:
131
128
  - README.rdoc
132
129
  - Rakefile
133
130
  - gemfiles/Gemfile.rails-2.3
131
+ - gemfiles/Gemfile.rails-2.3.lock
134
132
  - gemfiles/Gemfile.rails-3.0
133
+ - gemfiles/Gemfile.rails-3.0.lock
135
134
  - gemfiles/Gemfile.rails-3.1
135
+ - gemfiles/Gemfile.rails-3.1.lock
136
136
  - init.rb
137
137
  - lib/schema_plus.rb
138
138
  - lib/schema_plus/active_record/base.rb
@@ -145,7 +145,7 @@ files:
145
145
  - lib/schema_plus/active_record/connection_adapters/schema_statements.rb
146
146
  - lib/schema_plus/active_record/connection_adapters/sqlite3_adapter.rb
147
147
  - lib/schema_plus/active_record/connection_adapters/table_definition.rb
148
- - lib/schema_plus/active_record/migration.rb
148
+ - lib/schema_plus/active_record/foreign_keys.rb
149
149
  - lib/schema_plus/active_record/schema.rb
150
150
  - lib/schema_plus/active_record/schema_dumper.rb
151
151
  - lib/schema_plus/railtie.rb
@@ -165,6 +165,7 @@ files:
165
165
  - spec/models/comment.rb
166
166
  - spec/models/post.rb
167
167
  - spec/models/user.rb
168
+ - spec/rails3_migration_spec.rb
168
169
  - spec/references_spec.rb
169
170
  - spec/schema/auto_schema.rb
170
171
  - spec/schema/core_schema.rb
@@ -177,57 +178,29 @@ files:
177
178
  - spec/support/matchers/reference.rb
178
179
  - spec/support/reference.rb
179
180
  - spec/views_spec.rb
180
- has_rdoc: true
181
181
  homepage: https://github.com/lomba/schema_plus
182
182
  licenses: []
183
-
184
183
  post_install_message:
185
184
  rdoc_options: []
186
-
187
- require_paths:
185
+ require_paths:
188
186
  - lib
189
- required_ruby_version: !ruby/object:Gem::Requirement
187
+ required_ruby_version: !ruby/object:Gem::Requirement
190
188
  none: false
191
- requirements:
192
- - - ">="
193
- - !ruby/object:Gem::Version
194
- version: "0"
195
- required_rubygems_version: !ruby/object:Gem::Requirement
189
+ requirements:
190
+ - - ! '>='
191
+ - !ruby/object:Gem::Version
192
+ version: '0'
193
+ required_rubygems_version: !ruby/object:Gem::Requirement
196
194
  none: false
197
- requirements:
198
- - - ">="
199
- - !ruby/object:Gem::Version
200
- version: "0"
195
+ requirements:
196
+ - - ! '>='
197
+ - !ruby/object:Gem::Version
198
+ version: '0'
201
199
  requirements: []
202
-
203
200
  rubyforge_project: schema_plus
204
- rubygems_version: 1.6.2
201
+ rubygems_version: 1.8.10
205
202
  signing_key:
206
203
  specification_version: 3
207
- summary: Enhances ActiveRecord schema mechanism, including more DRY index creation and support for foreign key constraints and views.
208
- test_files:
209
- - spec/column_spec.rb
210
- - spec/connections/mysql/connection.rb
211
- - spec/connections/mysql2/connection.rb
212
- - spec/connections/postgresql/connection.rb
213
- - spec/connections/sqlite3/connection.rb
214
- - spec/foreign_key_definition_spec.rb
215
- - spec/foreign_key_spec.rb
216
- - spec/index_definition_spec.rb
217
- - spec/index_spec.rb
218
- - spec/migration_spec.rb
219
- - spec/models/comment.rb
220
- - spec/models/post.rb
221
- - spec/models/user.rb
222
- - spec/references_spec.rb
223
- - spec/schema/auto_schema.rb
224
- - spec/schema/core_schema.rb
225
- - spec/schema_dumper_spec.rb
226
- - spec/schema_spec.rb
227
- - spec/spec_helper.rb
228
- - spec/support/helpers.rb
229
- - spec/support/matchers/automatic_foreign_key_matchers.rb
230
- - spec/support/matchers/have_index.rb
231
- - spec/support/matchers/reference.rb
232
- - spec/support/reference.rb
233
- - spec/views_spec.rb
204
+ summary: Enhances ActiveRecord schema mechanism, including more DRY index creation
205
+ and support for foreign key constraints and views.
206
+ test_files: []
@@ -1,220 +0,0 @@
1
- module SchemaPlus::ActiveRecord
2
- # SchemaPlus extends ActiveRecord::Migration with several enhancements. See documentation at Migration::ClassMethods
3
- module Migration
4
- def self.included(base) #:nodoc:
5
- base.extend(ClassMethods)
6
- end
7
-
8
- #
9
- # SchemaPlus extends ActiveRecord::Migration with the following enhancements.
10
- #
11
- module ClassMethods
12
-
13
- # Create a new view, given its name and SQL definition
14
- #
15
- def create_view(view_name, definition)
16
- connection.create_view(view_name, definition)
17
- end
18
-
19
- # Drop the named view
20
- def drop_view(view_name)
21
- connection.drop_view(view_name)
22
- end
23
-
24
- # Define a foreign key constraint. Valid options are :on_update,
25
- # :on_delete, and :deferrable, with values as described at
26
- # ConnectionAdapters::ForeignKeyDefinition
27
- #
28
- # (NOTE: Sqlite3 does not support altering a table to add foreign-key
29
- # constraints; they must be included in the table specification when
30
- # it's created. If you're using Sqlite3, this method will raise an
31
- # error.)
32
- def add_foreign_key(table_name, column_names, references_table_name, references_column_names, options = {})
33
- connection.add_foreign_key(table_name, column_names, references_table_name, references_column_names, options)
34
- end
35
-
36
- # Remove a foreign key constraint
37
- #
38
- # (NOTE: Sqlite3 does not support altering a table to remove
39
- # foreign-key constraints. If you're using Sqlite3, this method will
40
- # raise an error.)
41
- def remove_foreign_key(table_name, foreign_key_name)
42
- connection.remove_foreign_key(table_name, foreign_key_name)
43
- end
44
-
45
- # Enhances ActiveRecord::Migration#add_column to support indexes and foreign keys, with automatic creation
46
- #
47
- # == Indexes
48
- #
49
- # The <tt>:index</tt> option takes a hash of parameters to pass to ActiveRecord::Migration.add_index. Thus
50
- #
51
- # add_column('books', 'isbn', :string, :index => {:name => "ISBN-index", :unique => true })
52
- #
53
- # is equivalent to:
54
- #
55
- # add_column('books', 'isbn', :string)
56
- # add_index('books', ['isbn'], :name => "ISBN-index", :unique => true)
57
- #
58
- #
59
- # In order to support multi-column indexes, an special parameter <tt>:with</tt> may be specified, which takes another column name or an array of column names to include in the index. Thus
60
- #
61
- # add_column('contacts', 'phone_number', :string, :index => { :with => [:country_code, :area_code], :unique => true })
62
- #
63
- # is equivalent to:
64
- #
65
- # add_column('contacts', 'phone_number', :string)
66
- # add_index('contacts', ['phone_number', 'country_code', 'area_code'], :unique => true)
67
- #
68
- #
69
- # Some convenient shorthands are available:
70
- #
71
- # add_column('books', 'isbn', :index => true) # adds index with no extra options
72
- # add_column('books', 'isbn', :index => :unique) # adds index with :unique => true
73
- #
74
- # == Foreign Key Constraints
75
- #
76
- # The +:references+ option takes the name of a table to reference in
77
- # a foreign key constraint. For example:
78
- #
79
- # add_column('widgets', 'color', :integer, :references => 'colors')
80
- #
81
- # is equivalent to
82
- #
83
- # add_column('widgets', 'color', :integer)
84
- # add_foreign_key('widgets', 'color', 'colors', 'id')
85
- #
86
- # The foreign column name defaults to +id+, but a different column
87
- # can be specified using <tt>:references => [table_name,column_name]</tt>
88
- #
89
- # Additional options +:on_update+ and +:on_delete+ can be spcified,
90
- # with values as described at ConnectionAdapters::ForeignKeyDefinition. For example:
91
- #
92
- # add_column('comments', 'post', :integer, :references => 'posts', :on_delete => :cascade)
93
- #
94
- # Global default values for +:on_update+ and +:on_delete+ can be
95
- # specified in SchemaPlus.steup via, e.g., <tt>config.foreign_keys.on_update = :cascade</tt>
96
- #
97
- # == Automatic Foreign Key Constraints
98
- #
99
- # SchemaPlus supports the convention of naming foreign key columns
100
- # with a suffix of +_id+. That is, if you define a column suffixed
101
- # with +_id+, SchemaPlus assumes an implied :references to a table
102
- # whose name is the column name prefix, pluralized. For example,
103
- # these are equivalent:
104
- #
105
- # add_column('posts', 'author_id', :integer)
106
- # add_column('posts', 'author_id', :integer, :references => 'authors')
107
- #
108
- # As a special case, if the column is named 'parent_id', SchemaPlus
109
- # assumes it's a self reference, for a record that acts as a node of
110
- # a tree. Thus, these are equivalent:
111
- #
112
- # add_column('sections', 'parent_id', :integer)
113
- # add_column('sections', 'parent_id', :integer, :references => 'sections')
114
- #
115
- # If the implicit +:references+ value isn't what you want (e.g., the
116
- # table name isn't pluralized), you can explicitly specify
117
- # +:references+ and it will override the implicit value.
118
- #
119
- # If you don't want a foreign key constraint to be created, specify
120
- # <tt>:references => nil</tt>.
121
- # To disable automatic foreign key constraint creation globally, set
122
- # <tt>config.foreign_keys.auto_create = false</tt> in
123
- # SchemaPlus.steup.
124
- #
125
- # == Automatic Foreign Key Indexes
126
- #
127
- # Since efficient use of foreign key constraints requires that the
128
- # referencing column be indexed, SchemaPlus will automatically create
129
- # an index for the column if it created a foreign key. Thus
130
- #
131
- # add_column('widgets', 'color', :integer, :references => 'colors')
132
- #
133
- # is equivalent to:
134
- #
135
- # add_column('widgets', 'color', :integer, :references => 'colors', :index => true)
136
- #
137
- # If you want to pass options to the index, you can explcitly pass
138
- # index options, such as <tt>:index => :unique</tt>.
139
- #
140
- # If you don't want an index to be created, specify
141
- # <tt>:index => nil</tt>.
142
- # To disable automatic foreign key index creation globally, set
143
- # <tt>config.foreign_keys.auto_index = false</tt> in
144
- # SchemaPlus.steup. (*Note*: If you're using MySQL, it will
145
- # automatically create an index for foreign keys if you don't.)
146
- #
147
- def add_column(table_name, column_name, type, options = {})
148
- super
149
- handle_column_options(table_name, column_name, options)
150
- end
151
-
152
- # Enhances ActiveRecord::Migration#change_column to support indexes and foreign keys same as add_column.
153
- def change_column(table_name, column_name, type, options = {})
154
- super
155
- remove_foreign_key_if_exists(table_name, column_name)
156
- handle_column_options(table_name, column_name, options)
157
- end
158
-
159
- # Determines referenced table and column.
160
- # Used in migrations.
161
- #
162
- # If auto_create is true:
163
- # get_references('comments', 'post_id') # => ['posts', 'id']
164
- #
165
- # And if <tt>column_name</tt> is parent_id it references to the same table
166
- # get_references('pages', 'parent_id') # => ['pages', 'id']
167
- #
168
- # If :references option is given, it is used (whether or not auto_create is true)
169
- # get_references('widgets', 'main_page_id', :references => 'pages'))
170
- # # => ['pages', 'id']
171
- #
172
- # Also the referenced id column may be specified:
173
- # get_references('addresses', 'member_id', :references => ['users', 'uuid'])
174
- # # => ['users', 'uuid']
175
- def get_references(table_name, column_name, options = {}, config=nil) #:nodoc:
176
- column_name = column_name.to_s
177
- if options.has_key?(:references)
178
- references = options[:references]
179
- references = [references, :id] unless references.nil? || references.is_a?(Array)
180
- references
181
- elsif (config || SchemaPlus.config).foreign_keys.auto_create? && !ActiveRecord::Schema.defining?
182
- if column_name == 'parent_id'
183
- [table_name, :id]
184
- elsif column_name =~ /^(.*)_id$/
185
- determined_table_name = ActiveRecord::Base.pluralize_table_names ? $1.to_s.pluralize : $1
186
- [determined_table_name, :id]
187
- end
188
- end
189
- end
190
-
191
- protected
192
- def handle_column_options(table_name, column_name, options) #:nodoc:
193
- if references = get_references(table_name, column_name, options)
194
- if index = options.fetch(:index, SchemaPlus.config.foreign_keys.auto_index? && !ActiveRecord::Schema.defining?)
195
- column_index(table_name, column_name, index)
196
- end
197
- add_foreign_key(table_name, column_name, references.first, references.last,
198
- options.reverse_merge(:on_update => SchemaPlus.config.foreign_keys.on_update,
199
- :on_delete => SchemaPlus.config.foreign_keys.on_delete))
200
- elsif options[:index]
201
- column_index(table_name, column_name, options[:index])
202
- end
203
- end
204
-
205
- def column_index(table_name, column_name, options) #:nodoc:
206
- options = {} if options == true
207
- options = { :unique => true } if options == :unique
208
- column_name = [column_name] + Array.wrap(options.delete(:with)).compact
209
- add_index(table_name, column_name, options)
210
- end
211
-
212
- def remove_foreign_key_if_exists(table_name, column_name) #:nodoc:
213
- foreign_keys = ActiveRecord::Base.connection.foreign_keys(table_name.to_s)
214
- fk = foreign_keys.detect { |fk| fk.table_name == table_name.to_s && fk.column_names == Array(column_name).collect(&:to_s) }
215
- remove_foreign_key(table_name, fk.name) if fk
216
- end
217
-
218
- end
219
- end
220
- end