plutonium 0.10.0 → 0.10.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 +4 -4
- data/README.md +2 -0
- data/app/assets/javascripts/turbo/index.js +1 -1
- data/app/views/application/_resource_header.html.erb +12 -12
- data/app/views/layouts/resource.html.erb +1 -0
- data/app/views/layouts/rodauth.html.erb +4 -4
- data/app/views/resource/_nav_user.html.erb +1 -1
- data/app/views/resource/index.rabl +1 -1
- data/brakeman.ignore +1 -1
- data/config/initializers/rabl.rb +2 -0
- data/css.manifest +1 -1
- data/js.manifest +2 -2
- data/lib/generators/pu/core/install/templates/config/initializers/plutonium.rb +0 -3
- data/lib/generators/pu/gen/pug/pug_generator.rb +6 -0
- data/lib/generators/pu/gen/pug/templates/pug.rb.tt +1 -1
- data/lib/generators/pu/pkg/app/templates/config/routes.rb.tt +3 -3
- data/lib/plutonium/config.rb +1 -11
- data/lib/plutonium/core/autodiscovery/input_discoverer.rb +1 -1
- data/lib/plutonium/core/autodiscovery/renderer_discoverer.rb +1 -1
- data/lib/plutonium/core/controllers/base.rb +13 -3
- data/lib/plutonium/core/controllers/queryable.rb +3 -1
- data/lib/plutonium/pkg/app.rb +6 -0
- data/lib/plutonium/railtie.rb +15 -0
- data/lib/plutonium/reloader.rb +99 -0
- data/lib/plutonium/resource/controller.rb +61 -22
- data/lib/plutonium/resource/policy.rb +56 -9
- data/lib/plutonium/resource/presenter.rb +44 -12
- data/lib/plutonium/resource/query_object.rb +186 -73
- data/lib/plutonium/resource/record.rb +213 -119
- data/lib/plutonium/rodauth/controller_methods.rb +7 -0
- data/lib/plutonium/version.rb +1 -1
- data/lib/plutonium.rb +50 -12
- data/package-lock.json +174 -0
- data/package.json +2 -0
- data/public/plutonium-assets/plutonium-app-6WILQCTT.js +39 -0
- data/public/plutonium-assets/plutonium-app-6WILQCTT.js.map +7 -0
- data/public/plutonium-assets/plutonium-logo-original.png +0 -0
- data/public/plutonium-assets/plutonium-logo-white.png +0 -0
- data/public/plutonium-assets/plutonium-logo.png +0 -0
- data/public/plutonium-assets/plutonium.2d4f0c333cd000051d3b.css +3424 -0
- data/public/plutonium-assets/plutonium.ico +0 -0
- metadata +10 -4
- data/lib/plutonium/reactor/core.rb +0 -78
- data/public/plutonium-assets/logo.png +0 -0
@@ -10,113 +10,135 @@ module Plutonium
|
|
10
10
|
named_scope = :"associated_with_#{record.model_name.singular}"
|
11
11
|
return send(named_scope, record) if respond_to?(named_scope)
|
12
12
|
|
13
|
-
# TODO: add
|
13
|
+
# TODO: add support for polymorphic associations
|
14
14
|
# TODO: add logging
|
15
15
|
# TODO: memoize this
|
16
16
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
})
|
25
|
-
when :belongs_to
|
26
|
-
where(own_association.name => record)
|
27
|
-
when :has_many
|
28
|
-
joins(own_association.name).where(own_association.klass.table_name => record)
|
29
|
-
else
|
30
|
-
raise NotImplementedError, "associated_with->##{own_association.macro}"
|
31
|
-
end
|
32
|
-
elsif (record_association = record.class.reflect_on_all_associations.find { |assoc| assoc.klass.name == klass.name })
|
17
|
+
own_association = klass.find_association_to_record(record)
|
18
|
+
if own_association
|
19
|
+
return klass.query_based_on_association(own_association, record)
|
20
|
+
end
|
21
|
+
|
22
|
+
record_association = klass.find_association_to_self(record)
|
23
|
+
if record_association
|
33
24
|
# TODO: add a warning here about a potentially poor performing query
|
34
|
-
where(id: record.send(record_association.name))
|
35
|
-
else
|
36
|
-
raise "Could not resolve the association between '#{klass.name}' and '#{record.class.name}'\n\n" \
|
37
|
-
"Define\n" \
|
38
|
-
" 1. the associations between the models\n" \
|
39
|
-
" 2. a named scope on #{klass.name} e.g.\n\n" \
|
40
|
-
"scope :#{named_scope}, ->(#{record.model_name.singular}) { do_something_here }"
|
25
|
+
return where(id: record.send(record_association.name))
|
41
26
|
end
|
27
|
+
|
28
|
+
klass.raise_association_error(record, named_scope)
|
42
29
|
end
|
43
30
|
end
|
44
31
|
|
45
32
|
class_methods do
|
33
|
+
# Returns the resource field names
|
34
|
+
# @return [Array<Symbol>]
|
46
35
|
def resource_field_names
|
47
|
-
@resource_field_names
|
48
|
-
|
49
|
-
|
50
|
-
content_column_field_names
|
36
|
+
return @resource_field_names if defined?(@resource_field_names) && !Rails.env.local?
|
37
|
+
|
38
|
+
@resource_field_names = gather_resource_field_names
|
51
39
|
end
|
52
40
|
|
41
|
+
# Overrides belongs_to to add support for polymorphic associations
|
42
|
+
# @param [Symbol] name The name of the association
|
43
|
+
# @param [Proc] scope The scope for the association
|
44
|
+
# @param [Hash] options The options for the association
|
53
45
|
def belongs_to(name, scope = nil, **options)
|
54
46
|
super(name, scope, **options)
|
55
47
|
|
56
|
-
|
57
|
-
mod = Module.new
|
58
|
-
mod.module_eval <<-RUBY, __FILE__, __LINE__ + 1
|
59
|
-
extend ActiveSupport::Concern
|
48
|
+
return unless options[:polymorphic]
|
60
49
|
|
61
|
-
|
62
|
-
|
63
|
-
|
50
|
+
mod = Module.new
|
51
|
+
mod.module_eval <<-RUBY, __FILE__, __LINE__ + 1
|
52
|
+
extend ActiveSupport::Concern
|
64
53
|
|
65
|
-
|
66
|
-
|
67
|
-
|
54
|
+
def #{name}_sgid
|
55
|
+
#{name}&.to_signed_global_id
|
56
|
+
end
|
68
57
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
58
|
+
def #{name}_sgid=(sgid)
|
59
|
+
self.#{name} = GlobalID::Locator.locate_signed(sgid)
|
60
|
+
end
|
61
|
+
|
62
|
+
define_singleton_method(:to_s) { "Plutonium::Polymorphic::BelongsTo(:#{name})" }
|
63
|
+
define_singleton_method(:inspect) { "Plutonium::Polymorphic::BelongsTo(:#{name})" }
|
64
|
+
RUBY
|
65
|
+
include mod
|
74
66
|
end
|
75
67
|
|
68
|
+
# Returns the names of belongs_to associations
|
69
|
+
# @return [Array<Symbol>]
|
76
70
|
def belongs_to_association_field_names
|
77
|
-
@belongs_to_association_field_names
|
71
|
+
return @belongs_to_association_field_names if defined?(@belongs_to_association_field_names) && !Rails.env.local?
|
72
|
+
|
73
|
+
@belongs_to_association_field_names = reflect_on_all_associations(:belongs_to).map(&:name)
|
78
74
|
end
|
79
75
|
|
76
|
+
# Returns the names of has_one associations
|
77
|
+
# @return [Array<Symbol>]
|
80
78
|
def has_one_association_field_names
|
81
|
-
@has_one_association_field_names
|
82
|
-
|
79
|
+
return @has_one_association_field_names if defined?(@has_one_association_field_names) && !Rails.env.local?
|
80
|
+
|
81
|
+
@has_one_association_field_names = reflect_on_all_associations(:has_one)
|
82
|
+
.map { |assoc| (!/_attachment$|_blob$/.match?(assoc.name)) ? assoc.name : nil }
|
83
83
|
.compact
|
84
84
|
end
|
85
85
|
|
86
|
+
# Returns the names of has_many associations
|
87
|
+
# @return [Array<Symbol>]
|
86
88
|
def has_many_association_field_names
|
87
|
-
@has_many_association_field_names
|
88
|
-
|
89
|
+
return @has_many_association_field_names if defined?(@has_many_association_field_names) && !Rails.env.local?
|
90
|
+
|
91
|
+
@has_many_association_field_names = reflect_on_all_associations(:has_many)
|
92
|
+
.map { |assoc| (!/_attachments$|_blobs$/.match?(assoc.name)) ? assoc.name : nil }
|
89
93
|
.compact
|
90
94
|
end
|
91
95
|
|
96
|
+
# Returns the names of has_one attached associations
|
97
|
+
# @return [Array<Symbol>]
|
92
98
|
def has_one_attached_field_names
|
93
|
-
@has_one_attached_field_names
|
99
|
+
return @has_one_attached_field_names if defined?(@has_one_attached_field_names) && !Rails.env.local?
|
100
|
+
|
101
|
+
@has_one_attached_field_names = if respond_to?(:reflect_on_all_attachments)
|
94
102
|
reflect_on_all_attachments
|
95
|
-
.
|
96
|
-
.
|
103
|
+
.select { |a| a.macro == :has_one_attached }
|
104
|
+
.map(&:name)
|
97
105
|
else
|
98
106
|
[]
|
99
107
|
end
|
100
108
|
end
|
101
109
|
|
110
|
+
# Returns the names of has_many attached associations
|
111
|
+
# @return [Array<Symbol>]
|
102
112
|
def has_many_attached_field_names
|
103
|
-
@has_many_attached_field_names
|
113
|
+
return @has_many_attached_field_names if defined?(@has_many_attached_field_names) && !Rails.env.local?
|
114
|
+
|
115
|
+
@has_many_attached_field_names = if respond_to?(:reflect_on_all_attachments)
|
104
116
|
reflect_on_all_attachments
|
105
|
-
.
|
106
|
-
.
|
117
|
+
.select { |a| a.macro == :has_many_attached }
|
118
|
+
.map(&:name)
|
107
119
|
else
|
108
120
|
[]
|
109
121
|
end
|
110
122
|
end
|
111
123
|
|
124
|
+
# Returns the names of content columns
|
125
|
+
# @return [Array<Symbol>]
|
112
126
|
def content_column_field_names
|
113
|
-
@content_column_field_names
|
127
|
+
return @content_column_field_names if defined?(@content_column_field_names) && !Rails.env.local?
|
128
|
+
|
129
|
+
@content_column_field_names = content_columns.map { |col| col.name.to_sym }
|
114
130
|
end
|
115
131
|
|
132
|
+
# Returns the routes for has_many associations
|
133
|
+
# @return [Array<Symbol>]
|
116
134
|
def has_many_association_routes
|
117
|
-
@has_many_association_routes
|
135
|
+
return @has_many_association_routes if defined?(@has_many_association_routes) && !Rails.env.local?
|
136
|
+
|
137
|
+
@has_many_association_routes = reflect_on_all_associations(:has_many).map { |assoc| assoc.klass.model_name.plural }
|
118
138
|
end
|
119
139
|
|
140
|
+
# Returns all nested attributes options
|
141
|
+
# @return [Hash]
|
120
142
|
def all_nested_attributes_options
|
121
143
|
unless Rails.env.local?
|
122
144
|
return @all_nested_attributes_options if defined?(@all_nested_attributes_options)
|
@@ -125,98 +147,155 @@ module Plutonium
|
|
125
147
|
@all_nested_attributes_options = reflect_on_all_associations.map do |association|
|
126
148
|
setter_method = "#{association.name}_attributes="
|
127
149
|
if method_defined?(setter_method)
|
128
|
-
[association.name,
|
129
|
-
**nested_attributes_options[association.name],
|
150
|
+
[association.name, nested_attributes_options[association.name].merge(
|
130
151
|
macro: association.macro,
|
131
152
|
class: association.polymorphic? ? nil : association.klass
|
132
|
-
|
153
|
+
)]
|
133
154
|
end
|
134
155
|
end.compact.to_h
|
135
156
|
end
|
136
157
|
|
137
|
-
#
|
138
158
|
# Returns the strong parameters definition for the given attribute names
|
139
|
-
#
|
140
|
-
# @
|
141
|
-
#
|
142
|
-
# @return [Array] A strong parameters compatible array e.g.
|
143
|
-
# [:title, :body, {:images=>[]}, {:docs=>[]}]
|
144
|
-
#
|
159
|
+
# @param [Array<Symbol>] *attributes Attribute names
|
160
|
+
# @return [Array<Symbol, Hash>] A strong parameters compatible array
|
145
161
|
def strong_parameters_for(*attributes)
|
146
|
-
# attributes that are passed but we do not have a model/database backed definition for e.g. virtual attributes.
|
147
|
-
# if they are passed and we are not expecting them, our inputs will filter them out as they apply an additional level
|
148
|
-
# of filtering
|
149
162
|
unbacked = attributes - strong_parameters_definition.keys
|
150
163
|
|
151
|
-
|
152
|
-
|
153
|
-
backed = strong_parameters_definition.
|
154
|
-
# {:name=>{:name=>nil}, :comments=>{:comment_ids=>[]}, :cover_image=>{:cover_image=>nil}}
|
155
|
-
slice(*attributes).
|
156
|
-
# [{:name=>nil}, {:comment_ids=>[]}, {:cover_image=>nil}]
|
157
|
-
values.
|
158
|
-
# {:name=>nil, :comment_ids=>[], :cover_image=>nil}
|
159
|
-
reduce(:merge)&.
|
160
|
-
# [:name, {:comment_ids=>[]}, :cover_image]
|
161
|
-
map { |key, value| value.nil? ? key : {key => value} } || {}
|
164
|
+
backed = strong_parameters_definition.slice(*attributes).values.reduce(:merge)
|
165
|
+
&.map { |key, value| value.nil? ? key : {key => value} } || {}
|
162
166
|
|
163
|
-
|
167
|
+
case backed.presence
|
168
|
+
when Hash
|
169
|
+
[*unbacked, **backed]
|
170
|
+
when Array
|
171
|
+
[*unbacked, *backed]
|
172
|
+
when nil
|
173
|
+
unbacked
|
174
|
+
else
|
175
|
+
raise "Unexpected strong parameters definition: #{backed.class}"
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
# Finds the association to the given record
|
180
|
+
# @param [ActiveRecord::Base] record The record to find the association with
|
181
|
+
# @return [ActiveRecord::Reflection::AssociationReflection, nil]
|
182
|
+
def find_association_to_record(record)
|
183
|
+
reflect_on_all_associations.find do |assoc|
|
184
|
+
assoc.klass.name == record.class.name
|
185
|
+
rescue
|
186
|
+
assoc.check_validity!
|
187
|
+
raise
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
# Finds the association to self in the given record
|
192
|
+
# @param [ActiveRecord::Base] record The record to find the association with
|
193
|
+
# @return [ActiveRecord::Reflection::AssociationReflection, nil]
|
194
|
+
def find_association_to_self(record)
|
195
|
+
record.class.reflect_on_all_associations.find do |assoc|
|
196
|
+
assoc.klass.name == name
|
197
|
+
rescue
|
198
|
+
assoc.check_validity!
|
199
|
+
raise
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
203
|
+
# Queries based on the association type
|
204
|
+
# @param [ActiveRecord::Reflection::AssociationReflection] assoc The association
|
205
|
+
# @param [ActiveRecord::Base] record The record to query with
|
206
|
+
# @return [ActiveRecord::Relation]
|
207
|
+
def query_based_on_association(assoc, record)
|
208
|
+
case assoc.macro
|
209
|
+
when :has_one
|
210
|
+
joins(assoc.name).where(assoc.name => {record.class.primary_key => record.id})
|
211
|
+
when :belongs_to
|
212
|
+
where(assoc.name => record)
|
213
|
+
when :has_many
|
214
|
+
joins(assoc.name).where(assoc.klass.table_name => record)
|
215
|
+
else
|
216
|
+
raise NotImplementedError, "associated_with->##{assoc.macro}"
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
220
|
+
# Raises an error for unresolved associations
|
221
|
+
# @param [ActiveRecord::Base] record The record with unresolved association
|
222
|
+
# @param [Symbol] named_scope The named scope
|
223
|
+
# @raise [RuntimeError]
|
224
|
+
def raise_association_error(record, named_scope)
|
225
|
+
raise "Could not resolve the association between '#{name}' and '#{record.class.name}'\n\n" \
|
226
|
+
"Define\n" \
|
227
|
+
" 1. the associations between the models\n" \
|
228
|
+
" 2. a named scope on #{name} e.g.\n\n" \
|
229
|
+
"scope :#{named_scope}, ->(#{record.model_name.singular}) { do_something_here }"
|
164
230
|
end
|
165
231
|
|
166
232
|
private
|
167
233
|
|
234
|
+
# Defines the strong parameters
|
235
|
+
# @return [Hash]
|
168
236
|
def strong_parameters_definition
|
169
237
|
unless Rails.env.local?
|
170
238
|
return @strong_parameters if defined?(@strong_parameters)
|
171
239
|
end
|
172
240
|
|
173
|
-
@strong_parameters =
|
174
|
-
|
175
|
-
|
176
|
-
content_column_parameters = content_column_field_names.map do |name|
|
177
|
-
column = columns_hash[name.to_s]
|
178
|
-
|
179
|
-
type = nil
|
180
|
-
type = [] if column&.try(:array?)
|
181
|
-
type = {} if [:json, :jsonb].include?(column&.type)
|
241
|
+
@strong_parameters = build_strong_parameters
|
242
|
+
end
|
182
243
|
|
183
|
-
|
244
|
+
# Builds the strong parameters hash
|
245
|
+
# @return [Hash]
|
246
|
+
def build_strong_parameters
|
247
|
+
parameters = content_column_field_names.map do |name|
|
248
|
+
column = columns_hash[name.to_s]
|
249
|
+
type = if column.try(:array?)
|
250
|
+
[]
|
251
|
+
else
|
252
|
+
([:json, :jsonb].include?(column&.type) ? {} : nil)
|
184
253
|
end
|
185
|
-
|
254
|
+
[name, {name => type}]
|
255
|
+
end.to_h
|
186
256
|
|
187
|
-
|
257
|
+
parameters.merge!(belongs_to_association_parameters)
|
258
|
+
parameters.merge!(has_many_association_parameters)
|
259
|
+
parameters.merge!(attachment_parameters)
|
260
|
+
parameters.merge!(nested_attributes_parameters)
|
188
261
|
|
189
|
-
|
190
|
-
|
191
|
-
input_param = reflection.respond_to?(:options) ? reflection.options[:foreign_key] : :"#{reflection.name}_id"
|
192
|
-
[reflection.name, {input_param => nil}]
|
193
|
-
}
|
194
|
-
.to_h
|
195
|
-
|
196
|
-
parameters.merge! has_many_association_field_names
|
197
|
-
.map { |name| [name, {"#{name.to_s.singularize}_ids": []}] }
|
198
|
-
.to_h
|
199
|
-
|
200
|
-
# Attachments
|
201
|
-
|
202
|
-
parameters.merge! has_many_attached_field_names.map { |name| [name, {name => []}] }.to_h
|
203
|
-
|
204
|
-
parameters.merge! has_one_attached_field_names.map { |name| [name, {name => nil}] }.to_h
|
262
|
+
parameters
|
263
|
+
end
|
205
264
|
|
206
|
-
|
265
|
+
# Returns the parameters for belongs_to associations
|
266
|
+
# @return [Hash]
|
267
|
+
def belongs_to_association_parameters
|
268
|
+
reflect_on_all_associations(:belongs_to).map do |reflection|
|
269
|
+
input_param = reflection.options[:foreign_key] || :"#{reflection.name}_id"
|
270
|
+
[reflection.name, {input_param => nil}]
|
271
|
+
end.to_h
|
272
|
+
end
|
207
273
|
|
208
|
-
|
209
|
-
|
210
|
-
|
274
|
+
# Returns the parameters for has_many associations
|
275
|
+
# @return [Hash]
|
276
|
+
def has_many_association_parameters
|
277
|
+
has_many_association_field_names.map do |name|
|
278
|
+
[name, {"#{name.to_s.singularize}_ids": []}]
|
279
|
+
end.to_h
|
280
|
+
end
|
211
281
|
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
282
|
+
# Returns the parameters for attachments
|
283
|
+
# @return [Hash]
|
284
|
+
def attachment_parameters
|
285
|
+
has_many_attached_field_names.map { |name| [name, {name => []}] }.to_h
|
286
|
+
.merge(has_one_attached_field_names.map { |name| [name, {name => nil}] }.to_h)
|
216
287
|
end
|
217
288
|
|
218
|
-
#
|
289
|
+
# Returns the parameters for nested attributes
|
290
|
+
# @return [Hash]
|
291
|
+
def nested_attributes_parameters
|
292
|
+
all_nested_attributes_options.keys.map do |name|
|
293
|
+
[name, {"#{name}_attributes" => {}}]
|
294
|
+
end.to_h
|
295
|
+
end
|
219
296
|
|
297
|
+
# Defines a scope and method for path parameters
|
298
|
+
# @param [Symbol] param_name The name of the parameter
|
220
299
|
def path_parameter(param_name)
|
221
300
|
param_name = param_name.to_sym
|
222
301
|
|
@@ -225,10 +304,12 @@ module Plutonium
|
|
225
304
|
define_method :to_param do
|
226
305
|
return nil unless persisted?
|
227
306
|
|
228
|
-
send
|
307
|
+
send(param_name)
|
229
308
|
end
|
230
309
|
end
|
231
310
|
|
311
|
+
# Defines a scope and method for dynamic path parameters
|
312
|
+
# @param [Symbol] param_name The name of the parameter
|
232
313
|
def dynamic_path_parameter(param_name)
|
233
314
|
param_name = param_name.to_sym
|
234
315
|
|
@@ -240,8 +321,21 @@ module Plutonium
|
|
240
321
|
"#{id}-#{send(param_name)}".parameterize
|
241
322
|
end
|
242
323
|
end
|
324
|
+
|
325
|
+
# Gathers all resource field names
|
326
|
+
# @return [Array<Symbol>]
|
327
|
+
def gather_resource_field_names
|
328
|
+
belongs_to_association_field_names +
|
329
|
+
has_one_attached_field_names +
|
330
|
+
has_one_association_field_names +
|
331
|
+
has_many_attached_field_names +
|
332
|
+
has_many_association_field_names +
|
333
|
+
content_column_field_names
|
334
|
+
end
|
243
335
|
end
|
244
336
|
|
337
|
+
# Returns a label for the record
|
338
|
+
# @return [String]
|
245
339
|
def to_label
|
246
340
|
%i[name title].each do |method|
|
247
341
|
name = send(method) if respond_to?(method)
|
@@ -6,6 +6,13 @@ module Plutonium
|
|
6
6
|
included do
|
7
7
|
layout "rodauth"
|
8
8
|
append_view_path File.expand_path("app/views", Plutonium.root)
|
9
|
+
helper_method :application_name
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def application_name
|
15
|
+
Rails.application.class.module_parent.name
|
9
16
|
end
|
10
17
|
end
|
11
18
|
end
|
data/lib/plutonium/version.rb
CHANGED
data/lib/plutonium.rb
CHANGED
@@ -19,33 +19,71 @@ module Plutonium
|
|
19
19
|
root.join("lib", "plutonium")
|
20
20
|
end
|
21
21
|
|
22
|
+
def self.logger
|
23
|
+
Rails.logger
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.development?
|
27
|
+
ActiveModel::Type::Boolean.new.cast(ENV["PLUTONIUM_DEV"]).present?
|
28
|
+
end
|
29
|
+
|
22
30
|
def self.stylesheet_link
|
23
|
-
if
|
31
|
+
return @stylesheet_link if defined?(@stylesheet_link) && !development?
|
32
|
+
|
33
|
+
if development?
|
24
34
|
base_dir = "/plutonium-assets/build"
|
25
|
-
manifest = "css.dev.manifest"
|
26
35
|
filename = "plutonium-dev.css"
|
27
36
|
else
|
28
37
|
base_dir = "/plutonium-assets"
|
29
|
-
manifest = "css.manifest"
|
30
38
|
filename = "plutonium.css"
|
31
39
|
end
|
32
40
|
|
33
|
-
file =
|
34
|
-
"#{base_dir}/#{file}"
|
41
|
+
file = stylesheet_manifest[filename]
|
42
|
+
@stylesheet_link = "#{base_dir}/#{file}"
|
35
43
|
end
|
36
44
|
|
37
45
|
def self.script_link
|
46
|
+
return @script_link if defined?(@script_link) && !development?
|
47
|
+
|
38
48
|
filename = "plutonium-app.js"
|
39
|
-
if
|
40
|
-
|
41
|
-
manifest = "js.dev.manifest"
|
49
|
+
base_dir = if development?
|
50
|
+
"/plutonium-assets/build"
|
42
51
|
else
|
43
|
-
|
44
|
-
|
52
|
+
"/plutonium-assets"
|
53
|
+
end
|
54
|
+
|
55
|
+
file = script_manifest[filename]
|
56
|
+
@script_link = "#{base_dir}/#{file}"
|
57
|
+
end
|
58
|
+
|
59
|
+
def self.favicon_link
|
60
|
+
"/plutonium-assets/plutonium.ico"
|
61
|
+
end
|
62
|
+
|
63
|
+
def self.logo_link
|
64
|
+
"/plutonium-assets/plutonium-logo.png"
|
65
|
+
end
|
66
|
+
|
67
|
+
def self.stylesheet_manifest
|
68
|
+
return @stylesheet_manifest if defined?(@stylesheet_manifest) && !development?
|
69
|
+
|
70
|
+
manifest = if development?
|
71
|
+
"css.dev.manifest"
|
72
|
+
else
|
73
|
+
"css.manifest"
|
45
74
|
end
|
75
|
+
@stylesheet_manifest = JSON.parse(File.read(root.join(manifest)))
|
76
|
+
end
|
77
|
+
|
78
|
+
def self.script_manifest
|
79
|
+
return @script_manifest if defined?(@script_manifest) && !development?
|
46
80
|
|
47
|
-
|
48
|
-
|
81
|
+
manifest = if development?
|
82
|
+
"js.dev.manifest"
|
83
|
+
else
|
84
|
+
"js.manifest"
|
85
|
+
end
|
86
|
+
@script_manifest = JSON.parse(File.read(root.join(manifest)))
|
49
87
|
end
|
50
88
|
end
|
51
89
|
|