hashy_db 0.0.3 → 0.0.4
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 +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
|