active_type 1.2.1 → 1.4.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0146bd11c1d9d0965e2ce93c0265c78dcdbce9e760666ce5713d055e53522f50
4
- data.tar.gz: 63eb1676ef250e2374b1da508d9e40674e52ae681743b5f30762402ebed930eb
3
+ metadata.gz: 70a593b09da1c5389129939864d40d6ee562d2bf4b7a3bee41bbf749ba81efff
4
+ data.tar.gz: e8aa031eb6aac62a71556a85c23c55ffa2ee5efa52067226306faca924c7d240
5
5
  SHA512:
6
- metadata.gz: 52a62c1a3ec7a1f7740a651b299ac2c349b571c92eb2ec06c22c54cdb09c51074f13b62102d0b14a5b72c68daac96c3c63b06aae8f644da068835d271391f586
7
- data.tar.gz: 448e4c0fe4bdfb4ed11716387d9ec3a8713a2f7cd29caf5019bb76f124c74d00125cf0f99812483ffeb1a2005a860784c36dd5fd12af3df4dfb179573e9da9f1
6
+ metadata.gz: 3d287c42812f6afa854f608f52202c1ed6c38cd63aa6cbd7813abbad13c881e8ac333c3f5ce99503bb6c38221c19d0f858307174d37fdc84b2f74fc1b8a61fd1
7
+ data.tar.gz: a966aa55504b560c99782561854487465dc7f46715b5e6deb1eb2a13fa4f016a83147b9306679936147759c2592b83aaae273f809d6f5f3ff3bca6450b49a5dd
@@ -4,8 +4,9 @@ services:
4
4
  - postgresql
5
5
  rvm:
6
6
  - "2.3.8"
7
- - "2.4.5"
8
- - "2.5.3"
7
+ - "2.4.6"
8
+ - "2.5.5"
9
+ - "2.6.3"
9
10
  gemfile:
10
11
  - Gemfile.3.2.mysql2
11
12
  - Gemfile.3.2.sqlite3
@@ -22,30 +23,50 @@ before_script:
22
23
  script: bundle exec rake spec
23
24
  sudo: false
24
25
  cache: bundler
25
- notifications:
26
- email:
27
- - fail@makandra.de
28
26
  matrix:
29
27
  exclude:
30
- - rvm: "2.4.5"
28
+ - rvm: "2.3.8"
29
+ gemfile: Gemfile.6.0.pg
30
+ - rvm: "2.4.6"
31
31
  gemfile: Gemfile.3.2.mysql2
32
- - rvm: "2.4.5"
32
+ - rvm: "2.4.6"
33
33
  gemfile: Gemfile.3.2.sqlite3
34
- - rvm: "2.5.3"
34
+ - rvm: "2.4.6"
35
+ gemfile: Gemfile.4.2.mysql2
36
+ - rvm: "2.4.6"
37
+ gemfile: Gemfile.4.2.pg
38
+ - rvm: "2.4.6"
39
+ gemfile: Gemfile.5.2.mysql2
40
+ - rvm: "2.4.6"
41
+ gemfile: Gemfile.5.2.pg
42
+ - rvm: "2.4.6"
43
+ gemfile: Gemfile.6.0.pg
44
+ - rvm: "2.5.5"
35
45
  gemfile: Gemfile.3.2.mysql2
36
- - rvm: "2.5.3"
46
+ - rvm: "2.5.5"
37
47
  gemfile: Gemfile.3.2.sqlite3
38
- - rvm: "2.5.3"
48
+ - rvm: "2.5.5"
39
49
  gemfile: Gemfile.4.2.mysql2
40
- - rvm: "2.5.3"
50
+ - rvm: "2.5.5"
41
51
  gemfile: Gemfile.4.2.pg
42
- - rvm: "2.5.3"
52
+ - rvm: "2.5.5"
53
+ gemfile: Gemfile.4.2.sqlite3
54
+ - rvm: "2.5.5"
55
+ gemfile: Gemfile.5.2.mysql2
56
+ - rvm: "2.5.5"
57
+ gemfile: Gemfile.5.2.pg
58
+ - rvm: "2.6.3"
59
+ gemfile: Gemfile.3.2.mysql2
60
+ - rvm: "2.6.3"
61
+ gemfile: Gemfile.3.2.sqlite3
62
+ - rvm: "2.6.3"
63
+ gemfile: Gemfile.4.2.mysql2
64
+ - rvm: "2.6.3"
65
+ gemfile: Gemfile.4.2.pg
66
+ - rvm: "2.6.3"
43
67
  gemfile: Gemfile.4.2.sqlite3
44
- - rvm: "2.3.8"
45
- gemfile: Gemfile.6.0.pg
46
- - rvm: "2.4.5"
47
- gemfile: Gemfile.6.0.pg
48
68
  install:
69
+ - gem install bundler:2.0.2
49
70
  - bundle install --no-deployment --jobs=3 --retry=3 --path=${BUNDLE_PATH:-vendor/bundle}
50
71
  addons:
51
72
  postgresql: 9.3
@@ -2,7 +2,73 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file.
4
4
 
5
- ## Unreleased
5
+ ## Unreleased changes
6
+
7
+ ## 1.4.0 (2020-07-27)
8
+
9
+ * Extended records now use their own I18n namespace when looking up translations for models or attributes.
10
+ If the extended record's namespace does not contain a translation, the lookup will fall back to the
11
+ base record's namespace.
12
+
13
+ For instance, given the following class hierarchy:
14
+
15
+ ```
16
+ class User < ActiveRecord::Base
17
+ end
18
+
19
+ class User::Form < ActiveType::Record[User]
20
+ end
21
+ ```
22
+
23
+ The call `ExtendedParent.human_attribute_name(:foo)` would first look up the key in
24
+ `activerecord.attributes.user/form` first, then falls back to `activerecord.attributes.user`.
25
+
26
+ Thank you @fsateler!
27
+
28
+
29
+ ## 1.3.2 (2020-06-16)
30
+
31
+ * Fixed: `nests_one` association record building used empty hash instead of passed in attributes. Credit to @chriscz.
32
+
33
+
34
+ ## 1.3.1 (2020-03-31)
35
+
36
+ * Fixed: Avoid #change_association breaking for polymorphic associations. Thanks to @lucthev.
37
+
38
+
39
+ ## 1.3.0 (2019-09-26)
40
+
41
+ * Fixed: Do not override Rails internal methods when definining an attribute called `:attribute`.
42
+ * Fixed: Fix .find for extended records, when a record had a `#type` column that was not used for
43
+ single table inheritance. Thanks to @fsateler.
44
+ * Changed: When extending a single table inheritance base class, `.find` no longer crashes, but
45
+ returns records derived from the extended class.
46
+
47
+ This means, that given the following class hierarchy:
48
+
49
+ ```ruby
50
+ class Parent < ActiveRecord::Base
51
+ end
52
+
53
+ class ExtendedParent < ActiveType::Record[Parent]
54
+ end
55
+
56
+ class Child < Parent
57
+ end
58
+ ```
59
+
60
+ querying
61
+
62
+ ```
63
+ ExtendedParent.all
64
+ ```
65
+
66
+ will no longer crash, but always return records of type `ExtendedParent` (*even if they
67
+ would normally of type `Child`*). You should probably avoid this weird situation and not
68
+ extend STI Parent classes.
69
+
70
+ Thanks to @fsateler.
71
+
6
72
 
7
73
  ## 1.2.1 (2019-07-03)
8
74
  * Fixed: Eager loading in Rails 6 no longer crashes trying to load `ActiveType::Object`s.
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- active_type (1.2.1)
4
+ active_type (1.3.2)
5
5
  activerecord (>= 3.2)
6
6
 
7
7
  GEM
@@ -54,4 +54,4 @@ DEPENDENCIES
54
54
  rspec (~> 3.4)
55
55
 
56
56
  BUNDLED WITH
57
- 1.16.6
57
+ 2.0.2
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- active_type (1.2.1)
4
+ active_type (1.3.2)
5
5
  activerecord (>= 3.2)
6
6
 
7
7
  GEM
@@ -54,4 +54,4 @@ DEPENDENCIES
54
54
  sqlite3
55
55
 
56
56
  BUNDLED WITH
57
- 1.16.6
57
+ 2.0.2
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- active_type (1.2.1)
4
+ active_type (1.3.2)
5
5
  activerecord (>= 3.2)
6
6
 
7
7
  GEM
@@ -58,4 +58,4 @@ DEPENDENCIES
58
58
  rspec (~> 3.4)
59
59
 
60
60
  BUNDLED WITH
61
- 1.16.6
61
+ 2.0.2
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- active_type (1.2.1)
4
+ active_type (1.3.2)
5
5
  activerecord (>= 3.2)
6
6
 
7
7
  GEM
@@ -58,4 +58,4 @@ DEPENDENCIES
58
58
  rspec (~> 3.4)
59
59
 
60
60
  BUNDLED WITH
61
- 1.16.6
61
+ 2.0.2
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- active_type (1.2.1)
4
+ active_type (1.3.2)
5
5
  activerecord (>= 3.2)
6
6
 
7
7
  GEM
@@ -58,4 +58,4 @@ DEPENDENCIES
58
58
  sqlite3
59
59
 
60
60
  BUNDLED WITH
