oj-pstore 0.0.2
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/.gitignore +5 -0
- data/Gemfile +2 -0
- data/README.md +12 -0
- data/lib/oj/store/version.rb +5 -0
- data/lib/oj/store.rb +40 -0
- data/oj-pstore.gemspec +23 -0
- data/test/test_oj_store.rb +150 -0
- metadata +78 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 2ae69d1e88086797ba1ed8e5d343e3a32d67d305
|
4
|
+
data.tar.gz: 18ce4d169b36abdd033514b771b0753dde8ca2f9
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 9c8f5f0843c396f5c70fec9f6ecf9a48f96b3fb28408e11663eb2b95d43941c673a2591be5e9aff5e155b941eb8ee37aba4a490390b140ee59d3479ac0c59a59
|
7
|
+
data.tar.gz: 37d6a78e3d7e89c814c64c6b0c06bbe26aa9bc514ca68a57bd27778770b5dd1ef56c1fcf8394ae0a9a5d137c81e53c9408b3398ae75006efaf0b1e39eddd6281
|
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
## oj-pstore gem
|
2
|
+
|
3
|
+
This gem implements a [PStore](http://ruby-doc.org/stdlib-2.0/libdoc/pstore/rdoc/PStore.html) alternative using the fast [Oj](https://github.com/ohler55/oj#readme) gem.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
gem install oj-pstore
|
8
|
+
|
9
|
+
## Documentation
|
10
|
+
|
11
|
+
The gem supports the [PStore](http://ruby-doc.org/stdlib-2.0/libdoc/pstore/rdoc/PStore.html) API.
|
12
|
+
|
data/lib/oj/store.rb
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'pstore'
|
2
|
+
require 'oj'
|
3
|
+
|
4
|
+
class Oj::Store < ::PStore
|
5
|
+
|
6
|
+
attr_reader :obtions
|
7
|
+
|
8
|
+
def initialize(file_name, options= {})
|
9
|
+
super(file_name, options.fetch(:thread_safe, false))
|
10
|
+
@options= options
|
11
|
+
end
|
12
|
+
|
13
|
+
def dump(obj)
|
14
|
+
Oj.dump(obj, @options)
|
15
|
+
end
|
16
|
+
|
17
|
+
def load(content)
|
18
|
+
content.size.zero? ? {} : Oj.object_load(content, @options)
|
19
|
+
end
|
20
|
+
|
21
|
+
def marshal_dump_supports_canonical_option?
|
22
|
+
false
|
23
|
+
end
|
24
|
+
|
25
|
+
def empty_marshal_data
|
26
|
+
EMPTY_MARSHAL_DATA
|
27
|
+
end
|
28
|
+
|
29
|
+
def empty_marshal_checksum
|
30
|
+
EMPTY_MARSHAL_CHECKSUM
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
EMPTY_MARSHAL_DATA = Oj.dump({}).freeze
|
36
|
+
EMPTY_MARSHAL_CHECKSUM = Digest::MD5.digest(EMPTY_MARSHAL_DATA)
|
37
|
+
|
38
|
+
autoload(:VERSION, File.expand_path('../store/version', __FILE__))
|
39
|
+
|
40
|
+
end
|
data/oj-pstore.gemspec
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
require File.expand_path('../lib/oj/store/version', __FILE__)
|
2
|
+
|
3
|
+
GemSpec= Gem::Specification.new do |spec|
|
4
|
+
spec.required_rubygems_version= Gem::Requirement.new('>= 1.3.6')
|
5
|
+
spec.name= 'oj-pstore'
|
6
|
+
spec.version= Oj::Store::VERSION
|
7
|
+
spec.date= Time.now.strftime('%Y-%m-%d')
|
8
|
+
spec.authors= ['Mike Blumtritt']
|
9
|
+
# spec.email= ''
|
10
|
+
spec.summary= 'PStore based on fast JSON parser/marshaller Oj.'
|
11
|
+
spec.description= 'This gem implements a PStore alternative using the very fast Oj gem.'
|
12
|
+
spec.homepage= 'https://github.com/mblumtritt/oj-pstore'
|
13
|
+
spec.platform= Gem::Platform::RUBY
|
14
|
+
spec.required_ruby_version= '>= 1.9.3'
|
15
|
+
spec.add_dependency 'oj'
|
16
|
+
spec.add_development_dependency 'minitest'
|
17
|
+
spec.has_rdoc= false # TODO: we need a RDOC!
|
18
|
+
spec.extra_rdoc_files= ['README.md']
|
19
|
+
spec.require_paths = ['lib']
|
20
|
+
spec.files = `git ls-files`.split("\n")
|
21
|
+
spec.test_files = `git ls-files -- spec/*`.split("\n")
|
22
|
+
spec.rubyforge_project= spec.name
|
23
|
+
end
|
@@ -0,0 +1,150 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require_relative '../lib/oj/store'
|
3
|
+
|
4
|
+
class OjStoreTest < Minitest::Test
|
5
|
+
|
6
|
+
class SampleData
|
7
|
+
attr_accessor :name, :number
|
8
|
+
end
|
9
|
+
|
10
|
+
def setup
|
11
|
+
@store_file = "oj-store.tmp.#{Process.pid}"
|
12
|
+
@store_file2 = "oj-store.2.tmp.#{Process.pid}"
|
13
|
+
@store = Oj::Store.new(@store_file)
|
14
|
+
end
|
15
|
+
|
16
|
+
def teardown
|
17
|
+
File.file?(@store_file) and File.unlink(@store_file) rescue nil
|
18
|
+
File.file?(@store_file2) and File.unlink(@store_file2) rescue nil
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_opening_new_file_in_readonly_mode_should_result_in_empty_values
|
22
|
+
@store.transaction(true) do
|
23
|
+
assert_nil @store[:foo]
|
24
|
+
assert_nil @store[:bar]
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_opening_new_file_in_readwrite_mode_should_result_in_empty_values
|
29
|
+
@store.transaction do
|
30
|
+
assert_nil @store[:foo]
|
31
|
+
assert_nil @store[:bar]
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_data_should_be_loaded_correctly_when_in_readonly_mode
|
36
|
+
@store.transaction do
|
37
|
+
@store[:foo] = 'bar'
|
38
|
+
end
|
39
|
+
@store.transaction(true) do
|
40
|
+
assert_equal 'bar', @store[:foo]
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_data_should_be_loaded_correctly_when_in_readwrite_mode
|
45
|
+
@store.transaction do
|
46
|
+
@store[:foo] = 'bar'
|
47
|
+
end
|
48
|
+
@store.transaction do
|
49
|
+
assert_equal 'bar', @store[:foo]
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_changes_after_commit_are_discarded
|
54
|
+
@store.transaction do
|
55
|
+
@store[:foo] = 'bar'
|
56
|
+
@store.commit
|
57
|
+
@store[:foo] = 'baz'
|
58
|
+
end
|
59
|
+
@store.transaction(true) do
|
60
|
+
assert_equal 'bar', @store[:foo]
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_changes_are_not_written_on_abort
|
65
|
+
@store.transaction do
|
66
|
+
@store[:not_written] = 'just a value'
|
67
|
+
@store.abort
|
68
|
+
end
|
69
|
+
@store.transaction(true) do
|
70
|
+
assert_nil @store[:not_written]
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_writing_inside_readonly_transaction_raises_error
|
75
|
+
assert_raises(PStore::Error) do
|
76
|
+
@store.transaction(true) do
|
77
|
+
@store[:foo] = 'bar'
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_thread_safe
|
83
|
+
assert_raises(PStore::Error) do
|
84
|
+
flag = false
|
85
|
+
Thread.new do
|
86
|
+
@store.transaction do
|
87
|
+
@store[:foo] = 'bar'
|
88
|
+
flag = true
|
89
|
+
sleep 1
|
90
|
+
end
|
91
|
+
end
|
92
|
+
until flag
|
93
|
+
# nop
|
94
|
+
end
|
95
|
+
@store.transaction {}
|
96
|
+
end
|
97
|
+
begin
|
98
|
+
pstore = PStore.new(@store_file2,true)
|
99
|
+
flag = false
|
100
|
+
Thread.new do
|
101
|
+
pstore.transaction do
|
102
|
+
pstore[:foo] = 'bar'
|
103
|
+
flag = true
|
104
|
+
sleep 1
|
105
|
+
end
|
106
|
+
end
|
107
|
+
until flag
|
108
|
+
# nop
|
109
|
+
end
|
110
|
+
pstore.transaction do
|
111
|
+
assert(pstore[:foo] == 'bar')
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
def test_nested_transaction_raises_error
|
117
|
+
assert_raises(PStore::Error) do
|
118
|
+
@store.transaction { @store.transaction { } }
|
119
|
+
end
|
120
|
+
pstore = PStore.new(@store_file2, true)
|
121
|
+
assert_raises(PStore::Error) do
|
122
|
+
pstore.transaction { pstore.transaction { } }
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
def test_extended_data
|
127
|
+
array= [1,2,3,4,'a','b','c']
|
128
|
+
hash= {a: 42, b: :c, d: 'e', 'f' => 4711}
|
129
|
+
s= SampleData.new
|
130
|
+
s.name = 'a name'
|
131
|
+
s.number = 12345678
|
132
|
+
@store.transaction do
|
133
|
+
@store[:string] = 'a simple string'
|
134
|
+
@store[:number] = 42.21
|
135
|
+
@store[:array] = array
|
136
|
+
@store[:hash] = hash
|
137
|
+
@store[:sample] = s
|
138
|
+
end
|
139
|
+
@store.transaction(true) do
|
140
|
+
assert_equal 'a simple string', @store[:string]
|
141
|
+
assert_equal 42.21, @store[:number]
|
142
|
+
assert_equal array, @store[:array]
|
143
|
+
assert_equal hash, @store[:hash]
|
144
|
+
assert_equal s.class, @store[:sample].class
|
145
|
+
assert_equal s.name, @store[:sample].name
|
146
|
+
assert_equal s.number, @store[:sample].number
|
147
|
+
end
|
148
|
+
|
149
|
+
end
|
150
|
+
end
|
metadata
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: oj-pstore
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Mike Blumtritt
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-05-06 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: oj
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: minitest
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
description: This gem implements a PStore alternative using the very fast Oj gem.
|
42
|
+
email:
|
43
|
+
executables: []
|
44
|
+
extensions: []
|
45
|
+
extra_rdoc_files:
|
46
|
+
- README.md
|
47
|
+
files:
|
48
|
+
- .gitignore
|
49
|
+
- Gemfile
|
50
|
+
- README.md
|
51
|
+
- lib/oj/store.rb
|
52
|
+
- lib/oj/store/version.rb
|
53
|
+
- oj-pstore.gemspec
|
54
|
+
- test/test_oj_store.rb
|
55
|
+
homepage: https://github.com/mblumtritt/oj-pstore
|
56
|
+
licenses: []
|
57
|
+
metadata: {}
|
58
|
+
post_install_message:
|
59
|
+
rdoc_options: []
|
60
|
+
require_paths:
|
61
|
+
- lib
|
62
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
63
|
+
requirements:
|
64
|
+
- - '>='
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: 1.9.3
|
67
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
68
|
+
requirements:
|
69
|
+
- - '>='
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: 1.3.6
|
72
|
+
requirements: []
|
73
|
+
rubyforge_project: oj-pstore
|
74
|
+
rubygems_version: 2.0.14
|
75
|
+
signing_key:
|
76
|
+
specification_version: 4
|
77
|
+
summary: PStore based on fast JSON parser/marshaller Oj.
|
78
|
+
test_files: []
|