ardb 0.28.1 → 0.29.2

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 (59) hide show
  1. checksums.yaml +7 -7
  2. data/.l.yml +8 -0
  3. data/.rubocop.yml +3 -0
  4. data/.t.yml +6 -0
  5. data/Gemfile +21 -8
  6. data/README.md +252 -3
  7. data/ardb.gemspec +14 -10
  8. data/bin/ardb +3 -1
  9. data/lib/ardb.rb +110 -80
  10. data/lib/ardb/adapter/base.rb +73 -47
  11. data/lib/ardb/adapter/mysql.rb +4 -17
  12. data/lib/ardb/adapter/postgresql.rb +51 -46
  13. data/lib/ardb/adapter/sqlite.rb +11 -15
  14. data/lib/ardb/adapter_spy.rb +18 -30
  15. data/lib/ardb/cli.rb +29 -24
  16. data/lib/ardb/cli/clirb.rb +19 -17
  17. data/lib/ardb/cli/commands.rb +308 -129
  18. data/lib/ardb/db_tests.rb +4 -4
  19. data/lib/ardb/default_order_by.rb +13 -21
  20. data/lib/ardb/migration.rb +15 -16
  21. data/lib/ardb/record_spy.rb +46 -61
  22. data/lib/ardb/relation_spy.rb +27 -31
  23. data/lib/ardb/require_autoloaded_active_record_files.rb +174 -58
  24. data/lib/ardb/test_helpers.rb +13 -14
  25. data/lib/ardb/use_db_default.rb +10 -19
  26. data/lib/ardb/version.rb +3 -1
  27. data/script/determine_autoloaded_active_record_files.rb +31 -24
  28. data/test/helper.rb +6 -13
  29. data/test/support/factory.rb +4 -3
  30. data/test/support/fake_schema.rb +3 -1
  31. data/test/support/postgresql/migrations/{.gitkeep → .keep} +0 -0
  32. data/test/support/postgresql/schema.rb +2 -1
  33. data/test/support/postgresql/setup_test_db.rb +17 -15
  34. data/test/support/relative_require_test_db_file.rb +1 -0
  35. data/test/support/require_test_db_file.rb +1 -0
  36. data/test/system/.keep +0 -0
  37. data/test/unit/adapter/base_tests.rb +83 -55
  38. data/test/unit/adapter/mysql_tests.rb +4 -19
  39. data/test/unit/adapter/postgresql_tests.rb +21 -30
  40. data/test/unit/adapter/sqlite_tests.rb +5 -11
  41. data/test/unit/adapter_spy_tests.rb +6 -17
  42. data/test/unit/ardb_tests.rb +81 -53
  43. data/test/unit/cli_tests.rb +232 -157
  44. data/test/unit/db_tests_tests.rb +7 -7
  45. data/test/unit/default_order_by_tests.rb +21 -20
  46. data/test/unit/migration_tests.rb +17 -18
  47. data/test/unit/record_spy_tests.rb +36 -34
  48. data/test/unit/relation_spy_tests.rb +40 -63
  49. data/test/unit/test_helpers_tests.rb +7 -15
  50. data/test/unit/use_db_default_tests.rb +22 -17
  51. metadata +117 -84
  52. data/lib/ardb/has_slug.rb +0 -107
  53. data/lib/ardb/migration_helpers.rb +0 -77
  54. data/lib/ardb/pg_json.rb +0 -90
  55. data/test/support/postgresql/pg_json_migrations/20160519133432_create_pg_json_migrate_test.rb +0 -13
  56. data/test/system/pg_json_tests.rb +0 -85
  57. data/test/unit/has_slug_tests.rb +0 -341
  58. data/test/unit/migration_helpers_tests.rb +0 -65
  59. data/test/unit/pg_json_tests.rb +0 -39
@@ -1,69 +1,185 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # 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
4
+ # This doesn"t work well with threaded environments, and causes uninitialized
3
5
  # constants. To avoid this, this file manually requires the following files that
4
- # are not required using `require 'active_record'`. Trying to automatically
6
+ # are not required using `require "active_record"`. Trying to automatically
5
7
  # 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
8
+ # fail to require and there are some we don"t want to require. Thus, this is a
7
9
  # manual list of requires.
