repomd_parser 0.1.5 → 0.1.6

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: 7e96fc8459331c46c5a95a479d50c93973db28675e71f37d367300ad921c5995
4
- data.tar.gz: 0bc27934593e3e22225850446f537754e0ee7e0f1d190fdb27e51019dffd3771
3
+ metadata.gz: 651e3571a7eb4f5e890a8b8fab2cb1d2e1ffe9b446099f9b1ef7a4e1bfa1654e
4
+ data.tar.gz: cc198d24a1ac1aaf09a3ae5a9ca50fb06fe16b52311ab9ab7ecc8b29ef0af4e3
5
5
  SHA512:
6
- metadata.gz: 10fc061b160790a2bf8a4f440dbbbdcc3cbbfbb9c70fd40616a16be1c7270040695a440eb65ae3a493ac5b6aac791c43002f580782a2a88eb2405ee5d4dce50c
7
- data.tar.gz: 5905bf2dfcce585e9ebcadf452dab17ebb17a0dcf0e5d04f010042d982a4b0484204e4b56fdd48e142dc308022d58e028ea3b5076c93af775be6cddda0a648cd
6
+ metadata.gz: d61636f109f8c67d526d3b4d88a531ccf49cf9b2f65e91c475884e9c435a126b7c3d8d1b992ebeca4e2be079d5f92d285edd1e3031480fdd0df99d92130791d6
7
+ data.tar.gz: c02f8e14053a30d28f6b3c216522cd6edc83099adac98553b099f68b0901f5d9922b0cc99e7e92934ed13be7d6ecb2d40a0435ba9ad563befec5b724f3074645
data/Gemfile CHANGED
@@ -1,6 +1,6 @@
1
- source "https://rubygems.org"
1
+ source 'https://rubygems.org'
2
2
 
3
- git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
3
+ git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
4
4
 
5
5
  # Specify your gem's dependencies in repomd_parser.gemspec
6
6
  gemspec
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # RepomdParser [![Build Status](https://travis-ci.org/ikapelyukhin/repomd-parser.svg?branch=master)](https://travis-ci.org/ikapelyukhin/repomd-parser)
1
+ # RepomdParser
2
2
 
3
3
  RPM repository metadata parser.
4
4
 
@@ -75,11 +75,11 @@ RPM and DRPM files additionally have the following attributes:
75
75
 
76
76
  ## Caveats
77
77
 
78
- * Relies on the file name to determine if the file is compressed (automatically decompresses `.gz` files)
78
+ * Relies on the file extension to determine if the file is compressed (automatically decompresses `.gz` and `.zst` files)
79
79
 
80
80
  ## Development
81
81
 
82
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
82
+ After checking out the repo, run `bundle install` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
83
83
 
84
84
  To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
85
85
 
data/Rakefile CHANGED
@@ -1,6 +1,6 @@
1
- require "bundler/gem_tasks"
2
- require "rspec/core/rake_task"
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
3
 
4
4
  RSpec::Core::RakeTask.new(:spec)
5
5
 
6
- task :default => :spec
6
+ task default: :spec
@@ -19,30 +19,28 @@ require 'nokogiri'
19
19
  require 'zlib'
20
20
 
21
21
  class RepomdParser::BaseParser < Nokogiri::XML::SAX::Document
22
-
23
22
  def initialize(filename)
23
+ super()
24
24
  @referenced_files = []
25
25
  @filename = filename
26
26
  end
27
27
 
28
28
  def parse
29
- if (File.extname(@filename) == '.gz')
30
- Zlib::GzipReader.open(@filename) do |gz|
31
- Nokogiri::XML::SAX::Parser.new(self).parse(gz)
32
- end
33
- else
34
- File.open(@filename) do |fh|
35
- Nokogiri::XML::SAX::Parser.new(self).parse(fh)
36
- end
37
- end
38
-
29
+ Nokogiri::XML::SAX::Parser.new(self).parse(file_io_class.open(@filename))
39
30
  @referenced_files
40
31
  end
41
32
 
42
33
  protected
43
34
 
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
+
44
43
  def get_attribute(attributes, name)
45
44
  attributes.select { |e| e[0] == name }.first[1]
46
45
  end
47
-
48
46
  end
@@ -16,49 +16,45 @@
16
16
  # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17
17
 
18
18
  class RepomdParser::DeltainfoXmlParser < RepomdParser::BaseParser
19
-
20
- def initialize(filename)
21
- super(filename)
22
- end
23
-
24
19
  def start_element(name, attrs = [])
25
20
  @current_node = name.to_sym
26
- if (name == 'newpackage')
21
+ case name
22
+ when 'newpackage'
27
23
  @package = {}
28
24
  @package[:version] = get_attribute(attrs, 'version')
