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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 682b39ef90eab2d2f825bb31f75b2345e32a4df0858d063f1f13314fd1aa25e6
4
- data.tar.gz: c5cb58d2b1ac0304fc220953b4cf7250e4568642b1be30017bf56caf71b2fea1
3
+ metadata.gz: 77a4b728e66fe4c463fabcdc68c89ab4d6b73971aec95f96ea0bf29fc944c866
4
+ data.tar.gz: cc74b804d1c0ca9c803027fe2427ad99cbcc1cf1764c691865f4f092acc682d1
5
5
  SHA512:
6
- metadata.gz: '0860684f890ee8b3c1818ef547126de464c1b3a2434e70850dbcd3d57fddb087c478412753936a58608700564197bdaff7ed0951fceba4b6a4bb6b2eb0ad0135'
7
- data.tar.gz: f1eba05f7f54af13851000862d7c45d99e04a44ce511dfe2e815b2a1539df5f64a10df1d812a98fbbeb6f10c350dd3354f1c870c993e92754ed6326b415d6830
6
+ metadata.gz: d6e6fe01cf6c05e6fbe3fa36fa7f1df96dfeb395566b1612b01da8105abe9546d5f994064cc7924c6cc8d076084f5d7bd2750f4662f670070214faf9781441f9
7
+ data.tar.gz: 3106253d44f736d2640c63bcb4bea1a04d4654d39d3e88f6ac3ebebf12c6848238f65f481e94511a69af74eed506a9b8a69c9c9e7a44963cdb775418ebb66830
data/CHANGELOG.md CHANGED
@@ -1,5 +1,26 @@
1
1
  ## [Unreleased]
2
2
 
3
- ## [0.1.0] - 2021-05-01
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 Analyzers will automatically add all its analyzers to Active Storage's analyzers array. Don't worry, if you added any custom analyzers they will be there. You can check the comments in the source code of each analyzer to see what information they extract from files:
22
- - Audio: [source](https://github.com/FestaLab/active_analysis/blob/main/lib/active_analysis/analyzer/audio_analyzer.rb)
23
- - Image: [source](https://github.com/FestaLab/active_analysis/blob/main/lib/active_analysis/analyzer/image_analyzer.rb)
24
- - PDF: [source](https://github.com/FestaLab/active_analysis/blob/main/lib/active_analysis/analyzer/pdf_analyzer.rb)
25
- - Video: [source](https://github.com/FestaLab/active_analysis/blob/main/lib/active_analysis/analyzer/video_analyzer.rb)
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
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveAnalysis
2
4
  class ApplicationController < ActionController::Base
3
5
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveAnalysis
2
4
  module ApplicationHelper
3
5
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveAnalysis
2
4
  class ApplicationJob < ActiveJob::Base
3
5
  end
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveAnalysis
2
4
  class ApplicationMailer < ActionMailer::Base
3
- default from: 'from@example.com'
4
- layout 'mailer'
5
+ default from: "from@example.com"
6
+ layout "mailer"
5
7
  end
6
8
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveAnalysis
2
4
  class ApplicationRecord < ActiveRecord::Base
3
5
  self.abstract_class = true
data/config/routes.rb CHANGED
@@ -1,2 +1,4 @@
1
+ # frozen_string_literal: true
2
+
1
3
  ActiveAnalysis::Engine.routes.draw do
2
4
  end
@@ -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
- mattr_accessor :analyzers
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
@@ -63,4 +63,3 @@ module ActiveAnalysis
63
63
  end
64
64
  end
65
65
  end
66
-
@@ -9,7 +9,7 @@ module ActiveAnalysis
9
9
  #
10
10
  # Example:
11
11
  #
12
- # ActiveAnalysis::CoreExtensionsAnalyzer::ImageAnalyzer::ImageMagick.new(blob).metadata
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 && ActiveStorage.variant_processor == :mini_magick
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 && ActiveStorage.variant_processor == :vips
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, access: :sequential)
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::CoreExtensionsAnalyzer::PDFAnalyzer::Poppler.new(blob).metadata
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 = ActiveSupport::OrderedOptions.new
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 = app.config.active_analysis.logger || Rails.logger
27
- ActiveAnalysis.analyzers = app.config.active_analysis.analyzers || []
28
- ActiveAnalysis.image_library = app.config.active_analysis.image_library || app.config.active_storage.variant_processor
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.core_extensions" do
44
+ initializer "active_analysis.analyzers" do
33
45
  config.after_initialize do |app|
34
- app.config.active_storage.analyzers.delete ActiveStorage::Analyzer::ImageAnalyzer
35
- app.config.active_storage.analyzers.delete ActiveStorage::Analyzer::VideoAnalyzer
36
-
37
- app.config.active_storage.analyzers.append Analyzer::ImageAnalyzer::Vips
38
- app.config.active_storage.analyzers.append Analyzer::ImageAnalyzer::ImageMagick
39
- app.config.active_storage.analyzers.append Analyzer::VideoAnalyzer
40
- app.config.active_storage.analyzers.append Analyzer::AudioAnalyzer
41
- app.config.active_storage.analyzers.append Analyzer::PDFAnalyzer
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
@@ -8,8 +8,8 @@ module ActiveAnalysis
8
8
 
9
9
  module VERSION
10
10
  MAJOR = 0
11
- MINOR = 1
12
- TINY = 3
11
+ MINOR = 5
12
+ TINY = 0
13
13
  PRE = nil
14
14
 
15
15
  STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  # desc "Explaining what the task does"
2
3
  # task :active_analysis do
3
4
  # # Task goes here
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.1.3
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 00:00:00.000000000 Z
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.1'
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.1'
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.1'
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.1'
40
+ version: '6.0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: mini_magick
42
+ name: image_processing
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: '4.1'
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: '4.1'
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.0.3
197
+ rubygems_version: 3.2.17
223
198
  signing_key:
224
199
  specification_version: 4
225
200
  summary: Collection of Active Storage analyzers