validation-sets 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,2 @@
1
+ pkg
2
+ rdoc
data/README.rdoc CHANGED
@@ -0,0 +1,59 @@
1
+ = Validation Sets
2
+
3
+ A Rails plugin to bundle validations in sets. You can turn entire sets of validations on or off on
4
+ an instance. This allows you to use different sets of validations for various user roles in the
5
+ application, or for different stages in the lifetime of the model.
6
+
7
+ validation_set_for(:activation) do |set|
8
+ set.validates_presence_of :fullname, :username, :email
9
+ set.validate :password_should_fit_requirements
10
+ end
11
+
12
+
13
+ == The Case of the Organization
14
+
15
+ Let's assume we have an organization in our application. The organization represents a company
16
+ using the application. Administrators add these organizations, but often they don't have all the
17
+ information about the company yet. It's up to the contact at the organization to complete it.
18
+
19
+ class Organization < ActiveRecord::Base
20
+ validates_presence_of :name
21
+
22
+ validation_set_for(:contact) do |set|
23
+ set.validates_presence_of :address, :zipcode, :city
24
+ end
25
+ end
26
+
27
+ Now we can have two controllers, one of the administrator and one for the contact. For the
28
+ administrator we don't run any validations except on name so she can choose to fill out any
29
+ of the field.
30
+
31
+ class Administrator::OrganizationsController < ActionController::Base
32
+ allow_access :administrator
33
+
34
+ def create
35
+ @organization = Organization.new(params[:organization])
36
+ if @organization.save
37
+ redirect_to [:administrator, @organization]
38
+ else
39
+ render :new
40
+ end
41
+ end
42
+ end
43
+
44
+ For the contact we turn on the extra set of validations for the contact so all the fields
45
+ need to be filled out.
46
+
47
+ class Contact::OrganizationsController < ActionController::Base
48
+ allow_access(:contact) { @organization = @authenticated.organization }
49
+
50
+ def update
51
+ @organization.attributes = params[:organization].slice(:address, :zipcode, :city)
52
+ @organization.use_validation_set(:contact)
53
+ if @organization.save
54
+ redirect_to [:contact, @organization]
55
+ else
56
+ render :edit
57
+ end
58
+ end
59
+ end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.0
1
+ 1.1.0
@@ -1,22 +1,28 @@
1
1
  module ValidationSets
2
+ # A ValidationSet instance is used to redirect the original validation methods (validate,
3
+ # validate_on_create, and validate_on_update) to the callback chain for the set.
2
4
  class ValidationSet
3
5
  def initialize(model, label)
4
6
  @model = model
5
7
  @label = label
6
8
  end
7
9
 
10
+ # Adds a validation method or proc that always runs
8
11
  def validate(*params, &block)
9
12
  send(validation_set_method(:save, @label), *params, &block)
10
13
  end
11
14
 
15
+ # Adds a validation method or proc that runs on create
12
16
  def validate_on_create(*params, &block)
13
17
  send(validation_set_method(:create, @label), *params, &block)
14
18
  end
15
19
 
20
+ # Adds a validation method or proc that runs on update
16
21
  def validate_on_update(*params, &block)
17
22
  send(validation_set_method(:update, @label), *params, &block)
18
23
  end
19
24
 
25
+ # Forwards all other methods (ie. validates_presence_of) to the model class.
20
26
  def method_missing(method, *attributes, &block)
21
27
  @model.send(method, *attributes, &block)
22
28
  end
@@ -1,8 +1,11 @@
1
1
  module ValidationSets
2
2
  autoload :ValidationSet, 'validation_sets/validation_set'
3
3
 
4
+ # Used to set the current validation set during definition of the model
4
5
  attr_accessor :current_validation_set
5
6
 
7
+ # Returns the name of the validation callback method for a save method and the label of a
8
+ # validation set.
6
9
  def validation_set_method(on, label)
7
10
  case on
8
11
  when :save then "validate_#{label}_set".to_sym
@@ -11,6 +14,7 @@ module ValidationSets
11
14
  end
12
15
  end
13
16
 
17
+ # Returns the name of the validation callback method for a save method.
14
18
  def validation_method(on)
15
19
  if current_validation_set
16
20
  validation_set_method(on, current_validation_set)
@@ -19,6 +23,20 @@ module ValidationSets
19
23
  end
20
24
  end
21
25
 
26
+ # Returns true if the validation set is defined on this class
27
+ def validation_set_defined?(set)
28
+ [:save, :create, :update].any? do |on|
29
+ respond_to?(validation_set_method(on, set))
30
+ end
31
+ end
32
+
33
+ # Add a validation set to the model.
34
+ #
35
+ # class Account < ActiveRecord::Base
36
+ # validation_set_for(:activation) do |set|
37
+ # set.validates_presence_of :username
38
+ # end
39
+ # end
22
40
  def validation_set_for(label, &block)
23
41
  [:save, :create, :update].each do |save_method|
24
42
  callback_chain = validation_method(save_method)
@@ -41,15 +59,29 @@ module ValidationSets
41
59
  module InstanceMethods
