delegate_if_nil 0.2.0 → 0.6.0

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: 118a0a92d00e61a386046d6dad0be907cb13be59926b4d52947986f646db59e6
4
- data.tar.gz: 7d7079f3786f35f538aa2ed9636ed9dd2942162d823ce017116fcb41133c5c58
3
+ metadata.gz: '0974b95301d59910e8fee453a67dbad18c8ae91444558952d51764a8a58ef338'
4
+ data.tar.gz: 6a431e935d57e06b902eb5e4944e8a5aa2310f9d717e1a9c5528a78600a5ca26
5
5
  SHA512:
6
- metadata.gz: 6b5af1ff90239141a6618bd541718c4834340eb9414dd71d6ae50948251eced69e78ee2da93cf5208d9a19f448e62b76de3b52683e4ee56a35a663148921b611
7
- data.tar.gz: 01ebe27e99234b2a26af27169639b6d62d43506f0d7ffafa8427ff2f66820efb260210eaff7849228174d304b646c82bda8e23d6121736b1e5529807b9fe1832
6
+ metadata.gz: fa21eb61e75dccf9eb2470b1abdadd43e9f3bb5bc89cd1079adf47c5187f8ba3319facc440f12d9563cc05600e08e5ec6d6a96547c0fad30210a8557248a5e13
7
+ data.tar.gz: 7c542e65f901c3bdf7fe1f4a3a51096ba928d01453ed539a8f5cb505751a3b0117ef95489e19ff402930019a0e634ceaca7c4d904bcf96645e02f9efeced0ad6
data/README.md CHANGED
@@ -17,6 +17,19 @@ end
17
17
 
18
18
  `animal` will now delegate to `owning_model` if it's `nil` on an instance of `SomeModel`.
19
19
 
20
+ `delegate_if_nil` is available as an alias:
21
+
22
+ ```ruby
23
+ class SomeModel < ApplicationRecord
24
+ extend DelegateIfNil
25
+ belongs_to :owning_model
26
+
27
+ nil_delegate :animal, to: :owning_model
28
+ delegate_if_nil :animal, to: :owning_model # Exact same as the line above
29
+
30
+ end
31
+ ```
32
+
20
33
  You also get `_source` methods, which will tell you where the `animal` value comes from. If it's not set on either one, it will return `"unset"`
21
34
 
22
35
  You'll get the following results:
@@ -24,19 +37,21 @@ You'll get the following results:
24
37
  ```ruby
25
38
  om = OwningModel.create(animal: "Cat")
26
39
 
27
- some_model = SomeModel.create(animal: nil, owning_model = om)
40
+ some_model = SomeModel.create(animal: nil, owning_model: om)
28
41
  some_model.animal # "Cat"
29
42
  some_model.animal_source # "owning_model"
43
+ some_model.animal_delegated? # true
30
44
 
31
- some_model = SomeModel.create(animal: "Dog", owning_model = om)
45
+ some_model = SomeModel.create(animal: "Dog", owning_model: om)
32
46
  some_model.animal # Dog
33
47
  some_model.animal_source # "self"
48
+ some_model.animal_delegated? # false
34
49
 
35
50
  om = OwningModel.create(animal: nil)
36
- some_model = SomeModel.create(animal: nil, owning_model = om)
51
+ some_model = SomeModel.create(animal: nil, owning_model: om)
37
52
  some_model.animal # nil
38
53
  some_model.animal_source # "unset"
39
-
54
+ some_model.animal_delegated? # true
40
55
  ```
41
56
 
42
57
  It also works for multiple attributes. EG:
@@ -52,11 +67,36 @@ end
52
67
 
53
68
  It also resolves correctly for recursive delegations. IE: if `owning_model` delgates an attribute if `nil`, it will correctly report the source all the way down the chain, terminating either in `self`, `unset`, or the association name.
54
69
 
70
+ ## Example
71
+
72
+ This is an example based off a real-world project.
73
+
74
+ A `User` has many `notification_channels`. Each `user` and `notification_channel` has a `notifications_enabled` boolean flag.
75
+
76
+ With this setup, a `user` can set a default value for `notifications_enabled`, and each channel can override the default.
77
+
78
+ eg:
79
+
80
+ ```ruby
81
+ class User < ActiveRecord::Base
82
+ # notifications_enabled is a boolean attribute on the user model
83
+ has_many :notification_channels
84
+ end
85
+
86
+ class NotificationChannel < ActiveRecord::Base
87
+ # notifications_enabled is a boolean attribute on the notification_channel model
88
+ belongs_to :user
89
+ nil_delegate :notifications_enabled, to: :user
90
+ end
91
+ ```
92
+
93
+ Now, to see if a specific channel should be enabled, simple call `notification_channel.notifications_enabled`, and it will resolve the correct value for that channel.
94
+
55
95
  ## Installation
56
96
  Add this line to your application's Gemfile:
57
97
 
58
98
  ```ruby
59
- gem 'delegate_if_nil', git: 'https://github.com/stevenallen05/delegate_if_nil.git'
99
+ gem 'delegate_if_nil'
60
100
  ```
61
101
 
62
102
  And then execute:
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module DelegateIfNil
4
- VERSION = "0.2.0"
4
+ VERSION = "0.6.0"
5
5
  end
@@ -4,12 +4,26 @@ require "delegate_if_nil/railtie"
4
4
 
5
5
  module DelegateIfNil
6
6
  extend ActiveSupport::Concern
7
-
7
+
8
8
  def nil_delegate(*attrs, to:)
9
9
  attrs.each do |attr|
10
10
  define_method attr do
11
11
  self[attr].nil? ? send(to)&.send(attr) : self[attr]
12
12
  end
13
+
14
+ source_object_method = "#{attr}_source_object".to_sym
15
+ define_method source_object_method do
16
+ return self unless self[attr].nil?
17
+
18
+ if send(to)&.respond_to?(source_object_method)
19
+ to_source = send(to).send(source_object_method)
20
+ return to if to_source == self
21
+
22
+ return to_source
23
+ else
24
+ return send(to)&.send(attr).nil? ? nil : to
25
+ end
26
+ end
13
27
 
14
28
  source_method = "#{attr}_source".to_sym
15
29
  define_method source_method do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: delegate_if_nil
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Steven Allen
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-08-25 00:00:00.000000000 Z
11
+ date: 2022-05-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '4.2'
19
+ version: '6.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '4.2'
26
+ version: '6.0'
27
27
  description: Add to a model to simply delegate attributes to an associated record
28
28
  email:
29
29
  - sallen@amberstyle.ca
@@ -42,7 +42,7 @@ homepage: https://github.com/stevenallen05/delegate_if_nil
42
42
  licenses:
43
43
  - MIT
44
44
  metadata: {}
45
- post_install_message:
45
+ post_install_message:
46
46
  rdoc_options: []
47
47
  require_paths:
48
48
  - lib
@@ -57,8 +57,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
57
57
  - !ruby/object:Gem::Version
58
58
  version: '0'
59
59
  requirements: []
60
- rubygems_version: 3.0.1
61
- signing_key:
60
+ rubygems_version: 3.3.3
61
+ signing_key:
62
62
  specification_version: 4
63
63
  summary: Simple delegation of nil attributes to an association
64
64
  test_files: []