obuf 1.0.0 → 1.0.1
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/History.txt +4 -0
- data/Rakefile +1 -1
- data/lib/obuf.rb +27 -21
- data/test/test_obuf.rb +2 -0
- metadata +28 -17
data/History.txt
CHANGED
data/Rakefile
CHANGED
@@ -8,7 +8,7 @@ Hoe.spec 'obuf' do | p |
|
|
8
8
|
|
9
9
|
p.readme_file = 'README.rdoc'
|
10
10
|
p.extra_rdoc_files = FileList['*.rdoc'] + FileList['*.txt']
|
11
|
-
p.extra_dev_deps = {"flexmock" => "~> 0.8"
|
11
|
+
p.extra_dev_deps = {"flexmock" => "~> 0.8"}
|
12
12
|
p.clean_globs = File.read(File.dirname(__FILE__) + "/.gitignore").split(/\s/).to_a
|
13
13
|
end
|
14
14
|
|
data/lib/obuf.rb
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
require "tempfile"
|
2
|
+
require "thread" # required for ruby 18
|
2
3
|
|
3
4
|
# An object buffer for Ruby objects. Use it to sequentially store a shitload
|
4
5
|
# of objects on disk and then retreive them one by one. Make sure to call clear when done
|
5
|
-
# with it to discard the stored blob.
|
6
|
-
# (Tracksperanto stores parsed trackers into it)
|
6
|
+
# with it to discard the stored blob.
|
7
7
|
#
|
8
|
-
# a =
|
8
|
+
# a = Obuf.new
|
9
9
|
# parse_big_file do | one_node |
|
10
10
|
# a.push(one_node)
|
11
11
|
# end
|
@@ -17,9 +17,9 @@ require "tempfile"
|
|
17
17
|
#
|
18
18
|
# a.clear # ensure that the file is deleted
|
19
19
|
#
|
20
|
-
# Both reading and writing aim to be threadsafe
|
20
|
+
# Both reading and writing aim to be threadsafe
|
21
21
|
class Obuf
|
22
|
-
VERSION = "1.0.
|
22
|
+
VERSION = "1.0.1"
|
23
23
|
|
24
24
|
include Enumerable
|
25
25
|
|
@@ -31,7 +31,7 @@ class Obuf
|
|
31
31
|
|
32
32
|
def initialize
|
33
33
|
@sem = Mutex.new
|
34
|
-
@store =
|
34
|
+
@store = Tempfile.new("obuf")
|
35
35
|
@store.set_encoding(Encoding::BINARY) if @store.respond_to?(:set_encoding)
|
36
36
|
@store.binmode
|
37
37
|
|
@@ -69,13 +69,15 @@ class Obuf
|
|
69
69
|
|
70
70
|
# Calls close! on the datastore and deletes the objects in it
|
71
71
|
def clear
|
72
|
-
@
|
73
|
-
|
72
|
+
@sem.synchronize do
|
73
|
+
@store.close!
|
74
|
+
@size = 0
|
75
|
+
end
|
74
76
|
end
|
75
77
|
|
76
|
-
# Retreive a
|
77
|
-
def [](
|
78
|
-
|
78
|
+
# Retreive a slice of the enumerable at index
|
79
|
+
def [](slice)
|
80
|
+
slice.respond_to?(:each) ? slice.map{|i| recover_at(i) } : recover_at(slice)
|
79
81
|
end
|
80
82
|
|
81
83
|
private
|
@@ -100,7 +102,7 @@ class Obuf
|
|
100
102
|
# Ensure all data is written before we read it
|
101
103
|
@sem.synchronize { @store.flush }
|
102
104
|
|
103
|
-
iterable = File.open(@store.path, "
|
105
|
+
iterable = File.open(@store.path, "rb")
|
104
106
|
begin
|
105
107
|
yield(iterable)
|
106
108
|
ensure
|
@@ -108,20 +110,24 @@ class Obuf
|
|
108
110
|
end
|
109
111
|
end
|
110
112
|
|
111
|
-
def marshal_object(object_to_store)
|
112
|
-
d = Marshal.dump(object_to_store)
|
113
|
-
end
|
114
|
-
|
115
113
|
def recover_object_from(io)
|
116
114
|
# Up to the tab is the amount of bytes to read
|
117
115
|
demarshal_bytes = io.gets("\t").to_i
|
118
116
|
blob = io.read(demarshal_bytes)
|
119
|
-
|
120
|
-
Marshal.load(blob)
|
117
|
+
demarshal_object(blob)
|
121
118
|
end
|
122
119
|
|
123
|
-
#
|
124
|
-
|
125
|
-
|
120
|
+
# This method is only used internally.
|
121
|
+
# Override this if you need non-default marshalling
|
122
|
+
# (don't forget to also override demarshal_object)
|
123
|
+
def marshal_object(object_to_store)
|
124
|
+
d = Marshal.dump(object_to_store)
|
125
|
+
end
|
126
|
+
|
127
|
+
# This method is only used internally.
|
128
|
+
# Override this if you need non-default demarshalling
|
129
|
+
# (don't forget to also override marshal_object)
|
130
|
+
def demarshal_object(blob)
|
131
|
+
Marshal.load(blob)
|
126
132
|
end
|
127
133
|
end
|
data/test/test_obuf.rb
CHANGED
@@ -2,6 +2,7 @@ require "test/unit"
|
|
2
2
|
require "obuf"
|
3
3
|
require "flexmock"
|
4
4
|
require "flexmock/test_unit"
|
5
|
+
require "stringio"
|
5
6
|
|
6
7
|
# http://redmine.ruby-lang.org/issues/4882
|
7
8
|
# https://github.com/jimweirich/flexmock/issues/4
|
@@ -13,6 +14,7 @@ class FlexMock::PartialMockProxy
|
|
13
14
|
end
|
14
15
|
|
15
16
|
class TestObuf < Test::Unit::TestCase
|
17
|
+
|
16
18
|
def test_accumulator_saves_objs
|
17
19
|
a = Obuf.new
|
18
20
|
values = [3, {:foo => "bar"}, "foo"]
|
metadata
CHANGED
@@ -1,8 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: obuf
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
+
hash: 21
|
4
5
|
prerelease:
|
5
|
-
|
6
|
+
segments:
|
7
|
+
- 1
|
8
|
+
- 0
|
9
|
+
- 1
|
10
|
+
version: 1.0.1
|
6
11
|
platform: ruby
|
7
12
|
authors:
|
8
13
|
- Julik Tarkhanov
|
@@ -10,7 +15,8 @@ autorequire:
|
|
10
15
|
bindir: bin
|
11
16
|
cert_chain: []
|
12
17
|
|
13
|
-
date: 2011-
|
18
|
+
date: 2011-11-20 00:00:00 +01:00
|
19
|
+
default_executable:
|
14
20
|
dependencies:
|
15
21
|
- !ruby/object:Gem::Dependency
|
16
22
|
name: flexmock
|
@@ -20,31 +26,29 @@ dependencies:
|
|
20
26
|
requirements:
|
21
27
|
- - ~>
|
22
28
|
- !ruby/object:Gem::Version
|
29
|
+
hash: 27
|
30
|
+
segments:
|
31
|
+
- 0
|
32
|
+
- 8
|
23
33
|
version: "0.8"
|
24
34
|
type: :development
|
25
35
|
version_requirements: *id001
|
26
36
|
- !ruby/object:Gem::Dependency
|
27
|
-
name:
|
37
|
+
name: hoe
|
28
38
|
prerelease: false
|
29
39
|
requirement: &id002 !ruby/object:Gem::Requirement
|
30
40
|
none: false
|
31
41
|
requirements:
|
32
|
-
- -
|
42
|
+
- - ">="
|
33
43
|
- !ruby/object:Gem::Version
|
34
|
-
|
44
|
+
hash: 35
|
45
|
+
segments:
|
46
|
+
- 2
|
47
|
+
- 9
|
48
|
+
- 4
|
49
|
+
version: 2.9.4
|
35
50
|
type: :development
|
36
51
|
version_requirements: *id002
|
37
|
-
- !ruby/object:Gem::Dependency
|
38
|
-
name: hoe
|
39
|
-
prerelease: false
|
40
|
-
requirement: &id003 !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
|
-
requirements:
|
43
|
-
- - ~>
|
44
|
-
- !ruby/object:Gem::Version
|
45
|
-
version: "2.10"
|
46
|
-
type: :development
|
47
|
-
version_requirements: *id003
|
48
52
|
description: A simple Ruby object buffer. Use this if you need to temporarily store alot of serializable Ruby objects.
|
49
53
|
email:
|
50
54
|
- me@julik.nl
|
@@ -65,6 +69,7 @@ files:
|
|
65
69
|
- lib/obuf.rb
|
66
70
|
- test/test_obuf.rb
|
67
71
|
- .gemtest
|
72
|
+
has_rdoc: true
|
68
73
|
homepage: http://github.com/julik/obuf
|
69
74
|
licenses: []
|
70
75
|
|
@@ -79,17 +84,23 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
79
84
|
requirements:
|
80
85
|
- - ">="
|
81
86
|
- !ruby/object:Gem::Version
|
87
|
+
hash: 3
|
88
|
+
segments:
|
89
|
+
- 0
|
82
90
|
version: "0"
|
83
91
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
84
92
|
none: false
|
85
93
|
requirements:
|
86
94
|
- - ">="
|
87
95
|
- !ruby/object:Gem::Version
|
96
|
+
hash: 3
|
97
|
+
segments:
|
98
|
+
- 0
|
88
99
|
version: "0"
|
89
100
|
requirements: []
|
90
101
|
|
91
102
|
rubyforge_project: obuf
|
92
|
-
rubygems_version: 1.
|
103
|
+
rubygems_version: 1.6.2
|
93
104
|
signing_key:
|
94
105
|
specification_version: 3
|
95
106
|
summary: A simple Ruby object buffer
|