redis_snippets 1.0.0 → 1.0.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a32461d6ee5259748fc6537e758b48225976155e8cdc44ebf9ec17f3d93b804f
4
- data.tar.gz: 590fc3a6e3b3e0bdc3ffad2af93365acac6c52df011073f41df3f3fdb14ecc17
3
+ metadata.gz: 717ab9484b932c8a8e7fa6aa05e58ef380f3ddd9468068903ea297b4590397eb
4
+ data.tar.gz: badd68f7355ebe589110d770e45117f03784f5d65ef2d678eac615db7ce3586d
5
5
  SHA512:
6
- metadata.gz: b4819ebdecad814ba7af40a2ede613e6a7b828b967a59a8fada4e0ac372291822a4e7c3ec3b5d82ebbf4d2e2bbafc4f6e1b4495b834eb5848eb1644e3457d6d7
7
- data.tar.gz: ad2259a91847730a1344ed181269543eb348fbd67fad5d19154f93274e0c8b20718991676f6127b64c20064c006ea68ed23cdccda21729165b093768d8e1bcd8
6
+ metadata.gz: 01266e1500a427aa626d5d3bfc0d9d5ec30d21f0454add4dec24c1a3cc1d0ac660cf7864a20fc91591f795b1b946244689aa757cccde50d49f464dddee14c354
7
+ data.tar.gz: 72df68e6b25ad50e25b26679086d5fe0b2802168a167046b2eec92ed99b878e265b09ffb29f0bb5a05eb55fa6298a0d5eed862ab6e7b09f58a9246be77dec550
data/README.md CHANGED
@@ -64,13 +64,55 @@ delivery or perhaps A/B testing 🤷‍♂.
64
64
 
65
65
  ## Multi Site
66
66
 
67
- If you're using one app to serve multiple sites a little more configuration is necessary.
67
+ If you're using one app to serve multiple sites a little more configuration is
68
+ necessary.
68
69
 
69
70
  ``` ruby
70
71
  Rails.application.config.redis_snippets = {
71
72
  connection: ::Redis::Namespace.new("my_namespace", redis: ::Redis.new),
72
73
  multi_site: true,
73
- keys: [:key1, :key2]
74
+ keys: [:key1, :key2],
75
+ transform: "MySnippetTransform"
76
+ }
77
+ ```
78
+
79
+ ## Transforming Snippets
80
+
81
+ Sometimes you might want to transform snippets. This happens after
82
+ randomization so you get the actual snippet content to be rendered passed to
83
+ your transform class.
84
+
85
+ The transform class must respond to .transforms? and #transform. Example:
86
+
87
+ ``` ruby
88
+ class MySnippetTransform
89
+ def initialize(content:, key:)
90
+ @content = content
91
+ @key = key
92
+ end
93
+
94
+ # Must return content.
95
+ def transform
96
+ @content.gsub("Amazon", "Etsy")
97
+ end
98
+
99
+ class << self
100
+ def transforms?(key:)
101
+ key == :advert_header
102
+ end
103
+ end
104
+ end
105
+ ```
106
+
107
+ I personally use this to insert special CSS code for AdSense. This saves me
108
+ from having to do this manually whenever I update it or add it.
109
+
110
+ ``` ruby
111
+ Rails.application.config.redis_snippets = {
112
+ connection: ::Redis::Namespace.new("my_namespace", redis: ::Redis.new),
113
+ multi_site: true,
114
+ keys: [:key1, :key2],
115
+ transform: "MySnippetTransform"
74
116
  }
75
117
  ```
76
118
 
@@ -22,9 +22,13 @@ class SnippetPresenter
22
22
  def prepare_snippet
23
23
  @snippet = ""
24
24
 
25
- if content = SnippetStoreService.send(snippet_key(@key))
26
- snippets = content.split("#{SECTION_DELIMITER}")
27
- @snippet = random_snippet(content)
25
+ return unless content = SnippetStoreService.send(snippet_key(@key))
26
+
27
+ snippets = content.split("#{SECTION_DELIMITER}")
28
+ @snippet = random_snippet(content)
29
+
30
+ if transform_class && transform_class.transforms?(key: @key)
31
+ @snippet = transform_class.new(content: @snippet, key: @key).transform
28
32
  end
29
33
  end
30
34
 
@@ -45,6 +49,15 @@ class SnippetPresenter
45
49
  end
46
50
  end
47
51
 
52
+ def transform_class
53
+ @klass ||=
54
+ if RedisSnippets::Engine.config.redis_snippets[:transform].is_a?(Proc)
55
+ klass = RedisSnippets::Engine.config.redis_snippets[:transform].call and klass.constantize
56
+ else
57
+ RedisSnippets::Engine.config.redis_snippets[:transform] and RedisSnippets::Engine.config.redis_snippets[:transform].constantize
58
+ end
59
+ end
60
+
48
61
  class << self
49
62
  def random_snippet(content)
50
63
  snippets = content.split("#{SECTION_DELIMITER}").map { |section| section.gsub(/^\n/, "") }
@@ -1,3 +1,3 @@
1
1
  module RedisSnippets
2
- VERSION = '1.0.0'
2
+ VERSION = '1.0.1'
3
3
  end
@@ -0,0 +1,45 @@
1
+ require 'rails_helper'
2
+
3
+ class Transformer
4
+ def initialize(content:, key:)
5
+ @content = content
6
+ @key = key
7
+ end
8
+
9
+ # Must return content.
10
+ def transform
11
+ @content.gsub("Amazon", "Etsy")
12
+ end
13
+
14
+ class << self
15
+ def transforms?(key:)
16
+ key == :advert_header
17
+ end
18
+ end
19
+ end
20
+
21
+ describe SnippetPresenter do
22
+ describe "with a transform class" do
23
+ let(:code) { "<p>Buy this from Amazon.</p>" }
24
+ let(:view) { ActionController::Base.new.view_context }
25
+
26
+ subject(:header_presenter) { described_class.new(view: view, key: :advert_header) }
27
+ subject(:footer_presenter) { described_class.new(view: view, key: :advert_footer) }
28
+
29
+ describe "#call" do
30
+ before do
31
+ ENV["TRANSFORM"] = "1"
32
+ SnippetStoreService.update(snippet_key(:advert_header), code)
33
+ SnippetStoreService.update(snippet_key(:advert_footer), code)
34
+ end
35
+
36
+ it "transforms the content" do
37
+ expect(header_presenter.call).to eq("<div class=\"snippet advert_header\"><p>Buy this from Etsy.</p></div>")
38
+ end
39
+
40
+ it "does not transform the content if key is not allowed" do
41
+ expect(footer_presenter.call).to eq("<div class=\"snippet advert_footer\"><p>Buy this from Amazon.</p></div>")
42
+ end
43
+ end
44
+ end
45
+ end
@@ -13,7 +13,8 @@ Rails.application.config.redis_snippets = {
13
13
  keys: [
14
14
  :advert_header,
15
15
  :advert_footer
16
- ]
16
+ ],
17
+ transform: -> { ENV['TRANSFORM'] ? "Transformer" : nil }
17
18
  }
18
19
 
19
20
  RSpec.configure do |config|
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redis_snippets
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Martin Moen Wulffeld
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-10-19 00:00:00.000000000 Z
11
+ date: 2019-11-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -108,6 +108,7 @@ files:
108
108
  - redis_snippets.gemspec
109
109
  - spec/app/helpers/redis_snippets/snippets_helper_spec.rb
110
110
  - spec/app/presenters/snippet_presenter_spec.rb
111
+ - spec/app/presenters/snippet_presenter_transform_spec.rb
111
112
  - spec/app/services/snippet_store_service_spec.rb
112
113
  - spec/dummy/.ruby-version
113
114
  - spec/dummy/Rakefile
@@ -162,13 +163,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
162
163
  - !ruby/object:Gem::Version
163
164
  version: '0'
164
165
  requirements: []
165
- rubygems_version: 3.0.6
166
+ rubygems_version: 3.0.3
166
167
  signing_key:
167
168
  specification_version: 4
168
169
  summary: Storing snippets of HTML, text, etc. in Redis for use in views.
169
170
  test_files:
170
171
  - spec/app/helpers/redis_snippets/snippets_helper_spec.rb
171
172
  - spec/app/presenters/snippet_presenter_spec.rb
173
+ - spec/app/presenters/snippet_presenter_transform_spec.rb
172
174
  - spec/app/services/snippet_store_service_spec.rb
173
175
  - spec/dummy/.ruby-version
174
176
  - spec/dummy/Rakefile