persist 0.0.2 → 0.0.3
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/README.md +20 -17
- data/lib/persist/version.rb +1 -1
- data/lib/persist.rb +130 -17
- data/persist.gemspec +3 -3
- metadata +7 -5
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
# Persist
|
1
|
+
# Persist.db
|
2
2
|
|
3
|
-
Persist is a simple gem that allows you to painlessly save Ruby
|
3
|
+
Persist.db is a simple gem that allows you to painlessly save Ruby Objects in a NoSQL persistent file store.
|
4
4
|
|
5
5
|
## Installation
|
6
6
|
|
@@ -12,26 +12,30 @@ And then execute:
|
|
12
12
|
|
13
13
|
$ bundle
|
14
14
|
|
15
|
-
Or install it yourself
|
15
|
+
Or install it yourself:
|
16
16
|
|
17
17
|
$ gem install persist
|
18
18
|
|
19
19
|
## Usage
|
20
20
|
|
21
|
-
Example in Pry (or IRB):
|
21
|
+
Example in Pry (or IRB if you must):
|
22
22
|
|
23
23
|
```ruby
|
24
24
|
require 'persist'
|
25
25
|
#=> true
|
26
26
|
|
27
|
-
Persist.
|
28
|
-
|
27
|
+
Persist.db
|
28
|
+
# => #<PStore:0x007f8c199c9698
|
29
|
+
@abort=false,
|
30
|
+
@filename=".db.pstore",
|
31
|
+
@lock=#<Mutex:0x007f8c199c9580>,
|
32
|
+
@rdonly=true,
|
33
|
+
@table={},
|
34
|
+
@thread_safe=true,
|
35
|
+
@ultra_safe=true>
|
29
36
|
|
30
|
-
Persist
|
31
|
-
|
32
|
-
|
33
|
-
Persist.push # This saves your Stash to the persistent store.
|
34
|
-
#=> <File:.persistent_store (closed)>
|
37
|
+
Persist[:pie] = ['Key Lime', 'Strawberry Rhubarb', 'Blackberry Cobbler']
|
38
|
+
# => ["Key Lime", "Strawberry Rhubarb", "Blackberry Cobbler"]
|
35
39
|
```
|
36
40
|
|
37
41
|
You can now quit IRB and your store will persist!
|
@@ -40,15 +44,14 @@ You can now quit IRB and your store will persist!
|
|
40
44
|
require 'persist'
|
41
45
|
#=> true
|
42
46
|
|
43
|
-
Persist
|
44
|
-
#=>
|
45
|
-
|
46
|
-
Persist.pull[:siblings]
|
47
|
-
#=> ["Katie", "Molly", "Shannnon"]
|
47
|
+
Persist[:pie]
|
48
|
+
#=> ["Key Lime", "Strawberry Rhubarb", "Blackberry Cobbler"]
|
48
49
|
```
|
49
50
|
|
51
|
+
TODO: Document Persist.db's other public methods such as #transaction, #delete, and #keys. The best documentation in the meanwhile is in the code itself: https://github.com/Havenwood/persist/blob/master/lib/persist.rb
|
52
|
+
|
50
53
|
## Contributing
|
51
54
|
|
52
55
|
1. Fork it
|
53
|
-
2. Commit your changes (`git commit -am '
|
56
|
+
2. Commit your changes (`git commit -am 'Did something'`)
|
54
57
|
3. Create new Pull Request
|
data/lib/persist/version.rb
CHANGED
data/lib/persist.rb
CHANGED
@@ -1,27 +1,140 @@
|
|
1
|
-
require
|
1
|
+
require 'pstore'
|
2
|
+
require 'persist/version'
|
2
3
|
|
4
|
+
# Public: Implements a DSL around Ruby Standard Library's PStore to facilitate
|
5
|
+
# simple file-persistant storage of Ruby objects in a transactional NoSQL
|
6
|
+
# database.
|
3
7
|
module Persist
|
4
8
|
class << self
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
# Returns the persistant store Object if one has been initialized.
|
10
|
+
attr_reader :store
|
11
|
+
|
12
|
+
# Public: Initialize the PStore Object, deserializing the marshalled Hash
|
13
|
+
# stored in the '.db.pstore' file (creating the file if it does't exist).
|
14
|
+
#
|
15
|
+
# Examples
|
16
|
+
#
|
17
|
+
# Persist.db
|
18
|
+
# # => #<PStore:0x007f8c199c9698
|
19
|
+
# @abort=false,
|
20
|
+
# @filename=".db.pstore",
|
21
|
+
# @lock=#<Mutex:0x007f8c199c9580>,
|
22
|
+
# @rdonly=true,
|
23
|
+
# @table={},
|
24
|
+
# @thread_safe=true,
|
25
|
+
# @ultra_safe=true>
|
26
|
+
#
|
27
|
+
# Returns the entire persistent store Object.
|
28
|
+
def db
|
29
|
+
# Initialize a persistent store in the file '.db.pstore' and set
|
30
|
+
# thread_safe to true.
|
31
|
+
@store = PStore.new('.db.pstore', true)
|
32
|
+
|
33
|
+
# Set ultru_safe to true for extra safety checks regarding full disk, etc.
|
34
|
+
@store.ultra_safe = true
|
35
|
+
|
36
|
+
# Open a read-only transaction to fetch latest store.
|
37
|
+
@store.transaction(true) {}
|
38
|
+
|
39
|
+
# Return the entire fetched store Object.
|
40
|
+
@store
|
41
|
+
end
|
42
|
+
|
43
|
+
# Public: Fetch a list of persistent store root tables.
|
44
|
+
#
|
45
|
+
# Examples
|
46
|
+
#
|
47
|
+
# Persist.keys
|
48
|
+
# # => [:author]
|
49
|
+
#
|
50
|
+
# Returns an Array containing the persistent store root tables.
|
51
|
+
def keys
|
52
|
+
# Open a read-only transaction.
|
53
|
+
@store.transaction(true) do
|
54
|
+
#Return a list of all tables in the persistent store.
|
55
|
+
@store.roots
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
alias tables keys
|
60
|
+
|
61
|
+
# Public: Fetch a particular table from the persistent store.
|
62
|
+
#
|
63
|
+
# table - A Symbol.
|
64
|
+
#
|
65
|
+
# Examples
|
66
|
+
#
|
67
|
+
# Persist[:author]
|
68
|
+
# # => {:first_name => "Shannon", :last_name => "Skipper"}
|
69
|
+
#
|
70
|
+
# Persist[:author][:first_name]
|
71
|
+
# # => "Shannon"
|
72
|
+
#
|
73
|
+
# Returns the value stored in the fetched table.
|
74
|
+
def [] table
|
75
|
+
# Open a read-only transaction.
|
76
|
+
@store.transaction(true) do
|
77
|
+
# Return a particular table from the persistent store.
|
78
|
+
@store[table]
|
12
79
|
end
|
13
|
-
@store = Marshal.load File.read(STORE)
|
14
80
|
end
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
81
|
+
|
82
|
+
# Public: Use a single transaction to set a table value.
|
83
|
+
#
|
84
|
+
# table - A Symbol.
|
85
|
+
#
|
86
|
+
# value - Any Ruby Object that is marshallable.
|
87
|
+
#
|
88
|
+
# Examples
|
89
|
+
#
|
90
|
+
# Persist[:sky] = 'blue'
|
91
|
+
# # => "blue"
|
92
|
+
#
|
93
|
+
# Returns the value of the table.
|
94
|
+
def []= table, value
|
95
|
+
# Open a writable transaction.
|
96
|
+
@store.transaction do
|
97
|
+
# Process the single transaction.
|
98
|
+
@store[table] = value
|
99
|
+
end # Commit transaction.
|
100
|
+
end
|
101
|
+
|
102
|
+
# Public: Process multiple transactions to set table values and commit if
|
103
|
+
# all are transactions are successful.
|
104
|
+
#
|
105
|
+
# block - A required block that processes multiple transactions that
|
106
|
+
# succeed or fail together to ensure that data is not left in a
|
107
|
+
# transitory state.
|
108
|
+
#
|
109
|
+
# Examples
|
110
|
+
#
|
111
|
+
# Persist.transaction do
|
112
|
+
# Persist.store[:weather] = 'sunny'
|
113
|
+
# Persist.store[:hour] = 'midday'
|
114
|
+
# end
|
115
|
+
# # => nil
|
116
|
+
#
|
117
|
+
# Returns nothing.
|
118
|
+
def transaction &block
|
119
|
+
@store.transaction do
|
120
|
+
yield
|
121
|
+
@store.commit
|
19
122
|
end
|
20
123
|
end
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
124
|
+
|
125
|
+
# Public: Delete an entire root table from the persistent store.
|
126
|
+
#
|
127
|
+
# Examples
|
128
|
+
#
|
129
|
+
# Persist.delete :author
|
130
|
+
# # => nil
|
131
|
+
#
|
132
|
+
# Returns nothing.
|
133
|
+
def delete table
|
134
|
+
# Open a writable transaction.
|
135
|
+
@store.transaction do
|
136
|
+
# Delete a particular table from the persistent store.
|
137
|
+
@store.delete table
|
25
138
|
end
|
26
139
|
end
|
27
140
|
end
|
data/persist.gemspec
CHANGED
@@ -4,13 +4,13 @@ require File.expand_path('../lib/persist/version', __FILE__)
|
|
4
4
|
Gem::Specification.new do |gem|
|
5
5
|
gem.authors = ["Shannon"]
|
6
6
|
gem.email = ["shannonskipper@gmail.com"]
|
7
|
-
gem.description = %q{
|
8
|
-
gem.summary = %q{
|
7
|
+
gem.description = %q{A DSL for storing Ruby Objects transactionally in a persistent NoSQL database}
|
8
|
+
gem.summary = %q{Persist.db is a DSL implemented around Ruby Standard Library's PStore to facilitate simple file-persistant storage of Ruby objects in a transactional NoSQL database.}
|
9
9
|
gem.homepage = "https://github.com/Havenwood/persist"
|
10
10
|
|
11
11
|
gem.files = `git ls-files`.split($\)
|
12
12
|
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
13
|
-
gem.test_files = gem.files.grep(%r{^
|
13
|
+
gem.test_files = gem.files.grep(%r{^test/})
|
14
14
|
gem.name = "persist"
|
15
15
|
gem.require_paths = ["lib"]
|
16
16
|
gem.version = Persist::VERSION
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: persist
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,9 +9,10 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-05-
|
12
|
+
date: 2012-05-21 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
|
-
description:
|
14
|
+
description: A DSL for storing Ruby Objects transactionally in a persistent NoSQL
|
15
|
+
database
|
15
16
|
email:
|
16
17
|
- shannonskipper@gmail.com
|
17
18
|
executables: []
|
@@ -49,7 +50,8 @@ rubyforge_project:
|
|
49
50
|
rubygems_version: 1.8.24
|
50
51
|
signing_key:
|
51
52
|
specification_version: 3
|
52
|
-
summary:
|
53
|
-
|
53
|
+
summary: Persist.db is a DSL implemented around Ruby Standard Library's PStore to
|
54
|
+
facilitate simple file-persistant storage of Ruby objects in a transactional NoSQL
|
55
|
+
database.
|
54
56
|
test_files: []
|
55
57
|
has_rdoc:
|