ardb 0.28.3 → 0.30.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 +7 -7
- data/.l.yml +9 -0
- data/.rubocop.yml +3 -0
- data/.ruby-version +1 -0
- data/.t.yml +6 -0
- data/Gemfile +24 -8
- data/README.md +252 -3
- data/ardb.gemspec +14 -10
- data/bin/ardb +3 -1
- data/lib/ardb/adapter/base.rb +72 -47
- data/lib/ardb/adapter/mysql.rb +4 -17
- data/lib/ardb/adapter/postgresql.rb +51 -46
- data/lib/ardb/adapter/sqlite.rb +11 -15
- data/lib/ardb/adapter_spy.rb +18 -30
- data/lib/ardb/cli/clirb.rb +16 -18
- data/lib/ardb/cli/commands.rb +308 -129
- data/lib/ardb/cli.rb +29 -24
- data/lib/ardb/db_tests.rb +4 -4
- data/lib/ardb/default_order_by.rb +13 -21
- data/lib/ardb/migration.rb +15 -16
- data/lib/ardb/record_spy.rb +46 -61
- data/lib/ardb/relation_spy.rb +28 -32
- data/lib/ardb/require_autoloaded_active_record_files.rb +258 -57
- data/lib/ardb/test_helpers.rb +33 -29
- data/lib/ardb/use_db_default.rb +13 -21
- data/lib/ardb/version.rb +3 -1
- data/lib/ardb.rb +105 -86
- data/script/determine_autoloaded_active_record_files.rb +31 -24
- data/test/helper.rb +6 -13
- data/test/support/factory.rb +4 -3
- data/test/support/fake_schema.rb +3 -1
- data/test/support/postgresql/migrations/{.gitkeep → .keep} +0 -0
- data/test/support/postgresql/schema.rb +2 -1
- data/test/support/postgresql/setup_test_db.rb +23 -21
- data/test/support/relative_require_test_db_file.rb +1 -0
- data/test/support/require_test_db_file.rb +1 -0
- data/test/system/.keep +0 -0
- data/test/unit/adapter/base_tests.rb +80 -55
- data/test/unit/adapter/mysql_tests.rb +4 -19
- data/test/unit/adapter/postgresql_tests.rb +21 -30
- data/test/unit/adapter/sqlite_tests.rb +5 -11
- data/test/unit/adapter_spy_tests.rb +6 -17
- data/test/unit/ardb_tests.rb +75 -53
- data/test/unit/cli_tests.rb +234 -158
- data/test/unit/db_tests_tests.rb +7 -7
- data/test/unit/default_order_by_tests.rb +26 -24
- data/test/unit/migration_tests.rb +17 -18
- data/test/unit/record_spy_tests.rb +45 -41
- data/test/unit/relation_spy_tests.rb +40 -63
- data/test/unit/test_helpers_tests.rb +7 -15
- data/test/unit/use_db_default_tests.rb +35 -27
- metadata +109 -87
- data/lib/ardb/has_slug.rb +0 -107
- data/lib/ardb/migration_helpers.rb +0 -77
- data/lib/ardb/pg_json.rb +0 -90
- data/test/support/postgresql/pg_json_migrations/20160519133432_create_pg_json_migrate_test.rb +0 -13
- data/test/system/pg_json_tests.rb +0 -85
- data/test/unit/has_slug_tests.rb +0 -341
- data/test/unit/migration_helpers_tests.rb +0 -65
- data/test/unit/pg_json_tests.rb +0 -39
data/test/unit/db_tests_tests.rb
CHANGED
@@ -1,10 +1,11 @@
|
|
1
|
-
|
2
|
-
require 'ardb/db_tests'
|
1
|
+
# frozen_string_literal: true
|
3
2
|
|
4
|
-
require
|
3
|
+
require "assert"
|
4
|
+
require "ardb/db_tests"
|
5
5
|
|
6
|
-
|
6
|
+
require "active_record"
|
7
7
|
|
8
|
+
class Ardb::DbTests
|
8
9
|
class UnitTests < Assert::Context
|
9
10
|
desc "Ardb::DbTests"
|
10
11
|
setup do
|
@@ -20,7 +21,8 @@ class Ardb::DbTests
|
|
20
21
|
assert subject < Assert::Context
|
21
22
|
end
|
22
23
|
|
23
|
-
should "add an around callback that runs tests in a transaction that
|
24
|
+
should "add an around callback that runs tests in a transaction that "\
|
25
|
+
"rolls back" do
|
24
26
|
assert_equal 1, subject.arounds.size
|
25
27
|
callback = subject.arounds.first
|
26
28
|
|
@@ -31,7 +33,5 @@ class Ardb::DbTests
|
|
31
33
|
assert_true @transaction_called
|
32
34
|
assert_true block_yielded_to
|
33
35
|
end
|
34
|
-
|
35
36
|
end
|
36
|
-
|
37
37
|
end
|
@@ -1,28 +1,30 @@
|
|
1
|
-
|
2
|
-
require 'ardb/default_order_by'
|
1
|
+
# frozen_string_literal: true
|
3
2
|
|
4
|
-
require
|
5
|
-
require
|
3
|
+
require "assert"
|
4
|
+
require "ardb/default_order_by"
|
6
5
|
|
7
|
-
|
6
|
+
require "much-mixin"
|
7
|
+
require "ardb/record_spy"
|
8
8
|
|
9
|
+
module Ardb::DefaultOrderBy
|
9
10
|
class UnitTests < Assert::Context
|
10
11
|
desc "Ardb::DefaultOrderBy"
|
11
12
|
setup do
|
12
13
|
order_by_attribute = @order_by_attribute = Factory.string.to_sym
|
13
|
-
@scope_proc = proc{ self.class.where(:
|
14
|
-
@record_class =
|
15
|
-
|
16
|
-
|
17
|
-
|
14
|
+
@scope_proc = proc{ self.class.where(grouping: grouping) }
|
15
|
+
@record_class =
|
16
|
+
Ardb::RecordSpy.new do
|
17
|
+
include Ardb::DefaultOrderBy
|
18
|
+
attr_accessor order_by_attribute, :grouping
|
19
|
+
end
|
18
20
|
end
|
19
21
|
subject{ @record_class }
|
20
22
|
|
21
23
|
should have_imeths :default_order_by
|
22
24
|
should have_imeths :ardb_default_order_by_config
|
23
25
|
|
24
|
-
should "use much-
|
25
|
-
assert_includes
|
26
|
+
should "use much-mixin" do
|
27
|
+
assert_includes MuchMixin, Ardb::DefaultOrderBy
|
26
28
|
end
|
27
29
|
|
28
30
|
should "know its default attribute, preprocessor and separator" do
|
@@ -45,8 +47,8 @@ module Ardb::DefaultOrderBy
|
|
45
47
|
|
46
48
|
should "allow customizing the config using `default_order_by`" do
|
47
49
|
subject.default_order_by({
|
48
|
-
:
|
49
|
-
:
|
50
|
+
attribute: @order_by_attribute,
|
51
|
+
scope: @scope_proc,
|
50
52
|
})
|
51
53
|
|
52
54
|
config = subject.ardb_default_order_by_config
|
@@ -60,20 +62,20 @@ module Ardb::DefaultOrderBy
|
|
60
62
|
callback = subject.callbacks.find{ |v| v.type == :before_validation }
|
61
63
|
assert_not_nil callback
|
62
64
|
assert_equal [:ardb_default_order_by], callback.args
|
63
|
-
assert_equal({ :
|
65
|
+
assert_equal({ on: :create }, callback.options)
|
64
66
|
end
|
65
|
-
|
66
67
|
end
|
67
68
|
|
68
69
|
class InitTests < UnitTests
|
69
70
|
desc "when init"
|
70
71
|
setup do
|
71
72
|
@record_class.default_order_by({
|
72
|
-
:
|
73
|
-
:
|
73
|
+
attribute: @order_by_attribute,
|
74
|
+
scope: @scope_proc,
|
74
75
|
})
|
75
76
|
@current_max = Factory.integer
|
76
|
-
@record_class.relation_spy.maximum_values[@order_by_attribute] =
|
77
|
+
@record_class.relation_spy.maximum_values[@order_by_attribute] =
|
78
|
+
@current_max
|
77
79
|
|
78
80
|
@record = @record_class.new
|
79
81
|
@record.grouping = Factory.string
|
@@ -86,7 +88,8 @@ module Ardb::DefaultOrderBy
|
|
86
88
|
assert_equal @current_max + 1, subject.send(@order_by_attribute)
|
87
89
|
end
|
88
90
|
|
89
|
-
should "reset its order-by to a start value when there isn't a
|
91
|
+
should "reset its order-by to a start value when there isn't a "\
|
92
|
+
"current max" do
|
90
93
|
@record_class.relation_spy.maximum_values.delete(@order_by_attribute)
|
91
94
|
|
92
95
|
subject.instance_eval{ reset_order_by }
|
@@ -100,7 +103,7 @@ module Ardb::DefaultOrderBy
|
|
100
103
|
assert_equal 1, @record_class.relation_spy.applied.size
|
101
104
|
applied_expression = @record_class.relation_spy.applied.last
|
102
105
|
assert_equal :where, applied_expression.type
|
103
|
-
assert_equal [{ :
|
106
|
+
assert_equal [{ grouping: subject.grouping }], applied_expression.args
|
104
107
|
end
|
105
108
|
|
106
109
|
should "reset its order-by using `ardb_default_order_by`" do
|
@@ -109,14 +112,13 @@ module Ardb::DefaultOrderBy
|
|
109
112
|
assert_equal @current_max + 1, subject.send(@order_by_attribute)
|
110
113
|
end
|
111
114
|
|
112
|
-
should "not reset its order-by if its already set using
|
115
|
+
should "not reset its order-by if its already set using "\
|
116
|
+
"`ardb_default_order_by`" do
|
113
117
|
current_order_by = Factory.integer
|
114
118
|
subject.send("#{@order_by_attribute}=", current_order_by)
|
115
119
|
subject.instance_eval{ ardb_default_order_by }
|
116
120
|
|
117
121
|
assert_equal current_order_by, subject.send(@order_by_attribute)
|
118
122
|
end
|
119
|
-
|
120
123
|
end
|
121
|
-
|
122
124
|
end
|
@@ -1,19 +1,19 @@
|
|
1
|
-
|
2
|
-
require 'ardb/migration'
|
1
|
+
# frozen_string_literal: true
|
3
2
|
|
4
|
-
|
5
|
-
|
3
|
+
require "assert"
|
4
|
+
require "ardb/migration"
|
5
|
+
|
6
|
+
# This is needed to call `classify` on a string; if this isn"t manually required
|
7
|
+
# these tests can fail if activesupport hasn"t been loaded by activerecord; the
|
6
8
|
# `Migration` class will error saying `classify` is not a method on `String`
|
7
|
-
require
|
9
|
+
require "active_support/core_ext/string/inflections"
|
8
10
|
|
9
11
|
class Ardb::Migration
|
10
|
-
|
11
12
|
class UnitTests < Assert::Context
|
12
13
|
desc "Ardb::Migration"
|
13
14
|
setup do
|
14
15
|
@migration_class = Ardb::Migration
|
15
16
|
end
|
16
|
-
|
17
17
|
end
|
18
18
|
|
19
19
|
class InitTests < UnitTests
|
@@ -38,7 +38,7 @@ class Ardb::Migration
|
|
38
38
|
end
|
39
39
|
subject{ @migration }
|
40
40
|
|
41
|
-
should have_readers
|
41
|
+
should have_readers :migrations_path, :identifier
|
42
42
|
should have_readers :class_name, :file_name, :file_path, :source
|
43
43
|
should have_imeths :save!
|
44
44
|
|
@@ -55,18 +55,19 @@ class Ardb::Migration
|
|
55
55
|
exp = File.join(subject.migrations_path, "#{subject.file_name}.rb")
|
56
56
|
assert_equal exp, subject.file_path
|
57
57
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
58
|
+
exp_version = ActiveRecord::Migration.current_version
|
59
|
+
exp =
|
60
|
+
"class #{subject.class_name} "\
|
61
|
+
"< ActiveRecord::Migration[#{exp_version}]\n" \
|
62
|
+
" def change\n" \
|
63
|
+
" end\n" \
|
64
|
+
"end\n"
|
64
65
|
assert_equal exp, subject.source
|
65
66
|
end
|
66
67
|
|
67
68
|
should "complain if no identifier is provided" do
|
68
69
|
assert_raises(NoIdentifierError) do
|
69
|
-
@migration_class.new(@ardb_config, [nil,
|
70
|
+
@migration_class.new(@ardb_config, [nil, ""].sample)
|
70
71
|
end
|
71
72
|
end
|
72
73
|
|
@@ -74,10 +75,9 @@ class Ardb::Migration
|
|
74
75
|
subject.save!
|
75
76
|
|
76
77
|
assert_equal [subject.migrations_path], @mkdir_called_with
|
77
|
-
assert_equal [subject.file_path,
|
78
|
+
assert_equal [subject.file_path, "w"], @file_open_called_with
|
78
79
|
assert_equal [subject.source], @file_spy.write_called_with
|
79
80
|
end
|
80
|
-
|
81
81
|
end
|
82
82
|
|
83
83
|
class FileSpy
|
@@ -91,5 +91,4 @@ class Ardb::Migration
|
|
91
91
|
@write_called_with = args
|
92
92
|
end
|
93
93
|
end
|
94
|
-
|
95
94
|
end
|
@@ -1,17 +1,19 @@
|
|
1
|
-
|
2
|
-
require 'ardb/record_spy'
|
1
|
+
# frozen_string_literal: true
|
3
2
|
|
4
|
-
require
|
3
|
+
require "assert"
|
4
|
+
require "ardb/record_spy"
|
5
5
|
|
6
|
-
|
6
|
+
require "much-mixin"
|
7
7
|
|
8
|
+
module Ardb::RecordSpy
|
8
9
|
class UnitTests < Assert::Context
|
9
10
|
desc "Ardb::RecordSpy"
|
10
11
|
setup do
|
11
|
-
@record_spy_class =
|
12
|
-
|
13
|
-
|
14
|
-
|
12
|
+
@record_spy_class =
|
13
|
+
Class.new do
|
14
|
+
include Ardb::RecordSpy
|
15
|
+
attr_accessor :name
|
16
|
+
end
|
15
17
|
end
|
16
18
|
subject{ @record_spy_class }
|
17
19
|
|
@@ -41,13 +43,13 @@ module Ardb::RecordSpy
|
|
41
43
|
should have_imeths :group, :having, :order, :reverse_order, :readonly
|
42
44
|
should have_imeths :limit, :offset, :merge, :except, :only
|
43
45
|
|
44
|
-
should "use much-
|
45
|
-
assert_includes
|
46
|
+
should "use much-mixin" do
|
47
|
+
assert_includes MuchMixin, Ardb::RecordSpy
|
46
48
|
end
|
47
49
|
|
48
50
|
should "allow reading and writing the record's table name" do
|
49
|
-
subject.table_name =
|
50
|
-
assert_equal
|
51
|
+
subject.table_name = "my_records"
|
52
|
+
assert_equal "my_records", subject.table_name
|
51
53
|
end
|
52
54
|
|
53
55
|
should "default its associations" do
|
@@ -55,7 +57,7 @@ module Ardb::RecordSpy
|
|
55
57
|
end
|
56
58
|
|
57
59
|
should "add an association config with #belongs_to" do
|
58
|
-
subject.belongs_to :area, :
|
60
|
+
subject.belongs_to :area, foreign_key: :area_id
|
59
61
|
association = subject.associations.last
|
60
62
|
assert_equal :belongs_to, association.type
|
61
63
|
assert_equal :area, association.name
|
@@ -63,7 +65,7 @@ module Ardb::RecordSpy
|
|
63
65
|
end
|
64
66
|
|
65
67
|
should "add an association config with #has_many" do
|
66
|
-
subject.has_many :comments, :
|
68
|
+
subject.has_many :comments, as: :parent
|
67
69
|
association = subject.associations.last
|
68
70
|
assert_equal :has_many, association.type
|
69
71
|
assert_equal :comments, association.name
|
@@ -71,19 +73,19 @@ module Ardb::RecordSpy
|
|
71
73
|
end
|
72
74
|
|
73
75
|
should "add an association config with #has_one" do
|
74
|
-
subject.has_one :linking, :
|
76
|
+
subject.has_one :linking, class_name: "Linking"
|
75
77
|
association = subject.associations.last
|
76
78
|
assert_equal :has_one, association.type
|
77
79
|
assert_equal :linking, association.name
|
78
|
-
assert_equal
|
80
|
+
assert_equal "Linking", association.options[:class_name]
|
79
81
|
end
|
80
82
|
|
81
83
|
should "default its validations" do
|
82
84
|
assert_equal [], subject.validations
|
83
85
|
end
|
84
86
|
|
85
|
-
should "add a validation config for
|
86
|
-
subject.validates_presence_of :name, :email, :
|
87
|
+
should "add a validation config for \"*_of\" validations" do
|
88
|
+
subject.validates_presence_of :name, :email, on: :create
|
87
89
|
validation = subject.validations.last
|
88
90
|
assert_equal :presence, validation.type
|
89
91
|
assert_equal :create, validation.options[:on]
|
@@ -110,7 +112,7 @@ module Ardb::RecordSpy
|
|
110
112
|
end
|
111
113
|
|
112
114
|
should "add a validation config with #validates_each" do
|
113
|
-
block = proc{
|
115
|
+
block = proc{}
|
114
116
|
subject.validates_each(:name, :email, &block)
|
115
117
|
validation = subject.validations.last
|
116
118
|
assert_equal :each, validation.type
|
@@ -125,7 +127,7 @@ module Ardb::RecordSpy
|
|
125
127
|
assert_equal :custom, validation.type
|
126
128
|
assert_equal :some_method, validation.method_name
|
127
129
|
|
128
|
-
block = proc{
|
130
|
+
block = proc{}
|
129
131
|
subject.validate(&block)
|
130
132
|
validation = subject.validations.last
|
131
133
|
assert_equal :custom, validation.type
|
@@ -144,15 +146,15 @@ module Ardb::RecordSpy
|
|
144
146
|
end
|
145
147
|
|
146
148
|
should "add a callback config with a block" do
|
147
|
-
subject.before_validation(:
|
148
|
-
self.name =
|
149
|
+
subject.before_validation(on: :create) do
|
150
|
+
self.name = "test"
|
149
151
|
end
|
150
152
|
callback = subject.callbacks.last
|
151
153
|
assert_equal :before_validation, callback.type
|
152
154
|
assert_equal :create, callback.options[:on]
|
153
155
|
record_spy = subject.new
|
154
156
|
record_spy.instance_eval(&callback.block)
|
155
|
-
assert_equal
|
157
|
+
assert_equal "test", record_spy.name
|
156
158
|
end
|
157
159
|
|
158
160
|
should "default its custom callback types" do
|
@@ -177,7 +179,12 @@ module Ardb::RecordSpy
|
|
177
179
|
assert_respond_to "around_#{name}", subject
|
178
180
|
assert_respond_to "after_#{name}", subject
|
179
181
|
|
180
|
-
callback_name =
|
182
|
+
callback_name =
|
183
|
+
[
|
184
|
+
"before_#{name}",
|
185
|
+
"around_#{name}",
|
186
|
+
"after_#{name}",
|
187
|
+
].sample
|
181
188
|
method_name = Factory.string
|
182
189
|
subject.send(callback_name, method_name)
|
183
190
|
callback = subject.callbacks.last
|
@@ -185,7 +192,7 @@ module Ardb::RecordSpy
|
|
185
192
|
assert_equal [method_name], callback.args
|
186
193
|
|
187
194
|
name = Factory.string
|
188
|
-
subject.define_model_callbacks(name, :
|
195
|
+
subject.define_model_callbacks(name, only: [:before])
|
189
196
|
|
190
197
|
assert_respond_to "before_#{name}", subject
|
191
198
|
assert_not_respond_to "around_#{name}", subject
|
@@ -286,15 +293,15 @@ module Ardb::RecordSpy
|
|
286
293
|
subject.only(*only_args)
|
287
294
|
assert_equal only_args, only_called_with
|
288
295
|
end
|
289
|
-
|
290
296
|
end
|
291
297
|
|
292
298
|
class GeneratorTests < UnitTests
|
293
299
|
desc "to generate record spy classes"
|
294
300
|
setup do
|
295
|
-
@record_spy_class =
|
296
|
-
|
297
|
-
|
301
|
+
@record_spy_class =
|
302
|
+
Ardb::RecordSpy.new do
|
303
|
+
attr_accessor :name
|
304
|
+
end
|
298
305
|
@instance = @record_spy_class.new
|
299
306
|
end
|
300
307
|
subject{ @record_spy_class }
|
@@ -305,7 +312,6 @@ module Ardb::RecordSpy
|
|
305
312
|
assert @instance.respond_to? :name
|
306
313
|
assert @instance.respond_to? :name=
|
307
314
|
end
|
308
|
-
|
309
315
|
end
|
310
316
|
|
311
317
|
class InstanceTests < UnitTests
|
@@ -319,24 +325,24 @@ module Ardb::RecordSpy
|
|
319
325
|
should have_imeths :manually_run_callbacks, :run_callbacks
|
320
326
|
|
321
327
|
should "allow spying the update_column method by just writing the value" do
|
322
|
-
assert_not_equal
|
328
|
+
assert_not_equal "updated", subject.name
|
323
329
|
|
324
|
-
subject.update_column(:name,
|
325
|
-
assert_equal
|
330
|
+
subject.update_column(:name, "updated")
|
331
|
+
assert_equal "updated", subject.name
|
326
332
|
end
|
327
333
|
|
328
334
|
should "have accessors for each association defined" do
|
329
335
|
assert_nil subject.bt_thing
|
330
|
-
subject.bt_thing =
|
331
|
-
assert_equal
|
336
|
+
subject.bt_thing = "something"
|
337
|
+
assert_equal "something", subject.bt_thing
|
332
338
|
|
333
339
|
assert_nil subject.ho_thing
|
334
|
-
subject.ho_thing =
|
335
|
-
assert_equal
|
340
|
+
subject.ho_thing = "other thing"
|
341
|
+
assert_equal "other thing", subject.ho_thing
|
336
342
|
|
337
343
|
assert_empty subject.hm_things
|
338
|
-
subject.hm_things = [1,2,3]
|
339
|
-
assert_equal [1,2,3], subject.hm_things
|
344
|
+
subject.hm_things = [1, 2, 3]
|
345
|
+
assert_equal [1, 2, 3], subject.hm_things
|
340
346
|
end
|
341
347
|
|
342
348
|
should "default its manually run callbacks" do
|
@@ -355,7 +361,6 @@ module Ardb::RecordSpy
|
|
355
361
|
assert_includes name, subject.manually_run_callbacks
|
356
362
|
assert_true block_called
|
357
363
|
end
|
358
|
-
|
359
364
|
end
|
360
365
|
|
361
366
|
class MyRecord
|
@@ -366,5 +371,4 @@ module Ardb::RecordSpy
|
|
366
371
|
has_one :ho_thing
|
367
372
|
has_many :hm_things
|
368
373
|
end
|
369
|
-
|
370
374
|
end
|