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 CHANGED
@@ -1 +1,51 @@
1
- todo
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>
@@ -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
+
@@ -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)}
@@ -1,4 +1,6 @@
1
1
  module Abbey
2
+
3
+ # Thrown when trying to overwrite an item
2
4
  class ItemAlreadyPresentError < RuntimeError
3
5
  end
4
6
 
@@ -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
@@ -3,7 +3,7 @@ module Abbey
3
3
  MAJOR = 0
4
4
  MINOR = 1
5
5
  PATCH = 0
6
- BUILD = 'beta'
6
+ BUILD = 'beta2'
7
7
 
8
8
  STRING = [MAJOR, MINOR, PATCH, BUILD].compact.join('.')
9
9
  end
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.beta
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-11 00:00:00.000000000 Z
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: &10668260 !ruby/object:Gem::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: *10668260
24
+ version_requirements: *20358020
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: minitest
27
- requirement: &10667720 !ruby/object:Gem::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: *10667720
35
+ version_requirements: *20357420
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: bundler
38
- requirement: &10667160 !ruby/object:Gem::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: *10667160
46
+ version_requirements: *20356840
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: jeweler
49
- requirement: &10666560 !ruby/object:Gem::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: *10666560
57
+ version_requirements: *20372660
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: rcov
60
- requirement: &10666040 !ruby/object:Gem::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: *10666040
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: -4270260212443157671
105
+ hash: -1920122007598384642
105
106
  required_rubygems_version: !ruby/object:Gem::Requirement
106
107
  none: false
107
108
  requirements: