alki-reload 0.2.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
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