Module: QB::Package::Version::From

Defined in:
lib/qb/package/version/from.rb

Overview

Module of factory methods to create QB::Package::Version instances from other objects (strings, QB::Package::Version, etc.)

Class Method Summary collapse

Class Method Details

.class_for(**values) ⇒ Class<QB::Package::Version>

Get class to instantiate for prop values - either QB::Package::Version or a specialized subclass like Leveled.

Parameters:

  • **values (Hash<Symbol, Object>)

    Prop values.

Returns:



26
27
28
29
30
31
32
# File 'lib/qb/package/version/from.rb', line 26

def self.class_for **values
  if QB::Package::Version::Leveled.level_for **values
    QB::Package::Version::Leveled
  else
    QB::Package::Version
  end
end

.docker_tag(version) ⇒ QB::Package::Version

Parse Docker image tag version and create an instance.

Parameters:

  • version (String)

    String version to parse.

Returns:



119
120
121
# File 'lib/qb/package/version/from.rb', line 119

def self.docker_tag version
  string( version.gsub( '_', '+' ) ).merge raw: version
end

.gemver(version) ⇒ QB::Package::Version

Create an instance from a Gem-style version.

Parameters:

Returns:



54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/qb/package/version/from.rb', line 54

def self.gemver version
  version = Gem::Version.new( version ) if version.is_a?( String )
  
  # release segments are everything before a string
  release_segments = version.segments.take_while { |seg|
    !seg.is_a?(String)
  }
  
  # We don't support > 3 release segments to make life somewhat
  # reasonable. Yeah, I think I've seen projects do it. We'll cross that
  # bridge if and when we get to it.
  if release_segments.length > 3
    raise ArgumentError,
          "We don't handle releases with more than 3 segments " +
          "(found #{ release_segments.inspect } in #{ version })"
  end
  
  prerelease_segments = version.segments[release_segments.length..-1]
  
  prop_values \
    raw: version.to_s,
    major: release_segments[0] || 0,
    minor: release_segments[1] || 0,
    patch: release_segments[2] || 0,
    prerelease: prerelease_segments,
    build: []
end

.object(object) ⇒ Object



145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
# File 'lib/qb/package/version/from.rb', line 145

def self.object object
  case object
  when String
    string object
  when Hash
    prop_values **object
  when Gem::Version
    gem_version object
  else
    raise TypeError.new binding.erb "      `object` must be String, Hash or Gem::Version\n      \n      Found:\n      \n          <%= object.pretty_inspect %>\n      \n    END\n  end\nend\n"

.prop_values(**values) ⇒ QB::Package::Version

Instantiate an instance from prop values, using class_for to choose the possible specialized class.

Parameters:

  • **values (Hash<Symbol, Object>)

    Prop values.

Returns:



43
44
45
# File 'lib/qb/package/version/from.rb', line 43

def self.prop_values **values
  class_for( **values ).new **values
end

.semver(version) ⇒ Object



85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# File 'lib/qb/package/version/from.rb', line 85

def self.semver version
  stmt = NRSER.squish "    var Semver = require('semver');\n    \n    console.log(\n      JSON.stringify(\n        Semver(\#{ JSON.dump version })\n      )\n    );\n  END\n  \n  parse = JSON.load Cmds.new(\n    \"node --eval %s\", args: [stmt], chdir: QB::ROOT\n  ).out!\n  \n  prop_values \\\n    raw: version,\n    major: parse['major'],\n    minor: parse['minor'],\n    patch: parse['patch'],\n    prerelease: parse['prerelease'],\n    build: parse['build']\nend\n"

.string(string) ⇒ QB::Package::Version

Parse string version into an instance. Accept Semver, Ruby Gem and Docker image tag formats.

Parameters:

  • String (String)

    version to parse.

Returns:



132
133
134
135
136
137
138
139
140
# File 'lib/qb/package/version/from.rb', line 132

def self.string string
  if string.include? '_'
    docker_tag string
  elsif string.include?( '-' ) || string.include?( '+' )
    semver string
  else
    gem_version string
  end
end