mspec 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +22 -0
- data/README +101 -0
- data/Rakefile +44 -0
- data/bin/mkspec +7 -0
- data/bin/mspec +7 -0
- data/bin/mspec-ci +8 -0
- data/bin/mspec-run +8 -0
- data/bin/mspec-tag +8 -0
- data/lib/mspec.rb +6 -0
- data/lib/mspec/commands/mkspec.rb +147 -0
- data/lib/mspec/commands/mspec-ci.rb +71 -0
- data/lib/mspec/commands/mspec-run.rb +80 -0
- data/lib/mspec/commands/mspec-tag.rb +87 -0
- data/lib/mspec/commands/mspec.rb +143 -0
- data/lib/mspec/expectations.rb +2 -0
- data/lib/mspec/expectations/expectations.rb +12 -0
- data/lib/mspec/expectations/should.rb +23 -0
- data/lib/mspec/guards.rb +13 -0
- data/lib/mspec/guards/bug.rb +27 -0
- data/lib/mspec/guards/compliance.rb +18 -0
- data/lib/mspec/guards/conflict.rb +16 -0
- data/lib/mspec/guards/endian.rb +40 -0
- data/lib/mspec/guards/extensions.rb +12 -0
- data/lib/mspec/guards/guard.rb +120 -0
- data/lib/mspec/guards/noncompliance.rb +12 -0
- data/lib/mspec/guards/platform.rb +38 -0
- data/lib/mspec/guards/quarantine.rb +15 -0
- data/lib/mspec/guards/runner.rb +30 -0
- data/lib/mspec/guards/superuser.rb +15 -0
- data/lib/mspec/guards/support.rb +12 -0
- data/lib/mspec/guards/version.rb +40 -0
- data/lib/mspec/helpers.rb +6 -0
- data/lib/mspec/helpers/bignum.rb +5 -0
- data/lib/mspec/helpers/const_lookup.rb +5 -0
- data/lib/mspec/helpers/flunk.rb +5 -0
- data/lib/mspec/helpers/io.rb +13 -0
- data/lib/mspec/helpers/scratch.rb +17 -0
- data/lib/mspec/helpers/tmp.rb +32 -0
- data/lib/mspec/matchers.rb +16 -0
- data/lib/mspec/matchers/base.rb +95 -0
- data/lib/mspec/matchers/be_ancestor_of.rb +24 -0
- data/lib/mspec/matchers/be_close.rb +27 -0
- data/lib/mspec/matchers/be_empty.rb +20 -0
- data/lib/mspec/matchers/be_false.rb +20 -0
- data/lib/mspec/matchers/be_kind_of.rb +24 -0
- data/lib/mspec/matchers/be_nil.rb +20 -0
- data/lib/mspec/matchers/be_true.rb +20 -0
- data/lib/mspec/matchers/complain.rb +56 -0
- data/lib/mspec/matchers/eql.rb +26 -0
- data/lib/mspec/matchers/equal.rb +26 -0
- data/lib/mspec/matchers/equal_utf16.rb +34 -0
- data/lib/mspec/matchers/include.rb +32 -0
- data/lib/mspec/matchers/output.rb +67 -0
- data/lib/mspec/matchers/output_to_fd.rb +71 -0
- data/lib/mspec/matchers/raise_error.rb +48 -0
- data/lib/mspec/mocks.rb +3 -0
- data/lib/mspec/mocks/mock.rb +123 -0
- data/lib/mspec/mocks/object.rb +28 -0
- data/lib/mspec/mocks/proxy.rb +112 -0
- data/lib/mspec/runner.rb +13 -0
- data/lib/mspec/runner/actions.rb +6 -0
- data/lib/mspec/runner/actions/debug.rb +17 -0
- data/lib/mspec/runner/actions/filter.rb +40 -0
- data/lib/mspec/runner/actions/gdb.rb +17 -0
- data/lib/mspec/runner/actions/tag.rb +97 -0
- data/lib/mspec/runner/actions/tally.rb +80 -0
- data/lib/mspec/runner/actions/timer.rb +22 -0
- data/lib/mspec/runner/filters.rb +4 -0
- data/lib/mspec/runner/filters/match.rb +22 -0
- data/lib/mspec/runner/filters/profile.rb +54 -0
- data/lib/mspec/runner/filters/regexp.rb +7 -0
- data/lib/mspec/runner/filters/tag.rb +29 -0
- data/lib/mspec/runner/formatters.rb +7 -0
- data/lib/mspec/runner/formatters/dotted.rb +81 -0
- data/lib/mspec/runner/formatters/html.rb +87 -0
- data/lib/mspec/runner/formatters/specdoc.rb +27 -0
- data/lib/mspec/runner/formatters/spinner.rb +89 -0
- data/lib/mspec/runner/formatters/summary.rb +8 -0
- data/lib/mspec/runner/formatters/unit.rb +25 -0
- data/lib/mspec/runner/formatters/yaml.rb +43 -0
- data/lib/mspec/runner/mspec.rb +232 -0
- data/lib/mspec/runner/object.rb +20 -0
- data/lib/mspec/runner/shared.rb +12 -0
- data/lib/mspec/runner/state.rb +116 -0
- data/lib/mspec/runner/tag.rb +20 -0
- data/lib/mspec/utils/name_map.rb +130 -0
- data/lib/mspec/utils/options.rb +344 -0
- data/lib/mspec/utils/script.rb +77 -0
- data/lib/mspec/version.rb +3 -0
- data/spec/commands/mkspec_spec.rb +321 -0
- data/spec/commands/mspec_ci_spec.rb +139 -0
- data/spec/commands/mspec_run_spec.rb +146 -0
- data/spec/commands/mspec_spec.rb +359 -0
- data/spec/commands/mspec_tag_spec.rb +131 -0
- data/spec/expectations/expectations_spec.rb +16 -0
- data/spec/expectations/should_spec.rb +99 -0
- data/spec/guards/bug_spec.rb +137 -0
- data/spec/guards/compliance_spec.rb +70 -0
- data/spec/guards/conflict_spec.rb +20 -0
- data/spec/guards/endian_spec.rb +42 -0
- data/spec/guards/extensions_spec.rb +36 -0
- data/spec/guards/guard_spec.rb +355 -0
- data/spec/guards/noncompliance_spec.rb +36 -0
- data/spec/guards/platform_spec.rb +84 -0
- data/spec/guards/quarantine_spec.rb +19 -0
- data/spec/guards/runner_spec.rb +75 -0
- data/spec/guards/superuser_spec.rb +22 -0
- data/spec/guards/support_spec.rb +22 -0
- data/spec/guards/version_spec.rb +133 -0
- data/spec/helpers/bignum_spec.rb +11 -0
- data/spec/helpers/const_lookup_spec.rb +19 -0
- data/spec/helpers/flunk_spec.rb +15 -0
- data/spec/helpers/io_spec.rb +34 -0
- data/spec/helpers/scratch_spec.rb +22 -0
- data/spec/helpers/tmp_spec.rb +72 -0
- data/spec/matchers/base_spec.rb +180 -0
- data/spec/matchers/be_ancestor_of_spec.rb +28 -0
- data/spec/matchers/be_close_spec.rb +46 -0
- data/spec/matchers/be_empty_spec.rb +26 -0
- data/spec/matchers/be_false_spec.rb +28 -0
- data/spec/matchers/be_kind_of_spec.rb +29 -0
- data/spec/matchers/be_nil_spec.rb +27 -0
- data/spec/matchers/be_true_spec.rb +28 -0
- data/spec/matchers/complain_spec.rb +52 -0
- data/spec/matchers/eql_spec.rb +33 -0
- data/spec/matchers/equal_spec.rb +33 -0
- data/spec/matchers/equal_utf16_spec.rb +47 -0
- data/spec/matchers/include_spec.rb +37 -0
- data/spec/matchers/output_spec.rb +74 -0
- data/spec/matchers/output_to_fd_spec.rb +33 -0
- data/spec/matchers/raise_error_spec.rb +56 -0
- data/spec/mocks/mock_spec.rb +272 -0
- data/spec/mocks/proxy_spec.rb +259 -0
- data/spec/runner/actions/debug_spec.rb +61 -0
- data/spec/runner/actions/filter_spec.rb +84 -0
- data/spec/runner/actions/gdb_spec.rb +61 -0
- data/spec/runner/actions/tag_spec.rb +253 -0
- data/spec/runner/actions/tally_spec.rb +107 -0
- data/spec/runner/actions/timer_spec.rb +42 -0
- data/spec/runner/filters/a.yaml +4 -0
- data/spec/runner/filters/b.yaml +11 -0
- data/spec/runner/filters/match_spec.rb +44 -0
- data/spec/runner/filters/profile_spec.rb +117 -0
- data/spec/runner/filters/regexp_spec.rb +13 -0
- data/spec/runner/filters/tag_spec.rb +77 -0
- data/spec/runner/formatters/dotted_spec.rb +184 -0
- data/spec/runner/formatters/html_spec.rb +191 -0
- data/spec/runner/formatters/specdoc_spec.rb +57 -0
- data/spec/runner/formatters/spinner_spec.rb +78 -0
- data/spec/runner/formatters/summary_spec.rb +29 -0
- data/spec/runner/formatters/unit_spec.rb +71 -0
- data/spec/runner/formatters/yaml_spec.rb +123 -0
- data/spec/runner/mspec_spec.rb +393 -0
- data/spec/runner/shared_spec.rb +41 -0
- data/spec/runner/state_spec.rb +535 -0
- data/spec/runner/tag_spec.rb +93 -0
- data/spec/runner/tags.txt +3 -0
- data/spec/spec_helper.rb +46 -0
- data/spec/utils/name_map_spec.rb +178 -0
- data/spec/utils/options_spec.rb +862 -0
- data/spec/utils/script_spec.rb +240 -0
- metadata +217 -0
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2008 Engine Yard, Inc. All rights reserved.
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person
|
4
|
+
obtaining a copy of this software and associated documentation
|
5
|
+
files (the "Software"), to deal in the Software without
|
6
|
+
restriction, including without limitation the rights to use,
|
7
|
+
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
8
|
+
copies of the Software, and to permit persons to whom the
|
9
|
+
Software is furnished to do so, subject to the following
|
10
|
+
conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be
|
13
|
+
included in all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
17
|
+
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
19
|
+
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
20
|
+
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
21
|
+
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
22
|
+
OTHER DEALINGS IN THE SOFTWARE.
|
data/README
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
= Overview
|
2
|
+
|
3
|
+
MSpec is a specialized framework that is syntax-compatible with RSpec for
|
4
|
+
basic things like +describe+, +it+ blocks and +before+, +after+ actions. MSpec
|
5
|
+
contains additional features that assist in writing the RubySpecs used by
|
6
|
+
multiple Ruby implementations.
|
7
|
+
|
8
|
+
MSpec attempts to use the simplest Ruby language features so that beginning
|
9
|
+
Ruby implementations can run the Ruby specs. So, for example, there is not
|
10
|
+
great concern given to constant clashes. Namespacing (or module scoping) is
|
11
|
+
not used because implementing this correctly took a significant amount of work
|
12
|
+
in Rubinius and it is likely that other implementations would also face
|
13
|
+
difficulties.
|
14
|
+
|
15
|
+
MSpec is not intended as a replacement for RSpec. MSpec attempts to provide a
|
16
|
+
subset of RSpec's features in some cases and a superset in others. It does not
|
17
|
+
provide all the matchers, for instance. However, MSpec provides several
|
18
|
+
extensions to facilitate writing the Ruby specs in a manner compatible with
|
19
|
+
multiple Ruby implementations.
|
20
|
+
|
21
|
+
First, MSpec offers a set of guards to control execution of the specs. These
|
22
|
+
guards not only enable or disable execution but also annotate the specs with
|
23
|
+
additional information about why they are run or not run. Second, MSpec
|
24
|
+
provides a different shared spec implementation specifically designed to ease
|
25
|
+
writing specs for the numerous aliased methods in Ruby. The MSpec shared spec
|
26
|
+
implementation should not conflict with RSpec's own shared behavior facility.
|
27
|
+
Third, MSpec provides various helper methods to simplify some specs, for
|
28
|
+
example, creating temporary file names. Finally, MSpec has several specialized
|
29
|
+
runner scripts that includes a configuration facility with a default project
|
30
|
+
file and user-specific overrides.
|
31
|
+
|
32
|
+
Caveats:
|
33
|
+
|
34
|
+
* Use RSpec to run the MSpec specs. There are no plans currently to make
|
35
|
+
the MSpec specs runnable by MSpec.
|
36
|
+
* Don't mock the #hash method as MSpec's Mock implementation uses Hash
|
37
|
+
internally. This can be replaced if necessary, but at this point there is no
|
38
|
+
compelling need to do so.
|
39
|
+
|
40
|
+
|
41
|
+
== Architecture
|
42
|
+
|
43
|
+
|
44
|
+
== Matchers
|
45
|
+
|
46
|
+
Matchers are additional aids for the verification process. The default
|
47
|
+
is of course to #should or #should_not using the #== operator and its
|
48
|
+
friends but the matchers add a new set of 'operators' to help in the
|
49
|
+
task. They reside in `mspec/matchers/`. There are two broad categories,
|
50
|
+
those that apply to an individual object and those that apply to a
|
51
|
+
block:
|
52
|
+
|
53
|
+
=== Object
|
54
|
+
|
55
|
+
- `base` implements the standard #==, #< #<= #>= #> and #=~ with their
|
56
|
+
normal semantics for the objects that you invoke them on.
|
57
|
+
|
58
|
+
- `be_ancestor_of` is equivalent to checking `obj.ancestors.include?`.
|
59
|
+
|
60
|
+
- `be_close` is a "delta" for floating-point math. Due to the very
|
61
|
+
nature of it, floating-point comparisons should never be treated as
|
62
|
+
exact. By default the tolerance is 0.00003 but it can be altered if
|
63
|
+
so desired. So `0.23154.should be_close(0.23157)` would succeed
|
64
|
+
(which is usually close enough for floating point unless you are
|
65
|
+
doing some scientific computing.)
|
66
|
+
|
67
|
+
- `be_empty` checks `obj.empty?`
|
68
|
+
|
69
|
+
- `be_kind_of` is equivalent to `obj.kind_of?`
|
70
|
+
|
71
|
+
- `include` is `obj.include?`
|
72
|
+
|
73
|
+
=== Block
|
74
|
+
|
75
|
+
All of these should be applied to a block created with `lambda` or `proc`:
|
76
|
+
|
77
|
+
- `complain` is probably clearer stated as `lambda {...}.should complain`;
|
78
|
+
it checks that the block issues a warning. The message can be checked
|
79
|
+
against either a String or a Regexp.
|
80
|
+
|
81
|
+
- `output` checks that the block produces the given output (stdout as well
|
82
|
+
as stderr, in that order) matched either to a String or a Regexp. This one
|
83
|
+
uses overrides so if that is a problem (for e.g. speccing Readline or
|
84
|
+
something) see below.
|
85
|
+
|
86
|
+
- `output_to_fd` is a lower-level version and actually verifies that output
|
87
|
+
to a certain file descriptor is correct whether from an in-/output stream
|
88
|
+
or an actual file. Also can check with either a String or a Regexp.
|
89
|
+
|
90
|
+
- `raise_error` verifies the exception type (if any) raised by the block it
|
91
|
+
is associated with. The exception class can be given for finer-grained
|
92
|
+
control (inheritance works normally so Exception would catch everything.)
|
93
|
+
|
94
|
+
|
95
|
+
== Guards
|
96
|
+
|
97
|
+
|
98
|
+
== Helpers
|
99
|
+
|
100
|
+
|
101
|
+
== Runners
|
data/Rakefile
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'spec/rake/spectask'
|
3
|
+
require 'rake/gempackagetask'
|
4
|
+
|
5
|
+
Spec::Rake::SpecTask.new
|
6
|
+
|
7
|
+
task :default => :spec
|
8
|
+
|
9
|
+
|
10
|
+
spec = Gem::Specification.new do |s|
|
11
|
+
s.name = %q{mspec}
|
12
|
+
s.version = "1.0.0"
|
13
|
+
|
14
|
+
s.specification_version = 2 if s.respond_to? :specification_version=
|
15
|
+
|
16
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
17
|
+
s.authors = ["Brian Ford"]
|
18
|
+
s.date = %q{2008-05-21}
|
19
|
+
s.email = %q{bford@engineyard.com}
|
20
|
+
s.has_rdoc = true
|
21
|
+
s.extra_rdoc_files = %w[ README LICENSE ]
|
22
|
+
s.executables = ["mkspec", "mspec", "mspec-ci", "mspec-run", "mspec-tag"]
|
23
|
+
s.files = FileList[ '{bin,lib,spec}/**/*.{yaml,txt,rb}', 'Rakefile', *s.extra_rdoc_files ]
|
24
|
+
s.homepage = %q{http://rubyspec.org}
|
25
|
+
s.rubyforge_project = 'http://rubyforge.org/projects/mspec'
|
26
|
+
s.require_paths = ["lib"]
|
27
|
+
s.rubygems_version = %q{1.1.1}
|
28
|
+
s.summary = <<EOS
|
29
|
+
MSpec is a specialized framework that is syntax-compatible
|
30
|
+
with RSpec for basic things like describe, it blocks and
|
31
|
+
before, after actions.
|
32
|
+
|
33
|
+
MSpec contains additional features that assist in writing
|
34
|
+
the RubySpecs used by multiple Ruby implementations. Also,
|
35
|
+
MSpec attempts to use the simplest Ruby language features
|
36
|
+
so that beginning Ruby implementations can run it.
|
37
|
+
EOS
|
38
|
+
|
39
|
+
s.rdoc_options << '--title' << 'MSpec Gem' <<
|
40
|
+
'--main' << 'README' <<
|
41
|
+
'--line-numbers'
|
42
|
+
end
|
43
|
+
|
44
|
+
Rake::GemPackageTask.new(spec){ |pkg| pkg.gem_spec = spec }
|
data/bin/mkspec
ADDED
data/bin/mspec
ADDED
data/bin/mspec-ci
ADDED
data/bin/mspec-run
ADDED
data/bin/mspec-tag
ADDED
data/lib/mspec.rb
ADDED
@@ -0,0 +1,147 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
|
3
|
+
MSPEC_HOME = File.expand_path(File.dirname(__FILE__) + '/../../..')
|
4
|
+
|
5
|
+
require 'fileutils'
|
6
|
+
require 'optparse'
|
7
|
+
require 'rbconfig'
|
8
|
+
require 'mspec/version'
|
9
|
+
require 'mspec/utils/name_map'
|
10
|
+
|
11
|
+
|
12
|
+
class MkSpec
|
13
|
+
attr_reader :config
|
14
|
+
|
15
|
+
def initialize
|
16
|
+
@config = {
|
17
|
+
:constants => [],
|
18
|
+
:requires => [],
|
19
|
+
:base => "spec/ruby/1.8/core"
|
20
|
+
}
|
21
|
+
@map = NameMap.new
|
22
|
+
end
|
23
|
+
|
24
|
+
def options(argv=ARGV)
|
25
|
+
options = OptionParser.new
|
26
|
+
options.version = MSpec::VERSION
|
27
|
+
options.banner = "mkspec [options]"
|
28
|
+
options.separator ""
|
29
|
+
|
30
|
+
options.on("-c", "--constant CONSTANT", String,
|
31
|
+
"Class or Module to generate spec stubs for") do |name|
|
32
|
+
config[:constants] << name
|
33
|
+
end
|
34
|
+
options.on("-b", "--base DIR", String,
|
35
|
+
"Directory to generate specs into") do |directory|
|
36
|
+
config[:base] = File.expand_path directory
|
37
|
+
end
|
38
|
+
options.on("-r", "--require LIBRARY", String,
|
39
|
+
"A library to require") do |file|
|
40
|
+
config[:requires] << file
|
41
|
+
end
|
42
|
+
|
43
|
+
options.separator "\n How might this work in the real world?\n"
|
44
|
+
options.separator " 1. To create spec stubs for every class or module in Object\n"
|
45
|
+
options.separator " $ mkspec\n"
|
46
|
+
options.separator " 2. To create spec stubs for Fixnum\n"
|
47
|
+
options.separator " $ mkspec -c Fixnum\n"
|
48
|
+
options.separator " 3. To create spec stubs for Complex in 'superspec/complex'\n"
|
49
|
+
options.separator " $ mkspec -c Complex -rcomplex -b superspec"
|
50
|
+
options.separator ""
|
51
|
+
|
52
|
+
options.parse argv
|
53
|
+
rescue OptionParser::ParseError => e
|
54
|
+
puts options
|
55
|
+
puts
|
56
|
+
puts e
|
57
|
+
exit 1
|
58
|
+
end
|
59
|
+
|
60
|
+
def create_directory(mod)
|
61
|
+
subdir = @map.dir_name mod, config[:base]
|
62
|
+
|
63
|
+
if File.exist? subdir
|
64
|
+
unless File.directory? subdir
|
65
|
+
puts "#{subdir} already exists and is not a directory."
|
66
|
+
return nil
|
67
|
+
end
|
68
|
+
else
|
69
|
+
FileUtils.mkdir_p subdir
|
70
|
+
end
|
71
|
+
|
72
|
+
subdir
|
73
|
+
end
|
74
|
+
|
75
|
+
def write_requires(dir, file)
|
76
|
+
/\A#{Regexp.escape config[:base]}\/?(.*)/ =~ dir
|
77
|
+
parents = '../' * ($1.split('/').length + 1)
|
78
|
+
|
79
|
+
File.open file, 'w' do |f|
|
80
|
+
f.puts "require File.dirname(__FILE__) + '/#{parents}spec_helper'"
|
81
|
+
config[:requires].each do |lib|
|
82
|
+
f.puts "require '#{lib}'"
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def write_spec(file, meth, exists)
|
88
|
+
if exists
|
89
|
+
out = `#{ruby} #{MSPEC_HOME}/bin/mspec-run --dry-run -fs -e '#{meth}' #{file}`
|
90
|
+
return if out =~ /#{Regexp.escape meth}/
|
91
|
+
end
|
92
|
+
|
93
|
+
File.open file, 'a' do |f|
|
94
|
+
f.puts <<-EOS
|
95
|
+
|
96
|
+
describe "#{meth}" do
|
97
|
+
it "needs to be reviewed for spec completeness" do
|
98
|
+
end
|
99
|
+
end
|
100
|
+
EOS
|
101
|
+
end
|
102
|
+
|
103
|
+
puts file
|
104
|
+
end
|
105
|
+
|
106
|
+
def create_file(dir, mod, meth, name)
|
107
|
+
file = File.join dir, @map.file_name(meth, mod)
|
108
|
+
exists = File.exist? file
|
109
|
+
|
110
|
+
write_requires dir, file unless exists
|
111
|
+
write_spec file, name, exists
|
112
|
+
end
|
113
|
+
|
114
|
+
def run
|
115
|
+
config[:requires].each { |lib| require lib }
|
116
|
+
constants = config[:constants]
|
117
|
+
constants = @map.filter(Object.constants) if constants.empty?
|
118
|
+
|
119
|
+
@map.map({}, constants).each do |mod, methods|
|
120
|
+
name = mod.chop
|
121
|
+
next unless dir = create_directory(name)
|
122
|
+
|
123
|
+
methods.each { |method| create_file dir, name, method, mod + method }
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
##
|
128
|
+
# Determine and return the path of the ruby executable.
|
129
|
+
|
130
|
+
def ruby
|
131
|
+
ruby = File.join(Config::CONFIG['bindir'],
|
132
|
+
Config::CONFIG['ruby_install_name'])
|
133
|
+
|
134
|
+
ruby.gsub! File::SEPARATOR, File::ALT_SEPARATOR if File::ALT_SEPARATOR
|
135
|
+
|
136
|
+
return ruby
|
137
|
+
end
|
138
|
+
|
139
|
+
def self.main
|
140
|
+
ENV['MSPEC_RUNNER'] = '1'
|
141
|
+
|
142
|
+
script = new
|
143
|
+
script.options
|
144
|
+
script.run
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
@@ -0,0 +1,71 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
$:.unshift File.expand_path(File.dirname(__FILE__) + '/../lib')
|
4
|
+
|
5
|
+
require 'optparse'
|
6
|
+
require 'mspec/utils/options'
|
7
|
+
require 'mspec/utils/script'
|
8
|
+
|
9
|
+
|
10
|
+
class MSpecCI < MSpecScript
|
11
|
+
def options(argv=ARGV)
|
12
|
+
options = MSpecOptions.new config, "ci", "", 28, " "
|
13
|
+
|
14
|
+
options.separator " Ask yourself:"
|
15
|
+
options.separator " 1. How to run the specs?"
|
16
|
+
options.separator " 2. How to display the output?"
|
17
|
+
options.separator " 3. What action to perform?"
|
18
|
+
options.separator " 4. When to perform it?"
|
19
|
+
|
20
|
+
options.separator "\n How to run the specs"
|
21
|
+
options.add_config { |f| load f }
|
22
|
+
options.add_name
|
23
|
+
options.add_tags_dir
|
24
|
+
options.add_pretend
|
25
|
+
options.add_interrupt
|
26
|
+
|
27
|
+
options.separator "\n How to display their output"
|
28
|
+
options.add_formatters
|
29
|
+
options.add_verbose
|
30
|
+
|
31
|
+
options.separator "\n What action to perform"
|
32
|
+
options.add_actions
|
33
|
+
|
34
|
+
options.separator "\n When to perform it"
|
35
|
+
options.add_action_filters
|
36
|
+
|
37
|
+
options.separator "\n Help!"
|
38
|
+
options.add_version
|
39
|
+
options.add_help
|
40
|
+
|
41
|
+
options.separator "\n How might this work in the real world?"
|
42
|
+
options.separator "\n 1. To simply run the known good specs"
|
43
|
+
options.separator "\n $ mspec ci"
|
44
|
+
options.separator "\n 2. To run a subset of the known good specs"
|
45
|
+
options.separator "\n $ mspec ci path/to/specs"
|
46
|
+
options.separator "\n 3. To start the debugger before the spec matching 'this crashes'"
|
47
|
+
options.separator "\n $ mspec ci --spec-debug -S 'this crashes'"
|
48
|
+
options.separator ""
|
49
|
+
|
50
|
+
@patterns = options.parse argv
|
51
|
+
@patterns = config[:ci_files] if @patterns.empty?
|
52
|
+
end
|
53
|
+
|
54
|
+
def run
|
55
|
+
files = []
|
56
|
+
@patterns.each do |item|
|
57
|
+
stat = File.stat(File.expand_path(item))
|
58
|
+
files << item if stat.file?
|
59
|
+
files.concat(Dir[item+"/**/*_spec.rb"].sort) if stat.directory?
|
60
|
+
end
|
61
|
+
|
62
|
+
MSpec.register_tags_path config[:tags_dir]
|
63
|
+
MSpec.register_files files
|
64
|
+
TagFilter.new(:exclude, "fails").register
|
65
|
+
TagFilter.new(:exclude, "unstable").register
|
66
|
+
TagFilter.new(:exclude, "incomplete").register
|
67
|
+
|
68
|
+
MSpec.process
|
69
|
+
exit MSpec.exit_code
|
70
|
+
end
|
71
|
+
end
|