vagrant-timezone 1.2.0 → 1.3.0

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
- SHA1:
3
- metadata.gz: 3dc9ef7975ca29976ae085bd1c28252c4313af33
4
- data.tar.gz: da79dd0f54ab3c13b1d5b92e104d13dcc8936b6a
2
+ SHA256:
3
+ metadata.gz: 4f3f7a021665f40589dcca99456a0d051b841a066b96e0acb2519724d7f6e418
4
+ data.tar.gz: d99773373bc1d2d3f9c520ed211e82738a5e894f835eb5bfd64b20b768ac6299
5
5
  SHA512:
6
- metadata.gz: 2b4b013626bb6dd6464dfbc092af93cfedbd5742af68cfb0c6b5a350e49e8904de2a2ddd7e8fbca0c34247a7605b0fd3c43c4d5944d386e749d2bcf853649da8
7
- data.tar.gz: a4763abc1213a5d355fe3161e76036aeab4255483266a721f67d53bbe33dd3937ded25e32539fdcd0c6f809a084e179f0303a3e00015c2151da93613a0c8ac8a
6
+ metadata.gz: df75274bfc5c09b51d5972d8c0c70330d99118af12118f8eda3a30a77d5bfc623ef599637d6955d883aa746875b46137b1a231a8c70a36dafb013ab3d96e98a2
7
+ data.tar.gz: bf6fcae47144ad121424154ae803223e0c062571f9d93ac358853724c859c27c6cadd1ba0f95262178b9250168e7a457a1bec46721af3bd55ea3011eb8306f15
data/.gitignore CHANGED
@@ -1,3 +1,4 @@
1
1
  /.bundle
2
2
  /Gemfile.lock
3
3
  *.gem
4
+ /test/acceptance/boxes/
data/.rspec ADDED
@@ -0,0 +1,5 @@
1
+ --color
2
+ --default-path test
3
+ --format documentation
4
+ --order random
5
+ --require spec_helper
@@ -0,0 +1,42 @@
1
+ AllCops:
2
+ DisplayStyleGuide: true
3
+ ExtraDetails: true
4
+ TargetRubyVersion: 2.2
5
+
6
+ Layout/AlignHash:
7
+ EnforcedHashRocketStyle: table
8
+ EnforcedColonStyle: table
9
+
10
+ Metrics/BlockLength:
11
+ Exclude:
12
+ - '*.gemspec'
13
+ - '**/*.rake'
14
+ - '**/*_spec.rb'
15
+
16
+ Metrics/ClassLength:
17
+ Severity: warning
18
+
19
+ Metrics/LineLength:
20
+ Max: 100
21
+ Severity: warning
22
+
23
+ Metrics/MethodLength:
24
+ Max: 13
25
+ Severity: warning
26
+
27
+ Naming/FileName:
28
+ Exclude:
29
+ - 'lib/vagrant-timezone.rb'
30
+ - '**/vagrant-spec.config.rb'
31
+
32
+ Style/GuardClause:
33
+ MinBodyLength: 3
34
+
35
+ Style/NegatedIf:
36
+ Enabled: false
37
+
38
+ Style/TrailingCommaInArrayLiteral:
39
+ Enabled: false
40
+
41
+ Style/TrailingCommaInHashLiteral:
42
+ Enabled: false
@@ -2,19 +2,24 @@ language: ruby
2
2
  cache: bundler
3
3
  sudo: false
4
4
 
5
- before_install:
6
- - rvm @global do gem uninstall bundler --all --executables
7
- - gem uninstall bundler --all --executables
8
- - gem install bundler --version '~> 1.5.2'
9
- - bundle --version
10
5
  bundler_args: --without=development
11
6
 
12
- rvm: 2.2.5
13
- env: VAGRANT_VERSION=v1.9.1
7
+ script:
8
+ - bundle exec rake test:unit
9
+ - bundle exec rake style
10
+
11
+ env:
12
+ global:
13
+ - NOKOGIRI_USE_SYSTEM_LIBRARIES=true
14
+
15
+ rvm: 2.4.4
14
16
  matrix:
15
17
  include:
16
- - env: VAGRANT_VERSION=v1.2.7
17
- rvm: 1.9.3
18
+ - env: VAGRANT_VERSION=v2.2.3
19
+ - env: VAGRANT_VERSION=v2.0.4
20
+ - env:
21
+ - VAGRANT_VERSION=v1.9.8
22
+ rvm: 2.2.5
18
23
  - env: VAGRANT_VERSION=master
