active_analysis 0.1.3 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +22 -1
- data/README.md +55 -5
- data/app/controllers/active_analysis/application_controller.rb +2 -0
- data/app/helpers/active_analysis/application_helper.rb +2 -0
- data/app/jobs/active_analysis/application_job.rb +2 -0
- data/app/mailers/active_analysis/application_mailer.rb +4 -2
- data/app/models/active_analysis/application_record.rb +2 -0
- data/config/routes.rb +2 -0
- data/lib/active_analysis.rb +9 -1
- data/lib/active_analysis/addon.rb +20 -0
- data/lib/active_analysis/addon/image_addon.rb +17 -0
- data/lib/active_analysis/addon/image_addon/white_background.rb +62 -0
- data/lib/active_analysis/analyzer/audio_analyzer.rb +0 -1
- data/lib/active_analysis/analyzer/image_analyzer.rb +20 -4
- data/lib/active_analysis/analyzer/image_analyzer/image_magick.rb +8 -2
- data/lib/active_analysis/analyzer/image_analyzer/vips.rb +7 -3
- data/lib/active_analysis/analyzer/pdf_analyzer.rb +1 -1
- data/lib/active_analysis/engine.rb +39 -13
- data/lib/active_analysis/gem_version.rb +2 -2
- data/lib/tasks/active_analysis_tasks.rake +1 -0
- metadata +13 -38
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 77a4b728e66fe4c463fabcdc68c89ab4d6b73971aec95f96ea0bf29fc944c866
|
4
|
+
data.tar.gz: cc74b804d1c0ca9c803027fe2427ad99cbcc1cf1764c691865f4f092acc682d1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d6e6fe01cf6c05e6fbe3fa36fa7f1df96dfeb395566b1612b01da8105abe9546d5f994064cc7924c6cc8d076084f5d7bd2750f4662f670070214faf9781441f9
|
7
|
+
data.tar.gz: 3106253d44f736d2640c63bcb4bea1a04d4654d39d3e88f6ac3ebebf12c6848238f65f481e94511a69af74eed506a9b8a69c9c9e7a44963cdb775418ebb66830
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,26 @@
|
|
1
1
|
## [Unreleased]
|
2
2
|
|
3
|
-
|
3
|
+
- Make it easier to override target dssim and minimum quality in the optimal quality addon
|
4
|
+
|
5
|
+
## [0.4.0] - 2021-06-22
|
6
|
+
|
7
|
+
- Remove the new Rails analyzers
|
8
|
+
- Do not detect optimal quality of variants
|
9
|
+
- Start optimal quality calculation at quality = 75 to match Vitals Image quality = 80
|
10
|
+
- Fix Rubocop offenses
|
11
|
+
|
12
|
+
## [0.3.1] - 2021-06-17
|
13
|
+
|
14
|
+
- Fix vips image path call
|
15
|
+
|
16
|
+
## [0.3.0] - 2021-06-17
|
17
|
+
|
18
|
+
- Added addons feature
|
19
|
+
|
20
|
+
## [0.2.0] - 2021-06-01
|
21
|
+
|
22
|
+
- Added `opaque` metadata value to images
|
23
|
+
|
24
|
+
## [0.1.3] - 2021-05-01
|
4
25
|
|
5
26
|
- Initial release
|
data/README.md
CHANGED
@@ -18,11 +18,61 @@ And then execute:
|
|
18
18
|
|
19
19
|
## Usage
|
20
20
|
|
21
|
-
Active
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
21
|
+
Active Analysis automatically replaces all of Rails default analyzers with its own. It will not remove other custom analyzers if you have them. You can also configure which analyzers will be inserted.
|
22
|
+
|
23
|
+
```ruby
|
24
|
+
Rails.application.configure do |config|
|
25
|
+
config.active_analysis.image_library = :vips # Defaults to the same as active storage
|
26
|
+
config.active_analysis.image_analyzer = true # Defaults to true
|
27
|
+
config.active_analysis.audio_analyzer = true # Defaults to true
|
28
|
+
config.active_analysis.pdf_analyzer = false # Defaults to true
|
29
|
+
config.active_analysis.video_analyzer = false # Defaults to true
|
30
|
+
end
|
31
|
+
```
|
32
|
+
|
33
|
+
#### Image
|
34
|
+
A modification of the original image analyzer and a new analyzer. Requires the [ImageMagick](http://www.imagemagick.org) system library or the [libvips](https://github.com/libvips/libvips) system library.
|
35
|
+
|
36
|
+
- Width (pixels)
|
37
|
+
- Height (pixels)
|
38
|
+
- Opaque (true if file is opaque, false if not)
|
39
|
+
|
40
|
+
An image will be considered opaque if it does not have an alpha channel, or if none of its pixels have an alpha value below the minimum (as defined by the library).
|
41
|
+
|
42
|
+
#### PDF
|
43
|
+
A new analyzer. Requires the [poppler](https://poppler.freedesktop.org/) system library.
|
44
|
+
|
45
|
+
- Width (pixels)
|
46
|
+
- Height (pixels)
|
47
|
+
- Pages
|
48
|
+
|
49
|
+
#### Audio
|
50
|
+
A new analyzer. Requires the [FFmpeg](https://www.ffmpeg.org) system library.
|
51
|
+
|
52
|
+
- Duration (seconds)
|
53
|
+
- Bit Rate (bits/second)
|
54
|
+
|
55
|
+
#### Video
|
56
|
+
A modification of the original video analyzer. Requires the [FFmpeg](https://www.ffmpeg.org) system library
|
57
|
+
|
58
|
+
- Width (pixels)
|
59
|
+
- Height (pixels)
|
60
|
+
- Duration (seconds)
|
61
|
+
- Angle (degrees)
|
62
|
+
- Display aspect ratio
|
63
|
+
- Audio (true if file has an audio channel, false if not)
|
64
|
+
- Video (true if file has an video channel, false if not)
|
65
|
+
|
66
|
+
## Addons
|
67
|
+
Active Analysis allows additional features to be added to the image analyzers through addons. To create an addon simply inherit the `Addon` class and add it to the addons array in the configuration.
|
68
|
+
```ruby
|
69
|
+
Rails.application.configure do |config|
|
70
|
+
config.active_analysis.addons << ActiveAnalysis::Addon::ImageAddon::WhiteBackground
|
71
|
+
end
|
72
|
+
```
|
73
|
+
|
74
|
+
The following addons available:
|
75
|
+
- ImageAddon::WhiteBackground: An EXPERIMENTAL addon that checks if the image has a white background. Requires both vips and image magick to be installed.
|
26
76
|
|
27
77
|
## Development
|
28
78
|
|
data/config/routes.rb
CHANGED
data/lib/active_analysis.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "active_analysis/version"
|
2
4
|
require "active_analysis/engine"
|
3
5
|
|
@@ -7,6 +9,12 @@ module ActiveAnalysis
|
|
7
9
|
autoload :FixtureSet
|
8
10
|
|
9
11
|
mattr_accessor :logger
|
10
|
-
|
12
|
+
|
11
13
|
mattr_accessor :image_library
|
14
|
+
mattr_accessor :image_analyzer
|
15
|
+
mattr_accessor :audio_analyzer
|
16
|
+
mattr_accessor :pdf_analyzer
|
17
|
+
mattr_accessor :video_analyzer
|
18
|
+
|
19
|
+
mattr_accessor :addons
|
12
20
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActiveAnalysis
|
4
|
+
# This is an abstract base class for analyzer addons, which extract extra metadata from blobs.
|
5
|
+
class Addon
|
6
|
+
attr_reader :file
|
7
|
+
|
8
|
+
def self.accept?(blob)
|
9
|
+
false
|
10
|
+
end
|
11
|
+
|
12
|
+
def initialize(file)
|
13
|
+
@file = file
|
14
|
+
end
|
15
|
+
|
16
|
+
def metadata
|
17
|
+
raise NotImplementedError
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "../addon"
|
4
|
+
|
5
|
+
module ActiveAnalysis
|
6
|
+
# This is an abstract base class for image addons. Image addons are only executed for original
|
7
|
+
# blobs.
|
8
|
+
class Addon::ImageAddon < Addon
|
9
|
+
def self.accept?(blob)
|
10
|
+
blob.image? && blob.attachments.none? { |attachment| attachment.record_type == ActiveStorage::VariantRecord }
|
11
|
+
end
|
12
|
+
|
13
|
+
def metadata
|
14
|
+
raise NotImplementedError
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "../image_addon"
|
4
|
+
|
5
|
+
module ActiveAnalysis
|
6
|
+
class Addon::ImageAddon::WhiteBackground < Addon::ImageAddon
|
7
|
+
def metadata
|
8
|
+
{ white_background: white_background? }
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
def white_background?
|
13
|
+
corners = extract_corner_areas(file)
|
14
|
+
colors = corners.map { |corner| primary_color_for(corner) }
|
15
|
+
colors.all? { |color| color.all? { |value| value > 250 } }
|
16
|
+
rescue
|
17
|
+
nil
|
18
|
+
end
|
19
|
+
|
20
|
+
def extract_corner_areas(image)
|
21
|
+
paths = []
|
22
|
+
|
23
|
+
image_path = ActiveAnalysis.image_analyzer == :vips ? image.filename : image.path
|
24
|
+
basename = SecureRandom.urlsafe_base64
|
25
|
+
width = image.width
|
26
|
+
height = image.height
|
27
|
+
size = 8
|
28
|
+
|
29
|
+
paths << Rails.root.join("tmp", "#{basename}_top_left.jpg")
|
30
|
+
`vips im_extract_area #{image_path} #{paths.last} 0 0 #{size} #{size}`
|
31
|
+
|
32
|
+
paths << Rails.root.join("tmp", "#{basename}_top_right.jpg")
|
33
|
+
`vips im_extract_area #{image_path} #{paths.last} #{width - size} 0 #{size} #{size}`
|
34
|
+
|
35
|
+
paths << Rails.root.join("tmp", "#{basename}_bottom_right.jpg")
|
36
|
+
`vips im_extract_area #{image_path} #{paths.last} #{width - size} #{height - size} #{size} #{size}`
|
37
|
+
|
38
|
+
paths << Rails.root.join("tmp", "#{basename}_bottom_left.jpg")
|
39
|
+
`vips im_extract_area #{image_path} #{paths.last} 0 #{height - size} #{size} #{size}`
|
40
|
+
|
41
|
+
paths
|
42
|
+
end
|
43
|
+
|
44
|
+
def primary_color_for(filepath)
|
45
|
+
histogram = generate_color_histogram(filepath)
|
46
|
+
sorted = sort_by_frequency(histogram)
|
47
|
+
extract_dominant_rgb(sorted)
|
48
|
+
end
|
49
|
+
|
50
|
+
def generate_color_histogram(path)
|
51
|
+
`convert #{path} +dither -colors 5 -define histogram:unique-colors=true -format "%c" histogram:info:`
|
52
|
+
end
|
53
|
+
|
54
|
+
def sort_by_frequency(histogram)
|
55
|
+
histogram.each_line.map { |line| parts = line.split(":"); [parts[0].to_i, parts[1]] }.sort_by { |line| line[0] }.reverse
|
56
|
+
end
|
57
|
+
|
58
|
+
def extract_dominant_rgb(array)
|
59
|
+
array.map { |line| line[1].match(/\(([\d.,]+)/).captures.first.split(",").take(3).map(&:to_i) }.first
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -9,7 +9,7 @@ module ActiveAnalysis
|
|
9
9
|
#
|
10
10
|
# Example:
|
11
11
|
#
|
12
|
-
# ActiveAnalysis::
|
12
|
+
# ActiveAnalysis::Analyzer::ImageAnalyzer::ImageMagick.new(blob).metadata
|
13
13
|
# # => { width: 4104, height: 2736 }
|
14
14
|
class Analyzer::ImageAnalyzer < Analyzer
|
15
15
|
def self.accept?(blob)
|
@@ -19,12 +19,28 @@ module ActiveAnalysis
|
|
19
19
|
def metadata
|
20
20
|
read_image do |image|
|
21
21
|
if rotated_image?(image)
|
22
|
-
{ width: image.height, height: image.width }
|
22
|
+
{ width: image.height, height: image.width, opaque: opaque?(image), **addons(image) }.compact
|
23
23
|
else
|
24
|
-
{ width: image.width, height: image.height }
|
24
|
+
{ width: image.width, height: image.height, opaque: opaque?(image), **addons(image) }.compact
|
25
25
|
end
|
26
26
|
end
|
27
27
|
end
|
28
|
+
|
29
|
+
private
|
30
|
+
def read_image
|
31
|
+
raise NotImplementedError
|
32
|
+
end
|
33
|
+
|
34
|
+
def rotated_image?(image)
|
35
|
+
raise NotImplementedError
|
36
|
+
end
|
37
|
+
|
38
|
+
def opaque?(image)
|
39
|
+
raise NotImplementedError
|
40
|
+
end
|
41
|
+
|
42
|
+
def addons(image)
|
43
|
+
ActiveAnalysis.addons.select { |addon| addon.accept?(blob) }.map { |addon_class| addon_class.new(image).metadata }.reduce({}, :merge).compact
|
44
|
+
end
|
28
45
|
end
|
29
46
|
end
|
30
|
-
|
@@ -7,7 +7,7 @@ module ActiveAnalysis
|
|
7
7
|
# the {ImageMagick}[http://www.imagemagick.org] system library.
|
8
8
|
class Analyzer::ImageAnalyzer::ImageMagick < Analyzer::ImageAnalyzer
|
9
9
|
def self.accept?(blob)
|
10
|
-
super &&
|
10
|
+
super && ActiveAnalysis.image_library == :mini_magick
|
11
11
|
end
|
12
12
|
|
13
13
|
private
|
@@ -34,6 +34,12 @@ module ActiveAnalysis
|
|
34
34
|
def rotated_image?(image)
|
35
35
|
%w[ RightTop LeftBottom TopRight BottomLeft ].include?(image["%[orientation]"])
|
36
36
|
end
|
37
|
+
|
38
|
+
def opaque?(image)
|
39
|
+
return true unless image.data["channelDepth"].key?("alpha")
|
40
|
+
|
41
|
+
value = /7.\d/.match?(image.data["version"]) ? 255 : 0
|
42
|
+
image.data["channelStatistics"]["alpha"]["mean"] == value
|
43
|
+
end
|
37
44
|
end
|
38
45
|
end
|
39
|
-
|
@@ -7,14 +7,14 @@ module ActiveAnalysis
|
|
7
7
|
# the {libvips}[https://libvips.github.io/libvips/] system library.
|
8
8
|
class Analyzer::ImageAnalyzer::Vips < Analyzer::ImageAnalyzer
|
9
9
|
def self.accept?(blob)
|
10
|
-
super &&
|
10
|
+
super && ActiveAnalysis.image_library == :vips
|
11
11
|
end
|
12
12
|
|
13
13
|
private
|
14
14
|
def read_image
|
15
15
|
download_blob_to_tempfile do |file|
|
16
16
|
require "ruby-vips"
|
17
|
-
image = ::Vips::Image.new_from_file(file.path
|
17
|
+
image = ::Vips::Image.new_from_file(file.path)
|
18
18
|
|
19
19
|
if valid_image?(image)
|
20
20
|
yield image
|
@@ -39,6 +39,11 @@ module ActiveAnalysis
|
|
39
39
|
false
|
40
40
|
end
|
41
41
|
|
42
|
+
def opaque?(image)
|
43
|
+
return true unless image.has_alpha?
|
44
|
+
image[image.bands - 1].min == 255
|
45
|
+
end
|
46
|
+
|
42
47
|
def valid_image?(image)
|
43
48
|
image.avg
|
44
49
|
true
|
@@ -47,4 +52,3 @@ module ActiveAnalysis
|
|
47
52
|
end
|
48
53
|
end
|
49
54
|
end
|
50
|
-
|
@@ -7,7 +7,7 @@ module ActiveAnalysis
|
|
7
7
|
#
|
8
8
|
# Example:
|
9
9
|
#
|
10
|
-
# ActiveAnalysis::
|
10
|
+
# ActiveAnalysis::Analyzer::PDFAnalyzer::Poppler.new(blob).metadata
|
11
11
|
# # => { width: 4104, height: 2736, pages: 10 }
|
12
12
|
#
|
13
13
|
# This analyzer requires the {poppler}[https://poppler.freedesktop.org/] system library, which is not provided by Rails.
|
@@ -3,6 +3,7 @@
|
|
3
3
|
require "active_storage"
|
4
4
|
|
5
5
|
require "marcel"
|
6
|
+
require "image_processing"
|
6
7
|
require "ruby-vips"
|
7
8
|
require "mini_magick"
|
8
9
|
|
@@ -14,31 +15,56 @@ require_relative "analyzer/audio_analyzer"
|
|
14
15
|
require_relative "analyzer/video_analyzer"
|
15
16
|
require_relative "analyzer/pdf_analyzer"
|
16
17
|
|
18
|
+
require_relative "addon"
|
19
|
+
require_relative "addon/image_addon"
|
20
|
+
require_relative "addon/image_addon/white_background"
|
21
|
+
|
17
22
|
module ActiveAnalysis
|
18
23
|
class Engine < ::Rails::Engine
|
19
24
|
isolate_namespace ActiveAnalysis
|
20
25
|
|
21
|
-
config.active_analysis
|
26
|
+
config.active_analysis = ActiveSupport::OrderedOptions.new
|
27
|
+
config.active_analysis.addons = []
|
28
|
+
|
22
29
|
config.eager_load_namespaces << ActiveAnalysis
|
23
30
|
|
24
31
|
initializer "active_analysis.configs" do
|
25
32
|
config.after_initialize do |app|
|
26
|
-
ActiveAnalysis.logger
|
27
|
-
|
28
|
-
ActiveAnalysis.image_library
|
33
|
+
ActiveAnalysis.logger = app.config.active_analysis.logger || Rails.logger
|
34
|
+
|
35
|
+
ActiveAnalysis.image_library = app.config.active_analysis.image_library || app.config.active_storage.variant_processor || :mini_magick
|
36
|
+
ActiveAnalysis.image_analyzer = app.config.active_analysis.image_analyzer || true
|
37
|
+
ActiveAnalysis.audio_analyzer = app.config.active_analysis.audio_analyzer || true
|
38
|
+
ActiveAnalysis.pdf_analyzer = app.config.active_analysis.pdf_analyzer || true
|
39
|
+
ActiveAnalysis.video_analyzer = app.config.active_analysis.video_analyzer || true
|
40
|
+
ActiveAnalysis.addons = app.config.active_analysis.addons || []
|
29
41
|
end
|
30
42
|
end
|
31
43
|
|
32
|
-
initializer "active_analysis.
|
44
|
+
initializer "active_analysis.analyzers" do
|
33
45
|
config.after_initialize do |app|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
46
|
+
if ActiveAnalysis.image_analyzer
|
47
|
+
app.config.active_storage.analyzers.delete ActiveStorage::Analyzer::ImageAnalyzer
|
48
|
+
app.config.active_storage.analyzers.delete ActiveStorage::Analyzer::ImageAnalyzer::Vips if defined?(ActiveStorage::Analyzer::ImageAnalyzer::Vips)
|
49
|
+
app.config.active_storage.analyzers.delete ActiveStorage::Analyzer::ImageAnalyzer::ImageMagick if defined?(ActiveStorage::Analyzer::ImageAnalyzer::ImageMagick)
|
50
|
+
|
51
|
+
app.config.active_storage.analyzers.append Analyzer::ImageAnalyzer::Vips
|
52
|
+
app.config.active_storage.analyzers.append Analyzer::ImageAnalyzer::ImageMagick
|
53
|
+
end
|
54
|
+
|
55
|
+
if ActiveAnalysis.video_analyzer
|
56
|
+
app.config.active_storage.analyzers.delete ActiveStorage::Analyzer::VideoAnalyzer
|
57
|
+
app.config.active_storage.analyzers.append Analyzer::VideoAnalyzer
|
58
|
+
end
|
59
|
+
|
60
|
+
if ActiveAnalysis.audio_analyzer
|
61
|
+
app.config.active_storage.analyzers.delete ActiveStorage::Analyzer::AudioAnalyzer if defined?(ActiveStorage::Analyzer::AudioAnalyzer)
|
62
|
+
app.config.active_storage.analyzers.append Analyzer::AudioAnalyzer
|
63
|
+
end
|
64
|
+
|
65
|
+
if ActiveAnalysis.pdf_analyzer
|
66
|
+
app.config.active_storage.analyzers.append Analyzer::PDFAnalyzer
|
67
|
+
end
|
42
68
|
end
|
43
69
|
end
|
44
70
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_analysis
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Breno Gazzola
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-06
|
11
|
+
date: 2021-07-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activestorage
|
@@ -16,70 +16,42 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '6.
|
19
|
+
version: '6.0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '6.
|
26
|
+
version: '6.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: activesupport
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '6.
|
33
|
+
version: '6.0'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '6.
|
40
|
+
version: '6.0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: image_processing
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '1.2'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: ruby-vips
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - ">="
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '2.0'
|
62
|
-
type: :runtime
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - ">="
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '2.0'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: platform_agent
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - ">="
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '1.0'
|
76
|
-
type: :runtime
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - ">="
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: '1.0'
|
54
|
+
version: '1.2'
|
83
55
|
- !ruby/object:Gem::Dependency
|
84
56
|
name: sqlite3
|
85
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -185,6 +157,9 @@ files:
|
|
185
157
|
- app/views/layouts/active_analysis/application.html.erb
|
186
158
|
- config/routes.rb
|
187
159
|
- lib/active_analysis.rb
|
160
|
+
- lib/active_analysis/addon.rb
|
161
|
+
- lib/active_analysis/addon/image_addon.rb
|
162
|
+
- lib/active_analysis/addon/image_addon/white_background.rb
|
188
163
|
- lib/active_analysis/analyzer.rb
|
189
164
|
- lib/active_analysis/analyzer/audio_analyzer.rb
|
190
165
|
- lib/active_analysis/analyzer/image_analyzer.rb
|
@@ -219,7 +194,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
219
194
|
- !ruby/object:Gem::Version
|
220
195
|
version: '0'
|
221
196
|
requirements: []
|
222
|
-
rubygems_version: 3.
|
197
|
+
rubygems_version: 3.2.17
|
223
198
|
signing_key:
|
224
199
|
specification_version: 4
|
225
200
|
summary: Collection of Active Storage analyzers
|