kamifusen 1.11.2 → 1.13.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 65c261931b31f7261f7ecb8eef7c33acefffc4d376277bbf51849a2bef265e72
4
- data.tar.gz: 2e9a99e1178698daa9e755a3c57255b5b64d9bed7e325abc7fa2c674dbf0d02d
3
+ metadata.gz: d6b3840b515b44e7d6ed8aa12a5356ebba29978d01129ce320c76f3d22a307eb
4
+ data.tar.gz: 64095c851bda7934311a8a3e02d296c4cc777d030bc3e7d418543d5b1c36ac07
5
5
  SHA512:
6
- metadata.gz: 1060a04a694115c734ddf368d103094de0eddafdcf3c82a9cfdb13b66f01aa9325dbb097ebcbd065d960c6d408bc75096bb7cdc4ad282ec807cb7d8251910ca4
7
- data.tar.gz: f5bb7e006824b81be617c50901c61fa93ae871a307fc1a75b948ddefdc8b298ceb263d191083992a1a0c8356d281abf2b4f3f9c8cee85bf9d14c233a23de58e7
6
+ metadata.gz: 3dcaaa6832c838370e8912a53a024df972450fa51d95661334815e3d74779f4d756718823df8fe435f5f0cb692386c5d999a738c5ee44f0ac418ce54ddbd97ea
7
+ data.tar.gz: 3163c01dbd79f9bbcc1e13ac3b19f11b5b5bab40f681c63f23d0e419721ca7a11cac36581778bc928a5a064ebea201fbb594d9df26b16dc8864bd2712f6c8d23
data/.gitignore CHANGED
@@ -1,9 +1,4 @@
1
1
  /.bundle/
2
- /.yardoc
3
- /_yardoc/
4
- /coverage/
5
- /spec/reports/
6
- /.bundle/
7
2
  /doc/
8
3
  /log/*.log
9
4
  /pkg/
@@ -13,5 +8,3 @@
13
8
  /test/dummy/log/*.log
14
9
  /test/dummy/storage/
15
10
  /test/dummy/tmp/
16
- .byebug_history
17
- .DS_Store
data/README.md CHANGED
@@ -2,10 +2,15 @@
2
2
 
3
3
  Images in Ruby on Rails, as lightweight as possible!
4
4
 
5
- ![Kamifūsen in Yamagata](https://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/%E4%B8%AD%E6%B4%A5%E5%B7%9D%E9%9B%AA%E3%81%BE%E3%81%A4%E3%82%8A.jpg/1024px-%E4%B8%AD%E6%B4%A5%E5%B7%9D%E9%9B%AA%E3%81%BE%E3%81%A4%E3%82%8A.jpg)
5
+
6
+ ![Kamifūsen in Yamagata](image.jpg?raw=true)
6
7
 
7
8
  ## Installation
8
9
 
10
+ Active Storage must be properly installed, with a solution set for the background jobs (we use Delayed Job).
11
+ - https://edgeguides.rubyonrails.org/active_storage_overview.html
12
+ - https://edgeguides.rubyonrails.org/active_job_basics.html#job-execution
13
+
9
14
  Add this line to your application's Gemfile:
10
15
 
11
16
  ```ruby
@@ -20,6 +25,10 @@ Or install it yourself as:
20
25
 
21
26
  $ gem install kamifusen
22
27
 
28
+ ## Usage
29
+
30
+ Simply use `kamifusen_tag` instead of `image_tag` in your rails views.
31
+
23
32
  In the views, use (where object is an active record model, and image is an active storage attachment):
24
33
 
25
34
  ```erb
@@ -39,9 +48,12 @@ config.action_view.sanitized_allowed_tags = ['picture', 'source', 'img']
39
48
  config.action_view.sanitized_allowed_attributes = ['src', 'type', 'srcset', 'width', 'height', 'alt', 'sizes', 'loading', 'decoding']
40
49
  ```
41
50
 
42
- ## Usage
51
+ You can use the cache for the fragment, by setting
52
+ ```erb
53
+ <%= kamifusen_tag object.image, alt: 'A nice image', cached: true %>
54
+ ```
43
55
 
44
- Simply use `kamifusen_tag` instead of `image_tag` in your rails views.## What's the problem?
56
+ ## What's the problem?
45
57
 
46
58
  ### The initial situation
47
59
 
@@ -128,10 +140,36 @@ It generates a code like:
128
140
  <source srcset="image-400w.webp, image-800w.webp 2x" type="image/webp" media="(min-width: 400px)">
129
141
  <source srcset="image-800w.jpg, image-1600w.jpg 2x" type="image/jpg" media="(min-width: 800px)">
130
142
  <source srcset="image-400w.jpg, image-800w.jpg 2x" type="image/jpg" media="(min-width: 400px)">
131
- <img src="image-800.jpg" alt="A nice image" srcset="image-800.jpg, image-1600.jpg 2x">
143
+ <img src="image-800.jpg" alt="A nice image" srcset="image-800.jpg, image-1600.jpg 2x" loading="lazy">
132
144
  </picture>
133
145
  ```
134
146
 
147
+ ### Parameters
148
+
149
+ You can set different parameters :
150
+
151
+ ```
152
+ class: "img_class",
153
+ alt: "alt",
154
+ height: height,
155
+ width: width,
156
+ sizes: sizes,
157
+ active_storage_direct_url: direct_url,
158
+ async: async
159
+ ```
160
+
161
+ Example of sizes parameter :
162
+
163
+ ```
164
+ sizes: {
165
+ '(max-width: 576px)': '315px',
166
+ '(max-width: 991px)': '210px',
167
+ '(max-width: 1199px)': '290px',
168
+ '(max-width: 1439px)': '350px',
169
+ '(min-width: 1440px)': '420px'
170
+ }
171
+ ```
172
+
135
173
  ## References
136
174
 
137
175
  - https://developer.mozilla.org/fr/docs/Learn/HTML/Multimedia_and_embedding/Responsive_images
@@ -156,7 +194,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
156
194
 
157
195
  ## Contributing
158
196
 
159
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/kamifusen. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/[USERNAME]/kamifusen/blob/master/CODE_OF_CONDUCT.md).
197
+ Bug reports and pull requests are welcome on GitHub at https://github.com/noesya/kamifusen. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/[USERNAME]/kamifusen/blob/master/CODE_OF_CONDUCT.md).
160
198
 
161
199
  ## License
162
200
 
data/Rakefile CHANGED
@@ -1,8 +1,3 @@
1
1
  # frozen_string_literal: true
2
-
2
+ require "bundler/setup"
3
3
  require "bundler/gem_tasks"
4
- require "rubocop/rake_task"
5
-
6
- RuboCop::RakeTask.new
7
-
8
- task default: :rubocop
@@ -1,94 +1,136 @@
1
1
  <%
2
- options ||= {}
3
- title = options[:title]
4
- alt = options[:alt]
5
- data = options[:data]
6
- async = options.has_key?(:async) ? options[:async] : true
7
- active_storage_direct_url = options.has_key?(:active_storage_direct_url) ? options[:active_storage_direct_url] : false
8
- klass = options[:class]
9
- picture_class = options[:picture_class]
10
- width = options[:width]
11
- height = options[:height]
2
+ source_is_set = false
3
+ if source.is_a? ActiveStorage::Blob
4
+ source_is_set = true
5
+ elsif source.respond_to?(:attached?)
6
+ source_is_set = source.attached?
7
+ end
8
+ %>
9
+ <%
10
+ if source_is_set
11
+ options ||= {}
12
+ cached = options.dig(:cached)
13
+ cache_if(cached, [source, options]) do
14
+ title = options[:title]
15
+ alt = options[:alt]
16
+ data = options[:data]
17
+ async = options.has_key?(:async) ? options[:async] : true
18
+ active_storage_direct_url = options.has_key?(:active_storage_direct_url) ? options[:active_storage_direct_url] : false
19
+ klass = options[:class]
20
+ picture_class = options[:picture_class]
21
+ width = options[:width]
22
+ height = options[:height]
23
+ crop = options[:crop]
24
+ if crop && (width.nil? || height.nil?)
25
+ raise ArgumentError, "Cropping needs a width and a height."
26
+ end
27
+ variant_sizes = Kamifusen.sizes.dup
28
+ quality = Kamifusen.quality.dup
29
+ default_variant_options = {}
30
+ case ActiveStorage.variant_processor
31
+ when :vips
32
+ default_variant_options = { saver: { quality: quality } }
33
+ when :mini_magick
34
+ default_variant_options = { quality: quality }
35
+ end
12
36
 
13
- variant_sizes = Kamifusen.sizes.dup
14
- quality = Kamifusen.quality.dup
37
+ sizes = options[:sizes] || {}
38
+ sizes_value = sizes.map { |key, value| [key, value].join(' ').strip }.join(', ')
15
39
 
16
- sizes = options[:sizes] || {}
17
- sizes_value = sizes.map { |key, value| [key, value].join(' ').strip }.join(', ')
40
+ if source&.analyzed? && source.metadata.has_key?('width') && source.metadata.has_key?('height')
41
+ image_width = source.metadata['width']
42
+ image_height = source.metadata['height']
43
+ image_ratio = 1.0 * image_width / image_height
44
+ if width.nil? && height.nil?
45
+ # Image real dimensions
46
+ width = [image_width, variant_sizes.last].min
47
+ height = width / image_ratio
48
+ elsif width.nil?
49
+ # Calculated width, preserving the aspect ratio
50
+ width = height * image_ratio
51
+ elsif height.nil?
52
+ # Calculated height, preserving the aspect ratio
53
+ height = width / image_ratio
54
+ elsif !crop
55
+ # Explicit dimensions, no crop. We redefine the height if aspect ratio is not preserved.
56
+ width = [image_width, width].min
57
+ height = width / image_ratio
58
+ end
59
+ width = width.round
60
+ height = height.round
61
+ end
18
62
 
19
- if source&.analyzed? && source.metadata.has_key?('width') && source.metadata.has_key?('height')
20
- image_width = source.metadata['width']
21
- image_height = source.metadata['height']
22
- image_ratio = 1.0 * image_width / image_height
23
- if width.nil? && height.nil?
24
- # Image real dimensions
25
- width = [image_width, variant_sizes.last].min
26
- height = width / image_ratio
27
- elsif width.nil?
28
- # Calculated width, preserving the aspect ratio
29
- width = height * image_ratio
30
- elsif height.nil?
31
- # Calculated height, preserving the aspect ratio
32
- height = width / image_ratio
33
- else
34
- # Explicit dimensions. We redefine the height if aspect ratio is not preserved.
35
- width = [image_width, width].min
36
- height = width / image_ratio
37
- end
38
- width = width.round
39
- height = height.round
40
- end
41
-
42
- parameters = ""
43
- parameters += " loading=\"lazy\" decoding=\"async\"" if async
44
- parameters += " alt=\"#{alt}\"" if alt
45
- parameters += " title=\"#{title}\"" if title
46
- parameters += " width=\"#{width}\"" if width
47
- parameters += " height=\"#{height}\"" if height
48
- parameters += " class=\"#{klass}\"" if klass
49
- if data
50
- data.each do |entry|
51
- parameters += " data-#{entry.first.to_s}=\"#{entry.last}\""
52
- end
53
- end
54
- %>
55
- <% if source.variable? %>
56
- <%
57
- # Computing
58
- if width
59
- width_retina = width * 2
60
- variant_sizes.reject! { |size| size > width_retina }
61
- variant_sizes << width_retina
62
- variant_sizes.uniq!
63
- end
64
- default_width = variant_sizes.max
65
- default_width = width_retina if width_retina && width_retina > default_width
66
- if Kamifusen.with_webp
67
- srcset_webp = variant_sizes.map { |size|
68
- variant = source.variant(resize: "#{size}>", format: :webp, quality: quality)
69
- "#{ Kamifusen.process(variant, active_storage_direct_url) } #{size}w"
70
- }.join(', ')
71
- end
72
- srcset_default = variant_sizes.map { |size|
73
- variant = source.variant(resize: "#{size}>", quality: quality)
74
- "#{ Kamifusen.process(variant, active_storage_direct_url) } #{size}w"
75
- }.join(', ')
76
- variant = source.variant(resize: "#{default_width}>", quality: quality)
77
- default = Kamifusen.process(variant, active_storage_direct_url)
78
- %>
79
- <picture<%= " class=\"#{picture_class}\"".html_safe unless picture_class.blank? %>>
80
- <% if Kamifusen.with_webp %>
81
- <source srcset="<%= raw srcset_webp %>"
82
- <%= " sizes=\"#{sizes_value}\"".html_safe unless sizes.empty? %>
83
- type="image/webp">
63
+ parameters = ""
64
+ parameters += " loading=\"lazy\" decoding=\"async\"" if async
65
+ parameters += " alt=\"#{alt}\"" if alt
66
+ parameters += " title=\"#{title}\"" if title
67
+ parameters += " width=\"#{width}\"" if width
68
+ parameters += " height=\"#{height}\"" if height
69
+ parameters += " class=\"#{klass}\"" if klass
70
+ if data
71
+ data.each do |entry|
72
+ parameters += " data-#{entry.first.to_s}=\"#{entry.last}\""
73
+ end
74
+ end
75
+ if source.variable?
76
+ # Computing
77
+ if width
78
+ width_retina = width * 2
79
+ variant_sizes.reject! { |size| size > width_retina }
80
+ variant_sizes << width_retina
81
+ variant_sizes.uniq!
82
+ end
83
+ default_width = variant_sizes.max
84
+ default_width = width_retina if width_retina && width_retina > default_width
85
+ if Kamifusen.with_webp
86
+ srcset_webp = variant_sizes.map { |size|
87
+ if crop
88
+ # Width: 400, height: 600 ; if width: 200, height: 300
89
+ variant_height = (height * size / width).round
90
+ variant_options = default_variant_options.merge({ resize_to_fill: [size, variant_height], format: :webp })
91
+ else
92
+ variant_options = default_variant_options.merge({ resize_to_limit: [size, nil], format: :webp })
93
+ end
94
+ variant = source.variant(variant_options)
95
+ "#{ Kamifusen.process(variant, active_storage_direct_url) } #{size}w"
96
+ }.join(', ')
97
+ end
98
+ srcset_default = variant_sizes.map { |size|
99
+ if crop
100
+ # Width: 400, height: 600 ; if width: 200, height: 300
101
+ variant_height = (height * size / width).round
102
+ variant_options = default_variant_options.merge({ resize_to_fill: [size, variant_height] })
103
+ else
104
+ variant_options = default_variant_options.merge({ resize_to_limit: [size, nil] })
105
+ end
106
+ variant = source.variant(variant_options)
107
+ "#{ Kamifusen.process(variant, active_storage_direct_url) } #{size}w"
108
+ }.join(', ')
109
+ if crop
110
+ # Width: 400, height: 600 ; if width: 200, height: 300
111
+ variant_height = (height * default_width / width).round
112
+ variant_options = default_variant_options.merge({ resize_to_fill: [default_width, variant_height] })
113
+ else
114
+ variant_options = default_variant_options.merge({ resize_to_limit: [default_width, nil] })
115
+ end
116
+ variant = source.variant(variant_options)
117
+ default = Kamifusen.process(variant, active_storage_direct_url)
118
+ %>
119
+ <picture<%= " class=\"#{picture_class}\"".html_safe unless picture_class.blank? %>>
120
+ <% if Kamifusen.with_webp %>
121
+ <source srcset="<%= raw srcset_webp %>"
122
+ <%= " sizes=\"#{sizes_value}\"".html_safe unless sizes.empty? %>
123
+ type="image/webp">
124
+ <% end %>
125
+ <source srcset="<%= raw srcset_default %>"
126
+ <%= " sizes=\"#{sizes_value}\"".html_safe unless sizes.empty? %>
127
+ type="<%= source.content_type %>">
128
+ <img src="<%= raw default %>" <%= raw parameters %>>
129
+ </picture>
130
+ <% else %>
131
+ <picture>
132
+ <img src="<%= url_for source %>" type="<%= source.content_type %>"<%= raw parameters %>>
133
+ </picture>
84
134
  <% end %>
85
- <source srcset="<%= raw srcset_default %>"
86
- <%= " sizes=\"#{sizes_value}\"".html_safe unless sizes.empty? %>
87
- type="<%= source.content_type %>">
88
- <img src="<%= raw default %>" <%= raw parameters %>>
89
- </picture>
90
- <% else %>
91
- <picture>
92
- <img src="<%= url_for source %>" type="<%= source.content_type %>"<%= raw parameters %>>
93
- </picture>
135
+ <% end %>
94
136
  <% end %>
data/kamifusen.gemspec CHANGED
@@ -29,6 +29,5 @@ Gem::Specification.new do |spec|
29
29
  spec.add_dependency "rails"
30
30
  spec.add_dependency "image_processing"
31
31
 
32
- spec.add_development_dependency "listen"
33
32
  spec.add_development_dependency "sqlite3"
34
33
  end
@@ -14,28 +14,73 @@ module Kamifusen
14
14
 
15
15
  protected
16
16
 
17
- def keycdn_url
18
- url = "#{Kamifusen.keycdn}/#{variant.blob.key}?"
19
- transformations = variant.variation.transformations
20
- url += "format=#{transformations[:format]}&" if transformations.has_key? :format
21
- url += "quality=#{transformations[:quality]}&" if transformations.has_key? :quality
22
- if transformations.has_key? :resize
17
+ def transformations
18
+ @transformations ||= variant.variation.transformations
19
+ end
20
+
21
+ def format
22
+ return @format if defined?(@format)
23
+ @format = transformations.fetch(:format)
24
+ end
25
+
26
+ def quality
27
+ return @quality if defined?(@quality)
28
+ @quality = case ActiveStorage.variant_processor
29
+ when :vips
30
+ transformations.dig(:saver, :quality)
31
+ when :mini_magick
32
+ transformations.fetch(:quality)
33
+ end
34
+ end
35
+
36
+ def width
37
+ return @width if defined?(@width)
38
+ if transformations.has_key?(:resize)
39
+ Kamifusen.deprecator.warn("The `resize` transformation is deprecated. Please use `resize_to_limit` instead.")
40
+ # resize: "100>"
23
41
  resize = transformations[:resize]
24
- # 100>
25
- if '>'.in? resize
26
- width = resize.split('>').first.to_i
27
- url += "width=#{width}&"
28
- end
42
+ @width = resize.split('>').first.to_i if '>'.in?(resize)
43
+ elsif transformations.has_key?(:resize_to_limit)
44
+ # resize_to_limit: [100, nil]
45
+ @width = transformations[:resize_to_limit].first.to_i
46
+ elsif transformations.has_key?(:resize_to_fill)
47
+ # resize_to_fill: [400, 600]
48
+ @width = transformations[:resize_to_fill].first.to_i
29
49
  end
30
- url
50
+ @width
51
+ end
52
+
53
+ def height
54
+ return @height if defined?(@height)
55
+ if transformations.has_key?(:resize_to_fill)
56
+ # resize_to_fill: [400, 600]
57
+ @height = transformations[:resize_to_fill].second.to_i
58
+ end
59
+ @height
60
+ end
61
+
62
+ def crop
63
+ return @crop if defined?(@crop)
64
+ @crop = transformations.has_key?(:resize_to_fill)
65
+ end
66
+
67
+ def keycdn_url
68
+ return @keycdn_url if defined?(@keycdn_url)
69
+ @keycdn_url = "#{Kamifusen.keycdn}/#{variant.blob.key}?"
70
+ @keycdn_url += "format=#{format}&" if format.present?
71
+ @keycdn_url += "width=#{width}&" if width.present?
72
+ @keycdn_url += "height=#{height}&" if crop && height.present?
73
+ @keycdn_url += "quality=#{quality}&" if quality.present?
74
+ @keycdn_url
31
75
  end
32
76
 
33
77
  def active_storage_url
34
- url = nil
35
- url = processed_url if active_storage_direct_url
36
- url ||= smart_url
37
- url ||= explicit_url
38
- url
78
+ return @active_storage_url if defined?(@active_storage_url)
79
+ @active_storage_url = nil
80
+ @active_storage_url = processed_url if active_storage_direct_url
81
+ @active_storage_url ||= smart_url
82
+ @active_storage_url ||= explicit_url
83
+ @active_storage_url
39
84
  end
40
85
 
41
86
  def processed_url
@@ -1,6 +1,10 @@
1
1
  module Kamifusen
2
2
  class Railtie < ::Rails::Railtie
3
- initializer "my_gem.view_helpers" do
3
+ initializer "kamifusen.deprecator", before: :load_environment_config do |app|
4
+ app.deprecators[:kamifusen] = ActionMailbox.deprecator
5
+ end
6
+
7
+ initializer "kamifusen.view_helpers" do
4
8
  ActiveSupport.on_load(:action_view) { include Kamifusen::ViewHelper }
5
9
  end
6
10
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Kamifusen
4
- VERSION = "1.11.2"
4
+ VERSION = "1.13.0"
5
5
  end
data/lib/kamifusen.rb CHANGED
@@ -11,6 +11,10 @@ module Kamifusen
11
11
  yield self
12
12
  end
13
13
 
14
+ def self.deprecator
15
+ @deprecator ||= ActiveSupport::Deprecation.new("2.0", "Kamifūsen")
16
+ end
17
+
14
18
  def self.process(variant, active_storage_direct_url = false)
15
19
  Processor.new(variant, active_storage_direct_url).url
16
20
  end
@@ -55,6 +59,9 @@ module Kamifusen
55
59
  @@quality = 70
56
60
 
57
61
  class Engine < ::Rails::Engine
62
+ initializer "kamifusen.deprecator", before: :load_environment_config do |app|
63
+ app.deprecators[:kamifusen] = Kamifusen.deprecator
64
+ end
58
65
  end
59
66
 
60
67
  class Error < StandardError
metadata CHANGED
@@ -1,15 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kamifusen
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.11.2
4
+ version: 1.13.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sébastien Moulène
8
8
  - Arnaud Levy
9
- autorequire:
10
9
  bindir: exe
11
10
  cert_chain: []
12
- date: 2022-02-23 00:00:00.000000000 Z
11
+ date: 1980-01-02 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: rails
@@ -39,20 +38,6 @@ dependencies:
39
38
  - - ">="
40
39
  - !ruby/object:Gem::Version
41
40
  version: '0'
42
- - !ruby/object:Gem::Dependency
43
- name: listen
44
- requirement: !ruby/object:Gem::Requirement
45
- requirements:
46
- - - ">="
47
- - !ruby/object:Gem::Version
48
- version: '0'
49
- type: :development
50
- prerelease: false
51
- version_requirements: !ruby/object:Gem::Requirement
52
- requirements:
53
- - - ">="
54
- - !ruby/object:Gem::Version
55
- version: '0'
56
41
  - !ruby/object:Gem::Dependency
57
42
  name: sqlite3
58
43
  requirement: !ruby/object:Gem::Requirement
@@ -79,8 +64,6 @@ files:
79
64
  - ".rubocop.yml"
80
65
  - CHANGELOG.md
81
66
  - CODE_OF_CONDUCT.md
82
- - Gemfile
83
- - Gemfile.lock
84
67
  - LICENSE
85
68
  - README.md
86
69
  - Rakefile
@@ -102,7 +85,6 @@ licenses:
102
85
  metadata:
103
86
  homepage_uri: https://github.com/sebousan/kamifusen
104
87
  source_code_uri: https://github.com/sebousan/kamifusen
105
- post_install_message:
106
88
  rdoc_options: []
107
89
  require_paths:
108
90
  - lib
@@ -117,8 +99,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
117
99
  - !ruby/object:Gem::Version
118
100
  version: '0'
119
101
  requirements: []
120
- rubygems_version: 3.1.6
121
- signing_key:
102
+ rubygems_version: 3.6.9
122
103
  specification_version: 4
123
104
  summary: Images, light as balloons
124
105
  test_files: []
data/Gemfile DELETED
@@ -1,12 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- source "https://rubygems.org"
4
-
5
- # Specify your gem's dependencies in kamifusen.gemspec
6
- gemspec
7
-
8
- gem "rake", "~> 13.0"
9
-
10
- gem "rubocop", "~> 1.7"
11
-
12
- gem "byebug"
data/Gemfile.lock DELETED
@@ -1,206 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- kamifusen (1.11.2)
5
- image_processing
6
- rails
7
-
8
- GEM
9
- remote: https://rubygems.org/
10
- specs:
11
- actioncable (7.0.2.2)
12
- actionpack (= 7.0.2.2)
13
- activesupport (= 7.0.2.2)
14
- nio4r (~> 2.0)
15
- websocket-driver (>= 0.6.1)
16
- actionmailbox (7.0.2.2)
17
- actionpack (= 7.0.2.2)
18
- activejob (= 7.0.2.2)
19
- activerecord (= 7.0.2.2)
20
- activestorage (= 7.0.2.2)
21
- activesupport (= 7.0.2.2)
22
- mail (>= 2.7.1)
23
- net-imap
24
- net-pop
25
- net-smtp
26
- actionmailer (7.0.2.2)
27
- actionpack (= 7.0.2.2)
28
- actionview (= 7.0.2.2)
29
- activejob (= 7.0.2.2)
30
- activesupport (= 7.0.2.2)
31
- mail (~> 2.5, >= 2.5.4)
32
- net-imap
33
- net-pop
34
- net-smtp
35
- rails-dom-testing (~> 2.0)
36
- actionpack (7.0.2.2)
37
- actionview (= 7.0.2.2)
38
- activesupport (= 7.0.2.2)
39
- rack (~> 2.0, >= 2.2.0)
40
- rack-test (>= 0.6.3)
41
- rails-dom-testing (~> 2.0)
42
- rails-html-sanitizer (~> 1.0, >= 1.2.0)
43
- actiontext (7.0.2.2)
44
- actionpack (= 7.0.2.2)
45
- activerecord (= 7.0.2.2)
46
- activestorage (= 7.0.2.2)
47
- activesupport (= 7.0.2.2)
48
- globalid (>= 0.6.0)
49
- nokogiri (>= 1.8.5)
50
- actionview (7.0.2.2)
51
- activesupport (= 7.0.2.2)
52
- builder (~> 3.1)
53
- erubi (~> 1.4)
54
- rails-dom-testing (~> 2.0)
55
- rails-html-sanitizer (~> 1.1, >= 1.2.0)
56
- activejob (7.0.2.2)
57
- activesupport (= 7.0.2.2)
58
- globalid (>= 0.3.6)
59
- activemodel (7.0.2.2)
60
- activesupport (= 7.0.2.2)
61
- activerecord (7.0.2.2)
62
- activemodel (= 7.0.2.2)
63
- activesupport (= 7.0.2.2)
64
- activestorage (7.0.2.2)
65
- actionpack (= 7.0.2.2)
66
- activejob (= 7.0.2.2)
67
- activerecord (= 7.0.2.2)
68
- activesupport (= 7.0.2.2)
69
- marcel (~> 1.0)
70
- mini_mime (>= 1.1.0)
71
- activesupport (7.0.2.2)
72
- concurrent-ruby (~> 1.0, >= 1.0.2)
73
- i18n (>= 1.6, < 2)
74
- minitest (>= 5.1)
75
- tzinfo (~> 2.0)
76
- ast (2.4.2)
77
- builder (3.2.4)
78
- byebug (11.1.3)
79
- concurrent-ruby (1.1.9)
80
- crass (1.0.6)
81
- digest (3.1.0)
82
- erubi (1.10.0)
83
- ffi (1.15.4)
84
- globalid (1.0.0)
85
- activesupport (>= 5.0)
86
- i18n (1.10.0)
87
- concurrent-ruby (~> 1.0)
88
- image_processing (1.12.1)
89
- mini_magick (>= 4.9.5, < 5)
90
- ruby-vips (>= 2.0.17, < 3)
91
- io-wait (0.2.1)
92
- listen (3.7.0)
93
- rb-fsevent (~> 0.10, >= 0.10.3)
94
- rb-inotify (~> 0.9, >= 0.9.10)
95
- loofah (2.14.0)
96
- crass (~> 1.0.2)
97
- nokogiri (>= 1.5.9)
98
- mail (2.7.1)
99
- mini_mime (>= 0.1.1)
100
- marcel (1.0.2)
101
- method_source (1.0.0)
102
- mini_magick (4.11.0)
103
- mini_mime (1.1.2)
104
- mini_portile2 (2.8.0)
105
- minitest (5.15.0)
106
- net-imap (0.2.3)
107
- digest
108
- net-protocol
109
- strscan
110
- net-pop (0.1.1)
111
- digest
112
- net-protocol
113
- timeout
114
- net-protocol (0.1.2)
115
- io-wait
116
- timeout
117
- net-smtp (0.3.1)
118
- digest
119
- net-protocol
120
- timeout
121
- nio4r (2.5.8)
122
- nokogiri (1.13.3)
123
- mini_portile2 (~> 2.8.0)
124
- racc (~> 1.4)
125
- nokogiri (1.13.3-x86_64-darwin)
126
- racc (~> 1.4)
127
- parallel (1.21.0)
128
- parser (3.0.2.0)
129
- ast (~> 2.4.1)
130
- racc (1.6.0)
131
- rack (2.2.3)
132
- rack-test (1.1.0)
133
- rack (>= 1.0, < 3)
134
- rails (7.0.2.2)
135
- actioncable (= 7.0.2.2)
136
- actionmailbox (= 7.0.2.2)
137
- actionmailer (= 7.0.2.2)
138
- actionpack (= 7.0.2.2)
139
- actiontext (= 7.0.2.2)
140
- actionview (= 7.0.2.2)
141
- activejob (= 7.0.2.2)
142
- activemodel (= 7.0.2.2)
143
- activerecord (= 7.0.2.2)
144
- activestorage (= 7.0.2.2)
145
- activesupport (= 7.0.2.2)
146
- bundler (>= 1.15.0)
147
- railties (= 7.0.2.2)
148
- rails-dom-testing (2.0.3)
149
- activesupport (>= 4.2.0)
150
- nokogiri (>= 1.6)
151
- rails-html-sanitizer (1.4.2)
152
- loofah (~> 2.3)
153
- railties (7.0.2.2)
154
- actionpack (= 7.0.2.2)
155
- activesupport (= 7.0.2.2)
156
- method_source
157
- rake (>= 12.2)
158
- thor (~> 1.0)
159
- zeitwerk (~> 2.5)
160
- rainbow (3.0.0)
161
- rake (13.0.6)
162
- rb-fsevent (0.11.0)
163
- rb-inotify (0.10.1)
164
- ffi (~> 1.0)
165
- regexp_parser (2.1.1)
166
- rexml (3.2.5)
167
- rubocop (1.23.0)
168
- parallel (~> 1.10)
169
- parser (>= 3.0.0.0)
170
- rainbow (>= 2.2.2, < 4.0)
171
- regexp_parser (>= 1.8, < 3.0)
172
- rexml
173
- rubocop-ast (>= 1.12.0, < 2.0)
174
- ruby-progressbar (~> 1.7)
175
- unicode-display_width (>= 1.4.0, < 3.0)
176
- rubocop-ast (1.13.0)
177
- parser (>= 3.0.1.1)
178
- ruby-progressbar (1.11.0)
179
- ruby-vips (2.1.4)
180
- ffi (~> 1.12)
181
- sqlite3 (1.4.2)
182
- strscan (3.0.1)
183
- thor (1.2.1)
184
- timeout (0.2.0)
185
- tzinfo (2.0.4)
186
- concurrent-ruby (~> 1.0)
187
- unicode-display_width (2.1.0)
188
- websocket-driver (0.7.5)
189
- websocket-extensions (>= 0.1.0)
190
- websocket-extensions (0.1.5)
191
- zeitwerk (2.5.4)
192
-
193
- PLATFORMS
194
- ruby
195
- x86_64-darwin-20
196
-
197
- DEPENDENCIES
198
- byebug
199
- kamifusen!
200
- listen
201
- rake (~> 13.0)
202
- rubocop (~> 1.7)
203
- sqlite3
204
-
205
- BUNDLED WITH
206
- 2.3.2