mutator_rails 0.1.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +7 -0
  2. data/.circleci/config.yml +37 -0
  3. data/.codeclimate.yml +20 -0
  4. data/.gitignore +12 -0
  5. data/.rspec +2 -0
  6. data/.ruby-version +1 -0
  7. data/CODE_OF_CONDUCT.md +46 -0
  8. data/Gemfile +7 -0
  9. data/Gemfile.lock +232 -0
  10. data/LICENSE.md +21 -0
  11. data/README.md +31 -0
  12. data/Rakefile +8 -0
  13. data/app/models/test.rb +7 -0
  14. data/bin/console +15 -0
  15. data/bin/setup +8 -0
  16. data/config/mutator_rails.yml +8 -0
  17. data/defaults.reek +131 -0
  18. data/lib/mutator_rails.rb +33 -0
  19. data/lib/mutator_rails/analyze.rb +27 -0
  20. data/lib/mutator_rails/cleanup.rb +60 -0
  21. data/lib/mutator_rails/config.rb +34 -0
  22. data/lib/mutator_rails/full_mutate.rb +39 -0
  23. data/lib/mutator_rails/guide.rb +69 -0
  24. data/lib/mutator_rails/list_maker.rb +25 -0
  25. data/lib/mutator_rails/mutation_log.rb +112 -0
  26. data/lib/mutator_rails/railtie.rb +18 -0
  27. data/lib/mutator_rails/single_mutate.rb +134 -0
  28. data/lib/mutator_rails/statistics.rb +192 -0
  29. data/lib/mutator_rails/version.rb +5 -0
  30. data/lib/tasks/mutator/analyze.rake +13 -0
  31. data/lib/tasks/mutator/cleanup.rake +13 -0
  32. data/lib/tasks/mutator/mutate_files.rake +12 -0
  33. data/lib/tasks/mutator/mutator.rake +17 -0
  34. data/lib/tasks/mutator/statistics.rake +13 -0
  35. data/log/mutant/analysis.tsv +3 -0
  36. data/log/mutant/guide.txt +1 -0
  37. data/log/mutant/models/test.log +92 -0
  38. data/log/mutant/models/test2.log +92 -0
  39. data/log/mutant/statistics.txt +19 -0
  40. data/mutator_rails.gemspec +37 -0
  41. data/spec/models/test_spec.rb +15 -0
  42. data/spec/mutator_rails/analyze_spec.rb +26 -0
  43. data/spec/mutator_rails/cleanup_spec.rb +13 -0
  44. data/spec/mutator_rails/full_mutate_spec.rb +13 -0
  45. data/spec/mutator_rails/guide_spec.rb +33 -0
  46. data/spec/mutator_rails/list_maker_spec.rb +17 -0
  47. data/spec/mutator_rails/mutation_log_spec.rb +36 -0
  48. data/spec/mutator_rails/single_mutate_spec.rb +111 -0
  49. data/spec/mutator_rails/statistics_spec.rb +48 -0
  50. data/spec/mutator_rails_spec.rb +9 -0
  51. data/spec/spec_helper.rb +49 -0
  52. metadata +306 -0
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe MutatorRails::ListMaker do
6
+
7
+ let(:object) { described_class.new }
8
+
9
+ describe '#make_list' do
10
+ it 'has proper content' do
11
+ result = object.make_list
12
+
13
+ expect(result).to have(2).entries
14
+ expect(result.last.link).to eql('=HYPERLINK("models/test2.log","Export::ActivityExporter2")')
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe MutatorRails::MutationLog do
6
+ let(:log) { 'log/mutant/models/test.log' }
7
+ let(:object) { described_class.new(log) }
8
+
9
+ describe '#call' do
10
+ let(:expectation) { '\t73\t26\t99\t73.737\t1.559\t63.52' }
11
+ subject { object.to_s }
12
+ it 'processes the all code' do
13
+ expect(subject).to match(expectation)
14
+ expect(subject).to match('HYPERLINK')
15
+ expect(subject).to match('"Export::ActivityExporter"')
16
+ end
17
+ end
18
+
19
+ describe '#pct' do
20
+ it 'has a pct' do
21
+ expect(object.pct).to equal 73.737
22
+ end
23
+ end
24
+
25
+ describe '#alive' do
26
+ it 'has an alive count' do
27
+ expect(object.alive).to equal 26
28
+ end
29
+ end
30
+
31
+ describe '#link' do
32
+ it 'has a link' do
33
+ expect(object.link).to eql '=HYPERLINK("models/test.log","Export::ActivityExporter")'
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,111 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe MutatorRails::SingleMutate do
6
+ let(:file) { 'app/models/test.rb' }
7
+ let(:guide) { MutatorRails::Guide.new }
8
+ let(:object) { described_class.new(guide, file) }
9
+
10
+ describe '#call' do
11
+ it 'processes the all code' do
12
+ object.call
13
+ end
14
+ end
15
+
16
+ describe '#old_log' do
17
+ it 'returns old log file name (deprecated name)' do
18
+ expect(object.old_log)
19
+ .to eql('log/mutant/models/test_fdef5a515ce8eff897a72b026aadbaba_0e7f4802f58bbbb186be8b44a74a33e3_0.8.14.log')
20
+ end
21
+ end
22
+
23
+ describe '#log_location' do
24
+ it 'returns log file' do
25
+ expect(object.log_location.to_s)
26
+ .to eql('log/mutant/models/test')
27
+ end
28
+ end
29
+
30
+ describe '#full_log' do
31
+ it 'returns full log file name' do
32
+ expect(object.full_log.to_s)
33
+ .to eql('log/mutant/models/test.log')
34
+ end
35
+ end
36
+
37
+ describe '#log' do
38
+ it 'returns log file' do
39
+ expect(object.log.to_s)
40
+ .to eql('log/mutant/models/test.log')
41
+ end
42
+ end
43
+
44
+ describe '#log_dir' do
45
+ it 'returns log file dir' do
46
+ expect(object.log_dir.to_s).to eql('log/mutant/models')
47
+ end
48
+ end
49
+
50
+ describe '#spec_md5' do
51
+ it 'returns md5 hash of spec file' do
52
+ expect(object.spec_md5)
53
+ .to eql('0e7f4802f58bbbb186be8b44a74a33e3')
54
+ end
55
+ end
56
+
57
+ describe '#path' do
58
+ it 'returns path to code' do
59
+ expect(object.path)
60
+ .to be_an_instance_of(Pathname)
61
+ end
62
+ end
63
+
64
+ describe '#rerun' do
65
+ let(:cmd) { 'command' }
66
+ it 'returns nothing - no rerun' do
67
+ expect(object.rerun(cmd)).to be_nil
68
+ end
69
+ end
70
+
71
+ describe '#first_run' do
72
+ let(:parms) { %w[a b] }
73
+ it 'returns first run results cmd' do
74
+ expect(object.first_run(parms))
75
+ .to eql('SPEC_OPTS="--pattern spec/models/test_spec.rb" RAILS_ENV=test bundle exec mutant a b')
76
+ end
77
+ end
78
+
79
+ describe '#spec_opt' do
80
+ it 'returns spec option string' do
81
+ expect(object.spec_opt)
82
+ .to eql('SPEC_OPTS="--pattern spec/models/test_spec.rb" ')
83
+ end
84
+ end
85
+
86
+ describe '#spec_file' do
87
+ it 'returns spec_file name' do
88
+ expect(object.spec_file)
89
+ .to eql('spec/models/test_spec.rb')
90
+ end
91
+ end
92
+
93
+ describe '#complete?' do
94
+ let(:log) { 'log/mutant/models/test.log' }
95
+ let(:file2) { __FILE__ }
96
+ it 'returns completion indication' do
97
+ expect(object.complete?(log)).to be true
98
+ end
99
+
100
+ it 'returns completion indication' do
101
+ expect(object.complete?(file2)).to be false
102
+ end
103
+ end
104
+
105
+ describe '#preface' do
106
+ let(:base) { 'abc' }
107
+ it 'returns preface' do
108
+ expect(object.preface(base)).to eql('')
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe MutatorRails::Statistics do
6
+ let(:object) { described_class.call }
7
+ let(:statistics_file) { 'log/mutant/statistics.txt' }
8
+ before do
9
+ File.delete(statistics_file) if File.exist?(statistics_file)
10
+ end
11
+
12
+ describe '#call' do
13
+ let(:expectations) do
14
+ "
15
+ 2 module(s) were mutated in 2 minutes 7 seconds
16
+ for a total of 198 mutations tested @ 1.56/sec average
17
+ which left 52 mutations alive (26.3%)
18
+ and 146 killed (73.7%)
19
+
20
+ 0 module(s) were fully mutated (0.0%)
21
+
22
+ The following modules had most alive mutations (top 10):
23
+ . Export::ActivityExporter (26)
24
+ . Export::ActivityExporter2 (26)
25
+
26
+ The following modules had longest mutation time (top 10):
27
+ . Export::ActivityExporter (1 minute 3 seconds)
28
+ . Export::ActivityExporter2 (1 minute 3 seconds)
29
+
30
+ The following modules had largest mutation count (top 10):
31
+ . Export::ActivityExporter (99)
32
+ . Export::ActivityExporter2 (99)"
33
+ end
34
+
35
+ it 'processes the log files' do
36
+ object
37
+
38
+ expect(File.exist?(statistics_file)).to be true
39
+ end
40
+
41
+ it 'has the proper stats' do
42
+ object
43
+ stats = File.read(statistics_file)
44
+
45
+ expect(stats).to match(expectations)
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe MutatorRails do
6
+ it 'has a version number' do
7
+ expect(MutatorRails::VERSION).to be_an_instance_of(String)
8
+ end
9
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ ENV['RACK_ENV'] = 'test'
4
+
5
+ require 'simplecov'
6
+
7
+ SimpleCov.add_filter '/spec/'
8
+ SimpleCov.start 'rails' unless File.basename($0).eql?('mutant')
9
+
10
+ require 'bundler/setup'
11
+ require 'mutator_rails'
12
+ require 'rspec/collection_matchers'
13
+
14
+ RSpec.configure do |config|
15
+ # Enable flags like --only-failures and --next-failure
16
+ config.example_status_persistence_file_path = '.rspec_status'
17
+
18
+ # Disable RSpec exposing methods globally on `Module` and `main`
19
+ config.disable_monkey_patching!
20
+
21
+ config.expect_with :rspec do |c|
22
+ c.syntax = :expect
23
+
24
+ # This option will default to `true` in RSpec 4. It makes the `description`
25
+ # and `failure_message` of custom matchers include text for helper methods
26
+ # defined using `chain`, e.g.:
27
+ # be_bigger_than(2).and_smaller_than(4).description
28
+ # # => "be bigger than 2 and smaller than 4"
29
+ # ...rather than:
30
+ # # => "be bigger than 2"
31
+ c.include_chain_clauses_in_custom_matcher_descriptions = true
32
+ end
33
+
34
+ # rspec-mocks config goes here. You can use an alternate test double
35
+ # library (such as bogus or mocha) by changing the `mock_with` option here.
36
+ config.mock_with :rspec do |mocks|
37
+ # Prevents you from mocking or stubbing a method that does not exist on
38
+ # a real object. This is generally recommended, and will default to
39
+ # `true` in RSpec 4.
40
+ mocks.verify_partial_doubles = true
41
+ end
42
+
43
+ # This option will default to `:apply_to_host_groups` in RSpec 4 (and will
44
+ # have no way to turn it off -- the option exists only for backwards
45
+ # compatibility in RSpec 3). It causes shared context metadata to be
46
+ # inherited by the metadata hash of host groups and examples, rather than
47
+ # triggering implicit auto-inclusion in groups with matching metadata.
48
+ config.shared_context_metadata_behavior = :apply_to_host_groups
49
+ end
metadata ADDED
@@ -0,0 +1,306 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mutator_rails
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.8
5
+ platform: ruby
6
+ authors:
7
+ - Tim Chambers
8
+ - Jason Dinsmore
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2018-01-05 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: bundler
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: '1.15'
21
+ type: :development
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: '1.15'
28
+ - !ruby/object:Gem::Dependency
29
+ name: rake
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: '12.0'
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: '12.0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: rails
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '4.0'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '4.0'
56
+ - !ruby/object:Gem::Dependency
57
+ name: rspec-core
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - "~>"
61
+ - !ruby/object:Gem::Version
62
+ version: 3.6.0
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: 3.6.0
70
+ - !ruby/object:Gem::Dependency
71
+ name: rspec-expectations
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - "~>"
75
+ - !ruby/object:Gem::Version
76
+ version: 3.6.0
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - "~>"
82
+ - !ruby/object:Gem::Version
83
+ version: 3.6.0
84
+ - !ruby/object:Gem::Dependency
85
+ name: rspec_junit_formatter
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ - !ruby/object:Gem::Dependency
99
+ name: codeclimate-test-reporter
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ type: :development
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ - !ruby/object:Gem::Dependency
113
+ name: rspec-collection_matchers
114
+ requirement: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ type: :development
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - ">="
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ - !ruby/object:Gem::Dependency
127
+ name: rspec-mocks
128
+ requirement: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - "~>"
131
+ - !ruby/object:Gem::Version
132
+ version: 3.6.0
133
+ type: :development
134
+ prerelease: false
135
+ version_requirements: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - "~>"
138
+ - !ruby/object:Gem::Version
139
+ version: 3.6.0
140
+ - !ruby/object:Gem::Dependency
141
+ name: mutant
142
+ requirement: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - "~>"
145
+ - !ruby/object:Gem::Version
146
+ version: 0.8.14
147
+ type: :development
148
+ prerelease: false
149
+ version_requirements: !ruby/object:Gem::Requirement
150
+ requirements:
151
+ - - "~>"
152
+ - !ruby/object:Gem::Version
153
+ version: 0.8.14
154
+ - !ruby/object:Gem::Dependency
155
+ name: mutant-rspec
156
+ requirement: !ruby/object:Gem::Requirement
157
+ requirements:
158
+ - - "~>"
159
+ - !ruby/object:Gem::Version
160
+ version: 0.8.14
161
+ type: :development
162
+ prerelease: false
163
+ version_requirements: !ruby/object:Gem::Requirement
164
+ requirements:
165
+ - - "~>"
166
+ - !ruby/object:Gem::Version
167
+ version: 0.8.14
168
+ - !ruby/object:Gem::Dependency
169
+ name: concord
170
+ requirement: !ruby/object:Gem::Requirement
171
+ requirements:
172
+ - - "~>"
173
+ - !ruby/object:Gem::Version
174
+ version: 0.1.4
175
+ type: :development
176
+ prerelease: false
177
+ version_requirements: !ruby/object:Gem::Requirement
178
+ requirements:
179
+ - - "~>"
180
+ - !ruby/object:Gem::Version
181
+ version: 0.1.4
182
+ - !ruby/object:Gem::Dependency
183
+ name: procto
184
+ requirement: !ruby/object:Gem::Requirement
185
+ requirements:
186
+ - - "~>"
187
+ - !ruby/object:Gem::Version
188
+ version: 0.0.3
189
+ type: :development
190
+ prerelease: false
191
+ version_requirements: !ruby/object:Gem::Requirement
192
+ requirements:
193
+ - - "~>"
194
+ - !ruby/object:Gem::Version
195
+ version: 0.0.3
196
+ - !ruby/object:Gem::Dependency
197
+ name: adamantium
198
+ requirement: !ruby/object:Gem::Requirement
199
+ requirements:
200
+ - - "~>"
201
+ - !ruby/object:Gem::Version
202
+ version: 0.2.0
203
+ type: :development
204
+ prerelease: false
205
+ version_requirements: !ruby/object:Gem::Requirement
206
+ requirements:
207
+ - - "~>"
208
+ - !ruby/object:Gem::Version
209
+ version: 0.2.0
210
+ - !ruby/object:Gem::Dependency
211
+ name: reek
212
+ requirement: !ruby/object:Gem::Requirement
213
+ requirements:
214
+ - - "~>"
215
+ - !ruby/object:Gem::Version
216
+ version: 4.7.2
217
+ type: :development
218
+ prerelease: false
219
+ version_requirements: !ruby/object:Gem::Requirement
220
+ requirements:
221
+ - - "~>"
222
+ - !ruby/object:Gem::Version
223
+ version: 4.7.2
224
+ description: Automate mutation testing to find weaknesses in code
225
+ email:
226
+ - tim@possibilogy.com
227
+ - jason@dinjas.com
228
+ executables: []
229
+ extensions: []
230
+ extra_rdoc_files: []
231
+ files:
232
+ - ".circleci/config.yml"
233
+ - ".codeclimate.yml"
234
+ - ".gitignore"
235
+ - ".rspec"
236
+ - ".ruby-version"
237
+ - CODE_OF_CONDUCT.md
238
+ - Gemfile
239
+ - Gemfile.lock
240
+ - LICENSE.md
241
+ - README.md
242
+ - Rakefile
243
+ - app/models/test.rb
244
+ - bin/console
245
+ - bin/setup
246
+ - config/mutator_rails.yml
247
+ - defaults.reek
248
+ - lib/mutator_rails.rb
249
+ - lib/mutator_rails/analyze.rb
250
+ - lib/mutator_rails/cleanup.rb
251
+ - lib/mutator_rails/config.rb
252
+ - lib/mutator_rails/full_mutate.rb
253
+ - lib/mutator_rails/guide.rb
254
+ - lib/mutator_rails/list_maker.rb
255
+ - lib/mutator_rails/mutation_log.rb
256
+ - lib/mutator_rails/railtie.rb
257
+ - lib/mutator_rails/single_mutate.rb
258
+ - lib/mutator_rails/statistics.rb
259
+ - lib/mutator_rails/version.rb
260
+ - lib/tasks/mutator/analyze.rake
261
+ - lib/tasks/mutator/cleanup.rake
262
+ - lib/tasks/mutator/mutate_files.rake
263
+ - lib/tasks/mutator/mutator.rake
264
+ - lib/tasks/mutator/statistics.rake
265
+ - log/mutant/analysis.tsv
266
+ - log/mutant/guide.txt
267
+ - log/mutant/models/test.log
268
+ - log/mutant/models/test2.log
269
+ - log/mutant/statistics.txt
270
+ - mutator_rails.gemspec
271
+ - spec/models/test_spec.rb
272
+ - spec/mutator_rails/analyze_spec.rb
273
+ - spec/mutator_rails/cleanup_spec.rb
274
+ - spec/mutator_rails/full_mutate_spec.rb
275
+ - spec/mutator_rails/guide_spec.rb
276
+ - spec/mutator_rails/list_maker_spec.rb
277
+ - spec/mutator_rails/mutation_log_spec.rb
278
+ - spec/mutator_rails/single_mutate_spec.rb
279
+ - spec/mutator_rails/statistics_spec.rb
280
+ - spec/mutator_rails_spec.rb
281
+ - spec/spec_helper.rb
282
+ homepage: https://github.com/dinj-oss/mutator_rails
283
+ licenses:
284
+ - MIT
285
+ metadata: {}
286
+ post_install_message:
287
+ rdoc_options: []
288
+ require_paths:
289
+ - lib
290
+ required_ruby_version: !ruby/object:Gem::Requirement
291
+ requirements:
292
+ - - ">="
293
+ - !ruby/object:Gem::Version
294
+ version: '2.3'
295
+ required_rubygems_version: !ruby/object:Gem::Requirement
296
+ requirements:
297
+ - - ">="
298
+ - !ruby/object:Gem::Version
299
+ version: 1.3.6
300
+ requirements: []
301
+ rubyforge_project:
302
+ rubygems_version: 2.5.2
303
+ signing_key:
304
+ specification_version: 4
305
+ summary: Integrate automated mutation testing into Rails.
306
+ test_files: []