entangler 1.0.2 → 1.1.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.
- checksums.yaml +4 -4
- data/README.md +2 -1
- data/entangler.gemspec +6 -6
- data/exe/entangler +18 -8
- data/lib/entangler.rb +1 -0
- data/lib/entangler/executor/base.rb +6 -23
- data/lib/entangler/executor/helpers.rb +11 -0
- data/lib/entangler/executor/master.rb +18 -57
- data/lib/entangler/executor/slave.rb +1 -2
- data/lib/entangler/executor/validation/base.rb +16 -0
- data/lib/entangler/executor/validation/master.rb +63 -0
- data/lib/entangler/logger.rb +38 -0
- data/lib/entangler/version.rb +1 -1
- metadata +13 -16
- data/.gitignore +0 -11
- data/.rspec +0 -2
- data/.rubocop.yml +0 -9
- data/.travis.yml +0 -20
- data/Rakefile +0 -8
- data/bin/console +0 -14
- data/bin/setup +0 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9903130b1c46dd5555b89bfeaca78446d9326108
|
4
|
+
data.tar.gz: eaab17609bbbbcfb18f48a52558114096a5f2a8b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1ff26850233910d6a3f0868571f3e6c8c69ef371417784d62cda84e48d7026052245ba4ddddbcb708ec9ef1ef1299c0bdb9ee6f6cb6698f61ce6a9c3863825bd
|
7
|
+
data.tar.gz: ef43547587b7ed6085a630eb82cd9a57ec7d282a7924af8dda5efda5d13b2b5fd96688e7460a8d09e29bacb4137b5759df61c334e9abfde4e72fb4fd9ab66059
|
data/README.md
CHANGED
@@ -18,7 +18,7 @@ $ entangler master /some/base/path user@remote:/some/remote/path
|
|
18
18
|
|
19
19
|
```
|
20
20
|
$ entangler -h
|
21
|
-
Entangler v1.0
|
21
|
+
Entangler v1.1.0
|
22
22
|
|
23
23
|
Usage:
|
24
24
|
entangler master <base_dir> <remote_user>@<remote_host>:<remote_base_dir> [options]
|
@@ -30,6 +30,7 @@ Options:
|
|
30
30
|
-p, --port PORT Overwrite the SSH port (usually 22)
|
31
31
|
(doesn't do anything in slave mode)
|
32
32
|
-v, --verbose Log Debug lines
|
33
|
+
-q, --quiet Don't log to stdout in master process
|
33
34
|
--version Show version number
|
34
35
|
-h, --help Show this message
|
35
36
|
```
|
data/entangler.gemspec
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
# coding: utf-8
|
2
1
|
lib = File.expand_path('../lib', __FILE__)
|
3
2
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
3
|
require 'entangler/version'
|
@@ -14,15 +13,16 @@ Gem::Specification.new do |spec|
|
|
14
13
|
spec.homepage = 'https://github.com/daveallie/entangler'
|
15
14
|
spec.license = 'MIT'
|
16
15
|
|
17
|
-
spec.files =
|
16
|
+
spec.files = Dir['lib/**/*'] + Dir['exe/**/*'] + %w[CODE_OF_CONDUCT.md LICENSE.txt README.md
|
17
|
+
Gemfile entangler.gemspec]
|
18
18
|
spec.bindir = 'exe'
|
19
|
-
spec.executables =
|
19
|
+
spec.executables = ['entangler']
|
20
20
|
spec.require_paths = ['lib']
|
21
21
|
|
22
|
-
spec.add_development_dependency 'bundler', '~> 1.
|
22
|
+
spec.add_development_dependency 'bundler', '~> 1.13'
|
23
23
|
spec.add_development_dependency 'rake', '~> 10.0'
|
24
24
|
spec.add_development_dependency 'rspec', '~> 3.0'
|
25
|
-
spec.add_development_dependency 'rubocop', '~> 0.
|
25
|
+
spec.add_development_dependency 'rubocop', '~> 0.49.1'
|
26
26
|
spec.add_dependency 'listen', '~> 3.1'
|
27
|
-
spec.add_dependency 'to_regexp', '~> 0.2'
|
27
|
+
spec.add_dependency 'to_regexp', '~> 0.2.0'
|
28
28
|
end
|
data/exe/entangler
CHANGED
@@ -4,6 +4,18 @@ require 'optparse'
|
|
4
4
|
require 'to_regexp'
|
5
5
|
|
6
6
|
options = {}
|
7
|
+
def bool_opt(opts, key, *args)
|
8
|
+
opts.on(*args) do
|
9
|
+
options[key] = true
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def value_opt(opts, key, *args)
|
14
|
+
opts.on(*args) do |val|
|
15
|
+
options[key] = val
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
7
19
|
OptionParser.new do |opts|
|
8
20
|
opts.banner = %(Entangler v#{Entangler::VERSION}
|
9
21
|
|
@@ -20,13 +32,10 @@ Usage:
|
|
20
32
|
options[:ignore] << ignore
|
21
33
|
end
|
22
34
|
|
23
|
-
opts
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
opts.on('-v', '--verbose', 'Log Debug lines') do
|
28
|
-
options[:verbose] = true
|
29
|
-
end
|
35
|
+
value_opt(opts, :port, '-p', '--port PORT', 'Overwrite the SSH port (usually 22)',
|
36
|
+
"(doesn't do anything in slave mode)")
|
37
|
+
bool_opt(opts, :verbose, '-v', '--verbose', 'Log Debug lines')
|
38
|
+
bool_opt(opts, :quiet, '-q', '--quiet', "Don't log to stdout in master process")
|
30
39
|
|
31
40
|
opts.on_tail('--version', 'Show version number') do
|
32
41
|
puts Entangler::VERSION
|
@@ -40,7 +49,7 @@ Usage:
|
|
40
49
|
end.parse!
|
41
50
|
|
42
51
|
mode = ARGV.shift
|
43
|
-
unless mode && %w
|
52
|
+
unless mode && %w[master slave].include?(mode)
|
44
53
|
puts "Mode unknown, please read help:\nentangler -h"
|
45
54
|
exit 1
|
46
55
|
end
|
@@ -103,6 +112,7 @@ if options[:ignore]
|
|
103
112
|
end
|
104
113
|
end
|
105
114
|
|
115
|
+
opts[:quiet] = options[:quiet]
|
106
116
|
opts[:verbose] = options[:verbose]
|
107
117
|
|
108
118
|
begin
|
data/lib/entangler.rb
CHANGED
@@ -2,11 +2,13 @@ require 'logger'
|
|
2
2
|
require 'fileutils'
|
3
3
|
require 'thread'
|
4
4
|
require_relative 'background/base'
|
5
|
+
require_relative 'validation/base'
|
5
6
|
|
6
7
|
module Entangler
|
7
8
|
module Executor
|
8
9
|
class Base
|
9
10
|
include Entangler::Executor::Background::Base
|
11
|
+
include Entangler::Executor::Validation::Base
|
10
12
|
|
11
13
|
attr_reader :base_dir
|
12
14
|
|
@@ -20,6 +22,7 @@ module Entangler
|
|
20
22
|
@opts[:ignore] << /^\.entangler.*/
|
21
23
|
|
22
24
|
validate_opts
|
25
|
+
Entangler::Logger.create_log_dir(base_dir)
|
23
26
|
end
|
24
27
|
|
25
28
|
def generate_abs_path(rel_path)
|
@@ -44,36 +47,16 @@ module Entangler
|
|
44
47
|
|
45
48
|
protected
|
46
49
|
|
47
|
-
def validate_opts; end
|
48
|
-
|
49
50
|
def send_to_remote(msg = {})
|
50
51
|
Marshal.dump(msg, @remote_writer)
|
51
52
|
end
|
52
53
|
|
53
54
|
def logger
|
54
|
-
|
55
|
-
@logger ||= begin
|
56
|
-
l = Logger.new(File.join(log_dir, 'entangler.log'))
|
57
|
-
l.level = @opts[:verbose] ? Logger::DEBUG : Logger::INFO
|
58
|
-
l.formatter = logger_formatter
|
59
|
-
l
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
def logger_formatter
|
64
|
-
proc do |severity, datetime, _, msg|
|
65
|
-
date_format = datetime.strftime('%Y-%m-%d %H:%M:%S')
|
66
|
-
"[#{date_format}] #{severity.rjust(5)}: #{msg}\n"
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
def log_dir
|
71
|
-
File.join(base_dir, '.entangler', 'log')
|
55
|
+
@logger ||= Entangler::Logger.new(log_outputs, @opts[:verbose])
|
72
56
|
end
|
73
57
|
|
74
|
-
def
|
75
|
-
|
76
|
-
raise Entangler::ValidationError, 'Base directory is a file' unless File.directory?(base_dir)
|
58
|
+
def log_outputs
|
59
|
+
[Entangler::Logger.log_file_path(base_dir)]
|
77
60
|
end
|
78
61
|
end
|
79
62
|
end
|
@@ -1,9 +1,12 @@
|
|
1
|
+
require_relative 'helpers'
|
1
2
|
require_relative 'background/master'
|
3
|
+
require_relative 'validation/master'
|
2
4
|
|
3
5
|
module Entangler
|
4
6
|
module Executor
|
5
7
|
class Master < Base
|
6
8
|
include Entangler::Executor::Background::Master
|
9
|
+
include Entangler::Executor::Validation::Master
|
7
10
|
|
8
11
|
def run
|
9
12
|
perform_initial_rsync
|
@@ -16,64 +19,17 @@ module Entangler
|
|
16
19
|
|
17
20
|
private
|
18
21
|
|
19
|
-
def
|
20
|
-
|
21
|
-
|
22
|
-
@opts[:remote_port] ||= '22'
|
23
|
-
validate_remote_opts
|
24
|
-
else
|
25
|
-
validate_local_opts
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
def validate_local_opts
|
30
|
-
unless File.exist?(@opts[:remote_base_dir])
|
31
|
-
raise Entangler::ValidationError, "Destination directory doesn't exist"
|
32
|
-
end
|
33
|
-
unless File.directory?(@opts[:remote_base_dir])
|
34
|
-
raise Entangler::ValidationError, 'Destination directory is a file'
|
35
|
-
end
|
36
|
-
@opts[:remote_base_dir] = File.realpath(File.expand_path(@opts[:remote_base_dir]))
|
37
|
-
return unless @opts[:remote_base_dir] == base_dir
|
38
|
-
raise Entangler::ValidationError, "Destination directory can't be the same as the base directory"
|
39
|
-
end
|
40
|
-
|
41
|
-
def validate_remote_opts
|
42
|
-
keys = @opts.keys
|
43
|
-
raise Entangler::ValidationError, 'Missing remote base dir' unless keys.include?(:remote_base_dir)
|
44
|
-
raise Entangler::ValidationError, 'Missing remote user' unless keys.include?(:remote_user)
|
45
|
-
raise Entangler::ValidationError, 'Missing remote host' unless keys.include?(:remote_host)
|
46
|
-
validate_remote_base_dir
|
47
|
-
validate_remote_entangler_version
|
48
|
-
end
|
49
|
-
|
50
|
-
def validate_remote_base_dir
|
51
|
-
res = `#{generate_ssh_command("[[ -d '#{@opts[:remote_base_dir]}' ]] && echo 'ok' || echo 'missing'")}`
|
52
|
-
raise Entangler::ValidationError, 'Cannot connect to remote' if res.empty?
|
53
|
-
raise Entangler::ValidationError, 'Remote base dir invalid' unless res.strip == 'ok'
|
54
|
-
end
|
55
|
-
|
56
|
-
def validate_remote_entangler_version
|
57
|
-
return unless @opts[:remote_mode]
|
58
|
-
res = `#{generate_ssh_command('source ~/.rvm/environments/default && entangler --version')}`
|
59
|
-
remote_version = Gem::Version.new(res.strip)
|
60
|
-
local_version = Gem::Version.new(Entangler::VERSION)
|
61
|
-
return unless major_version_mismatch?(local_version, remote_version)
|
62
|
-
msg = 'Entangler version too far apart, please update either local or remote Entangler.' \
|
63
|
-
" Local version is #{local_version} and remote version is #{remote_version}."
|
64
|
-
raise Entangler::VersionMismatchError, msg
|
65
|
-
end
|
66
|
-
|
67
|
-
def major_version_mismatch?(version1, version2)
|
68
|
-
version1.segments[0] != version2.segments[0] ||
|
69
|
-
(version1.segments[0].zero? && version1 != version2) ||
|
70
|
-
((version1.prerelease? || version2.prerelease?) && version1 != version2)
|
22
|
+
def log_outputs
|
23
|
+
outs = [Entangler::Logger.log_file_path(base_dir)]
|
24
|
+
outs << STDOUT unless @opts[:quiet]
|
71
25
|
end
|
72
26
|
|
73
27
|
def perform_initial_rsync
|
74
28
|
logger.info 'Running initial sync'
|
75
|
-
|
76
|
-
|
29
|
+
with_temp_rsync_ignores do |file_path|
|
30
|
+
IO.popen(rsync_cmd_string(file_path)).each do |line|
|
31
|
+
logger.debug line.chomp
|
32
|
+
end
|
77
33
|
end
|
78
34
|
logger.debug 'Initial sync complete'
|
79
35
|
end
|
@@ -107,12 +63,17 @@ module Entangler
|
|
107
63
|
"#{@opts[:remote_user]}@#{@opts[:remote_host]}"
|
108
64
|
end
|
109
65
|
|
110
|
-
def
|
111
|
-
|
66
|
+
def with_temp_rsync_ignores
|
67
|
+
Entangler::Helper.with_temp_file(name: 'rsync_ignores', contents: find_rsync_ignore_folders.join("\n")) do |f|
|
68
|
+
yield f.path
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def rsync_cmd_string(rsync_ignores_file_path)
|
112
73
|
remote_path = @opts[:remote_mode] ? "#{@opts[:remote_user]}@#{@opts[:remote_host]}:" : ''
|
113
74
|
remote_path += "#{@opts[:remote_base_dir]}/"
|
114
75
|
|
115
|
-
cmd = "rsync -azv #{
|
76
|
+
cmd = "rsync -azv --exclude-from #{rsync_ignores_file_path}"
|
116
77
|
cmd += " -e \"ssh -p #{@opts[:remote_port]}\"" if @opts[:remote_mode]
|
117
78
|
cmd + " --delete #{base_dir}/ #{remote_path}"
|
118
79
|
end
|
@@ -10,8 +10,7 @@ module Entangler
|
|
10
10
|
|
11
11
|
@remote_reader = STDIN
|
12
12
|
@remote_writer = STDOUT
|
13
|
-
|
14
|
-
$stderr.reopen(File.join(log_dir, 'entangler.err'), 'w')
|
13
|
+
$stderr.reopen(File.join(Entangler::Logger.log_file_path(base_dir, 'entangler.err')), 'w')
|
15
14
|
end
|
16
15
|
end
|
17
16
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Entangler
|
2
|
+
module Executor
|
3
|
+
module Validation
|
4
|
+
module Base
|
5
|
+
protected
|
6
|
+
|
7
|
+
def validate_opts; end
|
8
|
+
|
9
|
+
def validate_base_dir(base_dir)
|
10
|
+
raise Entangler::ValidationError, "Base directory doesn't exist" unless File.exist?(base_dir)
|
11
|
+
raise Entangler::ValidationError, 'Base directory is a file' unless File.directory?(base_dir)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
module Entangler
|
2
|
+
module Executor
|
3
|
+
module Validation
|
4
|
+
module Master
|
5
|
+
private
|
6
|
+
|
7
|
+
def validate_opts
|
8
|
+
super
|
9
|
+
if @opts[:remote_mode]
|
10
|
+
@opts[:remote_port] ||= '22'
|
11
|
+
validate_remote_opts
|
12
|
+
else
|
13
|
+
validate_local_opts
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def validate_local_opts
|
18
|
+
unless File.exist?(@opts[:remote_base_dir])
|
19
|
+
raise Entangler::ValidationError, "Destination directory doesn't exist"
|
20
|
+
end
|
21
|
+
unless File.directory?(@opts[:remote_base_dir])
|
22
|
+
raise Entangler::ValidationError, 'Destination directory is a file'
|
23
|
+
end
|
24
|
+
@opts[:remote_base_dir] = File.realpath(File.expand_path(@opts[:remote_base_dir]))
|
25
|
+
return unless @opts[:remote_base_dir] == base_dir
|
26
|
+
raise Entangler::ValidationError, "Destination directory can't be the same as the base directory"
|
27
|
+
end
|
28
|
+
|
29
|
+
def validate_remote_opts
|
30
|
+
keys = @opts.keys
|
31
|
+
raise Entangler::ValidationError, 'Missing remote base dir' unless keys.include?(:remote_base_dir)
|
32
|
+
raise Entangler::ValidationError, 'Missing remote user' unless keys.include?(:remote_user)
|
33
|
+
raise Entangler::ValidationError, 'Missing remote host' unless keys.include?(:remote_host)
|
34
|
+
validate_remote_base_dir
|
35
|
+
validate_remote_entangler_version
|
36
|
+
end
|
37
|
+
|
38
|
+
def validate_remote_base_dir
|
39
|
+
res = `#{generate_ssh_command("[[ -d '#{@opts[:remote_base_dir]}' ]] && echo 'ok' || echo 'missing'")}`
|
40
|
+
raise Entangler::ValidationError, 'Cannot connect to remote' if res.empty?
|
41
|
+
raise Entangler::ValidationError, 'Remote base dir invalid' unless res.strip == 'ok'
|
42
|
+
end
|
43
|
+
|
44
|
+
def validate_remote_entangler_version
|
45
|
+
return unless @opts[:remote_mode]
|
46
|
+
res = `#{generate_ssh_command('source ~/.rvm/environments/default && entangler --version')}`
|
47
|
+
remote_version = Gem::Version.new(res.strip)
|
48
|
+
local_version = Gem::Version.new(Entangler::VERSION)
|
49
|
+
return unless major_version_mismatch?(local_version, remote_version)
|
50
|
+
msg = 'Entangler version too far apart, please update either local or remote Entangler.' \
|
51
|
+
" Local version is #{local_version} and remote version is #{remote_version}."
|
52
|
+
raise Entangler::VersionMismatchError, msg
|
53
|
+
end
|
54
|
+
|
55
|
+
def major_version_mismatch?(version1, version2)
|
56
|
+
version1.segments[0] != version2.segments[0] ||
|
57
|
+
(version1.segments[0].zero? && version1 != version2) ||
|
58
|
+
((version1.prerelease? || version2.prerelease?) && version1 != version2)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'logger'
|
3
|
+
|
4
|
+
module Entangler
|
5
|
+
class Logger
|
6
|
+
def self.create_log_dir(base_dir)
|
7
|
+
FileUtils.mkdir_p(File.dirname(log_file_path(base_dir)))
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.log_file_path(base_dir, log_file_name = 'entangler.log')
|
11
|
+
File.join(base_dir, '.entangler', 'log', log_file_name)
|
12
|
+
end
|
13
|
+
|
14
|
+
def initialize(outputs, verbose = false)
|
15
|
+
@loggers = Array(outputs).map do |output|
|
16
|
+
logger = ::Logger.new(output)
|
17
|
+
|
18
|
+
logger.level = verbose ? ::Logger::DEBUG : ::Logger::INFO
|
19
|
+
logger.formatter = proc do |severity, datetime, _, msg|
|
20
|
+
date_format = datetime.strftime('%Y-%m-%d %H:%M:%S')
|
21
|
+
"[#{date_format}] #{severity.rjust(5)}: #{msg}\n"
|
22
|
+
end
|
23
|
+
|
24
|
+
logger
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def level=(level)
|
29
|
+
@loggers.each { |logger| logger.level = level }
|
30
|
+
end
|
31
|
+
|
32
|
+
::Logger::Severity.constants.each do |level|
|
33
|
+
define_method(level.downcase) do |*args|
|
34
|
+
@loggers.each { |logger| logger.send(level.downcase, *args) }
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
data/lib/entangler/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: entangler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dave Allie
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-06-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '1.
|
19
|
+
version: '1.13'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '1.
|
26
|
+
version: '1.13'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -58,14 +58,14 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
61
|
+
version: 0.49.1
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
68
|
+
version: 0.49.1
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: listen
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -86,14 +86,14 @@ dependencies:
|
|
86
86
|
requirements:
|
87
87
|
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version:
|
89
|
+
version: 0.2.0
|
90
90
|
type: :runtime
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version:
|
96
|
+
version: 0.2.0
|
97
97
|
description: Two way file syncer using platform native notify.
|
98
98
|
email:
|
99
99
|
- dave@daveallie.com
|
@@ -102,17 +102,10 @@ executables:
|
|
102
102
|
extensions: []
|
103
103
|
extra_rdoc_files: []
|
104
104
|
files:
|
105
|
-
- ".gitignore"
|
106
|
-
- ".rspec"
|
107
|
-
- ".rubocop.yml"
|
108
|
-
- ".travis.yml"
|
109
105
|
- CODE_OF_CONDUCT.md
|
110
106
|
- Gemfile
|
111
107
|
- LICENSE.txt
|
112
108
|
- README.md
|
113
|
-
- Rakefile
|
114
|
-
- bin/console
|
115
|
-
- bin/setup
|
116
109
|
- entangler.gemspec
|
117
110
|
- exe/entangler
|
118
111
|
- lib/entangler.rb
|
@@ -121,8 +114,12 @@ files:
|
|
121
114
|
- lib/entangler/executor/background/base.rb
|
122
115
|
- lib/entangler/executor/background/master.rb
|
123
116
|
- lib/entangler/executor/base.rb
|
117
|
+
- lib/entangler/executor/helpers.rb
|
124
118
|
- lib/entangler/executor/master.rb
|
125
119
|
- lib/entangler/executor/slave.rb
|
120
|
+
- lib/entangler/executor/validation/base.rb
|
121
|
+
- lib/entangler/executor/validation/master.rb
|
122
|
+
- lib/entangler/logger.rb
|
126
123
|
- lib/entangler/version.rb
|
127
124
|
homepage: https://github.com/daveallie/entangler
|
128
125
|
licenses:
|
@@ -144,7 +141,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
144
141
|
version: '0'
|
145
142
|
requirements: []
|
146
143
|
rubyforge_project:
|
147
|
-
rubygems_version: 2.
|
144
|
+
rubygems_version: 2.6.8
|
148
145
|
signing_key:
|
149
146
|
specification_version: 4
|
150
147
|
summary: Two way file syncer using platform native notify.
|
data/.gitignore
DELETED
data/.rspec
DELETED
data/.rubocop.yml
DELETED
data/.travis.yml
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
sudo: false
|
2
|
-
language: ruby
|
3
|
-
os:
|
4
|
-
- linux
|
5
|
-
- osx
|
6
|
-
rvm:
|
7
|
-
- 2.3.3
|
8
|
-
- ruby-head
|
9
|
-
matrix:
|
10
|
-
include:
|
11
|
-
- os: osx
|
12
|
-
rvm: 2.2.5
|
13
|
-
- os: linux
|
14
|
-
rvm: 2.2.6
|
15
|
-
allow_failures:
|
16
|
-
- rvm: ruby-head
|
17
|
-
before_install:
|
18
|
-
- gem install bundler -v 1.13.6
|
19
|
-
install:
|
20
|
-
- bundle install --jobs=3 --retry=3
|
data/Rakefile
DELETED
data/bin/console
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require 'bundler/setup'
|
4
|
-
require 'entangler'
|
5
|
-
|
6
|
-
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
-
# with your gem easier. You can also use a different console, if you like.
|
8
|
-
|
9
|
-
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
-
# require "pry"
|
11
|
-
# Pry.start
|
12
|
-
|
13
|
-
require 'irb'
|
14
|
-
IRB.start
|