campchair 0.0.4 → 0.1.0

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,22 +1,24 @@
1
1
  # ⑁ Campchair
2
- ### Lightweight, ghetto-tech CouchDB-like views in Ruby
2
+ ### A fast, ghetto-tech CouchDB-like persistence layer for Ruby
3
3
 
4
4
  [![Build Status](https://secure.travis-ci.org/captainpete/campchair.png?branch=master)](http://travis-ci.org/captainpete/campchair)
5
5
 
6
6
  ___This README is a wishlist. The thing doesn't entirely work yet!___
7
7
 
8
- Campchair provides some helpers for lazily materialized views and a
9
- persistence mapping for different Ruby types.
8
+ Campchair provides some helpers for lazily materialized views,
9
+ and gives you a choice of using ActiveRecord-like models
10
+ or class-based, barebones data-structure access.
10
11
 
11
12
  Views are described a bit like those found in [CouchDB](http://couchdb.apache.org/).
12
13
  Campchair is not a service and has no client-server stuff.
13
- Parallel writes are not supported, but that's okay – you can use something
14
+ Parallel access is not supported yet, but that's okay – you can use something
14
15
  else for concurrency and use this in your persistence fiber/thread/process.
16
+
15
17
  Persistence happens through [LevelDB](http://code.google.com/p/leveldb/).
18
+ Objects are serialized into documents using Ruby's Marshal class.
16
19
  This is not append-only and replication is not a feature.
17
- For these reasons it's called campchair, not couch :)
18
20
 
19
- This project was born at [Railscamp 11](http://railscamps.com/) for the heavy-metrics project.
21
+ This project was born at [Railscamp 11](http://railscamps.com/).
20
22
 
21
23
  ### How does it look?
22
24
 
@@ -41,7 +43,7 @@ Mixing in Campchair DB behavior to a class is as simple as...
41
43
 
42
44
  ```ruby
43
45
  class People
44
- include Campchair::LevelDB
46
+ include Campchair::Store
45
47
  end
46
48
  ```
47
49
 
@@ -49,20 +51,20 @@ Now, use it like a `Hash`.
49
51
 
50
52
  ```ruby
51
53
  # Add a document to the db
52
- id = People << fred
54
+ key = People << fred
53
55
 
54
56
  # Add another person
55
57
  People << jane
56
58
 
57
59
  # Rerieve a document from the db
58
- fred = People[id]
60
+ fred = People[key]
59
61
 
60
62
  # Delete the document from the db
61
- People.delete(id)
63
+ People.delete(key)
62
64
 
63
- # Update/create the document in the db using an id
65
+ # Update/create the document in the db using a key
64
66
  fred[:last_seen] = Time.new(2012, 3, 6, 12, 40, 25)
65
- doc[id] = fred
67
+ doc[key] = fred
66
68
  ```
67
69
 
68
70
  ### Basic views _not yet implemented_
@@ -249,7 +251,7 @@ People.average_height_by_location['Docklands, Melbourne, Australia']
249
251
 
250
252
  ### Custom database path
251
253
 
252
- By default, the folder for db files is 'cddb'.
254
+ By default, the folder for db files is 'cddb'.
253
255
  You can change this with:
254
256
  ```ruby
255
257
  Campchair.db_path = 'db/heavy_metrics'
data/campchair.gemspec CHANGED
@@ -8,7 +8,7 @@ Gem::Specification.new do |s|
8
8
  s.authors = ["Peter Hollows"]
9
9
  s.email = ["pete@dojo7.com"]
10
10
  s.homepage = "https://github.com/captainpete/campchair"
11
- s.summary = %q{Lightweight, ghetto-tech CouchDB-like views in Ruby}
11
+ s.summary = %q{A fast, ghetto-tech CouchDB-like persistence layer for Ruby}
12
12
  s.description = %q{Campchair is a map-reduce framework using levelDB for persistence, and Ruby for everything else.}
13
13
 
14
14
  s.rubyforge_project = "campchair"
@@ -18,7 +18,8 @@ Gem::Specification.new do |s|
18
18
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
19
  s.require_paths = ["lib"]
20
20
 
21
- s.add_dependency(%q<leveldb-ruby>, ["~> 0.14"])
22
- s.add_development_dependency(%q<rspec>)
23
- s.add_development_dependency(%q<rake>)
21
+ s.add_dependency %q<leveldb-ruby>, ["~> 0.14"]
22
+
23
+ s.add_development_dependency %q<rspec>, ["~> 2.12.0"]
24
+ s.add_development_dependency %q<rake>, ["~> 10.0.0"]
24
25
  end
@@ -0,0 +1,73 @@
1
+ module Campchair
2
+ module Model
3
+ def self.included(base)
4
+ base.class_eval do
5
+ include Store
6
+ extend ClassMethods
7
+
8
+ class << self
9
+ _new = instance_method(:new)
10
+ define_method(:new) do |*args|
11
+ _new.bind(self).call(*args).tap(&:initialize_model)
12
+ end
13
+ end
14
+ end
15
+ end
16
+
17
+ module ClassMethods
18
+ def load(key)
19
+ entity = new
20
+ entity.key = key
21
+ entity.reload
22
+ entity
23
+ end
24
+ end
25
+
26
+ def initialize_model
27
+ @attributes = {}
28
+ @new_entity = true
29
+ @destroyed = false
30
+ end
31
+
32
+ attr_accessor :key
33
+ attr_reader :attributes
34
+
35
+ def new_entity?
36
+ @new_entity != false
37
+ end
38
+
39
+ def destroyed?
40
+ @destroyed != false
41
+ end
42
+
43
+ def persisted?
44
+ !(new_entity? || destroyed?)
45
+ end
46
+
47
+ def save
48
+ if key
49
+ self.class[key] = attributes
50
+ else
51
+ self.key = self.class << attributes
52
+ end
53
+ @new_entity = false
54
+ true
55
+ end
56
+
57
+ def delete
58
+ self.class.delete(key) if persisted?
59
+ @destroyed = true
60
+ freeze
61
+ end
62
+ alias :destroy :delete
63
+
64
+ def reload(options = nil)
65
+ fresh_attributes = self.class[key]
66
+ attributes.update(fresh_attributes)
67
+ @new_entity = false
68
+
69
+ self
70
+ end
71
+
72
+ end
73
+ end
@@ -1,8 +1,9 @@
1
1
  require 'leveldb'
2
+ require 'fileutils'
2
3
  require 'digest/sha1'
3
4
 
4
5
  module Campchair
5
- module LevelDB
6
+ module Store
6
7
  class << self
7
8
  def generate_key
8
9
  @alpha ||= [('a'..'f'), ('0'..'9')].map(&:to_a).flatten
@@ -19,13 +20,20 @@ module Campchair
19
20
 
20
21
  def included(base)
21
22
  base.class_eval do
23
+ include Enumerable
24
+
22
25
  class << self
23
- attr_writer :db_path, :db_name, :db
26
+ attr_writer :db_name, :db
24
27
 
25
28
  def db_path
26
29
  @db_path || File.join(Campchair.db_path, db_name)
27
30
  end
28
31
 
32
+ def db_path=(value)
33
+ @db = nil unless @db_path == value
34
+ @db_path = value
35
+ end
36
+
29
37
  def db_name
30
38
  @db_name || name
31
39
  end
@@ -34,30 +42,42 @@ module Campchair
34
42
  @db ||= create_db
35
43
  end
36
44
 
45
+ def exists?(key)
46
+ db.exists?(key)
47
+ end
48
+
37
49
  def [](key)
38
50
  val = db[key]
39
- val && Campchair::LevelDB.decode(db[key])
51
+ val && Campchair::Store.decode(db[key])
40
52
  end
41
53
 
42
54
  def []=(key, value)
43
- db[key] = Campchair::LevelDB.encode(value)
55
+ db[key] = Campchair::Store.encode(value)
44
56
  end
45
57
 
46
58
  def <<(value)
47
- id = Campchair::LevelDB.generate_key
48
- self[id] = value
49
- return id
59
+ key = Campchair::Store.generate_key
60
+ self[key] = value
61
+ return key
50
62
  end
51
63
 
52
64
  def delete(key)
53
65
  db.delete(key)
54
66
  end
55
67
 
68
+ def all
69
+ db.keys.map { |key| self[key] }
70
+ end
71
+
72
+ def each(&block)
73
+ db.values.each(&block)
74
+ end
75
+
56
76
  protected
57
77
 
58
78
  def create_db
59
79
  FileUtils.mkdir_p(db_path)
60
- ::LevelDB::DB.new(db_path)
80
+ LevelDB::DB.new(db_path)
61
81
  end
62
82
 
63
83
  end # class << self
@@ -66,5 +86,5 @@ module Campchair
66
86
  end # included
67
87
  end # class << self
68
88
 
69
- end # module LevelDB
89
+ end # module Store
70
90
  end # module Campchair
@@ -1,3 +1,3 @@
1
1
  module Campchair
2
- VERSION = "0.0.4"
2
+ VERSION = "0.1.0"
3
3
  end
data/lib/campchair.rb CHANGED
@@ -1,8 +1,9 @@
1
1
  require "campchair/version"
2
2
 
3
3
  module Campchair
4
- autoload :Views, 'campchair/views'
5
- autoload :LevelDB, 'campchair/leveldb'
4
+ autoload :Views, 'campchair/views'
5
+ autoload :Store, 'campchair/store'
6
+ autoload :Model, 'campchair/model'
6
7
 
7
8
  class << self
8
9
  attr_writer :db_path
@@ -0,0 +1,95 @@
1
+ require 'spec_helper'
2
+
3
+ describe Campchair::Model do
4
+
5
+ context "included" do
6
+ let(:test_class) do
7
+ Class.new { include Campchair::Model }
8
+ end
9
+ before do
10
+ test_class.stub! :name => 'TestEntity'
11
+ test_class.db_path = 'tmp/ccdb/test'
12
+ end
13
+
14
+ it "includes Campchair::Store" do
15
+ test_class.ancestors.should include(Campchair::Store)
16
+ end
17
+
18
+ describe "#load" do
19
+ it "retrieves an object by key, populating attributes, from the store" do
20
+ test_class['BADA55'] = { :colour => 'turple', :awesomeness => '9000' }
21
+ test_entity = test_class.load('BADA55')
22
+
23
+ test_entity.should be_a(test_class)
24
+ test_entity.attributes.should == { :colour => 'turple', :awesomeness => '9000' }
25
+ test_entity.should be_persisted
26
+ test_entity.should_not be_new_entity
27
+ test_entity.should_not be_destroyed
28
+ end
29
+ end
30
+
31
+ describe "#save" do
32
+ context "when not previously persisted (create)" do
33
+ let(:test_entity) do
34
+ test_class.new
35
+ end
36
+ before do
37
+ test_entity.should_not be_persisted
38
+ end
39
+
40
+ context "the model has no key" do
41
+ before do
42
+ test_entity.key.should be_nil
43
+ end
44
+
45
+ it "adds an attribute hash to the store and sets the model key to the generated store key" do
46
+ test_entity.stub! :attributes => { :paper => 'is for planes' }
47
+ test_entity.save
48
+
49
+ key = test_entity.key
50
+ key.should_not be_nil
51
+ test_class[key].should == { :paper => 'is for planes' }
52
+ end
53
+ end
54
+
55
+ context "the model has a key" do
56
+ it "writes an attribute hash to the store keyed by the model's key" do
57
+ end
58
+ end
59
+ end
60
+
61
+ context "when already persisted (update)" do
62
+ let(:test_entity) do
63
+ test_class['BADA55'] = { :colour => 'turple', :awesomeness => '9000' }
64
+ test_class.load('BADA55')
65
+ end
66
+ before do
67
+ test_entity.should be_persisted
68
+ end
69
+
70
+ it "updates the attribute hash stored at the model's key, using the model's attributes" do
71
+ test_entity.stub! :key => 'BADA55', :attributes => { :taste => 'like tripping', :awesomeness => '9001' }
72
+ test_entity.save
73
+
74
+ test_class['BADA55'].should == { :taste => 'like tripping', :awesomeness => '9001' }
75
+ end
76
+ end
77
+
78
+ end # describe "#save"
79
+
80
+ describe "#delete" do
81
+ it "removes the object from the store" do
82
+ test_entity = test_class.new
83
+ test_entity.key = 'BADA55'
84
+ test_entity.save
85
+ test_entity.should be_persisted
86
+ test_class.should be_exists('BADA55')
87
+
88
+ test_entity.delete
89
+ test_entity.should be_destroyed
90
+ test_class.should_not be_exists('BADA55')
91
+ end
92
+ end
93
+
94
+ end # context "included"
95
+ end # describe Campchair::Model
@@ -1,8 +1,8 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Campchair::LevelDB do
3
+ describe Campchair::Store do
4
4
  let(:test_module) do
5
- Campchair::LevelDB.dup
5
+ Campchair::Store.dup
6
6
  end
7
7
 
8
8
  describe ".generate_key" do
@@ -13,26 +13,21 @@ describe Campchair::LevelDB do
13
13
 
14
14
  context "included" do
15
15
  let(:test_class) do
16
- Object.send(:remove_const, :TestEntity) if defined? TestEntity
17
- TestEntity = Class.new do
18
- include Campchair::LevelDB
19
- end
16
+ Class.new { include Campchair::Store }
20
17
  end
21
-
22
- after do
23
- `rm -fr tmp/ccdb`
18
+ before do
19
+ test_class.stub! :name => 'TestEntity'
24
20
  end
25
21
 
26
22
  describe "setting the db_name" do
27
23
  describe ".db_name" do
28
24
  it "is the class name by default" do
29
- test_class.stub! :name => 'TestEntity'
30
25
  test_class.db_name.should == 'TestEntity'
31
26
  end
32
27
  end
33
28
 
34
29
  describe ".db_name=" do
35
- it "is the custom db_name specified" do
30
+ it "sets the db_name" do
36
31
  test_class.db_name = 'TestEntityCustomName'
37
32
  test_class.db_name.should == 'TestEntityCustomName'
38
33
  end
@@ -43,12 +38,14 @@ describe Campchair::LevelDB do
43
38
  describe ".db_path" do
44
39
  it "is the Campchair.db_path, and the db_name by default" do
45
40
  Campchair.should_receive(:db_path).and_return('some/path')
41
+ test_class.should_receive(:db_name).and_return('TestEntity')
42
+
46
43
  test_class.db_path.should == 'some/path/TestEntity'
47
44
  end
48
45
  end
49
46
 
50
47
  describe ".db_path=" do
51
- it "is the custom db_path specified" do
48
+ it "sets the db_path" do
52
49
  test_class.db_path = 'some/other/path'
53
50
  test_class.db_path.should == 'some/other/path'
54
51
  end
@@ -65,20 +62,44 @@ describe Campchair::LevelDB do
65
62
  test_class.db.should be_a(LevelDB::DB)
66
63
  test_class.db.pathname.should == 'tmp/ccdb/test'
67
64
  end
65
+
66
+ it "is cached" do
67
+ test_class.db.should == test_class.db
68
+ end
69
+
70
+ it "changes to reflect changes to db_path" do
71
+ first_db = test_class.db
72
+ test_class.db_path = 'tmp/ccdb/test2'
73
+ second_db = test_class.db
74
+
75
+ first_db.should_not == second_db
76
+ second_db.pathname.should == 'tmp/ccdb/test2'
77
+ end
68
78
  end
69
79
 
70
80
  context "no data serialization" do
71
81
  before do
72
82
  # Passthrough {en,de}coding for these tests
73
- Campchair::LevelDB.stub(:encode).and_return {|v| v}
74
- Campchair::LevelDB.stub(:decode).and_return {|v| v}
83
+ Campchair::Store.stub(:encode).and_return {|v| v}
84
+ Campchair::Store.stub(:decode).and_return {|v| v}
75
85
 
76
86
  FileUtils.mkdir_p('tmp/ccdb/TestEntity')
77
- @db = ::LevelDB::DB.new('tmp/ccdb/TestEntity')
87
+ @db = LevelDB::DB.new('tmp/ccdb/TestEntity')
78
88
 
79
89
  test_class.stub! :db => @db
80
90
  end
81
91
 
92
+ describe ".exists?" do
93
+ it "is false when there's no matching key in the database" do
94
+ test_class.exists?('nonexistent').should be_false
95
+ end
96
+
97
+ it "is true when there's a matching key" do
98
+ @db['something'] = '22'
99
+ test_class.exists?('something').should be_true
100
+ end
101
+ end
102
+
82
103
  describe ".[]" do
83
104
  it "is nil when there's no matching key in the database" do
84
105
  test_class['nonexistent'].should be_nil
@@ -98,13 +119,13 @@ describe Campchair::LevelDB do
98
119
  end
99
120
 
100
121
  describe ".<<" do
101
- it "adds the value to the database, generating a key" do
122
+ it "adds the value to the database, returning a key" do
102
123
  key = 'b78aa2f6b718651743fac2682003f2c63340ae34b'
103
- Campchair::LevelDB.stub! :generate_key => key
124
+ Campchair::Store.stub! :generate_key => key
104
125
 
105
- id = TestEntity << '22'
106
- id.should == key
107
- test_class[id].should == '22'
126
+ generated_key = test_class << '22'
127
+ generated_key.should == key
128
+ test_class[generated_key].should == '22'
108
129
  end
109
130
  end
110
131
 
@@ -112,13 +133,35 @@ describe Campchair::LevelDB do
112
133
  it "deletes the key its values from the db" do
113
134
  test_class['something'] = '22'
114
135
  test_class.delete('something')
115
-
136
+
116
137
  test_class['something'].should be_nil
117
138
  end
118
139
  end
140
+
141
+ describe ".all" do
142
+ it "contains all the values" do
143
+ test_class << '22'
144
+ test_class << '22'
145
+ test_class << '44'
146
+
147
+ test_class.all.sort == ['22', '22', '44']
148
+ end
149
+ end
150
+
151
+ describe ".each" do
152
+ it "enumerates over all the values" do
153
+ test_class << '22'
154
+ test_class << '22'
155
+ test_class << '44'
156
+
157
+ values = []
158
+ test_class.each { |v| values << v }
159
+ values.sort.should == ['22', '22', '44']
160
+ end
161
+ end
119
162
  end
120
163
 
121
- context "Campchair::LevelDB serialization" do
164
+ context "Campchair::Store serialization" do
122
165
  describe ".[]{,=}" do
123
166
  it "persists non-string data structures" do
124
167
  doc = { :sym => :sym, 'string' => 'string', 'types' => [1234.12341234, (55..44), /regexen/, Time.now, { 'a' => 22 }] }
@@ -16,7 +16,7 @@ describe "DB behavior" do
16
16
  }
17
17
 
18
18
  class TestPeople
19
- include Campchair::LevelDB
19
+ include Campchair::Store
20
20
  self.db_path = 'tmp/ccdb'
21
21
  end
22
22
  end
@@ -25,36 +25,31 @@ describe "DB behavior" do
25
25
  `rm -fr tmp/ccdb`
26
26
  end
27
27
 
28
- it "persists documents without an id" do
29
- id = TestPeople << @fred
30
- TestPeople << @jane
31
- end
32
-
33
- it "retrieves documents" do
34
- id = TestPeople << @fred
35
- TestPeople[id].should == @fred
28
+ it "persists documents" do
29
+ key = TestPeople << @fred
30
+ TestPeople[key].should == @fred
36
31
  end
37
32
 
38
33
  it "deletes documents" do
39
- id = TestPeople << @fred
40
- TestPeople.delete(id)
41
- TestPeople[id].should be_nil
34
+ key = TestPeople << @fred
35
+ TestPeople.delete(key)
36
+ TestPeople[key].should be_nil
42
37
  end
43
38
 
44
- it "updates docuemnts with an id" do
45
- id = TestPeople << @fred
39
+ it "updates docuemnts with a key" do
40
+ key = TestPeople << @fred
46
41
  new_last_seen = Time.local(2012, 3, 6, 12, 50)
47
42
  @fred[:last_seen] = new_last_seen
48
- TestPeople[id] = @fred
43
+ TestPeople[key] = @fred
49
44
 
50
- TestPeople[id][:last_seen].should == new_last_seen
45
+ TestPeople[key][:last_seen].should == new_last_seen
51
46
  end
52
47
 
53
- it "creates documents with an id" do
54
- id = 'something'
55
- TestPeople[id] = @fred
48
+ it "creates documents with a key" do
49
+ key = 'something'
50
+ TestPeople[key] = @fred
56
51
 
57
- TestPeople[id].should == @fred
52
+ TestPeople[key].should == @fred
58
53
  end
59
54
 
60
55
  end
data/spec/spec_helper.rb CHANGED
@@ -1,2 +1,8 @@
1
1
  $LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib'
2
2
  require 'campchair'
3
+
4
+ RSpec.configure do |config|
5
+ config.after(:each) do
6
+ `rm -fr tmp/ccdb`
7
+ end
8
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: campchair
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.1.0
5
5
  prerelease:
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: 2012-07-18 00:00:00.000000000 Z
12
+ date: 2012-11-16 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: leveldb-ruby
16
- requirement: &70242209955760 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,29 +21,44 @@ dependencies:
21
21
  version: '0.14'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70242209955760
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '0.14'
25
30
  - !ruby/object:Gem::Dependency
26
31
  name: rspec
27
- requirement: &70242209955340 !ruby/object:Gem::Requirement
32
+ requirement: !ruby/object:Gem::Requirement
28
33
  none: false
29
34
  requirements:
30
- - - ! '>='
35
+ - - ~>
31
36
  - !ruby/object:Gem::Version
32
- version: '0'
37
+ version: 2.12.0
33
38
  type: :development
34
39
  prerelease: false
35
- version_requirements: *70242209955340
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 2.12.0
36
46
  - !ruby/object:Gem::Dependency
37
47
  name: rake
38
- requirement: &70242209954880 !ruby/object:Gem::Requirement
48
+ requirement: !ruby/object:Gem::Requirement
39
49
  none: false
40
50
  requirements:
41
- - - ! '>='
51
+ - - ~>
42
52
  - !ruby/object:Gem::Version
43
- version: '0'
53
+ version: 10.0.0
44
54
  type: :development
45
55
  prerelease: false
46
- version_requirements: *70242209954880
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 10.0.0
47
62
  description: Campchair is a map-reduce framework using levelDB for persistence, and
48
63
  Ruby for everything else.
49
64
  email:
@@ -60,11 +75,13 @@ files:
60
75
  - Rakefile
61
76
  - campchair.gemspec
62
77
  - lib/campchair.rb
63
- - lib/campchair/leveldb.rb
78
+ - lib/campchair/model.rb
79
+ - lib/campchair/store.rb
64
80
  - lib/campchair/version.rb
65
81
  - lib/campchair/views.rb
66
82
  - spec/.gitkeep
67
- - spec/campchair/leveldb_spec.rb
83
+ - spec/campchair/model_spec.rb
84
+ - spec/campchair/store_spec.rb
68
85
  - spec/campchair/views_spec.rb
69
86
  - spec/campchair_spec.rb
70
87
  - spec/integration/readme_examples_spec.rb
@@ -90,12 +107,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
90
107
  version: '0'
91
108
  requirements: []
92
109
  rubyforge_project: campchair
93
- rubygems_version: 1.8.17
110
+ rubygems_version: 1.8.24
94
111
  signing_key:
95
112
  specification_version: 3
96
- summary: Lightweight, ghetto-tech CouchDB-like views in Ruby
113
+ summary: A fast, ghetto-tech CouchDB-like persistence layer for Ruby
97
114
  test_files:
98
- - spec/campchair/leveldb_spec.rb
115
+ - spec/campchair/model_spec.rb
116
+ - spec/campchair/store_spec.rb
99
117
  - spec/campchair/views_spec.rb
100
118
  - spec/campchair_spec.rb
101
119
  - spec/integration/readme_examples_spec.rb