repomd_parser 0.1.6 → 1.0.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: 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