rails_settlement 1.3.0 → 1.4.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: 8a6695df770d40dfaff82ecab8bc78d0c8094be1c1bb5396a3065627394d3b2a
4
- data.tar.gz: 816e133bd3c262c8ca33f77b1d2629e11f3980a14a903111b93d22fb1c7d8f66
3
+ metadata.gz: fea25e5290b99af4236253654e98e65428fbb8845cd3952ed57bddbfbd877aa5
4
+ data.tar.gz: bf7b83e4dcd6cde28b6fbca6bf96db247ec07d75e4ea76ffa8caec1f775dc7e3
5
5
  SHA512:
6
- metadata.gz: 0524dceb140d2e07286d2cac1adfde6d4c24a1b4f10b9103cd0509b0475551e263e14e2deb51c530961f8c5092ff06469723373eb1f391aaaaa862a26bbe311c
7
- data.tar.gz: 2ffc3f8ddacc5ce63232670febdb4223f968760ce9da686c20553fd6cfc9b75150b7d2c9cbfffafe2cf865f4745b6a238a61c17ea70343d09085943bbca776a4
6
+ metadata.gz: 61f3e0eb9b9909119252dfda0cced54624da78f22c531bf6ae7b03cdd30e3be30485182fda294c83d01475b0df03e56ebd4ded6fdbd1875605e053a677b4dddf
7
+ data.tar.gz: c19ca70fec032ce9b3ffb0868bbc92d4f4322a0138e1e5240d11a5581820b26824ae0ec2a13ef284c301c18b3b7abcb1d1c249e1224c9f0f366007a0d19ebbcc
data/.rubocop.yml CHANGED
@@ -13,7 +13,10 @@ Layout/LineLength:
13
13
  Max: 150
14
14
 
15
15
  Metrics/AbcSize:
16
- Max: 22
16
+ Max: 23
17
+
18
+ Metrics/MethodLength:
19
+ Max: 15
17
20
 
18
21
  Style/Documentation:
19
22
  Enabled: false
data/README.md CHANGED
@@ -25,6 +25,16 @@ class UsersController < ApplicationController
25
25
  # set_user scope_to: :is_active, only: %i[show] #=> User.is_active.find_by
26
26
  # set_user! scope_to: %i[is_active is_admin] #=> User.is_active.is_admin.find_by
27
27
 
28
+ # You can also set a namespace for the model with the `namespace` option. It can be a string or a symbol.
29
+ # Suppose you have a model 'Admin::User', you can define:
30
+ # set_user namespace: :admin, ...
31
+ # If you have a model that's nested more than once, like 'Admin::Account::User', you can define as:
32
+ # set_user namespace: 'admin/account', ...
33
+
34
+ # If you want to search an object's relationship, you can use the `associated_to` option.
35
+ # set_articles! associated_to: :user, ... # => Article.where(user => user)
36
+ # set_articles! associated_to: :user, scope_to: :published # => Article.published.where(user => user).find_by
37
+
28
38
  def show
29
39
  do_something with: user # You also have an attribute reader with the same name available if the object is found. If not, it defaults to nil (unless a bang method is used, in which case an error is raised!)
30
40
  end
@@ -47,6 +57,4 @@ end
47
57
 
48
58
  This approach allows you to use any model instead of a `User`. Just follow the naming convention set_[model_name_in_snake_case]!.
49
59
 
50
- Note: This implementation does not support STI or any Namespaced models. If you have a solution to make them work, please submit a pull request!
51
-
52
60
  That's about it!
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RailsSettlement
4
- VERSION = "1.3.0"
4
+ VERSION = "1.4.0"
5
5
  end
@@ -14,12 +14,15 @@ module RailsSettlement
14
14
  def method_missing(method, **options)
15
15
  super unless (matches = method.to_s.match(SETTABLE_REGEX))
16
16
 
17
- variable, raisable = _handle_match_data(matches)
18
- klass = _klass(variable, **options.extract!(:namespace))
19
- param_options = _param_options(klass: klass, options: options)
20
- scoped_klass = _handle_scopes(klass: klass, scopes: param_options[:scope_to])
17
+ variable, raisable = _rs_handle_match_data(matches)
18
+ klass = _rs_klass(variable, **options.extract!(:namespace))
19
+ param_options = _rs_param_options(klass: klass, options: options)
20
+ scoped_klass = _rs_handle_scopes(klass: klass, scopes: param_options[:scope_to])
21
+ associated_to = _rs_handle_associated_to(options: options)
21
22
 
22
23
  before_action(**options) do
24
+ scoped_klass = _rs_associated_scope(scoped_relation: scoped_klass, associated_to: associated_to)
25
+
23
26
  instance_variable_set("@#{variable}", scoped_klass.find_by(param_options[:model_key] => params[param_options[:params_key]]))
24
27
  raise ActiveRecord::RecordNotFound if raisable && instance_variable_get("@#{variable}").nil?
25
28
  end
@@ -33,21 +36,21 @@ module RailsSettlement
33
36
 
34
37
  private
35
38
 
36
- def _handle_match_data(match_data)
39
+ def _rs_handle_match_data(match_data)
37
40
  [match_data[:object], match_data[:raisable].present?]
38
41
  end
39
42
 
40
- def _klass(variable, namespace: nil)
43
+ def _rs_klass(variable, namespace: nil)
41
44
  variable = variable.classify
42
45
  variable = "#{namespace.to_s.classify}::#{variable}" if namespace.present?
43
46
  variable.constantize
44
47
  end
45
48
 
46
- def _param_options(klass:, options:)
49
+ def _rs_param_options(klass:, options:)
47
50
  (klass.try(:settable_params) || {}).merge(options.extract!(:model_key, :params_key, :scope_to))
48
51
  end
49
52
 
50
- def _handle_scopes(klass:, scopes:)
53
+ def _rs_handle_scopes(klass:, scopes:)
51
54
  return klass if scopes.blank?
52
55
 
53
56
  scopes = [scopes] unless scopes.is_a?(Array)
@@ -55,6 +58,18 @@ module RailsSettlement
55
58
 
56
59
  klass
57
60
  end
61
+
62
+ def _rs_handle_associated_to(options:)
63
+ return nil unless options.key?(:associated_to)
64
+
65
+ options.delete(:associated_to)
66
+ end
67
+ end
68
+
69
+ def _rs_associated_scope(scoped_relation:, associated_to: nil)
70
+ return scoped_relation if associated_to.blank?
71
+
72
+ scoped_relation.where(associated_to => public_send(associated_to))
58
73
  end
59
74
  end
60
75
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails_settlement
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tejas
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-02-20 00:00:00.000000000 Z
11
+ date: 2024-03-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord