repomd_parser 0.1.6 → 1.0.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 651e3571a7eb4f5e890a8b8fab2cb1d2e1ffe9b446099f9b1ef7a4e1bfa1654e
4
- data.tar.gz: cc198d24a1ac1aaf09a3ae5a9ca50fb06fe16b52311ab9ab7ecc8b29ef0af4e3
3
+ metadata.gz: 464be2962408f4592e3d06eadda7c14ac22f0e7deea9b962e246bc13e40181cb
4
+ data.tar.gz: 9caa45644420feea003a12f2902d02f538972c0e68b76a26b85229ffe03e1b61
5
5
  SHA512:
6
- metadata.gz: d61636f109f8c67d526d3b4d88a531ccf49cf9b2f65e91c475884e9c435a126b7c3d8d1b992ebeca4e2be079d5f92d285edd1e3031480fdd0df99d92130791d6
7
- data.tar.gz: c02f8e14053a30d28f6b3c216522cd6edc83099adac98553b099f68b0901f5d9922b0cc99e7e92934ed13be7d6ecb2d40a0435ba9ad563befec5b724f3074645
6
+ metadata.gz: b7e9367a0b325fd882238e38d71cf98ebf535d9fa4452ffb90dcaf9f0667081e8cca1bd8db716c35270c23d955281845da2c9a7195c656c5c4210f9bd2d1e84a
7
+ data.tar.gz: 6697e2943d63f684229439453c4e08ee5cded95059d3eacbd61f610bd0087f8b388780648b6ef9092cac9323d5c768ab5fc3970d89a54bb9d4bdb8851873c093
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
 
@@ -19,27 +19,24 @@ require 'nokogiri'
19
19
  require 'zlib'
20
20
 
21
21
  class RepomdParser::BaseParser < Nokogiri::XML::SAX::Document
22
- def initialize(filename)
23
- super()
24
- @referenced_files = []
25
- @filename = filename
22
+ def parse_file(filename)
23
+ io = RepomdParser.decompress_io(File.open(filename), filename)
24
+ parse(io)
25
+ ensure
26
+ io.close
26
27
  end
27
28
 
28
- def parse
29
- Nokogiri::XML::SAX::Parser.new(self).parse(file_io_class.open(@filename))
30
- @referenced_files
29
+ def parse(io_object)
30
+ @referenced_files = []
31
+ Nokogiri::XML::SAX::Parser.new(self).parse(io_object)
32
+ ret_val = @referenced_files
33
+ @referenced_files = nil
34
+
35
+ ret_val
31
36
  end
32
37
 
33
38
  protected
34
39
 
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
40
  def get_attribute(attributes, name)
44
41
  attributes.select { |e| e[0] == name }.first[1]
45
42
  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.0.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,13 @@ 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
+ module RepomdParser
27
+ def self.decompress_io(io_object, filename)
28
+ case File.extname(filename)
29
+ when '.gz' then Zlib::GzipReader.new(io_object)
30
+ when '.zst' then RepomdParser::ZstdReader.new(io_object)
31
+ else io_object
32
+ end
33
+ end
34
+ 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.0.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