repomd_parser 0.1.6 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 651e3571a7eb4f5e890a8b8fab2cb1d2e1ffe9b446099f9b1ef7a4e1bfa1654e
4
- data.tar.gz: cc198d24a1ac1aaf09a3ae5a9ca50fb06fe16b52311ab9ab7ecc8b29ef0af4e3
3
+ metadata.gz: 4f7ff99bff5d57e3ac804ae0bb0e9b400d063d3e3356d4728ebfa111af23b98f
4
+ data.tar.gz: 57e8cae44d279cb14d968b9593d38fc90acd7719df4599fe2504095121681d5f
5
5
  SHA512:
6
- metadata.gz: d61636f109f8c67d526d3b4d88a531ccf49cf9b2f65e91c475884e9c435a126b7c3d8d1b992ebeca4e2be079d5f92d285edd1e3031480fdd0df99d92130791d6
7
- data.tar.gz: c02f8e14053a30d28f6b3c216522cd6edc83099adac98553b099f68b0901f5d9922b0cc99e7e92934ed13be7d6ecb2d40a0435ba9ad563befec5b724f3074645
6
+ metadata.gz: 3a897e1c8b28083cb9a8a170a1f0284b18a64ca2f8f387588d730d0149cd740da7308bc7a62903f24a0d13133158042f62a69da19d8e274c3f4e1a4ae71a0a3a
7
+ data.tar.gz: 18edf9de4f6c9d4efeb0dca5a099604e088cd7f2db934f317a70ee8939cf7adfa239f0f60dd05bdbad356449834e19bb2903df893d0e1b59e42fb21b802bca72
data/README.md CHANGED
@@ -20,10 +20,23 @@ Alternatively, install as `gem install repomd_parser`.
20
20
 
21
21
  Parses `repomd.xml` -- the main repository metadata file, which references other metadata files.
22
22
 
23
- `parse` method returns an array of `RepomdParser::Reference`.
23
+ `parse` and `parse_file` methods return an array of `RepomdParser::Reference`.
24
+
25
+ ##### Using the `parse` method
24
26
 
25
27
  ```ruby
26
- metadata_files = RepomdParser::RepomdXmlParser.new('repomd.xml').parse
28
+ File.open('repomd.xml') do |fh|
29
+ metadata_files = RepomdParser::RepomdXmlParser.new.parse(fh)
30
+ metadata_files.each do |metadata_file|
31
+ printf "type: %10s, location: %s\n", metadata_file.type, metadata_file.location
32
+ end
33
+ end
34
+ ```
35
+
36
+ ##### Using the `parse_file` method
37
+
38
+ ```ruby
39
+ metadata_files = RepomdParser::RepomdXmlParser.new.parse_file('repomd.xml')
27
40
  metadata_files.each do |metadata_file|
28
41
  printf "type: %10s, location: %s\n", metadata_file.type, metadata_file.location
29
42
  end
@@ -33,10 +46,23 @@ end
33
46
 
34
47
  Parses `primary.xml`, which contains information about RPM packages in the repository.
35
48
 
36
- `parse` method returns an array of `RepomdParser::Reference`.
49
+ `parse` and `parse_file` methods return an array of `RepomdParser::Reference`.
50
+
51
+ ##### Using the `parse` method
52
+
53
+ ```ruby
54
+ File.open('primary.xml') do |fh|
55
+ rpm_packages = RepomdParser::PrimaryXmlParser.new.parse(fh)
56
+ rpm_packages.each do |rpm|
57
+ printf "arch: %8s, location: %s\n", rpm.arch, rpm.location
58
+ end
59
+ end
60
+ ```
61
+
62
+ ##### Using the `parse_file` method
37
63
 
38
64
  ```ruby
39
- rpm_packages = RepomdParser::PrimaryXmlParser.new('primary.xml').parse
65
+ rpm_packages = RepomdParser::PrimaryXmlParser.new.parse_file('primary.xml')
40
66
  rpm_packages.each do |rpm|
41
67
  printf "arch: %8s, location: %s\n", rpm.arch, rpm.location
42
68
  end
@@ -46,15 +72,54 @@ end
46
72
 
47
73
  Parses `deltainfo.xml`, which contains information about delta-RPM packages in the repository.
48
74
 
49
- `parse` method returns an array of `RepomdParser::Reference`.
75
+ `parse` and `parse_file` methods return an array of `RepomdParser::Reference`.
76
+
77
+ ##### Using the `parse` method
78
+
79
+ ```ruby
80
+ File.open('deltainfo.xml') do |fh|
81
+ rpm_packages = RepomdParser::DeltainfoXmlParser.new.parse(fh)
82
+ rpm_packages.each do |rpm|
83
+ printf "arch: %8s, location: %s\n", rpm.arch, rpm.location
84
+ end
85
+ end
86
+ ```
87
+
88
+ ##### Using the `parse_file` method
50
89
 
51
90
  ```ruby
52
- rpm_packages = RepomdParser::DeltainfoXmlParser.new('deltainfo.xml').parse
91
+ rpm_packages = RepomdParser::DeltainfoXmlParser.new.parse_file('deltainfo.xml')
53
92
  rpm_packages.each do |rpm|
54
93
  printf "arch: %8s, location: %s\n", rpm.arch, rpm.location
55
94
  end
56
95
  ```
57
96
 
97
+ #### Compressed file support
98
+
99
+ The gzip and Zstandard compression formats are supported. The `parse_file`
100
+ method automatically decompresses files based on the filename, e.g.:
101
+
102
+ ```ruby
103
+ rpm_packages = RepomdParser::PrimaryXmlParser.new.parse_file('primary.xml.gz')
104
+ rpm_packages.each do |rpm|
105
+ printf "arch: %8s, location: %s\n", rpm.arch, rpm.location
106
+ end
107
+ ```
108
+
109
+ The `RepomdParser.decompress_io` helper is provided to handle
110
+ decompression of IO objects for use with the `parse` method:
111
+
112
+ ```ruby
113
+ filename = 'primary.xml.gz'
114
+ io = RepomdParser.decompress_io(File.open(filename), filename)
115
+
116
+ rpm_packages = RepomdParser::PrimaryXmlParser.new.parse(io)
117
+ rpm_packages.each do |rpm|
118
+ printf "arch: %8s, location: %s\n", rpm.arch, rpm.location
119
+ end
120
+ ```
121
+
122
+
58
123
  #### RepomdParser::Reference
59
124
 
60
125
  Represents a file referenced in the metadata file. Has the following accessors:
@@ -75,7 +140,8 @@ RPM and DRPM files additionally have the following attributes:
75
140
 
76
141
  ## Caveats
77
142
 
78
- * Relies on the file extension to determine if the file is compressed (automatically decompresses `.gz` and `.zst` files)
143
+ * File extension is used to determine file compression type (expected
144
+ extensions are `.gz` and `.zst` for gzip and Zstandard respectively)
79
145
 
80
146
  ## Development
81
147
 
@@ -16,30 +16,26 @@
16
16
  # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17
17
 
18
18
  require 'nokogiri'
19
- require 'zlib'
20
19
 
21
20
  class RepomdParser::BaseParser < Nokogiri::XML::SAX::Document
22
- def initialize(filename)
23
- super()
24
- @referenced_files = []
25
- @filename = filename
21
+ def parse_file(filename)
22
+ io = RepomdParser.decompress_io(File.open(filename), filename)
23
+ parse(io)
24
+ ensure
25
+ io.close
26
26
  end
27
27
 
28
- def parse
29
- Nokogiri::XML::SAX::Parser.new(self).parse(file_io_class.open(@filename))
30
- @referenced_files
28
+ def parse(io_object)
29
+ @referenced_files = []
30
+ Nokogiri::XML::SAX::Parser.new(self).parse(io_object)
31
+ ret_val = @referenced_files
32
+ @referenced_files = nil
33
+
34
+ ret_val
31
35
  end
32
36
 
33
37
  protected
34
38
 
35
- def file_io_class
36
- case File.extname(@filename)
37
- when '.gz' then Zlib::GzipReader
38
- when '.zst' then RepomdParser::ZstdReader
39
- else File
40
- end
41
- end
42
-
43
39
  def get_attribute(attributes, name)
44
40
  attributes.select { |e| e[0] == name }.first[1]
45
41
  end
@@ -16,13 +16,15 @@
16
16
  # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17
17
 
18
18
  class RepomdParser::RepomdXmlParser
19
- def initialize(filename)
20
- @filename = filename
19
+ def parse_file(filename)
20
+ File.open(filename) do |fh|
21
+ parse(fh)
22
+ end
21
23
  end
22
24
 
23
- def parse
25
+ def parse(io_object)
24
26
  files = []
25
- xml = Nokogiri::XML(File.open(@filename))
27
+ xml = Nokogiri::XML(io_object)
26
28
 
27
29
  xml.xpath('/xmlns:repomd/xmlns:data').each do |data_node|
28
30
  type = data_node.attr('type').to_sym
@@ -16,5 +16,5 @@
16
16
  # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17
17
 
18
18
  module RepomdParser
19
- VERSION = '0.1.6'.freeze
19
+ VERSION = '1.1.0'.freeze
20
20
  end
@@ -17,15 +17,15 @@
17
17
 
18
18
  require 'zstd-ruby'
19
19
 
20
- class RepomdParser::ZstdReader < File
21
- def initialize(*args)
22
- super(*args)
20
+ class RepomdParser::ZstdReader
21
+ def initialize(io_object)
22
+ @io = io_object
23
23
  @stream = Zstd::StreamingDecompress.new
24
24
  @buffer = ''
25
25
  end
26
26
 
27
27
  def read(len = nil, out = nil)
28
- @buffer << @stream.decompress(super(len)) while @buffer.size < len && !eof
28
+ @buffer << @stream.decompress(@io.read(len)) while @buffer.size < len && !@io.eof
29
29
 
30
30
  if @buffer.size > len
31
31
  out = @buffer[0..len]
@@ -37,4 +37,8 @@ class RepomdParser::ZstdReader < File
37
37
 
38
38
  out
39
39
  end
40
+
41
+ def close
42
+ @io.close
43
+ end
40
44
  end
data/lib/repomd_parser.rb CHANGED
@@ -15,9 +15,6 @@
15
15
  # with this program; if not, write to the Free Software Foundation, Inc.,
16
16
  # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17
17
 
18
- module RepomdParser
19
- end
20
-
21
18
  require 'repomd_parser/version'
22
19
  require 'repomd_parser/reference'
23
20
  require 'repomd_parser/base_parser'
@@ -25,3 +22,17 @@ require 'repomd_parser/repomd_xml_parser'
25
22
  require 'repomd_parser/deltainfo_xml_parser'
26
23
  require 'repomd_parser/primary_xml_parser'
27
24
  require 'repomd_parser/zstd_reader'
25
+
26
+ require 'zlib'
27
+ require 'bzip2/ffi'
28
+
29
+ module RepomdParser
30
+ def self.decompress_io(io_object, filename)
31
+ case File.extname(filename)
32
+ when '.gz' then Zlib::GzipReader.new(io_object)
33
+ when '.zst' then RepomdParser::ZstdReader.new(io_object)
34
+ when '.bz2' then Bzip2::FFI::Reader.open(io_object)
35
+ else io_object
36
+ end
37
+ end
38
+ end
@@ -33,6 +33,7 @@ Gem::Specification.new do |spec|
33
33
  spec.add_development_dependency 'rubocop', '<= 1.25'
34
34
  spec.add_development_dependency 'rubocop-ast', '<= 1.17.0'
35
35
 
36
+ spec.add_dependency 'bzip2-ffi', '~> 1.1.1'
36
37
  spec.add_dependency 'nokogiri', '~> 1.8'
37
38
  spec.add_dependency 'zstd-ruby', '~> 1.3', '>= 1.3.5.0'
38
39
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: repomd_parser
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ivan Kapelyukhin
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-01-23 00:00:00.000000000 Z
11
+ date: 2024-04-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -94,6 +94,20 @@ dependencies:
94
94
  - - "<="
95
95
  - !ruby/object:Gem::Version
96
96
  version: 1.17.0
97
+ - !ruby/object:Gem::Dependency
98
+ name: bzip2-ffi
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 1.1.1
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 1.1.1
97
111
  - !ruby/object:Gem::Dependency
98
112
  name: nokogiri
99
113
  requirement: !ruby/object:Gem::Requirement