alki-reload 0.2.0 → 0.3.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b05597e13de69db0fcbc34fd150c89fde3647a24
4
- data.tar.gz: 6e7161d23ae9d232b7e7c0e5309ca6e3b49871a6
3
+ metadata.gz: be36a892fb4393ecba3d020801a03c8b985a6310
4
+ data.tar.gz: 2de7375d65893da50750ad67b2e24d3ff7619cb0
5
5
  SHA512:
6
- metadata.gz: 672a296eadf628c9cbb3a5a3f53766d1c67d48b22e30ff53d865b89f151897197219643bb336c2f892333aed1671a230948763bd1dc34eed0a13e83067ef19c0
7
- data.tar.gz: 751e2cc7bcb01466edb10ddb95d15017b2e3f53732d99f75f4e6eaab333a7de28c8ec629955bc8fe625c9cbc9f9438250ed2728d624af3ec03c9dd9e2e522ed5
6
+ metadata.gz: 22a60b747ee36f7ac4fdbe5ce3eaedcd7b00af3e90b8fc84e6132d22d695f6e14f0b7c84b4363340d8158bae5b755f5833b9f40bdb7f1a10e5586f35716a86d8
7
+ data.tar.gz: eb07452afb7353eb4e2a44343a3a03ff83233015886f4d83382daa9d1a5fadac9d6b83fc58e7638fed37db5ea94d000e03ec054988d99b66230200b53397665f
data/alki-reload.gemspec CHANGED
@@ -23,5 +23,6 @@ Gem::Specification.new do |spec|
23
23
  spec.add_development_dependency "bundler", "~> 1.13"
24
24
  spec.add_development_dependency "rake", "~> 10.0"
25
25
  spec.add_dependency "listen", "~> 3.0"
26
- spec.add_dependency "alki", "~> 0.10"
26
+ spec.add_dependency "alki", "~> 0.12"
27
+ spec.add_dependency "alki-testing", "~> 0.1"
27
28
  end
data/config/assembly.rb CHANGED
@@ -71,22 +71,25 @@ Alki do
71
71
  Alki::Reload::Unloader.new handlers, whitelist
72
72
  end
73
73
 
74
+ tag :stop_on_reload
74
75
  service :watcher do
75
- require 'alki/reload/listen_watcher'
76
- Alki::Reload::ListenWatcher.new assembly, watch_dirs
76
+ if watch
77
+ require 'alki/reload/listen_watcher'
78
+ Alki::Reload::ListenWatcher.new assembly, watch_dirs
79
+ else
80
+ require 'alki/reload/null_watcher'
81
+ Alki::Reload::NullWatcher.new
82
+ end
77
83
  end
78
84
 
79
- overlay :watcher, :on_reload, :stop!
85
+ overlay '%stop_on_reload', :on_reload, :stop
80
86
 
81
87
  overlay 'root.assembly_instance', :assembly_delegator
82
88
 
83
89
  factory :assembly_delegator do
84
90
  require 'alki/reload/assembly_delegator'
85
- if watch
86
- self.watcher.start!
87
- end
88
91
  -> obj {
89
- Alki::Reload::AssemblyDelegator.new obj, reloader
92
+ Alki::Reload::AssemblyDelegator.new obj, watcher, reloader
90
93
  }
91
94
  end
92
95
 
@@ -3,20 +3,22 @@ require 'delegate'
3
3
  module Alki
4
4
  module Reload
5
5
  class AssemblyDelegator < Delegator
6
- def initialize(obj,reloader)
6
+ def initialize(obj,watcher,reloader)
7
7
  @obj = obj
8
+ @loaded = false
9
+ @watcher = watcher
8
10
  @reloader = reloader
9
11
  end
10
12
 
11
- def __reload__
12
- if @obj.respond_to? :__reload__
13
- return false unless @obj.__reload__
14
- end
15
-
13
+ def __unload__
16
14
  @reloader.reload
17
15
  end
18
16
 
19
17
  def __getobj__
18
+ unless @loaded
19
+ @loaded = true
20
+ @watcher.start
21
+ end
20
22
  @obj
21
23
  end
22
24
  end
@@ -1,71 +1,53 @@
1
1
  require 'listen'
2
- require 'weakref'
2
+ require 'concurrent'
3
3
 
4
4
  module Alki
5
5
  module Reload
6
6
  class ListenWatcher
7
7
  @listeners = {}
8
8
 
9
- def initialize(reloader,dirs)
10
- @reloader = reloader
11
- @dirs = dirs
9
+ def self.listener(dirs,reloader)
10
+ @listeners[dirs] ||= Listener.new(dirs,reloader)
12
11
  end
13
12
 
14
- def start!
15
- start_thread unless @thread
13
+ def initialize(reloader,dirs)
14
+ @listener = self.class.listener dirs, reloader
15
+ @started = false
16
16
  end
17
17
 
18
- def stop!
19
- if @thread && @thread != Thread.current
20
- @queue.clear
21
- @queue << :done
22
- @thread.join
18
+ def start
19
+ unless @started
20
+ @listener.start
21
+ @started = true
23
22
  end
24
23
  end
25
24
 
26
- private
27
-
28
- def self.listener(dir,queue)
29
- dir = File.join(dir,'')
30
- unless @listeners[dir]
31
- qs = []
32
- @listeners[dir] = [qs,Listen.to(dir) do
33
- qs.delete_if do |q|
34
- begin
35
- q << :reload
36
- false
37
- rescue WeakRef::RefError
38
- true
39
- end
40
- end
41
- end.tap{|l| l.start }]
25
+ def stop
26
+ if @started
27
+ @listener.stop
28
+ @started = false
42
29
  end
43
- @listeners[dir][0] << WeakRef.new(queue)
44
30
  end
45
31
 
46
- def start_thread
47
- @queue = Queue.new
48
- @thread = Thread.new do
49
- @dirs.each{|dir| self.class.listener(dir,@queue) }
50
- done = false
51
- until done
52
- begin
53
- cmd = @queue.pop
54
- if cmd == :done
55
- done = true
56
- elsif cmd == :reload
57
- if @reloader.reload
58
- done = true
59
- end
60
- end
61
- rescue => e
62
- $stderr.puts e
63
- $stderr.puts e.backtrace.join("\n")
32
+ class Listener
33
+ def initialize(dirs,reloader)
34
+ @count = 0
35
+ @listen = Listen.to(*dirs) do |modified, _added, _removed|
36
+ if @count > 0 && modified
37
+ reloader.reload
64
38
  end
65
39
  end
66
- @queue.clear
67
- @queue = nil
68
- @thread = nil
40
+ end
41
+
42
+ def start
43
+ if @count == 0
44
+ @listen.start
45
+ end
46
+ @count += 1
47
+ end
48
+
49
+ def stop
50
+ @count -= 1
69
51
  end
70
52
  end
71
53
  end
@@ -0,0 +1,11 @@
1
+ module Alki
2
+ module Reload
3
+ class NullWatcher
4
+ def start
5
+ end
6
+
7
+ def stop
8
+ end
9
+ end
10
+ end
11
+ end
@@ -1,5 +1,5 @@
1
1
  module Alki
2
2
  module Reload
3
- VERSION = "0.2.0"
3
+ VERSION = "0.3.1"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: alki-reload
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matt Edlefsen
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-12-29 00:00:00.000000000 Z
11
+ date: 2017-05-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -58,14 +58,28 @@ dependencies:
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '0.10'
61
+ version: '0.12'
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '0.10'
68
+ version: '0.12'
69
+ - !ruby/object:Gem::Dependency
70
+ name: alki-testing
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.1'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.1'
69
83
  description:
70
84
  email:
71
85
  - matt.edlefsen@gmail.com
@@ -86,6 +100,7 @@ files:
86
100
  - lib/alki/reload/listen_watcher.rb
87
101
  - lib/alki/reload/load_path_handler.rb
88
102
  - lib/alki/reload/loader_handler.rb
103
+ - lib/alki/reload/null_watcher.rb
89
104
  - lib/alki/reload/reloadable_delegator.rb
90
105
  - lib/alki/reload/reloader.rb
91
106
  - lib/alki/reload/unloader.rb