hubbado-policy 1.2.0 → 1.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 10ac3df17852150db0027d21e4fda49038083e6d825e41227a225864322df576
4
- data.tar.gz: 0d303a7756e82512635a6a323939df1f794766cef2182cf405f07e72b96ad4d9
3
+ metadata.gz: 85715105fb8d91ba36116e0fe32fc87806a48960898d9e5b9802af20bba64e67
4
+ data.tar.gz: 532065ab325a09f66d6f2dc18e89db1b77f2c2032f45ee424f6dc196dde99c8f
5
5
  SHA512:
6
- metadata.gz: 83232ddd7a934bf3a3381dccfe785be182ef6d03e2fd519bc006f1a17a07c0006b87c1d0e4dd58d442b5739350edf0e6f0ae9153a88676da3a5fcb74f8b5e94f
7
- data.tar.gz: 8086d8d2ecbbe4df566560a0d36ebad2c1010b000d70c10bb703fc6c0b0d6c1ea5fd7a8017c70dd940951676090b2afa5ab10b80e02274e109e1152a5c4da231
6
+ metadata.gz: ff8d518316ca3e959685b16f9b76afc893686ff02d237de6ccc9573e14b2ac2114bc20bb0a69af9bb5af3bb8105732123b3d486ae1da3ba24e6fbb0054adac1a
7
+ data.tar.gz: 793021cd69698ace3607c10d68cab0811032f2c93e1d2b71c497e5405ebd2f4b6141eabb023b2b2bb34b4eae7155fff0caa1f62912a35dad3267445aab2d515e
data/CHANGELOG.md CHANGED
@@ -2,9 +2,21 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file.
4
4
 
5
- The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [1.3.0] - 2025-06-03
9
+
10
+ ### Added
11
+
12
+ - Ability to configure the i18n_scope for a non-generic denied reason
13
+
14
+ ## [1.2.1] - 2025-06-02
15
+
16
+ ### Fixed
17
+
18
+ - Policies class instance variable is correctly copied from parent policy
19
+
8
20
  ## [1.2.0] - 2025-05-27
9
21
 
10
22
  ### Added
data/README.md CHANGED
@@ -131,6 +131,27 @@ en:
131
131
  denied: "Access denied"
132
132
  ```
133
133
 
134
+ You can also specify a custom i18n scope when returning denied results:
135
+
136
+ ```ruby
137
+ define_policy :edit do
138
+ # Use a different i18n scope for this specific denial
139
+ return denied(:not_authorized, i18n_scope: "custom_errors.article")
140
+
141
+ permitted
142
+ end
143
+ ```
144
+
145
+ Both the class method and instance method versions of `denied` support the `i18n_scope` parameter:
146
+
147
+ ```ruby
148
+ # Class method
149
+ ArticlePolicy.denied(:custom_reason, i18n_scope: "errors.custom")
150
+
151
+ # Instance method
152
+ policy.denied(:custom_reason, i18n_scope: "errors.custom")
153
+ ```
154
+
134
155
  ### Testing
135
156
 
136
157
  Policies can be mimiced using a built-in control
@@ -1,11 +1,11 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "hubbado-policy"
3
- s.version = "1.2.0"
3
+ s.version = "1.3.0"
4
4
  s.summary = "A lightweight, flexible policy framework for Ruby applications"
5
5
 
6
6
  s.authors = ["Hubbado Devs"]
7
7
  s.email = ["devs@hubbado.com"]
8
- s.homepage = 'https://github.com/hubbado/hubbado-policy'
8
+ s.homepage = "https://github.com/hubbado/hubbado-policy"
9
9
  s.license = "MIT"
10
10
 
11
11
  s.metadata["homepage_uri"] = s.homepage
@@ -24,10 +24,10 @@ Gem::Specification.new do |s|
24
24
  s.platform = Gem::Platform::RUBY
25
25
  s.required_ruby_version = ">= 3.2"
26
26
 
27
- s.add_runtime_dependency "i18n"
28
27
  s.add_runtime_dependency "evt-casing"
29
28
  s.add_runtime_dependency "evt-record_invocation"
30
29
  s.add_runtime_dependency "evt-template_method"
30
+ s.add_runtime_dependency "i18n"
31
31
 
32
32
  s.add_development_dependency "debug"
33
33
  s.add_development_dependency "hubbado-style"
@@ -7,8 +7,14 @@ module Hubbado
7
7
  end
8
8
 
9
9
  module ClassMethods
10
+ def inherited(subclass)
11
+ super
12
+ # Copy policies from parent class to subclass
13
+ subclass.instance_variable_set(:@policies, @policies&.dup || Set.new)
14
+ end
15
+
10
16
  def define_policy(policy, *args, **kwargs, &block)
11
- @policies ||= []
17
+ @policies ||= Set.new
12
18
  @policies << policy
13
19
 
14
20
  # NOTE: This uses the technique described here so that the block given to
@@ -42,13 +48,14 @@ module Hubbado
42
48
  # Define this in a subclass if there are dependencies to be configure
43
49
  template_method :configure
44
50
 
45
- def self.denied(reason = nil, data: nil)
51
+ def self.denied(reason = nil, data: nil, i18n_scope: nil)
52
+ i18n_scope ||= self.i18n_scope
46
53
  reason ||= :denied
47
54
  Result.new(false, reason, i18n_scope: i18n_scope, data: data)
48
55
  end
49
56
 
50
57
  def self.permitted
51
- Result.new(true, :permitted, i18n_scope: i18n_scope)
58
+ Result.new(true, :permitted)
52
59
  end
53
60
 
54
61
  def self.i18n_scope
@@ -66,8 +73,8 @@ module Hubbado
66
73
  self.class == other.class && user == other.user && record == other.record
67
74
  end
68
75
 
69
- def denied(reason = nil, data: nil)
70
- self.class.denied(reason, data: data)
76
+ def denied(reason = nil, data: nil, i18n_scope: nil)
77
+ self.class.denied(reason, data: data, i18n_scope: i18n_scope)
71
78
  end
72
79
 
73
80
  def permitted
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hubbado-policy
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hubbado Devs
@@ -10,7 +10,7 @@ cert_chain: []
10
10
  date: 1980-01-02 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
- name: i18n
13
+ name: evt-casing
14
14
  requirement: !ruby/object:Gem::Requirement
15
15
  requirements:
16
16
  - - ">="
@@ -24,7 +24,7 @@ dependencies:
24
24
  - !ruby/object:Gem::Version
25
25
  version: '0'
26
26
  - !ruby/object:Gem::Dependency
27
- name: evt-casing
27
+ name: evt-record_invocation
28
28
  requirement: !ruby/object:Gem::Requirement
29
29
  requirements:
30
30
  - - ">="
@@ -38,7 +38,7 @@ dependencies:
38
38
  - !ruby/object:Gem::Version
39
39
  version: '0'
40
40
  - !ruby/object:Gem::Dependency
41
- name: evt-record_invocation
41
+ name: evt-template_method
42
42
  requirement: !ruby/object:Gem::Requirement
43
43
  requirements:
44
44
  - - ">="
@@ -52,7 +52,7 @@ dependencies:
52
52
  - !ruby/object:Gem::Version
53
53
  version: '0'
54
54
  - !ruby/object:Gem::Dependency
55
- name: evt-template_method
55
+ name: i18n
56
56
  requirement: !ruby/object:Gem::Requirement
57
57
  requirements:
58
58
  - - ">="