watchcat 0.2.1-x86_64-linux → 0.4.0-x86_64-linux

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b1a3d40bdf9a9bc7f37f4d09c48696ae7d284826c245838c4c265a4f58915d51
4
- data.tar.gz: edbb2fea91f315f7248a86f29f751d7f35c0664a75fb57e783a060cadd723e3c
3
+ metadata.gz: 39e18906d85d9534153d3cdb2c417635eae3a631c4b8992a9d663f524230ea8c
4
+ data.tar.gz: daba78690d4d037271282828df66c81303dd82810b2e2fa64a6c3f99a0969619
5
5
  SHA512:
6
- metadata.gz: 7bb34a1bc339c9e865b8d5ae8eff2742c7d52c87860c0030595a2d7784d4783cf6c93b0ba0a779abd94d9f0fa14a8f1e21b92c84b1b3bdb888ee2fe8f03cd737
7
- data.tar.gz: 894556bfa2fbb66362f167906639936cc7242f62212e25416c38612c09b187fa8aa899f0f44a91fa655daf6287e52fdbabfc96e07abf3b2cb4ee877970ce897b
6
+ metadata.gz: e2ff13c8c9fcf11a83a69a91b28a1b0420537cefe4302f2268a0d0d7beb8a1327749329aa831e0a776b60eb8ee8b1fc5290bced2f1b3c349be5f1a112a04fe71
7
+ data.tar.gz: ab4dcdead0a8acba220c2dbd3a2394fa67124414131375368a520b15aa4fd4a953493ecb9fdc419ccc20be072f1596ec9c91da314c6aa858f9d5064411396d9d
data/CHANGELOG.md ADDED
@@ -0,0 +1,8 @@
1
+ ## 0.4.0
2
+
3
+ * Add CLI
4
+ * Add filters option
5
+
6
+ ## 0.3.0
7
+
8
+ * Support Windows
data/Gemfile.lock CHANGED
@@ -1,57 +1,72 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- watchcat (0.2.1)
5
- drb
4
+ watchcat (0.4.0)
5
+ psych
6
6
  rb_sys
7
7
 
8
8
  GEM
9
9
  remote: https://rubygems.org/
10
10
  specs:
11
- debug (1.9.2)
11
+ cgi (0.5.0)
12
+ date (3.4.1)
13
+ debug (1.11.0)
12
14
  irb (~> 1.10)
13
15
  reline (>= 0.3.8)
14
- drb (2.2.1)
15
- ffi (1.17.0-arm64-darwin)
16
- ffi (1.17.0-x86_64-darwin)
17
- ffi (1.17.0-x86_64-linux-gnu)
18
- io-console (0.7.2)
19
- irb (1.14.0)
16
+ erb (4.0.4)
17
+ cgi (>= 0.3.3)
18
+ ffi (1.17.1-arm64-darwin)
19
+ ffi (1.17.1-x64-mingw-ucrt)
20
+ ffi (1.17.1-x86_64-darwin)
21
+ ffi (1.17.1-x86_64-linux-gnu)
22
+ io-console (0.8.0)
23
+ irb (1.15.2)
24
+ pp (>= 0.6.0)
20
25
  rdoc (>= 4.0.0)
21
26
  reline (>= 0.4.2)
22
27
  listen (3.9.0)
23
28
  rb-fsevent (~> 0.10, >= 0.10.3)
24
29
  rb-inotify (~> 0.9, >= 0.9.10)
25
- minitest (5.25.2)
26
- minitest-retry (0.2.3)
30
+ minitest (5.25.5)
31
+ minitest-retry (0.2.5)
27
32
  minitest (>= 5.0)
28
- nokogiri (1.16.7-arm64-darwin)
33
+ nokogiri (1.18.1-arm64-darwin)
29
34
  racc (~> 1.4)
30
- nokogiri (1.16.7-x86_64-darwin)
35
+ nokogiri (1.18.1-x64-mingw-ucrt)
31
36
  racc (~> 1.4)
32
- nokogiri (1.16.7-x86_64-linux)
37
+ nokogiri (1.18.1-x86_64-darwin)
33
38
  racc (~> 1.4)
34
- psych (5.1.2)
39
+ nokogiri (1.18.1-x86_64-linux-gnu)
40
+ racc (~> 1.4)
41
+ pp (0.6.2)
42
+ prettyprint
43
+ prettyprint (0.2.0)
44
+ psych (5.2.6)
45
+ date
35
46
  stringio
36
47
  racc (1.8.1)
37
- rake (13.2.1)
38
- rake-compiler (1.2.8)
48
+ rake (13.3.0)
49
+ rake-compiler (1.3.0)
39
50
  rake
51
+ rake-compiler-dock (1.9.1)
40
52
  rb-fsevent (0.11.2)
41
53
  rb-inotify (0.11.1)
42
54
  ffi (~> 1.0)
43
- rb_sys (0.9.103)
44
- rdoc (6.7.0)
55
+ rb_sys (0.9.117)
56
+ rake-compiler-dock (= 1.9.1)
57
+ rdoc (6.14.1)
58
+ erb
45
59
  psych (>= 4.0.0)
46
- reline (0.5.10)
60
+ reline (0.6.1)
47
61
  io-console (~> 0.5)
48
- ruby_memcheck (3.0.0)
62
+ ruby_memcheck (3.0.1)
49
63
  nokogiri
50
- stringio (3.1.1)
64
+ stringio (3.1.7)
51
65
 
52
66
  PLATFORMS
53
67
  arm64-darwin-22
54
68
  arm64-darwin-23
69
+ x64-mingw-ucrt
55
70
  x86_64-darwin-19
56
71
  x86_64-darwin-20
57
72
  x86_64-linux
@@ -67,4 +82,4 @@ DEPENDENCIES
67
82
  watchcat!
68
83
 
69
84
  BUNDLED WITH
70
- 2.5.4
85
+ 2.6.2
data/README.md CHANGED
@@ -8,7 +8,7 @@ This gem uses [Notify](https://github.com/notify-rs/notify) to get notifications
8
8
 
9
9
  ## Platforms
10
10
 
11
- This gem supports Linux and macOS. Due to the using `fork`, this doesn't support Windows now.
11
+ This gem supports Linux, macOS and Windows.
12
12
 
13
13
  ## Installation
14
14
 
@@ -27,7 +27,7 @@ Please specify a filename or directory and callback block to `Watchcat.watch`. T
27
27
  ```ruby
28
28
  require "watchcat"
29
29
 
30
- w = Watchcat.watch("/tmp/test") do |e|
30
+ Watchcat.watch("/tmp/test") do |e|
31
31
  pp e.paths, e.kind
32
32
  end
33
33
 
@@ -58,7 +58,7 @@ You can know what event is happened with `Watchcat::EventKind`. For example, wha
58
58
  ```ruby
59
59
  require "watchcat"
60
60
 
61
- w = Watchcat.watch("/tmp/target") do |e|
61
+ Watchcat.watch("/tmp/target") do |e|
62
62
  if e.kind.create?
63
63
  if e.kind.create.file?
64
64
  puts "'#{e.paths[0]}'(File) is added."
@@ -84,7 +84,6 @@ sleep
84
84
 
85
85
  **CAUTION** The `watchcat` doesn't normalize the events. So the result might change per the platform.
86
86
 
87
-
88
87
  ### Options
89
88
 
90
89
  | Name | Description | Default |
@@ -94,6 +93,82 @@ sleep
94
93
  | **debounce** | Debounce events for the same file. | `-1` |
95
94
 
96
95
 
96
+ ### Filters Option
97
+
98
+ You can use the `filters` option to ignore specific event types:
99
+
100
+ | Key | Description |
101
+ |-----------------|-----------------------------------|
102
+ | ignore_remove | Ignore remove (delete) events |
103
+ | ignore_access | Ignore access events |
104
+ | ignore_create | Ignore create events |
105
+ | ignore_modify | Ignore modify events |
106
+
107
+ Example usage:
108
+
109
+ ```ruby
110
+ Watchcat.watch("/tmp/test", filters: { ignore_remove: true, ignore_access: true }) do |e|
111
+ pp e.paths, e.kind
112
+ end
113
+ ```
114
+
115
+
116
+ ## CLI
117
+
118
+ `watchcat` comes with a command-line interface that allows you to watch files and execute commands when changes occur.
119
+
120
+ ### Usage
121
+
122
+ ```
123
+ $ watchcat -C config.yml
124
+ ```
125
+
126
+ ### Configuration File
127
+
128
+ The configuration file should be in YAML format. Here's an example:
129
+
130
+ ```yaml
131
+ watches:
132
+ - path: "./lib"
133
+ recursive: true
134
+ debounce: 300
135
+ filters:
136
+ ignore_access: true
137
+ patterns:
138
+ - "*.rb"
139
+ - "*.yml"
140
+ actions:
141
+ - command: "echo 'Ruby/YAML file changed: {{file_name}}'"
142
+ - command: "rubocop {{file_path}}"
143
+ ```
144
+
145
+ ### Configuration Options
146
+
147
+ Each watch entry supports the following options:
148
+
149
+ | Option | Description | Default |
150
+ |-------------|--------------------------------------------------------|---------|
151
+ | path | Directory or file path to watch (required) | - |
152
+ | recursive | Watch a directory recursively or not | `true` |
153
+ | debounce | Debounce events for the same file (in milliseconds) | `500` |
154
+ | filters | Event filters (same as library filters option) | `{}` |
155
+ | patterns | File patterns to match (using File.fnmatch) | `[]` |
156
+ | actions | Commands to execute when files change | `[]` |
157
+
158
+ ### Available Variables for Commands
159
+
160
+ When specifying commands, you can use the following variables:
161
+
162
+ | Variable | Description | Example |
163
+ |---------------|------------------------------------------|------------------------|
164
+ | {{file_path}} | Full path of the changed file | `/home/user/app/file.rb` |
165
+ | {{file_dir}} | Directory containing the file | `/home/user/app` |
166
+ | {{file_name}} | File name with extension | `file.rb` |
167
+ | {{file_base}} | File name without extension | `file` |
168
+ | {{file_ext}} | File extension | `.rb` |
169
+
170
+
171
+
97
172
  ## Contributing
98
173
 
99
174
  Bug reports and pull requests are welcome on GitHub at https://github.com/y-yagi/watchcat.
data/cli_example.yml ADDED
@@ -0,0 +1,14 @@
1
+ # Watchcat Configuration File
2
+
3
+ watches:
4
+ - path: "./lib"
5
+ recursive: true
6
+ debounce: 300
7
+ filters:
8
+ ignore_access: true
9
+ patterns:
10
+ - "*.rb"
11
+ - "*.yml"
12
+ actions:
13
+ - command: "echo 'Ruby/YAML file changed: {{file_name}}'"
14
+ - command: "rubocop {{file_path}}"
data/exe/watchcat ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "watchcat"
4
+ require "watchcat/cli"
5
+
6
+ begin
7
+ Watchcat::CLI.start(ARGV)
8
+ rescue Watchcat::CLI::Error => e
9
+ puts "Error: #{e.message}"
10
+ exit 1
11
+ rescue Interrupt
12
+ puts "\nGoodbye!"
13
+ exit 0
14
+ end
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,43 @@
1
+ module Watchcat
2
+ module CLI
3
+ class ActionExecutor
4
+ def initialize(file_path, event)
5
+ @file_path = file_path
6
+ @event = event
7
+ @file_dir = File.dirname(file_path)
8
+ @file_name = File.basename(file_path)
9
+ @file_ext = File.extname(file_path)
10
+ @file_base = File.basename(file_path, @file_ext)
11
+ end
12
+
13
+ def execute(action)
14
+ execute_command(action)
15
+ rescue => e
16
+ puts "Error executing action #{action}: #{e.message}"
17
+ end
18
+
19
+ private
20
+
21
+ def execute_command(action)
22
+ command = substitute_variables(action["command"])
23
+ puts "Executing: #{command}"
24
+
25
+ success = system(command)
26
+ unless success
27
+ puts "Command failed with exit code: #{$?.exitstatus}"
28
+ end
29
+ end
30
+
31
+ def substitute_variables(template)
32
+ return template unless template.is_a?(String)
33
+
34
+ template
35
+ .gsub("{{file_path}}", @file_path)
36
+ .gsub("{{file_dir}}", @file_dir)
37
+ .gsub("{{file_name}}", @file_name)
38
+ .gsub("{{file_base}}", @file_base)
39
+ .gsub("{{file_ext}}", @file_ext)
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,41 @@
1
+ require "psych"
2
+
3
+ module Watchcat
4
+ module CLI
5
+ class Config
6
+ attr_reader :watches
7
+
8
+ def initialize(data)
9
+ @watches = parse_watches(data["watches"] || [])
10
+ end
11
+
12
+ def self.load(file_path)
13
+ unless File.exist?(file_path)
14
+ raise Error, "Configuration file not found: #{file_path}"
15
+ end
16
+
17
+ begin
18
+ data = Psych.load_file(file_path)
19
+ new(data)
20
+ rescue Psych::SyntaxError => e
21
+ raise Error, "Invalid YAML syntax in #{file_path}: #{e.message}"
22
+ end
23
+ end
24
+
25
+ private
26
+
27
+ def parse_watches(watches_data)
28
+ watches_data.map do |watch_config|
29
+ {
30
+ path: watch_config["path"],
31
+ recursive: watch_config.fetch("recursive", true),
32
+ patterns: watch_config["patterns"] || [],
33
+ actions: watch_config["actions"] || [],
34
+ debounce: watch_config.fetch("debounce", 500),
35
+ filters: watch_config["filters"]&.transform_keys(&:to_sym) || {},
36
+ }
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,84 @@
1
+ module Watchcat
2
+ module CLI
3
+ class Watcher
4
+ def initialize(config)
5
+ @config = config
6
+ @watchers = []
7
+ end
8
+
9
+ def start
10
+ puts "Starting Watchcat file watcher..."
11
+
12
+ @config.watches.each do |watch_config|
13
+ start_watching_path(watch_config)
14
+ end
15
+
16
+ puts "Watchcat is now watching for file changes. Press Ctrl+C to stop."
17
+
18
+ # Keep the main thread alive
19
+ begin
20
+ sleep
21
+ rescue Interrupt
22
+ puts "\nStopping Watchcat..."
23
+ stop
24
+ end
25
+ end
26
+
27
+ def stop
28
+ @watchers.each(&:stop)
29
+ @watchers.clear
30
+ end
31
+
32
+ private
33
+
34
+ def start_watching_path(watch_config)
35
+ path = watch_config[:path]
36
+
37
+ unless File.exist?(path)
38
+ puts "Warning: Path does not exist: #{path}"
39
+ return
40
+ end
41
+
42
+ puts "Watching: #{path} (recursive: #{watch_config[:recursive]}, debounce: #{watch_config[:debounce]}ms)"
43
+
44
+ watcher = Watchcat.watch(
45
+ path,
46
+ recursive: watch_config[:recursive],
47
+ filters: watch_config[:filters],
48
+ ) do |event|
49
+ handle_file_event(event, watch_config)
50
+ end
51
+
52
+ @watchers << watcher
53
+ end
54
+
55
+ def handle_file_event(event, watch_config)
56
+ return if event.kind.access?
57
+
58
+ event.paths.each do |file_path|
59
+ next unless should_process_file?(file_path, watch_config[:patterns])
60
+
61
+ puts "File changed: #{file_path} #{event.kind}"
62
+ execute_actions(file_path, event, watch_config[:actions])
63
+ end
64
+ end
65
+
66
+ def should_process_file?(file_path, patterns)
67
+ return true if patterns.empty?
68
+
69
+ patterns.any? do |pattern|
70
+ File.fnmatch?(pattern, File.basename(file_path)) ||
71
+ File.fnmatch?(pattern, file_path)
72
+ end
73
+ end
74
+
75
+ def execute_actions(file_path, event, actions)
76
+ executor = ActionExecutor.new(file_path, event)
77
+
78
+ actions.each do |action|
79
+ executor.execute(action)
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,39 @@
1
+ require "optparse"
2
+ require_relative "cli/watcher"
3
+ require_relative "cli/config"
4
+ require_relative "cli/action_executor"
5
+
6
+ module Watchcat
7
+ module CLI
8
+ class Error < StandardError; end
9
+ class << self
10
+ def start(argv)
11
+ options = parse(argv)
12
+ config = Config.load(options[:config])
13
+ watcher = Watcher.new(config)
14
+ watcher.start
15
+ rescue => e
16
+ raise Error, "Failed to start Watchcat: #{e.message}"
17
+ end
18
+
19
+ def parse(argv)
20
+ options = {}
21
+ OptionParser.new do |opts|
22
+ opts.banner = "Usage: watchcat [options]"
23
+
24
+ opts.on("-C", "--config PATH", "Path to the config file") do |v|
25
+ options[:config] = v
26
+ end
27
+
28
+ opts.on("-h", "--help", "Show this help message") do
29
+ puts opts
30
+ exit
31
+ end
32
+ end.parse!(argv)
33
+
34
+ raise OptionParser::MissingArgument.new("-C") if options[:config].nil?
35
+ options
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,41 @@
1
+ module Watchcat
2
+ class Debouncer
3
+ def initialize
4
+ @timers = {}
5
+ @mutex = Mutex.new
6
+ end
7
+
8
+ def debounce(key, delay_ms, &block)
9
+ @mutex.synchronize do
10
+ # Cancel existing timer for this key
11
+ if @timers[key]
12
+ @timers[key].kill
13
+ end
14
+
15
+ # Create new timer
16
+ @timers[key] = Thread.new do
17
+ sleep(delay_ms / 1000.0) # Convert ms to seconds
18
+
19
+ @mutex.synchronize do
20
+ @timers.delete(key)
21
+ end
22
+
23
+ block.call
24
+ end
25
+ end
26
+ end
27
+
28
+ def clear
29
+ @mutex.synchronize do
30
+ @timers.each_value(&:kill)
31
+ @timers.clear
32
+ end
33
+ end
34
+
35
+ def pending_count
36
+ @mutex.synchronize do
37
+ @timers.size
38
+ end
39
+ end
40
+ end
41
+ end
@@ -1,67 +1,59 @@
1
- require "drb"
2
- require "drb/unix"
3
- require_relative "server"
4
- require_relative "client"
1
+ require_relative "event"
5
2
 
6
3
  module Watchcat
7
4
  class Executor
8
- def initialize(paths, recursive:, force_polling:, poll_interval:, wait_until_startup:, ignore_remove:, debounce:, block:)
9
- @service = nil
10
- @child_pid = nil
5
+ def initialize(paths, recursive:, force_polling:, poll_interval:, filters:, debounce:, block:)
11
6
  @paths = paths
12
7
  @recursive = recursive
13
8
  @force_polling = force_polling
14
9
  @poll_interval = poll_interval
15
- @wait_until_startup = wait_until_startup
16
- @ignore_remove = ignore_remove
10
+ @filters = filters || {}
17
11
  @debounce = debounce
18
12
  @block = block
19
13
  @watcher = Watchcat::Watcher.new
14
+ @watch_thread = nil
15
+ @stop_requested = false
20
16
  end
21
17
 
22
18
  def start
23
- server = Server.new(@block)
24
- @service = DRb.start_service("drbunix:", server)
25
- client = nil
26
- client = build_client if @wait_until_startup
27
-
28
- @child_pid = fork do
29
- client = build_client unless @wait_until_startup
30
- Process.setproctitle("watchcat: watcher")
31
- client.run
19
+ # Always start watching in a background thread to avoid blocking
20
+ @watch_thread = Thread.new do
21
+ Thread.current.name = "watchcat-watcher"
22
+ start_watching
32
23
  end
33
24
 
34
- main = Process.pid
35
25
  at_exit do
36
- @exit_status = $!.status if $!.is_a?(SystemExit)
37
- stop if Process.pid == main
38
- exit @exit_status if @exit_status
26
+ stop
39
27
  end
40
28
  end
41
29
 
42
30
  def stop
43
- begin
44
- @watcher.close
45
- Process.kill(:KILL, @child_pid)
46
- rescue Errno::ESRCH
47
- # NOTE: We can ignore this error because there process is already dead.
31
+ @stop_requested = true
32
+ @watcher.close
33
+ if @watch_thread && @watch_thread.alive?
34
+ @watch_thread.join(1) # Wait up to 1 second for thread to finish
48
35
  end
49
- @service.stop_service
50
36
  end
51
37
 
52
38
  private
53
39
 
54
- def build_client
55
- Client.new(
56
- @service.uri,
57
- watcher: @watcher,
58
- paths: @paths,
40
+ def start_watching
41
+ @watcher.watch(
42
+ @paths,
59
43
  recursive: @recursive,
60
44
  force_polling: @force_polling,
61
45
  poll_interval: @poll_interval,
62
- debounce: @debounce,
63
- ignore_remove: @ignore_remove
64
- )
46
+ ignore_remove: @filters[:ignore_remove],
47
+ ignore_access: @filters[:ignore_access],
48
+ ignore_create: @filters[:ignore_create],
49
+ ignore_modify: @filters[:ignore_modify],
50
+ debounce: @debounce
51
+ ) do |kind, paths, raw_kind|
52
+ break if @stop_requested
53
+
54
+ event = Watchcat::Event.new(kind, paths, raw_kind)
55
+ @block.call(event)
56
+ end
65
57
  end
66
58
  end
67
59
  end
@@ -1,3 +1,3 @@
1
1
  module Watchcat
2
- VERSION = "0.2.1"
2
+ VERSION = "0.4.0"
3
3
  end
data/lib/watchcat.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require_relative "watchcat/version"
2
2
  require_relative "watchcat/executor"
3
+ require_relative "watchcat/debouncer"
3
4
 
4
5
  begin
5
6
  require "watchcat/#{RUBY_VERSION.to_f}/watchcat"
@@ -14,8 +15,7 @@ module Watchcat
14
15
  recursive: true,
15
16
  force_polling: false,
16
17
  poll_interval: nil,
17
- wait_until_startup: false,
18
- ignore_remove: false,
18
+ filters: {},
19
19
  debounce: -1,
20
20
  &block
21
21
  )
