format_parser 0.9.4 → 0.10.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 +5 -5
- data/CHANGELOG.md +5 -0
- data/exe/format_parser_inspect +44 -0
- data/lib/format_parser.rb +12 -0
- data/lib/format_parser/version.rb +1 -1
- data/spec/format_parser_inspect_spec.rb +57 -0
- data/spec/format_parser_spec.rb +10 -2
- metadata +7 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: d4253990f4ed6f05476ba982726932b0298efee7da4a5267980eb176f12d6e68
|
4
|
+
data.tar.gz: 74683875ccfeeed68fc7cdf13af16a7694b81ada533f9138165c26ff6a3e0cfa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 19701f96beaeee111eaa2d9381b833a13a0954ea1e6deab9dc7095021ae95c809bf4a96abe04b2cbbe10d9d21902b3bdb5520e162151894931365f2bc188aef8
|
7
|
+
data.tar.gz: bf7b0fe93336654c06d58a852f88c89725974759ed30da89575b3559be5c4658ef60c3def92b50f1a4afaca3659996b0f79a9b245e7a0e9f1161b0fc05feb68e
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
## 0.10.0
|
2
|
+
* Adds the `format_parser_inspect` binary for parsing a file from the commandline
|
3
|
+
and returning results in JSON
|
4
|
+
* Adds the `FormatParser.parse_at(path)` convenience method
|
5
|
+
|
1
6
|
## 0.9.4
|
2
7
|
* Fix a TIFF parsing regression introduced in 0.3.1 that led to all TIFFs being incorrectly parsed
|
3
8
|
|
@@ -0,0 +1,44 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require_relative '../lib/format_parser'
|
4
|
+
require 'json'
|
5
|
+
require 'optparse'
|
6
|
+
|
7
|
+
options = {results: :first}
|
8
|
+
OptionParser.new do |opts|
|
9
|
+
opts.banner = 'Usage: format_parser_inspect --first my_file.jpg'
|
10
|
+
opts.on('-a', '--all', 'Return all results instead of just the first one') do |_v|
|
11
|
+
options[:results] = :all
|
12
|
+
end
|
13
|
+
opts.on('--natures[=NATURES]', 'Only scan specific natures (comma-separated: image, audio)', Array) do |v|
|
14
|
+
options[:natures] = v.map { |e| e.strip.downcase.to_sym }
|
15
|
+
end
|
16
|
+
opts.on('--formats[=FORMATS]', 'Only scan specific formats (comma-separated: jpg, tif)', Array) do |v|
|
17
|
+
options[:formats] = v.map { |e| e.strip.downcase.to_sym }
|
18
|
+
end
|
19
|
+
end.parse!
|
20
|
+
|
21
|
+
did_detect = false
|
22
|
+
return_values = ARGV.map do |path_or_url|
|
23
|
+
method_name = path_or_url =~ /^http(s?)\:\/\// ? :parse_http : :parse_file_at
|
24
|
+
result_or_results = FormatParser.public_send(method_name, path_or_url, **options)
|
25
|
+
if options[:results] != :first
|
26
|
+
did_detect = true if result_or_results.any?
|
27
|
+
{
|
28
|
+
source_path_or_url: path_or_url,
|
29
|
+
options: options,
|
30
|
+
ambiguous: result_or_results.length > 1,
|
31
|
+
results: result_or_results,
|
32
|
+
}
|
33
|
+
else
|
34
|
+
did_detect = true if result_or_results
|
35
|
+
{
|
36
|
+
source_path_or_url: path_or_url,
|
37
|
+
options: options,
|
38
|
+
result: result_or_results,
|
39
|
+
}
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
puts JSON.pretty_generate(return_values)
|
44
|
+
did_detect ? exit(0) : exit(1)
|
data/lib/format_parser.rb
CHANGED
@@ -72,6 +72,18 @@ module FormatParser
|
|
72
72
|
parse(RemoteIO.new(url), **kwargs)
|
73
73
|
end
|
74
74
|
|
75
|
+
# Parses the file at the given `path` and returns the results as if it were any IO
|
76
|
+
# given to `.parse`. The accepted keyword arguments are the same as the ones for `parse`.
|
77
|
+
#
|
78
|
+
# @param path[String] the path to the file to parse on the local filesystem
|
79
|
+
# @param kwargs the keyword arguments to be delegated to `.parse`
|
80
|
+
# @see {.parse}
|
81
|
+
def self.parse_file_at(path, **kwargs)
|
82
|
+
File.open(path, 'rb') do |io|
|
83
|
+
parse(io, **kwargs)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
75
87
|
# Parses the resource contained in the given IO-ish object, and returns either the first matched
|
76
88
|
# result (omitting all the other parsers), the first N results or all results.
|
77
89
|
#
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'shellwords'
|
3
|
+
|
4
|
+
describe '/exe/format_parser_inspect binary' do
|
5
|
+
let(:bin_path) do
|
6
|
+
Shellwords.escape(File.expand_path(__dir__ + '/../exe/format_parser_inspect'))
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'performs parsing on full default' do
|
10
|
+
fixture_path = fixtures_dir + 'JPEG/divergent_pixel_dimensions_exif.jpg'
|
11
|
+
|
12
|
+
result = `#{bin_path} #{Shellwords.escape(fixture_path)}`
|
13
|
+
|
14
|
+
retval = JSON.parse(result, symbolize_names: true)
|
15
|
+
parsed_result = retval.first
|
16
|
+
expect(parsed_result[:source_path_or_url]).to end_with('divergent_pixel_dimensions_exif.jpg')
|
17
|
+
expect(parsed_result[:options][:results]).to eq('first')
|
18
|
+
expect(parsed_result[:result]).not_to be_nil
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'performs parsing with --all' do
|
22
|
+
fixture_path = fixtures_dir + 'JPEG/divergent_pixel_dimensions_exif.jpg'
|
23
|
+
|
24
|
+
result = `#{bin_path} --all #{Shellwords.escape(fixture_path)}`
|
25
|
+
|
26
|
+
retval = JSON.parse(result, symbolize_names: true)
|
27
|
+
parsed_result = retval.first
|
28
|
+
expect(parsed_result[:source_path_or_url]).to end_with('divergent_pixel_dimensions_exif.jpg')
|
29
|
+
expect(parsed_result[:options][:results]).to eq('all')
|
30
|
+
expect(parsed_result[:ambiguous]).to eq(false)
|
31
|
+
expect(parsed_result[:results]).not_to be_empty
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'performs parsing with --natures option' do
|
35
|
+
fixture_path = fixtures_dir + 'JPEG/divergent_pixel_dimensions_exif.jpg'
|
36
|
+
|
37
|
+
result = `#{bin_path} --natures=IMAGE #{Shellwords.escape(fixture_path)}`
|
38
|
+
|
39
|
+
retval = JSON.parse(result, symbolize_names: true)
|
40
|
+
parsed_result = retval.first
|
41
|
+
expect(parsed_result[:source_path_or_url]).to end_with('divergent_pixel_dimensions_exif.jpg')
|
42
|
+
expect(parsed_result[:options][:natures]).to eq(['image'])
|
43
|
+
expect(parsed_result[:result]).not_to be_nil
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'performs parsing with --formats option' do
|
47
|
+
fixture_path = fixtures_dir + 'JPEG/divergent_pixel_dimensions_exif.jpg'
|
48
|
+
|
49
|
+
result = `#{bin_path} --formats=zip #{Shellwords.escape(fixture_path)}`
|
50
|
+
|
51
|
+
retval = JSON.parse(result, symbolize_names: true)
|
52
|
+
parsed_result = retval.first
|
53
|
+
expect(parsed_result[:source_path_or_url]).to end_with('divergent_pixel_dimensions_exif.jpg')
|
54
|
+
expect(parsed_result[:options][:formats]).to eq(['zip'])
|
55
|
+
expect(parsed_result[:result]).to be_nil
|
56
|
+
end
|
57
|
+
end
|
data/spec/format_parser_spec.rb
CHANGED
@@ -47,7 +47,7 @@ describe FormatParser do
|
|
47
47
|
let(:audio) { FormatParser::Audio.new(format: :aiff, num_audio_channels: 1) }
|
48
48
|
let(:image) { FormatParser::Image.new(format: :dpx, width_px: 1, height_px: 1) }
|
49
49
|
|
50
|
-
context '
|
50
|
+
context '.parse called with options' do
|
51
51
|
before do
|
52
52
|
expect_any_instance_of(FormatParser::AIFFParser).to receive(:call).and_return(audio)
|
53
53
|
expect_any_instance_of(FormatParser::DPXParser).to receive(:call).and_return(image)
|
@@ -59,7 +59,7 @@ describe FormatParser do
|
|
59
59
|
it { is_expected.to include(audio) }
|
60
60
|
end
|
61
61
|
|
62
|
-
context '
|
62
|
+
context '.parse called without hash options' do
|
63
63
|
before do
|
64
64
|
expect_any_instance_of(FormatParser::DPXParser).to receive(:call).and_return(image)
|
65
65
|
end
|
@@ -70,6 +70,14 @@ describe FormatParser do
|
|
70
70
|
end
|
71
71
|
end
|
72
72
|
|
73
|
+
describe '.parse_file_at' do
|
74
|
+
it 'parses a fixture when given a path to it' do
|
75
|
+
path = fixtures_dir + '/WAV/c_M1F1-Alaw-AFsp.wav'
|
76
|
+
result = FormatParser.parse_file_at(path)
|
77
|
+
expect(result.nature).to eq(:audio)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
73
81
|
describe 'when parsing fixtures' do
|
74
82
|
Dir.glob(fixtures_dir + '/**/*.*').sort.each do |fixture_path|
|
75
83
|
it "parses #{fixture_path} without raising any errors" do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: format_parser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Noah Berman
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date: 2018-04-
|
12
|
+
date: 2018-04-23 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: ks
|
@@ -144,7 +144,8 @@ description: |-
|
|
144
144
|
email:
|
145
145
|
- noah@noahberman.org
|
146
146
|
- me@julik.nl
|
147
|
-
executables:
|
147
|
+
executables:
|
148
|
+
- format_parser_inspect
|
148
149
|
extensions: []
|
149
150
|
extra_rdoc_files: []
|
150
151
|
files:
|
@@ -159,6 +160,7 @@ files:
|
|
159
160
|
- LICENSE.txt
|
160
161
|
- README.md
|
161
162
|
- Rakefile
|
163
|
+
- exe/format_parser_inspect
|
162
164
|
- format_parser.gemspec
|
163
165
|
- lib/archive.rb
|
164
166
|
- lib/attributes_json.rb
|
@@ -201,6 +203,7 @@ files:
|
|
201
203
|
- spec/care_spec.rb
|
202
204
|
- spec/esoteric_formats_spec.rb
|
203
205
|
- spec/file_information_spec.rb
|
206
|
+
- spec/format_parser_inspect_spec.rb
|
204
207
|
- spec/format_parser_spec.rb
|
205
208
|
- spec/io_utils_spec.rb
|
206
209
|
- spec/measurometer_spec.rb
|
@@ -247,7 +250,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
247
250
|
version: '0'
|
248
251
|
requirements: []
|
249
252
|
rubyforge_project:
|
250
|
-
rubygems_version: 2.
|
253
|
+
rubygems_version: 2.7.3
|
251
254
|
signing_key:
|
252
255
|
specification_version: 4
|
253
256
|
summary: A library for efficient parsing of file metadata
|