filewatcher 1.1.0 → 2.0.0.beta4

Sign up to get free protection for your applications and to get access to all the features.
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