onceover 3.15.0 → 3.17.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.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.rubocop.yml +72 -82
  4. data/.travis.yml +3 -8
  5. data/Gemfile +9 -2
  6. data/README.md +66 -3
  7. data/bin/onceover +3 -3
  8. data/factsets/Ubuntu-18.04-64.json +556 -0
  9. data/features/step_definitions/common.rb +12 -1
  10. data/features/windows.feature +30 -0
  11. data/features/{run.feature → zzz_run.feature} +5 -0
  12. data/lib/onceover/beaker.rb +6 -0
  13. data/lib/onceover/cli.rb +1 -1
  14. data/lib/onceover/cli/init.rb +1 -1
  15. data/lib/onceover/cli/run.rb +4 -3
  16. data/lib/onceover/cli/show.rb +3 -3
  17. data/lib/onceover/cli/update.rb +2 -2
  18. data/lib/onceover/controlrepo.rb +10 -6
  19. data/lib/onceover/deploy.rb +3 -1
  20. data/lib/onceover/group.rb +1 -1
  21. data/lib/onceover/logger.rb +2 -1
  22. data/lib/onceover/rake_tasks.rb +2 -1
  23. data/lib/onceover/rspec/formatters.rb +17 -5
  24. data/lib/onceover/runner.rb +17 -5
  25. data/lib/onceover/testconfig.rb +24 -14
  26. data/onceover.gemspec +13 -17
  27. data/spec/fixtures/controlrepos/caching/spec/r10k.yaml +3 -0
  28. data/spec/fixtures/controlrepos/windows/Gemfile +3 -0
  29. data/spec/fixtures/controlrepos/windows/Puppetfile +3 -0
  30. data/spec/fixtures/controlrepos/windows/environment.conf +1 -0
  31. data/spec/fixtures/controlrepos/windows/site-modules/role/manifests/acl.pp +12 -0
  32. data/spec/fixtures/controlrepos/windows/site-modules/role/manifests/groups.pp +8 -0
  33. data/spec/fixtures/controlrepos/windows/site-modules/role/manifests/users.pp +9 -0
  34. data/spec/fixtures/controlrepos/windows/site/role/manifests/groups.pp +8 -0
  35. data/spec/fixtures/controlrepos/windows/site/role/manifests/users.pp +9 -0
  36. data/spec/fixtures/controlrepos/windows/spec/onceover.yaml +24 -0
  37. data/templates/test_spec.rb.erb +60 -0
  38. metadata +81 -110
@@ -26,7 +26,7 @@ Given(/^control repo "([^"]*)" without "([^"]*)"$/) do |controlrepo_name, filena
26
26
  end
27
27
 
28
28
  When(/^I run onceover command "([^"]*)"$/) do |command|
29
- @cmd.command = command
29
+ @cmd.command = "#{command} --debug"
30
30
  puts @cmd
31
31
  @cmd.run
32
32
  end
@@ -37,6 +37,17 @@ When(/^I run onceover command "([^"]*)" with class "([^"]*)"$/) do |command, cl
37
37
  @cmd.run
38
38
  end
39
39
 
40
+ # The below can be used to skip tests if they only work on one os
41
+ When(/^test osfamily is "(\w*)"$/) do |osfamily|
42
+ require 'facter'
43
+ pending unless Facter.value(:os)['family'] == osfamily
44
+ end
45
+
46
+ When(/^test osfamily is not "(\w*)"$/) do |osfamily|
47
+ require 'facter'
48
+ pending if Facter.value(:os)['family'] == osfamily
49
+ end
50
+
40
51
  Then(/^I see help for commands: "([^"]*)"$/) do |commands|
41
52
  # Get chunk of output between COMMANDS and OPTION, there should be help section
42
53
  commands_help = @cmd.output[/COMMANDS(.*)OPTIONS/m, 1]
@@ -0,0 +1,30 @@
1
+ @windows
2
+ Feature: Run onceover with windows
3
+ Onceover should allow to run rspec and acceptance test for all profvile and role classes
4
+ or for any part of them. Use should set if he wants to see only summary of tests or full
5
+ log info.
6
+
7
+ Background:
8
+ Given onceover executable
9
+
10
+ Scenario: Run with common Windows code
11
+ Given control repo "windows"
12
+ When I run onceover command "run spec" with class "role::users"
13
+ Then I should not see any errors
14
+
15
+ Scenario: Run with common Windows code without workarounds
16
+ Given existing control repo "windows"
17
+ When I run onceover command "run spec --no_workarounds" with class "role::users"
18
+ And test osfamily is not "windows"
19
+ Then Onceover should exit 1
20
+
21
+ Scenario: Compiling a windows role with groups that is valid should compile
22
+ Given control repo "windows"
23
+ When I run onceover command "run spec" with class "role::groups"
24
+ Then I should not see any errors
25
+
26
+ Scenario: Compiling a windows role with users that is valid should compile
27
+ Given control repo "windows"
28
+ When I run onceover command "run spec" with class "role::users"
29
+ Then I should not see any errors
30
+
@@ -27,6 +27,11 @@ Feature: Run rspec and acceptance test suites
27
27
  When I run onceover command "run spec"
28
28
  Then I should see message pattern "apache::params"
29
29
 
30
+ Scenario: Checking that r10k config works
31
+ Given initialized control repo "caching"
32
+ When I run onceover command "run spec --debug"
33
+ Then I should see message pattern "r10k.yaml"
34
+
30
35
  Scenario: Run spec tests with misspelled module in Puppetfile
31
36
  Given initialized control repo "basic"
32
37
  And in Puppetfile is misspelled module's name
@@ -1,3 +1,6 @@
1
+ # rubocop:disable Style/RescueStandardError
2
+ # ^^ I canlt be bothered fixing this because all of this code is deprecated
3
+
1
4
  class Onceover
2
5
  class Beaker
3
6
  # WARNING: All of this functionality is deprecated. It will be left around
@@ -232,7 +235,10 @@ class Onceover
232
235
  end
233
236
 
234
237
  raise "The networkmanager created too many machines! Only expecting one" if hosts.count > 1
238
+
235
239
  @nwm.instance_variable_get(:@hosts)[0]
236
240
  end
237
241
  end
238
242
  end
243
+
244
+ # rubocop:enable Style/RescueStandardError
@@ -3,7 +3,7 @@ require 'cri'
3
3
  class Onceover
4
4
  class CLI
5
5
  def self.command
6
- @cmd ||= Cri::Command.define do
6
+ @command ||= Cri::Command.define do
7
7
  name 'onceover'
8
8
  usage 'onceover <subcommand> [options]'
9
9
  summary 'Tool for testing Puppet controlrepos'
@@ -9,7 +9,7 @@ class Onceover
9
9
  class CLI
10
10
  class Init
11
11
  def self.command
12
- @cmd ||= Cri::Command.define do
12
+ @command ||= Cri::Command.define do
13
13
  name 'init'
14
14
  usage 'init'
15
15
  summary 'Sets up a controlrepo for testing from scratch'
@@ -10,7 +10,7 @@ class Onceover
10
10
  class CLI
11
11
  class Run
12
12
  def self.command
13
- @cmd ||= Cri::Command.define do
13
+ @command ||= Cri::Command.define do
14
14
  name 'run'
15
15
  usage 'run [spec|acceptance]'
16
16
  summary 'Runs either the spec or acceptance tests'
@@ -35,13 +35,14 @@ This includes deploying using r10k and running all custom tests.
35
35
 
36
36
  class Spec
37
37
  def self.command
38
- @cmd ||= Cri::Command.define do
38
+ @command ||= Cri::Command.define do
39
39
  name 'spec'
40
40
  usage 'spec'
41
41
  summary 'Runs spec tests'
42
42
 
43
43
  optional :p, :parallel, 'Runs spec tests in parallel. This increases speed at the cost of poorly formatted logs and irrelevant junit output.'
44
44
  optional nil, :format, 'Which RSpec formatter to use, valid options are: documentation, progress, FailureCollector, OnceoverFormatter. You also specify this multiple times', multiple: true, default: :defaults
45
+ optional nil, :no_workarounds, 'Disables workarounds that have been added for convenience to get around common RSPec issues such as https://github.com/rodjek/rspec-puppet/issues/665'
45
46
 
46
47
  run do |opts, args, cmd|
47
48
  repo = Onceover::Controlrepo.new(opts)
@@ -56,7 +57,7 @@ This includes deploying using r10k and running all custom tests.
56
57
 
57
58
  class Acceptance
58
59
  def self.command
59
- @cmd ||= Cri::Command.define do
60
+ @command ||= Cri::Command.define do
60
61
  name 'acceptance'
61
62
  usage 'acceptance'
62
63
  summary 'Runs acceptance tests'
@@ -7,7 +7,7 @@ class Onceover
7
7
  class CLI
8
8
  class Show
9
9
  def self.command
10
- @cmd ||= Cri::Command.define do
10
+ @command ||= Cri::Command.define do
11
11
  name 'show'
12
12
  usage 'show [controlrepo|puppetfile]'
13
13
  summary 'Shows the current state of things'
@@ -25,7 +25,7 @@ Shows the state of either the controlrepo or the Puppetfile
25
25
 
26
26
  class Repo
27
27
  def self.command
28
- @cmd ||= Cri::Command.define do
28
+ @command ||= Cri::Command.define do
29
29
  name 'repo'
30
30
  usage 'repo [options]'
31
31
  summary 'Shows the current state of the Controlrepo'
@@ -50,7 +50,7 @@ Useful for debugging.
50
50
 
51
51
  class Puppetfile
52
52
  def self.command
53
- @cmd ||= Cri::Command.define do
53
+ @command ||= Cri::Command.define do
54
54
  name 'puppetfile'
55
55
  usage 'puppetfile [options]'
56
56
  summary 'Shows the current state of the puppetfile'
@@ -7,7 +7,7 @@ class Onceover
7
7
  class CLI
8
8
  class Update
9
9
  def self.command
10
- @cmd ||= Cri::Command.define do
10
+ @command ||= Cri::Command.define do
11
11
  name 'update'
12
12
  usage 'update puppetfile'
13
13
  summary 'Updates stuff, currently only the Puppetfile'
@@ -22,7 +22,7 @@ class Onceover
22
22
 
23
23
  class Puppetfile
24
24
  def self.command
25
- @cmd ||= Cri::Command.define do
25
+ @command ||= Cri::Command.define do
26
26
  name 'puppetfile'
27
27
  usage 'puppetfile'
28
28
  summary 'Update all modules in the Puppetfile'
@@ -3,7 +3,6 @@ require 'erb'
3
3
  require 'yaml'
4
4
  require 'find'
5
5
  require 'pathname'
6
- require 'thread'
7
6
  require 'multi_json'
8
7
  require 'onceover/beaker'
9
8
  require 'onceover/logger'
@@ -115,7 +114,7 @@ class Onceover
115
114
  @environment_conf = opts[:environment_conf] || File.expand_path('./environment.conf', @root)
116
115
  @spec_dir = opts[:spec_dir] || File.expand_path('./spec', @root)
117
116
  @facts_dir = opts[:facts_dir] || File.expand_path('factsets', @spec_dir)
118
- _facts_dirs = [@facts_dir, File.expand_path('../../../factsets', __FILE__)]
117
+ _facts_dirs = [@facts_dir, File.expand_path('../../factsets', __dir__)]
119
118
  _facts_files = opts[:facts_files] || _facts_dirs.map{|d| File.join(d, '*.json')}
120
119
  @facts_files = _facts_files.map{|_path| Dir[_path]}.flatten
121
120
 
@@ -134,7 +133,7 @@ class Onceover
134
133
  def to_s
135
134
  require 'colored'
136
135
 
137
- <<-END.gsub(/^\s{4}/,'')
136
+ <<-REPO.gsub(/^\s{4}/,'')
138
137
  #{'puppetfile'.green} #{@puppetfile}
139
138
  #{'environment_conf'.green} #{@environment_conf}
140
139
  #{'facts_dir'.green} #{@facts_dir}
@@ -144,7 +143,7 @@ class Onceover
144
143
  #{'roles'.green} #{roles}
145
144
  #{'profiles'.green} #{profiles}
146
145
  #{'onceover.yaml'.green} #{@onceover_yaml}
147
- END
146
+ REPO
148
147
  end
149
148
 
150
149
  def roles
@@ -190,6 +189,7 @@ class Onceover
190
189
  if filter
191
190
  # Allow us to pass a hash of facts to filter by
192
191
  raise "Filter param must be a hash" unless filter.is_a?(Hash)
192
+
193
193
  all_facts.keep_if do |hash|
194
194
  matches = []
195
195
  filter.each do |filter_fact,value|
