polymorpheus 2.2.0 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +18 -1
- data/lib/polymorpheus.rb +7 -0
- data/lib/polymorpheus/mysql_adapter.rb +14 -24
- data/lib/polymorpheus/mysql_adapter/foreigner_constraints.rb +30 -0
- data/lib/polymorpheus/version.rb +1 -1
- data/polymorpheus.gemspec +1 -2
- data/spec/mysql2_adapter_spec.rb +14 -3
- data/spec/schema_dumper_spec.rb +0 -2
- data/spec/shared_examples.rb +11 -1
- metadata +4 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d0a7b04ed03c563cb471078e8595129ea9e429a7
|
4
|
+
data.tar.gz: 912c0b0dbf5690c3fdf0ae34b62acec60849203b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cb4cb74d2cb1381f91478899fe4a5d4bd9d9b8a522cd6410ef2ddc144c1e3750e46f24006a082bd28b5a3907eae06469e45afc6e0ea75bc1013dd3edb15306a0
|
7
|
+
data.tar.gz: 5d64aae54b033191a7b134c61a7d2bcb2072ba236f2d897021fcb5c71212202c833f02ee873fb38b394be91485b8087e9f40966d360979479020ee6634384d67
|
data/README.md
CHANGED
@@ -5,6 +5,23 @@
|
|
5
5
|
**Polymorphic relationships in Rails that keep your database happy with almost
|
6
6
|
no setup**
|
7
7
|
|
8
|
+
### Installation
|
9
|
+
|
10
|
+
If you are using Bundler, you can add the gem to your Gemfile:
|
11
|
+
|
12
|
+
```ruby
|
13
|
+
# with Rails >= 4.2
|
14
|
+
gem 'polymorpheus'
|
15
|
+
```
|
16
|
+
|
17
|
+
Or:
|
18
|
+
|
19
|
+
```ruby
|
20
|
+
# with Rails < 4.2
|
21
|
+
gem 'foreigner'
|
22
|
+
gem 'polymorpheus'
|
23
|
+
```
|
24
|
+
|
8
25
|
### Background
|
9
26
|
* **What is polymorphism?** [Rails Guides has a great overview of what
|
10
27
|
polymorphic relationships are and how Rails handles them](
|
@@ -196,7 +213,7 @@ pic.polymorpheus.query_condition
|
|
196
213
|
|
197
214
|
* This gem was written by [Barun Singh](https://github.com/barunio)
|
198
215
|
* It uses the [Foreigner gem](https://github.com/matthuhiggins/foreigner) under
|
199
|
-
the hood for
|
216
|
+
the hood for Rails < 4.2.
|
200
217
|
|
201
218
|
polymorpheus is Copyright © 2011-2015 Barun Singh and [WegoWise](
|
202
219
|
http://wegowise.com). It is free software, and may be redistributed under the
|
data/lib/polymorpheus.rb
CHANGED
@@ -23,8 +23,15 @@ module Polymorpheus
|
|
23
23
|
module ConnectionAdapters
|
24
24
|
autoload :SchemaStatements, 'polymorpheus/schema_statements'
|
25
25
|
end
|
26
|
+
|
27
|
+
def self.require_foreigner?
|
28
|
+
!(::ActiveRecord::VERSION::MAJOR >= 4 &&
|
29
|
+
::ActiveRecord::VERSION::MINOR >= 2)
|
30
|
+
end
|
26
31
|
end
|
27
32
|
|
33
|
+
require 'foreigner' if ::Polymorpheus.require_foreigner?
|
34
|
+
|
28
35
|
Polymorpheus::Adapter.register 'mysql2', 'polymorpheus/mysql_adapter'
|
29
36
|
Polymorpheus::Adapter.register 'postgresql', 'polymorpheus/postgresql_adapter'
|
30
37
|
|
@@ -66,19 +66,22 @@ module Polymorpheus
|
|
66
66
|
if options[:unique].present?
|
67
67
|
poly_create_indexes(table, column_names, Array(options[:unique]))
|
68
68
|
end
|
69
|
+
|
69
70
|
column_names.each do |col_name|
|
70
71
|
ref_table, ref_col = columns[col_name].to_s.split('.')
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
72
|
+
fk_options = {
|
73
|
+
:column => col_name,
|
74
|
+
:name => "#{table}_#{col_name}_fk",
|
75
|
+
:primary_key => (ref_col || 'id' )
|
76
|
+
}.merge(generate_constraints(options))
|
77
|
+
add_foreign_key(table, ref_table, fk_options)
|
75
78
|
end
|
76
79
|
end
|
77
80
|
|
78
81
|
def remove_polymorphic_constraints(table, columns, options = {})
|
79
82
|
poly_drop_triggers(table, columns.keys.sort)
|
80
83
|
columns.each do |(col, reference)|
|
81
|
-
remove_foreign_key table, :column => col
|
84
|
+
remove_foreign_key table, :column => col, :name => "#{table}_#{col}_fk"
|
82
85
|
end
|
83
86
|
if options[:unique].present?
|
84
87
|
poly_remove_indexes(table, columns.keys, Array(options[:unique]))
|
@@ -191,26 +194,8 @@ module Polymorpheus
|
|
191
194
|
end
|
192
195
|
|
193
196
|
def generate_constraints(options)
|
194
|
-
|
195
|
-
|
196
|
-
['delete', 'update'].each do |event|
|
197
|
-
option = "on_#{event}".to_sym
|
198
|
-
next unless options.has_key?(option) &&
|
199
|
-
options[option].respond_to?(:to_sym)
|
200
|
-
|
201
|
-
action = case options[option].to_sym
|
202
|
-
when :nullify then 'SET NULL'
|
203
|
-
when :cascade then 'CASCADE'
|
204
|
-
when :restrict then 'RESTRICT'
|
205
|
-
end
|
206
|
-
next unless action
|
207
|
-
|
208
|
-
constraints << "ON #{event.upcase} #{action}"
|
209
|
-
end
|
210
|
-
|
211
|
-
constraints.join(' ')
|
197
|
+
options.slice(:on_delete, :on_update)
|
212
198
|
end
|
213
|
-
|
214
199
|
end
|
215
200
|
end
|
216
201
|
end
|
@@ -223,3 +208,8 @@ end
|
|
223
208
|
rescue
|
224
209
|
end
|
225
210
|
end
|
211
|
+
|
212
|
+
if ::Polymorpheus.require_foreigner?
|
213
|
+
require 'foreigner/connection_adapters/mysql2_adapter'
|
214
|
+
require 'polymorpheus/mysql_adapter/foreigner_constraints'
|
215
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Polymorpheus
|
2
|
+
module ConnectionAdapters
|
3
|
+
module MysqlAdapter
|
4
|
+
def generate_constraints(options)
|
5
|
+
constraints = []
|
6
|
+
|
7
|
+
['delete', 'update'].each do |event|
|
8
|
+
option = "on_#{event}".to_sym
|
9
|
+
next unless options.has_key?(option) &&
|
10
|
+
options[option].respond_to?(:to_sym)
|
11
|
+
|
12
|
+
action = case options[option].to_sym
|
13
|
+
when :nullify then 'SET NULL'
|
14
|
+
when :cascade then 'CASCADE'
|
15
|
+
when :restrict then 'RESTRICT'
|
16
|
+
else
|
17
|
+
fail ArgumentError, <<-EOS
|
18
|
+
'#{options[option]}' is not supported for :on_update or :on_delete.
|
19
|
+
Supported values are: :nullify, :cascade, :restrict
|
20
|
+
EOS
|
21
|
+
end
|
22
|
+
|
23
|
+
constraints << "ON #{event.upcase} #{action}"
|
24
|
+
end
|
25
|
+
|
26
|
+
{ :options => constraints.join(' ') }
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
data/lib/polymorpheus/version.rb
CHANGED
data/polymorpheus.gemspec
CHANGED
@@ -17,8 +17,7 @@ Gem::Specification.new do |s|
|
|
17
17
|
s.extra_rdoc_files = ["README.md", "LICENSE.txt"]
|
18
18
|
s.license = 'MIT'
|
19
19
|
|
20
|
-
s.add_dependency('
|
21
|
-
s.add_dependency('activerecord', '>= 3.2', '< 4.2')
|
20
|
+
s.add_dependency('activerecord', '>= 3.2', '< 5')
|
22
21
|
|
23
22
|
s.add_development_dependency('rake', '~> 10.4.2')
|
24
23
|
s.add_development_dependency('rspec-rails', '~> 2.14.0')
|
data/spec/mysql2_adapter_spec.rb
CHANGED
@@ -1,8 +1,6 @@
|
|
1
1
|
require 'active_record'
|
2
2
|
require 'spec_helper'
|
3
3
|
require 'sql_logger'
|
4
|
-
require 'foreigner'
|
5
|
-
require 'foreigner/connection_adapters/mysql2_adapter'
|
6
4
|
require 'polymorpheus'
|
7
5
|
require 'polymorpheus/trigger'
|
8
6
|
require 'shared_examples'
|
@@ -35,6 +33,12 @@ describe Polymorpheus::ConnectionAdapters::MysqlAdapter do
|
|
35
33
|
def clean_sql(sql_string)
|
36
34
|
sql_string.gsub(/^\n\s*/,'').gsub(/\s*\n\s*$/,'')
|
37
35
|
.gsub(/\n\s*/,"\n").gsub(/\s*$/,"")
|
36
|
+
.gsub('`', '')
|
37
|
+
.gsub(/\ FOREIGN KEY/, "\nFOREIGN KEY")
|
38
|
+
.gsub(/\ REFERENCES/, "\nREFERENCES")
|
39
|
+
.gsub(/\ ON DELETE/, "\nON DELETE")
|
40
|
+
.gsub(/\ ON UPDATE/, "\nON UPDATE")
|
41
|
+
.gsub(/([[:alpha:]])\(/, '\1 (')
|
38
42
|
end
|
39
43
|
|
40
44
|
before do
|
@@ -129,7 +133,14 @@ describe Polymorpheus::ConnectionAdapters::MysqlAdapter do
|
|
129
133
|
ALTER TABLE `pets` ADD CONSTRAINT `pets_kitty_id_fk` FOREIGN KEY (`kitty_id`) REFERENCES `cats`(name) }
|
130
134
|
end
|
131
135
|
|
132
|
-
|
136
|
+
it "#add_polymorphic_constraints raises an argument error" do
|
137
|
+
expect do
|
138
|
+
connection.add_polymorphic_constraints(table, columns, options)
|
139
|
+
end.to raise_error ArgumentError
|
140
|
+
end
|
141
|
+
|
142
|
+
it_behaves_like 'mysql2 add sql for polymorphic triggers'
|
143
|
+
it_behaves_like 'mysql2 remove sql for polymorphic constraints'
|
133
144
|
end
|
134
145
|
|
135
146
|
context "when table and column names combined are very long" do
|
data/spec/schema_dumper_spec.rb
CHANGED
data/spec/shared_examples.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
shared_examples_for
|
1
|
+
shared_examples_for 'mysql2 add sql for polymorphic constraints' do
|
2
2
|
describe "#add_polymorphic_constraints" do
|
3
3
|
before { connection.add_polymorphic_constraints(table, columns, options) }
|
4
4
|
|
@@ -6,7 +6,9 @@ shared_examples_for "mysql2 migration statements" do
|
|
6
6
|
clean_sql(sql.join("\n")).should == clean_sql(full_constraints_sql)
|
7
7
|
end
|
8
8
|
end
|
9
|
+
end
|
9
10
|
|
11
|
+
shared_examples_for 'mysql2 add sql for polymorphic triggers' do
|
10
12
|
describe "#add_polymorphic_triggers" do
|
11
13
|
before { connection.add_polymorphic_triggers(table, columns.keys) }
|
12
14
|
|
@@ -14,7 +16,9 @@ shared_examples_for "mysql2 migration statements" do
|
|
14
16
|
clean_sql(sql.join("\n")).should == clean_sql(trigger_sql)
|
15
17
|
end
|
16
18
|
end
|
19
|
+
end
|
17
20
|
|
21
|
+
shared_examples_for 'mysql2 remove sql for polymorphic constraints' do
|
18
22
|
describe "#remove_polymorphic_constraints" do
|
19
23
|
before { connection.remove_polymorphic_constraints(table, columns, options) }
|
20
24
|
|
@@ -24,6 +28,12 @@ shared_examples_for "mysql2 migration statements" do
|
|
24
28
|
end
|
25
29
|
end
|
26
30
|
|
31
|
+
shared_examples_for "mysql2 migration statements" do
|
32
|
+
it_behaves_like 'mysql2 add sql for polymorphic constraints'
|
33
|
+
it_behaves_like 'mysql2 add sql for polymorphic triggers'
|
34
|
+
it_behaves_like 'mysql2 remove sql for polymorphic constraints'
|
35
|
+
end
|
36
|
+
|
27
37
|
shared_context "columns with short names" do
|
28
38
|
let(:table) { 'pets' }
|
29
39
|
let(:columns) { { 'kitty_id' => 'cats.name', 'dog_id' => 'dogs.id' } }
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: polymorpheus
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Barun Singh
|
@@ -10,20 +10,6 @@ bindir: bin
|
|
10
10
|
cert_chain: []
|
11
11
|
date: 2015-09-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: foreigner
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - ">="
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '0'
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - ">="
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '0'
|
27
13
|
- !ruby/object:Gem::Dependency
|
28
14
|
name: activerecord
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
@@ -33,7 +19,7 @@ dependencies:
|
|
33
19
|
version: '3.2'
|
34
20
|
- - "<"
|
35
21
|
- !ruby/object:Gem::Version
|
36
|
-
version: '
|
22
|
+
version: '5'
|
37
23
|
type: :runtime
|
38
24
|
prerelease: false
|
39
25
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -43,7 +29,7 @@ dependencies:
|
|
43
29
|
version: '3.2'
|
44
30
|
- - "<"
|
45
31
|
- !ruby/object:Gem::Version
|
46
|
-
version: '
|
32
|
+
version: '5'
|
47
33
|
- !ruby/object:Gem::Dependency
|
48
34
|
name: rake
|
49
35
|
requirement: !ruby/object:Gem::Requirement
|
@@ -107,6 +93,7 @@ files:
|
|
107
93
|
- lib/polymorpheus/interface_builder.rb
|
108
94
|
- lib/polymorpheus/interface_builder/association.rb
|
109
95
|
- lib/polymorpheus/mysql_adapter.rb
|
96
|
+
- lib/polymorpheus/mysql_adapter/foreigner_constraints.rb
|
110
97
|
- lib/polymorpheus/postgresql_adapter.rb
|
111
98
|
- lib/polymorpheus/railtie.rb
|
112
99
|
- lib/polymorpheus/schema_dumper.rb
|