Class: RuboCop::Cop::Browserctl::TypedError
- Inherits:
-
RuboCop::Cop::Base
- Object
- RuboCop::Cop::Base
- RuboCop::Cop::Browserctl::TypedError
- Defined in:
- lib/browserctl/rubocop/cops/typed_error.rb
Overview
Enforces that any explicit code: keyword passed to a raise of a
Browserctl::* error refers to a constant from
Browserctl::Error::Codes rather than a free-form string literal.
Subclasses with their own default_code are trusted (the cop does not
try to statically resolve default_code across files); the contract
is enforced by the unit test suite. This cop's job is to catch the
specific failure mode of inlining a stale code string at the raise
site and bypassing the canonical enum.
The pattern is intentionally narrow. The full default_code-vs-Codes
reconciliation lives in lib/browserctl/errors.rb and is covered by
spec/unit/errors_spec.rb.
The cop was tightened in v0.14 WS-1 PR 5 to remove the previous
"canonical SCREAMING_SNAKE string literals are also fine" escape
hatch — every code: must now be a constant reference so renames in
Codes propagate through the codebase via the constant, not via a
stale whitelist baked into this cop.
Constant Summary collapse
- MSG =
"Browserctl raise: `code:` must reference Browserctl::Error::Codes::* — " \ "got string literal %<value>p. See lib/browserctl/error/codes.rb."
Instance Method Summary collapse
Instance Method Details
#on_send(node) ⇒ Object
63 64 65 66 67 68 69 70 71 72 73 74 |
# File 'lib/browserctl/rubocop/cops/typed_error.rb', line 63 def on_send(node) return unless node.method?(:raise) [ browserctl_raise_with_code(node), browserctl_raise_new_with_code(node) ].compact.each do |code_value| next unless code_value.str_type? add_offense(code_value, message: format(MSG, value: code_value.value)) end end |