foobara 0.5.3 → 0.5.4

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: 2ee98e7512333f9d3e069e3fe8a6c7cbbe2c5f27f2d918a7397cdaeed64b077f
4
- data.tar.gz: 6fd8d38c4a30d1b0721fc241b6d09ef890e719fccd795b40d8319a7d77a82c56
3
+ metadata.gz: a96afa4b186236cc708db3bc2a292756816db8e601a5cef7b31d0082a4a97dea
4
+ data.tar.gz: f184bf52340442842d0e6d9bdaa0f50a7c3a7f07421d4bb4a1c776c634703e4e
5
5
  SHA512:
6
- metadata.gz: 0b9e6f6ba2685ee2462811158fefc0d30f4c83122a3701e8b5ab06e2188d1d9c3ce5775846af2a4b4e15ffb7007d19947894fd9e6d4c3a98b92d2636b5b1bbc8
7
- data.tar.gz: 14db098dc24293b84247e8a4d44913c902aae7f4058ca148698587c14c7d9f971d5d1e97b04ad94f4ae8b80007cac1b6881348c03d13b1ec41c4213b3a1c2892
6
+ metadata.gz: 3c2fa3e1b90cc5f6f31df05683b17fef4ef7ad77c07c5af9190a603696b4470355b357f726dcef2f05dbbdf79213c56e655578a3731f9e03cd25397c4d0fb62e
7
+ data.tar.gz: 7b832dba231c05086a83d0a56fc799910bcee15fae5c3979eac8923d1f1bd17064d759dc9d0c0b94456400a92e2243d93b942822af16fd1b5f12b3b6c6b479e5
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ # [0.5.4] - 2026-02-16
2
+
3
+ - Fix bug where adding a desugarizer to a subclass had no effect
4
+ - Add support for requiring allow_if: by default
5
+
1
6
  # [0.5.3] - 2026-02-12
2
7
 
3
8
  - Allow registering an allowed rule on an instance of a connector not just its class
@@ -488,6 +488,20 @@ RSpec.describe Foobara::CommandConnector do
488
488
  expect(response.body).to eq("8")
489
489
  end
490
490
 
491
+ context "when requires_allowed_rule" do
492
+ let(:command_connector) do
493
+ described_class.new(
494
+ authenticator:,
495
+ default_serializers:,
496
+ requires_allowed_rule: true
497
+ )
498
+ end
499
+
500
+ it "gives a relevant error" do
501
+ expect { response }.to raise_error(Foobara::CommandConnector::NoAllowedRuleGivenError)
502
+ end
503
+ end
504
+
491
505
  context "with default transformers" do
492
506
  before do
493
507
  identity = proc { |x| x }
@@ -2074,14 +2088,14 @@ RSpec.describe Foobara::CommandConnector do
2074
2088
  end
2075
2089
  let(:command_connector) do
2076
2090
  rule = allowed_rule_d
2077
- command_connector_class_d.new do
2091
+ command_connector_class_d.new(requires_allowed_rule: true) do
2078
2092
  register_allowed_rule :d, rule
2079
2093
  end
2080
2094
  end
2081
2095
 
2082
2096
  it "puts the expected allowed rules on the command connector" do
2083
2097
  command_connector.connect(command_class, suffix: "A", allow_if: :a)
2084
- command_connector.connect(command_class, suffix: "B")
2098
+ command_connector.connect(command_class, suffix: "B", allow_if: :always)
2085
2099
  command_connector.connect(command_class, suffix: "C", allowed_rule: :c)
2086
2100
  command_connector.connect(command_class, suffix: "D", allowed_rule: :d)
2087
2101
 
@@ -2091,7 +2105,7 @@ RSpec.describe Foobara::CommandConnector do
2091
2105
 
2092
2106
  response = command_connector.run(full_command_name: "ComputeExponentB", action:, inputs:)
2093
2107
  expect(response.status).to be(0)
2094
- expect(response.command.allowed_rule).to be_nil
2108
+ expect(response.command.allowed_rule).to be(described_class.always_allowed_rule)
2095
2109
 
2096
2110
  response = command_connector.run(full_command_name: "ComputeExponentC", action:, inputs:)
2097
2111
  expect(response.status).to be(1)
@@ -36,13 +36,13 @@ module Foobara
36
36
  end
37
37
 
38
38
  def desugarizers
