anise 0.3.0 → 0.4.0
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/HISTORY +4 -0
- data/MANIFEST +3 -1
- data/VERSION +1 -1
- data/lib/anise/annotation.rb +9 -0
- data/spec/01_annotations.rd +25 -0
- data/spec/04_callbacks.rd +60 -0
- metadata +4 -2
data/HISTORY
CHANGED
data/MANIFEST
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
anise 0.
|
1
|
+
anise 0.4.0 beta (2009-02-15)
|
data/lib/anise/annotation.rb
CHANGED
@@ -134,6 +134,8 @@ module Anise
|
|
134
134
|
keys = keys.inject({}){ |h,(k,v)| h[k.to_sym] = v; h} #rekey
|
135
135
|
annotations[ref] ||= {}
|
136
136
|
annotations[ref].update(keys)
|
137
|
+
# callback
|
138
|
+
annotation_added(ref)
|
137
139
|
else
|
138
140
|
key = keys.to_sym
|
139
141
|
annotation(ref)[key]
|
@@ -162,6 +164,8 @@ module Anise
|
|
162
164
|
keys = keys.inject({}){ |h,(k,v)| h[k.to_sym] = v; h} #rekey
|
163
165
|
annotations[ref] ||= {}
|
164
166
|
annotations[ref].update(keys)
|
167
|
+
# callback
|
168
|
+
annotation_added(ref) if method_defined?(:annotation_added)
|
165
169
|
else
|
166
170
|
key = keys.to_sym
|
167
171
|
annotations[ref] ||= {}
|
@@ -173,6 +177,11 @@ module Anise
|
|
173
177
|
end
|
174
178
|
end
|
175
179
|
|
180
|
+
# callback method
|
181
|
+
def annotation_added(name)
|
182
|
+
super if defined?(super)
|
183
|
+
end
|
184
|
+
|
176
185
|
end
|
177
186
|
|
178
187
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
= Creating and Reading Annotations
|
2
|
+
|
3
|
+
Load the primary annotations library.
|
4
|
+
|
5
|
+
require 'anise/annotation'
|
6
|
+
|
7
|
+
Given a example class X we can apply annotations to it using the #ann method.
|
8
|
+
|
9
|
+
class X
|
10
|
+
include Anise::Annotation
|
11
|
+
ann :x1, :a=>1
|
12
|
+
ann :x1, :b=>2
|
13
|
+
end
|
14
|
+
|
15
|
+
We can then use #ann to lookup the set annotations.
|
16
|
+
|
17
|
+
X.ann(:x1,:a).should == 1
|
18
|
+
|
19
|
+
The #ann method is a public interface, so we can define annotation externally as well.
|
20
|
+
|
21
|
+
X.ann :x1, :a => 2
|
22
|
+
X.ann(:x1, :a).should == 2
|
23
|
+
|
24
|
+
QED.
|
25
|
+
|
@@ -0,0 +1,60 @@
|
|
1
|
+
= Callbacks
|
2
|
+
|
3
|
+
Load the annotations, which supports callbacks out of the box.
|
4
|
+
|
5
|
+
require 'anise/annotation'
|
6
|
+
|
7
|
+
Given a sample class X, we can use a standard callback method #annotation_added().
|
8
|
+
|
9
|
+
class X
|
10
|
+
include Anise::Annotation
|
11
|
+
|
12
|
+
class << self
|
13
|
+
attr :last_callback
|
14
|
+
|
15
|
+
def annotation_added(name)
|
16
|
+
@last_callback = [name, ann(name)]
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
Now if we add an annotation, we will see the callback catches it.
|
22
|
+
|
23
|
+
X.ann :x1, :a=>1
|
24
|
+
X.last_callback.should == [:x1, {:a => 1}]
|
25
|
+
|
26
|
+
We'll do it again to be sure.
|
27
|
+
|
28
|
+
X.ann :x1, :b=>2
|
29
|
+
X.last_callback.should == [:x1, {:a => 1, :b => 2}]
|
30
|
+
|
31
|
+
== Using Callbacks for Attribute Defaults
|
32
|
+
|
33
|
+
class ::Module
|
34
|
+
def annotation_added(key)
|
35
|
+
base = self
|
36
|
+
if value = ann(key, :default)
|
37
|
+
define_method(key) do
|
38
|
+
instance_variable_set("@#{key}", value) unless instance_variable_defined?("@#{key}")
|
39
|
+
base.module_eval{ attr key }
|
40
|
+
instance_variable_get("@#{key}")
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
Try it out.
|
47
|
+
|
48
|
+
class Y
|
49
|
+
include Anise::Annotation
|
50
|
+
|
51
|
+
attr :a
|
52
|
+
ann :a, :default => 10
|
53
|
+
end
|
54
|
+
|
55
|
+
x = Y.new
|
56
|
+
x.a.should == 10
|
57
|
+
x.a.should == 10
|
58
|
+
|
59
|
+
QED.
|
60
|
+
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: anise
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- tigerops-community@rubyforge.org
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2009-
|
13
|
+
date: 2009-05-28 00:00:00 -04:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -70,6 +70,8 @@ files:
|
|
70
70
|
- test/test_annotations_module.rb
|
71
71
|
- test/test_anise_toplevel.rb
|
72
72
|
- test/test_annotations_toplevel.rb
|
73
|
+
- spec/04_callbacks.rd
|
74
|
+
- spec/01_annotations.rd
|
73
75
|
has_rdoc: true
|
74
76
|
homepage: http://
|
75
77
|
post_install_message:
|