mini_paperclip 0.1.1 → 0.1.2

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: 51135052187a9097d6989759082fcdba81aecfb7259909ba8bbf1dd17bf70036
4
- data.tar.gz: 47673d86acfd5538bd0fb43cb373041add3281217ffae31d4bfcb71a7c2cf08b
3
+ metadata.gz: 29ef73b42c1c7ef6755a3af5907bab7f285f7fdacb4a6d15d283366d4f46d073
4
+ data.tar.gz: 877efe3a37db1c2f888df9785ad84bc4220507cfc970ec8bc3632ad3bf5908b2
5
5
  SHA512:
6
- metadata.gz: 703405ef627eecc1df7856f65f9f27877fb675c95b8c2eb9bbe45c998f71cbebba1b37101bf44d8ec9ce64782a0a39caa06cde4752fa6007279366760acb0659
7
- data.tar.gz: ded84756cf123fe3ffe82b8c47b59ac30c9ab39785056c4644a21e2ffd0183dd9e2250623f0307de41394c9392a0f650e64af3d0862163b1a5cc73522c0ed8ed
6
+ metadata.gz: 0a2395e2c209b4dcee1d518d87bcc972b2c253530edd1926800f2b1e0ab1fc9ab2b3b21c0760248e54d14ea0d74c41e8045d9717870947368e0ca5395d577ec7
7
+ data.tar.gz: a4dead2af2ebb2c0146b37196b4344683039ba302b0c174a9371b458e4121dd3b4613b5b00622f1d2171c0561d63d44297f5b17d1452b0a817f874c87d108ff5
@@ -27,6 +27,7 @@ jobs:
27
27
  gemfile:
28
28
  - gemfiles/rails_52.gemfile
29
29
  - gemfiles/rails_60.gemfile
30
+ - gemfiles/rails_head.gemfile
30
31
  runs-on: ubuntu-20.04
31
32
  steps:
32
33
  - uses: actions/checkout@v2
data/.gitignore CHANGED
@@ -8,6 +8,7 @@
8
8
  /spec/temp/
9
9
  /tmp/
10
10
  Gemfile.lock
11
+ /gemfiles/*.gemfile.lock
11
12
 
12
13
  # rspec failure tracking
13
14
  .rspec_status
data/Gemfile CHANGED
@@ -2,11 +2,5 @@ source "https://rubygems.org"
2
2
 
3
3
  # Specify your gem's dependencies in mini_paperclip.gemspec
4
4
  gemspec
5
-
6
- gem "rake", "~> 12.0"
7
- gem "rspec", "~> 3.0"
8
- gem "rack-test"
9
- gem "webmock"
10
- gem "tapp"
11
5
  gem "activerecord"
12
- gem "sqlite3"
6
+ eval_gemfile 'gemfiles/development.gemfile'
data/README.md CHANGED
@@ -104,7 +104,7 @@ end
104
104
 
105
105
  Interpolate is a simple template system like this.
106
106
 
107
- template: `:class/:attribute/:id/:hash.:extension`
107
+ template: `:class/:attachment/:id/:hash.:extension`
108
108
  result: `books/images/1234/abcdef1234567.png`
109
109
 
110
110
  You can check default interpolates.
@@ -116,8 +116,9 @@ p MiniPaperclip.config.interpolaters
116
116
  You can add any interpolate key and process.
117
117
 
118
118
  ```
119
- MiniPaperclip.config.interpolates[/:custom_style/] = -> (attachment, style) {
120
- "-#{style}"
119
+ MiniPaperclip.config.interpolates[':custom_style'] = -> (style) {
120
+ # This block is called by the scope in the instance of the Interpolator
121
+ # You can also call `attachment` and `config` in this block
121
122
  }
122
123
  ```
123
124
 
@@ -0,0 +1,7 @@
1
+ gem "rake", "~> 12.0"
2
+ gem "rspec", "~> 3.0"
3
+ gem "rack-test"
4
+ gem "webmock"
5
+ gem "tapp"
6
+ gem "sqlite3"
7
+ gem "pretty_backtrace"
@@ -1,10 +1,5 @@
1
1
  source "https://rubygems.org"
2
2
  gemspec path: '../'
3
3
 
4
- gem "rake", "~> 12.0"
5
- gem "rspec", "~> 3.0"
6
- gem "rack-test"
7
- gem "webmock"
8
- gem "tapp"
9
4
  gem 'activerecord', '~> 5.2.0'
10
- gem "sqlite3"
5
+ eval_gemfile 'development.gemfile'
@@ -1,10 +1,5 @@
1
1
  source "https://rubygems.org"
2
2
  gemspec path: '../'
3
3
 
4
- gem "rake", "~> 12.0"
5
- gem "rspec", "~> 3.0"
6
- gem "rack-test"
7
- gem "webmock"
8
- gem "tapp"
9
4
  gem 'activerecord', '~> 6.0.0'
10
- gem "sqlite3"
5
+ eval_gemfile 'development.gemfile'
@@ -0,0 +1,5 @@
1
+ source "https://rubygems.org"
2
+ gemspec path: '../'
3
+
4
+ gem 'activerecord', git: "https://github.com/rails/rails", branch: :master
5
+ eval_gemfile 'development.gemfile'
@@ -24,15 +24,15 @@ module MiniPaperclip
24
24
  @config ||= Config.new(
25
25
  # defaults
26
26
  interpolates: {
27
- /:class/ => ->(*) { class_result },
28
- /:attachment/ => ->(*) { attachment_result },
29
- /:hash/ => ->(_, style) { hash_key(style) },
30
- /:extension/ => ->(*) { File.extname(@record.read_attribute("#{@attachment_name}_file_name"))[1..-1] },
31
- /:id/ => ->(*) { @record.id },
32
- /:updated_at/ => ->(*) { @record.read_attribute("#{@attachment_name}_updated_at").to_i },
33
- /:style/ => ->(_, style) { style }
27
+ ':class' => ->(_) { class_result },
28
+ ':attachment' => ->(_) { attachment_result },
29
+ ':hash' => ->(style) { hash_key(style) },
30
+ ':extension' => ->(_) { extension },
31
+ ':id' => ->(_) { @attachment.record.id },
32
+ ':updated_at' => ->(_) { attachment.updated_at&.to_i },
33
+ ':style' => ->(style) { style }
34
34
  },
35
- hash_data: ":class/:attribute/:id/:style/:updated_at",
35
+ hash_data: ":class/:attachment/:id/:style/:updated_at",
36
36
  url_missing_path: ":attachment/:style/missing.png",
37
37
  read_timeout: 60,
38
38
  logger: Logger.new($stdout),
@@ -2,7 +2,7 @@
2
2
 
3
3
  module MiniPaperclip
4
4
  class Attachment
5
- UnsupporedError = Class.new(StandardError)
5
+ UnsupportedError = Class.new(StandardError)
6
6
 
7
7
  attr_reader :record, :attachment_name, :config, :storage,
8
8
  :waiting_write_file, :meta_content_type
@@ -15,7 +15,7 @@ module MiniPaperclip
15
15
  @meta_content_type = nil
16
16
  @dirty = false
17
17
  @storage = Storage.const_get(@config.storage.to_s.camelcase)
18
- .new(record, attachment_name, @config)
18
+ .new(self, @config)
19
19
  end
20
20
 
21
21
  def original_filename
@@ -31,7 +31,7 @@ module MiniPaperclip
31
31
  end
32
32
 
33
33
  def updated_at
34
- @record.read_attribute("#{@attachment_name}_updated_at").to_i
34
+ @record.read_attribute("#{@attachment_name}_updated_at")
35
35
  end
36
36
 
37
37
  def file?
@@ -110,7 +110,7 @@ module MiniPaperclip
110
110
  # data-uri
111
111
  match_data = file.match(/\Adata:([-\w]+\/[-\w\+\.]+)?;base64,(.*)/m)
112
112
  if match_data.nil?
113
- raise UnsupporedError, "attachment for \"#{file[0..100]}\" is not supported"
113
+ raise UnsupportedError, "attachment for \"#{file[0..100]}\" is not supported"
114
114
  end
115
115
  raw = Base64.decode64(match_data[2])
116
116
  @record.write_attribute("#{@attachment_name}_file_name", nil)
@@ -120,10 +120,10 @@ module MiniPaperclip
120
120
  @waiting_write_file = build_tempfile(StringIO.new(raw))
121
121
  @meta_content_type = match_data[1]
122
122
  else
123
- raise UnsupporedError, "attachment for \"#{file[0..100]}\" is not supported"
123
+ raise UnsupportedError, "attachment for \"#{file[0..100]}\" is not supported"
124
124
  end
125
125
  else
126
- raise UnsupporedError, "attachment for #{file.class} is not supported"
126
+ raise UnsupportedError, "attachment for #{file.class} is not supported"
127
127
  end
128
128
  end
129
129
 
@@ -168,6 +168,17 @@ module MiniPaperclip
168
168
  @waiting_write_file = nil
169
169
  end
170
170
 
171
+ def push_delete_files
172
+ @storage.push_delete_file(:original)
173
+ @config.styles&.each_key do |style|
174
+ @storage.push_delete_file(style)
175
+ end
176
+ end
177
+
178
+ def do_delete_files
179
+ @storage.do_delete_files
180
+ end
181
+
171
182
  private
172
183
 
173
184
  def strict_content_type(io)
@@ -184,7 +195,7 @@ module MiniPaperclip
184
195
  end
185
196
 
186
197
  def debug(str)
187
- MiniPaperclip.config.logger.debug(str)
198
+ MiniPaperclip.config.logger.debug("[mini_paperclip] #{str}")
188
199
  end
189
200
  end
190
201
  end
@@ -19,6 +19,12 @@ module MiniPaperclip
19
19
  end
20
20
  end
21
21
  end
22
+ before_destroy do
23
+ public_send(attachment_name).push_delete_files
24
+ end
25
+ after_commit(on: :destroy) do
26
+ public_send(attachment_name).do_delete_files
27
+ end
22
28
  validates_with Validators::MediaTypeSpoofValidator, {
23
29
  attributes: attachment_name,
24
30
  if: -> { instance_variable_get("@#{attachment_name}")&.dirty? }
@@ -25,7 +25,7 @@ module MiniPaperclip
25
25
  end
26
26
 
27
27
  def merge!(hash)
28
- to_h.deep_merge(hash).each { |k, v| self[k] = v }
28
+ to_h.deep_merge(hash.to_h).each { |k, v| self[k] = v }
29
29
  self
30
30
  end
31
31
  end
@@ -2,16 +2,17 @@
2
2
 
3
3
  module MiniPaperclip
4
4
  class Interpolator
5
- def initialize(record, attachment_name, config)
6
- @record = record
7
- @attachment_name = attachment_name
5
+ attr_reader :attachment, :config
6
+
7
+ def initialize(attachment, config)
8
+ @attachment = attachment
8
9
  @config = config
9
10
  end
10
11
 
11
12
  def interpolate(template, style)
12
13
  template.dup.tap do |t|
13
14
  @config.interpolates&.each do |matcher, block|
14
- t.gsub!(matcher) { instance_exec(attachment, style, &block) }
15
+ t.gsub!(matcher) { instance_exec(style, &block) }
15
16
  end
16
17
  end
17
18
  end
@@ -19,23 +20,28 @@ module MiniPaperclip
19
20
  private
20
21
 
21
22
  def class_result
22
- @record.class.name.underscore.pluralize
23
+ @attachment.record.class.name.underscore.pluralize
23
24
  end
24
25
 
25
26
  def attachment_result
26
- @attachment_name.to_s.downcase.pluralize
27
+ @attachment.attachment_name.to_s.downcase.pluralize
27
28
  end
28
29
 
29
- def attachment
30
- @record.public_send(@attachment_name)
30
+ def extension
31
+ attachment.original_filename &&
32
+ File.extname(attachment.original_filename)[1..-1]
31
33
  end
32
34
 
33
35
  def hash_key(style)
34
36
  OpenSSL::HMAC.hexdigest(
35
37
  OpenSSL::Digest::SHA1.new,
36
38
  @config.hash_secret,
37
- interpolate(@config.hash_data, style),
39
+ interpolated_hash_data(style),
38
40
  )
39
41
  end
42
+
43
+ def interpolated_hash_data(style)
44
+ interpolate(@config.hash_data, style)
45
+ end
40
46
  end
41
47
  end
@@ -3,13 +3,13 @@
3
3
  module MiniPaperclip
4
4
  module Storage
5
5
  class Base
6
- attr_reader :config
6
+ attr_reader :attachment, :config, :interpolator
7
7
 
8
- def initialize(record, attachment_name, config)
9
- @record = record
10
- @attachment_name = attachment_name
8
+ def initialize(attachment, config)
9
+ @attachment = attachment
11
10
  @config = config
12
- @interpolator = Interpolator.new(record, attachment_name, config)
11
+ @interpolator = Interpolator.new(attachment, config)
12
+ @deletes = []
13
13
  end
14
14
 
15
15
  def url_for_read(style)
@@ -17,10 +17,10 @@ module MiniPaperclip
17
17
  end
18
18
 
19
19
  def path_for(style)
20
- template = if @record.public_send(@attachment_name)&.file?
21
- @config.url_path
22
- else
20
+ template = if @attachment.original_filename.nil?
23
21
  @config.url_missing_path
22
+ else
23
+ @config.url_path
24
24
  end
25
25
  interpolate(template, style)
26
26
  end
@@ -32,7 +32,7 @@ module MiniPaperclip
32
32
  private
33
33
 
34
34
  def debug(str)
35
- MiniPaperclip.config.logger.debug(str)
35
+ MiniPaperclip.config.logger.debug("[mini_paperclip] #{str}")
36
36
  end
37
37
  end
38
38
  end
@@ -29,6 +29,15 @@ module MiniPaperclip
29
29
  def exists?(style)
30
30
  File.exists?(file_path(style))
31
31
  end
32
+
33
+ def push_delete_file(style)
34
+ @deletes.push(file_path(style))
35
+ end
36
+
37
+ def do_delete_files
38
+ debug("deleting by filesystem #{@deletes}")
39
+ FileUtils.rm_f(@deletes)
40
+ end
32
41
  end
33
42
  end
34
43
  end
@@ -8,7 +8,7 @@ module MiniPaperclip
8
8
  Aws::S3::Client.new.put_object(
9
9
  acl: @config.s3_acl,
10
10
  cache_control: @config.s3_cache_control,
11
- content_type: @record.read_attribute("#{@attachment_name}_content_type"),
11
+ content_type: @attachment.content_type,
12
12
  body: file.tap(&:rewind),
13
13
  bucket: @config.s3_bucket_name,
14
14
  key: s3_object_key(style),
@@ -21,7 +21,7 @@ module MiniPaperclip
21
21
  Aws::S3::Client.new.copy_object(
22
22
  acl: @config.s3_acl,
23
23
  cache_control: @config.s3_cache_control,
24
- content_type: @record.read_attribute("#{@attachment_name}_content_type"),
24
+ content_type: @attachment.content_type,
25
25
  copy_source: from_attachment.storage.object_key(style),
26
26
  bucket: @config.s3_bucket_name,
27
27
  key: s3_object_key(style),
@@ -46,6 +46,21 @@ module MiniPaperclip
46
46
  rescue Aws::S3::Errors::NotFound
47
47
  false
48
48
  end
49
+
50
+ def push_delete_file(style)
51
+ @deletes.push({ key: s3_object_key(style) })
52
+ end
53
+
54
+ def do_delete_files
55
+ debug("deleting by S3 to bucket:#{@config.s3_bucket_name},objects:#{@deletes}")
56
+ Aws::S3::Client.new.delete_objects(
57
+ bucket: @config.s3_bucket_name,
58
+ delete: {
59
+ objects: @deletes,
60
+ quiet: true,
61
+ }
62
+ )
63
+ end
49
64
  end
50
65
  end
51
66
  end
@@ -10,8 +10,8 @@ module MiniPaperclip
10
10
  if check_value = options[:less_than]
11
11
  unless attachment_file_size < check_value
12
12
  count = ActiveSupport::NumberHelper.number_to_human_size(check_value)
13
- record.errors.add(attribute, :less_than, { count: count })
14
- record.errors.add(attachment_file_size_name, :less_than, { count: count })
13
+ record.errors.add(attribute, :less_than, count: count)
14
+ record.errors.add(attachment_file_size_name, :less_than, count: count)
15
15
  end
16
16
  end
17
17
  end
@@ -31,12 +31,14 @@ module MiniPaperclip
31
31
  expected_height_less_than_or_equal_to = options.dig(:height, :less_than_or_equal_to)
32
32
  unless (!expected_width_less_than_or_equal_to || image_size.width <= expected_width_less_than_or_equal_to) &&
33
33
  (!expected_height_less_than_or_equal_to || image_size.height <= expected_height_less_than_or_equal_to)
34
- record.errors.add(attribute, :geometry, {
34
+ record.errors.add(
35
+ attribute,
36
+ :geometry,
35
37
  actual_width: image_size.width,
36
38
  actual_height: image_size.height,
37
39
  expected_width_less_than_or_equal_to: expected_width_less_than_or_equal_to,
38
40
  expected_height_less_than_or_equal_to: expected_height_less_than_or_equal_to,
39
- })
41
+ )
40
42
  end
41
43
  end
42
44
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module MiniPaperclip
4
- VERSION = "0.1.1"
4
+ VERSION = "0.1.2"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mini_paperclip
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - ksss
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-11-30 00:00:00.000000000 Z
11
+ date: 2020-12-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mini_magick
@@ -111,10 +111,10 @@ files:
111
111
  - Rakefile
112
112
  - bin/console
113
113
  - bin/setup
114
+ - gemfiles/development.gemfile
114
115
  - gemfiles/rails_52.gemfile
115
- - gemfiles/rails_52.gemfile.lock
116
116
  - gemfiles/rails_60.gemfile
117
- - gemfiles/rails_60.gemfile.lock
117
+ - gemfiles/rails_head.gemfile
118
118
  - lib/mini_paperclip.rb
119
119
  - lib/mini_paperclip/attachment.rb
120
120
  - lib/mini_paperclip/class_methods.rb
@@ -1,98 +0,0 @@
1
- PATH
2
- remote: ..
3
- specs:
4
- mini_paperclip (0.1.0)
5
- activemodel
6
- activesupport
7
- aws-sdk-s3
8
- mimemagic
9
- mini_magick
10
-
11
- GEM
12
- remote: https://rubygems.org/
13
- specs:
14
- activemodel (5.2.4.4)
15
- activesupport (= 5.2.4.4)
16
- activerecord (5.2.4.4)
17
- activemodel (= 5.2.4.4)
18
- activesupport (= 5.2.4.4)
19
- arel (>= 9.0)
20
- activesupport (5.2.4.4)
21
- concurrent-ruby (~> 1.0, >= 1.0.2)
22
- i18n (>= 0.7, < 2)
23
- minitest (~> 5.1)
24
- tzinfo (~> 1.1)
25
- addressable (2.7.0)
26
- public_suffix (>= 2.0.2, < 5.0)
27
- arel (9.0.0)
28
- aws-eventstream (1.1.0)
29
- aws-partitions (1.399.0)
30
- aws-sdk-core (3.109.3)
31
- aws-eventstream (~> 1, >= 1.0.2)
32
- aws-partitions (~> 1, >= 1.239.0)
33
- aws-sigv4 (~> 1.1)
34
- jmespath (~> 1.0)
35
- aws-sdk-kms (1.39.0)
36
- aws-sdk-core (~> 3, >= 3.109.0)
37
- aws-sigv4 (~> 1.1)
38
- aws-sdk-s3 (1.85.0)
39
- aws-sdk-core (~> 3, >= 3.109.0)
40
- aws-sdk-kms (~> 1)
41
- aws-sigv4 (~> 1.1)
42
- aws-sigv4 (1.2.2)
43
- aws-eventstream (~> 1, >= 1.0.2)
44
- concurrent-ruby (1.1.7)
45
- crack (0.4.4)
46
- diff-lcs (1.4.4)
47
- hashdiff (1.0.1)
48
- i18n (1.8.5)
49
- concurrent-ruby (~> 1.0)
50
- jmespath (1.4.0)
51
- mimemagic (0.3.5)
52
- mini_magick (4.11.0)
53
- minitest (5.14.2)
54
- public_suffix (4.0.6)
55
- rack (2.2.3)
56
- rack-test (1.1.0)
57
- rack (>= 1.0, < 3)
58
- rake (12.3.3)
59
- rspec (3.10.0)
60
- rspec-core (~> 3.10.0)
61
- rspec-expectations (~> 3.10.0)
62
- rspec-mocks (~> 3.10.0)
63
- rspec-core (3.10.0)
64
- rspec-support (~> 3.10.0)
65
- rspec-expectations (3.10.0)
66
- diff-lcs (>= 1.2.0, < 2.0)
67
- rspec-support (~> 3.10.0)
68
- rspec-mocks (3.10.0)
69
- diff-lcs (>= 1.2.0, < 2.0)
70
- rspec-support (~> 3.10.0)
71
- rspec-support (3.10.0)
72
- sqlite3 (1.4.2)
73
- tapp (1.5.1)
74
- thor
75
- thor (1.0.1)
76
- thread_safe (0.3.6)
77
- tzinfo (1.2.8)
78
- thread_safe (~> 0.1)
79
- webmock (3.10.0)
80
- addressable (>= 2.3.6)
81
- crack (>= 0.3.2)
82
- hashdiff (>= 0.4.0, < 2.0.0)
83
-
84
- PLATFORMS
85
- ruby
86
-
87
- DEPENDENCIES
88
- activerecord (~> 5.2.0)
89
- mini_paperclip!
90
- rack-test
91
- rake (~> 12.0)
92
- rspec (~> 3.0)
93
- sqlite3
94
- tapp
95
- webmock
96
-
97
- BUNDLED WITH
98
- 2.1.4
@@ -1,98 +0,0 @@
1
- PATH
2
- remote: ..
3
- specs:
4
- mini_paperclip (0.1.0)
5
- activemodel
6
- activesupport
7
- aws-sdk-s3
8
- mimemagic
9
- mini_magick
10
-
11
- GEM
12
- remote: https://rubygems.org/
13
- specs:
14
- activemodel (6.0.3.4)
15
- activesupport (= 6.0.3.4)
16
- activerecord (6.0.3.4)
17
- activemodel (= 6.0.3.4)
18
- activesupport (= 6.0.3.4)
19
- activesupport (6.0.3.4)
20
- concurrent-ruby (~> 1.0, >= 1.0.2)
21
- i18n (>= 0.7, < 2)
22
- minitest (~> 5.1)
23
- tzinfo (~> 1.1)
24
- zeitwerk (~> 2.2, >= 2.2.2)
25
- addressable (2.7.0)
26
- public_suffix (>= 2.0.2, < 5.0)
27
- aws-eventstream (1.1.0)
28
- aws-partitions (1.399.0)
29
- aws-sdk-core (3.109.3)
30
- aws-eventstream (~> 1, >= 1.0.2)
31
- aws-partitions (~> 1, >= 1.239.0)
32
- aws-sigv4 (~> 1.1)
33
- jmespath (~> 1.0)
34
- aws-sdk-kms (1.39.0)
35
- aws-sdk-core (~> 3, >= 3.109.0)
36
- aws-sigv4 (~> 1.1)
37
- aws-sdk-s3 (1.85.0)
38
- aws-sdk-core (~> 3, >= 3.109.0)
39
- aws-sdk-kms (~> 1)
40
- aws-sigv4 (~> 1.1)
41
- aws-sigv4 (1.2.2)
42
- aws-eventstream (~> 1, >= 1.0.2)
43
- concurrent-ruby (1.1.7)
44
- crack (0.4.4)
45
- diff-lcs (1.4.4)
46
- hashdiff (1.0.1)
47
- i18n (1.8.5)
48
- concurrent-ruby (~> 1.0)
49
- jmespath (1.4.0)
50
- mimemagic (0.3.5)
51
- mini_magick (4.11.0)
52
- minitest (5.14.2)
53
- public_suffix (4.0.6)
54
- rack (2.2.3)
55
- rack-test (1.1.0)
56
- rack (>= 1.0, < 3)
57
- rake (12.3.3)
58
- rspec (3.10.0)
59
- rspec-core (~> 3.10.0)
60
- rspec-expectations (~> 3.10.0)
61
- rspec-mocks (~> 3.10.0)
62
- rspec-core (3.10.0)
63
- rspec-support (~> 3.10.0)
64
- rspec-expectations (3.10.0)
65
- diff-lcs (>= 1.2.0, < 2.0)
66
- rspec-support (~> 3.10.0)
67
- rspec-mocks (3.10.0)
68
- diff-lcs (>= 1.2.0, < 2.0)
69
- rspec-support (~> 3.10.0)
70
- rspec-support (3.10.0)
71
- sqlite3 (1.4.2)
72
- tapp (1.5.1)
73
- thor
74
- thor (1.0.1)
75
- thread_safe (0.3.6)
76
- tzinfo (1.2.8)
77
- thread_safe (~> 0.1)
78
- webmock (3.10.0)
79
- addressable (>= 2.3.6)
80
- crack (>= 0.3.2)
81
- hashdiff (>= 0.4.0, < 2.0.0)
82
- zeitwerk (2.4.1)
83
-
84
- PLATFORMS
85
- ruby
86
-
87
- DEPENDENCIES
88
- activerecord (~> 6.0.0)
89
- mini_paperclip!
90
- rack-test
91
- rake (~> 12.0)
92
- rspec (~> 3.0)
93
- sqlite3
94
- tapp
95
- webmock
96
-
97
- BUNDLED WITH
98
- 2.1.4