wordless 0.4.0 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3da29df733fc405d1627fb449aa30b9fc9caf92b
4
- data.tar.gz: 9c5bfd9561d5738dc776c89fc20e81a6687f4905
3
+ metadata.gz: 1f22b77e330965f615984ee5c3be29046326bf6e
4
+ data.tar.gz: ab9e5f45f3cebe1001c0bea379908643b9c89a00
5
5
  SHA512:
6
- metadata.gz: d649552b3e245354cfd89d4e985929fe055bd457ec10be01091137b0006a0aa65fd8212a0578319dc2e2b7adfa544b57e8b65c0c49e4ad956fcee55d8caf1ce2
7
- data.tar.gz: d3e7a3c362182c41b3ba2d7b7772be481e689daf7cc4627eee79a85e5b93c5304c8a804745433059d525ab10a06983a37106ffe735d50cb7d21454ea2104bfb5
6
+ metadata.gz: 7adeb159e0616070e27504d02f16cc7c3922c437bfa5fb26e84adc2859b07326fc4457d1107f7a500a5c7a220c5ced15fc0ce3d2a0d18a8cd8a812562f8fd758
7
+ data.tar.gz: dcde2ab35695d7766e628ac9b18c366fc37ae6da4ef32aace5e005a4e085c6e2461c989955e518f35c11f1c3235ce81bf6bacdd70b204905891c109e5903ee1d
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- wordless (0.4.0)
4
+ wordless (0.4.1)
5
5
  activesupport
6
6
  coffee-script
7
7
  compass
data/README.mdown CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  A command line tool to help manage your [Wordless](http://welaika.github.com/wordless/)-based WordPress sites.
4
4
 
5
+ [![Build Status](https://travis-ci.org/welaika/wordless_gem.png?branch=master)](https://travis-ci.org/welaika/wordless_gem)
6
+
5
7
  ## Premise
6
8
 
7
9
  This is a ruby-gem, so we expect you have already installed _ruby_; if it isn't
@@ -95,11 +97,11 @@ deploy_command: 'wordmove push -t'
95
97
  ## Caveats
96
98
 
97
99
  - If you attempt to download a WordPress localization that's outdated, the latest English version will be downloaded instead.
98
- - Only tested on Mac OS X
100
+ - Not tested on Windows
99
101
 
100
102
  ## Running specs
101
103
 
102
- bundle install && ./setup_tests && rspec
104
+ bundle install && ./setup_tests.sh && rspec
103
105
 
104
106
  ## Contributing
105
107
 
@@ -1,3 +1,3 @@
1
1
  module Wordless
2
- VERSION = "0.4.0"
2
+ VERSION = "0.4.1"
3
3
  end
@@ -5,14 +5,56 @@ module Wordless
5
5
  include WordPressTools::CLIHelper
6
6
  attr_reader :options, :thor
7
7
 
8
+ module PATH
9
+ WORDFILE = :wordfile
10
+ WP_CONTENT = :wp_content
11
+ PLUGINS = :plugins
12
+ THEMES = :themes
13
+ end
14
+
15
+ DEFAULT_PATHS = {
16
+ PATH::WORDFILE => 'Wordfile',
17
+ PATH::WP_CONTENT => 'wp-content',
18
+ PATH::PLUGINS => 'wp-content/plugins',
19
+ PATH::THEMES => 'wp-content/themes',
20
+ }
21
+
22
+ DEFAULT_PATHS.each do |type, value|
23
+ define_method "#{type}_path" do
24
+ value
25
+ end
26
+ end
27
+
8
28
  def lib_dir
9
29
  @@lib_dir ||= File.expand_path(File.dirname(__FILE__))
10
30
  end
11
31
 
32
+ def wordpress_dir(current_dir = start_dir)
33
+ @wordpress_dir ||= (
34
+ current_dir = File.expand_path(current_dir)
35
+
36
+ if File.exists? File.join(current_dir, wp_content_path)
37
+ current_dir
38
+ elsif last_dir?(current_dir)
39
+ raise StandardError, "Could not find a valid Wordpress directory"
40
+ else
41
+ wordpress_dir(upper_dir(current_dir))
42
+ end
43
+ )
44
+ end
45
+
46
+ def last_dir?(directory)
47
+ directory == "/"
48
+ end
49
+
50
+ def upper_dir(directory)
51
+ File.join(directory, '..')
52
+ end
53
+
12
54
  def config
13
55
  @@config ||= (
14
- if File.exists?('Wordfile')
15
- YAML::load(File.open('Wordfile')).symbolize_keys
56
+ if File.exists?(wordfile_path)
57
+ YAML::load(File.open(wordfile_path)).symbolize_keys
16
58
  else
17
59
  {}
18
60
  end
@@ -38,35 +80,40 @@ module Wordless
38
80
  end
39
81
 
40
82
  def install
83
+ at_wordpress_root!
84
+
41
85
  unless git_installed?
42
86
  error "Git is not available. Please install git."
43
87
  end
44
88
 
45
- unless File.directory? 'wp-content/plugins'
46
- error "Directory 'wp-content/plugins' not found. Make sure you're at the root level of a WordPress installation."
47
- end
48
-
49
- if run_command "git clone #{wordless_repo} wp-content/plugins/wordless"
50
- success "Installed Wordless plugin."
89
+ if File.directory?(plugins_path)
90
+ if run_command "git clone #{wordless_repo} #{wordless_plugin_path}"
91
+ success "Installed Wordless plugin."
92
+ else
93
+ error "There was an error installing the Wordless plugin."
94
+ end
51
95
  else
52
- error "There was an error installing the Wordless plugin."
96
+ error "Directory '#{plugins_path}' not found."
53
97
  end
54
98
  end
55
99
 
56
100
  def theme(name)
57
- if File.directory? 'wp-content/themes'
58
- # Run PHP helper script
101
+ at_wordpress_root!
102
+
103
+ if File.directory?(themes_path)
59
104
  if system "php #{File.join(lib_dir, 'theme_builder.php')} #{name}"
60
- success "Created a new Wordless theme in 'wp-content/themes/#{name}'."
105
+ success "Created a new Wordless theme in '#{File.join(themes_path, name)}'."
61
106
  else
62
107
  error "Couldn't create Wordless theme."
63
108
  end
64
109
  else
65
- error "Directory 'wp-content/themes' not found. Make sure you're at the root level of a WordPress installation."
110
+ error "Directory '#{themes_path}' not found."
66
111
  end
67
112
  end
68
113
 
69
114
  def compile
115
+ at_wordpress_root!
116
+
70
117
  if system "php #{File.join(lib_dir, 'compile_assets.php')}"
71
118
  success "Compiled static assets."
72
119
  else
@@ -75,7 +122,9 @@ module Wordless
75
122
  end
76
123
 
77
124
  def clean
78
- if File.directory? 'wp-content/themes'
125
+ at_wordpress_root!
126
+
127
+ if File.directory?(themes_path)
79
128
  static_css = Array(config[:static_css] || Dir['wp-content/themes/*/assets/stylesheets/screen.css'])
80
129
  static_js = Array(config[:static_js] || Dir['wp-content/themes/*/assets/javascripts/application.js'])
81
130
 
@@ -85,14 +134,12 @@ module Wordless
85
134
 
86
135
  success "Cleaned static assets."
87
136
  else
88
- error "Directory 'wp-content/themes' not found. Make sure you're at the root level of a WordPress installation."
137
+ error "Directory '#{themes_path}' not found."
89
138
  end
90
139
  end
91
140
 
92
141
  def deploy
93
- unless File.exists? 'wp-config.php'
94
- error "WordPress not found. Make sure you're at the root level of a WordPress installation."
95
- end
142
+ at_wordpress_root!
96
143
 
97
144
  compile if options['refresh']
98
145
 
@@ -109,6 +156,18 @@ module Wordless
109
156
 
110
157
  private
111
158
 
159
+ def start_dir
160
+ "."
161
+ end
162
+
163
+ def at_wordpress_root!
164
+ Dir.chdir(wordpress_dir)
165
+ end
166
+
167
+ def wordless_plugin_path
168
+ File.join(plugins_path, "wordless")
169
+ end
170
+
112
171
  def wordless_repo
113
172
  config[:wordless_repo] || 'git://github.com/welaika/wordless.git'
114
173
  end
data/spec/cli_spec.rb CHANGED
@@ -34,56 +34,57 @@ describe Wordless::CLI do
34
34
  end
35
35
  end
36
36
 
37
+ context "without a valid WordPress install" do
38
+ before do
39
+ FileUtils.mkdir_p('wordpress/wp-content') && Dir.chdir('wordpress')
40
+ end
41
+
42
+ it "fails to install the Wordless plugin" do
43
+ content = capture(:stdout) { Wordless::CLI.start ['install'] }
44
+ content.should =~ %r|Directory 'wp-content/plugins' not found|
45
+ end
46
+
47
+ it "fails to create a Wordless theme" do
48
+ content = capture(:stdout) { Wordless::CLI.start ['theme', 'mytheme'] }
49
+ content.should =~ %r|Directory 'wp-content/themes' not found|
50
+ end
51
+ end
52
+
37
53
  context "#install" do
38
- context "with a valid WordPress installation" do
39
- it "installs the Wordless plugin" do
40
- WordPressTools::CLI.start ['new']
41
- Dir.chdir 'wordpress'
42
- Wordless::CLI.start ['install']
43
- File.directory?('wp-content/plugins/wordless').should be_true
44
- end
54
+ before do
55
+ WordPressTools::CLI.start ['new']
56
+ Dir.chdir 'wordpress'
45
57
  end
46
58
 
47
- context "without a valid WordPress installation" do
48
- it "fails to install the Wordless plugin" do
49
- content = capture(:stdout) { Wordless::CLI.start ['install'] }
50
- content.should =~ %r|Directory 'wp-content/plugins' not found|
51
- end
59
+ it "installs the Wordless plugin" do
60
+ Wordless::CLI.start ['install']
61
+ File.directory?('wp-content/plugins/wordless').should be_true
52
62
  end
53
63
  end
54
64
 
55
65
  context "#theme" do
56
- context "with a valid WordPress installation and the Wordless plugin" do
57
- before :each do
58
- WordPressTools::CLI.start ['new']
59
- Dir.chdir 'wordpress'
60
- Wordless::CLI.start ['install']
61
- end
62
-
63
- it "creates a Wordless theme" do
64
- Wordless::CLI.start ['theme', 'mytheme']
65
- File.directory?('wp-content/themes/mytheme').should be_true
66
- File.exists?('wp-content/themes/mytheme/index.php').should be_true
67
- end
66
+ before do
67
+ WordPressTools::CLI.start ['new']
68
+ Dir.chdir 'wordpress'
69
+ Wordless::CLI.start ['install']
68
70
  end
69
71
 
70
- context "without a valid WordPress installation" do
71
- it "fails to create a Wordless theme" do
72
- content = capture(:stdout) { Wordless::CLI.start ['theme', 'mytheme'] }
73
- content.should =~ %r|Directory 'wp-content/themes' not found|
74
- end
72
+ it "creates a Wordless theme" do
73
+ Wordless::CLI.start ['theme', 'mytheme']
74
+ File.directory?('wp-content/themes/mytheme').should be_true
75
+ File.exists?('wp-content/themes/mytheme/index.php').should be_true
75
76
  end
76
77
  end
77
78
 
78
- context "#compile" do
79
- context "with a valid Wordless installation" do
79
+ context "with a working Wordless install" do
80
+ before do
81
+ Wordless::CLI.start ['new', 'myapp']
82
+ end
83
+
84
+ context "#compile" do
80
85
  let(:compiled_css) { 'wp-content/themes/myapp/assets/stylesheets/screen.css' }
81
86
  let(:compiled_js) { 'wp-content/themes/myapp/assets/javascripts/application.js' }
82
87
 
83
- before :each do
84
- Wordless::CLI.start ['new', 'myapp']
85
- end
86
-
87
88
  it "compiles static assets" do
88
89
  Wordless::CLI.start ['compile']
89
90
 
@@ -94,90 +95,84 @@ describe Wordless::CLI do
94
95
  File.readlines(compiled_js).grep(/return "Yep, it works!";/).should_not be_empty
95
96
  end
96
97
  end
97
- end
98
98
 
99
- context "#clean" do
100
- before do
101
- FileUtils.mkdir_p('myapp/wp-content/themes/myapp/assets/stylesheets')
102
- FileUtils.mkdir_p('myapp/wp-content/themes/myapp/assets/javascripts')
103
- Dir.chdir('myapp')
104
- end
99
+ context "#clean" do
100
+ before do
101
+ FileUtils.mkdir_p('wp-content/themes/myapp/assets/stylesheets')
102
+ FileUtils.mkdir_p('wp-content/themes/myapp/assets/javascripts')
103
+ end
105
104
 
106
- let(:default_css) { 'wp-content/themes/myapp/assets/stylesheets/screen.css' }
107
- let(:default_js) { 'wp-content/themes/myapp/assets/javascripts/application.js' }
105
+ let(:default_css) { 'wp-content/themes/myapp/assets/stylesheets/screen.css' }
106
+ let(:default_js) { 'wp-content/themes/myapp/assets/javascripts/application.js' }
108
107
 
109
- let(:first_css) { 'wp-content/themes/myapp/assets/stylesheets/foo.css' }
110
- let(:second_css) { 'wp-content/themes/myapp/assets/stylesheets/bar.css' }
111
- let(:first_js) { 'wp-content/themes/myapp/assets/javascripts/robin.js' }
112
- let(:second_js) { 'wp-content/themes/myapp/assets/javascripts/galahad.js' }
108
+ let(:first_css) { 'wp-content/themes/myapp/assets/stylesheets/foo.css' }
109
+ let(:second_css) { 'wp-content/themes/myapp/assets/stylesheets/bar.css' }
110
+ let(:first_js) { 'wp-content/themes/myapp/assets/javascripts/robin.js' }
111
+ let(:second_js) { 'wp-content/themes/myapp/assets/javascripts/galahad.js' }
113
112
 
114
- it "should remove default default assets" do
115
- FileUtils.touch(default_css)
116
- FileUtils.touch(default_js)
113
+ it "should remove default default assets" do
114
+ FileUtils.touch(default_css)
115
+ FileUtils.touch(default_js)
117
116
 
118
- Wordless::CLI.start ['clean']
117
+ Wordless::CLI.start ['clean']
119
118
 
120
- File.exists?(default_css).should be_false
121
- File.exists?(default_js).should be_false
122
- end
119
+ File.exists?(default_css).should be_false
120
+ File.exists?(default_js).should be_false
121
+ end
123
122
 
124
- it "should remove assets specified on config" do
125
- Wordless::WordlessCLI.class_variable_set :@@config, {
126
- :static_css => [ first_css, second_css ],
127
- :static_js => [ first_js, second_js ]
128
- }
123
+ it "should remove assets specified on config" do
124
+ Wordless::WordlessCLI.class_variable_set :@@config, {
125
+ :static_css => [ first_css, second_css ],
126
+ :static_js => [ first_js, second_js ]
127
+ }
129
128
 
130
- [ first_css, second_css, first_js, second_js ].each do |file|
131
- FileUtils.touch(file)
132
- end
129
+ [ first_css, second_css, first_js, second_js ].each do |file|
130
+ FileUtils.touch(file)
131
+ end
133
132
 
134
- Wordless::CLI.start ['clean']
133
+ Wordless::CLI.start ['clean']
135
134
 
136
- [ first_css, second_css, first_js, second_js ].each do |file|
137
- File.exists?(file).should be_false
135
+ [ first_css, second_css, first_js, second_js ].each do |file|
136
+ File.exists?(file).should be_false
137
+ end
138
138
  end
139
139
  end
140
- end
141
-
142
- context "#deploy" do
143
-
144
- let(:cli) { Wordless::CLI.new }
145
- let(:file) { 'shrubbery.txt' }
146
- let(:wordless_cli) { Wordless::WordlessCLI.new({}, Thor.new) }
147
140
 
148
- before do
149
- FileUtils.mkdir_p('myapp') and Dir.chdir('myapp')
150
- FileUtils.touch('wp-config.php')
151
- end
141
+ context "#deploy" do
142
+ let(:cli) { Wordless::CLI.new }
143
+ let(:file) { 'shrubbery.txt' }
144
+ let(:wordless_cli) { Wordless::WordlessCLI.new({}, Thor.new) }
152
145
 
153
- before do
154
- cli.stub(:wordless_cli).and_return(wordless_cli)
155
- Wordless::WordlessCLI.class_variable_set :@@config, {
156
- :deploy_command => "touch #{file}"
157
- }
158
- end
146
+ before do
147
+ cli.stub(:wordless_cli).and_return(wordless_cli)
148
+ Wordless::WordlessCLI.class_variable_set :@@config, {
149
+ :deploy_command => "touch #{file}"
150
+ }
151
+ end
159
152
 
160
- it "should deploy via the deploy command" do
161
- cli.deploy
162
- File.exists?(file).should be_true
163
- end
153
+ it "should deploy via the deploy command" do
154
+ cli.deploy
155
+ File.exists?(file).should be_true
156
+ end
164
157
 
165
- it "should compile and clean if refresh option is passed" do
166
- wordless_cli.should_receive(:compile).and_return(true)
167
- wordless_cli.should_receive(:clean).and_return(true)
168
- wordless_cli.stub(:options).and_return({ 'refresh' => true })
158
+ it "should compile and clean if refresh option is passed" do
159
+ wordless_cli.should_receive(:compile).and_return(true)
160
+ wordless_cli.should_receive(:clean).and_return(true)
161
+ wordless_cli.stub(:options).and_return({ 'refresh' => true })
169
162
 
170
- cli.deploy
171
- end
163
+ cli.deploy
164
+ end
172
165
 
173
- context "if a custom deploy is passed" do
174
- let(:file) { 'knights.txt' }
166
+ context "if a custom deploy is passed" do
167
+ let(:file) { 'knights.txt' }
175
168
 
176
- it "should launch the custom deploy command" do
177
- wordless_cli.stub(:options).and_return({ 'command' => "touch #{file}" })
178
- cli.deploy
179
- File.exists?(file).should be_true
169
+ it "should launch the custom deploy command" do
170
+ wordless_cli.stub(:options).and_return({ 'command' => "touch #{file}" })
171
+ cli.deploy
172
+ File.exists?(file).should be_true
173
+ end
180
174
  end
181
175
  end
182
176
  end
177
+
183
178
  end
data/spec/spec_helper.rb CHANGED
@@ -10,35 +10,33 @@ module WordPressTools
10
10
  end
11
11
  end
12
12
 
13
- RSpec.configure do |config|
13
+ module Wordless
14
+ class WordlessCLI
15
+ def error(message)
16
+ puts message
17
+ end
18
+ end
19
+ end
14
20
 
21
+ require 'support/capture'
22
+
23
+ WP_API_RESPONSE = <<-EOF
24
+ upgrade
25
+ http://wordpress.org/download/
26
+ http://wordpress.org/wordpress-3.6.zip
27
+ 3.6
28
+ en_US
29
+ 5.2.4
30
+ 5.0
31
+ EOF
32
+
33
+ RSpec.configure do |config|
15
34
  config.before(:all) do
16
35
  FileUtils.mkdir('tmp') unless File.directory? 'tmp'
17
36
  FakeWeb.allow_net_connect = false
18
- WP_API_RESPONSE = <<-eof
19
- upgrade
20
- http://wordpress.org/download/
21
- http://wordpress.org/wordpress-3.6.zip
22
- 3.6
23
- en_US
24
- 5.2.4
25
- 5.0
26
- eof
37
+
27
38
  FakeWeb.register_uri(:get, %r|http://api.wordpress.org/core/version-check/1.5/.*|, :body => WP_API_RESPONSE)
28
39
  FakeWeb.register_uri(:get, "http://wordpress.org/wordpress-3.6.zip", :body => File.expand_path('spec/fixtures/wordpress_stub.zip'))
29
40
  end
30
-
31
- # utility to log commands output or errors
32
- def capture(stream)
33
- begin
34
- stream = stream.to_s
35
- eval "$#{stream} = StringIO.new"
36
- yield
37
- result = eval("$#{stream}").string
38
- ensure
39
- eval("$#{stream} = #{stream.upcase}")
40
- end
41
-
42
- result
43
- end
44
41
  end
42
+
@@ -0,0 +1,18 @@
1
+ module CaptureHelpers
2
+ def capture(stream)
3
+ begin
4
+ stream = stream.to_s
5
+ eval "$#{stream} = StringIO.new"
6
+ yield
7
+ result = eval("$#{stream}").string
8
+ ensure
9
+ eval("$#{stream} = #{stream.upcase}")
10
+ end
11
+
12
+ result
13
+ end
14
+ end
15
+
16
+ RSpec.configure do |config|
17
+ config.include CaptureHelpers
18
+ end
@@ -0,0 +1,54 @@
1
+ require 'wordless/wordless_cli'
2
+
3
+ describe Wordless::WordlessCLI do
4
+ let(:cli) { Wordless::WordlessCLI.new }
5
+
6
+ context "#wordpress_dir" do
7
+ TMPDIR = "/tmp/wordless"
8
+
9
+ let(:wp_content) { File.join(TMPDIR, "wp-content") }
10
+
11
+ before do
12
+ @original_dir = Dir.pwd
13
+ FileUtils.mkdir(TMPDIR)
14
+ Dir.chdir(TMPDIR)
15
+ end
16
+
17
+ after do
18
+ Dir.chdir(@original_dir)
19
+ FileUtils.rm_rf(TMPDIR)
20
+ end
21
+
22
+ context "if a wordpress directory is found" do
23
+ before do
24
+ FileUtils.mkdir(wp_content)
25
+ end
26
+
27
+ it 'returns the directory' do
28
+ expect(cli.wordpress_dir).to eq(File.expand_path("."))
29
+ end
30
+ end
31
+
32
+ context "if no wordpress directory is found" do
33
+ it 'raises an error' do
34
+ expect { cli.wordpress_dir }.to raise_error(StandardError)
35
+ end
36
+ end
37
+
38
+ context "directory traversal" do
39
+ before do
40
+ FileUtils.mkdir(wp_content)
41
+
42
+ @test_dir = File.join(TMPDIR, "test")
43
+ FileUtils.mkdir(@test_dir)
44
+ Dir.chdir(@test_dir)
45
+ end
46
+
47
+ it 'goes up through the directory tree and finds it' do
48
+ expect(cli.wordpress_dir).to eq(File.expand_path("./.."))
49
+ end
50
+
51
+ end
52
+ end
53
+ end
54
+
data/wordless.gemspec CHANGED
@@ -6,6 +6,7 @@ Gem::Specification.new do |gem|
6
6
  gem.description = %q{Command line tool to manage Wordless themes.}
7
7
  gem.summary = %q{Manage Wordless themes.}
8
8
  gem.homepage = "http://github.com/welaika/wordless_gem"
9
+ gem.license = "MIT"
9
10
 
10
11
  gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
11
12
  gem.files = `git ls-files`.split("\n")
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wordless
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Étienne Després
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-08-31 00:00:00.000000000 Z
12
+ date: 2013-09-05 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: thor
@@ -168,9 +168,12 @@ files:
168
168
  - spec/fixtures/wordpress_stub.zip
169
169
  - spec/fixtures/zipped_file.zip
170
170
  - spec/spec_helper.rb
171
+ - spec/support/capture.rb
172
+ - spec/wordless/wordless_cli_spec.rb
171
173
  - wordless.gemspec
172
174
  homepage: http://github.com/welaika/wordless_gem
173
- licenses: []
175
+ licenses:
176
+ - MIT
174
177
  metadata: {}
175
178
  post_install_message:
176
179
  rdoc_options: []
@@ -198,3 +201,5 @@ test_files:
198
201
  - spec/fixtures/wordpress_stub.zip
199
202
  - spec/fixtures/zipped_file.zip
200
203
  - spec/spec_helper.rb
204
+ - spec/support/capture.rb
205
+ - spec/wordless/wordless_cli_spec.rb