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 +4 -4
- data/README.md +73 -7
- data/lib/repomd_parser/base_parser.rb +12 -15
- data/lib/repomd_parser/repomd_xml_parser.rb +6 -4
- data/lib/repomd_parser/version.rb +1 -1
- data/lib/repomd_parser/zstd_reader.rb +8 -4
- data/lib/repomd_parser.rb +10 -3
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 464be2962408f4592e3d06eadda7c14ac22f0e7deea9b962e246bc13e40181cb
|
4
|
+
data.tar.gz: 9caa45644420feea003a12f2902d02f538972c0e68b76a26b85229ffe03e1b61
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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`
|
23
|
+
`parse` and `parse_file` methods return an array of `RepomdParser::Reference`.
|
24
|
+
|
25
|
+
##### Using the `parse` method
|
24
26
|
|
25
27
|
```ruby
|
26
|
-
|
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`
|
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')
|
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`
|
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')
|
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
|
-
*
|
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
|
23
|
-
|
24
|
-
|
25
|
-
|
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
|
-
|
30
|
-
|
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
|
20
|
-
|
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(
|
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
|
@@ -17,15 +17,15 @@
|
|
17
17
|
|
18
18
|
require 'zstd-ruby'
|
19
19
|
|
20
|
-
class RepomdParser::ZstdReader
|
21
|
-
def initialize(
|
22
|
-
|
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(
|
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.
|
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-
|
11
|
+
date: 2024-04-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|