tagful 1.0.1 → 1.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/tagful/version.rb +1 -1
- data/lib/tagful.rb +34 -21
- data/spec/tagful_spec.rb +106 -0
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a5b681c48a71c6e5cc302881cb7f8b837142d26b
|
4
|
+
data.tar.gz: cae00f8965dbf63edb5a5d2490e3a01b27e302c2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 20687a579bb972a1a8390b965c5b5dd2e9770d5a1448c654e8a55e30cc48d7b07f38244262601a51043a953aa73286f9005c79d67ccb14eb9901278c17f9aa84
|
7
|
+
data.tar.gz: a94463b8039c9dd4950e0aef6bfb24199d0ec607bef6d6bcde5474942de1dab92eae4904e38308ebe2e377b138a62450fa9cff6f835d834d61e663282f87a1f4
|
data/lib/tagful/version.rb
CHANGED
data/lib/tagful.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
require "tagful/version"
|
2
2
|
|
3
3
|
module Tagful
|
4
|
+
DEFAULT_ERROR_MODULE_NAME = 'Error'
|
5
|
+
|
4
6
|
class NotFound < ArgumentError; end
|
5
7
|
|
6
8
|
def self.included(base)
|
@@ -30,7 +32,7 @@ module Tagful
|
|
30
32
|
error_class = @tagful_error_module_or_class
|
31
33
|
else
|
32
34
|
error_module = @tagful_error_module_or_class
|
33
|
-
error_module ||=
|
35
|
+
error_module ||= DEFAULT_ERROR_MODULE_NAME
|
34
36
|
end
|
35
37
|
else
|
36
38
|
if error_module_or_class.is_a?(Class)
|
@@ -41,35 +43,46 @@ module Tagful
|
|
41
43
|
end
|
42
44
|
|
43
45
|
if error_class
|
44
|
-
class_eval(
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
46
|
+
m = class_eval('module TagfulMethods; end; TagfulMethods')
|
47
|
+
|
48
|
+
m.module_eval do
|
49
|
+
define_method(method_id) do |*args, &block|
|
50
|
+
begin
|
51
|
+
super(*args, &block)
|
49
52
|
rescue => e
|
50
|
-
raise
|
53
|
+
raise error_class, e.message
|
51
54
|
end
|
52
55
|
end
|
56
|
+
send visibility, method_id
|
57
|
+
end
|
53
58
|
|
54
|
-
|
55
|
-
|
59
|
+
class_eval do
|
60
|
+
prepend(m)
|
61
|
+
end
|
56
62
|
else
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
63
|
+
if error_module == DEFAULT_ERROR_MODULE_NAME
|
64
|
+
error_module = class_eval(<<-CODE)
|
65
|
+
unless defined?(#{error_module})
|
66
|
+
module #{error_module}; end
|
67
|
+
end
|
68
|
+
#{error_module}
|
69
|
+
CODE
|
70
|
+
end
|
61
71
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
72
|
+
m = class_eval('module TagfulMethods; end; TagfulMethods')
|
73
|
+
m.module_eval do
|
74
|
+
define_method(method_id) do |*args, &block|
|
75
|
+
begin
|
76
|
+
super(*args, &block)
|
66
77
|
rescue => e
|
67
|
-
e.extend(
|
78
|
+
e.extend(error_module) and raise
|
68
79
|
end
|
69
80
|
end
|
70
|
-
|
71
|
-
|
72
|
-
|
81
|
+
send visibility, method_id
|
82
|
+
end
|
83
|
+
class_eval do
|
84
|
+
prepend(m)
|
85
|
+
end
|
73
86
|
end
|
74
87
|
method_id
|
75
88
|
end
|
data/spec/tagful_spec.rb
CHANGED
@@ -97,6 +97,78 @@ RSpec.describe Tagful do
|
|
97
97
|
tagful :take_cheese!, NotFound
|
98
98
|
end
|
99
99
|
|
100
|
+
module Bar
|
101
|
+
def bar
|
102
|
+
'top bar'
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
class Foo
|
107
|
+
module Bar
|
108
|
+
def self.to_s
|
109
|
+
'Bug!'
|
110
|
+
end
|
111
|
+
|
112
|
+
def bar
|
113
|
+
'Foo::Bar'
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
include Tagful
|
118
|
+
|
119
|
+
tagful_with ::Bar
|
120
|
+
|
121
|
+
tagful\
|
122
|
+
def bug
|
123
|
+
raise 'bug'
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
class Buzz < StandardError
|
128
|
+
def buzz
|
129
|
+
'top buzz'
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
class Fizz
|
134
|
+
class Buzz < StandardError
|
135
|
+
def buzz
|
136
|
+
'Buzz::buzz'
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
include Tagful
|
141
|
+
|
142
|
+
tagful_with ::Buzz
|
143
|
+
|
144
|
+
tagful\
|
145
|
+
def fizz
|
146
|
+
raise 'buzz'
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
class Anonymous
|
151
|
+
include Tagful
|
152
|
+
|
153
|
+
def anonymous_module
|
154
|
+
raise 'anonymouse module'
|
155
|
+
end
|
156
|
+
tagful :anonymous_module, Module.new {
|
157
|
+
def anonymous
|
158
|
+
'anonymous module'
|
159
|
+
end
|
160
|
+
}
|
161
|
+
|
162
|
+
def anonymous_class
|
163
|
+
raise 'anonymouse class'
|
164
|
+
end
|
165
|
+
tagful :anonymous_class, Class.new(StandardError) {
|
166
|
+
def anonymous
|
167
|
+
'anonymous class'
|
168
|
+
end
|
169
|
+
}
|
170
|
+
end
|
171
|
+
|
100
172
|
describe '.tagful_with' do
|
101
173
|
it 'tagged method with specified Module' do
|
102
174
|
expect { Robot.new.to_evil }.to raise_error(Robot::Broken, ':(')
|
@@ -113,6 +185,24 @@ RSpec.describe Tagful do
|
|
113
185
|
expect { Pizza.new('bug') }.to raise_error(Pizza::Dirty, 'something wrong in pizza factory: bug')
|
114
186
|
end
|
115
187
|
end
|
188
|
+
|
189
|
+
context 'tagged with top level module, but the same name module exists in class' do
|
190
|
+
it 'tagged by top level module' do
|
191
|
+
expect { Foo.new.bug }.to raise_error do |error|
|
192
|
+
expect(error).to be_an(::Bar)
|
193
|
+
expect(error.bar).to eq 'top bar'
|
194
|
+
end
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
context 'tagged with top level class, but the same name class exists in class' do
|
199
|
+
it 'tagged by top level class' do
|
200
|
+
expect { Fizz.new.fizz }.to raise_error do |error|
|
201
|
+
expect(error).to be_an(::Buzz)
|
202
|
+
expect(error.buzz).to eq 'top buzz'
|
203
|
+
end
|
204
|
+
end
|
205
|
+
end
|
116
206
|
end
|
117
207
|
|
118
208
|
describe '.tagful' do
|
@@ -149,5 +239,21 @@ RSpec.describe Tagful do
|
|
149
239
|
expect { Pizza.new.take_cheese! }.to raise_error(Pizza::NotFound, 'not found: cheese')
|
150
240
|
end
|
151
241
|
end
|
242
|
+
|
243
|
+
context 'tagged with anonymouse class' do
|
244
|
+
it 'raise tagged error class' do
|
245
|
+
expect { Anonymous.new.anonymous_class }.to raise_error do |error|
|
246
|
+
expect(error.anonymous).to eq 'anonymous class'
|
247
|
+
end
|
248
|
+
end
|
249
|
+
end
|
250
|
+
|
251
|
+
context 'tagged with anonymouse module' do
|
252
|
+
it 'raise tagged error module' do
|
253
|
+
expect { Anonymous.new.anonymous_module }.to raise_error do |error|
|
254
|
+
expect(error.anonymous).to eq 'anonymous module'
|
255
|
+
end
|
256
|
+
end
|
257
|
+
end
|
152
258
|
end
|
153
259
|
end
|