filewatcher 1.0.1 → 2.0.0.beta3

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,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