active_record_include 0.1.0 → 0.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 30de7b63680167a66f60ec0f0e62341dd070dd72
4
- data.tar.gz: 6d1a4b3d921cb01d3a05dbf08944cf6906b6a6fc
2
+ SHA256:
3
+ metadata.gz: 389e7cfde0e5c5eadbc2f4b978f2847784b543289e9ef211c95aa75d974054ae
4
+ data.tar.gz: 723b50c391a00dd17eea1a4ba5b9e943438c717c9aa6a3d61636be5a6f1dac5f
5
5
  SHA512:
6
- metadata.gz: 46f8afba0e9307c161b502f944cfbcd6388d93c6baf3e902ff5ca9fea7ab01a63e275f4ee7acb7fc15b9f98cbcaa22716934ac0cad409dfbf2d2ac56e1dc6209
7
- data.tar.gz: 771dd3d979e25060b286694b0b3e770edeee511c3d4e8ffe07a930d56c13a3b6925f634c250c3cc6fa31b3d4b74b7db93f220ac0a26d96093cefa91aeffab160
6
+ metadata.gz: 5fa4130d0968ee0a9f0d1e2de0c9853b0c7b9356c91a9ec26311bdbc0428207282cba7281fe998db071e845ff01de34e1df079704ea292a35c998ab6f32b0045
7
+ data.tar.gz: d153ff7f19389878f3977077415125c481a47cbcc4e6f05bb909db963b9d019b49853f8d5b2252c90d2ecb1c39e12547527e7836b32fdae57209e266546ac680
data/Changelog.md ADDED
@@ -0,0 +1,16 @@
1
+ # Changelog
2
+
3
+ ## 0.2.0
4
+
5
+ - Rails 7 / 8 compatibility. Modern ActiveRecord calls `connection` from within the `inherited`
6
+ hook chain (before it has set `@base_class`), and some extensions (e.g. torque-postgresql's
7
+ `physically_inherited?`) do the same, so `include_when_connected` could fire while a subclass was
8
+ still mid-definition and blow up any concern that inspects the schema. Pending includes are now
9
+ skipped while a class's `@base_class` is unset, applied at the end of the `inherited` hook once
10
+ the class is fully defined, and guarded against re-entrancy (an included concern calling
11
+ `connection` again).
12
+ - Loosened the `activerecord` / `activesupport` dependency cap (was `< 5.3`).
13
+
14
+ ## 0.1.0
15
+
16
+ - Initial release.
data/License CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2018 Tyler Rick
1
+ Copyright (c) 2018-2026 Tyler Rick
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
4
4
  associated documentation files (the "Software"), to deal in the Software without restriction,
@@ -15,7 +15,7 @@ Gem::Specification.new do |spec|
15
15
 
16
16
  spec.metadata["homepage_uri"] = spec.homepage
17
17
  spec.metadata["source_code_uri"] = spec.homepage
18
- spec.metadata["changelog_uri"] = "TODO: Put your gem's Changelog.md URL here."
18
+ spec.metadata["changelog_uri"] = "#{spec.metadata["source_code_uri"]}/blob/master/Changelog.md"
19
19
 
20
20
  # Specify which files should be added to the gem when it is released.
21
21
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
@@ -27,14 +27,12 @@ Gem::Specification.new do |spec|
27
27
  spec.require_paths = ["lib"]
28
28
 
29
29
  spec.required_ruby_version = ">= 2.3.0"
30
- spec.add_dependency "activesupport", [">= 4.2", "< 5.3"]
31
- spec.add_dependency "activerecord", [">= 4.2", "< 5.3"]
30
+ spec.add_dependency "activerecord"
32
31
 
33
- spec.add_development_dependency "bundler", "~> 1.17"
34
- spec.add_development_dependency "rake", "~> 10.0"
35
- spec.add_development_dependency "rspec", "~> 3.0"
32
+ spec.add_development_dependency "bundler"
33
+ spec.add_development_dependency "rake"
34
+ spec.add_development_dependency "rspec"
36
35
  spec.add_development_dependency "sqlite3"
37
- spec.add_development_dependency "normalizy"
38
36
  spec.add_development_dependency "pry"
39
37
  spec.add_development_dependency "byebug"
40
38
  end
@@ -1,5 +1,5 @@
1
1
  module ActiveRecordInclude
2
2
  def self.version
3
- "0.1.0"
3
+ "0.2.0"
4
4
  end
5
5
  end
@@ -5,6 +5,9 @@ module ActiveRecordInclude::WhenConnected
5
5
  @@verbose = false
6
6
 
7
7
  module ClassMethods
