filewatcher 2.0.0.beta3 → 2.0.0.beta6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e1058d188f32d31bdf63775a8ff6655e64de608669630ef775c0e4975d196421
4
- data.tar.gz: 57406a8b0be947051f295de3d6208faaf4ec60e432edc22a71d1e3b22fb58415
3
+ metadata.gz: 2db0cc5cc4a588900541eef784783e1548a596b29f7359108ff2f2fc9f6c6149
4
+ data.tar.gz: ac81956d8882c15525de3e3f4747b8e9b62631fa092e19441e925e16814a7a72
5
5
  SHA512:
6
- metadata.gz: d930968943fd907aad26eb150de20fa8d2681223dad1f516f9a27c2c096893bacaa8decd0e4646753f529dbec38bba32dd1b6951b442e2df69f6a01f943116fc
7
- data.tar.gz: cc8919f9f7036cb7599b22589e5b6abadd7b2674f502eae3e9c70c3e29b72d222356f5569244b63b1524dfd64430fc8617283b1bc0f565fffc91b5299b85980e
6
+ metadata.gz: 1fdefea6d108c43026ee922706b8259bf6a7df32019a48c8bf88aa7cf06fb7dcf2942a7ca308c80d834201159af25d804948ca0d5b5b22155140ee0e15bc4305
7
+ data.tar.gz: 86bb17e7dd94046f4c357b80c264d9c4a9a720933ed1437e37e1a9547a4884ed0a5ae97f54ef6ca26cedfe76288212fa5053b1e8a5825cfdec6393981fbf155a
@@ -30,30 +30,53 @@ class Filewatcher
30
30
 
31
31
  # Class for one file from snapshot
32
32
  class SnapshotFile
33
- STATS = %i[mtime].freeze
33
+ class << self
34
+ def stats
35
+ @stats ||= populate_stats %i[mtime]
36
+ end
37
+
38
+ def populate_stats(stats)
39
+ defined?(super) ? super(stats) : stats
40
+ end
41
+
42
+ def subtractions
43
+ @subtractions ||= populate_subtractions(
44
+ created: ->(other) { other.nil? },
45
+ updated: ->(other) { mtime && mtime > other.mtime }
46
+ )
47
+ end
34
48
 
35
- attr_reader(*STATS)
49
+ def populate_subtractions(hash)
50
+ hash = super(hash) if defined?(super)
51
+ hash
52
+ end
53
+ end
54
+
55
+ attr_reader :mtime
36
56
 
37
57
  def initialize(filename)
38
58
  @filename = filename
39
- STATS.each do |stat|
59
+ self.class.stats.each do |stat|
40
60
  time = File.public_send(stat, filename) if File.exist?(filename)
41
61
  instance_variable_set :"@#{stat}", time || Time.new(0)
42
62
  end
43
63
  end
44
64
 
45
65
  def -(other)
46
- if other.nil?
47
- :created
48
- elsif other.mtime < mtime
49
- :updated
50
- end
66
+ self.class.subtractions.find do |_event, block|
67
+ instance_exec(other, &block)
68
+ end&.first
51
69
  end
52
70
 
53
71
  def inspect
72
+ stats_string =
73
+ self.class.stats
74
+ .map { |stat| "#{stat}=#{public_send(stat)&.strftime('%F %T.%9N')&.inspect}" }
75
+ .join(', ')
76
+
54
77
  <<~OUTPUT
55
78
  #<Filewatcher::Snapshot::SnapshotFile:#{object_id}
56
- @filename=#{@filename.inspect}, mtime=#{mtime.strftime('%F %T.%9N').inspect}
79
+ @filename=#{@filename.inspect}, #{stats_string}
57
80
  >
58
81
  OUTPUT
59
82
  end
@@ -4,16 +4,6 @@ require_relative 'snapshot'
4
4
 
5
5
  # Helpers in Filewatcher class itself
6
6
  class Filewatcher
7
- class << self
8
- def system_stat(filename)
9
- case Gem::Platform.local.os
10
- when 'linux' then `stat --printf 'Modification: %y, Change: %z\n' #{filename}`
11
- when 'darwin' then `stat #{filename}`
12
- else 'Unknown OS for system `stat`'
13
- end
14
- end
15
- end
16
-
17
7
  # Module for snapshot logic inside Filewatcher
