notified_tail 0.2.1 → 0.2.2
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 +4 -4
- data/lib/notified_tail.rb +3 -3
- data/notified_tail.gemspec +1 -1
- data/spec/lib/notified_tail_spec.rb +50 -7
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9aa8eddca759a4256d8851d8030427c2e0e6acd7
|
4
|
+
data.tar.gz: 2f8488e69e14240075c0e1addf5bf81a68d0b37a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8a00b5626010f98902847ddf6ee1e14148d94d3d2c07b7636aa49f1a5a3f52ef7ab139d1fb6b576397f1c4b0df2f3148118d4d368574bafd8eb6f7a54fc5de1e
|
7
|
+
data.tar.gz: 1d159c3305817fddf09c81dc6175bf65497647a94d9ba0923954223ee00430c5165a66c8a0785b7ec4f0a00c54f8016d115c1533208feac28273f023ffe8a0c2
|
data/lib/notified_tail.rb
CHANGED
@@ -16,7 +16,7 @@ class NotifiedTail
|
|
16
16
|
new.tail(file_path, opts, &on_line)
|
17
17
|
end
|
18
18
|
|
19
|
-
def tail(file_path, opts, &on_line)
|
19
|
+
def tail(file_path, opts={}, &on_line)
|
20
20
|
@file_path = file_path
|
21
21
|
@stopped = false
|
22
22
|
seek_end = opts.fetch(:seek_end, true)
|
@@ -64,12 +64,12 @@ class NotifiedTail
|
|
64
64
|
require 'rb-kqueue'
|
65
65
|
@queue = KQueue::Queue.new
|
66
66
|
@queue.watch_file(file_path, :extend) { block.call }
|
67
|
-
@queue.run
|
67
|
+
@queue.run unless @stopped
|
68
68
|
when /linux/
|
69
69
|
require 'rb-inotify'
|
70
70
|
@queue = INotify::Notifier.new
|
71
71
|
@queue.watch(file_path, :modify) { block.call }
|
72
|
-
@queue.run
|
72
|
+
@queue.run unless @stopped
|
73
73
|
else
|
74
74
|
poll(file_path, &block)
|
75
75
|
end
|
data/notified_tail.gemspec
CHANGED
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
|
5
5
|
Gem::Specification.new do |spec|
|
6
6
|
spec.name = 'notified_tail'
|
7
|
-
spec.version = '0.2.
|
7
|
+
spec.version = '0.2.2'
|
8
8
|
spec.authors = ['Peter Winton']
|
9
9
|
spec.email = ['pwinton@indigobio.com']
|
10
10
|
spec.summary = %q{Low latency file tailing in ruby}
|
@@ -1,16 +1,17 @@
|
|
1
1
|
require 'rspec'
|
2
2
|
require 'securerandom'
|
3
3
|
require 'notified_tail'
|
4
|
+
require 'fileutils'
|
4
5
|
|
5
6
|
describe NotifiedTail do
|
6
7
|
describe '#tail' do
|
7
8
|
let!(:seek_end) { false }
|
8
9
|
let!(:force_poll) { false }
|
10
|
+
let!(:fn) { SecureRandom.uuid }
|
11
|
+
after(:each) { File.delete(fn) }
|
9
12
|
|
10
13
|
shared_examples 'tail -f' do
|
11
14
|
let!(:lines) { [] }
|
12
|
-
let!(:fn) { SecureRandom.uuid }
|
13
|
-
after(:each) { File.delete(fn) }
|
14
15
|
|
15
16
|
it 'tails a growing file, line by line' do
|
16
17
|
|
@@ -35,11 +36,6 @@ describe NotifiedTail do
|
|
35
36
|
append(fn, "line with words\n")
|
36
37
|
watcher.join
|
37
38
|
end
|
38
|
-
|
39
|
-
def append(fn, text)
|
40
|
-
File.open(fn, 'a') { |f| f.print(text) }
|
41
|
-
sleep(0.1)
|
42
|
-
end
|
43
39
|
end
|
44
40
|
|
45
41
|
shared_examples 'tail -f -n 9999PB' do
|
@@ -75,5 +71,52 @@ describe NotifiedTail do
|
|
75
71
|
it_behaves_like 'tail -f -n 9999PB'
|
76
72
|
end
|
77
73
|
|
74
|
+
it 'can be stopped before new data is tailed' do
|
75
|
+
File.write(fn, "hello\n")
|
76
|
+
|
77
|
+
thread = Thread.start do
|
78
|
+
notifier = NotifiedTail.new
|
79
|
+
notifier.tail(fn, seek_end: false) do |line|
|
80
|
+
print "saw #{line.inspect}\n"
|
81
|
+
if line == 'hello'
|
82
|
+
Thread.start do
|
83
|
+
expect(notifier.instance_variable_get(:@queue)).to be_nil
|
84
|
+
notifier.stop
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
thread.join
|
91
|
+
end
|
92
|
+
|
93
|
+
it 'can be stopped after new data is tailed (must write to the file)' do
|
94
|
+
thread = Thread.start do
|
95
|
+
notifier = NotifiedTail.new
|
96
|
+
notifier.tail(fn, seek_end: false) do |line|
|
97
|
+
print "saw #{line.inspect}\n"
|
98
|
+
if line == 'there'
|
99
|
+
Thread.start do
|
100
|
+
expect(notifier.instance_variable_get(:@queue)).to_not be_nil
|
101
|
+
notifier.stop
|
102
|
+
File.open(notifier.file_path, 'a'){|f| f.print("\n")}
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
sleep(0.25) # let the notifier start up
|
108
|
+
|
109
|
+
append(fn, "hello\n")
|
110
|
+
sleep(0.5)
|
111
|
+
append(fn, "there\n")
|
112
|
+
|
113
|
+
thread.join
|
114
|
+
end
|
115
|
+
|
116
|
+
def append(fn, text)
|
117
|
+
File.open(fn, 'a') { |f| f.print(text) }
|
118
|
+
sleep(0.1)
|
119
|
+
end
|
120
|
+
|
78
121
|
end
|
79
122
|
end
|