repomd_parser 0.1.5 → 0.1.6

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: 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