summaryrefslogtreecommitdiffstats
path: root/fontpackages/comps.rb
blob: 9f654fc769b0b3664ed8e00e375a00490f02285a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
#! /usr/bin/env ruby
# -*- encoding: utf-8 mode: ruby -*-
# comps.rb
# Copyright (C) 2009-2010 Red Hat, Inc.

# Authors:
#   Akira TAGOH  <tagoh@redhat.com>

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.

# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330,
# Boston, MA 02111-1307, USA.

require 'rubygems'
gem 'hpricot'
require 'hpricot'

module Comps

=begin rdoc

== Comps::Package

=end

  class Package

    def initialize(name, type, requires)
      @name = name
      @type = type
      @requires = requires
    end # def initialize

    attr_reader :name

    def is_default?
      @type == "mandatory" || @type == "default"
    end # def is_default?

    def is_mandatory?
      @type == "mandatory"
    end # def is_mandatory?

    def <=>(b)
      @name <=> b.name
    end # def 

  end # class Package

=begin rdoc

== Comps::Group

=end

  class Group

    def initialize(name, lang, is_enabled, is_visible)
      @name = name
      @is_lang_support = !lang.nil? && !lang.empty?
      @lang = lang
      @is_enabled = is_enabled
      @is_visible = is_visible
      @packages = []
    end # def initialize

    attr_reader :name, :lang

    def is_language_support?
      @is_lang_support
    end # def is_language_support?

    def is_enabled?
      @is_enabled
    end # def is_enabled?

    def is_visible?
      @is_visible
    end # def is_visible?

    def push(*x)
      @packages.push(*x)
    end # def push

    alias :<< :push

    def packages(mode = :all)
      case mode
      when :all
        @packages
      when :default
        @packages.map do |pkg|
          pkg.is_default? ? pkg : nil
        end.compact
      else
        STDERR.printf("W: unknown query mode: %s\n", mode)
      end
    end # def packages

    def has_package?(package)
      @packages.map do |pkg|
        if package.kind_of?(Comps::Package) then
          pkg.name == package.name
        else
          pkg.name == package
        end
      end.include?(true)
    end # def has_package?

    def package(package)
      @package.each do |pkg|
        if package.kind_of?(Comps::Package) then
          return pkg if pkg.name == package.name
        else
          return pkg if pkg.name == package
        end
      end
      nil
    end # def package

  end # class Group

=begin rdoc

== Comps::Root

=end

  class Root

    def initialize(file)
      File.open(file) do |f|
        x = f.read
        @doc = Hpricot(x)
      end
    end # def initialize

    def inspect
      sprintf("#<%s:0x%x>", self.class, self.object_id)
    end # def inspect

    def group(name)
      _groups.map do |g|
        g.name == name ? g : nil
      end.compact[0]
    end # def group

    def groups(mode = :all)
      case mode
      when :all
        _groups
      when :langonly
        _groups.map do |g|
          g.is_language_support? ? g : nil
        end.compact
      else
        STDERR.printf("W: unknown query mode: %s\n", mode)
      end
    end # def groups

    private

    def _groups
      retval = []
      @doc.search("group") do |element|
        id = element.search("id")
        if id.empty? then
          STDERR.printf("W: invalid entry: %s", element.pretty_print)
        else
          lang = element.search("langonly")
          default = element.search("default")
          visible = element.search("uservisible")
          retval << Comps::Group.new(id.inner_html, lang.inner_html, default.inner_html == "true", visible.inner_html == "true")
          list = element.search("packagereq")
          list.each do |pkg|
            retval[-1] << Comps::Package.new(pkg.inner_html, pkg[:type], pkg[:conditional])
          end
        end
      end
      retval
    end # def _groups

  end # class Root

end # module Comps