29
25
  @package[:name] = get_attribute(attrs, 'name')
30
26
  @package[:arch] = get_attribute(attrs, 'arch')
31
- elsif (name == 'delta')
27
+ when 'delta'
32
28
  @delta = {}
33
- elsif (name == 'checksum')
29
+ when 'checksum'
34
30
  @delta[:checksum_type] = get_attribute(attrs, 'type')
35
31
  end
36
32
  end
37
33
 
38
34
  def characters(string)
39
- if (@current_node == :filename)
35
+ case @current_node
36
+ when :filename
40
37
  @delta[:location] ||= ''
41
38
  @delta[:location] += string.strip
42
- elsif (@current_node == :checksum)
39
+ when :checksum
43
40
  @delta[:checksum] ||= ''
44
41
  @delta[:checksum] += string.strip
45
- elsif (@current_node == :size)
42
+ when :size
46
43
  @delta[:size] ||= ''
47
44
  @delta[:size] += string.strip
48
45
  end
49
46
  end
50
47
 
51
48
  def end_element(name)
52
- if (name == 'delta')
53
- @referenced_files << RepomdParser::Reference.new(
54
- location: @delta[:location],
55
- checksum_type: @delta[:checksum_type],
56
- checksum: @delta[:checksum],
57
- type: :drpm,
58
- size: @delta[:size].to_i,
59
- arch: @package[:arch],
60
- )
61
- end
62
- end
49
+ return unless name == 'delta'
63
50
 
51
+ @referenced_files << RepomdParser::Reference.new(
52
+ location: @delta[:location],
53
+ checksum_type: @delta[:checksum_type],
54
+ checksum: @delta[:checksum],
55
+ type: :drpm,
56
+ size: @delta[:size].to_i,
57
+ arch: @package[:arch]
58
+ )
59
+ end
64
60
  end
@@ -16,54 +16,49 @@
16
16
  # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17
17
 
18
18
  class RepomdParser::PrimaryXmlParser < RepomdParser::BaseParser
19
-
20
- def initialize(filename)
21
- super(filename)
22
- end
23
-
24
19
  def start_element(name, attrs = [])
25
20
  @current_node = name.to_sym
26
- if (name == 'package')
21
+ case name
22
+ when 'package'
27
23
  @package = {}
28
- elsif (name == 'version')
24
+ when 'version'
29
25
  @package[:version] = get_attribute(attrs, 'ver')
30
26
  @package[:release] = get_attribute(attrs, 'rel')
31
- elsif (name == 'location')
27
+ when 'location'
32
28
  @package[:location] = get_attribute(attrs, 'href')
33
- elsif (name == 'checksum')
29
+ when 'checksum'
34
30
  @package[:checksum_type] = get_attribute(attrs, 'type')
35
- elsif (name == 'size')
31
+ when 'size'
36
32
  @package[:size] = get_attribute(attrs, 'package').to_i
37
- elsif (name == 'time')
33
+ when 'time'
38
34
  @package[:build_time] = get_attribute(attrs, 'build')
39
35
  end
40
36
  end
41
37
 
42
38
  def characters(string)
43
- if (%i[name arch checksum summary description rpm:license].include? @current_node)
44
- @package[@current_node] ||= ''
45
- @package[@current_node] += string.strip
46
- end
39
+ return unless %i[name arch checksum summary description rpm:license].include? @current_node
40
+
41
+ @package[@current_node] ||= ''
42
+ @package[@current_node] += string.strip
47
43
  end
48
44
 
49
45
  def end_element(name)
50
- if (name == 'package')
51
- @referenced_files << RepomdParser::Reference.new(
52
- location: @package[:location],
53
- checksum_type: @package[:checksum_type],
54
- checksum: @package[:checksum],
55
- type: :rpm,
56
- size: @package[:size].to_i,
57
- arch: @package[:arch],
58
- version: @package[:version],
59
- release: @package[:release],
60
- name: @package[:name],
61
- summary: @package[:summary],
62
- description: @package[:description],
63
- license: @package[:"rpm:license"],
64
- build_time: Time.at(@package[:build_time].to_i).utc
65
- )
66
- end
67
- end
46
+ return unless name == 'package'
68
47
 
48
+ @referenced_files << RepomdParser::Reference.new(
49
+ location: @package[:location],
50
+ checksum_type: @package[:checksum_type],
51
+ checksum: @package[:checksum],
52
+ type: :rpm,
53
+ size: @package[:size].to_i,
54
+ arch: @package[:arch],
55
+ version: @package[:version],
56
+ release: @package[:release],
57
+ name: @package[:name],
58
+ summary: @package[:summary],
59
+ description: @package[:description],
60
+ license: @package[:'rpm:license'],
61
+ build_time: Time.at(@package[:build_time].to_i).utc
62
+ )
63
+ end
69
64
  end
@@ -45,15 +45,15 @@ class RepomdParser::Reference
45
45
  build_time: nil)
46
46
  local_variables.each do |local_var|
47
47
  method = "#{local_var}="
48
- send(method, binding.local_variable_get(local_var)) if (respond_to?(method))
48
+ send(method, binding.local_variable_get(local_var)) if respond_to?(method)
49
49
  end
50
50
  end
51
51
 
52
52
  # Overloaded comparator for specs
53
- def ==(obj)
53
+ def ==(other)
54
54
  result = true
55
55
  instance_variables.each do |instance_var|
56
- result &&= (instance_variable_get(instance_var) == obj.instance_variable_get(instance_var))
56
+ result &&= (instance_variable_get(instance_var) == other.instance_variable_get(instance_var))
57
57
  end
58
58
  result
59
59
  end
@@ -16,7 +16,6 @@
16
16
  # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17
17
 
18
18
  class RepomdParser::RepomdXmlParser
19
-
20
19
  def initialize(filename)
21
20
  @filename = filename
22
21
  end
@@ -48,5 +47,4 @@ class RepomdParser::RepomdXmlParser
48
47
 
49
48
  files
50
49
  end
51
-
52
50
  end
@@ -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.5'
19
+ VERSION = '0.1.6'.freeze
20
20
  end
@@ -0,0 +1,40 @@
1
+ # repomd_parser -- Ruby gem to parse RPM repository metadata
2
+ # Copyright (C) 2024 Ivan Kapelyukhin
3
+ #
4
+ # This program is free software; you can redistribute it and/or modify
5
+ # it under the terms of the GNU General Public License as published by
6
+ # the Free Software Foundation; either version 2 of the License, or
7
+ # (at your option) any later version.
8
+ #
9
+ # This program is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ # GNU General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU General Public License along
15
+ # with this program; if not, write to the Free Software Foundation, Inc.,
16
+ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17
+
18
+ require 'zstd-ruby'
19
+
20
+ class RepomdParser::ZstdReader < File
21
+ def initialize(*args)
22
+ super(*args)
23
+ @stream = Zstd::StreamingDecompress.new
24
+ @buffer = ''
25
+ end
26
+
27
+ def read(len = nil, out = nil)
28
+ @buffer << @stream.decompress(super(len)) while @buffer.size < len && !eof
29
+
30
+ if @buffer.size > len
31
+ out = @buffer[0..len]
32
+ @buffer = @buffer[len..-1]
33
+ else
34
+ out = @buffer
35
+ @buffer = ''
36
+ end
37
+
38
+ out
39
+ end
40
+ end
data/lib/repomd_parser.rb CHANGED
@@ -24,3 +24,4 @@ require 'repomd_parser/base_parser'
24
24
  require 'repomd_parser/repomd_xml_parser'
25
25
  require 'repomd_parser/deltainfo_xml_parser'
26
26
  require 'repomd_parser/primary_xml_parser'
27
+ require 'repomd_parser/zstd_reader'
@@ -1,31 +1,38 @@
1
-
2
- lib = File.expand_path("../lib", __FILE__)
1
+ lib = File.expand_path('lib', __dir__)
3
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require "repomd_parser/version"
3
+ require 'repomd_parser/version'
5
4
 
6
5
  Gem::Specification.new do |spec|
7
- spec.name = "repomd_parser"
6
+ spec.name = 'repomd_parser'
8
7
  spec.version = RepomdParser::VERSION
9
- spec.authors = ["Ivan Kapelyukhin"]
10
- spec.email = ["ikapelyukhin@suse.com"]
8
+ spec.authors = ['Ivan Kapelyukhin']
9
+ spec.email = ['ikapelyukhin@opensuse.org']
11
10
 
12
- spec.summary = %q{RPM repository metadata (RepoMD) parser}
13
- spec.homepage = "https://github.com/ikapelyukhin/repomd-parser"
11
+ spec.summary = 'RPM repository metadata (RepoMD) parser'
12
+ spec.homepage = 'https://github.com/ikapelyukhin/repomd-parser'
14
13
  spec.license = 'GPL-2.0-or-later'
15
14
 
16
15
  # Specify which files should be added to the gem when it is released.
