listen 3.1.4 → 3.3.0.pre.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'English'
2
4
 
3
5
  require 'listen/version'
@@ -19,7 +21,6 @@ require 'listen/listener/config'
19
21
 
20
22
  module Listen
21
23
  class Listener
22
- # TODO: move the state machine's methods private
23
24
  include Listen::FSM
24
25
 
25
26
  # Initializes the directories listener.
@@ -38,7 +39,7 @@ module Listen
38
39
  @config = Config.new(options)
39
40
 
40
41
  eq_config = Event::Queue::Config.new(@config.relative?)
41
- queue = Event::Queue.new(eq_config) { @processor.wakeup_on_event }
42
+ queue = Event::Queue.new(eq_config)
42
43
 
43
44
  silencer = Silencer.new
44
45
  rules = @config.silencer_rules
@@ -57,41 +58,42 @@ module Listen
57
58
 
58
59
  @processor = Event::Loop.new(pconfig)
59
60
 
60
- super() # FSM
61
+ initialize_fsm
61
62
  end
62
63
 
63
- default_state :initializing
64
-
65
- state :initializing, to: :backend_started
64
+ start_state :initializing
66
65
 
67
- state :backend_started, to: [:frontend_ready, :stopped] do
68
- backend.start
69
- end
66
+ state :initializing, to: [:backend_started, :stopped]
70
67
 
71
- state :frontend_ready, to: [:processing_events, :stopped] do
72
- processor.setup
68
+ state :backend_started, to: [:processing_events, :stopped] do
69
+ @backend.start
73
70
  end
74
71
 
75
72
  state :processing_events, to: [:paused, :stopped] do
76
- processor.resume
73
+ @processor.start
77
74
  end
78
75
 
79
76
  state :paused, to: [:processing_events, :stopped] do
80
- processor.pause
77
+ @processor.pause
81
78
  end
82
79
 
83
80
  state :stopped, to: [:backend_started] do
84
- backend.stop # should be before processor.teardown to halt events ASAP
85
- processor.teardown
81
+ @backend.stop # halt events ASAP
82
+ @processor.stop
86
83
  end
87
84
 
88
85
  # Starts processing events and starts adapters
89
86
  # or resumes invoking callbacks if paused
90
87
  def start
91
- transition :backend_started if state == :initializing
92
- transition :frontend_ready if state == :backend_started
93
- transition :processing_events if state == :frontend_ready
94
- transition :processing_events if state == :paused
88
+ case state
89
+ when :initializing
90
+ transition :backend_started
91
+ transition :processing_events
92
+ when :paused
93
+ transition :processing_events
94
+ else
95
+ raise ArgumentError, "cannot start from state #{state.inspect}"
96
+ end
95
97
  end
96
98
 
97
99
  # Stops both listening for events and processing them
@@ -113,6 +115,10 @@ module Listen
113
115
  state == :paused
114
116
  end
115
117
 
118
+ def stopped?
119
+ state == :stopped
120
+ end
121
+
116
122
  def ignore(regexps)
117
123
  @silencer_controller.append_ignores(regexps)
118
124
  end
@@ -124,10 +130,5 @@ module Listen
124
130
  def only(regexps)
125
131
  @silencer_controller.replace_with_only(regexps)
126
132
  end
127
-
128
- private
129
-
130
- attr_reader :processor
131
- attr_reader :backend
132
133
  end
133
134
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Listen
2
4
  class Listener
3
5
  class Config
@@ -1,32 +1,35 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Listen
2
- def self.logger
3
- @logger ||= nil
4
- end
4
+ @logger = nil
5
5
 
6
- def self.logger=(logger)
7
- @logger = logger
8
- end
6
+ # Listen.logger will always be present.
7
+ # If you don't want logging, set Listen.logger = ::Logger.new('/dev/null', level: ::Logger::UNKNOWN)
8
+
9
+ class << self
10
+ attr_writer :logger
9
11
 
10
- def self.setup_default_logger_if_unset
11
- self.logger ||= ::Logger.new(STDERR).tap do |logger|
12
- debugging = ENV['LISTEN_GEM_DEBUGGING']
13
- logger.level =
14
- case debugging.to_s
15
- when /2/
16
- ::Logger::DEBUG
17
- when /true|yes|1/i
18
- ::Logger::INFO
19
- else
20
- ::Logger::ERROR
21
- end
12
+ def logger
13
+ @logger ||= default_logger
22
14
  end
23
- end
24
15
 
25
- class Logger
26
- [:fatal, :error, :warn, :info, :debug].each do |meth|
27
- define_singleton_method(meth) do |*args, &block|
28
- Listen.logger.public_send(meth, *args, &block) if Listen.logger
29
- end
16
+ private
17
+
18
+ def default_logger
19
+ level = case ENV['LISTEN_GEM_DEBUGGING'].to_s
20
+ when /debug|2/i
21
+ ::Logger::DEBUG
22
+ when /info|true|yes|1/i
23
+ ::Logger::INFO
24
+ when /warn/i
25
+ ::Logger::WARN
26
+ when /fatal/i
27
+ ::Logger::FATAL
28
+ else
29
+ ::Logger::ERROR
30
+ end
31
+
32
+ ::Logger.new(STDERR, level: level)
30
33
  end
31
34
  end
32
35
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Listen
2
4
  class Options
3
5
  def initialize(opts, defaults)
@@ -10,7 +12,7 @@ module Listen
10
12
  return if given_options.empty?
11
13
 
12
14
  msg = "Unknown options: #{given_options.inspect}"
13
- Listen::Logger.warn msg
15
+ Listen.logger.warn msg
14
16
  fail msg
15
17
  end
16
18
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Listen
2
4
  class QueueOptimizer
3
5
  class Config
@@ -107,15 +109,15 @@ module Listen
107
109
  def _detect_possible_editor_save(changes)
108
110
  return unless changes.size == 2
109
111
 
110
- from_type = from_change = from = nil
111
- to_type = to_change = to_dir = to = nil
112
+ from_type = from = nil
113
+ to_type = to_dir = to = nil
112
114
 
113
115
  changes.each do |data|
114
116
  case data[1]
115
117
  when :moved_from
116
- from_type, from_change, _, from, = data
118
+ from_type, _from_change, _, from, = data
117
119
  when :moved_to
118
- to_type, to_change, to_dir, to, = data
120
+ to_type, _to_change, to_dir, to, = data
119
121
  else
120
122
  return nil
121
123
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'thread'
2
4
  require 'listen/record/entry'
3
5
  require 'listen/record/symlink_detector'
@@ -45,8 +47,7 @@ module Listen
45
47
  if [nil, '', '.'].include? rel_path.to_s
46
48
  tree
47
49
  else
48
- tree[rel_path.to_s] ||= _auto_hash
49
- tree[rel_path.to_s]
50
+ _sub_tree(rel_path)
50
51
  end
51
52
 
52
53
  result = {}
@@ -57,6 +58,19 @@ module Listen
57
58
  result
58
59
  end
59
60
 
61
+ def _sub_tree(rel_path)
62
+ tree.each_with_object({}) do |(path, meta), result|
63
+ next unless path.start_with?(rel_path)
64
+
65
+ if path == rel_path
66
+ result.merge!(meta)
67
+ else
68
+ sub_path = path.sub(%r{\A#{rel_path}/?}, '')
69
+ result[sub_path] = meta
70
+ end
71
+ end
72
+ end
73
+
60
74
  def build
61
75
  @tree = _auto_hash
62
76
  # TODO: test with a file name given
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Listen
2
4
  # @private api
3
5
  class Record
@@ -22,7 +24,7 @@ module Listen
22
24
 
23
25
  def meta
24
26
  lstat = ::File.lstat(sys_path)
25
- { mtime: lstat.mtime.to_f, mode: lstat.mode }
27
+ { mtime: lstat.mtime.to_f, mode: lstat.mode, size: lstat.size }
26
28
  end
27
29
 
28
30
  # record hash is e.g.
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'set'
2
4
 
3
5
  module Listen
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Listen
2
4
  class Silencer
3
5
  # The default list of directories that get ignored.
@@ -46,6 +48,9 @@ module Listen
46
48
  )
47
49
  )
48
50
 
51
+ # Mutagen sync temporary files
52
+ | \.mutagen-temporary.*
53
+
49
54
  # other files
50
55
  | \.DS_Store
51
56
  | \.tmp
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Listen
2
4
  class Silencer
3
5
  class Controller
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'thread'
4
+
5
+ require_relative 'logger'
6
+
7
+ module Listen
8
+ module Thread
9
+ class << self
10
+ # Creates a new thread with the given name.
11
+ # Any exceptions raised by the thread will be logged with the thread name and complete backtrace.
12
+ def new(name)
13
+ thread_name = "listen-#{name}"
14
+
15
+ caller_stack = caller
16
+ ::Thread.new do
17
+ begin
18
+ yield
19
+ rescue Exception => ex
20
+ _log_exception(ex, thread_name, caller_stack)
21
+ nil
22
+ end
23
+ end.tap do |thread|
24
+ thread.name = thread_name
25
+ end
26
+ end
27
+
28
+ private
29
+
30
+ def _log_exception(ex, thread_name, caller_stack)
31
+ complete_backtrace = [*ex.backtrace, "--- Thread.new ---", *caller_stack]
32
+ message = "Exception rescued in #{thread_name}:\n#{_exception_with_causes(ex)}\n#{complete_backtrace * "\n"}"
33
+ Listen.logger.error(message)
34
+ end
35
+
36
+ def _exception_with_causes(ex)
37
+ result = +"#{ex.class}: #{ex}"
38
+ if ex.cause
39
+ result << "\n"
40
+ result << "--- Caused by: ---\n"
41
+ result << _exception_with_causes(ex.cause)
42
+ end
43
+ result
44
+ end
45
+ end
46
+ end
47
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Listen
2
- VERSION = '3.1.4'.freeze
4
+ VERSION = '3.3.0.pre.3'
3
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: listen
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.1.4
4
+ version: 3.3.0.pre.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thibaud Guillaume-Gentil
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-05-12 00:00:00.000000000 Z
11
+ date: 2020-11-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rb-fsevent
@@ -16,20 +16,20 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0.9'
19
+ version: '0.10'
20
20
  - - ">="
21
21
  - !ruby/object:Gem::Version
22
- version: 0.9.4
22
+ version: 0.10.3
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  requirements:
27
27
  - - "~>"
28
28
  - !ruby/object:Gem::Version
29
- version: '0.9'
29
+ version: '0.10'
30
30
  - - ">="
31
31
  - !ruby/object:Gem::Version
32
- version: 0.9.4
32
+ version: 0.10.3
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: rb-inotify
35
35
  requirement: !ruby/object:Gem::Requirement
@@ -39,7 +39,7 @@ dependencies:
39
39
  version: '0.9'
40
40
  - - ">="
41
41
  - !ruby/object:Gem::Version
42
- version: 0.9.7
42
+ version: 0.9.10
43
43
  type: :runtime
44
44
  prerelease: false
45
45
  version_requirements: !ruby/object:Gem::Requirement
@@ -49,37 +49,9 @@ dependencies:
49
49
  version: '0.9'
50
50
  - - ">="
51
51
  - !ruby/object:Gem::Version
52
- version: 0.9.7
53
- - !ruby/object:Gem::Dependency
54
- name: ruby_dep
55
- requirement: !ruby/object:Gem::Requirement
56
- requirements:
57
- - - "~>"
58
- - !ruby/object:Gem::Version
59
- version: '1.2'
60
- type: :runtime
61
- prerelease: false
62
- version_requirements: !ruby/object:Gem::Requirement
63
- requirements:
64
- - - "~>"
65
- - !ruby/object:Gem::Version
66
- version: '1.2'
67
- - !ruby/object:Gem::Dependency
68
- name: bundler
69
- requirement: !ruby/object:Gem::Requirement
70
- requirements:
71
- - - "~>"
72
- - !ruby/object:Gem::Version
73
- version: '1.12'
74
- type: :development
75
- prerelease: false
76
- version_requirements: !ruby/object:Gem::Requirement
77
- requirements:
78
- - - "~>"
79
- - !ruby/object:Gem::Version
80
- version: '1.12'
52
+ version: 0.9.10
81
53
  description: The Listen gem listens to file modifications and notifies you about the
82
- changes. Works everywhere!
54
+ changegem. Works everywhere!
83
55
  email: thibaud@thibaud.gg
84
56
  executables:
85
57
  - listen
@@ -110,7 +82,6 @@ files:
110
82
  - lib/listen/event/queue.rb
111
83
  - lib/listen/file.rb
112
84
  - lib/listen/fsm.rb
113
- - lib/listen/internals/thread_pool.rb
114
85
  - lib/listen/listener.rb
115
86
  - lib/listen/listener/config.rb
116
87
  - lib/listen/logger.rb
@@ -121,33 +92,30 @@ files:
121
92
  - lib/listen/record/symlink_detector.rb
122
93
  - lib/listen/silencer.rb
123
94
  - lib/listen/silencer/controller.rb
95
+ - lib/listen/thread.rb
124
96
  - lib/listen/version.rb
125
97
  homepage: https://github.com/guard/listen
126
98
  licenses:
127
99
  - MIT
128
- metadata: {}
100
+ metadata:
101
+ allowed_push_host: https://rubygems.org
129
102
  post_install_message:
130
103
  rdoc_options: []
131
104
  require_paths:
132
105
  - lib
133
106
  required_ruby_version: !ruby/object:Gem::Requirement
134
107
  requirements:
135
- - - "~>"
136
- - !ruby/object:Gem::Version
137
- version: '2.2'
138
108
  - - ">="
139
109
  - !ruby/object:Gem::Version
140
- version: 2.2.3
110
+ version: 2.2.7
141
111
  required_rubygems_version: !ruby/object:Gem::Requirement
142
112
  requirements:
143
- - - ">="
113
+ - - ">"
144
114
  - !ruby/object:Gem::Version
145
- version: '0'
115
+ version: 1.3.1
146
116
  requirements: []
147
- rubyforge_project:
148
- rubygems_version: 2.5.1
117
+ rubygems_version: 3.0.1
149
118
  signing_key:
150
119
  specification_version: 4
151
120
  summary: Listen to file modifications
152
121
  test_files: []
153
- has_rdoc: