ardb 0.28.0 → 0.29.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. checksums.yaml +7 -7
  2. data/Gemfile +19 -8
  3. data/README.md +252 -3
  4. data/ardb.gemspec +8 -7
  5. data/bin/ardb +1 -1
  6. data/lib/ardb.rb +55 -39
  7. data/lib/ardb/adapter/base.rb +35 -30
  8. data/lib/ardb/adapter/mysql.rb +2 -17
  9. data/lib/ardb/adapter/postgresql.rb +24 -30
  10. data/lib/ardb/adapter/sqlite.rb +4 -8
  11. data/lib/ardb/adapter_spy.rb +2 -16
  12. data/lib/ardb/cli.rb +15 -15
  13. data/lib/ardb/cli/clirb.rb +14 -17
  14. data/lib/ardb/cli/commands.rb +204 -114
  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 +9 -13
  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 +172 -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 +14 -9
  25. data/test/helper.rb +4 -13
  26. data/test/support/factory.rb +2 -2
  27. data/test/support/postgresql/migrations/{.gitkeep → .keep} +0 -0
  28. data/test/support/postgresql/schema.rb +0 -1
  29. data/test/support/postgresql/setup_test_db.rb +15 -15
  30. data/test/system/.keep +0 -0
  31. data/test/unit/adapter/base_tests.rb +76 -52
  32. data/test/unit/adapter/mysql_tests.rb +2 -19
  33. data/test/unit/adapter/postgresql_tests.rb +14 -23
  34. data/test/unit/adapter/sqlite_tests.rb +3 -11
  35. data/test/unit/adapter_spy_tests.rb +2 -16
  36. data/test/unit/ardb_tests.rb +57 -44
  37. data/test/unit/cli_tests.rb +220 -158
  38. data/test/unit/db_tests_tests.rb +3 -6
  39. data/test/unit/default_order_by_tests.rb +4 -8
  40. data/test/unit/migration_tests.rb +11 -15
  41. data/test/unit/record_spy_tests.rb +17 -22
  42. data/test/unit/relation_spy_tests.rb +17 -46
  43. data/test/unit/test_helpers_tests.rb +3 -14
  44. data/test/unit/use_db_default_tests.rb +7 -11
  45. metadata +100 -83
  46. data/lib/ardb/has_slug.rb +0 -107
  47. data/lib/ardb/migration_helpers.rb +0 -77
  48. data/lib/ardb/pg_json.rb +0 -90
  49. data/test/support/postgresql/pg_json_migrations/20160519133432_create_pg_json_migrate_test.rb +0 -13
  50. data/test/system/pg_json_tests.rb +0 -85
  51. data/test/unit/has_slug_tests.rb +0 -341
  52. data/test/unit/migration_helpers_tests.rb +0 -65
  53. data/test/unit/pg_json_tests.rb +0 -39
@@ -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,8 +1,8 @@
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
7
  attr_reader :migrations_path, :identifier
8
8
  attr_reader :class_name, :file_name, :file_path, :source
@@ -17,17 +17,17 @@ module Ardb
17
17
  @file_name = get_file_name(@identifier)
18
18
  @file_path = File.join(self.migrations_path, "#{@file_name}.rb")
19
19
 
20
- @source = "require 'ardb/migration_helpers'\n\n" \
21
- "class #{@class_name} < ActiveRecord::Migration\n" \
22
- " include Ardb::MigrationHelpers\n\n" \
23
- " def change\n" \
24
- " end\n\n" \
25
- "end\n"
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"
26
26
  end
27
27
 
28
28
  def save!
29
29
  FileUtils.mkdir_p self.migrations_path
30
- File.open(self.file_path, 'w'){ |f| f.write(self.source) }
30
+ File.open(self.file_path, "w"){ |f| f.write(self.source) }
31
31
  self
32
32
  end
33
33
 
@@ -36,9 +36,5 @@ module Ardb
36
36
  def get_file_name(identifier)
37
37
  "#{Time.now.strftime("%Y%m%d%H%M%S")}_#{identifier.underscore}"
38
38
  end
39
-
40
- NoIdentifierError = Class.new(ArgumentError)
41
-
42
39
  end
