Watchcat
Simple filesystem notification library for Ruby.
How
This gem uses Notify to get notifications.
Platforms
- Linux: inotify
- macOS: FSEvents
- Windows: ReadDirectoryChangesW
- All platforms: polling (via
force_pollingoption)
Installation
Install the gem and add to the application's Gemfile by executing:
$ bundle add watchcat
If bundler is not being used to manage dependencies, install the gem by executing:
$ gem install watchcat
Usage
Please specify a filename or directory and callback block to Watchcat.watch. The callback will call when the specified file or directory is changed.
require "watchcat"
Watchcat.watch("/tmp/test") do |e|
pp e.paths, e.kind
end
sleepThe value that is passed to the callback holds the paths that changed and the file change event. For example, if a file is created under the /tmp/test, you will get the following output.
["/tmp/test/a.txt"]
#<Watchcat::EventKind:0x00007f84be7161d8 @access=nil, @create=#<Watchcat::CreateKind:0x00007f84b99eaa08 @kind="file">, @modify=nil, @remove=nil>
["/tmp/test/a.txt"]
#<Watchcat::EventKind:0x00007f84be7159b8
@access=nil,
@create=nil,
@modify=#<Watchcat::ModifyKind:0x00007f84be715968 @data_change=nil, @kind="metadata", @metadata=#<Watchcat::MetadataKind:0x00007f84b99e7a60 @kind=nil>, @rename=nil>,
@remove=nil>
["/tmp/test/a.txt"]
#<Watchcat::EventKind:0x00007f84be714dd8
@access=#<Watchcat::AccessKind:0x00007f84b99e3708 @access_mode=#<Watchcat::AccessMode:0x00007f84b99e3640 @mode="write">, @kind="close">,
@create=nil,
@modify=nil,
@remove=nil>
You can know what event is happened with Watchcat::EventKind. For example, what a file is changed or not, you can check with Watchcat::EventKind#modify?. Seed the following example for details.
require "watchcat"
Watchcat.watch("/tmp/target") do |e|
if e.kind.create?
if e.kind.create.file?
puts "'#{e.paths[0]}'(File) is added."
elsif e.kind.create.folder?
puts "'#{e.paths[0]}'(Folder) is added."
end
elsif e.kind.modify?
if e.kind.modify.data_change?
puts "'#{e.paths[0]}' is updated."
end
elsif e.kind.remove?
if e.kind.remove.file?
puts "'#{e.paths[0]}'(File) is removed."
elsif e.kind.remove.folder?
puts "'#{e.paths[0]}'(Folder) is removed."
end
end
end
sleepCAUTION The watchcat doesn't normalize the events. So the result might change per the platform.
Options
| Name | Description | Default |
|---|---|---|
| recursive | Watch a directory recursively or not. | true |
| force_polling | Force to use a polling to watch. | false |
| debounce | Debounce events for the same file. | -1 |
Filters Option
You can use the filters option to ignore specific event types:
| Key | Description |
|---|---|
| ignore_remove | Ignore remove (delete) events |
| ignore_access | Ignore access events |
| ignore_create | Ignore create events |
| ignore_modify | Ignore modify events |
Example usage:
Watchcat.watch("/tmp/test", filters: { ignore_remove: true, ignore_access: true }) do |e|
pp e.paths, e.kind
endCLI
watchcat comes with a command-line interface that allows you to watch files and execute commands when changes occur.
Usage
# Run watchcat with a config file
$ watchcat -C config.yml
# Generate a template config file
$ watchcat --init config.yml
Configuration File
The configuration file should be in YAML format. Here's an example:
watches:
- path: "./lib"
recursive: true
debounce: 300
filters:
ignore_access: true
patterns:
- "*.rb"
- "*.yml"
actions:
- command: "echo 'Ruby/YAML file changed: {{file_name}}'"
- command: "rubocop {{file_path}}"Configuration Options
Each watch entry supports the following options:
| Option | Description | Default |
|---|---|---|
| path | Directory or file path to watch (required) | - |
| recursive | Watch a directory recursively or not | true |
| debounce | Debounce events for the same file (in milliseconds) | -1 |
| filters | Event filters (same as library filters option) | {} |
| patterns | File patterns to match (using File.fnmatch) | [] |
| actions | Commands to execute when files change | [] |
Available Variables for Commands
When specifying commands, you can use the following variables:
| Variable | Description | Example |
|---|---|---|
| {{file_path}} | Full path of the changed file | /home/user/app/file.rb |
| {{file_dir}} | Directory containing the file | /home/user/app |
| {{file_name}} | File name with extension | file.rb |
| {{file_base}} | File name without extension | file |
| {{file_ext}} | File extension | .rb |
| {{event_type}} | Type of event | create |
Contributing
Bug reports and pull requests are welcome on GitHub at https://github.com/y-yagi/watchcat.
License
The gem is available as open source under the terms of the MIT License.