rpm 0.0.0 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,130 @@
1
+ require 'rpm'
2
+
3
+ module RPM
4
+
5
+ class Transaction
6
+
7
+ def self.release(ptr)
8
+ RPM::FFI.rpmtsFree(ptr)
9
+ end
10
+
11
+ def initialize(opts={})
12
+
13
+ opts[:root] ||= '/'
14
+
15
+ @ptr = ::FFI::AutoPointer.new(RPM::FFI.rpmtsCreate, Transaction.method(:release))
16
+ RPM::FFI.rpmtsSetRootDir(@ptr, opts[:root])
17
+ end
18
+
19
+ # @return [RPM::MatchIterator] Creates an iterator for +tag+ and +val+
20
+ def init_iterator(tag, val)
21
+ raise TypeError if (val && !val.is_a?(String))
22
+
23
+ it_ptr = RPM::FFI.rpmtsInitIterator(@ptr, tag.nil? ? 0 : tag, val, 0)
24
+
25
+ raise "Can't init iterator for [#{tag}] -> '#{val}'" if it_ptr.null?
26
+ return MatchIterator.from_ptr(it_ptr)
27
+ end
28
+
29
+ # @visibility private
30
+ def ptr
31
+ @ptr
32
+ end
33
+
34
+ #
35
+ # @yield [Package] Called for each match
36
+ # @param [Number] key RPM tag key
37
+ # @param [String] val Value to match
38
+ # @example
39
+ # RPM.transaction do |t|
40
+ # t.each_match(RPM::TAG_ARCH, "x86_64") do |pkg|
41
+ # puts pkg.name
42
+ # end
43
+ # end
44
+ #
45
+ def each_match(key, val, &block)
46
+ it = init_iterator(key, val)
47
+
48
+ return it unless block_given?
49
+
50
+ it.each(&block)
51
+ end
52
+
53
+ #
54
+ # @yield [Package] Called for each package in the database
55
+ # @example
56
+ # db.each do |pkg|
57
+ # puts pkg.name
58
+ # end
59
+ #
60
+ def each(&block)
61
+ each_match(0, nil, &block)
62
+ end
63
+
64
+ # Add a install operation to the transaction
65
+ # @param [Package] pkg Package to install
66
+ def install(pkg, key)
67
+ raise TypeError if not pkg.is_a?(RPM::Package)
68
+
69
+ @keys ||= Array.new
70
+ raise ArgError, "key must be unique" if @keys.include?(key)
71
+ @keys << key
72
+
73
+ RPM::FFI.rpmtsAddInstallElement(@ptr, pkg.ptr, key.to_s, 0, nil)
74
+ nil
75
+ end
76
+
77
+ # Sets the root directory for this transaction
78
+ # @param [String] root directory
79
+ def root_dir=(dir)
80
+ rc = RPM::FFI.rpmtsSetRootDir(@ptr, dir)
81
+ raise "Can't set #{dir} as root directory" if rc < 0
82
+ end
83
+
84
+ # @return [String ] the root directory for this transaction
85
+ def root_dir
86
+ RPM::FFI.rpmtsRootDir(@ptr)
87
+ end
88
+
89
+ def flags=(fl)
90
+ RPM::FFI.rpmtsSetFlags(@ptr, fl)
91
+ end
92
+
93
+ def flags
94
+ RPM::FFI.rpmtsFlags(@ptr)
95
+ end
96
+
97
+ # Performs the transaction.
98
+ # @param [Number] flag Transaction flags, default +RPM::TRANS_FLAG_NONE+
99
+ # @param [Number] filter Transaction filter, default +RPM::PROB_FILTER_NONE+
100
+ # @example
101
+ # transaction.commit do |sig|
102
+ # end
103
+ # @yield [CallbackData] sig Transaction progress
104
+ def commit
105
+ self.flags = RPM::FFI::TransFlags[:none]
106
+
107
+ callback = Proc.new do |h, what, amount, total, key, data|
108
+ puts "#{h} #{what} #{amount} #{total} #{key} #{data}"
109
+ end
110
+
111
+ RPM::FFI.rpmtsSetNotifyCallback(@ts, callback, nil)
112
+
113
+ rc = RPM::FFI.rpmtsRun(@ptr, nil, :none)
114
+
115
+ raise "Transaction Error" if rc < 0
116
+
117
+ if rc > 0
118
+ ps = RPM::FFI.rpmtsProblems(@ptr)
119
+ psi = RPM::FFI.rpmpsInitIterator(ps)
120
+ while (RPM::FFI.rpmpsNextIterator(psi) >= 0)
121
+ problem = RPM::FFI.rpmpsGetProblem(psi)
122
+ puts RPM::FFI.rpmProblemString.read_string
123
+ end
124
+ RPM::FFI.rpmpsFree(ps)
125
+ end
126
+ end
127
+
128
+ end
129
+
130
+ end
data/lib/rpm/utils.rb ADDED
@@ -0,0 +1,10 @@
1
+ module RPM
2
+
3
+ module Utils
4
+
5
+ def self.check_type(var, type)
6
+ raise(TypeError, "wrong argument type #{var.class} (expected #{type.class})") unless var.is_a?(type)
7
+ end
8
+
9
+ end
10
+ end
data/lib/rpm/version.rb CHANGED
@@ -1,3 +1,156 @@
1
+ require 'rpm'
2
+
1
3
  module RPM
2
- VERSION = "0.0.0"
4
+
5
+ class Version
6
+
7
+ include Comparable
8
+
9
+ # Parses a "epoch:version-release" string
10
+ # @return [Array] tuple [epoch, version, release]
11
+ def self.parse_evr(evr)
12
+ raise ArgumentError, "version can't be nil" if evr.nil?
13
+ version = evr
14
+ epoch = nil
15
+ release = nil
16
+
17
+ idx = version.rindex(?-)
18
+ version, release = version[0..idx-1], version[idx+1..-1] if idx
19
+
20
+ idx = version.index(/\D/)
21
+ if (idx && version[idx] == ?:)
22
+ epoch = version[0..idx-1]
23
+ version = version[idx+1..-1]
24
+ end
25
+ return epoch ? epoch.to_i : nil, version, release
26
+ end
27
+
28
+ #
29
+ # @overload new(vr, e = nil)
30
+ # Creates a version object from a string representation
31
+ # @param [String] vr version and release in the form "v-r"
32
+ # @param [Number] e epoch
33
+ # @return [Version]
34
+ # @overload new(v, r, e = nil)
35
+ # Creates a version object from a string representation
36
+ # @param [String] v version
37
+ # @param [String] r release
38
+ # @param [Number] e epoch
39
+ # @return [Version]
40
+ # @example
41
+ # RPM:: Version.new "1.0.0-3"
42
+ # RPM:: Version.new "1.04"
43
+ # RPM:: Version.new "1.0.0-3k", 1
44
+ # RPM:: Version.new "2.0.3", "5k"
45
+ #
46
+ def initialize(*argv)
47
+
48
+ case argv.size
49
+ when 0
50
+ raise(ArgumentError "wrong number of arguments (0 for 1..3)")
51
+ when 1
52
+ RPM::Utils.check_type(argv[0], String)
53
+ @e, @v, @r = RPM::Version.parse_evr(argv[0])
54
+ when 2
55
+ # (vr, e)
56
+ RPM::Utils.check_type(argv[0], String)
57
+ @e, @v, @r = RPM::Version.parse_evr(argv[0])
58
+ raise(TypeError, "illegal argument value") if not e.nil?
59
+ @e = argv[1].to_i
60
+ when 3
61
+ RPM::Utils.check_type(argv[0], String)
62
+ RPM::Utils.check_type(argv[1], String)
63
+ @v = argv[0]
64
+ @r = argv[1]
65
+ @e = argv[2].to_i
66
+ else
67
+ raise(ArgumentError "too many arguments (#{args.size} for 1..3)")
68
+ end
69
+ end
70
+
71
+ # @return [String] the version component
72
+ def v
73
+ @v
74
+ end
75
+
76
+ # @return [String] the release component
77
+ # or +nil+
78
+ def r
79
+ @r
80
+ end
81
+
82
+ # @return [String] the epoch component
83
+ # or +nil+
84
+ def e
85
+ @e
86
+ end
87
+
88
+ # Comparison between versions
89
+ # @param [Version] other
90
+ # @return [Number] -1 if +other+ is greater than, 0 if +other+ is equal to,
91
+ # and +1 if other is less than version.
92
+ #
93
+ # @example
94
+ # v1 = RPM::Version.new("3.0-0",1)
95
+ # v2 = RPM::Version.new("3.1-0",1)
96
+ # v1 <=> v2
97
+ # => -1
98
+ #
99
+ def <=>(other)
100
+ RPM::Utils.check_type(other, RPM::Version)
101
+ ret = RPM::FFI.rpmvercmp(to_vre_epoch_zero, other.to_vre_epoch_zero)
102
+ end
103
+
104
+ # @param [Version] other Version to compare against
105
+ # @return [Boolean] true if the version is newer than +other+
106
+ def newer?(other)
107
+ (self <=> other) > 0
108
+ end
109
+
110
+
111
+ # @param [Version] other Version to compare against
112
+ # @return [Boolean] true if the version is older than +other+
113
+ def older?(other)
114
+ ! newer?(other)
115
+ end
116
+
117
+ # String representation in the form "v-r"
118
+ # @return [String]
119
+ # @note The epoch is not included
120
+ def to_vr
121
+ vr = @r.nil? ? "#{@v}" : "#{@v}-#{@r}"
122
+ end
123
+
124
+ # String representation in the form "e:v-r"
125
+ # @return [String]
126
+ # @note The epoch is included if present
127
+ def to_vre(opts={})
128
+ vr = to_vr
129
+ vre = @e.nil? ? vr : "#{@e}:#{vr}"
130
+ end
131
+
132
+ # Alias for +to_vr+
133
+ # @see Version#to_vr
134
+ def to_s
135
+ to_vr
136
+ end
137
+
138
+ # Hash based on the version content
139
+ # @return [String]
140
+ def hash
141
+ h = @e.nil? ? 0 : @e;
142
+ h = (h << 1) ^ @r.hash
143
+ h = (h << 1) ^ @v.hash
144
+ end
145
+
146
+ # String representation in the form "e:v-r"
147
+ # @return [String]
148
+ # @note The epoch is included always. As 0 if not present
149
+ def to_vre_epoch_zero
150
+ vr = to_vr
151
+ vre = @e.nil? ? "0:#{vr}" : "#{@e}:#{vr}"
152
+ end
153
+
154
+ end
155
+
3
156
  end
data/lib/rpm.rb CHANGED
@@ -1,5 +1,76 @@
1
- require "rpm/version"
2
1
 
3
- module Rpm
4
- # Your code goes here...
2
+ require 'rpm/ffi'
3
+ require 'rpm/package'
4
+ require 'rpm/db'
5
+ require 'rpm/transaction'
6
+ require 'rpm/match_iterator'
7
+ require 'rpm/version'
8
+ require 'rpm/dependency'
9
+ require 'rpm/utils'
10
+
11
+ module RPM
12
+
13
+ module LibC
14
+ extend ::FFI::Library
15
+ ffi_lib ::FFI::Library::LIBC
16
+
17
+ # call #attach_function to attach to malloc, free, memcpy, bcopy, etc.
18
+ attach_function :malloc, [:size_t], :pointer
19
+ end
20
+
21
+ TAG = RPM::FFI::Tag
22
+ LOG = RPM::FFI::Log
23
+ SENSE = RPM::FFI::Sense
24
+ FILE = RPM::FFI::FileAttrs
25
+ FILE_STATE = RPM::FFI::FileState
26
+ TRANS_FLAG = RPM::FFI::TransFlags
27
+ PROB_FILTER = RPM::FFI::ProbFilter
28
+ MIRE = RPM::FFI::RegexpMode
29
+
30
+ # Creates a new transaction and pass it
31
+ # to the given block
32
+ #
33
+ # @param [String] root dir, default '/'
34
+ #
35
+ # @example
36
+ # RPM.transaction do |ts|
37
+ # ...
38
+ # end
39
+ #
40
+ def self.transaction(root = '/')
41
+ ts = Transaction.new
42
+ ts.root_dir = root
43
+ yield ts
44
+ end
45
+
46
+
47
+ # @param [String] name Name of the macro
48
+ # @return [String] value of macro +name+
49
+ def self.[](name)
50
+ val = String.new
51
+ buffer = ::FFI::MemoryPointer.new(:pointer, 1024)
52
+ buffer.write_string("%{#{name}}")
53
+ ret = RPM::FFI.expandMacros(nil, nil, buffer, 1024)
54
+ buffer.read_string
55
+ end
56
+
57
+ # Setup a macro
58
+ # @param [String] name Name of the macro
59
+ # @param [String] value Value of the macro or +nil+ to delete it
60
+ def self.[]=(name, value)
61
+ if value.nil?
62
+ RPM::FFI.delMacro(nil, name.to_s)
63
+ else
64
+ RPM::FFI.addMacro(nil, name.to_s, nil, value.to_s, RPM::FFI::RMIL_DEFAULT)
65
+ end
66
+ end
67
+
5
68
  end
69
+
70
+ RPM::FFI.rpmReadConfigFiles(nil, nil)
71
+ RPM::FFI.rpmInitMacros(nil, RPM::FFI.MACROFILES)
72
+
73
+ # TODO
74
+ # set verbosity
75
+
76
+ require 'rpm/compat'
data/rpm.gemspec CHANGED
@@ -1,18 +1,24 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  $:.push File.expand_path("../lib", __FILE__)
3
- require "rpm/version"
3
+ require "rpm/gem_version"
4
4
 
5
5
  Gem::Specification.new do |s|
6
6
  s.name = "rpm"
7
- s.version = RPM::VERSION
7
+ s.version = RPM::GEM_VERSION
8
8
  s.authors = ["Duncan Mac-Vicar P."]
9
9
  s.email = ["dmacvicar@suse.de"]
10
10
  s.homepage = ""
11
- s.summary = %q{Placeholder for upcoming release of rpm bindings}
12
- s.description = %q{Placeholder for new rpm bindings}
11
+ s.summary = %q{Ruby bindings for rpm (package manager)}
12
+ s.description = %q{Ruby bindings for rpm. Almost a drop-in replacement for ruby-rpm. Uses FFI.}
13
+
14
+ s.rubyforge_project = "rpm"
13
15
 
14
16
  s.files = `git ls-files`.split("\n")
15
17
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
16
18
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
17
19
  s.require_paths = ["lib"]
20
+
21
+ # specify any dependencies here; for example:
22
+ # s.add_development_dependency "rspec"
23
+ s.add_runtime_dependency "ffi"
18
24
  end
data/test/data/a.spec ADDED
@@ -0,0 +1,49 @@
1
+ Name: a
2
+ Version: 1.0
3
+ Release: 0
4
+ License: GPLv2
5
+ Summary: Minimal package example
6
+ Url: http://www.a.com
7
+ Group: Development
8
+ Source: a-1.0.tar.gz
9
+ BuildRequires: c d
10
+ Provides: something
11
+ BuildRoot: %{_tmppath}/%{name}-%{version}-build
12
+
13
+ %description
14
+ Description
15
+
16
+ %package devel
17
+ Summary: Development part
18
+ %description devel
19
+ Development headers
20
+
21
+ %prep
22
+ %setup -q
23
+
24
+ %build
25
+ %configure
26
+ make %{?_smp_mflags}
27
+
28
+ %install
29
+ %make_install
30
+
31
+ %clean
32
+ %{?buildroot:%__rm -rf "%{buildroot}"}
33
+
34
+ %post
35
+
36
+ %postun
37
+
38
+ %files
39
+ %defattr(-,root,root)
40
+ %doc ChangeLog README COPYING
41
+ %{_datadir}/a/README
42
+
43
+ %files devel
44
+ %{_includedir}/a.h
45
+
46
+
47
+
48
+ %changelog
49
+
Binary file
@@ -0,0 +1,42 @@
1
+ Name: simple
2
+ Version: 1.0
3
+ Release: 0
4
+ License: GPL
5
+ Summary: Simple dummy package
6
+ Summary(es): Paquete simple de muestra
7
+ Url: http://www.dummmy.com
8
+ Group: Development
9
+ BuildRoot: %{_tmppath}/%{name}-%{version}-build
10
+
11
+ %description
12
+ Dummy package
13
+
14
+ %description -l es
15
+ Paquete de muestra
16
+
17
+ %prep
18
+
19
+ %build
20
+ mkdir -p %{buildroot}%{_datadir}/%{name}
21
+ echo "Hello" > %{buildroot}%{_datadir}/%{name}/README
22
+ echo "Hola" > %{buildroot}%{_datadir}/%{name}/README.es
23
+
24
+ %install
25
+
26
+ %clean
27
+ %{?buildroot:%__rm -rf "%{buildroot}"}
28
+
29
+ %post
30
+
31
+ %postun
32
+
33
+ %files
34
+ %defattr(-,root,root)
35
+ %{_datadir}/%{name}/README
36
+ %{_datadir}/%{name}/README.es
37
+
38
+ %changelog
39
+ * Wed Nov 06 2011 Duncan Mac-Vicar P. <dmacvicar@suse.de>
40
+ - Fix something
41
+ * Tue Nov 05 2011 Duncan Mac-Vicar P. <dmacvicar@suse.de>
42
+ - Fix something else
data/test/helper.rb ADDED
@@ -0,0 +1,7 @@
1
+ $: << File.join(File.dirname(__FILE__), "..", "lib")
2
+ require 'test/unit'
3
+ require 'rpm'
4
+
5
+ def fixture(name)
6
+ File.join(File.dirname(__FILE__), 'data', name)
7
+ end
@@ -0,0 +1,29 @@
1
+ require File.join(File.dirname(__FILE__), 'helper')
2
+ require 'rpm/compat'
3
+
4
+ class RPM_Dependency_Tests < Test::Unit::TestCase
5
+
6
+ EQ = RPM::SENSE_EQUAL
7
+ LT = RPM::SENSE_LESS
8
+ GT = RPM::SENSE_GREATER
9
+
10
+ def test_satisfy
11
+ prv = provides("foo", "2", "1", 0, EQ)
12
+ req = requires("foo", "1", "1", 0, EQ|GT)
13
+ assert(req.satisfy?(prv))
14
+ assert(prv.satisfy?(req))
15
+
16
+ # Different names don't overlap
17
+ prv = provides("foo", "2", "1", 0, EQ)
18
+ req = requires("bar", "1", "1", 0, EQ|GT)
19
+ assert(! req.satisfy?(prv))
20
+ end
21
+
22
+ def provides(name, v, r, e, sense)
23
+ RPM::Provide.new(name, RPM::Version.new(v, r, e), sense, nil)
24
+ end
25
+
26
+ def requires(name, v, r, e, sense)
27
+ RPM::Require.new(name, RPM::Version.new(v, r, e), sense, nil)
28
+ end
29
+ end
data/test/test_file.rb ADDED
@@ -0,0 +1,12 @@
1
+ require File.join(File.dirname(__FILE__), 'helper')
2
+
3
+ class RPM_File_Tests < Test::Unit::TestCase
4
+ def test_link_to
5
+ f = RPM::File.new("path", "md5sum", nil, 42, 1,
6
+ "owner", "group", 43, 0777, 44, 45)
7
+ assert_equal(nil, f.link_to)
8
+ f = RPM::File.new("path", "md5sum", "link_to", 42, 1,
9
+ "owner", "group", 43, 0777, 44, 45)
10
+ assert_equal("link_to", f.link_to)
11
+ end
12
+ end
data/test/test_lib.rb ADDED
@@ -0,0 +1,36 @@
1
+ require File.join(File.dirname(__FILE__), 'helper')
2
+
3
+ class RPM_Lib_Tests < Test::Unit::TestCase
4
+
5
+ def test_lib_lib
6
+ assert_kind_of String, RPM::FFI.RPMVERSION
7
+ # "x.y.z"
8
+ assert(RPM::FFI.RPMVERSION.size >= 5)
9
+ assert_kind_of Fixnum, RPM::FFI.rpm_version_code
10
+ # >= 4.0.0
11
+ assert(RPM::FFI.rpm_version_code >= ((4 << 16) + (0 << 8) + (0 << 0)))
12
+ end
13
+
14
+ def test_lib_header
15
+ ptr = RPM::FFI.headerNew
16
+ RPM::FFI.headerFree(ptr)
17
+ end
18
+
19
+ def test_lib_ts
20
+ ts = RPM::FFI.rpmtsCreate
21
+ RPM::FFI.rpmtsSetRootDir(ts, "/")
22
+ it = RPM::FFI.rpmtsInitIterator(ts, 0, nil, 0)
23
+ hdrs = []
24
+ while (not (hdr = RPM::FFI.rpmdbNextIterator(it)).null?)
25
+ hdrs << hdr
26
+ assert_kind_of String, RPM::FFI.headerGetAsString(hdr, :name)
27
+ end
28
+ RPM::FFI.rpmdbFreeIterator(it)
29
+
30
+ end
31
+
32
+ def test_lib_macros
33
+ assert_kind_of String, RPM::FFI.MACROFILES
34
+ end
35
+
36
+ end
@@ -0,0 +1,60 @@
1
+ require File.join(File.dirname(__FILE__), 'helper')
2
+
3
+ class RPM_Header_Tests < Test::Unit::TestCase
4
+
5
+ def test_create
6
+
7
+ pkg = RPM::Package.create('foo', RPM::Version.new('1.0'))
8
+ assert_equal 'foo', pkg.name
9
+ assert_equal '(none)', pkg.signature
10
+ end
11
+
12
+ def test_open
13
+
14
+ pkg = RPM::Package.open(fixture('simple-1.0-0.i586.rpm'))
15
+
16
+ req = RPM::Require.new("simple", RPM::Version.new("1.0", "0"), RPM::SENSE_GREATER|RPM::SENSE_EQUAL, nil)
17
+ assert req.satisfy?(pkg)
18
+
19
+ assert_equal "simple-1.0-0-i586", pkg.to_s
20
+
21
+ assert_equal '6895248ed5a081f73d035174329169c7', pkg.signature
22
+
23
+ assert_kind_of RPM::Package, pkg
24
+ assert_equal 'simple', pkg[:name]
25
+ assert_equal 'i586', pkg[:arch]
26
+ assert_kind_of RPM::Version, pkg.version
27
+ assert_equal '1.0-0', pkg.version.to_s
28
+
29
+ backup_lang = ENV['LANG']
30
+
31
+ ENV['LANG'] = 'C'
32
+ assert_equal 'Simple dummy package', pkg[:summary]
33
+ assert_equal 'Dummy package', pkg[:description]
34
+
35
+ ENV['LANG'] = 'es'
36
+ assert_equal 'Paquete simple de muestra', pkg[:summary]
37
+ assert_equal 'Paquete de muestra', pkg[:description]
38
+
39
+ ENV['LANG'] = backup_lang
40
+
41
+ # Arrays
42
+ assert_equal ["root", "root"], pkg[:fileusername]
43
+ assert_equal [6, 5], pkg[:filesizes]
44
+
45
+ assert pkg.provides.map(&:name).include?("simple(x86-32)")
46
+ assert pkg.provides.map(&:name).include?("simple")
47
+
48
+ assert pkg.requires.map(&:name).include?("/bin/sh")
49
+
50
+ assert pkg.files.map(&:path).include?("/usr/share/simple/README")
51
+ assert pkg.files.map(&:path).include?("/usr/share/simple/README.es")
52
+
53
+ file = pkg.files.select {|x| x.path == "/usr/share/simple/README" }.first
54
+ assert_nil file.link_to
55
+ assert !file.symlink?
56
+
57
+ assert_equal ["- Fix something", "- Fix something else"], pkg.changelog.map(&:text)
58
+ end
59
+
60
+ end
data/test/test_rpm.rb ADDED
@@ -0,0 +1,37 @@
1
+ require File.join(File.dirname(__FILE__), 'helper')
2
+
3
+ class RPM_RPM_Tests < Test::Unit::TestCase
4
+
5
+ def test_enum
6
+ assert RPM::TAG[:not_found]
7
+ end
8
+
9
+ def test_compat
10
+ #puts RPM::LOG_ALERT
11
+ #assert_raise(NameError) { RPM::LOG_ALERT }
12
+
13
+ #require 'rpm/compat'
14
+ assert_nothing_raised { RPM::LOG_ALERT }
15
+ assert_equal RPM::LOG_ALERT, RPM::LOG[:alert]
16
+ end
17
+
18
+ def test_iterator
19
+ RPM.transaction do |t|
20
+ assert_kind_of RPM::Transaction, t
21
+ #t.each do |pkg|
22
+ # puts pkg[:name]
23
+ #end
24
+ end
25
+ end
26
+
27
+ def test_macro_read
28
+ assert_equal '/usr', RPM['_usr']
29
+ end
30
+
31
+ def test_macro_write
32
+ RPM['hoge'] = 'hoge'
33
+ assert_equal( RPM['hoge'], 'hoge' )
34
+ end
35
+
36
+
37
+ end # class RPM_RPM_Tests < Test::Unit::TestCase