@@ -254,13 +254,15 @@ class Onceover
254
254
 
255
255
  threads.map(&:join)
256
256
 
257
- tp output_array,
257
+ tp(
258
+ output_array,
258
259
  {:full_name => {:display_name => "Full Name"}},
259
260
  {:current_version => {:display_name => "Current Version"}},
260
261
  {:latest_version => {:display_name => "Latest Version"}},
261
262
  {:out_of_date => {:display_name => "Out of Date?"}},
262
263
  {:endorsement => {:display_name => "Endorsement"}},
263
264
  {:superseded_by => {:display_name => "Superseded by"}}
265
+ )
264
266
  end
265
267
 
266
268
  def update_puppetfile
@@ -305,6 +307,7 @@ class Onceover
305
307
  # Load up the Puppetfile using R10k
306
308
  puppetfile = R10K::Puppetfile.new(@root)
307
309
  fail 'Could not load Puppetfile' unless puppetfile.load
310
+
308
311
  modules = puppetfile.modules
309
312
 
310
313
  # Iterate over everything and seperate it out for the sake of readability
@@ -395,6 +398,7 @@ class Onceover
395
398
  possibe_datadirs = Dir["#{@root}/*/"]
396
399
  possibe_datadirs.keep_if { |dir| dir =~ /hiera(?:.*data)?/i }
397
400
  raise "There were too many directories that looked like hiera data: #{possibe_datadirs}" if possibe_datadirs.count > 1
401
+
398
402
  File.expand_path(possibe_datadirs[0])
399
403
  end
400
404
 
@@ -417,7 +421,7 @@ class Onceover
417
421
  # Finally, split the modulepath values and return
418
422
  begin
419
423
  environment_config['modulepath'] = environment_config['modulepath'].split(':')
420
- rescue
424
+ rescue StandardError
421
425
  raise "modulepath was not found in environment.conf, don't know where to look for roles & profiles"
422
426
  end
423
427
 
@@ -118,8 +118,10 @@ class Onceover
118
118
  prod_dir = "#{repo.tempdir}/#{repo.environmentpath}/production"
119
119
  Dir.chdir(prod_dir) do
120
120
  install_cmd = []
121
- install_cmd << "r10k puppetfile install --verbose --color --puppetfile #{repo.puppetfile}"
121
+ install_cmd << "r10k puppetfile install --color --puppetfile #{repo.puppetfile}"
122
122
  install_cmd << "--force" if force
123
+ install_cmd << "--config #{repo.r10k_config_file}" if repo.r10k_config_file
124
+ install_cmd << (logger.level > 0 ? "--verbose" : "--verbose debug") # Enable debugging if we're debugging
123
125
  install_cmd = install_cmd.join(' ')
124
126
  logger.debug "Running #{install_cmd} from #{prod_dir}"
125
127
  system(install_cmd)
@@ -71,7 +71,7 @@ class Onceover
71
71
  else
72
72
  return false
73
73
  end
74
- rescue
74
+ rescue StandardErroor
75
75
  return false
76
76
  end
77
77
  end
@@ -4,7 +4,8 @@ module Onceover::Logger
4
4
  def logger
5
5
  unless $logger
6
6
  # here we setup a color scheme called 'bright'
7
- Logging.color_scheme('bright',
7
+ Logging.color_scheme(
8
+ 'bright',
8
9
  :levels => {
9
10
  :debug => :cyan,
10
11
  :info => :green,
@@ -8,9 +8,10 @@ require 'pathname'
8
8
  desc 'Writes a `fixtures.yml` file based on the Puppetfile'
9
9
  task :generate_fixtures do
10
10
  repo = Onceover::Controlrepo.new
11
- if File.exists?(File.expand_path('./.fixtures.yml', repo.root))
11
+ if File.exist?(File.expand_path('./.fixtures.yml', repo.root))
12
12
  raise ".fixtures.yml already exits, we won't overwrite because we are scared"
13
13
  end
14
+
14
15
  File.write(File.expand_path('./.fixtures.yml', repo.root), repo.fixtures)
15
16
  end
16
17
 
@@ -2,8 +2,14 @@ require 'rspec'
2
2
  require 'pathname'
3
3
 
4
4
  class OnceoverFormatter
5
- RSpec::Core::Formatters.register self, :example_group_started,
6
- :example_passed, :example_failed, :example_pending, :dump_failures#, :dump_summary
5
+ RSpec::Core::Formatters.register(
6
+ self,
7
+ :example_group_started,
8
+ :example_passed,
9
+ :example_failed,
10
+ :example_pending,
11
+ :dump_failures,
12
+ )
7
13
 
8
14
  COMPILATION_ERROR = %r{error during compilation: (?<error>.*)}
9
15
  ERROR_WITH_LOCATION = %r{(?<error>.*?)\s(at )?(\((file: (?<file>.*?), )?line: (?<line>\d+)(, column: (?<column>\d+))?\))(; )?}
@@ -218,8 +224,14 @@ end
218
224
  class OnceoverFormatterParallel < OnceoverFormatter
219
225
  require 'yaml'
220
226
 
221
- RSpec::Core::Formatters.register self, :example_group_started,
222
- :example_passed, :example_failed, :example_pending, :dump_failures
227
+ RSpec::Core::Formatters.register(
228
+ self,
229
+ :example_group_started,
230
+ :example_passed,
231
+ :example_failed,
232
+ :example_pending,
233
+ :dump_failures,
234
+ )
223
235
 
224
236
  def example_group_started notification
225
237
  # Do nothing
@@ -287,7 +299,7 @@ class FailureCollector
287
299
  end
288
300
 
289
301
  def dump_failures(failures)
290
- open(File.expand_path("#{RSpec.configuration.onceover_tempdir}/failures.out"), 'a') { |f|
302
+ File.open(File.expand_path("#{RSpec.configuration.onceover_tempdir}/failures.out"), 'a') { |f|
291
303
  failures.failed_examples.each do |fe|
292
304
  f.puts
293
305
  f.puts "#{fe.metadata[:description]}"
@@ -53,8 +53,10 @@ class Onceover
53
53
  @config.acceptance_tests.each { |test| @config.verify_acceptance_test(@repo, test) }
54
54
 
55
55
  # Write them out
56
- @config.write_acceptance_tests("#{@repo.tempdir}/spec/acceptance",
57
- @config.run_filters(Onceover::Test.deduplicate(@config.acceptance_tests)))
56
+ @config.write_acceptance_tests(
57
+ "#{@repo.tempdir}/spec/acceptance",
58
+ @config.run_filters(Onceover::Test.deduplicate(@config.acceptance_tests))
59
+ )
58
60
  end
59
61
 
60
62
  # Parse the current hiera config, modify, and write it to the temp dir
@@ -85,10 +87,11 @@ class Onceover
85
87
  #`bin/rake spec_standalone`
86
88
  if @config.opts[:parallel]
87
89
  logger.debug "Running #{@command_prefix}rake parallel_spec from #{@repo.tempdir}"
88
- result = Backticks::Runner.new(interactive:true).run(@command_prefix.strip.split, 'rake', 'parallel_spec').join
90
+ result = run_command(@command_prefix.strip.split, 'rake', 'parallel_spec')
89
91
  else
92
+ require 'io/console'
90
93
  logger.debug "Running #{@command_prefix}rake spec_standalone from #{@repo.tempdir}"
91
- result = Backticks::Runner.new(interactive:true).run(@command_prefix.strip.split, 'rake', 'spec_standalone').join
94
+ result = run_command(@command_prefix.strip.split, 'rake', 'spec_standalone')
92
95
  end
93
96
 
94
97
  # Reset env to previous state if we modified it
@@ -115,11 +118,20 @@ class Onceover
115
118
  #`bundle install --binstubs`
116
119
  #`bin/rake spec_standalone`
117
120
  logger.debug "Running #{@command_prefix}rake acceptance from #{@repo.tempdir}"
118
- result = Backticks::Runner.new(interactive:true).run(@command_prefix.strip.split, 'rake', 'acceptance').join
121
+ result = run_command(@command_prefix.strip.split, 'rake', 'acceptance')
119
122
  end
120
123
 
121
124
  # Finally exit and preserve the exit code
122
125
  exit result.status.exitstatus
123
126
  end
127
+
128
+ def run_command(*args)
129
+ begin
130
+ STDERR.raw! if STDERR.isatty
131
+ result = Backticks::Runner.new(interactive: true).run(args.flatten).join
132
+ ensure
133
+ STDERR.cooked! if STDERR.isatty
134
+ end
135
+ end
124
136
  end
125
137
  end
@@ -47,15 +47,15 @@ class Onceover
47
47
  @acceptance_tests = []
48
48
  @opts = opts
49
49
  @mock_functions = config['functions']
50
- @before_conditions = config['before']
50
+ @before_conditions = config['before'] || []
51
51
  @after_conditions = config['after']
52
52
  @strict_variables = opts[:strict_variables] ? 'yes' : 'no'
53
53
 
54
54
  # Set dynamic defaults for format
55
- if opts[:format] == [:defaults]
55
+ if Array(opts[:format]) == [:defaults]
56
56
  @formatters = opts[:parallel] ? ['OnceoverFormatterParallel'] : ['OnceoverFormatter']
57
57
  else
58
- @formatters = opts[:format]
58
+ @formatters = Array(opts[:format])
59
59
  end
60
60
 
61
61
  # Initialise all of the classes and nodes
@@ -104,12 +104,12 @@ class Onceover
104
104
  def to_s
105
105
  require 'colored'
106
106
 
107
- <<-END.gsub(/^\s{4}/,'')
107
+ <<-TESTCONF.gsub(/^\s{4}/,'')
108
108
  #{'classes'.green} #{@classes.map{|c|c.name}}
109
109
  #{'nodes'.green} #{@nodes.map{|n|n.name}}
110
110
  #{'class_groups'.green} #{@class_groups}
111
111
  #{'node_groups'.green} #{@node_groups.map{|g|g.name}}
112
- END
112
+ TESTCONF
113
113
  end
114
114
 
115
115
  def self.find_list(thing)
@@ -177,30 +177,38 @@ class Onceover
177
177
  puppetcode << File.read(condition_file)
178
178
  end
179
179
  return nil if puppetcode.count.zero?
180
+
180
181
  puppetcode.join("\n")
181
182
  end
182
183
 
183
184
  def write_spec_test(location, test)
184
185
  # Use an ERB template to write a spec test
185
- File.write("#{location}/#{test.to_s}_spec.rb",
186
- Onceover::Controlrepo.evaluate_template('test_spec.rb.erb', binding))
186
+ File.write(
187
+ "#{location}/#{test.to_s}_spec.rb",
188
+ Onceover::Controlrepo.evaluate_template('test_spec.rb.erb', binding)
189
+ )
187
190
  end
188
191
 
189
192
  def write_acceptance_tests(location, tests)
190
193
  warn "[DEPRECATION] #{__method__} is deprecated due to the removal of Beaker"
191
194
 
192
- File.write("#{location}/acceptance_spec.rb",
195
+ File.write(
196
+ "#{location}/acceptance_spec.rb",
193
197
  Onceover::Controlrepo.evaluate_template('acceptance_test_spec.rb.erb', binding))
194
198
  end
195
199
 
196
200
  def write_spec_helper_acceptance(location, repo)
197
- File.write("#{location}/spec_helper_acceptance.rb",
198
- Onceover::Controlrepo.evaluate_template('spec_helper_acceptance.rb.erb', binding))
201
+ File.write(
202
+ "#{location}/spec_helper_acceptance.rb",
203
+ Onceover::Controlrepo.evaluate_template('spec_helper_acceptance.rb.erb', binding)
204
+ )
199
205
  end
200
206
 
201
207
  def write_rakefile(location, pattern)
202
- File.write("#{location}/Rakefile",
203
- Onceover::Controlrepo.evaluate_template('testconfig_Rakefile.erb', binding))
208
+ File.write(
209
+ "#{location}/Rakefile",
210
+ Onceover::Controlrepo.evaluate_template('testconfig_Rakefile.erb', binding)
211
+ )
204
212
  end
205
213
 
206
214
  def write_spec_helper(location, repo)
@@ -222,8 +230,10 @@ class Onceover
222
230
  repo.temp_modulepath = modulepath
223
231
 
224
232
  # Use an ERB template to write a spec test
225
- File.write("#{location}/spec_helper.rb",
226
- Onceover::Controlrepo.evaluate_template('spec_helper.rb.erb', binding))
233
+ File.write(
234
+ "#{location}/spec_helper.rb",
235
+ Onceover::Controlrepo.evaluate_template('spec_helper.rb.erb', binding)
236
+ )
227
237
  end
228
238
 
229
239
  def create_fixtures_symlinks(repo)