Class: Versionable::Versions

Inherits:
Object
  • Object
show all
Defined in:
lib/versionable/versions.rb

Overview

A container for all versions of a given module.

Constant Summary collapse

COMPARISON_REGEX =
/^(<|<=|=|>=|>)\s+((?:0|[1-9]\d*)(?:\.(?:0|[1-9]\d*))*)$/

Instance Method Summary collapse

Constructor Details

#initialize(versioned_module) ⇒ Versions

Construct a Versions recording versions of the passed module.



7
8
9
# File 'lib/versionable/versions.rb', line 7

def initialize(versioned_module)
  @latest_version = versioned_module
end

Instance Method Details

#build(version_number, &block) ⇒ Object

Build and store a new version with the given number.

Versions must be built in increasing order: if version_number is not greater than the previous version, an ArgumentError is raised. The initial version number is always 0.

If a block parameter is passed, it is included in the created version. If this is the first time a block is passed, then record the previous version as the default one. Once build is called with a block, subsequent versions must also pass a block or a VersioningError will be raised.



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/versionable/versions.rb', line 20

def build(version_number, &block)
  version_number = VersionNumber.new(version_number)

  unless latest_version_number < version_number
    raise ArgumentError.new "Can't bump to #{version_number} from #{latest_version_number}"
  end

  if default_version and not block
    raise VersioningError.new(
    "Once version is called with a block, all subsequent calls must pass a block.")
  end

  if block and default_version.nil?
    self.default_version = latest_version
    self.latest_version = latest_version.dup

    versions[latest_version_number] = default_version
  else
    versions[latest_version_number] = latest_version.dup
  end

  self.latest_version_number = version_number
  latest_version.module_eval &block if block
end

#find(version_requirement) ⇒ Object

Find the maximal version satisifying the given requirement.

The requirement may be a version string such as “1.0.7”, or a comparator followed by a version such as “< 3.0”.

Returns the matching module if found, nil otherwise.



51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/versionable/versions.rb', line 51

def find(version_requirement)
  if version_requirement =~ VersionNumber::VERSION_NUMBER_REGEX
    return versions[VersionNumber.new(version_requirement)]
  end

  return nil unless version_requirement =~ Versions::COMPARISON_REGEX

  # Break the comparator (relational operator) out from the version requrement
  comparator, version_requirement = $1, VersionNumber.new($2)
  comparator = '==' if comparator == '=' # stick that in your pipe and smoke it.
  comparator = comparator.to_sym

  match = (versions.keys + [latest_version_number]).select do |v|
    v.send comparator, version_requirement
  end.max

  versions[match]
end