file_series 0.1.0 → 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.
- data/.autotest +5 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +10 -0
- data/VERSION +1 -1
- data/file_series.gemspec +12 -2
- data/lib/file_series.rb +12 -3
- data/spec/file_series_spec.rb +78 -0
- metadata +52 -3
data/.autotest
ADDED
data/Gemfile
CHANGED
@@ -6,6 +6,9 @@ source "http://rubygems.org"
|
|
6
6
|
# Add dependencies to develop your gem here.
|
7
7
|
# Include everything needed to run rake, tests, features, etc.
|
8
8
|
group :development do
|
9
|
+
gem "autotest-standalone"
|
10
|
+
gem "autotest-fsevent"
|
11
|
+
gem "autotest-growl"
|
9
12
|
gem "rspec", "~> 2.8.0"
|
10
13
|
gem "rdoc", "~> 3.12"
|
11
14
|
gem "bundler", "~> 1.0.0"
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,12 @@
|
|
1
1
|
GEM
|
2
2
|
remote: http://rubygems.org/
|
3
3
|
specs:
|
4
|
+
autotest-fsevent (0.2.8)
|
5
|
+
sys-uname
|
6
|
+
autotest-growl (0.2.16)
|
7
|
+
autotest-standalone (4.5.9)
|
4
8
|
diff-lcs (1.1.3)
|
9
|
+
ffi (1.1.0)
|
5
10
|
git (1.2.5)
|
6
11
|
jeweler (1.8.4)
|
7
12
|
bundler (~> 1.0)
|
@@ -20,12 +25,17 @@ GEM
|
|
20
25
|
rspec-expectations (2.8.0)
|
21
26
|
diff-lcs (~> 1.1.2)
|
22
27
|
rspec-mocks (2.8.0)
|
28
|
+
sys-uname (0.9.0)
|
29
|
+
ffi (>= 1.0.0)
|
23
30
|
timecop (0.3.5)
|
24
31
|
|
25
32
|
PLATFORMS
|
26
33
|
ruby
|
27
34
|
|
28
35
|
DEPENDENCIES
|
36
|
+
autotest-fsevent
|
37
|
+
autotest-growl
|
38
|
+
autotest-standalone
|
29
39
|
bundler (~> 1.0.0)
|
30
40
|
jeweler (~> 1.8.4)
|
31
41
|
rdoc (~> 3.12)
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.0
|
data/file_series.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "file_series"
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.2.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Alex Dean"]
|
12
|
-
s.date = "2012-07-
|
12
|
+
s.date = "2012-07-19"
|
13
13
|
s.description = "Automatically start writing to a new file every X seconds without any locking or file moving/renaming."
|
14
14
|
s.email = "alex@crackpot.org"
|
15
15
|
s.extra_rdoc_files = [
|
@@ -17,6 +17,7 @@ Gem::Specification.new do |s|
|
|
17
17
|
"README.rdoc"
|
18
18
|
]
|
19
19
|
s.files = [
|
20
|
+
".autotest",
|
20
21
|
".document",
|
21
22
|
".rspec",
|
22
23
|
"Gemfile",
|
@@ -40,12 +41,18 @@ Gem::Specification.new do |s|
|
|
40
41
|
s.specification_version = 3
|
41
42
|
|
42
43
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
44
|
+
s.add_development_dependency(%q<autotest-standalone>, [">= 0"])
|
45
|
+
s.add_development_dependency(%q<autotest-fsevent>, [">= 0"])
|
46
|
+
s.add_development_dependency(%q<autotest-growl>, [">= 0"])
|
43
47
|
s.add_development_dependency(%q<rspec>, ["~> 2.8.0"])
|
44
48
|
s.add_development_dependency(%q<rdoc>, ["~> 3.12"])
|
45
49
|
s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
|
46
50
|
s.add_development_dependency(%q<jeweler>, ["~> 1.8.4"])
|
47
51
|
s.add_development_dependency(%q<timecop>, ["= 0.3.5"])
|
48
52
|
else
|
53
|
+
s.add_dependency(%q<autotest-standalone>, [">= 0"])
|
54
|
+
s.add_dependency(%q<autotest-fsevent>, [">= 0"])
|
55
|
+
s.add_dependency(%q<autotest-growl>, [">= 0"])
|
49
56
|
s.add_dependency(%q<rspec>, ["~> 2.8.0"])
|
50
57
|
s.add_dependency(%q<rdoc>, ["~> 3.12"])
|
51
58
|
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
@@ -53,6 +60,9 @@ Gem::Specification.new do |s|
|
|
53
60
|
s.add_dependency(%q<timecop>, ["= 0.3.5"])
|
54
61
|
end
|
55
62
|
else
|
63
|
+
s.add_dependency(%q<autotest-standalone>, [">= 0"])
|
64
|
+
s.add_dependency(%q<autotest-fsevent>, [">= 0"])
|
65
|
+
s.add_dependency(%q<autotest-growl>, [">= 0"])
|
56
66
|
s.add_dependency(%q<rspec>, ["~> 2.8.0"])
|
57
67
|
s.add_dependency(%q<rdoc>, ["~> 3.12"])
|
58
68
|
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
data/lib/file_series.rb
CHANGED
@@ -33,13 +33,13 @@ class FileSeries
|
|
33
33
|
@current_ts = nil
|
34
34
|
@filename_prefix = options[:prefix] || DEFAULT_PREFIX
|
35
35
|
@rotate_freq = options[:rotate_every] || DEFAULT_FREQ #seconds
|
36
|
-
@
|
36
|
+
@binary_mode = options[:binary]
|
37
37
|
@separator = options[:separator] || DEFAULT_SEPARATOR
|
38
38
|
end
|
39
39
|
|
40
40
|
# write something to the current log file.
|
41
41
|
def write(message)
|
42
|
-
log_file.write(message + @separator)
|
42
|
+
log_file.write(message.to_s + @separator)
|
43
43
|
end
|
44
44
|
|
45
45
|
# return a File object for the current log file.
|
@@ -65,7 +65,7 @@ class FileSeries
|
|
65
65
|
def rotate(ts=nil)
|
66
66
|
ts ||= this_period
|
67
67
|
@file.close if @file
|
68
|
-
@file = File.open(filename(ts), "a#{'b' if @
|
68
|
+
@file = File.open(filename(ts), "a#{'b' if @binary_mode}")
|
69
69
|
@current_ts = ts
|
70
70
|
end
|
71
71
|
|
@@ -88,4 +88,13 @@ class FileSeries
|
|
88
88
|
end
|
89
89
|
end
|
90
90
|
|
91
|
+
# enumerate over all the writes in a series, across all files.
|
92
|
+
def each
|
93
|
+
complete_files.sort.each do |file|
|
94
|
+
File.open(file,"r#{'b' if @binary_mode}").each_line(@separator) do |raw|
|
95
|
+
yield raw
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
91
100
|
end
|
data/spec/file_series_spec.rb
CHANGED
@@ -38,6 +38,17 @@ describe "FileSeries" do
|
|
38
38
|
|
39
39
|
end
|
40
40
|
|
41
|
+
it "should support binary file writing" do
|
42
|
+
# TODO: need to come up with some sequence which can't be written in non-binary mode.
|
43
|
+
# Trying to write a Marshal'd version of
|
44
|
+
# https://github.com/tedconf/videometrics/blob/83ad528b013ce591ac2500d7317e0904270356f9/spec/controllers/imports_controller_spec.rb#L92
|
45
|
+
# in non-binary mode fails with
|
46
|
+
# Failure/Error: post :record_event, :event => @event
|
47
|
+
# Encoding::UndefinedConversionError:
|
48
|
+
# "\x87" from ASCII-8BIT to UTF-8
|
49
|
+
# Writing in binary mode works fine. How to reproduce that more simply for a test?
|
50
|
+
end
|
51
|
+
|
41
52
|
describe "#write" do
|
42
53
|
it "should call log_file.write with message and separator" do
|
43
54
|
fs = FileSeries.new(:separator=>'...')
|
@@ -100,4 +111,71 @@ describe "FileSeries" do
|
|
100
111
|
end
|
101
112
|
end
|
102
113
|
|
114
|
+
describe "#each" do
|
115
|
+
it "should enumerate all lines in all files in a series" do
|
116
|
+
fs = FileSeries.new(:dir=>test_dir, :rotate_every=>60, :prefix=>'events')
|
117
|
+
|
118
|
+
# write 3 files with consecutive integers.
|
119
|
+
Timecop.freeze(100) do
|
120
|
+
(0..9).each do |i|
|
121
|
+
fs.write i
|
122
|
+
end
|
123
|
+
end
|
124
|
+
Timecop.freeze(160) do
|
125
|
+
(10..19).each do |i|
|
126
|
+
fs.write i
|
127
|
+
end
|
128
|
+
end
|
129
|
+
Timecop.freeze(220) do
|
130
|
+
(20..29).each do |i|
|
131
|
+
fs.write i
|
132
|
+
end
|
133
|
+
end
|
134
|
+
fs.file.flush
|
135
|
+
|
136
|
+
out = []
|
137
|
+
fs.each do |line|
|
138
|
+
out << line
|
139
|
+
end
|
140
|
+
|
141
|
+
out.should == (0..29).to_a.map {|i| i.to_s+"\n" }
|
142
|
+
end
|
143
|
+
|
144
|
+
it "should enumerate all entries in a binary file series" do
|
145
|
+
fs = FileSeries.new(
|
146
|
+
:binary=>true,
|
147
|
+
:separator=>'!~!~!',
|
148
|
+
:dir=>test_dir,
|
149
|
+
:prefix=>'bin',
|
150
|
+
:rotate_every=>60
|
151
|
+
)
|
152
|
+
|
153
|
+
Timecop.freeze(100) do
|
154
|
+
(0..9).each do |i|
|
155
|
+
fs.write Marshal.dump(i)
|
156
|
+
end
|
157
|
+
end
|
158
|
+
Timecop.freeze(160) do
|
159
|
+
(10..19).each do |i|
|
160
|
+
fs.write Marshal.dump(i)
|
161
|
+
end
|
162
|
+
end
|
163
|
+
Timecop.freeze(220) do
|
164
|
+
(20..29).each do |i|
|
165
|
+
fs.write Marshal.dump(i)
|
166
|
+
end
|
167
|
+
end
|
168
|
+
fs.file.flush
|
169
|
+
|
170
|
+
out = []
|
171
|
+
fs.each do |line|
|
172
|
+
out << Marshal.load(line)
|
173
|
+
end
|
174
|
+
|
175
|
+
# note that we don't get the separator, and they're Fixnum not String
|
176
|
+
out.should == (0..29).to_a.map {|i| i }
|
177
|
+
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
103
181
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: file_series
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,8 +9,56 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-07-
|
12
|
+
date: 2012-07-19 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: autotest-standalone
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: autotest-fsevent
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: autotest-growl
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
14
62
|
- !ruby/object:Gem::Dependency
|
15
63
|
name: rspec
|
16
64
|
requirement: !ruby/object:Gem::Requirement
|
@@ -100,6 +148,7 @@ extra_rdoc_files:
|
|
100
148
|
- LICENSE.txt
|
101
149
|
- README.rdoc
|
102
150
|
files:
|
151
|
+
- .autotest
|
103
152
|
- .document
|
104
153
|
- .rspec
|
105
154
|
- Gemfile
|
@@ -127,7 +176,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
127
176
|
version: '0'
|
128
177
|
segments:
|
129
178
|
- 0
|
130
|
-
hash:
|
179
|
+
hash: 2322774718501649979
|
131
180
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
132
181
|
none: false
|
133
182
|
requirements:
|