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.
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Jahuty
4
+ module Service
5
+ # Provides common logic to services.
6
+ class Base
7
+ def initialize(client:)
8
+ @client = client
9
+ end
10
+ end
11
+ end
12
+ end
@@ -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
@@ -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
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Jahuty
2
- VERSION = "2.1.0"
4
+ VERSION = '3.2.1'
3
5
  end
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.0
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: 2020-07-28 00:00:00.000000000 Z
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/data/problem.rb
88
- - lib/jahuty/data/render.rb
89
- - lib/jahuty/exception/not_ok.rb
90
- - lib/jahuty/service/connect.rb
91
- - lib/jahuty/service/render.rb
92
- - lib/jahuty/snippet.rb
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://github.com/jahuty/jahuty-ruby
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: '0'
234
+ version: '2.6'
107
235
  required_rubygems_version: !ruby/object:Gem::Requirement
108
236
  requirements:
109
237
  - - ">="
@@ -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
@@ -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
@@ -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