filewatcher 1.0.0 → 2.0.0.beta2

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,114 +1,155 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: filewatcher
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 2.0.0.beta2
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-09-25 00:00:00.000000000 Z
12
+ date: 2020-09-20 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
- name: trollop
15
+ name: bundler
15
16
  requirement: !ruby/object:Gem::Requirement
16
17
  requirements:
17
18
  - - "~>"
18
19
  - !ruby/object:Gem::Version
19
- version: '2.1'
20
- - - ">="
21
- - !ruby/object:Gem::Version
22
- version: 2.1.2
23
- type: :runtime
20
+ version: '2.0'
21
+ type: :development
24
22
  prerelease: false
25
23
  version_requirements: !ruby/object:Gem::Requirement
26
24
  requirements:
27
25
  - - "~>"
28
26
  - !ruby/object:Gem::Version
29
- version: '2.1'
30
- - - ">="
27
+ version: '2.0'
28
+ - !ruby/object:Gem::Dependency
29
+ name: codecov
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: 0.2.5
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
31
40
  - !ruby/object:Gem::Version
32
- version: 2.1.2
41
+ version: 0.2.5
33
42
  - !ruby/object:Gem::Dependency
34
43
  name: rake
35
44
  requirement: !ruby/object:Gem::Requirement
36
45
  requirements:
37
46
  - - "~>"
38
47
  - !ruby/object:Gem::Version
39
- version: '12.0'
48
+ version: '13.0'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
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'
70
+ - !ruby/object:Gem::Dependency
71
+ name: rubocop
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - "~>"
75
+ - !ruby/object:Gem::Version
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'
40
91
  type: :development
41
92
  prerelease: false
42
93
  version_requirements: !ruby/object:Gem::Requirement
43
94
  requirements:
44
95
  - - "~>"
45
96
  - !ruby/object:Gem::Version
46
- version: '12.0'
97
+ version: '1.5'
47
98
  - !ruby/object:Gem::Dependency
48
- name: bacon
99
+ name: rubocop-rspec
49
100
  requirement: !ruby/object:Gem::Requirement
50
101
  requirements:
51
102
  - - "~>"
52
103
  - !ruby/object:Gem::Version
53
- version: '1.2'
104
+ version: '1.43'
54
105
  type: :development
55
106
  prerelease: false
56
107
  version_requirements: !ruby/object:Gem::Requirement
57
108
  requirements:
58
109
  - - "~>"
59
110
  - !ruby/object:Gem::Version
60
- version: '1.2'
61
- description: Detect changes in filesystem. Works anywhere.
111
+ version: '1.43'
112
+ description: Detect changes in file system. Works anywhere.
62
113
  email:
63
114
  - thomas.flemming@gmail.com
64
- executables:
65
- - filewatcher
115
+ - alex.wayfer@gmail.com
116
+ executables: []
66
117
  extensions: []
67
118
  extra_rdoc_files: []
68
119
  files:
69
- - bin/banner.txt
70
- - bin/filewatcher
71
120
  - lib/filewatcher.rb
72
121
  - lib/filewatcher/cycles.rb
73
- - lib/filewatcher/env.rb
74
- - 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
75
126
  - lib/filewatcher/version.rb
76
- - test/dumpers/env_dumper.rb
77
- - test/dumpers/watched_dumper.rb
78
- - test/filewatcher/test_env.rb
79
- - test/filewatcher/test_runner.rb
80
- - test/filewatcher/test_version.rb
81
- - test/helper.rb
82
- - test/test_filewatcher.rb
83
- 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
84
133
  licenses:
85
134
  - MIT
86
135
  metadata: {}
87
- post_install_message:
136
+ post_install_message:
88
137
  rdoc_options: []
89
138
  require_paths:
90
139
  - lib
91
140
  required_ruby_version: !ruby/object:Gem::Requirement
92
141
  requirements:
93
- - - ">="
142
+ - - "~>"
94
143
  - !ruby/object:Gem::Version
95
- version: '0'
144
+ version: '2.4'
96
145
  required_rubygems_version: !ruby/object:Gem::Requirement
97
146
  requirements:
98
- - - ">="
147
+ - - ">"
99
148
  - !ruby/object:Gem::Version
100
- version: '0'
149
+ version: 1.3.1
101
150
  requirements: []
102
- rubyforge_project:
103
- rubygems_version: 2.6.13
104
- signing_key:
151
+ rubygems_version: 3.1.2
152
+ signing_key:
105
153
  specification_version: 4
106
- summary: Lighweight filewatcher.
107
- test_files:
108
- - test/dumpers/env_dumper.rb
109
- - test/dumpers/watched_dumper.rb
110
- - test/filewatcher/test_env.rb
111
- - test/filewatcher/test_runner.rb
112
- - test/filewatcher/test_version.rb
113
- - test/helper.rb
114
- - test/test_filewatcher.rb
154
+ summary: Lightweight filewatcher.
155
+ 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,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,29 +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.realpath
14
- @current_dir = Pathname.new(Dir.pwd)
15
- end
16
-
17
- def to_h
18
- {
19
- 'FILEPATH' => (@realpath.to_s if @event != :deleted),
20
- 'FILENAME' => @filename,
21
- 'BASENAME' => @path.basename.to_s,
22
- 'EVENT' => @event.to_s,
23
- 'DIRNAME' => @path.parent.realpath.to_s,
24
- 'ABSOLUTE_FILENAME' => @realpath.to_s,
25
- 'RELATIVE_FILENAME' => @realpath.relative_path_from(@current_dir).to_s
26
- }
27
- end
28
- end
29
- 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