Empact-sexy_pg_constraints 0.3.0 → 0.4.0

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.
@@ -1,3 +1,7 @@
1
+ === 0.4.0 - 11.16.2012
2
+
3
+ * Add :like and :not_like constraints to restrict string contents
4
+
1
5
  === 0.3.0 - 05.02.2012
2
6
 
3
7
  * Added stripped and alias trimmed constraint to enforce trimmed status
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "Empact-sexy_pg_constraints"
8
- s.version = "0.3.0"
8
+ s.version = "0.4.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Maxim Chernyak", "Ben Woosley"]
12
- s.date = "2012-05-03"
12
+ s.date = "2012-11-16"
13
13
  s.description = "Use migrations and simple syntax to manage constraints in PostgreSQL DB."
14
14
  s.email = "ben.woosley@gmail.com"
15
15
  s.extra_rdoc_files = [
@@ -27,10 +27,10 @@ Gem::Specification.new do |s|
27
27
  "VERSION",
28
28
  "init.rb",
29
29
  "lib/sexy_pg_constraints.rb",
30
- "lib/sexy_pg_constraints/constrainer.rb",
30
+ "lib/sexy_pg_constraints/constrainers/constrainer.rb",
31
+ "lib/sexy_pg_constraints/constrainers/deconstrainer.rb",
32
+ "lib/sexy_pg_constraints/constrainers/helpers.rb",
31
33
  "lib/sexy_pg_constraints/constraints.rb",
32
- "lib/sexy_pg_constraints/deconstrainer.rb",
33
- "lib/sexy_pg_constraints/helpers.rb",
34
34
  "lib/sexy_pg_constraints/railtie.rb",
35
35
  "lib/sexy_pg_constraints/schema_definitions.rb",
36
36
  "test/alphanumeric_test.rb",
@@ -41,23 +41,24 @@ Gem::Specification.new do |s|
41
41
  "test/general_test.rb",
42
42
  "test/greater_less_than_test.rb",
43
43
  "test/length_within_test.rb",
44
+ "test/like_test.rb",
44
45
  "test/lowercase_test.rb",
45
- "test/not_blank_test.rb",
46
46
  "test/odd_event_test.rb",
47
47
  "test/positive_test.rb",
48
+ "test/present_test.rb",
48
49
  "test/reference_test.rb",
50
+ "test/stripped_test.rb",
49
51
  "test/support/assert_prohibits_allows.rb",
50
52
  "test/support/database.yml.example",
51
53
  "test/support/models.rb",
52
54
  "test/test_helper.rb",
53
- "test/trimmed_test.rb",
54
55
  "test/whitelist_test.rb",
55
56
  "test/within_test.rb",
56
57
  "test/xor_test.rb"
57
58
  ]
58
59
  s.homepage = "http://github.com/maxim/sexy_pg_constraints"
59
60
  s.require_paths = ["lib"]
60
- s.rubygems_version = "1.8.11"
61
+ s.rubygems_version = "1.8.23"
61
62
  s.summary = nil
62
63
 
63
64
  if s.respond_to? :specification_version then
@@ -24,14 +24,14 @@ Say you have a table "books" and you want your Postgres DB to ensure that their
24
24
  class AddConstraintsToBooks < ActiveRecord::Migration
25
25
  def self.up
26
26
  constrain :books do |t|
27
- t.title :not_blank => true, :alphanumeric => true, :length_within => 3..50
27
+ t.title :present => true, :alphanumeric => true, :length_within => 3..50
28
28
  t.isbn :unique => true, :blacklist => %w(badbook1 badbook2)
29
29
  end
30
30
  end
31
31
 
32
32
  def self.down
33
33
  deconstrain :books do |t|
34
- t.title :not_blank, :alphanumeric, :length_within
34
+ t.title :present, :alphanumeric, :length_within
35
35
  t.isbn :unique, :blacklist
36
36
  end
37
37
  end
@@ -41,12 +41,12 @@ This will add all the necessary constraints to the database on the next migratio
41
41
 
42
42
  There's also a syntax for when you don't need to work with multiple columns at once.
43
43
 
44
- constrain :books, :title, :not_blank => true, :length_within => 3..50
44
+ constrain :books, :title, :present => true, :length_within => 3..50
45
45
 
46
46
  The above line works exactly the same as this block
47
47
 
48
48
  constrain :books do |t|
49
- t.title :not_blank => true, :length_within => 3..50
49
+ t.title :present => true, :length_within => 3..50
50
50
  end
51
51
 
52
52
  Same applies to deconstrain.
@@ -95,7 +95,7 @@ Below is the list of constraints available and tested so far.
95
95
 
96
96
  * whitelist
97
97
  * blacklist
98
- * not_blank
98
+ * present
99
99
  * within
100
100
  * length_within
101
101
  * email
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.0
1
+ 0.4.0
@@ -1,10 +1,7 @@
1
1
  module SexyPgConstraints
2
2
  extend ActiveSupport::Autoload
3
3
  autoload :SchemaDefinitions
4
- autoload :Constrainer
5
- autoload :Deconstrainer
6
4
  autoload :Constraints
7
- autoload :Helpers
8
5
  end
9
6
 
10
7
  require 'sexy_pg_constraints/railtie' if defined?(Rails)
@@ -1,6 +1,8 @@
1
+ require 'sexy_pg_constraints/constrainers/helpers'
2
+
1
3
  module SexyPgConstraints
2
4
  class Constrainer
3
- include SexyPgConstraints::Helpers
5
+ extend SexyPgConstraints::Helpers
4
6
 
5
7
  def initialize(table, columns = [])
6
8
  @table = table.to_s
@@ -24,7 +26,7 @@ module SexyPgConstraints
24
26
  def add_constraints(table, column, constraints)
25
27
  constraints.each_pair do |type, options|
26
28
  execute "alter table #{table} add constraint #{make_title(table, column, type)} " \
27
- + SexyPgConstraints::Constraints.send(type, table, column, options) + ';'
29
+ + SexyPgConstraints::Constraints.send(type, column, options) + ';'
28
30
  end
29
31
  end
30
32
  end
@@ -1,25 +1,27 @@
1
+ require 'sexy_pg_constraints/constrainers/helpers'
2
+
1
3
  module SexyPgConstraints
2
4
  class Deconstrainer
3
- include SexyPgConstraints::Helpers
4
-
5
+ extend SexyPgConstraints::Helpers
6
+
5
7
  def initialize(table, columns = [])
6
8
  @table = table.to_s
7
9
  @columns = columns
8
10
  end
9
-
11
+
10
12
  def method_missing(column, *constraints)
11
13
  self.class.drop_constraints(@table, column.to_s, *constraints)
12
14
  end
13
-
15
+
14
16
  def [](*columns)
15
17
  @columns = columns.map{|c| c.to_s}
16
18
  self
17
19
  end
18
-
20
+
19
21
  def all(*constraints)
20
22
  self.class.drop_constraints(@table, @columns, *constraints)
21
23
  end
22
-
24
+
23
25
  class << self
24
26
  def drop_constraints(table, column, *constraints)
25
27
  constraints.each do |type|
@@ -0,0 +1,13 @@
1
+ module SexyPgConstraints
2
+ module Helpers
3
+ def make_title(table, column, type)
4
+ column = column.join('_') if column.respond_to?(:join)
5
+
6
+ "#{table}_#{column}_#{type}"
7
+ end
8
+
9
+ def execute(*args)
10
+ ActiveRecord::Base.connection.execute(*args)
11
+ end
12
+ end
13
+ end
@@ -8,8 +8,8 @@ module SexyPgConstraints
8
8
  # Example:
9
9
  # constrain :books, :variation, :whitelist => %w(hardcover softcover)
10
10
  #
11
- def whitelist(table, column, options)
12
- "check (#{table}.#{column} in (#{ options.collect{|v| "'#{v}'"}.join(',') }))"
11
+ def whitelist(column, options)
12
+ %{check ("#{column}" in (#{ options.collect{|v| "'#{v}'"}.join(',') }))}
13
13
  end
14
14
 
15
15
  ##
@@ -18,21 +18,19 @@ module SexyPgConstraints
18
18
  # Example:
19
19
  # constrain :books, :isbn, :blacklist => %w(invalid_isbn1 invalid_isbn2)
20
20
  #
21
- def blacklist(table, column, options)
22
- "check (#{table}.#{column} not in (#{ options.collect{|v| "'#{v}'"}.join(',') }))"
21
+ def blacklist(column, options)
22
+ %{check ("#{column}" not in (#{ options.collect{|v| "'#{v}'"}.join(',') }))}
23
23
  end
24
24
 
25
25
  ##
26
26
  # The value must have at least 1 non-space character.
27
27
  #
28
28
  # Example:
29
- # constrain :books, :title, :not_blank => true
29
+ # constrain :books, :title, :present => true
30
30
  #
31
- def not_blank(table, column, options)
32
- "check ( length(btrim(#{table}.#{column})) > 0 )"
31
+ def present(column, options)
32
+ %{check ( length(btrim("#{column}")) > 0 )}
33
33
  end
34
- alias_method :present, :not_blank
35
- module_function :present
36
34
 
37
35
  ##
38
36
  # The value must have characters other than those listed in the option string.
@@ -40,28 +38,26 @@ module SexyPgConstraints
40
38
  # Example:
41
39
  # constrain :books, :title, :not_only => 'abcd'
42
40
  #
43
- def not_only(table, column, options)
44
- "check ( length(btrim(#{table}.#{column}, E'#{options}')) > 0 )"
41
+ def not_only(column, options)
42
+ %{check ( length(btrim("#{column}", E'#{options}')) > 0 )}
45
43
  end
46
44
 
47
45
  ##
48
46
  # The value must not have leading or trailing spaces.
49
47
  #
50
- # You can pass a string as an option to indicate what characters are trimmed.
48
+ # You can pass a string as an option to indicate what characters are stripped.
51
49
  #
52
50
  # Example:
53
- # constrain :books, :title, :trimmed => true
54
- # constrain :books, :title, :trimmed => "abc"
51
+ # constrain :books, :title, :stripped => true
52
+ # constrain :books, :title, :stripped => "abc"
55
53
  #
56
- def trimmed(table, column, options)
54
+ def stripped(column, options)
57
55
  if options == true
58
- "check (length(#{table}.#{column}) = length(btrim(#{table}.#{column})))"
56
+ %{check (length("#{column}") = length(btrim("#{column}")))}
59
57
  else
60
- "check (length(#{table}.#{column}) = length(btrim(#{table}.#{column}, E'#{options}')))"
58
+ %{check (length("#{column}") = length(btrim("#{column}", E'#{options}')))}
61
59
  end
62
60
  end
63
- alias_method :stripped, :trimmed
64
- module_function :stripped
65
61
 
66
62
  ##
67
63
  # The numeric value must be within given range.
@@ -73,8 +69,8 @@ module SexyPgConstraints
73
69
  # constrain :books, :year, :within => {:range => 1979..2009, :exclude_beginning => true, :exclude_end => true}
74
70
  # (the four lines above do the same thing)
75
71
  #
76
- def within(table, column, options)
77
- column_ref = column.to_s.include?('.') ? column : "#{table}.#{column}"
72
+ def within(column, options)
73
+ column_ref = column.to_s.include?('"') ? column : %{"#{column}"}
78
74
  if options.respond_to?(:to_hash)
79
75
  options = options.to_hash
80
76
  options.assert_valid_keys(:range, :exclude_end, :exclude_beginning)
@@ -95,8 +91,8 @@ module SexyPgConstraints
95
91
  # Example:
96
92
  # constrain :books, :author, :length_within => 4..50
97
93
  #
98
- def length_within(table, column, options)
99
- within(table, "length(#{table}.#{column})", options)
94
+ def length_within(column, options)
95
+ within(%{length("#{column}")}, options)
100
96
  end
101
97
 
102
98
  ##
@@ -105,8 +101,8 @@ module SexyPgConstraints
105
101
  # Example:
106
102
  # constrain :books, :author, :email => true
107
103
  #
108
- def email(table, column, options)
109
- "check (((#{table}.#{column})::text ~ E'^([-a-z0-9]+)@([-a-z0-9]+[.]+[a-z]{2,4})$'::text))"
104
+ def email(column, options)
105
+ %{check ((("#{column}")::text ~ E'^([-a-z0-9]+)@([-a-z0-9]+[.]+[a-z]{2,4})$'::text))}
110
106
  end
111
107
 
112
108
  ##
@@ -115,8 +111,8 @@ module SexyPgConstraints
115
111
  # Example:
116
112
  # constrain :books, :author, :alphanumeric => true
117
113
  #
118
- def alphanumeric(table, column, options)
119
- "check (((#{table}.#{column})::text ~* '^[a-z0-9]+$'::text))"
114
+ def alphanumeric(column, options)
115
+ %{check ((("#{column}")::text ~* '^[a-z0-9]+$'::text))}
120
116
  end
121
117
 
122
118
  ##
@@ -125,8 +121,8 @@ module SexyPgConstraints
125
121
  # Example:
126
122
  # constrain :books, :author, :lowercase => true
127
123
  #
128
- def lowercase(table, column, options)
129
- "check (#{table}.#{column} = lower(#{table}.#{column}))"
124
+ def lowercase(column, options)
125
+ %{check ("#{column}" = lower("#{column}"))}
130
126
  end
131
127
 
132
128
  ##
@@ -135,8 +131,8 @@ module SexyPgConstraints
135
131
  # Example:
136
132
  # constrain :books, :quantity, :positive => true
137
133
  #
138
- def positive(table, column, options)
139
- greater_than_or_equal_to(table, column, 0)
134
+ def positive(column, options)
135
+ greater_than_or_equal_to(column, 0)
140
136
  end
141
137
 
142
138
  ##
@@ -145,8 +141,8 @@ module SexyPgConstraints
145
141
  # Example:
146
142
  # constrain :books, :quantity, :greater_than => 12
147
143
  #
148
- def less_than(table, column, options)
149
- "check (#{table}.#{column} < #{options})"
144
+ def less_than(column, options)
145
+ %{check ("#{column}" < #{options})}
150
146
  end
151
147
 
152
148
  ##
@@ -155,8 +151,8 @@ module SexyPgConstraints
155
151
  # Example:
156
152
  # constrain :books, :quantity, :greater_than => 12
157
153
  #
158
- def less_than_or_equal_to(table, column, options)
159
- "check (#{table}.#{column} <= #{options})"
154
+ def less_than_or_equal_to(column, options)
155
+ %{check ("#{column}" <= #{options})}
160
156
  end
161
157
 
162
158
  ##
@@ -165,8 +161,8 @@ module SexyPgConstraints
165
161
  # Example:
166
162
  # constrain :books, :quantity, :greater_than => 12
167
163
  #
168
- def greater_than(table, column, options)
169
- "check (#{table}.#{column} > #{options})"
164
+ def greater_than(column, options)
165
+ %{check ("#{column}" > #{options})}
170
166
  end
171
167
 
172
168
  ##
@@ -175,8 +171,8 @@ module SexyPgConstraints
175
171
  # Example:
176
172
  # constrain :books, :quantity, :greater_than_or_equal_to => 12
177
173
  #
178
- def greater_than_or_equal_to(table, column, options)
179
- "check (#{table}.#{column} >= #{options})"
174
+ def greater_than_or_equal_to(column, options)
175
+ %{check ("#{column}" >= #{options})}
180
176
  end
181
177
 
182
178
  ##
@@ -185,8 +181,8 @@ module SexyPgConstraints
185
181
  # Example:
186
182
  # constrain :books, :quantity, :odd => true
187
183
  #
188
- def odd(table, column, options)
189
- "check (mod(#{table}.#{column}, 2) != 0)"
184
+ def odd(column, options)
185
+ %{check (mod("#{column}", 2) != 0)}
190
186
  end
191
187
 
192
188
  ##
@@ -195,8 +191,8 @@ module SexyPgConstraints
195
191
  # Example:
196
192
  # constrain :books, :quantity, :even => true
197
193
  #
198
- def even(table, column, options)
199
- "check (mod(#{table}.#{column}, 2) = 0)"
194
+ def even(column, options)
195
+ %{check (mod("#{column}", 2) = 0)}
200
196
  end
201
197
 
202
198
  ##
@@ -205,9 +201,9 @@ module SexyPgConstraints
205
201
  # Example:
206
202
  # constrain :books, :isbn, :unique => true
207
203
  #
208
- def unique(table, column, options)
209
- column = Array(column).map {|c| %{"#{c}"} }.join(', ')
210
- "unique (#{column})"
204
+ def unique(column, options)
205
+ columns = Array(column).map {|c| %{"#{c}"} }.join(', ')
206
+ "unique(#{columns})"
211
207
  end
212
208
 
213
209
  ##
@@ -218,7 +214,7 @@ module SexyPgConstraints
218
214
  # Example:
219
215
  # constrain :books, [], :xor => true
220
216
  #
221
- def xor(table, column, options)
217
+ def xor(column, options)
222
218
  addition = Array(column).map {|c| %{("#{c}" is not null)::integer} }.join(' + ')
223
219
 
224
220
  "check (#{addition} = 1)"
@@ -230,8 +226,8 @@ module SexyPgConstraints
230
226
  # Example:
231
227
  # constrain :books, :hash, :exact_length => 32
232
228
  #
233
- def exact_length(table, column, options)
234
- "check ( length(trim(both from #{table}.#{column})) = #{options} )"
229
+ def exact_length(column, options)
230
+ %{check ( length(trim(both from "#{column}")) = #{options} )}
235
231
  end
236
232
 
237
233
  ##
@@ -240,17 +236,42 @@ module SexyPgConstraints
240
236
  # Example:
241
237
  # constrain :orders, :visa, :format => /^([4]{1})([0-9]{12,15})$/
242
238
  #
243
- def format(table, column, options)
244
- "check (((#{table}.#{column})::text #{options.casefold? ? '~*' : '~'} E'#{options.source}'::text ))"
239
+ def format(column, options)
240
+ %{check ((("#{column}")::text #{options.casefold? ? '~*' : '~'} E'#{options.source}'::text ))}
245
241
  end
246
242
 
243
+ ##
244
+ # Exclude values not matching the like pattern provided
245
+ #
246
+ # Example:
247
+ # constrain :orders, :visa, :like => '%FOO%'
248
+ #
249
+ def like(column, options)
250
+ constrain_like(column, 'LIKE', options)
251
+ end
252
+
253
+ ##
254
+ # Exclude values matching the like pattern provided
255
+ #
256
+ # Example:
257
+ # constrain :orders, :visa, :not_like => '%FOO%'
258
+ #
259
+ def not_like(column, options)
260
+ constrain_like(column, 'NOT LIKE', options)
261
+ end
262
+
263
+ def constrain_like(column, operator, string)
264
+ %{check (("#{column}")::text #{operator} '#{string.gsub(/([^'])'([^'])/, '\1\'\'\2')}')}
265
+ end
266
+ private :constrain_like
267
+
247
268
  ##
248
269
  # Add foreign key constraint.
249
270
  #
250
271
  # Example:
251
272
  # constrain :books, :author_id, :reference => {:authors => :id, :on_delete => :cascade}
252
273
  #
253
- def reference(table, column, options)
274
+ def reference(column, options)
254
275
  on_delete = options.delete(:on_delete)
255
276
  fk_table = options.keys.first
256
277
  fk_column = options[fk_table]
@@ -1,3 +1,6 @@
1
+ require 'sexy_pg_constraints/constrainers/constrainer'
2
+ require 'sexy_pg_constraints/constrainers/deconstrainer'
3
+
1
4
  module SexyPgConstraints
2
5
  module SchemaDefinitions
3
6
  def constrain(*args)
@@ -10,12 +10,12 @@ class GeneralTest < SexyPgConstraintsTest
10
10
 
11
11
  def test_block_syntax
12
12
  ActiveRecord::Migration.constrain :books do |t|
13
- t.title :not_blank => true
13
+ t.title :present => true
14
14
  t.isbn :exact_length => 15
15
15
  t.author :alphanumeric => true
16
16
  end
17
17
 
18
- assert_prohibits Book, :title, :not_blank do |book|
18
+ assert_prohibits Book, :title, :present do |book|
19
19
  book.title = ' '
20
20
  end
21
21
 
@@ -28,7 +28,7 @@ class GeneralTest < SexyPgConstraintsTest
28
28
  end
29
29
 
30
30
  ActiveRecord::Migration.deconstrain :books do |t|
31
- t.title :not_blank
31
+ t.title :present
32
32
  t.isbn :exact_length
33
33
  t.author :alphanumeric
34
34
  end
@@ -42,10 +42,10 @@ class GeneralTest < SexyPgConstraintsTest
42
42
 
43
43
  def test_multiple_constraints_per_line
44
44
  ActiveRecord::Migration.constrain :books do |t|
45
- t.title :not_blank => true, :alphanumeric => true, :blacklist => %w(foo bar)
45
+ t.title :present => true, :alphanumeric => true, :blacklist => %w(foo bar)
46
46
  end
47
47
 
48
- assert_prohibits Book, :title, [:not_blank, :alphanumeric] do |book|
48
+ assert_prohibits Book, :title, [:present, :alphanumeric] do |book|
49
49
  book.title = ' '
50
50
  end
51
51
 
@@ -58,7 +58,7 @@ class GeneralTest < SexyPgConstraintsTest
58
58
  end
59
59
 
60
60
  ActiveRecord::Migration.deconstrain :books do |t|
61
- t.title :not_blank, :alphanumeric, :blacklist
61
+ t.title :present, :alphanumeric, :blacklist
62
62
  end
63
63
 
64
64
  assert_allows Book do |book|
@@ -0,0 +1,39 @@
1
+ require 'test_helper'
2
+
3
+ class LikeTest < SexyPgConstraintsTest
4
+ def assert_protects_from(contraint, test, allows, disallows)
5
+ column = :title
6
+ constraint = {contraint => test}
7
+ ActiveRecord::Migration.constrain :books, column, constraint
8
+
9
+ assert_prohibits Book, column, constraint.keys.first do |book|
10
+ book.send("#{column}=", disallows)
11
+ end
12
+
13
+ assert_allows Book do |book|
14
+ book.send("#{column}=", allows)
15
+ end
16
+
17
+ ActiveRecord::Migration.deconstrain :books, column, contraint
18
+
19
+ assert_allows Book do |book|
20
+ book.send("#{column}=", disallows)
21
+ end
22
+ end
23
+
24
+ def test_protects_from_vanilla_like
25
+ assert_protects_from :like, '%FUN%', 'HAPPY FUN TIME', 'No Fun'
26
+ end
27
+
28
+ def test_protects_from_quotey_like
29
+ assert_protects_from :like, "%'FUN'%", "HAPPY 'FUN' TIME", 'No FUN`'
30
+ end
31
+
32
+ def test_protects_from_vanilla_not_like
33
+ assert_protects_from :not_like, '%FUN%', 'No Fun', 'HAPPY FUN TIME'
34
+ end
35
+
36
+ def test_protects_from_quotey_not_like
37
+ assert_protects_from :not_like, "%'FUN'%", 'No FUN`', "HAPPY 'FUN' TIME"
38
+ end
39
+ end
@@ -1,6 +1,6 @@
1
1
  require 'test_helper'
2
2
 
3
- class NotBlankTest < SexyPgConstraintsTest
3
+ class PresentTest < SexyPgConstraintsTest
4
4
  def assert_protects_from_blank(column, contraint)
5
5
  ActiveRecord::Migration.constrain :books, column, contraint => true
6
6
 
@@ -19,15 +19,15 @@ class NotBlankTest < SexyPgConstraintsTest
19
19
  end
20
20
  end
21
21
 
22
- def test_not_blank
23
- assert_protects_from_blank(:author, :not_blank)
22
+ def test_present
23
+ assert_protects_from_blank(:author, :present)
24
24
  end
25
25
 
26
26
  def test_present
27
27
  assert_protects_from_blank(:author, :present)
28
28
  end
29
29
 
30
- def test_not_blank_on_a_column_whose_name_is_a_sql_keyword
31
- assert_protects_from_blank(:as, :not_blank)
30
+ def test_present_on_a_column_whose_name_is_a_sql_keyword
31
+ assert_protects_from_blank(:as, :present)
32
32
  end
33
33
  end
@@ -1,15 +1,15 @@
1
1
  require 'test_helper'
2
2
 
3
- class TrimmedTest < SexyPgConstraintsTest
3
+ class StrippedTest < SexyPgConstraintsTest
4
4
  DEFAULT_PROHIBITED = [' foo', 'foo ', ' foo ']
5
5
  CONFIGURABLE_PROHIBITED = ["foo \t", "\t foo"]
6
6
  DEFAULT_ALLOWED = ['foo', 'foo \t']
7
7
 
8
- def test_trimmed
9
- ActiveRecord::Migration.constrain :books, :author, :trimmed => true
8
+ def test_stripped
9
+ ActiveRecord::Migration.constrain :books, :author, :stripped => true
10
10
 
11
11
  DEFAULT_PROHIBITED.each do |prohibited|
12
- assert_prohibits Book, :author, :trimmed do |book|
12
+ assert_prohibits Book, :author, :stripped do |book|
13
13
  book.author = prohibited
14
14
  end
15
15
  end
@@ -20,7 +20,7 @@ class TrimmedTest < SexyPgConstraintsTest
20
20
  end
21
21
  end
22
22
 
23
- ActiveRecord::Migration.deconstrain :books, :author, :trimmed
23
+ ActiveRecord::Migration.deconstrain :books, :author, :stripped
24
24
 
25
25
  DEFAULT_PROHIBITED.each do |prohibited|
26
26
  assert_allows Book do |book|
@@ -53,11 +53,11 @@ class TrimmedTest < SexyPgConstraintsTest
53
53
  end
54
54
  end
55
55
 
56
- def test_trimmed_on_a_column_whose_name_is_a_sql_keyword
57
- ActiveRecord::Migration.constrain :books, :as, :trimmed => true
56
+ def test_stripped_on_a_column_whose_name_is_a_sql_keyword
57
+ ActiveRecord::Migration.constrain :books, :as, :stripped => true
58
58
 
59
59
  DEFAULT_PROHIBITED.each do |prohibited|
60
- assert_prohibits Book, :as, :trimmed do |book|
60
+ assert_prohibits Book, :as, :stripped do |book|
61
61
  book.as = prohibited
62
62
  end
63
63
  end
@@ -68,7 +68,7 @@ class TrimmedTest < SexyPgConstraintsTest
68
68
  end
69
69
  end
70
70
 
71
- ActiveRecord::Migration.deconstrain :books, :as, :trimmed
71
+ ActiveRecord::Migration.deconstrain :books, :as, :stripped
72
72
 
73
73
  DEFAULT_PROHIBITED.each do |prohibited|
74
74
  assert_allows Book do |book|
@@ -77,12 +77,12 @@ class TrimmedTest < SexyPgConstraintsTest
77
77
  end
78
78
  end
79
79
 
80
- def test_trimmed_with_a_character_list
81
- ActiveRecord::Migration.constrain :books, :as, :trimmed => '\t '
80
+ def test_stripped_with_a_character_list
81
+ ActiveRecord::Migration.constrain :books, :as, :stripped => '\t '
82
82
 
83
83
  DEFAULT_PROHIBITED + CONFIGURABLE_PROHIBITED.each do |prohibited|
84
84
  p prohibited
85
- assert_prohibits Book, :as, :trimmed do |book|
85
+ assert_prohibits Book, :as, :stripped do |book|
86
86
  book.as = prohibited
87
87
  end
88
88
  end
@@ -93,7 +93,7 @@ class TrimmedTest < SexyPgConstraintsTest
93
93
  end
94
94
  end
95
95
 
96
- ActiveRecord::Migration.deconstrain :books, :as, :trimmed
96
+ ActiveRecord::Migration.deconstrain :books, :as, :stripped
97
97
 
98
98
  DEFAULT_PROHIBITED + CONFIGURABLE_PROHIBITED.each do |prohibited|
99
99
  assert_allows Book do |book|
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: Empact-sexy_pg_constraints
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,11 +10,11 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-05-03 00:00:00.000000000 Z
13
+ date: 2012-11-16 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activerecord
17
- requirement: &70318625008440 !ruby/object:Gem::Requirement
17
+ requirement: !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ! '>='
@@ -22,10 +22,15 @@ dependencies:
22
22
  version: 3.0.0
23
23
  type: :runtime
24
24
  prerelease: false
25
- version_requirements: *70318625008440
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ! '>='
29
+ - !ruby/object:Gem::Version
30
+ version: 3.0.0
26
31
  - !ruby/object:Gem::Dependency
27
32
  name: pg
28
- requirement: &70318625006460 !ruby/object:Gem::Requirement
33
+ requirement: !ruby/object:Gem::Requirement
29
34
  none: false
30
35
  requirements:
31
36
  - - ! '>='
@@ -33,10 +38,15 @@ dependencies:
33
38
  version: '0'
34
39
  type: :runtime
35
40
  prerelease: false
36
- version_requirements: *70318625006460
41
+ version_requirements: !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ! '>='
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
37
47
  - !ruby/object:Gem::Dependency
38
48
  name: shoulda
39
- requirement: &70318625005160 !ruby/object:Gem::Requirement
49
+ requirement: !ruby/object:Gem::Requirement
40
50
  none: false
41
51
  requirements:
42
52
  - - ! '>='
@@ -44,10 +54,15 @@ dependencies:
44
54
  version: '0'
45
55
  type: :development
46
56
  prerelease: false
47
- version_requirements: *70318625005160
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ! '>='
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
48
63
  - !ruby/object:Gem::Dependency
49
64
  name: jeweler
50
- requirement: &70318625003680 !ruby/object:Gem::Requirement
65
+ requirement: !ruby/object:Gem::Requirement
51
66
  none: false
52
67
  requirements:
53
68
  - - ! '>='
@@ -55,7 +70,12 @@ dependencies:
55
70
  version: '0'
56
71
  type: :development
57
72
  prerelease: false
58
- version_requirements: *70318625003680
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ! '>='
77
+ - !ruby/object:Gem::Version
78
+ version: '0'
59
79
  description: Use migrations and simple syntax to manage constraints in PostgreSQL
60
80
  DB.
61
81
  email: ben.woosley@gmail.com
@@ -75,10 +95,10 @@ files:
75
95
  - VERSION
76
96
  - init.rb
77
97
  - lib/sexy_pg_constraints.rb
78
- - lib/sexy_pg_constraints/constrainer.rb
98
+ - lib/sexy_pg_constraints/constrainers/constrainer.rb
99
+ - lib/sexy_pg_constraints/constrainers/deconstrainer.rb
100
+ - lib/sexy_pg_constraints/constrainers/helpers.rb
79
101
  - lib/sexy_pg_constraints/constraints.rb
80
- - lib/sexy_pg_constraints/deconstrainer.rb
81
- - lib/sexy_pg_constraints/helpers.rb
82
102
  - lib/sexy_pg_constraints/railtie.rb
83
103
  - lib/sexy_pg_constraints/schema_definitions.rb
84
104
  - test/alphanumeric_test.rb
@@ -89,16 +109,17 @@ files:
89
109
  - test/general_test.rb
90
110
  - test/greater_less_than_test.rb
91
111
  - test/length_within_test.rb
112
+ - test/like_test.rb
92
113
  - test/lowercase_test.rb
93
- - test/not_blank_test.rb
94
114
  - test/odd_event_test.rb
95
115
  - test/positive_test.rb
116
+ - test/present_test.rb
96
117
  - test/reference_test.rb
118
+ - test/stripped_test.rb
97
119
  - test/support/assert_prohibits_allows.rb
98
120
  - test/support/database.yml.example
99
121
  - test/support/models.rb
100
122
  - test/test_helper.rb
101
- - test/trimmed_test.rb
102
123
  - test/whitelist_test.rb
103
124
  - test/within_test.rb
104
125
  - test/xor_test.rb
@@ -116,7 +137,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
116
137
  version: '0'
117
138
  segments:
118
139
  - 0
119
- hash: 1263929362253424615
140
+ hash: -808866161196602339
120
141
  required_rubygems_version: !ruby/object:Gem::Requirement
121
142
  none: false
122
143
  requirements:
@@ -125,7 +146,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
125
146
  version: '0'
126
147
  requirements: []
127
148
  rubyforge_project:
128
- rubygems_version: 1.8.11
149
+ rubygems_version: 1.8.23
129
150
  signing_key:
130
151
  specification_version: 3
131
152
  summary: ''
@@ -1,19 +0,0 @@
1
- module SexyPgConstraints
2
- module Helpers
3
- def self.included(base)
4
- base.extend ClassMethods
5
- end
6
-
7
- module ClassMethods
8
- def make_title(table, column, type)
9
- column = column.join('_') if column.respond_to?(:join)
10
-
11
- "#{table}_#{column}_#{type}"
12
- end
13
-
14
- def execute(*args)
15
- ActiveRecord::Base.connection.execute(*args)
16
- end
17
- end
18
- end
19
- end