Skip to content

Commit 695e9d5

Browse files
committed
Defer creating filetypes
REDMINE-17243
1 parent b84c795 commit 695e9d5

10 files changed

+78
-38
lines changed

doc/creating_file_types.md

+4-4
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ whenever the page type is registered in a Pageflow application.
7575
end
7676

7777
def self.package_file_type
78-
FileType.new(model: Package)
78+
FileType.new(model: 'Pageflow::Panorama::Package')
7979
end
8080
end
8181
end
@@ -113,7 +113,7 @@ JSON data passed to the editor. In order to do so, set the
113113
module Pageflow
114114
module
115115
def self.package_file_type
116-
FileType.new(model: Package,
116+
FileType.new(model: 'Pageflow::Panorama::Package',
117117
editor_partial: 'pageflow/panorama/editor/packages/package')
118118
end
119119
end
@@ -375,7 +375,7 @@ specified when registering the file type:
375375
end
376376

377377
def self.scraped_site_file_type
378-
FileType.new(model: ScrapedSite,
378+
FileType.new(model: 'Pageflow::Chart::ScrapedSite',
379379
editor_partial: 'pageflow/chart/editor/scraped_sites/scraped_site',
380380
custom_attributes: {
381381
url: {
@@ -411,7 +411,7 @@ from:
411411
end
412412

413413
def self.color_map_file_type
414-
FileType.new(model: ColorMapFile,
414+
FileType.new(model: 'Pageflow::LinkmapPage::ColorMapFile',
415415
# ...
416416
custom_attributes: {
417417
source_image_file_id: {

doc/understanding_entry_export_and_import.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ module Pageflow
161161
[...]
162162
163163
def self.scraped_site_file_type
164-
FileType.new(model: ScrapedSite,
164+
FileType.new(model: 'Pageflow::Chart::ScrapedSite',
165165
custom_attributes: %i[url use_custom_theme],
166166
editor_partial: 'pageflow/chart/editor/scraped_sites/scraped_site')
167167
end

lib/pageflow/file_type.rb

+3-2
Original file line numberDiff line numberDiff line change
@@ -58,12 +58,13 @@ class NotFoundError < RuntimeError
5858
#
5959
# @example
6060
#
61-
# Pageflow::FileType.new(model: Pageflow::Rainbow::File,
61+
# Pageflow::FileType.new(model: 'Pageflow::Rainbow::File',
6262
# editor_partial: 'pageflow/rainbow/editor/files/file')
6363
#
6464
# @param [Hash] options
6565
# @option options [ActiveRecord::Base, String] :model
66-
# Required. Model representing the file, or name of that model.
66+
# Required. Name of model representing the file. Model reference
67+
# still works, but is deprecated
6768
# @option options [String] :partial
6869
# Optional. Path of a partial to include in json representations
6970
# of the file both inside the editor and published entries.

lib/pageflow/file_types.rb

+13-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ def clear
1515
end
1616

1717
def each(&block)
18-
first_level_file_types = @file_types
18+
first_level_file_types = trigger_lazy_loading_of_file_types
1919
lower_level_file_types = search_for_nested_file_types(first_level_file_types)
2020
(first_level_file_types + lower_level_file_types).uniq(&:model).each(&block)
2121
end
@@ -47,6 +47,18 @@ def with_css_background_image_support
4747

4848
private
4949

50+
def trigger_lazy_loading_of_file_types
51+
# To avoid dependency cycles due to autoloading for model
52+
# references that are passed into FileType.new in some plugins,
53+
# we allow registering as file types lambdas which resolve to a
54+
# page type's file types. After some deprecation period, we
55+
# could get rid of this and just set first_level_file_types to
56+
# @file_types here.
57+
@file_types.map { |file_type|
58+
file_type.respond_to?(:call) ? file_type.call : file_type
59+
}.flatten
60+
end
61+
5062
def search_for_nested_file_types(higher_level_file_types)
5163
higher_level_file_types.map { |file_type|
5264
file_type.nested_file_types +

lib/pageflow/page_types.rb

+7-3
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,13 @@ def register_revision_components(config, page_type)
5959
end
6060

6161
def register_file_types(config, page_type)
62-
page_type.file_types.each do |file_type|
63-
config.file_types.register(file_type)
64-
end
62+
# After a deprecation period against initializing FileType with
63+
# a model reference instead of a model name string, we could
64+
# rewrite this to register the page type's file types one by one
65+
# right here instead of lazily in FileTypes#each.
66+
config.file_types.register(
67+
-> { page_type.file_types }
68+
)
6569
end
6670
end
6771
end

spec/pageflow/configuration_spec.rb

+6-2
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,12 @@ module Pageflow
4646

4747
describe '#file_types' do
4848
it 'returns all registered FileTypes' do
49-
file_type1 = FileType.new(model: ImageFile, collection_name: 'image_files', editor_partial: 'path')
50-
file_type2 = FileType.new(model: VideoFile, collection_name: 'video_files', editor_partial: 'path')
49+
file_type1 = FileType.new(model: 'Pageflow::ImageFile',
50+
collection_name: 'image_files',
51+
editor_partial: 'path')
52+
file_type2 = FileType.new(model: 'Pageflow::VideoFile',
53+
collection_name: 'video_files',
54+
editor_partial: 'path')
5155
conf = Configuration.new
5256
conf.file_types.register(file_type1)
5357
conf.file_types.register(file_type2)

spec/pageflow/file_type_spec.rb

+12-12
Original file line numberDiff line numberDiff line change
@@ -3,28 +3,28 @@
33
module Pageflow
44
describe FileType do
55
describe '#model' do
6-
it 'is set if model is passed' do
7-
file_type = FileType.new(model: ImageFile)
6+
it 'is set if model name is passed' do
7+
file_type = FileType.new(model: 'Pageflow::ImageFile')
88

99
expect(file_type.model).to eq(ImageFile)
1010
end
1111

12-
it 'is set if model name is passed' do
13-
file_type = FileType.new(model: 'Pageflow::ImageFile')
12+
it 'is set if model reference is passed (deprecated)' do
13+
file_type = FileType.new(model: ImageFile)
1414

1515
expect(file_type.model).to eq(ImageFile)
1616
end
1717
end
1818

1919
describe '#collection_name' do
2020
it 'defaults to plural model name' do
21-
file_type = FileType.new(model: ImageFile)
21+
file_type = FileType.new(model: 'Pageflow::ImageFile')
2222

2323
expect(file_type.collection_name).to eq('pageflow_image_files')
2424
end
2525

2626
it 'can be overridden' do
27-
file_type = FileType.new(model: ImageFile,
27+
file_type = FileType.new(model: 'Pageflow::ImageFile',
2828
collection_name: 'image_files')
2929

3030
expect(file_type.collection_name).to eq('image_files')
@@ -33,39 +33,39 @@ module Pageflow
3333

3434
describe '#param_key' do
3535
it 'returns symbolized base class name' do
36-
file_type = FileType.new(model: ImageFile)
36+
file_type = FileType.new(model: 'Pageflow::ImageFile')
3737

3838
expect(file_type.param_key).to eq(:image_file)
3939
end
4040
end
4141

4242
describe '#short_name' do
4343
it 'returns symbolized base class name' do
44-
file_type = FileType.new(model: ImageFile)
44+
file_type = FileType.new(model: 'Pageflow::ImageFile')
4545

4646
expect(file_type.param_key).to eq(:image_file)
4747
end
4848
end
4949

5050
describe '#type_name' do
5151
it 'returns fully qualified name of ruby model' do
52-
file_type = FileType.new(model: ImageFile)
52+
file_type = FileType.new(model: 'Pageflow::ImageFile')
5353

5454
expect(file_type.type_name).to eq('Pageflow::ImageFile')
5555
end
5656
end
5757

5858
describe '#i18n_key' do
5959
it 'returns fully qualified underscored name of ruby model' do
60-
file_type = FileType.new(model: ImageFile)
60+
file_type = FileType.new(model: 'Pageflow::ImageFile')
6161

6262
expect(file_type.i18n_key).to eq(:'pageflow/image_file')
6363
end
6464
end
6565

6666
describe '#editor_partial' do
6767
it 'returns passed editor_partial' do
68-
file_type = FileType.new(model: ImageFile,
68+
file_type = FileType.new(model: 'Pageflow::ImageFile',
6969
editor_partial: 'pageflow/editor/image_files/image_file')
7070

7171
expect(file_type.editor_partial).to eq('pageflow/editor/image_files/image_file')
@@ -74,7 +74,7 @@ module Pageflow
7474

7575
describe '#custom_attributes' do
7676
it 'converts passed custom_attributes symbol array to hash' do
77-
file_type = FileType.new(model: ImageFile,
77+
file_type = FileType.new(model: 'Pageflow::ImageFile',
7878
custom_attributes: [:neural_network_analysis])
7979

8080
expect(file_type.custom_attributes)

spec/pageflow/file_types_spec.rb

+30-11
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@ module Pageflow
55
describe 'as Enumerable' do
66
it 'returns all registered FileTypes and nested FileTypes' do
77
config = Configuration.new
8-
nested_file_type = FileType.new(model: TextTrackFile,
8+
nested_file_type = FileType.new(model: 'Pageflow::TextTrackFile',
99
collection_name: 'text_track_files',
1010
editor_partial: 'path')
11-
file_type1 = FileType.new(model: ImageFile,
11+
file_type1 = FileType.new(model: 'Pageflow::ImageFile',
1212
collection_name: 'image_files',
1313
editor_partial: 'path')
14-
file_type2 = FileType.new(model: VideoFile,
14+
file_type2 = FileType.new(model: 'Pageflow::VideoFile',
1515
collection_name: 'video_files',
1616
editor_partial: 'path',
1717
nested_file_types: [nested_file_type])
@@ -22,12 +22,31 @@ module Pageflow
2222
expect(config.file_types.to_a).to eq([file_type1, file_type2, nested_file_type])
2323
end
2424

25+
it 'allows lambda registration' do
26+
config = Configuration.new
27+
nested_file_type = FileType.new(model: 'Pageflow::TextTrackFile',
28+
collection_name: 'text_track_files',
29+
editor_partial: 'path')
30+
file_type1 = FileType.new(model: 'Pageflow::ImageFile',
31+
collection_name: 'image_files',
32+
editor_partial: 'path')
33+
file_type2 = FileType.new(model: 'Pageflow::VideoFile',
34+
collection_name: 'video_files',
35+
editor_partial: 'path',
36+
nested_file_types: [nested_file_type])
37+
38+
config.file_types.register(-> { file_type1 })
39+
config.file_types.register(-> { [file_type2] })
40+
41+
expect(config.file_types.to_a).to eq([file_type1, file_type2, nested_file_type])
42+
end
43+
2544
it 'makes FileTypes unique by model' do
2645
config = Configuration.new
27-
file_type1 = FileType.new(model: ImageFile,
46+
file_type1 = FileType.new(model: 'Pageflow::ImageFile',
2847
collection_name: 'image_files',
2948
editor_partial: 'path')
30-
file_type2 = FileType.new(model: VideoFile,
49+
file_type2 = FileType.new(model: 'Pageflow::VideoFile',
3150
collection_name: 'video_files',
3251
editor_partial: 'path',
3352
nested_file_types: [file_type1])
@@ -42,7 +61,7 @@ module Pageflow
4261
describe '#find_by_collection_name!' do
4362
it 'finds FileType by collection_name' do
4463
config = Configuration.new
45-
file_type = FileType.new(model: ImageFile,
64+
file_type = FileType.new(model: 'Pageflow::ImageFile',
4665
collection_name: 'image_files',
4766
editor_partial: 'path')
4867
config.file_types.register(file_type)
@@ -65,7 +84,7 @@ module Pageflow
6584
describe '#find_by_model!' do
6685
it 'finds FileType by model' do
6786
config = Configuration.new
68-
file_type = FileType.new(model: ImageFile,
87+
file_type = FileType.new(model: 'Pageflow::ImageFile',
6988
collection_name: 'image_files',
7089
editor_partial: 'path')
7190
config.file_types.register(file_type)
@@ -88,7 +107,7 @@ module Pageflow
88107
describe '#with_thumbnail_support' do
89108
it 'includes file types whose models have thumbnail_url instance method' do
90109
config = Configuration.new
91-
file_type = FileType.new(model: ImageFile)
110+
file_type = FileType.new(model: 'Pageflow::ImageFile')
92111
config.file_types.register(file_type)
93112
file_types = config.file_types
94113

@@ -99,7 +118,7 @@ module Pageflow
99118

100119
it 'does not include file types whose models do not have thumbnail_url instance method' do
101120
config = Configuration.new
102-
file_type = FileType.new(model: AudioFile)
121+
file_type = FileType.new(model: 'Pageflow::AudioFile')
103122
config.file_types.register(file_type)
104123
file_types = config.file_types
105124

@@ -112,7 +131,7 @@ module Pageflow
112131
describe '#with_css_background_image_support' do
113132
it 'includes file types with css_background_image_urls attribute set' do
114133
config = Configuration.new
115-
file_type = FileType.new(model: ImageFile,
134+
file_type = FileType.new(model: 'Pageflow::ImageFile',
116135
css_background_image_urls: -> {})
117136
config.file_types.register(file_type)
118137
file_types = config.file_types
@@ -124,7 +143,7 @@ module Pageflow
124143

125144
it 'does not include file types without css_background_image_urls attribute set' do
126145
config = Configuration.new
127-
file_type = FileType.new(model: ImageFile)
146+
file_type = FileType.new(model: 'Pageflow::ImageFile')
128147
config.file_types.register(file_type)
129148
file_types = config.file_types
130149

spec/pageflow/page_types_spec.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ def initialize(options)
9292
it 'registers file types' do
9393
config = Configuration.new
9494
page_types = config.page_types
95-
file_type = FileType.new(model: TestUploadableFile)
95+
file_type = FileType.new(model: 'Pageflow::TestUploadableFile')
9696
page_types.register(TestPageType.new(name: 'test', file_types: [file_type]))
9797

9898
page_types.setup(config)

spec/support/helpers/test_file_type.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
module Pageflow
44
class TestFileType
55
def self.register(config, options = {})
6-
file_type = FileType.new(model: TestUploadableFile, **options)
6+
file_type = FileType.new(model: 'Pageflow::TestUploadableFile', **options)
77

88
page_type = TestPageType.new(name: :test,
99
file_types: [file_type])

0 commit comments

Comments
 (0)