61
- 1.16.6
61
+ 2.0.2
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- active_type (1.2.1)
4
+ active_type (1.3.2)
5
5
  activerecord (>= 3.2)
6
6
 
7
7
  GEM
@@ -56,4 +56,4 @@ DEPENDENCIES
56
56
  rspec (~> 3.4)
57
57
 
58
58
  BUNDLED WITH
59
- 1.16.6
59
+ 2.0.2
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- active_type (1.2.1)
4
+ active_type (1.4.1)
5
5
  activerecord (>= 3.2)
6
6
 
7
7
  GEM
@@ -56,4 +56,4 @@ DEPENDENCIES
56
56
  rspec (~> 3.4)
57
57
 
58
58
  BUNDLED WITH
59
- 1.16.6
59
+ 2.1.4
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- active_type (1.2.1)
4
+ active_type (1.3.2)
5
5
  activerecord (>= 3.2)
6
6
 
7
7
  GEM
@@ -56,4 +56,4 @@ DEPENDENCIES
56
56
  sqlite3
57
57
 
58
58
  BUNDLED WITH
59
- 1.16.6
59
+ 2.0.2
@@ -1,6 +1,6 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- gem 'activerecord', '~>6.0.0beta'
3
+ gem 'activerecord', '~>6.0.0'
4
4
  gem 'rspec', '~>3.4'
5
5
  gem 'pg'
6
6
  gem 'rake'
@@ -1,23 +1,23 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- active_type (1.2.1)
4
+ active_type (1.3.2)
5
5
  activerecord (>= 3.2)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
- activemodel (6.0.0.beta3)
11
- activesupport (= 6.0.0.beta3)
12
- activerecord (6.0.0.beta3)
13
- activemodel (= 6.0.0.beta3)
14
- activesupport (= 6.0.0.beta3)
15
- activesupport (6.0.0.beta3)
10
+ activemodel (6.0.0)
11
+ activesupport (= 6.0.0)
12
+ activerecord (6.0.0)
13
+ activemodel (= 6.0.0)
14
+ activesupport (= 6.0.0)
15
+ activesupport (6.0.0)
16
16
  concurrent-ruby (~> 1.0, >= 1.0.2)
17
17
  i18n (>= 0.7, < 2)
18
18
  minitest (~> 5.1)
19
19
  tzinfo (~> 1.1)
20
- zeitwerk (~> 1.3, >= 1.3.1)
20
+ zeitwerk (~> 2.1, >= 2.1.8)
21
21
  concurrent-ruby (1.1.5)
22
22
  diff-lcs (1.3)
23
23
  gemika (0.3.4)
@@ -42,18 +42,18 @@ GEM
42
42
  thread_safe (0.3.6)
43
43
  tzinfo (1.2.5)
44
44
  thread_safe (~> 0.1)
45
- zeitwerk (1.4.3)
45
+ zeitwerk (2.1.9)
46
46
 
47
47
  PLATFORMS
48
48
  ruby
49
49
 
50
50
  DEPENDENCIES
51
51
  active_type!
52
- activerecord (~> 6.0.0beta)
52
+ activerecord (~> 6.0.0)
53
53
  gemika
54
54
  pg
55
55
  rake
56
56
  rspec (~> 3.4)
57
57
 
58
58
  BUNDLED WITH
59
- 1.16.6
59
+ 2.0.2
@@ -30,8 +30,11 @@ module ActiveType
30
30
  end
31
31
  end
32
32
  elsif !destroy
33
- assigned_child ||= add_child(parent, build_child(parent, {}))
34
- assigned_child.attributes = attributes
33
+ if assigned_child
34
+ assigned_child.attributes = attributes
35
+ else
36
+ add_child(parent, build_child(parent, attributes))
37
+ end
35
38
  end
36
39
  end
37
40
 
@@ -15,7 +15,7 @@ module ActiveType
15
15
  options = scope
16
16
  scope = nil
17
17
  end
18
- unless options[:foreign_key]
18
+ unless options[:foreign_key] || options[:as]
19
19
  options = options.merge(foreign_key: extended_record_base_class.name.foreign_key)
20
20
  end
21
21
  if ActiveRecord::VERSION::MAJOR > 3
@@ -28,13 +28,42 @@ module ActiveType
28
28
  module ClassMethods
29
29
 
30
30
  def model_name
31
- extended_record_base_class.model_name
31
+ @_model_name ||= begin
32
+ if name
33
+ # Namespace detection copied from ActiveModel::Naming
34
+ namespace = module_ancestors.detect do |n|
35
+ n.respond_to?(:use_relative_model_naming?) && n.use_relative_model_naming?
36
+ end
37
+ # We create a Name object, with the parent class name, but self as the @klass reference
38
+ # This way lookup_ancestors is invoked on the right class instead of the extended_record_base_class
39
+ dup_model_name = ActiveModel::Name.new(self, namespace, extended_record_base_class.name)
40
+ key = name.underscore
41
+ # We fake the `i18n_key` to lookup on the derived class key
42
+ # We keep the others the same to preserve parameter and route names
43
+ dup_model_name.define_singleton_method(:i18n_key) { key }
44
+ dup_model_name
45
+ else # name is nil for the anonymous intermediate class
46
+ extended_record_base_class.model_name
47
+ end
48
+ end
49
+ end
50
+
51
+ def module_ancestors
52
+ if extended_record_base_class.respond_to?(:module_parents)
53
+ extended_record_base_class.module_parents
54
+ else
55
+ extended_record_base_class.parents
56
+ end
32
57
  end
33
58
 
34
59
  def sti_name
35
60
  extended_record_base_class.sti_name
36
61
  end
37
62
 
63
+ def descends_from_active_record?
64
+ extended_record_base_class.descends_from_active_record?
65
+ end
66
+
38
67
  def has_many(name, *args, &extension)
39
68
  super(name, *Inheritance.add_foreign_key_option(extended_record_base_class, *args), &extension)
40
69
  end
@@ -49,7 +78,23 @@ module ActiveType
49
78
 
50
79
  def find_sti_class(type_name)
51
80
  sti_class = super
52
- if self <= sti_class
81
+
82
+ # Consider this class hierarchy
83
+ # class Parent < ActiveRecord::Base; end
84
+ # class Child < Parent; end
85
+ # class ExtendedParent < ActiveType::Record[Parent]; end
86
+ # class ExtendedChild < ActiveType::Record[Child]; end
87
+ if self < sti_class
88
+ # i.e. ExtendendChild.find(child.id)
89
+ # => self = ExtendedChild; sti_class = Child
90
+ # instantiate as ExtendedChild
91
+ self
92
+ elsif sti_class < extended_record_base_class
93
+ # i.e. ExtendedParent.find(child.id)
94
+ # => sti_class = Child; self = ExtendedParent; extended_record_base_class = Parent
95
+ # There is no really good solution here, since we cannot instantiate as both ExtendedParent
96
+ # and Child. We opt to instantiate as ExtendedParent, since the other option can be
97
+ # achieved by using Parent.find(child.id)
53
98
  self
54
99
  else
55
100
  sti_class
@@ -77,7 +122,22 @@ module ActiveType
77
122
  "or overwrite #{name}.inheritance_column to use another column for that information."
78
123
  end
79
124
  #### our code starts here
80
- if self <= subclass
125
+ # Consider this class hierarchy
126
+ # class Parent < ActiveRecord::Base; end
127
+ # class Child < Parent; end
128
+ # class ExtendedParent < ActiveType::Record[Parent]; end
129
+ # class ExtendedChild < ActiveType::Record[Child]; end
130
+ if self < subclass
131
+ # i.e. ExtendendChild.find(child.id)
132
+ # => self = ExtendedChild; subclass = Child
133
+ # instantiate as ExtendedChild
134
+ subclass = self
135
+ elsif subclass < extended_record_base_class
136
+ # i.e. ExtendedParent.find(child.id)
137
+ # => subclass = Child; self = ExtendedParent; extended_record_base_class = Parent
138
+ # There is no really good solution here, since we cannot instantiate as both ExtendedParent
139
+ # and Child. We opt to instantiate as ExtendedParent, since the other option can be
140
+ # achieved by using Parent.find(child.id)
81
141
  subclass = self
82
142
  end
83
143
  #### our code ends here
@@ -1,3 +1,3 @@
1
1
  module ActiveType
2
- VERSION = '1.2.1'
2
+ VERSION = '1.4.1'
3
3
  end
@@ -73,6 +73,8 @@ module ActiveType
73
73
 
74
74
  # Methods for compatibility with gems expecting the ActiveModel::Dirty API.
75
75
  def build_dirty_tracking_methods(name)
76
+ return if name.to_s == 'attribute' # clashes with internal methods
77
+
76
78
  @module.module_eval <<-BODY, __FILE__, __LINE__ + 1
77
79
  def #{name}_was
78
80
  virtual_attributes_were["#{name}"]
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_type
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.1
4
+ version: 1.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tobias Kraze
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2019-07-03 00:00:00.000000000 Z
12
+ date: 2020-08-05 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -123,8 +123,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
125
  requirements: []
126
- rubyforge_project:
127
- rubygems_version: 2.7.8
126
+ rubygems_version: 3.0.8
128
127
  signing_key:
129
128
  specification_version: 4
130
129
  summary: Make any Ruby object quack like ActiveRecord