boxes 2.5.0 → 3.0.0

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 (46) hide show
  1. checksums.yaml +4 -4
  2. data/.hound.yml +2 -0
  3. data/.rubocop.yml +640 -0
  4. data/.ruby-version +1 -1
  5. data/.travis.yml +0 -2
  6. data/CHANGELOG.md +21 -0
  7. data/Rakefile +17 -22
  8. data/boxes.gemspec +3 -4
  9. data/lib/boxes/command.rb +5 -5
  10. data/lib/boxes/testing.rb +6 -0
  11. data/lib/boxes/testing/command.rb +23 -0
  12. data/lib/boxes/testing/matchers.rb +16 -0
  13. data/lib/boxes/testing/matchers/base_matcher.rb +21 -0
  14. data/lib/boxes/testing/matchers/have_exit_status_matcher.rb +19 -0
  15. data/lib/boxes/testing/matchers/write_to_stdout_matcher.rb +23 -0
  16. data/lib/boxes/version.rb +1 -2
  17. data/scripts/postinstall.sh +2 -2
  18. data/scripts/ruby.sh +7 -7
  19. data/scripts/vmtools.sh +1 -0
  20. data/spec/acceptance/user_builds_box_spec.rb +51 -0
  21. data/spec/acceptance/user_cleans_the_env_spec.rb +15 -0
  22. data/spec/acceptance/user_shows_the_env_spec.rb +49 -0
  23. data/spec/acceptance/user_views_env_help_spec.rb +18 -0
  24. data/spec/acceptance/user_views_help_spec.rb +39 -0
  25. data/spec/acceptance/user_views_version_spec.rb +10 -0
  26. data/spec/acceptance_helper.rb +15 -0
  27. data/spec/boxes/subprocess_spec.rb +4 -1
  28. data/spec/boxes/testing/command_spec.rb +28 -0
  29. data/spec/boxes/testing/matchers/have_exit_status_matcher_spec.rb +33 -0
  30. data/spec/boxes/testing/matchers/write_to_stdout_matcher_spec.rb +33 -0
  31. data/spec/support/env.rb +5 -0
  32. data/spec/support/subprocess_command.sh +7 -0
  33. data/spec/support/tmp.rb +17 -0
  34. data/spec/tmp/.gitkeep +0 -0
  35. data/templates/debian/jessie64.erb +2 -2
  36. data/templates/debian/preseed.cfg +5 -1
  37. data/templates/debian/stretch64.erb +60 -0
  38. data/templates/ubuntu/trusty64.erb +2 -2
  39. data/templates/ubuntu/xenial64.erb +2 -2
  40. metadata +45 -33
  41. data/features/boxes.feature +0 -8
  42. data/features/build.feature +0 -16
  43. data/features/env.feature +0 -18
  44. data/features/support/env.rb +0 -1
  45. data/spec/support/subprocess_command.rb +0 -7
  46. data/templates/ubuntu/wily64.erb +0 -64
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- ruby-2.3.1
1
+ ruby-2.4.2
data/.travis.yml CHANGED
@@ -1,3 +1 @@
1
1
  language: ruby
2
- rvm:
3
- - 2.2.2
data/CHANGELOG.md CHANGED
@@ -1,5 +1,26 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## 3.0.0 (05/02/2018)
4
+
5
+ * Update scripts/ruby.sh to follow ruby-lang.org current Rubies ([48]).
6
+ * Fix a bug with Shell Path Expansion ([44]).
7
+ * Add acceptance testing using RSpec ([43], [48], [49]).
8
+ * Remove Cucumber ([42]).
9
+ * Update Ubuntu Xenial to 16.04.3 ([40]).
10
+ * Update Ubuntu Trusty to 14.04.5 ([39]).
11
+ * Update Debian Stretch to 9.3.0 ([38]).
12
+ * Add support for Debian Stretch (9.1).
13
+ * Drop support for Ubuntu Wily 15.10.
14
+ * Switch to a working mirror for Debian Jessie.
15
+
16
+ [38]: https://github.com/nickcharlton/boxes/pull/38
17
+ [40]: https://github.com/nickcharlton/boxes/pull/40
18
+ [42]: https://github.com/nickcharlton/boxes/pull/42
19
+ [43]: https://github.com/nickcharlton/boxes/pull/43
20
+ [44]: https://github.com/nickcharlton/boxes/pull/44
21
+ [48]: https://github.com/nickcharlton/boxes/pull/48
22
+ [49]: https://github.com/nickcharlton/boxes/pull/49
23
+
3
24
  ## 2.5.0 (20/01/2017)
