atto 0.9.0 → 0.9.1
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/README +35 -7
- data/Rakefile +4 -5
- data/lib/atto.rb +3 -1
- data/lib/atto/cop.rb +88 -0
- data/lib/atto/opt.rb +64 -0
- data/lib/atto/run.rb +28 -22
- data/lib/atto/test.rb +1 -1
- data/test/atto/test_cop.rb +99 -0
- data/test/atto/test_test.rb +4 -2
- metadata +24 -39
data/README
CHANGED
@@ -1,15 +1,14 @@
|
|
1
1
|
INTRODUCTION
|
2
2
|
|
3
3
|
Atto is an ultra-tiny self-contained testing framework inspired by
|
4
|
-
and partially based on nanotest. It is self-contained in that it
|
5
|
-
external libraries. Every file in this project is,and will remain
|
6
|
-
lines long, comments included.
|
7
|
-
|
4
|
+
and partially based on nanotest by mynyml. It is self-contained in that it
|
5
|
+
needs no external libraries. Every ruby file in this project is, and will remain
|
6
|
+
under 100 lines long, comments included.
|
8
7
|
|
9
8
|
USAGE
|
10
9
|
|
11
10
|
To use it in your tests, for every ruby file lib/foo/bar.rb in your project,
|
12
|
-
make a test file lib/foo/test_bar.rb and start it with:
|
11
|
+
make a test file lib/foo/test_bar.rb and start it with:
|
13
12
|
|
14
13
|
require 'atto'
|
15
14
|
include Atto::Test
|
@@ -20,8 +19,37 @@ assert "A test that will always suceed" do true end
|
|
20
19
|
assert { Foo::Bar }
|
21
20
|
|
22
21
|
Then run the command atto from your project directory and it will run the tests
|
23
|
-
automatically, every time you change either
|
24
|
-
will
|
22
|
+
in the test directory automatically, and then, every time you change either a
|
23
|
+
lib file or a test file, it will run the relevant test again. It will also
|
24
|
+
detect new files being added.
|
25
|
+
|
26
|
+
Since version 0.9.1, atto has a tiny command line and environment options
|
27
|
+
module, and the atto command understands the following command line options:
|
28
|
+
--help -h Display a help message.
|
29
|
+
--project=dir -pdir Sets project directory.
|
30
|
+
--lib=sub -lsub Sets project library subdirectory.
|
31
|
+
--test=sub -tsub Sets project test subdirectory.
|
32
|
+
--skip -s Skips tests on startup.
|
33
|
+
|
34
|
+
Unknown options will be completely ignored. You may also set the corresponding
|
35
|
+
environment variables ATTO_HELP, ATTO_PROJECT, ATTO_LIB, ATTO_TEST, ATTO_SKIP
|
36
|
+
for the same effect as the command line options.
|
37
|
+
|
38
|
+
Most useful here is the --skip option which allows you to skip running all tests
|
39
|
+
on startup. This is invaluable for projects that have many slow-running tests.
|
40
|
+
The help message made run.rb reach the 99 lines limit, so it looks like no new
|
41
|
+
features will be implemented in the atto command. :)
|
42
|
+
|
43
|
+
To clear out any possible misunderstandings, --project is used to set the
|
44
|
+
project directory, --test and --lib are used to specify *sub*directory names.
|
45
|
+
It is currently required that the test dir and the lib dir are subdirectories
|
46
|
+
of the project directory.
|
47
|
+
|
48
|
+
For example:
|
49
|
+
|
50
|
+
atto --project=~/src/foo --lib=libs --test=tests
|
51
|
+
|
52
|
+
Will run the tests in ~/src/foo/tests for the library files in ~/src/foo/libs.
|
25
53
|
|
26
54
|
LICENSE
|
27
55
|
|
data/Rakefile
CHANGED
@@ -1,11 +1,10 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require 'rake/gempackagetask'
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rubygems/package_task'
|
4
3
|
require 'rake/clean'
|
5
4
|
CLEAN.include("pkg/*.gem")
|
6
5
|
|
7
6
|
|
8
|
-
ATTO_VERSION = "0.9.
|
7
|
+
ATTO_VERSION = "0.9.1"
|
9
8
|
|
10
9
|
def apply_spec_defaults(s)
|
11
10
|
end
|
@@ -28,7 +27,7 @@ spec = Gem::Specification.new do |s|
|
|
28
27
|
s.executables = "atto"
|
29
28
|
end
|
30
29
|
|
31
|
-
|
30
|
+
Gem::PackageTask.new(spec) do |pkg|
|
32
31
|
pkg.need_zip = false
|
33
32
|
pkg.need_tar = false
|
34
33
|
end
|
data/lib/atto.rb
CHANGED
@@ -2,8 +2,10 @@
|
|
2
2
|
module Atto
|
3
3
|
# Ansi colors for red/green display after testing.
|
4
4
|
autoload :Ansi, 'atto/ansi'
|
5
|
+
# Commandline and environment options
|
6
|
+
autoload :Cop , 'atto/cop'
|
5
7
|
# Testing
|
6
8
|
autoload :Test, 'atto/test'
|
7
9
|
# Autorunning tests
|
8
10
|
autoload :Run, 'atto/run'
|
9
|
-
end
|
11
|
+
end
|
data/lib/atto/cop.rb
ADDED
@@ -0,0 +1,88 @@
|
|
1
|
+
module Atto
|
2
|
+
# Cop is a module for commandline (and environment) options
|
3
|
+
module Cop
|
4
|
+
|
5
|
+
# Gets an option from the environment. The key will be uppercased, prepended
|
6
|
+
# by the uppercase basename of $0 without extension and _, and any spaces,
|
7
|
+
# dashes will be replaced by underscores. Returns the value found, or
|
8
|
+
# default if not found, and a boolean that indicates if the key was found
|
9
|
+
# or not found.
|
10
|
+
def get_environment(key, default= nil)
|
11
|
+
base = File.basename($0).gsub(/\..*\Z/,'').upcase + "_"
|
12
|
+
envkey = base + key.to_s.upcase.gsub('[ \.\-]', '_')
|
13
|
+
res = ENV[envkey]
|
14
|
+
if res
|
15
|
+
return res, true
|
16
|
+
end
|
17
|
+
return default, false
|
18
|
+
end
|
19
|
+
|
20
|
+
# Gets a command line argument from ARGV, on condition that it is not
|
21
|
+
# a --command, or preceded by a -c style option. It recognizes -- also.
|
22
|
+
def get_numarg(num, default=nil)
|
23
|
+
numkey = num.to_i
|
24
|
+
skip , aid, index = true, [], 0
|
25
|
+
while index < ARGV.size
|
26
|
+
arg = ARGV[index]
|
27
|
+
if arg == '--'
|
28
|
+
skip = false
|
29
|
+
elsif (arg[0..1] == '--') && skip
|
30
|
+
elsif arg[0] == '-' && skip
|
31
|
+
else
|
32
|
+
aid << arg
|
33
|
+
end
|
34
|
+
index += 1
|
35
|
+
end
|
36
|
+
return aid[num], true if aid[num]
|
37
|
+
return default, false
|
38
|
+
end
|
39
|
+
|
40
|
+
# Gets a long --foo=bar style commandline argument from ARGV. The key will
|
41
|
+
# be lowercased, prepended with -- and any spaces, periods or underscores
|
42
|
+
# will be replaced by dashes. Returns the value found, or default if not
|
43
|
+
# found, and a boolean that indicates if the key was found or not found.
|
44
|
+
def get_argument(key, default=nil)
|
45
|
+
argkey = "--" + key.to_s.downcase.gsub('[ \.\_]', '-')
|
46
|
+
res = ARGV.reverse.find{ |arg| arg =~ /\A#{argkey}(\Z|=)/ }
|
47
|
+
return default, false unless res
|
48
|
+
index = res.index('=')
|
49
|
+
return true, true unless index
|
50
|
+
return res[index + 1, res.size] , true
|
51
|
+
end
|
52
|
+
|
53
|
+
# Gets a long -cbar style commandline argument from ARGV. The first
|
54
|
+
# character of key will be taken, lowercased, and prepended with -
|
55
|
+
# Returns the value found, or default if not found, and
|
56
|
+
# a boolean that indicates if the key was found or not found.
|
57
|
+
def get_arg(key, default=nil)
|
58
|
+
argkey = "-" + key.to_s[0].downcase
|
59
|
+
res = ARGV.reverse.find{ |arg| arg =~ /\A#{argkey}/ }
|
60
|
+
return default, false unless res
|
61
|
+
if res.size == 2
|
62
|
+
return true, true
|
63
|
+
end
|
64
|
+
return res[2, res.size] , true
|
65
|
+
end
|
66
|
+
|
67
|
+
def get(key, default=nil)
|
68
|
+
if key.respond_to?(:to_int)
|
69
|
+
res, found = get_numarg(key, default)
|
70
|
+
return res if found
|
71
|
+
end
|
72
|
+
res, found = get_argument(key, default)
|
73
|
+
return res if found
|
74
|
+
res, found = get_arg(key, default)
|
75
|
+
return res if found
|
76
|
+
res, found = get_environment(key, default)
|
77
|
+
return res if found
|
78
|
+
return default
|
79
|
+
end
|
80
|
+
|
81
|
+
def [](key)
|
82
|
+
return get(key, nil)
|
83
|
+
end
|
84
|
+
|
85
|
+
extend self
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
data/lib/atto/opt.rb
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
module Atto
|
2
|
+
# A module for handling command line options
|
3
|
+
module Opt
|
4
|
+
|
5
|
+
# Gets an argument in the long form
|
6
|
+
def self.getargument(key, default=nil)
|
7
|
+
keyarg = key.to_s.downcase.gsub(/[_ ]/, '-')
|
8
|
+
arg = ARGS.select{ |f| f =~ /\A--#{keyarg}(\Z|\=)/ }.last
|
9
|
+
return default, false unless arg
|
10
|
+
ind = arg.index('=')
|
11
|
+
if ind
|
12
|
+
res = arg[ind + 1, arg.size]
|
13
|
+
return res, true unless res.empty?
|
14
|
+
return default, true
|
15
|
+
end
|
16
|
+
return true, true
|
17
|
+
end
|
18
|
+
|
19
|
+
# Gets an argument in the short form
|
20
|
+
def self.getarg(key, default = nil)
|
21
|
+
shortarg = key.to_s[0]
|
22
|
+
arg = ARGS.index{ |f| f =~ /\A-#{shortarg}\Z)/ }.last
|
23
|
+
return default, false unless arg
|
24
|
+
return ARGS[arg+1] || default, true
|
25
|
+
end
|
26
|
+
|
27
|
+
# Gets an environment variable
|
28
|
+
def self.getenv
|
29
|
+
envarg = key.to_s.upcase.gsub(/[ \-]/, '_')
|
30
|
+
env = ENV[envarg]
|
31
|
+
return default, false unless env
|
32
|
+
return env || default, true
|
33
|
+
end
|
34
|
+
|
35
|
+
# Gets an option from arguments or from the environment (in that order)
|
36
|
+
def self.get(key, default = nil)
|
37
|
+
keyarg = key.to_s.downcase.gsub(/[_ ]/, '-')
|
38
|
+
arg = ARGS.select{ |f| f =~ /\A--#{keyarg}(\Z|\=)/ }.last
|
39
|
+
if arg
|
40
|
+
ind = arg.index('=')
|
41
|
+
if ind
|
42
|
+
res = arg[ind + 1, arg.size]
|
43
|
+
return res unless res.empty?
|
44
|
+
return default
|
45
|
+
else
|
46
|
+
return default || true
|
47
|
+
end
|
48
|
+
end
|
49
|
+
# Short arguments
|
50
|
+
shortarg = key.to_s[0]
|
51
|
+
arg = ARGS.index{ |f| f =~ /\A-#{shortarg}\Z)/ }.last
|
52
|
+
|
53
|
+
|
54
|
+
envarg = key.to_s.upcase.gsub(/[ \-]/, '_')
|
55
|
+
env = ENV[envarg]
|
56
|
+
return env || default
|
57
|
+
end
|
58
|
+
|
59
|
+
def [](key)
|
60
|
+
return self.get(key)
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
end
|
data/lib/atto/run.rb
CHANGED
@@ -7,16 +7,8 @@ module Atto
|
|
7
7
|
end
|
8
8
|
|
9
9
|
# Find all Ruby all files under the named dir
|
10
|
-
def
|
11
|
-
|
12
|
-
full = File.join(name, e)
|
13
|
-
if Dir.exist?(full) && e !='.' && e != '..'
|
14
|
-
res += all_files(full)
|
15
|
-
else
|
16
|
-
res << full if full =~ /\.rb\Z/
|
17
|
-
end
|
18
|
-
res
|
19
|
-
end
|
10
|
+
def all_ruby_files(name)
|
11
|
+
Dir["#{name}/**/*.rb"]
|
20
12
|
end
|
21
13
|
|
22
14
|
# updates the timestamp info for files
|
@@ -28,7 +20,7 @@ module Atto
|
|
28
20
|
end
|
29
21
|
end
|
30
22
|
|
31
|
-
# matches libfiles
|
23
|
+
# matches libfiles with testfiles
|
32
24
|
def match_files(libfiles, testfiles)
|
33
25
|
return libfiles.inject({}) do |res, libname|
|
34
26
|
testname = libname.dup
|
@@ -41,11 +33,13 @@ module Atto
|
|
41
33
|
end
|
42
34
|
|
43
35
|
# Runs a list of tests
|
44
|
-
def run_tests(list)
|
36
|
+
def run_tests(list, skip = false)
|
45
37
|
return list.inject({}) do |results, file|
|
46
|
-
puts("Running tests for #{file}:")
|
47
|
-
|
48
|
-
|
38
|
+
puts(skip ? "Skipping #{file}..." : "Running tests for #{file}:")
|
39
|
+
unless skip
|
40
|
+
res = system("ruby -I #@libdir -I #@testdir #{file}")
|
41
|
+
puts res ? "OK!" : "Failed!"
|
42
|
+
end
|
49
43
|
results[file] = Time.now
|
50
44
|
results
|
51
45
|
end
|
@@ -56,22 +50,34 @@ module Atto
|
|
56
50
|
ran_tests[k] ? ran_tests[k] <= v.mtime : true
|
57
51
|
end
|
58
52
|
|
59
|
-
#
|
53
|
+
# Updates all state info
|
60
54
|
def update_all
|
61
|
-
@libfiles =
|
62
|
-
@testfiles =
|
55
|
+
@libfiles = all_ruby_files(@libdir)
|
56
|
+
@testfiles = all_ruby_files(@testdir)
|
63
57
|
@matchfiles= match_files(@libfiles, @testfiles)
|
64
58
|
@libinfo = update_info(@libfiles)
|
65
59
|
@testinfo = update_info(@testfiles)
|
66
60
|
end
|
67
61
|
|
62
|
+
# Shows help message
|
63
|
+
def help
|
64
|
+
warn "Usage: #{$0} OPTIONS.\nRuns unit tests in the current directory.\n"
|
65
|
+
warn " --help -h Display this help message."
|
66
|
+
warn " --project=dir -pdir Sets project directory."
|
67
|
+
warn " --lib=sub -lsub Sets project library subdirectory."
|
68
|
+
warn " --test=sub -tsub Sets project test subdirectory."
|
69
|
+
warn " --skip -s Skips tests on startup.\n"
|
70
|
+
return 0
|
71
|
+
end
|
72
|
+
|
68
73
|
# Main, runs the tests when needed
|
69
74
|
def main
|
70
|
-
|
71
|
-
@
|
72
|
-
@
|
75
|
+
return help if Atto::Cop.get(:help)
|
76
|
+
@projdir = Atto::Cop.get(:project, Dir.pwd)
|
77
|
+
@libdir = File.join(@projdir, Atto::Cop.get(:lib, 'lib'))
|
78
|
+
@testdir = File.join(@projdir, Atto::Cop.get(:test, 'test'))
|
73
79
|
update_all
|
74
|
-
@ran_tests = run_tests(@testfiles)
|
80
|
+
@ran_tests = run_tests(@testfiles, Atto::Cop.get(:skip, false))
|
75
81
|
loop do
|
76
82
|
update_all
|
77
83
|
torun = @testinfo.select do |k,v|
|
data/lib/atto/test.rb
CHANGED
@@ -0,0 +1,99 @@
|
|
1
|
+
require 'atto/test'
|
2
|
+
include Atto::Test
|
3
|
+
require 'atto'
|
4
|
+
|
5
|
+
assert "Cop is defined" do
|
6
|
+
Atto::Cop
|
7
|
+
end
|
8
|
+
|
9
|
+
# Set up some fake environent and argument options
|
10
|
+
p $0
|
11
|
+
ENV['TEST_COP_FOO'] = 'bar'
|
12
|
+
ENV['TEST_COP_BAZ'] = ""
|
13
|
+
ARGV << '--foo=quux'
|
14
|
+
ARGV << 'file1'
|
15
|
+
ARGV << '--foo=bar'
|
16
|
+
ARGV << '-fquux'
|
17
|
+
ARGV << '-fbaz'
|
18
|
+
ARGV << '--bar'
|
19
|
+
ARGV << '-b'
|
20
|
+
ARGV << 'file2'
|
21
|
+
ARGV << '--'
|
22
|
+
ARGV << '--file3'
|
23
|
+
|
24
|
+
|
25
|
+
assert "Cop is defined" do
|
26
|
+
Atto::Cop
|
27
|
+
end
|
28
|
+
|
29
|
+
assert "Getting options from environment works" do
|
30
|
+
res, found = Atto::Cop.get_environment(:baz)
|
31
|
+
found
|
32
|
+
end
|
33
|
+
|
34
|
+
assert "Getting options from environment works" do
|
35
|
+
res, found = Atto::Cop.get_environment(:foo)
|
36
|
+
found && res == 'bar'
|
37
|
+
end
|
38
|
+
|
39
|
+
assert "Getting long command line arguments works" do
|
40
|
+
res, found = Atto::Cop.get_argument(:foo)
|
41
|
+
found && res == 'bar'
|
42
|
+
end
|
43
|
+
|
44
|
+
assert "Getting short command line arguments works" do
|
45
|
+
res, found = Atto::Cop.get_arg(:foo)
|
46
|
+
found && res == 'baz'
|
47
|
+
end
|
48
|
+
|
49
|
+
assert "Indexed command line file arguments works" do
|
50
|
+
res, found = Atto::Cop.get_numarg(0)
|
51
|
+
found && res == 'file1'
|
52
|
+
end
|
53
|
+
|
54
|
+
assert "Indexed command line file arguments works" do
|
55
|
+
res, found = Atto::Cop.get_numarg(1)
|
56
|
+
found && res == 'file2'
|
57
|
+
end
|
58
|
+
|
59
|
+
assert "Indexed command line file arguments works" do
|
60
|
+
res, found = Atto::Cop.get_numarg(2)
|
61
|
+
found && res == '--file3'
|
62
|
+
end
|
63
|
+
|
64
|
+
assert "Indexed command line file arguments works" do
|
65
|
+
res, found = Atto::Cop.get_numarg(3)
|
66
|
+
(!found) && res.nil?
|
67
|
+
end
|
68
|
+
|
69
|
+
|
70
|
+
assert "Getting generic command line arguments works" do
|
71
|
+
res = Atto::Cop.get(2)
|
72
|
+
res == '--file3'
|
73
|
+
end
|
74
|
+
|
75
|
+
assert "Getting generic command line arguments works" do
|
76
|
+
res = Atto::Cop.get(1)
|
77
|
+
res == 'file2'
|
78
|
+
end
|
79
|
+
|
80
|
+
assert "Getting generic command line arguments works" do
|
81
|
+
res = Atto::Cop.get(0)
|
82
|
+
res == 'file1'
|
83
|
+
end
|
84
|
+
|
85
|
+
assert "Getting generic command line arguments works" do
|
86
|
+
res = Atto::Cop.get(:foo)
|
87
|
+
res == 'bar'
|
88
|
+
end
|
89
|
+
|
90
|
+
assert "Getting generic command line arguments works" do
|
91
|
+
res = Atto::Cop.get(:bar)
|
92
|
+
res == true
|
93
|
+
end
|
94
|
+
|
95
|
+
assert "Defaults work" do
|
96
|
+
Atto::Cop.get(:kazz, 'default') == 'default'
|
97
|
+
end
|
98
|
+
|
99
|
+
# We end here before the 100 line limit! :)
|
data/test/atto/test_test.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
require 'atto'
|
2
2
|
include Atto::Test
|
3
3
|
|
4
|
-
assert "Atto is defined" do Atto end
|
4
|
+
assert "Atto is defined" do Atto end
|
5
5
|
assert "Atto::Test is defined" do Atto::Test end
|
6
6
|
assert "Success can be detected" do true end
|
7
|
-
assert "Works with
|
7
|
+
assert "Works with nested asserts" do
|
8
8
|
assert "This is a nested assert" do true end
|
9
9
|
end
|
10
10
|
|
@@ -20,3 +20,5 @@ assert "Atto::Test#describe_tests is defined" do Atto::Test.describe_tests end
|
|
20
20
|
|
21
21
|
|
22
22
|
|
23
|
+
|
24
|
+
|
metadata
CHANGED
@@ -1,73 +1,58 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: atto
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
|
6
|
-
- 0
|
7
|
-
- 9
|
8
|
-
- 0
|
9
|
-
version: 0.9.0
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.9.1
|
5
|
+
prerelease:
|
10
6
|
platform: ruby
|
11
|
-
authors:
|
7
|
+
authors:
|
12
8
|
- Beoran
|
13
9
|
autorequire:
|
14
10
|
bindir: bin
|
15
11
|
cert_chain: []
|
16
|
-
|
17
|
-
date: 2011-05-07 00:00:00 +02:00
|
18
|
-
default_executable:
|
12
|
+
date: 2011-06-16 00:00:00.000000000Z
|
19
13
|
dependencies: []
|
20
|
-
|
21
|
-
description: "An ultra-tiny self-contained testing framework. "
|
14
|
+
description: ! 'An ultra-tiny self-contained testing framework. '
|
22
15
|
email: beoran@rubyforge.org
|
23
|
-
executables:
|
16
|
+
executables:
|
24
17
|
- atto
|
25
18
|
extensions: []
|
26
|
-
|
27
19
|
extra_rdoc_files: []
|
28
|
-
|
29
|
-
files:
|
20
|
+
files:
|
30
21
|
- Rakefile
|
31
22
|
- README
|
32
23
|
- lib/atto.rb
|
33
24
|
- lib/atto/ansi.rb
|
34
25
|
- lib/atto/run.rb
|
26
|
+
- lib/atto/cop.rb
|
35
27
|
- lib/atto/test.rb
|
28
|
+
- lib/atto/opt.rb
|
36
29
|
- test/test_atto.rb
|
30
|
+
- test/atto/test_cop.rb
|
37
31
|
- test/atto/test_ansi.rb
|
38
32
|
- test/atto/test_test.rb
|
39
33
|
- bin/atto
|
40
|
-
has_rdoc: true
|
41
34
|
homepage: https://github.com/beoran/atto
|
42
35
|
licenses: []
|
43
|
-
|
44
36
|
post_install_message:
|
45
37
|
rdoc_options: []
|
46
|
-
|
47
|
-
require_paths:
|
38
|
+
require_paths:
|
48
39
|
- lib
|
49
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
40
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
50
41
|
none: false
|
51
|
-
requirements:
|
52
|
-
- -
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
|
55
|
-
|
56
|
-
version: "0"
|
57
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
58
47
|
none: false
|
59
|
-
requirements:
|
60
|
-
- -
|
61
|
-
- !ruby/object:Gem::Version
|
62
|
-
|
63
|
-
- 0
|
64
|
-
version: "0"
|
48
|
+
requirements:
|
49
|
+
- - ! '>='
|
50
|
+
- !ruby/object:Gem::Version
|
51
|
+
version: '0'
|
65
52
|
requirements: []
|
66
|
-
|
67
53
|
rubyforge_project:
|
68
|
-
rubygems_version: 1.
|
54
|
+
rubygems_version: 1.8.5
|
69
55
|
signing_key:
|
70
56
|
specification_version: 3
|
71
57
|
summary: An ultra-tiny self-contained testing framework.
|
72
58
|
test_files: []
|
73
|
-
|