19
24
  allow_failures:
20
25
  - env: VAGRANT_VERSION=master
@@ -1,3 +1,15 @@
1
+ # 1.3.0 / 2019-01-10
2
+
3
+ - Use `timedatectl` on all Linux distributions if found ([GH-10][], [GH-7][], [GH-5][])
4
+ * `systemd` is now used on many Linux distros (e.g. Debian based ones)
5
+
6
+ - Improve testing by adding acceptance and style tests ([GH-11][])
7
+
8
+ [GH-5]: https://github.com/tmatilai/vagrant-timezone/issues/5 "Issue 5"
9
+ [GH-7]: https://github.com/tmatilai/vagrant-timezone/issues/7 "Issue 7"
10
+ [GH-10]: https://github.com/tmatilai/vagrant-timezone/issues/10 "Issue 10"
11
+ [GH-11]: https://github.com/tmatilai/vagrant-timezone/issues/11 "Issue 11"
12
+
1
13
  # 1.2.0 / 2017-02-25
2
14
 
3
15
  Features:
data/Gemfile CHANGED
@@ -1,12 +1,23 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source 'https://rubygems.org'
2
4
 
3
5
  gem 'vagrant',
4
- git: 'https://github.com/mitchellh/vagrant.git',
5
- tag: ENV.fetch('VAGRANT_VERSION', 'v1.9.1')
6
+ git: 'https://github.com/hashicorp/vagrant.git',
7
+ tag: ENV.fetch('VAGRANT_VERSION', 'v2.2.3')
6
8
 
7
9
  gem 'rake'
8
10
  gem 'rspec', '~> 3.1'
11
+ gem 'rubocop', '~> 0.62'
12
+
13
+ gem 'vagrant-spec',
14
+ git: 'https://github.com/hashicorp/vagrant-spec.git'
15
+
16
+ group :development do
17
+ gem 'guard-rspec', '~> 4.7'
18
+ gem 'guard-rubocop', '~> 1.3'
19
+ end
9
20
 
10
21
  group :plugins do
11
- gem 'vagrant-timezone', path: '.'
22
+ gemspec
12
23
  end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ spec_dir = 'test/unit'
4
+
5
+ group :ruby, halt_on_fail: true do
6
+ guard :rspec, cmd: 'bundle exec rspec --format progress', spec_paths: [spec_dir] do
7
+ # RSpec files
8
+ watch('test/spec_helper.rb') { spec_dir }
9
+ watch(%r{^#{spec_dir}/.+_spec\.rb$})
10
+
11
+ # Ruby files
12
+ watch(%r{^lib/(.+)\.rb$}) { |m| "#{spec_dir}/#{m[1]}_spec.rb" }
13
+ end
14
+
15
+ guard :rubocop do
16
+ watch(/\.rb$/)
17
+ watch(/\.gemspec$/)
18
+ watch('Gemfile')
19
+ watch('Rakefile')
20
+ watch(%r{/Vagrantfile$})
21
+ watch('.rubocop.yml') { '.' }
22
+ end
23
+ end
@@ -1,6 +1,6 @@
1
1
  The MIT License
2
2
 
3
- Copyright (c) 2014-2017 Teemu Matilainen <teemu.matilainen@iki.fi>
3
+ Copyright (c) 2014-2019 Teemu Matilainen <teemu.matilainen@iki.fi>
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -45,14 +45,14 @@ The plugin is supposed to be compatible with all Vagrant providers and other plu
45
45
 
46
46
  At the moment the supported platforms include:
47
47
 
48
- - Linux:
48
+ - All Linux guests. Confirmed at least:
49
49
  * Arch
50
50
  * CoreOS
51
51
  * Debian (and derivatives)
52
52
  * Gentoo
53
53
  * RedHat (and derivatives)
54
54
 
55
- - BSD:
55
+ - All BSD guests:
56
56
  * FreeBSD
57
57
  * NetBSD
58
58
  * OpenBSD
data/Rakefile CHANGED
@@ -1,14 +1,30 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'bundler/gem_tasks'
2
4
  require 'rspec/core/rake_task'
5
+ require 'rubocop/rake_task'
3
6
 
4
- task default: 'test:unit'
7
+ task default: ['test:unit', 'style']
5
8
 
6
- # Remove 'install' task as the gem is installed to Vagrant, not to system
7
- Rake::Task[:install].clear
9
+ desc 'Run all tests'
10
+ task test: ['test:unit', 'test:acceptance']
8
11
 
9
12
  namespace :test do
10
- RSpec::Core::RakeTask.new('unit') do |task|
11
- task.pattern = 'spec/unit/**/*_spec.rb'
13
+ desc 'Run unit tests'
14
+ RSpec::Core::RakeTask.new(:unit) do |task|
15
+ task.pattern = 'test/unit/**/*_spec.rb'
12
16
  end
17
+
18
+ load 'tasks/acceptance.rake'
19
+ end
20
+
21
+ desc 'Run all style checks'
22
+ task style: ['style:ruby']
23
+
24
+ namespace :style do
25
+ desc 'Run style checks for Ruby'
26
+ RuboCop::RakeTask.new(:ruby)
13
27
  end
14
- task spec: ['test:unit']
28
+
29
+ # Remove 'install' task as the gem is installed to Vagrant, not to system
30
+ Rake::Task[:install].clear
@@ -5,19 +5,20 @@ module VagrantPlugins
5
5
  module Action
6
6
  # Vagrant middleware action that sets the specified time zone
7
7
  class SetTimeZone
8
- def initialize(app, env)
8
+ def initialize(app, _env)
9
9
  @app = app
10
10
  end
11
11
 
12
- def call(env)
12
+ def call(env) # rubocop:disable Metrics/AbcSize
13
13
  @app.call(env)
14
14
 
15
15
  machine = env[:machine]
16
16
  timezone = machine.config.timezone.value
17
+
17
18
  if timezone.nil?
18
19
  logger.info I18n.t('vagrant_timezone.not_enabled')
19
20
  elsif machine.guest.capability?(:change_timezone)
20
- env[:ui].info I18n.t('vagrant_timezone.configuring')
21
+ env[:ui].info I18n.t('vagrant_timezone.configuring', zone: timezone)
21
22
  machine.guest.capability(:change_timezone, timezone)
22
23
  else
23
24
  logger.info I18n.t('vagrant_timezone.not_supported')
@@ -1,10 +1,12 @@
1
+ require_relative 'linux'
2
+
1
3
  module VagrantPlugins
2
4
  module TimeZone
3
5
  module Cap
4
6
  # Debian capabilities for changing time zone
5
- class Debian
6
- # Set the time zone
7
- def self.change_timezone(machine, timezone)
7
+ class Debian < Linux
8
+ # Set the time zone if `timedatectl` is not found
9
+ def self.change_timezone_generic(machine, timezone)
8
10
  machine.communicate.tap do |comm|
9
11
  comm.sudo("echo '#{timezone}' > /etc/timezone")
10
12
  comm.sudo('dpkg-reconfigure --frontend noninteractive tzdata')
@@ -1,17 +1,17 @@
1
+ require_relative 'linux'
2
+
1
3
  module VagrantPlugins
2
4
  module TimeZone
3
5
  module Cap
4
6
  # Gentoo capabilities for changing time zone
5
- class Gentoo
6
- # Set the time zone
7
- def self.change_timezone(machine, timezone)
7
+ class Gentoo < Linux
8
+ # Set the time zone if `timedatectl` is not found
9
+ def self.change_timezone_generic(machine, timezone)
8
10
  machine.communicate.tap do |comm|
9
- if comm.test('which timedatectl', sudo: true)
10
- comm.sudo("timedatectl set-timezone '#{timezone}'")
11
- else
12
- comm.sudo("echo '#{timezone}' > /etc/timezone")
13
- comm.sudo('emerge --config timezone-data')
14
- end
11
+ super
12
+
13
+ comm.sudo("echo '#{timezone}' > /etc/timezone")
14
+ comm.sudo('emerge --config timezone-data')
15
15
  end
16
16
  end
17
17
  end
@@ -0,0 +1,35 @@
1
+ require_relative 'unix'
2
+
3
+ module VagrantPlugins
4
+ module TimeZone
5
+ module Cap
6
+ # Generic Linix capability for changing time zone
7
+ class Linux
8
+ # Set the time zone.
9
+ # Uses `timedatectl` if found.
10
+ def self.change_timezone(machine, timezone)
11
+ if timedatectl?(machine)
12
+ change_timezone_timedatectl(machine, timezone)
13
+ else
14
+ change_timezone_generic(machine, timezone)
15
+ end
16
+ end
17
+
18
+ def self.timedatectl?(machine)
19
+ machine.communicate.test('which timedatectl', sudo: true)
20
+ end
21
+
22
+ def self.change_timezone_timedatectl(machine, timezone)
23
+ machine.communicate.sudo("timedatectl set-timezone '#{timezone}'")
24
+ end
25
+
26
+ # Set the time zone if `timedatectl` is not found.
27
+ # Defaults to `Unix.change_timezone`, but is overridden by distro
28
+ # specific classes.
29
+ def self.change_timezone_generic(machine, timezone)
30
+ Unix.change_timezone(machine, timezone)
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -1,16 +1,17 @@
1
- require_relative 'unix'
1
+ require_relative 'linux'
2
2
 
3
3
  module VagrantPlugins
4
4
  module TimeZone
5
5
  module Cap
6
6
  # RedHat capabilities for changing time zone
7
- class RedHat < Unix
8
- # Set the time zone
9
- def self.change_timezone(machine, timezone)
7
+ class RedHat < Linux
8
+ # Set the time zone if `timedatectl` is not found
9
+ def self.change_timezone_generic(machine, timezone)
10
10
  super
11
11
 
12
12
  machine.communicate.sudo(
13
- "echo 'ZONE=\"#{timezone}\"' > /etc/sysconfig/clock")
13
+ "echo 'ZONE=\"#{timezone}\"' > /etc/sysconfig/clock"
14
+ )
14
15
  end
15
16
  end
16
17
  end
@@ -26,7 +26,7 @@ module VagrantPlugins
26
26
 
27
27
  # We set timezone offset negative to match POSIX standards
28
28
  # https://github.com/eggert/tz/blob/master/etcetera
29
- @value = sprintf('Etc/GMT%+d', -(Time.now.utc_offset/3600))
29
+ @value = format('Etc/GMT%+d', -(Time.now.utc_offset / 3600))
30
30
  end
31
31
  end
32
32
  end
@@ -8,7 +8,7 @@ module VagrantPlugins
8
8
  # @!parse class Plugin < Vagrant::Plugin::V2::Plugin; end
9
9
  class Plugin < Vagrant.plugin('2')
10
10
  # Compatible Vagrant versions
11
- VAGRANT_VERSION_REQUIREMENT = '>= 1.2.0'
11
+ VAGRANT_VERSION_REQUIREMENT = '>= 1.2.0'.freeze
12
12
 
13
13
  # Returns true if the Vagrant version fulfills the requirements
14
14
  #
@@ -16,7 +16,8 @@ module VagrantPlugins
16
16
  # @return [Boolean]
17
17
  def self.check_vagrant_version(*requirements)
18
18
  Gem::Requirement.new(*requirements).satisfied_by?(
19
- Gem::Version.new(Vagrant::VERSION))
19
+ Gem::Version.new(Vagrant::VERSION)
20
+ )
20
21
  end