@@ -25,8 +25,7 @@ module Watchcat
25
25
  recursive: recursive,
26
26
  force_polling: force_polling,
27
27
  poll_interval: poll_interval,
28
- wait_until_startup: wait_until_startup,
29
- ignore_remove: ignore_remove,
28
+ filters: filters,
30
29
  debounce: debounce,
31
30
  block: block
32
31
  )
metadata CHANGED
@@ -1,17 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: watchcat
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.4.0
5
5
  platform: x86_64-linux
6
6
  authors:
7
7
  - Yuji Yaginuma
8
8
  autorequire:
9
- bindir: bin
9
+ bindir: exe
10
10
  cert_chain: []
11
- date: 2024-12-08 00:00:00.000000000 Z
11
+ date: 2025-09-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: drb
14
+ name: psych
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ">="
@@ -129,22 +129,28 @@ executables: []
129
129
  extensions: []
130
130
  extra_rdoc_files: []
131
131
  files:
132
+ - CHANGELOG.md
132
133
  - Gemfile
133
134
  - Gemfile.lock
134
135
  - LICENSE.txt
135
136
  - README.md
136
137
  - Rakefile
138
+ - cli_example.yml
139
+ - exe/watchcat
137
140
  - ext/watchcat/.gitignore
138
141
  - lib/watchcat.rb
139
- - lib/watchcat/3.0/watchcat.so
140
142
  - lib/watchcat/3.1/watchcat.so
141
143
  - lib/watchcat/3.2/watchcat.so
142
144
  - lib/watchcat/3.3/watchcat.so
143
- - lib/watchcat/client.rb
145
+ - lib/watchcat/3.4/watchcat.so
146
+ - lib/watchcat/cli.rb
147
+ - lib/watchcat/cli/action_executor.rb
148
+ - lib/watchcat/cli/config.rb
149
+ - lib/watchcat/cli/watcher.rb
150
+ - lib/watchcat/debouncer.rb
144
151
  - lib/watchcat/event.rb
145
152
  - lib/watchcat/executor.rb
146
153
  - lib/watchcat/kind.rb
147
- - lib/watchcat/server.rb
148
154
  - lib/watchcat/version.rb
149
155
  homepage: https://github.com/y-yagi/watchcat
150
156
  licenses:
@@ -160,17 +166,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
160
166
  requirements:
161
167
  - - ">="
162
168
  - !ruby/object:Gem::Version
163
- version: '3.0'
169
+ version: '3.1'
164
170
  - - "<"
165
171
  - !ruby/object:Gem::Version
166
- version: 3.4.dev
172
+ version: 3.5.dev
167
173
  required_rubygems_version: !ruby/object:Gem::Requirement
168
174
  requirements:
169
175
  - - ">="
170
176
  - !ruby/object:Gem::Version
171
177
  version: '0'
172
178
  requirements: []
173
- rubygems_version: 3.4.4
179
+ rubygems_version: 3.5.23
174
180
  signing_key:
175
181
  specification_version: 4
176
182
  summary: Simple filesystem notification library for Ruby.
Binary file
@@ -1,26 +0,0 @@
1
- module Watchcat
2
- class Client
3
- def initialize(uri, watcher:, paths:, recursive:, force_polling:, poll_interval:, ignore_remove:, debounce:)
4
- DRb.start_service
5
- @watcher = watcher
6
- @server = DRbObject.new_with_uri(uri)
7
- @paths = paths
8
- @recursive = recursive
9
- @force_polling = force_polling
10
- @poll_interval = poll_interval
11
- @ignore_remove = ignore_remove
12
- @debounce = debounce
13
- end
14
-
15
- def run
16
- @watcher.watch(
17
- @paths,
18
- recursive: @recursive,
19
- force_polling: @force_polling,
20
- poll_interval: @poll_interval,
21
- ignore_remove: @ignore_remove,
22
- debounce: @debounce
23
- ) { |notification| @server.execute(notification) }
24
- end
25
- end
26
- end
@@ -1,14 +0,0 @@
1
- require "watchcat/event"
2
-
3
- module Watchcat
4
- class Server
5
- def initialize(block)
6
- @block = block
7
- end
8
-
9
- def execute(notification)
10
- event = Watchcat::Event.new(notification[0], notification[1], notification[2])
11
- @block.call(event)
12
- end
13
- end
14
- end