onceover 3.12.0 → 3.12.1

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: 3e2b22d1ea208cdaeeeb71b5a99e2f55f6056cb2
4
- data.tar.gz: d29bad7de9cfd34c55ece9b69bbb73b5b48cb182
3
+ metadata.gz: bf7fd944c3bc26e87d6fb637545e2a79f7913e88
4
+ data.tar.gz: af6d22e661957cae9092b623c9d337e949c4f219
5
5
  SHA512:
6
- metadata.gz: add796e1d03519fb411c5b2bc5a27b5ff0f00e52b9cea682aeb06b21ec31d36ddfcbbf5209a88fe9eda2a26650d49be47d611096f264b21e97302134faa7b8f0
7
- data.tar.gz: 73ec3b013c0c02598fa04d99dee1721b91c40d40ec2bd174e24393177f3052ee084d222afbf8791bbaeda8ae0263679e2a88e5c53b78e31ad3728c934b142d55
6
+ metadata.gz: aaab1848deba4d517a93debf8ed6d1ccf7d6251afc5974bb1240dcf341fbcfb096c2a88af5182578732bb817eaf78c638f0096073b6beb1193ce365c3af81100
7
+ data.tar.gz: ba295a61c754e4fd8c62a75ebacfc68b6fb724a90bc9484277065f1afbe542e3ce3fc50983be58c3adb34c4f1a9ae3629cabc0a9fcda4c1d38a7a311cae88595
data/features/run.feature CHANGED
@@ -12,6 +12,11 @@ Feature: Run rspec and acceptance test suites
12
12
  When I run onceover command "run spec"
13
13
  Then I should not see any errors
14
14
 
15
+ Scenario: Run correct spec tests in parallel
16
+ Given initialized control repo "basic"
17
+ When I run onceover command "run spec --parallel"
18
+ Then I should not see any errors
19
+
15
20
  Scenario: Using regexes to define tests
16
21
  Given initialized control repo "caching"
17
22
  When I run onceover command "run spec"
@@ -1,3 +1,4 @@
1
+ require 'rspec'
1
2
  require 'pathname'
2
3
 
3
4
  class OnceoverFormatter
@@ -53,6 +54,21 @@ class OnceoverFormatter
53
54
  def dump_failures notification
54
55
  require 'onceover/controlrepo'
55
56
 
57
+ failures = extract_failures(notification)
58
+
59
+ # Put some spacing before the results
60
+ @output << "\n\n\n"
61
+
62
+ failures.each do |_name, role|
63
+ @output << Onceover::Controlrepo.evaluate_template('error_summary.yaml.erb', binding)
64
+ end
65
+
66
+ @output << "\n"
67
+ end
68
+
69
+ # This method takes a notification and formats it into a hash that can be
70
+ # printed easily
71
+ def extract_failures notification
56
72
  # Group by role
57
73
  grouped = notification.failed_examples.group_by { |e| e.metadata[:example_group][:parent_example_group][:description]}
58
74
 
@@ -61,17 +77,15 @@ class OnceoverFormatter
61
77
  grouped[role] = failures.uniq { |f| f.metadata[:execution_result].exception.to_s }
62
78
  end
63
79
 
64
- # Put some spacing before the results
65
- @output << "\n\n\n"
66
-
80
+ # Extract the errors and remove all RSpec objects
67
81
  grouped.each do |role, failures|