39
- @desugarizers ||= []
39
+ return @desugarizers if defined?(@desugarizers)
40
40
 
41
- if superclass == Object
42
- @desugarizers
43
- else
44
- @desugarizers + superclass.desugarizers
45
- end
41
+ @desugarizers = if superclass == Object
42
+ []
43
+ else
44
+ superclass.desugarizers.dup
45
+ end
46
46
  end
47
47
  end
48
48
  end
@@ -0,0 +1,6 @@
1
+ module Foobara
2
+ class CommandConnector
3
+ class NoAllowedRuleGivenError < StandardError
4
+ end
5
+ end
6
+ end
@@ -178,10 +178,19 @@ module Foobara
178
178
  def build_auth_mapper(to_type, &)
179
179
  TypeDeclarations::TypedTransformer.subclass(to: to_type, &).instance
180
180
  end
181
+
182
+ def always_allowed_rule
183
+ # maybe move AllowedRule to CommandConnector:: instead of
184
+ # CommandRegistry:: which is more of an implementation detail?
185
+ @always_allowed_rule ||= CommandRegistry::AllowedRule.new(
186
+ symbol: :always,
187
+ explanation: "This always passes. Used to override allowed_rule_missing."
188
+ ) { true }
189
+ end
181
190
  end
182
191
 
183
192
  attr_accessor :command_registry, :authenticator, :capture_unknown_error, :name,
184
- :auth_map
193
+ :auth_map, :requires_allowed_rule
185
194
 
186
195
  def initialize(name: nil,
187
196
  authenticator: nil,
@@ -190,6 +199,7 @@ module Foobara
190
199
  default_pre_commit_transformers: nil,
191
200
  auth_map: nil,
192
201
  current_user: nil,
202
+ requires_allowed_rule: false,
193
203
  &block)
194
204
  authenticator = self.class.to_authenticator(authenticator)
195
205
 
@@ -214,6 +224,11 @@ module Foobara
214
224
  add_default_serializer(serializer)
215
225
  end
216
226
 
227
+ if requires_allowed_rule
228
+ self.requires_allowed_rule = requires_allowed_rule
229
+ register_allowed_rule(CommandConnector.always_allowed_rule)
230
+ end
231
+
217
232
  Util.array(default_pre_commit_transformers).each do |pre_commit_transformer|
218
233
  add_default_pre_commit_transformer(pre_commit_transformer)
219
234
  end
@@ -232,6 +247,7 @@ module Foobara
232
247
  end
233
248
 
234
249
  # TODO: should this be the official way to connect a command instead of #connect ?
250
+ # Probably not. But what about #export instead?
235
251
  def command(...) = connect(...)
236
252
 
237
253
  def connect(*args, **opts)
@@ -616,6 +632,16 @@ module Foobara
616
632
  def run_command(request)
617
633
  command = request.command
618
634
 
635
+ if requires_allowed_rule
636
+ unless command.allowed_rule
637
+ raise NoAllowedRuleGivenError,
638
+ "Must connect #{command.full_command_name} with an `allowed_if:` " \
639
+ "because `requires_allowed_rule` is true. You can use `allow_if: :always` if want to always allow " \
640
+ "this command to be ran or you can also use `requires_allowed_rule: false` " \
641
+ "when creating the connector if you don't want to enforce allowed_if: for all connected commands."
642
+ end
643
+ end
644
+
619
645
  unless command.outcome
620
646
  command.run
621
647
  end
data/version.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  module Foobara
2
2
  module Version
3
- VERSION = "0.5.3".freeze
3
+ VERSION = "0.5.4".freeze
4
4
  MINIMUM_RUBY_VERSION = ">= 3.4.0".freeze
5
5
  end
6
6
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: foobara
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.3
4
+ version: 0.5.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Miles Georgi
@@ -138,6 +138,7 @@ files:
138
138
  - projects/command_connectors/src/command_connector/concerns/desugarizers.rb
139
139
  - projects/command_connectors/src/command_connector/concerns/reflection.rb
140
140
  - projects/command_connectors/src/command_connector/invalid_context_error.rb
141
+ - projects/command_connectors/src/command_connector/no_allowed_rule_given_error.rb
141
142
  - projects/command_connectors/src/command_connector/no_command_found_error.rb
142
143
  - projects/command_connectors/src/command_connector/no_command_or_type_found_error.rb
143
144
  - projects/command_connectors/src/command_connector/no_type_found_error.rb