filewatcher 1.1.1 → 2.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
metadata CHANGED
@@ -1,122 +1,156 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: filewatcher
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.1
4
+ version: 2.0.0.beta1
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-11 00:00:00.000000000 Z
12
+ date: 2020-09-18 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: codecov
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.2.5
35
+ type: :development
35
36
  prerelease: false
36
37
  version_requirements: !ruby/object:Gem::Requirement
37
38
  requirements:
38
39
  - - "~>"
39
40
  - !ruby/object:Gem::Version
40
- version: '3.0'
41
+ version: 0.2.5
41
42
  - !ruby/object:Gem::Dependency
42
43
  name: rake
43
44
  requirement: !ruby/object:Gem::Requirement
44
45
  requirements:
45
46
  - - "~>"
46
47
  - !ruby/object:Gem::Version
47
- version: '12.0'
48
+ version: '13.0'
48
49
  type: :development
49
50
  prerelease: false
50
51
  version_requirements: !ruby/object:Gem::Requirement
51
52
  requirements:
52
53
  - - "~>"
53
54
  - !ruby/object:Gem::Version
54
- version: '12.0'
55
+ version: '13.0'
56
+ - !ruby/object:Gem::Dependency
57
+ name: rspec
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - "~>"
61
+ - !ruby/object:Gem::Version
62
+ version: '3.8'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '3.8'
55
70
  - !ruby/object:Gem::Dependency
56
71
  name: rubocop
57
72
  requirement: !ruby/object:Gem::Requirement
58
73
  requirements:
59
74
  - - "~>"
60
75
  - !ruby/object:Gem::Version
61
- version: '0.57'
76
+ version: 0.91.0
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - "~>"
82
+ - !ruby/object:Gem::Version
83
+ version: 0.91.0
84
+ - !ruby/object:Gem::Dependency
85
+ name: rubocop-performance
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - "~>"
89
+ - !ruby/object:Gem::Version
90
+ version: '1.5'
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - "~>"
96
+ - !ruby/object:Gem::Version
97
+ version: '1.5'
98
+ - !ruby/object:Gem::Dependency
99
+ name: rubocop-rspec
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - "~>"
103
+ - !ruby/object:Gem::Version
104
+ version: '1.43'
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.43'
112
+ description: Detect changes in file system. Works anywhere.
70
113
  email:
71
114
  - thomas.flemming@gmail.com
72
- executables:
73
- - filewatcher
115
+ - alex.wayfer@gmail.com
116
+ executables: []
74
117
  extensions: []
75
118
  extra_rdoc_files: []
76
119
  files:
77
- - bin/banner.txt
78
- - bin/filewatcher
79
120
  - lib/filewatcher.rb
80
121
  - lib/filewatcher/cycles.rb
81
- - lib/filewatcher/env.rb
82
- - lib/filewatcher/runner.rb
122
+ - lib/filewatcher/snapshot.rb
123
+ - lib/filewatcher/snapshots.rb
124
+ - lib/filewatcher/spec_helper.rb
125
+ - lib/filewatcher/spec_helper/watch_run.rb
83
126
  - 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
127
+ - spec/filewatcher/snapshot_spec.rb
128
+ - spec/filewatcher/version_spec.rb
129
+ - spec/filewatcher_spec.rb
130
+ - spec/spec_helper.rb
131
+ - spec/spec_helper/ruby_watch_run.rb
132
+ homepage: http://github.com/filewatcher/filewatcher
92
133
  licenses:
93
134
  - MIT
94
135
  metadata: {}
95
- post_install_message:
136
+ post_install_message:
96
137
  rdoc_options: []
97
138
  require_paths:
98
139
  - lib
99
140
  required_ruby_version: !ruby/object:Gem::Requirement
100
141
  requirements:
101
- - - ">="
142
+ - - "~>"
102
143
  - !ruby/object:Gem::Version
103
- version: '0'
144
+ version: '2.4'
104
145
  required_rubygems_version: !ruby/object:Gem::Requirement
105
146
  requirements:
106
- - - ">="
147
+ - - ">"
107
148
  - !ruby/object:Gem::Version
108
- version: '0'
149
+ version: 1.3.1
109
150
  requirements: []
110
- rubyforge_project:
111
- rubygems_version: 2.6.14.1
112
- signing_key:
151
+ rubyforge_project:
152
+ rubygems_version: 2.7.6.2
153
+ signing_key:
113
154
  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
155
+ summary: Lightweight filewatcher.
156
+ test_files: []
@@ -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:
@@ -1,106 +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
- raise Errno::ESRCH unless pid
56
- Process.kill(9, pid)
57
- Process.wait(pid)
58
- rescue Errno::ESRCH
59
- nil # already killed
60
- end
61
- Process.spawn(env, cmd)
62
- end
63
-
64
- if options[:exclude].to_s != ''
65
- options[:exclude] = split_files_void_escaped_whitespace(
66
- options[:exclude].split(' ')
67
- )
68
- end
69
-
70
- begin
71
- fw = Filewatcher.new(files, options)
72
-
73
- if options[:list]
74
- puts 'Watching:'
75
- fw.last_found_filenames.each do |filename|
76
- puts " #{filename}"
77
- end
78
- end
79
-
80
- Process.daemon(true, true) if options[:daemon]
81
-
82
- fw.watch do |filename, event|
83
- cmd =
84
- if options[:exec] && File.exist?(filename)
85
- Filewatcher::Runner.new(filename).command
86
- elsif ARGV.length > 1
87
- ARGV[-1]
88
- end
89
-
90
- next puts "file #{event}: #{filename}" unless cmd
91
-
92
- env = Filewatcher::Env.new(filename, event).to_h
93
- if options[:restart]
94
- child_pid = restart(child_pid, env, cmd)
95
- else
96
- begin
97
- Process.spawn(env, cmd)
98
- Process.wait
99
- rescue SystemExit, Interrupt
100
- exit(0)
101
- end
102
- end
103
- end
104
- rescue SystemExit, Interrupt
105
- fw.finalize
106
- 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