mutest 0.0.6 → 0.0.7
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/.buildkite/hooks/pre-command +1 -1
- data/.buildkite/pipeline.yml +9 -22
- data/.gitmodules +3 -0
- data/CHANGELOG.md +14 -1
- data/Gemfile +11 -6
- data/Gemfile.lock +27 -101
- data/README.md +42 -2
- data/Rakefile +2 -8
- data/circle.yml +4 -1
- data/lib/mutest.rb +1 -1
- data/lib/mutest/ast/meta/send.rb +6 -0
- data/lib/mutest/ast/named_children.rb +1 -1
- data/lib/mutest/ast/nodes.rb +0 -2
- data/lib/mutest/ast/regexp.rb +4 -4
- data/lib/mutest/ast/regexp/transformer.rb +4 -4
- data/lib/mutest/ast/regexp/transformer/character_set.rb +1 -1
- data/lib/mutest/ast/regexp/transformer/direct.rb +1 -1
- data/lib/mutest/ast/regexp/transformer/quantifier.rb +3 -3
- data/lib/mutest/ast/regexp/transformer/recursive.rb +1 -1
- data/lib/mutest/ast/regexp/transformer/text.rb +1 -1
- data/lib/mutest/ast/types.rb +0 -1
- data/lib/mutest/cli.rb +1 -1
- data/lib/mutest/context.rb +1 -1
- data/lib/mutest/matcher/config.rb +0 -2
- data/lib/mutest/matcher/method.rb +1 -3
- data/lib/mutest/matcher/method/instance.rb +1 -1
- data/lib/mutest/matcher/methods.rb +1 -1
- data/lib/mutest/mutator.rb +0 -2
- data/lib/mutest/mutator/node/block_pass.rb +29 -0
- data/lib/mutest/mutator/node/generic.rb +1 -0
- data/lib/mutest/mutator/node/literal/boolean.rb +0 -1
- data/lib/mutest/mutator/node/literal/range.rb +1 -1
- data/lib/mutest/mutator/node/literal/regex.rb +1 -1
- data/lib/mutest/mutator/node/literal/string.rb +3 -0
- data/lib/mutest/mutator/node/literal/symbol.rb +0 -2
- data/lib/mutest/mutator/node/send.rb +35 -6
- data/lib/mutest/mutator/node/splat.rb +3 -1
- data/lib/mutest/parallel/worker.rb +1 -1
- data/lib/mutest/reporter/cli.rb +0 -2
- data/lib/mutest/reporter/cli/format.rb +1 -1
- data/lib/mutest/reporter/cli/printer.rb +2 -2
- data/lib/mutest/reporter/cli/printer/mutation_result.rb +0 -2
- data/lib/mutest/version.rb +1 -1
- data/meta/and.rb +0 -2
- data/meta/array.rb +0 -3
- data/meta/begin.rb +0 -3
- data/meta/block.rb +0 -1
- data/meta/block_pass.rb +30 -1
- data/meta/break.rb +0 -1
- data/meta/case.rb +0 -6
- data/meta/casgn.rb +0 -3
- data/meta/cvasgn.rb +0 -1
- data/meta/def.rb +0 -7
- data/meta/dstr.rb +2 -0
- data/meta/dsym.rb +2 -0
- data/meta/ensure.rb +0 -1
- data/meta/false.rb +0 -1
- data/meta/gvasgn.rb +0 -1
- data/meta/hash.rb +0 -4
- data/meta/if.rb +0 -5
- data/meta/ivasgn.rb +0 -1
- data/meta/kwbegin.rb +0 -1
- data/meta/lvasgn.rb +0 -1
- data/meta/match_current_line.rb +0 -1
- data/meta/next.rb +0 -1
- data/meta/or.rb +0 -2
- data/meta/regexp.rb +0 -1
- data/meta/rescue.rb +0 -6
- data/meta/send.rb +60 -16
- data/meta/splat.rb +25 -0
- data/meta/str.rb +1 -0
- data/meta/true.rb +0 -1
- data/meta/until.rb +0 -1
- data/meta/while.rb +0 -2
- data/meta/yield.rb +0 -1
- data/mutest-rspec.gemspec +1 -1
- data/mutest.gemspec +0 -4
- data/spec/integration/mutest/rspec_spec.rb +1 -1
- data/spec/integrations.yml +1 -1
- data/spec/shared/command_method_behavior.rb +5 -0
- data/spec/shared/idempotent_method_behavior.rb +10 -0
- data/spec/spec_helper.rb +21 -1
- data/spec/support/xspec.rb +1 -1
- data/spec/unit/mutest/actor/sender_spec.rb +1 -1
- data/spec/unit/mutest/ast/meta/send_spec.rb +23 -11
- data/spec/unit/mutest/cli_spec.rb +13 -13
- data/spec/unit/mutest/context_spec.rb +2 -2
- data/spec/unit/mutest/diff_spec.rb +9 -9
- data/spec/unit/mutest/integration/null_spec.rb +1 -1
- data/spec/unit/mutest/integration_spec.rb +1 -1
- data/spec/unit/mutest/matcher/method/instance_spec.rb +5 -5
- data/spec/unit/mutest/matcher/method/singleton_spec.rb +5 -5
- data/spec/unit/mutest/meta/example_spec.rb +3 -3
- data/spec/unit/mutest/mutation_spec.rb +5 -5
- data/spec/unit/mutest/mutator/node_spec.rb +6 -9
- data/spec/unit/mutest/parallel/driver_spec.rb +1 -1
- data/spec/unit/mutest/reporter/null_spec.rb +1 -1
- data/spec/unit/mutest/reporter/sequence_spec.rb +1 -1
- data/spec/unit/mutest/result_spec.rb +1 -1
- data/spec/unit/mutest/runner/sink_spec.rb +1 -1
- data/spec/unit/mutest/subject/method/instance/memoized_spec.rb +1 -1
- data/spec/unit/mutest/subject/method/instance_spec.rb +3 -3
- data/spec/unit/mutest/subject/method/singleton_spec.rb +3 -3
- data/spec/unit/mutest/subject_spec.rb +2 -2
- data/test_app/Gemfile.rspec3.6 +7 -0
- metadata +9 -57
- data/build/Dockerfile +0 -71
- data/build/docker-bootstrap.sh +0 -85
- data/build/docker-exec +0 -29
- data/build/make-docker +0 -3
- data/build/ruby_matrix +0 -1
- data/build/run +0 -5
- data/build/strict-mode.sh +0 -16
- data/config/devtools.yml +0 -2
- data/config/flay.yml +0 -3
- data/config/flog.yml +0 -2
- data/config/reek.yml +0 -137
- data/lib/mutest/mutator/node/noop.rb +0 -19
data/build/Dockerfile
DELETED
@@ -1,71 +0,0 @@
|
|
1
|
-
FROM alpine:3.4
|
2
|
-
MAINTAINER John Backus <johncbackus@gmail.com>
|
3
|
-
|
4
|
-
VOLUME /app
|
5
|
-
|
6
|
-
# URLs for ruby-install and chruby which help install and manage our ruby matrix
|
7
|
-
ARG RUBY_INSTALL_URL=https://github.com/postmodern/ruby-install/archive/v0.6.0.tar.gz
|
8
|
-
ARG CHRUBY_URL=https://github.com/postmodern/chruby/archive/v0.3.9.tar.gz
|
9
|
-
|
10
|
-
# Directory that the ruby managers will be downloaded to
|
11
|
-
ARG RUBY_MANAGERS_DIR=/tmp/ruby_mangers
|
12
|
-
|
13
|
-
# Compiler environment variables that don't need to carry over to the final image
|
14
|
-
ARG CC=/usr/bin/clang
|
15
|
-
ARG CXX=/usr/bin/clang++
|
16
|
-
|
17
|
-
# Use dkubb's bash strict mode to protect us from bash's many ugliness
|
18
|
-
COPY build/strict-mode.sh /usr/local/sbin/strict-mode.sh
|
19
|
-
|
20
|
-
# Copy over a list of ruby versions to install
|
21
|
-
COPY build/ruby_matrix /tmp
|
22
|
-
|
23
|
-
# Enable strict mode by default
|
24
|
-
ENV BASH_ENV=/usr/local/sbin/strict-mode.sh
|
25
|
-
|
26
|
-
# Write all bundle config to /bundle instead of /app/.bundle
|
27
|
-
ENV BUNDLE_APP_CONFIG /bundle
|
28
|
-
|
29
|
-
RUN apk add --update-cache \
|
30
|
-
bash=4.3.42-r5 \
|
31
|
-
# provides tools like make
|
32
|
-
build-base=0.4-r1 \
|
33
|
-
# install clang to reduce the final binary size for our rubies
|
34
|
-
clang=3.8.0-r0 \
|
35
|
-
# install git so that the bundle can depend on git sources
|
36
|
-
git=2.8.3-r0 \
|
37
|
-
# required for gems that use ffi
|
38
|
-
libffi-dev=3.2.1-r2 \
|
39
|
-
# ruby needs access to things like linux/random.h
|
40
|
-
linux-headers=4.4.6-r1 \
|
41
|
-
# required to compile ruby
|
42
|
-
openssl-dev=1.0.2k-r0 \
|
43
|
-
# required for ruby-versions to download ruby binaries
|
44
|
-
openssl=1.0.2k-r0 \
|
45
|
-
# install ncurses for tput
|
46
|
-
ncurses=6.0-r7 \
|
47
|
-
# install ruby-dev for libruby.so for the FFI bug tests
|
48
|
-
ruby-dev=2.3.1-r0 \
|
49
|
-
# Create ruby managers directory for downloads
|
50
|
-
&& mkdir "$RUBY_MANAGERS_DIR"
|
51
|
-
|
52
|
-
# Download ruby-install
|
53
|
-
ADD $RUBY_INSTALL_URL "$RUBY_MANAGERS_DIR"
|
54
|
-
|
55
|
-
# Download chruby
|
56
|
-
ADD $CHRUBY_URL "$RUBY_MANAGERS_DIR"
|
57
|
-
|
58
|
-
RUN mkdir -p /src/app
|
59
|
-
|
60
|
-
WORKDIR /src/app
|
61
|
-
|
62
|
-
COPY build/docker-exec build/docker-exec
|
63
|
-
|
64
|
-
# Copy the bootstrap script used to setup the final image
|
65
|
-
COPY build/docker-bootstrap.sh /usr/local/sbin
|
66
|
-
|
67
|
-
RUN docker-bootstrap.sh
|
68
|
-
|
69
|
-
USER ci
|
70
|
-
|
71
|
-
ENTRYPOINT ["build/docker-exec"]
|
data/build/docker-bootstrap.sh
DELETED
@@ -1,85 +0,0 @@
|
|
1
|
-
#!/bin/bash
|
2
|
-
|
3
|
-
# `make` for ruby-install and chruby don't work within our strict environment
|
4
|
-
# so we have to unset the BASH_ENV variable before executing their setup.
|
5
|
-
# The `make` call creates a new shell so doing `set +o [option]` doesn't impact
|
6
|
-
# the `make install` execution
|
7
|
-
unset_strict(){
|
8
|
-
unset BASH_ENV
|
9
|
-
}
|
10
|
-
|
11
|
-
# Change directories to either chruby's or ruby-install's source directory
|
12
|
-
# and `make install`
|
13
|
-
install_manager(){
|
14
|
-
local manager_dir="$1"
|
15
|
-
|
16
|
-
(
|
17
|
-
unset_strict;
|
18
|
-
cd "$manager_dir" || exit 1;
|
19
|
-
make install
|
20
|
-
)
|
21
|
-
}
|
22
|
-
|
23
|
-
# Install bundler for a given ruby version
|
24
|
-
install_bundler_for_ruby_version(){
|
25
|
-
local ruby_version="$1"
|
26
|
-
|
27
|
-
# chruby unsets variables and uses file globbing
|
28
|
-
# execute in a subshell so that environment changes for chruby don't have
|
29
|
-
# global effect
|
30
|
-
(
|
31
|
-
# Only unset the rules that are required to not break chruby
|
32
|
-
set +o nounset;
|
33
|
-
set +o noglob;
|
34
|
-
source /usr/local/share/chruby/chruby.sh
|
35
|
-
chruby "$ruby_version"
|
36
|
-
gem install bundler
|
37
|
-
)
|
38
|
-
}
|
39
|
-
|
40
|
-
# Use ruby-install to install a ruby version
|
41
|
-
install_ruby_version(){
|
42
|
-
local ruby_version="$1"
|
43
|
-
|
44
|
-
# Execute inside of a subshell so that environment changes for ruby-install
|
45
|
-
# don't have a global impact
|
46
|
-
(
|
47
|
-
unset_strict;
|
48
|
-
# Skipping doc installation saves space and time during `docker build`
|
49
|
-
ruby-install --jobs=8 ruby "$ruby_version" -- --disable-install-doc --disable-install-rdoc --disable-install-capi;
|
50
|
-
)
|
51
|
-
|
52
|
-
# Install bundler for the newly installed ruby version
|
53
|
-
install_bundler_for_ruby_version "$ruby_version"
|
54
|
-
}
|
55
|
-
|
56
|
-
# Untar all downloaded ruby managers
|
57
|
-
find "$RUBY_MANAGERS_DIR" -name "*.tar.gz" -exec tar -xzvf {} -C "$RUBY_MANAGERS_DIR" \;
|
58
|
-
|
59
|
-
# Load the ruby manager directories into the array `ruby_managers`
|
60
|
-
mapfile -t ruby_managers < <(find "$RUBY_MANAGERS_DIR" -type d -maxdepth 1 -mindepth 1)
|
61
|
-
|
62
|
-
# Load the ruby versions we want to install into the array `ruby_versions`
|
63
|
-
mapfile -t ruby_versions < /tmp/ruby_matrix
|
64
|
-
|
65
|
-
# Call `make install` for all ruby manager directories downloaded
|
66
|
-
for directory in "${ruby_managers[@]}"; do
|
67
|
-
install_manager "$directory"
|
68
|
-
done
|
69
|
-
|
70
|
-
# Remove ruby manager install files now that we are done with them
|
71
|
-
rm -rf /tmp/ruby_managers
|
72
|
-
|
73
|
-
# Install all ruby versions specified in our ruby matrix file
|
74
|
-
for ruby_version in "${ruby_versions[@]}"; do
|
75
|
-
install_ruby_version "$ruby_version"
|
76
|
-
done
|
77
|
-
|
78
|
-
# Create a new unprivileged user named "ci"
|
79
|
-
adduser -DS -s /bin/bash ci
|
80
|
-
|
81
|
-
# Create our separate bundle config directory which ci is allowed to write to
|
82
|
-
mkdir "$BUNDLE_APP_CONFIG" && chown ci: "$BUNDLE_APP_CONFIG"
|
83
|
-
|
84
|
-
# Create a source directory which files are copied to so writes don't impact the host
|
85
|
-
chown ci: --recursive /src
|
data/build/docker-exec
DELETED
@@ -1,29 +0,0 @@
|
|
1
|
-
#!/bin/bash
|
2
|
-
|
3
|
-
if [[ $# -ne 2 ]] ; then
|
4
|
-
echo 'build/docker-exec - run a command on a specified ruby version'
|
5
|
-
echo 'Usage:'
|
6
|
-
echo ' build/docker-exec 2.2.5 rake spec'
|
7
|
-
exit 1
|
8
|
-
fi
|
9
|
-
|
10
|
-
ruby_version="$1"
|
11
|
-
bundled_command="$2"
|
12
|
-
|
13
|
-
cp -r /app ..
|
14
|
-
|
15
|
-
# Disable strict settings that break chruby
|
16
|
-
set +o nounset
|
17
|
-
set +o noglob
|
18
|
-
|
19
|
-
source /usr/local/share/chruby/chruby.sh
|
20
|
-
|
21
|
-
chruby "$ruby_version"
|
22
|
-
|
23
|
-
# Reenable strict settings
|
24
|
-
set -o nounset
|
25
|
-
set -o noglob
|
26
|
-
|
27
|
-
bundle --path /bundle
|
28
|
-
|
29
|
-
bundle exec "$bundled_command"
|
data/build/make-docker
DELETED
data/build/ruby_matrix
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
2.3.1
|
data/build/run
DELETED
data/build/strict-mode.sh
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
#!/bin/bash
|
2
|
-
|
3
|
-
# Taken from dkubb/dockerfiles: https://git.io/viGZZ
|
4
|
-
#
|
5
|
-
# Reference:
|
6
|
-
# http://www.davidpashley.com/articles/writing-robust-shell-scripts/
|
7
|
-
# http://kvz.io/blog/2013/11/21/bash-best-practices/
|
8
|
-
# http://redsymbol.net/articles/unofficial-bash-strict-mode/
|
9
|
-
|
10
|
-
set -o errexit # Exit when an expression fails
|
11
|
-
set -o pipefail # Exit when a command in a pipeline fails
|
12
|
-
set -o nounset # Exit when an undefined variable is used
|
13
|
-
set -o noglob # Disable shell globbing
|
14
|
-
set -o noclobber # Disable automatic file overwriting
|
15
|
-
|
16
|
-
IFS=$'\n\t' # Set default field separator to not split on spaces
|
data/config/devtools.yml
DELETED
data/config/flay.yml
DELETED
data/config/flog.yml
DELETED
data/config/reek.yml
DELETED
@@ -1,137 +0,0 @@
|
|
1
|
-
---
|
2
|
-
Attribute:
|
3
|
-
enabled: false
|
4
|
-
exclude: []
|
5
|
-
BooleanParameter:
|
6
|
-
enabled: true
|
7
|
-
exclude: []
|
8
|
-
ClassVariable:
|
9
|
-
enabled: true
|
10
|
-
exclude: []
|
11
|
-
ControlParameter:
|
12
|
-
enabled: true
|
13
|
-
exclude:
|
14
|
-
- Mutest::Expression#match_length
|
15
|
-
DataClump:
|
16
|
-
enabled: true
|
17
|
-
exclude: []
|
18
|
-
max_copies: 2
|
19
|
-
min_clump_size: 2
|
20
|
-
DuplicateMethodCall:
|
21
|
-
enabled: false
|
22
|
-
exclude: []
|
23
|
-
max_calls: 1
|
24
|
-
allow_calls: []
|
25
|
-
FeatureEnvy:
|
26
|
-
enabled: false
|
27
|
-
# Buggy smell detector
|
28
|
-
IrresponsibleModule:
|
29
|
-
enabled: false
|
30
|
-
exclude: []
|
31
|
-
LongParameterList:
|
32
|
-
enabled: true
|
33
|
-
exclude:
|
34
|
-
- Mutest::Matcher::Method::Instance#self.build
|
35
|
-
- Mutest::Meta::Example::DSL # 3 vars
|
36
|
-
max_params: 2
|
37
|
-
LongYieldList:
|
38
|
-
enabled: true
|
39
|
-
exclude: []
|
40
|
-
max_params: 2
|
41
|
-
NestedIterators:
|
42
|
-
enabled: true
|
43
|
-
exclude:
|
44
|
-
- Mutest#self.singleton_subclass_instance
|
45
|
-
- Mutest::CLI#parse
|
46
|
-
- Mutest::Mutator::Node::Arguments#emit_argument_mutations
|
47
|
-
- Mutest::Mutator::Node::Resbody#mutate_captures
|
48
|
-
- Mutest::Mutator::Util::Array::Element#dispatch
|
49
|
-
- Mutest::Parallel::Master#run
|
50
|
-
- Mutest::RequireHighjack#self.call
|
51
|
-
- Mutest::Selector::Expression#call
|
52
|
-
- Parser::Lexer#self.new
|
53
|
-
max_allowed_nesting: 1
|
54
|
-
ignore_iterators: []
|
55
|
-
NilCheck:
|
56
|
-
enabled: false
|
57
|
-
RepeatedConditional:
|
58
|
-
enabled: true
|
59
|
-
exclude:
|
60
|
-
- Mutest::Mutator
|
61
|
-
- Mutest::Meta::Example::DSL
|
62
|
-
max_ifs: 1
|
63
|
-
TooManyInstanceVariables:
|
64
|
-
enabled: true
|
65
|
-
exclude:
|
66
|
-
- Mutest::Mutator # 4 vars
|
67
|
-
- Mutest::Parallel::Master # 4 vars
|
68
|
-
- Mutest::Meta::Example::DSL # 4 vars
|
69
|
-
max_instance_variables: 3
|
70
|
-
TooManyMethods:
|
71
|
-
enabled: true
|
72
|
-
exclude:
|
73
|
-
- Mutest::CLI
|
74
|
-
- Mutest::Mutator::Node
|
75
|
-
- Mutest::Parallel::Master
|
76
|
-
max_methods: 10
|
77
|
-
TooManyStatements:
|
78
|
-
enabled: true
|
79
|
-
exclude:
|
80
|
-
- Mutest::CLI#add_debug_options
|
81
|
-
- Mutest::CLI#add_environment_options
|
82
|
-
- Mutest::Reporter::CLI::Printer::Config#run
|
83
|
-
- Mutest::Reporter::CLI::Printer::EnvProgress#run
|
84
|
-
- Mutest::Runner#run_driver
|
85
|
-
- Mutest::Zombifier::File#self.find
|
86
|
-
max_statements: 7
|
87
|
-
UncommunicativeMethodName:
|
88
|
-
enabled: true
|
89
|
-
exclude:
|
90
|
-
- Mutest::AST::Sexp#s
|
91
|
-
- Mutest::Mutation#sha1
|
92
|
-
reject:
|
93
|
-
- !ruby/regexp /^[a-z]$/
|
94
|
-
- !ruby/regexp /[0-9]$/
|
95
|
-
- !ruby/regexp /[A-Z]/
|
96
|
-
accept: []
|
97
|
-
UncommunicativeModuleName:
|
98
|
-
enabled: true
|
99
|
-
exclude: []
|
100
|
-
reject:
|
101
|
-
- !ruby/regexp /^.$/
|
102
|
-
- !ruby/regexp /[0-9]$/
|
103
|
-
accept: []
|
104
|
-
UncommunicativeParameterName:
|
105
|
-
enabled: true
|
106
|
-
exclude: []
|
107
|
-
reject:
|
108
|
-
- !ruby/regexp /^.$/
|
109
|
-
- !ruby/regexp /[0-9]$/
|
110
|
-
- !ruby/regexp /[A-Z]/
|
111
|
-
accept: []
|
112
|
-
UncommunicativeVariableName:
|
113
|
-
enabled: true
|
114
|
-
exclude: []
|
115
|
-
reject:
|
116
|
-
- !ruby/regexp /^.$/
|
117
|
-
- !ruby/regexp /[0-9]$/
|
118
|
-
- !ruby/regexp /[A-Z]/
|
119
|
-
accept: ['force_utf32']
|
120
|
-
UnusedParameters:
|
121
|
-
enabled: true
|
122
|
-
exclude: []
|
123
|
-
UtilityFunction:
|
124
|
-
enabled: true
|
125
|
-
exclude:
|
126
|
-
- Mutest::AST::Sexp#s
|
127
|
-
- Mutest::Actor::Env#new_mailbox
|
128
|
-
- Mutest::CLI#reporter
|
129
|
-
- Mutest::Integration::Null#call
|
130
|
-
- Mutest::Integration::Rspec#parse_example
|
131
|
-
- Mutest::Integration::Rspec#parse_expression # intentional, private
|
132
|
-
- Mutest::Meta::Example::Verification#format_mutations # intentional, private
|
133
|
-
- Mutest::Reporter::CLI::Format::Progressive#new_buffer
|
134
|
-
- Mutest::Reporter::CLI::Printer::StatusProgressive#object # False positive calls super
|
135
|
-
- Mutest::Repository::Diff#tracks? # intentional, private
|
136
|
-
- Mutest::Repository::Diff#within_working_directory? # intentional, private
|
137
|
-
max_helper_calls: 0
|
@@ -1,19 +0,0 @@
|
|
1
|
-
module Mutest
|
2
|
-
class Mutator
|
3
|
-
class Node
|
4
|
-
# Mutation emitter to handle noop nodes
|
5
|
-
class Noop < self
|
6
|
-
handle(:block_pass, :cbase)
|
7
|
-
|
8
|
-
private
|
9
|
-
|
10
|
-
# Emit mutations
|
11
|
-
#
|
12
|
-
# @return [undefined]
|
13
|
-
def dispatch
|
14
|
-
# noop
|
15
|
-
end
|
16
|
-
end # Noop
|
17
|
-
end # Node
|
18
|
-
end # Mutator
|
19
|
-
end # Mutest
|