excavate 0.3.7 → 0.3.9

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.
@@ -0,0 +1,58 @@
1
+ require "ffi-libarchive-binary"
2
+
3
+ module Excavate
4
+ module Extractors
5
+ # Extractor for XZ compressed archives (both .xz and .tar.xz formats)
6
+ #
7
+ # This extractor handles:
8
+ # - Pure XZ compressed files (.xz)
9
+ # - Compound TAR+XZ archives (.tar.xz)
10
+ #
11
+ # Uses libarchive through ffi-libarchive-binary for extraction,
12
+ # which provides native XZ decompression support.
13
+ #
14
+ # @example Extract a .tar.xz file
15
+ # extractor = XzExtractor.new("archive.tar.xz")
16
+ # extractor.extract("/target/directory")
17
+ #
18
+ # @example Extract a pure .xz file
19
+ # extractor = XzExtractor.new("file.xz")
20
+ # extractor.extract("/target/directory")
21
+ class XzExtractor < Extractor
22
+ # Extract the XZ archive to the specified target directory
23
+ #
24
+ # @param target [String] the directory path where files should be extracted
25
+ # @return [void]
26
+ #
27
+ # @raise [StandardError] if extraction fails
28
+ def extract(target)
29
+ extract_with_libarchive(target)
30
+ end
31
+
32
+ private
33
+
34
+ # Perform extraction using libarchive
35
+ #
36
+ # This method uses libarchive's reader API to:
37
+ # 1. Open the XZ archive
38
+ # 2. Iterate through all entries
39
+ # 3. Extract each entry with appropriate permissions
40
+ # 4. Close the reader
41
+ #
42
+ # @param target [String] the target directory for extraction
43
+ # @return [void]
44
+ def extract_with_libarchive(target)
45
+ flags = ::Archive::EXTRACT_PERM
46
+ reader = ::Archive::Reader.open_filename(@archive)
47
+
48
+ Dir.chdir(target) do
49
+ reader.each_entry do |entry|
50
+ reader.extract(entry, flags.to_i)
51
+ end
52
+ end
53
+
54
+ reader.close
55
+ end
56
+ end
57
+ end
58
+ end
@@ -7,4 +7,5 @@ require_relative "extractors/rpm_extractor"
7
7
  require_relative "extractors/seven_zip_extractor"
8
8
  require_relative "extractors/tar_extractor"
9
9
  require_relative "extractors/xar_extractor"
10
+ require_relative "extractors/xz_extractor"
10
11
  require_relative "extractors/zip_extractor"
@@ -14,9 +14,14 @@ module Excavate
14
14
  when "MSCF\x00\x00\x00\x00".force_encoding("BINARY")
15
15
  :cab
16
16
  else
17
- case beginning.byteslice(0, 2)
18
- when "\x1F\x8B".force_encoding("BINARY")
19
- :gzip
17
+ case beginning.byteslice(0, 6)
18
+ when "\xFD7zXZ\x00".force_encoding("BINARY")
19
+ :xz
20
+ else
21
+ case beginning.byteslice(0, 2)
22
+ when "\x1F\x8B".force_encoding("BINARY")
23
+ :gzip
24
+ end
20
25
  end
21
26
  end
22
27
  end
@@ -4,7 +4,7 @@ module Excavate
4
4
 
5
5
  def silence_stream(stream)
6
6
  old_stream = stream.dup
7
- stream.reopen(RbConfig::CONFIG["host_os"] =~ /mswin|mingw/ ? "NUL:" : "/dev/null") # rubocop:disable Performance/RegexpMatch, Metrics/LineLength
7
+ stream.reopen(/mswin|mingw/.match?(RbConfig::CONFIG["host_os"]) ? File::NULL : File::NULL)
8
8
  stream.sync = true
9
9
  yield
10
10
  ensure
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Excavate
4
- VERSION = "0.3.7"
4
+ VERSION = "0.3.9"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: excavate
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.7
4
+ version: 0.3.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-02-13 00:00:00.000000000 Z
11
+ date: 2025-12-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: arr-pm
@@ -24,26 +24,6 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0.0'
27
- - !ruby/object:Gem::Dependency
28
- name: bundler
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: '2.3'
34
- - - ">="
35
- - !ruby/object:Gem::Version
36
- version: 2.3.24
37
- type: :runtime
38
- prerelease: false
39
- version_requirements: !ruby/object:Gem::Requirement
40
- requirements:
41
- - - "~>"
42
- - !ruby/object:Gem::Version
43
- version: '2.3'
44
- - - ">="
45
- - !ruby/object:Gem::Version
46
- version: 2.3.24
47
27
  - !ruby/object:Gem::Dependency
48
28
  name: ffi-compiler2
49
29
  requirement: !ruby/object:Gem::Requirement
@@ -64,14 +44,20 @@ dependencies:
64
44
  requirements:
65
45
  - - "~>"
66
46
  - !ruby/object:Gem::Version
67
- version: '0.3'
47
+ version: '0.4'
48
+ - - ">="
49
+ - !ruby/object:Gem::Version
50
+ version: 0.4.2
68
51
  type: :runtime
69
52
  prerelease: false
70
53
  version_requirements: !ruby/object:Gem::Requirement
71
54
  requirements:
72
55
  - - "~>"
73
56
  - !ruby/object:Gem::Version
74
- version: '0.3'
57
+ version: '0.4'
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: 0.4.2
75
61
  - !ruby/object:Gem::Dependency
76
62
  name: libmspack
77
63
  requirement: !ruby/object:Gem::Requirement
@@ -142,48 +128,6 @@ dependencies:
142
128
  - - "~>"
143
129
  - !ruby/object:Gem::Version
144
130
  version: '1.0'
145
- - !ruby/object:Gem::Dependency
146
- name: rspec
147
- requirement: !ruby/object:Gem::Requirement
148
- requirements:
149
- - - "~>"
150
- - !ruby/object:Gem::Version
151
- version: '3.0'
152
- type: :development
153
- prerelease: false
154
- version_requirements: !ruby/object:Gem::Requirement
155
- requirements:
156
- - - "~>"
157
- - !ruby/object:Gem::Version
158
- version: '3.0'
159
- - !ruby/object:Gem::Dependency
160
- name: rubocop
161
- requirement: !ruby/object:Gem::Requirement
162
- requirements:
163
- - - "~>"
164
- - !ruby/object:Gem::Version
165
- version: '1.7'
166
- type: :development
167
- prerelease: false
168
- version_requirements: !ruby/object:Gem::Requirement
169
- requirements:
170
- - - "~>"
171
- - !ruby/object:Gem::Version
172
- version: '1.7'
173
- - !ruby/object:Gem::Dependency
174
- name: rubocop-performance
175
- requirement: !ruby/object:Gem::Requirement
176
- requirements:
177
- - - "~>"
178
- - !ruby/object:Gem::Version
179
- version: '1.15'
180
- type: :development
181
- prerelease: false
182
- version_requirements: !ruby/object:Gem::Requirement
183
- requirements:
184
- - - "~>"
185
- - !ruby/object:Gem::Version
186
- version: '1.15'
187
131
  description: Extract nested archives with a single command.
188
132
  email:
189
133
  - open.source@ribose.com
@@ -192,10 +136,14 @@ executables:
192
136
  extensions: []
193
137
  extra_rdoc_files: []
194
138
  files:
195
- - ".github/workflows/test-and-release.yml"
139
+ - ".github/workflows/post-rake.yml"
140
+ - ".github/workflows/rake-metanorma.yaml"
141
+ - ".github/workflows/rake.yml"
142
+ - ".github/workflows/release.yml"
196
143
  - ".gitignore"
197
144
  - ".rspec"
198
145
  - ".rubocop.yml"
146
+ - ".rubocop_todo.yml"
199
147
  - Gemfile
200
148
  - LICENSE.adoc
201
149
  - README.adoc
@@ -217,6 +165,7 @@ files:
217
165
  - lib/excavate/extractors/seven_zip_extractor.rb
218
166
  - lib/excavate/extractors/tar_extractor.rb
219
167
  - lib/excavate/extractors/xar_extractor.rb
168
+ - lib/excavate/extractors/xz_extractor.rb
220
169
  - lib/excavate/extractors/zip_extractor.rb
221
170
  - lib/excavate/file_magic.rb
222
171
  - lib/excavate/utils.rb
@@ -244,7 +193,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
244
193
  - !ruby/object:Gem::Version
245
194
  version: '0'
246
195
  requirements: []
247
- rubygems_version: 3.5.3
196
+ rubygems_version: 3.5.22
248
197
  signing_key:
249
198
  specification_version: 4
250
199
  summary: Extract nested archives with a single command.
@@ -1,99 +0,0 @@
1
- name: test-and-release
2
-
3
- on:
4
- push:
5
- branches: [ main ]
6
- tags: [ 'v*' ]
7
- pull_request:
8
-
9
- concurrency:
10
- group: '${{ github.workflow }}-${{ github.job }}-${{ github.head_ref || github.ref_name }}'
11
- cancel-in-progress: true
12
-
13
- env:
14
- BUNDLER_VER: 2.4.22
15
- # Forcing bundler version to ensure that it is consistent everywhere and
16
- # does not cause bundler gem reinstalls
17
-
18
- jobs:
19
- prepare:
20
- uses: metanorma/ci/.github/workflows/prepare-rake.yml@main
21
-
22
- test:
23
- name: Test on Ruby ${{ matrix.ruby.version }} ${{ matrix.os }}
24
- runs-on: ${{ matrix.os }}
25
-
26
- needs: prepare
27
- if: needs.prepare.outputs.push-for-tag != 'true'
28
-
29
- continue-on-error: ${{ matrix.ruby.experimental }}
30
- strategy:
31
- fail-fast: false
32
- max-parallel: 5
33
- matrix: ${{ fromJson(needs.prepare.outputs.matrix) }}
34
-
35
- steps:
36
- - uses: actions/checkout@v4
37
-
38
- - uses: ruby/setup-ruby@v1
39
- with:
40
- ruby-version: ${{ matrix.ruby.version }}
41
- rubygems: ${{ matrix.ruby.rubygems }}
42
- bundler: ${{ env.BUNDLER_VER }}
43
- bundler-cache: true
44
-
45
- - run: bundle exec rspec
46
-
47
- metanorma:
48
- name: Test with Metanorma on Ruby ${{ matrix.ruby.version }} ${{ matrix.os }}
49
- runs-on: ${{ matrix.os }}
50
-
51
- needs: prepare
52
- if: needs.prepare.outputs.push-for-tag != 'true'
53
-
54
- continue-on-error: ${{ matrix.ruby.experimental }}
55
-
56
- strategy:
57
- fail-fast: false
58
- matrix: ${{ fromJson(needs.prepare.outputs.matrix) }}
59
-
60
- steps:
61
- - uses: actions/checkout@v4
62
- with:
63
- repository: metanorma/metanorma
64
-
65
- - uses: metanorma/metanorma-build-scripts/inkscape-setup-action@main
66
-
67
- - uses: actions/checkout@v4
68
- with:
69
- path: excavate
70
-
71
- - uses: ruby/setup-ruby@v1
72
- with:
73
- ruby-version: ${{ matrix.ruby.version }}
74
- rubygems: ${{ matrix.ruby.rubygems }}
75
- bundler: ${{ env.BUNDLER_VER }}
76
- bundler-cache: false
77
-
78
- - name: Install excavate from source
79
- run: |
80
- cd excavate
81
- bundle install
82
- bundle exec rake install
83
-
84
- - name: Install metanorma
85
- run: bundle install
86
-
87
- - run: bundle exec rake
88
-
89
- release:
90
- name: Release gem
91
- needs: [ test, metanorma ]
92
- runs-on: ubuntu-latest
93
- if: contains(github.ref, 'refs/tags/v')
94
- steps:
95
- - uses: actions/checkout@v4
96
-
97
- - uses: cadwallion/publish-rubygems-action@master
98
- env:
99
- RUBYGEMS_API_KEY: ${{secrets.FONTIST_CI_RUBYGEMS_API_KEY}}