ardb 0.27.3 → 0.29.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -7
- data/Gemfile +4 -5
- data/README.md +252 -3
- data/ardb.gemspec +8 -8
- data/bin/ardb +1 -1
- data/lib/ardb.rb +155 -72
- data/lib/ardb/adapter/base.rb +67 -47
- data/lib/ardb/adapter/mysql.rb +3 -19
- data/lib/ardb/adapter/postgresql.rb +33 -37
- data/lib/ardb/adapter/sqlite.rb +7 -16
- data/lib/ardb/adapter_spy.rb +58 -92
- data/lib/ardb/cli.rb +18 -226
- data/lib/ardb/{clirb.rb → cli/clirb.rb} +16 -18
- data/lib/ardb/cli/commands.rb +365 -0
- data/lib/ardb/db_tests.rb +2 -4
- data/lib/ardb/default_order_by.rb +3 -13
- data/lib/ardb/migration.rb +18 -20
- data/lib/ardb/record_spy.rb +7 -26
- data/lib/ardb/relation_spy.rb +0 -6
- data/lib/ardb/require_autoloaded_active_record_files.rb +103 -58
- data/lib/ardb/test_helpers.rb +2 -5
- data/lib/ardb/use_db_default.rb +4 -15
- data/lib/ardb/version.rb +1 -1
- data/script/determine_autoloaded_active_record_files.rb +11 -8
- data/test/helper.rb +9 -6
- data/test/support/factory.rb +17 -2
- data/test/support/fake_schema.rb +5 -0
- data/test/support/postgresql/migrations/.keep +0 -0
- data/test/support/postgresql/schema.rb +2 -0
- data/test/support/postgresql/setup_test_db.rb +51 -0
- data/test/support/relative_require_test_db_file.rb +2 -0
- data/test/support/require_test_db_file.rb +1 -0
- data/test/system/.keep +0 -0
- data/test/unit/adapter/base_tests.rb +163 -75
- data/test/unit/adapter/mysql_tests.rb +4 -20
- data/test/unit/adapter/postgresql_tests.rb +20 -28
- data/test/unit/adapter/sqlite_tests.rb +9 -12
- data/test/unit/adapter_spy_tests.rb +48 -71
- data/test/unit/ardb_tests.rb +338 -38
- data/test/unit/cli_tests.rb +334 -225
- data/test/unit/db_tests_tests.rb +3 -6
- data/test/unit/default_order_by_tests.rb +4 -8
- data/test/unit/migration_tests.rb +20 -17
- data/test/unit/record_spy_tests.rb +18 -23
- data/test/unit/relation_spy_tests.rb +17 -46
- data/test/unit/test_helpers_tests.rb +5 -20
- data/test/unit/use_db_default_tests.rb +9 -13
- metadata +111 -100
- data/lib/ardb/has_slug.rb +0 -107
- data/lib/ardb/migration_helpers.rb +0 -77
- data/lib/ardb/root_path.rb +0 -15
- data/test/unit/config_tests.rb +0 -58
- data/test/unit/has_slug_tests.rb +0 -341
- data/test/unit/migration_helpers_tests.rb +0 -59
data/lib/ardb/db_tests.rb
CHANGED
@@ -1,8 +1,7 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "active_record"
|
2
|
+
require "assert"
|
3
3
|
|
4
4
|
module Ardb
|
5
|
-
|
6
5
|
class DbTests < Assert::Context
|
7
6
|
around do |block|
|
8
7
|
ActiveRecord::Base.transaction do
|
@@ -11,5 +10,4 @@ module Ardb
|
|
11
10
|
end
|
12
11
|
end
|
13
12
|
end
|
14
|
-
|
15
13
|
end
|
@@ -1,7 +1,6 @@
|
|
1
|
-
require
|
1
|
+
require "much-plugin"
|
2
2
|
|
3
3
|
module Ardb
|
4
|
-
|
5
4
|
module DefaultOrderBy
|
6
5
|
include MuchPlugin
|
7
6
|
|
@@ -9,15 +8,10 @@ module Ardb
|
|
9
8
|
DEFAULT_SCOPE_PROC = proc{ self.class.scoped }
|
10
9
|
|
11
10
|
plugin_included do
|
12
|
-
extend ClassMethods
|
13
|
-
include InstanceMethods
|
14
|
-
|
15
11
|
@ardb_default_order_by_config = {}
|
16
|
-
|
17
12
|
end
|
18
13
|
|
19
|
-
|
20
|
-
|
14
|
+
plugin_class_methods do
|
21
15
|
def default_order_by(options = nil)
|
22
16
|
options ||= {}
|
23
17
|
|
@@ -32,11 +26,9 @@ module Ardb
|
|
32
26
|
def ardb_default_order_by_config
|
33
27
|
@ardb_default_order_by_config
|
34
28
|
end
|
35
|
-
|
36
29
|
end
|
37
30
|
|
38
|
-
|
39
|
-
|
31
|
+
plugin_instance_methods do
|
40
32
|
private
|
41
33
|
|
42
34
|
def reset_order_by
|
@@ -52,8 +44,6 @@ module Ardb
|
|
52
44
|
reset_order_by if self.send(attr_name).to_s.empty?
|
53
45
|
true
|
54
46
|
end
|
55
|
-
|
56
47
|
end
|
57
|
-
|
58
48
|
end
|
59
49
|
end
|
data/lib/ardb/migration.rb
CHANGED
@@ -1,31 +1,33 @@
|
|
1
|
-
require
|
1
|
+
require "fileutils"
|
2
2
|
|
3
3
|
module Ardb
|
4
|
-
|
5
4
|
class Migration
|
5
|
+
NoIdentifierError = Class.new(ArgumentError)
|
6
6
|
|
7
|
-
attr_reader :
|
8
|
-
attr_reader :source
|
7
|
+
attr_reader :migrations_path, :identifier
|
8
|
+
attr_reader :class_name, :file_name, :file_path, :source
|
9
9
|
|
10
|
-
def initialize(identifier)
|
10
|
+
def initialize(ardb_config, identifier)
|
11
11
|
raise NoIdentifierError if identifier.to_s.empty?
|
12
12
|
|
13
|
-
@
|
13
|
+
@migrations_path = ardb_config.migrations_path
|
14
|
+
@identifier = identifier
|
15
|
+
|
14
16
|
@class_name = @identifier.classify.pluralize
|
15
17
|
@file_name = get_file_name(@identifier)
|
16
|
-
@file_path = File.join(
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
18
|
+
@file_path = File.join(self.migrations_path, "#{@file_name}.rb")
|
19
|
+
|
20
|
+
migration_version = ActiveRecord::Migration.current_version
|
21
|
+
@source =
|
22
|
+
"class #{@class_name} < ActiveRecord::Migration[#{migration_version}]\n"\
|
23
|
+
" def change\n"\
|
24
|
+
" end\n"\
|
25
|
+
"end\n"
|
24
26
|
end
|
25
27
|
|
26
28
|
def save!
|
27
|
-
FileUtils.mkdir_p
|
28
|
-
File.open(self.file_path,
|
29
|
+
FileUtils.mkdir_p self.migrations_path
|
30
|
+
File.open(self.file_path, "w"){ |f| f.write(self.source) }
|
29
31
|
self
|
30
32
|
end
|
31
33
|
|
@@ -34,9 +36,5 @@ module Ardb
|
|
34
36
|
def get_file_name(identifier)
|
35
37
|
"#{Time.now.strftime("%Y%m%d%H%M%S")}_#{identifier.underscore}"
|
36
38
|
end
|
37
|
-
|
38
|
-
NoIdentifierError = Class.new(ArgumentError)
|
39
|
-
|
40
39
|
end
|
41
|
-
|
42
40
|
end
|
data/lib/ardb/record_spy.rb
CHANGED
@@ -1,9 +1,8 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
1
|
+
require "arel"
|
2
|
+
require "much-plugin"
|
3
|
+
require "ardb/relation_spy"
|
4
4
|
|
5
5
|
module Ardb
|
6
|
-
|
7
6
|
module RecordSpy
|
8
7
|
include MuchPlugin
|
9
8
|
|
@@ -14,13 +13,9 @@ module Ardb
|
|
14
13
|
record_spy
|
15
14
|
end
|
16
15
|
|
17
|
-
|
18
|
-
extend ClassMethods
|
19
|
-
include InstanceMethods
|
20
|
-
end
|
21
|
-
|
22
|
-
module ClassMethods
|
16
|
+
CallbackType = Struct.new(:name, :options)
|
23
17
|
|
18
|
+
plugin_class_methods do
|
24
19
|
attr_accessor :table_name
|
25
20
|
|
26
21
|
# Associations
|
@@ -29,8 +24,7 @@ module Ardb
|
|
29
24
|
@associations ||= []
|
30
25
|
end
|
31
26
|
|
32
|
-
[
|
33
|
-
|
27
|
+
[:belongs_to, :has_one, :has_many].each do |method_name|
|
34
28
|
define_method(method_name) do |assoc_name, *args|
|
35
29
|
define_method(assoc_name) do
|
36
30
|
instance_variable_get("@#{assoc_name}") || (method_name == :has_many ? [] : nil)
|
@@ -41,7 +35,6 @@ module Ardb
|
|
41
35
|
|
42
36
|
self.associations << Association.new(method_name, assoc_name, *args)
|
43
37
|
end
|
44
|
-
|
45
38
|
end
|
46
39
|
|
47
40
|
# Validations
|
@@ -66,7 +59,6 @@ module Ardb
|
|
66
59
|
define_method(method_name) do |*args|
|
67
60
|
self.validations << Validation.new(type, *args)
|
68
61
|
end
|
69
|
-
|
70
62
|
end
|
71
63
|
|
72
64
|
def validates_associated(*args)
|
@@ -110,11 +102,9 @@ module Ardb
|
|
110
102
|
:after_initialize,
|
111
103
|
:after_find
|
112
104
|
].each do |method_name|
|
113
|
-
|
114
105
|
define_method(method_name) do |*args, &block|
|
115
106
|
self.callbacks << Callback.new(method_name, *args, &block)
|
116
107
|
end
|
117
|
-
|
118
108
|
end
|
119
109
|
|
120
110
|
def custom_callback_types
|
@@ -137,8 +127,6 @@ module Ardb
|
|
137
127
|
end
|
138
128
|
end
|
139
129
|
|
140
|
-
CallbackType = Struct.new(:name, :options)
|
141
|
-
|
142
130
|
# Scopes
|
143
131
|
|
144
132
|
attr_writer :relation_spy
|
@@ -170,17 +158,13 @@ module Ardb
|
|
170
158
|
:except,
|
171
159
|
:only
|
172
160
|
].each do |method_name|
|
173
|
-
|
174
161
|
define_method(method_name) do |*args|
|
175
162
|
self.relation_spy.send(method_name, *args)
|
176
163
|
end
|
177
|
-
|
178
164
|
end
|
179
|
-
|
180
165
|
end
|
181
166
|
|
182
|
-
|
183
|
-
|
167
|
+
plugin_instance_methods do
|
184
168
|
attr_accessor :id
|
185
169
|
|
186
170
|
def update_column(col, value)
|
@@ -195,7 +179,6 @@ module Ardb
|
|
195
179
|
self.manually_run_callbacks << name
|
196
180
|
block.call if block
|
197
181
|
end
|
198
|
-
|
199
182
|
end
|
200
183
|
|
201
184
|
class Association
|
@@ -235,7 +218,5 @@ module Ardb
|
|
235
218
|
end
|
236
219
|
end
|
237
220
|
end
|
238
|
-
|
239
221
|
end
|
240
|
-
|
241
222
|
end
|
data/lib/ardb/relation_spy.rb
CHANGED
@@ -1,7 +1,5 @@
|
|
1
1
|
module Ardb
|
2
|
-
|
3
2
|
class RelationSpy
|
4
|
-
|
5
3
|
attr_reader :applied
|
6
4
|
attr_accessor :limit_value, :offset_value
|
7
5
|
attr_accessor :pluck_values, :maximum_values, :minimum_values
|
@@ -50,12 +48,10 @@ module Ardb
|
|
50
48
|
:reverse_order,
|
51
49
|
:readonly
|
52
50
|
].each do |type|
|
53
|
-
|
54
51
|
define_method(type) do |*args|
|
55
52
|
@applied << AppliedExpression.new(type, args)
|
56
53
|
self
|
57
54
|
end
|
58
|
-
|
59
55
|
end
|
60
56
|
|
61
57
|
def limit(value)
|
@@ -152,7 +148,5 @@ module Ardb
|
|
152
148
|
end
|
153
149
|
|
154
150
|
NotFoundError = Class.new(RuntimeError)
|
155
|
-
|
156
151
|
end
|
157
|
-
|
158
152
|
end
|
@@ -1,69 +1,114 @@
|
|
1
1
|
# ActiveRecord makes use of autoload to load some of its components as-needed.
|
2
|
-
# This doesn
|
2
|
+
# This doesn"t work well with threaded environments, and causes uninitialized
|
3
3
|
# constants. To avoid this, this file manually requires the following files that
|
4
|
-
# are not required using `require
|
4
|
+
# are not required using `require "active_record"`. Trying to automatically
|
5
5
|
# require every file in ActiveRecord is slow and inefficient. Many of the files
|
6
|
-
# fail to require and there are some we don
|
6
|
+
# fail to require and there are some we don"t want to require. Thus, this is a
|
7
7
|
# manual list of requires.
|
8
8
|
|
9
9
|
# To re-build this list of requires, run the following:
|
10
10
|
# bundle exec ruby script/determine_autoloaded_active_record_files.rb
|
11
11
|
|
12
12
|
# For compatibility, we require active record first
|
13
|
-
require
|
13
|
+
require "active_record"
|
14
14
|
|
15
|
-
|
16
|
-
require
|
17
|
-
require
|
18
|
-
require
|
19
|
-
require
|
20
|
-
require
|
21
|
-
require
|
22
|
-
require
|
23
|
-
require
|
24
|
-
require
|
25
|
-
require
|
26
|
-
require
|
27
|
-
require
|
28
|
-
require
|
29
|
-
require
|
30
|
-
require
|
31
|
-
require
|
32
|
-
require
|
33
|
-
require
|
34
|
-
require
|
35
|
-
require
|
36
|
-
require
|
37
|
-
require
|
38
|
-
require
|
39
|
-
require
|
40
|
-
require
|
41
|
-
require
|
42
|
-
require
|
43
|
-
require
|
44
|
-
require
|
45
|
-
require
|
46
|
-
require
|
47
|
-
require
|
48
|
-
require
|
49
|
-
require
|
50
|
-
require
|
51
|
-
require
|
52
|
-
require
|
53
|
-
require
|
54
|
-
|
55
|
-
require
|
56
|
-
require
|
57
|
-
require
|
58
|
-
require
|
59
|
-
require
|
60
|
-
require
|
61
|
-
require
|
62
|
-
require
|
63
|
-
require
|
15
|
+
if ActiveRecord.version.segments.first == 6
|
16
|
+
require "active_record/advisory_lock_base"
|
17
|
+
require "active_record/associations/alias_tracker"
|
18
|
+
require "active_record/associations/association"
|
19
|
+
require "active_record/associations/association_scope"
|
20
|
+
require "active_record/associations/belongs_to_association"
|
21
|
+
require "active_record/associations/belongs_to_polymorphic_association"
|
22
|
+
require "active_record/associations/builder/belongs_to"
|
23
|
+
require "active_record/associations/builder/collection_association"
|
24
|
+
require "active_record/associations/builder/has_and_belongs_to_many"
|
25
|
+
require "active_record/associations/builder/has_many"
|
26
|
+
require "active_record/associations/builder/has_one"
|
27
|
+
require "active_record/associations/collection_association"
|
28
|
+
require "active_record/associations/foreign_association"
|
29
|
+
require "active_record/associations/has_many_association"
|
30
|
+
require "active_record/associations/has_many_through_association"
|
31
|
+
require "active_record/associations/has_one_association"
|
32
|
+
require "active_record/associations/has_one_through_association"
|
33
|
+
require "active_record/associations/join_dependency"
|
34
|
+
require "active_record/associations/join_dependency/join_association"
|
35
|
+
require "active_record/associations/join_dependency/join_base"
|
36
|
+
require "active_record/associations/preloader"
|
37
|
+
require "active_record/associations/preloader/association"
|
38
|
+
require "active_record/associations/preloader/through_association"
|
39
|
+
require "active_record/coders/json"
|
40
|
+
require "active_record/internal_metadata"
|
41
|
+
require "active_record/legacy_yaml_adapter"
|
42
|
+
require "active_record/middleware/database_selector"
|
43
|
+
require "active_record/null_relation"
|
44
|
+
require "active_record/relation/predicate_builder"
|
45
|
+
require "active_record/relation/record_fetch_warning"
|
46
|
+
require "active_record/result"
|
47
|
+
require "active_record/runtime_registry"
|
48
|
+
require "active_record/statement_cache"
|
49
|
+
require "active_record/table_metadata"
|
50
|
+
require "active_record/tasks/database_tasks"
|
51
|
+
require "active_record/tasks/mysql_database_tasks"
|
52
|
+
require "active_record/tasks/postgresql_database_tasks"
|
53
|
+
require "active_record/tasks/sqlite_database_tasks"
|
54
|
+
else # ActiveRecord 5
|
55
|
+
require "active_record/aggregations"
|
56
|
+
require "active_record/association_relation"
|
57
|
+
require "active_record/associations"
|
58
|
+
require "active_record/associations/alias_tracker"
|
59
|
+
require "active_record/associations/association"
|
60
|
+
require "active_record/associations/association_scope"
|
61
|
+
require "active_record/associations/belongs_to_association"
|
62
|
+
require "active_record/associations/belongs_to_polymorphic_association"
|
63
|
+
require "active_record/associations/builder/association"
|
64
|
+
require "active_record/associations/builder/belongs_to"
|
65
|
+
require "active_record/associations/builder/collection_association"
|
66
|
+
require "active_record/associations/builder/has_and_belongs_to_many"
|
67
|
+
require "active_record/associations/builder/has_many"
|
68
|
+
require "active_record/associations/builder/has_one"
|
69
|
+
require "active_record/associations/collection_association"
|
70
|
+
require "active_record/associations/collection_proxy"
|
71
|
+
require "active_record/associations/foreign_association"
|
72
|
+
require "active_record/associations/has_many_association"
|
73
|
+
require "active_record/associations/has_many_through_association"
|
74
|
+
require "active_record/associations/has_one_association"
|
75
|
+
require "active_record/associations/has_one_through_association"
|
76
|
+
require "active_record/associations/join_dependency"
|
77
|
+
require "active_record/associations/join_dependency/join_association"
|
78
|
+
require "active_record/associations/join_dependency/join_base"
|
79
|
+
require "active_record/associations/preloader"
|
80
|
+
require "active_record/associations/preloader/association"
|
81
|
+
require "active_record/associations/preloader/through_association"
|
82
|
+
require "active_record/attribute_assignment"
|
83
|
+
require "active_record/attribute_decorators"
|
84
|
+
require "active_record/attribute_methods/before_type_cast"
|
85
|
+
require "active_record/attribute_methods/dirty"
|
86
|
+
require "active_record/attribute_methods/primary_key"
|
87
|
+
require "active_record/attribute_methods/query"
|
88
|
+
require "active_record/attribute_methods/read"
|
89
|
+
require "active_record/attribute_methods/serialization"
|
90
|
+
require "active_record/attribute_methods/time_zone_conversion"
|
91
|
+
require "active_record/attribute_methods/write"
|
92
|
+
require "active_record/attributes"
|
93
|
+
require "active_record/autosave_association"
|
94
|
+
require "active_record/base"
|
95
|
+
require "active_record/coders/json"
|
96
|
+
require "active_record/internal_metadata"
|
97
|
+
require "active_record/legacy_yaml_adapter"
|
98
|
+
require "active_record/null_relation"
|
99
|
+
require "active_record/relation/predicate_builder"
|
100
|
+
require "active_record/relation/record_fetch_warning"
|
101
|
+
require "active_record/result"
|
102
|
+
require "active_record/runtime_registry"
|
103
|
+
require "active_record/statement_cache"
|
104
|
+
require "active_record/table_metadata"
|
105
|
+
require "active_record/tasks/database_tasks"
|
106
|
+
require "active_record/tasks/mysql_database_tasks"
|
107
|
+
require "active_record/tasks/postgresql_database_tasks"
|
108
|
+
require "active_record/tasks/sqlite_database_tasks"
|
109
|
+
end
|
64
110
|
|
65
|
-
# There are also issues with requiring ActiveSupport. This doesn
|
66
|
-
# ActiveSupport file though, only ones we
|
67
|
-
require
|
68
|
-
|
69
|
-
require 'active_support/multibyte/chars'
|
111
|
+
# There are also issues with requiring ActiveSupport. This doesn"t require every
|
112
|
+
# ActiveSupport file though, only ones we"ve seen cause problems.
|
113
|
+
require "active_support"
|
114
|
+
require "active_support/multibyte/chars"
|
data/lib/ardb/test_helpers.rb
CHANGED
@@ -1,11 +1,10 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "active_record"
|
2
|
+
require "ardb"
|
3
3
|
|
4
4
|
# Use theses helpers in your test suite. They all generally assume Ardb has
|
5
5
|
# already been initialized by calling `Ardb.init`.
|
6
6
|
|
7
7
|
module Ardb
|
8
|
-
|
9
8
|
module TestHelpers
|
10
9
|
module_function
|
11
10
|
|
@@ -73,7 +72,5 @@ module Ardb
|
|
73
72
|
true
|
74
73
|
end
|
75
74
|
end
|
76
|
-
|
77
75
|
end
|
78
|
-
|
79
76
|
end
|