17
16
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
18
- spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
19
- `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }.reject { |f| f.match(%r{^\.}) }
17
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
18
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }.reject { |f| f.match(/^\./) }
20
19
  end
21
- spec.bindir = "exe"
20
+ spec.bindir = 'exe'
22
21
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
23
- spec.require_paths = ["lib"]
22
+ spec.require_paths = ['lib']
23
+ spec.required_ruby_version = '>= 2.5'
24
+
25
+ spec.metadata = { 'rubygems_mfa_required' => 'true' }
24
26
 
25
- spec.add_development_dependency "bundler", ">= 1.16"
26
- spec.add_development_dependency "rake", "~> 13.0"
27
- spec.add_development_dependency "rspec", "~> 3.0"
27
+ spec.add_development_dependency 'bundler', '>= 1.16'
28
+ spec.add_development_dependency 'rake', '~> 13.0'
29
+ spec.add_development_dependency 'rspec', '~> 3.0'
28
30
  spec.add_development_dependency 'simplecov', '~> 0.16.1'
29
31
 
32
+ # Locked because of Ruby >= 2.5 dependency
33
+ spec.add_development_dependency 'rubocop', '<= 1.25'
34
+ spec.add_development_dependency 'rubocop-ast', '<= 1.17.0'
35
+
30
36
  spec.add_dependency 'nokogiri', '~> 1.8'
37
+ spec.add_dependency 'zstd-ruby', '~> 1.3', '>= 1.3.5.0'
31
38
  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.5
4
+ version: 0.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ivan Kapelyukhin
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-12-09 00:00:00.000000000 Z
11
+ date: 2024-01-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -66,6 +66,34 @@ dependencies:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: 0.16.1
69
+ - !ruby/object:Gem::Dependency
70
+ name: rubocop
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "<="
74
+ - !ruby/object:Gem::Version
75
+ version: '1.25'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "<="
81
+ - !ruby/object:Gem::Version
82
+ version: '1.25'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rubocop-ast
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "<="
88
+ - !ruby/object:Gem::Version
89
+ version: 1.17.0
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "<="
95
+ - !ruby/object:Gem::Version
96
+ version: 1.17.0
69
97
  - !ruby/object:Gem::Dependency
70
98
  name: nokogiri
71
99
  requirement: !ruby/object:Gem::Requirement
@@ -80,9 +108,29 @@ dependencies:
80
108
  - - "~>"
81
109
  - !ruby/object:Gem::Version
82
110
  version: '1.8'
83
- description:
111
+ - !ruby/object:Gem::Dependency
112
+ name: zstd-ruby
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '1.3'
118
+ - - ">="
119
+ - !ruby/object:Gem::Version
120
+ version: 1.3.5.0
121
+ type: :runtime
122
+ prerelease: false
123
+ version_requirements: !ruby/object:Gem::Requirement
124
+ requirements:
125
+ - - "~>"
126
+ - !ruby/object:Gem::Version
127
+ version: '1.3'
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: 1.3.5.0
131
+ description:
84
132
  email:
85
- - ikapelyukhin@suse.com
133
+ - ikapelyukhin@opensuse.org
86
134
  executables: []
87
135
  extensions: []
88
136
  extra_rdoc_files: []
@@ -91,7 +139,6 @@ files:
91
139
  - Gemfile
92
140
  - README.md
93
141
  - Rakefile
94
- - bin/setup
95
142
  - lib/repomd_parser.rb
96
143
  - lib/repomd_parser/base_parser.rb
97
144
  - lib/repomd_parser/deltainfo_xml_parser.rb
@@ -99,12 +146,14 @@ files:
99
146
  - lib/repomd_parser/reference.rb
100
147
  - lib/repomd_parser/repomd_xml_parser.rb
101
148
  - lib/repomd_parser/version.rb
149
+ - lib/repomd_parser/zstd_reader.rb
102
150
  - repomd_parser.gemspec
103
151
  homepage: https://github.com/ikapelyukhin/repomd-parser
104
152
  licenses:
105
153
  - GPL-2.0-or-later
106
- metadata: {}
107
- post_install_message:
154
+ metadata:
155
+ rubygems_mfa_required: 'true'
156
+ post_install_message:
108
157
  rdoc_options: []
109
158
  require_paths:
110
159
  - lib
@@ -112,16 +161,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
112
161
  requirements:
113
162
  - - ">="
114
163
  - !ruby/object:Gem::Version
115
- version: '0'
164
+ version: '2.5'
116
165
  required_rubygems_version: !ruby/object:Gem::Requirement
117
166
  requirements:
118
167
  - - ">="
119
168
  - !ruby/object:Gem::Version
120
169
  version: '0'
121
170
  requirements: []
122
- rubyforge_project:
123
- rubygems_version: 2.7.8
124
- signing_key:
171
+ rubygems_version: 3.3.15
172
+ signing_key:
125
173
  specification_version: 4
126
174
  summary: RPM repository metadata (RepoMD) parser
127
175
  test_files: []
data/bin/setup DELETED
@@ -1,8 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
- IFS=$'\n\t'
4
- set -vx
5
-
6
- bundle install
7
-
8
- # Do any other automated setup that you need to do here