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
@@ -6,54 +6,60 @@ module Scrivito
6
6
 
7
7
  attr_reader :uri
8
8
 
9
- class << self
10
- def request(request, timeout: nil, uri: nil)
11
- connection_pool_for(uri || Configuration.endpoint_uri).with do |connection|
12
- connection.request(request, timeout)
13
- end
9
+ def self.request(request, timeout: nil, uri: nil)
10
+ connection_pool_for(uri || Configuration.endpoint_uri).with do |connection|
11
+ connection.request(request, timeout)
14
12
  end
13
+ end
15
14
 
16
- # For test purpose only.
17
- def clear_cache!
18
- @connection_pools = nil
19
- @cert_store = nil
20
- end
15
+ # For test purpose only.
16
+ def self.clear_cache!
17
+ @connection_pools = nil
18
+ @cert_store = nil
19
+ end
21
20
 
22
- def cert_store
23
- @cert_store ||= OpenSSL::X509::Store.new.tap do |store|
24
- store.set_default_paths
25
- store.add_file(Configuration.ca_file)
26
- end
21
+ def self.cert_store
22
+ @cert_store ||= OpenSSL::X509::Store.new.tap do |store|
23
+ store.set_default_paths
24
+ store.add_file(Configuration.ca_file)
27
25
  end
26
+ end
28
27
 
29
- attr_writer :minimum_open_timeout
30
- attr_writer :minimum_ssl_timeout
31
- attr_writer :minimum_read_timeout
28
+ def self.minimum_open_timeout
29
+ @minimum_open_timeout || 0.5
30
+ end
32
31
 
33
- def minimum_open_timeout
34
- @minimum_open_timeout || 0.5
35
- end
32
+ def self.minimum_open_timeout=(value)
33
+ @minimum_open_timeout = value
34
+ end
36
35
 
37
- def minimum_ssl_timeout
38
- @minimum_ssl_timeout || 1.0
39
- end
36
+ def self.minimum_ssl_timeout
37
+ @minimum_ssl_timeout || 1.0
38
+ end
40
39
 
41
- def minimum_read_timeout
42
- @minimum_read_timeout || 0.5
43
- end
40
+ def self.minimum_ssl_timeout=(value)
41
+ @minimum_ssl_timeout = value
42
+ end
43
+
44
+ def self.minimum_read_timeout
45
+ @minimum_read_timeout || 0.5
46
+ end
47
+
48
+ def self.minimum_read_timeout=(value)
49
+ @minimum_read_timeout = value
50
+ end
44
51
 
45
- def connection_pool_for(uri)
46
- endpoint_url = "#{uri.scheme}://#{uri.host}:#{uri.port}"
47
- connection_pools.fetch(endpoint_url) do
48
- connection_pools[endpoint_url] = ConnectionPool.new(size: 100, timeout: 0) do
49
- new(URI.parse(endpoint_url))
50
- end
52
+ def self.connection_pool_for(uri)
53
+ endpoint_url = "#{uri.scheme}://#{uri.host}:#{uri.port}"
54
+ connection_pools.fetch(endpoint_url) do
55
+ connection_pools[endpoint_url] = ConnectionPool.new(size: 100, timeout: 0) do
56
+ new(URI.parse(endpoint_url))
51
57
  end
52
58
  end
59
+ end
53
60
 
54
- def connection_pools
55
- @connection_pools ||= {}
56
- end
61
+ def self.connection_pools
62
+ @connection_pools ||= {}
57
63
  end
58
64
 
59
65
  def initialize(uri)
@@ -1,22 +1,18 @@
1
1
  module Scrivito
2
2
  class Deprecation
3
- class << self
4
- def warn(message, source = caller(1))
5
- ActiveSupport::Deprecation.warn(message, source)
6
- end
7
-
8
- def warn_method(deprecated_method_name, new_method_name = nil)
9
- warn(warn_method_message(deprecated_method_name, new_method_name), caller(1))
10
- end
3
+ def self.warn(message, source = caller(1))
4
+ ActiveSupport::Deprecation.warn(message, source)
5
+ end
11
6
 
12
- private
7
+ def self.warn_method(deprecated_method_name, new_method_name = nil)
8
+ warn(warn_method_message(deprecated_method_name, new_method_name), caller(1))
9
+ end
13
10
 
14
- def warn_method_message(deprecated_method_name, new_method_name = nil)
15
- message = "The method #{deprecated_method_name} is deprecated and will be removed "\
16
- "from the Scrivito SDK in the next major version. "
17
- message << "Please use #{new_method_name} instead" if new_method_name
18
- message
19
- end
11
+ private_class_method def self.warn_method_message(deprecated_method_name, new_method_name = nil)
12
+ message = "The method #{deprecated_method_name} is deprecated and will be removed "\
13
+ "from the Scrivito SDK in the next major version. "
14
+ message << "Please use #{new_method_name} instead" if new_method_name
15
+ message
20
16
  end
21
17
  end
22
18
  end
data/lib/scrivito/diff.rb CHANGED
@@ -3,9 +3,9 @@ require "hyp_diff"
3
3
 
4
4
  module Scrivito
5
5
 
6
- class Diff; class << self
6
+ class Diff
7
7
 
8
- def for(mode, field_type, old, new)
8
+ def self.for(mode, field_type, old, new)
9
9
  case field_type
10
10
  when "widgetlist"
11
11
  ListComparison.for(mode, old || [], new || [])
@@ -16,13 +16,11 @@ class Diff; class << self
16
16
  end
17
17
  end
18
18
 
19
- private
20
-
21
- def for_string(mode, old, new)
19
+ private_class_method def self.for_string(mode, old, new)
22
20
  for_html(mode, ERB::Util.h(old), ERB::Util.h(new))
23
21
  end
24
22
 
25
- def for_html(mode, old, new)
23
+ private_class_method def self.for_html(mode, old, new)
26
24
  return if !old
27
25
  return if !new
28
26
  return unless %w[added deleted diff].include?(mode)
@@ -31,7 +29,7 @@ class Diff; class << self
31
29
  [StringTagging.tag_as_html(diff)]
32
30
  end
33
31
 
34
- def hyp_diff_options(mode)
32
+ private_class_method def self.hyp_diff_options(mode)
35
33
  render_insertion_proc = proc { |html| "<span class='scrivito_insertion'>#{html}</span>" }
36
34
  render_deletion_proc = proc { |html| "<span class='scrivito_deletion'>#{html}</span>" }
37
35
  render_nothing_proc = proc {}
@@ -118,6 +116,6 @@ class Diff; class << self
118
116
  end
119
117
  end
120
118
 
121
- end; end
119
+ end
122
120
 
123
121
  end
@@ -1,13 +1,16 @@
1
1
  module Scrivito
2
2
  module GemInfo
3
- class << self
4
- delegate :name, :version, to: :spec
5
3
 
6
- private
4
+ def self.name
5
+ spec.name
6
+ end
7
+
8
+ def self.version
9
+ spec.version
10
+ end
7
11
 
8
- def spec
9
- @spec ||= Gem.loaded_specs['scrivito_sdk']
10
- end
12
+ private_class_method def self.spec
13
+ @spec ||= Gem.loaded_specs['scrivito_sdk']
11
14
  end
12
15
  end
13
16
  end
@@ -1,12 +1,10 @@
1
1
  module Scrivito
2
2
  module GeneratorHelper
3
- class << self
4
- def attribute_definition(arg)
5
- if %w(enum multienum).include?(arg.type.to_s)
6
- "attribute :#{arg.name}, :#{arg.type}, values: []"
7
- else
8
- "attribute :#{arg.name}, :#{arg.type}"
9
- end
3
+ def self.attribute_definition(arg)
4
+ if %w(enum multienum).include?(arg.type.to_s)
5
+ "attribute :#{arg.name}, :#{arg.type}, values: []"
6
+ else
7
+ "attribute :#{arg.name}, :#{arg.type}"
10
8
  end
11
9
  end
12
10
  end
@@ -10,8 +10,8 @@ module Scrivito
10
10
  end
11
11
 
12
12
  def save(value)
13
- CmsRestApi.put(endpoint("objs/#{migration_store_obj.id}"),
14
- obj: {versions: ['string', value]})
13
+ Workspace.current.update_obj(migration_store_obj.id,
14
+ { obj: { versions: ['string', value] } })
15
15
 
16
16
  Workspace.current.reload
17
17
  end
@@ -19,8 +19,15 @@ module Scrivito
19
19
  private
20
20
 
21
21
  def create
22
- CmsRestApi.post(endpoint('objs'),
23
- obj: {_path: path, _obj_class: 'MigrationStore', versions: ['string', '']})
22
+ obj_id = SecureRandom.hex(8)
23
+ Workspace.current.update_obj(obj_id, {
24
+ obj: {
25
+ _id: obj_id,
26
+ _obj_class: 'MigrationStore',
27
+ _path: path,
28
+ versions: ['string', ''],
29
+ }
30
+ })
24
31
 
25
32
  Workspace.current.reload
26
33
  end
@@ -37,10 +44,6 @@ module Scrivito
37
44
  def path
38
45
  '/_internal/migration-store'
39
46
  end
40
-
41
- def endpoint(path)
42
- "workspaces/#{Workspace.current.id}/#{path}"
43
- end
44
47
  end
45
48
  end
46
49
  end
@@ -1,33 +1,31 @@
1
1
  module Scrivito
2
2
  module Migrations
3
3
  class Migrator
4
- class << self
5
- def migrations_path
6
- Rails.root + Scrivito::Configuration.migration_path
7
- end
8
-
9
- def determine_migrations(paths)
10
- paths = Array(paths)
11
- files = Dir[*paths.map { |path| "#{path}/**/[0-9]*_*.rb" }]
12
- splitter = /([0-9]+)_([_a-z0-9]*)\.?([_a-z0-9]*)?\.rb\z/
13
-
14
- migrations = files.map do |filename|
15
- version, name, scope = filename.scan(splitter).first
4
+ def self.migrations_path
5
+ Rails.root + Scrivito::Configuration.migration_path
6
+ end
16
7
 
17
- unless version
18
- raise ScrivitoError.new("Illegal name for migration file: #{filename}\n\t
19
- (only lower case letters, numbers, and '_' allowed)")
20
- end
8
+ def self.determine_migrations(paths)
9
+ paths = Array(paths)
10
+ files = Dir[*paths.map { |path| "#{path}/**/[0-9]*_*.rb" }]
11
+ splitter = /([0-9]+)_([_a-z0-9]*)\.?([_a-z0-9]*)?\.rb\z/
21
12
 
22
- version = version
23
- name = name.camelize
13
+ migrations = files.map do |filename|
14
+ version, name, scope = filename.scan(splitter).first
24
15
 
25
- require(File.expand_path(filename))
26
- name.constantize.new(name, version, filename, scope)
16
+ unless version
17
+ raise ScrivitoError.new("Illegal name for migration file: #{filename}\n\t
18
+ (only lower case letters, numbers, and '_' allowed)")
27
19
  end
28
20
 
29
- migrations.sort_by(&:version)
21
+ version = version
22
+ name = name.camelize
23
+
24
+ require(File.expand_path(filename))
25
+ name.constantize.new(name, version, filename, scope)
30
26
  end
27
+
28
+ migrations.sort_by(&:version)
31
29
  end
32
30
 
33
31
  attr_reader :migrations
@@ -248,6 +248,17 @@ module Scrivito
248
248
  # @api public
249
249
  class ObjSearchEnumerator
250
250
  INVALID_NEGATED_OPERATORS = [:contains, :contains_prefix].freeze
251
+ OPERATOR_WHITELIST = [
252
+ :contains,
253
+ :contains_prefix,
254
+ :equals,
255
+ :starts_with,
256
+ :is_greater_than,
257
+ :is_less_than,
258
+ :links_to,
259
+ :refers_to,
260
+ ].freeze
261
+
251
262
  include Enumerable
252
263
 
253
264
  attr_reader :workspace
@@ -279,11 +290,12 @@ module Scrivito
279
290
  # @return [Scrivito::ObjSearchEnumerator]
280
291
  # @api public
281
292
  def and(field, operator, value, boost = nil)
282
- real_operator = operator_mapping(operator)
283
- subquery = { field: field, operator: real_operator, value: convert_value(value) }
293
+ symbolized_operator = ensure_symbol_and_validate_operator(operator)
294
+
295
+ subquery = { field: field, operator: symbolized_operator, value: convert_value(value) }
284
296
  if boost.present?
285
297
  valid_boost_operators = [:contains, :contains_prefix]
286
- if valid_boost_operators.include?(operator.to_sym)
298
+ if valid_boost_operators.include?(symbolized_operator)
287
299
  subquery[:boost] = boost
288
300
  else
289
301
  raise "Boost is not allowed with operator '#{operator}'. " +
@@ -315,8 +327,9 @@ module Scrivito
315
327
  if INVALID_NEGATED_OPERATORS.include?(operator.to_sym)
316
328
  raise "Negating operator '#{operator}' is not valid."
317
329
  end
318
- real_operator = operator_mapping(operator)
319
- subquery = { field: field, operator: real_operator, value: convert_value(value),
330
+ symbolized_operator = ensure_symbol_and_validate_operator(operator)
331
+
332
+ subquery = { field: field, operator: symbolized_operator, value: convert_value(value),
320
333
  negate: true }
321
334
  reset_for_changed_query
322
335
  @query = (query || []) + [subquery]
@@ -657,27 +670,14 @@ module Scrivito
657
670
  end
658
671
  end
659
672
 
660
- def operator_mapping(operator)
661
- case operator.to_sym
662
- when :contains
663
- :search
664
- when :contains_prefix
665
- :prefix_search
666
- when :equals
667
- :equal
668
- when :starts_with
669
- :prefix
670
- when :is_greater_than
671
- :greater_than
672
- when :is_less_than
673
- :less_than
674
- when :links_to
675
- :links_to
676
- when :refers_to
677
- :refers_to
678
- else
673
+ def ensure_symbol_and_validate_operator(operator)
674
+ symbolized_operator = operator.to_sym
675
+
676
+ unless OPERATOR_WHITELIST.include?(symbolized_operator)
679
677
  raise "Operator '#{operator}' is not valid!"
680
678
  end
679
+
680
+ symbolized_operator
681
681
  end
682
682
 
683
683
  def search_dsl_params
@@ -2,21 +2,17 @@ module Scrivito
2
2
  module RequestHomepage
3
3
  HOMEPAGE_ENV_KEY = "SCRIVITO_HOMEPAGE"
4
4
 
5
- class << self
6
- def call(env)
7
- env[HOMEPAGE_ENV_KEY] ||= fetch_homepage(env)
8
- end
9
-
10
- private
5
+ def self.call(env)
6
+ env[HOMEPAGE_ENV_KEY] ||= fetch_homepage(env)
7
+ end
11
8
 
12
- def fetch_homepage(env)
13
- callback_result = Scrivito::Configuration.choose_homepage_callback.call(env)
14
- if callback_result.is_a?(Obj)
15
- callback_result
16
- else
17
- raise "choose_homepage callback did not return an Obj. "\
18
- "Instead saw #{callback_result.class}."
19
- end
9
+ private_class_method def self.fetch_homepage(env)
10
+ callback_result = Scrivito::Configuration.choose_homepage_callback.call(env)
11
+ if callback_result.is_a?(Scrivito::BasicObj)
12
+ callback_result
13
+ else
14
+ raise "choose_homepage callback did not return an Obj. "\
15
+ "Instead saw #{callback_result.class}."
20
16
  end
21
17
  end
22
18
  end
@@ -2,47 +2,43 @@ module Scrivito
2
2
 
3
3
  class Route
4
4
 
5
- class << self
6
- VALID_ROUTE_NAMES = %i(homepage slug_id permalink).freeze
5
+ VALID_ROUTE_NAMES = %i(homepage slug_id permalink).freeze
7
6
 
8
- def register(route_set, name)
9
- assert_valid_route_name(name)
10
- registry(route_set)[name] = new(name)
11
- end
7
+ def self.register(route_set, name)
8
+ assert_valid_route_name(name)
9
+ registry(route_set)[name] = new(name)
10
+ end
12
11
 
13
- def find(given_context, name)
14
- available_contexts(given_context).each do |context|
15
- route = registry(context._routes)[name]
12
+ def self.find(given_context, name)
13
+ available_contexts(given_context).each do |context|
14
+ route = registry(context._routes)[name]
16
15
 
17
- if route && route.defined_in?(context)
18
- return route.apply_to(context)
19
- end
16
+ if route && route.defined_in?(context)
17
+ return route.apply_to(context)
20
18
  end
21
-
22
- nil
23
19
  end
24
20
 
25
- private
21
+ nil
22
+ end
26
23
 
27
- def registry(route_set)
28
- @registry ||= {}
29
- @registry[route_set] ||= {}
30
- end
24
+ private_class_method def self.registry(route_set)
25
+ @registry ||= {}
26
+ @registry[route_set] ||= {}
27
+ end
31
28
 
32
- def assert_valid_route_name(name)
33
- unless VALID_ROUTE_NAMES.include?(name)
34
- valid_values = VALID_ROUTE_NAMES.join(', ')
35
- raise ScrivitoError,
36
- %("#{name}" is not a valid scrivito route name. Valid values are: #{valid_values}.)
37
- end
29
+ private_class_method def self.assert_valid_route_name(name)
30
+ unless VALID_ROUTE_NAMES.include?(name)
31
+ valid_values = VALID_ROUTE_NAMES.join(', ')
32
+ raise ScrivitoError,
33
+ %("#{name}" is not a valid scrivito route name. Valid values are: #{valid_values}.)
38
34
  end
35
+ end
39
36
 
40
- def available_contexts(context)
41
- [
42
- context,
43
- context.try(:main_app)
44
- ].compact
45
- end
37
+ private_class_method def self.available_contexts(context)
38
+ [
39
+ context,
40
+ context.try(:main_app)
41
+ ].compact
46
42
  end
47
43
 
48
44
  def initialize(name)