storing 0.0.1 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|