campchair 0.0.4 → 0.1.0

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