ae 1.2.3 → 1.3.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/PACKAGE +5 -0
- data/{qed → demo}/01_overview.rdoc +0 -0
- data/{qed → demo}/02_assertion.rdoc +0 -0
- data/{qed → demo}/03_assert.rdoc +30 -25
- data/{qed → demo}/04_subjunctive.rdoc +0 -0
- data/{qed → demo}/05_expect.rdoc +27 -6
- data/{qed → demo}/06_counts.rdoc +0 -0
- data/lib/ae.rb +18 -2
- data/lib/ae/assert.rb +3 -3
- data/lib/ae/assertor.rb +94 -22
- data/lib/ae/expect.rb +3 -52
- data/lib/ae/package.yml +5 -0
- data/lib/ae/profile.yml +18 -0
- data/lib/ae/subjunctive.rb +0 -7
- data/lib/ae/subjunctive/must.rb +1 -1
- data/lib/ae/subjunctive/should.rb +1 -1
- metadata +22 -12
- data/VERSION +0 -6
- data/lib/ae/version.yml +0 -6
data/PACKAGE
ADDED
File without changes
|
File without changes
|
data/{qed → demo}/03_assert.rdoc
RENAMED
@@ -58,6 +58,27 @@ Another way to get the opposite inference, is to use +not+.
|
|
58
58
|
10.assert.not == 9
|
59
59
|
|
60
60
|
|
61
|
+
== Matchers & Lambda Assertions
|
62
|
+
|
63
|
+
Passing a Proc object or an objec that responds to :to_prco, will use it
|
64
|
+
as if it were a block of the method. This allows for a simple way to quickly
|
65
|
+
create reusable assertions.
|
66
|
+
|
67
|
+
palindrome = lambda{ |word| word == word.reverse }
|
68
|
+
|
69
|
+
"abracarba".assert palindrome
|
70
|
+
|
71
|
+
Additionally is the object responds to #matches? then the receiver
|
72
|
+
will be passed to this method to determine passage.
|
73
|
+
|
74
|
+
palindrome = Object.new
|
75
|
+
def palindrome.matches?(word)
|
76
|
+
word == word.reverse
|
77
|
+
end
|
78
|
+
|
79
|
+
"abracarba".assert palindrome
|
80
|
+
|
81
|
+
|
61
82
|
== Identity Assertions
|
62
83
|
|
63
84
|
Rather then the general form:
|
@@ -237,26 +258,10 @@ Or minimum range.
|
|
237
258
|
3.in_epsilon?(3,5)
|
238
259
|
|
239
260
|
|
240
|
-
== Custom Lambda Assertions
|
241
|
-
|
242
|
-
Passing a lambda to the subjunctive method, will use it as if it were
|
243
|
-
a block of the method. This allows for a simple way to quickly
|
244
|
-
create reusable assertions.
|
245
|
-
|
246
|
-
palindrome = lambda{ |x| x == x.reverse }
|
247
|
-
|
248
|
-
"abracarba".assert palindrome
|
249
|
-
|
250
|
-
|
251
261
|
== Verifying Object State
|
252
262
|
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
If no block parameter is designated and the receiver differs from +self+
|
257
|
-
in scope of the given block, then the block is evaluated in the scope of
|
258
|
-
the receiver via +instance_eval+. This can be also be used to verify the
|
259
|
-
state of an object.
|
263
|
+
Not surprisingly if underlying object state needs to be verified, +instance_eval+
|
264
|
+
can be used in conjunction with +assert+.
|
260
265
|
|
261
266
|
class X
|
262
267
|
attr :a
|
@@ -265,20 +270,20 @@ state of an object.
|
|
265
270
|
|
266
271
|
x = X.new(4)
|
267
272
|
|
268
|
-
x.assert do
|
273
|
+
x.assert.instance_eval do
|
269
274
|
4 == @a
|
270
275
|
end
|
271
276
|
|
272
|
-
And should it fail
|
277
|
+
And should it fail
|
273
278
|
|
274
279
|
Assertion.assert.raised? do
|
275
|
-
x.assert do
|
280
|
+
x.assert.instance_eval do
|
276
281
|
5 == @a
|
277
282
|
end
|
278
283
|
end
|
279
284
|
|
280
|
-
For some
|
281
|
-
|
282
|
-
|
283
|
-
|
285
|
+
For some testing underlying implementation might be considered poor
|
286
|
+
form. You will get no argument here. It should be used thoughtfully,
|
287
|
+
but I would not bet against there being occasions when such validations
|
288
|
+
might be handy.
|
284
289
|
|
File without changes
|
data/{qed → demo}/05_expect.rdoc
RENAMED
@@ -1,12 +1,13 @@
|
|
1
1
|
= Expect Method
|
2
2
|
|
3
|
-
Expect is another
|
4
|
-
|
5
|
-
|
6
|
-
|
3
|
+
Expect is another assertion nomenclature available for use in your
|
4
|
+
tests or specifications. Inspired by Jay Fields' Expectations library,
|
5
|
+
it provides convenient syntax for creating exception and case equality
|
6
|
+
assertions.
|
7
7
|
|
8
8
|
require 'ae/expect'
|
9
9
|
|
10
|
+
|
10
11
|
== Underlying Comparison
|
11
12
|
|
12
13
|
Expect uses #=== for comparison. So providing an argument and a block to
|
@@ -67,18 +68,38 @@ We can use #expected to make the receiver the object of expectation.
|
|
67
68
|
end
|
68
69
|
|
69
70
|
|
70
|
-
==
|
71
|
+
== Without Block
|
71
72
|
|
72
73
|
Without a block, the receiver is compared to the argument.
|
73
74
|
|
74
75
|
x.expect String
|
75
76
|
|
76
77
|
|
78
|
+
== Negative Forms
|
79
|
+
|
80
|
+
Like #assert, #expect has a negated form called #expect!
|
81
|
+
|
82
|
+
expect! /x/ do
|
83
|
+
"o"
|
84
|
+
end
|
85
|
+
|
86
|
+
The pure word form for those who do not like the clever use of the
|
87
|
+
explimation mark is #forbid.
|
88
|
+
|
89
|
+
forbid /x/ do
|
90
|
+
"o"
|
91
|
+
end
|
92
|
+
|
93
|
+
|
77
94
|
== Functor, or Higher Order Function
|
78
95
|
|
79
96
|
Like #assert, #expect can be used used as a *fluid* notation.
|
80
97
|
|
81
98
|
10.expect == 10
|
82
99
|
|
83
|
-
In which case it works just like #assert.
|
100
|
+
In which case it works just like #assert, including negative forms.
|
101
|
+
|
102
|
+
10.expect! == 11
|
103
|
+
10.forbid == 11
|
104
|
+
|
84
105
|
|
data/{qed → demo}/06_counts.rdoc
RENAMED
File without changes
|
data/lib/ae.rb
CHANGED
@@ -1,8 +1,24 @@
|
|
1
1
|
require 'yaml'
|
2
2
|
|
3
3
|
module AE
|
4
|
-
|
5
|
-
|
4
|
+
DIRECTORY = File.dirname(__FILE__) + '/ae'
|
5
|
+
|
6
|
+
PROFILE = YAML.load(File.new(DIRECTORY + '/profile.yml')) rescue {}
|
7
|
+
PACKAGE = YAML.load(File.new(DIRECTORY + '/package.yml')) rescue {}
|
8
|
+
|
9
|
+
VERSION = PACKAGE.values_at('major','minor','patch','build').compact.join('.')
|
10
|
+
|
11
|
+
#
|
12
|
+
def self.const_missing(name)
|
13
|
+
key = name.to_s.downcase
|
14
|
+
if PACKAGE.key?(key)
|
15
|
+
PACKAGE[key]
|
16
|
+
elsif PROFILE.key?(key)
|
17
|
+
PROFILE[key]
|
18
|
+
else
|
19
|
+
super(name)
|
20
|
+
end
|
21
|
+
end
|
6
22
|
end
|
7
23
|
|
8
24
|
require 'ae/assert'
|
data/lib/ae/assert.rb
CHANGED
@@ -23,12 +23,12 @@ module AE
|
|
23
23
|
# assert{ 4==3 }
|
24
24
|
#
|
25
25
|
def assert(*args, &block)
|
26
|
-
|
26
|
+
Assertor.new(self, :backtrace=>caller).assert(*args, &block)
|
27
27
|
end
|
28
28
|
|
29
29
|
# Same as 'object.assert == other'.
|
30
30
|
def assert=(cmp)
|
31
|
-
|
31
|
+
Assertor.new(self, :backtrace=>caller).assert(*args, &block) == cmp
|
32
32
|
end
|
33
33
|
|
34
34
|
# Assert not an operational relationship.
|
@@ -43,7 +43,7 @@ module AE
|
|
43
43
|
# may be possible in Ruby 1.9.
|
44
44
|
#
|
45
45
|
def assert!(*args, &block)
|
46
|
-
|
46
|
+
Assertor.new(self, :backtrace=>caller).not.assert(*args, &block)
|
47
47
|
end
|
48
48
|
|
49
49
|
# Alias for #assert!.
|
data/lib/ae/assertor.rb
CHANGED
@@ -27,42 +27,101 @@ class Assertor
|
|
27
27
|
@negated = !!opts[:negated]
|
28
28
|
end
|
29
29
|
|
30
|
+
# Negate the meaning of the assertion.
|
30
31
|
#
|
31
|
-
|
32
|
+
# TODO: Should this return a new Assertor instead of inplace negation?
|
33
|
+
def not(msg=nil)
|
32
34
|
@negated = !@negated
|
33
|
-
|
35
|
+
@message = msg if msg
|
36
|
+
self
|
34
37
|
end
|
35
38
|
|
36
39
|
# Internal assert, provides all functionality associated
|
37
|
-
# with external #assert
|
40
|
+
# with external #assert method. (See Assert#assert)
|
41
|
+
#
|
42
|
+
# NOTE: I'm calling YAGNI on using extra arguments to pass
|
43
|
+
# to the block. The interface is much nicer if a macro is
|
44
|
+
# created to handle any neccessry arguments. Eg.
|
45
|
+
#
|
46
|
+
# assert something(parameter)
|
47
|
+
#
|
48
|
+
# instead of
|
49
|
+
#
|
50
|
+
# assert something, parameter
|
38
51
|
#
|
39
|
-
# TODO: I'm calling YAGNI on any extra arguments to the block.
|
40
52
|
def assert(*args, &block)
|
41
53
|
return self if args.empty? && !block_given?
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
54
|
+
|
55
|
+
target = block || args.shift
|
56
|
+
|
57
|
+
if Proc === target || target.respond_to?(:to_proc)
|
58
|
+
block = target.to_proc
|
59
|
+
match = args.shift
|
60
|
+
result = block.arity > 0 ? block.call(@delegate) : block.call
|
61
|
+
if match
|
62
|
+
pass = (match == result)
|
63
|
+
msg = @message || "#{match.inspect} == #{result.inspect}"
|
64
|
+
else
|
65
|
+
pass = result
|
66
|
+
msg = @message || block.inspect # "#{result.inspect}"
|
67
|
+
end
|
68
|
+
elsif target.respond_to?(:matches?)
|
69
|
+
pass = target.matches?(@delegate)
|
70
|
+
msg = @message || matcher_message(target) || target.inspect
|
46
71
|
else
|
47
|
-
pass
|
48
|
-
msg
|
72
|
+
pass = target # truthiness
|
73
|
+
msg = args.shift # optional mesage for TestUnit compatiability
|
49
74
|
end
|
75
|
+
|
50
76
|
__assert__(pass, msg)
|
51
77
|
end
|
52
78
|
|
79
|
+
# Internal expect, provides all functionality associated
|
80
|
+
# with external #expect method. (See Expect#expect)
|
53
81
|
#
|
54
|
-
|
55
|
-
#
|
56
|
-
#
|
57
|
-
#
|
58
|
-
#
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
82
|
+
#--
|
83
|
+
# TODO: Should we deprecate the receiver matches in favor of #expected ?
|
84
|
+
# In other words, should the <code>|| @delegate</code> be dropped?
|
85
|
+
#
|
86
|
+
# TODO: respond_to?(:exception) && match = exception if Exception === match
|
87
|
+
#++
|
88
|
+
def expect(*args, &block)
|
89
|
+
# same as #assert if no arguments of block given
|
90
|
+
return self if args.empty? && !block_given?
|
91
|
+
|
92
|
+
target = block || args.shift
|
93
|
+
|
94
|
+
if Proc === target || target.respond_to?(:to_proc)
|
95
|
+
block = target.to_proc
|
96
|
+
match = args.shift || @delegate
|
97
|
+
if Exception === match || (Class===match && match.ancestors.include?(Exception))
|
98
|
+
begin
|
99
|
+
block.arity > 0 ? block.call(@delegate) : block.call
|
100
|
+
pass = false
|
101
|
+
msg = "#{match} not raised"
|
102
|
+
rescue match => error
|
103
|
+
pass = true
|
104
|
+
msg = "#{match} raised"
|
105
|
+
rescue Exception => error
|
106
|
+
pass = false
|
107
|
+
msg = "#{match} expected but #{error.class} was raised"
|
108
|
+
end
|
109
|
+
else
|
110
|
+
result = block.arity > 0 ? block.call(@delegte) : block.call
|
111
|
+
pass = (match === result)
|
112
|
+
msg = @message || "#{match.inspect} === #{result.inspect}"
|
113
|
+
end
|
114
|
+
elsif target.respond_to?(:matches?)
|
115
|
+
pass = target.matches?(@delegate)
|
116
|
+
msg = @message || matcher_message(target) || target.inspect
|
117
|
+
else
|
118
|
+
pass = (target === @delegate)
|
119
|
+
msg = @message || "#{target.inspect} === #{@delegate.inspect}"
|
120
|
+
end
|
121
|
+
|
122
|
+
#flunk(msg, caller) unless pass
|
123
|
+
__assert__(pass, msg)
|
124
|
+
end
|
66
125
|
|
67
126
|
#
|
68
127
|
def flunk(msg=nil)
|
@@ -112,6 +171,19 @@ class Assertor
|
|
112
171
|
@negated ? !pass : !!pass
|
113
172
|
end
|
114
173
|
|
174
|
+
#
|
175
|
+
def matcher_message(matcher)
|
176
|
+
if @negated
|
177
|
+
if matcher.respond_to?(:negative_failure_message)
|
178
|
+
return matcher.failure_message
|
179
|
+
end
|
180
|
+
end
|
181
|
+
if matcher.respond_to?(:failure_message)
|
182
|
+
return matcher.failure_message
|
183
|
+
end
|
184
|
+
false
|
185
|
+
end
|
186
|
+
|
115
187
|
# TODO: Ultimately better messages might be nice.
|
116
188
|
#
|
117
189
|
#def self.message(op,&block)
|
data/lib/ae/expect.rb
CHANGED
@@ -39,65 +39,16 @@ module AE
|
|
39
39
|
#
|
40
40
|
# 4.expect == 3
|
41
41
|
#
|
42
|
-
#
|
43
42
|
def expect(*args, &block)
|
44
|
-
|
45
|
-
block = args.shift if !block_given? && Proc === args.first
|
46
|
-
if block
|
47
|
-
exp = args.empty? ? self : args.shift
|
48
|
-
if Exception === exp || (Class===exp && exp.ancestors.include?(Exception))
|
49
|
-
begin
|
50
|
-
block.call
|
51
|
-
pass = false
|
52
|
-
msg = "#{exp} not raised"
|
53
|
-
rescue exp => error
|
54
|
-
pass = true
|
55
|
-
rescue Exception => error
|
56
|
-
pass = false
|
57
|
-
msg = "#{exp} expected but #{error.class} was raised"
|
58
|
-
end
|
59
|
-
else
|
60
|
-
res = block.call
|
61
|
-
pass = (exp === res)
|
62
|
-
msg = "#{exp} === #{res}"
|
63
|
-
end
|
64
|
-
else
|
65
|
-
pass = (exp === self)
|
66
|
-
msg = "#{exp} === #{self}"
|
67
|
-
end
|
68
|
-
flunk(msg, caller) unless pass
|
43
|
+
Assertor.new(self, :backtrace=>caller).expect(*args, &block)
|
69
44
|
end
|
70
45
|
|
71
46
|
# Designate a negated expectation. Read this as "expect not".
|
72
47
|
#
|
73
48
|
# See #expect.
|
74
49
|
#
|
75
|
-
def expect!(
|
76
|
-
|
77
|
-
block = args.shift if !block_given? && Proc === args.first
|
78
|
-
if block
|
79
|
-
exp = args.empty? ? self : args.shift
|
80
|
-
if Exception === exp || (Class===exp && exp.is?(Exception))
|
81
|
-
begin
|
82
|
-
block.call
|
83
|
-
pass = true
|
84
|
-
rescue exp => error
|
85
|
-
pass = false
|
86
|
-
msg = "#{exp} raised"
|
87
|
-
rescue Exception => error
|
88
|
-
pass = true
|
89
|
-
#msg = "#{exp} expected but #{error.class} was raised"
|
90
|
-
end
|
91
|
-
else
|
92
|
-
res = block.call
|
93
|
-
pass = !(exp === res)
|
94
|
-
msg = "not #{exp} === #{res}"
|
95
|
-
end
|
96
|
-
else
|
97
|
-
pass = !(exp === self)
|
98
|
-
msg = "not #{exp} === #{self}"
|
99
|
-
end
|
100
|
-
flunk(msg, caller) unless pass
|
50
|
+
def expect!(*args, &block)
|
51
|
+
Assertor.new(self, :backtrace=>caller).not.expect(*args, &block)
|
101
52
|
end
|
102
53
|
|
103
54
|
# Alias for #expect! method.
|
data/lib/ae/package.yml
ADDED
data/lib/ae/profile.yml
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
---
|
2
|
+
title : AE
|
3
|
+
summary: Assertive Expressive
|
4
|
+
suite : proutils
|
5
|
+
contact: trans <transfire@gmail.com>
|
6
|
+
created: 2008-08-17 09:00:06
|
7
|
+
authors: Thomas Sawyer
|
8
|
+
license: MIT
|
9
|
+
|
10
|
+
description:
|
11
|
+
Assertive Expressive is an assertions library intended for reuse
|
12
|
+
by any TDD, BDD or the like system.
|
13
|
+
|
14
|
+
resources:
|
15
|
+
homepage: http://proutils.github.com/ae
|
16
|
+
repository: git://github.com/proutils/ae.git
|
17
|
+
|
18
|
+
copyright: Copyright (c) 2008 Thomas Sawyer
|
data/lib/ae/subjunctive.rb
CHANGED
@@ -12,13 +12,6 @@ module AE
|
|
12
12
|
#
|
13
13
|
module Subjunctive
|
14
14
|
|
15
|
-
#
|
16
|
-
#def not(&block)
|
17
|
-
# @negated = !@negated
|
18
|
-
# return self if !block_given?
|
19
|
-
# be(*args, &block)
|
20
|
-
#end
|
21
|
-
|
22
15
|
# Like #assert, except if an argument if provided and no block,
|
23
16
|
# uses #equate? to compare the argument to the receiver. This
|
24
17
|
# allows for statements of the form:
|
data/lib/ae/subjunctive/must.rb
CHANGED
@@ -28,7 +28,7 @@ module AE
|
|
28
28
|
# 4.must! == 4 #=> Assertion Error
|
29
29
|
#
|
30
30
|
def must!(*args, &block)
|
31
|
-
Assertor.new(self, :backtrace=>caller).not(*args, &block)
|
31
|
+
Assertor.new(self, :backtrace=>caller).not.be(*args, &block)
|
32
32
|
end
|
33
33
|
|
34
34
|
# Perhaps not literally the counter-term to *must* (rather *will*),
|
@@ -29,7 +29,7 @@ module AE
|
|
29
29
|
# 4.should! == 4 #=> Assertion Error
|
30
30
|
#
|
31
31
|
def should!(*args, &block)
|
32
|
-
Assertor.new(self, :backtrace=>caller).not(*args, &block)
|
32
|
+
Assertor.new(self, :backtrace=>caller).not.be(*args, &block)
|
33
33
|
end
|
34
34
|
|
35
35
|
# Not quite the literally the counter-term to *should* (rather *shall*), but
|
metadata
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ae
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
+
hash: 27
|
4
5
|
prerelease: false
|
5
6
|
segments:
|
6
7
|
- 1
|
7
|
-
- 2
|
8
8
|
- 3
|
9
|
-
|
9
|
+
- 0
|
10
|
+
version: 1.3.0
|
10
11
|
platform: ruby
|
11
12
|
authors:
|
12
13
|
- Thomas Sawyer
|
@@ -14,16 +15,18 @@ autorequire:
|
|
14
15
|
bindir: bin
|
15
16
|
cert_chain: []
|
16
17
|
|
17
|
-
date: 2010-06-
|
18
|
+
date: 2010-06-17 00:00:00 -04:00
|
18
19
|
default_executable:
|
19
20
|
dependencies:
|
20
21
|
- !ruby/object:Gem::Dependency
|
21
22
|
name: syckle
|
22
23
|
prerelease: false
|
23
24
|
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
24
26
|
requirements:
|
25
27
|
- - ">="
|
26
28
|
- !ruby/object:Gem::Version
|
29
|
+
hash: 3
|
27
30
|
segments:
|
28
31
|
- 0
|
29
32
|
version: "0"
|
@@ -33,9 +36,11 @@ dependencies:
|
|
33
36
|
name: qed
|
34
37
|
prerelease: false
|
35
38
|
requirement: &id002 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
36
40
|
requirements:
|
37
41
|
- - ">="
|
38
42
|
- !ruby/object:Gem::Version
|
43
|
+
hash: 3
|
39
44
|
segments:
|
40
45
|
- 0
|
41
46
|
version: "0"
|
@@ -50,12 +55,12 @@ extensions: []
|
|
50
55
|
extra_rdoc_files:
|
51
56
|
- README.rdoc
|
52
57
|
files:
|
53
|
-
-
|
54
|
-
-
|
55
|
-
-
|
56
|
-
-
|
57
|
-
-
|
58
|
-
-
|
58
|
+
- demo/01_overview.rdoc
|
59
|
+
- demo/02_assertion.rdoc
|
60
|
+
- demo/03_assert.rdoc
|
61
|
+
- demo/04_subjunctive.rdoc
|
62
|
+
- demo/05_expect.rdoc
|
63
|
+
- demo/06_counts.rdoc
|
59
64
|
- lib/ae/assert.rb
|
60
65
|
- lib/ae/assertion.rb
|
61
66
|
- lib/ae/assertor.rb
|
@@ -63,18 +68,19 @@ files:
|
|
63
68
|
- lib/ae/expect.rb
|
64
69
|
- lib/ae/legacy.rb
|
65
70
|
- lib/ae/must.rb
|
71
|
+
- lib/ae/package.yml
|
72
|
+
- lib/ae/profile.yml
|
66
73
|
- lib/ae/should.rb
|
67
74
|
- lib/ae/subjunctive/must.rb
|
68
75
|
- lib/ae/subjunctive/should.rb
|
69
76
|
- lib/ae/subjunctive.rb
|
70
|
-
- lib/ae/version.yml
|
71
77
|
- lib/ae.rb
|
72
78
|
- PROFILE
|
79
|
+
- PACKAGE
|
73
80
|
- LICENSE
|
74
81
|
- README.rdoc
|
75
82
|
- HISTORY
|
76
83
|
- REQUIRE
|
77
|
-
- VERSION
|
78
84
|
has_rdoc: true
|
79
85
|
homepage: http://proutils.github.com/ae
|
80
86
|
licenses: []
|
@@ -88,23 +94,27 @@ rdoc_options:
|
|
88
94
|
require_paths:
|
89
95
|
- lib
|
90
96
|
required_ruby_version: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
91
98
|
requirements:
|
92
99
|
- - ">="
|
93
100
|
- !ruby/object:Gem::Version
|
101
|
+
hash: 3
|
94
102
|
segments:
|
95
103
|
- 0
|
96
104
|
version: "0"
|
97
105
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
106
|
+
none: false
|
98
107
|
requirements:
|
99
108
|
- - ">="
|
100
109
|
- !ruby/object:Gem::Version
|
110
|
+
hash: 3
|
101
111
|
segments:
|
102
112
|
- 0
|
103
113
|
version: "0"
|
104
114
|
requirements: []
|
105
115
|
|
106
116
|
rubyforge_project: ae
|
107
|
-
rubygems_version: 1.3.
|
117
|
+
rubygems_version: 1.3.7
|
108
118
|
signing_key:
|
109
119
|
specification_version: 3
|
110
120
|
summary: Assertive Expressive
|
data/VERSION
DELETED