mutant 0.3.3 → 0.3.4

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6371f3e97aa6120ac485ee0d58ca0a2ca0c89f91
4
- data.tar.gz: ea79944a38986b4d5fa4efe087a8f71e97ff42eb
3
+ metadata.gz: 673a7c4c1760422c883da5e4808459a53738661e
4
+ data.tar.gz: 08bd96b3e089053be868b81f93f6b71f85c9d99e
5
5
  SHA512:
6
- metadata.gz: 67106c04fa6f31ec05b96804708370398d50fb919f6ddf4cd5e53c3ac978e1e2888b817218ad5f5cd8236ade4a7d81994cb8f0694f7f04058be235af232ff579
7
- data.tar.gz: 353469ce25504bf6910f6ee2fe1786d207d48c53932ed243a89b367a3718c98d0c50ff04e23bef5df09c6d29cf7e096e9595ce42d666aa1eec670befc4cd7029
6
+ metadata.gz: dbd708905cb93671b7d3f714422873ca056a46c86c902a633f9b2ee948e323448434d25cc4cf547d10bad59bc90ccd101d005f2e415f67fbed885fc48c834d05
7
+ data.tar.gz: 308364fea4146848b5bccc79ec9b5249850a21cecc23eea59ae71887170cefc0ef781825069a2110e16fcd2b78fa8e7dade18f57b38ab19695e8cd8404da4bf4
@@ -5,6 +5,9 @@ rvm:
5
5
  - 2.0.0
6
6
  - 2.1.0
7
7
  - rbx
8
+ matrix:
9
+ allow_failures:
10
+ - rvm: rbx
8
11
  notifications:
9
12
  irc:
10
13
  channels:
@@ -1,3 +1,9 @@
1
+ # v0.3.4 2014-01-11
2
+
3
+ Bugfixes:
4
+
5
+ * Correctly fix crash on attribute assignments nodes: https://github.com/mbj/mutant/issues/149
6
+
1
7
  # v0.3.3 2014-01-11
2
8
 
3
9
  Changes:
@@ -1,3 +1,3 @@
1
1
  ---
2
2
  threshold: 18
3
- total_score: 784
3
+ total_score: 782
@@ -1,7 +1,6 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  require 'stringio'
4
- require 'benchmark'
5
4
  require 'set'
6
5
  require 'adamantium'
7
6
  require 'ice_nine'
@@ -13,6 +12,7 @@ require 'digest/sha1'
13
12
  require 'inflecto'
14
13
  require 'parser'
15
14
  require 'parser/current'
15
+ require 'parser-node-list'
16
16
  require 'unparser'
17
17
  require 'ice_nine'
18
18
  require 'diff/lcs'
@@ -22,31 +22,6 @@ require 'anima'
22
22
  require 'concord'
23
23
  require 'rspec'
24
24
 
25
- # Monkeypatch on parser with a list of allowed nodes.
26
- # Will be pushed upstream once turning out to be correct.
27
- module Parser
28
- module Meta
29
- NODE_TYPES =
30
- %w(
31
- true false nil int float str dstr str
32
- sym dsym xstr regopt regexp array splat
33
- array pair kwsplat hash irange erange self
34
- lvar ivar cvar gvar const defined? lvasgn
35
- ivasgn cvasgn gvasgn casgn mlhs masgn op_asgn
36
- op_asgn and_asgn ensure rescue arg_expr
37
- or_asgn and_asgn or_asgn back_ref nth_ref
38
- match_with_lvasgn match_current_line
39
- module class sclass def defs undef alias args
40
- cbase arg optarg restarg blockarg block_pass args def kwarg kwoptarg
41
- kwrestarg send super zsuper yield block send
42
- and not or if when case while until while_post
43
- until_post for break next redo return resbody
44
- kwbegin begin retry preexe postexe iflipflop eflipflop
45
- shadowarg
46
- ).map(&:to_sym).to_set.freeze
47
- end # Meta
48
- end # Parser
49
-
50
25
  # Library namespace
51
26
  module Mutant
52
27
  # The empty string used within this namespace
@@ -2,30 +2,36 @@
2
2
 
3
3
  module Mutant
4
4
 
5
+ # Return a frozen set of symbols from string enumerable
6
+ #
7
+ # @param [Enumerable<String>]
8
+ #
9
+ # @return [Set<Symbol>]
10
+ #
11
+ # @api private
12
+ #
13
+ def self.symbolset(strings)
14
+ strings.map(&:to_sym).to_set.freeze
15
+ end
16
+ private_class_method :symbolset
17
+
5
18
  # Set of nodes that cannot be on the LHS of an assignment
6
- NOT_ASSIGNABLE = [
7
- :int, :float, :str, :dstr, :class, :module, :self
8
- ].to_set.freeze
19
+ NOT_ASSIGNABLE = symbolset %w(
20
+ int float str dstr class module self
21
+ )
9
22
 
