scrivito_sdk 1.9.1 → 1.10.0.rc1
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/app/controllers/scrivito/obj_class_controller.rb +12 -3
 - data/app/controllers/scrivito/users_controller.rb +11 -0
 - data/app/helpers/scrivito_helper.rb +4 -4
 - data/config/ca-bundle.crt +1 -1
 - data/lib/assets/javascripts/scrivito.js +12 -12
 - data/lib/assets/javascripts/scrivito_ui_redirect.js +2 -2
 - data/lib/assets/javascripts/scrivito_with_js_sdk.js +20123 -19370
 - data/lib/assets/stylesheets/scrivito.css +1 -1
 - data/lib/scrivito/attribute_content.rb +25 -15
 - data/lib/scrivito/attribute_serializer.rb +3 -1
 - data/lib/scrivito/backend/obj_load.rb +1 -5
 - data/lib/scrivito/backend/obj_query.rb +2 -6
 - data/lib/scrivito/backend/parent_path_index.rb +4 -7
 - data/lib/scrivito/backend/path_index.rb +5 -8
 - data/lib/scrivito/backend/permalink_index.rb +4 -7
 - data/lib/scrivito/basic_obj.rb +70 -67
 - data/lib/scrivito/basic_widget.rb +1 -0
 - data/lib/scrivito/binary.rb +17 -2
 - data/lib/scrivito/binary_param_verifier.rb +30 -34
 - data/lib/scrivito/client_error.rb +2 -0
 - data/lib/scrivito/cms_data_cache.rb +71 -73
 - data/lib/scrivito/cms_rest_api.rb +114 -118
 - data/lib/scrivito/cms_rest_api/rate_limit.rb +21 -26
 - data/lib/scrivito/cms_routing.rb +1 -1
 - data/lib/scrivito/configuration.rb +412 -373
 - data/lib/scrivito/connection_manager.rb +42 -36
 - data/lib/scrivito/deprecation.rb +11 -15
 - data/lib/scrivito/diff.rb +6 -8
 - data/lib/scrivito/gem_info.rb +9 -6
 - data/lib/scrivito/generator_helper.rb +5 -7
 - data/lib/scrivito/migrations/cms_backend.rb +11 -8
 - data/lib/scrivito/migrations/migrator.rb +19 -21
 - data/lib/scrivito/obj_search_enumerator.rb +24 -24
 - data/lib/scrivito/request_homepage.rb +10 -14
 - data/lib/scrivito/route.rb +27 -31
 - data/lib/scrivito/sdk_engine.rb +8 -4
 - data/lib/scrivito/tag_renderer.rb +17 -23
 - data/lib/scrivito/test_request.rb +7 -9
 - data/lib/scrivito/ui_config.rb +0 -19
 - data/lib/scrivito/user.rb +89 -99
 - data/lib/scrivito/workspace.rb +12 -16
 - data/lib/scrivito/workspace_data.rb +2 -6
 - data/lib/scrivito_sdk.rb +0 -13
 - data/lib/tasks/cache.rake +2 -0
 - metadata +18 -4
 
| 
         @@ -6,54 +6,60 @@ module Scrivito 
     | 
|
| 
       6 
6 
     | 
    
         | 
| 
       7 
7 
     | 
    
         
             
                attr_reader :uri
         
     | 
| 
       8 
8 
     | 
    
         | 
| 
       9 
     | 
    
         
            -
                 
     | 
| 
       10 
     | 
    
         
            -
                   
     | 
| 
       11 
     | 
    
         
            -
                     
     | 
| 
       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 
     | 
    
         
            -
             
     | 
| 
       17 
     | 
    
         
            -
             
     | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
       19 
     | 
    
         
            -
             
     | 
| 
       20 
     | 
    
         
            -
             
     | 
| 
      
 15 
     | 
    
         
            +
                # For test purpose only.
         
     | 
| 
      
 16 
     | 
    
         
            +
                def self.clear_cache!
         
     | 
| 
      
 17 
     | 
    
         
            +
                  @connection_pools = nil
         
     | 
| 
      
 18 
     | 
    
         
            +
                  @cert_store = nil
         
     | 
| 
      
 19 
     | 
    
         
            +
                end
         
     | 
| 
       21 
20 
     | 
    
         | 
| 
       22 
     | 
    
         
            -
             
     | 
| 
       23 
     | 
    
         
            -
             
     | 
| 
       24 
     | 
    
         
            -
             
     | 
| 
       25 
     | 
    
         
            -
             
     | 
| 
       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 
     | 
    
         
            -
             
     | 
| 
       30 
     | 
    
         
            -
                   
     | 
| 
       31 
     | 
    
         
            -
             
     | 
| 
      
 28 
     | 
    
         
            +
                def self.minimum_open_timeout
         
     | 
| 
      
 29 
     | 
    
         
            +
                  @minimum_open_timeout || 0.5
         
     | 
| 
      
 30 
     | 
    
         
            +
                end
         
     | 
| 
       32 
31 
     | 
    
         | 
| 
       33 
     | 
    
         
            -
             
     | 
| 
       34 
     | 
    
         
            -
             
     | 
| 
       35 
     | 
    
         
            -
             
     | 
| 
      
 32 
     | 
    
         
            +
                def self.minimum_open_timeout=(value)
         
     | 
| 
      
 33 
     | 
    
         
            +
                  @minimum_open_timeout = value
         
     | 
| 
      
 34 
     | 
    
         
            +
                end
         
     | 
| 
       36 
35 
     | 
    
         | 
| 
       37 
     | 
    
         
            -
             
     | 
| 
       38 
     | 
    
         
            -
             
     | 
| 
       39 
     | 
    
         
            -
             
     | 
| 
      
 36 
     | 
    
         
            +
                def self.minimum_ssl_timeout
         
     | 
| 
      
 37 
     | 
    
         
            +
                  @minimum_ssl_timeout || 1.0
         
     | 
| 
      
 38 
     | 
    
         
            +
                end
         
     | 
| 
       40 
39 
     | 
    
         | 
| 
       41 
     | 
    
         
            -
             
     | 
| 
       42 
     | 
    
         
            -
             
     | 
| 
       43 
     | 
    
         
            -
             
     | 
| 
      
 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 
     | 
    
         
            -
             
     | 
| 
       46 
     | 
    
         
            -
             
     | 
| 
       47 
     | 
    
         
            -
             
     | 
| 
       48 
     | 
    
         
            -
             
     | 
| 
       49 
     | 
    
         
            -
             
     | 
| 
       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 
     | 
    
         
            -
             
     | 
| 
       55 
     | 
    
         
            -
             
     | 
| 
       56 
     | 
    
         
            -
                  end
         
     | 
| 
      
 61 
     | 
    
         
            +
                def self.connection_pools
         
     | 
| 
      
 62 
     | 
    
         
            +
                  @connection_pools ||= {}
         
     | 
| 
       57 
63 
     | 
    
         
             
                end
         
     | 
| 
       58 
64 
     | 
    
         | 
| 
       59 
65 
     | 
    
         
             
                def initialize(uri)
         
     | 
    
        data/lib/scrivito/deprecation.rb
    CHANGED
    
    | 
         @@ -1,22 +1,18 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            module Scrivito
         
     | 
| 
       2 
2 
     | 
    
         
             
              class Deprecation
         
     | 
| 
       3 
     | 
    
         
            -
                 
     | 
| 
       4 
     | 
    
         
            -
                   
     | 
| 
       5 
     | 
    
         
            -
             
     | 
| 
       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 
     | 
    
         
            -
             
     | 
| 
      
 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 
     | 
    
         
            -
             
     | 
| 
       15 
     | 
    
         
            -
             
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
       17 
     | 
    
         
            -
             
     | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
       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 
     | 
| 
      
 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 
     | 
    
         
            -
               
     | 
| 
       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 
     | 
| 
      
 119 
     | 
    
         
            +
            end
         
     | 
| 
       122 
120 
     | 
    
         | 
| 
       123 
121 
     | 
    
         
             
            end
         
     | 
    
        data/lib/scrivito/gem_info.rb
    CHANGED
    
    | 
         @@ -1,13 +1,16 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            module Scrivito
         
     | 
| 
       2 
2 
     | 
    
         
             
              module GemInfo
         
     | 
| 
       3 
     | 
    
         
            -
                class << self
         
     | 
| 
       4 
     | 
    
         
            -
                  delegate :name, :version, to: :spec
         
     | 
| 
       5 
3 
     | 
    
         | 
| 
       6 
     | 
    
         
            -
             
     | 
| 
      
 4 
     | 
    
         
            +
                def self.name
         
     | 
| 
      
 5 
     | 
    
         
            +
                  spec.name
         
     | 
| 
      
 6 
     | 
    
         
            +
                end
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
                def self.version
         
     | 
| 
      
 9 
     | 
    
         
            +
                  spec.version
         
     | 
| 
      
 10 
     | 
    
         
            +
                end
         
     | 
| 
       7 
11 
     | 
    
         | 
| 
       8 
     | 
    
         
            -
             
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
       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 
     | 
    
         
            -
               
     | 
| 
       4 
     | 
    
         
            -
                 
     | 
| 
       5 
     | 
    
         
            -
                   
     | 
| 
       6 
     | 
    
         
            -
             
     | 
| 
       7 
     | 
    
         
            -
                   
     | 
| 
       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 
     | 
    
         
            -
                     
     | 
| 
       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 
     | 
    
         
            -
                     
     | 
| 
       23 
     | 
    
         
            -
             
     | 
| 
      
 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 
     | 
    
         
            -
                   
     | 
| 
       5 
     | 
    
         
            -
                     
     | 
| 
       6 
     | 
    
         
            -
             
     | 
| 
       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 
     | 
    
         
            -
             
     | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
       19 
     | 
    
         
            -
             
     | 
| 
       20 
     | 
    
         
            -
             
     | 
| 
      
 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 
     | 
    
         
            -
             
     | 
| 
       23 
     | 
    
         
            -
             
     | 
| 
      
 13 
     | 
    
         
            +
                    migrations = files.map do |filename|
         
     | 
| 
      
 14 
     | 
    
         
            +
                      version, name, scope = filename.scan(splitter).first
         
     | 
| 
       24 
15 
     | 
    
         | 
| 
       25 
     | 
    
         
            -
             
     | 
| 
       26 
     | 
    
         
            -
                         
     | 
| 
      
 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 
     | 
    
         
            -
                       
     | 
| 
      
 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 
     | 
    
         
            -
                   
     | 
| 
       283 
     | 
    
         
            -
             
     | 
| 
      
 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?( 
     | 
| 
      
 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 
     | 
    
         
            -
                   
     | 
| 
       319 
     | 
    
         
            -
             
     | 
| 
      
 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  
     | 
| 
       661 
     | 
    
         
            -
                   
     | 
| 
       662 
     | 
    
         
            -
             
     | 
| 
       663 
     | 
    
         
            -
             
     | 
| 
       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 
     | 
    
         
            -
                 
     | 
| 
       6 
     | 
    
         
            -
                   
     | 
| 
       7 
     | 
    
         
            -
             
     | 
| 
       8 
     | 
    
         
            -
                  end
         
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
       10 
     | 
    
         
            -
                  private
         
     | 
| 
      
 5 
     | 
    
         
            +
                def self.call(env)
         
     | 
| 
      
 6 
     | 
    
         
            +
                  env[HOMEPAGE_ENV_KEY] ||= fetch_homepage(env)
         
     | 
| 
      
 7 
     | 
    
         
            +
                end
         
     | 
| 
       11 
8 
     | 
    
         | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
             
     | 
| 
       15 
     | 
    
         
            -
             
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
       17 
     | 
    
         
            -
             
     | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
       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
         
     | 
    
        data/lib/scrivito/route.rb
    CHANGED
    
    | 
         @@ -2,47 +2,43 @@ module Scrivito 
     | 
|
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            class Route
         
     | 
| 
       4 
4 
     | 
    
         | 
| 
       5 
     | 
    
         
            -
               
     | 
| 
       6 
     | 
    
         
            -
                VALID_ROUTE_NAMES = %i(homepage slug_id permalink).freeze
         
     | 
| 
      
 5 
     | 
    
         
            +
              VALID_ROUTE_NAMES = %i(homepage slug_id permalink).freeze
         
     | 
| 
       7 
6 
     | 
    
         | 
| 
       8 
     | 
    
         
            -
             
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
      
 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 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
             
     | 
| 
       15 
     | 
    
         
            -
             
     | 
| 
      
 12 
     | 
    
         
            +
              def self.find(given_context, name)
         
     | 
| 
      
 13 
     | 
    
         
            +
                available_contexts(given_context).each do |context|
         
     | 
| 
      
 14 
     | 
    
         
            +
                  route = registry(context._routes)[name]
         
     | 
| 
       16 
15 
     | 
    
         | 
| 
       17 
     | 
    
         
            -
             
     | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
       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 
     | 
    
         
            -
                 
     | 
| 
      
 21 
     | 
    
         
            +
                nil
         
     | 
| 
      
 22 
     | 
    
         
            +
              end
         
     | 
| 
       26 
23 
     | 
    
         | 
| 
       27 
     | 
    
         
            -
             
     | 
| 
       28 
     | 
    
         
            -
             
     | 
| 
       29 
     | 
    
         
            -
             
     | 
| 
       30 
     | 
    
         
            -
             
     | 
| 
      
 24 
     | 
    
         
            +
              private_class_method def self.registry(route_set)
         
     | 
| 
      
 25 
     | 
    
         
            +
                @registry ||= {}
         
     | 
| 
      
 26 
     | 
    
         
            +
                @registry[route_set] ||= {}
         
     | 
| 
      
 27 
     | 
    
         
            +
              end
         
     | 
| 
       31 
28 
     | 
    
         | 
| 
       32 
     | 
    
         
            -
             
     | 
| 
       33 
     | 
    
         
            -
             
     | 
| 
       34 
     | 
    
         
            -
             
     | 
| 
       35 
     | 
    
         
            -
             
     | 
| 
       36 
     | 
    
         
            -
             
     | 
| 
       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 
     | 
    
         
            -
             
     | 
| 
       41 
     | 
    
         
            -
             
     | 
| 
       42 
     | 
    
         
            -
             
     | 
| 
       43 
     | 
    
         
            -
             
     | 
| 
       44 
     | 
    
         
            -
             
     | 
| 
       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)
         
     |