filewatcher 1.0.1 → 2.0.0.beta3

Sign up to get free protection for your applications and to get access to all the features.
metadata CHANGED
@@ -1,104 +1,153 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: filewatcher
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 2.0.0.beta3
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: 2017-11-20 00:00:00.000000000 Z
12
+ date: 2021-02-10 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: trollop
29
+ name: gem_toys
29
30
  requirement: !ruby/object:Gem::Requirement
30
31
  requirements:
31
32
  - - "~>"
32
33
  - !ruby/object:Gem::Version
33
- version: '2.1'
34
- - - ">="
34
+ version: 0.6.1
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: 0.6.1
42
+ - !ruby/object:Gem::Dependency
43
+ name: toys
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - "~>"
35
47
  - !ruby/object:Gem::Version
36
- version: 2.1.2
37
- type: :runtime
48
+ version: 0.11.4
49
+ type: :development
38
50
  prerelease: false
39
51
  version_requirements: !ruby/object:Gem::Requirement
40
52
  requirements:
41
53
  - - "~>"
42
54
  - !ruby/object:Gem::Version
43
- version: '2.1'
44
- - - ">="
55
+ version: 0.11.4
56
+ - !ruby/object:Gem::Dependency
57
+ name: codecov
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - "~>"
45
61
  - !ruby/object:Gem::Version
46
- version: 2.1.2
62
+ version: 0.4.3
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: 0.4.3
47
70
  - !ruby/object:Gem::Dependency
48
- name: rake
71
+ name: rspec
49
72
  requirement: !ruby/object:Gem::Requirement
50
73
  requirements:
51
74
  - - "~>"
52
75
  - !ruby/object:Gem::Version
53
- version: '12.0'
76
+ version: '3.8'
54
77
  type: :development
55
78
  prerelease: false
56
79
  version_requirements: !ruby/object:Gem::Requirement
57
80
  requirements:
58
81
  - - "~>"
59
82
  - !ruby/object:Gem::Version
60
- version: '12.0'
83
+ version: '3.8'
61
84
  - !ruby/object:Gem::Dependency
62
85
  name: rubocop
63
86
  requirement: !ruby/object:Gem::Requirement
64
87
  requirements:
65
88
  - - "~>"
66
89
  - !ruby/object:Gem::Version
67
- version: '0.51'
90
+ version: '1.3'
68
91
  type: :development
69
92
  prerelease: false
70
93
  version_requirements: !ruby/object:Gem::Requirement
71
94
  requirements:
72
95
  - - "~>"
73
96
  - !ruby/object:Gem::Version
74
- version: '0.51'
75
- description: Detect changes in filesystem. Works anywhere.
97
+ version: '1.3'
98
+ - !ruby/object:Gem::Dependency
99
+ name: rubocop-performance
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - "~>"
103
+ - !ruby/object:Gem::Version
104
+ version: '1.5'
105
+ type: :development
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - "~>"
110
+ - !ruby/object:Gem::Version
111
+ version: '1.5'
112
+ - !ruby/object:Gem::Dependency
113
+ name: rubocop-rspec
114
+ requirement: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - "~>"
117
+ - !ruby/object:Gem::Version
118
+ version: '2.0'
119
+ type: :development
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - "~>"
124
+ - !ruby/object:Gem::Version
125
+ version: '2.0'
126
+ description: Detect changes in file system. Works anywhere.
76
127
  email:
77
128
  - thomas.flemming@gmail.com
78
- executables:
79
- - filewatcher
129
+ - alex.wayfer@gmail.com
130
+ executables: []
80
131
  extensions: []
81
132
  extra_rdoc_files: []
82
133
  files:
83
- - bin/banner.txt
84
- - bin/filewatcher
85
134
  - lib/filewatcher.rb
86
135
  - lib/filewatcher/cycles.rb
87
- - lib/filewatcher/env.rb
88
- - lib/filewatcher/runner.rb
136
+ - lib/filewatcher/snapshot.rb
137
+ - lib/filewatcher/snapshots.rb
138
+ - lib/filewatcher/spec_helper.rb
139
+ - lib/filewatcher/spec_helper/watch_run.rb
89
140
  - lib/filewatcher/version.rb
90
- - test/dumpers/env_dumper.rb
91
- - test/dumpers/watched_dumper.rb
92
- - test/filewatcher/test_env.rb
93
- - test/filewatcher/test_runner.rb
94
- - test/filewatcher/test_version.rb
95
- - test/helper.rb
96
- - test/test_filewatcher.rb
97
- homepage: http://github.com/thomasfl/filewatcher
141
+ - spec/filewatcher/snapshot_spec.rb
142
+ - spec/filewatcher/version_spec.rb
143
+ - spec/filewatcher_spec.rb
144
+ - spec/spec_helper.rb
145
+ - spec/spec_helper/ruby_watch_run.rb
146
+ homepage: http://github.com/filewatcher/filewatcher
98
147
  licenses:
99
148
  - MIT
100
149
  metadata: {}
101
- post_install_message:
150
+ post_install_message:
102
151
  rdoc_options: []
103
152
  require_paths:
104
153
  - lib
@@ -106,23 +155,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
106
155
  requirements:
107
156
  - - ">="
108
157
  - !ruby/object:Gem::Version
109
- version: '0'
158
+ version: '2.4'
159
+ - - "<"
160
+ - !ruby/object:Gem::Version
161
+ version: '4'
110
162
  required_rubygems_version: !ruby/object:Gem::Requirement
111
163
  requirements:
112
- - - ">="
164
+ - - ">"
113
165
  - !ruby/object:Gem::Version
114
- version: '0'
166
+ version: 1.3.1
115
167
  requirements: []
116
- rubyforge_project:
117
- rubygems_version: 2.7.2
118
- signing_key:
168
+ rubygems_version: 3.2.3
169
+ signing_key:
119
170
  specification_version: 4
120
- summary: Lighweight filewatcher.
121
- test_files:
122
- - test/dumpers/env_dumper.rb
123
- - test/dumpers/watched_dumper.rb
124
- - test/filewatcher/test_env.rb
125
- - test/filewatcher/test_runner.rb
126
- - test/filewatcher/test_version.rb
127
- - test/helper.rb
128
- - test/test_filewatcher.rb
171
+ summary: Lightweight filewatcher.
172
+ 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
- require 'trollop'
9
- require 'thread'
10
-
11
- options = Trollop.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
- Trollop.die Trollop.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(child_pid, env, cmd)
54
- raise Errno::ESRCH unless child_pid
55
- Process.kill(9, child_pid)
56
- Process.wait(child_pid)
57
- rescue Errno::ESRCH
58
- nil # already killed
59
- ensure
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