Added GGem.ebuild_name to convert gem names to ebuild names
[g-gem.git] / depatom.rb
blob9095aa726df4b801b5ff3b7dde40c378e4071b35
1 require 'rubygems'
3 class DependencyAtom
5   PREFIX_EXT_RE = /[!~]/
6   PREFIX_RE = /(>=|<=|<|>|=)/
7   CATEGORY_RE = /\w+-\w+/
8   POSTFIX_RE = /\*/
9   VERSION_RE = /(\d+(\.\d+)*)+/
10   VERSION_EXT_RE = /[a-z]?(_(alpha|beta|pre|rc|p)\d+)?/
11   PACKAGE_NAME_RE = /[a-zA-Z0-9_-]+/
13   attr_reader :package_name, :version, :version_ext,
14               :prefix, :prefix_ext, :postfix, :origin
16   def initialize(str)
17     @origin = str
18     @prefix_ext, str = $&, $' if /^#{PREFIX_EXT_RE}/ === str
19     @prefix, str = $&, $' if /^#{PREFIX_RE}/ === str
20     @category, str = $1, $' if /^(#{CATEGORY_RE})\// === str
21     @postfix, str = $&, $` if /#{POSTFIX_RE}$/ === str
22     @version, @version_ext, str = $1, $3, $` if /-#{VERSION_RE}(#{VERSION_EXT_RE})/ === str
23     raise "Invalid atom: #{@origin}" unless /^#{PACKAGE_NAME_RE}$/ === str
24     @package_name = $&
25   end
26   private :initialize
28   alias_method :name, :package_name
29   attr_accessor :category
31   def category
32     @category or Portage.category
33   end
35   ##
36   # FIXME: support other gentoo atom prefixes
37   ##
38   def gem_requirement
39     return Gem::Version::Requirement.default unless version
40     full_prefix = "#{prefix_ext}#{prefix}"
41     gem_prefix = if /^(~>|>|>=|=|!=|<=|<)$/ === full_prefix
42                    full_prefix
43                  elsif not prefix
44                    "="
45                  end
46     Gem::Version::Requirement.create(["#{gem_prefix} #{version}"])
47   end
49   def gem_dependency
50     Gem::Dependency.new(package_name, [gem_requirement.to_s])
51   end
53   def to_s
54     "#{prefix_ext}#{(prefix or "=") if version}#{category+"/" if category}#{package_name}"+
55       "#{"-"+version+version_ext if version}#{postfix}"
56   end
58   class << self
59     def from_s(str)
60       if str =~ /(.*\/)?(\S+)\.gem$/ # From gem file
61         atom = from_s($2)
62         atom.instance_eval { @origin = str }
63         atom
64       else
65         new(str)
66       end
67     end
69     alias_method :parse, :from_s
71     def parse_list(list)
72       list.map { |str| parse(str) }
73     end
75     def from_gem_dependency(dep, category)
76       # fixme:
77       if dep.is_a? Array
78         dep = Gem::Dependency.new(dep[0], dep[1])
79       end
80       prefix, version = *dep.version_requirements.instance_eval { @requirements.first }
81       new("#{prefix}#{category}/#{dep.name}-#{version}")
82     end
84     def from_required_ruby_version(spec)
85       spec.required_ruby_version.instance_eval do
86         if @requirements != nil 
87           prefix, version = @requirements.first
88           "#{prefix}dev-lang/ruby-#{version}"
89         else
90           "dev-lang/ruby"
91         end
92       end
93     end
94   end
95 end  # class DependencyAtom