jsl-hashback 0.0.2.5 → 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.
@@ -1,8 +1,8 @@
1
1
  = HashBack
2
2
 
3
3
  HashBack is a simple Object-hash mapping (OHM) system for Ruby. It allows for serializable classes to be saved,
4
- retrieved and deleted from any key-value store supported by {Moneta}[http://github.com/wycats/moneta/tree/master]
5
- (a unified interface to key-value systems).
4
+ retrieved and deleted from any key-value store. It works particulary well with, but has no dependency on
5
+ {Moneta}[http://github.com/wycats/moneta/tree/master] (a unified interface to key-value systems).
6
6
 
7
7
  == Quick Start
8
8
 
@@ -21,7 +21,7 @@ UUIDs created by the assaf-uuid gem, so we'll include that as well.
21
21
  Below we create a simple class that is serializable to HashBack.
22
22
 
23
23
  class Elephant
24
- HashBack::Resource.setup(self, :uuid, 'Moneta::Memory')
24
+ HashBack::Resource.setup(self, :uuid, Moneta::Memory.new)
25
25
 
26
26
  attr_accessor :uuid, :name
27
27
 
@@ -46,6 +46,12 @@ When you're sick of Dumbo and want to get rid of him:
46
46
 
47
47
  Note that at this point the data is still available in the instance variables for Dumbo, but the persisted form of him is gone.
48
48
 
49
+ == HashBack::Backend
50
+
51
+ A lightweight class called HashBack::Backend is included with the distribution of this gem. This class wraps common Hash-like
52
+ getter and setter methods with ones that include a namespace. This may be helpful to you if you're persisting many objects
53
+ to the same backend data store. Please see the documentation for HashBack::Backend for more information.
54
+
49
55
  == Detailed usage
50
56
 
51
57
  Generally, HashBack should work with any class that can be serialized. You can decide which key-value storage system
@@ -57,7 +63,7 @@ follows:
57
63
  require 'hashback'
58
64
 
59
65
  class Foo
60
- HashBack::Resource.setup(self, :id, 'Moneta::Memcache', :server => 'localhost:1978')
66
+ HashBack::Resource.setup(self, :id, HashBack::Backend.new('Foo', Moneta::Memcache.new(:server => 'localhost:1978')))
61
67
  end
62
68
 
63
69
  This initializes a class with a backend storage in a Tokyo Tyrant server. The serialized forms of objects that are
@@ -77,13 +83,11 @@ together a lightweight implementation with methods for saving and accessing simi
77
83
  The following features are not present in the current library, but may be useful:
78
84
 
79
85
  * A system of callbacks
80
- * A system for associating objects, perhaps constrained to objects that have a 1 - 1 mapping (since it's not entirely
81
- intuitive what the structures or algorithms would be for mainting integrity with higher levels of mapping between
82
- objects).
86
+ * A system for associating objects, perhaps constrained to objects that have a 1 - 1 mapping
83
87
 
84
88
  == Feedback
85
89
 
86
- Please write the author if you have any questions or feedbacks about this library.
90
+ Please write the author if you have any questions or feedback regarding this library.
87
91
 
88
92
  == Author
89
93
 
@@ -1,11 +1,20 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "hashback"
3
- s.version = "0.0.2.5"
3
+ s.version = "0.0.3"
4
4
  s.date = "2009-05-13"
5
- s.summary = "Generic tool for writing namespaced key-value data to a variety of hash-type systems"
5
+
6
+ s.summary = "Ruby Object-Hash Mapping system (OHM)"
7
+
8
+ s.description = <<-EOF
9
+ HashBack makes your ruby class persistent by adding methods which will save and retrieve it from a
10
+ backend key-value store. Useful when you have objects that should respond to #save and #fetch (as
11
+ a class method). Works well with the Moneta gem, which automatically serializes objects before they
12
+ are saved and after they are retrieved, but functions with any key-value storage system.
13
+ EOF
14
+
6
15
  s.email = "justin@phq.org"
7
16
  s.homepage = "http://github.com/jsl/hashback"
8
- s.description = "Wrapper around Moneta that facilitates using the key-value store as a backend for applications requiring namespacing"
17
+ s.description = "HashBack"
9
18
  s.has_rdoc = true
10
19
  s.authors = ["Justin Leitgeb"]
11
20
  s.files = [
@@ -32,9 +41,5 @@ Gem::Specification.new do |s|
32
41
  '--main', 'README.rdoc',
33
42
  '--line-numbers',
34
43
  '--inline-source'
35
- ]
36
-
37
- s.add_dependency("jsl-moneta")
38
- s.add_dependency("activesupport")
39
- s.add_dependency("assaf-uuid")
44
+ ]
40
45
  end
data/init.rb CHANGED
@@ -1 +1,3 @@
1
+ # In case we're used as a Rails plugin, load the library.
2
+
1
3
  require 'hashback'
@@ -1,4 +1,3 @@
1
- require 'moneta'
2
1
  require 'activesupport'
3
2
 
4
3
  Dir[File.join(File.dirname(__FILE__), 'hashback', '*.rb')].each do |f|
@@ -1,54 +1,33 @@
1
1
  module HashBack
2
2
 
3
- # Delegates methods to Moneta (a unified interface to key-value storage systems) after adding
4
- # a key for proper namespacing. Initializes and loads the proper Moneta class based on input
5
- # options, and delegates setting and retrieval to the Moneta class responsible for storage.
3
+ # Proxy class over a key-value storage object which adds a namespace to keys. Useful if you
4
+ # have a number of different things that are saving to the same object space. Of course, then
5
+ # you may want to consider just opening up new key-value stores. This class may safely be
6
+ # ignored if not needed by your application.
6
7
  class Backend
7
8
 
8
- def initialize(namespace, moneta_klass, options = { })
9
+ # Backend accepts a namespace which will be added to all keys on retrieval and
10
+ # setting, and a backend that responds to Hash-like methods. Moneta classes
11
+ # see the Moneta gem) work well as the backends to this class.
12
+ def initialize(namespace, backend)
9
13
  @namespace = namespace
10
- @options = options
11
- @moneta = initialize_moneta_klass(moneta_klass)
14
+ @backend = backend
12
15
  end
13
16
 
14
17
  def [](key)
15
- @moneta[key_name_for(key)]
18
+ @backend[key_name_for(key)]
16
19
  end
17
20
 
18
21
  def []=(key, value)
19
- @moneta[key_name_for(key)] = value
22
+ @backend[key_name_for(key)] = value
20
23
  end
21
24
 
22
25
  def delete(key)
23
- @moneta.delete(key_name_for(key))
26
+ @backend.delete(key_name_for(key))
24
27
  end
25
28
 
26
29
  private
27
30
 
28
- def initialize_moneta_klass(klass)
29
- require_moneta_library_for(klass)
30
- load_moneta_klass(klass)
31
- end
32
-
33
- def require_moneta_library_for(klass)
34
- require_klass(klass.to_s.gsub(/::/, '/').downcase)
35
- end
36
-
37
- def load_moneta_klass(klass)
38
- klass_const = klass.respond_to?(:constantize) ? klass.constantize : klass
39
- moneta = klass_const.new(@options)
40
-
41
- # The options hash would have messed up default Hash initialization to return an empty hash
42
- # when the key was not found. Revert this case by setting the default to nil if the object
43
- # responds to this method.
44
- moneta.default = nil if moneta.respond_to?(:default)
45
- moneta
46
- end
47
-
48
- def require_klass(klass)
49
- require klass
50
- end
51
-
52
31
  def key_name_for(key)
53
32
  [ @namespace, key ].join('-')
54
33
  end
@@ -1,7 +1,7 @@
1
1
  module HashBack
2
2
 
3
- # HashBack::Resource is an Object-Hash Mapping (OHM) tool for Ruby. It is able to map Ruby objects
4
- # to any of the backends supported by Moneta, a unified interface to key-value storage systems.
3
+ # HashBack::Resource is an Object-Hash Mapping (OHM) tool for Ruby. It uses a Hash-like object
4
+ # as the persistent resource, which can be given on HashBack::Resource initialization.
5
5
  class Resource
6
6
 
7
7
  # Configures the persistent backend for this object. Configuration options:
@@ -9,10 +9,9 @@ module HashBack
9
9
  # * +source+ - the class to be persisted
10
10
  # * +key_method+ - a symbol representing the method that will return a unique identifier
11
11
  # for this object when called on the instance
12
- # * +moneta_klass+ - a String representation or class constant of the Moneta class used to store this object
13
- # * +moneta_options+ - an (optional) hash which is passed directly to the moneta backend for configuration
14
- def self.setup(source, key_method_sym, moneta_klass, moneta_options = {})
15
- source.__send__(:class_variable_set, :@@_backend, HashBack::Backend.new(source.to_s, moneta_klass, moneta_options))
12
+ # * +backend+ - a Hash-like Object (Moneta works well) for persisting this resource.
13
+ def self.setup(source, key_method_sym, backend)
14
+ source.__send__(:class_variable_set, :@@_backend, backend)
16
15
  source.__send__(:class_variable_set, :@@_key_method_sym, key_method_sym)
17
16
 
18
17
  source.__send__(:include, InstanceMethods)
@@ -23,25 +22,27 @@ module HashBack
23
22
 
