filewatch-ext 0.1.4 → 0.2.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 +4 -4
- metadata +12 -57
- data/lib/filewatch/ext/xlstail.rb +0 -153
- data/lib/filewatch/ext/xlsxtail.rb +0 -151
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cc1631829006d12daf285a4bb9c69a0cd10046b0
|
4
|
+
data.tar.gz: f7c888de7dbdcef2e7b9fe4feccb0d40a779b024
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8b1834ba248c5ad86782e84e6ae298e943961b08f3ad7c08c6f79b41ffa6b7d302404f7c3fc0372028660ea3e414d22f1518ebcc72b26ecf4f9b756aaff6d50c
|
7
|
+
data.tar.gz: 1da4321b826abfed34c76af4a3e6d23a026b23c5fe8aa66e5611c17eb2dfa49e17106e8958e49495a60c56b3337650f36d854d0a9b077a6e9a3327e2cfdf42f8
|
metadata
CHANGED
@@ -1,84 +1,40 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: filewatch-ext
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
-
|
7
|
+
- dduft
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-12-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: filewatch
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - ~>
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: 0.5.1
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - ~>
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 0.5.1
|
27
|
-
|
28
|
-
name: simple_xlsx_reader
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - ~>
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: 0.9.8
|
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.8
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: axlsx
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - ~>
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: 2.0.1
|
48
|
-
type: :runtime
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - ~>
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: 2.0.1
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: spreadsheet
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - ~>
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: 0.9.7
|
62
|
-
type: :runtime
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - ~>
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: 0.9.7
|
69
|
-
description: Extensions for ruby-filewatcher, like xls, xlsx
|
27
|
+
description: Extensions for ruby-filewatcher
|
70
28
|
email:
|
71
29
|
- dietmar@signifydata.com
|
72
30
|
executables: []
|
73
31
|
extensions: []
|
74
32
|
extra_rdoc_files: []
|
75
33
|
files:
|
76
|
-
- lib/filewatch/winhelper.rb
|
77
|
-
- lib/filewatch/ext/tailbase.rb
|
78
|
-
- lib/filewatch/ext/filetail.rb
|
79
|
-
- lib/filewatch/ext/xlsxtail.rb
|
80
|
-
- lib/filewatch/ext/xlstail.rb
|
81
34
|
- lib/JRubyFileExtension.jar
|
35
|
+
- lib/filewatch/ext/filetail.rb
|
36
|
+
- lib/filewatch/ext/tailbase.rb
|
37
|
+
- lib/filewatch/winhelper.rb
|
82
38
|
homepage: https://bitbucket.org/signify/ruby-filewatch-ext
|
83
39
|
licenses:
|
84
40
|
- MIT
|
@@ -90,19 +46,18 @@ require_paths:
|
|
90
46
|
- lib
|
91
47
|
required_ruby_version: !ruby/object:Gem::Requirement
|
92
48
|
requirements:
|
93
|
-
- -
|
49
|
+
- - ">="
|
94
50
|
- !ruby/object:Gem::Version
|
95
51
|
version: '0'
|
96
52
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
97
53
|
requirements:
|
98
|
-
- -
|
54
|
+
- - ">="
|
99
55
|
- !ruby/object:Gem::Version
|
100
56
|
version: '0'
|
101
57
|
requirements: []
|
102
58
|
rubyforge_project:
|
103
|
-
rubygems_version: 2.
|
59
|
+
rubygems_version: 2.2.2
|
104
60
|
signing_key:
|
105
61
|
specification_version: 4
|
106
62
|
summary: filewatch extensions
|
107
63
|
test_files: []
|
108
|
-
has_rdoc:
|
@@ -1,153 +0,0 @@
|
|
1
|
-
require "filewatch/ext/tailbase"
|
2
|
-
require "spreadsheet"
|
3
|
-
|
4
|
-
module FileWatch::Ext
|
5
|
-
class XlsTail < FileWatch::Ext::TailBase
|
6
|
-
|
7
|
-
public
|
8
|
-
def initialize(opts={})
|
9
|
-
@pos = {}
|
10
|
-
super
|
11
|
-
end
|
12
|
-
|
13
|
-
public
|
14
|
-
def subscribe(&block)
|
15
|
-
# subscribe(stat_interval = 1, discover_interval = 5, &block)
|
16
|
-
@watch.subscribe(@opts[:stat_interval],
|
17
|
-
@opts[:discover_interval]) do |event, path|
|
18
|
-
case event
|
19
|
-
when :create, :create_initial
|
20
|
-
if @files.member?(path)
|
21
|
-
@logger.debug("#{event} for #{path}: already exists in @files")
|
22
|
-
next
|
23
|
-
end
|
24
|
-
if _open_file(path, event)
|
25
|
-
_read_file(path, &block)
|
26
|
-
end
|
27
|
-
when :modify
|
28
|
-
@logger.debug(":modify for #{path}")
|
29
|
-
when :delete
|
30
|
-
@logger.debug(":delete for #{path}, deleted from @files")
|
31
|
-
|
32
|
-
_progressdb_delete(path, &block) if @opts[:progressdb] && @opts[:progressdb_del]
|
33
|
-
|
34
|
-
@files.delete(path)
|
35
|
-
_sincedb_delete(path)
|
36
|
-
@statcache.delete(path)
|
37
|
-
else
|
38
|
-
@logger.warn("unknown event type #{event} for #{path}")
|
39
|
-
end
|
40
|
-
end # @watch.subscribe
|
41
|
-
end # def each
|
42
|
-
|
43
|
-
private
|
44
|
-
def get_size(path)
|
45
|
-
workbook = Spreadsheet.open(path)
|
46
|
-
pos = 0
|
47
|
-
workbook.worksheets.each do |worksheet|
|
48
|
-
pos += worksheet.rows.length
|
49
|
-
end
|
50
|
-
@size = pos
|
51
|
-
end
|
52
|
-
|
53
|
-
private
|
54
|
-
def _open_file(path, event)
|
55
|
-
@logger.debug("_open_file: #{path}: opening")
|
56
|
-
begin
|
57
|
-
#Spreadsheet.client_encoding = 'UTF-8'
|
58
|
-
@files[path] = Spreadsheet.open(path)
|
59
|
-
rescue
|
60
|
-
# don't emit this message too often. if a file that we can't
|
61
|
-
# read is changing a lot, we'll try to open it more often,
|
62
|
-
# and might be spammy.
|
63
|
-
now = Time.now.to_i
|
64
|
-
if now - @lastwarn[path] > OPEN_WARN_INTERVAL
|
65
|
-
@logger.warn("failed to open #{path}: #{$!}")
|
66
|
-
@lastwarn[path] = now
|
67
|
-
else
|
68
|
-
@logger.debug("(warn supressed) failed to open #{path}: #{$!}")
|
69
|
-
end
|
70
|
-
#@files.delete(path)
|
71
|
-
return false
|
72
|
-
end
|
73
|
-
|
74
|
-
stat = File::Stat.new(path)
|
75
|
-
size = get_size(path)
|
76
|
-
|
77
|
-
if @iswindows
|
78
|
-
fileId = Winhelper.GetWindowsUniqueFileIdentifier(path)
|
79
|
-
inode = [fileId, stat.dev_major, stat.dev_minor]
|
80
|
-
else
|
81
|
-
inode = [stat.ino.to_s, stat.dev_major, stat.dev_minor]
|
82
|
-
end
|
83
|
-
|
84
|
-
@statcache[path] = inode
|
85
|
-
|
86
|
-
if @sincedb.member?(inode)
|
87
|
-
last_size = @sincedb[inode][:pos]
|
88
|
-
@logger.debug("#{path}: sincedb last value #{@sincedb[inode]}, cur size #{size}")
|
89
|
-
if last_size <= size
|
90
|
-
@logger.debug("#{path}: sincedb: seeking to #{last_size}")
|
91
|
-
@pos[path] = last_size
|
92
|
-
else
|
93
|
-
@logger.debug("#{path}: last value size is greater than current value, starting over")
|
94
|
-
@sincedb[inode] = {:size => size, :pos => 0}
|
95
|
-
end
|
96
|
-
elsif event == :create_initial && @files[path]
|
97
|
-
# TODO(sissel): Allow starting at beginning of the file.
|
98
|
-
if @opts[:start_new_files_at] == :beginning
|
99
|
-
@logger.debug("#{path}: initial create, no sincedb, seeking to beginning of file")
|
100
|
-
@pos[path] = 0
|
101
|
-
@sincedb[inode] = {:size => size, :pos => 0}
|
102
|
-
else
|
103
|
-
# seek to end
|
104
|
-
@logger.debug("#{path}: initial create, no sincedb, seeking to end #{size}")
|
105
|
-
@pos[path] = size
|
106
|
-
@sincedb[inode] = {:size => size, :pos => size}
|
107
|
-
end
|
108
|
-
elsif event == :create
|
109
|
-
@pos[path] = 0
|
110
|
-
@sincedb[inode] = {:size => size, :pos => 0}
|
111
|
-
else
|
112
|
-
@logger.debug("#{path}: staying at position 0, no sincedb")
|
113
|
-
end
|
114
|
-
|
115
|
-
return true
|
116
|
-
end # def _open_file
|
117
|
-
|
118
|
-
private
|
119
|
-
def _read_file(path, &block)
|
120
|
-
changed = false
|
121
|
-
pos = 0
|
122
|
-
|
123
|
-
worksheets = @files[path].worksheets
|
124
|
-
|
125
|
-
worksheets.each_with_index do |worksheet, index_sheet|
|
126
|
-
|
127
|
-
worksheet.each_with_index do |row, index_row|
|
128
|
-
pos += 1
|
129
|
-
|
130
|
-
if pos > @pos[path]
|
131
|
-
changed = true
|
132
|
-
|
133
|
-
sheet_name = worksheet.name.empty? ? "Sheet#{index_sheet+1}" : worksheet.name
|
134
|
-
|
135
|
-
if pos == @size #end of file is reached
|
136
|
-
data = {:row => row, :wsname => sheet_name, :eof => true}
|
137
|
-
else
|
138
|
-
data = {:row => row, :wsname => sheet_name, :eof => false}
|
139
|
-
end
|
140
|
-
|
141
|
-
yield(path, data, :log)
|
142
|
-
|
143
|
-
@pos[path] = pos
|
144
|
-
@sincedb[@statcache[path]][:pos] = pos
|
145
|
-
_check_sincedb(false, path, &block)
|
146
|
-
end
|
147
|
-
end
|
148
|
-
end
|
149
|
-
_check_sincedb(true, path, &block) if changed
|
150
|
-
end # def _read_file
|
151
|
-
|
152
|
-
end # class Tail
|
153
|
-
end # module FileWatch
|
@@ -1,151 +0,0 @@
|
|
1
|
-
require "filewatch/ext/tailbase"
|
2
|
-
require "simple_xlsx_reader"
|
3
|
-
|
4
|
-
module FileWatch::Ext
|
5
|
-
class XlsxTail < FileWatch::Ext::TailBase
|
6
|
-
|
7
|
-
public
|
8
|
-
def initialize(opts={})
|
9
|
-
@pos = {}
|
10
|
-
super
|
11
|
-
end
|
12
|
-
|
13
|
-
public
|
14
|
-
def subscribe(&block)
|
15
|
-
# subscribe(stat_interval = 1, discover_interval = 5, &block)
|
16
|
-
@watch.subscribe(@opts[:stat_interval],
|
17
|
-
@opts[:discover_interval]) do |event, path|
|
18
|
-
case event
|
19
|
-
when :create, :create_initial
|
20
|
-
if @files.member?(path)
|
21
|
-
@logger.debug("#{event} for #{path}: already exists in @files")
|
22
|
-
next
|
23
|
-
end
|
24
|
-
if _open_file(path, event)
|
25
|
-
_read_file(path, &block)
|
26
|
-
end
|
27
|
-
when :modify
|
28
|
-
@logger.debug(":modify for #{path}")
|
29
|
-
when :delete
|
30
|
-
@logger.debug(":delete for #{path}, deleted from @files")
|
31
|
-
|
32
|
-
_progressdb_delete(path, &block) if @opts[:progressdb] && @opts[:progressdb_del]
|
33
|
-
|
34
|
-
@files.delete(path)
|
35
|
-
_sincedb_delete(path)
|
36
|
-
@statcache.delete(path)
|
37
|
-
else
|
38
|
-
@logger.warn("unknown event type #{event} for #{path}")
|
39
|
-
end
|
40
|
-
end # @watch.subscribe
|
41
|
-
end # def each
|
42
|
-
|
43
|
-
private
|
44
|
-
def get_size(path)
|
45
|
-
doc = SimpleXlsxReader.open(path)
|
46
|
-
pos = 0
|
47
|
-
doc.sheets.each do |worksheet|
|
48
|
-
pos += worksheet.rows.length
|
49
|
-
end
|
50
|
-
@size = pos
|
51
|
-
end
|
52
|
-
|
53
|
-
private
|
54
|
-
def _open_file(path, event)
|
55
|
-
@logger.debug("_open_file: #{path}: opening")
|
56
|
-
begin
|
57
|
-
@files[path] = SimpleXlsxReader.open(path)
|
58
|
-
rescue
|
59
|
-
# don't emit this message too often. if a file that we can't
|
60
|
-
# read is changing a lot, we'll try to open it more often,
|
61
|
-
# and might be spammy.
|
62
|
-
now = Time.now.to_i
|
63
|
-
if now - @lastwarn[path] > OPEN_WARN_INTERVAL
|
64
|
-
@logger.warn("failed to open #{path}: #{$!}")
|
65
|
-
@lastwarn[path] = now
|
66
|
-
else
|
67
|
-
@logger.debug("(warn supressed) failed to open #{path}: #{$!}")
|
68
|
-
end
|
69
|
-
#@files.delete(path)
|
70
|
-
return false
|
71
|
-
end
|
72
|
-
|
73
|
-
stat = File::Stat.new(path)
|
74
|
-
size = get_size(path)
|
75
|
-
|
76
|
-
if @iswindows
|
77
|
-
fileId = Winhelper.GetWindowsUniqueFileIdentifier(path)
|
78
|
-
inode = [fileId, stat.dev_major, stat.dev_minor]
|
79
|
-
else
|
80
|
-
inode = [stat.ino.to_s, stat.dev_major, stat.dev_minor]
|
81
|
-
end
|
82
|
-
|
83
|
-
@statcache[path] = inode
|
84
|
-
|
85
|
-
if @sincedb.member?(inode)
|
86
|
-
last_size = @sincedb[inode][:pos]
|
87
|
-
@logger.debug("#{path}: sincedb last value #{@sincedb[inode]}, cur size #{size}")
|
88
|
-
if last_size <= size
|
89
|
-
@logger.debug("#{path}: sincedb: seeking to #{last_size}")
|
90
|
-
@pos[path] = last_size
|
91
|
-
else
|
92
|
-
@logger.debug("#{path}: last value size is greater than current value, starting over")
|
93
|
-
@sincedb[inode] = {:size => size, :pos => 0}
|
94
|
-
end
|
95
|
-
elsif event == :create_initial && @files[path]
|
96
|
-
# TODO(sissel): Allow starting at beginning of the file.
|
97
|
-
if @opts[:start_new_files_at] == :beginning
|
98
|
-
@logger.debug("#{path}: initial create, no sincedb, seeking to beginning of file")
|
99
|
-
@pos[path] = 0
|
100
|
-
@sincedb[inode] = {:size => size, :pos => 0}
|
101
|
-
else
|
102
|
-
# seek to end
|
103
|
-
@logger.debug("#{path}: initial create, no sincedb, seeking to end #{size}")
|
104
|
-
@pos[path] = size
|
105
|
-
@sincedb[inode] = {:size => size, :pos => size}
|
106
|
-
end
|
107
|
-
elsif event == :create
|
108
|
-
@pos[path] = 0
|
109
|
-
@sincedb[inode] = {:size => size, :pos => 0}
|
110
|
-
else
|
111
|
-
@logger.debug("#{path}: staying at position 0, no sincedb")
|
112
|
-
end
|
113
|
-
|
114
|
-
return true
|
115
|
-
end # def _open_file
|
116
|
-
|
117
|
-
private
|
118
|
-
def _read_file(path, &block)
|
119
|
-
changed = false
|
120
|
-
pos = 0
|
121
|
-
|
122
|
-
worksheets = @files[path].sheets
|
123
|
-
|
124
|
-
worksheets.each_with_index do |worksheet, index_sheet|
|
125
|
-
|
126
|
-
worksheet.rows.each_with_index do |row, index_row|
|
127
|
-
pos += 1
|
128
|
-
|
129
|
-
if pos > @pos[path]
|
130
|
-
changed = true
|
131
|
-
sheet_name = worksheet.name.empty? ? "Sheet#{index_sheet+1}" : worksheet.name
|
132
|
-
|
133
|
-
if pos == @size #end of file is reached
|
134
|
-
data = {:row => row, :wsname => sheet_name, :eof => true}
|
135
|
-
else
|
136
|
-
data = {:row => row, :wsname => sheet_name, :eof => false}
|
137
|
-
end
|
138
|
-
|
139
|
-
yield(path, data, :log)
|
140
|
-
|
141
|
-
@pos[path] = pos
|
142
|
-
@sincedb[@statcache[path]][:pos] = pos
|
143
|
-
_check_sincedb(false, path, &block)
|
144
|
-
end
|
145
|
-
end
|
146
|
-
end
|
147
|
-
_check_sincedb(true, path, &block) if changed
|
148
|
-
end # def _read_file
|
149
|
-
|
150
|
-
end # class Tail
|
151
|
-
end # module FileWatch
|