ardb 0.27.3 → 0.29.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.
Files changed (54) hide show
  1. checksums.yaml +7 -7
  2. data/Gemfile +4 -5
  3. data/README.md +252 -3
  4. data/ardb.gemspec +8 -8
  5. data/bin/ardb +1 -1
  6. data/lib/ardb.rb +155 -72
  7. data/lib/ardb/adapter/base.rb +67 -47
  8. data/lib/ardb/adapter/mysql.rb +3 -19
  9. data/lib/ardb/adapter/postgresql.rb +33 -37
  10. data/lib/ardb/adapter/sqlite.rb +7 -16
  11. data/lib/ardb/adapter_spy.rb +58 -92
  12. data/lib/ardb/cli.rb +18 -226
  13. data/lib/ardb/{clirb.rb → cli/clirb.rb} +16 -18
  14. data/lib/ardb/cli/commands.rb +365 -0
  15. data/lib/ardb/db_tests.rb +2 -4
  16. data/lib/ardb/default_order_by.rb +3 -13
  17. data/lib/ardb/migration.rb +18 -20
  18. data/lib/ardb/record_spy.rb +7 -26
  19. data/lib/ardb/relation_spy.rb +0 -6
  20. data/lib/ardb/require_autoloaded_active_record_files.rb +103 -58
  21. data/lib/ardb/test_helpers.rb +2 -5
  22. data/lib/ardb/use_db_default.rb +4 -15
  23. data/lib/ardb/version.rb +1 -1
  24. data/script/determine_autoloaded_active_record_files.rb +11 -8
  25. data/test/helper.rb +9 -6
  26. data/test/support/factory.rb +17 -2
  27. data/test/support/fake_schema.rb +5 -0
  28. data/test/support/postgresql/migrations/.keep +0 -0
  29. data/test/support/postgresql/schema.rb +2 -0
  30. data/test/support/postgresql/setup_test_db.rb +51 -0
  31. data/test/support/relative_require_test_db_file.rb +2 -0
  32. data/test/support/require_test_db_file.rb +1 -0
  33. data/test/system/.keep +0 -0
  34. data/test/unit/adapter/base_tests.rb +163 -75
  35. data/test/unit/adapter/mysql_tests.rb +4 -20
  36. data/test/unit/adapter/postgresql_tests.rb +20 -28
  37. data/test/unit/adapter/sqlite_tests.rb +9 -12
  38. data/test/unit/adapter_spy_tests.rb +48 -71
  39. data/test/unit/ardb_tests.rb +338 -38
  40. data/test/unit/cli_tests.rb +334 -225
  41. data/test/unit/db_tests_tests.rb +3 -6
  42. data/test/unit/default_order_by_tests.rb +4 -8
  43. data/test/unit/migration_tests.rb +20 -17
  44. data/test/unit/record_spy_tests.rb +18 -23
  45. data/test/unit/relation_spy_tests.rb +17 -46
  46. data/test/unit/test_helpers_tests.rb +5 -20
  47. data/test/unit/use_db_default_tests.rb +9 -13
  48. metadata +111 -100
  49. data/lib/ardb/has_slug.rb +0 -107
  50. data/lib/ardb/migration_helpers.rb +0 -77
  51. data/lib/ardb/root_path.rb +0 -15
  52. data/test/unit/config_tests.rb +0 -58
  53. data/test/unit/has_slug_tests.rb +0 -341
  54. data/test/unit/migration_helpers_tests.rb +0 -59
@@ -1,8 +1,7 @@
1
- require 'active_record'
2
- require 'assert'
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 'much-plugin'
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
- module ClassMethods
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
- module InstanceMethods
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
@@ -1,31 +1,33 @@
1
- require 'fileutils'
1
+ require "fileutils"
2
2
 
3
3
  module Ardb
4
-
5
4
  class Migration
5
+ NoIdentifierError = Class.new(ArgumentError)
6
6
 
7
- attr_reader :identifier, :class_name, :file_name, :file_path
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
- @identifier = identifier
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(Ardb.config.migrations_path, "#{@file_name}.rb")
17
-
18
- @source = "require 'ardb/migration_helpers'\n\n" \
19
- "class #{@class_name} < ActiveRecord::Migration\n" \
20
- " include Ardb::MigrationHelpers\n\n" \
21
- " def change\n" \
22
- " end\n\n" \
23
- "end\n"
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 Ardb.config.migrations_path
28
- File.open(self.file_path, 'w'){ |f| f.write(self.source) }
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
@@ -1,9 +1,8 @@
1
- require 'arel'
2
- require 'much-plugin'
3
- require 'ardb/relation_spy'
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
- plugin_included do
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
- [ :belongs_to, :has_one, :has_many ].each do |method_name|
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
- module InstanceMethods
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
@@ -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't work well with threaded environments, and causes uninitialized
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 'active_record'`. Trying to automatically
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't want to require. Thus, this is a
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 'active_record'
13
+ require "active_record"
14
14
 
15
- require 'active_record/aggregations'
16
- require 'active_record/associations'
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/association'
23
- require 'active_record/associations/builder/belongs_to'
24
- require 'active_record/associations/builder/collection_association'
25
- require 'active_record/associations/builder/has_and_belongs_to_many'
26
- require 'active_record/associations/builder/has_many'
27
- require 'active_record/associations/builder/has_one'
28
- require 'active_record/associations/collection_association'
29
- require 'active_record/associations/collection_proxy'
30
- require 'active_record/associations/has_and_belongs_to_many_association'
31
- require 'active_record/associations/has_many_association'
32
- require 'active_record/associations/has_many_through_association'
33
- require 'active_record/associations/has_one_association'
34
- require 'active_record/associations/has_one_through_association'
35
- require 'active_record/associations/join_dependency'
36
- require 'active_record/associations/join_dependency/join_association'
37
- require 'active_record/associations/join_dependency/join_base'
38
- require 'active_record/associations/preloader'
39
- require 'active_record/associations/preloader/association'
40
- require 'active_record/associations/preloader/belongs_to'
41
- require 'active_record/associations/preloader/collection_association'
42
- require 'active_record/associations/preloader/has_and_belongs_to_many'
43
- require 'active_record/associations/preloader/has_many'
44
- require 'active_record/associations/preloader/has_many_through'
45
- require 'active_record/associations/preloader/has_one'
46
- require 'active_record/associations/preloader/has_one_through'
47
- require 'active_record/attribute_assignment'
48
- require 'active_record/attribute_methods/before_type_cast'
49
- require 'active_record/attribute_methods/deprecated_underscore_read'
50
- require 'active_record/attribute_methods/dirty'
51
- require 'active_record/attribute_methods/primary_key'
52
- require 'active_record/attribute_methods/query'
53
- require 'active_record/attribute_methods/read'
54
- require 'active_record/attribute_methods/serialization'
55
- require 'active_record/attribute_methods/time_zone_conversion'
56
- require 'active_record/autosave_association'
57
- require 'active_record/base'
58
- require 'active_record/dynamic_finder_match'
59
- require 'active_record/dynamic_scope_match'
60
- require 'active_record/observer'
61
- require 'active_record/relation'
62
- require 'active_record/relation/predicate_builder'
63
- require 'active_record/result'
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't require every
66
- # ActiveSupport file though, only ones we've seen cause problems.
67
- require 'active_support'
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"
@@ -1,11 +1,10 @@
1
- require 'active_record'
2
- require 'ardb'
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