18
8
  module Snapshots
19
9
  def found_filenames
@@ -1,8 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative 'watch_run'
4
+
3
5
  class Filewatcher
4
6
  module SpecHelper
5
- class RubyWatchRun < WatchRun
7
+ ## Ruby API watcher for specs
8
+ class RubyWatchRun
9
+ include WatchRun
10
+
6
11
  attr_reader :filewatcher, :thread, :watched, :processed
7
12
 
8
13
  def initialize(filewatcher:, **args)
@@ -1,32 +1,24 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'forwardable'
4
-
5
3
  class Filewatcher
6
4
  module SpecHelper
7
- ## Base class for Filewatcher runners in specs
8
- class WatchRun
9
- extend Forwardable
5
+ ## Base module for Filewatcher runners in specs
6
+ module WatchRun
7
+ include Filewatcher::SpecHelper
10
8
 
11
9
  TMP_DIR = "#{Dir.getwd}/spec/tmp"
12
10
 
13
- def_delegators Filewatcher::SpecHelper, :debug, :wait
14
-
15
11
  attr_reader :filename
16
12
 
17
- def initialize(filename:, action:, directory:)
18
- @filename =
19
- if filename.match? %r{^(/|~|[A-Z]:)} then filename
20
- else File.join(TMP_DIR, filename)
21
- end
22
- @directory = directory
13
+ def initialize(filename:, action:)
14
+ @filename = filename.match?(%r{^(/|~|[A-Z]:)}) ? filename : File.join(TMP_DIR, filename)
23
15
  @action = action
24
16
  debug "action = #{action}"
25
17
  end
26
18
 
27
19
  def start
28
20
  debug 'start'
29
- File.write(@filename, 'content1') unless @action == :create
21
+ File.write(@filename, 'content1') unless %i[create create_dir].include? @action
30
22
 
31
23
  wait seconds: 1
32
24
  end
@@ -50,25 +42,32 @@ class Filewatcher
50
42
 
51
43
  private
52
44
 
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
+
53
59
  def make_changes
54
60
  debug "make changes, @action = #{@action}, @filename = #{@filename}"
55
61
 
56
- if @action == :delete
57
- FileUtils.remove(@filename)
58
- elsif @directory
59
- FileUtils.mkdir_p(@filename)
60
- else
61
- ## There is no `File.write` because of strange difference in parallel `File.mtime`
62
- ## https://cirrus-ci.com/task/6107605053472768?command=test#L497-L511
63
- system "echo 'content2' > #{@filename}"
64
- debug_file_mtime
65
- end
62
+ action = self.class::ACTIONS.fetch(@action) { raise "Unknown action `#{@action}`" }
63
+
64
+ instance_exec(&action)
66
65
 
67
66
  wait seconds: 1
68
67
  end
69
68
 
70
69
  def debug_file_mtime
71
- debug "stat #{@filename}: #{Filewatcher.system_stat(@filename)}"
70
+ debug "stat #{@filename}: #{system_stat(@filename)}"
72
71
  debug "File.mtime = #{File.mtime(@filename).strftime('%F %T.%9N')}"
73
72
  end
74
73
  end
@@ -9,20 +9,23 @@ rescue LoadError
9
9
  end
10
10
 
11
11
  require_relative 'spec_helper/watch_run'
12
+ require_relative 'spec_helper/ruby_watch_run'
12
13
 
13
14
  class Filewatcher
14
15
  ## Helper for common spec features between plugins
15
16
  module SpecHelper
17
+ ENVIRONMENT_SPECS_COEFFICIENTS = {
18
+ -> { ENV.fetch('CI', false) } => 1,
19
+ -> { RUBY_PLATFORM == 'java' } => 1,
20
+ -> { Gem::Platform.local.os == 'darwin' } => 1
21
+ }.freeze
22
+
16
23
  def logger
17
24
  @logger ||= Logger.new($stdout, level: :debug)
18
25
  end
19
26
 
20
27
  def environment_specs_coefficients
21
- @environment_specs_coefficients ||= {
22
- -> { ENV['CI'] } => 1,
23
- -> { RUBY_PLATFORM == 'java' } => 3,
24
- -> { Gem::Platform.local.os == 'darwin' } => 1
25
- }
28
+ ENVIRONMENT_SPECS_COEFFICIENTS
26
29
  end
27
30
 
28
31
  def wait(seconds: 1, interval: 1, &block)
@@ -58,7 +61,28 @@ class Filewatcher
58
61
  logger.debug "Thread ##{Thread.current.object_id} #{string}"
59
62
  end
60
63
 
61
- ## https://github.com/rubocop-hq/ruby-style-guide/issues/556#issuecomment-691274359
64
+ def system_stat(filename)
65
+ case (host_os = RbConfig::CONFIG['host_os'])
66
+ when /linux(-gnu)?/
67
+ `stat --printf 'Modification: %y, Change: %z\n' #{filename}`
68
+ when /darwin\d*/
69
+ `stat #{filename}`
70
+ when *Gem::WIN_PATTERNS
71
+ system_stat_windows filename
72
+ else
73
+ "Unknown OS `#{host_os}` for system's `stat` command"
74
+ end
75
+ end
76
+
77
+ def system_stat_windows(filename)
78
+ filename = filename.gsub('/', '\\\\\\')
79
+ properties = 'CreationDate,InstallDate,LastModified,LastAccessed'
80
+ command = "wmic datafile where Name=\"#{filename}\" get #{properties}"
81
+ # debug command
82
+ `#{command}`
83
+ end
84
+
85
+ ## https://github.com/rubocop/ruby-style-guide/issues/556#issuecomment-828672008
62
86
  # rubocop:disable Style/ModuleFunction
63
87
  extend self
64
88
  # rubocop:enable Style/ModuleFunction
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class Filewatcher
4
- VERSION = '2.0.0.beta3'
4
+ VERSION = '2.0.0.beta6'
5
5
  end
@@ -49,7 +49,8 @@ describe Filewatcher::Snapshot do
49
49
  before do
50
50
  first_snapshot
51
51
 
52
- sleep 0.1
52
+ ## 1 second or more: https://github.com/oracle/truffleruby/issues/2337
53
+ sleep 1
53
54
 
54
55
  File.write tmp_files[1], 'new content'
55
56
  File.delete tmp_files[2]
@@ -28,7 +28,6 @@ describe Filewatcher do
28
28
 
29
29
  let(:filename) { 'tmp_file.txt' }
30
30
  let(:action) { :update }
31
- let(:directory) { false }
32
31
  ## TODO: Check its needless
33
32
  let(:every) { false }
34
33
  let(:immediate) { false }
@@ -41,8 +40,7 @@ describe Filewatcher do
41
40
 
42
41
  let(:watch_run) do
43
42
  Filewatcher::SpecHelper::RubyWatchRun.new(
44
- filename: filename, filewatcher: filewatcher, action: action,
45
- directory: directory
43
+ filename: filename, filewatcher: filewatcher, action: action
46
44
  )
47
45
  end
48
46
 
@@ -51,7 +49,7 @@ describe Filewatcher do
51
49
  describe '.print_version' do
52
50
  subject(:method_call) { described_class.print_version }
53
51
 
54
- let(:ruby_version_regexp) { 'j?ruby \d+\.\d+\.\d+.*' }
52
+ let(:ruby_version_regexp) { '(j|truffle)?ruby \d+\.\d+\.\d+.*' }
55
53
  let(:filewatcher_version_regexp) { "Filewatcher #{Filewatcher::VERSION}" }
56
54
 
57
55
  it do
@@ -146,52 +144,59 @@ describe Filewatcher do
146
144
  end
147
145
 
148
146
  describe '#watch' do
149
- before do
150
- FileUtils.mkdir_p subdirectory if defined? subdirectory
147
+ context 'when action is known' do
148
+ before do
149
+ FileUtils.mkdir_p subdirectory if defined? subdirectory
151
150
 
152
- watch_run.run
153
- end
151
+ watch_run.run
152
+ end
154
153
 
155
- describe 'detecting file deletions' do
156
- let(:action) { :delete }
154
+ context 'when there are file deletions' do
155
+ let(:action) { :delete }
157
156
 
158
- it { is_expected.to eq [{ watch_run.filename => :deleted }] }
159
- end
157
+ it { is_expected.to eq [{ watch_run.filename => :deleted }] }
158
+ end
160
159
 
161
- context 'when there are file additions' do
162
- let(:action) { :create }
160
+ context 'when there are file additions' do
161
+ let(:action) { :create }
163
162
 
164
- it { is_expected.to eq [{ watch_run.filename => :created }] }
165
- end
163
+ it { is_expected.to eq [{ watch_run.filename => :created }] }
164
+ end
166
165
 
167
- context 'when there are file updates' do
168
- let(:action) { :update }
166
+ context 'when there are file updates' do
167
+ let(:action) { :update }
169
168
 
170
- it { is_expected.to eq [{ watch_run.filename => :updated }] }
171
- end
169
+ it { is_expected.to eq [{ watch_run.filename => :updated }] }
170
+ end
171
+
172
+ context 'when there are new files in subdirectories' do
173
+ let(:subdirectory) { File.expand_path('spec/tmp/new_sub_directory') }
172
174
 
173
- context 'when there are new files in subdirectories' do
174
- let(:subdirectory) { File.expand_path('spec/tmp/new_sub_directory') }
175
+ let(:filename) { File.join(subdirectory, 'file.txt') }
176
+ let(:action) { :create }
177
+ let(:every) { true }
178
+ ## https://github.com/filewatcher/filewatcher/pull/115#issuecomment-674581595
179
+ let(:interval) { 0.4 }
180
+
181
+ it do
182
+ expect(processed).to eq [
183
+ { subdirectory => :updated, watch_run.filename => :created }
184
+ ]
185
+ end
186
+ end
175
187
 
176
- let(:filename) { File.join(subdirectory, 'file.txt') }
177
- let(:action) { :create }
178
- let(:every) { true }
179
- ## https://github.com/filewatcher/filewatcher/pull/115#issuecomment-674581595
180
- let(:interval) { 0.4 }
188
+ context 'when there are new subdirectories' do
189
+ let(:filename) { 'new_sub_directory' }
190
+ let(:action) { :create_dir }
181
191
 
182
- it do
183
- expect(processed).to eq [
184
- { subdirectory => :updated, watch_run.filename => :created }
185
- ]
192
+ it { is_expected.to eq [{ watch_run.filename => :created }] }
186
193
  end
187
194
  end
188
195
 
189
- context 'when there are new subdirectories' do
190
- let(:filename) { 'new_sub_directory' }
191
- let(:directory) { true }
192
- let(:action) { :create }
196
+ context 'when action is unknown' do
197
+ let(:action) { :foo }
193
198
 
194
- it { is_expected.to eq [{ watch_run.filename => :created }] }
199
+ specify { expect { watch_run.run }.to raise_error(RuntimeError, 'Unknown action `foo`') }
195
200
  end
196
201
  end
197
202
 
data/spec/spec_helper.rb CHANGED
@@ -10,8 +10,6 @@ end
10
10
 
11
11
  require_relative '../lib/filewatcher/spec_helper'
12
12
 
13
- require_relative 'spec_helper/ruby_watch_run'
14
-
15
13
  ## For case when required from dumpers
16
14
  if Object.const_defined?(:RSpec)
17
15
  RSpec::Matchers.define :include_all_files do |expected|
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: filewatcher
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0.beta3
4
+ version: 2.0.0.beta6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thomas Flemming
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2021-02-10 00:00:00.000000000 Z
12
+ date: 2022-07-26 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -25,48 +25,62 @@ dependencies:
25
25
  - - "~>"
26
26
  - !ruby/object:Gem::Version
27
27
  version: '2.0'
28
+ - !ruby/object:Gem::Dependency
29
+ name: bundler-audit
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: 0.9.0
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: 0.9.0
28
42
  - !ruby/object:Gem::Dependency
29
43
  name: gem_toys
30
44
  requirement: !ruby/object:Gem::Requirement
