docker-sync 0.4.6 → 0.5.0.pre.beta1

Sign up to get free protection for your applications and to get access to all the features.
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