10
23
  # Set of op-assign types
11
- OP_ASSIGN = [
12
- :or_asgn, :and_asgn, :op_asgn
13
- ].to_set.freeze
14
-
24
+ OP_ASSIGN = symbolset %w(or_asgn and_asgn op_asgn)
15
25
  # Set of node types that are not valid when emitted standalone
16
- NOT_STANDALONE = [:splat, :restarg, :block_pass].to_set.freeze
26
+ NOT_STANDALONE = symbolset %w( splat restarg block_pass)
27
+ INDEX_OPERATORS = symbolset %w([] []=)
28
+ UNARY_METHOD_OPERATORS = symbolset %w(~@ +@ -@ !)
17
29
 
18
30
  # Operators ruby implementeds as methods
19
- METHOD_OPERATORS = %w(
31
+ METHOD_OPERATORS = symbolset %w(
20
32
  <=> === []= [] <= >= == !~ != =~ <<
21
33
  >> ** * % / | ^ & < > + - ~@ +@ -@ !
22
- ).map(&:to_sym).to_set.freeze
23
-
24
- INDEX_OPERATORS = [:[], :[]=].to_set.freeze
25
-
26
- UNARY_METHOD_OPERATORS = %w(
27
- ~@ +@ -@ !
28
- ).map(&:to_sym).to_set.freeze
34
+ )
29
35
 
30
36
  BINARY_METHOD_OPERATORS = (
31
37
  METHOD_OPERATORS - (INDEX_OPERATORS + UNARY_METHOD_OPERATORS)
@@ -39,14 +45,10 @@ module Mutant
39
45
  #
40
46
  # not - 1.8 only, mutant does not support 1.8
41
47
  #
42
- NODE_BLACKLIST = %w(
43
- not
44
- ).map(&:to_sym).freeze
48
+ NODE_BLACKLIST = symbolset %w(not)
45
49
 
46
50
  # Nodes that are NOT generated by parser but used by mutant / unparser.
47
- NODE_EXTRA = %w(
48
- empty
49
- ).map(&:to_sym).freeze
51
+ NODE_EXTRA = symbolset %w(empty)
50
52
 
51
53
  NODE_TYPES = ((Parser::Meta::NODE_TYPES + NODE_EXTRA) - NODE_BLACKLIST).to_set.freeze
52
54
 
@@ -18,7 +18,7 @@ module Mutant
18
18
 
19
19
  INDEX_REFERENCE = :[]
20
20
  INDEX_ASSIGN = :[]=
21
- ASSIGN_SUFFIX = :'='
21
+ ASSIGN_SUFFIX = '='.freeze
22
22
 
23
23
  # Base mutator for index operations
24
24
  class Index < self
@@ -81,11 +81,12 @@ module Mutant
81
81
  # @api private
82
82
  #
83
83
  def non_index_dispatch
84
- if binary_operator?
84
+ case
85
+ when binary_operator?
85
86
  run(Binary)
86
- return
87
+ else
88
+ normal_dispatch
87
89
  end
88
- normal_dispatch
89
90
  end
90
91
 
91
92
  # Return arguments
@@ -149,6 +150,19 @@ module Mutant
149
150
  arguments.one? && BINARY_METHOD_OPERATORS.include?(selector)
150
151
  end
151
152
 
153
+ # Test for attribute assignment
154
+ #
155
+ # @return [true]
156
+ # if node represetns and attribute assignment
157
+ #
158
+ # @return [false]
159
+ #
160
+ # @api private
161
+ #
162
+ def attribute_assignment?
163
+ !BINARY_OPERATORS.include?(selector) && !UNARY_OPERATORS.include?(selector) && assignment? && !mlhs?
164
+ end
165
+
152
166
  # Mutate arguments
153
167
  #
154
168
  # @return [undefined]
@@ -196,11 +210,55 @@ module Mutant
196
210
  # @api private
197
211
  #
198
212
  def emit_implicit_self
199
- if receiver.type == :self and !KEYWORDS.include?(selector)
213
+ if receiver.type == :self && !KEYWORDS.include?(selector) && !attribute_assignment?
200
214
  emit_receiver(nil)
201
215
  end
202
216
  end
203
217
 
218
+ # Test for assignment
219
+ #
220
+ # FIXME: This also returns true for <= operator!
221
+ #
222
+ # @return [true]
223
+ # if node represents attribute / element assignment
224
+ #
225
+ # @return [false]
226
+ # otherwise
227
+ #
228
+ # @api private
229
+ #
230
+ def assignment?
231
+ selector.to_s[-1] == ASSIGN_SUFFIX
232
+ end
233
+
234
+ # Test for mlhs
235
+ #
236
+ # @return [true]
237
+ # if node is within an mlhs
238
+ #
239
+ # @return [false]
240
+ # otherwise
241
+ #
242
+ # @api private
243
+ #
244
+ def mlhs?
245
+ assignment? && !arguments?
246
+ end
247
+
248
+ # Test for empty arguments
249
+ #
250
+ # @return [true]
251
+ # if arguments are empty
252
+ #
253
+ # @return [false]
254
+ # otherwise
255
+ #
256
+ # @api private
257
+ #
258
+ def arguments?
259
+ arguments.any?
260
+ end
261
+
204
262
  end # Send
205
263
  end # Node
206
264
  end # Mutator
@@ -2,5 +2,5 @@
2
2
 
3
3
  module Mutant
4
4
  # The current mutant version
5
- VERSION = '0.3.3'.freeze
5
+ VERSION = '0.3.4'.freeze
6
6
  end # Mutant
@@ -0,0 +1,26 @@
1
+ # encoding: UTF-8
2
+
3
+ # Monkeypatch on parser with a list of allowed nodes.
4
+ # Will be pushed upstream once turning out to be correct.
5
+ module Parser
6
+ module Meta
7
+ NODE_TYPES =
8
+ %w(
9
+ true false nil int float str dstr str
10
+ sym dsym xstr regopt regexp array splat
11
+ array pair kwsplat hash irange erange self
12
+ lvar ivar cvar gvar const defined? lvasgn
13
+ ivasgn cvasgn gvasgn casgn mlhs masgn op_asgn
14
+ op_asgn and_asgn ensure rescue arg_expr
15
+ or_asgn and_asgn or_asgn back_ref nth_ref
16
+ match_with_lvasgn match_current_line
17
+ module class sclass def defs undef alias args
18
+ cbase arg optarg restarg blockarg block_pass args def kwarg kwoptarg
19
+ kwrestarg send super zsuper yield block send
20
+ and not or if when case while until while_post
21
+ until_post for break next redo return resbody
22
+ kwbegin begin retry preexe postexe iflipflop eflipflop
23
+ shadowarg
24
+ ).map(&:to_sym).to_set.freeze
25
+ end # Meta
26
+ end # Parser
@@ -20,7 +20,7 @@ Gem::Specification.new do |gem|
20
20
 
21
21
  gem.required_ruby_version = '>= 1.9.3'
22
22
 
23
- gem.add_runtime_dependency('parser', '~> 2.1.0')
23
+ gem.add_runtime_dependency('parser', '~> 2.1.4')
24
24
  gem.add_runtime_dependency('procto', '~> 0.0.2')
25
25
  gem.add_runtime_dependency('abstract_type', '~> 0.0.7')
26
26
  gem.add_runtime_dependency('unparser', '~> 0.1.8')
@@ -56,20 +56,40 @@ describe Mutant::Mutator, 'send' do
56
56
  end
57
57
 
58
58
  context 'attribute assign' do
59
- let(:source) { 'foo.bar=baz' }
60
59
 
61
- let(:mutations) do
62
- mutations = []
63
- mutations << 'foo'
64
- mutations << 'nil'
65
- mutations << 'foo.bar=nil'
66
- mutations << 'foo.bar'
67
- mutations << 'baz'
68
- # This one could probably be removed
69
- mutations << 'nil.bar=baz'
60
+ context 'to self' do
61
+ let(:source) { 'self.bar=baz' }
62
+
63
+ let(:mutations) do
64
+ mutations = []
65
+ mutations << 'nil'
66
+ mutations << 'self.bar=nil'
67
+ mutations << 'self'
68
+ mutations << 'self.bar'
69
+ mutations << 'baz'
70
+ # This one could probably be removed
71
+ mutations << 'nil.bar=baz'
72
+ end
73
+
74
+ it_should_behave_like 'a mutator'
70
75
  end
71
76
 
72
- it_should_behave_like 'a mutator'
77
+ context 'to other object' do
78
+ let(:source) { 'foo.bar=baz' }
79
+
80
+ let(:mutations) do
81
+ mutations = []
82
+ mutations << 'foo'
83
+ mutations << 'nil'
84
+ mutations << 'foo.bar=nil'
85
+ mutations << 'foo.bar'
86
+ mutations << 'baz'
87
+ # This one could probably be removed
88
+ mutations << 'nil.bar=baz'
89
+ end
90
+
91
+ it_should_behave_like 'a mutator'
92
+ end
73
93
  end
74
94
 
75
95
  context 'index assign' do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mutant
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.3
4
+ version: 0.3.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Markus Schirp
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 2.1.0
19
+ version: 2.1.4
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: 2.1.0
26
+ version: 2.1.4
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: procto
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -344,6 +344,7 @@ files:
344
344
  - lib/mutant/subject/method/singleton.rb
345
345
  - lib/mutant/version.rb
346
346
  - lib/mutant/zombifier.rb
347
+ - lib/parser-node-list.rb
347
348
  - mutant.gemspec
348
349
  - spec/integration/mutant/rspec_spec.rb
349
350
  - spec/integration/mutant/test_mutator_handles_types_spec.rb