dis 1.1.5 → 1.1.10
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 +4 -4
- data/README.md +2 -2
- data/lib/dis.rb +14 -14
- data/lib/dis/engine.rb +1 -1
- data/lib/dis/errors.rb +5 -1
- data/lib/dis/jobs.rb +4 -4
- data/lib/dis/jobs/change_type.rb +1 -1
- data/lib/dis/jobs/delete.rb +1 -1
- data/lib/dis/jobs/store.rb +5 -1
- data/lib/dis/layer.rb +15 -9
- data/lib/dis/layers.rb +3 -3
- data/lib/dis/model.rb +10 -6
- data/lib/dis/model/class_methods.rb +1 -1
- data/lib/dis/model/data.rb +18 -7
- data/lib/dis/storage.rb +2 -4
- data/lib/dis/validations.rb +2 -2
- data/lib/dis/validations/data_presence.rb +1 -1
- data/lib/dis/version.rb +2 -2
- data/lib/rails/generators/dis/install/install_generator.rb +6 -6
- data/lib/rails/generators/dis/install/templates/initializer.rb +3 -1
- data/lib/rails/generators/dis/model/model_generator.rb +7 -7
- data/lib/tasks/dis.rake +11 -13
- metadata +39 -25
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 33601fc3f4ed58e0d18b4249612635b53eaebfa54ebe792d42b533ed03be3213
|
4
|
+
data.tar.gz: cf97314b2109f8436df907c8ff0d7fd7830c7268e8b342263b021e0fe7608870
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 50f30260c5c27626d566cca3739bec2b3f4068e1c6f567517f6183849ea7a0fc6581ff7b0df7b04000eb4d44960be4bd3cbe789c1973bc80f80b707cca2a77e2
|
7
|
+
data.tar.gz: f0977175392106d805449e417103cb1ebcc474cad1c35ad43adc0b6ae15539465342e4022816e64c290e62bfa8ecf300dbc5c5c0dc453cd13e5a41c0f0f0703c
|
data/README.md
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
[](https://rubygems.org/gems/dis)
|
2
|
-
|
2
|
+

|
3
3
|
[](https://codeclimate.com/github/elektronaut/dis)
|
4
4
|
[](https://codeclimate.com/github/elektronaut/dis)
|
5
5
|
[](http://inch-ci.org/github/elektronaut/dis)
|
@@ -17,7 +17,7 @@ your own on. If you're looking to handle image uploads, check out
|
|
17
17
|
[DynamicImage](https://github.com/elektronaut/dynamic_image). It's
|
18
18
|
built on top of Dis and handles resizing, cropping and more on demand.
|
19
19
|
|
20
|
-
Requires Rails
|
20
|
+
Requires Rails 5+
|
21
21
|
|
22
22
|
## Layers
|
23
23
|
|
data/lib/dis.rb
CHANGED
@@ -1,18 +1,18 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
8
|
-
require
|
9
|
-
require
|
10
|
-
require
|
11
|
-
require
|
12
|
-
require
|
13
|
-
require
|
14
|
-
require
|
15
|
-
require
|
3
|
+
require "digest/sha1"
|
4
|
+
require "fog/core"
|
5
|
+
require "fog/local"
|
6
|
+
require "active_job"
|
7
|
+
require "pmap"
|
8
|
+
require "dis/engine"
|
9
|
+
require "dis/errors"
|
10
|
+
require "dis/jobs"
|
11
|
+
require "dis/layer"
|
12
|
+
require "dis/layers"
|
13
|
+
require "dis/model"
|
14
|
+
require "dis/storage"
|
15
|
+
require "dis/validations"
|
16
16
|
|
17
17
|
module Dis
|
18
18
|
end
|
data/lib/dis/engine.rb
CHANGED
data/lib/dis/errors.rb
CHANGED
@@ -1,11 +1,15 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Dis
|
4
4
|
module Errors
|
5
5
|
class Error < StandardError; end
|
6
|
+
|
6
7
|
class ReadOnlyError < Dis::Errors::Error; end
|
8
|
+
|
7
9
|
class NoLayersError < Dis::Errors::Error; end
|
10
|
+
|
8
11
|
class NotFoundError < Dis::Errors::Error; end
|
12
|
+
|
9
13
|
class NoDataError < Dis::Errors::Error; end
|
10
14
|
end
|
11
15
|
end
|
data/lib/dis/jobs.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
3
|
+
require "dis/jobs/delete"
|
4
|
+
require "dis/jobs/store"
|
5
|
+
require "dis/jobs/change_type"
|
data/lib/dis/jobs/change_type.rb
CHANGED
data/lib/dis/jobs/delete.rb
CHANGED
data/lib/dis/jobs/store.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Dis
|
4
4
|
module Jobs
|
@@ -12,6 +12,10 @@ module Dis
|
|
12
12
|
|
13
13
|
def perform(type, key)
|
14
14
|
Dis::Storage.delayed_store(type, key)
|
15
|
+
rescue Dis::Errors::NotFoundError
|
16
|
+
Rails.logger.warn(
|
17
|
+
"Delayed store failed, object not found: #{[type, key].inspect}"
|
18
|
+
)
|
15
19
|
end
|
16
20
|
end
|
17
21
|
end
|
data/lib/dis/layer.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Dis
|
4
4
|
# = Dis Layer
|
@@ -94,6 +94,7 @@ module Dis
|
|
94
94
|
# is readonly.
|
95
95
|
def store(type, key, file)
|
96
96
|
raise Dis::Errors::ReadOnlyError if readonly?
|
97
|
+
|
97
98
|
store!(type, key, file)
|
98
99
|
end
|
99
100
|
|
@@ -101,6 +102,8 @@ module Dis
|
|
101
102
|
#
|
102
103
|
# layer.existing("documents", keys)
|
103
104
|
def existing(type, keys)
|
105
|
+
return [] if keys.empty?
|
106
|
+
|
104
107
|
list = []
|
105
108
|
directory(type, keys.first).files.each do |file|
|
106
109
|
list << file.key
|
@@ -113,8 +116,7 @@ module Dis
|
|
113
116
|
#
|
114
117
|
# layer.exists?("documents", key)
|
115
118
|
def exists?(type, key)
|
116
|
-
if directory(type, key)
|
117
|
-
directory(type, key).files.head(key_component(type, key))
|
119
|
+
if directory(type, key)&.files&.head(key_component(type, key))
|
118
120
|
true
|
119
121
|
else
|
120
122
|
false
|
@@ -127,6 +129,7 @@ module Dis
|
|
127
129
|
def get(type, key)
|
128
130
|
dir = directory(type, key)
|
129
131
|
return unless dir
|
132
|
+
|
130
133
|
dir.files.get(key_component(type, key))
|
131
134
|
end
|
132
135
|
|
@@ -138,6 +141,7 @@ module Dis
|
|
138
141
|
# Raises an error if the layer is readonly.
|
139
142
|
def delete(type, key)
|
140
143
|
raise Dis::Errors::ReadOnlyError if readonly?
|
144
|
+
|
141
145
|
delete!(type, key)
|
142
146
|
end
|
143
147
|
|
@@ -155,15 +159,16 @@ module Dis
|
|
155
159
|
end
|
156
160
|
|
157
161
|
def directory_component(_type, _key)
|
158
|
-
path ||
|
162
|
+
path || ""
|
159
163
|
end
|
160
164
|
|
161
165
|
def key_component(type, key)
|
162
|
-
[type, key[0...2], key[2..key.length]].compact.join(
|
166
|
+
[type, key[0...2], key[2..key.length]].compact.join("/")
|
163
167
|
end
|
164
168
|
|
165
169
|
def delete!(type, key)
|
166
170
|
return false unless exists?(type, key)
|
171
|
+
|
167
172
|
get(type, key).destroy
|
168
173
|
end
|
169
174
|
|
@@ -174,7 +179,7 @@ module Dis
|
|
174
179
|
def directory!(type, key)
|
175
180
|
dir = directory(type, key)
|
176
181
|
dir ||= connection.directories.create(
|
177
|
-
key:
|
182
|
+
key: directory_component(type, key),
|
178
183
|
public: public?
|
179
184
|
)
|
180
185
|
dir
|
@@ -182,16 +187,17 @@ module Dis
|
|
182
187
|
|
183
188
|
def store!(type, key, file)
|
184
189
|
return get(type, key) if exists?(type, key)
|
190
|
+
|
185
191
|
file.rewind if file.respond_to?(:rewind)
|
186
192
|
directory!(type, key).files.create(
|
187
|
-
key:
|
188
|
-
body:
|
193
|
+
key: key_component(type, key),
|
194
|
+
body: (file.is_a?(Fog::Model) ? file.body : file),
|
189
195
|
public: public?
|
190
196
|
)
|
191
197
|
end
|
192
198
|
|
193
199
|
def path
|
194
|
-
@path
|
200
|
+
@path.presence
|
195
201
|
end
|
196
202
|
end
|
197
203
|
end
|
data/lib/dis/layers.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Dis
|
4
4
|
# = Dis Layers
|
@@ -22,8 +22,8 @@ module Dis
|
|
22
22
|
end
|
23
23
|
|
24
24
|
# Iterates over the layers.
|
25
|
-
def each
|
26
|
-
@layers.each { |layer|
|
25
|
+
def each(&block)
|
26
|
+
@layers.each { |layer| block.call(layer) }
|
27
27
|
end
|
28
28
|
|
29
29
|
# Returns a new instance containing only the delayed layers.
|
data/lib/dis/model.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require "dis/model/class_methods"
|
4
|
+
require "dis/model/data"
|
5
5
|
|
6
6
|
module Dis
|
7
7
|
# = Dis Model
|
@@ -103,7 +103,7 @@ module Dis
|
|
103
103
|
# <tt>content_hash</tt> to nil.
|
104
104
|
def data=(raw_data)
|
105
105
|
new_data = Dis::Model::Data.new(self, raw_data)
|
106
|
-
attribute_will_change!(
|
106
|
+
attribute_will_change!("data") unless new_data == dis_data
|
107
107
|
@dis_data = new_data
|
108
108
|
dis_set :content_hash, if raw_data.nil?
|
109
109
|
nil
|
@@ -115,7 +115,7 @@ module Dis
|
|
115
115
|
|
116
116
|
# Returns true if the data has been changed since the object was last saved.
|
117
117
|
def data_changed?
|
118
|
-
changes.include?(
|
118
|
+
changes.include?("data")
|
119
119
|
end
|
120
120
|
|
121
121
|
def dis_stored?
|
@@ -131,10 +131,14 @@ module Dis
|
|
131
131
|
dis_set :filename, file.original_filename
|
132
132
|
end
|
133
133
|
|
134
|
+
# Returns the data as a temporary file.
|
135
|
+
delegate :tempfile, to: :dis_data
|
136
|
+
|
134
137
|
private
|
135
138
|
|
136
139
|
def cleanup_data
|
137
140
|
return if @previous_content_hash.blank?
|
141
|
+
|
138
142
|
dis_data.expire(@previous_content_hash)
|
139
143
|
@previous_content_hash = nil
|
140
144
|
end
|
@@ -167,7 +171,7 @@ module Dis
|
|
167
171
|
|
168
172
|
# We don't want the data column when doing a partial write.
|
169
173
|
def keys_for_partial_write
|
170
|
-
super.reject { |a| a ==
|
174
|
+
super.reject { |a| a == "data" }
|
171
175
|
end
|
172
176
|
end
|
173
177
|
end
|
data/lib/dis/model/data.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Dis
|
4
4
|
module Model
|
@@ -26,7 +26,7 @@ module Dis
|
|
26
26
|
|
27
27
|
# Returns the data as a binary string.
|
28
28
|
def read
|
29
|
-
@
|
29
|
+
@read ||= read_from(closest)
|
30
30
|
end
|
31
31
|
|
32
32
|
# Will be true if data has been explicitely set.
|
@@ -60,9 +60,20 @@ module Dis
|
|
60
60
|
# Stores the data. Returns a hash of the content for reference.
|
61
61
|
def store!
|
62
62
|
raise Dis::Errors::NoDataError unless raw?
|
63
|
+
|
63
64
|
Dis::Storage.store(storage_type, raw)
|
64
65
|
end
|
65
66
|
|
67
|
+
# Writes the data to a temporary file.
|
68
|
+
def tempfile
|
69
|
+
unless @tempfile
|
70
|
+
@tempfile = Tempfile.new
|
71
|
+
@tempfile.write(@read || read_from(closest))
|
72
|
+
@tempfile.open
|
73
|
+
end
|
74
|
+
@tempfile
|
75
|
+
end
|
76
|
+
|
66
77
|
private
|
67
78
|
|
68
79
|
def closest
|
@@ -83,6 +94,7 @@ module Dis
|
|
83
94
|
|
84
95
|
def read_from(object)
|
85
96
|
return nil unless object
|
97
|
+
|
86
98
|
if object.respond_to?(:body)
|
87
99
|
object.body
|
88
100
|
elsif object.respond_to?(:read)
|
@@ -104,14 +116,13 @@ module Dis
|
|
104
116
|
end
|
105
117
|
|
106
118
|
def stored?
|
107
|
-
|
119
|
+
content_hash.present? &&
|
120
|
+
(@record.dis_stored? ||
|
121
|
+
Dis::Storage.exists?(storage_type, content_hash))
|
108
122
|
end
|
109
123
|
|
110
124
|
def stored
|
111
|
-
Dis::Storage.get(
|
112
|
-
storage_type,
|
113
|
-
content_hash
|
114
|
-
)
|
125
|
+
Dis::Storage.get(storage_type, content_hash)
|
115
126
|
end
|
116
127
|
|
117
128
|
attr_reader :raw
|
data/lib/dis/storage.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Dis
|
4
4
|
# = Dis Storage
|
@@ -107,9 +107,7 @@ module Dis
|
|
107
107
|
fetch_count += 1
|
108
108
|
layer.get(type, key)
|
109
109
|
end.call
|
110
|
-
end
|
111
|
-
|
112
|
-
raise Dis::Errors::NotFoundError unless result
|
110
|
+
end || raise(Dis::Errors::NotFoundError)
|
113
111
|
|
114
112
|
store_immediately!(type, result) if fetch_count > 1
|
115
113
|
result
|
data/lib/dis/validations.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "dis/validations/data_presence"
|
data/lib/dis/version.rb
CHANGED
@@ -1,16 +1,16 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require "rails/generators"
|
4
|
+
require "rails/generators/rails/model/model_generator"
|
5
5
|
|
6
6
|
module Dis
|
7
7
|
module Generators
|
8
8
|
class InstallGenerator < Rails::Generators::Base
|
9
|
-
desc
|
10
|
-
source_root File.expand_path(
|
9
|
+
desc "Creates the Dis initializer"
|
10
|
+
source_root File.expand_path("templates", __dir__)
|
11
11
|
|
12
12
|
def create_initializer
|
13
|
-
template
|
13
|
+
template "initializer.rb", File.join("config", "initializers", "dis.rb")
|
14
14
|
end
|
15
15
|
end
|
16
16
|
end
|
@@ -1,9 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# Be sure to restart your server when you modify this file.
|
2
4
|
|
3
5
|
# Creates a local storage layer in db/dis:
|
4
6
|
|
5
7
|
Dis::Storage.layers << Dis::Layer.new(
|
6
|
-
Fog::Storage.new(provider:
|
8
|
+
Fog::Storage.new(provider: "Local", local_root: Rails.root.join("db/dis")),
|
7
9
|
path: Rails.env
|
8
10
|
)
|
9
11
|
|
@@ -1,12 +1,12 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require "rails/generators"
|
4
|
+
require "rails/generators/rails/model/model_generator"
|
5
5
|
|
6
6
|
module Dis
|
7
7
|
module Generators
|
8
8
|
class ModelGenerator < Rails::Generators::ModelGenerator
|
9
|
-
desc
|
9
|
+
desc "Creates a Dis model"
|
10
10
|
|
11
11
|
def initialize(args, *options)
|
12
12
|
super(inject_dis_attributes(args), *options)
|
@@ -14,7 +14,7 @@ module Dis
|
|
14
14
|
|
15
15
|
def add_model_extension
|
16
16
|
inject_into_file(
|
17
|
-
File.join(
|
17
|
+
File.join("app/models", class_path, "#{file_name}.rb"),
|
18
18
|
after: "ActiveRecord::Base\n"
|
19
19
|
) do
|
20
20
|
" include Dis::Model\n"
|
@@ -32,12 +32,12 @@ module Dis
|
|
32
32
|
end
|
33
33
|
|
34
34
|
def dis_attributes
|
35
|
-
%w
|
35
|
+
%w[
|
36
36
|
content_hash:string
|
37
37
|
content_type:string
|
38
38
|
content_length:integer
|
39
39
|
filename:string
|
40
|
-
|
40
|
+
]
|
41
41
|
end
|
42
42
|
end
|
43
43
|
end
|
data/lib/tasks/dis.rake
CHANGED
@@ -1,15 +1,15 @@
|
|
1
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
3
|
namespace :dis do
|
4
|
-
desc
|
4
|
+
desc "Check stuff"
|
5
5
|
task consistency_check: :environment do
|
6
|
-
unless ENV[
|
6
|
+
unless ENV["MODELS"]
|
7
7
|
puts "Usage: #{$PROGRAM_NAME} dis:consistency_check " \
|
8
|
-
|
8
|
+
"MODELS=Avatar,Document"
|
9
9
|
exit
|
10
10
|
end
|
11
11
|
|
12
|
-
models = ENV[
|
12
|
+
models = ENV["MODELS"].split(",").map(&:strip).map(&:constantize)
|
13
13
|
|
14
14
|
jobs = Set.new
|
15
15
|
|
@@ -17,10 +17,7 @@ namespace :dis do
|
|
17
17
|
puts "-- #{model.name} --"
|
18
18
|
|
19
19
|
content_hash_attr = model.dis_attributes[:content_hash]
|
20
|
-
objects = model
|
21
|
-
.select(content_hash_attr)
|
22
|
-
.uniq
|
23
|
-
.map { |r| r.send(content_hash_attr) }
|
20
|
+
objects = model.pluck(content_hash_attr).uniq
|
24
21
|
global_missing = objects.dup
|
25
22
|
|
26
23
|
puts "Unique objects: #{objects.length}"
|
@@ -31,9 +28,10 @@ namespace :dis do
|
|
31
28
|
existing = layer.existing(model.dis_type, objects)
|
32
29
|
missing = objects - existing
|
33
30
|
global_missing -= existing
|
34
|
-
puts "#{existing.length} existing, #{missing.length} missing"
|
31
|
+
puts "#{existing.length} existing, #{missing.length} missing" +
|
32
|
+
(layer.readonly? ? " (read-only)" : "")
|
35
33
|
|
36
|
-
next unless layer.delayed?
|
34
|
+
next unless layer.delayed? && !layer.readonly?
|
37
35
|
|
38
36
|
jobs += (missing - global_missing).pmap do |hash|
|
39
37
|
[model.dis_type, hash]
|
@@ -51,8 +49,8 @@ namespace :dis do
|
|
51
49
|
if jobs.any?
|
52
50
|
print "#{jobs.length} objects can be transferred to delayed layers, " \
|
53
51
|
"queue now? (y/n) "
|
54
|
-
response =
|
55
|
-
if
|
52
|
+
response = $stdin.gets.chomp
|
53
|
+
if /^y/i.match?(response)
|
56
54
|
puts "Queueing jobs..."
|
57
55
|
jobs.each { |type, hash| Dis::Jobs::Store.perform_later(type, hash) }
|
58
56
|
end
|
metadata
CHANGED
@@ -1,29 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dis
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Inge Jørgensen
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-05-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: rails
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - "~>"
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '5.0'
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - "~>"
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '5.0'
|
27
13
|
- !ruby/object:Gem::Dependency
|
28
14
|
name: fog-core
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
@@ -67,7 +53,21 @@ dependencies:
|
|
67
53
|
- !ruby/object:Gem::Version
|
68
54
|
version: 1.1.0
|
69
55
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
56
|
+
name: rails
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '5.0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '5.0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rspec-rails
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
73
|
- - ">="
|
@@ -81,19 +81,33 @@ dependencies:
|
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
84
|
+
name: simplecov
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
87
|
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version:
|
89
|
+
version: 0.17.1
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version:
|
96
|
+
version: 0.17.1
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: sqlite3
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
97
111
|
description: Dis is a Rails plugin that stores your file uploads and other binary
|
98
112
|
blobs.
|
99
113
|
email:
|
@@ -127,7 +141,7 @@ homepage: https://github.com/elektronaut/dis
|
|
127
141
|
licenses:
|
128
142
|
- MIT
|
129
143
|
metadata: {}
|
130
|
-
post_install_message:
|
144
|
+
post_install_message:
|
131
145
|
rdoc_options: []
|
132
146
|
require_paths:
|
133
147
|
- lib
|
@@ -135,15 +149,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
135
149
|
requirements:
|
136
150
|
- - ">="
|
137
151
|
- !ruby/object:Gem::Version
|
138
|
-
version:
|
152
|
+
version: 2.7.0
|
139
153
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
140
154
|
requirements:
|
141
155
|
- - ">="
|
142
156
|
- !ruby/object:Gem::Version
|
143
157
|
version: '0'
|
144
158
|
requirements: []
|
145
|
-
rubygems_version: 3.
|
146
|
-
signing_key:
|
159
|
+
rubygems_version: 3.2.3
|
160
|
+
signing_key:
|
147
161
|
specification_version: 4
|
148
162
|
summary: A file store for your Rails app
|
149
163
|
test_files: []
|