anise 0.6.0 → 0.7.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.
Files changed (53) hide show
  1. data/.ruby +59 -38
  2. data/.yardopts +7 -0
  3. data/DEMO.md +242 -0
  4. data/{HISTORY.rdoc → HISTORY.md} +28 -7
  5. data/LICENSE.txt +27 -0
  6. data/README.md +129 -0
  7. data/demo/01_annotations.md +81 -0
  8. data/demo/03_attributes.md +14 -0
  9. data/demo/04_methods.md +50 -0
  10. data/demo/05_variables.md +45 -0
  11. data/{qed → demo}/applique/ae.rb +0 -0
  12. data/demo/applique/anise.rb +1 -0
  13. data/{qed/toplevel/01_annotations.qed → demo/toplevel/01_annotations.md} +5 -9
  14. data/demo/toplevel/03_attributes.md +20 -0
  15. data/lib/anise.rb +28 -45
  16. data/lib/anise.yml +59 -38
  17. data/lib/anise/annotations.rb +132 -0
  18. data/lib/anise/annotations/store.rb +136 -0
  19. data/lib/anise/annotative.rb +7 -0
  20. data/lib/anise/annotative/attributes.rb +147 -0
  21. data/lib/anise/annotative/methods.rb +131 -0
  22. data/lib/anise/annotative/variables.rb +99 -0
  23. data/lib/anise/{module.rb → core_ext.rb} +30 -0
  24. data/lib/anise/universal.rb +6 -0
  25. data/lib/anise/version.rb +17 -0
  26. data/test/case_annotations.rb +173 -0
  27. data/test/case_attributes.rb +46 -0
  28. data/test/case_combined_usage.rb +341 -0
  29. data/test/case_methods.rb +36 -0
  30. data/test/case_variables.rb +22 -0
  31. data/test/helper.rb +2 -0
  32. metadata +99 -98
  33. data/APACHE2.txt +0 -204
  34. data/COPYING.rdoc +0 -17
  35. data/README.rdoc +0 -107
  36. data/lib/anise/annotation.rb +0 -175
  37. data/lib/anise/annotator.rb +0 -82
  38. data/lib/anise/attribute.rb +0 -138
  39. data/qed/01_annotations.qed +0 -26
  40. data/qed/02_annotation_added.rdoc +0 -60
  41. data/qed/03_attributes.rdoc +0 -16
  42. data/qed/04_annotator.rdoc +0 -49
  43. data/qed/toplevel/03_attributes.rdoc +0 -20
  44. data/test/suite.rb +0 -8
  45. data/test/test_anise.rb +0 -193
  46. data/test/test_anise_toplevel.rb +0 -194
  47. data/test/test_annotations.rb +0 -136
  48. data/test/test_annotations_module.rb +0 -132
  49. data/test/test_annotations_toplevel.rb +0 -131
  50. data/test/test_annotator.rb +0 -26
  51. data/test/test_annotator_toplevel.rb +0 -28
  52. data/test/test_attribute.rb +0 -37
  53. data/test/test_attribute_toplevel.rb +0 -65