68
- role = {
82
+ grouped[role] = {
69
83
  name: role,
70
84
  errors: failures.map { |f| parse_errors(f.metadata[:execution_result].exception.to_s)}.flatten,
71
85
  }
72
-
73
- @output << Onceover::Controlrepo.evaluate_template('error_summary.yaml.erb', binding)
74
86
  end
87
+
88
+ grouped
75
89
  end
76
90
 
77
91
  def parse_errors(raw_error)
@@ -140,8 +154,6 @@ class OnceoverFormatter
140
154
  file.relative_path_from(tempdir + environmentpath + "production").to_s
141
155
  end
142
156
 
143
- private
144
-
145
157
  # Below are defined the styles for the output
146
158
  def class_name(text)
147
159
  RSpec::Core::Formatters::ConsoleCodes.wrap(text, :bold)
@@ -189,34 +201,69 @@ class OnceoverFormatter
189
201
 
190
202
  end
191
203
 
192
- # class OnceoverFormatterParallel < OnceoverFormatter
193
- # require 'yaml'
204
+ class OnceoverFormatterParallel < OnceoverFormatter
205
+ require 'yaml'
206
+
207
+ RSpec::Core::Formatters.register self, :example_group_started,
208
+ :example_passed, :example_failed, :example_pending, :dump_failures
209
+
210
+ def example_group_started notification
211
+ # Do nothing
212
+ end
213
+
214
+ def example_passed notification
215
+ @output << green('P')
216
+ @output.flush
217
+ end
218
+
219
+ def example_failed notification
220
+ @output << red('F')
221
+ @output.flush
222
+ end
223
+
224
+ def example_pending notification
225
+ @output << yellow('?')
226
+ @output.flush
227
+ end
228
+
229
+ def dump_failures notification
230
+ # Create a random string
231
+ require 'securerandom'
232
+ random_string = SecureRandom.hex
194
233
 
195
- # def example_group_started notification
196
- # # Do nothing
197
- # end
234
+ # Ensure that the folder exists
235
+ FileUtils.mkdir_p "#{RSpec.configuration.onceover_tempdir}/parallel"
198
236
 
199
- # def example_passed notification
200
- # @output << green('P')
201
- # end
237
+ # Dump the notification to a unique file
238
+ File.open("#{RSpec.configuration.onceover_tempdir}/parallel/results-#{random_string}.yaml", "w") do |file|
239
+ file.write(extract_failures(notification).to_yaml)
240
+ end
241
+ end
202
242
 
203
- # def example_failed notification
204
- # @output << red('F')
205
- # end
243
+ def output_results(directory)
244
+ require 'rspec/core/example'
245
+ # Read all yaml files
246
+ results = {}
247
+ files = Dir["#{directory}/*.yaml"]
206
248
 
207
- # def example_pending notification
208
- # @output << yellow('?')
209
- # end
249
+ # Merge data
250
+ errors = files.reduce({}) do |errs, file|
251
+ # Read all files and merge them
252
+ errs.merge(YAML.load(File.read(file))) # rubocop:disable Security/YAMLLoad
253
+ end
254
+
255
+ # Delete files from the disk
256
+ files.each { |f| File.delete(f) }
210
257
 
211
- # def dump_failures
212
- # # TODO: This should write to a file and then get picked up and formatted by onceover itself
213
- # # might need to use a module for the formatting
214
- # require 'pry'
215
- # binding.pry
216
- # RSpec.configuration.onceover_tempdir
217
- # end
258
+ @output << "\n\n\n"
218
259
 
219
- # end
260
+ # Output errors
261
+ errors.each do |_name, role|
262
+ @output << Onceover::Controlrepo.evaluate_template('error_summary.yaml.erb', binding)
263
+ end
264
+ @output << "\n"
265
+ end
266
+ end
220
267
 
221
268
  class FailureCollector
222
269
  RSpec::Core::Formatters.register self, :dump_failures
@@ -84,15 +84,12 @@ class Onceover
84
84
  logger.debug "Running #{@command_prefix}rake spec_standalone from #{@repo.tempdir}"
85
85
  result = Backticks::Runner.new(interactive:true).run(@command_prefix.strip.split, 'rake', 'spec_standalone').join
86
86
  end
87
- # TODO: Refactor this to be much nicer
88
- if @config.formatters.include? 'FailureCollector'
89
- puts '----------- Summary of failures -----------'
90
- if File.exist?("#{@repo.tempdir}/failures.out") and ! File.zero?("#{@repo.tempdir}/failures.out")
91
- logger.debug "Reading failures from #{@repo.tempdir}/failures.out"
92
- puts File.read("#{@repo.tempdir}/failures.out")
93
- else
94
- puts 'No failures detected'
95
- end
87
+
88
+ # Print a summary if we were running ion parallel
89
+ if @config.formatters.include? 'OnceoverFormatterParallel'
90
+ require 'onceover/rspec/formatters'
91
+ formatter = OnceoverFormatterParallel.new(STDOUT)
92
+ formatter.output_results("#{repo.tempdir}/parallel")
96
93
  end
97
94
 
98
95
  # Finally exit and preserve the exit code
@@ -53,7 +53,7 @@ class Onceover
53
53
 
54
54
  # Set dynamic defaults for format
55
55
  if opts[:format] == [:defaults]
56
- @formatters = opts[:parallel] ? ['documentation', 'FailureCollector'] : ['OnceoverFormatter']
56
+ @formatters = opts[:parallel] ? ['OnceoverFormatterParallel'] : ['OnceoverFormatter']
57
57
  else
58
58
  @formatters = opts[:format]
59
59
  end
data/onceover.gemspec CHANGED
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift File.expand_path("../lib", __FILE__)
4
4
 
5
5
  Gem::Specification.new do |s|
6
6
  s.name = "onceover"
7
- s.version = "3.12.0"
7
+ s.version = "3.12.1"
8
8
  s.authors = ["Dylan Ratcliffe"]
9
9
  s.email = ["dylan.ratcliffe@puppet.com"]
10
10
  s.homepage = "https://github.com/dylanratcliffe/onceover"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: onceover
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.12.0
4
+ version: 3.12.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dylan Ratcliffe
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-03-16 00:00:00.000000000 Z
11
+ date: 2019-03-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake