capsulecd 1.0.1 → 1.0.3

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: 846c1711f0ae0a45b11b3be3a3475b4ec7435d26
4
- data.tar.gz: 766b95a987357b57d02ac101e5333c72c1db1c57
3
+ metadata.gz: 857e2ca315fe61eebf22039ea107b16caffa8888
4
+ data.tar.gz: 6638d4eaa9868fcbb61640d9c3f4bb099c02bac2
5
5
  SHA512:
6
- metadata.gz: 78d44d3b319f7c3b6c67ed766836a0b4cc2679a1b85df54d0100052977255979fd9dbfde4c85799d4e2ec0e6674df9fef29b4cc871bc99e2ddc7f442d90a4129
7
- data.tar.gz: 4d3fef2e36f78caa58f66134311eae35c8911ddbb1d850db1409c29d4faec4d4920d640a7f5dc7395d281fcb7eed41fe1218b9cfde36550e6e79eb463ed58a94
6
+ metadata.gz: 8e21df43463a02d533ac8d442437ec83dffe036536b288990d9d4911dcd12a6b302a4c59b0cead71a0b4fb9482587c5ce1b13cd7bf91d04f945e382f2d8037b8
7
+ data.tar.gz: a523f9636a72970f6f83e92590f2f7c1c3274e91280c64c769a746604d0355a78589a40ed8cb974bc303e52e0fe4b2c60eaebba4a13235599060dd11aa9a1af3
data/README.md CHANGED
@@ -3,13 +3,13 @@
3
3
  [![Circle CI](https://circleci.com/gh/AnalogJ/capsulecd.svg?style=shield)](https://circleci.com/gh/AnalogJ/capsulecd)
4
4
  [![Coverage Status](https://coveralls.io/repos/github/AnalogJ/capsulecd/badge.svg)](https://coveralls.io/github/AnalogJ/capsulecd)
5
5
  [![GitHub license](https://img.shields.io/github/license/AnalogJ/capsulecd.svg)](https://github.com/AnalogJ/capsulecd/blob/master/LICENSE)
6
- [![Gratipay User](https://img.shields.io/gratipay/user/analogj.svg)](https://gratipay.com/~AnalogJ/)
6
+ [![Gem](https://img.shields.io/gem/dt/capsulecd.svg)](https://rubygems.org/gems/capsulecd)
7
+ [![Gem](https://img.shields.io/gem/v/capsulecd.svg)](https://rubygems.org/gems/capsulecd)
8
+ [![Docker Pulls](https://img.shields.io/docker/pulls/analogj/capsulecd.svg)](https://hub.docker.com/r/analogj/capsulecd)
9
+ [![Flattr this git repo](https://button.flattr.com/flattr-badge-large.png)](https://flattr.com/submit/auto?fid=jexon1&url=https%3A%2F%2Fgithub.com%2FAnalogJ%2Fcapsulecd&title=CapsuleCD&language=Ruby&tags=github&category=software)
7
10
 
8
11
  <!--
9
- [![Gem](https://img.shields.io/gem/dt/capsulecd.svg)]()
10
- [![Gem](https://img.shields.io/gem/v/capsulecd.svg)]()
11
12
  [![Gemnasium](https://img.shields.io/gemnasium/analogj/capsulecd.svg)]()
12
- [![Docker Pulls](https://img.shields.io/docker/pulls/analogj/capsulecd.svg)]()
13
13
  -->
14
14
 
15
15
  CapsuleCD is a generic Continuous Delivery pipeline for versioned artifacts and libraries written in any language.
@@ -57,16 +57,16 @@ It automates away all the common steps required when creating a new version of y
57
57
  At first glance, it seems simple to publish a new library version. Just bump the version number and publish, right?
58
58
  Well, not always:
59
59
 
60
- - If you're library includes a Gemfile.lock, Berksfile.lock or other most common lock files, you'll need to regenerate them.
61
- - Everyone runs their library unit tests before creating a new release, but hat about validating that your library dependencies exist (maybe in your Company's private repo)?
60
+ - If you're library includes a Gemfile.lock, Berksfile.lock or other common lock files, you'll need to regenerate them as the old version number is embedded inside.
61
+ - Everyone runs their library unit tests before creating a new release (right?!), but what about validating that your [library dependencies exist](http://www.theregister.co.uk/2016/03/23/npm_left_pad_chaos/) (maybe in your Company's private repo)?
62
62
  - How about linting your source, to ensure that it follows common/team conventions?
63
- - Who owns the gem? Is there one developer who has the credentials to push to RubyGems.org? Are they still on your team?
63
+ - Who owns the gem? Is there one developer who has the credentials to push to RubyGems.org? Are they still on your team/on vacation?
64
64
  - Did you remember to tag your source when the new version was created (making it easy to determine what's changed between versions?)
65
65
  - Did you update your changelog?
66
66
 
67
67
  CapsuleCD handles all of that (and more!) for you. It pretty much guarantees that your library will have proper and consistent releases every time.
68
- CapsuleCD is well structured and fully tested, unlike the release scripts you've manually cobbled together for each library. It can be customized as needed without rewriting from scratch.
69
- The best part is that CapsuleCD uses CapsuleCD to automate its releases. We dogfood it so we're the first ones to find any issues with a new release.
68
+ CapsuleCD is well structured and fully tested, unlike the release scripts you've manually cobbled together for each library and language. It can be customized as needed without rewriting from scratch.
69
+ The best part is that CapsuleCD uses CapsuleCD to automate its releases. We [dogfood](https://en.wikipedia.org/wiki/Eating_your_own_dog_food) it so we're the first ones to find any issues with a new release.
70
70
 
71
71
  ## How do I start?
72
72
  You can use CapsuleCD to automate creating a new release from a pull request __or__ from the latest code on your default branch.
@@ -81,7 +81,7 @@ Here's how to use __docker__ to merge a pull request to your Ruby library
81
81
  CAPSULE_RUBYGEMS_API_KEY=ASDF12345F \
82
82
  docker run AnalogJ/capsulecd:ruby capsulecd start --source github --package_type ruby
83
83
 
84
- Or you could install and call CapsuleCD directly to merge a pull request to your Python library:
84
+ Or you could __install__ and call CapsuleCD directly to merge a pull request to your Python library:
85
85
 
86
86
  gem install capsulecd
87
87
  CAPSULE_SOURCE_GITHUB_ACCESS_TOKEN=123456789ABCDEF \
@@ -96,7 +96,7 @@ Or you could install and call CapsuleCD directly to merge a pull request to your
96
96
  TODO: add documentation on how to create a release from the master branch without a pull request. Specify the env variables required.
97
97
 
98
98
  # Engine
99
- Every package type is mapped to an engine class which inherits from a `BaseEngine` clas, ie `PythonEngine`, `NodeEngine`, `RubyEngine` etc.
99
+ Every package type is mapped to an engine class which inherits from a `BaseEngine` class, ie `PythonEngine`, `NodeEngine`, `RubyEngine` etc.
100
100
  Every source type is mapped to a source module, ie `GithubSource`. When CapsuleCD starts, it initializes the specified Engine, and loads the correct Source module.
101
101
  Then it begins processing your source code step by step.
102
102
 
@@ -131,7 +131,7 @@ Setting | System Config | Repo Config | Notes
131
131
  package_type | No | No | Must be set by `--package-type` flag
132
132
  source | No | No | Must be set by `--source` flag
133
133
  runner | No | No | Must be set by `--runner` flag
134
- dry_run | Yes | No | Can be `YES` or `NO`
134
+ dry_run | No | No | Must be set by `--[no]-dry-run` flag
135
135
  source_git_parent_path | Yes | No | Specifies the location where the git repo will be cloned, defaults to tmp directory
136
136
  source_github_api_endpoint | Yes | No | Specifies the Github api endpoint to use (for use with Enterprise Github)
137
137
  source_github_web_endpoint | Yes | No | Specifies the Github web endpoint to use (for use with Enterprise Github)
@@ -169,7 +169,35 @@ source_github_web_endpoint: https://git.mycorpsubnet.example.com/v2
169
169
 
170
170
  ## Stage pre/post hooks and overrides
171
171
 
172
- TODO: add example and documetnation on how to override stages.
172
+ CapsuleCD is completely customizable, to the extent that you can run your own Ruby code as `pre` and `post` hooks before every step.
173
+ If that's not enough, you can also completely override the step itself, allowing you to use your own business logic.
174
+ To add a `pre`/`post` hook or override a step, just modify your config `yml` file by adding the step you want to modify, and
175
+ specify `pre`, `post` or `override` as a subkey. Then specify your multiline ruby script:
176
+
177
+ ---
178
+ source_configure:
179
+ pre: |
180
+ # this is my multiline ruby script
181
+ # the pre hook script runs before the actual step (source_configure) executes
182
+ # we have access to any of the specified instance variables here.
183
+ # check the documentation for more information.
184
+ puts "override pre_source_configure"
185
+ `git clone ...`
186
+ override: |
187
+ # override scripts can be used to completely replace the built-in step script.
188
+ # to ensure that you are compatible with the capsulecd runner, please ensure that you
189
+ # populate all the correct instance variables.
190
+ # see the documentation for more information
191
+ puts "override source_configure"
192
+ post: |
193
+ # post scripts run after the step (source_configure) executes
194
+ # you can override any instance variables here, do additional cleanup or anything else you want.
195
+ puts "override post_source_configure"
196
+ build_step:
197
+ post: |
198
+ # post build step runs after the build_step runs
199
+ # within the script you have access to all instance variables and other methods defined in the engine.
200
+ puts "override post_build_step" + @source_git_local_path
173
201
 
174
202
  # Testing
175
203
 
@@ -222,6 +250,6 @@ We use SemVer for versioning. For the versions available, see the tags on this r
222
250
 
223
251
  Jason Kulatunga - Initial Development - [@AnalogJ](https://github.com/AnalogJ)
224
252
 
225
- #License
253
+ # License
226
254
 
227
255
  CapsuleCD is licensed under the MIT License - see the [LICENSE.md](https://github.com/AnalogJ/capsulecd/blob/master/LICENSE.md) file for details
@@ -1,9 +1,11 @@
1
1
  require 'capsulecd'
2
2
  module CapsuleCD
3
3
  class ValidationUtils
4
+ # TODO: validation almost needs to be source specific (or inherit from this base function), because source methods
5
+ # may require additional attributes, while these base payload keys are required for general step functions.
4
6
  def self.validate_repo_payload(repo_payload)
5
7
  unless repo_payload['sha']
6
- fail CapsuleCD::Error::SourcePayloadFormatError, 'Incorrectly formatted payload, missing "sha1" key'
8
+ fail CapsuleCD::Error::SourcePayloadFormatError, 'Incorrectly formatted payload, missing "sha" key'
7
9
  end
8
10
  unless repo_payload['ref']
9
11
  fail CapsuleCD::Error::SourcePayloadFormatError, 'Incorrectly formatted payload, missing "ref" key'
@@ -121,7 +121,6 @@ module CapsuleCD
121
121
 
122
122
  unless @config.chef_supermarket_username || @config.chef_supermarket_key
123
123
  fail CapsuleCD::Error::ReleaseCredentialsMissing, 'cannot deploy cookbook to supermarket, credentials missing'
124
- return
125
124
  end
126
125
 
127
126
  # knife is really sensitive to folder names. The cookbook name MUST match the folder name otherwise knife throws up
@@ -160,7 +160,6 @@ module CapsuleCD
160
160
 
161
161
  unless @config.npm_auth_token
162
162
  fail CapsuleCD::Error::ReleaseCredentialsMissing, 'cannot deploy page to npm, credentials missing'
163
- return
164
163
  end
165
164
 
166
165
  # write the knife.rb config file.
@@ -112,7 +112,6 @@ module CapsuleCD
112
112
 
113
113
  unless @config.npm_auth_token
114
114
  fail CapsuleCD::Error::ReleaseCredentialsMissing, 'cannot deploy page to npm, credentials missing'
115
- return
116
115
  end
117
116
 
118
117
  # write the knife.rb config file.
@@ -118,7 +118,6 @@ TOX
118
118
 
119
119
  unless @config.pypi_username || @config.pypi_password
120
120
  fail CapsuleCD::Error::ReleaseCredentialsMissing, 'cannot deploy package to pip, credentials missing'
121
- return
122
121
  end
123
122
 
124
123
  # write the knife.rb config file.
@@ -1,3 +1,3 @@
1
1
  module CapsuleCD
2
- VERSION = '1.0.2'
2
+ VERSION = '1.0.3'
3
3
  end
@@ -0,0 +1,43 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'CapsuleCD::ValidationUtils' do
4
+ subject{
5
+ CapsuleCD::ValidationUtils
6
+ }
7
+ describe '#validate_repo_payload' do
8
+ let(:payload){
9
+ {
10
+ 'sha' => '0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c',
11
+ 'ref' => 'mybranch',
12
+ 'repo' => {
13
+ 'clone_url' => 'https://github.com/analogj/capsulecd.git',
14
+ 'name' => 'capsulecd'
15
+ }
16
+ }
17
+ }
18
+ it 'should run successfully when parsing correctly structured payload' do
19
+ expect(subject.validate_repo_payload(payload)).to eql(nil)
20
+ end
21
+
22
+ it 'should raise an error when payload is missing sha' do
23
+ payload.delete('sha')
24
+ expect{subject.validate_repo_payload(payload)}.to raise_error(CapsuleCD::Error::SourcePayloadFormatError)
25
+ end
26
+
27
+ it 'should raise an error when payload is missing ref' do
28
+ payload.delete('ref')
29
+ expect{subject.validate_repo_payload(payload)}.to raise_error(CapsuleCD::Error::SourcePayloadFormatError)
30
+ end
31
+
32
+ it 'should raise an error when payload is missing clone_url' do
33
+ payload['repo'].delete('clone_url')
34
+ expect{subject.validate_repo_payload(payload)}.to raise_error(CapsuleCD::Error::SourcePayloadFormatError)
35
+ end
36
+
37
+ it 'should raise an error when payload is missing name' do
38
+ payload['repo'].delete('name')
39
+ expect{subject.validate_repo_payload(payload)}.to raise_error(CapsuleCD::Error::SourcePayloadFormatError)
40
+ end
41
+ end
42
+
43
+ end
@@ -0,0 +1,62 @@
1
+ require 'spec_helper'
2
+ require 'capsulecd/base/runner/default'
3
+
4
+ describe CapsuleCD::Runner::Default do
5
+ describe '#runner_retrieve_payload' do
6
+ let(:default_runner) {
7
+ Class.new { include CapsuleCD::Runner::Default }
8
+ }
9
+ describe 'when no config.runner_pull_request is set' do
10
+ let(:config) { CapsuleCD::Configuration.new({
11
+ :runner_sha => '0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c',
12
+ :runner_branch => 'master',
13
+ :runner_clone_url => 'https://github.com/analogj/capsulecd.git',
14
+ :runner_repo_name => 'capsulecd',
15
+ :runner_repo_full_name => 'AnalogJ/capsulecd'
16
+ })
17
+ }
18
+ it 'should populate a branch release payload' do
19
+ runner = default_runner.new
20
+ runner.instance_variable_set(:@config, config)
21
+
22
+ payload = runner.runner_retrieve_payload({})
23
+
24
+ expect(runner.instance_variable_get(:@runner_is_pullrequest)).to eql(false)
25
+ expect(payload).to eql({
26
+ 'head' => {
27
+ 'sha' => '0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c',
28
+ 'ref' => 'master',
29
+ 'repo' => {
30
+ 'clone_url' => 'https://github.com/analogj/capsulecd.git',
31
+ 'name' => 'capsulecd',
32
+ 'full_name' => 'AnalogJ/capsulecd'
33
+ }
34
+ }
35
+ })
36
+ end
37
+ end
38
+
39
+ describe 'when config.runner_pull_request is set' do
40
+ let(:config) { CapsuleCD::Configuration.new({
41
+ :runner_pull_request => '4',
42
+ })
43
+ }
44
+ let(:source_client_double) { instance_double(Octokit::Client) }
45
+
46
+ it 'should retrieve the payload from source' do
47
+ allow(source_client_double).to receive(:pull_request).and_return({:test => :payload})
48
+
49
+ runner = default_runner.new
50
+ runner.instance_variable_set(:@config, config)
51
+ runner.instance_variable_set(:@source_client, source_client_double)
52
+
53
+ payload = runner.runner_retrieve_payload({})
54
+
55
+ expect(runner.instance_variable_get(:@runner_is_pullrequest)).to eql(true)
56
+ expect(payload).to eql({:test => :payload})
57
+ end
58
+ end
59
+
60
+ end
61
+
62
+ end
@@ -23,6 +23,9 @@ describe 'CapsuleCD::Chef::ChefEngine', :chef do
23
23
  end
24
24
  it 'should create a Rakefile, Berksfile, .gitignore file, file and tests folder' do
25
25
  FileUtils.copy_entry('spec/fixtures/chef/cookbook_analogj_test', test_directory)
26
+ FileUtils.rm(test_directory + '/Rakefile')
27
+ FileUtils.rm(test_directory + '/Gemfile')
28
+
26
29
  engine.instance_variable_set(:@source_git_local_path, test_directory )
27
30
 
28
31
  VCR.use_cassette('chef_build_step',:tag => :chef) do
@@ -34,6 +37,8 @@ describe 'CapsuleCD::Chef::ChefEngine', :chef do
34
37
  File.exist?(test_directory+'/Gemfile')
35
38
 
36
39
  end
40
+
41
+
37
42
  end
38
43
  end
39
44
 
@@ -23,6 +23,8 @@ describe 'CapsuleCD::Python::PythonEngine', :python do
23
23
  end
24
24
  it 'should create a VERSION file, requirements.txt file and tests folder' do
25
25
  FileUtils.copy_entry('spec/fixtures/python/pip_analogj_test', test_directory)
26
+ FileUtils.rm(test_directory + '/VERSION')
27
+ FileUtils.rm(test_directory + '/tox.ini')
26
28
  engine.instance_variable_set(:@source_git_local_path, test_directory)
27
29
 
28
30
  VCR.use_cassette('pip_build_step',:tag => :ruby) do
@@ -30,6 +32,7 @@ describe 'CapsuleCD::Python::PythonEngine', :python do
30
32
  end
31
33
 
32
34
  File.exist?(test_directory+'/VERSION')
35
+ File.exist?(test_directory+'/tox.ini')
33
36
  File.exist?(test_directory+'/requirements.txt')
34
37
  File.exist?(test_directory+'/.gitignore')
35
38
  end
@@ -21,8 +21,10 @@ describe 'CapsuleCD::Ruby::RubyEngine', :ruby do
21
21
  CapsuleCD::Ruby::RubyEngine.new(source: :github,
22
22
  package_type: :ruby)
23
23
  end
24
- it 'should create a .gitignore file and spec folder' do
24
+ it 'should create a Gemfile, Rakefile, .gitignore file and spec folder' do
25
25
  FileUtils.copy_entry('spec/fixtures/ruby/gem_analogj_test', test_directory)
26
+ FileUtils.rm(test_directory + '/Gemfile')
27
+ FileUtils.rm(test_directory + '/Rakefile')
26
28
 
27
29
  engine.instance_variable_set(:@source_git_local_path, test_directory)
28
30
 
@@ -31,6 +33,8 @@ describe 'CapsuleCD::Ruby::RubyEngine', :ruby do
31
33
  end
32
34
 
33
35
  expect(File.exist?(test_directory+'/.gitignore')).to eql(true)
36
+ expect(File.exist?(test_directory+'/Gemfile')).to eql(true)
37
+ expect(File.exist?(test_directory+'/Rakefile')).to eql(true)
34
38
  end
35
39
 
36
40
  it 'should raise an error if version.rb is missing' do
@@ -46,6 +46,46 @@ describe 'CapsuleCD::Ruby::RubyHelper', :ruby do
46
46
  end
47
47
  end
48
48
 
49
+ describe 'when modifying gemspec file' do
50
+ it 'should not keep old constant from version.rb file in memory' do
51
+ FileUtils.copy_entry('spec/fixtures/ruby/gem_analogj_test', test_directory)
52
+
53
+ gemspec_data = CapsuleCD::Ruby::RubyHelper.get_gemspec_data(test_directory)
54
+ expect(gemspec_data.version.to_s).to eql('0.1.3')
55
+
56
+ version_str = CapsuleCD::Ruby::RubyHelper.read_version_file(test_directory, gemspec_data.name)
57
+ next_version = CapsuleCD::Engine.new(:source => :github).send(:bump_version, SemVer.parse(gemspec_data.version.to_s))
58
+ expect(next_version.to_s).to eql('0.1.4')
59
+
60
+ new_version_str = version_str.gsub(/(VERSION\s*=\s*['"])[0-9\.]+(['"])/, "\\1#{next_version}\\2")
61
+ CapsuleCD::Ruby::RubyHelper.write_version_file(test_directory, gemspec_data.name, new_version_str)
62
+
63
+ Open3.popen3('gem build gem_analogj_test.gemspec', chdir: test_directory) do |_stdin, stdout, stderr, external|
64
+ { stdout: stdout, stderr: stderr }. each do |name, stream_buffer|
65
+ Thread.new do
66
+ until (line = stream_buffer.gets).nil?
67
+ puts "#{name} -> #{line}"
68
+ end
69
+ end
70
+ end
71
+ # wait for process
72
+ external.join
73
+ unless external.value.success?
74
+ fail CapsuleCD::Error::BuildPackageFailed, 'gem build failed. Check gemspec file and dependencies'
75
+ end
76
+ unless File.exist?(test_directory + "/#{gemspec_data.name}-#{next_version.to_s}.gem")
77
+ fail CapsuleCD::Error::BuildPackageFailed, "gem build failed. #{gemspec_data.name}-#{next_version.to_s}.gem not found"
78
+ end
79
+ end
80
+
81
+ updated_gemspec_data = CapsuleCD::Ruby::RubyHelper.get_gemspec_data(test_directory)
82
+ expect(updated_gemspec_data.version.to_s).to eql('0.1.4')
83
+
84
+
85
+
86
+ end
87
+ end
88
+
49
89
  end
50
90
 
51
91
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: capsulecd
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jason Kulatunga (AnalogJ)
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-04-11 00:00:00.000000000 Z
11
+ date: 2016-04-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -178,8 +178,10 @@ files:
178
178
  - spec/fixtures/vcr_cassettes/integration_ruby.yml
179
179
  - spec/fixtures/vcr_cassettes/node_build_step.yml
180
180
  - spec/fixtures/vcr_cassettes/pip_build_step.yml
181
+ - spec/lib/capsulecd/base/common/validation_utils_spec.rb
181
182
  - spec/lib/capsulecd/base/configuration_spec.rb
182
183
  - spec/lib/capsulecd/base/engine_spec.rb
184
+ - spec/lib/capsulecd/base/runner/default_spec.rb
183
185
  - spec/lib/capsulecd/base/source/github_spec.rb
184
186
  - spec/lib/capsulecd/base/transform_engine_spec.rb
185
187
  - spec/lib/capsulecd/chef/chef_engine_spec.rb
@@ -211,7 +213,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
211
213
  version: '0'
212
214
  requirements: []
213
215
  rubyforge_project:
214
- rubygems_version: 2.6.2
216
+ rubygems_version: 2.6.1
215
217
  signing_key:
216
218
  specification_version: 4
217
219
  summary: CapsuleCD is a library for automating package releases (npm, cookbooks, gems,
@@ -268,8 +270,10 @@ test_files:
268
270
  - spec/fixtures/vcr_cassettes/integration_ruby.yml
269
271
  - spec/fixtures/vcr_cassettes/node_build_step.yml
270
272
  - spec/fixtures/vcr_cassettes/pip_build_step.yml
273
+ - spec/lib/capsulecd/base/common/validation_utils_spec.rb
271
274
  - spec/lib/capsulecd/base/configuration_spec.rb
272
275
  - spec/lib/capsulecd/base/engine_spec.rb
276
+ - spec/lib/capsulecd/base/runner/default_spec.rb
273
277
  - spec/lib/capsulecd/base/source/github_spec.rb
274
278
  - spec/lib/capsulecd/base/transform_engine_spec.rb
275
279
  - spec/lib/capsulecd/chef/chef_engine_spec.rb