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