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

Commit c488739

Browse files
committed
Allow custom ordering by name on the cli
1 parent d11b9a6 commit c488739

File tree

3 files changed

+81
-1
lines changed

3 files changed

+81
-1
lines changed

features/command_line/order.feature

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,32 @@ Scenario: Order can be psuedo randomised (seed used here to fix the ordering for
6969
does something
7070
"""
7171

72+
Scenario: Configure custom ordering
73+
Given a file named "example_spec.rb" with:
74+
"""ruby
75+
RSpec.configure do |config|
76+
config.register_ordering(:reverse) do |examples|
77+
examples.reverse
78+
end
79+
config.order = :reverse
80+
end
81+
82+
RSpec.describe "something", order: :reverse do
83+
it "does something" do
84+
end
85+
86+
it "in order" do
87+
end
88+
end
89+
"""
90+
When I run `rspec example_spec.rb --format documentation --order reverse`
91+
Then the output should contain:
92+
"""
93+
something
94+
in order
95+
does something
96+
"""
97+
7298
Scenario: Override order to `defined` when another order is set
7399
Given a file named "example_spec.rb" with:
74100
"""ruby

lib/rspec/core/ordering.rb

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,9 +171,20 @@ def order=(type)
171171
:defined
172172
elsif order == 'recently-modified'
173173
:recently_modified
174+
else
175+
order.to_sym
174176
end
175177

176-
register_ordering(:global, ordering_registry.fetch(ordering_name)) if ordering_name
178+
if ordering_name
179+
strategy =
180+
if ordering_registry.has_strategy?(ordering_name)
181+
ordering_registry.fetch(ordering_name)
182+
else
183+
Delayed.new(ordering_registry, ordering_name)
184+
end
185+
186+
register_ordering(:global, strategy)
187+
end
177188
end
178189

179190
def force(hash)

spec/rspec/core/configuration_spec.rb

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2602,6 +2602,49 @@ def use_seed_on(registry)
26022602
expect(ordering_strategy.order(list)).to eq([1, 2, 3, 4])
26032603
end
26042604
end
2605+
2606+
context 'given a custom ordering strategy' do
2607+
before do
2608+
allow(RSpec).to receive_messages(:configuration => config)
2609+
end
2610+
2611+
it 'will lookup a previously registed ordering strategy' do
2612+
config.register_ordering(:custom_scheme) { |list| list.reverse }
2613+
2614+
config.order = :custom_scheme
2615+
2616+
strategy = config.ordering_registry.fetch(:global)
2617+
expect(strategy.order([1, 2, 3, 4])).to eq [4, 3, 2, 1]
2618+
end
2619+
2620+
it 'will defer lookup until running' do
2621+
config.order = :custom_scheme
2622+
2623+
strategy = config.ordering_registry.fetch(:global)
2624+
expect(strategy).to be_an_instance_of(Ordering::Delayed)
2625+
2626+
config.register_ordering(:custom_scheme) { |list| list.reverse }
2627+
expect(strategy.order([1, 2, 3, 4])).to eq [4, 3, 2, 1]
2628+
end
2629+
2630+
it 'will raise an error if ordering is not present when needed' do
2631+
config.order = :custom_scheme
2632+
2633+
strategy = config.ordering_registry.fetch(:global)
2634+
expect(strategy).to be_an_instance_of(Ordering::Delayed)
2635+
2636+
expect { strategy.order([1, 2, 3, 4]) }.to raise_error("Undefined ordering strategy :custom_scheme")
2637+
end
2638+
2639+
it 'will lookup schemes as symbols even if given as strings' do
2640+
config.order = 'custom_scheme'
2641+
2642+
config.register_ordering(:custom_scheme) { |list| list.reverse }
2643+
2644+
strategy = config.ordering_registry.fetch(:global)
2645+
expect(strategy.order([1, 2, 3, 4])).to eq [4, 3, 2, 1]
2646+
end
2647+
end
26052648
end
26062649

26072650
describe "#register_ordering" do

0 commit comments

Comments
 (0)