chicken_soup 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
data/chicken_soup.gemspec CHANGED
@@ -15,8 +15,8 @@ Gem::Specification.new do |s|
15
15
  s.email = 'support@thekompanee.com'
16
16
  s.homepage = 'http://github.com/jfelchner/chicken_soup'
17
17
 
18
- s.summary = "chicken_soup-#{ChickenSoup::VERSION}"
19
- s.description = %q[...for the Deployment Soul. Why do you keep typing all that crap into your Capistrano recipes? Are you too cool for standards? Well, ARE YA!?]
18
+ s.summary = "...for the Deployment Soul."
19
+ s.description = %q[Why do you keep typing all that crap into your Capistrano recipes? Are you too cool for standards? Well, ARE YA!?]
20
20
 
21
21
  s.rdoc_options = ["--charset = UTF-8"]
22
22
  s.extra_rdoc_files = %w[README.md LICENSE]
@@ -6,7 +6,7 @@ Capistrano::Configuration.instance(:must_exist).load do
6
6
 
7
7
  namespace :website do
8
8
  desc "Creates the site configuration for the files."
9
- task :create do
9
+ task :create, :roles => :web do
10
10
  abort "Sorry, auto-installing sites is not supported on your version of Apache." unless exists?(:apache_disable_script)
11
11
 
12
12
  virtual_host_config = <<-VHOST
@@ -59,7 +59,7 @@ Capistrano::Configuration.instance(:must_exist).load do
59
59
  end
60
60
 
61
61
  desc "Completely removes the site configuration from the server (but leaves the files.)"
62
- task :remove do
62
+ task :remove, :roles => :web do
63
63
  abort "Sorry, auto-removing sites is not supported on your version of Apache." unless exists?(:apache_disable_script)
64
64
 
65
65
  run "#{sudo} rm /etc/apache2/sites-available/#{deploy_site_name}"
@@ -67,7 +67,7 @@ Capistrano::Configuration.instance(:must_exist).load do
67
67
  end
68
68
 
69
69
  desc "Enable Site"
70
- task :enable do
70
+ task :enable, :roles => :web do
71
71
  abort "Sorry, auto-enabling sites is not supported on your version of Apache." unless exists?(:apache_enable_script)
72
72
 
73
73
  run "#{sudo} #{apache_enable_script} #{deploy_site_name}"
@@ -75,7 +75,7 @@ Capistrano::Configuration.instance(:must_exist).load do
75
75
  end
76
76
 
77
77
  desc "Disable Site"
78
- task :disable do
78
+ task :disable, :roles => :web do
79
79
  abort "Sorry, auto-disabling sites is not supported on your version of Apache." unless exists?(:apache_disable_script)
80
80
 
81
81
  run "#{sudo} #{apache_disable_script} #{deploy_site_name}"
@@ -8,12 +8,12 @@ Capistrano::Configuration.instance(:must_exist).load do
8
8
 
9
9
  namespace :gems do
10
10
  desc "Install Bundled Gems"
11
- task :install do
11
+ task :install, :roles => :app do
12
12
  run "cd #{latest_release} && bundle install --gemfile #{latest_release}/Gemfile --path #{shared_path}/bundle --deployment --quiet --without development test"
13
13
  end
14
14
 
15
15
  desc "Update Bundled Gems"
16
- task :update do
16
+ task :update, :roles => :app do
17
17
  abort "I'm sorry Dave, but I can't let you do that. I have full control over production." if rails_env == 'production'
18
18
 
19
19
  run "cd #{latest_release} && bundle update"
@@ -22,7 +22,7 @@ Capistrano::Configuration.instance(:must_exist).load do
22
22
 
23
23
  namespace :bundler do
24
24
  desc "Install Bundler"
25
- task :install do
25
+ task :install, :roles => :app do
26
26
  bundler_install_command = "gem install bundler --version #{gem_packager_version} --no-ri --no-rdoc && gem cleanup bundler"
27
27
 
28
28
  if fetch(:capabilities).include? :rvm
@@ -15,7 +15,7 @@ Capistrano::Configuration.instance(:must_exist).load do
15
15
  variable.
16
16
  * The DB user will be granted all privileges on the DB.
17
17
  DESC
18
- task :create do
18
+ task :create, :roles => :db do
19
19
  create_script = <<-CREATESCRIPT
20
20
  create database #{application_underscored} character set utf8;
21
21
  create user '#{application_underscored}'@'localhost' identified by '#{db_app_password}';
@@ -34,7 +34,7 @@ Capistrano::Configuration.instance(:must_exist).load do
34
34
  * The script is executed as `root` and as such, the user will be prompted
35
35
  for `root`'s password.
36
36
  DESC
37
- task :drop do
37
+ task :drop, :roles => :db do
38
38
  drop_script = <<-DROPSCRIPT
39
39
  drop user #{application_underscored}@localhost;
40
40
  drop database #{application_underscored};
@@ -6,16 +6,24 @@ Capistrano::Configuration.instance(:must_exist).load do
6
6
 
7
7
  namespace :website do
8
8
  desc "Creates the site configuration for the files."
9
- task :create do
9
+ task :create, :roles => :web do
10
10
  abort "Sorry, auto-installing sites is not supported on your installation of Nginx." unless exists?(:nginx_disable_script)
11
11
 
12
- passenger_friendly_error_messages = rails_env == :production ? "off" : "on"
12
+ passenger_friendly_error_pages = rails_env == :production ? "off" : "on"
13
13
 
14
14
  virtual_host_config = <<-VHOST
15
15
  server {
16
+ ###
17
+ # Server Details
18
+ #
16
19
  listen #{web_server_ip}:443;
17
- server_name #{deploy_site_name} *.#{deploy_site_name};
20
+ server_name .#{deploy_site_name};
18
21
 
22
+ root #{deploy_to}/current/public;
23
+
24
+ ###
25
+ # Passenger and Rails
26
+ #
19
27
  passenger_enabled on;
20
28
  passenger_friendly_error_pages #{passenger_friendly_error_pages};
21
29
  passenger_min_instances 4;
@@ -23,39 +31,58 @@ Capistrano::Configuration.instance(:must_exist).load do
23
31
  rails_env #{rails_env};
24
32
  rack_env #{rails_env};
25
33
 
34
+ ###
35
+ # Performance and Security
36
+ #
37
+ client_max_body_size 3M;
38
+
39
+ location ~ /\. { deny all; } # This will deny access to any hidden file (beginning with a period)
40
+
41
+ ###
42
+ # SSL
43
+ #
26
44
  ssl on;
27
45
  ssl_certificate /etc/nginx/ssl/#{domain}.crt;
28
46
  ssl_certificate_key /etc/nginx/ssl/#{domain}.key;
29
47
 
30
48
  ssl_session_timeout 5m;
31
49
 
50
+ ssl_protocols SSLv3 TLSv1;
32
51
  ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
33
52
  ssl_prefer_server_ciphers on;
34
53
 
35
- root #{deploy_to}/current/public;
36
-
37
- client_max_body_size 3M;
38
-
54
+ ###
55
+ # Logs
56
+ #
39
57
  access_log /var/log/nginx/#{application}.access.log main;
40
58
  error_log /var/log/nginx/#{application}.error.log warn;
41
59
 
42
- error_page 500 501 504 505 506 507 508 509 /500.html;
43
- error_page 400 401 403 404 405 406 407 409 410 413 415 416 417 /404.html;
44
- error_page 422 444 /422.html;
45
- error_page 502 503 /public/maintenance.html;
60
+ ###
61
+ # Handle Errors
62
+ #
63
+ recursive_error_pages on;
46
64
 
47
- location / {
48
- try_files /system/maintenance.html $request_uri;
65
+ error_page 500 502 504 /500.html;
66
+ error_page 400 /404.html;
67
+ error_page 422 /422.html;
68
+ error_page 503 @503;
69
+
70
+ if (-f $document_root/system/maintenance.html) {
71
+ return 503;
72
+ }
73
+
74
+ location @503 {
75
+ error_page 405 = $document_root/system/maintenance.html;
76
+
77
+ rewrite ^(.*)$ /system/maintenance.html break;
49
78
  }
50
79
  }
51
80
 
52
81
  server {
53
82
  listen #{web_server_ip}:80;
54
- server_name #{deploy_site_name} *.#{deploy_site_name};
83
+ server_name .#{deploy_site_name};
55
84
 
56
- location / {
57
- rewrite ^ https://$http_host$request_uri? permanent
58
- }
85
+ rewrite ^ https://$http_host$request_uri? permanent
59
86
  }
60
87
  VHOST
61
88
 
@@ -65,7 +92,7 @@ Capistrano::Configuration.instance(:must_exist).load do
65
92
  end
66
93
 
67
94
  desc "Completely removes the site configuration from the server (but leaves the files.)"
68
- task :remove do
95
+ task :remove, :roles => :web do
69
96
  abort "Sorry, auto-removing sites is not supported on your installation of Nginx." unless exists?(:nginx_disable_script)
70
97
 
71
98
  run "#{sudo} rm /etc/nginx/sites-available/#{deploy_site_name}"
@@ -73,12 +100,12 @@ Capistrano::Configuration.instance(:must_exist).load do
73
100
  end
74
101
 
75
102
  desc "Enable Site"
76
- task :enable do
103
+ task :enable, :roles => :web do
77
104
  abort "Sorry, auto-enabling sites is not supported on your installation of Nginx." unless exists?(:nginx_enable_script)
78
105
  end
79
106
 
80
107
  desc "Disable Site"
81
- task :disable do
108
+ task :disable, :roles => :web do
82
109
  abort "Sorry, auto-disabling sites is not supported on your installation of Nginx." unless exists?(:nginx_disable_script)
83
110
  end
84
111
  end
@@ -8,14 +8,14 @@ Capistrano::Configuration.instance(:must_exist).load do
8
8
 
9
9
  This task does nothing.
10
10
  DESC
11
- task :start do ; end
11
+ task :start, :roles => :app do ; end
12
12
 
13
13
  desc <<-DESC
14
14
  There is no way to stop the application via Passenger.
15
15
 
16
16
  This task does nothing.
17
17
  DESC
18
- task :stop do ; end
18
+ task :stop, :roles => :app do ; end
19
19
 
20
20
  desc <<-DESC
21
21
  Starts/Restarts the application.
@@ -24,7 +24,7 @@ Capistrano::Configuration.instance(:must_exist).load do
24
24
  directory called `restart.txt`. If the Last Access time for `restart.txt`
25
25
  changes, Passenger restarts the app.
26
26
  DESC
27
- task :restart, :except => { :no_release => true } do
27
+ task :restart, :roles => :app do
28
28
  run "touch #{File.join( current_path, 'tmp', 'restart.txt' )}"
29
29
  end
30
30
  end
@@ -22,12 +22,12 @@ Capistrano::Configuration.instance(:must_exist).load do
22
22
  * After export, each file is zipped up using a bzip2 compression format.
23
23
  DESC
24
24
  namespace :backup do
25
- task :default do
25
+ task :default, :roles => :db, :only => {:primary => true} do
26
26
  run "cd #{current_path} && BACKUP_DIRECTORY=#{shared_path}/db_backups #{rake} db:backup"
27
27
  end
28
28
 
29
29
  desc "[internal] Used to check to see if the db:backup task exists on the server."
30
- task :check do
30
+ task :check, :roles => :db do
31
31
  backup_task_exists = capture("cd #{current_path} && #{rake} -T | grep db:backup | wc -l").chomp
32
32
  abort("There must be a task named db:backup in order to deploy. If you do not want to backup your DB during deployments, set the skip_backup_before_migration variable to true in your deploy.rb.") if backup_task_exists == '0'
33
33
 
@@ -45,7 +45,7 @@ Capistrano::Configuration.instance(:must_exist).load do
45
45
  to run this in production, you'll need to log into the server and
46
46
  run the rake task manually or use Capistrano's `console` task.
47
47
  DESC
48
- task :reset_and_seed do
48
+ task :reset_and_seed, :roles => :db do
49
49
  abort "I'm sorry Dave, but I can't let you do that. I have full control over production." if rails_env == 'production'
50
50
  db.backup
51
51
  run "cd #{current_path} && #{rake} db:reset_and_seed"
@@ -62,7 +62,7 @@ Capistrano::Configuration.instance(:must_exist).load do
62
62
  to run this in production, you'll need to log into the server and
63
63
  run the rake task manually or use Capistrano's `console` task.
64
64
  DESC
65
- task :seed do
65
+ task :seed, :roles => :db do
66
66
  abort "I'm sorry Dave, but I can't let you do that. I have full control over production." if rails_env == 'production'
67
67
  db.backup
68
68
  run "cd #{current_path} && #{rake} db:seed"
@@ -20,14 +20,14 @@ Capistrano::Configuration.instance(:must_exist).load do
20
20
  desc <<-DESC
21
21
  Enables the website's application by removing the maintenance page.
22
22
  DESC
23
- task :enable do
23
+ task :enable, :roles => :web do
24
24
  website.maintenance_mode.disable
25
25
  end
26
26
 
27
27
  desc <<-DESC
28
28
  Disables the website's application by installing the maintenance page.
29
29
  DESC
30
- task :disable do
30
+ task :disable, :roles => :web do
31
31
  website.maintenance_mode.enable
32
32
  end
33
33
  end
@@ -41,7 +41,7 @@ Capistrano::Configuration.instance(:must_exist).load do
41
41
  web servers are configured correctly) will make your application \
42
42
  web-accessible again.
43
43
  DESC
44
- task :disable, :except => { :no_release => true } do
44
+ task :disable, :roles => :web do
45
45
  run "rm #{shared_path}/system/maintenance.html"
46
46
  end
47
47
 
@@ -61,7 +61,7 @@ Capistrano::Configuration.instance(:must_exist).load do
61
61
 
62
62
  Further customization will require that you write your own task.
63
63
  DESC
64
- task :enable, :except => { :no_release => true } do
64
+ task :enable, :roles => :web do
65
65
  on_rollback { rm "#{shared_path}/system/maintenance.html" }
66
66
 
67
67
  require 'erb'
@@ -77,22 +77,22 @@ Capistrano::Configuration.instance(:must_exist).load do
77
77
 
78
78
  namespace :web_server do
79
79
  desc "Stop the web server"
80
- task :stop do
80
+ task :stop, :roles => :web do
81
81
  run "#{sudo} #{web_server_control_script} stop"
82
82
  end
83
83
 
84
84
  desc "Start the web server"
85
- task :start do
85
+ task :start, :roles => :web do
86
86
  run "#{sudo} #{web_server_control_script} start"
87
87
  end
88
88
 
89
89
  desc "Restart the web server"
90
- task :restart do
90
+ task :restart, :roles => :web do
91
91
  run "#{sudo} #{web_server_control_script} restart"
92
92
  end
93
93
 
94
94
  desc "Reloads the web server configuration"
95
- task :reload do
95
+ task :reload, :roles => :web do
96
96
  run "#{sudo} #{web_server_control_script} reload"
97
97
  end
98
98
  end
@@ -21,9 +21,9 @@ Capistrano::Configuration.instance(:must_exist).load do
21
21
  :app_server_ip,
22
22
  :web_server_ip,
23
23
  :db_server_ip,
24
- :web_server_name,
25
- :app_server_name,
26
- :db_server_name
24
+ :web_servers,
25
+ :app_servers,
26
+ :db_servers
27
27
  ]
28
28
 
29
29
  verify_variables(required_variables)
@@ -23,9 +23,9 @@ Capistrano::Configuration.instance(:must_exist).load do
23
23
 
24
24
  _cset :default_server_name, domain
25
25
 
26
- _cset(:app_server_name) { default_server_name }
27
- _cset(:web_server_name) { default_server_name }
28
- _cset(:db_server_name) { default_server_name }
26
+ _cset(:app_servers) { default_server_name }
27
+ _cset(:web_servers) { default_server_name }
28
+ _cset(:db_servers) { default_server_name }
29
29
 
30
30
  # Evidently roles can't be assigned in a namespace :-/
31
31
  set_unix_server_roles
@@ -35,8 +35,8 @@ Capistrano::Configuration.instance(:must_exist).load do
35
35
 
36
36
  desc "[internal] This task is only here because `role` cannot be used within a `namespace`"
37
37
  task :set_unix_server_roles do
38
- role :web, web_server_name, :primary => true
39
- role :app, app_server_name, :primary => true
40
- role :db, db_server_name, :primary => true
38
+ role :web, web_servers
39
+ role :app, app_servers
40
+ role :db, db_servers, :primary => true
41
41
  end
42
42
  end
@@ -30,7 +30,7 @@ Capistrano::Configuration.instance(:must_exist).load do
30
30
 
31
31
  Note: This task will also work for setting up shared directories for user uploads, etc.
32
32
  DESC
33
- task :setup do
33
+ task :setup, :roles => :app do
34
34
  global_shared_elements.each do |shared_file|
35
35
  base_dir_of_shared_file = shared_file.match(%r{/?((?:.*)/)})[1]
36
36
  run "mkdir -p '#{shared_path}/#{base_dir_of_shared_file}'"
@@ -38,12 +38,13 @@ Capistrano::Configuration.instance(:must_exist).load do
38
38
  remote_shared_file = "#{shared_path}/#{shared_file}"
39
39
  local_shared_file = "#{Dir.pwd}/#{shared_file}"
40
40
  local_environment_specific_file = "#{local_shared_file}.#{rails_env}"
41
+ permissions = File.directory? local_shared_file ? "755" : "600"
41
42
 
42
43
  if File.exists?(local_environment_specific_file)
43
- top.upload(local_environment_specific_file, remote_shared_file, :mode => "600")
44
+ top.upload(local_environment_specific_file, remote_shared_file, :mode => permissions)
44
45
  elsif !remote_file_exists?(remote_shared_file)
45
46
  if File.exists?(local_shared_file)
46
- top.upload(local_shared_file, remote_shared_file, :mode => "600")
47
+ top.upload(local_shared_file, remote_shared_file, :mode => permissions)
47
48
  else
48
49
  abort "I'm sorry Dave, but I couldn't find a local file or directory at '#{local_shared_file}' or '#{local_environment_specific_file}'"
49
50
  end
@@ -56,7 +57,7 @@ Capistrano::Configuration.instance(:must_exist).load do
56
57
 
57
58
  By default, these live in the shared directory that Capistrano sets up.
58
59
  DESC
59
- task :symlink do
60
+ task :symlink, :roles => :app do
60
61
  global_shared_elements.each do |shared_file|
61
62
  run "ln -nfs #{shared_path}/#{shared_file} #{latest_release}/#{shared_file}"
62
63
  end
@@ -1,3 +1,3 @@
1
1
  module ChickenSoup
2
- VERSION = "0.3.0"
2
+ VERSION = "0.4.0"
3
3
  end
metadata CHANGED
@@ -1,84 +1,82 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: chicken_soup
3
- version: !ruby/object:Gem::Version
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.4.0
4
5
  prerelease:
5
- version: 0.3.0
6
6
  platform: ruby
7
- authors:
7
+ authors:
8
8
  - thekompanee
9
9
  - jfelchner
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
-
14
- date: 2011-06-15 00:00:00 -05:00
13
+ date: 2011-07-18 00:00:00.000000000 -05:00
15
14
  default_executable:
16
- dependencies:
17
- - !ruby/object:Gem::Dependency
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
18
17
  name: capistrano
19
- prerelease: false
20
- requirement: &id001 !ruby/object:Gem::Requirement
18
+ requirement: &2153155400 !ruby/object:Gem::Requirement
21
19
  none: false
22
- requirements:
20
+ requirements:
23
21
  - - ~>
24
- - !ruby/object:Gem::Version
22
+ - !ruby/object:Gem::Version
25
23
  version: 2.6.0
26
24
  type: :runtime
27
- version_requirements: *id001
28
- - !ruby/object:Gem::Dependency
29
- name: mail
30
25
  prerelease: false
31
- requirement: &id002 !ruby/object:Gem::Requirement
26
+ version_requirements: *2153155400
27
+ - !ruby/object:Gem::Dependency
28
+ name: mail
29
+ requirement: &2153154900 !ruby/object:Gem::Requirement
32
30
  none: false
33
- requirements:
31
+ requirements:
34
32
  - - ~>
35
- - !ruby/object:Gem::Version
33
+ - !ruby/object:Gem::Version
36
34
  version: 2.2.15
37
35
  type: :runtime
38
- version_requirements: *id002
39
- - !ruby/object:Gem::Dependency
40
- name: bundler
41
36
  prerelease: false
42
- requirement: &id003 !ruby/object:Gem::Requirement
37
+ version_requirements: *2153154900
38
+ - !ruby/object:Gem::Dependency
39
+ name: bundler
40
+ requirement: &2172657540 !ruby/object:Gem::Requirement
43
41
  none: false
44
- requirements:
42
+ requirements:
45
43
  - - ~>
46
- - !ruby/object:Gem::Version
44
+ - !ruby/object:Gem::Version
47
45
  version: 1.0.10
48
46
  type: :development
49
- version_requirements: *id003
50
- - !ruby/object:Gem::Dependency
51
- name: rspec
52
47
  prerelease: false
53
- requirement: &id004 !ruby/object:Gem::Requirement
48
+ version_requirements: *2172657540
49
+ - !ruby/object:Gem::Dependency
50
+ name: rspec
51
+ requirement: &2172657080 !ruby/object:Gem::Requirement
54
52
  none: false
55
- requirements:
53
+ requirements:
56
54
  - - ~>
57
- - !ruby/object:Gem::Version
55
+ - !ruby/object:Gem::Version
58
56
  version: 2.6.0
59
57
  type: :development
60
- version_requirements: *id004
61
- - !ruby/object:Gem::Dependency
62
- name: yard
63
58
  prerelease: false
64
- requirement: &id005 !ruby/object:Gem::Requirement
59
+ version_requirements: *2172657080
60
+ - !ruby/object:Gem::Dependency
61
+ name: yard
62
+ requirement: &2172656620 !ruby/object:Gem::Requirement
65
63
  none: false
66
- requirements:
64
+ requirements:
67
65
  - - ~>
68
- - !ruby/object:Gem::Version
66
+ - !ruby/object:Gem::Version
69
67
  version: 0.7.1
70
68
  type: :development
71
- version_requirements: *id005
72
- description: ...for the Deployment Soul. Why do you keep typing all that crap into your Capistrano recipes? Are you too cool for standards? Well, ARE YA!?
69
+ prerelease: false
70
+ version_requirements: *2172656620
71
+ description: Why do you keep typing all that crap into your Capistrano recipes? Are
72
+ you too cool for standards? Well, ARE YA!?
73
73
  email: support@thekompanee.com
74
74
  executables: []
75
-
76
75
  extensions: []
77
-
78
- extra_rdoc_files:
76
+ extra_rdoc_files:
79
77
  - README.md
80
78
  - LICENSE
81
- files:
79
+ files:
82
80
  - .gitignore
83
81
  - .rspec
84
82
  - .rvmrc
@@ -145,30 +143,28 @@ files:
145
143
  has_rdoc: true
146
144
  homepage: http://github.com/jfelchner/chicken_soup
147
145
  licenses: []
148
-
149
146
  post_install_message:
150
- rdoc_options:
147
+ rdoc_options:
151
148
  - --charset = UTF-8
152
- require_paths:
149
+ require_paths:
153
150
  - lib
154
- required_ruby_version: !ruby/object:Gem::Requirement
151
+ required_ruby_version: !ruby/object:Gem::Requirement
155
152
  none: false
156
- requirements:
157
- - - ">="
158
- - !ruby/object:Gem::Version
159
- version: "0"
160
- required_rubygems_version: !ruby/object:Gem::Requirement
153
+ requirements:
154
+ - - ! '>='
155
+ - !ruby/object:Gem::Version
156
+ version: '0'
157
+ required_rubygems_version: !ruby/object:Gem::Requirement
161
158
  none: false
162
- requirements:
163
- - - ">="
164
- - !ruby/object:Gem::Version
165
- version: "0"
159
+ requirements:
160
+ - - ! '>='
161
+ - !ruby/object:Gem::Version
162
+ version: '0'
166
163
  requirements: []
167
-
168
164
  rubyforge_project: chicken_soup
169
165
  rubygems_version: 1.6.2
170
166
  signing_key:
171
167
  specification_version: 3
172
- summary: chicken_soup-0.3.0
173
- test_files:
168
+ summary: ! '...for the Deployment Soul.'
169
+ test_files:
174
170
  - spec/support/focused.rb