kithe 2.0.0.pre.alpha2 → 2.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +4 -4
- data/app/indexing/kithe/indexable/record_index_updater.rb +1 -1
- data/app/jobs/kithe/create_derivatives_job.rb +2 -2
- data/app/models/kithe/asset.rb +82 -154
- data/app/models/kithe/asset/derivative_creator.rb +32 -62
- data/app/models/kithe/asset/derivative_definition.rb +12 -13
- data/app/models/kithe/asset/set_shrine_uploader.rb +64 -0
- data/app/models/kithe/collection.rb +0 -6
- data/app/models/kithe/model.rb +0 -21
- data/app/models/kithe/work.rb +0 -5
- data/app/uploaders/kithe/asset_uploader.rb +15 -78
- data/lib/kithe.rb +22 -20
- data/{app/models → lib}/kithe/config_base.rb +6 -1
- data/lib/kithe/engine.rb +14 -3
- data/lib/kithe/indexable_settings.rb +1 -1
- data/lib/kithe/patch_fx.rb +39 -0
- data/lib/kithe/version.rb +4 -1
- data/lib/shrine/plugins/kithe_checksum_signatures.rb +41 -0
- data/lib/shrine/plugins/kithe_controllable_backgrounding.rb +53 -0
- data/lib/shrine/plugins/kithe_derivative_definitions.rb +101 -0
- data/lib/shrine/plugins/kithe_derivatives.rb +54 -0
- data/lib/shrine/plugins/kithe_determine_mime_type.rb +39 -0
- data/lib/shrine/plugins/kithe_persisted_derivatives.rb +161 -0
- data/lib/shrine/plugins/kithe_promotion_callbacks.rb +4 -0
- data/lib/shrine/plugins/kithe_promotion_directives.rb +33 -3
- data/lib/shrine/plugins/kithe_storage_location.rb +53 -4
- data/lib/tasks/kithe_tasks.rake +22 -15
- data/spec/dummy/app/models/plain_active_record.rb +3 -0
- data/spec/dummy/config/database.yml +6 -0
- data/spec/dummy/db/schema.rb +102 -0
- data/spec/dummy/log/development.log +3616 -0
- data/spec/dummy/log/test.log +86464 -0
- data/spec/dummy/tmp/development_secret.txt +1 -1
- data/spec/indexing/indexable_spec.rb +1 -1
- data/spec/models/kithe/asset/asset_derivatives_spec.rb +137 -0
- data/spec/models/kithe/asset/asset_promotion_hooks_spec.rb +26 -5
- data/spec/models/kithe/asset/set_shrine_uploader_spec.rb +39 -0
- data/spec/models/kithe/asset_spec.rb +9 -59
- data/spec/models/kithe/model_spec.rb +0 -32
- data/spec/models/kithe_spec.rb +10 -0
- data/spec/shrine/kithe_accept_remote_url_spec.rb +49 -0
- data/spec/shrine/kithe_checksum_signatures_spec.rb +63 -0
- data/spec/shrine/kithe_derivative_definitions_spec.rb +303 -0
- data/spec/shrine/kithe_persisted_derivatives_spec.rb +424 -0
- data/spec/shrine/kithe_storage_location_spec.rb +43 -15
- data/spec/spec_helper.rb +0 -19
- data/spec/test_support/images/3x3_pixel.jpg +0 -0
- data/spec/test_support/shrine_spec_support.rb +2 -1
- metadata +60 -36
- data/app/models/kithe/asset/derivative_updater.rb +0 -119
- data/app/models/kithe/derivative.rb +0 -15
- data/app/uploaders/kithe/derivative_uploader.rb +0 -48
- data/spec/dummy/db/structure.sql +0 -309
- data/spec/models/kithe/asset/asset_create_derivatives_spec.rb +0 -320
- data/spec/models/kithe/derivative_spec.rb +0 -168
@@ -1,15 +0,0 @@
|
|
1
|
-
module Kithe
|
2
|
-
|
3
|
-
# Derivatives by default will be stored in Shrine storage :kithe_derivatives, so
|
4
|
-
# that should be registered in your app.
|
5
|
-
#
|
6
|
-
# Only one deriv can exist for a given asset_id/key pair, enforced by db constraint.
|
7
|
-
class Derivative < ApplicationRecord
|
8
|
-
# the fk is to kithe_models STI table, but we only intend for assets
|
9
|
-
belongs_to :asset, class_name: "Kithe::Asset"
|
10
|
-
|
11
|
-
include Kithe::DerivativeUploader::Attachment.new(:file, store: :kithe_derivatives)
|
12
|
-
|
13
|
-
delegate :content_type, :size, :height, :width, :url, to: :file, allow_nil: true
|
14
|
-
end
|
15
|
-
end
|
@@ -1,48 +0,0 @@
|
|
1
|
-
require 'mini_mime'
|
2
|
-
|
3
|
-
module Kithe
|
4
|
-
# The derivative uploader doesn't have to do too much, we don't even use
|
5
|
-
# promotion for derivatives, just writing directly to a storage.
|
6
|
-
#
|
7
|
-
# But it needs activerecord integration, and limited metadata automatic extraction.
|
8
|
-
class DerivativeUploader < Shrine
|
9
|
-
plugin :activerecord
|
10
|
-
|
11
|
-
plugin :determine_mime_type, analyzer: :marcel
|
12
|
-
|
13
|
-
# ignore error, often from storing a non-image file which can't have dimensions
|
14
|
-
# extracted. behavior consistent with shrine 2.x.
|
15
|
-
plugin :store_dimensions, on_error: :ignore
|
16
|
-
|
17
|
-
# Useful in case consumers want it, and doesn't harm anything to be available.
|
18
|
-
# https://github.com/shrinerb/shrine/blob/master/doc/plugins/rack_response.md
|
19
|
-
plugin :rack_response
|
20
|
-
|
21
|
-
# should this be in a plugin? location in file system based on original asset
|
22
|
-
# id and derivative key, as well as unique random file id from shrine.
|
23
|
-
def generate_location(io, context)
|
24
|
-
# assumes we're only used with Derivative model, that has an asset_id and key
|
25
|
-
asset_id = context[:record].asset_id
|
26
|
-
key = context[:record].key
|
27
|
-
original = super
|
28
|
-
[asset_id, key, original].compact.join("/")
|
29
|
-
end
|
30
|
-
|
31
|
-
|
32
|
-
# Override to fix "filename" metadata to be something reasonable, regardless
|
33
|
-
# of what if anything was the filename of the IO being attached. shrine S3 will
|
34
|
-
# insist on setting a default content-disposition with this filename.
|
35
|
-
def extract_metadata(io, context = {})
|
36
|
-
result = super
|
37
|
-
|
38
|
-
if context[:kithe_derivative_key] &&
|
39
|
-
context[:record]
|
40
|
-
extension = MiniMime.lookup_by_content_type(result["mime_type"] || "")&.extension
|
41
|
-
result["filename"] = "#{context[:record].asset.friendlier_id}_#{context[:kithe_derivative_key]}.#{extension}"
|
42
|
-
result["kithe_derivative_key"] = context[:kithe_derivative_key]
|
43
|
-
end
|
44
|
-
|
45
|
-
return result
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
data/spec/dummy/db/structure.sql
DELETED
@@ -1,309 +0,0 @@
|
|
1
|
-
SET statement_timeout = 0;
|
2
|
-
SET lock_timeout = 0;
|
3
|
-
SET idle_in_transaction_session_timeout = 0;
|
4
|
-
SET client_encoding = 'UTF8';
|
5
|
-
SET standard_conforming_strings = on;
|
6
|
-
SELECT pg_catalog.set_config('search_path', '', false);
|
7
|
-
SET check_function_bodies = false;
|
8
|
-
SET client_min_messages = warning;
|
9
|
-
SET row_security = off;
|
10
|
-
|
11
|
-
--
|
12
|
-
-- Name: pgcrypto; Type: EXTENSION; Schema: -; Owner: -
|
13
|
-
--
|
14
|
-
|
15
|
-
CREATE EXTENSION IF NOT EXISTS pgcrypto WITH SCHEMA public;
|
16
|
-
|
17
|
-
|
18
|
-
--
|
19
|
-
-- Name: EXTENSION pgcrypto; Type: COMMENT; Schema: -; Owner: -
|
20
|
-
--
|
21
|
-
|
22
|
-
COMMENT ON EXTENSION pgcrypto IS 'cryptographic functions';
|
23
|
-
|
24
|
-
|
25
|
-
--
|
26
|
-
-- Name: kithe_models_friendlier_id_gen(bigint, bigint); Type: FUNCTION; Schema: public; Owner: -
|
27
|
-
--
|
28
|
-
|
29
|
-
CREATE FUNCTION public.kithe_models_friendlier_id_gen(min_value bigint, max_value bigint) RETURNS text
|
30
|
-
LANGUAGE plpgsql
|
31
|
-
AS $$
|
32
|
-
DECLARE
|
33
|
-
new_id_int bigint;
|
34
|
-
new_id_str character varying := '';
|
35
|
-
done bool;
|
36
|
-
tries integer;
|
37
|
-
alphabet char[] := ARRAY['0','1','2','3','4','5','6','7','8','9',
|
38
|
-
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
|
39
|
-
'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'];
|
40
|
-
alphabet_length integer := array_length(alphabet, 1);
|
41
|
-
|
42
|
-
BEGIN
|
43
|
-
done := false;
|
44
|
-
tries := 0;
|
45
|
-
WHILE (NOT done) LOOP
|
46
|
-
tries := tries + 1;
|
47
|
-
IF (tries > 3) THEN
|
48
|
-
RAISE 'Could not find non-conflicting friendlier_id in 3 tries';
|
49
|
-
END IF;
|
50
|
-
|
51
|
-
new_id_int := trunc(random() * (max_value - min_value) + min_value);
|
52
|
-
|
53
|
-
-- convert bigint to a Base-36 alphanumeric string
|
54
|
-
-- see https://web.archive.org/web/20130420084605/http://www.jamiebegin.com/base36-conversion-in-postgresql/
|
55
|
-
-- https://gist.github.com/btbytes/7159902
|
56
|
-
WHILE new_id_int != 0 LOOP
|
57
|
-
new_id_str := alphabet[(new_id_int % alphabet_length)+1] || new_id_str;
|
58
|
-
new_id_int := new_id_int / alphabet_length;
|
59
|
-
END LOOP;
|
60
|
-
|
61
|
-
done := NOT exists(SELECT 1 FROM kithe_models WHERE friendlier_id=new_id_str);
|
62
|
-
END LOOP;
|
63
|
-
RETURN new_id_str;
|
64
|
-
END;
|
65
|
-
$$;
|
66
|
-
|
67
|
-
|
68
|
-
SET default_tablespace = '';
|
69
|
-
|
70
|
-
SET default_with_oids = false;
|
71
|
-
|
72
|
-
--
|
73
|
-
-- Name: ar_internal_metadata; Type: TABLE; Schema: public; Owner: -
|
74
|
-
--
|
75
|
-
|
76
|
-
CREATE TABLE public.ar_internal_metadata (
|
77
|
-
key character varying NOT NULL,
|
78
|
-
value character varying,
|
79
|
-
created_at timestamp without time zone NOT NULL,
|
80
|
-
updated_at timestamp without time zone NOT NULL
|
81
|
-
);
|
82
|
-
|
83
|
-
|
84
|
-
--
|
85
|
-
-- Name: kithe_derivatives; Type: TABLE; Schema: public; Owner: -
|
86
|
-
--
|
87
|
-
|
88
|
-
CREATE TABLE public.kithe_derivatives (
|
89
|
-
id bigint NOT NULL,
|
90
|
-
key character varying NOT NULL,
|
91
|
-
file_data jsonb,
|
92
|
-
asset_id uuid NOT NULL,
|
93
|
-
created_at timestamp without time zone NOT NULL,
|
94
|
-
updated_at timestamp without time zone NOT NULL
|
95
|
-
);
|
96
|
-
|
97
|
-
|
98
|
-
--
|
99
|
-
-- Name: kithe_derivatives_id_seq; Type: SEQUENCE; Schema: public; Owner: -
|
100
|
-
--
|
101
|
-
|
102
|
-
CREATE SEQUENCE public.kithe_derivatives_id_seq
|
103
|
-
START WITH 1
|
104
|
-
INCREMENT BY 1
|
105
|
-
NO MINVALUE
|
106
|
-
NO MAXVALUE
|
107
|
-
CACHE 1;
|
108
|
-
|
109
|
-
|
110
|
-
--
|
111
|
-
-- Name: kithe_derivatives_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
|
112
|
-
--
|
113
|
-
|
114
|
-
ALTER SEQUENCE public.kithe_derivatives_id_seq OWNED BY public.kithe_derivatives.id;
|
115
|
-
|
116
|
-
|
117
|
-
--
|
118
|
-
-- Name: kithe_model_contains; Type: TABLE; Schema: public; Owner: -
|
119
|
-
--
|
120
|
-
|
121
|
-
CREATE TABLE public.kithe_model_contains (
|
122
|
-
containee_id uuid,
|
123
|
-
container_id uuid
|
124
|
-
);
|
125
|
-
|
126
|
-
|
127
|
-
--
|
128
|
-
-- Name: kithe_models; Type: TABLE; Schema: public; Owner: -
|
129
|
-
--
|
130
|
-
|
131
|
-
CREATE TABLE public.kithe_models (
|
132
|
-
id uuid DEFAULT public.gen_random_uuid() NOT NULL,
|
133
|
-
title character varying NOT NULL,
|
134
|
-
type character varying NOT NULL,
|
135
|
-
"position" integer,
|
136
|
-
json_attributes jsonb,
|
137
|
-
created_at timestamp without time zone NOT NULL,
|
138
|
-
updated_at timestamp without time zone NOT NULL,
|
139
|
-
parent_id uuid,
|
140
|
-
friendlier_id character varying DEFAULT public.kithe_models_friendlier_id_gen('2821109907456'::bigint, '101559956668415'::bigint) NOT NULL,
|
141
|
-
file_data jsonb,
|
142
|
-
representative_id uuid,
|
143
|
-
leaf_representative_id uuid,
|
144
|
-
kithe_model_type integer NOT NULL
|
145
|
-
);
|
146
|
-
|
147
|
-
|
148
|
-
--
|
149
|
-
-- Name: schema_migrations; Type: TABLE; Schema: public; Owner: -
|
150
|
-
--
|
151
|
-
|
152
|
-
CREATE TABLE public.schema_migrations (
|
153
|
-
version character varying NOT NULL
|
154
|
-
);
|
155
|
-
|
156
|
-
|
157
|
-
--
|
158
|
-
-- Name: kithe_derivatives id; Type: DEFAULT; Schema: public; Owner: -
|
159
|
-
--
|
160
|
-
|
161
|
-
ALTER TABLE ONLY public.kithe_derivatives ALTER COLUMN id SET DEFAULT nextval('public.kithe_derivatives_id_seq'::regclass);
|
162
|
-
|
163
|
-
|
164
|
-
--
|
165
|
-
-- Name: ar_internal_metadata ar_internal_metadata_pkey; Type: CONSTRAINT; Schema: public; Owner: -
|
166
|
-
--
|
167
|
-
|
168
|
-
ALTER TABLE ONLY public.ar_internal_metadata
|
169
|
-
ADD CONSTRAINT ar_internal_metadata_pkey PRIMARY KEY (key);
|
170
|
-
|
171
|
-
|
172
|
-
--
|
173
|
-
-- Name: kithe_derivatives kithe_derivatives_pkey; Type: CONSTRAINT; Schema: public; Owner: -
|
174
|
-
--
|
175
|
-
|
176
|
-
ALTER TABLE ONLY public.kithe_derivatives
|
177
|
-
ADD CONSTRAINT kithe_derivatives_pkey PRIMARY KEY (id);
|
178
|
-
|
179
|
-
|
180
|
-
--
|
181
|
-
-- Name: kithe_models kithe_models_pkey; Type: CONSTRAINT; Schema: public; Owner: -
|
182
|
-
--
|
183
|
-
|
184
|
-
ALTER TABLE ONLY public.kithe_models
|
185
|
-
ADD CONSTRAINT kithe_models_pkey PRIMARY KEY (id);
|
186
|
-
|
187
|
-
|
188
|
-
--
|
189
|
-
-- Name: schema_migrations schema_migrations_pkey; Type: CONSTRAINT; Schema: public; Owner: -
|
190
|
-
--
|
191
|
-
|
192
|
-
ALTER TABLE ONLY public.schema_migrations
|
193
|
-
ADD CONSTRAINT schema_migrations_pkey PRIMARY KEY (version);
|
194
|
-
|
195
|
-
|
196
|
-
--
|
197
|
-
-- Name: index_kithe_derivatives_on_asset_id; Type: INDEX; Schema: public; Owner: -
|
198
|
-
--
|
199
|
-
|
200
|
-
CREATE INDEX index_kithe_derivatives_on_asset_id ON public.kithe_derivatives USING btree (asset_id);
|
201
|
-
|
202
|
-
|
203
|
-
--
|
204
|
-
-- Name: index_kithe_derivatives_on_asset_id_and_key; Type: INDEX; Schema: public; Owner: -
|
205
|
-
--
|
206
|
-
|
207
|
-
CREATE UNIQUE INDEX index_kithe_derivatives_on_asset_id_and_key ON public.kithe_derivatives USING btree (asset_id, key);
|
208
|
-
|
209
|
-
|
210
|
-
--
|
211
|
-
-- Name: index_kithe_model_contains_on_containee_id; Type: INDEX; Schema: public; Owner: -
|
212
|
-
--
|
213
|
-
|
214
|
-
CREATE INDEX index_kithe_model_contains_on_containee_id ON public.kithe_model_contains USING btree (containee_id);
|
215
|
-
|
216
|
-
|
217
|
-
--
|
218
|
-
-- Name: index_kithe_model_contains_on_container_id; Type: INDEX; Schema: public; Owner: -
|
219
|
-
--
|
220
|
-
|
221
|
-
CREATE INDEX index_kithe_model_contains_on_container_id ON public.kithe_model_contains USING btree (container_id);
|
222
|
-
|
223
|
-
|
224
|
-
--
|
225
|
-
-- Name: index_kithe_models_on_friendlier_id; Type: INDEX; Schema: public; Owner: -
|
226
|
-
--
|
227
|
-
|
228
|
-
CREATE UNIQUE INDEX index_kithe_models_on_friendlier_id ON public.kithe_models USING btree (friendlier_id);
|
229
|
-
|
230
|
-
|
231
|
-
--
|
232
|
-
-- Name: index_kithe_models_on_parent_id; Type: INDEX; Schema: public; Owner: -
|
233
|
-
--
|
234
|
-
|
235
|
-
CREATE INDEX index_kithe_models_on_parent_id ON public.kithe_models USING btree (parent_id);
|
236
|
-
|
237
|
-
|
238
|
-
--
|
239
|
-
-- Name: index_kithe_models_on_representative_id; Type: INDEX; Schema: public; Owner: -
|
240
|
-
--
|
241
|
-
|
242
|
-
CREATE INDEX index_kithe_models_on_representative_id ON public.kithe_models USING btree (representative_id);
|
243
|
-
|
244
|
-
|
245
|
-
--
|
246
|
-
-- Name: kithe_model_contains fk_rails_091010187b; Type: FK CONSTRAINT; Schema: public; Owner: -
|
247
|
-
--
|
248
|
-
|
249
|
-
ALTER TABLE ONLY public.kithe_model_contains
|
250
|
-
ADD CONSTRAINT fk_rails_091010187b FOREIGN KEY (container_id) REFERENCES public.kithe_models(id);
|
251
|
-
|
252
|
-
|
253
|
-
--
|
254
|
-
-- Name: kithe_derivatives fk_rails_3dac8b4201; Type: FK CONSTRAINT; Schema: public; Owner: -
|
255
|
-
--
|
256
|
-
|
257
|
-
ALTER TABLE ONLY public.kithe_derivatives
|
258
|
-
ADD CONSTRAINT fk_rails_3dac8b4201 FOREIGN KEY (asset_id) REFERENCES public.kithe_models(id);
|
259
|
-
|
260
|
-
|
261
|
-
--
|
262
|
-
-- Name: kithe_models fk_rails_403cce5c0d; Type: FK CONSTRAINT; Schema: public; Owner: -
|
263
|
-
--
|
264
|
-
|
265
|
-
ALTER TABLE ONLY public.kithe_models
|
266
|
-
ADD CONSTRAINT fk_rails_403cce5c0d FOREIGN KEY (leaf_representative_id) REFERENCES public.kithe_models(id);
|
267
|
-
|
268
|
-
|
269
|
-
--
|
270
|
-
-- Name: kithe_model_contains fk_rails_490c1158f7; Type: FK CONSTRAINT; Schema: public; Owner: -
|
271
|
-
--
|
272
|
-
|
273
|
-
ALTER TABLE ONLY public.kithe_model_contains
|
274
|
-
ADD CONSTRAINT fk_rails_490c1158f7 FOREIGN KEY (containee_id) REFERENCES public.kithe_models(id);
|
275
|
-
|
276
|
-
|
277
|
-
--
|
278
|
-
-- Name: kithe_models fk_rails_90130a9780; Type: FK CONSTRAINT; Schema: public; Owner: -
|
279
|
-
--
|
280
|
-
|
281
|
-
ALTER TABLE ONLY public.kithe_models
|
282
|
-
ADD CONSTRAINT fk_rails_90130a9780 FOREIGN KEY (parent_id) REFERENCES public.kithe_models(id);
|
283
|
-
|
284
|
-
|
285
|
-
--
|
286
|
-
-- Name: kithe_models fk_rails_afa93b7b5d; Type: FK CONSTRAINT; Schema: public; Owner: -
|
287
|
-
--
|
288
|
-
|
289
|
-
ALTER TABLE ONLY public.kithe_models
|
290
|
-
ADD CONSTRAINT fk_rails_afa93b7b5d FOREIGN KEY (representative_id) REFERENCES public.kithe_models(id);
|
291
|
-
|
292
|
-
|
293
|
-
--
|
294
|
-
-- PostgreSQL database dump complete
|
295
|
-
--
|
296
|
-
|
297
|
-
SET search_path TO "$user", public;
|
298
|
-
|
299
|
-
INSERT INTO "schema_migrations" (version) VALUES
|
300
|
-
('20181015143259'),
|
301
|
-
('20181015143413'),
|
302
|
-
('20181015143737'),
|
303
|
-
('20181031190647'),
|
304
|
-
('20181128185658'),
|
305
|
-
('20190103144947'),
|
306
|
-
('20190109192252'),
|
307
|
-
('20190404144551');
|
308
|
-
|
309
|
-
|
@@ -1,320 +0,0 @@
|
|
1
|
-
# Make a new test file cause it's a buncha func
|
2
|
-
require 'rails_helper'
|
3
|
-
|
4
|
-
# Not sure how to get our
|
5
|
-
describe "Kithe::Asset derivative definitions", queue_adapter: :test do
|
6
|
-
let(:a_jpg_deriv_file) { Kithe::Engine.root.join("spec/test_support/images/2x2_pixel.jpg") }
|
7
|
-
|
8
|
-
temporary_class("TestAssetSubclass") do
|
9
|
-
deriv_src_path = a_jpg_deriv_file
|
10
|
-
Class.new(Kithe::Asset) do
|
11
|
-
define_derivative(:some_data) do |original_file|
|
12
|
-
StringIO.new("some one data")
|
13
|
-
end
|
14
|
-
|
15
|
-
define_derivative(:a_jpg) do |original_file|
|
16
|
-
FileUtils.cp(deriv_src_path,
|
17
|
-
Kithe::Engine.root.join("spec/test_support/images/2x2_pixel-TEMP.jpg"))
|
18
|
-
|
19
|
-
File.open(Kithe::Engine.root.join("spec/test_support/images/2x2_pixel-TEMP.jpg"))
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
let(:asset) do
|
25
|
-
TestAssetSubclass.create(title: "test",
|
26
|
-
file: File.open(Kithe::Engine.root.join("spec/test_support/images/1x1_pixel.jpg"))
|
27
|
-
).tap do |a|
|
28
|
-
# We want to promote without create_derivatives being automatically called
|
29
|
-
# as usual, so we can test create_derivatives manually.
|
30
|
-
a.file_attacher.set_promotion_directives(create_derivatives: false)
|
31
|
-
a.promote
|
32
|
-
|
33
|
-
# Precondition assumptions for our test setup to be valid
|
34
|
-
expect(a.file_attacher.stored?).to be(true)
|
35
|
-
expect(a.derivatives).to be_empty
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
it "builds derivatives" do
|
40
|
-
asset.create_derivatives
|
41
|
-
|
42
|
-
one_deriv = asset.derivatives.find { |d| d.key == "some_data" }
|
43
|
-
expect(one_deriv).to be_present
|
44
|
-
expect(one_deriv.file.read).to eq("some one data")
|
45
|
-
|
46
|
-
jpg_deriv = asset.derivatives.find {|d| d.key == "a_jpg"}
|
47
|
-
expect(jpg_deriv.file.read).to eq(File.read(a_jpg_deriv_file, encoding: "BINARY"))
|
48
|
-
end
|
49
|
-
|
50
|
-
it "sets #derivatives_created?" do
|
51
|
-
expect(asset.derivatives_created?).to be(false)
|
52
|
-
asset.create_derivatives
|
53
|
-
asset.reload
|
54
|
-
expect(asset.derivatives_created?).to be(true)
|
55
|
-
end
|
56
|
-
|
57
|
-
|
58
|
-
describe "Original deleted before derivatives can be created", queue_adapter: :inline do
|
59
|
-
let(:short_lived_asset) do
|
60
|
-
TestAssetSubclass.create!(title: "test",
|
61
|
-
file: File.open(Kithe::Engine.root.join("spec/test_support/images/1x1_pixel.jpg")))
|
62
|
-
end
|
63
|
-
it """catches the ActiveJob::DeserializationError
|
64
|
-
if the asset is no longer in the database
|
65
|
-
once the derivative creation job starts up.""" do
|
66
|
-
id_to_delete = short_lived_asset.id
|
67
|
-
Kithe::Derivative.where(asset_id: id_to_delete).delete_all
|
68
|
-
Kithe::Model.where(id: id_to_delete).delete_all
|
69
|
-
|
70
|
-
# short_lived_asset is no longer in the DB.
|
71
|
-
# Let's try and create derivatives for it:
|
72
|
-
expect do
|
73
|
-
Kithe::CreateDerivativesJob.perform_later(short_lived_asset)
|
74
|
-
end.not_to raise_error
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
describe "under normal operation", queue_adapter: :inline do
|
79
|
-
let(:asset) do
|
80
|
-
TestAssetSubclass.create!(title: "test",
|
81
|
-
file: File.open(Kithe::Engine.root.join("spec/test_support/images/1x1_pixel.jpg")))
|
82
|
-
end
|
83
|
-
it "automatically creates derivatives" do
|
84
|
-
expect(asset.derivatives.count).to eq(2)
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
it "extracts limited metadata from derivative" do
|
89
|
-
asset.create_derivatives
|
90
|
-
|
91
|
-
jpg_deriv = asset.derivatives.find {|d| d.key == "a_jpg"}
|
92
|
-
expect(jpg_deriv.size).to eq(File.size(Kithe::Engine.root.join("spec/test_support/images/2x2_pixel.jpg")))
|
93
|
-
expect(jpg_deriv.width).to eq(2)
|
94
|
-
expect(jpg_deriv.height).to eq(2)
|
95
|
-
expect(jpg_deriv.content_type).to eq("image/jpeg")
|
96
|
-
end
|
97
|
-
|
98
|
-
it "deletes derivative file returned by block" do
|
99
|
-
asset.create_derivatives
|
100
|
-
|
101
|
-
expect(File.exist?(Kithe::Engine.root.join("spec/test_support/images/2x2_pixel-TEMP.jpg"))).not_to be(true)
|
102
|
-
end
|
103
|
-
|
104
|
-
it "by default saves in :kithe_derivatives storage" do
|
105
|
-
asset.create_derivatives
|
106
|
-
|
107
|
-
jpg_deriv = asset.derivatives.find {|d| d.key == "a_jpg"}
|
108
|
-
expect(jpg_deriv.file.storage_key).to eq(:kithe_derivatives)
|
109
|
-
end
|
110
|
-
|
111
|
-
|
112
|
-
describe "block arguments" do
|
113
|
-
let(:monitoring_proc) do
|
114
|
-
proc do |original_file, record:|
|
115
|
-
expect(original_file.kind_of?(File) || original_file.kind_of?(Tempfile)).to be(true)
|
116
|
-
expect(original_file.path).to be_present
|
117
|
-
expect(original_file.read).to eq(asset.file.read)
|
118
|
-
|
119
|
-
expect(record).to eq(asset)
|
120
|
-
|
121
|
-
nil
|
122
|
-
end
|
123
|
-
end
|
124
|
-
|
125
|
-
temporary_class("TestAssetSubclass") do
|
126
|
-
our_proc = monitoring_proc
|
127
|
-
Class.new(Kithe::Asset) do
|
128
|
-
define_derivative(:some_data, &our_proc)
|
129
|
-
end
|
130
|
-
end
|
131
|
-
|
132
|
-
it "as expected" do
|
133
|
-
expect(monitoring_proc).to receive(:call).and_call_original
|
134
|
-
|
135
|
-
asset.create_derivatives
|
136
|
-
expect(asset.derivatives.length).to eq(0)
|
137
|
-
end
|
138
|
-
end
|
139
|
-
|
140
|
-
describe "custom storage_key" do
|
141
|
-
temporary_class("TestAssetSubclass") do
|
142
|
-
Class.new(Kithe::Asset) do
|
143
|
-
define_derivative(:some_data, storage_key: :store) do |original_file|
|
144
|
-
StringIO.new("some one data")
|
145
|
-
end
|
146
|
-
end
|
147
|
-
end
|
148
|
-
it "saves appropriately" do
|
149
|
-
asset.create_derivatives
|
150
|
-
|
151
|
-
deriv = asset.derivatives.first
|
152
|
-
|
153
|
-
expect(deriv).to be_present
|
154
|
-
expect(deriv.file.storage_key).to eq(:store)
|
155
|
-
end
|
156
|
-
end
|
157
|
-
|
158
|
-
describe "default_create false" do
|
159
|
-
let(:monitoring_proc) { proc { |asset| } }
|
160
|
-
|
161
|
-
temporary_class("TestAssetSubclass") do
|
162
|
-
p = monitoring_proc
|
163
|
-
Class.new(Kithe::Asset) do
|
164
|
-
define_derivative(:some_data, default_create: false, &p)
|
165
|
-
end
|
166
|
-
end
|
167
|
-
|
168
|
-
it "is not run automatically" do
|
169
|
-
expect(monitoring_proc).not_to receive(:call)
|
170
|
-
asset.create_derivatives
|
171
|
-
end
|
172
|
-
end
|
173
|
-
|
174
|
-
describe "only/except" do
|
175
|
-
let(:monitoring_proc1) { proc { |asset| StringIO.new("one") } }
|
176
|
-
let(:monitoring_proc2) { proc { |asset| StringIO.new("two") } }
|
177
|
-
let(:monitoring_proc3) { proc { |asset| StringIO.new("three") } }
|
178
|
-
|
179
|
-
temporary_class("TestAssetSubclass") do
|
180
|
-
p1, p2, p3 = monitoring_proc1, monitoring_proc2, monitoring_proc3
|
181
|
-
Class.new(Kithe::Asset) do
|
182
|
-
define_derivative(:one, default_create: false, &p1)
|
183
|
-
define_derivative(:two, &p2)
|
184
|
-
define_derivative(:three, &p3)
|
185
|
-
end
|
186
|
-
end
|
187
|
-
|
188
|
-
it "can call with only" do
|
189
|
-
expect(monitoring_proc1).to receive(:call).and_call_original
|
190
|
-
expect(monitoring_proc2).to receive(:call).and_call_original
|
191
|
-
expect(monitoring_proc3).not_to receive(:call)
|
192
|
-
|
193
|
-
asset.create_derivatives(only: [:one, :two])
|
194
|
-
|
195
|
-
expect(asset.derivatives.collect(&:key)).to eq(["one", "two"])
|
196
|
-
end
|
197
|
-
|
198
|
-
it "can call with except" do
|
199
|
-
expect(monitoring_proc1).not_to receive(:call)
|
200
|
-
expect(monitoring_proc2).to receive(:call).and_call_original
|
201
|
-
expect(monitoring_proc3).not_to receive(:call)
|
202
|
-
|
203
|
-
asset.create_derivatives(except: [:three])
|
204
|
-
|
205
|
-
expect(asset.derivatives.collect(&:key)).to eq(["two"])
|
206
|
-
end
|
207
|
-
|
208
|
-
it "can call with only and except" do
|
209
|
-
expect(monitoring_proc1).to receive(:call).and_call_original
|
210
|
-
expect(monitoring_proc2).not_to receive(:call)
|
211
|
-
expect(monitoring_proc3).not_to receive(:call)
|
212
|
-
|
213
|
-
asset.create_derivatives(only: [:one, :two], except: :two)
|
214
|
-
|
215
|
-
expect(asset.derivatives.collect(&:key)).to eq(["one"])
|
216
|
-
end
|
217
|
-
end
|
218
|
-
|
219
|
-
describe "content_type filters" do
|
220
|
-
temporary_class("TestAssetSubclass") do
|
221
|
-
Class.new(Kithe::Asset) do
|
222
|
-
define_derivative(:never_called, content_type: "nothing/nothing") { |o| StringIO.new("never") }
|
223
|
-
define_derivative(:gated_positive, content_type: "image/jpeg") { |o| StringIO.new("gated positive") }
|
224
|
-
define_derivative(:gated_positive_main_type, content_type: "image") { |o| StringIO.new("gated positive") }
|
225
|
-
end
|
226
|
-
end
|
227
|
-
|
228
|
-
it "does not call if content type does not match" do
|
229
|
-
asset.create_derivatives
|
230
|
-
expect(asset.derivatives.collect(&:key)).not_to include("never_called")
|
231
|
-
end
|
232
|
-
|
233
|
-
it "calls for exact content type match" do
|
234
|
-
asset.create_derivatives
|
235
|
-
expect(asset.derivatives.collect(&:key)).to include("gated_positive")
|
236
|
-
end
|
237
|
-
|
238
|
-
it "calls for main content type match" do
|
239
|
-
asset.create_derivatives
|
240
|
-
expect(asset.derivatives.collect(&:key)).to include("gated_positive_main_type")
|
241
|
-
end
|
242
|
-
|
243
|
-
describe "as array" do
|
244
|
-
temporary_class("TestAssetSubclass") do
|
245
|
-
Class.new(Kithe::Asset) do
|
246
|
-
define_derivative(:never_called, content_type: ["nothing/nothing", "also/nothing"]) { |o| StringIO.new("never") }
|
247
|
-
define_derivative(:gated_positive, content_type: ["image/jpeg", "something/else"]) { |o| StringIO.new("gated positive") }
|
248
|
-
end
|
249
|
-
end
|
250
|
-
it "calls for one match" do
|
251
|
-
asset.create_derivatives
|
252
|
-
expect(asset.derivatives.collect(&:key)).to eq(["gated_positive"])
|
253
|
-
end
|
254
|
-
end
|
255
|
-
|
256
|
-
describe "conflicting types" do
|
257
|
-
let(:unfiltered) { proc { |asset| StringIO.new("unfiltered") } }
|
258
|
-
let(:image) { proc { |asset| StringIO.new("image") } }
|
259
|
-
let(:image_jpeg) { proc { |asset| StringIO.new("image/jpeg") } }
|
260
|
-
|
261
|
-
|
262
|
-
temporary_class("TestAssetSubclass") do
|
263
|
-
u, i, ij = unfiltered, image, image_jpeg
|
264
|
-
Class.new(Kithe::Asset) do
|
265
|
-
define_derivative(:key, &u)
|
266
|
-
define_derivative(:key, content_type: "image/jpeg", &ij)
|
267
|
-
define_derivative(:key, content_type: "image", &i)
|
268
|
-
end
|
269
|
-
end
|
270
|
-
|
271
|
-
it "takes most specific" do
|
272
|
-
expect(unfiltered).not_to receive(:call)
|
273
|
-
expect(image).not_to receive(:call)
|
274
|
-
expect(image_jpeg).to receive(:call).and_call_original
|
275
|
-
|
276
|
-
asset.create_derivatives
|
277
|
-
expect(asset.derivatives.count).to eq(1)
|
278
|
-
|
279
|
-
deriv = asset.derivatives.first
|
280
|
-
expect(deriv.key).to eq("key")
|
281
|
-
expect(deriv.file.read). to eq("image/jpeg")
|
282
|
-
end
|
283
|
-
end
|
284
|
-
end
|
285
|
-
|
286
|
-
describe "lazy creation" do
|
287
|
-
before do
|
288
|
-
asset.class.derivative_definitions.collect(&:key).each do |key|
|
289
|
-
asset.update_derivative(key, StringIO.new("#{key} original"))
|
290
|
-
end
|
291
|
-
end
|
292
|
-
|
293
|
-
it "does not re-create" do
|
294
|
-
derivatives_pre_creation = asset.derivatives.collect(&:attributes)
|
295
|
-
|
296
|
-
asset.create_derivatives(lazy: true)
|
297
|
-
derivatives_post_creation = asset.derivatives.reload.collect(&:attributes)
|
298
|
-
|
299
|
-
expect(derivatives_post_creation).to eq(derivatives_pre_creation)
|
300
|
-
end
|
301
|
-
end
|
302
|
-
|
303
|
-
describe "#remove_derivative_definition!" do
|
304
|
-
it "can remove by string" do
|
305
|
-
original_keys = TestAssetSubclass.defined_derivative_keys
|
306
|
-
TestAssetSubclass.remove_derivative_definition!(original_keys.first.to_s)
|
307
|
-
expect(TestAssetSubclass.defined_derivative_keys).to eq(original_keys.slice(1..original_keys.length))
|
308
|
-
end
|
309
|
-
it "can remove by symbol" do
|
310
|
-
original_keys = TestAssetSubclass.defined_derivative_keys
|
311
|
-
TestAssetSubclass.remove_derivative_definition!(original_keys.first.to_sym)
|
312
|
-
expect(TestAssetSubclass.defined_derivative_keys).to eq(original_keys.slice(1..original_keys.length))
|
313
|
-
end
|
314
|
-
it "can remove multiple args" do
|
315
|
-
original_keys = TestAssetSubclass.defined_derivative_keys
|
316
|
-
TestAssetSubclass.remove_derivative_definition!(*original_keys)
|
317
|
-
expect(TestAssetSubclass.defined_derivative_keys).to eq([])
|
318
|
-
end
|
319
|
-
end
|
320
|
-
end
|