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.
Files changed (119) hide show
  1. checksums.yaml +4 -4
  2. data/.buildkite/hooks/pre-command +1 -1
  3. data/.buildkite/pipeline.yml +9 -22
  4. data/.gitmodules +3 -0
  5. data/CHANGELOG.md +14 -1
  6. data/Gemfile +11 -6
  7. data/Gemfile.lock +27 -101
  8. data/README.md +42 -2
  9. data/Rakefile +2 -8
  10. data/circle.yml +4 -1
  11. data/lib/mutest.rb +1 -1
  12. data/lib/mutest/ast/meta/send.rb +6 -0
  13. data/lib/mutest/ast/named_children.rb +1 -1
  14. data/lib/mutest/ast/nodes.rb +0 -2
  15. data/lib/mutest/ast/regexp.rb +4 -4
  16. data/lib/mutest/ast/regexp/transformer.rb +4 -4
  17. data/lib/mutest/ast/regexp/transformer/character_set.rb +1 -1
  18. data/lib/mutest/ast/regexp/transformer/direct.rb +1 -1
  19. data/lib/mutest/ast/regexp/transformer/quantifier.rb +3 -3
  20. data/lib/mutest/ast/regexp/transformer/recursive.rb +1 -1
  21. data/lib/mutest/ast/regexp/transformer/text.rb +1 -1
  22. data/lib/mutest/ast/types.rb +0 -1
  23. data/lib/mutest/cli.rb +1 -1
  24. data/lib/mutest/context.rb +1 -1
  25. data/lib/mutest/matcher/config.rb +0 -2
  26. data/lib/mutest/matcher/method.rb +1 -3
  27. data/lib/mutest/matcher/method/instance.rb +1 -1
  28. data/lib/mutest/matcher/methods.rb +1 -1
  29. data/lib/mutest/mutator.rb +0 -2
  30. data/lib/mutest/mutator/node/block_pass.rb +29 -0
  31. data/lib/mutest/mutator/node/generic.rb +1 -0
  32. data/lib/mutest/mutator/node/literal/boolean.rb +0 -1
  33. data/lib/mutest/mutator/node/literal/range.rb +1 -1
  34. data/lib/mutest/mutator/node/literal/regex.rb +1 -1
  35. data/lib/mutest/mutator/node/literal/string.rb +3 -0
  36. data/lib/mutest/mutator/node/literal/symbol.rb +0 -2
  37. data/lib/mutest/mutator/node/send.rb +35 -6
  38. data/lib/mutest/mutator/node/splat.rb +3 -1
  39. data/lib/mutest/parallel/worker.rb +1 -1
  40. data/lib/mutest/reporter/cli.rb +0 -2
  41. data/lib/mutest/reporter/cli/format.rb +1 -1
  42. data/lib/mutest/reporter/cli/printer.rb +2 -2
  43. data/lib/mutest/reporter/cli/printer/mutation_result.rb +0 -2
  44. data/lib/mutest/version.rb +1 -1
  45. data/meta/and.rb +0 -2
  46. data/meta/array.rb +0 -3
  47. data/meta/begin.rb +0 -3
  48. data/meta/block.rb +0 -1
  49. data/meta/block_pass.rb +30 -1
  50. data/meta/break.rb +0 -1
  51. data/meta/case.rb +0 -6
  52. data/meta/casgn.rb +0 -3
  53. data/meta/cvasgn.rb +0 -1
  54. data/meta/def.rb +0 -7
  55. data/meta/dstr.rb +2 -0
  56. data/meta/dsym.rb +2 -0
  57. data/meta/ensure.rb +0 -1
  58. data/meta/false.rb +0 -1
  59. data/meta/gvasgn.rb +0 -1
  60. data/meta/hash.rb +0 -4
  61. data/meta/if.rb +0 -5
  62. data/meta/ivasgn.rb +0 -1
  63. data/meta/kwbegin.rb +0 -1
  64. data/meta/lvasgn.rb +0 -1
  65. data/meta/match_current_line.rb +0 -1
  66. data/meta/next.rb +0 -1
  67. data/meta/or.rb +0 -2
  68. data/meta/regexp.rb +0 -1
  69. data/meta/rescue.rb +0 -6
  70. data/meta/send.rb +60 -16
  71. data/meta/splat.rb +25 -0
  72. data/meta/str.rb +1 -0
  73. data/meta/true.rb +0 -1
  74. data/meta/until.rb +0 -1
  75. data/meta/while.rb +0 -2
  76. data/meta/yield.rb +0 -1
  77. data/mutest-rspec.gemspec +1 -1
  78. data/mutest.gemspec +0 -4
  79. data/spec/integration/mutest/rspec_spec.rb +1 -1
  80. data/spec/integrations.yml +1 -1
  81. data/spec/shared/command_method_behavior.rb +5 -0
  82. data/spec/shared/idempotent_method_behavior.rb +10 -0
  83. data/spec/spec_helper.rb +21 -1
  84. data/spec/support/xspec.rb +1 -1
  85. data/spec/unit/mutest/actor/sender_spec.rb +1 -1
  86. data/spec/unit/mutest/ast/meta/send_spec.rb +23 -11
  87. data/spec/unit/mutest/cli_spec.rb +13 -13
  88. data/spec/unit/mutest/context_spec.rb +2 -2
  89. data/spec/unit/mutest/diff_spec.rb +9 -9
  90. data/spec/unit/mutest/integration/null_spec.rb +1 -1
  91. data/spec/unit/mutest/integration_spec.rb +1 -1
  92. data/spec/unit/mutest/matcher/method/instance_spec.rb +5 -5
  93. data/spec/unit/mutest/matcher/method/singleton_spec.rb +5 -5
  94. data/spec/unit/mutest/meta/example_spec.rb +3 -3
  95. data/spec/unit/mutest/mutation_spec.rb +5 -5
  96. data/spec/unit/mutest/mutator/node_spec.rb +6 -9
  97. data/spec/unit/mutest/parallel/driver_spec.rb +1 -1
  98. data/spec/unit/mutest/reporter/null_spec.rb +1 -1
  99. data/spec/unit/mutest/reporter/sequence_spec.rb +1 -1
  100. data/spec/unit/mutest/result_spec.rb +1 -1
  101. data/spec/unit/mutest/runner/sink_spec.rb +1 -1
  102. data/spec/unit/mutest/subject/method/instance/memoized_spec.rb +1 -1
  103. data/spec/unit/mutest/subject/method/instance_spec.rb +3 -3
  104. data/spec/unit/mutest/subject/method/singleton_spec.rb +3 -3
  105. data/spec/unit/mutest/subject_spec.rb +2 -2
  106. data/test_app/Gemfile.rspec3.6 +7 -0
  107. metadata +9 -57
  108. data/build/Dockerfile +0 -71
  109. data/build/docker-bootstrap.sh +0 -85
  110. data/build/docker-exec +0 -29
  111. data/build/make-docker +0 -3
  112. data/build/ruby_matrix +0 -1
  113. data/build/run +0 -5
  114. data/build/strict-mode.sh +0 -16
  115. data/config/devtools.yml +0 -2
  116. data/config/flay.yml +0 -3
  117. data/config/flog.yml +0 -2
  118. data/config/reek.yml +0 -137
  119. data/lib/mutest/mutator/node/noop.rb +0 -19
@@ -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"]
@@ -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
@@ -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"
@@ -1,3 +0,0 @@
1
- #!/bin/bash
2
-
3
- docker build --tag backus/mutest . --file build/Dockerfile
@@ -1 +0,0 @@
1
- 2.3.1
data/build/run DELETED
@@ -1,5 +0,0 @@
1
- #!/bin/bash
2
-
3
- # Mount the project as a read only filesystem to /app and pass
4
- # along any arugments that were provided to this script
5
- docker run --rm --volume "$(pwd):/app:ro" backus/mutest "$@"
@@ -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
@@ -1,2 +0,0 @@
1
- ---
2
- unit_test_timeout: 10.0
@@ -1,3 +0,0 @@
1
- ---
2
- threshold: 16
3
- total_score: 1338
@@ -1,2 +0,0 @@
1
- ---
2
- threshold: 27.7
@@ -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