filewatcher 2.0.0 → 3.0.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/lib/filewatcher/snapshot.rb +6 -5
- data/lib/filewatcher/spec_helper/ruby_watch_run.rb +1 -1
- data/lib/filewatcher/spec_helper/watch_run.rb +71 -28
- data/lib/filewatcher/spec_helper.rb +1 -1
- data/lib/filewatcher/version.rb +1 -1
- data/spec/examples.txt +28 -0
- data/spec/filewatcher_spec.rb +116 -52
- data/spec/spec_helper.rb +9 -4
- metadata +14 -114
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 25f23553b187f2173b966b5a278bf7948f855390b5184196626b417b5ac1b190
|
|
4
|
+
data.tar.gz: 469558d39224bf9116d9b54a99ac962de9f6a22db295f28b5fae65c2f3808672
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: b044368afdc3d968e9ec27d726133e7fb64508411a2e15dba47c0492c059dc95bac3c6d3844c957d97f4dee815582efd5ca8dc75b535ad0040860600aadc1449
|
|
7
|
+
data.tar.gz: 1fd293c552bc6dfc32a3dbca59aae016b5b294a8012174b15a11ee44ca16e0cd1d0666ddd38b1449981b29c080531656865e19cde089d026b905c7d238f2797f
|
data/lib/filewatcher/snapshot.rb
CHANGED
|
@@ -6,7 +6,8 @@ class Filewatcher
|
|
|
6
6
|
# Class for snapshots of file system
|
|
7
7
|
class Snapshot
|
|
8
8
|
extend Forwardable
|
|
9
|
-
|
|
9
|
+
|
|
10
|
+
def_delegators :@data, :[], :each, :each_key, :keys
|
|
10
11
|
|
|
11
12
|
def initialize(filenames)
|
|
12
13
|
@data = filenames.each_with_object({}) do |filename, data|
|
|
@@ -21,7 +22,7 @@ class Filewatcher
|
|
|
21
22
|
changes[filename] = snapshot_file - other[filename]
|
|
22
23
|
end
|
|
23
24
|
|
|
24
|
-
other.
|
|
25
|
+
other.each_key do |filename|
|
|
25
26
|
changes[filename] = :deleted unless self[filename]
|
|
26
27
|
end
|
|
27
28
|
|
|
@@ -36,18 +37,18 @@ class Filewatcher
|
|
|
36
37
|
end
|
|
37
38
|
|
|
38
39
|
def populate_stats(stats)
|
|
39
|
-
defined?(super) ? super
|
|
40
|
+
defined?(super) ? super : stats
|
|
40
41
|
end
|
|
41
42
|
|
|
42
43
|
def subtractions
|
|
43
44
|
@subtractions ||= populate_subtractions(
|
|
44
|
-
created:
|
|
45
|
+
created: lambda(&:nil?),
|
|
45
46
|
updated: ->(other) { mtime && mtime > other.mtime }
|
|
46
47
|
)
|
|
47
48
|
end
|
|
48
49
|
|
|
49
50
|
def populate_subtractions(hash)
|
|
50
|
-
hash = super
|
|
51
|
+
hash = super if defined?(super)
|
|
51
52
|
hash
|
|
52
53
|
end
|
|
53
54
|
end
|
|
@@ -1,24 +1,74 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require 'module_methods'
|
|
4
|
+
|
|
3
5
|
class Filewatcher
|
|
4
6
|
module SpecHelper
|
|
5
7
|
## Base module for Filewatcher runners in specs
|
|
6
8
|
module WatchRun
|
|
9
|
+
extend ::ModuleMethods::Extension
|
|
10
|
+
|
|
7
11
|
include Filewatcher::SpecHelper
|
|
8
12
|
|
|
9
|
-
TMP_DIR =
|
|
13
|
+
TMP_DIR = 'spec/tmp'
|
|
14
|
+
## It's requried to split modifying files from result files like CLI dumpers
|
|
15
|
+
TMP_FILES_DIR = "#{TMP_DIR}/files".freeze
|
|
16
|
+
|
|
17
|
+
create_update_action = lambda do |change_file, change_data|
|
|
18
|
+
new_content = change_data.fetch(:content, 'content2')
|
|
19
|
+
|
|
20
|
+
FileUtils.mkdir_p File.dirname(change_file)
|
|
21
|
+
|
|
22
|
+
## There is no `File.write` because of strange difference in parallel `File.mtime`
|
|
23
|
+
## https://cirrus-ci.com/task/6107605053472768?command=test#L497-L511
|
|
24
|
+
system "echo '#{new_content}' > #{change_file}"
|
|
25
|
+
|
|
26
|
+
debug_file_mtime(change_file)
|
|
27
|
+
end.freeze
|
|
28
|
+
|
|
29
|
+
CHANGES = {
|
|
30
|
+
create: create_update_action,
|
|
31
|
+
update: create_update_action,
|
|
32
|
+
create_dir: ->(change_file, *_args) { FileUtils.mkdir_p(change_file) },
|
|
33
|
+
delete: ->(change_file, *_args) { FileUtils.remove(change_file) }
|
|
34
|
+
}.freeze
|
|
35
|
+
|
|
36
|
+
attr_reader :initial_files
|
|
10
37
|
|
|
11
|
-
|
|
38
|
+
## Class methods for this and inherited modules
|
|
39
|
+
module ClassMethods
|
|
40
|
+
def transform_spec_files(file)
|
|
41
|
+
tmp_files_dir = File.join(Dir.getwd, TMP_FILES_DIR)
|
|
12
42
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
43
|
+
return tmp_files_dir if file.to_s.empty?
|
|
44
|
+
|
|
45
|
+
return file if file.match?(%r{^(/|~|[A-Z]:)})
|
|
46
|
+
|
|
47
|
+
File.join(tmp_files_dir, file)
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def initialize(initial_files:, changes:)
|
|
52
|
+
@initial_files = initial_files.transform_keys { |key| self.class.transform_spec_files(key) }
|
|
53
|
+
|
|
54
|
+
@changes = changes
|
|
55
|
+
|
|
56
|
+
debug "changes = #{@changes}"
|
|
17
57
|
end
|
|
18
58
|
|
|
19
59
|
def start
|
|
20
60
|
debug 'start'
|
|
21
|
-
|
|
61
|
+
|
|
62
|
+
FileUtils.mkdir_p self.class::TMP_FILES_DIR
|
|
63
|
+
|
|
64
|
+
initial_files.each do |initial_file_path, initial_file_data|
|
|
65
|
+
File.write(
|
|
66
|
+
File.expand_path(initial_file_path),
|
|
67
|
+
initial_file_data.fetch(:content, 'content1')
|
|
68
|
+
)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
debug "start initial_files = #{initial_files}"
|
|
22
72
|
|
|
23
73
|
wait seconds: 1
|
|
24
74
|
end
|
|
@@ -37,38 +87,31 @@ class Filewatcher
|
|
|
37
87
|
|
|
38
88
|
def stop
|
|
39
89
|
debug 'stop'
|
|
40
|
-
FileUtils.rm_r(
|
|
90
|
+
FileUtils.rm_r(self.class::TMP_FILES_DIR) if File.exist?(self.class::TMP_FILES_DIR)
|
|
41
91
|
end
|
|
42
92
|
|
|
43
93
|
private
|
|
44
94
|
|
|
45
|
-
create_update_action = lambda do
|
|
46
|
-
## There is no `File.write` because of strange difference in parallel `File.mtime`
|
|
47
|
-
## https://cirrus-ci.com/task/6107605053472768?command=test#L497-L511
|
|
48
|
-
system "echo 'content2' > #{@filename}"
|
|
49
|
-
debug_file_mtime
|
|
50
|
-
end.freeze
|
|
51
|
-
|
|
52
|
-
ACTIONS = {
|
|
53
|
-
create: create_update_action,
|
|
54
|
-
update: create_update_action,
|
|
55
|
-
create_dir: -> { FileUtils.mkdir_p(@filename) },
|
|
56
|
-
delete: -> { FileUtils.remove(@filename) }
|
|
57
|
-
}.freeze
|
|
58
|
-
|
|
59
95
|
def make_changes
|
|
60
|
-
|
|
96
|
+
@changes.each do |change_file, change_data|
|
|
97
|
+
debug "make changes, change_file = #{change_file}, change_data = #{change_data}"
|
|
61
98
|
|
|
62
|
-
|
|
99
|
+
change_event = change_data.fetch(:event, :update)
|
|
100
|
+
change_event = :create_dir if change_event == :create && change_data[:directory]
|
|
63
101
|
|
|
64
|
-
|
|
102
|
+
change_block =
|
|
103
|
+
self.class::CHANGES.fetch(change_event) { raise "Unknown change `#{change_event}`" }
|
|
104
|
+
|
|
105
|
+
instance_exec(change_file, change_data, &change_block)
|
|
106
|
+
end
|
|
65
107
|
|
|
66
108
|
wait seconds: 1
|
|
67
109
|
end
|
|
68
110
|
|
|
69
|
-
def debug_file_mtime
|
|
70
|
-
|
|
71
|
-
debug "
|
|
111
|
+
def debug_file_mtime(file)
|
|
112
|
+
file = File.expand_path file
|
|
113
|
+
debug "stat #{file}: #{system_stat(file)}"
|
|
114
|
+
debug "File.mtime = #{File.mtime(file).strftime('%F %T.%9N')}"
|
|
72
115
|
end
|
|
73
116
|
end
|
|
74
117
|
end
|
data/lib/filewatcher/version.rb
CHANGED
data/spec/examples.txt
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
example_id | status | run_time |
|
|
2
|
+
------------------------------------------ | ------ | --------------- |
|
|
3
|
+
./spec/filewatcher/snapshot_spec.rb[1:1:1] | passed | 0.00101 seconds |
|
|
4
|
+
./spec/filewatcher/snapshot_spec.rb[1:2:1] | passed | 1 second |
|
|
5
|
+
./spec/filewatcher/version_spec.rb[1:1] | passed | 0.00075 seconds |
|
|
6
|
+
./spec/filewatcher_spec.rb[1:1:1] | passed | 0.01465 seconds |
|
|
7
|
+
./spec/filewatcher_spec.rb[1:2:1:1:1] | passed | 6.01 seconds |
|
|
8
|
+
./spec/filewatcher_spec.rb[1:2:1:2:1] | passed | 5.01 seconds |
|
|
9
|
+
./spec/filewatcher_spec.rb[1:2:1:3:1] | passed | 5.01 seconds |
|
|
10
|
+
./spec/filewatcher_spec.rb[1:2:1:4:1] | passed | 5.01 seconds |
|
|
11
|
+
./spec/filewatcher_spec.rb[1:2:1:5:1] | passed | 5.01 seconds |
|
|
12
|
+
./spec/filewatcher_spec.rb[1:2:1:6:1] | passed | 5.02 seconds |
|
|
13
|
+
./spec/filewatcher_spec.rb[1:2:1:7:1] | passed | 5.02 seconds |
|
|
14
|
+
./spec/filewatcher_spec.rb[1:2:2:1:1] | passed | 2 seconds |
|
|
15
|
+
./spec/filewatcher_spec.rb[1:2:2:1:2:1] | passed | 2 seconds |
|
|
16
|
+
./spec/filewatcher_spec.rb[1:2:2:2:1] | passed | 2 seconds |
|
|
17
|
+
./spec/filewatcher_spec.rb[1:2:2:2:2:1] | passed | 2 seconds |
|
|
18
|
+
./spec/filewatcher_spec.rb[1:3:1:1:1] | passed | 5.01 seconds |
|
|
19
|
+
./spec/filewatcher_spec.rb[1:3:1:2:1] | passed | 5.01 seconds |
|
|
20
|
+
./spec/filewatcher_spec.rb[1:3:1:3:1] | passed | 5.01 seconds |
|
|
21
|
+
./spec/filewatcher_spec.rb[1:3:1:4:1] | passed | 5.01 seconds |
|
|
22
|
+
./spec/filewatcher_spec.rb[1:3:1:5:1] | passed | 5.01 seconds |
|
|
23
|
+
./spec/filewatcher_spec.rb[1:3:2:1] | passed | 2 seconds |
|
|
24
|
+
./spec/filewatcher_spec.rb[1:4:1] | passed | 2 seconds |
|
|
25
|
+
./spec/filewatcher_spec.rb[1:5:1] | passed | 7.21 seconds |
|
|
26
|
+
./spec/filewatcher_spec.rb[1:6:1:1] | passed | 7.41 seconds |
|
|
27
|
+
./spec/filewatcher_spec.rb[1:6:2:1] | passed | 11.61 seconds |
|
|
28
|
+
./spec/filewatcher_spec.rb[1:7:1] | passed | 6.01 seconds |
|
data/spec/filewatcher_spec.rb
CHANGED
|
@@ -6,15 +6,11 @@ require_relative '../lib/filewatcher'
|
|
|
6
6
|
describe Filewatcher do
|
|
7
7
|
subject(:processed) { watch_run.processed }
|
|
8
8
|
|
|
9
|
-
before do
|
|
10
|
-
FileUtils.mkdir_p tmp_dir
|
|
11
|
-
end
|
|
12
|
-
|
|
13
9
|
after do
|
|
14
10
|
logger.debug "FileUtils.rm_r #{tmp_dir}"
|
|
15
|
-
FileUtils.rm_r tmp_dir
|
|
11
|
+
FileUtils.rm_r tmp_dir if File.exist?(tmp_dir)
|
|
16
12
|
|
|
17
|
-
|
|
13
|
+
described_class::SpecHelper.wait seconds: 5, interval: 0.2 do
|
|
18
14
|
!File.exist?(tmp_dir)
|
|
19
15
|
end
|
|
20
16
|
end
|
|
@@ -23,24 +19,46 @@ describe Filewatcher do
|
|
|
23
19
|
described_class.new(path, options.merge(logger: logger))
|
|
24
20
|
end
|
|
25
21
|
|
|
26
|
-
|
|
27
|
-
|
|
22
|
+
def transform_spec_files(file)
|
|
23
|
+
ruby_watch_run_class.transform_spec_files(file)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
let(:ruby_watch_run_class) { described_class::SpecHelper::RubyWatchRun }
|
|
27
|
+
|
|
28
|
+
let(:tmp_dir) { ruby_watch_run_class::TMP_DIR }
|
|
29
|
+
let(:tmp_files_dir) { ruby_watch_run_class::TMP_FILES_DIR }
|
|
30
|
+
let(:logger) { described_class::SpecHelper.logger }
|
|
31
|
+
|
|
32
|
+
let(:raw_file_name) { 'tmp_file.txt' }
|
|
33
|
+
let(:initial_files) { { raw_file_name => {} } }
|
|
34
|
+
|
|
35
|
+
let(:change_event) { :update }
|
|
36
|
+
let(:change_directory) { false }
|
|
37
|
+
|
|
38
|
+
let(:changes) do
|
|
39
|
+
files = Array(initial_files.keys)
|
|
40
|
+
files << raw_file_name if files.empty?
|
|
41
|
+
files.to_h do |file|
|
|
42
|
+
[transform_spec_files(file), { event: change_event, directory: change_directory }]
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
let(:result_transformed_filename) do
|
|
47
|
+
transform_spec_files(initial_files.any? ? initial_files.keys.first : raw_file_name)
|
|
48
|
+
end
|
|
28
49
|
|
|
29
|
-
let(:filename) { 'tmp_file.txt' }
|
|
30
|
-
let(:action) { :update }
|
|
31
50
|
## TODO: Check its needless
|
|
32
51
|
let(:every) { false }
|
|
33
52
|
let(:immediate) { false }
|
|
34
53
|
let(:interval) { 0.2 }
|
|
54
|
+
let(:filewatcher_files) { File.expand_path("#{tmp_files_dir}/**/*") }
|
|
35
55
|
let(:filewatcher) do
|
|
36
|
-
initialize_filewatcher
|
|
37
|
-
File.join(tmp_dir, '**', '*'), interval: interval, every: every, immediate: immediate
|
|
38
|
-
)
|
|
56
|
+
initialize_filewatcher filewatcher_files, interval: interval, every: every, immediate: immediate
|
|
39
57
|
end
|
|
40
58
|
|
|
41
59
|
let(:watch_run) do
|
|
42
|
-
|
|
43
|
-
|
|
60
|
+
ruby_watch_run_class.new(
|
|
61
|
+
initial_files: initial_files, filewatcher: filewatcher, changes: changes
|
|
44
62
|
)
|
|
45
63
|
end
|
|
46
64
|
|
|
@@ -50,7 +68,7 @@ describe Filewatcher do
|
|
|
50
68
|
subject(:method_call) { described_class.print_version }
|
|
51
69
|
|
|
52
70
|
let(:ruby_version_regexp) { '(j|truffle)?ruby \d+\.\d+\.\d+.*' }
|
|
53
|
-
let(:filewatcher_version_regexp) { "Filewatcher #{
|
|
71
|
+
let(:filewatcher_version_regexp) { "Filewatcher #{described_class::VERSION}" }
|
|
54
72
|
|
|
55
73
|
it do
|
|
56
74
|
expect { method_call }.to output(
|
|
@@ -66,8 +84,8 @@ describe Filewatcher do
|
|
|
66
84
|
context 'with excluding selected file patterns' do
|
|
67
85
|
let(:filewatcher) do
|
|
68
86
|
initialize_filewatcher(
|
|
69
|
-
|
|
70
|
-
exclude: File.expand_path(
|
|
87
|
+
filewatcher_files,
|
|
88
|
+
exclude: File.expand_path("#{tmp_files_dir}/**/*.txt")
|
|
71
89
|
)
|
|
72
90
|
end
|
|
73
91
|
|
|
@@ -75,39 +93,81 @@ describe Filewatcher do
|
|
|
75
93
|
end
|
|
76
94
|
|
|
77
95
|
context 'with absolute paths including globs' do
|
|
78
|
-
let(:
|
|
79
|
-
initialize_filewatcher(
|
|
80
|
-
File.expand_path('spec/tmp/**/*')
|
|
81
|
-
)
|
|
82
|
-
end
|
|
96
|
+
let(:filewatcher_files) { File.expand_path("#{tmp_files_dir}/**/*") }
|
|
83
97
|
|
|
84
|
-
it { is_expected.to eq [{
|
|
98
|
+
it { is_expected.to eq [{ result_transformed_filename => :updated }] }
|
|
85
99
|
end
|
|
86
100
|
|
|
87
101
|
context 'with globs' do
|
|
88
|
-
let(:
|
|
102
|
+
let(:filewatcher_files) { "#{tmp_files_dir}/**/*" }
|
|
89
103
|
|
|
90
|
-
it { is_expected.to eq [{
|
|
104
|
+
it { is_expected.to eq [{ result_transformed_filename => :updated }] }
|
|
91
105
|
end
|
|
92
106
|
|
|
93
107
|
context 'with explicit relative paths with globs' do
|
|
94
|
-
let(:
|
|
108
|
+
let(:filewatcher_files) { "./#{tmp_files_dir}/**/*" }
|
|
95
109
|
|
|
96
|
-
it { is_expected.to eq [{
|
|
110
|
+
it { is_expected.to eq [{ result_transformed_filename => :updated }] }
|
|
97
111
|
end
|
|
98
112
|
|
|
99
113
|
context 'with explicit relative paths' do
|
|
100
|
-
let(:
|
|
114
|
+
let(:filewatcher_files) { "./#{tmp_files_dir}" }
|
|
101
115
|
|
|
102
|
-
it { is_expected.to eq [{
|
|
116
|
+
it { is_expected.to eq [{ result_transformed_filename => :updated }] }
|
|
103
117
|
end
|
|
104
118
|
|
|
105
119
|
context 'with tilde expansion' do
|
|
106
|
-
let(:
|
|
120
|
+
let(:filewatcher_files) { '~/file_watcher_1.txt' }
|
|
121
|
+
let(:raw_file_name) { File.expand_path('~/file_watcher_1.txt') }
|
|
107
122
|
|
|
108
|
-
|
|
123
|
+
it { is_expected.to eq [{ raw_file_name => :updated }] }
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
context 'with Array of paths' do
|
|
127
|
+
let(:initial_file) { 'tmp_initial_file.txt' }
|
|
128
|
+
let(:subdir) { 'subdir' }
|
|
129
|
+
let(:new_file) { "#{subdir}/tmp_new_file.txt" }
|
|
130
|
+
|
|
131
|
+
let(:filewatcher_files) do
|
|
132
|
+
["#{tmp_files_dir}/#{initial_file}", "#{tmp_files_dir}/#{subdir}"]
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
let(:initial_files) do
|
|
136
|
+
{
|
|
137
|
+
initial_file => {}
|
|
138
|
+
}
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
let(:changes) do
|
|
142
|
+
initial_files.to_h { |key, _value| [transform_spec_files(key), { event: :update }] }
|
|
143
|
+
.merge(
|
|
144
|
+
transform_spec_files(new_file) => { event: :create }
|
|
145
|
+
)
|
|
146
|
+
end
|
|
109
147
|
|
|
110
|
-
|
|
148
|
+
let(:expected_changes) do
|
|
149
|
+
[
|
|
150
|
+
initial_files.to_h { |key, _value| [transform_spec_files(key), :updated] }
|
|
151
|
+
.merge(
|
|
152
|
+
expected_new_file_change
|
|
153
|
+
)
|
|
154
|
+
]
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
let(:expected_new_file_change) do
|
|
158
|
+
{
|
|
159
|
+
transform_spec_files(new_file) => :created
|
|
160
|
+
}
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
specify do
|
|
164
|
+
## For case when changes detected separately, in CI for example, probably just slowly
|
|
165
|
+
expect(processed).to eq(expected_changes)
|
|
166
|
+
.or contain_exactly(
|
|
167
|
+
*initial_files.map { |key, _value| { transform_spec_files(key) => :updated } },
|
|
168
|
+
expected_new_file_change
|
|
169
|
+
)
|
|
170
|
+
end
|
|
111
171
|
end
|
|
112
172
|
end
|
|
113
173
|
|
|
@@ -152,51 +212,56 @@ describe Filewatcher do
|
|
|
152
212
|
end
|
|
153
213
|
|
|
154
214
|
context 'when there are file deletions' do
|
|
155
|
-
let(:
|
|
215
|
+
let(:change_event) { :delete }
|
|
156
216
|
|
|
157
|
-
it { is_expected.to eq [{
|
|
217
|
+
it { is_expected.to eq [{ result_transformed_filename => :deleted }] }
|
|
158
218
|
end
|
|
159
219
|
|
|
160
220
|
context 'when there are file additions' do
|
|
161
|
-
let(:
|
|
221
|
+
let(:initial_files) { {} }
|
|
222
|
+
let(:changes) { { result_transformed_filename => { event: :create } } }
|
|
162
223
|
|
|
163
|
-
it { is_expected.to eq [{
|
|
224
|
+
it { is_expected.to eq [{ result_transformed_filename => :created }] }
|
|
164
225
|
end
|
|
165
226
|
|
|
166
227
|
context 'when there are file updates' do
|
|
167
|
-
let(:
|
|
228
|
+
let(:change_event) { :update }
|
|
168
229
|
|
|
169
|
-
it { is_expected.to eq [{
|
|
230
|
+
it { is_expected.to eq [{ result_transformed_filename => :updated }] }
|
|
170
231
|
end
|
|
171
232
|
|
|
172
233
|
context 'when there are new files in subdirectories' do
|
|
173
|
-
let(:subdirectory) { File.expand_path(
|
|
234
|
+
let(:subdirectory) { File.expand_path("#{tmp_files_dir}/new_sub_directory") }
|
|
235
|
+
|
|
236
|
+
let(:initial_files) { {} }
|
|
237
|
+
let(:created_filename) { File.join(subdirectory, 'file.txt') }
|
|
238
|
+
let(:changes) { { created_filename => { event: :create } } }
|
|
174
239
|
|
|
175
|
-
let(:filename) { File.join(subdirectory, 'file.txt') }
|
|
176
|
-
let(:action) { :create }
|
|
177
240
|
let(:every) { true }
|
|
178
241
|
## https://github.com/filewatcher/filewatcher/pull/115#issuecomment-674581595
|
|
179
242
|
let(:interval) { 0.4 }
|
|
180
243
|
|
|
181
244
|
it do
|
|
182
245
|
expect(processed).to eq [
|
|
183
|
-
{ subdirectory => :updated,
|
|
246
|
+
{ subdirectory => :updated, created_filename => :created }
|
|
184
247
|
]
|
|
185
248
|
end
|
|
186
249
|
end
|
|
187
250
|
|
|
188
251
|
context 'when there are new subdirectories' do
|
|
189
|
-
let(:
|
|
190
|
-
let(:
|
|
252
|
+
let(:initial_files) { {} }
|
|
253
|
+
let(:raw_file_name) { 'new_sub_directory' }
|
|
254
|
+
let(:change_event) { :create }
|
|
255
|
+
let(:change_directory) { true }
|
|
191
256
|
|
|
192
|
-
it { is_expected.to eq [{
|
|
257
|
+
it { is_expected.to eq [{ result_transformed_filename => :created }] }
|
|
193
258
|
end
|
|
194
259
|
end
|
|
195
260
|
|
|
196
261
|
context 'when action is unknown' do
|
|
197
|
-
let(:
|
|
262
|
+
let(:change_event) { :foo }
|
|
198
263
|
|
|
199
|
-
specify { expect { watch_run.run }.to raise_error(RuntimeError, 'Unknown
|
|
264
|
+
specify { expect { watch_run.run }.to raise_error(RuntimeError, 'Unknown change `foo`') }
|
|
200
265
|
end
|
|
201
266
|
end
|
|
202
267
|
|
|
@@ -214,11 +279,10 @@ describe Filewatcher do
|
|
|
214
279
|
def write_tmp_files(range)
|
|
215
280
|
logger.debug "#{__method__} #{range}"
|
|
216
281
|
|
|
217
|
-
|
|
218
|
-
FileUtils.mkdir_p directory
|
|
282
|
+
FileUtils.mkdir_p tmp_files_dir
|
|
219
283
|
|
|
220
284
|
range.to_a.map do |n|
|
|
221
|
-
File.write(file = "#{
|
|
285
|
+
File.write(file = "#{tmp_files_dir}/file#{n}.txt", "content#{n}")
|
|
222
286
|
|
|
223
287
|
Filewatcher::SpecHelper.wait seconds: 1
|
|
224
288
|
|
|
@@ -236,7 +300,7 @@ describe Filewatcher do
|
|
|
236
300
|
logger.debug 'filewatcher.pause'
|
|
237
301
|
watch_run.filewatcher.pause
|
|
238
302
|
|
|
239
|
-
|
|
303
|
+
described_class::SpecHelper.wait seconds: 1
|
|
240
304
|
|
|
241
305
|
write_tmp_files 1..4
|
|
242
306
|
end
|
data/spec/spec_helper.rb
CHANGED
|
@@ -1,15 +1,20 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
require 'simplecov'
|
|
4
|
-
SimpleCov.start
|
|
5
4
|
|
|
6
|
-
if ENV['
|
|
7
|
-
require '
|
|
8
|
-
SimpleCov.formatter = SimpleCov::Formatter::
|
|
5
|
+
if ENV['CI']
|
|
6
|
+
require 'simplecov-cobertura'
|
|
7
|
+
SimpleCov.formatter = SimpleCov::Formatter::CoberturaFormatter
|
|
9
8
|
end
|
|
10
9
|
|
|
10
|
+
SimpleCov.start
|
|
11
|
+
|
|
11
12
|
require_relative '../lib/filewatcher/spec_helper'
|
|
12
13
|
|
|
14
|
+
RSpec.configure do |config|
|
|
15
|
+
config.example_status_persistence_file_path = "#{__dir__}/examples.txt"
|
|
16
|
+
end
|
|
17
|
+
|
|
13
18
|
## For case when required from dumpers
|
|
14
19
|
if Object.const_defined?(:RSpec)
|
|
15
20
|
RSpec::Matchers.define :include_all_files do |expected|
|
metadata
CHANGED
|
@@ -1,142 +1,43 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: filewatcher
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version:
|
|
4
|
+
version: 3.0.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Thomas Flemming
|
|
8
8
|
- Alexander Popov
|
|
9
|
-
autorequire:
|
|
10
9
|
bindir: bin
|
|
11
10
|
cert_chain: []
|
|
12
|
-
date:
|
|
11
|
+
date: 2026-02-03 00:00:00.000000000 Z
|
|
13
12
|
dependencies:
|
|
14
13
|
- !ruby/object:Gem::Dependency
|
|
15
|
-
name:
|
|
14
|
+
name: logger
|
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
|
17
16
|
requirements:
|
|
18
17
|
- - "~>"
|
|
19
18
|
- !ruby/object:Gem::Version
|
|
20
|
-
version: '
|
|
21
|
-
type: :
|
|
19
|
+
version: '1.7'
|
|
20
|
+
type: :runtime
|
|
22
21
|
prerelease: false
|
|
23
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
24
23
|
requirements:
|
|
25
24
|
- - "~>"
|
|
26
25
|
- !ruby/object:Gem::Version
|
|
27
|
-
version: '
|
|
26
|
+
version: '1.7'
|
|
28
27
|
- !ruby/object:Gem::Dependency
|
|
29
|
-
name:
|
|
28
|
+
name: module_methods
|
|
30
29
|
requirement: !ruby/object:Gem::Requirement
|
|
31
30
|
requirements:
|
|
32
31
|
- - "~>"
|
|
33
32
|
- !ruby/object:Gem::Version
|
|
34
|
-
version: 0.
|
|
35
|
-
type: :
|
|
33
|
+
version: 0.1.0
|
|
34
|
+
type: :runtime
|
|
36
35
|
prerelease: false
|
|
37
36
|
version_requirements: !ruby/object:Gem::Requirement
|
|
38
37
|
requirements:
|
|
39
38
|
- - "~>"
|
|
40
39
|
- !ruby/object:Gem::Version
|
|
41
|
-
version: 0.
|
|
42
|
-
- !ruby/object:Gem::Dependency
|
|
43
|
-
name: gem_toys
|
|
44
|
-
requirement: !ruby/object:Gem::Requirement
|
|
45
|
-
requirements:
|
|
46
|
-
- - "~>"
|
|
47
|
-
- !ruby/object:Gem::Version
|
|
48
|
-
version: 0.12.1
|
|
49
|
-
type: :development
|
|
50
|
-
prerelease: false
|
|
51
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
52
|
-
requirements:
|
|
53
|
-
- - "~>"
|
|
54
|
-
- !ruby/object:Gem::Version
|
|
55
|
-
version: 0.12.1
|
|
56
|
-
- !ruby/object:Gem::Dependency
|
|
57
|
-
name: toys
|
|
58
|
-
requirement: !ruby/object:Gem::Requirement
|
|
59
|
-
requirements:
|
|
60
|
-
- - "~>"
|
|
61
|
-
- !ruby/object:Gem::Version
|
|
62
|
-
version: 0.13.0
|
|
63
|
-
type: :development
|
|
64
|
-
prerelease: false
|
|
65
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
66
|
-
requirements:
|
|
67
|
-
- - "~>"
|
|
68
|
-
- !ruby/object:Gem::Version
|
|
69
|
-
version: 0.13.0
|
|
70
|
-
- !ruby/object:Gem::Dependency
|
|
71
|
-
name: codecov
|
|
72
|
-
requirement: !ruby/object:Gem::Requirement
|
|
73
|
-
requirements:
|
|
74
|
-
- - "~>"
|
|
75
|
-
- !ruby/object:Gem::Version
|
|
76
|
-
version: 0.6.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.6.0
|
|
84
|
-
- !ruby/object:Gem::Dependency
|
|
85
|
-
name: rspec
|
|
86
|
-
requirement: !ruby/object:Gem::Requirement
|
|
87
|
-
requirements:
|
|
88
|
-
- - "~>"
|
|
89
|
-
- !ruby/object:Gem::Version
|
|
90
|
-
version: '3.8'
|
|
91
|
-
type: :development
|
|
92
|
-
prerelease: false
|
|
93
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
94
|
-
requirements:
|
|
95
|
-
- - "~>"
|
|
96
|
-
- !ruby/object:Gem::Version
|
|
97
|
-
version: '3.8'
|
|
98
|
-
- !ruby/object:Gem::Dependency
|
|
99
|
-
name: rubocop
|
|
100
|
-
requirement: !ruby/object:Gem::Requirement
|
|
101
|
-
requirements:
|
|
102
|
-
- - "~>"
|
|
103
|
-
- !ruby/object:Gem::Version
|
|
104
|
-
version: 1.36.0
|
|
105
|
-
type: :development
|
|
106
|
-
prerelease: false
|
|
107
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
108
|
-
requirements:
|
|
109
|
-
- - "~>"
|
|
110
|
-
- !ruby/object:Gem::Version
|
|
111
|
-
version: 1.36.0
|
|
112
|
-
- !ruby/object:Gem::Dependency
|
|
113
|
-
name: rubocop-performance
|
|
114
|
-
requirement: !ruby/object:Gem::Requirement
|
|
115
|
-
requirements:
|
|
116
|
-
- - "~>"
|
|
117
|
-
- !ruby/object:Gem::Version
|
|
118
|
-
version: '1.5'
|
|
119
|
-
type: :development
|
|
120
|
-
prerelease: false
|
|
121
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
122
|
-
requirements:
|
|
123
|
-
- - "~>"
|
|
124
|
-
- !ruby/object:Gem::Version
|
|
125
|
-
version: '1.5'
|
|
126
|
-
- !ruby/object:Gem::Dependency
|
|
127
|
-
name: rubocop-rspec
|
|
128
|
-
requirement: !ruby/object:Gem::Requirement
|
|
129
|
-
requirements:
|
|
130
|
-
- - "~>"
|
|
131
|
-
- !ruby/object:Gem::Version
|
|
132
|
-
version: '2.0'
|
|
133
|
-
type: :development
|
|
134
|
-
prerelease: false
|
|
135
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
136
|
-
requirements:
|
|
137
|
-
- - "~>"
|
|
138
|
-
- !ruby/object:Gem::Version
|
|
139
|
-
version: '2.0'
|
|
40
|
+
version: 0.1.0
|
|
140
41
|
description: Detect changes in file system. Works anywhere.
|
|
141
42
|
email:
|
|
142
43
|
- thomas.flemming@gmail.com
|
|
@@ -153,6 +54,7 @@ files:
|
|
|
153
54
|
- lib/filewatcher/spec_helper/ruby_watch_run.rb
|
|
154
55
|
- lib/filewatcher/spec_helper/watch_run.rb
|
|
155
56
|
- lib/filewatcher/version.rb
|
|
57
|
+
- spec/examples.txt
|
|
156
58
|
- spec/filewatcher/snapshot_spec.rb
|
|
157
59
|
- spec/filewatcher/version_spec.rb
|
|
158
60
|
- spec/filewatcher_spec.rb
|
|
@@ -162,7 +64,6 @@ licenses:
|
|
|
162
64
|
- MIT
|
|
163
65
|
metadata:
|
|
164
66
|
rubygems_mfa_required: 'true'
|
|
165
|
-
post_install_message:
|
|
166
67
|
rdoc_options: []
|
|
167
68
|
require_paths:
|
|
168
69
|
- lib
|
|
@@ -170,18 +71,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
170
71
|
requirements:
|
|
171
72
|
- - ">="
|
|
172
73
|
- !ruby/object:Gem::Version
|
|
173
|
-
version: '2
|
|
74
|
+
version: '3.2'
|
|
174
75
|
- - "<"
|
|
175
76
|
- !ruby/object:Gem::Version
|
|
176
|
-
version: '
|
|
77
|
+
version: '5'
|
|
177
78
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
178
79
|
requirements:
|
|
179
80
|
- - ">="
|
|
180
81
|
- !ruby/object:Gem::Version
|
|
181
82
|
version: '0'
|
|
182
83
|
requirements: []
|
|
183
|
-
rubygems_version: 3.
|
|
184
|
-
signing_key:
|
|
84
|
+
rubygems_version: 3.6.2
|
|
185
85
|
specification_version: 4
|
|
186
86
|
summary: Lightweight filewatcher.
|
|
187
87
|
test_files: []
|