8
+ # recursive: default is true.
9
+ # only: (into_classes:)
10
+ # except:
8
11
  def include_when_connected(mod, **options)
9
12
  self.class_eval do
10
13
  unless defined?(modules_to_include_when_connected)
@@ -27,36 +30,71 @@ module ActiveRecordInclude::WhenConnected
27
30
  extend ActiveSupport::Concern
28
31
 
29
32
  module ClassMethods
30
- def connection(*)
31
- super.tap do
32
- self.modules_to_include_when_connected.each do |config|
33
- config.each do |(mod, options)|
34
- self.singleton_class.class_eval do
35
- attr_accessor :modules_already_included_when_connected
33
+ def connection(*)
34
+ super.tap do
35
+ include_pending_modules_when_connected
36
+ end
37
+ end
38
+
39
+ private
40
+
41
+ # The pending includes are also applied at the end of `inherited` (after ActiveRecord's own
42
+ # inherited chain has completed and set @base_class), because a class might have its
43
+ # scopes/concern methods accessed before any `connection` call happens on that specific class.
44
+ # (On Rails <= 5.2 the first connection call always happened during class definition, which had
45
+ # the same effective timing.)
46
+ def inherited(subclass)
47
+ super.tap do
48
+ if subclass < ActiveRecord::Base
49
+ subclass.send(:include_pending_modules_when_connected)
36
50
  end
37
- self.modules_already_included_when_connected ||= []
38
- next if self.modules_already_included_when_connected.include?(mod)
51
+ end
52
+ end
39
53
 
40
- match = (
41
- if options[:into_classes]
42
- self.in? options[:into_classes]
43
- else
44
- self < ActiveRecord::Base && !self.abstract_class?
54
+ def include_pending_modules_when_connected
55
+ # Rails 7+/8: ActiveRecord (and some extensions, e.g. torque-postgresql's
56
+ # physically_inherited?) call `connection` from within the `inherited` hook chain, i.e.
57
+ # while the new subclass is still mid-definition (AR sets @base_class only *after* its
58
+ # inherited super chain returns). Including concerns that inspect the schema (table_exists?,
59
+ # table_name -> base_class) at that point breaks. Skip; the inherited-after-super hook above
60
+ # (or a later connection call) will perform the includes once the class is fully defined.
61
+ return if name.nil?
62
+ return if self < ActiveRecord::Base && !instance_variable_defined?(:@base_class)
63
+ # Guard against re-entrancy: the included concerns themselves call connection.
64
+ return if @_including_modules_when_connected
65
+
66
+ @_including_modules_when_connected = true
67
+ begin
68
+ self.modules_to_include_when_connected.each do |config|
69
+ config.each do |(mod, options)|
70
+ self.singleton_class.class_eval do
71
+ attr_accessor :modules_already_included_when_connected
45
72
  end
46
- )
47
- #puts %(Include #{mod} into #{self} (#{options.inspect})? #{match})
48
- if match
49
- puts "Including #{mod} into #{self}" if ActiveRecordInclude::WhenConnected.verbose
50
- modules_already_included_when_connected << mod
51
- class_eval do
52
- include mod
73
+ self.modules_already_included_when_connected ||= []
74
+ next if self.modules_already_included_when_connected.include?(mod)
75
+
76
+ match = (
77
+ if options[:into_classes]
78
+ self.in? options[:into_classes]
79
+ else
80
+ self < ActiveRecord::Base && !self.abstract_class?
81
+ end
82
+ )
83
+ #puts %(Include #{mod} into #{self} (#{options.inspect})? #{match})
84
+ if match
85
+ puts "Including #{mod} into #{self}" if ActiveRecordInclude::WhenConnected.verbose
86
+ modules_already_included_when_connected << mod
87
+ class_eval do
88
+ include mod
89
+ end
53
90
  end
54
91
  end
55
- end
92
+ end
93
+ ensure
94
+ @_including_modules_when_connected = false
56
95
  end
57
96
  end
58
97
  end
59
- end
60
98
  end
61
99
  end
62
100
 
@@ -65,4 +103,3 @@ ActiveSupport.on_load(:active_record) do
65
103
  include ActiveRecordInclude::WhenConnected
66
104
  end
67
105
  end
68
-
metadata CHANGED
@@ -1,99 +1,59 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_record_include
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tyler Rick
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-11-16 00:00:00.000000000 Z
11
+ date: 2026-07-16 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: activesupport
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: '4.2'
20
- - - "<"
21
- - !ruby/object:Gem::Version
22
- version: '5.3'
23
- type: :runtime
24
- prerelease: false
25
- version_requirements: !ruby/object:Gem::Requirement
26
- requirements:
27
- - - ">="
28
- - !ruby/object:Gem::Version
29
- version: '4.2'
30
- - - "<"
31
- - !ruby/object:Gem::Version
32
- version: '5.3'
33
13
  - !ruby/object:Gem::Dependency
34
14
  name: activerecord
35
15
  requirement: !ruby/object:Gem::Requirement
36
16
  requirements:
37
17
  - - ">="
38
18
  - !ruby/object:Gem::Version
39
- version: '4.2'
40
- - - "<"
41
- - !ruby/object:Gem::Version
42
- version: '5.3'
19
+ version: '0'
43
20
  type: :runtime
44
21
  prerelease: false
45
22
  version_requirements: !ruby/object:Gem::Requirement
46
23
  requirements:
47
24
  - - ">="
48
25
  - !ruby/object:Gem::Version
49
- version: '4.2'
50
- - - "<"
51
- - !ruby/object:Gem::Version
52
- version: '5.3'
26
+ version: '0'
53
27
  - !ruby/object:Gem::Dependency
54
28
  name: bundler
55
29
  requirement: !ruby/object:Gem::Requirement
56
30
  requirements:
57
- - - "~>"
31
+ - - ">="
58
32
  - !ruby/object:Gem::Version
59
- version: '1.17'
33
+ version: '0'
60
34
  type: :development
61
35
  prerelease: false
62
36
  version_requirements: !ruby/object:Gem::Requirement
63
37
  requirements:
64
- - - "~>"
38
+ - - ">="
65
39
  - !ruby/object:Gem::Version
66
- version: '1.17'
40
+ version: '0'
67
41
  - !ruby/object:Gem::Dependency
68
42
  name: rake
69
43
  requirement: !ruby/object:Gem::Requirement
70
44
  requirements:
71
- - - "~>"
45
+ - - ">="
72
46
  - !ruby/object:Gem::Version
73
- version: '10.0'
47
+ version: '0'
74
48
  type: :development
75
49
  prerelease: false
76
50
  version_requirements: !ruby/object:Gem::Requirement
77
51
  requirements:
78
- - - "~>"
52
+ - - ">="
79
53
  - !ruby/object:Gem::Version
80
- version: '10.0'
54
+ version: '0'
81
55
  - !ruby/object:Gem::Dependency
82
56
  name: rspec
83
- requirement: !ruby/object:Gem::Requirement
84
- requirements:
85
- - - "~>"
86
- - !ruby/object:Gem::Version
87
- version: '3.0'
88
- type: :development
89
- prerelease: false
90
- version_requirements: !ruby/object:Gem::Requirement
91
- requirements:
92
- - - "~>"
93
- - !ruby/object:Gem::Version
94
- version: '3.0'
95
- - !ruby/object:Gem::Dependency
96
- name: sqlite3
97
57
  requirement: !ruby/object:Gem::Requirement
98
58
  requirements:
99
59
  - - ">="
@@ -107,7 +67,7 @@ dependencies:
107
67
  - !ruby/object:Gem::Version
108
68
  version: '0'
109
69
  - !ruby/object:Gem::Dependency
110
- name: normalizy
70
+ name: sqlite3
111
71
  requirement: !ruby/object:Gem::Requirement
112
72
  requirements:
113
73
  - - ">="
@@ -159,6 +119,7 @@ files:
159
119
  - ".gitignore"
160
120
  - ".rspec"
161
121
  - ".travis.yml"
122
+ - Changelog.md
162
123
  - Gemfile
163
124
  - Gemfile.lock
164
125
  - License
@@ -179,8 +140,8 @@ licenses:
179
140
  metadata:
180
141
  homepage_uri: http://github.com/TylerRick/active_record_include
181
142
  source_code_uri: http://github.com/TylerRick/active_record_include
182
- changelog_uri: 'TODO: Put your gem''s Changelog.md URL here.'
183
- post_install_message:
143
+ changelog_uri: http://github.com/TylerRick/active_record_include/blob/master/Changelog.md
144
+ post_install_message:
184
145
  rdoc_options: []
185
146
  require_paths:
186
147
  - lib
@@ -195,9 +156,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
195
156
  - !ruby/object:Gem::Version
196
157
  version: '0'
197
158
  requirements: []
198
- rubyforge_project:
199
- rubygems_version: 2.6.11
200
- signing_key:
159
+ rubygems_version: 3.5.1
160
+ signing_key:
201
161
  specification_version: 4
202
162
  summary: Makes it easy to have specific concern modules included into all of your
203
163
  models after the model has connected to the database