4
25
 
5
26
  * Add Ruby 2.3.3.
data/Rakefile CHANGED
@@ -1,34 +1,29 @@
1
- #!/usr/bin/env rake
2
-
3
1
  begin
4
- require 'bundler/setup'
2
+ require "bundler/setup"
5
3
  rescue LoadError
6
- puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
4
+ puts "You must `gem install bundler` and `bundle install` to run rake tasks"
7
5
  end
8
6
 
9
- require 'bundler/gem_tasks'
7
+ require "bundler/gem_tasks"
10
8
 
11
9
  ##
12
10
  # Configure the test suite.
13
11
  ##
14
- require 'rspec/core'
15
- require 'rspec/core/rake_task'
16
-
17
- RSpec::Core::RakeTask.new
12
+ require "rspec/core"
13
+ require "rspec/core/rake_task"
18
14
 
19
- ##
20
- # Cucumber for feature testing.
21
- ##
22
- require 'rake/clean'
23
- require 'cucumber'
24
- require 'cucumber/rake/task'
15
+ task(:spec).clear
16
+ desc "Run specs other than spec/acceptance"
17
+ RSpec::Core::RakeTask.new("spec") do |task|
18
+ task.exclude_pattern = "spec/acceptance/**/*_spec.rb"
19
+ task.verbose = false
20
+ end
25
21
 
26
- Cucumber::Rake::Task.new(:features) do |t|
27
- t.cucumber_opts = 'features --format pretty -x'
28
- t.fork = false
22
+ desc "Run acceptance specs in spec/acceptance"
23
+ RSpec::Core::RakeTask.new("spec:acceptance") do |task|
24
+ task.pattern = "spec/acceptance/**/*_spec.rb"
25
+ task.verbose = false
29
26
  end
30
27
 
31
- ##
32
- # By default, just run the tests.
33
- ##
34
- task default: :spec
28
+ desc "Run the specs and acceptance tests"
29
+ task default: %w(spec spec:acceptance)
data/boxes.gemspec CHANGED
@@ -30,10 +30,9 @@ Gem::Specification.new do |spec|
30
30
  spec.add_dependency "colored"
31
31
 
32
32
  spec.add_development_dependency "bundler"
33
- spec.add_development_dependency "rake"
34
- spec.add_development_dependency "rspec"
35
- spec.add_development_dependency "cucumber"
36
- spec.add_development_dependency "aruba"
33
+ spec.add_development_dependency "climate_control"
37
34
  spec.add_development_dependency "fakefs"
38
35
  spec.add_development_dependency "pry"
36
+ spec.add_development_dependency "rake"
37
+ spec.add_development_dependency "rspec"
39
38
  end
data/lib/boxes/command.rb CHANGED
@@ -1,12 +1,12 @@
1
1
  module Boxes
2
- # Class which encapsulates the command line handling.
3
2
  class Command < CLAide::Command
4
- require 'boxes/command/build'
5
- require 'boxes/command/env'
3
+ require "boxes/command/build"
4
+ require "boxes/command/env"
6
5
 
7
6
  self.abstract_command = true
8
- self.command = 'boxes'
7
+ self.command = "boxes"
9
8
  self.version = VERSION
10
- self.description = 'Toolkit for building Vagrantboxes, VM and cloud images.'
9
+ self.description = "A command line tool that takes the complexity out " \
10
+ "of building Vagrant boxes."
11
11
  end
12
12
  end
