bashcov 1.2.1 → 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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +16 -3
- data/Gemfile +2 -0
- data/Guardfile +2 -0
- data/LICENSE.txt +1 -1
- data/README.md +60 -5
- data/Rakefile +2 -0
- data/bashcov.gemspec +4 -3
- data/bin/bashcov +3 -2
- data/lib/bashcov/bash_info.rb +32 -0
- data/lib/bashcov/errors.rb +16 -0
- data/lib/bashcov/field_stream.rb +77 -0
- data/lib/bashcov/lexer.rb +13 -7
- data/lib/bashcov/line.rb +4 -2
- data/lib/bashcov/runner.rb +96 -21
- data/lib/bashcov/version.rb +4 -1
- data/lib/bashcov/xtrace.rb +150 -35
- data/lib/bashcov.rb +64 -31
- metadata +9 -58
- data/.gitignore +0 -19
- data/.rspec +0 -4
- data/.rubocop.yml +0 -27
- data/.travis.yml +0 -21
- data/spec/bashcov/lexer_spec.rb +0 -11
- data/spec/bashcov/runner_spec.rb +0 -98
- data/spec/bashcov_spec.rb +0 -82
- data/spec/spec_helper.rb +0 -25
- data/spec/support/common.rb +0 -7
- data/spec/support/test_app.rb +0 -35
- data/spec/test_app/.simplecov +0 -2
- data/spec/test_app/README.md +0 -1
- data/spec/test_app/never_called.sh +0 -4
- data/spec/test_app/scripts/README.md +0 -1
- data/spec/test_app/scripts/case.sh +0 -15
- data/spec/test_app/scripts/delete.sh +0 -9
- data/spec/test_app/scripts/executable +0 -4
- data/spec/test_app/scripts/exit_non_zero.sh +0 -3
- data/spec/test_app/scripts/function.sh +0 -20
- data/spec/test_app/scripts/long_line.sh +0 -7
- data/spec/test_app/scripts/multiline.sh +0 -24
- data/spec/test_app/scripts/nested/simple.sh +0 -13
- data/spec/test_app/scripts/one_liner.sh +0 -9
- data/spec/test_app/scripts/simple.sh +0 -13
- data/spec/test_app/scripts/source.sh +0 -6
- data/spec/test_app/scripts/sourced.txt +0 -4
- data/spec/test_app/scripts/unicode.sh +0 -4
- data/spec/test_app/test_suite.sh +0 -5
data/lib/bashcov/xtrace.rb
CHANGED
@@ -1,32 +1,70 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "pathname"
|
4
|
+
require "securerandom"
|
5
|
+
|
6
|
+
require "bashcov/errors"
|
7
|
+
|
1
8
|
module Bashcov
|
2
9
|
# This class manages +xtrace+ output.
|
3
10
|
#
|
4
11
|
# @see Runner
|
5
12
|
class Xtrace
|
6
|
-
#
|
7
|
-
#
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
#
|
14
|
-
#
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
13
|
+
# [String] Character that will be used to indicate the nesting level of
|
14
|
+
# +xtrace+d instructions
|
15
|
+
DEPTH_CHAR = "+"
|
16
|
+
|
17
|
+
# [String] Prefix used in +PS4+ to identify relevant output
|
18
|
+
PREFIX = "BASHCOV>"
|
19
|
+
|
20
|
+
# [Array<String>] A collection of Bash internal variables to expand in the
|
21
|
+
# {PS4}
|
22
|
+
FIELDS = %w(${LINENO} ${BASH_SOURCE} ${PWD} ${OLDPWD}).freeze
|
23
|
+
|
24
|
+
class << self
|
25
|
+
attr_writer :delimiter, :ps4
|
26
|
+
|
27
|
+
# [String] A randomly-generated UUID or the ASCII RS (record separator)
|
28
|
+
# character, depending on whether the current Bash suffers from the
|
29
|
+
# truncated +PS4+ bug. Used for delimiting the fields of the +PS4+.
|
30
|
+
def delimiter
|
31
|
+
@delimiter ||= Bashcov.truncated_ps4? ? "\x1E" : SecureRandom.uuid
|
32
|
+
end
|
33
|
+
|
34
|
+
# @return [String] +PS4+ variable used for xtrace output. Expands to
|
35
|
+
# internal Bash variables +BASH_SOURCE+, +PWD+, +OLDPWD+, and +LINENO+,
|
36
|
+
# delimited by {delimiter}.
|
37
|
+
# @see http://www.gnu.org/software/bash/manual/bashref.html#index-PS4
|
38
|
+
def ps4
|
39
|
+
@ps4 ||= make_ps4(*FIELDS)
|
40
|
+
end
|
41
|
+
|
42
|
+
# @return [String] a {delimiter}-separated +String+ suitable for use as
|
43
|
+
# +PS4+
|
44
|
+
def make_ps4(*fields)
|
45
|
+
fields.reduce(DEPTH_CHAR + PREFIX) do |memo, field|
|
46
|
+
memo + delimiter + field
|
47
|
+
end + delimiter
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
# Regexp to match the beginning of the {.ps4}. {DEPTH_CHAR} will be
|
52
|
+
# repeated in proportion to the level of Bash call nesting.
|
53
|
+
PS4_START_REGEXP = /#{Regexp.escape(DEPTH_CHAR)}+#{Regexp.escape(PREFIX)}$/m
|
54
|
+
|
55
|
+
# Creates a pipe for xtrace output.
|
56
|
+
# @see http://stackoverflow.com/questions/6977562/pipe-vs-temporary-file
|
57
|
+
def initialize(field_stream)
|
58
|
+
@field_stream = field_stream
|
59
|
+
|
29
60
|
@read, @write = IO.pipe
|
61
|
+
|
62
|
+
# Tracks coverage for each file under test
|
63
|
+
@files ||= {}
|
64
|
+
|
65
|
+
# Stacks for updating working directory changes
|
66
|
+
@pwd_stack ||= []
|
67
|
+
@oldpwd_stack ||= []
|
30
68
|
end
|
31
69
|
|
32
70
|
# @return [Fixnum] File descriptor of the write end of the pipe
|
@@ -40,24 +78,101 @@ module Bashcov
|
|
40
78
|
@write.close
|
41
79
|
end
|
42
80
|
|
43
|
-
#
|
44
|
-
# @return [Hash
|
81
|
+
# Read fields extracted from Bash's debugging output
|
82
|
+
# @return [Hash<Pathname, Array<Integer, nil>>] A hash mapping Bash scripts
|
83
|
+
# to Simplecov-style coverage stats
|
45
84
|
def read
|
46
|
-
@
|
47
|
-
|
48
|
-
@read.each_line do |line|
|
49
|
-
match = line.match(LINE_REGEXP)
|
50
|
-
next if match.nil? # garbage line from multiline instruction
|
85
|
+
@field_stream.read = @read
|
51
86
|
|
52
|
-
|
87
|
+
field_count = FIELDS.length
|
88
|
+
fields = @field_stream.each(
|
89
|
+
self.class.delimiter, field_count, PS4_START_REGEXP
|
90
|
+
)
|
53
91
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
92
|
+
# +take(field_count)+ would be more natural here, but doesn't seem to
|
93
|
+
# play nicely with +Enumerator+s backed by +IO+ objects.
|
94
|
+
loop do
|
95
|
+
break if (hit = (1..field_count).map { fields.next }).empty?
|
96
|
+
parse_hit!(*hit)
|
58
97
|
end
|
59
98
|
|
60
99
|
@files
|
61
100
|
end
|
101
|
+
|
102
|
+
private
|
103
|
+
|
104
|
+
# Parses the expanded {ps4} fields and updates the coverage-tracking
|
105
|
+
# {@files} hash
|
106
|
+
# @overload parse_hit!(lineno, bash_source, pwd, oldpwd)
|
107
|
+
# @param [String] lineno expanded +LINENO+
|
108
|
+
# @param [Pathname] bash_source expanded +BASH_SOURCE+
|
109
|
+
# @param [Pathname] pwd expanded +PWD+
|
110
|
+
# @param [Pathname] oldpwd expanded +OLDPWD+
|
111
|
+
# @return [void]
|
112
|
+
# @raise [XtraceError] when +lineno+ is not composed solely of digits,
|
113
|
+
# indicating that something has gone wrong with parsing the +PS4+ fields
|
114
|
+
def parse_hit!(lineno, *paths)
|
115
|
+
# If +LINENO+ isn't a series of digits, something has gone wrong. Add
|
116
|
+
# +@files+ to the exception in order to propagate the existing coverage
|
117
|
+
# data back to the {Bashcov::Runner} instance.
|
118
|
+
unless lineno =~ /\A\d+\z/
|
119
|
+
lineno_err = lineno.empty? ? nil : lineno
|
120
|
+
|
121
|
+
raise XtraceError.new(
|
122
|
+
"expected integer for LINENO, got `#{lineno_err.inspect}'", @files
|
123
|
+
)
|
124
|
+
end
|
125
|
+
|
126
|
+
# The next three fields will be $BASH_SOURCE, $PWD, $OLDPWD, and $LINENO
|
127
|
+
bash_source, pwd, oldpwd = paths.map { |p| Pathname.new(p) }
|
128
|
+
|
129
|
+
update_wd_stacks!(pwd, oldpwd)
|
130
|
+
|
131
|
+
script = find_script(bash_source)
|
132
|
+
|
133
|
+
# For one-liners, +LINENO+ == 0. Do this to avoid an +IndexError+;
|
134
|
+
# one-liners will be culled from the coverage results later on.
|
135
|
+
index = (lineno_i = lineno.to_i) > 1 ? lineno_i - 1 : 0
|
136
|
+
|
137
|
+
@files[script] ||= []
|
138
|
+
@files[script][index] ||= 0
|
139
|
+
@files[script][index] += 1
|
140
|
+
end
|
141
|
+
|
142
|
+
# Scans entries in the +PWD+ stack, checking whether +entry/$BASH_SOURCE+
|
143
|
+
# refers to an existing file. Scans the stack in reverse on the assumption
|
144
|
+
# that more-recent entries are more plausible candidates for base
|
145
|
+
# directories from which +BASH_SOURCE+ can be reached.
|
146
|
+
# @param [Pathname] bash_source expanded +BASH_SOURCE+
|
147
|
+
# @return [Pathname] the resolved path to +bash_source+, if it exists;
|
148
|
+
# otherwise, +bash_source+ cleaned of redundant slashes and dots
|
149
|
+
def find_script(bash_source)
|
150
|
+
script = @pwd_stack.reverse.map { |wd| wd + bash_source }.find(&:file?)
|
151
|
+
script.nil? ? bash_source.cleanpath : script.realpath
|
152
|
+
end
|
153
|
+
|
154
|
+
# Updates the stacks that track the history of values for +PWD+ and
|
155
|
+
# +OLDPWD+
|
156
|
+
# @param [Pathname] pwd expanded +PWD+
|
157
|
+
# @param [Pathname] oldpwd expanded +OLDPWD+
|
158
|
+
# @return [void]
|
159
|
+
def update_wd_stacks!(pwd, oldpwd)
|
160
|
+
@pwd_stack[0] ||= pwd
|
161
|
+
@oldpwd_stack[0] ||= oldpwd unless oldpwd.to_s.empty?
|
162
|
+
|
163
|
+
# We haven't changed working directories; short-circuit.
|
164
|
+
return if pwd == @pwd_stack[-1]
|
165
|
+
|
166
|
+
# If the current +pwd+ is identical to the top of the +@oldpwd_stack+ and
|
167
|
+
# the current +oldpwd+ is identical to the second-to-top entry, then a
|
168
|
+
# previous cd/pushd has been undone.
|
169
|
+
if pwd == @oldpwd_stack[-1] && oldpwd == @oldpwd_stack[-2]
|
170
|
+
@pwd_stack.pop
|
171
|
+
@oldpwd_stack.pop
|
172
|
+
else # New cd/pushd
|
173
|
+
@pwd_stack << pwd
|
174
|
+
@oldpwd_stack << oldpwd
|
175
|
+
end
|
176
|
+
end
|
62
177
|
end
|
63
178
|
end
|
data/lib/bashcov.rb
CHANGED
@@ -1,29 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "optparse"
|
2
|
-
require "
|
3
|
-
|
4
|
-
require "bashcov/
|
5
|
-
require "bashcov/line"
|
4
|
+
require "pathname"
|
5
|
+
|
6
|
+
require "bashcov/bash_info"
|
6
7
|
require "bashcov/runner"
|
7
|
-
require "bashcov/
|
8
|
+
require "bashcov/version"
|
8
9
|
|
9
10
|
# Bashcov default module
|
10
11
|
# @note Keep it short!
|
11
12
|
module Bashcov
|
12
|
-
|
13
|
-
# @return [OpenStruct] Bashcov settings
|
14
|
-
attr_reader :options
|
13
|
+
extend Bashcov::BashInfo
|
15
14
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
15
|
+
# A +Struct+ to store Bashcov configuration
|
16
|
+
Options = Struct.new(
|
17
|
+
*%i(skip_uncovered mute bash_path root_directory command)
|
18
|
+
)
|
20
19
|
|
21
|
-
|
22
|
-
# @return [
|
23
|
-
def
|
24
|
-
@options
|
25
|
-
@options
|
26
|
-
@options.mute = false
|
20
|
+
class << self
|
21
|
+
# @return [Struct] The +Struct+ object representing Bashcov configuration
|
22
|
+
def options
|
23
|
+
set_default_options! unless defined?(@options)
|
24
|
+
@options
|
27
25
|
end
|
28
26
|
|
29
27
|
# Parses the given CLI arguments and sets +options+.
|
@@ -31,24 +29,54 @@ module Bashcov
|
|
31
29
|
# @raise [SystemExit] if invalid arguments are given
|
32
30
|
# @return [void]
|
33
31
|
def parse_options!(args)
|
34
|
-
|
32
|
+
begin
|
33
|
+
option_parser.parse!(args)
|
34
|
+
rescue OptionParser::ParseError, Errno::ENOENT => e
|
35
|
+
abort "#{option_parser.program_name}: #{e.message}"
|
36
|
+
end
|
35
37
|
|
36
38
|
if args.empty?
|
37
39
|
abort("You must give exactly one command to execute.")
|
38
40
|
else
|
39
|
-
|
41
|
+
options.command = args.unshift(bash_path)
|
40
42
|
end
|
41
43
|
end
|
42
44
|
|
45
|
+
# @return [String] Program name
|
46
|
+
def program_name
|
47
|
+
"bashcov"
|
48
|
+
end
|
49
|
+
|
43
50
|
# @return [String] Program name including version for easy consistent output
|
44
|
-
|
45
|
-
|
51
|
+
# @note +fullname+ instead of name to avoid clashing with +Module.name+
|
52
|
+
def fullname
|
53
|
+
"#{program_name} v#{VERSION}"
|
54
|
+
end
|
55
|
+
|
56
|
+
# Wipe the current options and reset default values
|
57
|
+
def set_default_options!
|
58
|
+
@options = Options.new
|
59
|
+
|
60
|
+
@options.skip_uncovered = false
|
61
|
+
@options.mute = false
|
62
|
+
@options.bash_path = "/bin/bash"
|
63
|
+
@options.root_directory = Dir.getwd
|
46
64
|
end
|
47
65
|
|
48
66
|
private
|
49
67
|
|
50
|
-
|
51
|
-
|
68
|
+
# Passes off +respond_to?+ to {options} for missing methods
|
69
|
+
def respond_to_missing?(*args)
|
70
|
+
options.respond_to?(*args)
|
71
|
+
end
|
72
|
+
|
73
|
+
# Dispatches missing methods to {options}
|
74
|
+
def method_missing(method_name, *args, &block)
|
75
|
+
options.public_send(method_name, *args, &block)
|
76
|
+
end
|
77
|
+
|
78
|
+
def help
|
79
|
+
<<-HELP.gsub(/^ +/, "").gsub("\t", " " * 4)
|
52
80
|
Usage: #{program_name} [options] [--] <command> [options]
|
53
81
|
Examples:
|
54
82
|
\t#{program_name} ./script.sh
|
@@ -60,17 +88,25 @@ module Bashcov
|
|
60
88
|
|
61
89
|
def option_parser
|
62
90
|
OptionParser.new do |opts|
|
63
|
-
opts.program_name =
|
91
|
+
opts.program_name = program_name
|
64
92
|
opts.version = Bashcov::VERSION
|
65
|
-
opts.banner = help
|
93
|
+
opts.banner = help
|
66
94
|
|
67
95
|
opts.separator "\nSpecific options:"
|
68
96
|
|
69
97
|
opts.on("-s", "--skip-uncovered", "Do not report uncovered files") do |s|
|
70
|
-
|
98
|
+
options.skip_uncovered = s
|
71
99
|
end
|
72
100
|
opts.on("-m", "--mute", "Do not print script output") do |m|
|
73
|
-
|
101
|
+
options.mute = m
|
102
|
+
end
|
103
|
+
opts.on("--bash-path PATH", "Path to Bash executable") do |p|
|
104
|
+
raise Errno::ENOENT, p unless File.file? p
|
105
|
+
options.bash_path = p
|
106
|
+
end
|
107
|
+
opts.on("--root PATH", "Project root directory") do |d|
|
108
|
+
raise Errno::ENOENT, d unless File.directory? d
|
109
|
+
options.root_directory = d
|
74
110
|
end
|
75
111
|
|
76
112
|
opts.separator "\nCommon options:"
|
@@ -86,6 +122,3 @@ module Bashcov
|
|
86
122
|
end
|
87
123
|
end
|
88
124
|
end
|
89
|
-
|
90
|
-
# Make sure default options are set
|
91
|
-
Bashcov.set_default_options!
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bashcov
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Cédric Félizard
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-02-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: simplecov
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.
|
19
|
+
version: '0.11'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.
|
26
|
+
version: '0.11'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -144,10 +144,6 @@ executables:
|
|
144
144
|
extensions: []
|
145
145
|
extra_rdoc_files: []
|
146
146
|
files:
|
147
|
-
- ".gitignore"
|
148
|
-
- ".rspec"
|
149
|
-
- ".rubocop.yml"
|
150
|
-
- ".travis.yml"
|
151
147
|
- CHANGELOG.md
|
152
148
|
- CONTRIBUTING.md
|
153
149
|
- Gemfile
|
@@ -158,35 +154,14 @@ files:
|
|
158
154
|
- bashcov.gemspec
|
159
155
|
- bin/bashcov
|
160
156
|
- lib/bashcov.rb
|
157
|
+
- lib/bashcov/bash_info.rb
|
158
|
+
- lib/bashcov/errors.rb
|
159
|
+
- lib/bashcov/field_stream.rb
|
161
160
|
- lib/bashcov/lexer.rb
|
162
161
|
- lib/bashcov/line.rb
|
163
162
|
- lib/bashcov/runner.rb
|
164
163
|
- lib/bashcov/version.rb
|
165
164
|
- lib/bashcov/xtrace.rb
|
166
|
-
- spec/bashcov/lexer_spec.rb
|
167
|
-
- spec/bashcov/runner_spec.rb
|
168
|
-
- spec/bashcov_spec.rb
|
169
|
-
- spec/spec_helper.rb
|
170
|
-
- spec/support/common.rb
|
171
|
-
- spec/support/test_app.rb
|
172
|
-
- spec/test_app/.simplecov
|
173
|
-
- spec/test_app/README.md
|
174
|
-
- spec/test_app/never_called.sh
|
175
|
-
- spec/test_app/scripts/README.md
|
176
|
-
- spec/test_app/scripts/case.sh
|
177
|
-
- spec/test_app/scripts/delete.sh
|
178
|
-
- spec/test_app/scripts/executable
|
179
|
-
- spec/test_app/scripts/exit_non_zero.sh
|
180
|
-
- spec/test_app/scripts/function.sh
|
181
|
-
- spec/test_app/scripts/long_line.sh
|
182
|
-
- spec/test_app/scripts/multiline.sh
|
183
|
-
- spec/test_app/scripts/nested/simple.sh
|
184
|
-
- spec/test_app/scripts/one_liner.sh
|
185
|
-
- spec/test_app/scripts/simple.sh
|
186
|
-
- spec/test_app/scripts/source.sh
|
187
|
-
- spec/test_app/scripts/sourced.txt
|
188
|
-
- spec/test_app/scripts/unicode.sh
|
189
|
-
- spec/test_app/test_suite.sh
|
190
165
|
homepage: https://github.com/infertux/bashcov
|
191
166
|
licenses:
|
192
167
|
- MIT
|
@@ -207,33 +182,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
207
182
|
version: '0'
|
208
183
|
requirements: []
|
209
184
|
rubyforge_project:
|
210
|
-
rubygems_version: 2.
|
185
|
+
rubygems_version: 2.5.1
|
211
186
|
signing_key:
|
212
187
|
specification_version: 4
|
213
188
|
summary: Code coverage tool for Bash
|
214
|
-
test_files:
|
215
|
-
- spec/bashcov/lexer_spec.rb
|
216
|
-
- spec/bashcov/runner_spec.rb
|
217
|
-
- spec/bashcov_spec.rb
|
218
|
-
- spec/spec_helper.rb
|
219
|
-
- spec/support/common.rb
|
220
|
-
- spec/support/test_app.rb
|
221
|
-
- spec/test_app/.simplecov
|
222
|
-
- spec/test_app/README.md
|
223
|
-
- spec/test_app/never_called.sh
|
224
|
-
- spec/test_app/scripts/README.md
|
225
|
-
- spec/test_app/scripts/case.sh
|
226
|
-
- spec/test_app/scripts/delete.sh
|
227
|
-
- spec/test_app/scripts/executable
|
228
|
-
- spec/test_app/scripts/exit_non_zero.sh
|
229
|
-
- spec/test_app/scripts/function.sh
|
230
|
-
- spec/test_app/scripts/long_line.sh
|
231
|
-
- spec/test_app/scripts/multiline.sh
|
232
|
-
- spec/test_app/scripts/nested/simple.sh
|
233
|
-
- spec/test_app/scripts/one_liner.sh
|
234
|
-
- spec/test_app/scripts/simple.sh
|
235
|
-
- spec/test_app/scripts/source.sh
|
236
|
-
- spec/test_app/scripts/sourced.txt
|
237
|
-
- spec/test_app/scripts/unicode.sh
|
238
|
-
- spec/test_app/test_suite.sh
|
189
|
+
test_files: []
|
239
190
|
has_rdoc:
|
data/.gitignore
DELETED
data/.rspec
DELETED
data/.rubocop.yml
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
Metrics/AbcSize:
|
2
|
-
Enabled: false
|
3
|
-
|
4
|
-
Metrics/MethodLength:
|
5
|
-
Enabled: false
|
6
|
-
|
7
|
-
Metrics/LineLength:
|
8
|
-
Max: 120
|
9
|
-
Exclude: [spec/**/*]
|
10
|
-
|
11
|
-
Style/AccessModifierIndentation:
|
12
|
-
EnforcedStyle: outdent
|
13
|
-
|
14
|
-
Style/AndOr:
|
15
|
-
EnforcedStyle: conditionals
|
16
|
-
|
17
|
-
Style/SignalException:
|
18
|
-
EnforcedStyle: only_raise
|
19
|
-
|
20
|
-
Style/SpecialGlobalVars:
|
21
|
-
Enabled: false
|
22
|
-
|
23
|
-
Style/StringLiterals:
|
24
|
-
EnforcedStyle: double_quotes
|
25
|
-
|
26
|
-
Style/TrailingComma:
|
27
|
-
Enabled: false
|
data/.travis.yml
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
language: ruby
|
2
|
-
after_script:
|
3
|
-
- cane
|
4
|
-
- yard stats --list-undoc
|
5
|
-
rvm:
|
6
|
-
- 1.9.3
|
7
|
-
- 2.0.0
|
8
|
-
- 2.1
|
9
|
-
- 2.2
|
10
|
-
- ruby-head
|
11
|
-
- rbx
|
12
|
-
- rbx-head
|
13
|
-
matrix:
|
14
|
-
allow_failures:
|
15
|
-
- rvm: ruby-head
|
16
|
-
- rvm: rbx
|
17
|
-
- rvm: rbx-head
|
18
|
-
notifications:
|
19
|
-
email:
|
20
|
-
on_success: always
|
21
|
-
on_failure: always
|
data/spec/bashcov/lexer_spec.rb
DELETED
data/spec/bashcov/runner_spec.rb
DELETED
@@ -1,98 +0,0 @@
|
|
1
|
-
require "spec_helper"
|
2
|
-
require "benchmark"
|
3
|
-
|
4
|
-
describe Bashcov::Runner do
|
5
|
-
let(:runner) { Bashcov::Runner.new "bash #{test_suite}" }
|
6
|
-
|
7
|
-
before :all do
|
8
|
-
Dir.chdir File.dirname(test_suite)
|
9
|
-
end
|
10
|
-
|
11
|
-
describe "#run" do
|
12
|
-
it "finds commands in $PATH" do
|
13
|
-
expect(Bashcov::Runner.new("ls -l").run).to be_success
|
14
|
-
end
|
15
|
-
|
16
|
-
it "is fast", speed: :slow do
|
17
|
-
ratio = 0
|
18
|
-
|
19
|
-
3.times do |iteration|
|
20
|
-
t0 = Benchmark.realtime do
|
21
|
-
pid = Process.spawn test_suite, out: "/dev/null", err: "/dev/null"
|
22
|
-
Process.wait pid
|
23
|
-
end
|
24
|
-
expect($?).to be_success
|
25
|
-
|
26
|
-
run = nil
|
27
|
-
t1 = Benchmark.realtime { run = Bashcov::Runner.new(test_suite).run }
|
28
|
-
expect(run).to be_success
|
29
|
-
|
30
|
-
ratio = (ratio * iteration + t1 / t0) / (iteration + 1)
|
31
|
-
end
|
32
|
-
|
33
|
-
puts "#{ratio} times longer with Bashcov"
|
34
|
-
# XXX no proper assertion - just outputs the ratio
|
35
|
-
end
|
36
|
-
|
37
|
-
context "without a SHELLOPTS variable" do
|
38
|
-
before do
|
39
|
-
ENV["SHELLOPTS"] = nil
|
40
|
-
end
|
41
|
-
|
42
|
-
it "adds the flags" do
|
43
|
-
runner.run
|
44
|
-
expect(ENV["SHELLOPTS"]).to eq("xtrace")
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
context "with an existing SHELLOPTS variable" do
|
49
|
-
before do
|
50
|
-
ENV["SHELLOPTS"] = "posix"
|
51
|
-
end
|
52
|
-
|
53
|
-
it "merges the flags" do
|
54
|
-
runner.run
|
55
|
-
expect(ENV["SHELLOPTS"]).to eq("posix:xtrace")
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
describe "#result" do
|
61
|
-
it "returns the expected coverage hash" do
|
62
|
-
runner.run
|
63
|
-
expect(runner.result).to eq expected_coverage
|
64
|
-
end
|
65
|
-
|
66
|
-
it "returns the correct coverage hash" do
|
67
|
-
runner.run
|
68
|
-
|
69
|
-
pending # TODO: need a context-aware lexer to parse multiline instructions
|
70
|
-
expect(runner.result).to eq correct_coverage
|
71
|
-
end
|
72
|
-
|
73
|
-
context "with options.skip_uncovered = true" do
|
74
|
-
before do
|
75
|
-
Bashcov.options.skip_uncovered = true
|
76
|
-
end
|
77
|
-
|
78
|
-
it "does not include uncovered files" do
|
79
|
-
runner.run
|
80
|
-
expect(runner.result.keys & uncovered_files).to be_empty
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
context "with options.mute = true" do
|
85
|
-
before do
|
86
|
-
Bashcov.options.mute = true
|
87
|
-
end
|
88
|
-
|
89
|
-
it "does not print the command output" do
|
90
|
-
[$stdout, $stderr].each do |io|
|
91
|
-
expect(io).not_to receive :write
|
92
|
-
end
|
93
|
-
|
94
|
-
runner.run
|
95
|
-
end
|
96
|
-
end
|
97
|
-
end
|
98
|
-
end
|