ardb 0.23.0 → 0.24.0
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/ardb/relation_spy.rb +6 -0
- data/lib/ardb/use_db_default.rb +55 -0
- data/lib/ardb/version.rb +1 -1
- data/test/unit/relation_spy_tests.rb +18 -1
- data/test/unit/use_db_default_tests.rb +155 -0
- metadata +7 -4
data/lib/ardb/relation_spy.rb
CHANGED
@@ -4,11 +4,13 @@ module Ardb
|
|
4
4
|
|
5
5
|
attr_reader :applied
|
6
6
|
attr_accessor :limit_value, :offset_value
|
7
|
+
attr_accessor :pluck_values
|
7
8
|
attr_accessor :results
|
8
9
|
|
9
10
|
def initialize
|
10
11
|
@applied, @results = [], []
|
11
12
|
@offset_value, @limit_value = nil, nil
|
13
|
+
@pluck_values = {}
|
12
14
|
end
|
13
15
|
|
14
16
|
def initialize_copy(copied_from)
|
@@ -128,6 +130,10 @@ module Ardb
|
|
128
130
|
all.size
|
129
131
|
end
|
130
132
|
|
133
|
+
def pluck(column_name)
|
134
|
+
[@pluck_values[column_name]] * @results.size
|
135
|
+
end
|
136
|
+
|
131
137
|
class AppliedExpression < Struct.new(:type, :args)
|
132
138
|
def to_sql
|
133
139
|
"#{self.type}: #{self.args.inspect}"
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module Ardb
|
2
|
+
|
3
|
+
module UseDbDefault
|
4
|
+
|
5
|
+
def self.included(klass)
|
6
|
+
klass.class_eval do
|
7
|
+
extend ClassMethods
|
8
|
+
include InstanceMethods
|
9
|
+
|
10
|
+
@ardb_use_db_default_attrs = []
|
11
|
+
|
12
|
+
around_create :ardb_allow_db_to_default_attrs
|
13
|
+
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
module ClassMethods
|
18
|
+
|
19
|
+
def use_db_default_attrs
|
20
|
+
@ardb_use_db_default_attrs
|
21
|
+
end
|
22
|
+
|
23
|
+
def use_db_default(*attrs)
|
24
|
+
@ardb_use_db_default_attrs += attrs.map(&:to_s)
|
25
|
+
@ardb_use_db_default_attrs.uniq!
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
module InstanceMethods
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def ardb_allow_db_to_default_attrs
|
35
|
+
# this allows the attr to be defaulted by the DB, this keeps
|
36
|
+
# activerecord from adding the attr into the sql `INSERT`, which will
|
37
|
+
# make the DB default its value
|
38
|
+
unchanged_names = self.class.use_db_default_attrs.reject do |name|
|
39
|
+
self.send("#{name}_changed?")
|
40
|
+
end
|
41
|
+
unchanged_names.each{ |name| @attributes.delete(name) }
|
42
|
+
yield
|
43
|
+
# we have to go and fetch the attr value from the DB, otherwise
|
44
|
+
# activerecord doesn't know the value that the DB used
|
45
|
+
scope = self.class.where(:id => self.id)
|
46
|
+
unchanged_names.each do |name|
|
47
|
+
@attributes[name] = scope.pluck(name).first
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
data/lib/ardb/version.rb
CHANGED
@@ -13,6 +13,7 @@ class Ardb::RelationSpy
|
|
13
13
|
should have_readers :applied
|
14
14
|
should have_accessors :results
|
15
15
|
should have_accessors :limit_value, :offset_value
|
16
|
+
should have_accessors :pluck_values
|
16
17
|
should have_imeths :to_sql, :reset!
|
17
18
|
should have_imeths :select
|
18
19
|
should have_imeths :from
|
@@ -24,13 +25,14 @@ class Ardb::RelationSpy
|
|
24
25
|
should have_imeths :limit, :offset
|
25
26
|
should have_imeths :merge, :only, :except
|
26
27
|
should have_imeths :find, :first, :first!, :last, :last!, :all
|
27
|
-
should have_imeths :count
|
28
|
+
should have_imeths :count, :pluck
|
28
29
|
|
29
30
|
should "default it's attributes" do
|
30
31
|
assert_equal [], subject.applied
|
31
32
|
assert_equal [], subject.results
|
32
33
|
assert_nil subject.limit_value
|
33
34
|
assert_nil subject.offset_value
|
35
|
+
assert_equal({}, subject.pluck_values)
|
34
36
|
end
|
35
37
|
|
36
38
|
should "dup its applied and results arrays when copied" do
|
@@ -470,6 +472,21 @@ class Ardb::RelationSpy
|
|
470
472
|
|
471
473
|
end
|
472
474
|
|
475
|
+
class PluckTests < WithResultsTests
|
476
|
+
desc "pluck"
|
477
|
+
setup do
|
478
|
+
@column_name = Factory.string
|
479
|
+
@column_value = Factory.string
|
480
|
+
@relation_spy.pluck_values[@column_name] = @column_value
|
481
|
+
end
|
482
|
+
|
483
|
+
should "return a pluck value for every result" do
|
484
|
+
exp = [@column_value] * @results.size
|
485
|
+
assert_equal exp, @relation_spy.pluck(@column_name)
|
486
|
+
end
|
487
|
+
|
488
|
+
end
|
489
|
+
|
473
490
|
class AppliedExpressionTests < UnitTests
|
474
491
|
desc "AppliedExpression"
|
475
492
|
setup do
|
@@ -0,0 +1,155 @@
|
|
1
|
+
require 'assert'
|
2
|
+
require 'ardb/use_db_default'
|
3
|
+
|
4
|
+
require 'ardb/record_spy'
|
5
|
+
|
6
|
+
module Ardb::UseDbDefault
|
7
|
+
|
8
|
+
class UnitTests < Assert::Context
|
9
|
+
desc "Ardb::UseDbDefault"
|
10
|
+
setup do
|
11
|
+
@record_class = Class.new do
|
12
|
+
include UseDbDefaultRecordSpy
|
13
|
+
include Ardb::UseDbDefault
|
14
|
+
end
|
15
|
+
end
|
16
|
+
subject{ @record_class }
|
17
|
+
|
18
|
+
should have_imeths :use_db_default, :use_db_default_attrs
|
19
|
+
|
20
|
+
should "know its use db default attrs" do
|
21
|
+
assert_equal [], subject.use_db_default_attrs
|
22
|
+
end
|
23
|
+
|
24
|
+
should "add use db default attributes using `use_db_default`" do
|
25
|
+
attr_name = Factory.string
|
26
|
+
subject.use_db_default(attr_name)
|
27
|
+
assert_includes attr_name, subject.use_db_default_attrs
|
28
|
+
|
29
|
+
attr_names = [Factory.string, Factory.string.to_sym]
|
30
|
+
subject.use_db_default(*attr_names)
|
31
|
+
attr_names.each do |attr_name|
|
32
|
+
assert_includes attr_name.to_s, subject.use_db_default_attrs
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
should "not add duplicate attributes using `use_db_default`" do
|
37
|
+
attr_name = Factory.string
|
38
|
+
subject.use_db_default(attr_name)
|
39
|
+
assert_equal [attr_name], subject.use_db_default_attrs
|
40
|
+
|
41
|
+
subject.use_db_default(attr_name)
|
42
|
+
assert_equal [attr_name], subject.use_db_default_attrs
|
43
|
+
|
44
|
+
more_attr_names = [attr_name, Factory.string]
|
45
|
+
subject.use_db_default(*more_attr_names)
|
46
|
+
exp = ([attr_name] + more_attr_names).uniq
|
47
|
+
assert_equal exp, subject.use_db_default_attrs
|
48
|
+
end
|
49
|
+
|
50
|
+
should "add an around create callback" do
|
51
|
+
callback = subject.callbacks.first
|
52
|
+
assert_equal :around_create, callback.type
|
53
|
+
exp = [:ardb_allow_db_to_default_attrs]
|
54
|
+
assert_equal exp, callback.args
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
class InitTests < UnitTests
|
60
|
+
desc "when init"
|
61
|
+
setup do
|
62
|
+
@attr_names = Factory.integer(3).times.map{ Factory.string }
|
63
|
+
@record_class.use_db_default(*@attr_names)
|
64
|
+
|
65
|
+
@record = @record_class.new
|
66
|
+
|
67
|
+
# simulate activerecords `@attributes` hash
|
68
|
+
@original_attrs = @attr_names.inject({}) do |h, n|
|
69
|
+
h.merge!(n => [nil, Factory.string, Factory.integer].choice)
|
70
|
+
end
|
71
|
+
@original_attrs.merge!(Factory.string => Factory.string)
|
72
|
+
@record.attributes = @original_attrs.dup
|
73
|
+
|
74
|
+
# randomly pick a use-db-default attribute to be changed
|
75
|
+
@record.changed_use_db_default_attrs = [@attr_names.choice]
|
76
|
+
@unchanged_attr_names = @attr_names - @record.changed_use_db_default_attrs
|
77
|
+
|
78
|
+
# we should always get the record we just inserted back
|
79
|
+
@record_class.relation_spy.results = [@record]
|
80
|
+
# add pluck values into the relation spy
|
81
|
+
@record_class.relation_spy.pluck_values = @attr_names.inject({}) do |h, n|
|
82
|
+
h.merge!(n => Factory.string)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
subject{ @record }
|
86
|
+
|
87
|
+
should "remove use-db-default attributes before being created" do
|
88
|
+
# around create callbacks yield to create the record so we have to pass a
|
89
|
+
# block, this will allow us to see what was done to the attributes hash
|
90
|
+
# when it was created (yielded)
|
91
|
+
attrs_before_yield = nil
|
92
|
+
subject.instance_eval do
|
93
|
+
ardb_allow_db_to_default_attrs{ attrs_before_yield = self.attributes.dup }
|
94
|
+
end
|
95
|
+
|
96
|
+
assert_instance_of Hash, attrs_before_yield
|
97
|
+
@unchanged_attr_names.each do |name|
|
98
|
+
assert_false attrs_before_yield.key?(name)
|
99
|
+
end
|
100
|
+
|
101
|
+
# the non use-db-default attrs and changed use-db-default attrs hash
|
102
|
+
# values should have their original values when yielded
|
103
|
+
(@original_attrs.keys - @unchanged_attr_names).each do |name|
|
104
|
+
assert_equal @original_attrs[name], attrs_before_yield[name]
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
should "set use-db-default values after its created" do
|
109
|
+
# around create callbacks yield to create the record so we have to pass a
|
110
|
+
# block, this simulates creating the record by setting the id
|
111
|
+
subject.instance_eval do
|
112
|
+
ardb_allow_db_to_default_attrs{ self.id = Factory.integer }
|
113
|
+
end
|
114
|
+
|
115
|
+
applied_expr = @record_class.relation_spy.applied.first
|
116
|
+
assert_equal :where, applied_expr.type
|
117
|
+
assert_equal [{ :id => subject.id }], applied_expr.args
|
118
|
+
|
119
|
+
@unchanged_attr_names.each do |name|
|
120
|
+
exp = @record_class.relation_spy.pluck_values[name]
|
121
|
+
assert_equal exp, subject.attributes[name]
|
122
|
+
end
|
123
|
+
|
124
|
+
# the non use-db-default attrs and changed use-db-default attrs hash
|
125
|
+
# values should still have their original values
|
126
|
+
(@original_attrs.keys - @unchanged_attr_names).each do |name|
|
127
|
+
assert_equal @original_attrs[name], subject.attributes[name]
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
end
|
132
|
+
|
133
|
+
module UseDbDefaultRecordSpy
|
134
|
+
def self.included(klass)
|
135
|
+
klass.class_eval{ include Ardb::RecordSpy }
|
136
|
+
end
|
137
|
+
|
138
|
+
attr_accessor :id
|
139
|
+
attr_accessor :attributes, :changed_use_db_default_attrs
|
140
|
+
|
141
|
+
def use_db_default_attr_changed?(attr_name)
|
142
|
+
self.changed_use_db_default_attrs.include?(attr_name)
|
143
|
+
end
|
144
|
+
|
145
|
+
def method_missing(method, *args, &block)
|
146
|
+
match_data = method.to_s.match(/(\w+)_changed\?/)
|
147
|
+
if match_data && match_data[1]
|
148
|
+
self.use_db_default_attr_changed?(match_data[1])
|
149
|
+
else
|
150
|
+
super
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ardb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 127
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
8
|
+
- 24
|
9
9
|
- 0
|
10
|
-
version: 0.
|
10
|
+
version: 0.24.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Kelly Redding
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2015-10-
|
19
|
+
date: 2015-10-22 00:00:00 Z
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
22
22
|
requirement: &id001 !ruby/object:Gem::Requirement
|
@@ -129,6 +129,7 @@ files:
|
|
129
129
|
- lib/ardb/runner/generate_command.rb
|
130
130
|
- lib/ardb/runner/migrate_command.rb
|
131
131
|
- lib/ardb/test_helpers.rb
|
132
|
+
- lib/ardb/use_db_default.rb
|
132
133
|
- lib/ardb/version.rb
|
133
134
|
- log/.gitkeep
|
134
135
|
- test/helper.rb
|
@@ -150,6 +151,7 @@ files:
|
|
150
151
|
- test/unit/runner/migrate_command_tests.rb
|
151
152
|
- test/unit/runner_tests.rb
|
152
153
|
- test/unit/test_helpers_tests.rb
|
154
|
+
- test/unit/use_db_default_tests.rb
|
153
155
|
- tmp/.gitkeep
|
154
156
|
- tmp/mysqltest/.gitkeep
|
155
157
|
- tmp/pgtest/.gitkeep
|
@@ -216,3 +218,4 @@ test_files:
|
|
216
218
|
- test/unit/runner/migrate_command_tests.rb
|
217
219
|
- test/unit/runner_tests.rb
|
218
220
|
- test/unit/test_helpers_tests.rb
|
221
|
+
- test/unit/use_db_default_tests.rb
|