Empact-sexy_pg_constraints 0.2.2 → 0.2.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.
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{Empact-sexy_pg_constraints}
8
- s.version = "0.2.0"
8
+ s.version = "0.2.3"
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 = %q{2011-04-21}
12
+ s.date = %q{2011-05-26}
13
13
  s.description = %q{Use migrations and simple syntax to manage constraints in PostgreSQL DB.}
14
14
  s.email = %q{ben.woosley@gmail.com}
15
15
  s.extra_rdoc_files = [
@@ -18,6 +18,7 @@ Gem::Specification.new do |s|
18
18
  ]
19
19
  s.files = [
20
20
  "CHANGELOG.rdoc",
21
+ "Empact-sexy_pg_constraints.gemspec",
21
22
  "Gemfile",
22
23
  "Gemfile.lock",
23
24
  "LICENSE.txt",
@@ -30,23 +31,53 @@ Gem::Specification.new do |s|
30
31
  "lib/sexy_pg_constraints/constraints.rb",
31
32
  "lib/sexy_pg_constraints/deconstrainer.rb",
32
33
  "lib/sexy_pg_constraints/helpers.rb",
33
- "lib/sexy_pg_constraints/initializer.rb",
34
- "sexy_pg_constraints.gemspec",
35
- "test/sexy_pg_constraints_test.rb",
34
+ "lib/sexy_pg_constraints/railtie.rb",
35
+ "lib/sexy_pg_constraints/schema_definitions.rb",
36
+ "test/alphanumeric_test.rb",
37
+ "test/blacklist_test.rb",
38
+ "test/email_test.rb",
39
+ "test/exact_length_test.rb",
40
+ "test/format_test.rb",
41
+ "test/general_test.rb",
42
+ "test/greater_less_than_test.rb",
43
+ "test/length_within_test.rb",
44
+ "test/lowercase_test.rb",
45
+ "test/not_blank_test.rb",
46
+ "test/odd_event_test.rb",
47
+ "test/positive_test.rb",
48
+ "test/reference_test.rb",
36
49
  "test/support/assert_prohibits_allows.rb",
37
50
  "test/support/database.yml.example",
38
51
  "test/support/models.rb",
39
- "test/test_helper.rb"
52
+ "test/test_helper.rb",
53
+ "test/whitelist_test.rb",
54
+ "test/within_test.rb",
55
+ "test/xor_test.rb"
40
56
  ]
41
57
  s.homepage = %q{http://github.com/maxim/sexy_pg_constraints}
42
58
  s.require_paths = ["lib"]
43
59
  s.rubygems_version = %q{1.7.2}
44
60
  s.summary = nil
45
61
  s.test_files = [
46
- "test/sexy_pg_constraints_test.rb",
62
+ "test/alphanumeric_test.rb",
63
+ "test/blacklist_test.rb",
64
+ "test/email_test.rb",
65
+ "test/exact_length_test.rb",
66
+ "test/format_test.rb",
67
+ "test/general_test.rb",
68
+ "test/greater_less_than_test.rb",
69
+ "test/length_within_test.rb",
70
+ "test/lowercase_test.rb",
71
+ "test/not_blank_test.rb",
72
+ "test/odd_event_test.rb",
73
+ "test/positive_test.rb",
74
+ "test/reference_test.rb",
47
75
  "test/support/assert_prohibits_allows.rb",
48
76
  "test/support/models.rb",
49
- "test/test_helper.rb"
77
+ "test/test_helper.rb",
78
+ "test/whitelist_test.rb",
79
+ "test/within_test.rb",
80
+ "test/xor_test.rb"
50
81
  ]
51
82
 
52
83
  if s.respond_to? :specification_version then
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.2
1
+ 0.2.3
@@ -105,7 +105,47 @@ module SexyPgConstraints
105
105
  # constrain :books, :quantity, :positive => true
106
106
  #
107
107
  def positive(table, column, options)
108
- "check (#{table}.#{column} >= 0)"
108
+ greater_than_or_equal_to(table, column, 0)
109
+ end
110
+
111
+ ##
112
+ # Allow only values less than the provided limit.
113
+ #
114
+ # Example:
115
+ # constrain :books, :quantity, :greater_than => 12
116
+ #
117
+ def less_than(table, column, options)
118
+ "check (#{table}.#{column} < #{options})"
119
+ end
120
+
121
+ ##
122
+ # Allow only values less than or equal to the provided limit.
123
+ #
124
+ # Example:
125
+ # constrain :books, :quantity, :greater_than => 12
126
+ #
127
+ def less_than_or_equal_to(table, column, options)
128
+ "check (#{table}.#{column} <= #{options})"
129
+ end
130
+
131
+ ##
132
+ # Allow only values greater than the provided limit.
133
+ #
134
+ # Example:
135
+ # constrain :books, :quantity, :greater_than => 12
136
+ #
137
+ def greater_than(table, column, options)
138
+ "check (#{table}.#{column} > #{options})"
139
+ end
140
+
141
+ ##
142
+ # Allow only values greater than or equal to the provided limit.
143
+ #
144
+ # Example:
145
+ # constrain :books, :quantity, :greater_than_or_equal_to => 12
146
+ #
147
+ def greater_than_or_equal_to(table, column, options)
148
+ "check (#{table}.#{column} >= #{options})"
109
149
  end
110
150
 
111
151
  ##
@@ -0,0 +1,39 @@
1
+ require 'test_helper'
2
+
3
+ class AlphanumericTest < SexyPgConstraintsTest
4
+ def test_alphanumeric
5
+ ActiveRecord::Migration.constrain :books, :title, :alphanumeric => true
6
+
7
+ assert_prohibits Book, :title, :alphanumeric do |book|
8
+ book.title = 'asdf@asdf'
9
+ end
10
+
11
+ assert_allows Book do |book|
12
+ book.title = 'asdf'
13
+ end
14
+
15
+ ActiveRecord::Migration.deconstrain :books, :title, :alphanumeric
16
+
17
+ assert_allows Book do |book|
18
+ book.title = 'asdf@asdf'
19
+ end
20
+ end
21
+
22
+ def test_alphanumeric_on_a_column_whose_name_is_a_sql_keyword
23
+ ActiveRecord::Migration.constrain :books, :as, :alphanumeric => true
24
+
25
+ assert_prohibits Book, :as, :alphanumeric do |book|
26
+ book.as = 'asdf@asdf'
27
+ end
28
+
29
+ assert_allows Book do |book|
30
+ book.as = 'asdf'
31
+ end
32
+
33
+ ActiveRecord::Migration.deconstrain :books, :as, :alphanumeric
34
+
35
+ assert_allows Book do |book|
36
+ book.as = 'asdf@asdf'
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,39 @@
1
+ require 'test_helper'
2
+
3
+ class BlacklistTest < SexyPgConstraintsTest
4
+ def test_blacklist
5
+ ActiveRecord::Migration.constrain :books, :author, :blacklist => %w(blacklisted1 blacklisted2 blacklisted3)
6
+
7
+ assert_prohibits Book, :author, :blacklist do |book|
8
+ book.author = 'blacklisted2'
9
+ end
10
+
11
+ assert_allows Book do |book|
12
+ book.author = 'not_blacklisted'
13
+ end
14
+
15
+ ActiveRecord::Migration.deconstrain :books, :author, :blacklist
16
+
17
+ assert_allows Book do |book|
18
+ book.author = 'blacklisted2'
19
+ end
20
+ end
21
+
22
+ def test_blacklist_on_a_column_whose_name_is_a_sql_keyword
23
+ ActiveRecord::Migration.constrain :books, :as, :blacklist => %w(blacklisted1 blacklisted2 blacklisted3)
24
+
25
+ assert_prohibits Book, :as, :blacklist do |book|
26
+ book.as = 'blacklisted2'
27
+ end
28
+
29
+ assert_allows Book do |book|
30
+ book.as = 'not_blacklisted'
31
+ end
32
+
33
+ ActiveRecord::Migration.deconstrain :books, :as, :blacklist
34
+
35
+ assert_allows Book do |book|
36
+ book.as = 'blacklisted2'
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,39 @@
1
+ require 'test_helper'
2
+
3
+ class EmailTest < SexyPgConstraintsTest
4
+ def test_email
5
+ ActiveRecord::Migration.constrain :books, :author, :email => true
6
+
7
+ assert_prohibits Book, :author, :email do |book|
8
+ book.author = 'blah@example'
9
+ end
10
+
11
+ assert_allows Book do |book|
12
+ book.author = 'blah@example.com'
13
+ end
14
+
15
+ ActiveRecord::Migration.deconstrain :books, :author, :email
16
+
17
+ assert_allows Book do |book|
18
+ book.author = 'blah@example'
19
+ end
20
+ end
21
+
22
+ def test_email_on_a_column_whose_name_is_a_sql_keyword
23
+ ActiveRecord::Migration.constrain :books, :as, :email => true
24
+
25
+ assert_prohibits Book, :as, :email do |book|
26
+ book.as = 'blah@example'
27
+ end
28
+
29
+ assert_allows Book do |book|
30
+ book.as = 'blah@example.com'
31
+ end
32
+
33
+ ActiveRecord::Migration.deconstrain :books, :as, :email
34
+
35
+ assert_allows Book do |book|
36
+ book.as = 'blah@example'
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,47 @@
1
+ require 'test_helper'
2
+
3
+ class ExactLengthTest < SexyPgConstraintsTest
4
+ def test_exact_length
5
+ ActiveRecord::Migration.constrain :books, :isbn, :exact_length => 5
6
+
7
+ assert_prohibits Book, :isbn, :exact_length do |book|
8
+ book.isbn = '123456'
9
+ end
10
+
11
+ assert_prohibits Book, :isbn, :exact_length do |book|
12
+ book.isbn = '1234'
13
+ end
14
+
15
+ assert_allows Book do |book|
16
+ book.isbn = '12345'
17
+ end
18
+
19
+ ActiveRecord::Migration.deconstrain :books, :isbn, :exact_length
20
+
21
+ assert_allows Book do |book|
22
+ book.isbn = '123456'
23
+ end
24
+ end
25
+
26
+ def test_exact_length_on_a_column_whose_name_is_a_sql_keyword
27
+ ActiveRecord::Migration.constrain :books, :as, :exact_length => 5
28
+
29
+ assert_prohibits Book, :as, :exact_length do |book|
30
+ book.as = '123456'
31
+ end
32
+
33
+ assert_prohibits Book, :as, :exact_length do |book|
34
+ book.as = '1234'
35
+ end
36
+
37
+ assert_allows Book do |book|
38
+ book.as = '12345'
39
+ end
40
+
41
+ ActiveRecord::Migration.deconstrain :books, :as, :exact_length
42
+
43
+ assert_allows Book do |book|
44
+ book.as = '123456'
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,91 @@
1
+ require 'test_helper'
2
+
3
+ class FormatTest < SexyPgConstraintsTest
4
+ def test_format_case_insensitive
5
+ ActiveRecord::Migration.constrain :books, :title, :format => /^[a-z]+$/i
6
+
7
+ assert_prohibits Book, :title, :format do |book|
8
+ book.title = 'abc3'
9
+ end
10
+
11
+ assert_prohibits Book, :title, :format do |book|
12
+ book.title = ''
13
+ end
14
+
15
+ assert_allows Book do |book|
16
+ book.title = 'abc'
17
+ end
18
+
19
+ assert_allows Book do |book|
20
+ book.title = 'ABc'
21
+ end
22
+
23
+ ActiveRecord::Migration.deconstrain :books, :title, :format
24
+
25
+ assert_allows Book do |book|
26
+ book.title = 'abc3'
27
+ end
28
+ end
29
+
30
+ def test_format_case_insensitive_on_a_column_whose_name_is_a_sql_keyword
31
+ ActiveRecord::Migration.constrain :books, :as, :format => /^[a-z]+$/i
32
+
33
+ assert_prohibits Book, :as, :format do |book|
34
+ book.as = 'abc3'
35
+ end
36
+
37
+ assert_prohibits Book, :as, :format do |book|
38
+ book.as = ''
39
+ end
40
+
41
+ assert_allows Book do |book|
42
+ book.as = 'abc'
43
+ end
44
+
45
+ assert_allows Book do |book|
46
+ book.as = 'ABc'
47
+ end
48
+
49
+ ActiveRecord::Migration.deconstrain :books, :as, :format
50
+
51
+ assert_allows Book do |book|
52
+ book.as = 'abc3'
53
+ end
54
+ end
55
+
56
+ def test_format_case_sensitive
57
+ ActiveRecord::Migration.constrain :books, :title, :format => /^[a-z]+$/
58
+
59
+ assert_prohibits Book, :title, :format do |book|
60
+ book.title = 'aBc'
61
+ end
62
+
63
+ assert_allows Book do |book|
64
+ book.title = 'abc'
65
+ end
66
+
67
+ ActiveRecord::Migration.deconstrain :books, :title, :format
68
+
69
+ assert_allows Book do |book|
70
+ book.title = 'aBc'
71
+ end
72
+ end
73
+
74
+ def test_format_case_sensitive_on_a_column_whose_name_is_a_sql_keyword
75
+ ActiveRecord::Migration.constrain :books, :as, :format => /^[a-z]+$/
76
+
77
+ assert_prohibits Book, :as, :format do |book|
78
+ book.as = 'aBc'
79
+ end
80
+
81
+ assert_allows Book do |book|
82
+ book.as = 'abc'
83
+ end
84
+
85
+ ActiveRecord::Migration.deconstrain :books, :as, :format
86
+
87
+ assert_allows Book do |book|
88
+ book.as = 'aBc'
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,132 @@
1
+ require 'test_helper'
2
+
3
+ require 'test_helper'
4
+
5
+ class GeneralTest < SexyPgConstraintsTest
6
+ def test_should_create_book
7
+ Book.create
8
+ assert_equal 1, Book.count
9
+ end
10
+
11
+ def test_block_syntax
12
+ ActiveRecord::Migration.constrain :books do |t|
13
+ t.title :not_blank => true
14
+ t.isbn :exact_length => 15
15
+ t.author :alphanumeric => true
16
+ end
17
+
18
+ assert_prohibits Book, :title, :not_blank do |book|
19
+ book.title = ' '
20
+ end
21
+
22
+ assert_prohibits Book, :isbn, :exact_length do |book|
23
+ book.isbn = 'asdf'
24
+ end
25
+
26
+ assert_prohibits Book, :author, :alphanumeric do |book|
27
+ book.author = 'foo#bar'
28
+ end
29
+
30
+ ActiveRecord::Migration.deconstrain :books do |t|
31
+ t.title :not_blank
32
+ t.isbn :exact_length
33
+ t.author :alphanumeric
34
+ end
35
+
36
+ assert_allows Book do |book|
37
+ book.title = ' '
38
+ book.isbn = 'asdf'
39
+ book.author = 'foo#bar'
40
+ end
41
+ end
42
+
43
+ def test_multiple_constraints_per_line
44
+ ActiveRecord::Migration.constrain :books do |t|
45
+ t.title :not_blank => true, :alphanumeric => true, :blacklist => %w(foo bar)
46
+ end
47
+
48
+ assert_prohibits Book, :title, [:not_blank, :alphanumeric] do |book|
49
+ book.title = ' '
50
+ end
51
+
52
+ assert_prohibits Book, :title, :alphanumeric do |book|
53
+ book.title = 'asdf@asdf'
54
+ end
55
+
56
+ assert_prohibits Book, :title, :blacklist do |book|
57
+ book.title = 'foo'
58
+ end
59
+
60
+ ActiveRecord::Migration.deconstrain :books do |t|
61
+ t.title :not_blank, :alphanumeric, :blacklist
62
+ end
63
+
64
+ assert_allows Book do |book|
65
+ book.title = ' '
66
+ end
67
+
68
+ assert_allows Book do |book|
69
+ book.title = 'asdf@asdf'
70
+ end
71
+
72
+ assert_allows Book do |book|
73
+ book.title = 'foo'
74
+ end
75
+ end
76
+
77
+ def test_multicolumn_constraint
78
+ ActiveRecord::Migration.constrain :books, [:title, :isbn], :unique => true
79
+
80
+ assert_allows Book do |book|
81
+ book.title = 'foo'
82
+ book.isbn = 'bar'
83
+ end
84
+
85
+ assert_allows Book do |book|
86
+ book.title = 'foo'
87
+ book.isbn = 'foo'
88
+ end
89
+
90
+ assert_prohibits Book, [:title, :isbn], :unique, 'unique', ActiveRecord::RecordNotUnique do |book|
91
+ book.title = 'foo'
92
+ book.isbn = 'bar'
93
+ end
94
+
95
+ ActiveRecord::Migration.deconstrain :books, [:title, :isbn], :unique
96
+
97
+ assert_allows Book do |book|
98
+ book.title = 'foo'
99
+ book.isbn = 'bar'
100
+ end
101
+ end
102
+
103
+ def test_multicolumn_constraint_block_syntax
104
+ ActiveRecord::Migration.constrain :books do |t|
105
+ t[:title, :isbn].all :unique => true
106
+ end
107
+
108
+ assert_allows Book do |book|
109
+ book.title = 'foo'
110
+ book.isbn = 'bar'
111
+ end
112
+
113
+ assert_allows Book do |book|
114
+ book.title = 'foo'
115
+ book.isbn = 'foo'
116
+ end
117
+
118
+ assert_prohibits Book, [:title, :isbn], :unique, 'unique', ActiveRecord::RecordNotUnique do |book|
119
+ book.title = 'foo'
120
+ book.isbn = 'bar'
121
+ end
122
+
123
+ ActiveRecord::Migration.deconstrain :books do |t|
124
+ t[:title, :isbn].all :unique
125
+ end
126
+
127
+ assert_allows Book do |book|
128
+ book.title = 'foo'
129
+ book.isbn = 'bar'
130
+ end
131
+ end
132
+ end