editmode 1.3.3 → 1.4.0.pre.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +16 -0
- data/app/controllers/editmode_controller.rb +2 -2
- data/lib/editmode.rb +30 -1
- data/lib/editmode/action_view_extensions/editmode_helper.rb +3 -2
- data/lib/editmode/chunk.rb +26 -0
- data/lib/editmode/chunk_value.rb +27 -8
- data/lib/editmode/helper.rb +3 -2
- data/lib/editmode/version.rb +1 -1
- data/lib/generators/editmode/templates/editmode.rb.erb +8 -2
- metadata +9 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4acdedb3a0c0a95880700ee29583205d5e811546af1b641aa7eb741772dee274
|
4
|
+
data.tar.gz: b23c3944bdab82badcd992503f32da48165dca684af7a6965e58fb4445d5302f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 648e976a0deda3b7f0496bcb3dba5d56879d2a37486bea27353595c1a8ba7b471be6254af806cf6a024b5ac6d45c1d54f491179b7ed7b22cba1b7683c8f7b325
|
7
|
+
data.tar.gz: 8b59da953856ee72876f2eef4fb3760924f9076a4802de71ab2b10a141939feea95d083c44dc6737be7b3ee00e1c6148ecf459aa0bf20398e74f81c8f9736a87
|
data/README.md
CHANGED
@@ -107,6 +107,20 @@ e("cnk_16e04a02d577afb610ce", "Email Content", variables: variable_values)
|
|
107
107
|
| item_class | string | `optional` Class name(s) that will be added along with "chunks-collection-item--wrapper" to all collection items |
|
108
108
|
|
109
109
|
|
110
|
+
### Working with Image Transformation
|
111
|
+
Use `transformation` attribute to perform real-time image transformations to deliver perfect images to the end-users.
|
112
|
+
|
113
|
+
```ruby
|
114
|
+
# This chunk should render an image with 200 x 200 dimension
|
115
|
+
= E('id-of-some-image', transformation: "w-200 h-200")
|
116
|
+
|
117
|
+
# For image inside a collection
|
118
|
+
= c('some-collection-id') do
|
119
|
+
= F('Avatar', transformation: "w-200 h-200")
|
120
|
+
```
|
121
|
+
|
122
|
+
Please see the complete list of [transformation parameters](https://editmode.com/docs#/imagekit_properties).
|
123
|
+
|
110
124
|
## Caching
|
111
125
|
In order to keep your application speedy, Editmode minimizes the amount of network calls it makes by caching content where it can.
|
112
126
|
|
@@ -125,6 +139,8 @@ The editmode gem exposes a cache expiration endpoint in your application at `/ed
|
|
125
139
|
|
126
140
|
The cache expiration endpoint is currently **not** authenticated.
|
127
141
|
|
142
|
+
?> We are using a method called `delete_matched` to purge your caches when a content gets updated, and this method isn't supported in `memcached`. We highly recommend using `redis_store` or `file_store`.
|
143
|
+
|
128
144
|
## Disabling editmode.js auto-include
|
129
145
|
|
130
146
|
To disable automatic insertion for a particular controller or action you can:
|
@@ -6,14 +6,14 @@ class EditmodeController < ApplicationController
|
|
6
6
|
render status: 200, json: {:response => "success"}
|
7
7
|
elsif params[:collection]
|
8
8
|
cache_id = "collection_#{params[:identifier]}"
|
9
|
-
Rails.cache.delete_matched("
|
9
|
+
Rails.cache.delete_matched("*#{cache_id}*")
|
10
10
|
render status: 200, json: {:response => "success"}
|
11
11
|
elsif params[:variable_cache_project_id]
|
12
12
|
project_id = params[:variable_cache_project_id]
|
13
13
|
Rails.cache.delete("chunk_#{project_id}_variables")
|
14
14
|
render status: 200, json: {:response => "success"}
|
15
15
|
elsif params[:identifier]
|
16
|
-
Rails.cache.delete_matched("
|
16
|
+
Rails.cache.delete_matched("*#{params[:identifier]}*")
|
17
17
|
render status: 200, json: {:response => "success"}
|
18
18
|
else
|
19
19
|
render status: 404, json: {:response => "no identifier specified"}
|
data/lib/editmode.rb
CHANGED
@@ -8,11 +8,17 @@ require 'editmode/railtie' if defined? Rails
|
|
8
8
|
require 'editmode/engine' if defined?(Rails)
|
9
9
|
require 'editmode/monkey_patches'
|
10
10
|
require 'editmode/logger'
|
11
|
+
require 'editmode/chunk'
|
12
|
+
|
11
13
|
module Editmode
|
12
14
|
class << self
|
13
15
|
include Editmode::ActionViewExtensions::EditmodeHelper
|
14
16
|
include Editmode::Helper
|
15
17
|
|
18
|
+
def api_root_url
|
19
|
+
ENV["EDITMODE_OVERRIDE_API_URL"] || "https://api.editmode.com"
|
20
|
+
end
|
21
|
+
|
16
22
|
def project_id=(id)
|
17
23
|
config.project_id = id
|
18
24
|
end
|
@@ -52,11 +58,30 @@ module Editmode
|
|
52
58
|
puts er
|
53
59
|
end
|
54
60
|
end
|
61
|
+
|
62
|
+
def cache_all!(chunks)
|
63
|
+
chunks.each do |chunk|
|
64
|
+
project_id = chunk["project_id"]
|
65
|
+
identifier = chunk["identifier"]
|
66
|
+
content_key = chunk["content_key"]
|
67
|
+
json_data = chunk.to_json
|
68
|
+
Rails.cache.write("chunk_#{project_id}#{identifier}", json_data)
|
69
|
+
Rails.cache.write("chunk_#{project_id}#{content_key}", json_data) if content_key.present?
|
70
|
+
end
|
71
|
+
end
|
55
72
|
end
|
56
73
|
|
57
74
|
class Configuration
|
58
75
|
attr_accessor :access_token, :variable
|
59
|
-
attr_reader :project_id, :log_level
|
76
|
+
attr_reader :project_id, :log_level, :preload
|
77
|
+
|
78
|
+
def preload=(bool)
|
79
|
+
@preload = bool
|
80
|
+
if bool
|
81
|
+
chunks = Editmode::Chunk.retrieve
|
82
|
+
Editmode.cache_all!(chunks)
|
83
|
+
end
|
84
|
+
end
|
60
85
|
|
61
86
|
def logger
|
62
87
|
@logger ||= Editmode::Logger.new
|
@@ -64,6 +89,10 @@ module Editmode
|
|
64
89
|
|
65
90
|
def project_id=(id)
|
66
91
|
@project_id = id
|
92
|
+
if preload
|
93
|
+
chunks = Editmode::Chunk.retrieve(id)
|
94
|
+
Editmode.cache_all!(chunks)
|
95
|
+
end
|
67
96
|
end
|
68
97
|
|
69
98
|
def log_level=(level)
|
@@ -163,7 +163,7 @@ module Editmode
|
|
163
163
|
# prevent the page from loading.
|
164
164
|
begin
|
165
165
|
field = options[:field].presence || ""
|
166
|
-
options[:referrer] = request.url
|
166
|
+
options[:referrer] = request.present? && request.url || ""
|
167
167
|
chunk_value = Editmode::ChunkValue.new(identifier, options)
|
168
168
|
|
169
169
|
if field.present? && chunk_value.chunk_type == 'collection_item'
|
@@ -182,11 +182,12 @@ module Editmode
|
|
182
182
|
render_chunk_content(identifier, chunk_content, chunk_type, options)
|
183
183
|
|
184
184
|
rescue => error
|
185
|
+
puts error
|
185
186
|
# Show fallback content by default
|
186
187
|
return content_tag("em-span", &block) if block_given?
|
187
188
|
# Otherwise show a span with no content to
|
188
189
|
# maintain layout
|
189
|
-
content_tag("em-span", " ".html_safe)
|
190
|
+
content_tag("em-span", " ".html_safe)
|
190
191
|
end
|
191
192
|
end
|
192
193
|
alias_method :chunk, :chunk_display
|
@@ -0,0 +1,26 @@
|
|
1
|
+
class Editmode::Chunk
|
2
|
+
def initialize
|
3
|
+
end
|
4
|
+
|
5
|
+
class << self
|
6
|
+
def retrieve(project_id = Editmode.project_id, options = {})
|
7
|
+
begin
|
8
|
+
root_url = Editmode.api_root_url
|
9
|
+
chunk_id = options[:identifier] || options[:content_key]
|
10
|
+
|
11
|
+
url = "#{root_url}/chunks/#{chunk_id}?project_id=#{project_id}"
|
12
|
+
response = HTTParty.get(url)
|
13
|
+
|
14
|
+
if chunk_id.present?
|
15
|
+
return response
|
16
|
+
else
|
17
|
+
chunks = response.try(:[], "chunks")
|
18
|
+
chunks ||= []
|
19
|
+
end
|
20
|
+
rescue => er
|
21
|
+
Rails.logger.info er
|
22
|
+
[]
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/editmode/chunk_value.rb
CHANGED
@@ -9,7 +9,7 @@ module Editmode
|
|
9
9
|
attr_accessor :identifier, :variable_values, :branch_id,
|
10
10
|
:variable_fallbacks, :chunk_type, :project_id,
|
11
11
|
:url, :collection_id, :cache_identifier,
|
12
|
-
:response
|
12
|
+
:response, :transformation
|
13
13
|
|
14
14
|
attr_writer :content
|
15
15
|
|
@@ -22,6 +22,7 @@ module Editmode
|
|
22
22
|
@raw = options[:raw].present?
|
23
23
|
@skip_sanitize = options[:dangerously_skip_sanitization]
|
24
24
|
@skip_cache = options[:skip_cache]
|
25
|
+
@transformation = options[:transformation]
|
25
26
|
|
26
27
|
@url = "#{api_root_url}/chunks/#{identifier}"
|
27
28
|
@cache_identifier = set_cache_identifier(identifier)
|
@@ -40,7 +41,7 @@ module Editmode
|
|
40
41
|
if field.present?
|
41
42
|
field_chunk = field_chunk(field)
|
42
43
|
if field_chunk.present?
|
43
|
-
result = field_chunk['content']
|
44
|
+
result = field_chunk['chunk_type'] == 'image' ? set_transformation_properties!(field_chunk['content']) : field_chunk['content']
|
44
45
|
result = variable_parse!(result, variable_fallbacks, variable_values, @raw, @skip_sanitize)
|
45
46
|
else
|
46
47
|
raise no_response_received(field)
|
@@ -73,6 +74,20 @@ module Editmode
|
|
73
74
|
end
|
74
75
|
|
75
76
|
private
|
77
|
+
def set_transformation_properties!(url)
|
78
|
+
if transformation.present? && url.present?
|
79
|
+
transformation.gsub!(" ", ",")
|
80
|
+
transformation.gsub!(/\s/, '')
|
81
|
+
|
82
|
+
uri = URI(url)
|
83
|
+
uri.query = [uri.query, "tr=#{transformation}"].compact.join("&")
|
84
|
+
|
85
|
+
url = uri.to_s
|
86
|
+
end
|
87
|
+
|
88
|
+
url
|
89
|
+
end
|
90
|
+
|
76
91
|
def allowed_tag_attributes
|
77
92
|
%w(style href title src alt width height class target)
|
78
93
|
end
|
@@ -124,26 +139,30 @@ module Editmode
|
|
124
139
|
|
125
140
|
def get_content
|
126
141
|
if !cached?
|
127
|
-
|
128
|
-
response_received = true if
|
142
|
+
@response = HTTParty.get(url, query: query_params, headers: {referrer: @referrer})
|
143
|
+
response_received = true if @response.code == 200
|
129
144
|
end
|
130
145
|
|
131
146
|
if !cached? && !response_received
|
132
|
-
message =
|
147
|
+
message = @response.try(:[], 'message') || no_response_received(identifier)
|
133
148
|
|
134
149
|
raise message
|
135
150
|
else
|
136
|
-
Rails.cache.write(cache_identifier,
|
151
|
+
Rails.cache.write(cache_identifier, @response.to_json) if @response.present?
|
137
152
|
cached_response = Rails.cache.fetch(cache_identifier)
|
138
153
|
|
139
|
-
|
154
|
+
if cached_response.present?
|
155
|
+
@response = json?(cached_response) ? JSON.parse(cached_response) : cached_response
|
156
|
+
end
|
157
|
+
|
140
158
|
set_response_attributes!
|
141
159
|
end
|
142
160
|
end
|
143
161
|
|
144
162
|
def set_response_attributes!
|
145
|
-
@content = response['content']
|
146
163
|
@chunk_type = response['chunk_type']
|
164
|
+
|
165
|
+
@content = @chunk_type == 'image' ? set_transformation_properties!(response['content']) : response['content']
|
147
166
|
@variable_fallbacks = response['variable_fallbacks'].presence || {}
|
148
167
|
@collection_id = response["collection"]["identifier"] if chunk_type == 'collection_item'
|
149
168
|
@branch_id = response['branch_id']
|
data/lib/editmode/helper.rb
CHANGED
@@ -5,7 +5,7 @@ module Editmode
|
|
5
5
|
field, options = parse_arguments(args)
|
6
6
|
begin
|
7
7
|
chunk = Editmode::ChunkValue.new(identifier, options.merge({raw: true}))
|
8
|
-
|
8
|
+
|
9
9
|
if chunk.chunk_type == 'collection_item'
|
10
10
|
chunk.field(field)
|
11
11
|
else
|
@@ -13,11 +13,12 @@ module Editmode
|
|
13
13
|
end
|
14
14
|
rescue => er
|
15
15
|
Rails.logger.info "#{er}: We can't render content for #{identifier}"
|
16
|
+
return ""
|
16
17
|
end
|
17
18
|
end
|
18
19
|
|
19
20
|
def render_custom_field_raw(label, options={})
|
20
|
-
e(@custom_field_chunk["identifier"], label, options.merge({response: @custom_field_chunk}))
|
21
|
+
e(@custom_field_chunk["identifier"], label, options.merge({response: @custom_field_chunk}))
|
21
22
|
end
|
22
23
|
alias_method :f, :render_custom_field_raw
|
23
24
|
|
data/lib/editmode/version.rb
CHANGED
@@ -1,5 +1,11 @@
|
|
1
1
|
Editmode.setup do |config|
|
2
|
-
# Replace TodoProjectId with your Editmode Project ID,
|
3
|
-
# visit https://editmode.com/projects
|
4
2
|
config.project_id = "<%= @project_id %>"
|
3
|
+
|
4
|
+
# Enables logging on every API request
|
5
|
+
# config.log_level = :silence
|
6
|
+
|
7
|
+
# Preload contents - this will take all the contents
|
8
|
+
# from the project specified in config.project_id
|
9
|
+
# and store it to your Application cache.
|
10
|
+
# config.preload = true
|
5
11
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: editmode
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.4.0.pre.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tony Ennis
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-02-
|
11
|
+
date: 2021-02-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -82,6 +82,7 @@ files:
|
|
82
82
|
- lib/editmode.rb
|
83
83
|
- lib/editmode/action_view_extensions/editmode_helper.rb
|
84
84
|
- lib/editmode/auto_include_filter.rb
|
85
|
+
- lib/editmode/chunk.rb
|
85
86
|
- lib/editmode/chunk_value.rb
|
86
87
|
- lib/editmode/engine.rb
|
87
88
|
- lib/editmode/helper.rb
|
@@ -96,7 +97,7 @@ homepage: https://github.com/tonyennis145/editmode-rails
|
|
96
97
|
licenses:
|
97
98
|
- MIT
|
98
99
|
metadata: {}
|
99
|
-
post_install_message:
|
100
|
+
post_install_message:
|
100
101
|
rdoc_options: []
|
101
102
|
require_paths:
|
102
103
|
- lib
|
@@ -107,12 +108,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
107
108
|
version: '0'
|
108
109
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
109
110
|
requirements:
|
110
|
-
- - "
|
111
|
+
- - ">"
|
111
112
|
- !ruby/object:Gem::Version
|
112
|
-
version:
|
113
|
+
version: 1.3.1
|
113
114
|
requirements: []
|
114
|
-
rubygems_version: 3.
|
115
|
-
signing_key:
|
115
|
+
rubygems_version: 3.0.3
|
116
|
+
signing_key:
|
116
117
|
specification_version: 4
|
117
118
|
summary: Editmode allows you to turn plain text in your rails app into easily inline-editable
|
118
119
|
bits of content that can be managed by anyone with no technical knowledge
|