Class: SemanticVersion

Inherits:
Object
  • Object
show all
Includes:
Comparable
Defined in:
lib/prefab/semver.rb

Constant Summary collapse

SEMVER_PATTERN =
/
  ^
  (?<major>0|[1-9]\d*)
  \.
  (?<minor>0|[1-9]\d*)
  \.
  (?<patch>0|[1-9]\d*)
  (?:-(?<prerelease>
    (?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)
    (?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*
  ))?
  (?:\+(?<buildmetadata>[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?
  $
/x

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(major:, minor:, patch:, prerelease: nil, build_metadata: nil) ⇒ SemanticVersion

Returns a new instance of SemanticVersion.



45
46
47
48
49
50
51
# File 'lib/prefab/semver.rb', line 45

def initialize(major:, minor:, patch:, prerelease: nil, build_metadata: nil)
  @major = major
  @minor = minor
  @patch = patch
  @prerelease = prerelease
  @build_metadata = 
end

Instance Attribute Details

#build_metadataObject (readonly)

Returns the value of attribute build_metadata.



21
22
23
# File 'lib/prefab/semver.rb', line 21

def 
  @build_metadata
end

#majorObject (readonly)

Returns the value of attribute major.



21
22
23
# File 'lib/prefab/semver.rb', line 21

def major
  @major
end

#minorObject (readonly)

Returns the value of attribute minor.



21
22
23
# File 'lib/prefab/semver.rb', line 21

def minor
  @minor
end

#patchObject (readonly)

Returns the value of attribute patch.



21
22
23
# File 'lib/prefab/semver.rb', line 21

def patch
  @patch
end

#prereleaseObject (readonly)

Returns the value of attribute prerelease.



21
22
23
# File 'lib/prefab/semver.rb', line 21

def prerelease
  @prerelease
end

Class Method Details

.parse(version_string) ⇒ Object

Raises:

  • (ArgumentError)


23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/prefab/semver.rb', line 23

def self.parse(version_string)
  raise ArgumentError, "version string cannot be nil" if version_string.nil?
  raise ArgumentError, "version string cannot be empty" if version_string.empty?

  match = SEMVER_PATTERN.match(version_string)
  raise ArgumentError, "invalid semantic version format: #{version_string}" unless match

  new(
    major: match[:major].to_i,
    minor: match[:minor].to_i,
    patch: match[:patch].to_i,
    prerelease: match[:prerelease],
    build_metadata: match[:buildmetadata]
  )
end

.parse_quietly(version_string) ⇒ Object



39
40
41
42
43
# File 'lib/prefab/semver.rb', line 39

def self.parse_quietly(version_string)
  parse(version_string)
rescue ArgumentError
  nil
end

Instance Method Details

#<=>(other) ⇒ Object



53
54
55
56
57
58
59
60
61
62
63
# File 'lib/prefab/semver.rb', line 53

def <=>(other)
  return nil unless other.is_a?(SemanticVersion)

  # Compare major.minor.patch
  return major <=> other.major if major != other.major
  return minor <=> other.minor if minor != other.minor
  return patch <=> other.patch if patch != other.patch

  # Compare pre-release versions
  compare_prerelease(prerelease, other.prerelease)
end

#==(other) ⇒ Object



65
66
67
68
69
70
71
72
73
# File 'lib/prefab/semver.rb', line 65

def ==(other)
  return false unless other.is_a?(SemanticVersion)

  major == other.major &&
    minor == other.minor &&
    patch == other.patch &&
    prerelease == other.prerelease
  # Build metadata is ignored in equality checks
end

#eql?(other) ⇒ Boolean

Returns:

  • (Boolean)


75
76
77
# File 'lib/prefab/semver.rb', line 75

def eql?(other)
  self == other
end

#hashObject



79
80
81
# File 'lib/prefab/semver.rb', line 79

def hash
  [major, minor, patch, prerelease].hash
end

#to_sObject



83
84
85
86
87
88
# File 'lib/prefab/semver.rb', line 83

def to_s
  result = "#{major}.#{minor}.#{patch}"
  result += "-#{prerelease}" if prerelease
  result += "+#{}" if 
  result
end