21
22
 
22
23
  # Verifies that the Vagrant version fulfills the requirements
@@ -24,18 +25,19 @@ module VagrantPlugins
24
25
  # @raise [VagrantPlugins::TimeZone::VagrantVersionError] if this plugin
25
26
  # is incompatible with the Vagrant version
26
27
  def self.check_vagrant_version!
27
- if !check_vagrant_version(VAGRANT_VERSION_REQUIREMENT)
28
- msg = I18n.t(
29
- 'vagrant_timezone.errors.vagrant_version',
30
- requirement: VAGRANT_VERSION_REQUIREMENT.inspect)
31
- $stderr.puts msg
32
- raise msg
33
- end
28
+ return if check_vagrant_version(VAGRANT_VERSION_REQUIREMENT)
29
+
30
+ msg = I18n.t(
31
+ 'vagrant_timezone.errors.vagrant_version',
32
+ requirement: VAGRANT_VERSION_REQUIREMENT.inspect
33
+ )
34
+ warn msg
35
+ raise msg
34
36
  end
35
37
 
36
38
  # Initializes the internationalization strings
37
39
  def self.setup_i18n
38
- I18n.load_path << File.expand_path('../../../locales/en.yml', __FILE__)
40
+ I18n.load_path << File.expand_path('../../locales/en.yml', __dir__)
39
41
  I18n.reload!
40
42
  end
41
43
 
@@ -59,17 +61,7 @@ module VagrantPlugins
59
61
  hook.after Vagrant::Action::Builtin::Provision, Action::SetTimeZone
60
62
  end
61
63
 
62
- guest_capability 'arch', 'change_timezone' do
63
- require_relative 'cap/arch'
64
- Cap::Arch
65
- end
66
-
67
- guest_capability 'coreos', 'change_timezone' do
68
- require_relative 'cap/coreos'
69
- Cap::CoreOS
70
- end
71
-
72
- guest_capability 'darwin', 'change_timezone' do
64
+ guest_capability 'bsd', 'change_timezone' do
73
65
  require_relative 'cap/unix'
74
66
  Cap::Unix
75
67
  end
@@ -79,24 +71,14 @@ module VagrantPlugins
79
71
  Cap::Debian
80
72
  end
81
73
 
82
- guest_capability 'freebsd', 'change_timezone' do
83
- require_relative 'cap/unix'
84
- Cap::Unix
85
- end
86
-
87
74
  guest_capability 'gentoo', 'change_timezone' do
88
75
  require_relative 'cap/gentoo'
89
76
  Cap::Gentoo
90
77
  end
91
78
 
92
- guest_capability 'netbsd', 'change_timezone' do
93
- require_relative 'cap/unix'
94
- Cap::Unix
95
- end
96
-
97
- guest_capability 'openbsd', 'change_timezone' do
98
- require_relative 'cap/unix'
99
- Cap::Unix
79
+ guest_capability 'linux', 'change_timezone' do
80
+ require_relative 'cap/linux'
81
+ Cap::Linux
100
82
  end
101
83
 
102
84
  guest_capability 'redhat', 'change_timezone' do
@@ -1,5 +1,5 @@
1
1
  module VagrantPlugins
2
2
  module TimeZone
3
- VERSION = '1.2.0'.freeze
3
+ VERSION = '1.3.0'.freeze
4
4
  end
5
5
  end
@@ -2,7 +2,7 @@ en:
2
2
  vagrant_timezone:
3
3
  not_enabled: "Time zone not configured"
4
4
  not_supported: "Setting time zone not supported"
5
- configuring: "Setting time zone..."
5
+ configuring: "Setting time zone to '%{zone}'..."
6
6
 
7
7
  errors:
8
8
  vagrant_version: |-
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../test/acceptance/support/box_helper'
4
+
5
+ desc 'Run all acceptance tests'
6
+ task acceptance: 'acceptance:all'
7
+
8
+ namespace :acceptance do
9
+ include VagrantTimezone::BoxHelper
10
+
11
+ task all: providers
12
+
13
+ providers.each do |provider|
14
+ desc "Run all acceptance tests for #{provider}"
15
+ task provider => provider.boxes.map { |box| "#{provider}:#{box}" }
16
+
17
+ namespace provider.name do
18
+ provider.boxes.each do |box|
19
+ desc "Run acceptance tests for #{box} on #{provider}"
20
+ task box.name => box.path do
21
+ env = {
22
+ 'VAGRANT_SPEC_PROVIDER' => provider.name,
23
+ 'VAGRANT_SPEC_BOX_PATH' => box.path.to_s
24
+ }
25
+ cmd = ['bundle', 'exec', 'vagrant-spec', 'test']
26
+ cmd << "--config=#{config_path('vagrant-spec.config.rb')}"
27
+
28
+ rake_output_message "Running acceptance tests for #{box} on #{provider}"
29
+ rake_output_message cmd.join(' ')
30
+ system(env, *cmd)
31
+ end
32
+
33
+ file box.path => provider.box_dir do
34
+ rake_output_message "Downloading #{box} for #{provider}"
35
+ download(box)
36
+ end
37
+
38
+ directory provider.box_dir
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,8 @@
1
+ virtualbox:
2
+ - ubuntu/bionic64
3
+ - debian/wheezy64
4
+ - centos/7
5
+ - archlinux/archlinux
6
+ - generic/gentoo
7
+ - generic/freebsd12
8
+ - generic/openbsd6
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../support/spec_helper.rb'
4
+
5
+ Vagrant::Spec::Acceptance.configure do |c|
6
+ provider = ENV.fetch('VAGRANT_SPEC_PROVIDER')
7
+ box_path = ENV.fetch('VAGRANT_SPEC_BOX_PATH')
8
+
9
+ c.component_paths = [File.expand_path('../vagrant-timezone', __dir__)]
10
+ c.skeleton_paths = [File.expand_path('../skeletons', __dir__)]
11
+
12
+ c.provider(provider, box_path: box_path)
13
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ timezone = ENV['VAGRANT_SPEC_TIMEZONE']
4
+ timezone = :host if timezone == ':host'
5
+
6
+ Vagrant.configure('2') do |config|
7
+ config.vm.box = 'box'
8
+
9
+ config.timezone.value = timezone if timezone
10
+ end
@@ -0,0 +1,112 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'cgi'
4
+ require 'fileutils'
5
+ require 'json'
6
+ require 'open-uri'
7
+ require 'pathname'
8
+ require 'tempfile'
9
+ require 'yaml'
10
+
11
+ module VagrantTimezone
12
+ module BoxHelper
13
+ ROOT_DIR = Pathname.new(__dir__).join('..')
14
+ BOX_DIR = ROOT_DIR.join('boxes')
15
+ CONFIG_DIR = ROOT_DIR.join('config')
16
+
17
+ def config_path(file_name)
18
+ CONFIG_DIR.join(file_name)
19
+ end
20
+
21
+ def providers
22
+ @providers ||= begin
23
+ data = IO.read(config_path('boxes.yaml'))
24
+ YAML.safe_load(data).map do |provider, boxes|
25
+ Provider.new(provider, boxes)
26
+ end
27
+ end
28
+ end
29
+
30
+ def download(box)
31
+ Downloader.download(box)
32
+ end
33
+
34
+ class Provider
35
+ attr_reader :name, :boxes
36
+
37
+ def initialize(name, box_names)
38
+ @name = name
39
+ @boxes = box_names.map { |box| Box.new(box, self) }
40
+ end
41
+
42
+ alias to_s name
43
+
44
+ def box_dir
45
+ @box_dir ||= BOX_DIR.join(name)
46
+ end
47
+ end
48
+
49
+ class Box
50
+ attr_reader :name, :provider
51
+
52
+ def initialize(name, provider)
53
+ %r{^[^/]+/[^/]+$}.match(name) ||
54
+ raise(ArgumentError, 'Box names must be in form of <user>/<box>')
55
+
56
+ @name = name
57
+ @provider = provider
58
+ end
59
+
60
+ alias to_s name
61
+
62
+ def path
63
+ @path ||= provider.box_dir.join("#{sanitized_name}.box")
64
+ end
65
+
66
+ def sanitized_name
67
+ name.tr('/', '_')
68
+ end
69
+
70
+ def metadata_url
71
+ user, box = name.split('/')
72
+ URI("https://app.vagrantup.com/#{CGI.escape(user)}/boxes/#{box}.json")
73
+ end
74
+ end
75
+
76
+ class Downloader
77
+ def self.download(box)
78
+ metadata = download_metadata(box)
79
+
80
+ url = find_url(metadata, box.provider)
81
+ raise StandardError, "No active versions found for #{box} for #{box.provider}" if !url
82
+
83
+ download_box(box, url)
84
+ end
85
+
86
+ def self.download_metadata(box)
87
+ data = box.metadata_url.open.read
88
+ JSON.parse(data)
89
+ end
90
+
91
+ def self.download_box(box, url)
92
+ case io = url.open
93
+ when Tempfile
94
+ io.close
95
+ FileUtils.mv(io.path, box.path)
96
+ else
97
+ IO.copy_stream(io, box.path)
98
+ end
99
+ end
100
+
101
+ def self.find_url(metadata, provider)
102
+ metadata['versions'].each do |v|
103
+ next if v['status'] != 'active'
104
+
105
+ v['providers'].each do |p|
106
+ return URI(p['url']) if p['name'] == provider.name
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end
112
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'vagrant-spec/acceptance'
4
+
5
+ # Dirty monkey patch to work around
6
+ # https://github.com/hashicorp/vagrant-spec/pull/17
7
+ module Vagrant
8
+ module Spec
9
+ class AcceptanceIsolatedEnvironment
10
+ attr_reader :env if !method_defined?(:env)
11
+ end
12
+ end
13
+ end
14
+
15
+ # Disable Vagrant's version checks
16
+ ENV['VAGRANT_CHECKPOINT_DISABLE'] = '1'
@@ -0,0 +1,82 @@
1
+ # frozen_string_literal: true
2
+
3
+ shared_examples 'provider/timezone' do |provider, options|
4
+ if !options[:box_path]
5
+ raise ArgumentError,
6
+ "'box_path' option must be specified for provider: #{provider}"
7
+ end
8
+
9
+ include_context 'acceptance'
10
+
11
+ if provider.to_s == 'virtualbox'
12
+ let(:extra_env) do
13
+ # Special magic for VirtualBox
14
+ { 'VBOX_USER_HOME' => '{{homedir}}' }
15
+ end
16
+ end
17
+
18
+ before do
19
+ environment.skeleton('timezone')
20
+ environment.env['VAGRANT_SPEC_TIMEZONE'] = timezone
21
+
22
+ assert_execute('vagrant', 'box', 'add', 'box', options[:box_path])
23
+ end
24
+
25
+ after do
26
+ execute('vagrant', 'destroy', '--force')
27
+ end
28
+
29
+ context 'when starting' do
30
+ context 'without configuration' do
31
+ let(:timezone) { nil }
32
+
33
+ it 'does not configure the time zone' do
34
+ result = assert_execute('vagrant', 'up', "--provider=#{provider}")
35
+ expect(result.stdout).not_to match(/Setting time zone/)
36
+ end
37
+ end
38
+
39
+ context 'with a time zone name' do
40
+ # Something without DST so that the offset is always known
41
+ let(:timezone) { 'America/Argentina/Buenos_Aires' }
42
+
43
+ it 'configures the specified time zone' do
44
+ result = assert_execute('vagrant', 'up', "--provider=#{provider}")
45
+ expect(result.stdout).to match(/Setting time zone to '#{timezone}'/)
46
+
47
+ result = assert_execute('vagrant', 'ssh', '-c', 'date "+TZ: %z"')
48
+ expect(result.stdout).to match(/^TZ: -0300$/)
49
+ end
50
+ end
51
+ end
52
+
53
+ context 'when reloading' do
54
+ context 'with :host' do
55
+ # First configure to something else than the host
56
+ let(:timezone) do
57
+ offset = host_offset[0, 3].to_i
58
+ offset = 10 if offset.zero?
59
+ # Negate the host offset!
60
+ # https://github.com/eggert/tz/blob/master/etcetera
61
+ Kernel.format('Etc/GMT%+d', offset)
62
+ end
63
+
64
+ let(:host_offset) { `date "+%z"`.chomp }
65
+
66
+ it 'configures the same time zone than on the host' do
67
+ status('First start the machine with other timezone')
68
+ assert_execute('vagrant', 'up', "--provider=#{provider}")
69
+
70
+ # Change the configuration in Vagrantfile
71
+ environment.env['VAGRANT_SPEC_TIMEZONE'] = ':host'
72
+
73
+ status('Reloading with :host')
74
+ result = assert_execute('vagrant', 'reload')
75
+ expect(result.stdout).to match(%r{Setting time zone to 'Etc/GMT})
76
+
77
+ result = assert_execute('vagrant', 'ssh', '-c', 'date "+TZ: %z"')
78
+ expect(result.stdout).to match(/^TZ: #{Regexp.escape(host_offset)}$/)
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ $LOAD_PATH.unshift File.expand_path('../lib', __dir__)
@@ -1,4 +1,5 @@
1
- require 'spec_helper'
1
+ # frozen_string_literal: true
2
+
2
3
  require 'vagrant-timezone/cap/windows'
3
4
 
4
5
  describe VagrantPlugins::TimeZone::Cap::Windows do
@@ -1,4 +1,5 @@
1
- require 'spec_helper'
1
+ # frozen_string_literal: true
2
+
2
3
  require 'vagrant-timezone/config'
3
4
 
4
5
  describe VagrantPlugins::TimeZone::Config do
@@ -23,7 +24,7 @@ describe VagrantPlugins::TimeZone::Config do
23
24
  end
24
25
 
25
26
  it 'converts `:host` to the zone of the host' do
26
- allow(Time).to receive(:now).and_return(Time.new(2016,7,10,2,12,0, '+03:00'))
27
+ allow(Time).to receive(:now).and_return(Time.new(2016, 7, 10, 2, 12, 0, '+03:00'))
27
28
  subject.value = :host
28
29
  subject.finalize!
29
30
  expect(subject.value).to eq('Etc/GMT-3')
@@ -1,5 +1,4 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
1
+ lib = File.expand_path('lib', __dir__)
3
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
3
  require 'vagrant-timezone/version'
5
4
 
@@ -22,7 +21,7 @@ Gem::Specification.new do |spec|
22
21
  'Blue.Dog.Archolite@gmail.com'
23
22
  ]
24
23
 
25
- spec.files = `git ls-files`.split($/)
24
+ spec.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
26
25
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
27
26
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
28
27
  spec.require_paths = ['lib']
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vagrant-timezone
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Teemu Matilainen
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2017-02-25 00:00:00.000000000 Z
13
+ date: 2019-01-10 00:00:00.000000000 Z
14
14
  dependencies: []
15
15
  description: A Vagrant plugin that configures the time zone of a virtual machine
16
16
  email:
@@ -22,18 +22,20 @@ extensions: []
22
22
  extra_rdoc_files: []
23
23
  files:
24
24
  - ".gitignore"
25
+ - ".rspec"
26
+ - ".rubocop.yml"
25
27
  - ".travis.yml"
26
28
  - CHANGELOG.md
27
29
  - Gemfile
30
+ - Guardfile
28
31
  - LICENSE.txt
29
32
  - README.md
30
33
  - Rakefile
31
34
  - lib/vagrant-timezone.rb
32
35
  - lib/vagrant-timezone/action/set_timezone.rb
33
- - lib/vagrant-timezone/cap/arch.rb
34
- - lib/vagrant-timezone/cap/coreos.rb
35
36
  - lib/vagrant-timezone/cap/debian.rb
36
37
  - lib/vagrant-timezone/cap/gentoo.rb
38
+ - lib/vagrant-timezone/cap/linux.rb
37
39
  - lib/vagrant-timezone/cap/redhat.rb
38
40
  - lib/vagrant-timezone/cap/unix.rb
39
41
  - lib/vagrant-timezone/cap/windows.rb
@@ -42,9 +44,16 @@ files:
42
44
  - lib/vagrant-timezone/plugin.rb
43
45
  - lib/vagrant-timezone/version.rb
44
46
  - locales/en.yml
45
- - spec/spec_helper.rb
46
- - spec/unit/vagrant-timezone/cap/windows_spec.rb
47
- - spec/unit/vagrant-timezone/config_spec.rb
47
+ - tasks/acceptance.rake
48
+ - test/acceptance/config/boxes.yaml
49
+ - test/acceptance/config/vagrant-spec.config.rb
50
+ - test/acceptance/skeletons/timezone/Vagrantfile
51
+ - test/acceptance/support/box_helper.rb
52
+ - test/acceptance/support/spec_helper.rb
53
+ - test/acceptance/vagrant-timezone/timezone_spec.rb
54
+ - test/spec_helper.rb
55
+ - test/unit/vagrant-timezone/cap/windows_spec.rb
56
+ - test/unit/vagrant-timezone/config_spec.rb
48
57
  - vagrant-timezone.gemspec
49
58
  homepage: http://github.com/tmatilai/vagrant-timezone
50
59
  licenses:
@@ -65,12 +74,17 @@ required_rubygems_version: !ruby/object:Gem::Requirement
65
74
  - !ruby/object:Gem::Version
66
75
  version: '0'
67
76
  requirements: []
68
- rubyforge_project:
69
- rubygems_version: 2.6.10
77
+ rubygems_version: 3.0.1
70
78
  signing_key:
71
79
  specification_version: 4
72
80
  summary: A Vagrant plugin that configures the time zone of a virtual machine
73
81
  test_files:
74
- - spec/spec_helper.rb
75
- - spec/unit/vagrant-timezone/cap/windows_spec.rb
76
- - spec/unit/vagrant-timezone/config_spec.rb
82
+ - test/acceptance/config/boxes.yaml
83
+ - test/acceptance/config/vagrant-spec.config.rb
84
+ - test/acceptance/skeletons/timezone/Vagrantfile
85
+ - test/acceptance/support/box_helper.rb
86
+ - test/acceptance/support/spec_helper.rb
87
+ - test/acceptance/vagrant-timezone/timezone_spec.rb
88
+ - test/spec_helper.rb
89
+ - test/unit/vagrant-timezone/cap/windows_spec.rb
90
+ - test/unit/vagrant-timezone/config_spec.rb
@@ -1,13 +0,0 @@
1
- module VagrantPlugins
2
- module TimeZone
3
- module Cap
4
- # Arch capabilities for changing time zone
5
- class Arch
6
- # Set the time zone
7
- def self.change_timezone(machine, timezone)
8
- machine.communicate.sudo("timedatectl set-timezone '#{timezone}'")
9
- end
10
- end
11
- end
12
- end
13
- end
@@ -1,13 +0,0 @@
1
- module VagrantPlugins
2
- module TimeZone
3
- module Cap
4
- # CoreOS capabilities for changing time zone
5
- class CoreOS
6
- # Set the time zone
7
- def self.change_timezone(machine, timezone)
8
- machine.communicate.sudo("timedatectl set-timezone '#{timezone}'")
9
- end
10
- end
11
- end
12
- end
13
- end
@@ -1,7 +0,0 @@
1
- RSpec.configure do |config|
2
- config.expect_with :rspec do |c|
3
- c.syntax = :expect
4
- end
5
- config.color = true
6
- config.tty = true
7
- end