myrrha 3.0.0.rc6 → 3.0.0.rc7

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.
@@ -2,6 +2,8 @@
2
2
 
3
3
  * Implementation of domains has been moved to the domain gem. The syntax to create domains
4
4
  has therefore changed. Myrrha::Domain does no longer exists.
5
+ * An error handler can now be set on Coercions rules. The default one raises a
6
+ Myrrha::Error, preserving backward compatibility.
5
7
 
6
8
  # 2.0.0 / 2012-09-26
7
9
 
@@ -6,6 +6,9 @@ module Myrrha
6
6
  # @return [Domain] The main target domain, if any
7
7
  attr_accessor :main_target_domain
8
8
 
9
+ # @return [Proc] the proc that handles coercion errors
10
+ attr_accessor :error_handler
11
+
9
12
  # Creates an empty list of coercion rules
10
13
  def initialize(&defn)
11
14
  @definitions = []
@@ -14,6 +17,9 @@ module Myrrha
14
17
  @fallbacks = []
15
18
  @appender = :<<
16
19
  @main_target_domain = nil
20
+ @error_handler = lambda{|value, target_domain, cause|
21
+ raise Error.new("Unable to coerce `#{value}` to #{target_domain}", cause)
22
+ }
17
23
  extend_rules(:<<, defn) if defn
18
24
  end
19
25
 
@@ -180,7 +186,7 @@ module Myrrha
180
186
  error = ex unless error
181
187
  end
182
188
  end
183
- raise Error.new("Unable to coerce `#{value}` to #{target_domain}", error)
189
+ error_handler.call(value, target_domain, error)
184
190
  end
185
191
  alias :apply :coerce
186
192
 
@@ -2,7 +2,7 @@ module Myrrha
2
2
 
3
3
  # Raised when a coercion fails
4
4
  class Error < StandardError
5
- attr_reader :cause
5
+ attr_accessor :cause
6
6
  def initialize(msg, cause = $!)
7
7
  super(msg)
8
8
  @cause = cause
@@ -2,16 +2,19 @@ module Domain
2
2
  module CoercionMethods
3
3
 
4
4
  def coercions(&bl)
5
- @coercions ||= ::Myrrha::Coercions.new{|c| c.main_target_domain = self}
5
+ @coercions ||= ::Myrrha::Coercions.new{|c|
6
+ c.main_target_domain = self
7
+ c.error_handler = lambda{|v,t,c|
8
+ raise c if TypeError===c
9
+ domain_error!(v)
10
+ }
11
+ }
6
12
  @coercions.append(&bl) if bl
7
13
  @coercions
8
14
  end
9
15
 
10
16
  def coerce(arg)
11
17
  coercions.coerce(arg, self)
12
- rescue Myrrha::Error => ex
13
- raise ex.cause if ex.cause
14
- domain_error!(arg)
15
18
  end
16
19
  alias_method :[], :coerce
17
20
 
@@ -3,7 +3,7 @@ module Myrrha
3
3
 
4
4
  MAJOR = 3
5
5
  MINOR = 0
6
- TINY = "0.rc6"
6
+ TINY = "0.rc7"
7
7
 
8
8
  def self.to_s
9
9
  [ MAJOR, MINOR, TINY ].join('.')
@@ -10,7 +10,7 @@ variables:
10
10
  upper:
11
11
  Myrrha
12
12
  version:
13
- 3.0.0.rc6
13
+ 3.0.0.rc7
14
14
  summary: |-
15
15
  Myrrha provides the coercion framework which is missing to Ruby.
16
16
  description: |-
@@ -0,0 +1,32 @@
1
+ require 'spec_helper'
2
+ module Myrrha
3
+ describe Coercions, "error_handler" do
4
+
5
+ subject{ rules.apply(12, Float) }
6
+
7
+ context 'with the default error handler' do
8
+ let(:rules){
9
+ Coercions.new
10
+ }
11
+
12
+ it "raises a Myrrha::Error when coercion fails" do
13
+ lambda{
14
+ subject
15
+ }.should raise_error(Myrrha::Error, /Unable to coerce `12` to Float/)
16
+ end
17
+ end
18
+
19
+ context 'with a user-defined error handler' do
20
+ let(:rules){
21
+ Coercions.new{|c|
22
+ c.error_handler = lambda{|*args| args }
23
+ }
24
+ }
25
+
26
+ it "calls the handler when coercion fails" do
27
+ subject.should eq([12, Float, nil])
28
+ end
29
+ end
30
+
31
+ end
32
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: myrrha
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.0.rc6
4
+ version: 3.0.0.rc7
5
5
  prerelease: 6
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-10-23 00:00:00.000000000 Z
12
+ date: 2012-10-25 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
@@ -150,6 +150,7 @@ files:
150
150
  - spec/coercions/test_convert.rb
151
151
  - spec/coercions/test_delegate.rb
152
152
  - spec/coercions/test_dup.rb
153
+ - spec/coercions/test_error_handler.rb
153
154
  - spec/coercions/test_subdomain.rb
154
155
  - spec/ext/domain/test_coerce.rb
155
156
  - spec/ext/domain/test_coercions.rb
@@ -207,6 +208,7 @@ test_files:
207
208
  - spec/coercions/test_convert.rb
208
209
  - spec/coercions/test_delegate.rb
209
210
  - spec/coercions/test_dup.rb
211
+ - spec/coercions/test_error_handler.rb
210
212
  - spec/coercions/test_subdomain.rb
211
213
  - spec/ext/domain/test_coerce.rb
212
214
  - spec/ext/domain/test_coercions.rb