Skip to content

Commit 6c6477b

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

File tree

3 files changed

+86
-3
lines changed

3 files changed

+86
-3
lines changed

lib/resource_registry/capabilities/capability_config.rb

+28
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,41 @@ 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 do
34+
params(resource: Resource).returns(
35+
T.nilable(T.any(T.attached_class, ClassMethods[T.attached_class]))
36+
)
37+
end
38+
def resource_capability(resource:)
39+
return unless resource_capability?(resource:)
40+
41+
T.cast(resource.capabilities[key], self)
42+
end
43+
44+
sig do
45+
params(resource: Resource).returns(
46+
T.any(T.attached_class,ClassMethods[T.attached_class])
47+
)
48+
end
49+
def resource_capability!(resource:)
50+
T.must(resource_capability(resource: ))
51+
end
2452
end
2553

2654
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[T.untyped],
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[T.untyped],
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[T.untyped],
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)