busser 0.9.1 → 0.9.3

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 (49) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/integration.yml +55 -0
  3. data/.github/workflows/publish.yml +22 -0
  4. data/.gitignore +1 -0
  5. data/.release-please-manifest.json +1 -1
  6. data/.rubocop.yml +1 -4
  7. data/CHANGELOG.md +19 -0
  8. data/Gemfile +12 -5
  9. data/README.md +82 -0
  10. data/Rakefile +19 -1
  11. data/busser.gemspec +11 -8
  12. data/kitchen-preinstall.sh +55 -0
  13. data/kitchen.yml +27 -0
  14. data/lib/busser/command/deserialize.rb +4 -0
  15. data/lib/busser/command/plugin_create.rb +50 -0
  16. data/lib/busser/command/plugin_install.rb +40 -4
  17. data/lib/busser/command/plugin_list.rb +16 -4
  18. data/lib/busser/command/setup.rb +27 -1
  19. data/lib/busser/command/suite_cleanup.rb +3 -0
  20. data/lib/busser/command/suite_path.rb +3 -0
  21. data/lib/busser/command/test.rb +38 -1
  22. data/lib/busser/cucumber/hooks.rb +9 -0
  23. data/lib/busser/helpers.rb +24 -0
  24. data/lib/busser/plugin.rb +51 -9
  25. data/lib/busser/rubygems.rb +20 -0
  26. data/lib/busser/runner_plugin/dummy.rb +3 -0
  27. data/lib/busser/runner_plugin.rb +5 -0
  28. data/lib/busser/thor.rb +23 -0
  29. data/lib/busser/ui.rb +55 -0
  30. data/lib/busser/version.rb +2 -1
  31. data/release-please-config.json +3 -1
  32. data/renovate.json +1 -0
  33. data/spec/busser/command/deserialize_spec.rb +0 -1
  34. data/spec/busser/command/plugin_create_spec.rb +79 -7
  35. data/spec/busser/command/plugin_install_spec.rb +44 -0
  36. data/spec/busser/command/plugin_list_spec.rb +49 -0
  37. data/spec/busser/command/setup_spec.rb +21 -1
  38. data/spec/busser/command/test_spec.rb +36 -0
  39. data/spec/busser/helpers_spec.rb +10 -10
  40. data/spec/busser/plugin_spec.rb +0 -1
  41. data/spec/busser/ui_spec.rb +7 -7
  42. data/spec/spec_helper.rb +2 -3
  43. data/templates/plugin/Gemfile.erb +7 -0
  44. data/templates/plugin/Rakefile.erb +5 -1
  45. data/templates/plugin/features_env.rb.erb +3 -8
  46. data/templates/plugin/gemspec.erb +2 -6
  47. data/templates/plugin/github_workflow.yml.erb +1 -1
  48. data/test/integration/default/bash/smoke_test.sh +12 -0
  49. metadata +15 -59
@@ -1,4 +1,3 @@
1
- # -*- encoding: utf-8 -*-
2
1
  #
3
2
  # Licensed under the Apache License, Version 2.0 (the "License");
4
3
  # you may not use this file except in compliance with the License.
@@ -87,12 +86,24 @@ describe Busser::Command::PluginCreate do
87
86
  end
88
87
  end
89
88
 
90
- it "depends on what the generated Rakefile needs" do
89
+ # These moved into the Gemfile, so the gemspec declares only what a
90
+ # consumer of the gem needs at runtime -- matching the busser-* plugins.
91
+ it "leaves development dependencies out of the gemspec" do
91
92
  generate
92
93
 
93
- _(dev_dependencies).must_include "rake"
94
- _(dev_dependencies).must_include "cucumber"
95
- _(dev_dependencies).must_include "aruba"
94
+ _(dev_dependencies).must_be_empty
95
+ end
96
+
97
+ # busser-bash resolved busser 0.6.0 and failed its own suite because the
98
+ # requirement was open. A generated plugin should not start there.
99
+ it "requires a busser new enough to run the generated features" do
100
+ generate
101
+
102
+ busser = gemspec.dependencies.find { |d| d.name == "busser" }
103
+
104
+ _(busser).wont_be_nil
105
+ _(busser.requirement.satisfied_by?(Gem::Version.new("0.9.0"))).must_equal true
106
+ _(busser.requirement.satisfied_by?(Gem::Version.new("0.6.0"))).must_equal false
96
107
  end
97
108
 
98
109
  it "states a supported Ruby version" do
@@ -113,6 +124,25 @@ describe Busser::Command::PluginCreate do
113
124
  end
114
125
  end
115
126
 
127
+ describe "the generated Gemfile" do
128
+
129
+ it "declares what the generated Rakefile needs" do
130
+ generate
131
+
132
+ body = File.read(File.join(plugin_dir, "Gemfile"))
133
+
134
+ %w{rake cucumber aruba}.each { |g| _(body).must_include "'#{g}'" }
135
+ end
136
+
137
+ # cucumber needs base64 on Ruby 4.0, where it is no longer a default gem.
138
+ it "declares base64" do
139
+ generate
140
+
141
+ _(File.read(File.join(plugin_dir, "Gemfile"))).must_include "'base64'"
142
+ end
143
+
144
+ end
145
+
116
146
  describe "the generated project" do
117
147
 
118
148
  it "ships a CI workflow rather than a Travis config" do
@@ -153,9 +183,51 @@ describe Busser::Command::PluginCreate do
153
183
  end
154
184
  end
155
185
 
156
- def generate(license: "apachev2")
186
+ # A name becomes a Ruby constant, and Thor's camel_case only folds
187
+ # underscores. "my-junit" produced `module My-junit`, which does not parse --
188
+ # and the generator ran to completion anyway, leaving a project that could
189
+ # not be loaded at all.
190
+ describe "the plugin name" do
191
+
192
+ %w{demo junit my_junit j2 x}.each do |name|
193
+ it "accepts #{name.inspect}" do
194
+ generate(name: name)
195
+
196
+ _(Dir.exist?(File.join(@tmpdir, "busser-#{name}"))).must_equal true
197
+ end
198
+ end
199
+
200
+ {
201
+ "my-junit" => "a hyphen cannot appear in a constant",
202
+ "My_Junit" => "an uppercase start is not a plugin name",
203
+ "2fast" => "a constant cannot start with a digit",
204
+ "my junit" => "a space cannot appear in a constant or a path",
205
+ "" => "an empty name",
206
+ "../escaped" => "a path fragment",
207
+ }.each do |name, why|
208
+ it "rejects #{name.inspect} -- #{why}" do
209
+ err = _(proc { generate(name: name) }).must_raise ::Thor::Error
210
+
211
+ _(err.message).must_include "not a usable plugin name"
212
+ end
213
+ end
214
+
215
+ it "writes nothing when the name is rejected" do
216
+ _(proc { generate(name: "my-junit") }).must_raise ::Thor::Error
217
+
218
+ _(Dir.glob(File.join(@tmpdir, "*"))).must_be_empty
219
+ end
220
+
221
+ it "suggests a usable name" do
222
+ err = _(proc { generate(name: "my-junit") }).must_raise ::Thor::Error
223
+
224
+ _(err.message).must_include "'my_junit'"
225
+ end
226
+ end
227
+
228
+ def generate(license: "apachev2", name: "demo")
157
229
  command = Busser::Command::PluginCreate.new(
158
- ["demo"], { "type" => "runner", "license" => license }
230
+ [name], { "type" => "runner", "license" => license }
159
231
  )
160
232
  command.stubs(:initialize_git)
161
233
  capture_stdout { command.create }
