abbey 0.1.0.beta → 0.1.0.beta2

Sign up to get free protection for your applications and to get access to all the features.
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: