scrivito_sdk 1.9.1 → 1.10.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/scrivito/obj_class_controller.rb +12 -3
  3. data/app/controllers/scrivito/users_controller.rb +11 -0
  4. data/app/helpers/scrivito_helper.rb +4 -4
  5. data/config/ca-bundle.crt +1 -1
  6. data/lib/assets/javascripts/scrivito.js +12 -12
  7. data/lib/assets/javascripts/scrivito_ui_redirect.js +2 -2
  8. data/lib/assets/javascripts/scrivito_with_js_sdk.js +20123 -19370
  9. data/lib/assets/stylesheets/scrivito.css +1 -1
  10. data/lib/scrivito/attribute_content.rb +25 -15
  11. data/lib/scrivito/attribute_serializer.rb +3 -1
  12. data/lib/scrivito/backend/obj_load.rb +1 -5
  13. data/lib/scrivito/backend/obj_query.rb +2 -6
  14. data/lib/scrivito/backend/parent_path_index.rb +4 -7
  15. data/lib/scrivito/backend/path_index.rb +5 -8
  16. data/lib/scrivito/backend/permalink_index.rb +4 -7
  17. data/lib/scrivito/basic_obj.rb +70 -67
  18. data/lib/scrivito/basic_widget.rb +1 -0
  19. data/lib/scrivito/binary.rb +17 -2
  20. data/lib/scrivito/binary_param_verifier.rb +30 -34
  21. data/lib/scrivito/client_error.rb +2 -0
  22. data/lib/scrivito/cms_data_cache.rb +71 -73
  23. data/lib/scrivito/cms_rest_api.rb +114 -118
  24. data/lib/scrivito/cms_rest_api/rate_limit.rb +21 -26
  25. data/lib/scrivito/cms_routing.rb +1 -1
  26. data/lib/scrivito/configuration.rb +412 -373
  27. data/lib/scrivito/connection_manager.rb +42 -36
  28. data/lib/scrivito/deprecation.rb +11 -15
  29. data/lib/scrivito/diff.rb +6 -8
  30. data/lib/scrivito/gem_info.rb +9 -6
  31. data/lib/scrivito/generator_helper.rb +5 -7
  32. data/lib/scrivito/migrations/cms_backend.rb +11 -8
  33. data/lib/scrivito/migrations/migrator.rb +19 -21
  34. data/lib/scrivito/obj_search_enumerator.rb +24 -24
  35. data/lib/scrivito/request_homepage.rb +10 -14
  36. data/lib/scrivito/route.rb +27 -31
  37. data/lib/scrivito/sdk_engine.rb +8 -4
  38. data/lib/scrivito/tag_renderer.rb +17 -23
  39. data/lib/scrivito/test_request.rb +7 -9
  40. data/lib/scrivito/ui_config.rb +0 -19
  41. data/lib/scrivito/user.rb +89 -99
  42. data/lib/scrivito/workspace.rb +12 -16
  43. data/lib/scrivito/workspace_data.rb +2 -6
  44. data/lib/scrivito_sdk.rb +0 -13
  45. data/lib/tasks/cache.rake +2 -0
  46. metadata +18 -4
@@ -1,40 +1,35 @@
1
1
  module Scrivito
2
2
  class CmsRestApi
3
3
  module RateLimit
4
- class << self
5
- def retry_on_rate_limit(request_timer, &block)
6
- internal_retry(block, request_timer, 0)
7
- end
8
-
9
- private
4
+ def self.retry_on_rate_limit(request_timer, &block)
5
+ internal_retry(block, request_timer, 0)
6
+ end
10
7
 
11
- def internal_retry(request_proc, request_timer, retry_count)
12
- response = request_proc.call
8
+ private_class_method def self.internal_retry(request_proc, request_timer, retry_count)
9
+ response = request_proc.call
13
10
 
14
- if failed_because_of_rate_limit?(response)
15
- time_to_sleep = calculate_time_to_sleep(response['Retry-After'].to_f, retry_count)
11
+ if failed_because_of_rate_limit?(response)
12
+ time_to_sleep = calculate_time_to_sleep(response['Retry-After'].to_f, retry_count)
16
13
 
17
- if request_timer.cover?(Time.now + time_to_sleep.seconds)
18
- Warning.warn("Rate limit exceeded. Will retry after #{time_to_sleep} seconds.")
19
- sleep time_to_sleep
20
- internal_retry(request_proc, request_timer, retry_count + 1)
21
- else
22
- raise Scrivito::RateLimitExceeded.new('rate limit exceeded', 429)
23
- end
14
+ if request_timer.cover?(Time.now + time_to_sleep.seconds)
15
+ Warning.warn("Rate limit exceeded. Will retry after #{time_to_sleep} seconds.")
16
+ sleep time_to_sleep
17
+ internal_retry(request_proc, request_timer, retry_count + 1)
24
18
  else
25
- response
19
+ raise Scrivito::RateLimitExceeded.new('rate limit exceeded', 429)
26
20
  end
21
+ else
22
+ response
27
23
  end
24
+ end
28
25
 
26
+ private_class_method def self.calculate_time_to_sleep(retry_after, retry_count)
27
+ backoff_wait_time = 2 ** retry_count * 0.5
28
+ [backoff_wait_time, retry_after].max
29
+ end
29
30
 
30
- def calculate_time_to_sleep(retry_after, retry_count)
31
- backoff_wait_time = 2 ** retry_count * 0.5
32
- [backoff_wait_time, retry_after].max
33
- end
34
-
35
- def failed_because_of_rate_limit?(response)
36
- response.code == '429'
37
- end
31
+ private_class_method def self.failed_because_of_rate_limit?(response)
32
+ response.code == '429'
38
33
  end
39
34
  end
40
35
  end
@@ -50,7 +50,7 @@ class CmsRouting < Struct.new(:request, :context, :scrivito_engine, :image_optio
50
50
  def path_or_url_without_editing_context(target, path_or_url, options)
51
51
  if target.is_a?(Link)
52
52
  path_or_url_for_links(target, path_or_url, options)
53
- elsif target.is_a?(Obj)
53
+ elsif target.is_a?(Scrivito::BasicObj)
54
54
  path_or_url_for_objs(target, path_or_url, options)
55
55
  elsif target.respond_to?(:first)
56
56
  if target.first.is_a?(Link)
@@ -11,425 +11,464 @@ module Scrivito
11
11
  #
12
12
  DEFAULT_CA_FILE = File.expand_path('../../../config/ca-bundle.crt', __FILE__)
13
13
 
14
- class << self
15
- # Determine if current visitor is permitted to edit content.
16
- attr_accessor :find_user_proc
17
-
18
- #
19
- # Configures a callback to be invoked when the SDK determines whether current visitor is
20
- # permitted to edit content.
21
- #
22
- # If the callback is missing in the +development+ or +test+ environment, then the SDK will
23
- # assume, that the current visitor is {Scrivito::User.system_user}, who can always create
24
- # workspaces, can always read, write, publish, delete and invite to any workspace.
25
- #
26
- # If the callback is missing in any other environment (for example in +production+ or
27
- # +staging+), then the SDK will assume, that the current visitor is not permitted to edit
28
- # content.
29
- #
30
- # @api public
31
- #
32
- # @param [Proc] block proc for detemining if the current visitor is permitted to edit content
33
- # @yieldparam [Hash] env rack env
34
- # @yieldreturn [Scrivito::User] if the current visitor is permitted to edit content
35
- # @yieldreturn [false, nil] if the current visitor is not permitted to edit content
36
- #
37
- # @example
38
- # Scrivito::Configuration.editing_auth do |env|
39
- # if user_id = env['USER_ID']
40
- # Scrivito::User.define(user_id)
41
- # end
42
- # end
43
- #
44
- def editing_auth(&block)
45
- if block.respond_to?(:arity) && block.arity == 1
46
- @editing_auth_callback = block
47
- else
48
- raise ArgumentError, 'editing_auth should have only one attribute!'
49
- end
50
- end
14
+ # Determine if current visitor is permitted to edit content.
15
+ def self.find_user_proc=(value)
16
+ @find_user_proc = value
17
+ end
51
18
 
52
- def editing_auth_callback
53
- @editing_auth_callback || default_editing_auth_callback
54
- end
19
+ def self.find_user_proc
20
+ @find_user_proc
21
+ end
55
22
 
56
- # Configures how to find users for the in-place GUI.
57
- # @api public
58
- # @param [Proc] find_user_proc proc for finding a user by the user id
59
- # @yieldparam [String] user_id id of the user
60
- # @yieldreturn [Scrivito::User] if the user with the given user id was found
61
- # @yieldreturn [NilClass] if the user with the given user id was not found
62
- # @raise [Scrivito::ScrivitoError] if the proc returns neither a {Scrivito::User}, nor +nil+
63
- # @note This configuration key is optional. If it is not configured the in-place GUI would
64
- # behave normally, but would not be able to find any users.
65
- # @example Return a "dummy" {Scrivito::User}
66
- # Scrivito.configure do |config|
67
- # config.find_user do |user_id|
68
- # Scrivito::User.define(user_id)
69
- # end
70
- # end
71
- # @example Find the user with a custom user model and convert it to a {Scrivito::User}
72
- # Scrivito.configure do |config|
73
- # config.find_user do |user_id|
74
- # my_user = MyUserModel.find(user_id)
75
- # if my_user
76
- # my_user.to_scrivito_user
77
- # end
78
- # end
79
- # end
80
- def find_user(&find_user_proc)
81
- self.find_user_proc = find_user_proc
23
+ #
24
+ # Configures a callback to be invoked when the SDK determines whether current visitor is
25
+ # permitted to edit content.
26
+ #
27
+ # If the callback is missing in the +development+ or +test+ environment, then the SDK will
28
+ # assume, that the current visitor is {Scrivito::User.system_user}, who can always create
29
+ # workspaces, can always read, write, publish, delete and invite to any workspace.
30
+ #
31
+ # If the callback is missing in any other environment (for example in +production+ or
32
+ # +staging+), then the SDK will assume, that the current visitor is not permitted to edit
33
+ # content.
34
+ #
35
+ # @api public
36
+ #
37
+ # @param [Proc] block proc for detemining if the current visitor is permitted to edit content
38
+ # @yieldparam [Hash] env rack env
39
+ # @yieldreturn [Scrivito::User] if the current visitor is permitted to edit content
40
+ # @yieldreturn [false, nil] if the current visitor is not permitted to edit content
41
+ #
42
+ # @example
43
+ # Scrivito::Configuration.editing_auth do |env|
44
+ # if user_id = env['USER_ID']
45
+ # Scrivito::User.define(user_id)
46
+ # end
47
+ # end
48
+ #
49
+ def self.editing_auth(&block)
50
+ if block.respond_to?(:arity) && block.arity == 1
51
+ @editing_auth_callback = block
52
+ else
53
+ raise ArgumentError, 'editing_auth should have only one attribute!'
82
54
  end
55
+ end
83
56
 
84
- #
85
- # Set the path for the filesystem cache.
86
- #
87
- # +Scrivito+ makes heavy use of filesystem caching. Use this method to configure the directory
88
- # that should be used to store cached data. By default, +RAILS_ROOT/tmp/scrivito_cache+ will
89
- # be used.
90
- #
91
- # @api public
92
- #
93
- # @param path [String] Path to directory that should be used to store cached data.
94
- #
95
- # @example Configure +Scrivito+ to store its cache under +/tmp/my_cache+.
96
- #
97
- # Scrivito.configure do |config|
98
- # config.cache_path = '/tmp/my_cache'
99
- # end
100
- #
101
- def cache_path=(path)
102
- CmsDataCache.cache_path = path
103
- end
57
+ def self.editing_auth_callback
58
+ @editing_auth_callback || default_editing_auth_callback
59
+ end
104
60
 
105
- #
106
- # Sets the second level cache.
107
- #
108
- # If it is set, then +Scrivito+ will additionaly store its cache in both: the filesystem cache
109
- # and the second level cache. Also +Scrivito+ will search in the second level cache if
110
- # searching in the filesystem cache returns no results. If the second level cache returns
111
- # results, then the results will be store in the filesystem cache.
112
- #
113
- # By default it is not set.
114
- #
115
- # @api public
116
- #
117
- # @param cache_store [ActiveSupport::Cache::Store] cache store to be used as the second level
118
- # cache
119
- #
120
- # @example Use Memcached as the second level cache (https://rubygems.org/gems/dalli)
121
- #
122
- # Scrivito.configure do |config|
123
- # config.second_level_cache = ActiveSupport::Cache::DalliStore.new("localhost",
124
- # "server-downstairs.localnetwork:8229")
125
- # end
126
- #
127
- def second_level_cache=(cache_store)
128
- CmsDataCache.second_level_cache = cache_store
129
- end
61
+ # Configures how to find users for the in-place GUI.
62
+ # @api public
63
+ # @param [Proc] find_user_proc proc for finding a user by the user id
64
+ # @yieldparam [String] user_id id of the user
65
+ # @yieldreturn [Scrivito::User] if the user with the given user id was found
66
+ # @yieldreturn [NilClass] if the user with the given user id was not found
67
+ # @raise [Scrivito::ScrivitoError] if the proc returns neither a {Scrivito::User}, nor +nil+
68
+ # @note This configuration key is optional. If it is not configured the in-place GUI would
69
+ # behave normally, but would not be able to find any users.
70
+ # @example Return a "dummy" {Scrivito::User}
71
+ # Scrivito.configure do |config|
72
+ # config.find_user do |user_id|
73
+ # Scrivito::User.define(user_id)
74
+ # end
75
+ # end
76
+ # @example Find the user with a custom user model and convert it to a {Scrivito::User}
77
+ # Scrivito.configure do |config|
78
+ # config.find_user do |user_id|
79
+ # my_user = MyUserModel.find(user_id)
80
+ # if my_user
81
+ # my_user.to_scrivito_user
82
+ # end
83
+ # end
84
+ # end
85
+ def self.find_user(&find_user_proc)
86
+ self.find_user_proc = find_user_proc
87
+ end
130
88
 
131
- #
132
- # Sets the tenant name.
133
- # This configuration key _must_ be provided.
134
- #
135
- # @api public
136
- #
137
- def tenant=(tenant_name)
138
- @endpoint_uri = nil
139
- @tenant = tenant_name
140
- end
89
+ #
90
+ # Set the path for the filesystem cache.
91
+ #
92
+ # +Scrivito+ makes heavy use of filesystem caching. Use this method to configure the directory
93
+ # that should be used to store cached data. By default, +RAILS_ROOT/tmp/scrivito_cache+ will
94
+ # be used.
95
+ #
96
+ # @api public
97
+ #
98
+ # @param path [String] Path to directory that should be used to store cached data.
99
+ #
100
+ # @example Configure +Scrivito+ to store its cache under +/tmp/my_cache+.
101
+ #
102
+ # Scrivito.configure do |config|
103
+ # config.cache_path = '/tmp/my_cache'
104
+ # end
105
+ #
106
+ def self.cache_path=(path)
107
+ CmsDataCache.cache_path = path
108
+ end
141
109
 
142
- #
143
- # Sets the API key.
144
- # This configuration key _must_ be provided.
145
- #
146
- # @api public
147
- #
148
- attr_writer :api_key
149
-
150
- #
151
- # Sets the API endpoint URL.
152
- # This configuration key is optional.
153
- # Default is +'api.scrivito.com'+.
154
- # If no schema is provided HTTPS is assumed.
155
- #
156
- # @api public
157
- #
158
- attr_writer :endpoint
159
-
160
- #
161
- # Sets a minimum
162
- # {https://ruby-doc.org/stdlib/libdoc/net/http/rdoc/Net/HTTP.html#open_timeout-attribute-method
163
- # +Net::HTTP#open_timeout+} for endpoint connections.
164
- #
165
- # Default is +0.5+
166
- #
167
- # @api public
168
- #
169
- def minimum_open_timeout=(value)
170
- ConnectionManager.minimum_open_timeout = value
171
- end
110
+ #
111
+ # Sets the second level cache.
112
+ #
113
+ # If it is set, then +Scrivito+ will additionaly store its cache in both: the filesystem cache
114
+ # and the second level cache. Also +Scrivito+ will search in the second level cache if
115
+ # searching in the filesystem cache returns no results. If the second level cache returns
116
+ # results, then the results will be store in the filesystem cache.
117
+ #
118
+ # By default it is not set.
119
+ #
120
+ # @api public
121
+ #
122
+ # @param cache_store [ActiveSupport::Cache::Store] cache store to be used as the second level
123
+ # cache
124
+ #
125
+ # @example Use Memcached as the second level cache (https://rubygems.org/gems/dalli)
126
+ #
127
+ # Scrivito.configure do |config|
128
+ # config.second_level_cache = ActiveSupport::Cache::DalliStore.new("localhost",
129
+ # "server-downstairs.localnetwork:8229")
130
+ # end
131
+ #
132
+ def self.second_level_cache=(cache_store)
133
+ CmsDataCache.second_level_cache = cache_store
134
+ end
172
135
 
173
- #
174
- # Sets a minimum
175
- # {https://ruby-doc.org/stdlib/libdoc/net/http/rdoc/Net/HTTP.html#ssl_timeout-attribute-method
176
- # +Net::HTTP#ssl_timeout+} for endpoint connections.
177
- #
178
- # Default is +1.0+
179
- #
180
- # @api public
181
- #
182
- def minimum_ssl_timeout=(value)
183
- ConnectionManager.minimum_ssl_timeout = value
184
- end
136
+ #
137
+ # Sets the tenant name.
138
+ # This configuration key _must_ be provided.
139
+ #
140
+ # @api public
141
+ #
142
+ def self.tenant=(tenant_name)
143
+ @endpoint_uri = nil
144
+ @tenant = tenant_name
145
+ end
185
146
 
186
- #
187
- # Sets a minimum
188
- # {https://ruby-doc.org/stdlib/libdoc/net/http/rdoc/Net/HTTP.html#read_timeout-attribute-method
189
- # +Net::HTTP#read_timeout+} for endpoint connections.
190
- #
191
- # Default is +0.5+
192
- #
193
- # @api public
194
- #
195
- def minimum_read_timeout=(value)
196
- ConnectionManager.minimum_read_timeout = value
197
- end
147
+ #
148
+ # Sets the API key.
149
+ # This configuration key _must_ be provided.
150
+ #
151
+ # @api public
152
+ #
153
+ def self.api_key=(value)
154
+ @api_key = value
155
+ end
198
156
 
199
- #
200
- # Gets the path of a CA certification file in PEM format.
201
- #
202
- # @return [String]
203
- # @api public
204
- #
205
- attr_reader :ca_file
206
-
207
- # Sets path of a CA certification file in PEM format.
208
- # The file can contain several CA certificates.
209
- # Certifications will be used for endpoint peer verification of various scrivito services
210
- # e.g. Content Read Service.
211
- # @api public
212
- def ca_file=(path)
213
- if path # Try to read the given file and fail if it doesn't exist or is not readable.
214
- File.read(path)
215
- end
216
- @ca_file = path
217
- end
157
+ #
158
+ # Sets the API endpoint URL.
159
+ # This configuration key is optional.
160
+ # Default is +'api.scrivito.com'+.
161
+ # If no schema is provided HTTPS is assumed.
162
+ #
163
+ # @api public
164
+ #
165
+ def self.endpoint=(value)
166
+ @endpoint = value
167
+ end
218
168
 
219
- def to_prepare
220
- unless Rails.configuration.cache_classes
221
- BasicObj.reset_type_computer!
222
- BasicWidget.reset_type_computer!
223
- end
224
- end
169
+ #
170
+ # Sets a minimum
171
+ # {https://ruby-doc.org/stdlib/libdoc/net/http/rdoc/Net/HTTP.html#open_timeout-attribute-method
172
+ # +Net::HTTP#open_timeout+} for endpoint connections.
173
+ #
174
+ # Default is +0.5+
175
+ #
176
+ # @api public
177
+ #
178
+ def self.minimum_open_timeout=(value)
179
+ ConnectionManager.minimum_open_timeout = value
180
+ end
225
181
 
226
- def tenant
227
- tenant = @tenant || ENV['SCRIVITO_TENANT']
228
- assert_configuration_key_present(:tenant, tenant)
229
- tenant
230
- end
182
+ #
183
+ # Sets a minimum
184
+ # {https://ruby-doc.org/stdlib/libdoc/net/http/rdoc/Net/HTTP.html#ssl_timeout-attribute-method
185
+ # +Net::HTTP#ssl_timeout+} for endpoint connections.
186
+ #
187
+ # Default is +1.0+
188
+ #
189
+ # @api public
190
+ #
191
+ def self.minimum_ssl_timeout=(value)
192
+ ConnectionManager.minimum_ssl_timeout = value
193
+ end
231
194
 
232
- def api_key
233
- api_key = @api_key || ENV['SCRIVITO_API_KEY']
234
- assert_configuration_key_present(:api_key, api_key)
235
- api_key
236
- end
195
+ #
196
+ # Sets a minimum
197
+ # {https://ruby-doc.org/stdlib/libdoc/net/http/rdoc/Net/HTTP.html#read_timeout-attribute-method
198
+ # +Net::HTTP#read_timeout+} for endpoint connections.
199
+ #
200
+ # Default is +0.5+
201
+ #
202
+ # @api public
203
+ #
204
+ def self.minimum_read_timeout=(value)
205
+ ConnectionManager.minimum_read_timeout = value
206
+ end
237
207
 
238
- def endpoint
239
- raise 'Missing required configuration key "endpoint"' unless @endpoint
240
- @endpoint
241
- end
208
+ #
209
+ # Gets the path of a CA certification file in PEM format.
210
+ #
211
+ # @return [String]
212
+ # @api public
213
+ #
214
+ def self.ca_file
215
+ @ca_file
216
+ end
242
217
 
243
- def endpoint_uri
244
- @endpoint_uri ||= calculate_endpoint_uri
218
+ # Sets path of a CA certification file in PEM format.
219
+ # The file can contain several CA certificates.
220
+ # Certifications will be used for endpoint peer verification of various scrivito services
221
+ # e.g. Content Read Service.
222
+ # @api public
223
+ def self.ca_file=(path)
224
+ if path # Try to read the given file and fail if it doesn't exist or is not readable.
225
+ File.read(path)
245
226
  end
227
+ @ca_file = path
228
+ end
246
229
 
247
- def set_defaults!
248
- self.ca_file = DEFAULT_CA_FILE
249
- self.endpoint = 'api.scrivito.com'
250
- self.check_batch_size = 100
251
- self.legacy_routing = false
252
- self.default_image_transformation = {}
253
- self.choose_homepage_callback = -> (env) { Obj.root }
254
- self.find_user_proc = nil
255
- self.inject_preset_routes = true
256
- @editing_auth_callback = nil
230
+ def self.to_prepare
231
+ unless Rails.configuration.cache_classes
232
+ BasicObj.reset_type_computer!
233
+ BasicWidget.reset_type_computer!
257
234
  end
235
+ end
236
+
237
+ def self.tenant
238
+ tenant = @tenant || ENV['SCRIVITO_TENANT']
239
+ assert_configuration_key_present(:tenant, tenant)
240
+ tenant
241
+ end
242
+
243
+ def self.api_key
244
+ api_key = @api_key || ENV['SCRIVITO_API_KEY']
245
+ assert_configuration_key_present(:api_key, api_key)
246
+ api_key
247
+ end
248
+
249
+ def self.endpoint
250
+ raise 'Missing required configuration key "endpoint"' unless @endpoint
251
+ @endpoint
252
+ end
253
+
254
+ def self.endpoint_uri
255
+ @endpoint_uri ||= calculate_endpoint_uri
256
+ end
257
+
258
+ def self.set_defaults!
259
+ self.ca_file = DEFAULT_CA_FILE
260
+ self.endpoint = 'api.scrivito.com'
261
+ self.check_batch_size = 100
262
+ self.legacy_routing = false
263
+ self.default_image_transformation = {}
264
+ self.choose_homepage_callback = -> (env) { Obj.root }
265
+ self.find_user_proc = nil
266
+ self.inject_preset_routes = true
267
+ @editing_auth_callback = nil
268
+ end
269
+
270
+ #
271
+ # Configures the in-place UI to use a locale different from the one used by the rest of the
272
+ # application.
273
+ #
274
+ # @api public
275
+ # @example
276
+ # # The application will use +:de+ as locale.
277
+ # I18n.locale = :de
278
+ #
279
+ # Scrivito.configure do |config|
280
+ # # But the in-place UI will nevertheless use +:en+.
281
+ # config.ui_locale = :en
282
+ # end
283
+ #
284
+ def self.ui_locale
285
+ @ui_locale
286
+ end
287
+
288
+ def self.ui_locale=(value)
289
+ @ui_locale = value
290
+ end
258
291
 
259
- #
260
- # Configures the in-place UI to use a locale different from the one used by the rest of the
261
- # application.
262
- #
263
- # @api public
264
- # @example
265
- # # The application will use +:de+ as locale.
266
- # I18n.locale = :de
267
- #
268
- # Scrivito.configure do |config|
269
- # # But the in-place UI will nevertheless use +:en+.
270
- # config.ui_locale = :en
271
- # end
272
- #
273
- attr_accessor :ui_locale
274
-
275
-
276
- # @api public
277
- # @deprecated The legacy routing is deprecated and will be removed in the next major
278
- # version of Scrivito.
279
- #
280
- # Scrivito changed its routing to a slug first url scheme. This configuration option
281
- # allows you to switch back to the old id first url scheme.
282
- attr_accessor :legacy_routing
283
-
284
- def legacy_routing=(enabled)
285
- if enabled
286
- Scrivito::Deprecation.warn(%[
292
+ # @api public
293
+ # @deprecated The legacy routing is deprecated and will be removed in the next major
294
+ # version of Scrivito.
295
+ #
296
+ # Scrivito changed its routing to a slug first url scheme. This configuration option
297
+ # allows you to switch back to the old id first url scheme.
298
+ def self.legacy_routing
299
+ @legacy_routing
300
+ end
301
+
302
+ def self.legacy_routing=(enabled)
303
+ if enabled
304
+ Scrivito::Deprecation.warn(%[
287
305
  The legacy routing is deprecated and will be removed in the next major version of Scrivito.
288
306
  Please use the new scrivito_route api to replicate the legacy routes:
289
- scrivito_route '/', using: 'homepage', via: :all
290
- scrivito_route '(/):id/*slug', using: 'slug_id', via: :all
291
- scrivito_route '/*permalink', using: 'permalink', via: all
292
- ])
293
- end
294
- @legacy_routing = enabled
307
+ scrivito_route '/', using: 'homepage', via: :all
308
+ scrivito_route '(/):id/*slug', using: 'slug_id', via: :all
309
+ scrivito_route '/*permalink', using: 'permalink', via: all
310
+ ])
295
311
  end
312
+ @legacy_routing = enabled
313
+ end
296
314
 
297
- # @api public
298
- #
299
- # The +inject_preset_routes+ configuration is enabled by default and adds the default
300
- # Scrivito routing to your application routes. It can be disabled by setting it to
301
- # +false+ which lets you use {RoutingExtensions#scrivito_route scrivito_route} to
302
- # customize the routing used by Scrivito.
303
- attr_accessor :inject_preset_routes
315
+ # @api public
316
+ #
317
+ # The +inject_preset_routes+ configuration is enabled by default and adds the default
318
+ # Scrivito routing to your application routes. It can be disabled by setting it to
319
+ # +false+ which lets you use {RoutingExtensions#scrivito_route scrivito_route} to
320
+ # customize the routing used by Scrivito.
321
+ def self.inject_preset_routes=(value)
322
+ @inject_preset_routes = value
323
+ end
304
324
 
305
- def scrivito_route_enabled?
306
- inject_preset_routes == false
307
- end
325
+ def self.inject_preset_routes
326
+ @inject_preset_routes
327
+ end
308
328
 
309
- def with_scrivito_route_enabled
310
- begin
311
- initial_value = inject_preset_routes
312
- self.inject_preset_routes = false
313
- yield
314
- ensure
315
- self.inject_preset_routes = initial_value
316
- end
317
- end
329
+ def self.scrivito_route_enabled?
330
+ inject_preset_routes == false
331
+ end
318
332
 
319
- attr_accessor :choose_homepage_callback, :check_batch_size
320
-
321
- #
322
- # Set the default {Scrivito::Binary#transform image transformation}.
323
- #
324
- # @api public
325
- #
326
- # When delivering binary Objs, the default image transformation will be applied.
327
- #
328
- # If not changed the default image transformation is an empty transformation (an empty
329
- # +Hash+). Set it to +false+ to disabled the default image transformation completely.
330
- #
331
- # @param [Hash] value the {Scrivito::Binary#transform transformation definition}
332
- #
333
- # @see Scrivito::Binary#transform
334
- #
335
- attr_writer :default_image_transformation
336
-
337
- attr_reader :default_image_transformation
338
-
339
- # @api public
340
- #
341
- # A callback that can be provided for determining the CMS object to be used when visiting
342
- # the homepage. See {Scrivito::RoutingExtensions#scrivito_route scrivito_route} for
343
- # details on how to define routes. The callback is called once per request and receives
344
- # the rack environment as its only parameter. By default, the CMS object at the root
345
- # path (+/+) is used as the homepage.
346
- #
347
- # @yield Rack environment of the current request
348
- #
349
- # @example
350
- # Scrivito.configure do |config|
351
- # config.choose_homepage do |env|
352
- # Obj.root # Replace with code to set the homepage
353
- # end
354
- # end
355
- def choose_homepage(&block)
356
- self.choose_homepage_callback = block
333
+ def self.with_scrivito_route_enabled
334
+ begin
335
+ initial_value = inject_preset_routes
336
+ self.inject_preset_routes = false
337
+ yield
338
+ ensure
339
+ self.inject_preset_routes = initial_value
357
340
  end
341
+ end
358
342
 
359
- def obj_formats
360
- @obj_formats ||= {
361
- '_default' => proc do |obj, user|
362
- {
363
- id: obj.id,
364
- obj_class: obj.obj_class,
365
- description_for_editor: obj.description_for_editor,
366
- modification: obj.modification,
367
- has_conflict: obj.has_conflict?,
368
- last_changed: obj.last_changed.utc.iso8601,
369
- is_binary: obj.binary?,
370
- restriction_messages: user.restriction_messages_for(obj)
371
- }
372
- end
373
- }
374
- end
343
+ def self.choose_homepage_callback=(value)
344
+ @choose_homepage_callback = value
345
+ end
375
346
 
376
- def register_obj_format(name, &block)
377
- if name.start_with? '_'
378
- raise InvalidFormatNameError.new('Format names starting with underscore are not allowed.')
379
- else
380
- obj_formats[name] = block
381
- end
382
- end
347
+ def self.choose_homepage_callback
348
+ @choose_homepage_callback
349
+ end
383
350
 
384
- # For test purposes only.
385
- def reset_editing_auth_callback!
386
- @editing_auth_callback = nil
387
- end
351
+ def self.check_batch_size=(value)
352
+ @check_batch_size = value
353
+ end
388
354
 
389
- def migration_path
390
- 'scrivito/migrate'
391
- end
355
+ def self.check_batch_size
356
+ @check_batch_size
357
+ end
392
358
 
393
- private
359
+ #
360
+ # Set the default {Scrivito::Binary#transform image transformation}.
361
+ #
362
+ # @api public
363
+ #
364
+ # When delivering binary Objs, the default image transformation will be applied.
365
+ #
366
+ # If not changed the default image transformation is an empty transformation (an empty
367
+ # +Hash+). Set it to +false+ to disabled the default image transformation completely.
368
+ #
369
+ # @param [Hash] value the {Scrivito::Binary#transform transformation definition}
370
+ #
371
+ # @see Scrivito::Binary#transform
372
+ #
373
+ def self.default_image_transformation=(value)
374
+ @default_image_transformation = value
375
+ end
376
+
377
+ def self.default_image_transformation
378
+ @default_image_transformation
379
+ end
394
380
 
395
- def default_editing_auth_callback
396
- if Rails.env.development? || Rails.env.test?
397
- ->(_) { User.system_user }
381
+ # @api public
382
+ #
383
+ # A callback that can be provided for determining the CMS object to be used when visiting
384
+ # the homepage. See {Scrivito::RoutingExtensions#scrivito_route scrivito_route} for
385
+ # details on how to define routes. The callback is called once per request and receives
386
+ # the rack environment as its only parameter. By default, the CMS object at the root
387
+ # path (+/+) is used as the homepage.
388
+ #
389
+ # @yield Rack environment of the current request
390
+ #
391
+ # @example
392
+ # Scrivito.configure do |config|
393
+ # config.choose_homepage do |env|
394
+ # Obj.root # Replace with code to set the homepage
395
+ # end
396
+ # end
397
+ def self.choose_homepage(&block)
398
+ self.choose_homepage_callback = block
399
+ end
400
+
401
+ def self.obj_formats
402
+ @obj_formats ||= {
403
+ '_default' => proc do |obj, user|
404
+ {
405
+ id: obj.id,
406
+ obj_class: obj.obj_class,
407
+ description_for_editor: obj.description_for_editor,
408
+ modification: obj.modification,
409
+ has_conflict: obj.has_conflict?,
410
+ last_changed: obj.last_changed.utc.iso8601,
411
+ is_binary: obj.binary?,
412
+ restriction_messages: user.restriction_messages_for(obj)
413
+ }
398
414
  end
415
+ }
416
+ end
417
+
418
+ def self.register_obj_format(name, &block)
419
+ if name.start_with? '_'
420
+ raise InvalidFormatNameError.new('Format names starting with underscore are not allowed.')
421
+ else
422
+ obj_formats[name] = block
399
423
  end
424
+ end
425
+
426
+ # For test purposes only.
427
+ def self.reset_editing_auth_callback!
428
+ @editing_auth_callback = nil
429
+ end
400
430
 
401
- def assert_configuration_key_present(key, value)
402
- unless value
403
- raise %{
404
- Missing the required configuration key "#{key}".
431
+ def self.migration_path
432
+ 'scrivito/migrate'
433
+ end
405
434
 
406
- You need to configure the "tenant" and the "api_key" in order to connect the application
407
- to the Scrivito backend.
435
+ private_class_method def self.default_editing_auth_callback
436
+ if Rails.env.development? || Rails.env.test?
437
+ ->(_) { User.system_user }
438
+ end
439
+ end
408
440
 
409
- Either use the environment variables "SCRIVITO_TENANT" and "SCRIVITO_API_KEY" or set the
410
- keys in an initializer:
441
+ private_class_method def self.assert_configuration_key_present(key, value)
442
+ unless value
443
+ raise %{
444
+ Missing the required configuration key "#{key}".
411
445
 
412
- Scrivito.configure do |config|
413
- config.tenant = 'my_tenant'
414
- config.api_key = 'secret123'
415
- end
446
+ You need to configure the "tenant" and the "api_key" in order to connect the application
447
+ to the Scrivito backend.
416
448
 
417
- The values of the keys can be obtained from the dashboard at https://scrivito.com.
418
- }
419
- end
420
- end
449
+ Either use the environment variables "SCRIVITO_TENANT" and "SCRIVITO_API_KEY" or set the
450
+ keys in an initializer:
451
+
452
+ Scrivito.configure do |config|
453
+ config.tenant = 'my_tenant'
454
+ config.api_key = 'secret123'
455
+ end
421
456
 
422
- def calculate_endpoint_uri
423
- url = endpoint
424
- url = "https://#{url}" unless url.match(/^http/)
425
- url = "#{url}/tenants/#{tenant}"
426
- URI.parse(url)
457
+ The values of the keys can be obtained from the dashboard at https://scrivito.com.
458
+ }
427
459
  end
428
460
  end
429
461
 
430
- set_defaults!
462
+ private_class_method def self.calculate_endpoint_uri
463
+ url = endpoint
464
+ url = "https://#{url}" unless url.match(/^http/)
465
+ url = "#{url}/tenants/#{tenant}"
466
+ URI.parse(url)
467
+ end
431
468
  end
432
469
 
470
+ Configuration.set_defaults!
471
+
433
472
  class InvalidFormatNameError < StandardError
434
473
  end
435
474
  end