8
10
 
9
11
  # To re-build this list of requires, run the following:
10
12
  # bundle exec ruby script/determine_autoloaded_active_record_files.rb
11
13
 
12
14
  # For compatibility, we require active record first
13
- require 'active_record'
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
+ require "active_record"
64
16
 
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'
17
+ if (
18
+ ActiveRecord.version.segments[0] == 6 &&
19
+ ActiveRecord.version.segments[1] > 0
20
+ )
21
+ require "active_record/aggregations"
22
+ require "active_record/association_relation"
23
+ require "active_record/associations"
24
+ require "active_record/associations/alias_tracker"
25
+ require "active_record/associations/association"
26
+ require "active_record/associations/association_scope"
27
+ require "active_record/associations/belongs_to_association"
28
+ require "active_record/associations/belongs_to_polymorphic_association"
29
+ require "active_record/associations/builder/association"
30
+ require "active_record/associations/builder/belongs_to"
31
+ require "active_record/associations/builder/collection_association"
32
+ require "active_record/associations/builder/has_and_belongs_to_many"
33
+ require "active_record/associations/builder/has_many"
34
+ require "active_record/associations/builder/has_one"
35
+ require "active_record/associations/collection_association"
36
+ require "active_record/associations/collection_proxy"
37
+ require "active_record/associations/foreign_association"
38
+ require "active_record/associations/has_many_association"
39
+ require "active_record/associations/has_many_through_association"
40
+ require "active_record/associations/has_one_association"
41
+ require "active_record/associations/has_one_through_association"
42
+ require "active_record/associations/join_dependency"
43
+ require "active_record/associations/join_dependency/join_association"
44
+ require "active_record/associations/join_dependency/join_base"
45
+ require "active_record/associations/preloader"
46
+ require "active_record/associations/preloader/association"
47
+ require "active_record/associations/preloader/through_association"
48
+ require "active_record/attribute_assignment"
49
+ require "active_record/attribute_methods/before_type_cast"
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/attribute_methods/write"
57
+ require "active_record/attributes"
58
+ require "active_record/autosave_association"
59
+ require "active_record/base"
60
+ require "active_record/coders/json"
61
+ require "active_record/internal_metadata"
62
+ require "active_record/legacy_yaml_adapter"
63
+ require "active_record/middleware/database_selector"
64
+ require "active_record/null_relation"
65
+ require "active_record/relation/predicate_builder"
66
+ require "active_record/relation/record_fetch_warning"
67
+ require "active_record/result"
68
+ require "active_record/runtime_registry"
69
+ require "active_record/statement_cache"
70
+ require "active_record/table_metadata"
71
+ require "active_record/tasks/database_tasks"
72
+ require "active_record/tasks/mysql_database_tasks"
73
+ require "active_record/tasks/postgresql_database_tasks"
74
+ require "active_record/tasks/sqlite_database_tasks"
75
+ require "arel/collectors/bind"
76
+ require "arel/collectors/composite"
77
+ require "arel/collectors/substitute_binds"
78
+ elsif (
79
+ ActiveRecord.version.segments[0] == 6 &&
80
+ ActiveRecord.version.segments[1] == 0
81
+ )
82
+ require "active_record/advisory_lock_base"
83
+ require "active_record/associations/alias_tracker"
84
+ require "active_record/associations/association"
85
+ require "active_record/associations/association_scope"
86
+ require "active_record/associations/belongs_to_association"
87
+ require "active_record/associations/belongs_to_polymorphic_association"
88
+ require "active_record/associations/builder/belongs_to"
89
+ require "active_record/associations/builder/collection_association"
90
+ require "active_record/associations/builder/has_and_belongs_to_many"
91
+ require "active_record/associations/builder/has_many"
92
+ require "active_record/associations/builder/has_one"
93
+ require "active_record/associations/collection_association"
94
+ require "active_record/associations/foreign_association"
95
+ require "active_record/associations/has_many_association"
96
+ require "active_record/associations/has_many_through_association"
97
+ require "active_record/associations/has_one_association"
98
+ require "active_record/associations/has_one_through_association"
99
+ require "active_record/associations/join_dependency"
100
+ require "active_record/associations/join_dependency/join_association"
101
+ require "active_record/associations/join_dependency/join_base"
102
+ require "active_record/associations/preloader"
103
+ require "active_record/associations/preloader/association"
104
+ require "active_record/associations/preloader/through_association"
105
+ require "active_record/coders/json"
106
+ require "active_record/internal_metadata"
107
+ require "active_record/legacy_yaml_adapter"
108
+ require "active_record/middleware/database_selector"
109
+ require "active_record/null_relation"
110
+ require "active_record/relation/predicate_builder"
111
+ require "active_record/relation/record_fetch_warning"
112
+ require "active_record/result"
113
+ require "active_record/runtime_registry"
114
+ require "active_record/statement_cache"
115
+ require "active_record/table_metadata"
116
+ require "active_record/tasks/database_tasks"
117
+ require "active_record/tasks/mysql_database_tasks"
118
+ require "active_record/tasks/postgresql_database_tasks"
119
+ require "active_record/tasks/sqlite_database_tasks"
120
+ elsif ActiveRecord.version.segments[0] == 5
121
+ require "active_record/aggregations"
122
+ require "active_record/association_relation"
123
+ require "active_record/associations"
124
+ require "active_record/associations/alias_tracker"
125
+ require "active_record/associations/association"
126
+ require "active_record/associations/association_scope"
127
+ require "active_record/associations/belongs_to_association"
128
+ require "active_record/associations/belongs_to_polymorphic_association"
129
+ require "active_record/associations/builder/association"
130
+ require "active_record/associations/builder/belongs_to"
131
+ require "active_record/associations/builder/collection_association"
132
+ require "active_record/associations/builder/has_and_belongs_to_many"
133
+ require "active_record/associations/builder/has_many"
134
+ require "active_record/associations/builder/has_one"
135
+ require "active_record/associations/collection_association"
136
+ require "active_record/associations/collection_proxy"
137
+ require "active_record/associations/foreign_association"
138
+ require "active_record/associations/has_many_association"
139
+ require "active_record/associations/has_many_through_association"
140
+ require "active_record/associations/has_one_association"
141
+ require "active_record/associations/has_one_through_association"
142
+ require "active_record/associations/join_dependency"
143
+ require "active_record/associations/join_dependency/join_association"
144
+ require "active_record/associations/join_dependency/join_base"
145
+ require "active_record/associations/preloader"
146
+ require "active_record/associations/preloader/association"
147
+ require "active_record/associations/preloader/through_association"
148
+ require "active_record/attribute_assignment"
149
+ require "active_record/attribute_decorators"
150
+ require "active_record/attribute_methods/before_type_cast"
151
+ require "active_record/attribute_methods/dirty"
152
+ require "active_record/attribute_methods/primary_key"
153
+ require "active_record/attribute_methods/query"
154
+ require "active_record/attribute_methods/read"
155
+ require "active_record/attribute_methods/serialization"
156
+ require "active_record/attribute_methods/time_zone_conversion"
157
+ require "active_record/attribute_methods/write"
158
+ require "active_record/attributes"
159
+ require "active_record/autosave_association"
160
+ require "active_record/base"
161
+ require "active_record/coders/json"
162
+ require "active_record/internal_metadata"
163
+ require "active_record/legacy_yaml_adapter"
164
+ require "active_record/null_relation"
165
+ require "active_record/relation/predicate_builder"
166
+ require "active_record/relation/record_fetch_warning"
167
+ require "active_record/result"
168
+ require "active_record/runtime_registry"
169
+ require "active_record/statement_cache"
170
+ require "active_record/table_metadata"
171
+ require "active_record/tasks/database_tasks"
172
+ require "active_record/tasks/mysql_database_tasks"
173
+ require "active_record/tasks/postgresql_database_tasks"
174
+ require "active_record/tasks/sqlite_database_tasks"
175
+ else
176
+ raise(
177
+ "ActiveRecord #{ActiveRecord.version} isn't supported. "\
178
+ "Switch to 5.X or 6.X",
179
+ )
180
+ end
68
181
 