@@ -0,0 +1,6 @@
1
+ module Boxes
2
+ module Testing
3
+ require "boxes/testing/command"
4
+ require "boxes/testing/matchers"
5
+ end
6
+ end
@@ -0,0 +1,23 @@
1
+ module Boxes
2
+ module Testing
3
+ module Command
4
+ attr_reader :response
5
+
6
+ def run_command(cmd)
7
+ stdout = `#{cmd}`
8
+
9
+ @response = Response.new(cmd, stdout, $?.exitstatus)
10
+ end
11
+
12
+ class Response
13
+ attr_accessor :cmd, :stdout, :exit_status
14
+
15
+ def initialize(cmd, stdout, exit_status)
16
+ @cmd = cmd
17
+ @stdout = stdout
18
+ @exit_status = exit_status
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,16 @@
1
+ module Boxes
2
+ module Testing
3
+ module Matchers
4
+ require "boxes/testing/matchers/have_exit_status_matcher"
5
+ require "boxes/testing/matchers/write_to_stdout_matcher"
6
+
7
+ def have_exit_status(status)
8
+ HaveExitStatusMatcher.new(status)
9
+ end
10
+
11
+ def write_to_stdout(data)
12
+ WriteToStdoutMatcher.new(data)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,21 @@
1
+ module Boxes
2
+ module Testing
3
+ module Matchers
4
+ class BaseMatcher
5
+ attr_reader :actual, :expected
6
+
7
+ # we can't compare to nil, because we might want nil
8
+ UNDEFINED = Object.new.freeze
9
+
10
+ def initialize(expected = UNDEFINED)
11
+ @expected = expected unless UNDEFINED.equal?(expected)
12
+ end
13
+
14
+ def matches?(actual)
15
+ @actual = actual
16
+ match(actual, expected)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,19 @@
1
+ require "boxes/testing/matchers/base_matcher"
2
+
3
+ module Boxes
4
+ module Testing
5
+ module Matchers
6
+ class HaveExitStatusMatcher < BaseMatcher
7
+ def failure_message
8
+ "expected that `#{actual.cmd}` would exit with #{expected}"
9
+ end
10
+
11
+ private
12
+
13
+ def match(actual, expected)
14
+ expected == actual.exit_status
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,23 @@
1
+ require "boxes/testing/matchers/base_matcher"
2
+
3
+ module Boxes
4
+ module Testing
5
+ module Matchers
6
+ class WriteToStdoutMatcher < BaseMatcher
7
+ def failure_message
8
+ "expected that '#{clean(actual.stdout)}' would be #{clean(expected)}"
9
+ end
10
+
11
+ private
12
+
13
+ def match(actual, expected)
14
+ expected == actual.stdout
15
+ end
16
+
17
+ def clean(output)
18
+ output.gsub(/\n/, '\n')
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
data/lib/boxes/version.rb CHANGED
@@ -1,4 +1,3 @@
1
- # Versions and other declarations.
2
1
  module Boxes
3
- VERSION = "2.5.0".freeze
2
+ VERSION = "3.0.0".freeze
4
3
  end
@@ -34,10 +34,10 @@ curl -Lo /home/vagrant/.ssh/authorized_keys \
34
34
  chmod 0600 /home/vagrant/.ssh/authorized_keys
35
35
  chown -R vagrant:vagrant /home/vagrant/.ssh
36
36
 
37
- # under systemd based Ubuntu systems, networking breaks on first reboot
37
+ # under systemd distributions, networking breaks on first reboot
38
38
  # this is because it's renamed to follow the PCI slot
39
39
  case $(lsb_release -cs) in
40
- "wily" | "xenial")
40
+ "wily" | "xenial" | "stretch")
41
41
  sed -i "s/ens33/ens32/g" /etc/network/interfaces
42
42
  ;;
43
43
  *)
data/scripts/ruby.sh CHANGED
@@ -1,10 +1,10 @@
1
- #!/bin/bash
1
+ #!/bin/sh
2
2
 
3
3
  # this installs chruby, ruby-install and a selection of rubies and is used in
4
4
  # the 'ruby' special box type.
5
5
 
6
6
  chruby_version=0.3.9
7
- rubyinstall_version=0.6.0
7
+ rubyinstall_version=0.6.1
8
8
 
9
9
  # install chruby
10
10
  wget -O chruby-$chruby_version.tar.gz https://github.com/postmodern/chruby/archive/v$chruby_version.tar.gz
@@ -27,11 +27,11 @@ cd ruby-install-$rubyinstall_version/
27
27
  make install
28
28
 
29
29
  # install a set of recent MRI Rubies.
30
- ruby-install ruby 2.2.3
31
- ruby-install ruby 2.2.4
32
- ruby-install ruby 2.3.1
33
- ruby-install ruby 2.3.3
34
- ruby-install ruby 2.4.0
30
+ ruby-install ruby 2.1.10
31
+ ruby-install ruby 2.2.9
32
+ ruby-install ruby 2.3.6
33
+ ruby-install ruby 2.4.3
34
+ ruby-install ruby 2.5.0
35
35
 
36
36
  # update gems and install bundler
37
37
  source /usr/local/share/chruby/chruby.sh
data/scripts/vmtools.sh CHANGED
@@ -16,6 +16,7 @@ case $PACKER_BUILDER_TYPE in
16
16
  ;;
17
17
  'vmware-iso')
18
18
  echo "Installing VMware Tools..."
19
+ apt-get -qy install fuse
19
20
  mkdir -p /mnt/cdrom
20
21
  mount -o loop /home/vagrant/linux.iso /mnt/cdrom
21
22
 
@@ -0,0 +1,51 @@
1
+ require "acceptance_helper"
2
+
3
+ RSpec.describe "User builds box" do
4
+ describe "boxes build" do
5
+ it "shows help when the name option is missing" do
6
+ run_command("boxes build --provider=vmware --template=debian/jessie64")
7
+
8
+ expect(response).to have_exit_status(1)
9
+ expect(response.stdout).to include("[!] A name is required!")
10
+ expect_response_to_show_build_help
11
+ end
12
+
13
+ it "shows help when the provider option is missing" do
14
+ run_command("boxes build --name=example --template=debian/jessie64")
15
+
16
+ expect(response).to have_exit_status(1)
17
+ expect(response.stdout).to include("[!] A provider is required!")
18
+ expect_response_to_show_build_help
19
+ end
20
+
21
+ it "shows help when the template option is missing" do
22
+ run_command("boxes build --name=example --provider=vmware")
23
+
24
+ expect(response).to have_exit_status(1)
25
+ expect(response.stdout).to include("[!] A template is required!")
26
+ expect_response_to_show_build_help
27
+ end
28
+ end
29
+
30
+ def expect_response_to_show_build_help
31
+ expect(response.stdout).to include(
32
+ "Builds boxes using templates and scripts.",
33
+ )
34
+
35
+ expect(response.stdout).to include(
36
+ "--name The name for the build",
37
+ )
38
+
39
+ expect(response.stdout).to include(
40
+ "--provider=[virtualbox|vmware] The provider to build the box for",
41
+ )
42
+
43
+ expect(response.stdout).to include(
44
+ "--template Template to build the box with",
45
+ )
46
+
47
+ expect(response.stdout).to include(
48
+ "--scripts Scripts to apply to the box",
49
+ )
50
+ end
51
+ end
@@ -0,0 +1,15 @@
1
+ require "acceptance_helper"
2
+
3
+ RSpec.describe "User cleans the env" do
4
+ describe "boxes env" do
5
+ it "shows the environment details" do
6
+ mktmpdir
7
+
8
+ with_modified_env(BOXES_WORKING_DIR: tmpdir.to_s) do
9
+ run_command("boxes env clean")
10
+ end
11
+
12
+ expect(tmpdir).not_to exist
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,49 @@
1
+ require "acceptance_helper"
2
+
3
+ RSpec.describe "User shows the env" do
4
+ describe "boxes env" do
5
+ it "shows the environment details" do
6
+ run_command("boxes env")
7
+
8
+ expect(response).to have_exit_status(0)
9
+ expect_response_to_show_environment_details
10
+ end
11
+ end
12
+
13
+ describe "boxes env show" do
14
+ it "shows the environment details" do
15
+ run_command("boxes env show")
16
+
17
+ expect(response).to have_exit_status(0)
18
+ expect_response_to_show_environment_details
19
+ end
20
+ end
21
+
22
+ def expect_response_to_show_environment_details
23
+ expect(response.stdout).to include(
24
+ "WORKING_DIR=\"#{home_path('.boxes/tmp')}",
25
+ )
26
+ expect(response.stdout).to include("HOME_DIR=\"#{home_path('.boxes')}\"")
27
+
28
+ expect(response.stdout).to include(
29
+ "TEMPLATE_PATHS=\"#{project_path('templates')}\"",
30
+ )
31
+
32
+ expect(response.stdout).to include(
33
+ "SCRIPT_PATHS=\"#{project_path('scripts')}\"",
34
+ )
35
+
36
+ expect(response.stdout).to include(
37
+ "PACKER_CACHE_DIR=\"#{home_path('.boxes/packer_cache')}",
38
+ )
39
+ end
40
+
41
+ def project_path(subpath)
42
+ project_root = Pathname.new("../../").expand_path
43
+ project_root.join(subpath)
44
+ end
45
+
46
+ def home_path(subpath)
47
+ Pathname.new(Dir.home).join(subpath)
48
+ end
49
+ end
@@ -0,0 +1,18 @@
1
+ require "acceptance_helper"
2
+
3
+ RSpec.describe "User views env help" do
4
+ describe "boxes env" do
5
+ it "describes available subcommands" do
6
+ run_command("boxes env --help")
7
+
8
+ expect(response).to have_exit_status(0)
9
+ expect(response.stdout).to include(
10
+ "+ clean Clean up the environment.",
11
+ )
12
+
13
+ expect(response.stdout).to include(
14
+ "> show Show the environment and configuration",
15
+ )
16
+ end
17
+ end
18
+ end