Skip to content
This repository was archived by the owner on Nov 30, 2024. It is now read-only.

Commit fa1b5f5

Browse files
authored
Merge pull request #2886 from Liberatys/extend-reserved-memoized-helper-names
Extend reserved name check
2 parents b5d0e5c + 8fffd66 commit fa1b5f5

File tree

3 files changed

+29
-6
lines changed

3 files changed

+29
-6
lines changed

Changelog.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ Enhancements:
55

66
* Improve pluralisation of words ending with `s` (like process). (Joshua Pinter, #2779)
77
* Add ordering by file modification time (most recent first). (Matheus Richard, #2778)
8+
* Extend reserved memoized helper name checking for #let and #subject. (Nick Flückiger, #2886)
89

910
Bug fixes:
1011

lib/rspec/core/memoized_helpers.rb

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -307,9 +307,13 @@ def let(name, &block)
307307
# We have to pass the block directly to `define_method` to
308308
# allow it to use method constructs like `super` and `return`.
309309
raise "#let or #subject called without a block" if block.nil?
310-
raise(
311-
"#let or #subject called with a reserved name #initialize"
312-
) if :initialize == name
310+
311+
# A list of reserved words that can't be used as a name for a memoized helper
312+
# Matches for both symbols and passed strings
313+
if [:initialize, :to_s].include?(name.to_sym)
314+
raise ArgumentError, "#let or #subject called with reserved name `#{name}`"
315+
end
316+
313317
our_module = MemoizedHelpers.module_for(self)
314318

315319
# If we have a module clash in our helper module

spec/rspec/core/memoized_helpers_spec.rb

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -520,10 +520,28 @@ def count
520520
end.to raise_error(/#let or #subject called without a block/)
521521
end
522522

523-
it 'raises an error when attempting to define a reserved method name' do
523+
it 'raises an error when attempting to define a reserved name #initialize' do
524524
expect do
525-
RSpec.describe { let(:initialize) { true }}
526-
end.to raise_error(/#let or #subject called with a reserved name #initialize/)
525+
RSpec.describe { let(:initialize) { true } }
526+
end.to raise_error(/#let or #subject called with reserved name `initialize`/)
527+
end
528+
529+
it 'raises an error when attempting to define a reserved name #initialize as a string' do
530+
expect do
531+
RSpec.describe { let('initialize') { true } }
532+
end.to raise_error(/#let or #subject called with reserved name `initialize`/)
533+
end
534+
535+
it 'raises an error when attempting to define a reserved name #to_s' do
536+
expect do
537+
RSpec.describe { let(:to_s) { true } }
538+
end.to raise_error(/#let or #subject called with reserved name `to_s`/)
539+
end
540+
541+
it 'raises an error when attempting to define a reserved name #to_s as a string' do
542+
expect do
543+
RSpec.describe { let('to_s') { true } }
544+
end.to raise_error(/#let or #subject called with reserved name `to_s`/)
527545
end
528546

529547
let(:a_value) { "a string" }

0 commit comments

Comments
 (0)