Skip to content

Commit 9bc8f22

Browse files
committed
Add CapabilityConfig resource methods
Convinient methods to get the CapabilityConfig instance of a given resource
1 parent d74e579 commit 9bc8f22

File tree

3 files changed

+78
-3
lines changed

3 files changed

+78
-3
lines changed

lib/resource_registry/capabilities/capability_config.rb

+20
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,33 @@ module CapabilityConfig
1414
# Class methods interface for capability configuration
1515
module ClassMethods
1616
extend T::Sig
17+
extend T::Generic
1718
extend T::Helpers
1819
abstract!
1920

21+
has_attached_class!
22+
2023
# The key of the capability, this key will be used to take it from yaml configuration
2124
sig { abstract.returns(Symbol) }
2225
def key
2326
end
27+
28+
sig { params(resource: Resource).returns(T::Boolean) }
29+
def resource_capability?(resource:)
30+
resource.capabilities.key?(key)
31+
end
32+
33+
sig { params(resource: Resource).returns(T.nilable(ClassMethods[T.attached_class]))}
34+
def resource_capability(resource:)
35+
return unless resource_capability?(resource:)
36+
37+
T.cast(resource.capabilities[key], self)
38+
end
39+
40+
sig { params(resource: Resource).returns(ClassMethods[T.attached_class])}
41+
def resource_capability!(resource:)
42+
T.must(resource_capability(resource: ))
43+
end
2444
end
2545

2646
requires_ancestor { Object }

lib/resource_registry/resource.rb

+3-3
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ def build_dto(verb, **parameters)
140140
T::Class[T.type_parameter(:CapabilityConfig)],
141141
# Referencing `ClassMethods` here is not ideal but it seems Sorbet
142142
# provides no other mechanism to do this
143-
Capabilities::CapabilityConfig::ClassMethods,
143+
Capabilities::CapabilityConfig::ClassMethods[Capabilities::CapabilityConfig],
144144
T::Class[Capabilities::CapabilityConfig]
145145
)
146146
)
@@ -161,7 +161,7 @@ def capability_by_key(key)
161161
params(
162162
feature:
163163
T.all(
164-
Capabilities::CapabilityConfig::ClassMethods,
164+
Capabilities::CapabilityConfig::ClassMethods[Capabilities::CapabilityConfig],
165165
T::Class[Capabilities::CapabilityConfig]
166166
)
167167
).returns(T::Boolean)
@@ -178,7 +178,7 @@ def capability?(feature)
178178
T::Class[T.type_parameter(:CapabilityConfig)],
179179
# Referencing ClassMethods here is not ideal but it seems Sorbet
180180
# provides no other mechanism to do this
181-
Capabilities::CapabilityConfig::ClassMethods,
181+
Capabilities::CapabilityConfig::ClassMethods[Capabilities::CapabilityConfig],
182182
T::Class[Capabilities::CapabilityConfig]
183183
)
184184
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
# typed: false
2+
3+
require "spec_helper"
4+
require_relative "../../../lib/resource_registry/capabilities/capability_config"
5+
6+
class DummyCapability < T::Struct
7+
include ResourceRegistry::Capabilities::CapabilityConfig
8+
9+
def self.key
10+
:dummy_capability
11+
end
12+
end
13+
14+
RSpec.describe ResourceRegistry::Capabilities::CapabilityConfig do
15+
let(:schema) do
16+
SchemaRegistry::Schema.new(
17+
name: "dummy",
18+
namespace: "dummies",
19+
properties: [
20+
SchemaRegistry::Property.new(
21+
name: "foo",
22+
types: [SchemaRegistry::PropertyType::String],
23+
required: true
24+
)
25+
]
26+
)
27+
end
28+
let(:capabilities) { { dummy_capability: DummyCapability.new } }
29+
let(:resource) do
30+
ResourceRegistry::Resource.new(
31+
repository_raw: DummyRepo.to_s,
32+
capabilities:,
33+
verbs: {
34+
},
35+
schema:
36+
)
37+
end
38+
39+
it "should return resource's capability" do
40+
expect(DummyCapability.resource_capability?(resource:)).to be true
41+
expect(DummyCapability.resource_capability(resource:)).to be_a(DummyCapability)
42+
expect(DummyCapability.resource_capability!(resource:)).to be_a(DummyCapability)
43+
end
44+
45+
context 'without the capability' do
46+
let(:capabilities) { {} }
47+
48+
it "should return resource's capability" do
49+
expect(DummyCapability.resource_capability?(resource:)).to be false
50+
expect(DummyCapability.resource_capability(resource:)).to be_nil
51+
end
52+
end
53+
end
54+
55+

0 commit comments

Comments
 (0)