abbey 0.1.0.beta → 0.1.0.beta2
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 +51 -1
- data/abbey.gemspec +64 -0
- data/lib/entity_storage.rb +37 -0
- data/lib/errors.rb +2 -0
- data/lib/settings.rb +3 -0
- data/lib/version.rb +1 -1
- metadata +14 -13
data/README.md
CHANGED
@@ -1 +1,51 @@
|
|
1
|
-
|
1
|
+
# Abbey
|
2
|
+
|
3
|
+
A primitive JSON data store
|
4
|
+
|
5
|
+
## Description
|
6
|
+
|
7
|
+
A simple persistence library with human-readable representation. Uses good 'ol filesystem. Features: basic operations & namespaces. To be used for prototyping and as a backend of more sophisticated/specific implementations.
|
8
|
+
|
9
|
+
## Usage
|
10
|
+
|
11
|
+
Warning: Abbey intentionally uses JSON, therefore it inherits its' caveats. Most notably, symbols are serialized to strings.
|
12
|
+
|
13
|
+
```ruby
|
14
|
+
require 'abbey'
|
15
|
+
|
16
|
+
abbey = Abbey::EntityStorage.new(Abbey::Settings.new('/var/myapp/data', [:users, :books]))
|
17
|
+
|
18
|
+
abbey.set_up! unless abbey.set_up? # will prepare directories and shit
|
19
|
+
|
20
|
+
abbey.save(:users, :admin, {:name => "John Smith"})
|
21
|
+
|
22
|
+
abbey.save(:users, :admin, {:name => "John Smith"}) # => Abbey::ItemAlreadyExistsError
|
23
|
+
|
24
|
+
abbey.get(:users, :admin) # => {"name" => "John Smith"}
|
25
|
+
|
26
|
+
abbey.update(:users, :admin, {:name => "John C. Smith"})
|
27
|
+
|
28
|
+
abbey.update(:users, :nonexistent, {:name => "Joe Black"}) # => Abbey::ItemNotFoundError
|
29
|
+
|
30
|
+
abbey.list(:users) # => #<Set: {:admin}>
|
31
|
+
|
32
|
+
abbey.get_all(:users) # => {"admin" => {"name" => "John Smith"}}
|
33
|
+
|
34
|
+
abbey.delete(:users, :admin)
|
35
|
+
|
36
|
+
abbey.drop(:users) # will delete all data in the namespace
|
37
|
+
|
38
|
+
abbey.exists?(:users, :admin) # => false
|
39
|
+
|
40
|
+
abbey.settings.namespaces # => [:users, :books]
|
41
|
+
|
42
|
+
abbey.settings.logger # => #<Loger....>
|
43
|
+
```
|
44
|
+
|
45
|
+
## License
|
46
|
+
|
47
|
+
MIT. See LICENSE.txt
|
48
|
+
|
49
|
+
## Author
|
50
|
+
|
51
|
+
Pavel Kalvoda <me@pavelkalvoda.com>
|
data/abbey.gemspec
ADDED
@@ -0,0 +1,64 @@
|
|
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 = "abbey"
|
8
|
+
s.version = "0.1.0.beta2"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Pavel Kalvoda"]
|
12
|
+
s.date = "2011-11-12"
|
13
|
+
s.description = "Primitive JSON data store. Key-value structure with namespaces."
|
14
|
+
s.email = "me@pavelkalvoda.com"
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"LICENSE.txt",
|
17
|
+
"README.md"
|
18
|
+
]
|
19
|
+
s.files = [
|
20
|
+
".document",
|
21
|
+
"Gemfile",
|
22
|
+
"LICENSE.txt",
|
23
|
+
"README.md",
|
24
|
+
"Rakefile",
|
25
|
+
"abbey.gemspec",
|
26
|
+
"lib/abbey.rb",
|
27
|
+
"lib/entity_storage.rb",
|
28
|
+
"lib/errors.rb",
|
29
|
+
"lib/settings.rb",
|
30
|
+
"lib/version.rb",
|
31
|
+
"test/entity_storage_test.rb",
|
32
|
+
"test/helper.rb"
|
33
|
+
]
|
34
|
+
s.homepage = "http://github.com/PJK/abbey"
|
35
|
+
s.licenses = ["MIT"]
|
36
|
+
s.require_paths = ["lib"]
|
37
|
+
s.rubygems_version = "1.8.10"
|
38
|
+
s.summary = "Primitive JSON data store"
|
39
|
+
|
40
|
+
if s.respond_to? :specification_version then
|
41
|
+
s.specification_version = 3
|
42
|
+
|
43
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
44
|
+
s.add_runtime_dependency(%q<multi_json>, [">= 0"])
|
45
|
+
s.add_development_dependency(%q<minitest>, [">= 0"])
|
46
|
+
s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
|
47
|
+
s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
|
48
|
+
s.add_development_dependency(%q<rcov>, [">= 0"])
|
49
|
+
else
|
50
|
+
s.add_dependency(%q<multi_json>, [">= 0"])
|
51
|
+
s.add_dependency(%q<minitest>, [">= 0"])
|
52
|
+
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
53
|
+
s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
|
54
|
+
s.add_dependency(%q<rcov>, [">= 0"])
|
55
|
+
end
|
56
|
+
else
|
57
|
+
s.add_dependency(%q<multi_json>, [">= 0"])
|
58
|
+
s.add_dependency(%q<minitest>, [">= 0"])
|
59
|
+
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
60
|
+
s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
|
61
|
+
s.add_dependency(%q<rcov>, [">= 0"])
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
data/lib/entity_storage.rb
CHANGED
@@ -1,11 +1,19 @@
|
|
1
1
|
module Abbey
|
2
|
+
|
3
|
+
# Represents the store. Manages the data for you.
|
4
|
+
# JSON serialization under the hood.
|
2
5
|
class EntityStorage
|
6
|
+
|
7
|
+
# @return [Settings]
|
3
8
|
attr_accessor :settings
|
4
9
|
|
10
|
+
# @param settings [Settings]
|
5
11
|
def initialize(settings)
|
6
12
|
@settings = settings
|
7
13
|
end
|
8
14
|
|
15
|
+
# Is everything ready?
|
16
|
+
# @return void
|
9
17
|
def set_up?
|
10
18
|
ready = true
|
11
19
|
dirs = [settings.path]
|
@@ -18,6 +26,8 @@ module Abbey
|
|
18
26
|
ready
|
19
27
|
end
|
20
28
|
|
29
|
+
# Set up the directory structure
|
30
|
+
# @return void
|
21
31
|
def set_up!
|
22
32
|
settings.namespaces.each do |ns|
|
23
33
|
path = make_path(ns)
|
@@ -28,6 +38,11 @@ module Abbey
|
|
28
38
|
end
|
29
39
|
end
|
30
40
|
|
41
|
+
# Save an item
|
42
|
+
# @param namespace [String, Fixnum, Symbol or any other object whose #to_s method returns string]
|
43
|
+
# @param key [String, Fixnum, Symbol or any other object whose #to_s method returns string]
|
44
|
+
# @param data [Object]
|
45
|
+
# @return void
|
31
46
|
def save(namespace, key, data)
|
32
47
|
path = make_path(namespace, key)
|
33
48
|
raise ItemAlreadyPresentError.new if File.exist?(path)
|
@@ -37,6 +52,10 @@ module Abbey
|
|
37
52
|
settings.logger.info("Written #{make_key(namespace, key)} (size: #{size})")
|
38
53
|
end
|
39
54
|
|
55
|
+
# Fetch an item
|
56
|
+
# @param namespace [String, Fixnum, Symbol or any other object whose #to_s method returns string]
|
57
|
+
# @param key [String, Fixnum, Symbol or any other object whose #to_s method returns string]
|
58
|
+
# @return [Object]
|
40
59
|
def get(namespace, key)
|
41
60
|
path = make_path(namespace, key)
|
42
61
|
raise ItemNotFoundError.new unless exists?(namespace, key)
|
@@ -44,17 +63,30 @@ module Abbey
|
|
44
63
|
MultiJson.decode(File.read(path))
|
45
64
|
end
|
46
65
|
|
66
|
+
# Does the item exist?
|
67
|
+
# @param namespace [String, Fixnum, Symbol or any other object whose #to_s method returns string]
|
68
|
+
# @param key [String, Fixnum, Symbol or any other object whose #to_s method returns string]
|
69
|
+
# @return [Boolean]
|
47
70
|
def exists?(namespace, key)
|
48
71
|
exists = File.exist?(make_path(namespace, key))
|
49
72
|
settings.logger.info("Queried #{make_key(namespace, key)}, found: #{exists}")
|
50
73
|
exists
|
51
74
|
end
|
52
75
|
|
76
|
+
# Update an item. Shorthand for delete & save
|
77
|
+
# @param namespace [String, Fixnum, Symbol or any other object whose #to_s method returns string]
|
78
|
+
# @param key [String, Fixnum, Symbol or any other object whose #to_s method returns string]
|
79
|
+
# @param data [Object]
|
80
|
+
# @return void
|
53
81
|
def update(namespace, key, data)
|
54
82
|
delete(namespace, key)
|
55
83
|
save(namespace, key, data)
|
56
84
|
end
|
57
85
|
|
86
|
+
# Delete an item
|
87
|
+
# @param namespace [String, Fixnum, Symbol or any other object whose #to_s method returns string]
|
88
|
+
# @param key [String, Fixnum, Symbol or any other object whose #to_s method returns string]
|
89
|
+
# @return void
|
58
90
|
def delete(namespace, key)
|
59
91
|
path = make_path(namespace, key)
|
60
92
|
raise ItemNotFoundError.new unless exists?(namespace, key)
|
@@ -62,12 +94,17 @@ module Abbey
|
|
62
94
|
settings.logger.info("Deleted #{make_key(namespace,key)}")
|
63
95
|
end
|
64
96
|
|
97
|
+
# Get keys of all entries in the namespace
|
98
|
+
# @param namespace [String, Fixnum, Symbol or any other object whose #to_s method returns string]
|
99
|
+
# @return [Set] List of all keys in the namespace
|
65
100
|
def list(namespace)
|
66
101
|
list = Dir.entries(make_path(namespace)) - %w{. ..}
|
67
102
|
list.map! {|item| File.split(item)[1].to_sym}
|
68
103
|
list.to_set
|
69
104
|
end
|
70
105
|
|
106
|
+
# @param namespace [String, Fixnum, Symbol or any other object whose #to_s method returns string]
|
107
|
+
# @return [Hash] Hash of all items in the namespace, indexed by items' keys
|
71
108
|
def get_all(namespace)
|
72
109
|
result = {}
|
73
110
|
list(namespace).each {|key| result[key] = get(namespace, key)}
|
data/lib/errors.rb
CHANGED
data/lib/settings.rb
CHANGED
@@ -4,6 +4,9 @@ module Abbey
|
|
4
4
|
class Settings
|
5
5
|
attr_accessor :namespaces, :logger, :path
|
6
6
|
|
7
|
+
# @param path [String] Filesystem path to store the data in
|
8
|
+
# @param namespaces [Array] Namespaces to create
|
9
|
+
# @param logger [Logger]
|
7
10
|
def initialize(path, namespaces = [], logger = nil)
|
8
11
|
@path = path
|
9
12
|
@namespaces = namespaces
|
data/lib/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: abbey
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.0.
|
4
|
+
version: 0.1.0.beta2
|
5
5
|
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-11-
|
12
|
+
date: 2011-11-12 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: multi_json
|
16
|
-
requirement: &
|
16
|
+
requirement: &20358020 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *20358020
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: minitest
|
27
|
-
requirement: &
|
27
|
+
requirement: &20357420 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *20357420
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: bundler
|
38
|
-
requirement: &
|
38
|
+
requirement: &20356840 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ~>
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: 1.0.0
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *20356840
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: jeweler
|
49
|
-
requirement: &
|
49
|
+
requirement: &20372660 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ~>
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: 1.6.4
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *20372660
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: rcov
|
60
|
-
requirement: &
|
60
|
+
requirement: &20372100 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,7 +65,7 @@ dependencies:
|
|
65
65
|
version: '0'
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *20372100
|
69
69
|
description: Primitive JSON data store. Key-value structure with namespaces.
|
70
70
|
email: me@pavelkalvoda.com
|
71
71
|
executables: []
|
@@ -79,6 +79,7 @@ files:
|
|
79
79
|
- LICENSE.txt
|
80
80
|
- README.md
|
81
81
|
- Rakefile
|
82
|
+
- abbey.gemspec
|
82
83
|
- lib/abbey.rb
|
83
84
|
- lib/entity_storage.rb
|
84
85
|
- lib/errors.rb
|
@@ -101,7 +102,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
101
102
|
version: '0'
|
102
103
|
segments:
|
103
104
|
- 0
|
104
|
-
hash: -
|
105
|
+
hash: -1920122007598384642
|
105
106
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
106
107
|
none: false
|
107
108
|
requirements:
|