@@ -0,0 +1,46 @@
1
+ testcase Anise::Annotative::Attributes do
2
+
3
+ context "general" do
4
+
5
+ cX = Class.new do
6
+ extend Anise::Annotative::Attributes
7
+ attr :q
8
+ attr :a, :x => 1
9
+ end
10
+
11
+ test "attr :a" do
12
+ cX.ann(:a) == {:x=>1}
13
+ end
14
+
15
+ end
16
+
17
+ context "attr" do
18
+
19
+ cA = Class.new do
20
+ extend Anise::Annotative::Attributes
21
+ attr :x, :cast=>"to_s"
22
+ end
23
+
24
+ test do
25
+ cA.ann(:x,:cast) == "to_s"
26
+ end
27
+
28
+ end
29
+
30
+ context "attr_accessor" do
31
+
32
+ cA = Class.new do
33
+ extend Anise::Annotative::Attributes
34
+ attr_accessor :x, :cast=>"to_s"
35
+ end
36
+
37
+ test do
38
+ a = cA.new
39
+ r = cA.instance_attributes - [:taguri]
40
+ r == [:x]
41
+ end
42
+
43
+ end
44
+
45
+ end
46
+
@@ -0,0 +1,341 @@
1
+ # The intent of this testcase is test the variant annotaiton modules
2
+ # in conjunction, to make sure they can all be used together without
3
+ # conflict.
4
+ #
5
+ # All good intentions aside these cases need some *love*, as they are
6
+ # really just other cases thrown together and not really thought out
7
+ # as such. Still, something is better than nothing.
8
+
9
+ testcase "Combined Usage" do
10
+
11
+ context "simple co-existence of annotated methods and attributes" do
12
+
13
+ cX = Class.new do
14
+ extend Anise::Annotative::Methods
15
+ extend Anise::Annotative::Attributes
16
+ end
17
+
18
+ test "initialize" do
19
+ cX.new
20
+ end
21
+
22
+ end
23
+
24
+ context "method annotations work" do
25
+
26
+ cX = Class.new do
27
+ extend Anise::Annotative::Methods
28
+ extend Anise::Annotative::Attributes
29
+
30
+ method_annotator :doc
31
+
32
+ doc "a-okay captain"
33
+ def x; end
34
+ end
35
+
36
+ test "doc is defined for method" do
37
+ cX.ann(:x,:doc) == "a-okay captain"
38
+ end
39
+
40
+ end
41
+
42
+ context "attribute annotations work" do
43
+
44
+ cX = Class.new do
45
+ extend Anise::Annotative::Methods
46
+ extend Anise::Annotative::Attributes
47
+
48
+ attr :x, :doc => "still okay"
49
+ end
50
+
51
+ test "annotation defined for attribute" do
52
+ cX.ann(:x,:doc) == "still okay"
53
+ end
54
+
55
+ end
56
+
57
+ context "both method and attribute annotations work" do
58
+
59
+ cX = Class.new do
60
+ extend Anise::Annotative::Methods
61
+ extend Anise::Annotative::Attributes
62
+
63
+ method_annotator :doc
64
+
65
+ attr :x, :doc => "still okay"
66
+
67
+ doc "sure does"
68
+ def y; end
69
+ end
70
+
71
+ test "annotation defined for attribute" do
72
+ cX.ann(:x,:doc) == "still okay"
73
+ end
74
+
75
+ test "doc is defined for method" do
76
+ cX.ann(:y,:doc) == "sure does"
77
+ end
78
+
79
+ end
80
+
81
+ context "using an annotation for attribute validation" do
82
+
83
+ cX = Class.new do
84
+ extend Anise::Annotations
85
+ extend Anise::Annotative::Methods
86
+ extend Anise::Annotative::Attributes
87
+
88
+ attr :a
89
+
90
+ ann :@a, :valid => lambda{ |x| x.is_a?(Integer) }
91
+ ann :a, :class => Integer
92
+
93
+ def initialize(a)
94
+ @a = a
95
+ end
96
+
97
+ def validate
98
+ instance_variables.each do |iv|
99
+ if validator = self.class.ann(iv)[:valid]
100
+ value = instance_variable_get(iv)
101
+ unless validator.call(value)
102
+ raise "Invalid value #{value} for #{iv}"
103
+ end
104
+ end
105
+ end
106
+ end
107
+ end
108
+
109
+ test "class" do
110
+ cX.ann(:a, :class) == Integer
111
+ end
112
+
113
+ test "validate" do
114
+ x = cX.new(1)
115
+ x.validate
116
+ end
117
+
118
+ end
119
+
120
+ context "2" do
121
+
122
+ cX = Class.new do
123
+ extend Anise::Annotations
124
+ extend Anise::Annotative::Methods
125
+ extend Anise::Annotative::Attributes
126
+
127
+ def x1 ; end
128
+
129
+ #annotator :ann
130
+ ann :x1, :a=>1
131
+ ann :x1, :b=>2
132
+ end
133
+
134
+ test "01" do
135
+ cX.ann(:x1,:a) == cX.ann(:x1,:a)
136
+ end
137
+
138
+ test "02" do
139
+ cX.ann(:x1,:a).object_id == cX.ann(:x1,:a).object_id
140
+ end
141
+
142
+ test "03" do
143
+ cX.ann :x1, :a => 2
144
+ cX.ann(:x1,:a) == 2
145
+ end
146
+
147
+ end
148
+
149
+ context "3" do
150
+
151
+ cX = Class.new do
152
+ extend Anise::Annotations
153
+ extend Anise::Annotative::Methods
154
+ extend Anise::Annotative::Attributes
155
+
156
+ def x1 ; end
157
+
158
+ #annotator :ann
159
+ ann :x1, :a=>1
160
+ ann :x1, :b=>2
161
+ end
162
+
163
+ cY = Class.new(cX)
164
+
165
+ test "01" do
166
+ cY.ann(:x1,:a) == cY.ann(:x1,:a)
167
+ end
168
+
169
+ test "02" do
170
+ cY.ann(:x1,:a).object_id == cY.ann(:x1,:a).object_id
171
+ end
172
+
173
+ test "03" do
174
+ cY.ann(:x1,:a) == 1
175
+ end
176
+
177
+ test "04" do
178
+ cY.ann(:x1,:b) == 2
179
+ end
180
+
181
+ test "05" do
182
+ cY.ann :x1,:a => 2
183
+ cY.ann(:x1,:a) == 2 &&
184
+ cY.ann(:x1,:b) == 2
185
+ end
186
+
187
+ end
188
+
189
+ context "4" do
190
+
191
+ cX = Class.new do
192
+ extend Anise::Annotations
193
+ extend Anise::Annotative::Methods
194
+ extend Anise::Annotative::Attributes
195
+
196
+ #annotator :ann
197
+ ann :foo, Integer
198
+ end
199
+
200
+ cY = Class.new(cX) do
201
+ ann :foo, String
202
+ end
203
+
204
+ test "01" do
205
+ cX.ann(:foo, :class) == Integer
206
+ end
207
+
208
+ test "02" do
209
+ cY.ann(:foo, :class) == String
210
+ end
211
+
212
+ end
213
+
214
+ context "5" do
215
+
216
+ cX = Class.new do
217
+ extend Anise::Annotations
218
+ extend Anise::Annotative::Methods
219
+ extend Anise::Annotative::Attributes
220
+
221
+ #annotator :ann
222
+ ann :foo, :doc => "hello"
223
+ ann :foo, :bar => []
224
+ end
225
+
226
+ cY = Class.new(cX) do
227
+ ann :foo, :class => String, :doc => "bye"
228
+ end
229
+
230
+ test "01" do
231
+ cX.ann(:foo,:doc) == "hello"
232
+ end
233
+
234
+ test "02" do
235
+ cX.ann(:foo) == {:doc=>"hello", :bar=>[]}
236
+ end
237
+
238
+ test "03" do
239
+ cX.ann(:foo,:bar) << "1"
240
+ cX.ann(:foo,:bar) == ["1"]
241
+ end
242
+
243
+ test "04" do
244
+ cY.ann(:foo,:doc) == "bye"
245
+ end
246
+
247
+ test "05" do
248
+ #cY.ann(:foo,:bar) == nil
249
+ cY.ann(:foo,:bar) == ["1"]
250
+ end
251
+
252
+ test "06" do
253
+ cY.ann(:foo, :doc => "cap")
254
+ cY.ann(:foo, :doc) == "cap"
255
+ end
256
+
257
+ test "07" do
258
+ cY.ann!(:foo,:bar) << "2"
259
+ cY.ann(:foo,:bar) == ["1", "2"] &&
260
+ cX.ann(:foo,:bar) == ["1"]
261
+ end
262
+
263
+ end
264
+
265
+ context "6" do
266
+
267
+ cX = Class.new do
268
+ extend Anise::Annotations
269
+ extend Anise::Annotative::Methods
270
+ extend Anise::Annotative::Attributes
271
+
272
+ method_annotator :req
273
+
274
+ req 'r'
275
+ def a ; "a"; end
276
+
277
+ req 's', 't'
278
+ attr :b
279
+ end
280
+
281
+ test "annotated" do
282
+ cX.ann(:a) == {:req=>'r'}
283
+ end
284
+
285
+ test "annotated" do
286
+ cX.ann(:b) == {:req=>['s','t']}
287
+ end
288
+
289
+ end
290
+
291
+ context "attribute" do
292
+
293
+ cX = Class.new do
294
+ extend Anise::Annotations
295
+ extend Anise::Annotative::Methods
296
+ extend Anise::Annotative::Attributes
297
+
298
+ attr :q
299
+ attr :a, :x => 1
300
+ end
301
+
302
+ test "a" do
303
+ cX.ann(:a) == {:x=>1}
304
+ end
305
+
306
+ end
307
+
308
+ context "attribute using attr" do
309
+
310
+ cA = Class.new do
311
+ extend Anise::Annotations
312
+ extend Anise::Annotative::Methods
313
+ extend Anise::Annotative::Attributes
314
+
315
+ attr :x, :cast=>"to_s"
316
+ end
317
+
318
+ test "cast" do
319
+ cA.ann(:x,:cast) == "to_s"
320
+ end
321
+
322
+ end
323
+
324
+ context "attribute using attr_accessor" do
325
+
326
+ cA = Class.new do
327
+ extend Anise::Annotations
328
+ extend Anise::Annotative::Methods
329
+ extend Anise::Annotative::Attributes
330
+
331
+ attr_accessor :x, :cast=>"to_s"
332
+ end
333
+
334
+ test "instance_attributes" do
335
+ iv = cA.instance_attributes - [:taguri]
336
+ iv == [:x]
337
+ end
338
+
339
+ end
340
+
341
+ end
@@ -0,0 +1,36 @@
1
+ testcase Anise::Annotative::Methods do
2
+
3
+ cX = Class.new do
4
+ extend Anise::Annotative::Methods
5
+
6
+ def self.req(val)
7
+ method_annotation(:req=>val)
8
+ end
9
+
10
+ req 'r'
11
+ def a ; "a"; end
12
+
13
+ req ['x', 'y']
14
+ attr :b
15
+ end
16
+
17
+ test do |a, h|
18
+ h.each do |k, r|
19
+ cX.ann(a, k).assert == r
20
+ end
21
+ end
22
+
23
+ ok :a, :req => 'r'
24
+ ok :b, :req => ['x','y']
25
+
26
+ test do |h|
27
+ h.each do |a, r|
28
+ cX.ann(a).assert == r
29
+ end
30
+ end
31
+
32
+ ok :a => {:req=>'r'}
33
+ ok :b => {:req=>['x','y']}
34
+
35
+ end
36
+
@@ -0,0 +1,22 @@
1
+ testcase Anise::Annotative::Variables do
2
+
3
+ context "general" do
4
+
5
+ cX = Class.new do
6
+ extend Anise::Annotative::Variables
7
+
8
+ @doc = "See what I mean?"
9
+ @returns = NilClass
10
+
11
+ def see
12
+ puts "Yes, I see!"
13
+ end
14
+ end
15
+
16
+ test do
17
+ cX.ann(:see, :@doc) == "See what I mean?"
18
+ end
19
+
20
+ end
21
+
22
+ end
@@ -0,0 +1,2 @@
1
+ require 'anise'
2
+