eventmachine-tail 0.6.4 → 0.6.5
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 +7 -0
- data/lib/em/filetail.rb +19 -17
- data/test/test_filetail.rb +24 -7
- metadata +13 -17
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: c548a8a257df50b5a05dd3d0f8c4de8d2e5f49dc
|
4
|
+
data.tar.gz: cac4d6fd51b4a3a0dcb743383f54fb43b7ed4cc5
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 585fd44303c0e66a3842a5adaf47cab658cd6c5921460f5f1dfcd3647c5621d173ca8e49c585d870053c6729ff54aa03182a8cd644996c6c6d7df9267dbea2c9
|
7
|
+
data.tar.gz: 39b8a7cedaad282ab7616cd791b58dd1baea8eb3eb378868aa05b7cf73cb624a9ceb3309281c82d1c3b2812b96568612d38589d332afeb433039e6b59eaf0909
|
data/lib/em/filetail.rb
CHANGED
@@ -35,10 +35,10 @@ EventMachine.kqueue = true if EventMachine.kqueue?
|
|
35
35
|
# See also: EventMachine::FileTail#receive_data
|
36
36
|
class EventMachine::FileTail
|
37
37
|
# Maximum size to read at a time from a single file.
|
38
|
-
CHUNKSIZE = 65536
|
38
|
+
CHUNKSIZE = 65536
|
39
39
|
|
40
40
|
#MAXSLEEP = 2
|
41
|
-
|
41
|
+
|
42
42
|
FORCE_ENCODING = !! (defined? Encoding)
|
43
43
|
|
44
44
|
# The path of the file being tailed
|
@@ -46,7 +46,7 @@ class EventMachine::FileTail
|
|
46
46
|
|
47
47
|
# The current file read position
|
48
48
|
attr_reader :position
|
49
|
-
|
49
|
+
|
50
50
|
# If this tail is closed
|
51
51
|
attr_reader :closed
|
52
52
|
|
@@ -57,11 +57,11 @@ class EventMachine::FileTail
|
|
57
57
|
# Check interval for looking for a file if we are tailing it and it has
|
58
58
|
# gone missing.
|
59
59
|
attr_accessor :missing_file_check_interval
|
60
|
-
|
60
|
+
|
61
61
|
# Tail a file
|
62
62
|
#
|
63
63
|
# * path is a string file path to tail
|
64
|
-
# * startpos is an offset to start tailing the file at. If -1, start at end of
|
64
|
+
# * startpos is an offset to start tailing the file at. If -1, start at end of
|
65
65
|
# file.
|
66
66
|
#
|
67
67
|
# If you want debug messages, run ruby with '-d' or set $DEBUG
|
@@ -102,6 +102,8 @@ class EventMachine::FileTail
|
|
102
102
|
|
103
103
|
EventMachine::next_tick do
|
104
104
|
open
|
105
|
+
next unless @file
|
106
|
+
|
105
107
|
if (startpos == -1)
|
106
108
|
@position = @file.sysseek(0, IO::SEEK_END)
|
107
109
|
# TODO(sissel): if we don't have inotify or kqueue, should we
|
@@ -116,7 +118,7 @@ class EventMachine::FileTail
|
|
116
118
|
end # EventMachine::next_tick
|
117
119
|
end # def initialize
|
118
120
|
|
119
|
-
# This method is called when a tailed file has data read.
|
121
|
+
# This method is called when a tailed file has data read.
|
120
122
|
#
|
121
123
|
# * data - string data read from the file.
|
122
124
|
#
|
@@ -132,7 +134,7 @@ class EventMachine::FileTail
|
|
132
134
|
# @buffer.extract(data).each do |line|
|
133
135
|
# # do something with 'line'
|
134
136
|
# end
|
135
|
-
# end
|
137
|
+
# end
|
136
138
|
public
|
137
139
|
def receive_data(data)
|
138
140
|
if @handler # FileTail.new called with a block
|
@@ -214,13 +216,13 @@ class EventMachine::FileTail
|
|
214
216
|
@file.close if @file
|
215
217
|
end
|
216
218
|
end # def close
|
217
|
-
|
219
|
+
|
218
220
|
# More rubyesque way of checking if this tail is closed
|
219
221
|
public
|
220
222
|
def closed?
|
221
223
|
@closed
|
222
224
|
end
|
223
|
-
|
225
|
+
|
224
226
|
# Watch our file.
|
225
227
|
private
|
226
228
|
def watch
|
@@ -354,19 +356,19 @@ class EventMachine::FileTail
|
|
354
356
|
def read_file_metadata(&block)
|
355
357
|
begin
|
356
358
|
filestat = File.stat(@path)
|
359
|
+
symlink_stat = nil
|
360
|
+
symlink_target = nil
|
361
|
+
|
362
|
+
if filestat.symlink?
|
363
|
+
symlink_stat = File.lstat(@path) rescue nil
|
364
|
+
symlink_target = File.readlink(@path) rescue nil
|
365
|
+
end
|
357
366
|
rescue Errno::ENOENT
|
358
367
|
raise
|
359
368
|
rescue => e
|
360
369
|
@logger.debug("File stat on '#{@path}' failed")
|
361
370
|
on_exception e
|
362
371
|
end
|
363
|
-
symlink_stat = nil
|
364
|
-
symlink_target = nil
|
365
|
-
|
366
|
-
if File.symlink?(@path)
|
367
|
-
symlink_stat = File.lstat(@path) rescue nil
|
368
|
-
symlink_target = File.readlink(@path) rescue nil
|
369
|
-
end
|
370
372
|
|
371
373
|
if block_given?
|
372
374
|
yield filestat, symlink_stat, symlink_target
|
@@ -393,7 +395,7 @@ class EventMachine::FileTail
|
|
393
395
|
@logger.debug "Symlink target changed. Reopening..."
|
394
396
|
@reopen_on_eof = true
|
395
397
|
schedule_next_read
|
396
|
-
end
|
398
|
+
end
|
397
399
|
elsif (filestat.ino != @filestat.ino or filestat.rdev != @filestat.rdev)
|
398
400
|
@logger.debug "Inode or device changed. Reopening..."
|
399
401
|
@logger.debug filestat
|
data/test/test_filetail.rb
CHANGED
@@ -26,11 +26,11 @@ class Reader < EventMachine::FileTail
|
|
26
26
|
@buffer.extract(data).each do |line|
|
27
27
|
@lineno += 1
|
28
28
|
expected = @data.shift
|
29
|
-
@testobj.assert_equal(expected, line,
|
29
|
+
@testobj.assert_equal(expected, line,
|
30
30
|
"Expected '#{expected}' on line #{@lineno}, but got '#{line}'")
|
31
31
|
end # @buffer.extract
|
32
32
|
end # def receive_data
|
33
|
-
|
33
|
+
|
34
34
|
# This effectively tests EOF handling by requiring it to work in order
|
35
35
|
# for the tests to pass.
|
36
36
|
def eof
|
@@ -63,6 +63,23 @@ class TestFileTail < Test::Unit::TestCase
|
|
63
63
|
end # EM.run
|
64
64
|
end # def test_filetail
|
65
65
|
|
66
|
+
def test_filetail_close
|
67
|
+
tmp = Tempfile.new("testfiletail")
|
68
|
+
data = DATA.clone
|
69
|
+
data.each { |i| tmp.puts i }
|
70
|
+
tmp.flush
|
71
|
+
|
72
|
+
EM.run do
|
73
|
+
abort_after_timeout(2)
|
74
|
+
|
75
|
+
ft = EM::file_tail(tmp.path, Reader, -1, self)
|
76
|
+
ft.close
|
77
|
+
timer = EM::PeriodicTimer.new(0.2) do
|
78
|
+
timer.cancel and finish if ft.closed?
|
79
|
+
end
|
80
|
+
end # EM.run
|
81
|
+
end # def test_filetail_close
|
82
|
+
|
66
83
|
def test_filetail_with_seek
|
67
84
|
tmp = Tempfile.new("testfiletail")
|
68
85
|
data = DATA.clone
|
@@ -86,7 +103,7 @@ class TestFileTail < Test::Unit::TestCase
|
|
86
103
|
EM::file_tail(tmp.path) do |filetail, line|
|
87
104
|
lineno += 1
|
88
105
|
expected = data.shift
|
89
|
-
assert_equal(expected, line,
|
106
|
+
assert_equal(expected, line,
|
90
107
|
"Expected '#{expected}' on line #{@lineno}, but got '#{line}'")
|
91
108
|
finish if data.length == 0
|
92
109
|
end
|
@@ -120,7 +137,7 @@ class TestFileTail < Test::Unit::TestCase
|
|
120
137
|
lineno += 1
|
121
138
|
expected = data.shift
|
122
139
|
#puts "Got #{lineno}: #{line}"
|
123
|
-
assert_equal(expected, line,
|
140
|
+
assert_equal(expected, line,
|
124
141
|
"Expected '#{expected}' on line #{lineno}, but got '#{line}'")
|
125
142
|
finish if data.length == 0
|
126
143
|
|
@@ -176,7 +193,7 @@ class TestFileTail < Test::Unit::TestCase
|
|
176
193
|
lineno += 1
|
177
194
|
expected = data.shift
|
178
195
|
puts "Got #{lineno}: #{line}" if $debug
|
179
|
-
assert_equal(expected, line,
|
196
|
+
assert_equal(expected, line,
|
180
197
|
"Expected '#{expected}' on line #{lineno}, but got '#{line}'")
|
181
198
|
finish if data.length == 0
|
182
199
|
|
@@ -208,7 +225,7 @@ class TestFileTail < Test::Unit::TestCase
|
|
208
225
|
File.delete(f.path)
|
209
226
|
end
|
210
227
|
end # def test_filetail_tracks_renames
|
211
|
-
|
228
|
+
|
212
229
|
def test_encoding
|
213
230
|
return if RUBY_VERSION < '1.9.0'
|
214
231
|
tmp = Tempfile.new("testfiletail")
|
@@ -217,7 +234,7 @@ class TestFileTail < Test::Unit::TestCase
|
|
217
234
|
abort_after_timeout(1)
|
218
235
|
|
219
236
|
EM::file_tail(tmp.path) do |filetail, line|
|
220
|
-
assert_equal(Encoding.default_external, line.encoding,
|
237
|
+
assert_equal(Encoding.default_external, line.encoding,
|
221
238
|
"Expected the read data to have the encoding specified in Encoding.default_external (#{Encoding.default_external}, but was #{line.encoding})")
|
222
239
|
finish
|
223
240
|
end
|
metadata
CHANGED
@@ -1,30 +1,27 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: eventmachine-tail
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
5
|
-
prerelease:
|
4
|
+
version: 0.6.5
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Jordan Sissel
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2016-01-15 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: eventmachine
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - '>='
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '0'
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - '>='
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: '0'
|
30
27
|
description: Add file 'tail' implemented with EventMachine. Also includes a 'glob
|
@@ -36,42 +33,41 @@ executables:
|
|
36
33
|
extensions: []
|
37
34
|
extra_rdoc_files: []
|
38
35
|
files:
|
39
|
-
- lib/eventmachine-tail.rb
|
40
36
|
- lib/em/globwatcher.rb
|
41
37
|
- lib/em/filetail.rb
|
42
|
-
-
|
38
|
+
- lib/eventmachine-tail.rb
|
39
|
+
- samples/glob-tail.rb
|
43
40
|
- samples/globwatch.rb
|
44
41
|
- samples/tail-with-block.rb
|
45
|
-
- samples/
|
42
|
+
- samples/tail.rb
|
43
|
+
- test/alltests.rb
|
46
44
|
- test/test_filetail.rb
|
47
45
|
- test/test_glob.rb
|
48
46
|
- test/testcase_helpers.rb
|
49
|
-
- test/alltests.rb
|
50
47
|
- bin/emtail
|
51
48
|
- bin/rtail
|
52
49
|
homepage: http://code.google.com/p/semicomplete/wiki/EventMachineTail
|
53
50
|
licenses: []
|
51
|
+
metadata: {}
|
54
52
|
post_install_message:
|
55
53
|
rdoc_options: []
|
56
54
|
require_paths:
|
57
55
|
- lib
|
58
56
|
- lib
|
59
57
|
required_ruby_version: !ruby/object:Gem::Requirement
|
60
|
-
none: false
|
61
58
|
requirements:
|
62
|
-
- -
|
59
|
+
- - '>='
|
63
60
|
- !ruby/object:Gem::Version
|
64
61
|
version: '0'
|
65
62
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
66
|
-
none: false
|
67
63
|
requirements:
|
68
|
-
- -
|
64
|
+
- - '>='
|
69
65
|
- !ruby/object:Gem::Version
|
70
66
|
version: '0'
|
71
67
|
requirements: []
|
72
68
|
rubyforge_project:
|
73
|
-
rubygems_version:
|
69
|
+
rubygems_version: 2.0.14
|
74
70
|
signing_key:
|
75
|
-
specification_version:
|
71
|
+
specification_version: 4
|
76
72
|
summary: eventmachine tail - a file tail implementation with glob support
|
77
73
|
test_files: []
|