tap-test 0.1.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 +5 -0
- data/MIT-LICENSE +22 -0
- data/README +123 -0
- data/lib/tap/test/file_test/class_methods.rb +17 -0
- data/lib/tap/test/file_test.rb +387 -0
- data/lib/tap/test/shell_test/class_methods.rb +24 -0
- data/lib/tap/test/shell_test.rb +208 -0
- data/lib/tap/test/subset_test/class_methods.rb +97 -0
- data/lib/tap/test/subset_test.rb +245 -0
- data/lib/tap/test/tap_test.rb +22 -0
- data/lib/tap/test/unit.rb +83 -0
- data/lib/tap/test/utils.rb +160 -0
- data/lib/tap/test.rb +74 -0
- data/tap.yml +0 -0
- metadata +82 -0
@@ -0,0 +1,160 @@
|
|
1
|
+
require 'tap/root'
|
2
|
+
require 'fileutils'
|
3
|
+
require 'tempfile'
|
4
|
+
require 'tap/support/templater'
|
5
|
+
|
6
|
+
module Tap
|
7
|
+
|
8
|
+
module Test
|
9
|
+
module Utils
|
10
|
+
module_function
|
11
|
+
|
12
|
+
# Generates an array of [source, reference] pairs mapping source
|
13
|
+
# files to reference files under the source and reference dirs,
|
14
|
+
# respectively. Only files under source dir matching the pattern
|
15
|
+
# will be mapped. Mappings are either (in this order):
|
16
|
+
#
|
17
|
+
# - the path under reference_dir contained in the source file
|
18
|
+
# - a direct translation of the source file from the source to
|
19
|
+
# the reference dir, minus the extname
|
20
|
+
#
|
21
|
+
# Notes:
|
22
|
+
# - Source files may contain comments but should otherwise
|
23
|
+
# consist only of indentation (which is stripped) and
|
24
|
+
# the reference path.
|
25
|
+
# - If a mapped path cannot be found, dereference raises
|
26
|
+
# a DereferenceError.
|
27
|
+
#
|
28
|
+
# === example
|
29
|
+
#
|
30
|
+
# root
|
31
|
+
# |- input
|
32
|
+
# | |- dir.ref
|
33
|
+
# | |- ignored.txt
|
34
|
+
# | |- one.txt.ref
|
35
|
+
# | `- two.txt.ref
|
36
|
+
# `- ref
|
37
|
+
# |- dir
|
38
|
+
# |- one.txt
|
39
|
+
# `- path
|
40
|
+
# `- to
|
41
|
+
# `- two.txt
|
42
|
+
#
|
43
|
+
# The 'two.txt.ref' file contains a reference path:
|
44
|
+
#
|
45
|
+
# File.read('/root/input/two.txt.ref') # => 'path/to/two.txt'
|
46
|
+
#
|
47
|
+
# Now:
|
48
|
+
#
|
49
|
+
# reference_map('/root/input', '/root/ref')
|
50
|
+
# # => [
|
51
|
+
# # ['/root/input/dir.ref', '/root/ref/dir'],
|
52
|
+
# # ['/root/input/one.txt.ref', '/root/ref/one.txt'],
|
53
|
+
# # ['/root/input/two.txt.ref', '/root/ref/path/to/two.txt']]
|
54
|
+
#
|
55
|
+
# And since no path matches 'ignored.txt':
|
56
|
+
#
|
57
|
+
# reference_map('/root/input', '/root/ref', '**/*.txt')
|
58
|
+
# # !> DereferenceError
|
59
|
+
#
|
60
|
+
def reference_map(source_dir, reference_dir, pattern='**/*.ref')
|
61
|
+
Dir.glob(File.join(source_dir, pattern)).sort.collect do |source|
|
62
|
+
# use the path specified in the source file
|
63
|
+
relative_path = File.read(source).gsub(/#.*$/, "").strip
|
64
|
+
|
65
|
+
# use the relative filepath of the source file to the
|
66
|
+
# source dir (minus the extname) if no path is specified
|
67
|
+
if relative_path.empty?
|
68
|
+
relative_path = Tap::Root::Utils.relative_path(source_dir, source).chomp(File.extname(source))
|
69
|
+
end
|
70
|
+
|
71
|
+
reference = File.join(reference_dir, relative_path)
|
72
|
+
|
73
|
+
# raise an error if no reference file is found
|
74
|
+
unless File.exists?(reference)
|
75
|
+
raise DereferenceError, "no reference found for: #{source}"
|
76
|
+
end
|
77
|
+
|
78
|
+
[source, reference]
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
# Dereferences source files with reference files for the duration
|
83
|
+
# of the block. The mappings of source to reference files are
|
84
|
+
# determined using reference_map; dereferenced files are at the
|
85
|
+
# same location as the source files, but with the '.ref' extname
|
86
|
+
# removed.
|
87
|
+
#
|
88
|
+
# Notes:
|
89
|
+
# - The reference extname is implicitly specified in pattern;
|
90
|
+
# the final extname of the source file is removed during
|
91
|
+
# dereferencing regardless of what it is.
|
92
|
+
#
|
93
|
+
def dereference(source_dirs, reference_dir, pattern='**/*.ref', tempdir=Dir::tmpdir)
|
94
|
+
mapped_paths = []
|
95
|
+
begin
|
96
|
+
[*source_dirs].each do |source_dir|
|
97
|
+
reference_map(source_dir, reference_dir, pattern).each do |source, reference|
|
98
|
+
|
99
|
+
# move the source file to a temporary location
|
100
|
+
tempfile = Tempfile.new(File.basename(source), tempdir)
|
101
|
+
tempfile.close
|
102
|
+
FileUtils.mv(source, tempfile.path)
|
103
|
+
|
104
|
+
# copy the reference to the target
|
105
|
+
target = source.chomp(File.extname(source))
|
106
|
+
FileUtils.cp_r(reference, target)
|
107
|
+
|
108
|
+
mapped_paths << [target, source, tempfile]
|
109
|
+
end
|
110
|
+
end unless reference_dir == nil
|
111
|
+
|
112
|
+
yield
|
113
|
+
|
114
|
+
ensure
|
115
|
+
mapped_paths.each do |target, source, tempfile|
|
116
|
+
# remove the target and restore the original source file
|
117
|
+
FileUtils.rm_r(target) if File.exists?(target)
|
118
|
+
FileUtils.mv(tempfile.path, source)
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
# Uses a Tap::Support::Templater to template and replace the contents of path,
|
124
|
+
# for the duration of the block. The attributes will be available in the
|
125
|
+
# template context.
|
126
|
+
def template(paths, attributes={}, tempdir=Dir::tmpdir)
|
127
|
+
mapped_paths = []
|
128
|
+
begin
|
129
|
+
[*paths].each do |path|
|
130
|
+
# move the source file to a temporary location
|
131
|
+
tempfile = Tempfile.new(File.basename(path), tempdir)
|
132
|
+
tempfile.close
|
133
|
+
FileUtils.cp(path, tempfile.path)
|
134
|
+
|
135
|
+
# template the source file
|
136
|
+
content = File.read(path)
|
137
|
+
File.open(path, "wb") do |file|
|
138
|
+
file << Support::Templater.new(content, attributes).build
|
139
|
+
end
|
140
|
+
|
141
|
+
mapped_paths << [path, tempfile]
|
142
|
+
end
|
143
|
+
|
144
|
+
yield
|
145
|
+
|
146
|
+
ensure
|
147
|
+
mapped_paths.each do |path, tempfile|
|
148
|
+
# restore the original source file
|
149
|
+
FileUtils.rm(path) if File.exists?(path)
|
150
|
+
FileUtils.mv(tempfile.path, path)
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
# Raised when no reference can be found for a reference path.
|
156
|
+
class DereferenceError < StandardError
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
data/lib/tap/test.rb
ADDED
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'tap/root'
|
2
|
+
|
3
|
+
module Tap
|
4
|
+
|
5
|
+
# Tap::Test provides several convenience methods for including and
|
6
|
+
# setting up Tap::Test modules. The manual use of this module looks
|
7
|
+
# like this:
|
8
|
+
#
|
9
|
+
# class SampleTest < Test::Unit::TestCase
|
10
|
+
# extend Tap::Test
|
11
|
+
# acts_as_tap_test
|
12
|
+
# end
|
13
|
+
#
|
14
|
+
# The 'tap/test/unit' file performs this setup for Test::Unit
|
15
|
+
# (ruby < 1.9) and Mini::Test (ruby >= 1.9); simply require it and
|
16
|
+
# call the setup methods as necessary.
|
17
|
+
#
|
18
|
+
module Test
|
19
|
+
autoload(:SubsetTest, 'tap/test/subset_test')
|
20
|
+
autoload(:FileTest, 'tap/test/file_test')
|
21
|
+
autoload(:ShellTest, 'tap/test/shell_test')
|
22
|
+
autoload(:TapTest, 'tap/test/tap_test')
|
23
|
+
autoload(:Utils, 'tap/test/utils')
|
24
|
+
|
25
|
+
# Includes SubsetTest in the calling class.
|
26
|
+
def acts_as_subset_test
|
27
|
+
include Tap::Test::SubsetTest
|
28
|
+
end
|
29
|
+
|
30
|
+
# Includes FileTest in the calling class and instantiating class_test_root
|
31
|
+
# (a Tap::Root). Options may be used to configure the class_test_root.
|
32
|
+
#
|
33
|
+
# Note: by default acts_as_file_test determines a root directory
|
34
|
+
# <em>based on the calling file</em>. Be sure to specify the root
|
35
|
+
# directory manually if you call acts_as_file_test from a file that
|
36
|
+
# isn't the test file.
|
37
|
+
def acts_as_file_test(options={})
|
38
|
+
include Tap::Test::FileTest
|
39
|
+
|
40
|
+
options[:root] ||= test_root_dir
|
41
|
+
self.class_test_root = Tap::Root.new(options)
|
42
|
+
end
|
43
|
+
|
44
|
+
# Includes ShellTest in the calling class. Options are set as the default
|
45
|
+
# sh_test_options.
|
46
|
+
def acts_as_shell_test(options=nil)
|
47
|
+
include Tap::Test::ShellTest
|
48
|
+
self.sh_test_options = options
|
49
|
+
end
|
50
|
+
|
51
|
+
# Includes TapTest in the calling class and calls acts_as_file_test with
|
52
|
+
# the options.
|
53
|
+
def acts_as_tap_test(options={})
|
54
|
+
options[:root] ||= test_root_dir
|
55
|
+
acts_as_file_test(options)
|
56
|
+
include Tap::Test::TapTest
|
57
|
+
end
|
58
|
+
|
59
|
+
private
|
60
|
+
|
61
|
+
# Infers the test root directory from the calling file.
|
62
|
+
# 'some_class.rb' => 'some_class'
|
63
|
+
# 'some_class_test.rb' => 'some_class'
|
64
|
+
def test_root_dir # :nodoc:
|
65
|
+
# caller[1] is considered the calling file (which should be the test case)
|
66
|
+
# note that caller entries are like this:
|
67
|
+
# ./path/to/file.rb:10
|
68
|
+
# ./path/to/file.rb:10:in 'method'
|
69
|
+
|
70
|
+
calling_file = caller[1].gsub(/:\d+(:in .*)?$/, "")
|
71
|
+
calling_file.chomp(File.extname(calling_file)).chomp("_test")
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
data/tap.yml
ADDED
File without changes
|
metadata
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: tap-test
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Simon Chiang
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-05-25 00:00:00 -06:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: tap
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 0.17.0
|
24
|
+
version:
|
25
|
+
description:
|
26
|
+
email: simon.a.chiang@gmail.com
|
27
|
+
executables: []
|
28
|
+
|
29
|
+
extensions: []
|
30
|
+
|
31
|
+
extra_rdoc_files:
|
32
|
+
- History
|
33
|
+
- README
|
34
|
+
- MIT-LICENSE
|
35
|
+
files:
|
36
|
+
- lib/tap/test.rb
|
37
|
+
- lib/tap/test/file_test.rb
|
38
|
+
- lib/tap/test/file_test/class_methods.rb
|
39
|
+
- lib/tap/test/shell_test.rb
|
40
|
+
- lib/tap/test/shell_test/class_methods.rb
|
41
|
+
- lib/tap/test/subset_test.rb
|
42
|
+
- lib/tap/test/subset_test/class_methods.rb
|
43
|
+
- lib/tap/test/tap_test.rb
|
44
|
+
- lib/tap/test/unit.rb
|
45
|
+
- lib/tap/test/utils.rb
|
46
|
+
- tap.yml
|
47
|
+
- History
|
48
|
+
- README
|
49
|
+
- MIT-LICENSE
|
50
|
+
has_rdoc: true
|
51
|
+
homepage: http://tap.rubyforge.org/tap-test/
|
52
|
+
post_install_message:
|
53
|
+
rdoc_options:
|
54
|
+
- --main
|
55
|
+
- README
|
56
|
+
- -S
|
57
|
+
- -N
|
58
|
+
- --title
|
59
|
+
- Tap-Test
|
60
|
+
require_paths:
|
61
|
+
- lib
|
62
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
63
|
+
requirements:
|
64
|
+
- - ">="
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: "0"
|
67
|
+
version:
|
68
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
69
|
+
requirements:
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: "0"
|
73
|
+
version:
|
74
|
+
requirements: []
|
75
|
+
|
76
|
+
rubyforge_project: tap
|
77
|
+
rubygems_version: 1.3.1
|
78
|
+
signing_key:
|
79
|
+
specification_version: 2
|
80
|
+
summary: Test modules for Tap
|
81
|
+
test_files: []
|
82
|
+
|