42
60
  attr_reader :_validation_set
43
61
 
62
+ # Set the active validation set on the model. After calling this both the global as well as
63
+ # the validations defined in the set will run.
64
+ #
65
+ # Raises an exception when asked to use an unknown validation set.
66
+ #
67
+ # Example:
68
+ #
69
+ # account = Account.new
70
+ # account.use_validation_set(:admin) # Turns on the :admin validation set
71
+ # account.use_validation_set(nil) # Turns off all validation sets
44
72
  def use_validation_set(set)
45
- @_validation_set = set
73
+ if self.class.validation_set_defined?(set)
74
+ @_validation_set = set
75
+ else
76
+ raise ArgumentError, "There is no validation set `#{set}'"
77
+ end
46
78
  end
47
79
  end
48
80
  end
49
81
 
50
- class ActiveRecord::Base
51
- class << self
52
- include ValidationSets
82
+ module ActiveRecord #:nodoc:
83
+ class Base #:nodoc:
84
+ extend ValidationSets
85
+ include ValidationSets::InstanceMethods
53
86
  end
54
- include ValidationSets::InstanceMethods
55
87
  end
@@ -88,6 +88,13 @@ class ValidationSetsTest < ActiveSupport::TestCase
88
88
  assert account.save
89
89
  end
90
90
 
91
+ test "an exception is raised when trying to activate an unknown validation set" do
92
+ account = Account.new
93
+ assert_raises(ArgumentError) do
94
+ account.use_validation_set(:unknown)
95
+ end
96
+ end
97
+
91
98
  def setup
92
99
  ValidationSetsTests::Initializer.setup_database
93
100
  end
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{validation-sets}
8
- s.version = "1.0.0"
8
+ s.version = "1.1.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Manfred Stienstra"]
12
- s.date = %q{2010-03-26}
12
+ s.date = %q{2010-08-05}
13
13
  s.description = %q{A Rails plugin that adds validation sets to Active Record.}
14
14
  s.email = %q{manfred@fngtps.com}
15
15
  s.extra_rdoc_files = [
@@ -17,7 +17,8 @@ Gem::Specification.new do |s|
17
17
  "README.rdoc"
18
18
  ]
19
19
  s.files = [
20
- ".kick",
20
+ ".gitignore",
21
+ ".kick",
21
22
  "LICENSE",
22
23
  "README.rdoc",
23
24
  "Rakefile",
@@ -33,7 +34,7 @@ Gem::Specification.new do |s|
33
34
  s.homepage = %q{http://fingertips.github.com}
34
35
  s.rdoc_options = ["--charset=UTF-8"]
35
36
  s.require_paths = ["lib"]
36
- s.rubygems_version = %q{1.3.5}
37
+ s.rubygems_version = %q{1.3.7}
37
38
  s.summary = %q{A Rails plugin that adds validation sets to Active Record.}
38
39
  s.test_files = [
39
40
  "test/test_helper.rb",
@@ -45,7 +46,7 @@ Gem::Specification.new do |s|
45
46
  current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
46
47
  s.specification_version = 3
47
48
 
48
- if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
49
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
49
50
  else
50
51
  end
51
52
  else
metadata CHANGED
@@ -1,7 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: validation-sets
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ hash: 19
5
+ prerelease: false
6
+ segments:
7
+ - 1
8
+ - 1
9
+ - 0
10
+ version: 1.1.0
5
11
  platform: ruby
6
12
  authors:
7
13
  - Manfred Stienstra
@@ -9,7 +15,7 @@ autorequire:
9
15
  bindir: bin
10
16
  cert_chain: []
11
17
 
12
- date: 2010-03-26 00:00:00 +01:00
18
+ date: 2010-08-05 00:00:00 +02:00
13
19
  default_executable:
14
20
  dependencies: []
15
21
 
@@ -23,6 +29,7 @@ extra_rdoc_files:
23
29
  - LICENSE
24
30
  - README.rdoc
25
31
  files:
32
+ - .gitignore
26
33
  - .kick
27
34
  - LICENSE
28
35
  - README.rdoc
@@ -45,21 +52,27 @@ rdoc_options:
45
52
  require_paths:
46
53
  - lib
47
54
  required_ruby_version: !ruby/object:Gem::Requirement
55
+ none: false
48
56
  requirements:
49
57
  - - ">="
50
58
  - !ruby/object:Gem::Version
59
+ hash: 3
60
+ segments:
61
+ - 0
51
62
  version: "0"
52
- version:
53
63
  required_rubygems_version: !ruby/object:Gem::Requirement
64
+ none: false
54
65
  requirements:
55
66
  - - ">="
56
67
  - !ruby/object:Gem::Version
68
+ hash: 3
69
+ segments:
70
+ - 0
57
71
  version: "0"
58
- version:
59
72
  requirements: []
60
73
 
61
74
  rubyforge_project:
62
- rubygems_version: 1.3.5
75
+ rubygems_version: 1.3.7
63
76
  signing_key:
64
77
  specification_version: 3
65
78
  summary: A Rails plugin that adds validation sets to Active Record.