not_naughty 0.3.1 → 0.4
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.
- data/CHANGELOG +4 -0
- data/README +35 -29
- data/Rakefile +1 -1
- data/lib/not_naughty/validations/acceptance_validation.rb +11 -4
- data/lib/not_naughty/validations/confirmation_validation.rb +2 -2
- data/lib/sequel_not_naughty.rb +19 -3
- data/spec/builder_spec.rb +11 -0
- metadata +2 -2
data/CHANGELOG
CHANGED
data/README
CHANGED
|
@@ -1,36 +1,11 @@
|
|
|
1
1
|
= NotNaughty - The Validation Framework
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
* API compatible to Sequel as plugin (see Sequel::Plugins::NotNaughty for
|
|
5
|
-
details):
|
|
3
|
+
NotNaughty extends your ruby Project with a highly custumizable validation API.
|
|
6
4
|
|
|
7
|
-
|
|
8
|
-
is :not_naughty
|
|
9
|
-
validates { presence_of :username and length_of :username, :within => 4..16 }
|
|
10
|
-
has_validations? # => true
|
|
11
|
-
|
|
12
|
-
# ...
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
* Syntactical Sugar with Builder methods:
|
|
16
|
-
|
|
17
|
-
validates(:username, :password) {length :minimum => 6}
|
|
18
|
-
validates(:password) {confirmed and complexity :level => :high}
|
|
19
|
-
validates(:if => :necessary?) {bunchyness_of :crap}
|
|
5
|
+
== Features
|
|
20
6
|
|
|
21
|
-
|
|
7
|
+
<b>Easy to adapt:</b>
|
|
22
8
|
|
|
23
|
-
validates_presence_of :person,
|
|
24
|
-
:message => '#{"%s".humanize} is gone missing.'
|
|
25
|
-
|
|
26
|
-
* Conditional Validations:
|
|
27
|
-
|
|
28
|
-
validates(:if => :necessary?) {...}
|
|
29
|
-
validates(:unless => proc {|obj| obj.vip?}) {...}
|
|
30
|
-
|
|
31
|
-
* Easy to adapt and to extent:
|
|
32
|
-
|
|
33
|
-
_adapt_
|
|
34
9
|
require 'rubygems'
|
|
35
10
|
require 'not_naughty'
|
|
36
11
|
Person = Struct.new(:name) do
|
|
@@ -44,7 +19,8 @@
|
|
|
44
19
|
Person.new('Foo').clone # goes *boom* with NotNaughty::ValidationException
|
|
45
20
|
Person.new('Foo').dup # => false
|
|
46
21
|
|
|
47
|
-
|
|
22
|
+
<b>Easy to extent:</b>
|
|
23
|
+
|
|
48
24
|
class BunchynessValidation < NotNaughty::Validation
|
|
49
25
|
def initialize(opts, attributes)
|
|
50
26
|
__message = opts[:message] || '#{"%s".humanize} is not bunchy.'
|
|
@@ -59,4 +35,34 @@
|
|
|
59
35
|
validates_bunchyness_of :bunchy_item
|
|
60
36
|
end
|
|
61
37
|
|
|
38
|
+
<b>Syntactical Sugar with Builder methods:</b>
|
|
39
|
+
|
|
40
|
+
validates(:username, :password) {length :minimum => 6}
|
|
41
|
+
validates(:password) {confirmed and complexity :level => :high}
|
|
42
|
+
validates(:if => :necessary?) {bunchyness_of :crap}
|
|
43
|
+
|
|
44
|
+
<b>Beautiful error messages:</b>
|
|
45
|
+
|
|
46
|
+
validates_presence_of :person,
|
|
47
|
+
:message => '#{"%s".humanize} is gone missing.'
|
|
48
|
+
|
|
49
|
+
<b>Conditional Validations:</b>
|
|
50
|
+
|
|
51
|
+
validates(:if => :necessary?) {...}
|
|
52
|
+
validates(:unless => proc {|obj| obj.vip?}) {...}
|
|
53
|
+
|
|
54
|
+
<b>API compatible to Ruby-Sequel[http://code.google.com/p/ruby-sequel/] as plugin:</b>
|
|
55
|
+
|
|
56
|
+
class User < Sequel::Model
|
|
57
|
+
is :not_naughty
|
|
58
|
+
validates { presence_of :username and length_of :username, :within => 4..16 }
|
|
59
|
+
has_validations? # => true
|
|
60
|
+
|
|
61
|
+
# ...
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
See Sequel::Plugins::NotNaughty for details...
|
|
65
|
+
|
|
66
|
+
== Copying
|
|
67
|
+
|
|
62
68
|
:include: COPYING
|
data/Rakefile
CHANGED
|
@@ -9,7 +9,7 @@ include FileUtils
|
|
|
9
9
|
# Configuration
|
|
10
10
|
##############################################################################
|
|
11
11
|
NAME = "not_naughty"
|
|
12
|
-
VERS = "0.
|
|
12
|
+
VERS = "0.4"
|
|
13
13
|
CLEAN.include ["**/.*.sw?", "pkg/*", ".config", "doc/*", "coverage/*"]
|
|
14
14
|
RDOC_OPTS = [
|
|
15
15
|
"--quiet",
|
|
@@ -1,21 +1,28 @@
|
|
|
1
1
|
module NotNaughty
|
|
2
2
|
|
|
3
|
-
# == Validates acceptance of obj's attribute against a fixed value.
|
|
3
|
+
# == Validates acceptance of obj's attribute against a fixed value via <tt>:eql?</tt> call.
|
|
4
4
|
#
|
|
5
5
|
# Unless the validation succeeds an error hash (:attribute => :message)
|
|
6
6
|
# is added to the obj's instance of Errors.
|
|
7
7
|
#
|
|
8
8
|
# <b>Options:</b>
|
|
9
|
-
# <tt>:accept</tt>::
|
|
9
|
+
# <tt>:accept</tt>:: object to check against (via :eql?)
|
|
10
10
|
# <tt>:message</tt>:: see NotNaughty::Errors for details
|
|
11
11
|
# <tt>:if</tt>:: see NotNaughty::Validation::Condition for details
|
|
12
12
|
# <tt>:unless</tt>:: see NotNaughty::Validation::Condition for details
|
|
13
13
|
#
|
|
14
14
|
# <b>Example:</b>
|
|
15
15
|
#
|
|
16
|
-
#
|
|
17
|
-
#
|
|
16
|
+
# invalid = 'abc'
|
|
17
|
+
# valid = '1'
|
|
18
|
+
# def invalid.errors() @errors ||= NotNauthy::Errors.new end
|
|
19
|
+
# def valid.errors() @errors ||= NotNauthy::Errors.new end
|
|
18
20
|
#
|
|
21
|
+
# AcceptanceValidation.new({}, :to_s).call invalid, :to_s, 'abc'
|
|
22
|
+
# invalid.errors.on(:to_s).any? # => true
|
|
23
|
+
#
|
|
24
|
+
# AcceptanceValidation.new({}, :to_s).call valid, :to_s, '1'
|
|
25
|
+
# valid.errors.on(:to_s).any? # => false
|
|
19
26
|
class AcceptanceValidation < Validation
|
|
20
27
|
|
|
21
28
|
def initialize(opts, attributes)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
module NotNaughty
|
|
2
2
|
|
|
3
|
-
# == Validates confirmaton of obj's attribute via <tt>:eql?</tt>
|
|
3
|
+
# == Validates confirmaton of obj's attribute via <tt>:eql?</tt> call against the _appropiate_ confirmation attribute.
|
|
4
4
|
#
|
|
5
5
|
# Unless the validation succeeds an error hash (:attribute => :message)
|
|
6
6
|
# is added to the obj's instance of Errors.
|
|
@@ -22,7 +22,7 @@ module NotNaughty
|
|
|
22
22
|
|
|
23
23
|
def initialize(opts, attributes) #:nodoc:
|
|
24
24
|
__message = opts[:message] || '#{"%s".humanize} could not be confirmed.'
|
|
25
|
-
|
|
25
|
+
|
|
26
26
|
if opts[:allow_blank] or opts[:allow_nil]
|
|
27
27
|
__allow = if opts[:allow_blank] then :blank? else :nil? end
|
|
28
28
|
super opts, attributes do |o, a, v|
|
data/lib/sequel_not_naughty.rb
CHANGED
|
@@ -15,25 +15,41 @@ module Sequel #:nodoc:
|
|
|
15
15
|
# is :not_naughty
|
|
16
16
|
# end
|
|
17
17
|
#
|
|
18
|
-
#
|
|
18
|
+
# ---
|
|
19
|
+
#
|
|
20
|
+
# <b>Options:</b>
|
|
21
|
+
#
|
|
22
|
+
# <i>To turn off before_validate and after_validate hooks:</i>
|
|
19
23
|
#
|
|
20
24
|
# class User < Sequel::Model
|
|
21
25
|
# is :not_naughty, :without => :hooks
|
|
22
26
|
# end
|
|
23
27
|
#
|
|
24
|
-
# <
|
|
28
|
+
# <i>To turn off raised Exceptions if validation before save fails:</i>
|
|
25
29
|
#
|
|
26
30
|
# class User < Sequel::Model
|
|
27
31
|
# # save on invalid users will return false
|
|
28
32
|
# is :not_naughty, :without => :exceptions
|
|
29
33
|
# end
|
|
30
34
|
#
|
|
31
|
-
# <
|
|
35
|
+
# <i>To combine those:</i>
|
|
32
36
|
#
|
|
33
37
|
# class User < Sequel::Model
|
|
34
38
|
# is :not_naughty, :without => [:exceptions, :hooks]
|
|
35
39
|
# end
|
|
36
40
|
#
|
|
41
|
+
# ---
|
|
42
|
+
#
|
|
43
|
+
# <b>API compatibility:</b>
|
|
44
|
+
#
|
|
45
|
+
# The validates_length_of method does only one check per attribute.
|
|
46
|
+
# If you want to check minimum and maximum length with different error
|
|
47
|
+
# messages you need to write 2 validations:
|
|
48
|
+
#
|
|
49
|
+
# validates_length_of :name, :minimum => 4
|
|
50
|
+
# validates_length_of :name, :maximum => 12
|
|
51
|
+
#
|
|
52
|
+
# Except the example above the Plugin should be 100% API compatible.
|
|
37
53
|
class NotNaughty < NotNaughty::Validator
|
|
38
54
|
|
|
39
55
|
# Applies plugin to a Sequel::Model.
|
data/spec/builder_spec.rb
CHANGED
|
@@ -61,6 +61,17 @@ describe subject::Builder do
|
|
|
61
61
|
|
|
62
62
|
pending 'expect a block'
|
|
63
63
|
end
|
|
64
|
+
it "should support :each in validates block" do
|
|
65
|
+
@validatable.validator = mock 'Validator'
|
|
66
|
+
@validatable.validator.
|
|
67
|
+
should_receive(:add_validation).
|
|
68
|
+
with(:a, :b, {})
|
|
69
|
+
@validatable.validates do
|
|
70
|
+
each(:a, :b) {|o, a, v|}
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
pending 'expect a block'
|
|
74
|
+
end
|
|
64
75
|
it "should raise a NoMethodError is builder method does not exist" do
|
|
65
76
|
lambda { @validatable.validates() { bunch_of :holy_crap } }.
|
|
66
77
|
should raise_error(NoMethodError)
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: not_naughty
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: "0.4"
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- "Florian A\xC3\x9Fmann"
|
|
@@ -9,7 +9,7 @@ autorequire:
|
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
11
|
|
|
12
|
-
date: 2008-02-
|
|
12
|
+
date: 2008-02-18 00:00:00 +01:00
|
|
13
13
|
default_executable:
|
|
14
14
|
dependencies: []
|
|
15
15
|
|