31
45
  requirements:
32
46
  - - "~>"
33
47
  - !ruby/object:Gem::Version
34
- version: 0.6.1
48
+ version: 0.12.1
35
49
  type: :development
36
50
  prerelease: false
37
51
  version_requirements: !ruby/object:Gem::Requirement
38
52
  requirements:
39
53
  - - "~>"
40
54
  - !ruby/object:Gem::Version
41
- version: 0.6.1
55
+ version: 0.12.1
42
56
  - !ruby/object:Gem::Dependency
43
57
  name: toys
44
58
  requirement: !ruby/object:Gem::Requirement
45
59
  requirements:
46
60
  - - "~>"
47
61
  - !ruby/object:Gem::Version
48
- version: 0.11.4
62
+ version: 0.13.0
49
63
  type: :development
50
64
  prerelease: false
51
65
  version_requirements: !ruby/object:Gem::Requirement
52
66
  requirements:
53
67
  - - "~>"
54
68
  - !ruby/object:Gem::Version
55
- version: 0.11.4
69
+ version: 0.13.0
56
70
  - !ruby/object:Gem::Dependency
57
71
  name: codecov
58
72
  requirement: !ruby/object:Gem::Requirement
59
73
  requirements:
60
74
  - - "~>"
61
75
  - !ruby/object:Gem::Version
62
- version: 0.4.3
76
+ version: 0.6.0
63
77
  type: :development
64
78
  prerelease: false
65
79
  version_requirements: !ruby/object:Gem::Requirement
66
80
  requirements:
67
81
  - - "~>"
68
82
  - !ruby/object:Gem::Version
69
- version: 0.4.3
83
+ version: 0.6.0
70
84
  - !ruby/object:Gem::Dependency
71
85
  name: rspec
72
86
  requirement: !ruby/object:Gem::Requirement
@@ -87,14 +101,14 @@ dependencies:
87
101
  requirements:
88
102
  - - "~>"
89
103
  - !ruby/object:Gem::Version
90
- version: '1.3'
104
+ version: 1.32.0
91
105
  type: :development
92
106
  prerelease: false
93
107
  version_requirements: !ruby/object:Gem::Requirement
94
108
  requirements:
95
109
  - - "~>"
96
110
  - !ruby/object:Gem::Version
97
- version: '1.3'
111
+ version: 1.32.0
98
112
  - !ruby/object:Gem::Dependency
99
113
  name: rubocop-performance
100
114
  requirement: !ruby/object:Gem::Requirement
@@ -136,17 +150,18 @@ files:
136
150
  - lib/filewatcher/snapshot.rb
137
151
  - lib/filewatcher/snapshots.rb
138
152
  - lib/filewatcher/spec_helper.rb
153
+ - lib/filewatcher/spec_helper/ruby_watch_run.rb
139
154
  - lib/filewatcher/spec_helper/watch_run.rb
140
155
  - lib/filewatcher/version.rb
141
156
  - spec/filewatcher/snapshot_spec.rb
142
157
  - spec/filewatcher/version_spec.rb
143
158
  - spec/filewatcher_spec.rb
144
159
  - spec/spec_helper.rb
145
- - spec/spec_helper/ruby_watch_run.rb
146
160
  homepage: http://github.com/filewatcher/filewatcher
147
161
  licenses:
148
162
  - MIT
149
- metadata: {}
163
+ metadata:
164
+ rubygems_mfa_required: 'true'
150
165
  post_install_message:
151
166
  rdoc_options: []
152
167
  require_paths:
@@ -155,7 +170,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
155
170
  requirements:
156
171
  - - ">="
157
172
  - !ruby/object:Gem::Version
158
- version: '2.4'
173
+ version: '2.6'
159
174
  - - "<"
160
175
  - !ruby/object:Gem::Version
161
176
  version: '4'
@@ -165,7 +180,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
165
180
  - !ruby/object:Gem::Version
166
181
  version: 1.3.1
167
182
  requirements: []
168
- rubygems_version: 3.2.3
183
+ rubygems_version: 3.3.7
169
184
  signing_key:
170
185
  specification_version: 4
171
186
  summary: Lightweight filewatcher.