pact_broker 2.39.0 → 2.40.0
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 +4 -4
- data/CHANGELOG.md +24 -0
- data/db/ddl_statements/latest_verification_ids_for_consumer_version_tags.rb +38 -0
- data/db/migrations/20180523_create_latest_verifications_for_consumer_version_tags.rb +3 -17
- data/db/migrations/20191025_optimise_latest_verification_ids_for_cv_tags.rb +11 -0
- data/lib/pact_broker/domain/pact.rb +1 -1
- data/lib/pact_broker/domain/verification.rb +0 -6
- data/lib/pact_broker/matrix/quick_row.rb +1 -1
- data/lib/pact_broker/matrix/row.rb +1 -1
- data/lib/pact_broker/ui/controllers/matrix.rb +1 -1
- data/lib/pact_broker/ui/view_models/index_item.rb +3 -3
- data/lib/pact_broker/ui/view_models/matrix_line.rb +29 -29
- data/lib/pact_broker/verifications/repository.rb +18 -10
- data/lib/pact_broker/version.rb +1 -1
- data/spec/lib/pact_broker/pacts/diff_spec.rb +2 -2
- data/spec/lib/pact_broker/ui/view_models/index_item_spec.rb +3 -3
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9640609d3cd63f00f72cd919503c9753e7f14901
|
4
|
+
data.tar.gz: c538742c6e384659661609b059e24ca1c5732ae2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9a6918c28db99e46a2c28c6ac608aadec4efe8780369328956a8617bd1f17dd3bb8899c80f0e597920d0005e9856e0cce56303f108df98240d32556808f1fd46
|
7
|
+
data.tar.gz: 99cc9f3892e31cd11c449de7f4da9469f70d96df2ec6501df37225f3d98b5068ac71fbf42e1f359e5acbe7c29f572aa2d6baaa066a180c3ffa65fea29e777979
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,27 @@
|
|
1
|
+
<a name="v2.40.0"></a>
|
2
|
+
### v2.40.0 (2019-10-26)
|
3
|
+
|
4
|
+
|
5
|
+
#### Features
|
6
|
+
|
7
|
+
* **matrix**
|
8
|
+
* default page to showing 'latest by consumer version and provider' as it is much quicker and less confusing. ([dd879250](/../../commit/dd879250))
|
9
|
+
|
10
|
+
* optimise query to find latest verification for consumer version tag ([301b30ca](/../../commit/301b30ca))
|
11
|
+
|
12
|
+
* **matrix badge**
|
13
|
+
* optimise database query ([2b7f8e23](/../../commit/2b7f8e23))
|
14
|
+
|
15
|
+
|
16
|
+
#### Bug Fixes
|
17
|
+
|
18
|
+
* **matrix**
|
19
|
+
* exceptions on matrix page due to recent query optimisation ([3c504ba5](/../../commit/3c504ba5))
|
20
|
+
|
21
|
+
* **frontend**
|
22
|
+
* remove 'v' prefix on versions during render (#313) ([e109a8cd](/../../commit/e109a8cd))
|
23
|
+
|
24
|
+
|
1
25
|
<a name="v2.39.0"></a>
|
2
26
|
### v2.39.0 (2019-10-21)
|
3
27
|
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# The latest verification id for each consumer version tag
|
2
|
+
# This is not:
|
3
|
+
# find latest pacticipant version with given tag
|
4
|
+
# -> find the latest pact
|
5
|
+
# -> find the latest verification
|
6
|
+
# because the latest pacticipant version with the tag might not have a pact,
|
7
|
+
# and the latest pact might not have a verification.
|
8
|
+
|
9
|
+
# This is:
|
10
|
+
# join the tags and the pacticipant versions and the verifications and find the "latest" row
|
11
|
+
|
12
|
+
LATEST_VERIFICATION_IDS_FOR_CONSUMER_VERSION_TAGS_V1 = "select
|
13
|
+
pv.pacticipant_id as provider_id,
|
14
|
+
lpp.consumer_id,
|
15
|
+
t.name as consumer_version_tag_name,
|
16
|
+
max(v.id) as latest_verification_id
|
17
|
+
from verifications v
|
18
|
+
join latest_pact_publications_by_consumer_versions lpp
|
19
|
+
on v.pact_version_id = lpp.pact_version_id
|
20
|
+
join tags t
|
21
|
+
on lpp.consumer_version_id = t.version_id
|
22
|
+
join versions pv
|
23
|
+
on v.provider_version_id = pv.id
|
24
|
+
group by pv.pacticipant_id, lpp.consumer_id, t.name"
|
25
|
+
|
26
|
+
LATEST_VERIFICATION_IDS_FOR_CONSUMER_VERSION_TAGS_V2 = "select
|
27
|
+
pv.pacticipant_id as provider_id,
|
28
|
+
lpp.consumer_id,
|
29
|
+
t.name as consumer_version_tag_name,
|
30
|
+
max(v.id) as latest_verification_id
|
31
|
+
from verifications v
|
32
|
+
join latest_pact_publication_ids_for_consumer_versions lpp
|
33
|
+
on v.pact_version_id = lpp.pact_version_id
|
34
|
+
join tags t
|
35
|
+
on lpp.consumer_version_id = t.version_id
|
36
|
+
join versions pv
|
37
|
+
on v.provider_version_id = pv.id
|
38
|
+
group by pv.pacticipant_id, lpp.consumer_id, t.name"
|
@@ -1,22 +1,8 @@
|
|
1
|
+
require_relative '../ddl_statements'
|
2
|
+
|
1
3
|
Sequel.migration do
|
2
4
|
up do
|
3
|
-
|
4
|
-
# This is not the latest verification for the latest pact with a given tag,
|
5
|
-
# this is the latest verification for any pact with the tag
|
6
|
-
create_view(:latest_verification_ids_for_consumer_version_tags,
|
7
|
-
"select
|
8
|
-
pv.pacticipant_id as provider_id,
|
9
|
-
lpp.consumer_id,
|
10
|
-
t.name as consumer_version_tag_name,
|
11
|
-
max(v.id) as latest_verification_id
|
12
|
-
from verifications v
|
13
|
-
join latest_pact_publications_by_consumer_versions lpp
|
14
|
-
on v.pact_version_id = lpp.pact_version_id
|
15
|
-
join tags t
|
16
|
-
on lpp.consumer_version_id = t.version_id
|
17
|
-
join versions pv
|
18
|
-
on v.provider_version_id = pv.id
|
19
|
-
group by pv.pacticipant_id, lpp.consumer_id, t.name")
|
5
|
+
create_view(:latest_verification_ids_for_consumer_version_tags, LATEST_VERIFICATION_IDS_FOR_CONSUMER_VERSION_TAGS_V1)
|
20
6
|
|
21
7
|
# The most recent verification for each consumer/consumer version tag/provider
|
22
8
|
latest_verifications = from(:verifications)
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require_relative '../ddl_statements'
|
2
|
+
|
3
|
+
Sequel.migration do
|
4
|
+
up do
|
5
|
+
create_or_replace_view(:latest_verification_ids_for_consumer_version_tags, LATEST_VERIFICATION_IDS_FOR_CONSUMER_VERSION_TAGS_V2)
|
6
|
+
end
|
7
|
+
|
8
|
+
down do
|
9
|
+
create_or_replace_view(:latest_verification_ids_for_consumer_version_tags, LATEST_VERIFICATION_IDS_FOR_CONSUMER_VERSION_TAGS_V1)
|
10
|
+
end
|
11
|
+
end
|
@@ -58,12 +58,6 @@ module PactBroker
|
|
58
58
|
.left_outer_join(:tags, {version_id: :consumer_version_id})
|
59
59
|
.where(Sequel.qualify(:tags, :name) => nil)
|
60
60
|
end
|
61
|
-
|
62
|
-
def provider_version_tag tag_name
|
63
|
-
filter = name_like(Sequel.qualify(:ptags, :name), tag_name)
|
64
|
-
join_params = { Sequel[:ptags][:version_id] => Sequel[model.table_name][:provider_version_id] }
|
65
|
-
join(:tags, join_params, {table_alias: :ptags}).where(filter)
|
66
|
-
end
|
67
61
|
end
|
68
62
|
|
69
63
|
def pact_version_sha
|
@@ -215,7 +215,7 @@ module PactBroker
|
|
215
215
|
end
|
216
216
|
|
217
217
|
def to_s
|
218
|
-
"#{consumer_name}
|
218
|
+
"#{consumer_name} #{consumer_version_number} #{provider_name} #{provider_version_number} #{success}"
|
219
219
|
end
|
220
220
|
|
221
221
|
def compare_number_desc number1, number2
|
@@ -42,7 +42,7 @@ module PactBroker
|
|
42
42
|
|
43
43
|
get "/provider/:provider_name/consumer/:consumer_name" do
|
44
44
|
selectors = [{ pacticipant_name: params[:consumer_name] }, { pacticipant_name: params[:provider_name] } ]
|
45
|
-
options = {latestby:
|
45
|
+
options = {latestby: 'cvpv', limit: 100}
|
46
46
|
lines = matrix_service.find(selectors, options)
|
47
47
|
lines = PactBroker::UI::ViewDomain::MatrixLines.new(lines)
|
48
48
|
locals = {
|
@@ -151,11 +151,11 @@ module PactBroker
|
|
151
151
|
def verification_tooltip
|
152
152
|
case @relationship.pseudo_branch_verification_status
|
153
153
|
when :success
|
154
|
-
"Successfully verified by #{provider_name} (
|
154
|
+
"Successfully verified by #{provider_name} (#{short_version_number(@relationship.latest_verification_provider_version_number)})"
|
155
155
|
when :stale
|
156
|
-
"Pact has changed since last successful verification by #{provider_name} (
|
156
|
+
"Pact has changed since last successful verification by #{provider_name} (#{short_version_number(@relationship.latest_verification_provider_version_number)})"
|
157
157
|
when :failed
|
158
|
-
"Verification by #{provider_name} (
|
158
|
+
"Verification by #{provider_name} (#{short_version_number(@relationship.latest_verification_provider_version_number)}) failed"
|
159
159
|
else
|
160
160
|
nil
|
161
161
|
end
|
@@ -17,7 +17,7 @@ module PactBroker
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def provider_name
|
20
|
-
@line
|
20
|
+
@line.provider_name
|
21
21
|
end
|
22
22
|
|
23
23
|
def provider_name_url
|
@@ -25,7 +25,7 @@ module PactBroker
|
|
25
25
|
end
|
26
26
|
|
27
27
|
def consumer_name
|
28
|
-
@line
|
28
|
+
@line.consumer_name
|
29
29
|
end
|
30
30
|
|
31
31
|
def consumer_name_url
|
@@ -33,24 +33,24 @@ module PactBroker
|
|
33
33
|
end
|
34
34
|
|
35
35
|
def pact_version_sha
|
36
|
-
@line
|
36
|
+
@line.pact_version_sha
|
37
37
|
end
|
38
38
|
|
39
39
|
# verification number, used in verification_url method
|
40
40
|
def number
|
41
|
-
@line
|
41
|
+
@line.verification_number
|
42
42
|
end
|
43
43
|
|
44
44
|
def pact_revision_number
|
45
|
-
@line
|
45
|
+
@line.pact_revision_number
|
46
46
|
end
|
47
47
|
|
48
48
|
def consumer_name
|
49
|
-
@line
|
49
|
+
@line.consumer_name
|
50
50
|
end
|
51
51
|
|
52
52
|
def consumer_version_number
|
53
|
-
@line
|
53
|
+
@line.consumer_version_number
|
54
54
|
end
|
55
55
|
|
56
56
|
def display_consumer_version_number
|
@@ -63,15 +63,15 @@ module PactBroker
|
|
63
63
|
end
|
64
64
|
|
65
65
|
def consumer_version_order
|
66
|
-
@line
|
66
|
+
@line.consumer_version_order
|
67
67
|
end
|
68
68
|
|
69
69
|
def provider_name
|
70
|
-
@line
|
70
|
+
@line.provider_name
|
71
71
|
end
|
72
72
|
|
73
73
|
def provider_version_number
|
74
|
-
@line
|
74
|
+
@line.provider_version_number
|
75
75
|
end
|
76
76
|
|
77
77
|
def display_provider_version_number
|
@@ -79,7 +79,7 @@ module PactBroker
|
|
79
79
|
end
|
80
80
|
|
81
81
|
def provider_version_order
|
82
|
-
@line
|
82
|
+
@line.provider_version_order
|
83
83
|
end
|
84
84
|
|
85
85
|
def provider_version_number_url
|
@@ -88,39 +88,39 @@ module PactBroker
|
|
88
88
|
end
|
89
89
|
|
90
90
|
def provider_version_order
|
91
|
-
if @line
|
92
|
-
@line
|
91
|
+
if @line.verification_executed_at
|
92
|
+
@line.verification_executed_at.to_time.to_i
|
93
93
|
else
|
94
94
|
0
|
95
95
|
end
|
96
96
|
end
|
97
97
|
|
98
98
|
def latest_consumer_version_tags
|
99
|
-
@line
|
100
|
-
.select{ | tag | tag
|
99
|
+
@line.consumer_version_tags
|
100
|
+
.select{ | tag | tag.latest }
|
101
101
|
.collect{ | tag | MatrixTag.new(tag.to_hash.merge(pacticipant_name: consumer_name, version_number: consumer_version_number)) }
|
102
102
|
end
|
103
103
|
|
104
104
|
def other_consumer_version_tags
|
105
|
-
@line
|
106
|
-
.select{ | tag | !tag
|
105
|
+
@line.consumer_version_tags
|
106
|
+
.select{ | tag | !tag.latest }
|
107
107
|
.collect{ | tag | MatrixTag.new(tag.to_hash.merge(pacticipant_name: consumer_name, version_number: consumer_version_number)) }
|
108
108
|
end
|
109
109
|
|
110
110
|
def latest_provider_version_tags
|
111
|
-
@line
|
112
|
-
.select{ | tag | tag
|
111
|
+
@line.provider_version_tags
|
112
|
+
.select{ | tag | tag.latest }
|
113
113
|
.collect{ | tag | MatrixTag.new(tag.to_hash.merge(pacticipant_name: provider_name, version_number: provider_version_number)) }
|
114
114
|
end
|
115
115
|
|
116
116
|
def other_provider_version_tags
|
117
|
-
@line
|
118
|
-
.select{ | tag | !tag
|
117
|
+
@line.provider_version_tags
|
118
|
+
.select{ | tag | !tag.latest }
|
119
119
|
.collect{ | tag | MatrixTag.new(tag.to_hash.merge(pacticipant_name: provider_name, version_number: provider_version_number)) }
|
120
120
|
end
|
121
121
|
|
122
122
|
def orderable_fields
|
123
|
-
[consumer_name, consumer_version_order, pact_revision_number, provider_name, @line
|
123
|
+
[consumer_name, consumer_version_order, pact_revision_number, provider_name, @line.verification_id]
|
124
124
|
end
|
125
125
|
|
126
126
|
def <=> other
|
@@ -128,12 +128,12 @@ module PactBroker
|
|
128
128
|
end
|
129
129
|
|
130
130
|
def pseudo_branch_verification_status
|
131
|
-
if @line
|
132
|
-
DateHelper.distance_of_time_in_words(@line
|
131
|
+
if @line.verification_executed_at
|
132
|
+
DateHelper.distance_of_time_in_words(@line.verification_executed_at, DateTime.now) + " ago"
|
133
133
|
else
|
134
134
|
''
|
135
135
|
end
|
136
|
-
# case @line
|
136
|
+
# case @line.success
|
137
137
|
# when true then "Verified"
|
138
138
|
# when false then "Failed"
|
139
139
|
# else ''
|
@@ -145,7 +145,7 @@ module PactBroker
|
|
145
145
|
end
|
146
146
|
|
147
147
|
def pact_publication_date
|
148
|
-
relative_date(@line
|
148
|
+
relative_date(@line.pact_created_at)
|
149
149
|
end
|
150
150
|
|
151
151
|
def pact_publication_date_url
|
@@ -157,11 +157,11 @@ module PactBroker
|
|
157
157
|
end
|
158
158
|
|
159
159
|
def pact_published_order
|
160
|
-
@line
|
160
|
+
@line.pact_created_at.to_time.to_i
|
161
161
|
end
|
162
162
|
|
163
163
|
def verification_status_class
|
164
|
-
case @line
|
164
|
+
case @line.success
|
165
165
|
when true then 'success'
|
166
166
|
when false then 'danger'
|
167
167
|
else ''
|
@@ -177,7 +177,7 @@ module PactBroker
|
|
177
177
|
end
|
178
178
|
|
179
179
|
def inherited_verification_message
|
180
|
-
if @line
|
180
|
+
if @line.verification_executed_at && @line.pact_created_at > @line.verification_executed_at
|
181
181
|
"The verification date is before the pact publication date because this verification has been inherited from a previously verified pact with identical content."
|
182
182
|
end
|
183
183
|
end
|
@@ -101,19 +101,27 @@ module PactBroker
|
|
101
101
|
end
|
102
102
|
|
103
103
|
def find_latest_verification_for_tags consumer_name, provider_name, consumer_version_tag, provider_version_tag
|
104
|
-
view_name = PactBroker::
|
105
|
-
|
104
|
+
view_name = PactBroker::Domain::Verification.table_name
|
105
|
+
consumer = pacticipant_repository.find_by_name(consumer_name)
|
106
|
+
provider = pacticipant_repository.find_by_name(provider_name)
|
107
|
+
|
108
|
+
consumer_tag_filter = PactBroker::Repositories::Helpers.name_like(Sequel.qualify(:consumer_tags, :name), consumer_version_tag)
|
109
|
+
provider_tag_filter = PactBroker::Repositories::Helpers.name_like(Sequel.qualify(:provider_tags, :name), provider_version_tag)
|
110
|
+
|
111
|
+
query = PactBroker::Domain::Verification
|
106
112
|
.select_all_qualified
|
107
|
-
.join(:versions, {Sequel[:provider_versions][:id] => Sequel[view_name][:provider_version_id]}, {table_alias: :provider_versions})
|
108
|
-
.join(:
|
109
|
-
.
|
110
|
-
.
|
111
|
-
.
|
112
|
-
.
|
113
|
+
.join(:versions, { Sequel[:provider_versions][:id] => Sequel[view_name][:provider_version_id] }, { table_alias: :provider_versions })
|
114
|
+
.join(:latest_verification_id_for_pact_version_and_provider_version, { Sequel[:lv][:verification_id] => Sequel[view_name][:id] }, { table_alias: :lv })
|
115
|
+
.join(:latest_pact_publication_ids_for_consumer_versions, { Sequel[view_name][:pact_version_id] => Sequel[:lp][:pact_version_id] }, { table_alias: :lp })
|
116
|
+
.join(:versions, { Sequel[:consumer_versions][:id] => Sequel[:lp][:consumer_version_id] }, { table_alias: :consumer_versions })
|
117
|
+
.join(:tags, { Sequel[:consumer_tags][:version_id] => Sequel[:lp][:consumer_version_id]}, { table_alias: :consumer_tags })
|
118
|
+
.join(:tags, { Sequel[:provider_tags][:version_id] => Sequel[view_name][:provider_version_id]}, { table_alias: :provider_tags })
|
119
|
+
.where(consumer: consumer, provider: provider)
|
120
|
+
.where(consumer_tag_filter)
|
121
|
+
.where(provider_tag_filter)
|
113
122
|
|
114
123
|
query.reverse_order(
|
115
|
-
Sequel[:
|
116
|
-
Sequel[:latest_pact_publications_by_consumer_versions][:revision_number],
|
124
|
+
Sequel[:consumer_versions][:order],
|
117
125
|
Sequel[:provider_versions][:order],
|
118
126
|
Sequel[view_name][:execution_date]
|
119
127
|
).limit(1).single_record
|
data/lib/pact_broker/version.rb
CHANGED
@@ -59,8 +59,8 @@ module PactBroker
|
|
59
59
|
subject { Diff.new.process(pact_params.merge(base_url: 'http://example.org'), comparison_pact_params) }
|
60
60
|
|
61
61
|
it "compares the two pacts" do
|
62
|
-
expect(subject).to include "Pact between Consumer (
|
63
|
-
expect(subject).to include "Pact between Consumer (
|
62
|
+
expect(subject).to include "Pact between Consumer (3) and Provider"
|
63
|
+
expect(subject).to include "Pact between Consumer (4) and Provider"
|
64
64
|
end
|
65
65
|
|
66
66
|
it "includes a link to the comparison pact", pending: true do
|
@@ -52,21 +52,21 @@ module PactBroker
|
|
52
52
|
let(:pseudo_branch_verification_status) { :stale }
|
53
53
|
its(:pseudo_branch_verification_status) { is_expected.to eq "warning" }
|
54
54
|
its(:warning?) { is_expected.to be true }
|
55
|
-
its(:verification_tooltip) { is_expected.to eq "Pact has changed since last successful verification by Foo (
|
55
|
+
its(:verification_tooltip) { is_expected.to eq "Pact has changed since last successful verification by Foo (4.5.6)" }
|
56
56
|
end
|
57
57
|
|
58
58
|
context "when the pact has not changed since the last successful verification" do
|
59
59
|
let(:pseudo_branch_verification_status) { :success }
|
60
60
|
its(:pseudo_branch_verification_status) { is_expected.to eq "success" }
|
61
61
|
its(:warning?) { is_expected.to be false }
|
62
|
-
its(:verification_tooltip) { is_expected.to eq "Successfully verified by Foo (
|
62
|
+
its(:verification_tooltip) { is_expected.to eq "Successfully verified by Foo (4.5.6)" }
|
63
63
|
end
|
64
64
|
|
65
65
|
context "when the pact verification failed" do
|
66
66
|
let(:pseudo_branch_verification_status) { :failed }
|
67
67
|
its(:pseudo_branch_verification_status) { is_expected.to eq "danger" }
|
68
68
|
its(:warning?) { is_expected.to be false }
|
69
|
-
its(:verification_tooltip) { is_expected.to eq "Verification by Foo (
|
69
|
+
its(:verification_tooltip) { is_expected.to eq "Verification by Foo (4.5.6) failed" }
|
70
70
|
end
|
71
71
|
end
|
72
72
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pact_broker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.40.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bethany Skurrie
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2019-10-
|
13
|
+
date: 2019-10-25 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: httparty
|
@@ -610,6 +610,7 @@ files:
|
|
610
610
|
- db/ddl_statements.rb
|
611
611
|
- db/ddl_statements/head_matrix_v001.rb
|
612
612
|
- db/ddl_statements/head_matrix_v002.rb
|
613
|
+
- db/ddl_statements/latest_verification_ids_for_consumer_version_tags.rb
|
613
614
|
- db/ddl_statements/latest_verification_ids_for_pact_versions_v001.rb
|
614
615
|
- db/migrations/000001_create_pacticipant_table.rb
|
615
616
|
- db/migrations/000002_create_versions_table.rb
|
@@ -717,6 +718,7 @@ files:
|
|
717
718
|
- db/migrations/20190909_add_test_results_to_all_verifications.rb
|
718
719
|
- db/migrations/20190910_add_test_results_to_latest_verifications.rb
|
719
720
|
- db/migrations/20190911_add_test_results_to_latest_verifications_for_pact_versions.rb
|
721
|
+
- db/migrations/20191025_optimise_latest_verification_ids_for_cv_tags.rb
|
720
722
|
- db/migrations/migration_helper.rb
|
721
723
|
- db/test/backwards_compatibility/.rspec
|
722
724
|
- db/test/backwards_compatibility/Appraisals
|