43
-
44
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,183 @@
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 (
16
+ ActiveRecord.version.segments[0] == 6 &&
17
+ ActiveRecord.version.segments[1] > 0
18
+ )
19
+ require "active_record/aggregations"
20
+ require "active_record/association_relation"
21
+ require "active_record/associations"
22
+ require "active_record/associations/alias_tracker"
23
+ require "active_record/associations/association"
24
+ require "active_record/associations/association_scope"
25
+ require "active_record/associations/belongs_to_association"
26
+ require "active_record/associations/belongs_to_polymorphic_association"
27
+ require "active_record/associations/builder/association"
28
+ require "active_record/associations/builder/belongs_to"
29
+ require "active_record/associations/builder/collection_association"
30
+ require "active_record/associations/builder/has_and_belongs_to_many"
31
+ require "active_record/associations/builder/has_many"
32
+ require "active_record/associations/builder/has_one"
33
+ require "active_record/associations/collection_association"
34
+ require "active_record/associations/collection_proxy"
35
+ require "active_record/associations/foreign_association"
36
+ require "active_record/associations/has_many_association"
37
+ require "active_record/associations/has_many_through_association"
38
+ require "active_record/associations/has_one_association"
39
+ require "active_record/associations/has_one_through_association"
40
+ require "active_record/associations/join_dependency"
41
+ require "active_record/associations/join_dependency/join_association"
42
+ require "active_record/associations/join_dependency/join_base"
43
+ require "active_record/associations/preloader"
44
+ require "active_record/associations/preloader/association"
45
+ require "active_record/associations/preloader/through_association"
46
+ require "active_record/attribute_assignment"
47
+ require "active_record/attribute_methods/before_type_cast"
48
+ require "active_record/attribute_methods/dirty"
49
+ require "active_record/attribute_methods/primary_key"
50
+ require "active_record/attribute_methods/query"
51
+ require "active_record/attribute_methods/read"
52
+ require "active_record/attribute_methods/serialization"
53
+ require "active_record/attribute_methods/time_zone_conversion"
54
+ require "active_record/attribute_methods/write"
55
+ require "active_record/attributes"
56
+ require "active_record/autosave_association"
57
+ require "active_record/base"
58
+ require "active_record/coders/json"
59
+ require "active_record/internal_metadata"
60
+ require "active_record/legacy_yaml_adapter"
61
+ require "active_record/middleware/database_selector"
62
+ require "active_record/null_relation"
63
+ require "active_record/relation/predicate_builder"
64
+ require "active_record/relation/record_fetch_warning"
65
+ require "active_record/result"
66
+ require "active_record/runtime_registry"
67
+ require "active_record/statement_cache"
68
+ require "active_record/table_metadata"
69
+ require "active_record/tasks/database_tasks"
70
+ require "active_record/tasks/mysql_database_tasks"
71
+ require "active_record/tasks/postgresql_database_tasks"
72
+ require "active_record/tasks/sqlite_database_tasks"
73
+ require "arel/collectors/bind"
74
+ require "arel/collectors/composite"
75
+ require "arel/collectors/substitute_binds"
76
+ elsif (
77
+ ActiveRecord.version.segments[0] == 6 &&
78
+ ActiveRecord.version.segments[1] == 0
79
+ )
80
+ require "active_record/advisory_lock_base"
81
+ require "active_record/associations/alias_tracker"
82
+ require "active_record/associations/association"
83
+ require "active_record/associations/association_scope"
84
+ require "active_record/associations/belongs_to_association"
85
+ require "active_record/associations/belongs_to_polymorphic_association"
86
+ require "active_record/associations/builder/belongs_to"
87
+ require "active_record/associations/builder/collection_association"
88
+ require "active_record/associations/builder/has_and_belongs_to_many"
89
+ require "active_record/associations/builder/has_many"
90
+ require "active_record/associations/builder/has_one"
91
+ require "active_record/associations/collection_association"
92
+ require "active_record/associations/foreign_association"
93
+ require "active_record/associations/has_many_association"
94
+ require "active_record/associations/has_many_through_association"
95
+ require "active_record/associations/has_one_association"
96
+ require "active_record/associations/has_one_through_association"
97
+ require "active_record/associations/join_dependency"
98
+ require "active_record/associations/join_dependency/join_association"
99
+ require "active_record/associations/join_dependency/join_base"
100
+ require "active_record/associations/preloader"
101
+ require "active_record/associations/preloader/association"
102
+ require "active_record/associations/preloader/through_association"
103
+ require "active_record/coders/json"
104
+ require "active_record/internal_metadata"
105
+ require "active_record/legacy_yaml_adapter"
106
+ require "active_record/middleware/database_selector"
107
+ require "active_record/null_relation"
108
+ require "active_record/relation/predicate_builder"
109
+ require "active_record/relation/record_fetch_warning"
110
+ require "active_record/result"
111
+ require "active_record/runtime_registry"
112
+ require "active_record/statement_cache"
113
+ require "active_record/table_metadata"
114
+ require "active_record/tasks/database_tasks"
115
+ require "active_record/tasks/mysql_database_tasks"
116
+ require "active_record/tasks/postgresql_database_tasks"
117
+ require "active_record/tasks/sqlite_database_tasks"
118
+ elsif ActiveRecord.version.segments[0] == 5
119
+ require "active_record/aggregations"
120
+ require "active_record/association_relation"
121
+ require "active_record/associations"
122
+ require "active_record/associations/alias_tracker"
123
+ require "active_record/associations/association"
124
+ require "active_record/associations/association_scope"
125
+ require "active_record/associations/belongs_to_association"
126
+ require "active_record/associations/belongs_to_polymorphic_association"
127
+ require "active_record/associations/builder/association"
128
+ require "active_record/associations/builder/belongs_to"
129
+ require "active_record/associations/builder/collection_association"
130
+ require "active_record/associations/builder/has_and_belongs_to_many"
131
+ require "active_record/associations/builder/has_many"
132
+ require "active_record/associations/builder/has_one"
133
+ require "active_record/associations/collection_association"
134
+ require "active_record/associations/collection_proxy"
135
+ require "active_record/associations/foreign_association"
136
+ require "active_record/associations/has_many_association"
137
+ require "active_record/associations/has_many_through_association"
138
+ require "active_record/associations/has_one_association"
139
+ require "active_record/associations/has_one_through_association"
140
+ require "active_record/associations/join_dependency"
141
+ require "active_record/associations/join_dependency/join_association"
142
+ require "active_record/associations/join_dependency/join_base"
143
+ require "active_record/associations/preloader"
144
+ require "active_record/associations/preloader/association"
145
+ require "active_record/associations/preloader/through_association"
146
+ require "active_record/attribute_assignment"
147
+ require "active_record/attribute_decorators"
148
+ require "active_record/attribute_methods/before_type_cast"
149
+ require "active_record/attribute_methods/dirty"
150
+ require "active_record/attribute_methods/primary_key"
151
+ require "active_record/attribute_methods/query"
152
+ require "active_record/attribute_methods/read"
153
+ require "active_record/attribute_methods/serialization"
154
+ require "active_record/attribute_methods/time_zone_conversion"
155
+ require "active_record/attribute_methods/write"
156
+ require "active_record/attributes"
157
+ require "active_record/autosave_association"
158
+ require "active_record/base"
159
+ require "active_record/coders/json"
160
+ require "active_record/internal_metadata"
161
+ require "active_record/legacy_yaml_adapter"
162
+ require "active_record/null_relation"
163
+ require "active_record/relation/predicate_builder"
164
+ require "active_record/relation/record_fetch_warning"
165
+ require "active_record/result"
166
+ require "active_record/runtime_registry"
167
+ require "active_record/statement_cache"
168
+ require "active_record/table_metadata"
169
+ require "active_record/tasks/database_tasks"
170
+ require "active_record/tasks/mysql_database_tasks"
171
+ require "active_record/tasks/postgresql_database_tasks"
172
+ require "active_record/tasks/sqlite_database_tasks"
173
+ else
174
+ raise(
175
+ "ActiveRecord #{ActiveRecord.version} isn't supported. "\
176
+ "Switch to 5.X or 6.X"
177
+ )
178
+ end
64
179
 
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'
180
+ # There are also issues with requiring ActiveSupport. This doesn"t require every
181
+ # ActiveSupport file though, only ones we"ve seen cause problems.
182
+ require "active_support"
183
+ require "active_support/multibyte/chars"