mini_paperclip 0.1.1 → 0.1.2

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: 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