wires-inotify 0.0.0 → 0.9.0

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: 2423071eef69cd0ebd58674bd6efd9439888041a
4
- data.tar.gz: 29d3e0cfdedfa6f02fa6c9117128401db82cbce6
3
+ metadata.gz: bb199f81f59733bfb394ffc5e661cf0a5a10644a
4
+ data.tar.gz: 4fc657e5e03df97fb2aa6cf195114dede637dd71
5
5
  SHA512:
6
- metadata.gz: b5377b54fb99edaf005c64b3b2faa99ca5080b882210d4912777169c6ec9f9f77c448e216d4b1313f54b91e8ee121337f5587493169710186aa390df1204f044
7
- data.tar.gz: 1700aeaddb5d2b351b1313ab573843d47aa6862114c948519d2e4bfab5687f132ff78299061230552d2423c5ca0e434e5cbb20fae1d59641e531e751744c1b1f
6
+ metadata.gz: e823a8f3d3525a9dcfd02b78a4deaa295d755aab567d85ec0b94524e294d281ecee8cb4755dec067daedf2c54a11dd530a40fb9d6c7570b2ded4c5b4f03626bb
7
+ data.tar.gz: e4ef111babbf2e1642de9dc73901add6ba0659dacb1e89ef33446e27f400b231e93faef9fb037b37f69e583eebe259b9d4889a6979707aa701c77e27945502f8
@@ -0,0 +1,166 @@
1
+ require 'wires'
2
+ require 'rb-inotify'
3
+
4
+ def inotify_watch(path, *flags)
5
+ Wires::NotifyHub.watch(path, *flags)
6
+ end
7
+
8
+ def inotify_on(flags, channels='*', &codeblock)
9
+ flags = [flags] unless flags.is_a? Array
10
+ channels = [channels] unless channels.is_a? Array
11
+ for channel in channels
12
+ Wires::NotifyHub.watch(channel, *flags)
13
+ events = flags.map!{|x| ("notify_"+x.to_s).to_sym}
14
+ .map!{|x| x==:notify_all_events ? :notify : x }
15
+ Wires::Channel.new(channel).register(events, codeblock)
16
+ end
17
+ nil end
18
+
19
+ module Wires
20
+
21
+ class NotifyEvent < Event; end
22
+
23
+ class NotifyAccessEvent < NotifyEvent; end
24
+ class NotifyAttribEvent < NotifyEvent; end
25
+ class NotifyModifyEvent < NotifyEvent; end
26
+ class NotifyOpenEvent < NotifyEvent; end
27
+ class NotifyCreateEvent < NotifyEvent; end
28
+ class NotifyDeleteEvent < NotifyEvent; end
29
+ class NotifyDeleteSelfEvent < NotifyEvent; end
30
+ class NotifyMoveSelfEvent < NotifyEvent; end
31
+ class NotifyIgnoredEvent < NotifyEvent; end
32
+
33
+ class NotifyCloseEvent < NotifyEvent; end
34
+ class NotifyCloseWriteEvent < NotifyCloseEvent; end
35
+ class NotifyCloseNowriteEvent < NotifyCloseEvent; end
36
+
37
+ class NotifyMoveEvent < NotifyEvent; end
38
+ class NotifyMovedFromEvent < NotifyMoveEvent; end
39
+ class NotifyMovedToEvent < NotifyMoveEvent; end
40
+
41
+ class NotifyHub
42
+
43
+ class << self
44
+
45
+ attr_accessor :notifier
46
+ attr_reader :state
47
+ def alive?; @state==:alive end
48
+ def dead?; @state==:dead end
49
+
50
+ def class_init
51
+
52
+ # @@events_init = EventRegistry.list.select{ |x| (x < NotifyEvent) }
53
+ @@events = Hash.new
54
+ EventRegistry.list.select{ |x| (x < NotifyEvent) }.each do |cls|
55
+ @@events[cls.codestring.gsub(/^notify_/, "").to_sym] = cls
56
+ end
57
+
58
+ @state = :dead
59
+ @notifier = INotify::Notifier.new
60
+
61
+ Hub.after_run(retain:true) do
62
+ @state = :alive
63
+ @thread = Thread.new { while alive?; thread_iter; Thread.pass; end }
64
+ end
65
+
66
+ Hub.before_kill(retain:true) do
67
+ @state = :dead
68
+ @thread.kill
69
+ @thread = nil
70
+ end
71
+ end
72
+
73
+ def watch(path, *flags, &block)
74
+ flags << :all_events if (flags & @@events.keys).empty?
75
+ inject_a_watcher(@notifier.watch(path, *flags, &block))
76
+ end
77
+
78
+ def list
79
+ @notifier.watchers.values
80
+ .map { |w| inject_a_watcher(w)} # Inject new methods into obj
81
+ .reject { |w| w.closed? } # Exclude closed watchers from list
82
+ end
83
+
84
+ def matching(path=/.*/, *flags)
85
+ list.select { |w| (path.is_a?(Regexp)) ?
86
+ (path=~w.path) :
87
+ (path.to_s==w.path) }
88
+ .reject { |w| flags.detect{ |f| not flag_match(f, w.flags) } }
89
+ end
90
+
91
+ # Close all watchers and returns number of watchers closed
92
+ def close_all
93
+ s = list.size
94
+ list.each { |w| w.close }
95
+ s>0 ? s : nil
96
+ end
97
+
98
+ # Close watchers matching args and returns number of watchers closed
99
+ def close_matching(*args) # :args: path=/.*/, *flags
100
+ matches = matching(*args)
101
+ matches.each { |w| w.close }
102
+ (s=matches.size)>0 ? s : nil
103
+ end
104
+
105
+ threadlock (public_methods-superclass.public_methods)
106
+
107
+
108
+ private
109
+
110
+ # Determine if flag is implied (or explied) by flags array
111
+ def flag_match(testflag, flags)
112
+ return true if flags.include? :all_events
113
+
114
+ !!flags.detect{ |f| testflag==f or
115
+ (@@events[testflag] and
116
+ @@events[f] and
117
+ @@events[testflag]<=@@events[f]) }
118
+ end
119
+
120
+ # Open metaclass of w to add close state tracking and return obj
121
+ def inject_a_watcher(watcher)
122
+ return watcher if watcher.public_methods.include? :closed?
123
+
124
+ watcher.instance_variable_set(:@closed, false)
125
+ class << watcher
126
+ alias :_old_close :close
127
+ def close(*args)
128
+ self.instance_variable_set(:@closed, true)
129
+ begin; _old_close(*args)
130
+ rescue SystemCallError; end # If error, assume already closed
131
+ end
132
+ def closed?; self.instance_variable_get(:@closed); end
133
+ end
134
+
135
+ watcher
136
+ end
137
+
138
+ # Called repeatedly in inotify event processing thread
139
+ def thread_iter
140
+ @notifier.read_events.each { |e| process_event(e); e.callback! }
141
+ end
142
+
143
+ # Fire a wires event for inotify event e
144
+ def process_event(e)
145
+ return if dead?
146
+
147
+ if (common_flags = (e.flags & @@events.keys)).empty?
148
+ raise NotImplementedError, \
149
+ "No Wires::NotifyEvent for flags #{e.flags}"
150
+ end
151
+
152
+ cls = Event.from_codestring("notify_"+common_flags.first.to_s)
153
+
154
+ Channel.new(e.watcher.path)
155
+ .fire(cls.new(*e.flags,
156
+ name: e.name,
157
+ absolute_name: e.absolute_name,
158
+ watchpath: e.watcher.path))
159
+ end
160
+
161
+ end
162
+
163
+ class_init
164
+ end
165
+
166
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wires-inotify
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joe McIlvain
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-07-14 00:00:00.000000000 Z
11
+ date: 2013-07-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: wires
@@ -25,13 +25,27 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: 0.2.8
27
27
  - !ruby/object:Gem::Dependency
28
- name: rb-inotify~> 0.9.0
28
+ name: rb-inotify
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: 0.9.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: 0.9.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
29
43
  requirement: !ruby/object:Gem::Requirement
30
44
  requirements:
31
45
  - - '>='
32
46
  - !ruby/object:Gem::Version
33
47
  version: '0'
34
- type: :runtime
48
+ type: :development
35
49
  prerelease: false
36
50
  version_requirements: !ruby/object:Gem::Requirement
37
51
  requirements:
@@ -39,7 +53,7 @@ dependencies:
39
53
  - !ruby/object:Gem::Version
40
54
  version: '0'
41
55
  - !ruby/object:Gem::Dependency
42
- name: rake
56
+ name: minitest
43
57
  requirement: !ruby/object:Gem::Requirement
44
58
  requirements:
45
59
  - - '>='
@@ -53,7 +67,7 @@ dependencies:
53
67
  - !ruby/object:Gem::Version
54
68
  version: '0'
55
69
  - !ruby/object:Gem::Dependency
56
- name: minitest
70
+ name: turn
57
71
  requirement: !ruby/object:Gem::Requirement
58
72
  requirements:
59
73
  - - '>='
@@ -66,13 +80,13 @@ dependencies:
66
80
  - - '>='
67
81
  - !ruby/object:Gem::Version
68
82
  version: '0'
69
- description: Wires extension gem to integrate with inotify.
83
+ description: Wires extension gem to integrate with inotify via rb-inotify.
70
84
  email: joe.eli.mac@gmail.com
71
85
  executables: []
72
86
  extensions: []
73
87
  extra_rdoc_files: []
74
88
  files:
75
- - lib/wires-inotify.rb
89
+ - lib/wires/inotify.rb
76
90
  homepage: https://github.com/jemc/wires-inotify/
77
91
  licenses:
78
92
  - 'Copyright (c) Joe McIlvain. All rights reserved '
@@ -1,10 +0,0 @@
1
- require 'rb-inotify'
2
-
3
- module Wires
4
-
5
- class NotifyEvent < Event; end
6
-
7
- class Notifier
8
- end
9
-
10
- end