@@ -0,0 +1,44 @@
1
+ require_relative "../../spec_helper"
2
+
3
+ require "busser/command/plugin_install"
4
+
5
+ describe Busser::Command::PluginInstall do
6
+ let(:command) { Busser::Command::PluginInstall.new([%w{busser-dummy}]) }
7
+
8
+ describe "#drop_ssl_verify_peer" do
9
+ # VERIFY_PEER is a process-global constant, so anything that leaves it
10
+ # lowered affects every later gem download in the same run. `busser plugin
11
+ # install` takes a list of plugins, which is exactly that situation.
12
+ it "lowers verification for the block" do
13
+ inside = nil
14
+ command.send(:drop_ssl_verify_peer) { inside = OpenSSL::SSL::VERIFY_PEER }
15
+
16
+ _(inside).must_equal OpenSSL::SSL::VERIFY_NONE
17
+ end
18
+
19
+ it "restores verification afterwards" do
20
+ before = OpenSSL::SSL::VERIFY_PEER
21
+ command.send(:drop_ssl_verify_peer) { nil }
22
+
23
+ _(OpenSSL::SSL::VERIFY_PEER).must_equal before
24
+ end
25
+
26
+ # The regression this guards. A postinstall raising is not exotic: it is
27
+ # how a plugin reports that it could not install its test framework.
28
+ it "restores verification when the block raises" do
29
+ before = OpenSSL::SSL::VERIFY_PEER
30
+
31
+ _(proc { command.send(:drop_ssl_verify_peer) { raise "postinstall blew up" } })
32
+ .must_raise RuntimeError
33
+
34
+ _(OpenSSL::SSL::VERIFY_PEER).must_equal before
35
+ end
36
+
37
+ it "restores verification when the block throws" do
38
+ before = OpenSSL::SSL::VERIFY_PEER
39
+ catch(:done) { command.send(:drop_ssl_verify_peer) { throw :done } }
40
+
41
+ _(OpenSSL::SSL::VERIFY_PEER).must_equal before
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,49 @@
1
+ require_relative "../../spec_helper"
2
+
3
+ require "busser/command/plugin_list"
4
+
5
+ describe Busser::Command::PluginList do
6
+ let(:command) { Busser::Command::PluginList.new }
7
+
8
+ describe "#plugin_data" do
9
+ def stub_plugins(paths, specs = {})
10
+ Busser::Plugin.stubs(:runner_plugins).returns(paths)
11
+ paths.each do |path|
12
+ Busser::Plugin.stubs(:gem_from_path).with(path).returns(specs[path])
13
+ end
14
+ end
15
+
16
+ def spec_for(name, version)
17
+ Gem::Specification.new { |s| s.name = name; s.version = version }
18
+ end
19
+
20
+ it "reports each plugin's short name and version" do
21
+ stub_plugins(["busser/runner_plugin/bash"],
22
+ "busser/runner_plugin/bash" => spec_for("busser-bash", "0.2.0"))
23
+
24
+ _(command.send(:plugin_data)).must_equal [["bash", Gem::Version.new("0.2.0")]]
25
+ end
26
+
27
+ # dummy is a fixture shipped inside busser for its own tests, not something
28
+ # anyone installed. `busser test` already passes over it, so listing it was
29
+ # inconsistent as well as confusing.
30
+ it "leaves out the internal dummy runner" do
31
+ stub_plugins(["busser/runner_plugin/dummy", "busser/runner_plugin/bash"],
32
+ "busser/runner_plugin/bash" => spec_for("busser-bash", "0.2.0"))
33
+
34
+ _(command.send(:plugin_data).map(&:first)).must_equal %w{bash}
35
+ end
36
+
37
+ it "reports a nil version rather than raising when no spec is found" do
38
+ stub_plugins(["busser/runner_plugin/bash"])
39
+
40
+ _(command.send(:plugin_data)).must_equal [["bash", nil]]
41
+ end
42
+
43
+ it "returns an empty list when dummy is all there is" do
44
+ stub_plugins(["busser/runner_plugin/dummy"])
45
+
46
+ _(command.send(:plugin_data)).must_be_empty
47
+ end
48
+ end
49
+ end
@@ -1,4 +1,3 @@
1
- # -*- encoding: utf-8 -*-
2
1
  #
3
2
  # Licensed under the Apache License, Version 2.0 (the "License");
4
3
  # you may not use this file except in compliance with the License.
@@ -97,6 +96,27 @@ describe Busser::Command::Setup do
97
96
  end
98
97
  end
99
98
 
99
+ # Windows RubyGems splits GEM_PATH on ";". Joining with ":" produced one
100
+ # unusable entry, because every Windows path already contains a colon after
101
+ # its drive letter -- so the isolated gem environment silently did not
102
+ # exist and Busser resolved gems from wherever it happened to land.
103
+ it "separates GEM_PATH entries with the Windows separator" do
104
+ Gem.paths.stubs(:path).returns(["C:/Ruby34/lib/ruby/gems", "C:/Users/kitchen/.gem"])
105
+ run_setup(type: "bat")
106
+
107
+ _(binstub_body).must_include(
108
+ 'SET "GEM_PATH=C:\\Ruby34\\lib\\ruby\\gems;C:\\Users\\kitchen\\.gem"'
109
+ )
110
+ end
111
+
112
+ it "does not separate GEM_PATH entries with a colon" do
113
+ Gem.paths.stubs(:path).returns(["C:/a", "C:/b"])
114
+ run_setup(type: "bat")
115
+
116
+ gem_path = binstub_body[/^SET "GEM_PATH=(.*)"$/, 1]
117
+ _(gem_path.split(";").length).must_equal 2
118
+ end
119
+
100
120
  def binstub
101
121
  File.join(@tmpdir, "bin", "busser.bat")
102
122
  end
@@ -0,0 +1,36 @@
1
+ require_relative "../../spec_helper"
2
+
3
+ require "shellwords"
4
+ require "busser/command/test"
5
+
6
+ describe Busser::Command::Test do
7
+ describe ".prepare_sh_command" do
8
+ it "runs the script with sh" do
9
+ cmd = Busser::Command::Test.prepare_sh_command("/opt/busser/suites/bats/prepare.sh")
10
+
11
+ _(Shellwords.split(cmd)).must_equal ["/bin/sh", "/opt/busser/suites/bats/prepare.sh"]
12
+ end
13
+
14
+ # BUSSER_ROOT is chosen by whoever runs Busser, and Test Kitchen puts it
15
+ # under a path the user controls. Unquoted, a space split the path and sh
16
+ # was handed a fragment.
17
+ it "quotes a path containing spaces" do
18
+ cmd = Busser::Command::Test.prepare_sh_command("/tmp/my tests/suites/bats/prepare.sh")
19
+
20
+ _(Shellwords.split(cmd))
21
+ .must_equal ["/bin/sh", "/tmp/my tests/suites/bats/prepare.sh"]
22
+ end
23
+
24
+ it "neutralises shell metacharacters in the path" do
25
+ cmd = Busser::Command::Test.prepare_sh_command("/tmp/a;touch pwned/prepare.sh")
26
+
27
+ _(Shellwords.split(cmd)).must_equal ["/bin/sh", "/tmp/a;touch pwned/prepare.sh"]
28
+ end
29
+
30
+ it "accepts a Pathname" do
31
+ cmd = Busser::Command::Test.prepare_sh_command(Pathname.new("/a/prepare.sh"))
32
+
33
+ _(Shellwords.split(cmd).last).must_equal "/a/prepare.sh"
34
+ end
35
+ end
36
+ end
@@ -1,6 +1,6 @@
1
- require_relative '../spec_helper'
1
+ require_relative "../spec_helper"
2
2
 
3
- require 'busser/helpers'
3
+ require "busser/helpers"
4
4
 
5
5
  describe Busser::Helpers do
6
6
 
@@ -25,16 +25,16 @@ describe Busser::Helpers do
25
25
 
26
26
  describe "with a custom root path" do
27
27
 
28
- before { ENV['_SPEC_BUSSER_ROOT'] = ENV['BUSSER_ROOT'] }
29
- after { ENV['BUSSER_ROOT'] = ENV.delete('_SPEC_BUSSER_ROOT') }
28
+ before { ENV["_SPEC_BUSSER_ROOT"] = ENV["BUSSER_ROOT"] }
29
+ after { ENV["BUSSER_ROOT"] = ENV.delete("_SPEC_BUSSER_ROOT") }
30
30
 
31
31
  it "returns a base path if no suite name is given" do
32
- ENV['BUSSER_ROOT'] = "/path/to/busser"
32
+ ENV["BUSSER_ROOT"] = "/path/to/busser"
33
33
  _(suite_path.to_s).must_match %r{/path/to/busser/suites$}
34
34
  end
35
35
 
36
36
  it "returns a suite path given a suite name" do
37
- ENV['BUSSER_ROOT'] = "/path/to/busser"
37
+ ENV["BUSSER_ROOT"] = "/path/to/busser"
38
38
  _(suite_path("fuzzy").to_s).must_match %r{/path/to/busser/suites/fuzzy$}
39
39
  end
40
40
  end
@@ -59,16 +59,16 @@ describe Busser::Helpers do
59
59
 
60
60
  describe "with a custom root path" do
61
61
 
62
- before { ENV['_SPEC_BUSSER_ROOT'] = ENV['BUSSER_ROOT'] }
63
- after { ENV['BUSSER_ROOT'] = ENV.delete('_SPEC_BUSSER_ROOT') }
62
+ before { ENV["_SPEC_BUSSER_ROOT"] = ENV["BUSSER_ROOT"] }
63
+ after { ENV["BUSSER_ROOT"] = ENV.delete("_SPEC_BUSSER_ROOT") }
64
64
 
65
65
  it "returns a base path if no product name is given" do
66
- ENV['BUSSER_ROOT'] = "/path/to/busser"
66
+ ENV["BUSSER_ROOT"] = "/path/to/busser"
67
67
  _(vendor_path.to_s).must_match %r{/path/to/busser/vendor$}
68
68
  end
69
69
 
70
70
  it "returns a suite path given a product name" do
71
- ENV['BUSSER_ROOT'] = "/path/to/busser"
71
+ ENV["BUSSER_ROOT"] = "/path/to/busser"
72
72
  _(vendor_path("maximal").to_s).must_match \
73
73
  %r{/path/to/busser/vendor/maximal$}
74
74
  end
@@ -1,4 +1,3 @@
1
- # -*- encoding: utf-8 -*-
2
1
  #
3
2
  # Licensed under the Apache License, Version 2.0 (the "License");
4
3
  # you may not use this file except in compliance with the License.
@@ -1,6 +1,6 @@
1
- require_relative '../spec_helper'
1
+ require_relative "../spec_helper"
2
2
 
3
- require 'busser/ui'
3
+ require "busser/ui"
4
4
 
5
5
  # Dummy class containing diagnostic methods approximating Thor mixins
6
6
  class SneakyUI
@@ -11,7 +11,7 @@ class SneakyUI
11
11
  attr_accessor :status
12
12
 
13
13
  def say(msg)
14
- msg
14
+ msg
15
15
  end
16
16
 
17
17
  def error(msg)
@@ -111,7 +111,7 @@ describe Busser::UI do
111
111
 
112
112
  _(ui.run_args).must_equal([
113
113
  "doitpls",
114
- { :capture => false, :verbose => false}
114
+ { capture: false, verbose: false },
115
115
  ])
116
116
  end
117
117
 
@@ -181,16 +181,16 @@ describe Busser::UI do
181
181
 
182
182
  _(ui.run_ruby_script_args).must_equal([
183
183
  "theworks.rb",
184
- { :capture => false, :verbose => false }
184
+ { capture: false, verbose: false },
185
185
  ])
186
186
  end
187
187
 
188
188
  it "calls #run_ruby_script with correct default options" do
189
- ui.invoke_run_ruby_script!("theworks.rb", :verbose => true)
189
+ ui.invoke_run_ruby_script!("theworks.rb", verbose: true)
190
190
 
191
191
  _(ui.run_ruby_script_args).must_equal([
192
192
  "theworks.rb",
193
- { :capture => false, :verbose => true }
193
+ { capture: false, verbose: true },
194
194
  ])
195
195
  end
196
196
 
data/spec/spec_helper.rb CHANGED
@@ -1,4 +1,3 @@
1
- # -*- encoding: utf-8 -*-
2
1
  #
3
2
  # Author:: Fletcher Nichol (<fnichol@nichol.ca>)
4
3
  #
@@ -16,5 +15,5 @@
16
15
  # See the License for the specific language governing permissions and
17
16
  # limitations under the License.
18
17
 
19
- require 'minitest/autorun'
20
- require 'mocha/minitest'
18
+ require "minitest/autorun"
19
+ require "mocha/minitest"
@@ -1,3 +1,10 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
3
  gemspec
4
+
5
+ group :test do
6
+ gem 'aruba', '>= 2.4'
7
+ gem 'base64', '>= 0.3' # cucumber needs it; not a default gem on Ruby 4.0
8
+ gem 'cucumber', '>= 11.1'
9
+ gem 'rake', '>= 13.4'
10
+ end
@@ -2,7 +2,11 @@ require "bundler/gem_tasks"
2
2
  require "cucumber/rake/task"
3
3
 
4
4
  Cucumber::Rake::Task.new(:features) do |t|
5
- t.cucumber_opts = ["features", "-x", "--format progress", "--no-color"]
5
+ # --strict-undefined so the scenarios generated with <YOUR_FILE> placeholders
6
+ # fail until they are filled in. Undefined steps otherwise pass silently, and
7
+ # a new plugin reports a green suite that asserts nothing.
8
+ t.cucumber_opts = ["features", "--format progress", "--fail-fast",
9
+ "--strict-undefined"]
6
10
  end
7
11
 
8
12
  desc "Run all test suites"
@@ -1,13 +1,8 @@
1
1
  require "aruba/cucumber"
2
2
  require "busser/cucumber"
3
3
 
4
+ # Installing a plugin and its gems into a cold sandbox does not fit in aruba's
5
+ # 15 second default.
4
6
  Aruba.configure do |config|
5
- config.exit_timeout = 20
6
- end
7
-
8
- After do |s|
9
- # Tell Cucumber to quit after this scenario is done - if it failed.
10
- # This is useful to inspect the 'tmp/aruba' directory before any other
11
- # steps are executed and clear it out.
12
- Cucumber.wants_to_quit = true if s.failed?
7
+ config.exit_timeout = 60
13
8
  end
@@ -15,15 +15,11 @@ Gem::Specification.new do |spec|
15
15
  spec.license = '<%= config[:license_spdx] %>'
16
16
  <% end -%>
17
17
 
18
- spec.files = `git ls-files`.split($/)
18
+ spec.files = `git ls-files -z`.split("\x0")
19
19
  spec.executables = []
20
20
  spec.require_paths = ['lib']
21
21
 
22
22
  spec.required_ruby_version = '>= 3.2'
23
23
 
24
- spec.add_dependency 'busser'
25
-
26
- spec.add_development_dependency 'rake'
27
- spec.add_development_dependency 'aruba', '>= 2.0'
28
- spec.add_development_dependency 'cucumber', '>= 9.0'
24
+ spec.add_dependency 'busser', '>= 0.9.0'
29
25
  end
@@ -16,7 +16,7 @@ jobs:
16
16
  strategy:
17
17
  fail-fast: false
18
18
  matrix:
19
- ruby: ["3.2", "3.3", "3.4"]
19
+ ruby: ["3.2", "3.3", "3.4", "4.0"]
20
20
  steps:
21
21
  - uses: actions/checkout@v5
22
22
  - uses: ruby/setup-ruby@v1
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env bash
2
+ # Runs on the machine under test, put there by Busser and executed by
3
+ # busser-bash. Exit status is the verdict.
4
+ set -euo pipefail
5
+
6
+ # Busser exports these for the suite, and getting them wrong is how the
7
+ # isolated gem environment silently stops being isolated.
8
+ test -n "${BUSSER_ROOT:-}"
9
+ test -d "${BUSSER_ROOT}"
10
+ test -x "${BUSSER_ROOT}/bin/busser"
11
+
12
+ echo "busser handed this script to busser-bash under ${BUSSER_ROOT}"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: busser
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.1
4
+ version: 0.9.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Fletcher Nichol
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-08-28 00:00:00.000000000 Z
11
+ date: 2026-10-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -38,62 +38,6 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
- - !ruby/object:Gem::Dependency
42
- name: aruba
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - ">="
46
- - !ruby/object:Gem::Version
47
- version: '2.0'
48
- type: :development
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- version: '2.0'
55
- - !ruby/object:Gem::Dependency
56
- name: minitest
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - ">="
60
- - !ruby/object:Gem::Version
61
- version: '0'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - ">="
67
- - !ruby/object:Gem::Version
68
- version: '0'
69
- - !ruby/object:Gem::Dependency
70
- name: mocha
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- version: '0'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - ">="
81
- - !ruby/object:Gem::Version
82
- version: '0'
83
- - !ruby/object:Gem::Dependency
84
- name: rake
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - ">="
88
- - !ruby/object:Gem::Version
89
- version: '0'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - ">="
95
- - !ruby/object:Gem::Version
96
- version: '0'
97
41
  description: Busser - Runs tests for projects in Test Kitchen
98
42
  email:
99
43
  - fnichol@nichol.ca
@@ -103,6 +47,7 @@ extensions: []
103
47
  extra_rdoc_files: []
104
48
  files:
105
49
  - ".github/workflows/ci.yml"
50
+ - ".github/workflows/integration.yml"
106
51
  - ".github/workflows/pr-title.yml"
107
52
  - ".github/workflows/publish.yml"
108
53
  - ".gitignore"
@@ -126,6 +71,8 @@ files:
126
71
  - features/suite_cleanup_command.feature
127
72
  - features/suite_path_command.feature
128
73
  - features/support/env.rb
74
+ - kitchen-preinstall.sh
75
+ - kitchen.yml
129
76
  - lib/busser.rb
130
77
  - lib/busser/cli.rb
131
78
  - lib/busser/command/deserialize.rb
@@ -152,7 +99,10 @@ files:
152
99
  - renovate.json
153
100
  - spec/busser/command/deserialize_spec.rb
154
101
  - spec/busser/command/plugin_create_spec.rb
102
+ - spec/busser/command/plugin_install_spec.rb
103
+ - spec/busser/command/plugin_list_spec.rb
155
104
  - spec/busser/command/setup_spec.rb
105
+ - spec/busser/command/test_spec.rb
156
106
  - spec/busser/helpers_spec.rb
157
107
  - spec/busser/plugin_spec.rb
158
108
  - spec/busser/ui_spec.rb
@@ -174,10 +124,16 @@ files:
174
124
  - templates/plugin/license_reserved.erb
175
125
  - templates/plugin/runner_plugin.rb.erb
176
126
  - templates/plugin/version.rb.erb
127
+ - test/integration/default/bash/smoke_test.sh
177
128
  homepage: https://github.com/test-kitchen/busser
178
129
  licenses:
179
130
  - Apache-2.0
180
- metadata: {}
131
+ metadata:
132
+ bug_tracker_uri: https://github.com/test-kitchen/busser/issues
133
+ changelog_uri: https://github.com/test-kitchen/busser/blob/main/CHANGELOG.md
134
+ documentation_uri: https://github.com/test-kitchen/busser/blob/main/README.md
135
+ homepage_uri: https://github.com/test-kitchen/busser
136
+ source_code_uri: https://github.com/test-kitchen/busser
181
137
  post_install_message:
182
138
  rdoc_options: []
183
139
  require_paths: