packo 0.0.1.alpha.1
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/packo +78 -0
- data/bin/packo-base +24 -0
- data/bin/packo-build +24 -0
- data/bin/packo-db +24 -0
- data/bin/packo-env +24 -0
- data/bin/packo-files +24 -0
- data/bin/packo-profile +24 -0
- data/bin/packo-repository +24 -0
- data/bin/packo-select +24 -0
- data/lib/packo.rb +186 -0
- data/lib/packo/cli.rb +79 -0
- data/lib/packo/cli/base.rb +554 -0
- data/lib/packo/cli/build.rb +488 -0
- data/lib/packo/cli/database.rb +55 -0
- data/lib/packo/cli/database/definition.rb +65 -0
- data/lib/packo/cli/database/helpers.rb +20 -0
- data/lib/packo/cli/environment.rb +45 -0
- data/lib/packo/cli/files.rb +153 -0
- data/lib/packo/cli/profile.rb +31 -0
- data/lib/packo/cli/repository.rb +561 -0
- data/lib/packo/cli/repository/binary.rb +74 -0
- data/lib/packo/cli/repository/helpers.rb +20 -0
- data/lib/packo/cli/repository/repository.rb +48 -0
- data/lib/packo/cli/repository/source.rb +91 -0
- data/lib/packo/cli/repository/virtual.rb +53 -0
- data/lib/packo/cli/select.rb +61 -0
- data/lib/packo/do.rb +249 -0
- data/lib/packo/environment.rb +269 -0
- data/lib/packo/extensions.rb +70 -0
- data/lib/packo/flags.rb +64 -0
- data/lib/packo/host.rb +121 -0
- data/lib/packo/models.rb +171 -0
- data/lib/packo/models/installed_package.rb +190 -0
- data/lib/packo/models/installed_package/content.rb +50 -0
- data/lib/packo/models/installed_package/dependency.rb +39 -0
- data/lib/packo/models/repository.rb +209 -0
- data/lib/packo/models/repository/binary.rb +32 -0
- data/lib/packo/models/repository/binary/mirror.rb +35 -0
- data/lib/packo/models/repository/package.rb +73 -0
- data/lib/packo/models/repository/package/binary.rb +34 -0
- data/lib/packo/models/repository/package/binary/build.rb +36 -0
- data/lib/packo/models/repository/package/source.rb +36 -0
- data/lib/packo/models/repository/package/source/feature.rb +36 -0
- data/lib/packo/models/repository/package/source/flavor.rb +36 -0
- data/lib/packo/models/repository/package/virtual.rb +32 -0
- data/lib/packo/models/repository/source.rb +30 -0
- data/lib/packo/models/repository/virtual.rb +30 -0
- data/lib/packo/models/selector.rb +34 -0
- data/lib/packo/models/tag.rb +30 -0
- data/lib/packo/package.rb +239 -0
- data/lib/packo/package/blocker.rb +100 -0
- data/lib/packo/package/blockers.rb +40 -0
- data/lib/packo/package/dependencies.rb +40 -0
- data/lib/packo/package/dependency.rb +100 -0
- data/lib/packo/package/feature.rb +55 -0
- data/lib/packo/package/features.rb +105 -0
- data/lib/packo/package/flavor.rb +101 -0
- data/lib/packo/package/tags.rb +60 -0
- data/lib/packo/package/tags/expression.rb +130 -0
- data/lib/packo/package/tags/expression/group.rb +28 -0
- data/lib/packo/package/tags/expression/logic.rb +48 -0
- data/lib/packo/package/tags/expression/name.rb +28 -0
- data/lib/packo/profile.rb +174 -0
- data/lib/packo/rbuild.rb +22 -0
- data/lib/packo/rbuild/behaviors.rb +20 -0
- data/lib/packo/rbuild/behaviors/default.rb +27 -0
- data/lib/packo/rbuild/feature.rb +64 -0
- data/lib/packo/rbuild/features.rb +65 -0
- data/lib/packo/rbuild/flavor.rb +67 -0
- data/lib/packo/rbuild/module.rb +40 -0
- data/lib/packo/rbuild/modules.rb +27 -0
- data/lib/packo/rbuild/modules/building.rb +24 -0
- data/lib/packo/rbuild/modules/building/autotools.rb +315 -0
- data/lib/packo/rbuild/modules/building/cmake.rb +38 -0
- data/lib/packo/rbuild/modules/building/patch.rb +84 -0
- data/lib/packo/rbuild/modules/building/rake.rb +74 -0
- data/lib/packo/rbuild/modules/building/strip.rb +41 -0
- data/lib/packo/rbuild/modules/misc.rb +26 -0
- data/lib/packo/rbuild/modules/misc/fetcher.rb +177 -0
- data/lib/packo/rbuild/modules/misc/fetching.rb +22 -0
- data/lib/packo/rbuild/modules/misc/fetching/git.rb +57 -0
- data/lib/packo/rbuild/modules/misc/fetching/github.rb +31 -0
- data/lib/packo/rbuild/modules/misc/fetching/gnu.rb +59 -0
- data/lib/packo/rbuild/modules/misc/fetching/mercurial.rb +51 -0
- data/lib/packo/rbuild/modules/misc/fetching/sourceforge.rb +47 -0
- data/lib/packo/rbuild/modules/misc/fetching/subversion.rb +51 -0
- data/lib/packo/rbuild/modules/misc/fetching/wget.rb +57 -0
- data/lib/packo/rbuild/modules/misc/unpacker.rb +70 -0
- data/lib/packo/rbuild/modules/misc/unpacking.rb +23 -0
- data/lib/packo/rbuild/modules/misc/unpacking/lzma.rb +34 -0
- data/lib/packo/rbuild/modules/misc/unpacking/tar.rb +35 -0
- data/lib/packo/rbuild/modules/misc/unpacking/xz.rb +34 -0
- data/lib/packo/rbuild/modules/misc/unpacking/zip.rb +26 -0
- data/lib/packo/rbuild/modules/packaging.rb +20 -0
- data/lib/packo/rbuild/modules/packaging/pko.rb +78 -0
- data/lib/packo/rbuild/package.rb +281 -0
- data/lib/packo/rbuild/package/manifest.rb +169 -0
- data/lib/packo/rbuild/stages.rb +171 -0
- data/lib/packo/rbuild/stages/callbacks.rb +96 -0
- data/lib/packo/rbuild/stages/stage.rb +50 -0
- data/lib/packo/repository.rb +95 -0
- data/lib/packo/repository/binary.rb +116 -0
- data/lib/packo/repository/source.rb +77 -0
- data/lib/packo/repository/virtual.rb +66 -0
- data/lib/packo/system.rb +53 -0
- data/lib/packo/version.rb +26 -0
- metadata +276 -0
@@ -0,0 +1,100 @@
|
|
1
|
+
#--
|
2
|
+
# Copyleft meh. [http://meh.doesntexist.org | meh@paranoici.org]
|
3
|
+
#
|
4
|
+
# This file is part of packo.
|
5
|
+
#
|
6
|
+
# packo is free software: you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU Affero General Public License as published
|
8
|
+
# by the Free Software Foundation, either version 3 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# packo is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU Affero General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU Affero General Public License
|
17
|
+
# along with packo. If not, see <http://www.gnu.org/licenses/>.
|
18
|
+
#++
|
19
|
+
|
20
|
+
module Packo; class Package
|
21
|
+
|
22
|
+
class Blocker < Package
|
23
|
+
def self.parse (text)
|
24
|
+
text = text.dup
|
25
|
+
|
26
|
+
if text.end_with? '!!'
|
27
|
+
text[-2, 2] = ''
|
28
|
+
type = :runtime
|
29
|
+
elsif text.end_with? '!'
|
30
|
+
text[-1] = ''
|
31
|
+
type = :build
|
32
|
+
else
|
33
|
+
type = :both
|
34
|
+
end
|
35
|
+
|
36
|
+
if matches = text.match(/^([<>~]?=?)/)
|
37
|
+
validity = ((matches[1] && !matches[1].empty?) ? matches[1] : nil)
|
38
|
+
text.sub!(/^([<>~]?=?)/, '')
|
39
|
+
else
|
40
|
+
validity = nil
|
41
|
+
end
|
42
|
+
|
43
|
+
parsed = Packo::Package.parse(text)
|
44
|
+
|
45
|
+
self.new(parsed.to_hash, validity, type)
|
46
|
+
end
|
47
|
+
|
48
|
+
attr_reader :type, :validity
|
49
|
+
|
50
|
+
def initialize (data, validity=nil, type=nil)
|
51
|
+
super(data)
|
52
|
+
|
53
|
+
@validity = validity
|
54
|
+
@type = type
|
55
|
+
end
|
56
|
+
|
57
|
+
def runtime?; [:runtime, :both].member?(@type) end
|
58
|
+
def build?; [:build, :both].member?(@type) end
|
59
|
+
def both?; @type == :both end
|
60
|
+
|
61
|
+
def in? (package)
|
62
|
+
return false if package.name != name || package.tags != tags
|
63
|
+
|
64
|
+
return true if !version
|
65
|
+
|
66
|
+
case validity
|
67
|
+
when '~', '~=' then !!package.version.to_s.match(/^#{Regexp.escape(version.to_s)}/)
|
68
|
+
when '>' then package.version > version
|
69
|
+
when '>=' then package.version >= version
|
70
|
+
when '<' then package.version < version
|
71
|
+
when '<=' then package.version <= version
|
72
|
+
else package.version == version
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def to_s (type=:normal)
|
77
|
+
case type
|
78
|
+
when :short
|
79
|
+
"#{tags}/#{name}#{"-#{version}" if version}"
|
80
|
+
|
81
|
+
else
|
82
|
+
features = features.to_a.sort {|a, b|
|
83
|
+
if a.enabled? && b.enabled? ; 0
|
84
|
+
elsif a.enabled? && !b.enabled? ; -1
|
85
|
+
else ; 1
|
86
|
+
end
|
87
|
+
}.map {|feature|
|
88
|
+
(feature.enabled? ? '' : '-') + feature.name.to_s
|
89
|
+
}.join(',')
|
90
|
+
|
91
|
+
flavor = flavor.to_a.map {|f|
|
92
|
+
f.name.to_s
|
93
|
+
}.sort
|
94
|
+
|
95
|
+
"#{validity}#{tags}/#{name}#{"-#{version}" if version}#{"[#{features}]" if !features.empty?}#{"{#{flavor}}" if !flavor.empty?}"
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
end; end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
#--
|
2
|
+
# Copyleft meh. [http://meh.doesntexist.org | meh@paranoici.org]
|
3
|
+
#
|
4
|
+
# This file is part of packo.
|
5
|
+
#
|
6
|
+
# packo is free software: you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU Affero General Public License as published
|
8
|
+
# by the Free Software Foundation, either version 3 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# packo is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU Affero General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU Affero General Public License
|
17
|
+
# along with packo. If not, see <http://www.gnu.org/licenses/>.
|
18
|
+
#++
|
19
|
+
|
20
|
+
require 'packo/package/blocker'
|
21
|
+
|
22
|
+
module Packo; class Package
|
23
|
+
|
24
|
+
class Blockers < Array
|
25
|
+
attr_reader :package
|
26
|
+
|
27
|
+
def initialize (package)
|
28
|
+
@package = package
|
29
|
+
end
|
30
|
+
|
31
|
+
def push (blocker)
|
32
|
+
super(blocker.is_a?(Blocker) ? blocker : Blocker.parse(blocker))
|
33
|
+
self.compact!
|
34
|
+
self
|
35
|
+
end
|
36
|
+
|
37
|
+
alias << push
|
38
|
+
end
|
39
|
+
|
40
|
+
end; end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
#--
|
2
|
+
# Copyleft meh. [http://meh.doesntexist.org | meh@paranoici.org]
|
3
|
+
#
|
4
|
+
# This file is part of packo.
|
5
|
+
#
|
6
|
+
# packo is free software: you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU Affero General Public License as published
|
8
|
+
# by the Free Software Foundation, either version 3 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# packo is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU Affero General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU Affero General Public License
|
17
|
+
# along with packo. If not, see <http://www.gnu.org/licenses/>.
|
18
|
+
#++
|
19
|
+
|
20
|
+
require 'packo/package/dependency'
|
21
|
+
|
22
|
+
module Packo; class Package
|
23
|
+
|
24
|
+
class Dependencies < Array
|
25
|
+
attr_reader :package
|
26
|
+
|
27
|
+
def initialize (package)
|
28
|
+
@package = package
|
29
|
+
end
|
30
|
+
|
31
|
+
def push (dependency)
|
32
|
+
super(dependency.is_a?(Dependency) ? dependency : Dependency.parse(dependency))
|
33
|
+
self.compact!
|
34
|
+
self
|
35
|
+
end
|
36
|
+
|
37
|
+
alias << push
|
38
|
+
end
|
39
|
+
|
40
|
+
end; end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
#--
|
2
|
+
# Copyleft meh. [http://meh.doesntexist.org | meh@paranoici.org]
|
3
|
+
#
|
4
|
+
# This file is part of packo.
|
5
|
+
#
|
6
|
+
# packo is free software: you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU Affero General Public License as published
|
8
|
+
# by the Free Software Foundation, either version 3 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# packo is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU Affero General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU Affero General Public License
|
17
|
+
# along with packo. If not, see <http://www.gnu.org/licenses/>.
|
18
|
+
#++
|
19
|
+
|
20
|
+
module Packo; class Package
|
21
|
+
|
22
|
+
class Dependency < Package
|
23
|
+
def self.parse (text)
|
24
|
+
text = text.dup
|
25
|
+
|
26
|
+
if text.end_with? '!!'
|
27
|
+
text[-2, 2] = ''
|
28
|
+
type = :runtime
|
29
|
+
elsif text.end_with? '!'
|
30
|
+
text[-1] = ''
|
31
|
+
type = :build
|
32
|
+
else
|
33
|
+
type = :both
|
34
|
+
end
|
35
|
+
|
36
|
+
if matches = text.match(/^([<>~]?=?)/)
|
37
|
+
validity = ((matches[1] && !matches[1].empty?) ? matches[1] : nil)
|
38
|
+
text.sub!(/^([<>~]?=?)/, '')
|
39
|
+
else
|
40
|
+
validity = nil
|
41
|
+
end
|
42
|
+
|
43
|
+
parsed = Packo::Package.parse(text)
|
44
|
+
|
45
|
+
self.new(parsed.to_hash, validity, type)
|
46
|
+
end
|
47
|
+
|
48
|
+
attr_reader :type, :validity
|
49
|
+
|
50
|
+
def initialize (data, validity=nil, type=nil)
|
51
|
+
super(data)
|
52
|
+
|
53
|
+
@validity = validity
|
54
|
+
@type = type
|
55
|
+
end
|
56
|
+
|
57
|
+
def runtime?; [:runtime, :both].member?(@type) end
|
58
|
+
def build?; [:build, :both].member?(@type) end
|
59
|
+
def both?; @type == :both end
|
60
|
+
|
61
|
+
def in? (package)
|
62
|
+
return false if package.name != name || package.tags != tags
|
63
|
+
|
64
|
+
return true if !version
|
65
|
+
|
66
|
+
case validity
|
67
|
+
when '~', '~=' then !!package.version.to_s.match(/^#{Regexp.escape(version.to_s)}/)
|
68
|
+
when '>' then package.version > version
|
69
|
+
when '>=' then package.version >= version
|
70
|
+
when '<' then package.version < version
|
71
|
+
when '<=' then package.version <= version
|
72
|
+
else package.version == version
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def to_s (type=:normal)
|
77
|
+
case type
|
78
|
+
when :short
|
79
|
+
"#{tags}/#{name}#{"-#{version}" if version}"
|
80
|
+
|
81
|
+
else
|
82
|
+
features = features.to_a.sort {|a, b|
|
83
|
+
if a.enabled? && b.enabled? ; 0
|
84
|
+
elsif a.enabled? && !b.enabled? ; -1
|
85
|
+
else ; 1
|
86
|
+
end
|
87
|
+
}.map {|feature|
|
88
|
+
(feature.enabled? ? '' : '-') + feature.name.to_s
|
89
|
+
}.join(',')
|
90
|
+
|
91
|
+
flavor = flavor.to_a.map {|f|
|
92
|
+
f.name.to_s
|
93
|
+
}.sort
|
94
|
+
|
95
|
+
"#{validity}#{tags}/#{name}#{"-#{version}" if version}#{"[#{features}]" if !features.empty?}#{"{#{flavor}}" if !flavor.empty?}"
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
end; end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
#--
|
2
|
+
# Copyleft meh. [http://meh.doesntexist.org | meh@paranoici.org]
|
3
|
+
#
|
4
|
+
# This file is part of packo.
|
5
|
+
#
|
6
|
+
# packo is free software: you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU Affero General Public License as published
|
8
|
+
# by the Free Software Foundation, either version 3 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# packo is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU Affero General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU Affero General Public License
|
17
|
+
# along with packo. If not, see <http://www.gnu.org/licenses/>.
|
18
|
+
#++
|
19
|
+
|
20
|
+
module Packo; class Package
|
21
|
+
|
22
|
+
class Feature
|
23
|
+
def self.parse (text)
|
24
|
+
Feature.new(text.match(/^[\+\-]?(.*)$/)[1], !text.start_with?('-'))
|
25
|
+
end
|
26
|
+
|
27
|
+
attr_reader :name
|
28
|
+
|
29
|
+
def initialize (name, enabled=false, description=nil)
|
30
|
+
@name = name.to_sym
|
31
|
+
@enabled = !!enabled
|
32
|
+
@description = description
|
33
|
+
end
|
34
|
+
|
35
|
+
def enabled?; @enabled end
|
36
|
+
def disabled?; !@enabled end
|
37
|
+
def enabled!; @enabled = true unless @forced end
|
38
|
+
def disabled!; @enabled = false unless @forced end
|
39
|
+
def enable!; @enabled = true unless @forced end
|
40
|
+
def disable!; @enabled = false unless @forced end
|
41
|
+
|
42
|
+
def forced?; @forced end
|
43
|
+
def force!; @forced = true end
|
44
|
+
def not_forced!; @forced = false end
|
45
|
+
|
46
|
+
def description (value=nil)
|
47
|
+
value ? @description = value : @description
|
48
|
+
end
|
49
|
+
|
50
|
+
def to_s
|
51
|
+
name.to_s
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
end; end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
#--
|
2
|
+
# Copyleft meh. [http://meh.doesntexist.org | meh@paranoici.org]
|
3
|
+
#
|
4
|
+
# This file is part of packo.
|
5
|
+
#
|
6
|
+
# packo is free software: you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU Affero General Public License as published
|
8
|
+
# by the Free Software Foundation, either version 3 of the License, or
|
9
|
+
# (at your option) any later version.
|
10
|
+
#
|
11
|
+
# packo is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
14
|
+
# GNU Affero General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU Affero General Public License
|
17
|
+
# along with packo. If not, see <http://www.gnu.org/licenses/>.
|
18
|
+
#++
|
19
|
+
|
20
|
+
require 'packo/package/feature'
|
21
|
+
|
22
|
+
module Packo; class Package
|
23
|
+
|
24
|
+
class Features
|
25
|
+
def self.parse (text)
|
26
|
+
data = []
|
27
|
+
|
28
|
+
text.split(/\s+/).each {|part|
|
29
|
+
data << Feature.parse(part)
|
30
|
+
}
|
31
|
+
|
32
|
+
Features.new(data)
|
33
|
+
end
|
34
|
+
|
35
|
+
def initialize (values={})
|
36
|
+
@values = {}
|
37
|
+
|
38
|
+
if values.is_a?(Array)
|
39
|
+
values.dup.each {|feature|
|
40
|
+
@values[feature.name] = feature
|
41
|
+
}
|
42
|
+
elsif values.is_a?(Hash)
|
43
|
+
values.dup.each {|name, value|
|
44
|
+
@values[name.to_sym] = Feature.new(name, value || false)
|
45
|
+
}
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def each
|
50
|
+
@values.dup.each_value {|feature|
|
51
|
+
yield feature
|
52
|
+
}
|
53
|
+
end
|
54
|
+
|
55
|
+
def empty?
|
56
|
+
@values.empty?
|
57
|
+
end
|
58
|
+
|
59
|
+
def set (name, value)
|
60
|
+
@values[name.to_sym] = Feature.new(name, value)
|
61
|
+
end
|
62
|
+
|
63
|
+
def get (name)
|
64
|
+
@values[name.to_sym] ||= Feature.new(name, false)
|
65
|
+
end
|
66
|
+
|
67
|
+
def delete (name)
|
68
|
+
@values.delete(name.to_sym)
|
69
|
+
end
|
70
|
+
|
71
|
+
def has? (name)
|
72
|
+
@values.key? name.to_sym
|
73
|
+
end
|
74
|
+
|
75
|
+
def to_hash
|
76
|
+
Hash[*@values.map {|(name, element)|
|
77
|
+
[name, element.value]
|
78
|
+
}]
|
79
|
+
end
|
80
|
+
|
81
|
+
def to_a
|
82
|
+
@values.map {|(name, element)|
|
83
|
+
element
|
84
|
+
}
|
85
|
+
end
|
86
|
+
|
87
|
+
def to_s (type=:normal)
|
88
|
+
case type
|
89
|
+
when :package
|
90
|
+
@values.select {|name, feature| feature.enabled?}.map {|item| item[0]}.join('-')
|
91
|
+
|
92
|
+
when :normal
|
93
|
+
self.to_a.sort {|a, b|
|
94
|
+
if a.enabled? && b.enabled? ; 0
|
95
|
+
elsif a.enabled? && !b.enabled? ; -1
|
96
|
+
else ; 1
|
97
|
+
end
|
98
|
+
}.map {|feature|
|
99
|
+
(feature.enabled? ? '' : '-') + feature.name.to_s
|
100
|
+
}.join(' ')
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
end; end
|