ohm 0.0.5 → 0.0.6
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/Rakefile +0 -24
- data/lib/ohm/redis.rb +1 -0
- data/lib/ohm/validations.rb +58 -1
- data/test/db/redis.pid +1 -1
- data/test/errors_test.rb +120 -0
- metadata +3 -2
data/Rakefile
CHANGED
@@ -1,33 +1,9 @@
|
|
1
1
|
require "rake/testtask"
|
2
|
-
require 'rake/gempackagetask'
|
3
2
|
|
4
3
|
task :default => :test
|
5
4
|
|
6
|
-
gem_spec_file = 'ohm.gemspec'
|
7
|
-
gem_spec = eval(File.read(gem_spec_file)) rescue nil
|
8
|
-
|
9
5
|
desc 'Run all tests'
|
10
6
|
Rake::TestTask.new(:test) do |t|
|
11
7
|
t.pattern = 'test/**/*_test.rb'
|
12
8
|
t.verbose = false
|
13
9
|
end
|
14
|
-
|
15
|
-
Rake::GemPackageTask.new(gem_spec) do |pkg|
|
16
|
-
pkg.need_zip = false
|
17
|
-
pkg.need_tar = false
|
18
|
-
rm_f FileList['pkg/**/*.*']
|
19
|
-
end if gem_spec
|
20
|
-
|
21
|
-
desc "Generate the gemspec file."
|
22
|
-
task :gemspec do
|
23
|
-
require 'erb'
|
24
|
-
|
25
|
-
File.open(gem_spec_file, 'w') do |f|
|
26
|
-
f.write ERB.new(File.read("#{gem_spec_file}.erb")).result(binding)
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
desc "Builds and installs the gem."
|
31
|
-
task :install => :repackage do
|
32
|
-
`sudo gem install pkg/#{gem_spec.name}-#{gem_spec.version}.gem`
|
33
|
-
end
|
data/lib/ohm/redis.rb
CHANGED
data/lib/ohm/validations.rb
CHANGED
@@ -1,5 +1,62 @@
|
|
1
1
|
module Ohm
|
2
2
|
module Validations
|
3
|
+
class Presenter
|
4
|
+
class UnhandledErrors < StandardError
|
5
|
+
attr :errors
|
6
|
+
|
7
|
+
def initialize(errors)
|
8
|
+
@errors = errors
|
9
|
+
end
|
10
|
+
|
11
|
+
def message
|
12
|
+
"Unhandled errors: #{errors.inspect}"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def initialize(errors)
|
17
|
+
@errors = errors
|
18
|
+
@unhandled = errors.dup
|
19
|
+
@output = []
|
20
|
+
end
|
21
|
+
|
22
|
+
def on(error, message = (block_given? ? yield : raise(ArgumentError)))
|
23
|
+
handle(error) do
|
24
|
+
@output << message
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def ignore(error)
|
29
|
+
handle(error)
|
30
|
+
end
|
31
|
+
|
32
|
+
def present
|
33
|
+
yield(self)
|
34
|
+
raise UnhandledErrors.new(@unhandled) unless @unhandled.empty?
|
35
|
+
@output
|
36
|
+
end
|
37
|
+
|
38
|
+
protected
|
39
|
+
|
40
|
+
def handle(error)
|
41
|
+
if (errors = @errors.select {|e| error === e }).any?
|
42
|
+
@unhandled -= errors
|
43
|
+
yield(errors) if block_given?
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
class Errors < Array
|
49
|
+
attr_accessor :model
|
50
|
+
|
51
|
+
def initialize(model)
|
52
|
+
@model = model
|
53
|
+
end
|
54
|
+
|
55
|
+
def present(presenter = Presenter, &block)
|
56
|
+
presenter.new(model.errors).present(&block)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
3
60
|
def valid?
|
4
61
|
errors.clear
|
5
62
|
validate
|
@@ -10,7 +67,7 @@ module Ohm
|
|
10
67
|
end
|
11
68
|
|
12
69
|
def errors
|
13
|
-
@errors ||=
|
70
|
+
@errors ||= Errors.new(self)
|
14
71
|
end
|
15
72
|
|
16
73
|
protected
|
data/test/db/redis.pid
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
36980
|
data/test/errors_test.rb
ADDED
@@ -0,0 +1,120 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), "test_helper")
|
2
|
+
|
3
|
+
class ErrorsTest < Test::Unit::TestCase
|
4
|
+
class User < Ohm::Model
|
5
|
+
attribute :name
|
6
|
+
attribute :account
|
7
|
+
|
8
|
+
def validate
|
9
|
+
assert_present :name
|
10
|
+
assert_present :account
|
11
|
+
assert false, :terrible_error
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
setup do
|
16
|
+
@model = User.new(:account => "")
|
17
|
+
@model.valid?
|
18
|
+
end
|
19
|
+
|
20
|
+
context "errors handler" do
|
21
|
+
should "raise an error if the errors are not handled" do
|
22
|
+
assert_raise Ohm::Validations::Presenter::UnhandledErrors do
|
23
|
+
@model.errors.present do |e|
|
24
|
+
e.on :terrible_error do
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
should "evaluate blocks when errors match" do
|
31
|
+
values = []
|
32
|
+
|
33
|
+
@model.errors.present do |e|
|
34
|
+
e.on [:name, :nil] do
|
35
|
+
values << 1
|
36
|
+
end
|
37
|
+
|
38
|
+
e.on [:account, :empty] do
|
39
|
+
values << 2
|
40
|
+
end
|
41
|
+
|
42
|
+
e.on :terrible_error do
|
43
|
+
values << 3
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
assert_equal [1, 2, 3], values
|
48
|
+
end
|
49
|
+
|
50
|
+
should "accept case-like matches for an error" do
|
51
|
+
values = []
|
52
|
+
|
53
|
+
@model.errors.present do |e|
|
54
|
+
e.on Array do
|
55
|
+
values << 1
|
56
|
+
end
|
57
|
+
|
58
|
+
e.on :terrible_error do
|
59
|
+
values << 3
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
assert_equal [1, 3], values
|
64
|
+
end
|
65
|
+
|
66
|
+
should "accept multiple matches for an error" do
|
67
|
+
values = @model.errors.present do |e|
|
68
|
+
e.on [:name, :nil], "A"
|
69
|
+
e.on [:account, :empty] do
|
70
|
+
"B"
|
71
|
+
end
|
72
|
+
e.on :terrible_error, "C"
|
73
|
+
end
|
74
|
+
|
75
|
+
assert_equal %w{A B C}, values
|
76
|
+
end
|
77
|
+
|
78
|
+
class MyPresenter < Ohm::Validations::Presenter
|
79
|
+
def on(*args)
|
80
|
+
super(*args) do
|
81
|
+
yield.downcase
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
should "take a custom presenter" do
|
87
|
+
values = @model.errors.present(MyPresenter) do |e|
|
88
|
+
e.on([:name, :nil]) { "A" }
|
89
|
+
e.on([:account, :empty]) { "B" }
|
90
|
+
e.on(:terrible_error) { "C" }
|
91
|
+
end
|
92
|
+
|
93
|
+
assert_equal %w{a b c}, values
|
94
|
+
end
|
95
|
+
|
96
|
+
should "raise an error if neither a message nor a block are supplied" do
|
97
|
+
assert_raise ArgumentError do
|
98
|
+
Ohm::Validations::Presenter.new([:custom]).present do |e|
|
99
|
+
e.on(:custom)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
should "not raise an error if the message passed is nil" do
|
105
|
+
values = Ohm::Validations::Presenter.new([:custom]).present do |e|
|
106
|
+
e.on(:custom, nil)
|
107
|
+
end
|
108
|
+
|
109
|
+
assert_equal [nil], values
|
110
|
+
|
111
|
+
assert_nothing_raised do
|
112
|
+
Ohm::Validations::Presenter.new([:custom]).present do |e|
|
113
|
+
e.on(:custom, nil) do
|
114
|
+
raise "Should not call block"
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ohm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michel Martens
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2009-06-
|
13
|
+
date: 2009-06-22 00:00:00 -03:00
|
14
14
|
default_executable:
|
15
15
|
dependencies: []
|
16
16
|
|
@@ -35,6 +35,7 @@ files:
|
|
35
35
|
- test/benchmarks.rb
|
36
36
|
- test/db/dump.rdb
|
37
37
|
- test/db/redis.pid
|
38
|
+
- test/errors_test.rb
|
38
39
|
- test/indices_test.rb
|
39
40
|
- test/model_test.rb
|
40
41
|
- test/redis_test.rb
|