storing 0.0.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (32) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -1
  3. data/lib/storing/{abstract_adaptor.rb → abstract/abstract_adaptor.rb} +5 -1
  4. data/lib/storing/abstract/abstract_deleter.rb +7 -0
  5. data/lib/storing/abstract/abstract_inserter.rb +7 -0
  6. data/lib/storing/abstract/abstract_mapper.rb +11 -0
  7. data/lib/storing/abstract/abstract_query.rb +7 -0
  8. data/lib/storing/abstract/abstract_store.rb +35 -0
  9. data/lib/storing/abstract/abstract_updater.rb +7 -0
  10. data/lib/storing/deleter.rb +28 -0
  11. data/lib/storing/inserter.rb +28 -0
  12. data/lib/storing/postgres/{abstract_queries/abstract_select_query.rb → abstract_query.rb} +6 -6
  13. data/lib/storing/postgres/adaptor.rb +12 -28
  14. data/lib/storing/store.rb +96 -0
  15. data/lib/storing/updater.rb +28 -0
  16. data/lib/storing/version.rb +1 -1
  17. data/spec/migrate/1382997183_create_person.rb +10 -0
  18. data/spec/postgres/adaptor_spec.rb +62 -31
  19. data/spec/spec_helper.rb +2 -4
  20. data/spec/store_spec.rb +161 -0
  21. metadata +18 -20
  22. data/lib/storing/dataset.rb +0 -74
  23. data/lib/storing/entity_store.rb +0 -64
  24. data/lib/storing/postgres/abstract_queries/abstract_query.rb +0 -9
  25. data/lib/storing/postgres/queries/delete_query.rb +0 -16
  26. data/lib/storing/postgres/queries/insert_query.rb +0 -16
  27. data/lib/storing/postgres/queries/update_query.rb +0 -17
  28. data/spec/dataset_spec.rb +0 -89
  29. data/spec/entity_store_spec.rb +0 -71
  30. data/spec/postgres/adaptor/delete_query_spec.rb +0 -11
  31. data/spec/postgres/adaptor/insert_query_spec.rb +0 -11
  32. 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: cb9e623717833ee559b94a421d1e9d5dc09abd16
4
- data.tar.gz: 5bf793aecad4f3feee07cfc09addec3f04b58aec
3
+ metadata.gz: 13109e121a21eb09c874b455d967b07e0fedbc48
4
+ data.tar.gz: 4876e62b5f58c6025e92de2479804bf3011d5fa4
5
5
  SHA512:
6
- metadata.gz: 37b4a7c8a7a4fc734c58cdcbc803193b13aedca68fe1e7d6e4c90f4224044b168a8b4a0c88e1db39a019f4e94223bc6ad88efe28f0357fcbb1e67d8ce419d210
7
- data.tar.gz: f98e2341b7d7e01c5cd11a821f24fe1a59d9d270a9623f9e90437440fb82e01b7c3bfa9ceefe278e9d7add9a5c3bf3317d38d656ea96e808b9edb080b5edd730
6
+ metadata.gz: 0ca4a961a790fb3c124d845405da607b70246a617042f8ec0595f1b827c3718d7554807591800c24e6e45c39ff92ccf6953e84cdf8ba2d7ee3eb02cf5c299c21
7
+ data.tar.gz: abd06f54129e03fc7a39e6a7985ccbcfc18e463811eb4b8d923838cb5b0d0a04d6748c65b6bf28a685b9b8203811475a736387c1c439130e89737a1b32b00600
data/.gitignore CHANGED
@@ -3,7 +3,9 @@
3
3
  .bundle
4
4
  .config
5
5
  .yardoc
6
+ .env
6
7
  Gemfile.lock
8
+ Guardfile
7
9
  InstalledFiles
8
10
  _yardoc
9
11
  coverage
@@ -14,4 +16,4 @@ rdoc
14
16
  spec/reports
15
17
  test/tmp
16
18
  test/version_tmp
17
- tmp
19
+ tmp
@@ -1,6 +1,10 @@
1
1
  module Storing
2
2
  class AbstractAdaptor
3
- def query query_obj
3
+ def query query_object
4
+ raise NotImplementedError
5
+ end
6
+
7
+ def select table_name, conditions={}
4
8
  raise NotImplementedError
5
9
  end
6
10
 
@@ -0,0 +1,7 @@
1
+ module Storing
2
+ class AbstractDeleter
3
+ def delete
4
+ raise NotImplementedError
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module Storing
2
+ class AbstractInserter
3
+ def insert
4
+ raise NotImplementedError
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,11 @@
1
+ module Storing
2
+ class AbstractMapper
3
+ def self.parse data={}
4
+ raise NotImplementedError
5
+ end
6
+
7
+ def self.dump_to_table entity, table_name
8
+ raise NotImplementedError
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,7 @@
1
+ module Storing
2
+ class AbstractQuery
3
+ def query
4
+ raise NotImplementedError
5
+ end
6
+ end
7
+ end
@@ -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,7 @@
1
+ module Storing
2
+ class AbstractUpdater
3
+ def update
4
+ raise NotImplementedError
5
+ end
6
+ end
7
+ 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/postgres/abstract_queries/abstract_query'
1
+ require 'storing/abstract/abstract_query'
2
2
 
3
3
  module Storing
4
4
  module Postgres
5
- class AbstractSelectQuery < AbstractQuery
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
- raise NotImplementedError
13
+ dataset(database).select_sql
14
14
  end
15
15
 
16
- def to_sql database
17
- query(database).select_sql
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.query(database) : database
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
- execute_query(query_object, :select)
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 update table_name, conditions={}, params={}
36
- execute_query(UpdateQuery.new(table_name, conditions, params), :update)
21
+ def select table_name, conditions={}
22
+ database[table_name].where(conditions).all
37
23
  end
38
24
 
39
- def delete table_name, conditions={}
40
- execute_query(DeleteQuery.new(table_name, conditions), :delete)
25
+ def insert table_name, params={}
26
+ database[table_name].insert(params)
41
27
  end
42
28
 
43
- def transaction
44
- database.transaction
29
+ def update table_name, params={}, conditions={}
30
+ database[table_name].where(conditions).update(params)
45
31
  end
46
32
 
47
- private
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 execute sql, type=:select
54
- database[sql].send(QUERY_METHOD_MAP.fetch(type))
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
@@ -1,3 +1,3 @@
1
1
  module Storing
2
- VERSION = "0.0.1"
2
+ VERSION = "1.0.0"
3
3
  end
@@ -0,0 +1,10 @@
1
+ Sequel.migration do
2
+ change do
3
+ create_table(:person) do
4
+ primary_key :person_id
5
+ String :first_name, :null=>false
6
+ String :last_name, :null=>false
7
+ Integer :age, :null=>false
8
+ end
9
+ end
10
+ end
@@ -2,53 +2,84 @@ require 'spec_helper'
2
2
  require 'storing/postgres/adaptor'
3
3
 
4
4
  describe Storing::Postgres::Adaptor do
5
- describe "#insert" do
6
- it "delegates to execute_query method" do
7
- table_name = stub
8
- params = stub
9
- query_object = stub
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
- Storing::Postgres::InsertQuery.expects(:new).with(table_name, params).returns(query_object)
12
- adaptor = Storing::Postgres::Adaptor.new(DB)
13
- adaptor.expects(:execute_query).with(query_object, :insert)
14
- adaptor.insert(table_name, params)
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 "delegates to execute_query method" do
20
- table_name = stub
21
- conditions = stub
22
- params = stub
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
- Storing::Postgres::UpdateQuery.expects(:new).with(table_name, conditions, params).returns(query_object)
26
- adaptor = Storing::Postgres::Adaptor.new(DB)
27
- adaptor.expects(:execute_query).with(query_object, :update)
28
- adaptor.update(table_name, conditions, params)
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 "delegates to execute_query method" do
34
- table_name = stub
35
- conditions = stub
36
- query_object = stub
54
+ it "deletes all records" do
55
+ adaptor.delete(:person)
56
+ DB[:person].all.length.must_equal 0
57
+ end
37
58
 
38
- Storing::Postgres::DeleteQuery.expects(:new).with(table_name, conditions).returns(query_object)
39
- adaptor = Storing::Postgres::Adaptor.new(DB)
40
- adaptor.expects(:execute_query).with(query_object, :delete)
41
- adaptor.delete(table_name, conditions)
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 "delegates to execute_query method" do
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
- adaptor = Storing::Postgres::Adaptor.new(DB)
50
- adaptor.expects(:execute_query).with(query_object, :select)
51
- adaptor.query(query_object)
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
@@ -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.1
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-27 00:00:00.000000000 Z
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/dataset.rb
127
- - lib/storing/entity_store.rb
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/postgres/abstract_queries/abstract_query.rb
130
- - lib/storing/postgres/abstract_queries/abstract_select_query.rb
134
+ - lib/storing/inserter.rb
135
+ - lib/storing/postgres/abstract_query.rb
131
136
  - lib/storing/postgres/adaptor.rb
132
- - lib/storing/postgres/queries/delete_query.rb
133
- - lib/storing/postgres/queries/insert_query.rb
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/dataset_spec.rb
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/dataset_spec.rb
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
@@ -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
@@ -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,9 +0,0 @@
1
- module Storing
2
- module Postgres
3
- class AbstractQuery
4
- def to_sql database
5
- raise NotImplementedError
6
- end
7
- end
8
- end
9
- 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
@@ -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