docker-sync 0.4.6 → 0.5.0.pre.beta1

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 (40) hide show
  1. checksums.yaml +4 -4
  2. data/VERSION +1 -1
  3. data/bin/console +6 -0
  4. data/lib/docker-sync.rb +2 -1
  5. data/lib/docker-sync/config/project_config.rb +13 -12
  6. data/lib/docker-sync/dependencies.rb +39 -0
  7. data/lib/docker-sync/dependencies/docker.rb +23 -0
  8. data/lib/docker-sync/dependencies/docker_driver.rb +20 -0
  9. data/lib/docker-sync/dependencies/fswatch.rb +14 -0
  10. data/lib/docker-sync/dependencies/package_manager.rb +24 -0
  11. data/lib/docker-sync/dependencies/package_managers/apt.rb +24 -0
  12. data/lib/docker-sync/dependencies/package_managers/base.rb +47 -0
  13. data/lib/docker-sync/dependencies/package_managers/brew.rb +24 -0
  14. data/lib/docker-sync/dependencies/package_managers/none.rb +23 -0
  15. data/lib/docker-sync/dependencies/package_managers/pkg.rb +24 -0
  16. data/lib/docker-sync/dependencies/package_managers/yum.rb +24 -0
  17. data/lib/docker-sync/dependencies/rsync.rb +14 -0
  18. data/lib/docker-sync/dependencies/unison.rb +15 -0
  19. data/lib/docker-sync/dependencies/unox.rb +40 -0
  20. data/lib/docker-sync/environment.rb +19 -0
  21. data/lib/docker-sync/execution.rb +11 -35
  22. data/lib/docker-sync/sync_manager.rb +10 -3
  23. data/lib/docker-sync/sync_process.rb +16 -18
  24. data/lib/docker-sync/sync_strategy/native.rb +3 -4
  25. data/lib/docker-sync/sync_strategy/native_osx.rb +11 -11
  26. data/lib/docker-sync/sync_strategy/rsync.rb +15 -7
  27. data/lib/docker-sync/sync_strategy/unison.rb +13 -12
  28. data/lib/docker-sync/update_check.rb +5 -0
  29. data/lib/docker-sync/upgrade_check.rb +2 -1
  30. data/lib/docker-sync/watch_strategy/dummy.rb +1 -1
  31. data/lib/docker-sync/watch_strategy/fswatch.rb +4 -5
  32. data/lib/docker-sync/watch_strategy/remotelogs.rb +3 -3
  33. data/lib/docker-sync/watch_strategy/unison.rb +2 -2
  34. data/tasks/daemon/daemon.thor +0 -1
  35. data/tasks/stack/stack.thor +8 -9
  36. data/tasks/sync/sync.thor +16 -19
  37. metadata +21 -9
  38. data/lib/docker-sync/preconditions/preconditions_linux.rb +0 -51
  39. data/lib/docker-sync/preconditions/preconditions_osx.rb +0 -174
  40. data/lib/docker-sync/preconditions/strategy.rb +0 -65
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ba2412e62e9e21fbba544933fef32e933c761dfd
4
- data.tar.gz: b918bb46e5afdf8fdccf4c606a1ff2aeff7502a8
3
+ metadata.gz: 7a4d176110d1f999724b01ecd8613697ba9b1ae5
4
+ data.tar.gz: 656df917cfe74ca3c12aeb1c829bb62a6367f99b
5
5
  SHA512:
6
- metadata.gz: 5cab9b9fe016056abe2323a10067c362edb859dfa103686665e802553075e92018d9fbc4e2f4c2723b9d12c6b9f8696d174031d17095e55f0b5629dfb3035e78
7
- data.tar.gz: a8ec4ec26faaf6570fafffbe83372e33fd3961d7d48baaea4bc442c1a83b9b1a01c2061467d00eb5bac71e2c33fcb1b99c88471fc998c6db1d5bbbe9c38f1d8d
6
+ metadata.gz: 716e8408005a3cb1ebdfffeb11b7f4f87812b944b3f5746bc88b4764e54fd0094a85e3955078c39df62e8615e744f3ec396089472481c16243e8db4ed726978e
7
+ data.tar.gz: cbaa7c0fa625d650d7b51fd0b9cd5ce2901e361e9f8753098bf17538bf5b1111596696dc17bf504a459ae02142243164f8eafbb9c868f5972193ff8026623ed4
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.4.6
1
+ 0.5.0-beta1
data/bin/console CHANGED
@@ -6,5 +6,11 @@ require 'docker-sync'
6
6
  # You can add fixtures and/or initialization code here to make experimenting
7
7
  # with your gem easier. You can also use a different console, if you like.
8
8
 
9
+ # ActiveSupport stuff for readability (specially `1.second` and stuff like that)
10
+ require 'active_support'
11
+ require 'active_support/core_ext/numeric/time'
12
+ require 'active_support/core_ext/integer/time'
13
+ require 'active_support/core_ext/object/blank'
14
+
9
15
  require 'pry'
10
16
  Pry.start
data/lib/docker-sync.rb CHANGED
@@ -1,4 +1,5 @@
1
+ require 'docker-sync/environment'
2
+ require 'docker-sync/dependencies'
1
3
  require 'docker-sync/config/config_locator'
2
4
  require 'docker-sync/config/global_config'
3
5
  require 'docker-sync/config/project_config'
4
- require 'docker-sync/preconditions/strategy'
@@ -2,7 +2,7 @@ require 'singleton'
2
2
  require 'docker-sync/config/config_locator'
3
3
  require 'docker-sync/config/config_serializer'
4
4
  require 'forwardable'
5
- require 'docker-sync/preconditions/strategy'
5
+
6
6
  module DockerSync
7
7
  class ProjectConfig
8
8
  extend Forwardable
@@ -47,17 +47,24 @@ module DockerSync
47
47
  end
48
48
 
49
49
  def unison_required?
50
- config['syncs'].any? { |name, sync_config|
50
+ # noinspection RubyUnusedLocalVariable
51
+ config['syncs'].any? { |sync_config|
51
52
  sync_config['sync_strategy'] == 'unison' || sync_config['watch_strategy'] == 'unison'
52
53
  }
53
54
  end
54
55
 
55
56
  def rsync_required?
56
- config['syncs'].any? { |name, sync_config|
57
+ # noinspection RubyUnusedLocalVariable
58
+ config['syncs'].any? { |sync_config|
57
59
  sync_config['sync_strategy'] == 'rsync'
58
60
  }
59
61
  end
60
62
 
63
+ def fswatch_required?
64
+ config['syncs'].any? { |sync_config|
65
+ sync_config['watch_strategy'] == 'fswatch'
66
+ }
67
+ end
61
68
 
62
69
  private
63
70
 
@@ -134,15 +141,9 @@ module DockerSync
134
141
  end
135
142
 
136
143
  def default_sync_strategy
137
- if OS.linux?
138
- return 'native'
139
- elsif OS.osx?
140
- if DockerSync::Preconditions::Strategy.instance.is_driver_docker_for_mac?
141
- return 'native_osx'
142
- else
143
- return 'unison'
144
- end
145
- end
144
+ return 'native' if Environment.linux?
145
+ return 'native_osx' if Environment.mac? && Dependencies::Docker::Driver.docker_for_mac?
146
+ return 'unison' if Environment.mac?
146
147
  end
147
148
 
148
149
  def default_watch_strategy(sync_config)
@@ -0,0 +1,39 @@
1
+ require 'mkmf'
2
+ require 'thor/shell'
3
+
4
+ Dir[
5
+ File.join(__dir__, 'dependencies', 'package_managers', 'base.rb'),
6
+ File.join(__dir__, 'dependencies', '**', '*.rb')
7
+ ].each { |f| require f }
8
+
9
+ module DockerSync
10
+ module Dependencies
11
+ UNSUPPORTED_OPERATING_SYSTEM = 'Unsupported operating system. Are you sure you need DockerSync?'.freeze
12
+
13
+ def self.ensure_all!(config)
14
+ return if ENV['DOCKER_SYNC_SKIP_DEPENDENCIES_CHECK']
15
+ return ensure_all_for_mac!(config) if Environment.mac?
16
+ return ensure_all_for_linux!(config) if Environment.linux?
17
+ return ensure_all_for_freebsd!(config) if Environment.freebsd?
18
+ raise(UNSUPPORTED_OPERATING_SYSTEM)
19
+ end
20
+
21
+ def self.ensure_all_for_mac!(config)
22
+ PackageManager.ensure!
23
+ Docker.ensure!
24
+ Unison.ensure! if config.unison_required?
25
+ Rsync.ensure! if config.rsync_required?
26
+ Fswatch.ensure! if config.fswatch_required?
27
+ end
28
+
29
+ def self.ensure_all_for_linux!(_config)
30
+ Docker.ensure!
31
+ end
32
+
33
+ def self.ensure_all_for_freebsd!(config)
34
+ Docker.ensure!
35
+ Unison.ensure! if config.unison_required?
36
+ Rsync.ensure! if config.rsync_required?
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,23 @@
1
+ module DockerSync
2
+ module Dependencies
3
+ module Docker
4
+ DOCKER_NOT_AVAILABLE = 'Could not find Docker. Please install it (see https://docs.docker.com/compose/install/) and try again.'.freeze
5
+ DOCKER_NOT_RUNNING = 'No docker daemon seems to be running. Did you start docker-engine / docker-for-mac / docker-machine?'.freeze
6
+
7
+ def self.available?
8
+ return @available if defined? @available
9
+ @available = find_executable0('docker')
10
+ end
11
+
12
+ def self.running?
13
+ return @running if defined? @running
14
+ @running = system('docker ps &> /dev/null')
15
+ end
16
+
17
+ def self.ensure!
18
+ raise(DOCKER_NOT_AVAILABLE) unless available?
19
+ raise(DOCKER_NOT_RUNNING) unless running?
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,20 @@
1
+ module DockerSync
2
+ module Dependencies
3
+ module Docker
4
+ module Driver
5
+ def self.docker_for_mac?
6
+ return false unless Environment.mac?
7
+ return @docker_for_mac if defined? @docker_for_mac
8
+ @docker_for_mac = system('ps x | grep MacOS | grep -q com.docker.osx.hyperkit.linux')
9
+ end
10
+
11
+ def self.docker_toolbox?
12
+ return false unless Environment.mac? || Environment.freebsd?
13
+ return false unless find_executable0('docker-machine')
14
+ return @docker_toolbox if defined? @docker_toolbox
15
+ @docker_toolbox = system('docker info | grep -q "Operating System: Boot2Docker"')
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,14 @@
1
+ module DockerSync
2
+ module Dependencies
3
+ module Fswatch
4
+ def self.available?
5
+ return @available if defined? @available
6
+ @available = find_executable0('fswatch')
7
+ end
8
+
9
+ def self.ensure!
10
+ PackageManager.install_package('fswatch') unless available?
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,24 @@
1
+ require 'forwardable'
2
+
3
+ module DockerSync
4
+ module Dependencies
5
+ module PackageManager
6
+ class << self
7
+ extend Forwardable
8
+ def_delegators :package_manager, :available?, :ensure!, :install_package
9
+ end
10
+
11
+ def self.package_manager
12
+ return @package_manager if defined? @package_manager
13
+ supported_package_managers.each do |package_manager|
14
+ return @package_manager = package_manager if package_manager.available?
15
+ end
16
+ @package_manager = PackageManager::None
17
+ end
18
+
19
+ def self.supported_package_managers
20
+ ObjectSpace.each_object(::Class).select { |klass| klass < self::Base && klass != self::None }
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,24 @@
1
+ module DockerSync
2
+ module Dependencies
3
+ module PackageManager
4
+ class Apt < Base
5
+ APT_NOT_AVAILABLE = 'APT is not installed. Please install it and try again.'.freeze
6
+
7
+ def self.available?
8
+ return @available if defined? @available
9
+ @available = find_executable0('apt-get')
10
+ end
11
+
12
+ def self.ensure!
13
+ raise(APT_NOT_AVAILABLE) unless available?
14
+ end
15
+
16
+ private
17
+
18
+ def install_cmd
19
+ "apt-get install -y #{package}"
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,47 @@
1
+ require 'forwardable'
2
+
3
+ module DockerSync
4
+ module Dependencies
5
+ module PackageManager
6
+ class Base
7
+ DID_NOT_INSTALL_PACKAGE = 'Did not install required package. Please install it manually and try again.'.freeze
8
+ FAILED_TO_INSTALL_PACKAGE = 'Failed to install required package. Please install it manually and try again.'.freeze
9
+
10
+ extend Forwardable
11
+ def_delegators :"Thor::Shell::Color.new", :say_status, :yes?
12
+
13
+ attr_reader :package
14
+
15
+ def self.install_package(*args)
16
+ ensure!
17
+ new(*args).send(:install_package)
18
+ end
19
+
20
+ def initialize(package)
21
+ @package = package
22
+ end
23
+
24
+ private
25
+
26
+ def install_package
27
+ say_status 'warning', "Could not find #{package}. Trying to install it now.", :yellow
28
+ ask_user_confirmation
29
+ say_status 'command', install_cmd, :white
30
+ raise(FAILED_TO_INSTALL_PACKAGE) unless perform_installation
31
+ end
32
+
33
+ def ask_user_confirmation
34
+ raise(DID_NOT_INSTALL_PACKAGE) unless yes?("Install #{package} for you? [y/N]")
35
+ end
36
+
37
+ def perform_installation
38
+ defined?(Bundler) ? Bundler.clean_system(install_cmd) : system(install_cmd)
39
+ end
40
+
41
+ def install_cmd
42
+ raise NotImplementedError
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,24 @@
1
+ module DockerSync
2
+ module Dependencies
3
+ module PackageManager
4
+ class Brew < Base
5
+ BREW_NOT_AVAILABLE = 'Brew is not installed. Please install it (see https://brew.sh) and try again.'.freeze
6
+
7
+ def self.available?
8
+ return @available if defined? @available
9
+ @available = find_executable0('brew')
10
+ end
11
+
12
+ def self.ensure!
13
+ raise(BREW_NOT_AVAILABLE) unless available?
14
+ end
15
+
16
+ private
17
+
18
+ def install_cmd
19
+ "brew install #{package}"
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,23 @@
1
+ module DockerSync
2
+ module Dependencies
3
+ module PackageManager
4
+ class None < Base
5
+ NO_PACKAGE_MANAGER_AVAILABLE = 'No package manager was found. Please either install one of those supported (brew, apt, rpm) or install all dependencies manually.'.freeze
6
+
7
+ def self.available?
8
+ @available ||= true
9
+ end
10
+
11
+ def self.ensure!
12
+ # noop
13
+ end
14
+
15
+ private
16
+
17
+ def install_cmd
18
+ raise(NO_PACKAGE_MANAGER_AVAILABLE)
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,24 @@
1
+ module DockerSync
2
+ module Dependencies
3
+ module PackageManager
4
+ class Pkg < Base
5
+ PKG_NOT_AVAILABLE = 'PKG is not installed. Please install it and try again.'.freeze
6
+
7
+ def self.available?
8
+ return @available if defined? @available
9
+ @available = find_executable0('pkg')
10
+ end
11
+
12
+ def self.ensure!
13
+ raise(PKG_NOT_AVAILABLE) unless available?
14
+ end
15
+
16
+ private
17
+
18
+ def install_cmd
19
+ "pkg install -y #{package}"
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,24 @@
1
+ module DockerSync
2
+ module Dependencies
3
+ module PackageManager
4
+ class Yum < Base
5
+ YUM_NOT_AVAILABLE = 'Yum is not installed. Please install it and try again.'.freeze
6
+
7
+ def self.available?
8
+ return @available if defined? @available
9
+ @available = find_executable0('yum')
10
+ end
11
+
12
+ def self.ensure!
13
+ raise(YUM_NOT_AVAILABLE) unless available?
14
+ end
15
+
16
+ private
17
+
18
+ def install_cmd
19
+ "yum install -y #{package}"
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,14 @@
1
+ module DockerSync
2
+ module Dependencies
3
+ module Rsync
4
+ def self.available?
5
+ return @available if defined? @available
6
+ @available = find_executable0('rsync')
7
+ end
8
+
9
+ def self.ensure!
10
+ PackageManager.install_package('rsync') unless available?
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,15 @@
1
+ module DockerSync
2
+ module Dependencies
3
+ module Unison
4
+ def self.available?
5
+ return @available if defined? @available
6
+ @available = find_executable0('unison')
7
+ end
8
+
9
+ def self.ensure!
10
+ PackageManager.install_package('unison') unless available?
11
+ Unox.ensure!
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,40 @@
1
+ require 'forwardable'
2
+
3
+ module DockerSync
4
+ module Dependencies
5
+ module Unox
6
+ LEGACY_UNOX_WARNING = 'You installed unison-fsmonitor (unox) the old legacy way (i.e. not using brew). We need to fix that.'.freeze
7
+ FAILED_TO_REMOVE_LEGACY_UNOX = 'Failed to remove legacy unison-fsmonitor (unox). Please delete /usr/local/bin/unison-fsmonitor manually and try again.'.freeze
8
+
9
+ class << self
10
+ extend Forwardable
11
+ def_delegators :"Thor::Shell::Color.new", :say_status, :yes?
12
+ end
13
+
14
+ def self.available?
15
+ return @available if defined? @available
16
+ cmd = 'brew list unox &> /dev/null'
17
+ @available = defined?(Bundler) ? Bundler.clean_system(cmd) : system(cmd)
18
+ end
19
+
20
+ def self.ensure!
21
+ return if available?
22
+ cleanup_non_brew_version!
23
+ PackageManager.install_package('eugenmayer/dockersync/unox')
24
+ end
25
+
26
+ def self.cleanup_non_brew_version!
27
+ return unless non_brew_version_installed?
28
+ uninstall_cmd = 'sudo rm -f /usr/local/bin/unison-fsmonitor'
29
+ say_status 'warning', LEGACY_UNOX_WARNING, :yellow
30
+ raise(FAILED_TO_REMOVE_LEGACY_UNOX) unless yes?('Uninstall legacy unison-fsmonitor (unox)? (y/N)')
31
+ say_status 'command', uninstall_cmd, :white
32
+ system(uninstall_cmd)
33
+ end
34
+
35
+ def self.non_brew_version_installed?
36
+ !available? && File.exist?('/usr/local/bin/unison-fsmonitor')
37
+ end
38
+ end
39
+ end
40
+ end