obuf 1.2.0 → 1.3.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: fc239f32a9cde898a530806bbbb6906b17776b8f0b07fe7e4eec030faec31437
4
+ data.tar.gz: e9027146f1aada7f15f56f1cd70e31183e0394983352e1dc8790b67ae1b89a9b
5
+ SHA512:
6
+ metadata.gz: eadd96014ba7b94ecce3ee76a68184e41b49028bc0c78b35e346f76c1c7ee80945633411109b01c020d9b38ef10de004a5be3ed2a6f21e967e0b8047a0ba48e0
7
+ data.tar.gz: 759e120b23fbd309812f4c8e93ca73a082249c1a9f5de6d6fd5c6123574a267b264c0d425c3d1e90e6c86c387eb95a5d1d550e8c28a2ae09734775f6e55c504e
data/History.txt CHANGED
@@ -1,3 +1,8 @@
1
+ === 1.3.0 / 2026-10-02
2
+
3
+ * Make Obuf usable from within Ractors (Ruby 4.0+)
4
+ * Replace Jeweler with a plain gemspec
5
+
1
6
  === 1.2.0 / 2015-04-17
2
7
 
3
8
  * Add Obuf::Lens to provide access to externally managed IO objects and files
data/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # obuf
2
2
 
3
+ [![Build Status](https://travis-ci.org/julik/obuf.svg?branch=master)](https://travis-ci.org/julik/obuf)
4
+
3
5
  A simple Ruby object buffer. Use this if you need to temporarily store alot of serializable Ruby objects.
4
6
 
5
7
  obuf = Obuf.new
data/lib/obuf/lens.rb CHANGED
@@ -1,8 +1,10 @@
1
+ # shareable_constant_value: literal
1
2
  require 'thread'
2
3
 
3
4
  # Provides a per-object iterator on top of any IO object or pipe
4
5
  class Obuf::Lens
5
6
  include Enumerable
7
+ NothingToRecover = Class.new(StandardError)
6
8
 
7
9
  DELIM = "\t"
8
10
  END_RECORD = "\n"
@@ -32,7 +34,10 @@ class Obuf::Lens
32
34
  skip_bytes = @io.gets("\t").to_i
33
35
  @io.seek(@io.pos + skip_bytes + 1)
34
36
  end
37
+
35
38
  recover_object
39
+ rescue NothingToRecover # TODO: we need to honor this exception in the future
40
+ nil
36
41
  end
37
42
 
38
43
  # Recover the object at the current position in the IO. Returns +nil+
@@ -42,14 +47,17 @@ class Obuf::Lens
42
47
  demarshal_bytes = @io.gets("\t").to_i
43
48
 
44
49
  # When at end of IO return nil
45
- return nil if demarshal_bytes == 0
50
+ raise NothingToRecover if demarshal_bytes.zero?
46
51
 
47
52
  blob = @io.read(demarshal_bytes)
48
53
  demarshal_object(blob)
49
54
  end
50
55
 
51
56
  def each
52
- yield(recover_object) until @io.eof?
57
+ begin
58
+ loop { yield(recover_object) }
59
+ rescue NothingToRecover
60
+ end
53
61
  end
54
62
 
55
63
  private
data/lib/obuf.rb CHANGED
@@ -19,7 +19,7 @@ require "thread" # required for ruby 18
19
19
  #
20
20
  # Both reading and writing aim to be threadsafe
21
21
  class Obuf
22
- VERSION = "1.2.0"
22
+ VERSION = "1.3.0"
23
23
  require File.dirname(__FILE__) + "/obuf/lens"
24
24
  require File.dirname(__FILE__) + "/obuf/protected_lens"
25
25
 
metadata CHANGED
@@ -1,80 +1,70 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: obuf
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
5
- prerelease:
4
+ version: 1.3.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Julik Tarkhanov
9
- autorequire:
10
8
  bindir: bin
11
9
  cert_chain: []
12
- date: 2015-04-17 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
13
11
  dependencies:
14
12
  - !ruby/object:Gem::Dependency
15
13
  name: bundler
16
14
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
15
  requirements:
19
- - - ! '>='
16
+ - - ">="
20
17
  - !ruby/object:Gem::Version
21
18
  version: '0'
22
19
  type: :development
23
20
  prerelease: false
24
21
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
22
  requirements:
27
- - - ! '>='
23
+ - - ">="
28
24
  - !ruby/object:Gem::Version
29
25
  version: '0'
30
26
  - !ruby/object:Gem::Dependency
31
- name: flexmock
27
+ name: rake
32
28
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
29
  requirements:
35
- - - ~>
30
+ - - ">="
36
31
  - !ruby/object:Gem::Version
37
- version: '0.8'
32
+ version: '0'
38
33
  type: :development
39
34
  prerelease: false
40
35
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
36
  requirements:
43
- - - ~>
37
+ - - ">="
44
38
  - !ruby/object:Gem::Version
45
- version: '0.8'
39
+ version: '0'
46
40
  - !ruby/object:Gem::Dependency
47
- name: rake
41
+ name: test-unit
48
42
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
43
  requirements:
51
- - - ! '>='
44
+ - - ">="
52
45
  - !ruby/object:Gem::Version
53
46
  version: '0'
54
47
  type: :development
55
48
  prerelease: false
56
49
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
50
  requirements:
59
- - - ! '>='
51
+ - - ">="
60
52
  - !ruby/object:Gem::Version
61
53
  version: '0'
62
54
  - !ruby/object:Gem::Dependency
63
- name: jeweler
55
+ name: flexmock
64
56
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
57
  requirements:
67
- - - '='
58
+ - - ">="
68
59
  - !ruby/object:Gem::Version
69
- version: 1.8.4
60
+ version: '0'
70
61
  type: :development
71
62
  prerelease: false
72
63
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
64
  requirements:
75
- - - '='
65
+ - - ">="
76
66
  - !ruby/object:Gem::Version
77
- version: 1.8.4
67
+ version: '0'
78
68
  description: Stores marshaled temporary objects on-disk in a simple Enumerable
79
69
  email: me@julik.nl
80
70
  executables: []
@@ -82,43 +72,30 @@ extensions: []
82
72
  extra_rdoc_files:
83
73
  - README.md
84
74
  files:
85
- - .autotest
86
- - .travis.yml
87
- - Gemfile
88
75
  - History.txt
89
76
  - README.md
90
- - Rakefile
91
77
  - lib/obuf.rb
92
78
  - lib/obuf/lens.rb
93
79
  - lib/obuf/protected_lens.rb
94
- - obuf.gemspec
95
- - test/test_obuf.rb
96
- homepage: http://github.com/julik/obuf
80
+ homepage: https://github.com/julik/obuf
97
81
  licenses:
98
82
  - MIT
99
- post_install_message:
83
+ metadata: {}
100
84
  rdoc_options: []
101
85
  require_paths:
102
86
  - lib
103
87
  required_ruby_version: !ruby/object:Gem::Requirement
104
- none: false
105
88
  requirements:
106
- - - ! '>='
89
+ - - ">="
107
90
  - !ruby/object:Gem::Version
108
- version: '0'
109
- segments:
110
- - 0
111
- hash: 4056659205467737583
91
+ version: '2.6'
112
92
  required_rubygems_version: !ruby/object:Gem::Requirement
113
- none: false
114
93
  requirements:
115
- - - ! '>='
94
+ - - ">="
116
95
  - !ruby/object:Gem::Version
117
96
  version: '0'
118
97
  requirements: []
119
- rubyforge_project:
120
- rubygems_version: 1.8.23.2
121
- signing_key:
122
- specification_version: 3
98
+ rubygems_version: 4.0.3
99
+ specification_version: 4
123
100
  summary: Ruby disk-backed object buffer
124
101
  test_files: []
data/.autotest DELETED
@@ -1,23 +0,0 @@
1
- # -*- ruby -*-
2
-
3
- require 'autotest/restart'
4
-
5
- # Autotest.add_hook :initialize do |at|
6
- # at.extra_files << "../some/external/dependency.rb"
7
- #
8
- # at.libs << ":../some/external"
9
- #
10
- # at.add_exception 'vendor'
11
- #
12
- # at.add_mapping(/dependency.rb/) do |f, _|
13
- # at.files_matching(/test_.*rb$/)
14
- # end
15
- #
16
- # %w(TestA TestB).each do |klass|
17
- # at.extra_class_map[klass] = "test/test_misc.rb"
18
- # end
19
- # end
20
-
21
- # Autotest.add_hook :run_command do |at|
22
- # system "rake build"
23
- # end
data/.travis.yml DELETED
@@ -1,8 +0,0 @@
1
- rvm:
2
- - 1.8.7
3
- - 1.9.3
4
- - 2.0.0
5
- - 2.1.1
6
- - 2.2.0
7
- - jruby
8
- - ruby-head
data/Gemfile DELETED
@@ -1,8 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- group :development do
4
- gem "bundler"
5
- gem "flexmock", "~>0.8"
6
- gem "rake"
7
- gem "jeweler", '1.8.4' # Last one without the stupid nokogiri dependency
8
- end
data/Rakefile DELETED
@@ -1,27 +0,0 @@
1
- # -*- ruby -*-
2
- require 'rubygems'
3
- require 'jeweler'
4
- require './lib/obuf'
5
-
6
- Jeweler::Tasks.new do |gem|
7
- gem.version = Obuf::VERSION
8
- gem.name = "obuf"
9
- gem.summary = "Ruby disk-backed object buffer"
10
- gem.description = "Stores marshaled temporary objects on-disk in a simple Enumerable"
11
- gem.email = "me@julik.nl"
12
- gem.homepage = "http://github.com/julik/obuf"
13
- gem.authors = ["Julik Tarkhanov"]
14
- gem.license = 'MIT'
15
- end
16
-
17
- Jeweler::RubygemsDotOrgTasks.new
18
-
19
- require 'rake/testtask'
20
- desc "Run all tests"
21
- Rake::TestTask.new("test") do |t|
22
- t.libs << "test"
23
- t.pattern = 'test/**/test_*.rb'
24
- t.verbose = true
25
- end
26
-
27
- task :default => [ :test ]
data/obuf.gemspec DELETED
@@ -1,58 +0,0 @@
1
- # Generated by jeweler
2
- # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
- # -*- encoding: utf-8 -*-
5
-
6
- Gem::Specification.new do |s|
7
- s.name = "obuf"
8
- s.version = "1.2.0"
9
-
10
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["Julik Tarkhanov"]
12
- s.date = "2015-04-17"
13
- s.description = "Stores marshaled temporary objects on-disk in a simple Enumerable"
14
- s.email = "me@julik.nl"
15
- s.extra_rdoc_files = [
16
- "README.md"
17
- ]
18
- s.files = [
19
- ".autotest",
20
- ".travis.yml",
21
- "Gemfile",
22
- "History.txt",
23
- "README.md",
24
- "Rakefile",
25
- "lib/obuf.rb",
26
- "lib/obuf/lens.rb",
27
- "lib/obuf/protected_lens.rb",
28
- "obuf.gemspec",
29
- "test/test_obuf.rb"
30
- ]
31
- s.homepage = "http://github.com/julik/obuf"
32
- s.licenses = ["MIT"]
33
- s.require_paths = ["lib"]
34
- s.rubygems_version = "1.8.23.2"
35
- s.summary = "Ruby disk-backed object buffer"
36
-
37
- if s.respond_to? :specification_version then
38
- s.specification_version = 3
39
-
40
- if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
41
- s.add_development_dependency(%q<bundler>, [">= 0"])
42
- s.add_development_dependency(%q<flexmock>, ["~> 0.8"])
43
- s.add_development_dependency(%q<rake>, [">= 0"])
44
- s.add_development_dependency(%q<jeweler>, ["= 1.8.4"])
45
- else
46
- s.add_dependency(%q<bundler>, [">= 0"])
47
- s.add_dependency(%q<flexmock>, ["~> 0.8"])
48
- s.add_dependency(%q<rake>, [">= 0"])
49
- s.add_dependency(%q<jeweler>, ["= 1.8.4"])
50
- end
51
- else
52
- s.add_dependency(%q<bundler>, [">= 0"])
53
- s.add_dependency(%q<flexmock>, ["~> 0.8"])
54
- s.add_dependency(%q<rake>, [">= 0"])
55
- s.add_dependency(%q<jeweler>, ["= 1.8.4"])
56
- end
57
- end
58
-
data/test/test_obuf.rb DELETED
@@ -1,184 +0,0 @@
1
- require "test/unit"
2
- require "obuf"
3
- require "flexmock"
4
- require "flexmock/test_unit"
5
- require "stringio"
6
-
7
- # We are limited to flexmock 0.8 on Ruby 1.8
8
- # http://redmine.ruby-lang.org/issues/4882
9
- # https://github.com/jimweirich/flexmock/issues/4
10
- # https://github.com/julik/flexmock/commit/4acea00677e7b558bd564ec7c7630f0b27d368ca
11
- class FlexMock::PartialMockProxy
12
- def singleton?(method_name)
13
- @obj.singleton_methods.include?(method_name.to_s)
14
- end
15
- end
16
-
17
- class TestObuf < Test::Unit::TestCase
18
-
19
- def test_accumulator_saves_objs
20
- a = Obuf.new
21
- values = [3, {:foo => "bar"}, "foo"]
22
- values.map(&a.method(:push))
23
-
24
- assert_equal 3, a.size
25
- assert_equal values, a.map{|e| e }, "Should return the same elements from the storage"
26
- end
27
-
28
- def test_initialize_with_block
29
- o = Obuf.new do | buf |
30
- buf.push("Excitement!")
31
- end
32
-
33
- assert_equal 1, o.size
34
- assert_equal %w( Excitement! ), o.to_a
35
- end
36
-
37
- def test_from_enum
38
- a = Obuf.new([1,2,3])
39
- assert_equal [1,2,3], a.to_a
40
- end
41
-
42
- def test_accumulator_saves_shitload_of_objs
43
- a = Obuf.new
44
- 50_000.times { a.push("A string" => rand) }
45
- assert_equal 50_000, a.size
46
- end
47
-
48
- def test_accumulator_saves_few_strings_with_a_tab
49
- a = Obuf.new
50
- 4.times { a.push("A \tstring") }
51
- a.each {|e| assert_equal "A \tstring", e }
52
- end
53
-
54
- def test_accumulator_empty
55
- a = Obuf.new
56
- assert a.empty?
57
- a.push(1)
58
- assert !a.empty?
59
- end
60
-
61
- def test_accumulator_supports_nested_iteration
62
- a = Obuf.new
63
- ("A".."Z").each{|e| a << e}
64
-
65
- accumulated = []
66
- seen_g = false
67
- a.each do | first_level |
68
- if first_level == "G"
69
- seen_g = true
70
- # Force a nested iteration and break it midway
71
- a.each do | second_level |
72
- accumulated.push(second_level)
73
- break if second_level == "E"
74
- end
75
- elsif seen_g
76
- assert_equal "H", first_level
77
- return
78
- end
79
- end
80
- end
81
-
82
- def test_random_access
83
- a = Obuf.new
84
- letters = ("A".."Z").map{|e| "#{e}\r\nWow!"}.to_a
85
- letters.map(&a.method(:push))
86
-
87
- assert_equal "B\r\nWow!", a[1]
88
- assert_equal "E\r\nWow!", a[4]
89
- end
90
-
91
- def test_random_access_out_of_bounds
92
- a = Obuf.new
93
- letters = ("A".."Z").map{|e| "#{e}\r\nWow!"}.to_a
94
- letters.map(&a.method(:push))
95
- assert_equal nil, a[27]
96
-
97
- b = Obuf.new
98
- assert_nil b[0]
99
- assert_nil b[-1]
100
- end
101
-
102
- def test_clear_calls_close_on_buffer
103
- io = Tempfile.new("testing")
104
- flexmock(io).should_receive(:close!).once
105
- flexmock(Tempfile).should_receive(:new).once.with("obuf").and_return(io)
106
-
107
- a = Obuf.new
108
- 40.times { a.push("A string" => rand) }
109
- assert_equal 40, a.size
110
- a.clear
111
- assert_equal 0, a.size
112
- end
113
- end
114
-
115
- class TestLens < Test::Unit::TestCase
116
- def test_lens_write
117
- mock_io = flexmock()
118
- lens = Obuf::Lens.new(mock_io)
119
- flexmock(mock_io).should_receive(:write){|written|
120
- assert_kind_of Fixnum, written
121
- }
122
- flexmock(mock_io).should_receive(:write).with("\t")
123
- flexmock(mock_io).should_receive(:write){|byte_blob|
124
- assert_kind_of String, byte_blob
125
- }
126
- flexmock(mock_io).should_receive(:write).with("\n")
127
- lens << "Hi there!"
128
- end
129
-
130
- def test_lens_recover_object_after_write
131
- mock_io = StringIO.new
132
- lens = Obuf::Lens.new(mock_io)
133
- lens << "Hi there!"
134
-
135
- recovered = lens.recover_object
136
- assert_nil recovered, "The IO is at the end now"
137
-
138
- mock_io.rewind
139
- recovered = lens.recover_object
140
- assert_equal "Hi there!", recovered
141
- end
142
-
143
- def test_lens_each
144
- mock_io = StringIO.new
145
-
146
- writing_lens = Obuf::Lens.new(mock_io)
147
- writing_lens << "Hi there!"
148
- writing_lens << 98121
149
- writing_lens << [123, :a]
150
-
151
- mock_io.rewind
152
-
153
- reading_lens = Obuf::Lens.new(mock_io)
154
- items = []
155
- reading_lens.each do | item |
156
- items << item
157
- end
158
-
159
- assert_equal "Hi there!", items[0]
160
- assert_equal 98121, items[1]
161
- assert_equal [123, :a], items[2]
162
- end
163
-
164
- def test_lens_recover_at
165
- mock_io = StringIO.new
166
-
167
- writing_lens = Obuf::Lens.new(mock_io)
168
- writing_lens << "Hi there!"
169
- writing_lens << 98121
170
- writing_lens << [123, :a]
171
-
172
- reading_lens = Obuf::Lens.new(mock_io)
173
- # Also try to recover object at index 3, which does not exist in the underlying buffer
174
- objects_at_positions = (0..3).to_a.reverse.map do | i |
175
- reading_lens.recover_at(i)
176
- end
177
-
178
- assert_nil objects_at_positions[0]
179
- assert_equal [123, :a], objects_at_positions[1]
180
- assert_equal 98121, objects_at_positions[2]
181
- assert_equal "Hi there!", objects_at_positions[3]
182
- end
183
-
184
- end