24
23
  # Saves the serialized form of this object to the configured backend store.
25
24
  def save
26
- _hashback_backend[_hashback_id_key] = self
25
+ hashback_backend[_hashback_id_key] = self
27
26
  end
28
27
 
29
28
  # Destroy the persisted copy of this object.
30
29
  def destroy
31
- _hashback_backend.delete(_hashback_id_key)
30
+ hashback_backend.delete(_hashback_id_key)
32
31
  end
33
32
 
34
- ## Methods we try to hide, because we're just sneaky like that.
35
-
36
- def _hashback_backend
33
+ # Convenience method for accessing the backend without having to get to the
34
+ # obscurely-named class variable in which it's stored.
35
+ def hashback_backend
37
36
  self.class.__send__(:class_variable_get, :@@_backend)
38
37
  end
39
-
38
+
39
+ ## Methods we try to hide, because we're just sneaky like that.
40
+
40
41
  def _hashback_id_key
41
42
  self.__send__(self.class.__send__(:class_variable_get, :@@_key_method_sym))
42
43
  end
43
44
 
44
- private :_hashback_backend, :_hashback_id_key
45
+ private :_hashback_id_key
45
46
  end
46
47
 
47
48
  module ClassMethods
@@ -4,9 +4,7 @@ describe HashBack::Backend do
4
4
  before do
5
5
  @mock_moneta = mock('moneta')
6
6
  @mock_moneta.stubs(:keys).returns(['keyname'])
7
- @moneta_klass = "Moneta::Memory"
8
- @b = HashBack::Backend.new('foo', @moneta_klass, { })
9
- @b.instance_variable_set(:@moneta, @mock_moneta)
7
+ @b = HashBack::Backend.new('foo', @mock_moneta)
10
8
  @b.stubs(:key_name_for).returns('keyname')
11
9
  end
12
10
 
@@ -31,31 +29,5 @@ describe HashBack::Backend do
31
29
  @b.delete('foo')
32
30
  end
33
31
  end
34
- end
35
-
36
- describe "#initialize_moneta_klass" do
37
- it "should call require_moneta_library_for and load_moneta_klass" do
38
- b = HashBack::Backend.new('foo', @moneta_klass, { })
39
- b.expects(:require_moneta_library_for).with(@moneta_klass)
40
- b.expects(:load_moneta_klass).with(@moneta_klass)
41
- b.__send__(:initialize_moneta_klass, @moneta_klass)
42
- end
43
- end
44
-
45
- describe "#require_moneta_library_for" do
46
- it "should require the class given" do
47
- @b.expects(:require_klass).with('moneta/memory')
48
- @b.__send__(:require_moneta_library_for, "Moneta::Memory")
49
- end
50
- end
51
-
52
- describe "#load_moneta_klass" do
53
- it "should load the klass without error" do
54
- require 'moneta/memory'
55
-
56
- lambda {
57
- @b.__send__(:load_moneta_klass, "Moneta::Memory")
58
- }.should_not raise_error
59
- end
60
- end
32
+ end
61
33
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jsl-hashback
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2.5
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Justin Leitgeb
@@ -11,38 +11,9 @@ cert_chain: []
11
11
 
12
12
  date: 2009-05-13 00:00:00 -07:00
13
13
  default_executable:
14
- dependencies:
15
- - !ruby/object:Gem::Dependency
16
- name: jsl-moneta
17
- type: :runtime
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
20
- requirements:
21
- - - ">="
22
- - !ruby/object:Gem::Version
23
- version: "0"
24
- version:
25
- - !ruby/object:Gem::Dependency
26
- name: activesupport
27
- type: :runtime
28
- version_requirement:
29
- version_requirements: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: "0"
34
- version:
35
- - !ruby/object:Gem::Dependency
36
- name: assaf-uuid
37
- type: :runtime
38
- version_requirement:
39
- version_requirements: !ruby/object:Gem::Requirement
40
- requirements:
41
- - - ">="
42
- - !ruby/object:Gem::Version
43
- version: "0"
44
- version:
45
- description: Wrapper around Moneta that facilitates using the key-value store as a backend for applications requiring namespacing
14
+ dependencies: []
15
+
16
+ description: HashBack
46
17
  email: justin@phq.org
47
18
  executables: []
48
19
 
@@ -89,7 +60,7 @@ rubyforge_project:
89
60
  rubygems_version: 1.2.0
90
61
  signing_key:
91
62
  specification_version: 2
92
- summary: Generic tool for writing namespaced key-value data to a variety of hash-type systems
63
+ summary: Ruby Object-Hash Mapping system (OHM)
93
64
  test_files:
94
65
  - spec/hashback/backend_spec.rb
95
66
  - spec/hashback_spec.rb