define_exception 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,139 @@
1
+ # = Introduction
2
+ #
3
+ # Simple mixin that provides a way of defining custom exception classes
4
+ # with default messages that dries up your code.
5
+ #
6
+ # = The Problem of Laborious Exception Class Definitions
7
+ #
8
+ # Typically you would write the following in your code to define a custom exception
9
+ #
10
+ # class MyError < RuntimeError; end #nodoc
11
+ #
12
+ # This seems simple enough until you have to raise it many times throughout your code
13
+ # and have to provide an error message:
14
+ #
15
+ # raise( MyError, 'You shall not do what you just did' )
16
+ #
17
+ # It gets harder when you get tired of writing the same message to the <i>raise</i> command.
18
+ # You can define a hash constant to keep track of common error messages:
19
+ #
20
+ # ERRORS = { :myerror => 'You shall not do what you just did', ... }
21
+ #
22
+ # and then reference it
23
+ #
24
+ # raise( MyError, ERRORS[:myerror] )
25
+ #
26
+ # but this just doesn't seem very rubyish. You can also define the message when you write
27
+ # the custom exception class:
28
+ #
29
+ # class MyError < RuntimeError
30
+ # def message
31
+ # 'You shall not do what you just did' )
32
+ # end
33
+ # end
34
+ #
35
+ # The problem is that this always uses this message even when overridden in <i>raise</i>
36
+ #
37
+ # raise( MyError, 'Use this instead' ) # <= 'You shall not do what you just did'
38
+ #
39
+ # The real solution for you class is to override the constructor:
40
+ #
41
+ # class MyError < RuntimeError
42
+ # def intialize( message = nil )
43
+ # super( message || 'Default Error Message' )
44
+ # end
45
+ # end
46
+ #
47
+ # raise MyError # <= 'Default Error Message'
48
+ # raise MyError, 'Not the Default' # <= 'Not the Default'
49
+ #
50
+ # = A Better Way
51
+ #
52
+ # Though this accomplishes the goal it is laborious to write all this code especially
53
+ # as the number of custom exception definitions grow. A better solution would be to make
54
+ # a class method available that simply handles creating the exception for use automatically
55
+ # thus drying up our code:
56
+ #
57
+ # class TestMe
58
+ # define_exception 'MyError', 'The Default Message'
59
+ # define_exception 'AnotherError', 'Another Default Message'
60
+ # define_exception 'WorstError', 'Worst Default Message'
61
+ # ...
62
+ # def tester( args )
63
+ # raise MyError unless ...
64
+ # raise AnotherError unless ...
65
+ # end
66
+ #
67
+ # def worst( args )
68
+ # raise( WorstError, 'You really messed up' ) unless ...
69
+ # end
70
+ # end
71
+ #
72
+ # = Usage
73
+ #
74
+ # The standard ruby practice of requiring the gem and then use <i>include DefineException</i> to
75
+ # make the class method available.
76
+ #
77
+ # = Example
78
+ #
79
+ # require 'rubygems'
80
+ # require 'define_exception'
81
+ #
82
+ # include DefineException
83
+ #
84
+ # class Test
85
+ # define_exception 'TestMe', 'this is the default message'
86
+ #
87
+ # def test
88
+ # raise TestMe
89
+ # end
90
+ #
91
+ # def test2
92
+ # raise( TestMe, 'You shall not do that again' )
93
+ # end
94
+ # end
95
+ #
96
+ # t = Test.new
97
+ #
98
+ # begin
99
+ # t.test
100
+ # rescue Test::TestMe => e
101
+ # puts e.message
102
+ # end
103
+ #
104
+ # t.test2
105
+ #
106
+ # running the above example would correctly produce
107
+ #
108
+ # wes:~/Define-Exception> ruby test.rb
109
+ # this is the default message
110
+ # test.rb:14:in `test2': You shall not do that again (Test::TestMe)
111
+ # from test.rb:26
112
+ #
113
+ # = Information
114
+ #
115
+ # Author:: Wes Bailey, wes@verticalresponse.com
116
+ # License:: Ruby License
117
+
118
+ module DefineException
119
+ module ClassMethods
120
+ def define_exception( exception_name, default_message = 'Application Error Occurred' )
121
+ exception_name = exception_name.to_s.split( '_' ).inject( '' ) { |s,v| s << v.capitalize } if /\_/.match( exception_name.to_s )
122
+
123
+ class_eval <<-EOD
124
+ class #{exception_name} < RuntimeError
125
+ def initialize( message = nil )
126
+ super( message || "#{default_message}" )
127
+ end
128
+ end
129
+ EOD
130
+ end
131
+ end
132
+
133
+ class << self
134
+ def included( base )
135
+ #base.extend( self )
136
+ base.extend( ClassMethods )
137
+ end
138
+ end
139
+ end
@@ -0,0 +1,39 @@
1
+ $: << File.dirname( File.join( __FILE__, '..' ) )
2
+
3
+ require 'rubygems'
4
+ require 'define_exception'
5
+ require 'spec/test/unit'
6
+
7
+ include DefineException
8
+
9
+ describe "Define Exception" do
10
+ it "should enable a class to define a custom exception" do
11
+ MESSAGE = 'This is the default message'
12
+
13
+ class TestDefineException
14
+ define_exception 'TestException', MESSAGE
15
+
16
+ def test
17
+ raise TestException
18
+ end
19
+ end
20
+
21
+ lambda {
22
+ tde = TestDefineException.new
23
+ tde.test
24
+ }.should raise_error( TestDefineException::TestException, MESSAGE )
25
+
26
+ class AnotherTest
27
+ define_exception :another_exception, MESSAGE
28
+
29
+ def test
30
+ raise AnotherException
31
+ end
32
+ end
33
+
34
+ lambda {
35
+ tde = AnotherTest.new
36
+ tde.test
37
+ }.should raise_error( AnotherTest::AnotherException, MESSAGE )
38
+ end
39
+ end
metadata ADDED
@@ -0,0 +1,58 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: define_exception
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - Wes Bailey
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2010-05-24 00:00:00 -07:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description:
17
+ email: wes@verticalresponse.com
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files: []
23
+
24
+ files:
25
+ - lib/define_exception.rb
26
+ has_rdoc: true
27
+ homepage: http://github.com/wbailey/define_exception
28
+ post_install_message:
29
+ rdoc_options:
30
+ - --title
31
+ - Define Exception Mixin
32
+ - --main
33
+ - lib/define_exception.rb
34
+ - --line-numbers
35
+ - --inline-source
36
+ require_paths:
37
+ - lib
38
+ required_ruby_version: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: "0"
43
+ version:
44
+ required_rubygems_version: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: "0"
49
+ version:
50
+ requirements: []
51
+
52
+ rubyforge_project:
53
+ rubygems_version: 1.3.1
54
+ signing_key:
55
+ specification_version: 2
56
+ summary: A simple way of defining exceptions for use in your ruby classes
57
+ test_files:
58
+ - test/define_exception_spec.rb