active_hash 3.2.1 → 3.3.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 +4 -4
- data/CHANGELOG.md +21 -3
- data/lib/active_hash/base.rb +10 -1
- data/lib/active_hash/condition.rb +1 -1
- data/lib/active_hash/relation.rb +4 -8
- data/lib/active_hash/version.rb +1 -1
- data/lib/associations/associations.rb +34 -14
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f255dca493bb6e5cb46acba485f7df5af6ebfef6a708abf30757a3e39db1bb62
|
4
|
+
data.tar.gz: a5c7bcc8a8f85ab74395b7554c39cb33023a30dd592d68d9a9b5664d02d9e233
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bebafa5e913c561fbe97a1ba997df579072db9153be012773c2fcfdd33062cdd033b417b47ea5a6de5c234736b575b2c1d307185b2b7570c31ce825da107cd61
|
7
|
+
data.tar.gz: 439923f589dc14098c4b278ccee6ee0f66de3c17e67f5f41c8d0f2f6ccf706d93311582d3daadcb296c0de9afe97044b22f2f6136be1dd3bba6c93f03fdecd7a
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,22 @@
|
|
1
1
|
# active_hash Changelog
|
2
2
|
|
3
|
+
## Version [3.3.0] - <sub><sup>2024-04-30</sup></sub>
|
4
|
+
|
5
|
+
### Added
|
6
|
+
|
7
|
+
- Ruby 3.3 support [#298](https://github.com/active-hash/active_hash/pull/298) @m-nakamura145
|
8
|
+
- Support `has_many :through` associations [#296](https://github.com/active-hash/active_hash/pull/296) @flavorjones
|
9
|
+
- Rails 7.1 support [#291](https://github.com/active-hash/active_hash/pull/281) @y-yagi
|
10
|
+
|
11
|
+
### Fixed
|
12
|
+
|
13
|
+
- Rails 7.1: fix sqlite3 issue [#303](https://github.com/active-hash/active_hash/pull/303) @flavorjones
|
14
|
+
- Rails 7.1.3: add missing `has_query_constraints?` [#300](https://github.com/active-hash/active_hash/pull/300) @flavorjones
|
15
|
+
- `Array#pluck` supports methods [#299](https://github.com/active-hash/active_hash/pull/299) @iberianpig
|
16
|
+
- Prefer `safe_constantize` over `constantize` [#297](https://github.com/active-hash/active_hash/pull/297) @flavorjones
|
17
|
+
- Treat `nil` and `blank?` as different values [#295](https://github.com/active-hash/active_hash/pull/295) @kbrock
|
18
|
+
- Fix `#where` for string keys [#292](https://github.com/active-hash/active_hash/pull/292) @usernam3
|
19
|
+
|
3
20
|
## Version [3.2.1] - <sub><sup>2023-08-31</sup></sub>
|
4
21
|
|
5
22
|
### Added
|
@@ -305,9 +322,10 @@
|
|
305
322
|
- Setting data to nil correctly causes .all to return an empty array
|
306
323
|
- Added reload(force) method, so that you can force a reload from files in ActiveFile, useful for tests
|
307
324
|
|
308
|
-
[HEAD]:
|
309
|
-
[
|
310
|
-
[
|
325
|
+
[HEAD]: https://github.com/active-hash/active_hash/compare/v3.3.0...HEAD
|
326
|
+
[3.3.0]: https://github.com/active-hash/active_hash/compare/v3.2.1...v3.3.0
|
327
|
+
[3.2.1]: https://github.com/active-hash/active_hash/compare/v3.2.0...v3.2.1
|
328
|
+
[3.2.0]: https://github.com/active-hash/active_hash/compare/v3.1.1...v3.2.0
|
311
329
|
[3.1.1]: https://github.com/active-hash/active_hash/compare/v3.1.0...v3.1.1
|
312
330
|
[3.1.0]: https://github.com/active-hash/active_hash/compare/v3.0.0...v3.1.0
|
313
331
|
[3.0.0]: https://github.com/active-hash/active_hash/compare/v2.3.0...v3.0.0
|
data/lib/active_hash/base.rb
CHANGED
@@ -127,6 +127,10 @@ module ActiveHash
|
|
127
127
|
@record_index ||= {}
|
128
128
|
end
|
129
129
|
|
130
|
+
def has_query_constraints?
|
131
|
+
false
|
132
|
+
end
|
133
|
+
|
130
134
|
private :record_index
|
131
135
|
|
132
136
|
def reset_record_index
|
@@ -349,6 +353,11 @@ module ActiveHash
|
|
349
353
|
base_class.name
|
350
354
|
end
|
351
355
|
|
356
|
+
# Needed for ActiveRecord since rails/rails#47664
|
357
|
+
def composite_primary_key?
|
358
|
+
false
|
359
|
+
end
|
360
|
+
|
352
361
|
def reload
|
353
362
|
reset_record_index
|
354
363
|
self.data = _data
|
@@ -406,7 +415,7 @@ module ActiveHash
|
|
406
415
|
end
|
407
416
|
|
408
417
|
def _read_attribute(key)
|
409
|
-
attributes[key]
|
418
|
+
attributes[key.to_sym]
|
410
419
|
end
|
411
420
|
alias_method :read_attribute, :_read_attribute
|
412
421
|
|
data/lib/active_hash/relation.rb
CHANGED
@@ -143,15 +143,11 @@ module ActiveHash
|
|
143
143
|
end
|
144
144
|
|
145
145
|
def pluck(*column_names)
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
column_name = symbolized_column_names.first
|
150
|
-
all.map { |record| record[column_name] }
|
146
|
+
if column_names.length == 1
|
147
|
+
column_name = column_names.first
|
148
|
+
all.map { |record| record.public_send(column_name) }
|
151
149
|
else
|
152
|
-
all.map
|
153
|
-
symbolized_column_names.map { |column_name| record[column_name] }
|
154
|
-
end
|
150
|
+
all.map { |record| column_names.map { |column_name| record.public_send(column_name) } }
|
155
151
|
end
|
156
152
|
end
|
157
153
|
|
data/lib/active_hash/version.rb
CHANGED
@@ -2,16 +2,40 @@ module ActiveHash
|
|
2
2
|
module Associations
|
3
3
|
|
4
4
|
module ActiveRecordExtensions
|
5
|
-
|
6
5
|
def self.extended(base)
|
7
6
|
require_relative 'reflection_extensions'
|
8
7
|
end
|
9
8
|
|
9
|
+
def has_many(association_id, **options)
|
10
|
+
if options[:through]
|
11
|
+
klass_name = association_id.to_s.classify
|
12
|
+
klass =
|
13
|
+
begin
|
14
|
+
klass_name.safe_constantize
|
15
|
+
rescue StandardError, LoadError
|
16
|
+
nil
|
17
|
+
end
|
18
|
+
|
19
|
+
if klass && klass < ActiveHash::Base
|
20
|
+
define_method(association_id) do
|
21
|
+
join_models = send(options[:through])
|
22
|
+
join_models.flat_map do |join_model|
|
23
|
+
join_model.send(association_id.to_s.singularize)
|
24
|
+
end.uniq
|
25
|
+
end
|
26
|
+
|
27
|
+
return
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
super
|
32
|
+
end
|
33
|
+
|
10
34
|
def belongs_to(name, scope = nil, **options)
|
11
35
|
klass_name = options.key?(:class_name) ? options[:class_name] : name.to_s.camelize
|
12
36
|
klass =
|
13
37
|
begin
|
14
|
-
klass_name.
|
38
|
+
klass_name.safe_constantize
|
15
39
|
rescue StandardError, LoadError
|
16
40
|
nil
|
17
41
|
end
|
@@ -31,11 +55,11 @@ module ActiveHash
|
|
31
55
|
:shortcuts => []
|
32
56
|
}.merge(options)
|
33
57
|
# Define default primary_key with provided class_name if any
|
34
|
-
options[:primary_key] ||= options[:class_name].
|
58
|
+
options[:primary_key] ||= options[:class_name].safe_constantize.primary_key
|
35
59
|
options[:shortcuts] = [options[:shortcuts]] unless options[:shortcuts].kind_of?(Array)
|
36
60
|
|
37
61
|
define_method(association_id) do
|
38
|
-
options[:class_name].
|
62
|
+
options[:class_name].safe_constantize.send("find_by_#{options[:primary_key]}", send(options[:foreign_key]))
|
39
63
|
end
|
40
64
|
|
41
65
|
define_method("#{association_id}=") do |new_value|
|
@@ -48,16 +72,13 @@ module ActiveHash
|
|
48
72
|
end
|
49
73
|
|
50
74
|
define_method("#{association_id}_#{shortcut}=") do |new_value|
|
51
|
-
send "#{association_id}=", new_value ? options[:class_name].
|
75
|
+
send "#{association_id}=", new_value ? options[:class_name].safe_constantize.send("find_by_#{shortcut}", new_value) : nil
|
52
76
|
end
|
53
77
|
end
|
54
78
|
|
55
79
|
if ActiveRecord::Reflection.respond_to?(:create)
|
56
80
|
if defined?(ActiveHash::Reflection::BelongsToReflection)
|
57
81
|
reflection = ActiveHash::Reflection::BelongsToReflection.new(association_id.to_sym, nil, options, self)
|
58
|
-
if options[:through]
|
59
|
-
reflection = ActiveRecord::ThroughReflection.new(reflection)
|
60
|
-
end
|
61
82
|
else
|
62
83
|
reflection = ActiveRecord::Reflection.create(
|
63
84
|
:belongs_to,
|
@@ -88,7 +109,7 @@ module ActiveHash
|
|
88
109
|
:belongs_to,
|
89
110
|
association_id.to_sym,
|
90
111
|
options,
|
91
|
-
options[:class_name].
|
112
|
+
options[:class_name].safe_constantize
|
92
113
|
)
|
93
114
|
end
|
94
115
|
end
|
@@ -108,7 +129,7 @@ module ActiveHash
|
|
108
129
|
:primary_key => self.class.primary_key
|
109
130
|
}.merge(options)
|
110
131
|
|
111
|
-
klass = options[:class_name].
|
132
|
+
klass = options[:class_name].safe_constantize
|
112
133
|
primary_key_value = send(options[:primary_key])
|
113
134
|
foreign_key = options[:foreign_key].to_sym
|
114
135
|
|
@@ -120,6 +141,7 @@ module ActiveHash
|
|
120
141
|
klass.where(foreign_key => primary_key_value)
|
121
142
|
end
|
122
143
|
end
|
144
|
+
|
123
145
|
define_method("#{association_id.to_s.underscore.singularize}_ids") do
|
124
146
|
public_send(association_id).map(&:id)
|
125
147
|
end
|
@@ -133,7 +155,7 @@ module ActiveHash
|
|
133
155
|
:primary_key => self.class.primary_key
|
134
156
|
}.merge(options)
|
135
157
|
|
136
|
-
scope = options[:class_name].
|
158
|
+
scope = options[:class_name].safe_constantize
|
137
159
|
|
138
160
|
if scope.respond_to?(:scoped) && options[:conditions]
|
139
161
|
scope = scope.scoped(:conditions => options[:conditions])
|
@@ -143,7 +165,6 @@ module ActiveHash
|
|
143
165
|
end
|
144
166
|
|
145
167
|
def belongs_to(association_id, options = {})
|
146
|
-
|
147
168
|
options = {
|
148
169
|
:class_name => association_id.to_s.classify,
|
149
170
|
:foreign_key => association_id.to_s.foreign_key,
|
@@ -153,13 +174,12 @@ module ActiveHash
|
|
153
174
|
field options[:foreign_key].to_sym
|
154
175
|
|
155
176
|
define_method(association_id) do
|
156
|
-
options[:class_name].
|
177
|
+
options[:class_name].safe_constantize.send("find_by_#{options[:primary_key]}", send(options[:foreign_key]))
|
157
178
|
end
|
158
179
|
|
159
180
|
define_method("#{association_id}=") do |new_value|
|
160
181
|
attributes[options[:foreign_key].to_sym] = new_value ? new_value.send(options[:primary_key]) : nil
|
161
182
|
end
|
162
|
-
|
163
183
|
end
|
164
184
|
end
|
165
185
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_hash
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeff Dean
|
@@ -26,10 +26,10 @@ authors:
|
|
26
26
|
- Brett Richardson
|
27
27
|
- Rachel Heaton
|
28
28
|
- Keisuke Izumiya
|
29
|
-
autorequire:
|
29
|
+
autorequire:
|
30
30
|
bindir: bin
|
31
31
|
cert_chain: []
|
32
|
-
date:
|
32
|
+
date: 2024-04-29 00:00:00.000000000 Z
|
33
33
|
dependencies:
|
34
34
|
- !ruby/object:Gem::Dependency
|
35
35
|
name: activesupport
|
@@ -93,7 +93,7 @@ metadata:
|
|
93
93
|
changelog_uri: https://github.com/active-hash/active_hash/blob/master/CHANGELOG.md
|
94
94
|
source_code_uri: http://github.com/active-hash/active_hash
|
95
95
|
bug_tracker_uri: https://github.com/active-hash/active_hash/issues
|
96
|
-
post_install_message:
|
96
|
+
post_install_message:
|
97
97
|
rdoc_options: []
|
98
98
|
require_paths:
|
99
99
|
- lib
|
@@ -108,8 +108,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
108
108
|
- !ruby/object:Gem::Version
|
109
109
|
version: '0'
|
110
110
|
requirements: []
|
111
|
-
rubygems_version: 3.
|
112
|
-
signing_key:
|
111
|
+
rubygems_version: 3.5.9
|
112
|
+
signing_key:
|
113
113
|
specification_version: 4
|
114
114
|
summary: An ActiveRecord-like model that uses a hash or file as a datasource
|
115
115
|
test_files: []
|