listen 3.1.4 → 3.3.0.pre.3

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.
@@ -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: