rein 2.1.0 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7a9c78af74657a1a1a30eddab52f82f308dd1a1c
4
- data.tar.gz: 72b3d37a29e6d2384ab7c6bc46268544dc560271
3
+ metadata.gz: a9f1047d5663ba27fedf399e87223e024fe7a6fa
4
+ data.tar.gz: fe37532d4ee714cd1e1fa281611f4ae61cd5561a
5
5
  SHA512:
6
- metadata.gz: 2c0229b55c19e5fded597a3f3d0b8836ba073fac83365efcf88fbe0c2a37ab9cde6989d2db7587fd093316742c5aa4692e383c4bb021edc774596a3cc8cf2a2f
7
- data.tar.gz: 6bc108d82d305dc4115d7944e4dc84aafc789f92ae2d1349b8ed5273b44e4e07492f75e59bfae3c83ee44d38b7d5b30232bcff695207e652157f865cbb846baf
6
+ metadata.gz: b3c700dd2bc15a2edf547ac390ec78e4972bc1bb3c7d4f534a495969d4e2e8b014121f9c11a230e415ba892c0e22a16d62bf391f21c69cf5d88bc7eef3d43f02
7
+ data.tar.gz: 4153810c938897f244d72088e9c0095e99f7f8476c09069f647a4b974d7ad180860d019f6962b3192cf28fa70c2f8a0e549a32f9c6b3cd366d03ca9577bb8d42
data/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 3.0.0
4
+
5
+ - Dropped MySQL support.
6
+ - Reversible migrations.
7
+ - Add `index` option to `add_foreign_key_constraint`.
8
+
3
9
  ## 2.1.0
4
10
 
5
11
  - Add `if` option to inclusion constraints.
data/README.md CHANGED
@@ -12,6 +12,9 @@ database integrity without resorting to hand-crafted SQL. Rein (pronounced
12
12
  "rain") adds a handful of methods to your ActiveRecord migrations so that you
13
13
  can easily tame the data in your database.
14
14
 
15
+ All methods in the DSL are automatically *reversible*, so you can take
16
+ advantage of reversible Rails migrations.
17
+
15
18
  ## Table of contents
16
19
 
17
20
  * [Rein](#rein)
@@ -28,14 +31,30 @@ can easily tame the data in your database.
28
31
  * [Views](#views)
29
32
  * [Schemas](#schemas)
30
33
  * [Example](#example)
31
- * [Contributing](#contributing)
32
34
  * [License](#license)
33
35
 
34
36
  ## Getting started
35
37
 
36
38
  Install the gem:
37
39
 
38
- gem install rein
40
+ ```
41
+ > gem install rein
42
+ ```
43
+
44
+ Add a constraint to your migrations:
45
+
46
+ ```ruby
47
+ class CreateAuthorsTable < ActiveRecord::Migration
48
+ def change
49
+ create_table :authors do |t|
50
+ t.string :name, null: false
51
+ end
52
+
53
+ # An author must have a name.
54
+ add_presence_constraint :authors, :name
55
+ end
56
+ end
57
+ ```
39
58
 
40
59
  ## Constraint types
41
60
 
@@ -51,6 +70,14 @@ For example, let's say that we want to constrain the `author_id` column in the
51
70
  add_foreign_key_constraint :books, :authors
52
71
  ```
53
72
 
73
+ Adding a foreign key doesn't automatically create an index on the referenced
74
+ column. Having an index will generally speed up any joins you perform on the
75
+ foreign key. To create an index you can specify the `index` option:
76
+
77
+ ```ruby
78
+ add_foreign_key_constraint :books, :authors, index: true
79
+ ```
80
+
54
81
  Rein will automatically infer the column names for the tables, but if we need
55
82
  to be explicit we can using the `referenced` and `referencing` options:
56
83
 
@@ -86,8 +113,6 @@ remove_foreign_key_constraint :books, :authors
86
113
 
87
114
  ### Inclusion constraints
88
115
 
89
- *(PostgreSQL only)*
90
-
91
116
  An inclusion constraint specifies the possible values that a column value can
92
117
  take.
93
118
 
@@ -123,8 +148,6 @@ add_inclusion_constraint :books, :state,
123
148
 
124
149
  ### Numericality constraints
125
150
 
126
- *(PostgreSQL only)*
127
-
128
151
  A numericality constraint specifies the range of values that a numeric column
129
152
  value can take.
130
153
 
@@ -173,8 +196,6 @@ remove_numericality_constraint :books, :publication_month
173
196
 
174
197
  ### Presence constraints
175
198
 
176
- *(PostgreSQL only)*
177
-
178
199
  A presence constraint ensures that a string column value is non-empty.
179
200
 
180
201
  A `NOT NULL` constraint will be satisfied by an empty string, but sometimes may
@@ -205,8 +226,6 @@ remove_presence_constraint :books, :title
205
226
 
206
227
  ### Null constraints
207
228
 
208
- *(PostgreSQL only)*
209
-
210
229
  A null constraint ensures that a column does *not* contain a null value. This
211
230
  is the same as adding `NOT NULL` to a column, the difference being that it can
212
231
  be _applied conditionally_.
@@ -228,8 +247,6 @@ remove_null_constraint :books, :due_date
228
247
 
229
248
  ### Enumerated types
230
249
 
231
- *(PostgreSQL only)*
232
-
233
250
  An enum is a data type that represents a static, ordered set of values.
234
251
 
235
252
  ```ruby
@@ -262,8 +279,6 @@ drop_view :available_books
262
279
 
263
280
  ## Schemas
264
281
 
265
- *(PostgreSQL only)*
266
-
267
282
  A database can contain one or more named schemas, which in turn contain tables.
268
283
  Sometimes it might be helpful to split your database into multiple schemas to
269
284
  logically group tables together.
data/lib/rein.rb CHANGED
@@ -1,41 +1,24 @@
1
1
  require "active_record"
2
- require "active_record/connection_adapters/abstract_mysql_adapter"
3
-
4
- require "rein/constraint/options"
5
- require "rein/constraint/primary_key"
6
2
  require "rein/constraint/foreign_key"
7
3
  require "rein/constraint/inclusion"
8
4
  require "rein/constraint/null"
9
5
  require "rein/constraint/numericality"
10
6
  require "rein/constraint/presence"
7
+ require "rein/constraint/primary_key"
8
+ require "rein/schema"
11
9
  require "rein/type/enum"
12
10
  require "rein/view"
13
- require "rein/schema"
14
11
 
15
12
  module ActiveRecord
16
- module ConnectionAdapters # :nodoc:
17
- class MysqlAdapter < AbstractAdapter # :nodoc:
18
- include Rein::Constraint::PrimaryKey
19
- include Rein::Constraint::ForeignKey
20
- include Rein::View
21
- end
22
-
23
- class Mysql2Adapter < AbstractMysqlAdapter # :nodoc:
24
- include Rein::Constraint::PrimaryKey
25
- include Rein::Constraint::ForeignKey
26
- include Rein::View
27
- end
28
-
29
- class PostgreSQLAdapter < AbstractAdapter # :nodoc:
30
- include Rein::Constraint::PrimaryKey
31
- include Rein::Constraint::ForeignKey
32
- include Rein::Constraint::Inclusion
33
- include Rein::Constraint::Null
34
- include Rein::Constraint::Numericality
35
- include Rein::Constraint::Presence
36
- include Rein::Type::Enum
37
- include Rein::View
38
- include Rein::Schema
39
- end
13
+ class Migration # :nodoc:
14
+ include Rein::Constraint::ForeignKey
15
+ include Rein::Constraint::Inclusion
16
+ include Rein::Constraint::Null
17
+ include Rein::Constraint::Numericality
18
+ include Rein::Constraint::Presence
19
+ include Rein::Constraint::PrimaryKey
20
+ include Rein::Schema
21
+ include Rein::Type::Enum
22
+ include Rein::View
40
23
  end
41
24
  end
@@ -1,46 +1,46 @@
1
1
  require "active_support/inflector"
2
+ require "rein/util"
2
3
 
3
4
  module Rein
4
5
  module Constraint
5
6
  # This module contains methods for defining foreign key constraints.
6
7
  module ForeignKey
7
- def add_foreign_key_constraint(referencing_table, referenced_table, options = {})
8
- referencing_attribute = (options[:referencing] || "#{referenced_table.to_s.singularize}_id").to_sym
9
- referenced_attribute = (options[:referenced] || "id").to_sym
8
+ def add_foreign_key_constraint(*args)
9
+ reversible do |dir|
10
+ dir.up { _add_foreign_key_constraint(*args) }
11
+ dir.down { _remove_foreign_key_constraint(*args) }
12
+ end
13
+ end
14
+
15
+ def remove_foreign_key_constraint(*args)
16
+ reversible do |dir|
17
+ dir.up { _remove_foreign_key_constraint(*args) }
18
+ dir.down { _add_foreign_key_constraint(*args) }
19
+ end
20
+ end
10
21
 
11
- name = options[:name] || default_constraint_name(referencing_table, referencing_attribute)
22
+ private
12
23
 
24
+ def _add_foreign_key_constraint(referencing_table, referenced_table, options = {})
25
+ referencing_attribute = (options[:referencing] || "#{referenced_table.to_s.singularize}_id").to_sym
26
+ referenced_attribute = (options[:referenced] || "id").to_sym
27
+ name = Util.constraint_name(referencing_table, referencing_attribute, "fk", options)
13
28
  sql = "ALTER TABLE #{referencing_table}"
14
29
  sql << " ADD CONSTRAINT #{name}"
15
30
  sql << " FOREIGN KEY (#{referencing_attribute})"
16
31
  sql << " REFERENCES #{referenced_table} (#{referenced_attribute})"
17
32
  sql << " ON DELETE #{referential_action(options[:on_delete])}" if options[:on_delete].present?
18
33
  sql << " ON UPDATE #{referential_action(options[:on_update])}" if options[:on_update].present?
19
-
20
34
  execute(sql)
21
-
22
- # A foreign key constraint doesn't have an implicit index.
23
- add_index(referencing_table, referencing_attribute) if options[:add_index] == true
35
+ add_index(referencing_table, referencing_attribute) if options[:index] == true
24
36
  end
25
- alias add_foreign_key add_foreign_key_constraint
26
37
 
27
- def remove_foreign_key_constraint(referencing_table, referenced_table, options = {})
38
+ def _remove_foreign_key_constraint(referencing_table, referenced_table, options = {})
28
39
  referencing_attribute = options[:referencing] || "#{referenced_table.to_s.singularize}_id".to_sym
29
-
30
- name = options[:name] || default_constraint_name(referencing_table, referencing_attribute)
31
-
32
- if mysql_adapter?
33
- execute "ALTER TABLE #{referencing_table} DROP FOREIGN KEY #{name}"
34
- else
35
- execute "ALTER TABLE #{referencing_table} DROP CONSTRAINT #{name}"
36
- end
37
-
38
- # A foreign key constraint doesn't have an implicit index.
39
- remove_index(referencing_table, referencing_attribute) if options[:remove_index] == true
40
+ name = Util.constraint_name(referencing_table, referencing_attribute, "fk", options)
41
+ execute("ALTER TABLE #{referencing_table} DROP CONSTRAINT #{name}")
42
+ remove_index(referencing_table, referencing_attribute) if options[:index] == true
40
43
  end
41
- alias remove_foreign_key remove_foreign_key_constraint
42
-
43
- private
44
44
 
45
45
  def referential_action(action)
46
46
  case action.to_sym
@@ -49,15 +49,10 @@ module Rein
49
49
  when :restrict then "RESTRICT"
50
50
  when :set_null, :nullify then "SET NULL"
51
51
  when :set_default, :default then "SET DEFAULT"
52
- else
53
- raise "Unknown referential action '#{action}'"
52
+ else raise "Unknown referential action '#{action}'"
54
53
  end
55
54
  end
56
55
 
57
- def mysql_adapter?
58
- self.class.to_s =~ /Mysql[2]?Adapter/
59
- end
60
-
61
56
  def default_constraint_name(referencing_table, referencing_attribute)
62
57
  "#{referencing_table}_#{referencing_attribute}_fk".to_sym
63
58
  end
@@ -1,21 +1,36 @@
1
- require "active_record/connection_adapters/abstract/quoting"
1
+ require "rein/util"
2
2
 
3
3
  module Rein
4
4
  module Constraint
5
5
  # This module contains methods for defining inclusion constraints.
6
6
  module Inclusion
7
7
  include ActiveRecord::ConnectionAdapters::Quoting
8
- include Rein::Constraint::Options
9
8
 
10
- def add_inclusion_constraint(table, attribute, options = {})
11
- name = constraint_name(table, attribute, options)
9
+ def add_inclusion_constraint(*args)
10
+ reversible do |dir|
11
+ dir.up { _add_inclusion_constraint(*args) }
12
+ dir.down { _remove_inclusion_constraint(*args) }
13
+ end
14
+ end
15
+
16
+ def remove_inclusion_constraint(*args)
17
+ reversible do |dir|
18
+ dir.up { _remove_inclusion_constraint(*args) }
19
+ dir.down { _add_inclusion_constraint(*args) }
20
+ end
21
+ end
22
+
23
+ private
24
+
25
+ def _add_inclusion_constraint(table, attribute, options = {})
26
+ name = Util.constraint_name(table, attribute, "inclusion", options)
12
27
  values = options[:in].map { |value| quote(value) }.join(", ")
13
- conditions = conditions_with_if("#{attribute} IN (#{values})", options)
28
+ conditions = Util.conditions_with_if("#{attribute} IN (#{values})", options)
14
29
  execute("ALTER TABLE #{table} ADD CONSTRAINT #{name} CHECK (#{conditions})")
15
30
  end
16
31
 
17
- def remove_inclusion_constraint(table, attribute, options = {})
18
- name = constraint_name(table, attribute, options)
32
+ def _remove_inclusion_constraint(table, attribute, options = {})
33
+ name = Util.constraint_name(table, attribute, "inclusion", options)
19
34
  execute("ALTER TABLE #{table} DROP CONSTRAINT #{name}")
20
35
  end
21
36
  end
@@ -1,18 +1,35 @@
1
+ require "rein/util"
2
+
1
3
  module Rein
2
4
  module Constraint
3
5
  # This module contains methods for defining null constraints.
4
6
  module Null
5
7
  include ActiveRecord::ConnectionAdapters::Quoting
6
- include Rein::Constraint::Options
7
8
 
8
- def add_null_constraint(table, attribute, options = {})
9
- name = constraint_name(table, attribute, options)
10
- conditions = conditions_with_if("#{attribute} IS NOT NULL", options)
9
+ def add_null_constraint(*args)
10
+ reversible do |dir|
11
+ dir.up { _add_null_constraint(*args) }
12
+ dir.down { _remove_null_constraint(*args) }
13
+ end
14
+ end
15
+
16
+ def remove_null_constraint(*args)
17
+ reversible do |dir|
18
+ dir.up { _remove_null_constraint(*args) }
19
+ dir.down { _add_null_constraint(*args) }
20
+ end
21
+ end
22
+
23
+ private
24
+
25
+ def _add_null_constraint(table, attribute, options = {})
26
+ name = Util.constraint_name(table, attribute, "null", options)
27
+ conditions = Util.conditions_with_if("#{attribute} IS NOT NULL", options)
11
28
  execute("ALTER TABLE #{table} ADD CONSTRAINT #{name} CHECK (#{conditions})")
12
29
  end
13
30
 
14
- def remove_null_constraint(table, attribute, options = {})
15
- name = constraint_name(table, attribute, options)
31
+ def _remove_null_constraint(table, attribute, options = {})
32
+ name = Util.constraint_name(table, attribute, "null", options)
16
33
  execute("ALTER TABLE #{table} DROP CONSTRAINT #{name}")
17
34
  end
18
35
  end
@@ -1,9 +1,9 @@
1
+ require "rein/util"
2
+
1
3
  module Rein
2
4
  module Constraint
3
5
  # This module contains methods for defining numericality constraints.
4
6
  module Numericality
5
- include Rein::Constraint::Options
6
-
7
7
  OPERATORS = {
8
8
  greater_than: :>,
9
9
  greater_than_or_equal_to: :>=,
@@ -13,21 +13,34 @@ module Rein
13
13
  less_than_or_equal_to: :<=
14
14
  }.freeze
15
15
 
16
- def add_numericality_constraint(table, attribute, options = {})
17
- name = constraint_name(table, attribute, options)
16
+ def add_numericality_constraint(*args)
17
+ reversible do |dir|
18
+ dir.up { _add_numericality_constraint(*args) }
19
+ dir.down { _remove_numericality_constraint(*args) }
20
+ end
21
+ end
22
+
23
+ def remove_numericality_constraint(*args)
24
+ reversible do |dir|
25
+ dir.up { _remove_numericality_constraint(*args) }
26
+ dir.down { _add_numericality_constraint(*args) }
27
+ end
28
+ end
29
+
30
+ private
18
31
 
32
+ def _add_numericality_constraint(table, attribute, options = {})
33
+ name = Util.constraint_name(table, attribute, "numericality", options)
19
34
  conditions = OPERATORS.slice(*options.keys).map do |key, operator|
20
35
  value = options[key]
21
36
  [attribute, operator, value].join(" ")
22
37
  end.join(" AND ")
23
-
24
- conditions = conditions_with_if(conditions, options)
25
-
38
+ conditions = Util.conditions_with_if(conditions, options)
26
39
  execute("ALTER TABLE #{table} ADD CONSTRAINT #{name} CHECK (#{conditions})")
27
40
  end
28
41
 
29
- def remove_numericality_constraint(table, attribute, options = {})
30
- name = constraint_name(table, attribute, options)
42
+ def _remove_numericality_constraint(table, attribute, options = {})
43
+ name = Util.constraint_name(table, attribute, "numericality", options)
31
44
  execute("ALTER TABLE #{table} DROP CONSTRAINT #{name}")
32
45
  end
33
46
  end
@@ -1,21 +1,38 @@
1
+ require "rein/util"
2
+
1
3
  module Rein
2
4
  module Constraint
3
5
  # This module contains methods for defining presence constraints.
4
6
  module Presence
5
7
  include ActiveRecord::ConnectionAdapters::Quoting
6
- include Rein::Constraint::Options
7
8
 
8
- def add_presence_constraint(table, attribute, options = {})
9
- name = constraint_name(table, attribute, options)
10
- conditions = conditions_with_if(
9
+ def add_presence_constraint(*args)
10
+ reversible do |dir|
11
+ dir.up { _add_presence_constraint(*args) }
12
+ dir.down { _remove_presence_constraint(*args) }
13
+ end
14
+ end
15
+
16
+ def remove_presence_constraint(*args)
17
+ reversible do |dir|
18
+ dir.up { _remove_presence_constraint(*args) }
19
+ dir.down { _add_presence_constraint(*args) }
20
+ end
21
+ end
22
+
23
+ private
24
+
25
+ def _add_presence_constraint(table, attribute, options = {})
26
+ name = Util.constraint_name(table, attribute, "presence", options)
27
+ conditions = Util.conditions_with_if(
11
28
  "(#{attribute} IS NOT NULL) AND (#{attribute} !~ '^\\s*$')",
12
29
  options
13
30
  )
14
31
  execute("ALTER TABLE #{table} ADD CONSTRAINT #{name} CHECK (#{conditions})")
15
32
  end
16
33
 
17
- def remove_presence_constraint(table, attribute, options = {})
18
- name = constraint_name(table, attribute, options)
34
+ def _remove_presence_constraint(table, attribute, options = {})
35
+ name = Util.constraint_name(table, attribute, "presence", options)
19
36
  execute("ALTER TABLE #{table} DROP CONSTRAINT #{name}")
20
37
  end
21
38
  end
@@ -2,10 +2,30 @@ module Rein
2
2
  module Constraint
3
3
  # This module contains methods for defining primary key constraints.
4
4
  module PrimaryKey
5
- def add_primary_key(table, options = {})
5
+ def add_primary_key(*args)
6
+ reversible do |dir|
7
+ dir.up { _add_primary_key(*args) }
8
+ dir.down { _remove_primary_key(*args) }
9
+ end
10
+ end
11
+
12
+ def remove_primary_key(*args)
13
+ reversible do |dir|
14
+ dir.up { _remove_primary_key(*args) }
15
+ dir.down { _add_primary_key(*args) }
16
+ end
17
+ end
18
+
19
+ private
20
+
21
+ def _add_primary_key(table, options = {})
22
+ attribute = (options[:column] || "id").to_sym
23
+ execute("ALTER TABLE #{table} ADD PRIMARY KEY (#{attribute})")
24
+ end
25
+
26
+ def _remove_primary_key(table, options = {})
6
27
  attribute = (options[:column] || "id").to_sym
7
- sql = "ALTER TABLE #{table} ADD PRIMARY KEY (#{attribute})"
8
- execute(sql)
28
+ execute("ALTER TABLE #{table} DROP CONSTRAINT #{attribute}_pkey")
9
29
  end
10
30
  end
11
31
  end
data/lib/rein/schema.rb CHANGED
@@ -1,14 +1,28 @@
1
1
  module Rein
2
2
  # This module contains methods for creating/dropping schemas.
3
3
  module Schema
4
- def create_schema(name)
5
- sql = "CREATE SCHEMA #{name}"
6
- execute(sql)
4
+ def create_schema(*args)
5
+ reversible do |dir|
6
+ dir.up { _create_schema(*args) }
7
+ dir.down { _drop_schema(*args) }
8
+ end
7
9
  end
8
10
 
9
- def drop_schema(name)
10
- sql = "DROP SCHEMA #{name}"
11
- execute(sql)
11
+ def drop_schema(*args)
12
+ reversible do |dir|
13
+ dir.up { _drop_schema(*args) }
14
+ dir.down { _create_schema(*args) }
15
+ end
16
+ end
17
+
18
+ private
19
+
20
+ def _create_schema(name)
21
+ execute("CREATE SCHEMA #{name}")
22
+ end
23
+
24
+ def _drop_schema(name)
25
+ execute("DROP SCHEMA #{name}")
12
26
  end
13
27
  end
14
28
  end
@@ -6,18 +6,34 @@ module Rein
6
6
  module Enum
7
7
  include ActiveRecord::ConnectionAdapters::Quoting
8
8
 
9
- def create_enum_type(enum_name, enum_values = [])
10
- enum_values = enum_values.map { |value| quote(value) }.join(", ")
11
- execute("CREATE TYPE #{enum_name} AS ENUM (#{enum_values})")
9
+ def create_enum_type(*args)
10
+ reversible do |dir|
11
+ dir.up { _create_enum_type(*args) }
12
+ dir.down { _drop_enum_type(*args) }
13
+ end
12
14
  end
13
15
 
14
- def drop_enum_type(enum_name)
15
- execute("DROP TYPE #{enum_name}")
16
+ def drop_enum_type(*args)
17
+ reversible do |dir|
18
+ dir.up { _drop_enum_type(*args) }
19
+ dir.down { _create_enum_type(*args) }
20
+ end
16
21
  end
17
22
 
18
23
  def add_enum_value(enum_name, new_value)
19
24
  execute("ALTER TYPE #{enum_name} ADD VALUE #{quote(new_value)}")
20
25
  end
26
+
27
+ private
28
+
29
+ def _create_enum_type(enum_name, enum_values = [])
30
+ enum_values = enum_values.map { |value| quote(value) }.join(", ")
31
+ execute("CREATE TYPE #{enum_name} AS ENUM (#{enum_values})")
32
+ end
33
+
34
+ def _drop_enum_type(enum_name)
35
+ execute("DROP TYPE #{enum_name}")
36
+ end
21
37
  end
22
38
  end
23
39
  end
data/lib/rein/util.rb ADDED
@@ -0,0 +1,18 @@
1
+ module Rein
2
+ module Constraint
3
+ # The {Util} module provides utility methods for handling options.
4
+ module Util
5
+ def self.conditions_with_if(conditions, options = {})
6
+ if options[:if].present?
7
+ "NOT (#{options[:if]}) OR (#{conditions})"
8
+ else
9
+ conditions
10
+ end
11
+ end
12
+
13
+ def self.constraint_name(table, attribute, suffix, options = {})
14
+ options[:name].presence || "#{table}_#{attribute}_#{suffix}"
15
+ end
16
+ end
17
+ end
18
+ end
data/lib/rein/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Rein
2
- VERSION = "2.1.0".freeze
2
+ VERSION = "3.0.0".freeze
3
3
  end
data/lib/rein/view.rb CHANGED
@@ -1,14 +1,28 @@
1
1
  module Rein
2
2
  # This module contains methods for creating/dropping views.
3
3
  module View
4
- def create_view(view_name, sql)
5
- sql = "CREATE VIEW #{view_name} AS #{sql}"
6
- execute(sql)
4
+ def create_view(*args)
5
+ reversible do |dir|
6
+ dir.up { _create_view(*args) }
7
+ dir.down { _drop_view(*args) }
8
+ end
7
9
  end
8
10
 
9
- def drop_view(view_name)
10
- sql = "DROP VIEW #{view_name}"
11
- execute(sql)
11
+ def drop_view(*args)
12
+ reversible do |dir|
13
+ dir.up { _drop_view(*args) }
14
+ dir.down { _create_view(*args) }
15
+ end
16
+ end
17
+
18
+ private
19
+
20
+ def _create_view(view_name, sql)
21
+ execute("CREATE VIEW #{view_name} AS #{sql}")
22
+ end
23
+
24
+ def _drop_view(view_name)
25
+ execute("DROP VIEW #{view_name}")
12
26
  end
13
27
  end
14
28
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rein
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joshua Bassett
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-04-08 00:00:00.000000000 Z
11
+ date: 2017-04-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -149,11 +149,11 @@ files:
149
149
  - lib/rein/constraint/inclusion.rb
150
150
  - lib/rein/constraint/null.rb
151
151
  - lib/rein/constraint/numericality.rb
152
- - lib/rein/constraint/options.rb
153
152
  - lib/rein/constraint/presence.rb
154
153
  - lib/rein/constraint/primary_key.rb
155
154
  - lib/rein/schema.rb
156
155
  - lib/rein/type/enum.rb
156
+ - lib/rein/util.rb
157
157
  - lib/rein/version.rb
158
158
  - lib/rein/view.rb
159
159
  homepage: http://github.com/nullobject/rein
@@ -1,18 +0,0 @@
1
- module Rein
2
- module Constraint
3
- # This module defines methods for handling options command to several constraints.
4
- module Options
5
- def conditions_with_if(conditions, options = {})
6
- if options[:if].present?
7
- "NOT (#{options[:if]}) OR (#{conditions})"
8
- else
9
- conditions
10
- end
11
- end
12
-
13
- def constraint_name(table, attribute, options = {})
14
- options[:name].presence || "#{table}_#{attribute}"
15
- end
16
- end
17
- end
18
- end