Skip to content

Commit bc45749

Browse files
committed
feat(clean): allow a maximum age to be specified for the versions to keep
1 parent 22f12f1 commit bc45749

File tree

4 files changed

+97
-16
lines changed

4 files changed

+97
-16
lines changed

lib/pact_broker/domain/version.rb

+23-9
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,11 @@ def where_number(number)
3939
where(name_like(:number, number))
4040
end
4141

42+
def where_age_less_than(days)
43+
start_date = Date.today - days
44+
where{ versions[:created_at] >= start_date }
45+
end
46+
4247
def delete
4348
PactBroker::Domain::Tag.where(version: self).delete
4449
super
@@ -49,20 +54,29 @@ def for_selector(selector)
4954
query = query.where_pacticipant_name(selector.pacticipant_name) if selector.pacticipant_name
5055
query = query.where_tag(selector.tag) if selector.tag
5156
query = query.where_number(selector.pacticipant_version_number) if selector.pacticipant_version_number
52-
if selector.latest
53-
join = {
54-
Sequel[:versions][:pacticipant_id] => Sequel[:latest][:pacticipant_id],
55-
Sequel[:versions][:order] => Sequel[:latest][:latest_version_order]
56-
}
57+
query = query.where_age_less_than(selector.max_age) if selector.max_age
5758

58-
max_order_for_each_pacticipant = query.select_group(:pacticipant_id)
59-
.select_append{ max(order).as(latest_version_order) }
60-
61-
join(max_order_for_each_pacticipant, join, { table_alias: :latest })
59+
if selector.latest
60+
select_max_order_for_each_pacticipant_and_join_back_to_versions(query)
6261
else
6362
query
6463
end
6564
end
65+
66+
# private
67+
68+
def select_max_order_for_each_pacticipant_and_join_back_to_versions(query)
69+
join = {
70+
Sequel[:versions][:pacticipant_id] => Sequel[:latest][:pacticipant_id],
71+
Sequel[:versions][:order] => Sequel[:latest][:latest_version_order]
72+
}
73+
74+
max_order_for_each_pacticipant = query
75+
.select_group(:pacticipant_id)
76+
.select_append{ max(order).as(latest_version_order) }
77+
78+
join(max_order_for_each_pacticipant, join, table_alias: :latest)
79+
end
6680
end
6781

6882
def after_create

lib/pact_broker/matrix/unresolved_selector.rb

+8
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,14 @@ def pacticipant_name= pacticipant_name
4040
def pacticipant_version_number= pacticipant_version_number
4141
self[:pacticipant_version_number] = pacticipant_version_number
4242
end
43+
44+
def max_age= max_age
45+
self[:max_age] = max_age
46+
end
47+
48+
def max_age
49+
self[:max_age]
50+
end
4351
end
4452
end
4553
end

lib/pact_broker/test/test_data_builder.rb

+17-1
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ def create_consumer_version version_number = "1.0.#{model_counter}", params = {}
150150
params.delete(:comment)
151151
tag_names = [params.delete(:tag_names), params.delete(:tag_name)].flatten.compact
152152
@consumer_version = PactBroker::Domain::Version.create(:number => version_number, :pacticipant => @consumer)
153+
set_created_at_if_set params[:created_at], :versions, { id: @consumer_version.id }
153154
tag_names.each do | tag_name |
154155
PactBroker::Domain::Tag.create(name: tag_name, version: @consumer_version)
155156
end
@@ -354,7 +355,7 @@ def and_return instance_variable_name
354355
end
355356

356357
def set_now date
357-
@now = date
358+
@now = date.to_date
358359
self
359360
end
360361

@@ -363,6 +364,21 @@ def add_day
363364
self
364365
end
365366

367+
def add_days(days = 1)
368+
@now = @now + days
369+
self
370+
end
371+
372+
def subtract_day
373+
@now = @now - 1
374+
self
375+
end
376+
377+
def subtract_days(days = 1)
378+
@now = @now - days
379+
self
380+
end
381+
366382
def add_minute
367383
@now = @now + (1.0/(24*60))
368384
self

spec/lib/pact_broker/domain/version_spec.rb

+49-6
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,14 @@ module Domain
77
describe "for_selector" do
88
subject { Version.for_selector(selector).all }
99

10+
def find_version(number)
11+
subject.find{ |v| v.number == number }
12+
end
13+
14+
def version_numbers
15+
subject.collect(&:number)
16+
end
17+
1018
context "when selecting the latest prod versions without a pacticipant name" do
1119
before do
1220
td.create_consumer("Foo")
@@ -20,13 +28,11 @@ module Domain
2028
let(:selector) { PactBroker::Matrix::UnresolvedSelector.new(tag: 'prod', latest: true) }
2129

2230
it "returns the latest prod version for each pacticipant" do
23-
expect(subject.size).to eq 2
24-
expect(subject.find{ |v| v.number == '2'}).to_not be nil
25-
expect(subject.find{ |v| v.number == '11'}).to_not be nil
31+
expect(version_numbers).to eq %w{2 11}
2632
end
2733
end
2834

29-
context "when selecting the latest prod versions without a pacticipant name" do
35+
context "when selecting the latest prod versions with a pacticipant name" do
3036
before do
3137
td.create_consumer("Foo")
3238
.create_consumer_version("1", tag_names: %w{prod})
@@ -40,8 +46,45 @@ module Domain
4046

4147

4248
it "returns the latest prod version for Foo" do
43-
expect(subject.size).to eq 1
44-
expect(subject.find{ |v| v.number == '2'}).to_not be nil
49+
expect(version_numbers).to eq %w{2}
50+
end
51+
end
52+
53+
context "when selecting all prod versions without a pacticipant name" do
54+
before do
55+
td.create_consumer("Foo")
56+
.create_consumer_version("1", tag_names: %w{prod})
57+
.create_consumer_version("2", tag_names: %w{prod})
58+
.create_consumer("Bar")
59+
.create_consumer_version("10", tag_names: %w{prod})
60+
.create_consumer_version("11", tag_names: %w{prod master})
61+
.create_consumer_version("12", tag_names: %w{master})
62+
end
63+
64+
let(:selector) { PactBroker::Matrix::UnresolvedSelector.new(tag: 'prod') }
65+
66+
it "selects all the production versions without a pacticipant name" do
67+
expect(version_numbers).to eq %w{1 2 10 11}
68+
end
69+
end
70+
71+
context "when selecting all versions for a tag with max age" do
72+
before do
73+
td.set_now(four_days_ago)
74+
.create_consumer("Foo")
75+
.create_consumer_version("1", tag_names: %w{master})
76+
.add_days(1)
77+
.create_consumer_version("2", tag_names: %w{master})
78+
.create_consumer_version("3", tag_names: %w{master})
79+
end
80+
81+
let(:selector) { PactBroker::Matrix::UnresolvedSelector.new(tag: 'master', max_age: max_age) }
82+
83+
let(:max_age) { 3 }
84+
let(:four_days_ago) { Date.today - 4 }
85+
86+
it "selects the consumer versions younger than the max age" do
87+
expect(version_numbers.sort).to eq %w{2 3}
4588
end
4689
end
4790
end

0 commit comments

Comments
 (0)