class Composer::Package::Version::VersionSelector
Selects the best possible version for a package
PHP Authors: Ryan Weaver <ryan@knpuniversity.com>
Ruby Authors: Ioannis Kappas <ikappas@devworks.gr>
Public Class Methods
new(pool)
click to toggle source
# File lib/composer/package/version/version_selector.rb, line 24 def initialize(pool) @pool = pool end
Public Instance Methods
find_recommended_require_version(package)
click to toggle source
Given a concrete version, this returns a ~ constraint (when possible) that should be used, for example, in composer.json.
For example:
* 1.2.1 -> ~1.2 * 1.2 -> ~1.2 * v3.2.1 -> ~3.2 * 2.0-beta.1 -> ~2.0@beta * dev-master -> ~2.1@dev (dev version with alias) * dev-master -> dev-master (dev versions are untouched)
@param Package
package @return string
# File lib/composer/package/version/version_selector.rb, line 42 def find_recommended_require_version(package) version = package.version if !package.is_dev return transform_version(version, package.pretty_version, package.stability) end loader = Composer::Package::Loader::HashLoader.new(parser) dumper = Composer::Package::Dumper::HashDumper.new if (extra = loader.get_branch_alias(dumper.dump(package))) if match = /^(\d+\.\d+\.\d+)(\.9999999)-dev$/.match(extra) extra = "#{match[1]}.0" extra.gsub!('.9999999', '.0') return transform_version(extra, extra, 'dev') end end package.pretty_version end
Private Instance Methods
parser()
click to toggle source
# File lib/composer/package/version/version_selector.rb, line 99 def parser @parser ||= Composer::Package::Version::VersionParser.new @parser end
transform_version(version, pretty_version, stability)
click to toggle source
# File lib/composer/package/version/version_selector.rb, line 64 def transform_version(version, pretty_version, stability) # attempt to transform 2.1.1 to 2.1 # this allows you to upgrade through minor versions semantic_version_parts = version.split('.') op = '~' # check to see if we have a semver-looking version if semantic_version_parts.length == 4 && /^0\D?/.match(semantic_version_parts[3]) # remove the last parts (i.e. the patch version number and any extra) if semantic_version_parts[0] === '0' if semantic_version_parts[1] === '0' semantic_version_parts[3] = '*' else semantic_version_parts[2] = '*' semantic_version_parts.delete_at(3) end op = '' else semantic_version_parts.delete_at(3) semantic_version_parts.delete_at(2) end version = semantic_version_parts.join('.') else return pretty_version end # append stability flag if not default if stability != 'stable' version << "@#{stability}" end # 2.1 -> ~2.1 op + version end