filewatcher 1.1.0 → 2.0.0.beta4

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.
metadata CHANGED
@@ -1,98 +1,167 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: filewatcher
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 2.0.0.beta4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thomas Flemming
8
- autorequire:
8
+ - Alexander Popov
9
+ autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2018-09-10 00:00:00.000000000 Z
12
+ date: 2021-04-28 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
- name: bacon
15
+ name: bundler
15
16
  requirement: !ruby/object:Gem::Requirement
16
17
  requirements:
17
18
  - - "~>"
18
19
  - !ruby/object:Gem::Version
19
- version: '1.2'
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: '1.2'
27
+ version: '2.0'
27
28
  - !ruby/object:Gem::Dependency
28
- name: optimist
29
+ name: bundler-audit
29
30
  requirement: !ruby/object:Gem::Requirement
30
31
  requirements:
31
32
  - - "~>"
32
33
  - !ruby/object:Gem::Version
33
- version: '3.0'
34
- type: :runtime
34
+ version: 0.8.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.8.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.8.0
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
55
+ version: 0.8.0
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.11.4
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: 0.11.4
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.5.1
77
+ type: :development
35
78
  prerelease: false
36
79
  version_requirements: !ruby/object:Gem::Requirement
37
80
  requirements:
38
81
  - - "~>"
39
82
  - !ruby/object:Gem::Version
40
- version: '3.0'
83
+ version: 0.5.1
41
84
  - !ruby/object:Gem::Dependency
42
- name: rake
85
+ name: rspec
43
86
  requirement: !ruby/object:Gem::Requirement
44
87
  requirements:
45
88
  - - "~>"
46
89
  - !ruby/object:Gem::Version
47
- version: '12.0'
90
+ version: '3.8'
48
91
  type: :development
49
92
  prerelease: false
50
93
  version_requirements: !ruby/object:Gem::Requirement
51
94
  requirements:
52
95
  - - "~>"
53
96
  - !ruby/object:Gem::Version
54
- version: '12.0'
97
+ version: '3.8'
55
98
  - !ruby/object:Gem::Dependency
56
99
  name: rubocop
57
100
  requirement: !ruby/object:Gem::Requirement
58
101
  requirements:
59
102
  - - "~>"
60
103
  - !ruby/object:Gem::Version
61
- version: '0.57'
104
+ version: '1.3'
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: '0.57'
69
- description: Detect changes in filesystem. Works anywhere.
111
+ version: '1.3'
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'
140
+ description: Detect changes in file system. Works anywhere.
70
141
  email:
71
142
  - thomas.flemming@gmail.com
72
- executables:
73
- - filewatcher
143
+ - alex.wayfer@gmail.com
144
+ executables: []
74
145
  extensions: []
75
146
  extra_rdoc_files: []
76
147
  files:
77
- - bin/banner.txt
78
- - bin/filewatcher
79
148
  - lib/filewatcher.rb
80
149
  - lib/filewatcher/cycles.rb
81
- - lib/filewatcher/env.rb
82
- - lib/filewatcher/runner.rb
150
+ - lib/filewatcher/snapshot.rb
151
+ - lib/filewatcher/snapshots.rb
152
+ - lib/filewatcher/spec_helper.rb
153
+ - lib/filewatcher/spec_helper/watch_run.rb
83
154
  - lib/filewatcher/version.rb
84
- - test/dumpers/env_dumper.rb
85
- - test/dumpers/watched_dumper.rb
86
- - test/filewatcher/test_env.rb
87
- - test/filewatcher/test_runner.rb
88
- - test/filewatcher/test_version.rb
89
- - test/helper.rb
90
- - test/test_filewatcher.rb
91
- homepage: http://github.com/thomasfl/filewatcher
155
+ - spec/filewatcher/snapshot_spec.rb
156
+ - spec/filewatcher/version_spec.rb
157
+ - spec/filewatcher_spec.rb
158
+ - spec/spec_helper.rb
159
+ - spec/spec_helper/ruby_watch_run.rb
160
+ homepage: http://github.com/filewatcher/filewatcher
92
161
  licenses:
93
162
  - MIT
94
163
  metadata: {}
95
- post_install_message:
164
+ post_install_message:
96
165
  rdoc_options: []
97
166
  require_paths:
98
167
  - lib
@@ -100,23 +169,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
100
169
  requirements:
101
170
  - - ">="
102
171
  - !ruby/object:Gem::Version
103
- version: '0'
172
+ version: '2.5'
173
+ - - "<"
174
+ - !ruby/object:Gem::Version
175
+ version: '4'
104
176
  required_rubygems_version: !ruby/object:Gem::Requirement
105
177
  requirements:
106
- - - ">="
178
+ - - ">"
107
179
  - !ruby/object:Gem::Version
108
- version: '0'
180
+ version: 1.3.1
109
181
  requirements: []
110
- rubyforge_project:
111
- rubygems_version: 2.6.14.1
112
- signing_key:
182
+ rubygems_version: 3.2.15
183
+ signing_key:
113
184
  specification_version: 4
114
- summary: Lighweight filewatcher.
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
185
+ summary: Lightweight filewatcher.
186
+ 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,105 +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
- Process.kill(9, pid)
56
- Process.wait(pid)
57
- rescue Errno::ESRCH
58
- nil # already killed
59
- end
60
- Process.spawn(env, cmd)
61
- end
62
-
63
- if options[:exclude].to_s != ''
64
- options[:exclude] = split_files_void_escaped_whitespace(
65
- options[:exclude].split(' ')
66
- )
67
- end
68
-
69
- begin
70
- fw = Filewatcher.new(files, options)
71
-
72
- if options[:list]
73
- puts 'Watching:'
74
- fw.last_found_filenames.each do |filename|
75
- puts " #{filename}"
76
- end
77
- end
78
-
79
- Process.daemon(true, true) if options[:daemon]
80
-
81
- fw.watch do |filename, event|
82
- cmd =
83
- if options[:exec] && File.exist?(filename)
84
- Filewatcher::Runner.new(filename).command
85
- elsif ARGV.length > 1
86
- ARGV[-1]
87
- end
88
-
89
- next puts "file #{event}: #{filename}" unless cmd
90
-
91
- env = Filewatcher::Env.new(filename, event).to_h
92
- if options[:restart]
93
- child_pid = restart(child_pid, env, cmd)
94
- else
95
- begin
96
- Process.spawn(env, cmd)
97
- Process.wait
98
- rescue SystemExit, Interrupt
99
- exit(0)
100
- end
101
- end
102
- end
103
- rescue SystemExit, Interrupt
104
- fw.finalize
105
- end
@@ -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
@@ -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
@@ -1,10 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative '../helper'
4
-
5
- dump_to_env_file(
6
- %w[
7
- FILENAME BASENAME EVENT DIRNAME ABSOLUTE_FILENAME
8
- RELATIVE_FILENAME
9
- ].map { |var| ENV[var] }.join(', ')
10
- )
@@ -1,5 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative '../helper'
4
-
5
- dump_to_env_file 'watched'
@@ -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