hashy_db 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +2 -11
- data/hashy_db.gemspec +4 -4
- data/lib/hashy_db.rb +1 -2
- data/lib/hashy_db/data_store.rb +25 -14
- data/lib/hashy_db/version.rb +2 -2
- data/spec/lib/data_store_spec.rb +42 -18
- metadata +12 -24
- data/examples/guitar.rb +0 -16
- data/examples/guitar_document.rb +0 -8
- data/lib/hashy_db/data_model.rb +0 -151
- data/spec/examples/guitar_document_spec.rb +0 -17
- data/spec/examples/guitar_spec.rb +0 -32
- data/spec/spec_helper.rb +0 -7
- data/spec/support/examples/data_model_examples.rb +0 -157
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# What is this?
|
2
2
|
|
3
|
-
|
3
|
+
Light weight ORM to persist data to a hash.
|
4
4
|
|
5
5
|
# Why would you want this?
|
6
6
|
|
@@ -13,18 +13,9 @@ Example in a rails app:
|
|
13
13
|
|
14
14
|
initializers/datastore.rb
|
15
15
|
|
16
|
-
`
|
16
|
+
`
|
17
17
|
::DB_HASH = {}
|
18
18
|
`
|
19
|
-
|
20
|
-
View the examples folder for an example implementation.
|
21
|
-
|
22
|
-
# Todos
|
23
|
-
|
24
|
-
- Make this into a gem
|
25
|
-
- Rename *.get_one into *.find
|
26
|
-
- Add a better readme
|
27
|
-
|
28
19
|
# Contribute
|
29
20
|
|
30
21
|
- fork into a topic branch, write specs, make a pull request.
|
data/hashy_db.gemspec
CHANGED
@@ -4,12 +4,12 @@ require 'hashy_db/version'
|
|
4
4
|
|
5
5
|
Gem::Specification.new do |s|
|
6
6
|
s.name = "hashy_db"
|
7
|
-
s.version =
|
7
|
+
s.version = HashyDb::VERSION
|
8
8
|
s.authors = ["Matt Simpson", "Jason Mayer"]
|
9
9
|
s.email = ["matt@railsgrammer.com", "jason.mayer@gmail.com"]
|
10
|
-
s.homepage = "https://github.com/
|
11
|
-
s.summary = %q{Provides an
|
12
|
-
s.description = %q{Provides an
|
10
|
+
s.homepage = "https://github.com/asynchrony/HashyDb"
|
11
|
+
s.summary = %q{Provides an interface to store and retrieve data in a Hash.}
|
12
|
+
s.description = %q{Provides an interface to store and retrieve data in a Hash.}
|
13
13
|
|
14
14
|
s.rubyforge_project = "hashy_db"
|
15
15
|
|
data/lib/hashy_db.rb
CHANGED
@@ -1,2 +1 @@
|
|
1
|
-
require 'hashy_db/data_store'
|
2
|
-
require 'hashy_db/data_model'
|
1
|
+
require 'hashy_db/data_store'
|
data/lib/hashy_db/data_store.rb
CHANGED
@@ -1,25 +1,32 @@
|
|
1
1
|
# SRP: Model with implementation on how to store each collection in a data store
|
2
2
|
require 'singleton'
|
3
3
|
require 'active_support/core_ext/module/delegation'
|
4
|
+
require 'digest'
|
4
5
|
|
5
|
-
module
|
6
|
+
module HashyDb
|
6
7
|
class DataStore
|
7
8
|
include Singleton
|
8
9
|
|
9
|
-
|
10
|
+
def self.primary_key_identifier
|
11
|
+
:id
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.generate_unique_id(salt)
|
15
|
+
Digest::SHA256.hexdigest("#{Time.current.utc}#{salt}")[0..6]
|
16
|
+
end
|
10
17
|
|
11
18
|
def add(collection_name, hash)
|
12
|
-
|
19
|
+
find_all(collection_name) << hash
|
13
20
|
end
|
14
21
|
|
15
22
|
def replace(collection_name, hash)
|
16
|
-
collection =
|
23
|
+
collection = find_all(collection_name)
|
17
24
|
index = collection.index{ |object| object[:id] == hash[:id] }
|
18
25
|
collection[index] = hash
|
19
26
|
end
|
20
27
|
|
21
28
|
def get_all_for_key_with_value(collection_name, key, value)
|
22
|
-
|
29
|
+
find_all(collection_name).select { |a| a[key] == value }
|
23
30
|
end
|
24
31
|
|
25
32
|
def get_for_key_with_value(collection_name, key, value)
|
@@ -27,21 +34,21 @@ module HashyDB
|
|
27
34
|
end
|
28
35
|
|
29
36
|
def get_by_params(collection_name, hash)
|
30
|
-
|
37
|
+
find_all(collection_name).select do |record|
|
31
38
|
hash.all?{|k,v| record[k] == v }
|
32
39
|
end
|
33
40
|
end
|
34
41
|
|
35
|
-
def
|
42
|
+
def find_all(collection_name)
|
36
43
|
data_store[collection_name] ||= []
|
37
44
|
end
|
38
45
|
|
39
|
-
def
|
40
|
-
|
46
|
+
def find(collection_name, key, value)
|
47
|
+
find_all(collection_name).find { |x| x[key] == value }
|
41
48
|
end
|
42
49
|
|
43
50
|
def push_to_array(collection_name, identifying_key, identifying_value, array_key, value_to_push)
|
44
|
-
record =
|
51
|
+
record = find(collection_name, identifying_key, identifying_value)
|
45
52
|
if (record[array_key])
|
46
53
|
record[array_key] << value_to_push
|
47
54
|
else
|
@@ -51,13 +58,13 @@ module HashyDB
|
|
51
58
|
end
|
52
59
|
|
53
60
|
def remove_from_array(collection_name, identifying_key, identifying_value, array_key, value_to_pop)
|
54
|
-
record =
|
61
|
+
record = find(collection_name, identifying_key, identifying_value)
|
55
62
|
record[array_key].reject! { |x| x == value_to_pop }
|
56
63
|
end
|
57
64
|
|
58
65
|
def containing_any(collection_name, key, values)
|
59
|
-
|
60
|
-
|
66
|
+
find_all(collection_name).select do |x|
|
67
|
+
if x[key].is_a?(Array)
|
61
68
|
(x[key] & values).any?
|
62
69
|
else
|
63
70
|
values.include?(x[key])
|
@@ -66,7 +73,7 @@ module HashyDB
|
|
66
73
|
end
|
67
74
|
|
68
75
|
def array_contains(collection_name, key, value)
|
69
|
-
|
76
|
+
find_all(collection_name).select do |x|
|
70
77
|
x[key] && x[key].include?(value)
|
71
78
|
end
|
72
79
|
end
|
@@ -79,6 +86,10 @@ module HashyDB
|
|
79
86
|
data_store[collection_name] = data
|
80
87
|
end
|
81
88
|
|
89
|
+
def set_data_store(hash)
|
90
|
+
@data_store = hash
|
91
|
+
end
|
92
|
+
|
82
93
|
private
|
83
94
|
|
84
95
|
def data_store
|
data/lib/hashy_db/version.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
module
|
2
|
-
VERSION = '0.0.
|
1
|
+
module HashyDb
|
2
|
+
VERSION = '0.0.4'
|
3
3
|
end
|
data/spec/lib/data_store_spec.rb
CHANGED
@@ -1,40 +1,64 @@
|
|
1
1
|
require_relative '../../lib/hashy_db/data_store'
|
2
2
|
|
3
|
-
describe
|
4
|
-
subject {
|
3
|
+
describe HashyDb::DataStore do
|
4
|
+
subject { HashyDb::DataStore.instance }
|
5
5
|
|
6
|
-
let(:data1) { {
|
7
|
-
let(:data2) { {
|
8
|
-
let(:data3) { {
|
6
|
+
let(:data1) { {id: 1, field_1: 'value 1', field_2: 3, field_3: [1, 2, 3], shared_between_1_and_2: 'awesome_value', :some_array => [1, 2, 3, 4]} }
|
7
|
+
let(:data2) { {id: 2, field_1: 'value 1.2', field_2: 6, shared_between_1_and_2: 'awesome_value', :some_array => [4, 5, 6]} }
|
8
|
+
let(:data3) { {id: 3, field_1: 'value 3', field_2: 9, shared_between_1_and_2: 'not the same as 1 and 2', :some_array => [1, 7]} }
|
9
9
|
|
10
10
|
before do
|
11
|
-
subject.
|
11
|
+
subject.set_data_store({})
|
12
|
+
|
12
13
|
subject.insert(:some_collection, [data1, data2, data3])
|
13
14
|
end
|
14
15
|
|
16
|
+
it 'has a primary key identifier' do
|
17
|
+
described_class.primary_key_identifier.should == :id
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "Generating a primary key" do
|
21
|
+
let(:data_model_id) { full_data_model_id[0..6] }
|
22
|
+
let(:full_data_model_id) { '1234567891423456789' }
|
23
|
+
let(:utc) { mock 'utc'}
|
24
|
+
let(:time) { mock 'time', :utc => utc}
|
25
|
+
let(:salt) { mock 'salt to ensure uniqeness' }
|
26
|
+
|
27
|
+
before do
|
28
|
+
Digest::SHA256.stub(:hexdigest => full_data_model_id)
|
29
|
+
Time.stub(:current => time)
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'should create a reasonably unique id' do
|
33
|
+
Digest::SHA256.should_receive(:hexdigest).with("#{utc}#{salt}").and_return(full_data_model_id)
|
34
|
+
|
35
|
+
described_class.generate_unique_id(salt).should == data_model_id
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
15
39
|
it 'can write and read data to and from a collection' do
|
16
|
-
data4 = {
|
40
|
+
data4 = {id: 3, field_1: 'value 3', field_2: 9, shared_between_1_and_2: 'not the same as 1 and 2', :some_array => [1, 7]}
|
17
41
|
|
18
42
|
subject.add(:some_collection, data4)
|
19
|
-
subject.
|
43
|
+
subject.find_all(:some_collection).should == [data1, data2, data3, data4]
|
20
44
|
end
|
21
45
|
|
22
46
|
it 'can replace a record' do
|
23
47
|
data2[:field_1] = 'value modified'
|
24
48
|
subject.replace(:some_collection, data2)
|
25
49
|
|
26
|
-
subject.
|
50
|
+
subject.find(:some_collection, :id, 2)[:field_1].should == 'value modified'
|
27
51
|
end
|
28
52
|
|
29
53
|
it 'can get one document' do
|
30
|
-
subject.
|
31
|
-
subject.
|
54
|
+
subject.find(:some_collection, :field_1, 'value 1').should == data1
|
55
|
+
subject.find(:some_collection, :field_2, 6).should == data2
|
32
56
|
end
|
33
57
|
|
34
58
|
it 'can clear the data store' do
|
35
59
|
subject.clear
|
36
60
|
|
37
|
-
subject.
|
61
|
+
subject.find_all(:some_collection).should == []
|
38
62
|
end
|
39
63
|
|
40
64
|
it 'can get all records of a specific key value' do
|
@@ -46,7 +70,7 @@ describe HashyDB::DataStore do
|
|
46
70
|
subject.containing_any(:some_collection, :some_array, [7, 2, 3]).should == [data1, data3]
|
47
71
|
subject.containing_any(:some_collection, :id, [1, 2, 5]).should == [data1, data2]
|
48
72
|
end
|
49
|
-
|
73
|
+
|
50
74
|
it 'can get all records where the array includes a value' do
|
51
75
|
subject.array_contains(:some_collection, :some_array, 1).should == [data1, data3]
|
52
76
|
subject.array_contains(:some_collection, :some_array_2, 1).should == []
|
@@ -56,24 +80,24 @@ describe HashyDB::DataStore do
|
|
56
80
|
subject.push_to_array(:some_collection, :id, 1, :field_3, 'add to existing array')
|
57
81
|
subject.push_to_array(:some_collection, :id, 1, :new_field, 'add to new array')
|
58
82
|
|
59
|
-
subject.
|
60
|
-
subject.
|
83
|
+
subject.find(:some_collection, :id, 1)[:field_3].should include('add to existing array')
|
84
|
+
subject.find(:some_collection, :id, 1)[:new_field].should == ['add to new array']
|
61
85
|
end
|
62
86
|
|
63
87
|
it 'can remove a value from an array for a specific record' do
|
64
88
|
subject.remove_from_array(:some_collection, :id, 1, :field_3, 2)
|
65
89
|
|
66
|
-
subject.
|
90
|
+
subject.find(:some_collection, :id, 1)[:field_3].should_not include(2)
|
67
91
|
end
|
68
92
|
|
69
93
|
it 'can get all records that match a given set of keys and values' do
|
70
94
|
records = subject.get_by_params(:some_collection, field_1: 'value 1', shared_between_1_and_2: 'awesome_value')
|
71
95
|
records.size.should be(1)
|
72
96
|
records.first[:id].should == 1
|
73
|
-
subject.
|
97
|
+
subject.find_all(:some_collection).size.should == 3
|
74
98
|
end
|
75
99
|
|
76
100
|
it 'can get a record for a specific key and value' do
|
77
101
|
subject.get_for_key_with_value(:some_collection, :field_1, 'value 1').should == data1
|
78
102
|
end
|
79
|
-
end
|
103
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hashy_db
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,11 +10,11 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2012-
|
13
|
+
date: 2012-03-02 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activesupport
|
17
|
-
requirement: &
|
17
|
+
requirement: &6801620 !ruby/object:Gem::Requirement
|
18
18
|
none: false
|
19
19
|
requirements:
|
20
20
|
- - ~>
|
@@ -22,10 +22,10 @@ dependencies:
|
|
22
22
|
version: '3.1'
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
|
-
version_requirements: *
|
25
|
+
version_requirements: *6801620
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
27
|
name: rake
|
28
|
-
requirement: &
|
28
|
+
requirement: &6800440 !ruby/object:Gem::Requirement
|
29
29
|
none: false
|
30
30
|
requirements:
|
31
31
|
- - ! '>='
|
@@ -33,10 +33,10 @@ dependencies:
|
|
33
33
|
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
|
-
version_requirements: *
|
36
|
+
version_requirements: *6800440
|
37
37
|
- !ruby/object:Gem::Dependency
|
38
38
|
name: rspec
|
39
|
-
requirement: &
|
39
|
+
requirement: &6799580 !ruby/object:Gem::Requirement
|
40
40
|
none: false
|
41
41
|
requirements:
|
42
42
|
- - ! '>='
|
@@ -44,8 +44,8 @@ dependencies:
|
|
44
44
|
version: '0'
|
45
45
|
type: :development
|
46
46
|
prerelease: false
|
47
|
-
version_requirements: *
|
48
|
-
description: Provides an
|
47
|
+
version_requirements: *6799580
|
48
|
+
description: Provides an interface to store and retrieve data in a Hash.
|
49
49
|
email:
|
50
50
|
- matt@railsgrammer.com
|
51
51
|
- jason.mayer@gmail.com
|
@@ -60,19 +60,12 @@ files:
|
|
60
60
|
- LICENSE.txt
|
61
61
|
- README.md
|
62
62
|
- Rakefile
|
63
|
-
- examples/guitar.rb
|
64
|
-
- examples/guitar_document.rb
|
65
63
|
- hashy_db.gemspec
|
66
64
|
- lib/hashy_db.rb
|
67
|
-
- lib/hashy_db/data_model.rb
|
68
65
|
- lib/hashy_db/data_store.rb
|
69
66
|
- lib/hashy_db/version.rb
|
70
|
-
- spec/examples/guitar_document_spec.rb
|
71
|
-
- spec/examples/guitar_spec.rb
|
72
67
|
- spec/lib/data_store_spec.rb
|
73
|
-
|
74
|
-
- spec/support/examples/data_model_examples.rb
|
75
|
-
homepage: https://github.com/coffeencoke/HashyDB
|
68
|
+
homepage: https://github.com/asynchrony/HashyDb
|
76
69
|
licenses: []
|
77
70
|
post_install_message:
|
78
71
|
rdoc_options: []
|
@@ -95,10 +88,5 @@ rubyforge_project: hashy_db
|
|
95
88
|
rubygems_version: 1.8.10
|
96
89
|
signing_key:
|
97
90
|
specification_version: 3
|
98
|
-
summary: Provides an
|
99
|
-
test_files:
|
100
|
-
- spec/examples/guitar_document_spec.rb
|
101
|
-
- spec/examples/guitar_spec.rb
|
102
|
-
- spec/lib/data_store_spec.rb
|
103
|
-
- spec/spec_helper.rb
|
104
|
-
- spec/support/examples/data_model_examples.rb
|
91
|
+
summary: Provides an interface to store and retrieve data in a Hash.
|
92
|
+
test_files: []
|
data/examples/guitar.rb
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
require_relative 'guitar_document'
|
2
|
-
|
3
|
-
class Guitar
|
4
|
-
attr_reader :brand, :price, :type, :color, :id
|
5
|
-
|
6
|
-
def initialize(attrs)
|
7
|
-
@brand = attrs[:brand]
|
8
|
-
@price = attrs[:price]
|
9
|
-
@type = attrs[:type]
|
10
|
-
@color = attrs[:color]
|
11
|
-
end
|
12
|
-
|
13
|
-
def store
|
14
|
-
@id = GuitarDocument.store(self)
|
15
|
-
end
|
16
|
-
end
|
data/examples/guitar_document.rb
DELETED
data/lib/hashy_db/data_model.rb
DELETED
@@ -1,151 +0,0 @@
|
|
1
|
-
# SRP: Interface to read and write to and from the data store class for a specific collection
|
2
|
-
|
3
|
-
require_relative '../hashy_db/data_store'
|
4
|
-
|
5
|
-
require 'digest'
|
6
|
-
require 'active_support/concern'
|
7
|
-
|
8
|
-
module HashyDB
|
9
|
-
module DataModel
|
10
|
-
extend ActiveSupport::Concern
|
11
|
-
|
12
|
-
included do
|
13
|
-
attr_reader :id, :model
|
14
|
-
end
|
15
|
-
|
16
|
-
module ClassMethods
|
17
|
-
def data_fields(*fields)
|
18
|
-
create_data_fields(*fields) if fields.any?
|
19
|
-
@data_fields
|
20
|
-
end
|
21
|
-
|
22
|
-
def data_collection(collection_name = nil)
|
23
|
-
set_data_collection(collection_name) if collection_name
|
24
|
-
@data_collection
|
25
|
-
end
|
26
|
-
|
27
|
-
def store(model)
|
28
|
-
new(model).tap do |p|
|
29
|
-
p.add_to_data_store
|
30
|
-
end.id
|
31
|
-
end
|
32
|
-
|
33
|
-
def update(model)
|
34
|
-
new(model).tap do |p|
|
35
|
-
p.replace_in_data_store
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
def remove_from_array(id, field, value)
|
40
|
-
HashyDB::DataStore.instance.remove_from_array(data_collection, :id, id, field, value)
|
41
|
-
end
|
42
|
-
|
43
|
-
def push_to_array(id, field, value)
|
44
|
-
HashyDB::DataStore.instance.push_to_array(data_collection, :id, id, field, value)
|
45
|
-
end
|
46
|
-
|
47
|
-
def get_one(id)
|
48
|
-
HashyDB::DataStore.instance.get_one(data_collection, :id, id)
|
49
|
-
end
|
50
|
-
|
51
|
-
def by_field(field, value)
|
52
|
-
DataStore.instance.get_for_key_with_value(data_collection, field, value)
|
53
|
-
end
|
54
|
-
|
55
|
-
def all
|
56
|
-
HashyDB::DataStore.instance.get(data_collection)
|
57
|
-
end
|
58
|
-
|
59
|
-
def all_by_field(field, value)
|
60
|
-
HashyDB::DataStore.instance.get_all_for_key_with_value(data_collection, field, value)
|
61
|
-
end
|
62
|
-
|
63
|
-
def all_by_fields(hash)
|
64
|
-
HashyDB::DataStore.instance.get_by_params(data_collection, hash)
|
65
|
-
end
|
66
|
-
|
67
|
-
def find_by_fields(hash)
|
68
|
-
all_by_fields(hash).first
|
69
|
-
end
|
70
|
-
|
71
|
-
def containing_any(field, values)
|
72
|
-
HashyDB::DataStore.instance.containing_any(data_collection, field, values)
|
73
|
-
end
|
74
|
-
|
75
|
-
def array_contains(field, value)
|
76
|
-
HashyDB::DataStore.instance.array_contains(data_collection, field, value)
|
77
|
-
end
|
78
|
-
|
79
|
-
private
|
80
|
-
|
81
|
-
def set_data_collection(collection_name)
|
82
|
-
@data_collection = collection_name
|
83
|
-
end
|
84
|
-
|
85
|
-
def create_data_fields(*fields)
|
86
|
-
attr_accessor *fields
|
87
|
-
@data_fields = fields
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
def initialize(model)
|
92
|
-
@model = model
|
93
|
-
set_data_field_values
|
94
|
-
set_id
|
95
|
-
end
|
96
|
-
|
97
|
-
def data_fields
|
98
|
-
self.class.data_fields
|
99
|
-
end
|
100
|
-
|
101
|
-
def data_collection
|
102
|
-
self.class.data_collection
|
103
|
-
end
|
104
|
-
|
105
|
-
def add_to_data_store
|
106
|
-
HashyDB::DataStore.instance.add(data_collection, attributes)
|
107
|
-
end
|
108
|
-
|
109
|
-
def replace_in_data_store
|
110
|
-
HashyDB::DataStore.instance.replace(data_collection, attributes)
|
111
|
-
end
|
112
|
-
|
113
|
-
private
|
114
|
-
|
115
|
-
def attributes
|
116
|
-
{ id: id }.merge(data_field_attributes)
|
117
|
-
end
|
118
|
-
|
119
|
-
def data_field_attributes
|
120
|
-
{}.tap do |hash|
|
121
|
-
data_fields.each do |field|
|
122
|
-
hash[field] = self.send(field)
|
123
|
-
end
|
124
|
-
end
|
125
|
-
end
|
126
|
-
|
127
|
-
def set_id
|
128
|
-
@id = if(model.respond_to?(:id) && model.id)
|
129
|
-
model.id
|
130
|
-
else
|
131
|
-
new_hash(Time.current)
|
132
|
-
end
|
133
|
-
end
|
134
|
-
|
135
|
-
def new_hash(salt)
|
136
|
-
Digest::SHA256.hexdigest("#{salt}#{model}")[0..6]
|
137
|
-
end
|
138
|
-
|
139
|
-
def set_data_field_values
|
140
|
-
data_fields.each { |field| set_data_field_value(field) }
|
141
|
-
end
|
142
|
-
|
143
|
-
def set_data_field_value(field)
|
144
|
-
self.send("#{field}=", model.send(field)) if field_exists?(field)
|
145
|
-
end
|
146
|
-
|
147
|
-
def field_exists?(field)
|
148
|
-
model.respond_to?(field) && !model.send(field).nil?
|
149
|
-
end
|
150
|
-
end
|
151
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
require_relative '../../examples/guitar_document'
|
2
|
-
|
3
|
-
require_relative '../support/examples/data_model_examples'
|
4
|
-
|
5
|
-
describe GuitarDocument do
|
6
|
-
let(:collection_name) { :guitars }
|
7
|
-
let(:data_field_attributes) do
|
8
|
-
{
|
9
|
-
brand: 'a brand everyone knows',
|
10
|
-
price: 'a price you save up for',
|
11
|
-
type: 'the kind you want',
|
12
|
-
color: 'should be your favorite'
|
13
|
-
}
|
14
|
-
end
|
15
|
-
|
16
|
-
it_behaves_like 'a data model'
|
17
|
-
end
|
@@ -1,32 +0,0 @@
|
|
1
|
-
require_relative '../../examples/guitar'
|
2
|
-
|
3
|
-
describe Guitar do
|
4
|
-
let(:attrs) { { brand: 'Gibson', price: 3399.99, type: 'Les Paul', color: 'Mahogany' } }
|
5
|
-
|
6
|
-
subject { described_class.new(attrs)}
|
7
|
-
|
8
|
-
its(:brand){ should == attrs[:brand] }
|
9
|
-
its(:price){ should == attrs[:price] }
|
10
|
-
its(:type){ should == attrs[:type] }
|
11
|
-
its(:color){ should == attrs[:color] }
|
12
|
-
|
13
|
-
describe "storing the guitar" do
|
14
|
-
let(:mock_id) { mock 'unique id for the guitar' }
|
15
|
-
|
16
|
-
before do
|
17
|
-
GuitarDocument.stub(store: mock_id)
|
18
|
-
end
|
19
|
-
|
20
|
-
it 'uses the guitar document to store it' do
|
21
|
-
GuitarDocument.should_receive(:store).with(subject).and_return(mock_id)
|
22
|
-
|
23
|
-
subject.store
|
24
|
-
end
|
25
|
-
|
26
|
-
it 'sets the id received from the document to the guitar so we can find it later' do
|
27
|
-
subject.store
|
28
|
-
|
29
|
-
subject.id.should == mock_id
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
data/spec/spec_helper.rb
DELETED
@@ -1,157 +0,0 @@
|
|
1
|
-
require 'digest'
|
2
|
-
require_relative '../../../lib/hashy_db/data_store'
|
3
|
-
|
4
|
-
shared_examples_for 'a data model' do
|
5
|
-
let(:mock_data_store) { mock 'data store data model' }
|
6
|
-
|
7
|
-
before do
|
8
|
-
HashyDB::DataStore.stub(:instance => mock_data_store)
|
9
|
-
end
|
10
|
-
|
11
|
-
describe "storing a data model" do
|
12
|
-
let(:current_time) { mock 'current time' }
|
13
|
-
let(:mock_data_model_string_rep) { mock 'data model string representation used for generating an id' }
|
14
|
-
let(:data_model_id) { full_data_model_id[0..6] }
|
15
|
-
let(:full_data_model_id) { '1234567891423456789' }
|
16
|
-
let(:mock_data_model) { mock 'a data model', data_field_attributes }
|
17
|
-
|
18
|
-
before do
|
19
|
-
Time.stub(:current => current_time)
|
20
|
-
Digest::SHA256.stub(:hexdigest => full_data_model_id)
|
21
|
-
mock_data_store.stub(:add)
|
22
|
-
end
|
23
|
-
|
24
|
-
it 'creates a unique hash for the id' do
|
25
|
-
Digest::SHA256.should_receive(:hexdigest).with("#{current_time}#{mock_data_model}").and_return(full_data_model_id)
|
26
|
-
|
27
|
-
described_class.store(mock_data_model)
|
28
|
-
end
|
29
|
-
|
30
|
-
it 'adds the data model to the db store' do
|
31
|
-
mock_data_store.should_receive(:add).with(collection_name, {id: data_model_id}.merge(data_field_attributes))
|
32
|
-
|
33
|
-
described_class.store(mock_data_model)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
describe "updating a data model" do
|
38
|
-
let(:data_model_id) { '1234567' }
|
39
|
-
let(:mock_model) { mock 'a model', {:id => data_model_id}.merge(data_field_attributes) }
|
40
|
-
|
41
|
-
before do
|
42
|
-
mock_data_store.stub(:replace)
|
43
|
-
end
|
44
|
-
|
45
|
-
it 'replaces the data model in the db store' do
|
46
|
-
mock_data_store.should_receive(:replace).with(collection_name, {id: data_model_id}.merge(data_field_attributes))
|
47
|
-
|
48
|
-
described_class.update(mock_model)
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
describe "pushing a value to an array for a data model" do
|
53
|
-
let(:data_model_id) { '1234567' }
|
54
|
-
|
55
|
-
it 'replaces the data model in the db store' do
|
56
|
-
mock_data_store.should_receive(:push_to_array).with(collection_name, :id, data_model_id, :array_field, 'some value')
|
57
|
-
|
58
|
-
described_class.push_to_array(data_model_id, :array_field, 'some value')
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
describe "getting all data models with a specific value for a field" do
|
63
|
-
let(:mock_data_models) { mock 'data models in the data store' }
|
64
|
-
subject { described_class.array_contains(:some_field, 'some value') }
|
65
|
-
|
66
|
-
it 'returns the stored data models with the requested field / value' do
|
67
|
-
mock_data_store.should_receive(:array_contains).with(collection_name, :some_field, 'some value').and_return(mock_data_models)
|
68
|
-
|
69
|
-
subject.should == mock_data_models
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
describe "removing a value from an array for a data model" do
|
74
|
-
let(:data_model_id) { '1234567' }
|
75
|
-
|
76
|
-
it 'removes the value from the array' do
|
77
|
-
mock_data_store.should_receive(:remove_from_array).with(collection_name, :id, data_model_id, :array_field, 'some value')
|
78
|
-
|
79
|
-
described_class.remove_from_array(data_model_id, :array_field, 'some value')
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
describe 'getting all of the data models' do
|
84
|
-
let(:mock_data_models) { mock 'data models in the data store' }
|
85
|
-
|
86
|
-
it 'returns the stored data models' do
|
87
|
-
mock_data_store.should_receive(:get).with(collection_name).and_return(mock_data_models)
|
88
|
-
|
89
|
-
described_class.all.should == mock_data_models
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
describe "getting a data model by a specific field" do
|
94
|
-
let(:mock_data_model) { mock 'data model in the data store' }
|
95
|
-
|
96
|
-
it 'returns the stored data models' do
|
97
|
-
mock_data_store.should_receive(:get_for_key_with_value).with(collection_name, :field, 'some value').and_return(mock_data_model)
|
98
|
-
|
99
|
-
described_class.by_field(:field, 'some value').should == mock_data_model
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
describe "getting all the data fields by a parameter hash" do
|
104
|
-
let(:mock_data_models) { mock 'some data model'}
|
105
|
-
let(:sample_hash) { {field1: nil, field2: 'not nil' }}
|
106
|
-
|
107
|
-
it 'passes the hash to the DataStore' do
|
108
|
-
mock_data_store.should_receive(:get_by_params).with(collection_name, sample_hash).and_return(mock_data_models)
|
109
|
-
|
110
|
-
described_class.all_by_fields(sample_hash).should == mock_data_models
|
111
|
-
end
|
112
|
-
end
|
113
|
-
|
114
|
-
describe "getting a record by a set of key values" do
|
115
|
-
let(:mock_data_model) { mock 'some data model' }
|
116
|
-
let(:mock_data_models) { [mock_data_model]}
|
117
|
-
let(:sample_hash) { {field1: nil, field2: 'not nil' }}
|
118
|
-
|
119
|
-
it 'passes the hash to the DataStore' do
|
120
|
-
mock_data_store.should_receive(:get_by_params).with(collection_name, sample_hash).and_return(mock_data_models)
|
121
|
-
|
122
|
-
described_class.find_by_fields(sample_hash).should == mock_data_model
|
123
|
-
end
|
124
|
-
end
|
125
|
-
|
126
|
-
describe "getting all of the data models for a where a field contains any value of a given array of values" do
|
127
|
-
let(:mock_data_models) { mock 'data models in the data store' }
|
128
|
-
subject { described_class.containing_any(:some_field, ['value 1', 'value 2']) }
|
129
|
-
|
130
|
-
it 'returns the stored data models' do
|
131
|
-
mock_data_store.should_receive(:containing_any).with(collection_name, :some_field, ['value 1', 'value 2']).and_return(mock_data_models)
|
132
|
-
|
133
|
-
subject.should == mock_data_models
|
134
|
-
end
|
135
|
-
end
|
136
|
-
|
137
|
-
describe "getting all data models with a specific value for a field" do
|
138
|
-
let(:mock_data_models) { mock 'data models in the data store' }
|
139
|
-
subject { described_class.all_by_field(:some_field, 'some value') }
|
140
|
-
|
141
|
-
it 'returns the stored data models with the requested field / value' do
|
142
|
-
mock_data_store.should_receive(:get_all_for_key_with_value).with(collection_name, :some_field, 'some value').and_return(mock_data_models)
|
143
|
-
|
144
|
-
subject.should == mock_data_models
|
145
|
-
end
|
146
|
-
end
|
147
|
-
|
148
|
-
describe 'getting a specific data model' do
|
149
|
-
let(:mock_data_model) { mock 'data_model', :id => 'id' }
|
150
|
-
|
151
|
-
it 'returns the data model from the data store' do
|
152
|
-
mock_data_store.should_receive(:get_one).with(collection_name, :id, mock_data_model.id).and_return(mock_data_model)
|
153
|
-
|
154
|
-
described_class.get_one(mock_data_model.id).should == mock_data_model
|
155
|
-
end
|
156
|
-
end
|
157
|
-
end
|