editmode 1.3.3 → 1.4.0.pre.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3c2cf39ab030f4bc6d04678170c164d950a4bf947659906c6da343537f447bd4
4
- data.tar.gz: 89a6a0f4a16d51541404f1f1c0fd8ab90e0ad799b6bc176c28c48e8f653c0064
3
+ metadata.gz: 4acdedb3a0c0a95880700ee29583205d5e811546af1b641aa7eb741772dee274
4
+ data.tar.gz: b23c3944bdab82badcd992503f32da48165dca684af7a6965e58fb4445d5302f
5
5
  SHA512:
6
- metadata.gz: d3815cd743139b4fd6a354c072d9bd2c8d010c8fa4aa2a6a6e04165f363430a5689d91a1228e5e3789b8d53a9f0434c4175a525bb3d7f85c4105bcecf81d1e96
7
- data.tar.gz: fcb8a9260a0cd706ad049c2f2dfd9406c3c3bc2ac8addcb6fa74f662709d483a00e338613136959762c5f317798cde9ad9f8d48ce0077fe63cdac323ccd063d4
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("#{cache_id}*")
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("#{params[:identifier]}")
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", "&nbsp".html_safe)
190
+ content_tag("em-span", "&nbsp".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
@@ -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
- http_response = HTTParty.get(url, query: query_params, headers: {referrer: @referrer})
128
- response_received = true if http_response.code == 200
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 = http_response.try(:[], 'message') || no_response_received(identifier)
147
+ message = @response.try(:[], 'message') || no_response_received(identifier)
133
148
 
134
149
  raise message
135
150
  else
136
- Rails.cache.write(cache_identifier, http_response.to_json) if http_response.present?
151
+ Rails.cache.write(cache_identifier, @response.to_json) if @response.present?
137
152
  cached_response = Rails.cache.fetch(cache_identifier)
138
153
 
139
- @response = json?(cached_response) ? JSON.parse(cached_response) : cached_response
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']
@@ -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
 
@@ -1,3 +1,3 @@
1
1
  module Editmode
2
- VERSION = "1.3.3"
2
+ VERSION = "1.4.0.pre.1"
3
3
  end
@@ -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.3.3
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-05 00:00:00.000000000 Z
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: '0'
113
+ version: 1.3.1
113
114
  requirements: []
114
- rubygems_version: 3.2.4
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