filewatcher 1.1.1 → 2.0.0.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.
- checksums.yaml +5 -5
- data/lib/filewatcher.rb +49 -59
- data/lib/filewatcher/cycles.rb +21 -12
- data/lib/filewatcher/snapshot.rb +65 -0
- data/lib/filewatcher/snapshots.rb +56 -0
- data/lib/filewatcher/spec_helper.rb +66 -0
- data/lib/filewatcher/spec_helper/watch_run.rb +74 -0
- data/lib/filewatcher/version.rb +1 -3
- data/spec/filewatcher/snapshot_spec.rb +67 -0
- data/spec/filewatcher/version_spec.rb +11 -0
- data/spec/filewatcher_spec.rb +289 -0
- data/spec/spec_helper.rb +22 -0
- data/spec/spec_helper/ruby_watch_run.rb +82 -0
- metadata +80 -46
- data/bin/banner.txt +0 -17
- data/bin/filewatcher +0 -106
- data/lib/filewatcher/env.rb +0 -33
- data/lib/filewatcher/runner.rb +0 -33
- data/test/dumpers/env_dumper.rb +0 -10
- data/test/dumpers/watched_dumper.rb +0 -5
- data/test/filewatcher/test_env.rb +0 -70
- data/test/filewatcher/test_runner.rb +0 -75
- data/test/filewatcher/test_version.rb +0 -13
- data/test/helper.rb +0 -238
- data/test/test_filewatcher.rb +0 -354
metadata
CHANGED
@@ -1,122 +1,156 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: filewatcher
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0.beta1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Thomas Flemming
|
8
|
-
|
8
|
+
- Alexander Popov
|
9
|
+
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
date:
|
12
|
+
date: 2020-09-18 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
15
|
+
name: bundler
|
15
16
|
requirement: !ruby/object:Gem::Requirement
|
16
17
|
requirements:
|
17
18
|
- - "~>"
|
18
19
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
20
|
+
version: '2.0'
|
20
21
|
type: :development
|
21
22
|
prerelease: false
|
22
23
|
version_requirements: !ruby/object:Gem::Requirement
|
23
24
|
requirements:
|
24
25
|
- - "~>"
|
25
26
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
27
|
+
version: '2.0'
|
27
28
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
29
|
+
name: codecov
|
29
30
|
requirement: !ruby/object:Gem::Requirement
|
30
31
|
requirements:
|
31
32
|
- - "~>"
|
32
33
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
34
|
-
type: :
|
34
|
+
version: 0.2.5
|
35
|
+
type: :development
|
35
36
|
prerelease: false
|
36
37
|
version_requirements: !ruby/object:Gem::Requirement
|
37
38
|
requirements:
|
38
39
|
- - "~>"
|
39
40
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
41
|
+
version: 0.2.5
|
41
42
|
- !ruby/object:Gem::Dependency
|
42
43
|
name: rake
|
43
44
|
requirement: !ruby/object:Gem::Requirement
|
44
45
|
requirements:
|
45
46
|
- - "~>"
|
46
47
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
48
|
+
version: '13.0'
|
48
49
|
type: :development
|
49
50
|
prerelease: false
|
50
51
|
version_requirements: !ruby/object:Gem::Requirement
|
51
52
|
requirements:
|
52
53
|
- - "~>"
|
53
54
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
55
|
+
version: '13.0'
|
56
|
+
- !ruby/object:Gem::Dependency
|
57
|
+
name: rspec
|
58
|
+
requirement: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - "~>"
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '3.8'
|
63
|
+
type: :development
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - "~>"
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '3.8'
|
55
70
|
- !ruby/object:Gem::Dependency
|
56
71
|
name: rubocop
|
57
72
|
requirement: !ruby/object:Gem::Requirement
|
58
73
|
requirements:
|
59
74
|
- - "~>"
|
60
75
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
76
|
+
version: 0.91.0
|
77
|
+
type: :development
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - "~>"
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: 0.91.0
|
84
|
+
- !ruby/object:Gem::Dependency
|
85
|
+
name: rubocop-performance
|
86
|
+
requirement: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - "~>"
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '1.5'
|
91
|
+
type: :development
|
92
|
+
prerelease: false
|
93
|
+
version_requirements: !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - "~>"
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: '1.5'
|
98
|
+
- !ruby/object:Gem::Dependency
|
99
|
+
name: rubocop-rspec
|
100
|
+
requirement: !ruby/object:Gem::Requirement
|
101
|
+
requirements:
|
102
|
+
- - "~>"
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
version: '1.43'
|
62
105
|
type: :development
|
63
106
|
prerelease: false
|
64
107
|
version_requirements: !ruby/object:Gem::Requirement
|
65
108
|
requirements:
|
66
109
|
- - "~>"
|
67
110
|
- !ruby/object:Gem::Version
|
68
|
-
version: '
|
69
|
-
description: Detect changes in
|
111
|
+
version: '1.43'
|
112
|
+
description: Detect changes in file system. Works anywhere.
|
70
113
|
email:
|
71
114
|
- thomas.flemming@gmail.com
|
72
|
-
|
73
|
-
|
115
|
+
- alex.wayfer@gmail.com
|
116
|
+
executables: []
|
74
117
|
extensions: []
|
75
118
|
extra_rdoc_files: []
|
76
119
|
files:
|
77
|
-
- bin/banner.txt
|
78
|
-
- bin/filewatcher
|
79
120
|
- lib/filewatcher.rb
|
80
121
|
- lib/filewatcher/cycles.rb
|
81
|
-
- lib/filewatcher/
|
82
|
-
- lib/filewatcher/
|
122
|
+
- lib/filewatcher/snapshot.rb
|
123
|
+
- lib/filewatcher/snapshots.rb
|
124
|
+
- lib/filewatcher/spec_helper.rb
|
125
|
+
- lib/filewatcher/spec_helper/watch_run.rb
|
83
126
|
- lib/filewatcher/version.rb
|
84
|
-
-
|
85
|
-
-
|
86
|
-
-
|
87
|
-
-
|
88
|
-
-
|
89
|
-
|
90
|
-
- test/test_filewatcher.rb
|
91
|
-
homepage: http://github.com/thomasfl/filewatcher
|
127
|
+
- spec/filewatcher/snapshot_spec.rb
|
128
|
+
- spec/filewatcher/version_spec.rb
|
129
|
+
- spec/filewatcher_spec.rb
|
130
|
+
- spec/spec_helper.rb
|
131
|
+
- spec/spec_helper/ruby_watch_run.rb
|
132
|
+
homepage: http://github.com/filewatcher/filewatcher
|
92
133
|
licenses:
|
93
134
|
- MIT
|
94
135
|
metadata: {}
|
95
|
-
post_install_message:
|
136
|
+
post_install_message:
|
96
137
|
rdoc_options: []
|
97
138
|
require_paths:
|
98
139
|
- lib
|
99
140
|
required_ruby_version: !ruby/object:Gem::Requirement
|
100
141
|
requirements:
|
101
|
-
- - "
|
142
|
+
- - "~>"
|
102
143
|
- !ruby/object:Gem::Version
|
103
|
-
version: '
|
144
|
+
version: '2.4'
|
104
145
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
105
146
|
requirements:
|
106
|
-
- - "
|
147
|
+
- - ">"
|
107
148
|
- !ruby/object:Gem::Version
|
108
|
-
version:
|
149
|
+
version: 1.3.1
|
109
150
|
requirements: []
|
110
|
-
rubyforge_project:
|
111
|
-
rubygems_version: 2.6.
|
112
|
-
signing_key:
|
151
|
+
rubyforge_project:
|
152
|
+
rubygems_version: 2.7.6.2
|
153
|
+
signing_key:
|
113
154
|
specification_version: 4
|
114
|
-
summary:
|
115
|
-
test_files:
|
116
|
-
- test/dumpers/env_dumper.rb
|
117
|
-
- test/dumpers/watched_dumper.rb
|
118
|
-
- test/filewatcher/test_env.rb
|
119
|
-
- test/filewatcher/test_runner.rb
|
120
|
-
- test/filewatcher/test_version.rb
|
121
|
-
- test/helper.rb
|
122
|
-
- test/test_filewatcher.rb
|
155
|
+
summary: Lightweight filewatcher.
|
156
|
+
test_files: []
|
data/bin/banner.txt
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
Filewatcher scans the filesystem and executes shell commands when files changes.
|
2
|
-
|
3
|
-
Usage:
|
4
|
-
filewatcher [--restart] '<filenames or patterns>' '<shell command>'
|
5
|
-
Where
|
6
|
-
filename: filename(s) to scan.
|
7
|
-
shell command: shell command to execute when file changes on disk.
|
8
|
-
|
9
|
-
Examples:
|
10
|
-
filewatcher "myfile" "echo 'myfile has changed'"
|
11
|
-
filewatcher '*.rb' 'ruby $FILENAME'
|
12
|
-
filewatcher '**/*.rb' 'ruby $FILENAME' # Watch subdirectories
|
13
|
-
|
14
|
-
Other available environment variables are BASENAME, ABSOLUTE_FILENAME,
|
15
|
-
RELATIVE_FILENAME, EVENT and DIRNAME.
|
16
|
-
|
17
|
-
Options:
|
data/bin/filewatcher
DELETED
@@ -1,106 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
# frozen_string_literal: true
|
3
|
-
|
4
|
-
require_relative '../lib/filewatcher'
|
5
|
-
require_relative '../lib/filewatcher/env'
|
6
|
-
require_relative '../lib/filewatcher/runner'
|
7
|
-
require_relative '../lib/filewatcher/version'
|
8
|
-
|
9
|
-
require 'optimist'
|
10
|
-
|
11
|
-
options = Optimist.options do
|
12
|
-
version "filewatcher, version #{Filewatcher::VERSION} by Thomas Flemming 2016"
|
13
|
-
banner File.read File.join(__dir__, 'banner.txt')
|
14
|
-
|
15
|
-
opt :immediate, 'Immediately execute a command',
|
16
|
-
short: 'I', type: :boolean, default: false
|
17
|
-
opt :every, 'Run command for every updated file in one filesystem check',
|
18
|
-
short: 'E', type: :boolean, default: false
|
19
|
-
opt :daemon, 'Run in the background as system daemon',
|
20
|
-
short: 'D', type: :boolean, default: false
|
21
|
-
opt :restart, 'Restart process when filesystem is updated',
|
22
|
-
short: 'r', type: :boolean, default: false
|
23
|
-
opt :list, 'Print name of files being watched'
|
24
|
-
opt :exec, 'Execute file as a script when file is updated',
|
25
|
-
short: 'e', type: :boolean, default: false
|
26
|
-
opt :include, 'Include files',
|
27
|
-
type: :string, default: File.join('**', '*')
|
28
|
-
opt :exclude, 'Exclude file(s) matching',
|
29
|
-
type: :string, default: nil
|
30
|
-
opt :interval, 'Interval to scan filesystem',
|
31
|
-
short: 'i', type: :float, default: 0.5
|
32
|
-
opt :spinner, 'Show an ascii spinner',
|
33
|
-
short: 's', type: :boolean, default: false
|
34
|
-
end
|
35
|
-
|
36
|
-
Optimist.die Optimist.educate if ARGV.empty?
|
37
|
-
|
38
|
-
files = ARGV[0..-2]
|
39
|
-
|
40
|
-
files << ARGV.first if files.empty?
|
41
|
-
|
42
|
-
def split_files_void_escaped_whitespace(files)
|
43
|
-
files
|
44
|
-
.map { |name| name.gsub(/\\\s/, '_ESCAPED_WHITESPACE_').split(/\s/) }
|
45
|
-
.flatten
|
46
|
-
.uniq
|
47
|
-
.map { |name| name.gsub('_ESCAPED_WHITESPACE_', '\ ') }
|
48
|
-
end
|
49
|
-
|
50
|
-
files = split_files_void_escaped_whitespace(files)
|
51
|
-
child_pid = nil
|
52
|
-
|
53
|
-
def restart(pid, env, cmd)
|
54
|
-
begin
|
55
|
-
raise Errno::ESRCH unless pid
|
56
|
-
Process.kill(9, pid)
|
57
|
-
Process.wait(pid)
|
58
|
-
rescue Errno::ESRCH
|
59
|
-
nil # already killed
|
60
|
-
end
|
61
|
-
Process.spawn(env, cmd)
|
62
|
-
end
|
63
|
-
|
64
|
-
if options[:exclude].to_s != ''
|
65
|
-
options[:exclude] = split_files_void_escaped_whitespace(
|
66
|
-
options[:exclude].split(' ')
|
67
|
-
)
|
68
|
-
end
|
69
|
-
|
70
|
-
begin
|
71
|
-
fw = Filewatcher.new(files, options)
|
72
|
-
|
73
|
-
if options[:list]
|
74
|
-
puts 'Watching:'
|
75
|
-
fw.last_found_filenames.each do |filename|
|
76
|
-
puts " #{filename}"
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
Process.daemon(true, true) if options[:daemon]
|
81
|
-
|
82
|
-
fw.watch do |filename, event|
|
83
|
-
cmd =
|
84
|
-
if options[:exec] && File.exist?(filename)
|
85
|
-
Filewatcher::Runner.new(filename).command
|
86
|
-
elsif ARGV.length > 1
|
87
|
-
ARGV[-1]
|
88
|
-
end
|
89
|
-
|
90
|
-
next puts "file #{event}: #{filename}" unless cmd
|
91
|
-
|
92
|
-
env = Filewatcher::Env.new(filename, event).to_h
|
93
|
-
if options[:restart]
|
94
|
-
child_pid = restart(child_pid, env, cmd)
|
95
|
-
else
|
96
|
-
begin
|
97
|
-
Process.spawn(env, cmd)
|
98
|
-
Process.wait
|
99
|
-
rescue SystemExit, Interrupt
|
100
|
-
exit(0)
|
101
|
-
end
|
102
|
-
end
|
103
|
-
end
|
104
|
-
rescue SystemExit, Interrupt
|
105
|
-
fw.finalize
|
106
|
-
end
|
data/lib/filewatcher/env.rb
DELETED
@@ -1,33 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'pathname'
|
4
|
-
require_relative '../filewatcher'
|
5
|
-
|
6
|
-
class Filewatcher
|
7
|
-
# Class for building ENV variables for executable
|
8
|
-
class Env
|
9
|
-
def initialize(filename, event)
|
10
|
-
@filename = filename
|
11
|
-
@event = event
|
12
|
-
@path = Pathname.new(@filename)
|
13
|
-
@realpath = @path.exist? ? @path.realpath : @path
|
14
|
-
@current_dir = Pathname.new(Dir.pwd)
|
15
|
-
# For safely `immediate` option with empty-strings arguments
|
16
|
-
@relative_path =
|
17
|
-
(@realpath.to_s.empty? ? @current_dir : @realpath)
|
18
|
-
.relative_path_from(@current_dir)
|
19
|
-
end
|
20
|
-
|
21
|
-
def to_h
|
22
|
-
{
|
23
|
-
'FILEPATH' => (@realpath.to_s if @event != :deleted),
|
24
|
-
'FILENAME' => @filename,
|
25
|
-
'BASENAME' => @path.basename.to_s,
|
26
|
-
'EVENT' => @event.to_s,
|
27
|
-
'DIRNAME' => @path.parent.realpath.to_s,
|
28
|
-
'ABSOLUTE_FILENAME' => @realpath.to_s,
|
29
|
-
'RELATIVE_FILENAME' => @relative_path.to_s
|
30
|
-
}
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
data/lib/filewatcher/runner.rb
DELETED
@@ -1,33 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
class Filewatcher
|
4
|
-
## Get runner command by filename
|
5
|
-
class Runner
|
6
|
-
## Define runners for `--exec` option
|
7
|
-
RUNNERS = {
|
8
|
-
python: %w[py],
|
9
|
-
node: %w[js],
|
10
|
-
ruby: %w[rb],
|
11
|
-
perl: %w[pl],
|
12
|
-
awk: %w[awk],
|
13
|
-
php: %w[php phtml php4 php3 php5 phps]
|
14
|
-
}.freeze
|
15
|
-
|
16
|
-
def initialize(filename)
|
17
|
-
@filename = filename
|
18
|
-
@ext = File.extname(filename).delete('.')
|
19
|
-
end
|
20
|
-
|
21
|
-
def command
|
22
|
-
"env #{runner} #{@filename}" if runner
|
23
|
-
end
|
24
|
-
|
25
|
-
private
|
26
|
-
|
27
|
-
def runner
|
28
|
-
return @runner if defined?(@runner)
|
29
|
-
@runner, _exts = RUNNERS.find { |_cmd, exts| exts.include? @ext }
|
30
|
-
@runner
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
data/test/dumpers/env_dumper.rb
DELETED
@@ -1,70 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative '../../lib/filewatcher/env'
|
4
|
-
|
5
|
-
describe Filewatcher::Env do
|
6
|
-
describe '#initialize' do
|
7
|
-
it 'should recieve filename and event' do
|
8
|
-
-> { Filewatcher::Env.new(__FILE__, :updated) }
|
9
|
-
.should.not.raise ArgumentError
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
describe '#to_h' do
|
14
|
-
before do
|
15
|
-
@init = proc do |file: __FILE__, event: :updated|
|
16
|
-
Filewatcher::Env.new(file, event).to_h
|
17
|
-
end
|
18
|
-
@env = @init.call
|
19
|
-
end
|
20
|
-
|
21
|
-
it 'should return Hash' do
|
22
|
-
@env.should.be.kind_of Hash
|
23
|
-
end
|
24
|
-
|
25
|
-
it 'should return Hash with FILEPATH key for created event' do
|
26
|
-
@init.call(event: :created)['FILEPATH']
|
27
|
-
.should.equal File.join(Dir.pwd, __FILE__)
|
28
|
-
end
|
29
|
-
|
30
|
-
it 'should return Hash with FILEPATH key for updated event' do
|
31
|
-
@init.call(event: :updated)['FILEPATH']
|
32
|
-
.should.equal File.join(Dir.pwd, __FILE__)
|
33
|
-
end
|
34
|
-
|
35
|
-
it 'should return Hash without FILEPATH key for deleted event' do
|
36
|
-
@init.call(event: :deleted)['FILEPATH']
|
37
|
-
.should.equal nil
|
38
|
-
end
|
39
|
-
|
40
|
-
it 'should return Hash with FILENAME key' do
|
41
|
-
@init.call(file: __FILE__)['FILENAME']
|
42
|
-
.should.equal __FILE__
|
43
|
-
end
|
44
|
-
|
45
|
-
it 'should return Hash with BASENAME key' do
|
46
|
-
@init.call(file: __FILE__)['BASENAME']
|
47
|
-
.should.equal File.basename(__FILE__)
|
48
|
-
end
|
49
|
-
|
50
|
-
it 'should return Hash with EVENT key' do
|
51
|
-
@init.call(event: :updated)['EVENT']
|
52
|
-
.should.equal 'updated'
|
53
|
-
end
|
54
|
-
|
55
|
-
it 'should return Hash with DIRNAME key' do
|
56
|
-
@init.call(file: __FILE__)['DIRNAME']
|
57
|
-
.should.equal File.dirname(File.join(Dir.pwd, __FILE__))
|
58
|
-
end
|
59
|
-
|
60
|
-
it 'should return Hash with ABSOLUTE_FILENAME key' do
|
61
|
-
@init.call(file: __FILE__)['ABSOLUTE_FILENAME']
|
62
|
-
.should.equal File.join(Dir.pwd, __FILE__)
|
63
|
-
end
|
64
|
-
|
65
|
-
it 'should return Hash with RELATIVE_FILENAME key' do
|
66
|
-
@init.call(file: __FILE__)['RELATIVE_FILENAME']
|
67
|
-
.should.equal __FILE__
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|