storing 0.0.1 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +3 -1
- data/lib/storing/{abstract_adaptor.rb → abstract/abstract_adaptor.rb} +5 -1
- data/lib/storing/abstract/abstract_deleter.rb +7 -0
- data/lib/storing/abstract/abstract_inserter.rb +7 -0
- data/lib/storing/abstract/abstract_mapper.rb +11 -0
- data/lib/storing/abstract/abstract_query.rb +7 -0
- data/lib/storing/abstract/abstract_store.rb +35 -0
- data/lib/storing/abstract/abstract_updater.rb +7 -0
- data/lib/storing/deleter.rb +28 -0
- data/lib/storing/inserter.rb +28 -0
- data/lib/storing/postgres/{abstract_queries/abstract_select_query.rb → abstract_query.rb} +6 -6
- data/lib/storing/postgres/adaptor.rb +12 -28
- data/lib/storing/store.rb +96 -0
- data/lib/storing/updater.rb +28 -0
- data/lib/storing/version.rb +1 -1
- data/spec/migrate/1382997183_create_person.rb +10 -0
- data/spec/postgres/adaptor_spec.rb +62 -31
- data/spec/spec_helper.rb +2 -4
- data/spec/store_spec.rb +161 -0
- metadata +18 -20
- data/lib/storing/dataset.rb +0 -74
- data/lib/storing/entity_store.rb +0 -64
- data/lib/storing/postgres/abstract_queries/abstract_query.rb +0 -9
- data/lib/storing/postgres/queries/delete_query.rb +0 -16
- data/lib/storing/postgres/queries/insert_query.rb +0 -16
- data/lib/storing/postgres/queries/update_query.rb +0 -17
- data/spec/dataset_spec.rb +0 -89
- data/spec/entity_store_spec.rb +0 -71
- data/spec/postgres/adaptor/delete_query_spec.rb +0 -11
- data/spec/postgres/adaptor/insert_query_spec.rb +0 -11
- data/spec/postgres/adaptor/update_query_spec.rb +0 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 13109e121a21eb09c874b455d967b07e0fedbc48
|
4
|
+
data.tar.gz: 4876e62b5f58c6025e92de2479804bf3011d5fa4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0ca4a961a790fb3c124d845405da607b70246a617042f8ec0595f1b827c3718d7554807591800c24e6e45c39ff92ccf6953e84cdf8ba2d7ee3eb02cf5c299c21
|
7
|
+
data.tar.gz: abd06f54129e03fc7a39e6a7985ccbcfc18e463811eb4b8d923838cb5b0d0a04d6748c65b6bf28a685b9b8203811475a736387c1c439130e89737a1b32b00600
|
data/.gitignore
CHANGED
@@ -0,0 +1,35 @@
|
|
1
|
+
module Storing
|
2
|
+
class AbstractStore
|
3
|
+
def query query_obj
|
4
|
+
raise NotImplementedError
|
5
|
+
end
|
6
|
+
|
7
|
+
def select conditions={}
|
8
|
+
raise NotImplementedError
|
9
|
+
end
|
10
|
+
|
11
|
+
def insert entity_hash={}
|
12
|
+
raise NotImplementedError
|
13
|
+
end
|
14
|
+
|
15
|
+
def update entity_hash={}
|
16
|
+
raise NotImplementedError
|
17
|
+
end
|
18
|
+
|
19
|
+
def delete entity_hash={}
|
20
|
+
raise NotImplementedError
|
21
|
+
end
|
22
|
+
|
23
|
+
def transaction
|
24
|
+
raise NotImplementedError
|
25
|
+
end
|
26
|
+
|
27
|
+
def table_name
|
28
|
+
raise NotImplementedError
|
29
|
+
end
|
30
|
+
|
31
|
+
def primary_key
|
32
|
+
raise NotImplementedError
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'storing/deleters/abstract_deleter'
|
2
|
+
|
3
|
+
module Storing
|
4
|
+
class Deleter < AbstractDeleter
|
5
|
+
|
6
|
+
attr_reader :entity, :mapper, :store
|
7
|
+
|
8
|
+
def initialize entity, mapper, store
|
9
|
+
@entity = entity
|
10
|
+
@mapper = mapper
|
11
|
+
@store = store
|
12
|
+
end
|
13
|
+
|
14
|
+
def insert
|
15
|
+
store.delete(data)
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def data
|
21
|
+
mapper.dump_to_table(entity, table_name)
|
22
|
+
end
|
23
|
+
|
24
|
+
def table_name
|
25
|
+
store.table_name
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'storing/inserters/abstract_inserter'
|
2
|
+
|
3
|
+
module Storing
|
4
|
+
class Inserter < AbstractInserter
|
5
|
+
|
6
|
+
attr_reader :entity, :mapper, :store
|
7
|
+
|
8
|
+
def initialize entity, mapper, store
|
9
|
+
@entity = entity
|
10
|
+
@mapper = mapper
|
11
|
+
@store = store
|
12
|
+
end
|
13
|
+
|
14
|
+
def insert
|
15
|
+
store.insert(data)
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def data
|
21
|
+
mapper.dump_to_table(entity, table_name)
|
22
|
+
end
|
23
|
+
|
24
|
+
def table_name
|
25
|
+
store.table_name
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -1,8 +1,8 @@
|
|
1
|
-
require 'storing/
|
1
|
+
require 'storing/abstract/abstract_query'
|
2
2
|
|
3
3
|
module Storing
|
4
4
|
module Postgres
|
5
|
-
class
|
5
|
+
class AbstractQuery < ::Storing::AbstractQuery
|
6
6
|
attr_reader :query_object
|
7
7
|
|
8
8
|
def initialize query_object=nil
|
@@ -10,17 +10,17 @@ module Storing
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def query database
|
13
|
-
|
13
|
+
dataset(database).select_sql
|
14
14
|
end
|
15
15
|
|
16
|
-
def
|
17
|
-
|
16
|
+
def dataset database
|
17
|
+
raise NotImplementedError
|
18
18
|
end
|
19
19
|
|
20
20
|
private
|
21
21
|
|
22
22
|
def call_query_chain database
|
23
|
-
query_object ? query_object.
|
23
|
+
query_object ? query_object.dataset(database) : database
|
24
24
|
end
|
25
25
|
end
|
26
26
|
end
|
@@ -1,19 +1,9 @@
|
|
1
1
|
require 'sequel'
|
2
|
-
require 'storing/abstract_adaptor'
|
3
|
-
require 'storing/postgres/queries/insert_query'
|
4
|
-
require 'storing/postgres/queries/update_query'
|
5
|
-
require 'storing/postgres/queries/delete_query'
|
2
|
+
require 'storing/abstract/abstract_adaptor'
|
6
3
|
|
7
4
|
module Storing
|
8
5
|
module Postgres
|
9
6
|
class Adaptor < ::Storing::AbstractAdaptor
|
10
|
-
QUERY_METHOD_MAP = {
|
11
|
-
:select => :all,
|
12
|
-
:insert => :insert,
|
13
|
-
:update => :update,
|
14
|
-
:delete => :delete
|
15
|
-
}.freeze
|
16
|
-
|
17
7
|
attr_reader :database
|
18
8
|
|
19
9
|
def connect *args
|
@@ -25,33 +15,27 @@ module Storing
|
|
25
15
|
end
|
26
16
|
|
27
17
|
def query query_object
|
28
|
-
|
29
|
-
end
|
30
|
-
|
31
|
-
def insert table_name, params={}
|
32
|
-
execute_query(InsertQuery.new(table_name, params), :insert)
|
18
|
+
database[query_object.query(database)].all
|
33
19
|
end
|
34
20
|
|
35
|
-
def
|
36
|
-
|
21
|
+
def select table_name, conditions={}
|
22
|
+
database[table_name].where(conditions).all
|
37
23
|
end
|
38
24
|
|
39
|
-
def
|
40
|
-
|
25
|
+
def insert table_name, params={}
|
26
|
+
database[table_name].insert(params)
|
41
27
|
end
|
42
28
|
|
43
|
-
def
|
44
|
-
database.
|
29
|
+
def update table_name, params={}, conditions={}
|
30
|
+
database[table_name].where(conditions).update(params)
|
45
31
|
end
|
46
32
|
|
47
|
-
|
48
|
-
|
49
|
-
def execute_query query_object, type=:select
|
50
|
-
execute(query_object.to_sql(database), type)
|
33
|
+
def delete table_name, conditions={}
|
34
|
+
database[table_name].where(conditions).delete
|
51
35
|
end
|
52
36
|
|
53
|
-
def
|
54
|
-
database
|
37
|
+
def transaction &block
|
38
|
+
database.transaction &block
|
55
39
|
end
|
56
40
|
end
|
57
41
|
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
require 'storing/abstract/abstract_store'
|
2
|
+
require 'storing/exceptions'
|
3
|
+
|
4
|
+
module Storing
|
5
|
+
class Store < AbstractStore
|
6
|
+
class Entity
|
7
|
+
attr_reader :primary_key_column, :data
|
8
|
+
|
9
|
+
def initialize primary_key_column, data={}
|
10
|
+
@primary_key_column = primary_key_column
|
11
|
+
@data = data
|
12
|
+
end
|
13
|
+
|
14
|
+
def primary_key_hash
|
15
|
+
primary_key_columns.inject({}) do |memo, pk_col|
|
16
|
+
memo[pk_col] = data.fetch(pk_col)
|
17
|
+
memo
|
18
|
+
end
|
19
|
+
rescue KeyError => e
|
20
|
+
raise(MissingPrimaryKey, 'primary key missing in entity data hash')
|
21
|
+
end
|
22
|
+
|
23
|
+
def params
|
24
|
+
data.reject{|k,v| primary_key_columns.include? k }
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def primary_key_columns
|
30
|
+
[*primary_key_column]
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.set_primary_key val
|
35
|
+
@primary_key = val
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.primary_key
|
39
|
+
@primary_key || raise(MissingPrimaryKey, 'primary key not assigned')
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.set_table_name val
|
43
|
+
@table_name = val
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.table_name
|
47
|
+
@table_name || raise(MissingTableName, 'table name not assigned')
|
48
|
+
end
|
49
|
+
|
50
|
+
attr_reader :adaptor
|
51
|
+
|
52
|
+
def initialize adaptor
|
53
|
+
@adaptor = adaptor
|
54
|
+
end
|
55
|
+
|
56
|
+
def query query_object
|
57
|
+
adaptor.query(query_object)
|
58
|
+
end
|
59
|
+
|
60
|
+
def select conditions={}
|
61
|
+
adaptor.select(table_name, conditions)
|
62
|
+
end
|
63
|
+
|
64
|
+
def insert entity_hash={}
|
65
|
+
adaptor.insert(table_name, entity_hash)
|
66
|
+
end
|
67
|
+
|
68
|
+
def update entity_hash={}
|
69
|
+
entity = new_entity(entity_hash)
|
70
|
+
adaptor.update(table_name, entity.params, entity.primary_key_hash)
|
71
|
+
end
|
72
|
+
|
73
|
+
def delete entity_hash={}
|
74
|
+
entity = new_entity(entity_hash)
|
75
|
+
adaptor.delete(table_name, entity.primary_key_hash)
|
76
|
+
end
|
77
|
+
|
78
|
+
def transaction
|
79
|
+
adaptor.transaction
|
80
|
+
end
|
81
|
+
|
82
|
+
def table_name
|
83
|
+
self.class.table_name
|
84
|
+
end
|
85
|
+
|
86
|
+
def primary_key
|
87
|
+
self.class.primary_key
|
88
|
+
end
|
89
|
+
|
90
|
+
private
|
91
|
+
|
92
|
+
def new_entity entity_hash={}
|
93
|
+
::Storing::Store::Entity.new(primary_key, entity_hash)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'storing/updaters/abstract_updater'
|
2
|
+
|
3
|
+
module Storing
|
4
|
+
class Updater < AbstractUpdater
|
5
|
+
|
6
|
+
attr_reader :entity, :mapper, :store
|
7
|
+
|
8
|
+
def initialize entity, mapper, store
|
9
|
+
@entity = entity
|
10
|
+
@mapper = mapper
|
11
|
+
@store = store
|
12
|
+
end
|
13
|
+
|
14
|
+
def insert
|
15
|
+
store.update(data)
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def data
|
21
|
+
mapper.dump_to_table(entity, table_name)
|
22
|
+
end
|
23
|
+
|
24
|
+
def table_name
|
25
|
+
store.table_name
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/lib/storing/version.rb
CHANGED
@@ -2,53 +2,84 @@ require 'spec_helper'
|
|
2
2
|
require 'storing/postgres/adaptor'
|
3
3
|
|
4
4
|
describe Storing::Postgres::Adaptor do
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
5
|
+
let(:adaptor) { Storing::Postgres::Adaptor.new(DB) }
|
6
|
+
|
7
|
+
before do
|
8
|
+
DB[:person].insert(:first_name => 'Peter', :last_name => 'Parker', :age => 23)
|
9
|
+
DB[:person].insert(:first_name => 'Tony', :last_name => 'Stark', :age => 37)
|
10
|
+
DB[:person].insert(:first_name => 'Bruce', :last_name => 'Banner', :age => 33)
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "#select" do
|
14
|
+
it "returns all records" do
|
15
|
+
results = adaptor.select(:person)
|
16
|
+
results.map{|p| p[:first_name]}.must_equal ["Peter", "Tony", "Bruce"]
|
17
|
+
end
|
10
18
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
19
|
+
it "returns records conditionally" do
|
20
|
+
results = adaptor.select(:person, :first_name => 'Peter')
|
21
|
+
results.length.must_equal 1
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe "#insert" do
|
26
|
+
it "inserts record" do
|
27
|
+
adaptor.insert(:person, :first_name => 'Charles', :last_name => 'Xavier', :age => 67)
|
28
|
+
DB[:person][:first_name => 'Charles'].wont_be_nil
|
15
29
|
end
|
30
|
+
|
31
|
+
it "returns primary key" do
|
32
|
+
pk = adaptor.insert(:person, :first_name => 'Charles', :last_name => 'Xavier', :age => 67)
|
33
|
+
pk.to_s.must_match /^\d+$/
|
34
|
+
end
|
16
35
|
end
|
17
36
|
|
18
37
|
describe "#update" do
|
19
|
-
it "
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
query_object = stub
|
38
|
+
it "updates all records" do
|
39
|
+
adaptor.update(:person, :first_name => 'Jim')
|
40
|
+
DB[:person].each {|person| person[:first_name].must_equal 'Jim' }
|
41
|
+
end
|
24
42
|
|
25
|
-
|
26
|
-
adaptor
|
27
|
-
|
28
|
-
|
43
|
+
it "updates records conditionally" do
|
44
|
+
adaptor.update(:person, {:first_name => "Pete"}, {:last_name => 'Parker'})
|
45
|
+
DB[:person].map {|person| person[:first_name] }.must_equal ["Tony", "Bruce", "Pete"]
|
46
|
+
end
|
47
|
+
|
48
|
+
it "returns number of rows updated" do
|
49
|
+
adaptor.update(:person, :first_name => 'Jim').must_equal 3
|
29
50
|
end
|
30
51
|
end
|
31
52
|
|
32
53
|
describe "#delete" do
|
33
|
-
it "
|
34
|
-
|
35
|
-
|
36
|
-
|
54
|
+
it "deletes all records" do
|
55
|
+
adaptor.delete(:person)
|
56
|
+
DB[:person].all.length.must_equal 0
|
57
|
+
end
|
37
58
|
|
38
|
-
|
39
|
-
adaptor
|
40
|
-
|
41
|
-
|
59
|
+
it "deletes records conditionally" do
|
60
|
+
adaptor.delete(:person, :first_name => "Tony")
|
61
|
+
DB[:person].map {|person| person[:first_name] }.must_equal ["Peter", "Bruce"]
|
62
|
+
end
|
63
|
+
|
64
|
+
it "returns number of rows deleted" do
|
65
|
+
adaptor.delete(:person, :first_name => "Tony").must_equal 1
|
42
66
|
end
|
43
67
|
end
|
44
68
|
|
45
69
|
describe "#query" do
|
46
|
-
it "
|
47
|
-
query_object = stub
|
70
|
+
it "returns selected records" do
|
71
|
+
query_object = stub(:query => "SELECT * FROM person LIMIT 2")
|
72
|
+
result = adaptor.query(query_object)
|
73
|
+
result.map {|person| person[:first_name] }.must_equal ["Peter", "Tony"]
|
74
|
+
end
|
75
|
+
end
|
48
76
|
|
49
|
-
|
50
|
-
|
51
|
-
adaptor.
|
77
|
+
describe "#transaction" do
|
78
|
+
it "yields transaction to sequel" do
|
79
|
+
adaptor.transaction do
|
80
|
+
adaptor.update(:person, :first_name => 'Jim')
|
81
|
+
adaptor.delete(:person, :last_name => "Stark")
|
82
|
+
end
|
52
83
|
end
|
53
84
|
end
|
54
85
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,17 +1,15 @@
|
|
1
1
|
require 'minitest/autorun'
|
2
2
|
require 'mocha/setup'
|
3
3
|
require 'sequel'
|
4
|
-
|
5
|
-
DB = Sequel.connect("postgres://admin:Zbx8L9W33E@localhost/gazou_postgres_test", :encoding => 'unicode')
|
6
|
-
|
7
4
|
require 'database_cleaner'
|
8
5
|
|
6
|
+
DB = Sequel.connect("postgres://localhost/storing_test", :encoding => 'unicode')
|
7
|
+
|
9
8
|
DatabaseCleaner.strategy = :transaction
|
10
9
|
|
11
10
|
class MiniTest::Spec
|
12
11
|
before :each do
|
13
12
|
DatabaseCleaner.start
|
14
|
-
DB[:source_type].insert(:source_type_code => 'S3', :name => 'amazons3source')
|
15
13
|
end
|
16
14
|
|
17
15
|
after :each do
|
data/spec/store_spec.rb
ADDED
@@ -0,0 +1,161 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'storing/store'
|
3
|
+
|
4
|
+
describe Storing::Store do
|
5
|
+
let(:table_name) { 'subscription' }
|
6
|
+
let(:primary_key) { :subscription_id }
|
7
|
+
let(:adaptor){ stub }
|
8
|
+
let(:store) { Storing::Store.new(adaptor) }
|
9
|
+
|
10
|
+
before do
|
11
|
+
Storing::Store.set_primary_key primary_key
|
12
|
+
Storing::Store.set_table_name table_name
|
13
|
+
end
|
14
|
+
|
15
|
+
after do
|
16
|
+
Storing::Store.set_primary_key nil
|
17
|
+
Storing::Store.set_table_name nil
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "::set_primary_key" do
|
21
|
+
it "sets primary_key" do
|
22
|
+
Storing::Store.set_primary_key :user_id
|
23
|
+
Storing::Store.primary_key.must_equal :user_id
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe "::primary_key" do
|
28
|
+
describe "when primary_key is assigned" do
|
29
|
+
it "returns primary_key" do
|
30
|
+
Storing::Store.set_primary_key :user_id
|
31
|
+
Storing::Store.primary_key.must_equal :user_id
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe "when primary_key is unassigned" do
|
36
|
+
it "raises error" do
|
37
|
+
Storing::Store.set_primary_key nil
|
38
|
+
proc {Storing::Store.primary_key}.must_raise Storing::MissingPrimaryKey
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe "::set_table_name" do
|
44
|
+
it "sets primary_key" do
|
45
|
+
Storing::Store.set_table_name :users
|
46
|
+
Storing::Store.table_name.must_equal :users
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe "::table_name" do
|
51
|
+
describe "when table_name is assigned" do
|
52
|
+
it "returns table_name" do
|
53
|
+
Storing::Store.set_table_name :user_id
|
54
|
+
Storing::Store.table_name.must_equal :user_id
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe "when table_name is unassigned" do
|
59
|
+
it "raises error" do
|
60
|
+
Storing::Store.set_table_name nil
|
61
|
+
proc {Storing::Store.table_name}.must_raise Storing::MissingTableName
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
describe "#query" do
|
67
|
+
it "delegates to adaptor" do
|
68
|
+
arguments = stub
|
69
|
+
adaptor.expects(:query).with(arguments)
|
70
|
+
store.query(arguments)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
describe "#select" do
|
75
|
+
it "delegates to adaptor with table name" do
|
76
|
+
conditions = stub
|
77
|
+
adaptor.expects(:select).with(table_name, conditions)
|
78
|
+
store.select(conditions)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
describe "#insert" do
|
83
|
+
it "delegates to adaptor with table name" do
|
84
|
+
entity_hash = stub
|
85
|
+
adaptor.expects(:insert).with(table_name, entity_hash)
|
86
|
+
store.insert(entity_hash)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
describe "#update" do
|
91
|
+
it "delegates to adaptor with table name" do
|
92
|
+
entity_hash = stub
|
93
|
+
params = stub
|
94
|
+
primary_key_hash = stub
|
95
|
+
entity = stub(:params => params, :primary_key_hash => primary_key_hash)
|
96
|
+
store.expects(:new_entity).with(entity_hash).returns(entity)
|
97
|
+
adaptor.expects(:update).with(table_name, params, primary_key_hash)
|
98
|
+
store.update(entity_hash)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
describe "#delete" do
|
103
|
+
it "delegates to adaptor with table name" do
|
104
|
+
entity_hash = stub
|
105
|
+
primary_key_hash = stub
|
106
|
+
entity = stub(:primary_key_hash => primary_key_hash)
|
107
|
+
store.expects(:new_entity).with(entity_hash).returns(entity)
|
108
|
+
adaptor.expects(:delete).with(table_name, primary_key_hash)
|
109
|
+
store.delete(entity_hash)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
describe "#transaction" do
|
114
|
+
it "delegates to adaptor" do
|
115
|
+
adaptor.expects(:transaction)
|
116
|
+
store.transaction
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
describe "#table_name" do
|
121
|
+
it "returns class table_name" do
|
122
|
+
Storing::Store.set_table_name 'my new table name'
|
123
|
+
store.table_name.must_equal 'my new table name'
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
describe "#primary_key" do
|
128
|
+
it "returns class primary_key" do
|
129
|
+
Storing::Store.set_primary_key 'my new primary key'
|
130
|
+
store.primary_key.must_equal 'my new primary key'
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
describe Storing::Store::Entity do
|
136
|
+
let(:data) {{:user_id => 123, :user_type => 'client', :age => 23, :first_name => 'John', :last_name => 'Doe'}}
|
137
|
+
let(:primary_key_column){[:user_id, :user_type]}
|
138
|
+
let(:entity_data) {Storing::Store::Entity.new(primary_key_column, data)}
|
139
|
+
|
140
|
+
describe "#primary_key_hash" do
|
141
|
+
describe "when primary_key is assigned" do
|
142
|
+
it "returns primary key in hash format" do
|
143
|
+
entity_data.primary_key_hash.must_equal({:user_id => 123, :user_type => 'client'})
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
describe "when primary key key is missing from data" do
|
148
|
+
let(:data) {{:user_id => 123, :age => 23, :first_name => 'John', :last_name => 'Doe'}}
|
149
|
+
|
150
|
+
it "raises error" do
|
151
|
+
proc{ entity_data.primary_key_hash }.must_raise(Storing::MissingPrimaryKey)
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
describe "#params" do
|
157
|
+
it "returns data with primary key values removed" do
|
158
|
+
entity_data.params.must_equal(:age => 23, :first_name => 'John', :last_name => 'Doe')
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: storing
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Erik Lott
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-10-
|
11
|
+
date: 2013-10-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -122,24 +122,25 @@ files:
|
|
122
122
|
- README.md
|
123
123
|
- Rakefile
|
124
124
|
- lib/storing.rb
|
125
|
-
- lib/storing/abstract_adaptor.rb
|
126
|
-
- lib/storing/
|
127
|
-
- lib/storing/
|
125
|
+
- lib/storing/abstract/abstract_adaptor.rb
|
126
|
+
- lib/storing/abstract/abstract_deleter.rb
|
127
|
+
- lib/storing/abstract/abstract_inserter.rb
|
128
|
+
- lib/storing/abstract/abstract_mapper.rb
|
129
|
+
- lib/storing/abstract/abstract_query.rb
|
130
|
+
- lib/storing/abstract/abstract_store.rb
|
131
|
+
- lib/storing/abstract/abstract_updater.rb
|
132
|
+
- lib/storing/deleter.rb
|
128
133
|
- lib/storing/exceptions.rb
|
129
|
-
- lib/storing/
|
130
|
-
- lib/storing/postgres/
|
134
|
+
- lib/storing/inserter.rb
|
135
|
+
- lib/storing/postgres/abstract_query.rb
|
131
136
|
- lib/storing/postgres/adaptor.rb
|
132
|
-
- lib/storing/
|
133
|
-
- lib/storing/
|
134
|
-
- lib/storing/postgres/queries/update_query.rb
|
137
|
+
- lib/storing/store.rb
|
138
|
+
- lib/storing/updater.rb
|
135
139
|
- lib/storing/version.rb
|
136
|
-
- spec/
|
137
|
-
- spec/entity_store_spec.rb
|
138
|
-
- spec/postgres/adaptor/delete_query_spec.rb
|
139
|
-
- spec/postgres/adaptor/insert_query_spec.rb
|
140
|
-
- spec/postgres/adaptor/update_query_spec.rb
|
140
|
+
- spec/migrate/1382997183_create_person.rb
|
141
141
|
- spec/postgres/adaptor_spec.rb
|
142
142
|
- spec/spec_helper.rb
|
143
|
+
- spec/store_spec.rb
|
143
144
|
- storing.gemspec
|
144
145
|
homepage: ''
|
145
146
|
licenses:
|
@@ -166,10 +167,7 @@ signing_key:
|
|
166
167
|
specification_version: 4
|
167
168
|
summary: General storage interface
|
168
169
|
test_files:
|
169
|
-
- spec/
|
170
|
-
- spec/entity_store_spec.rb
|
171
|
-
- spec/postgres/adaptor/delete_query_spec.rb
|
172
|
-
- spec/postgres/adaptor/insert_query_spec.rb
|
173
|
-
- spec/postgres/adaptor/update_query_spec.rb
|
170
|
+
- spec/migrate/1382997183_create_person.rb
|
174
171
|
- spec/postgres/adaptor_spec.rb
|
175
172
|
- spec/spec_helper.rb
|
173
|
+
- spec/store_spec.rb
|
data/lib/storing/dataset.rb
DELETED
@@ -1,74 +0,0 @@
|
|
1
|
-
require 'storing/exceptions'
|
2
|
-
|
3
|
-
module Storing
|
4
|
-
class Dataset
|
5
|
-
class PrimaryKey
|
6
|
-
def self.from_hash key, params={}
|
7
|
-
keys = [*key]
|
8
|
-
values = params.values_at(*keys)
|
9
|
-
new(keys, values)
|
10
|
-
end
|
11
|
-
|
12
|
-
attr_reader :key, :value
|
13
|
-
|
14
|
-
def initialize key, value=nil
|
15
|
-
@key = key
|
16
|
-
@value = value
|
17
|
-
end
|
18
|
-
|
19
|
-
def to_hash
|
20
|
-
output = {}
|
21
|
-
keys.length.times do |i|
|
22
|
-
output[keys[i]] = values[i]
|
23
|
-
end
|
24
|
-
output
|
25
|
-
end
|
26
|
-
|
27
|
-
def reject_from params={}
|
28
|
-
params.reject{ |k,v| keys.include?(k) }
|
29
|
-
end
|
30
|
-
|
31
|
-
private
|
32
|
-
|
33
|
-
def keys
|
34
|
-
[*key]
|
35
|
-
end
|
36
|
-
|
37
|
-
def values
|
38
|
-
[*value]
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
attr_reader :adaptor, :table_name, :primary_key_column
|
43
|
-
|
44
|
-
def initialize adaptor, table_name, primary_key_column
|
45
|
-
@adaptor = adaptor
|
46
|
-
@table_name = table_name
|
47
|
-
@primary_key_column = primary_key_column
|
48
|
-
end
|
49
|
-
|
50
|
-
def insert params={}
|
51
|
-
primary_key_value = adaptor.insert(table_name, params)
|
52
|
-
::Storing::Dataset::PrimaryKey.new(primary_key_column, primary_key_value).to_hash
|
53
|
-
end
|
54
|
-
|
55
|
-
def update params={}
|
56
|
-
primary_key = ::Storing::Dataset::PrimaryKey.from_hash(primary_key_column, params)
|
57
|
-
filtered_params = primary_key.reject_from(params)
|
58
|
-
update_where(primary_key.to_hash, filtered_params)
|
59
|
-
end
|
60
|
-
|
61
|
-
def update_where conditions={}, params={}
|
62
|
-
adaptor.update(table_name, conditions, params)
|
63
|
-
end
|
64
|
-
|
65
|
-
def delete params={}
|
66
|
-
primary_key = ::Storing::Dataset::PrimaryKey.from_hash(primary_key_column, params)
|
67
|
-
delete_where(primary_key.to_hash)
|
68
|
-
end
|
69
|
-
|
70
|
-
def delete_where conditions={}
|
71
|
-
adaptor.delete(table_name, conditions)
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|
data/lib/storing/entity_store.rb
DELETED
@@ -1,64 +0,0 @@
|
|
1
|
-
require 'storing/exceptions'
|
2
|
-
require 'storing/dataset'
|
3
|
-
|
4
|
-
module Storing
|
5
|
-
class EntityStore
|
6
|
-
module Extension
|
7
|
-
def self.included(base)
|
8
|
-
base.extend ClassMethods
|
9
|
-
end
|
10
|
-
|
11
|
-
module ClassMethods
|
12
|
-
def set_primary_key val
|
13
|
-
@primary_key = val
|
14
|
-
end
|
15
|
-
|
16
|
-
def primary_key
|
17
|
-
@primary_key || raise(MissingPrimaryKey, 'primary key not assigned')
|
18
|
-
end
|
19
|
-
|
20
|
-
def set_table_name val
|
21
|
-
@table_name = val
|
22
|
-
end
|
23
|
-
|
24
|
-
def table_name
|
25
|
-
@table_name || raise(MissingTableName, 'table name not assigned')
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
attr_reader :adaptor
|
30
|
-
|
31
|
-
def initialize adaptor
|
32
|
-
@adaptor = adaptor
|
33
|
-
end
|
34
|
-
|
35
|
-
def insert *args
|
36
|
-
dataset.insert *args
|
37
|
-
end
|
38
|
-
|
39
|
-
def update *args
|
40
|
-
dataset.update *args
|
41
|
-
end
|
42
|
-
|
43
|
-
def update_where *args
|
44
|
-
dataset.update_where *args
|
45
|
-
end
|
46
|
-
|
47
|
-
def delete *args
|
48
|
-
dataset.delete *args
|
49
|
-
end
|
50
|
-
|
51
|
-
def delete_where *args
|
52
|
-
dataset.delete_where *args
|
53
|
-
end
|
54
|
-
|
55
|
-
private
|
56
|
-
|
57
|
-
def dataset
|
58
|
-
::Storing::Dataset.new(adaptor, self.class.table_name, self.class.primary_key)
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
include Extension
|
63
|
-
end
|
64
|
-
end
|
@@ -1,16 +0,0 @@
|
|
1
|
-
require 'storing/postgres/abstract_queries/abstract_query'
|
2
|
-
|
3
|
-
module Storing
|
4
|
-
module Postgres
|
5
|
-
class DeleteQuery < ::Storing::Postgres::AbstractQuery
|
6
|
-
def initialize table_name, conditions={}
|
7
|
-
@table_name = table_name
|
8
|
-
@conditions = conditions
|
9
|
-
end
|
10
|
-
|
11
|
-
def to_sql database
|
12
|
-
database[@table_name].where(@conditions).delete_sql
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
@@ -1,16 +0,0 @@
|
|
1
|
-
require 'storing/postgres/abstract_queries/abstract_query'
|
2
|
-
|
3
|
-
module Storing
|
4
|
-
module Postgres
|
5
|
-
class InsertQuery < ::Storing::Postgres::AbstractQuery
|
6
|
-
def initialize table_name, params={}
|
7
|
-
@table_name = table_name
|
8
|
-
@params = params
|
9
|
-
end
|
10
|
-
|
11
|
-
def to_sql database
|
12
|
-
database[@table_name].insert_sql(@params)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
require 'storing/postgres/abstract_queries/abstract_query'
|
2
|
-
|
3
|
-
module Storing
|
4
|
-
module Postgres
|
5
|
-
class UpdateQuery < ::Storing::Postgres::AbstractQuery
|
6
|
-
def initialize table_name, conditions={}, params={}
|
7
|
-
@table_name = table_name
|
8
|
-
@conditions = conditions
|
9
|
-
@params = params
|
10
|
-
end
|
11
|
-
|
12
|
-
def to_sql database
|
13
|
-
database[@table_name].where(@conditions).update_sql(@params)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
data/spec/dataset_spec.rb
DELETED
@@ -1,89 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'storing/dataset'
|
3
|
-
|
4
|
-
describe Storing::Dataset do
|
5
|
-
let(:table_name){ 'users' }
|
6
|
-
let(:adaptor){ stub }
|
7
|
-
let(:primary_key_column){ [:user_id, :user_type] }
|
8
|
-
let(:store){ Storing::Dataset.new(adaptor, table_name, primary_key_column) }
|
9
|
-
|
10
|
-
describe "#insert" do
|
11
|
-
let(:params){stub}
|
12
|
-
|
13
|
-
it "passes params to adaptor" do
|
14
|
-
adaptor.expects(:insert).with(table_name, params).returns([123, 'person'])
|
15
|
-
store.insert(params)
|
16
|
-
end
|
17
|
-
|
18
|
-
it "returns primary key hash" do
|
19
|
-
adaptor.expects(:insert).returns([123, 'person'])
|
20
|
-
store.insert(params).must_equal({:user_id=>123, :user_type=>"person"})
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
describe "#update" do
|
25
|
-
it "formats params and delegates to update_where method" do
|
26
|
-
params = {:user_id => 123, :user_type => "person", :first_name => 'john', :last_name => 'doe'}
|
27
|
-
store.expects(:update_where).with({:user_id => 123, :user_type => "person"}, {:first_name => 'john', :last_name => 'doe'})
|
28
|
-
store.update(params)
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
describe "#update_where" do
|
33
|
-
it "delegates to adaptor" do
|
34
|
-
adaptor_response = stub
|
35
|
-
params = stub
|
36
|
-
where = stub
|
37
|
-
adaptor.expects(:update).with(table_name, where, params).returns(adaptor_response)
|
38
|
-
store.update_where(where, params).must_equal(adaptor_response)
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
describe "#delete" do
|
43
|
-
it "delegates to delete_where method" do
|
44
|
-
params = {:user_id => 123, :user_type => "person", :first_name => 'john', :last_name => 'doe'}
|
45
|
-
store.expects(:delete_where).with({:user_id => 123, :user_type => "person"})
|
46
|
-
store.delete(params)
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
describe "#delete_where" do
|
51
|
-
it "delegates to adaptor" do
|
52
|
-
adaptor_response = stub
|
53
|
-
where = stub
|
54
|
-
adaptor.expects(:delete).with(table_name, where).returns(adaptor_response)
|
55
|
-
store.delete_where(where).must_equal(adaptor_response)
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
describe Storing::Dataset::PrimaryKey do
|
61
|
-
describe "#to_hash" do
|
62
|
-
it "returns hash version of primary key" do
|
63
|
-
pk = Storing::Dataset::PrimaryKey.new(:user_id, 123)
|
64
|
-
pk.to_hash.must_equal({:user_id => 123})
|
65
|
-
|
66
|
-
pk = Storing::Dataset::PrimaryKey.new([:user_id, :user_type], [123, 'person'])
|
67
|
-
pk.to_hash.must_equal({:user_id=>123, :user_type=>"person"})
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
describe "::from_hash" do
|
72
|
-
it "creates pk from hash" do
|
73
|
-
pk = Storing::Dataset::PrimaryKey.from_hash(:user_id, :user_id => 123, :name => 'john doe')
|
74
|
-
pk.key.must_equal [:user_id]
|
75
|
-
pk.value.must_equal [123]
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
describe "#reject_from" do
|
80
|
-
it "removes primary key from params" do
|
81
|
-
pk = Storing::Dataset::PrimaryKey.new([:user_id, :user_type])
|
82
|
-
pk.reject_from({
|
83
|
-
:user_id => 123,
|
84
|
-
:user_type => 'person',
|
85
|
-
:name => 'john doe'
|
86
|
-
}).must_equal({:name => 'john doe'})
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|
data/spec/entity_store_spec.rb
DELETED
@@ -1,71 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'storing/entity_store'
|
3
|
-
|
4
|
-
describe Storing::EntityStore::Extension do
|
5
|
-
let(:adaptor){stub}
|
6
|
-
let(:store_class) do
|
7
|
-
Class.new{
|
8
|
-
include Storing::EntityStore::Extension
|
9
|
-
set_table_name :user
|
10
|
-
set_primary_key :user_id
|
11
|
-
}
|
12
|
-
end
|
13
|
-
let(:store) { store_class.new(adaptor) }
|
14
|
-
|
15
|
-
describe "::set_primary_key" do
|
16
|
-
it "sets primary key on class" do
|
17
|
-
store_class.set_primary_key :subscription_id
|
18
|
-
store_class.primary_key.must_equal :subscription_id
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
describe "::set_table_name" do
|
23
|
-
it "sets primary key on class" do
|
24
|
-
store_class.set_table_name :subscription
|
25
|
-
store_class.table_name.must_equal :subscription
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
describe "instance methods" do
|
30
|
-
let(:dataset){ stub }
|
31
|
-
|
32
|
-
before do
|
33
|
-
store.expects(:dataset).returns(dataset)
|
34
|
-
end
|
35
|
-
|
36
|
-
describe "#insert" do
|
37
|
-
it "delegates to dataset" do
|
38
|
-
dataset.expects(:insert).with('blah')
|
39
|
-
store.insert('blah')
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
describe "#update" do
|
44
|
-
it "delegates to dataset" do
|
45
|
-
dataset.expects(:update).with('blah')
|
46
|
-
store.update('blah')
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
describe "#update_where" do
|
51
|
-
it "delegates to dataset" do
|
52
|
-
dataset.expects(:update_where).with('blah')
|
53
|
-
store.update_where('blah')
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
describe "#delete" do
|
58
|
-
it "delegates to dataset" do
|
59
|
-
dataset.expects(:delete).with('blah')
|
60
|
-
store.delete('blah')
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
describe "#delete_where" do
|
65
|
-
it "delegates to dataset" do
|
66
|
-
dataset.expects(:delete_where).with('blah')
|
67
|
-
store.delete_where('blah')
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
@@ -1,11 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'storing/postgres/queries/delete_query'
|
3
|
-
|
4
|
-
describe Storing::Postgres::DeleteQuery do
|
5
|
-
describe "to_sql" do
|
6
|
-
it "returns insert sql" do
|
7
|
-
query = Storing::Postgres::DeleteQuery.new(:user, :user_id => 123)
|
8
|
-
query.to_sql(DB).must_equal "DELETE FROM \"user\" WHERE (\"user_id\" = 123)"
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
@@ -1,11 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'storing/postgres/queries/insert_query'
|
3
|
-
|
4
|
-
describe Storing::Postgres::InsertQuery do
|
5
|
-
describe "to_sql" do
|
6
|
-
it "returns insert sql" do
|
7
|
-
query = Storing::Postgres::InsertQuery.new(:user, :user_id => 123, :name => 'John Doe', :age => 35)
|
8
|
-
query.to_sql(DB).must_equal "INSERT INTO \"user\" (\"user_id\", \"name\", \"age\") VALUES (123, 'John Doe', 35)"
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
@@ -1,13 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'storing/postgres/queries/update_query'
|
3
|
-
|
4
|
-
describe Storing::Postgres::UpdateQuery do
|
5
|
-
describe "to_sql" do
|
6
|
-
it "returns insert sql" do
|
7
|
-
conditions = {:user_id => 123}
|
8
|
-
params = {:name => 'John Doe', :age => 35}
|
9
|
-
query = Storing::Postgres::UpdateQuery.new(:user, conditions, params)
|
10
|
-
query.to_sql(DB).must_equal "UPDATE \"user\" SET \"name\" = 'John Doe', \"age\" = 35 WHERE (\"user_id\" = 123)"
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|