jahuty 2.1.0 → 3.2.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/.circleci/config.yml +33 -0
- data/.rubocop.yml +23 -0
- data/CHANGELOG.md +29 -0
- data/Gemfile +3 -1
- data/README.md +176 -39
- data/Rakefile +11 -3
- data/bin/console +4 -3
- data/bin/setup +2 -0
- data/jahuty.gemspec +33 -16
- data/lib/jahuty.rb +25 -15
- data/lib/jahuty/action/base.rb +15 -0
- data/lib/jahuty/action/index.rb +9 -0
- data/lib/jahuty/action/show.rb +16 -0
- data/lib/jahuty/api/client.rb +38 -0
- data/lib/jahuty/cache/facade.rb +46 -0
- data/lib/jahuty/client.rb +51 -0
- data/lib/jahuty/exception/{not_ok.rb → error.rb} +6 -1
- data/lib/jahuty/request/base.rb +16 -0
- data/lib/jahuty/request/factory.rb +29 -0
- data/lib/jahuty/resource/factory.rb +27 -0
- data/lib/jahuty/resource/problem.rb +25 -0
- data/lib/jahuty/resource/render.rb +26 -0
- data/lib/jahuty/response/handler.rb +60 -0
- data/lib/jahuty/service/base.rb +12 -0
- data/lib/jahuty/service/snippet.rb +97 -0
- data/lib/jahuty/util.rb +25 -0
- data/lib/jahuty/version.rb +3 -1
- metadata +140 -12
- data/lib/jahuty/data/problem.rb +0 -21
- data/lib/jahuty/data/render.rb +0 -21
- data/lib/jahuty/service/connect.rb +0 -23
- data/lib/jahuty/service/render.rb +0 -25
- data/lib/jahuty/snippet.rb +0 -15
@@ -0,0 +1,97 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Jahuty
|
4
|
+
module Service
|
5
|
+
# A service for interacting with snippets.
|
6
|
+
class Snippet < Base
|
7
|
+
def initialize(client:, cache:, expires_in: nil)
|
8
|
+
super(client: client)
|
9
|
+
|
10
|
+
@cache = cache
|
11
|
+
@expires_in = expires_in
|
12
|
+
end
|
13
|
+
|
14
|
+
def all_renders(tag, params: {}, expires_in: nil)
|
15
|
+
renders = index_renders tag: tag, params: params
|
16
|
+
|
17
|
+
cache_renders renders: renders, params: params, expires_in: expires_in
|
18
|
+
|
19
|
+
renders
|
20
|
+
end
|
21
|
+
|
22
|
+
def render(snippet_id, params: {}, expires_in: nil)
|
23
|
+
expires_in ||= @expires_in
|
24
|
+
|
25
|
+
key = cache_key snippet_id: snippet_id, params: params
|
26
|
+
|
27
|
+
render = @cache.read(key)
|
28
|
+
|
29
|
+
@cache.delete key unless render.nil? || cacheable?(expires_in)
|
30
|
+
|
31
|
+
if render.nil?
|
32
|
+
render = show_render snippet_id: snippet_id, params: params
|
33
|
+
|
34
|
+
@cache.write key, render, expires_in: expires_in if cacheable?(expires_in)
|
35
|
+
end
|
36
|
+
|
37
|
+
render
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def cache_key(snippet_id:, params: {})
|
43
|
+
fingerprint = Digest::MD5.new
|
44
|
+
fingerprint << "snippets/#{snippet_id}/render/"
|
45
|
+
fingerprint << params.to_json
|
46
|
+
|
47
|
+
"jahuty_#{fingerprint.hexdigest}"
|
48
|
+
end
|
49
|
+
|
50
|
+
def cache_renders(renders:, params:, expires_in: nil)
|
51
|
+
expires_in ||= @expires_in
|
52
|
+
|
53
|
+
return unless cacheable?(expires_in)
|
54
|
+
|
55
|
+
global_params = params['*'] || {}
|
56
|
+
|
57
|
+
renders.each do |render|
|
58
|
+
local_params = params[render.snippet_id.to_s] || {}
|
59
|
+
render_params = ::Jahuty::Util.deep_merge global_params, local_params
|
60
|
+
|
61
|
+
key = cache_key snippet_id: render.snippet_id, params: render_params
|
62
|
+
|
63
|
+
@cache.write key, render, expires_in: expires_in
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def cacheable?(expires_in)
|
68
|
+
expires_in.nil? || expires_in.positive?
|
69
|
+
end
|
70
|
+
|
71
|
+
def index_renders(tag:, params: {})
|
72
|
+
request_params = { tag: tag }
|
73
|
+
request_params[:params] = params.to_json unless params.empty?
|
74
|
+
|
75
|
+
action = ::Jahuty::Action::Index.new(
|
76
|
+
resource: 'render',
|
77
|
+
params: request_params
|
78
|
+
)
|
79
|
+
|
80
|
+
@client.request action
|
81
|
+
end
|
82
|
+
|
83
|
+
def show_render(snippet_id:, params: {})
|
84
|
+
request_params = {}
|
85
|
+
request_params[:params] = params.to_json unless params.empty?
|
86
|
+
|
87
|
+
action = ::Jahuty::Action::Show.new(
|
88
|
+
id: snippet_id,
|
89
|
+
resource: 'render',
|
90
|
+
params: request_params
|
91
|
+
)
|
92
|
+
|
93
|
+
@client.request action
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
data/lib/jahuty/util.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Jahuty
|
4
|
+
# Utility methods.
|
5
|
+
class Util
|
6
|
+
# Deeply merges two hashes like Rails.
|
7
|
+
#
|
8
|
+
# Ideally, the API and this library could use the same method to merge
|
9
|
+
# parameters. This library's method just needs to be deterministic and not
|
10
|
+
# collide distinct combinations.
|
11
|
+
#
|
12
|
+
# @see https://github.com/rails/rails/blob/main/activesupport/lib/active_support/core_ext/hash/deep_merge.rb
|
13
|
+
def self.deep_merge(first_hash, other_hash, &block)
|
14
|
+
first_hash.merge!(other_hash) do |key, first_val, other_val|
|
15
|
+
if first_val.is_a?(Hash) && other_val.is_a?(Hash)
|
16
|
+
deep_merge(first_val, other_val, &block)
|
17
|
+
elsif block
|
18
|
+
yield(key, first_val, other_val)
|
19
|
+
else
|
20
|
+
other_val
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/jahuty/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jahuty
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.1
|
4
|
+
version: 3.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jack Clayton
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-03-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: mini_cache
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.1'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.1'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: bundler
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -66,6 +80,104 @@ dependencies:
|
|
66
80
|
- - "~>"
|
67
81
|
- !ruby/object:Gem::Version
|
68
82
|
version: '3.0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rspec_junit_formatter
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0.4'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0.4'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rubocop
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '1.7'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '1.7'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: rubocop-performance
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '1.9'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '1.9'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: rubocop-rspec
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '2.1'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "~>"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '2.1'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: simplecov
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - "~>"
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0.20'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - "~>"
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0.20'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: simplecov-cobertura
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - "~>"
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '1.4'
|
160
|
+
type: :development
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - "~>"
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '1.4'
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: webmock
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - "~>"
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '3.11'
|
174
|
+
type: :development
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - "~>"
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: '3.11'
|
69
181
|
description: Turn any page into a content-managed page.
|
70
182
|
email:
|
71
183
|
- jack@jahuty.com
|
@@ -73,8 +185,10 @@ executables: []
|
|
73
185
|
extensions: []
|
74
186
|
extra_rdoc_files: []
|
75
187
|
files:
|
188
|
+
- ".circleci/config.yml"
|
76
189
|
- ".gitignore"
|
77
190
|
- ".rspec"
|
191
|
+
- ".rubocop.yml"
|
78
192
|
- CHANGELOG.md
|
79
193
|
- Gemfile
|
80
194
|
- LICENSE
|
@@ -84,26 +198,40 @@ files:
|
|
84
198
|
- bin/setup
|
85
199
|
- jahuty.gemspec
|
86
200
|
- lib/jahuty.rb
|
87
|
-
- lib/jahuty/
|
88
|
-
- lib/jahuty/
|
89
|
-
- lib/jahuty/
|
90
|
-
- lib/jahuty/
|
91
|
-
- lib/jahuty/
|
92
|
-
- lib/jahuty/
|
201
|
+
- lib/jahuty/action/base.rb
|
202
|
+
- lib/jahuty/action/index.rb
|
203
|
+
- lib/jahuty/action/show.rb
|
204
|
+
- lib/jahuty/api/client.rb
|
205
|
+
- lib/jahuty/cache/facade.rb
|
206
|
+
- lib/jahuty/client.rb
|
207
|
+
- lib/jahuty/exception/error.rb
|
208
|
+
- lib/jahuty/request/base.rb
|
209
|
+
- lib/jahuty/request/factory.rb
|
210
|
+
- lib/jahuty/resource/factory.rb
|
211
|
+
- lib/jahuty/resource/problem.rb
|
212
|
+
- lib/jahuty/resource/render.rb
|
213
|
+
- lib/jahuty/response/handler.rb
|
214
|
+
- lib/jahuty/service/base.rb
|
215
|
+
- lib/jahuty/service/snippet.rb
|
216
|
+
- lib/jahuty/util.rb
|
93
217
|
- lib/jahuty/version.rb
|
94
|
-
homepage: https://
|
218
|
+
homepage: https://www.jahuty.com
|
95
219
|
licenses:
|
96
220
|
- MIT
|
97
|
-
metadata:
|
221
|
+
metadata:
|
222
|
+
allowed_push_host: https://rubygems.org
|
223
|
+
homepage_uri: https://www.jahuty.com
|
224
|
+
source_code_uri: https://github.com/jahuty/jahuty-ruby
|
225
|
+
changelog_uri: https://github.com/jahuty/jahuty-ruby/blob/master/CHANGELOG.md
|
98
226
|
post_install_message:
|
99
227
|
rdoc_options: []
|
100
228
|
require_paths:
|
101
229
|
- lib
|
102
230
|
required_ruby_version: !ruby/object:Gem::Requirement
|
103
231
|
requirements:
|
104
|
-
- - "
|
232
|
+
- - "~>"
|
105
233
|
- !ruby/object:Gem::Version
|
106
|
-
version: '
|
234
|
+
version: '2.6'
|
107
235
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
108
236
|
requirements:
|
109
237
|
- - ">="
|
data/lib/jahuty/data/problem.rb
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
module Jahuty
|
2
|
-
module Data
|
3
|
-
class Problem
|
4
|
-
attr_accessor :status, :type, :detail
|
5
|
-
|
6
|
-
def initialize(status, type, detail)
|
7
|
-
@status = status
|
8
|
-
@type = type
|
9
|
-
@detail = detail
|
10
|
-
end
|
11
|
-
|
12
|
-
def self.from(data)
|
13
|
-
raise ArgumentError.new "Key :status does not exist" if !data.key?(:status)
|
14
|
-
raise ArgumentError.new "Key :type does not exist" if !data.key?(:type)
|
15
|
-
raise ArgumentError.new "Key :detail does not exist" if !data.key?(:detail)
|
16
|
-
|
17
|
-
Problem.new(data[:status], data[:type], data[:detail])
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
data/lib/jahuty/data/render.rb
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
module Jahuty
|
2
|
-
module Data
|
3
|
-
class Render
|
4
|
-
attr_accessor :content
|
5
|
-
|
6
|
-
def initialize(content)
|
7
|
-
@content = content
|
8
|
-
end
|
9
|
-
|
10
|
-
def self.from(data)
|
11
|
-
raise ArgumentError.new "Key :content does not exist" if !data.key?(:content)
|
12
|
-
|
13
|
-
Render.new(data[:content])
|
14
|
-
end
|
15
|
-
|
16
|
-
def to_s
|
17
|
-
@content
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
@@ -1,23 +0,0 @@
|
|
1
|
-
require "faraday"
|
2
|
-
|
3
|
-
module Jahuty
|
4
|
-
module Service
|
5
|
-
class Connect
|
6
|
-
URL = "https://api.jahuty.com"
|
7
|
-
|
8
|
-
HEADERS = {
|
9
|
-
"Accept": "application/json;q=0.9,*/*;q=0.8",
|
10
|
-
"Accept-Encoding": "gzip, deflate",
|
11
|
-
"Content-Type": "application/json; charset=utf-8",
|
12
|
-
"User-Agent": "Jahuty Ruby client #{::Jahuty::VERSION}"
|
13
|
-
}
|
14
|
-
|
15
|
-
def call(key)
|
16
|
-
Faraday.new(
|
17
|
-
url: URL,
|
18
|
-
headers: {"Authorization": "Bearer #{key}"}.merge(HEADERS)
|
19
|
-
)
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
require "json"
|
2
|
-
|
3
|
-
module Jahuty
|
4
|
-
class Service::Render
|
5
|
-
@connection
|
6
|
-
|
7
|
-
def initialize(connection)
|
8
|
-
@connection = connection
|
9
|
-
end
|
10
|
-
|
11
|
-
def call(id, options = {})
|
12
|
-
settings = { params: options[:params].to_json } unless options[:params].nil?
|
13
|
-
|
14
|
-
response = @connection.get("snippets/#{id}/render", settings || {})
|
15
|
-
|
16
|
-
payload = JSON.parse(response.body, symbolize_names: true)
|
17
|
-
|
18
|
-
if response.status != 200
|
19
|
-
raise Exception::NotOk.new(Data::Problem.from(payload))
|
20
|
-
end
|
21
|
-
|
22
|
-
return Data::Render.from(payload)
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
data/lib/jahuty/snippet.rb
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
module Jahuty
|
2
|
-
class Snippet
|
3
|
-
@get
|
4
|
-
|
5
|
-
class << self
|
6
|
-
def render(id, options = {})
|
7
|
-
raise "API key not set. Did you use Jahuty.key?" unless Jahuty.key?
|
8
|
-
|
9
|
-
@get ||= Service::Render.new(Service::Connect.new.call(Jahuty.key))
|
10
|
-
|
11
|
-
@get.call(id, options)
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|