ardb 0.27.3 → 0.29.0

Sign up to get free protection for your applications and to get access to all the features.
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