valcro 0.0.1
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/.gitignore +4 -0
- data/Gemfile +4 -0
- data/Rakefile +1 -0
- data/lib/valcro.rb +42 -0
- data/lib/valcro/error.rb +18 -0
- data/lib/valcro/error_list.rb +32 -0
- data/lib/valcro/runner.rb +19 -0
- data/lib/valcro/version.rb +3 -0
- data/spec/error_list_spec.rb +59 -0
- data/spec/error_spec.rb +25 -0
- data/spec/runner_spec.rb +19 -0
- data/spec/spec_helper.rb +2 -0
- data/spec/valcro_spec.rb +66 -0
- data/valcro.gemspec +22 -0
- metadata +75 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/lib/valcro.rb
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'valcro/error'
|
2
|
+
require 'valcro/error_list'
|
3
|
+
require 'valcro/runner'
|
4
|
+
|
5
|
+
module Valcro
|
6
|
+
def self.included(base)
|
7
|
+
base.extend ClassMethods
|
8
|
+
end
|
9
|
+
|
10
|
+
def errors
|
11
|
+
@error_list ||= Valcro::ErrorList.new
|
12
|
+
end
|
13
|
+
|
14
|
+
def valid?
|
15
|
+
!errors.any?
|
16
|
+
end
|
17
|
+
|
18
|
+
def error_messages
|
19
|
+
errors.to_s
|
20
|
+
end
|
21
|
+
|
22
|
+
def validate
|
23
|
+
self.class.validators.each do |validator_class|
|
24
|
+
validation_runner.add_validator validator_class.new(self)
|
25
|
+
end
|
26
|
+
validation_runner.validate
|
27
|
+
end
|
28
|
+
|
29
|
+
def validation_runner
|
30
|
+
@validation_runner ||= Valcro::Runner.new(errors)
|
31
|
+
end
|
32
|
+
|
33
|
+
module ClassMethods
|
34
|
+
def validates_with(validator_class)
|
35
|
+
validators << validator_class
|
36
|
+
end
|
37
|
+
|
38
|
+
def validators
|
39
|
+
@validators ||= []
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
data/lib/valcro/error.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
module Valcro
|
2
|
+
class Error
|
3
|
+
attr_accessor :property, :message
|
4
|
+
|
5
|
+
def initialize(property, message)
|
6
|
+
@property = property
|
7
|
+
@message = message
|
8
|
+
end
|
9
|
+
|
10
|
+
def to_s
|
11
|
+
if @property == :base
|
12
|
+
message
|
13
|
+
else
|
14
|
+
"#{property.to_s} #{message}"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Valcro
|
2
|
+
class ErrorList
|
3
|
+
attr_accessor :errors
|
4
|
+
def initialize
|
5
|
+
@errors = []
|
6
|
+
end
|
7
|
+
|
8
|
+
def <<(error)
|
9
|
+
@errors << error
|
10
|
+
end
|
11
|
+
|
12
|
+
def add(prop, message)
|
13
|
+
@errors << Valcro::Error.new(prop, message)
|
14
|
+
end
|
15
|
+
|
16
|
+
def [](prop)
|
17
|
+
@errors.select { |error| error.property == prop }.map(&:message) || []
|
18
|
+
end
|
19
|
+
|
20
|
+
def full_messages
|
21
|
+
@errors.map(&:to_s)
|
22
|
+
end
|
23
|
+
|
24
|
+
def to_s
|
25
|
+
full_messages.join(' ')
|
26
|
+
end
|
27
|
+
|
28
|
+
def any?
|
29
|
+
@errors.any?
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Valcro
|
2
|
+
class Runner
|
3
|
+
attr_accessor :validators, :error_list
|
4
|
+
def initialize(error_list = ErrorList.new)
|
5
|
+
@validators = []
|
6
|
+
@error_list = error_list
|
7
|
+
end
|
8
|
+
|
9
|
+
def add_validator(validator)
|
10
|
+
@validators << validator
|
11
|
+
end
|
12
|
+
|
13
|
+
def validate
|
14
|
+
@validators.each do |validator|
|
15
|
+
validator.call error_list
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Valcro::ErrorList, 'adding errors' do
|
4
|
+
it 'supports adding via <<' do
|
5
|
+
list = Valcro::ErrorList.new
|
6
|
+
list << Valcro::Error.new(:prop, 'message')
|
7
|
+
|
8
|
+
list.should have(1).errors
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
describe Valcro::ErrorList, '#add' do
|
13
|
+
it 'finds and agregates error messages' do
|
14
|
+
list = Valcro::ErrorList.new
|
15
|
+
|
16
|
+
list[:one].should == []
|
17
|
+
|
18
|
+
list.add(:one, 'message one')
|
19
|
+
list.add(:two, 'message two')
|
20
|
+
list.add(:one, 'another message one')
|
21
|
+
|
22
|
+
list[:one].should == ['message one', 'another message one']
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe Valcro::ErrorList, '#full_messages' do
|
27
|
+
it 'gives a collection of messages' do
|
28
|
+
list = Valcro::ErrorList.new
|
29
|
+
|
30
|
+
list.add :prop, 'one'
|
31
|
+
list.add :prop, 'two'
|
32
|
+
list.add :prop,'three'
|
33
|
+
|
34
|
+
list.full_messages.should == ["prop one", "prop two", "prop three"]
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe Valcro::ErrorList, '#to_s' do
|
39
|
+
it 'gives messages as one string' do
|
40
|
+
list = Valcro::ErrorList.new
|
41
|
+
|
42
|
+
list.add :prop, 'one'
|
43
|
+
list.add :prop, 'two'
|
44
|
+
list.add :prop, 'three'
|
45
|
+
|
46
|
+
list.to_s.should == "prop one prop two prop three"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe Valcro::ErrorList, '#any?' do
|
51
|
+
it 'is true when there are errors 'do
|
52
|
+
list = Valcro::ErrorList.new
|
53
|
+
|
54
|
+
list.any?.should be_false
|
55
|
+
list.add :prop, 'some error'
|
56
|
+
|
57
|
+
list.any?.should be_true
|
58
|
+
end
|
59
|
+
end
|
data/spec/error_spec.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Valcro::Error do
|
4
|
+
it 'has a property and a message' do
|
5
|
+
error = create_error(:prop, 'message')
|
6
|
+
|
7
|
+
error.property.should == :prop
|
8
|
+
error.message.should == 'message'
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'can coerce to a string' do
|
12
|
+
error = create_error
|
13
|
+
error.to_s.should == 'prop message'
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'does not include property if it is base' do
|
17
|
+
error = create_error(:base)
|
18
|
+
error.to_s.should == 'message'
|
19
|
+
end
|
20
|
+
|
21
|
+
def create_error(prop = :prop, message = 'message')
|
22
|
+
Valcro::Error.new(prop, message)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
data/spec/runner_spec.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Valcro::Runner do
|
4
|
+
it 'can store validators' do
|
5
|
+
runner = Valcro::Runner.new
|
6
|
+
runner.add_validator :some_validator
|
7
|
+
runner.validators.should have(1).proc
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'runs validators' do
|
11
|
+
error_list = Valcro::ErrorList.new
|
12
|
+
runner = Valcro::Runner.new(error_list)
|
13
|
+
runner.add_validator lambda { |errors| errors.add :foo, 'Huge mistake' }
|
14
|
+
|
15
|
+
runner.validate
|
16
|
+
|
17
|
+
error_list.any?.should be_true
|
18
|
+
end
|
19
|
+
end
|
data/spec/spec_helper.rb
ADDED
data/spec/valcro_spec.rb
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Valcro do
|
4
|
+
class TestClass
|
5
|
+
include Valcro
|
6
|
+
end
|
7
|
+
|
8
|
+
subject { TestClass.new }
|
9
|
+
it { should be_valid }
|
10
|
+
end
|
11
|
+
|
12
|
+
describe Valcro, 'adding some errors' do
|
13
|
+
class TestClass
|
14
|
+
include Valcro
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'gives access to the error list' do
|
18
|
+
test_instance = TestClass.new
|
19
|
+
test_instance.should be_valid
|
20
|
+
|
21
|
+
test_instance.errors.add(:foo, 'too foo for my taste')
|
22
|
+
|
23
|
+
test_instance.errors[:foo].should have(1).error
|
24
|
+
|
25
|
+
test_instance.should_not be_valid
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe Valcro, 'validators' do
|
30
|
+
class StatusFail
|
31
|
+
def initialize(context)
|
32
|
+
@context = context
|
33
|
+
end
|
34
|
+
def call(errors)
|
35
|
+
errors.add(:status, 'big mistake') if @context.status == 'fail'
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
class TestClass
|
40
|
+
include Valcro
|
41
|
+
def status
|
42
|
+
"fail"
|
43
|
+
end
|
44
|
+
validates_with StatusFail
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'can be added validators' do
|
48
|
+
test_instance = TestClass.new
|
49
|
+
|
50
|
+
test_instance.validate
|
51
|
+
test_instance.should_not be_valid
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
describe Valcro, '#error_messages' do
|
56
|
+
class TestClass
|
57
|
+
include Valcro
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'delegates to errors' do
|
61
|
+
test_instance = TestClass.new
|
62
|
+
test_instance.stub!(errors: double(to_s: 'some errors'))
|
63
|
+
|
64
|
+
test_instance.error_messages.should == 'some errors'
|
65
|
+
end
|
66
|
+
end
|
data/valcro.gemspec
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "valcro/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "valcro"
|
7
|
+
s.version = Valcro::VERSION
|
8
|
+
s.authors = ["Harold Giménez"]
|
9
|
+
s.email = ["harold.gimenez@gmail.com"]
|
10
|
+
s.homepage = ""
|
11
|
+
s.summary = %q{Validation so simple you probably don't need this}
|
12
|
+
s.description = %q{Validation so simple you probably don't need this}
|
13
|
+
|
14
|
+
s.rubyforge_project = "valcro"
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
|
21
|
+
s.add_development_dependency "rspec"
|
22
|
+
end
|
metadata
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: valcro
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Harold Giménez
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-02-08 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rspec
|
16
|
+
requirement: &70333795201320 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70333795201320
|
25
|
+
description: Validation so simple you probably don't need this
|
26
|
+
email:
|
27
|
+
- harold.gimenez@gmail.com
|
28
|
+
executables: []
|
29
|
+
extensions: []
|
30
|
+
extra_rdoc_files: []
|
31
|
+
files:
|
32
|
+
- .gitignore
|
33
|
+
- Gemfile
|
34
|
+
- Rakefile
|
35
|
+
- lib/valcro.rb
|
36
|
+
- lib/valcro/error.rb
|
37
|
+
- lib/valcro/error_list.rb
|
38
|
+
- lib/valcro/runner.rb
|
39
|
+
- lib/valcro/version.rb
|
40
|
+
- spec/error_list_spec.rb
|
41
|
+
- spec/error_spec.rb
|
42
|
+
- spec/runner_spec.rb
|
43
|
+
- spec/spec_helper.rb
|
44
|
+
- spec/valcro_spec.rb
|
45
|
+
- valcro.gemspec
|
46
|
+
homepage: ''
|
47
|
+
licenses: []
|
48
|
+
post_install_message:
|
49
|
+
rdoc_options: []
|
50
|
+
require_paths:
|
51
|
+
- lib
|
52
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
53
|
+
none: false
|
54
|
+
requirements:
|
55
|
+
- - ! '>='
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: '0'
|
58
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
59
|
+
none: false
|
60
|
+
requirements:
|
61
|
+
- - ! '>='
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: '0'
|
64
|
+
requirements: []
|
65
|
+
rubyforge_project: valcro
|
66
|
+
rubygems_version: 1.8.10
|
67
|
+
signing_key:
|
68
|
+
specification_version: 3
|
69
|
+
summary: Validation so simple you probably don't need this
|
70
|
+
test_files:
|
71
|
+
- spec/error_list_spec.rb
|
72
|
+
- spec/error_spec.rb
|
73
|
+
- spec/runner_spec.rb
|
74
|
+
- spec/spec_helper.rb
|
75
|
+
- spec/valcro_spec.rb
|