Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'spec/factories/go_module_versions.rb')
-rw-r--r--spec/factories/go_module_versions.rb77
1 files changed, 77 insertions, 0 deletions
diff --git a/spec/factories/go_module_versions.rb b/spec/factories/go_module_versions.rb
new file mode 100644
index 00000000000..b0a96197350
--- /dev/null
+++ b/spec/factories/go_module_versions.rb
@@ -0,0 +1,77 @@
+# frozen_string_literal: true
+
+FactoryBot.define do
+ factory :go_module_version, class: 'Packages::Go::ModuleVersion' do
+ skip_create
+
+ initialize_with do
+ p = attributes[:params]
+ s = Packages::SemVer.parse(p.semver, prefixed: true)
+
+ raise ArgumentError.new("invalid sematic version: '#{p.semver}''") if !s && p.semver
+
+ new(p.mod, p.type, p.commit, name: p.name, semver: s, ref: p.ref)
+ end
+
+ mod { create :go_module }
+ type { :commit }
+ commit { mod.project.repository.head_commit }
+ name { nil }
+ semver { nil }
+ ref { nil }
+
+ params { OpenStruct.new(mod: mod, type: type, commit: commit, name: name, semver: semver, ref: ref) }
+
+ trait :tagged do
+ ref { mod.project.repository.find_tag(name) }
+ commit { ref.dereferenced_target }
+ name do
+ # This provides a sane default value, but in reality the caller should
+ # specify `name:`
+
+ # Find 'latest' semver tag (does not actually use semver precedence rules)
+ mod.project.repository.tags
+ .filter { |t| Packages::SemVer.match?(t.name, prefixed: true) }
+ .map { |t| Packages::SemVer.parse(t.name, prefixed: true) }
+ .max { |a, b| "#{a}" <=> "#{b}" }
+ .to_s
+ end
+
+ params { OpenStruct.new(mod: mod, type: :ref, commit: commit, semver: name, ref: ref) }
+ end
+
+ trait :pseudo do
+ transient do
+ prefix do
+ # This provides a sane default value, but in reality the caller should
+ # specify `prefix:`
+
+ # This does not take into account that `commit` may be before the
+ # latest tag.
+
+ # Find 'latest' semver tag (does not actually use semver precedence rules)
+ v = mod.project.repository.tags
+ .filter { |t| Packages::SemVer.match?(t.name, prefixed: true) }
+ .map { |t| Packages::SemVer.parse(t.name, prefixed: true) }
+ .max { |a, b| "#{a}" <=> "#{b}" }
+
+ # Default if no semver tags exist
+ next 'v0.0.0' unless v
+
+ # Valid pseudo-versions are:
+ # vX.0.0-yyyymmddhhmmss-sha1337beef0, when no earlier tagged commit exists for X
+ # vX.Y.Z-pre.0.yyyymmddhhmmss-sha1337beef0, when most recent prior tag is vX.Y.Z-pre
+ # vX.Y.(Z+1)-0.yyyymmddhhmmss-sha1337beef0, when most recent prior tag is vX.Y.Z
+
+ v = v.with(patch: v.patch + 1) unless v.prerelease
+ "#{v}.0"
+ end
+ end
+
+ type { :pseudo }
+ name { "#{prefix}#{commit.committed_date.strftime('%Y%m%d%H%M%S')}-#{commit.sha[0..11]}" }
+
+ params { OpenStruct.new(mod: mod, type: :pseudo, commit: commit, name: name, semver: name) }
+ end
+ end
+end