Skip to content

Commit 3daee42

Browse files
authored
Merge pull request #251 from sensu/issue_249
Issue 249 continued
2 parents 80433a2 + c0c23a8 commit 3daee42

File tree

2 files changed

+34
-16
lines changed

2 files changed

+34
-16
lines changed

app/models/extension.rb

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -177,13 +177,26 @@ def self.total_download_count
177177
def sorted_extension_versions
178178
# ignore preceding 'V' and ignore 'master' so it sorts to end
179179
# convert version to array of integers so 10.0.0 comes after 9.0.0
180-
# TODO: temporary rescue for regex issue on postgres - plux sign not escaping properly
181-
@sorted_extension_versions ||=
182-
begin
183-
extension_versions.order(Arel.sql("STRING_TO_ARRAY( REGEXP_REPLACE(extension_versions.version, E'V|v|master|[\+]|-(.*)', ''), '.')::int[] DESC"))
184-
rescue
185-
extension_versions.order(Arel.sql("STRING_TO_ARRAY(extension_versions.version, '.') DESC"))
186-
end
180+
181+
# Hack for regex issue on postgres - plus sign not escaping properly
182+
@sorted_extension_versions = extension_versions.order(Arel.sql(
183+
"STRING_TO_ARRAY(
184+
REGEXP_REPLACE(
185+
REGEXP_REPLACE(
186+
REGEXP_REPLACE(
187+
extension_versions.version,
188+
E'[-](.*)', ''
189+
),
190+
E'[\+](.*)', ''
191+
),
192+
E'V|v|master', ''
193+
)
194+
, '.')::bigint[] DESC "))
195+
196+
@sorted_extension_versions.limit(1).map(&:id) # executes query to test postgres regex
197+
@sorted_extension_versions
198+
rescue ActiveRecord::StatementInvalid => error
199+
@sorted_extension_versions = extension_versions.order(Arel.sql("STRING_TO_ARRAY(extension_versions.version, '.') DESC"))
187200
end
188201

189202
#

spec/models/extension_spec.rb

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -43,18 +43,23 @@
4343
end
4444

4545
describe "sorted_extension_versions" do
46-
let(:extension) { create(:extension, extension_versions_count: 4) }
47-
let(:versions) { extension.extension_versions }
46+
let(:extension) { create(:extension, extension_versions_count: 6) }
47+
let(:versions ) { extension.extension_versions }
48+
let(:sorted_versions) { extension.sorted_extension_versions }
49+
4850
it 'returns sorted versions' do
49-
expect(versions.first.version).to be < versions.second.version
51+
expect(sorted_versions.first.version).to be > sorted_versions.second.version
5052
end
5153
it 'sorts semvar versions with prerelease last' do
52-
version_1 = versions.first.update(version: '0.0.1-1+jef.1')
53-
version_2 = versions.second.update(version: '1.0.0-alpha+001')
54-
version_3 = versions.third.update(version: '1.0.0-beta+exp.sha.5114f85')
55-
version_4 = versions.fourth
56-
versions.reload
57-
expect(versions.first.version).to eq(version_4.version)
54+
versions[0].update(version: '0.0.1-1+jef.1')
55+
versions[1].update(version: '1.0.0-alpha+001')
56+
versions[2].update(version: '1.0.0-beta+exp.sha.5114f85')
57+
versions[3].update(version: '1.0.0+20130313144700')
58+
versions[4].update(version: 'master')
59+
version_5 = versions[5].version
60+
sorted_versions.reload
61+
puts sorted_versions.map(&:version) #{|v| v.version.gsub(/V|v|master|\+(.*)|-(.*)/, '')}
62+
expect(sorted_versions.first.version).to eq(version_5)
5863
end
5964
end
6065

0 commit comments

Comments
 (0)