69
- require 'active_support/multibyte/chars'
182
+ # There are also issues with requiring ActiveSupport. This doesn"t require every
183
+ # ActiveSupport file though, only ones we"ve seen cause problems.
184
+ require "active_support"
185
+ require "active_support/multibyte/chars"
@@ -1,13 +1,14 @@
1
- require 'active_record'
2
- require 'ardb'
1
+ # frozen_string_literal: true
2
+
3
+ require "active_record"
4
+ require "ardb"
3
5
 
4
6
  # Use theses helpers in your test suite. They all generally assume Ardb has
5
7
  # already been initialized by calling `Ardb.init`.
6
8
 
7
9
  module Ardb
8
-
9
10
  module TestHelpers
10
- module_function
11
+ extend self
11
12
 
12
13
  def drop_tables
13
14
  Ardb.adapter.drop_tables
@@ -23,7 +24,7 @@ module Ardb
23
24
 
24
25
  def create_db
25
26
  @create_db ||= begin
26
- self.create_db!
27
+ create_db!
27
28
  true
28
29
  end
29
30
  end
@@ -34,7 +35,7 @@ module Ardb
34
35
 
35
36
  def drop_db
36
37
  @drop_db ||= begin
37
- self.drop_db!
38
+ drop_db!
38
39
  true
