diff options
Diffstat (limited to 'spec/factories/go_module_versions.rb')
-rw-r--r-- | spec/factories/go_module_versions.rb | 77 |
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 |