scrivito_sdk 1.0.0 → 1.1.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/.yardopts +1 -0
- data/README.md +1 -1
- data/app/controllers/scrivito/legacy_redirect_controller.rb +11 -0
- data/app/controllers/scrivito/objs_controller.rb +15 -5
- data/app/controllers/scrivito/webservice_controller.rb +4 -3
- data/app/controllers/scrivito/workspaces_controller.rb +24 -29
- data/app/helpers/scrivito_helper.rb +82 -37
- data/app/views/scrivito/objs/binary_no_cache.json.jbuilder +1 -0
- data/app/views/scrivito/objs/search.json.jbuilder +5 -5
- data/app/views/scrivito/webservice/error.json.jbuilder +2 -2
- data/config/ca-bundle.crt +1 -1
- data/config/precedence_routes.rb +51 -48
- data/config/routes.rb +1 -14
- data/lib/assets/javascripts/scrivito_ui.js +2447 -266
- data/lib/assets/stylesheets/scrivito.css +1 -1
- data/lib/assets/stylesheets/scrivito_ui.css +1 -1
- data/lib/generators/scrivito/install/install_generator.rb +12 -0
- data/lib/generators/scrivito/install/templates/config/initializers/scrivito.rb +3 -0
- data/lib/scrivito/attribute_definition.rb +13 -1
- data/lib/scrivito/attribute_deserializer.rb +4 -4
- data/lib/scrivito/attribute_value_renderer.rb +79 -0
- data/lib/scrivito/backend/obj_data_cache.rb +15 -15
- data/lib/scrivito/backend/obj_data_from_rest.rb +1 -21
- data/lib/scrivito/backend/obj_query.rb +2 -2
- data/lib/scrivito/basic_obj.rb +17 -6
- data/lib/scrivito/binary.rb +13 -5
- data/lib/scrivito/cache/chainable.rb +10 -5
- data/lib/scrivito/cache/file_store.rb +4 -0
- data/lib/scrivito/cache/ram_store.rb +4 -0
- data/lib/scrivito/child_list_tag.rb +16 -14
- data/lib/scrivito/client_error.rb +10 -0
- data/lib/scrivito/cms_backend.rb +66 -291
- data/lib/scrivito/cms_data_cache.rb +7 -9
- data/lib/scrivito/cms_dispatch_controller.rb +1 -10
- data/lib/scrivito/cms_field_tag.rb +2 -1
- data/lib/scrivito/cms_rest_api.rb +2 -0
- data/lib/scrivito/cms_routing.rb +26 -22
- data/lib/scrivito/configuration.rb +38 -0
- data/lib/scrivito/connection_manager.rb +69 -0
- data/lib/scrivito/controller_actions.rb +2 -2
- data/lib/scrivito/controller_helper.rb +2 -2
- data/lib/scrivito/date_attribute.rb +4 -1
- data/lib/scrivito/deprecation.rb +5 -4
- data/lib/scrivito/editing_context.rb +2 -2
- data/lib/scrivito/errors.rb +17 -0
- data/lib/scrivito/image_tag.rb +2 -2
- data/lib/scrivito/link_parser.rb +10 -5
- data/lib/scrivito/meta_data_collection.rb +11 -0
- data/lib/scrivito/obj_collection.rb +1 -1
- data/lib/scrivito/obj_facet_value.rb +19 -7
- data/lib/scrivito/obj_params_parser.rb +43 -14
- data/lib/scrivito/obj_search_builder.rb +1 -2
- data/lib/scrivito/obj_search_enumerator/batch.rb +22 -0
- data/lib/scrivito/obj_search_enumerator/batch_iterator.rb +36 -0
- data/lib/scrivito/obj_search_enumerator/query_executor.rb +35 -0
- data/lib/scrivito/obj_search_enumerator.rb +218 -93
- data/lib/scrivito/obj_update_params_parser.rb +1 -0
- data/lib/scrivito/preset_routes.rb +25 -0
- data/lib/scrivito/revision.rb +13 -11
- data/lib/scrivito/route.rb +62 -0
- data/lib/scrivito/routing_extensions.rb +92 -0
- data/lib/scrivito/sdk_engine.rb +4 -0
- data/lib/scrivito/task.rb +77 -0
- data/lib/scrivito/type_computer.rb +3 -3
- data/lib/scrivito/ui_config.rb +4 -0
- data/lib/scrivito/user.rb +24 -18
- data/lib/scrivito/workspace/publish_checker.rb +2 -3
- data/lib/scrivito/workspace.rb +38 -6
- data/lib/scrivito/workspace_data.rb +0 -14
- metadata +14 -10
- data/lib/scrivito/content_service.rb +0 -121
- data/lib/scrivito/content_state.rb +0 -109
- data/lib/scrivito/content_state_caching.rb +0 -47
- data/lib/scrivito/content_state_visitor.rb +0 -19
- data/lib/scrivito/obj_data_from_service.rb +0 -63
- data/lib/scrivito/workspace_data_from_service.rb +0 -43
@@ -1,109 +0,0 @@
|
|
1
|
-
module Scrivito
|
2
|
-
|
3
|
-
# This class represents a single instance of a content state.
|
4
|
-
# Basically a content state has three important characteristics: cache with obj datas,
|
5
|
-
# changes representing changed objs and ways they has been changed and an ancestor content state.
|
6
|
-
class ContentState < Struct.new(:content_state_id, :changes, :changes_index, :from_content_state_id)
|
7
|
-
class << self
|
8
|
-
private :new
|
9
|
-
|
10
|
-
# Creates a new content state with given changes and ancestor (optional).
|
11
|
-
def create(attributes)
|
12
|
-
new(attributes).tap do |content_state|
|
13
|
-
content_state.index_changes!
|
14
|
-
CmsDataCache.write_content_state(content_state.content_state_id, content_state.to_hash)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
# Finds a previously saved content state.
|
19
|
-
# Returns nil if not found.
|
20
|
-
def find(content_state_id)
|
21
|
-
if content_state_data = CmsDataCache.read_content_state(content_state_id)
|
22
|
-
new(content_state_data)
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
# Fetches an existing workspace.
|
27
|
-
# If not found creates a new one and returns it.
|
28
|
-
def find_or_create(content_state_id)
|
29
|
-
find(content_state_id) || create(content_state_id: content_state_id)
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
def initialize(attributes)
|
34
|
-
super(*attributes.symbolize_keys.values_at(:content_state_id, :changes, :changes_index,
|
35
|
-
:from_content_state_id))
|
36
|
-
end
|
37
|
-
|
38
|
-
# Stores arbitrary data in cache.
|
39
|
-
# Cache key is build from given index and key.
|
40
|
-
def save_obj_data(index, key, data)
|
41
|
-
CmsDataCache.write_obj_data(content_state_id, index, key, data)
|
42
|
-
end
|
43
|
-
|
44
|
-
# Fetches previously stored arbitrary data from cache.
|
45
|
-
# Returns nil if nothing found.
|
46
|
-
# Cache key is build from given index and key.
|
47
|
-
def find_obj_data(index, key)
|
48
|
-
CmsDataCache.read_obj_data(content_state_id, index, key)
|
49
|
-
end
|
50
|
-
|
51
|
-
# Fetches and caches the ancestor.
|
52
|
-
# Returns nil if there is no ancestor.
|
53
|
-
def from_content_state
|
54
|
-
@from_content_state ||= self.class.find(from_content_state_id)
|
55
|
-
end
|
56
|
-
|
57
|
-
# Determines whether given data is still up-to-date for given index and key.
|
58
|
-
def has_changes_for?(index, key, data)
|
59
|
-
case index
|
60
|
-
when 'id'
|
61
|
-
id_index.include?(key)
|
62
|
-
when 'path'
|
63
|
-
path_index.include?(key) || data.first && id_index.include?(data.first['_id'].first)
|
64
|
-
when 'ppath'
|
65
|
-
ppath_index.include?(key) || data.find { |d| id_index.include?(d['_id'].first) }
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
# Computes for a given changes feed a set of access-efficient indexes.
|
70
|
-
def index_changes!
|
71
|
-
id_index, path_index, ppath_index = Set.new, Set.new, Set.new
|
72
|
-
if changes.present?
|
73
|
-
changes.each do |hash|
|
74
|
-
id_index.add(hash['id'])
|
75
|
-
if path = hash['modified_path']
|
76
|
-
path_index.add(path)
|
77
|
-
ppath_index.add(ParentPath.of(path)) if path != '/'
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
81
|
-
self.changes = nil
|
82
|
-
self.changes_index = {'id' => id_index, 'path' => path_index, 'ppath' => ppath_index}
|
83
|
-
end
|
84
|
-
|
85
|
-
# Returns a hash representation of a content state for serialization purpose.
|
86
|
-
def to_hash
|
87
|
-
{
|
88
|
-
content_state_id: content_state_id,
|
89
|
-
changes_index: changes_index,
|
90
|
-
from_content_state_id: from_content_state_id
|
91
|
-
}
|
92
|
-
end
|
93
|
-
|
94
|
-
private
|
95
|
-
|
96
|
-
def id_index
|
97
|
-
@id_index ||= changes_index['id']
|
98
|
-
end
|
99
|
-
|
100
|
-
def path_index
|
101
|
-
@path_index ||= changes_index['path']
|
102
|
-
end
|
103
|
-
|
104
|
-
def ppath_index
|
105
|
-
@ppath_index ||= changes_index['ppath']
|
106
|
-
end
|
107
|
-
end
|
108
|
-
|
109
|
-
end
|
@@ -1,47 +0,0 @@
|
|
1
|
-
module Scrivito
|
2
|
-
|
3
|
-
# This module provides advances auto-invalidating caching mechanism for storing obj data.
|
4
|
-
#
|
5
|
-
# To keep it up-to-date its caches and changes should be updated periodically
|
6
|
-
# Its changes should be updated every time a new workspace data has been fetched.
|
7
|
-
# Its caches should be updated every time a new obj data has been fetched.
|
8
|
-
module ContentStateCaching
|
9
|
-
class << self
|
10
|
-
# How deep should a content state chain be inspected. Default depth is 20.
|
11
|
-
attr_accessor :cache_lookup_depth
|
12
|
-
|
13
|
-
# At which lookup depth to copy a hit found in an ancestor content state
|
14
|
-
# to the current content state's cache. Default depth is 5.
|
15
|
-
attr_accessor :cache_replication_depth
|
16
|
-
|
17
|
-
# Updates caches with data from given workspace.
|
18
|
-
# Should be called every time a new OBJ data has been fetched.
|
19
|
-
def store_obj_data(content_state, index, key, data)
|
20
|
-
content_state.save_obj_data(index, key, data) if content_state
|
21
|
-
end
|
22
|
-
|
23
|
-
# Fetches up-to-date obj data for given workspace, index and key.
|
24
|
-
# Returns nil if no up-to-date data found.
|
25
|
-
def find_obj_data(current_content_state , index, key)
|
26
|
-
if index == 'permalink'
|
27
|
-
current_content_state.find_obj_data(index, key)
|
28
|
-
else
|
29
|
-
visitor = ContentStateVisitor.new(current_content_state)
|
30
|
-
cache_lookup_depth.times do |depth|
|
31
|
-
return unless content_state = visitor.visit_next
|
32
|
-
if hit = content_state.find_obj_data(index, key)
|
33
|
-
visitor.visited_except_current.each { |cs| return if cs.has_changes_for?(index, key, hit) }
|
34
|
-
current_content_state.save_obj_data(index, key, hit) if depth >= cache_replication_depth
|
35
|
-
return hit
|
36
|
-
end
|
37
|
-
end
|
38
|
-
nil
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
self.cache_replication_depth = 5
|
44
|
-
self.cache_lookup_depth = 20
|
45
|
-
end
|
46
|
-
|
47
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
module Scrivito
|
2
|
-
class ContentStateVisitor
|
3
|
-
def initialize(start_content_state)
|
4
|
-
@next_content_state, @visited = start_content_state, []
|
5
|
-
end
|
6
|
-
|
7
|
-
def visit_next
|
8
|
-
if content_state = @next_content_state
|
9
|
-
@visited << content_state
|
10
|
-
@next_content_state = content_state.from_content_state
|
11
|
-
content_state
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
def visited_except_current
|
16
|
-
@visited[0..-2]
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
@@ -1,63 +0,0 @@
|
|
1
|
-
module Scrivito
|
2
|
-
|
3
|
-
class ObjDataFromService < ObjData
|
4
|
-
def initialize(data)
|
5
|
-
@data = data
|
6
|
-
end
|
7
|
-
|
8
|
-
def raw_value_and_type_of(attribute_name)
|
9
|
-
return [value_of_widget_pool, nil] if attribute_name == '_widget_pool'
|
10
|
-
if value_and_type = @data[attribute_name]
|
11
|
-
value, type = value_and_type
|
12
|
-
value = convert_value(value, type)
|
13
|
-
[value, type]
|
14
|
-
else
|
15
|
-
[nil, nil]
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
def convert_value(value, type)
|
20
|
-
case type
|
21
|
-
when 'html' then convert_text_links(value)
|
22
|
-
else value
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
def attribute_names
|
27
|
-
@data.keys
|
28
|
-
end
|
29
|
-
|
30
|
-
def to_h
|
31
|
-
@data.to_h
|
32
|
-
end
|
33
|
-
|
34
|
-
private
|
35
|
-
|
36
|
-
def convert_text_links(value)
|
37
|
-
text_links_conversion.convert(value)
|
38
|
-
end
|
39
|
-
|
40
|
-
def text_links_conversion
|
41
|
-
@text_links_conversion = TextLinkConversion.new(text_links_map)
|
42
|
-
end
|
43
|
-
|
44
|
-
def text_links_map
|
45
|
-
text_links = @data["_text_links"]
|
46
|
-
return nil unless text_links
|
47
|
-
|
48
|
-
text_links.first.each_with_object({}) do |link, map|
|
49
|
-
map[link["link_id"]] = TextLink.new(link)
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
def value_of_widget_pool
|
54
|
-
if widget_pool = @data['_widget_pool']
|
55
|
-
widget_pool.first.dup.tap do |hash|
|
56
|
-
hash.each_pair do |widget_id, raw_widget_data|
|
57
|
-
hash[widget_id] = self.class.new(raw_widget_data)
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
@@ -1,43 +0,0 @@
|
|
1
|
-
module Scrivito
|
2
|
-
|
3
|
-
class WorkspaceDataFromService < WorkspaceData
|
4
|
-
class << self
|
5
|
-
# Fetches a workspace data previously store in cache storage.
|
6
|
-
# Returns nil if not found.
|
7
|
-
def find_from_cache(id)
|
8
|
-
if data = CmsDataCache.read_workspace_data(id)
|
9
|
-
new(data)
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
data_attr_reader :diff
|
15
|
-
|
16
|
-
def changes
|
17
|
-
diff && diff['changes']
|
18
|
-
end
|
19
|
-
|
20
|
-
def from_content_state_id
|
21
|
-
diff && diff['from_content_state_id']
|
22
|
-
end
|
23
|
-
|
24
|
-
def to_content_state_id
|
25
|
-
diff && diff['to_content_state_id']
|
26
|
-
end
|
27
|
-
|
28
|
-
# Serializes and stores a workspace data in cache storage.
|
29
|
-
# Also creates an appropriate content state if needed.
|
30
|
-
def store_in_cache_and_create_content_state
|
31
|
-
create_content_state if content_state_id
|
32
|
-
store_in_cache
|
33
|
-
end
|
34
|
-
|
35
|
-
private
|
36
|
-
|
37
|
-
def create_content_state
|
38
|
-
ContentState.create(content_state_id: to_content_state_id, changes: changes,
|
39
|
-
from_content_state_id: from_content_state_id)
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
end # module Scrivito
|