39
40
  end
40
41
  end
@@ -45,7 +46,7 @@ module Ardb
45
46
 
46
47
  def connect_db
47
48
  @connect_db ||= begin
48
- self.connect_db!
49
+ connect_db!
49
50
  true
50
51
  end
51
52
  end
@@ -56,24 +57,22 @@ module Ardb
56
57
 
57
58
  def migrate_db
58
59
  @migrate_db ||= begin
59
- self.migrate_db!
60
+ migrate_db!
60
61
  true
61
62
  end
62
63
  end
63
64
 
64
65
  def reset_db!
65
- self.drop_db!
66
- self.create_db!
67
- self.load_schema
66
+ drop_db!
67
+ create_db!
68
+ load_schema
68
69
  end
69
70
 
70
71
  def reset_db
71
72
  @reset_db ||= begin
72
- self.reset_db!
73
+ reset_db!
73
74
  true
74
75
  end
75
76
  end
76
-
77
77
  end
78
-
79
78
  end
@@ -1,22 +1,18 @@
1
- require 'much-plugin'
1
+ # frozen_string_literal: true
2
2
 
3
- module Ardb
3
+ require "much-mixin"
4
4
 
5
+ module Ardb
5
6
  module UseDbDefault
6
- include MuchPlugin
7
-
8
- plugin_included do
9
- extend ClassMethods
10
- include InstanceMethods
7
+ include MuchMixin
11
8
 
9
+ mixin_included do
12
10
  @ardb_use_db_default_attrs = []
13
11
 
14
12
  around_create :ardb_allow_db_to_default_attrs
15
-
16
13
  end
17
14
 
18
- module ClassMethods
19
-
15
+ mixin_class_methods do
20
16
  def ardb_use_db_default_attrs
21
17
  @ardb_use_db_default_attrs
22
18
  end
@@ -25,11 +21,9 @@ module Ardb
25
21
  @ardb_use_db_default_attrs += attrs.map(&:to_s)
26
22
  @ardb_use_db_default_attrs.uniq!
27
23
  end
28
-
29
24
  end
30
25
 
31
- module InstanceMethods
32
-
26
+ mixin_instance_methods do
33
27
  private
34
28
 
35
29
  def ardb_allow_db_to_default_attrs
@@ -37,20 +31,17 @@ module Ardb
37
31
  # activerecord from adding the attr into the sql `INSERT`, which will
38
32
  # make the DB default its value
39
33
  unchanged_names = self.class.ardb_use_db_default_attrs.reject do |name|
40
- self.send("#{name}_changed?")
34
+ send("#{name}_changed?")
41
35
  end
42
36
  unchanged_names.each{ |name| @attributes.delete(name) }
43
37
  yield
44
38
  # we have to go and fetch the attr value from the DB, otherwise
45
- # activerecord doesn't know the value that the DB used
46
- scope = self.class.where(:id => self.id)
39
+ # activerecord doesn"t know the value that the DB used
40
+ scope = self.class.where(id: id)
47
41
  unchanged_names.each do |name|
48
42
  @attributes[name] = scope.pluck(name).first
49
43
  end
50
44
  end
51
-
52
45
  end
53
-
54
46
  end
55
-
56
47
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Ardb
2
- VERSION = "0.28.1"
4
+ VERSION = "0.29.2"
3
5
  end
@@ -1,8 +1,10 @@
1
- require 'active_record'
1
+ # frozen_string_literal: true
2
2
 
3
- # this can be slow, this is one of the reasons this shouldn't be done during
3
+ require "active_record"
4
+
5
+ # this can be slow, this is one of the reasons this shouldn"t be done during
4
6
  # the startup of our apps
5
- gemspec = Gem.loaded_specs['activerecord']
7
+ gemspec = Gem.loaded_specs["activerecord"]
6
8
 
7
9
  puts "Looking at files in: "
8
10
  puts " #{gemspec.lib_dirs_glob.inspect}"
@@ -11,16 +13,21 @@ paths = Dir["#{gemspec.lib_dirs_glob}/**/*.rb"]
11
13
 
12
14
  # these are regexs for files we want to ignore requiring. for example,
13
15
  # generators fail when we try to require them. the others are pieces of active
14
- # record we don't use in a production environment
16
+ # record we don"t use in a production environment
15
17
  ignored_regexes = [
16
- /rails\/generators/,
17
- /active_record\/railtie/,
18
- /active_record\/migration/,
19
- /active_record\/fixtures/,
20
- /active_record\/schema/,
21
- /active_record\/connection_adapters/,
22
- /active_record\/test_case/,
23
- /active_record\/coders\/yaml_column/
18
+ %r{rails/generators},
19
+ %r{active_record/railtie},
20
+ %r{active_record/migration},
21
+ %r{active_record/fixtures},
22
+ %r{active_record/fixture_set},
23
+ %r{active_record/schema},
24
+ %r{active_record/connection_adapters},
25
+ %r{active_record/test_case},
26
+ %r{active_record/test_databases},
27
+ %r{active_record/test_fixtures},
28
+ %r{active_record/coders/yaml_column},
29
+ # `destroy_association_async_job` requires `ActiveJob` to be required.
30
+ %r{active_record/destroy_association_async_job},
24
31
  ]
25
32
 
26
33
  Result = Struct.new(:file, :state, :reason)
@@ -31,18 +38,18 @@ ignored = []
31
38
  errored = []
32
39
 
33
40
  paths.sort.each do |full_path|
34
- relative_path_with_rb = full_path.gsub("#{gemspec.lib_dirs_glob}/", '')
35
- relative_path = relative_path_with_rb.gsub(/\.rb\z/, '')
41
+ relative_path_with_rb = full_path.gsub("#{gemspec.lib_dirs_glob}/", "")
42
+ relative_path = relative_path_with_rb.gsub(/\.rb\z/, "")
36
43
 
37
44
  result = Result.new(relative_path)
38
45
 
39
- # see if it's ignored
46
+ # see if it"s ignored
40
47
  ignored_regexes.each do |regex|
41
- if relative_path =~ regex
42
- result.state = :ignored
43
- result.reason = "matched #{regex}"
44
- break
45
- end
48
+ next unless relative_path =~ regex
49
+
50
+ result.state = :ignored
51
+ result.reason = "matched #{regex}"
52
+ break
46
53
  end
47
54
  if result.state == :ignored
48
55
  ignored << result
@@ -51,14 +58,14 @@ paths.sort.each do |full_path|
51
58
 
52
59
  # try requiring the file
53
60
  begin
54
- if result.state = require(relative_path)
61
+ if (result.state = require(relative_path))
55
62
  needs_to_be_required << result
56
63
  else
57
64
  already_required << result
58
65
  end
59
- rescue LoadError, SyntaxError => exception
66
+ rescue LoadError, SyntaxError => ex
60
67
  result.state = :errored
61
- result.reason = "#{exception.class}: #{exception.message}"
68
+ result.reason = "#{ex.class}: #{ex.message}"
62
69
  errored << result
63
70
  end
64
71
  end
@@ -87,5 +94,5 @@ puts "\n"
87
94
 
88
95
  puts "Needs To Be Required:\n"
89
96
  needs_to_be_required.each do |result|
90
- puts "require '#{result.file}'"
97
+ puts "require \"#{result.file}\""
91
98
  end