resterl 0.1.0 → 0.1.3
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 +5 -5
- data/.ruby-version +1 -0
- data/lib/resterl/caches/cache_key_generator.rb +15 -0
- data/lib/resterl/client.rb +2 -2
- data/lib/resterl/generic_request.rb +2 -5
- data/lib/resterl/version.rb +1 -1
- data/lib/resterl.rb +1 -1
- data/resterl.gemspec +0 -1
- data/spec/lib/resterl/caches/cache_key_generator_spec.rb +77 -0
- data/spec/lib/resterl/client_spec.rb +10 -1
- metadata +11 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: b9ade8f52c4e1a0ff6e52069668fa41a3f0e573ea8ab0016115d7fd849ca1684
|
4
|
+
data.tar.gz: 07722b8b4c023e328dfc4ba313f23fdef5790df4a0f168d77d1fb82cc489c8e6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1411bfc88816e1e9e2fc551e6a119da9960a57ae2d443a39738399e4bedcd15fa21a3b59bfa825a06395a45c0602d161a3a9f45bec6f11ca19a3b66c8bfc2b37
|
7
|
+
data.tar.gz: 62d40715c602a4e425e6bc91b6c531c94b4b9dd45ad8a8ed1c15365a2c343549a5af2120ca4c52129a5eb8034e4b0411847986b721286b69a33ee2e6556caf61
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.7.6
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Resterl
|
4
|
+
module Caches
|
5
|
+
class CacheKeyGenerator
|
6
|
+
def self.generate(url, params, headers)
|
7
|
+
normalized = [url, params, headers].map do |part|
|
8
|
+
part.is_a?(Hash) ? part.sort : part
|
9
|
+
end.each_with_object(+'') { |e, acc| acc << e.inspect }
|
10
|
+
|
11
|
+
Digest::SHA1.hexdigest(normalized)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/lib/resterl/client.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'active_support/core_ext/object/blank'
|
2
|
+
require 'active_support/core_ext/hash'
|
2
3
|
|
3
4
|
module Resterl
|
4
5
|
class GenericRequest
|
@@ -29,11 +30,7 @@ module Resterl
|
|
29
30
|
end
|
30
31
|
|
31
32
|
def query_param_string
|
32
|
-
@query_param_string ||=
|
33
|
-
@query_params.collect do |key, value|
|
34
|
-
"#{URI.escape(key.to_s)}=#{URI.escape(value.to_s)}"
|
35
|
-
end.join('&')
|
36
|
-
end
|
33
|
+
@query_param_string ||= @query_params.to_query
|
37
34
|
end
|
38
35
|
|
39
36
|
def apply_basic_auth request
|
data/lib/resterl/version.rb
CHANGED
data/lib/resterl.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
require 'net/http'
|
2
2
|
require 'net/https'
|
3
|
-
require 'yajl/json_gem'
|
4
3
|
################################################################################
|
5
4
|
module Resterl
|
6
5
|
module Caches; end
|
@@ -14,6 +13,7 @@ require 'resterl/caches/redis_cache'
|
|
14
13
|
require 'resterl/caches/simple_cache'
|
15
14
|
require 'resterl/caches/rails_memcached_cache'
|
16
15
|
require 'resterl/caches/key_prefix_decorator'
|
16
|
+
require 'resterl/caches/cache_key_generator'
|
17
17
|
require 'resterl/caches/nil_cache'
|
18
18
|
|
19
19
|
require 'resterl/client'
|
data/resterl.gemspec
CHANGED
@@ -16,7 +16,6 @@ Gem::Specification.new do |s|
|
|
16
16
|
|
17
17
|
s.add_runtime_dependency 'activesupport', '>= 3.2.0'
|
18
18
|
s.add_runtime_dependency 'hashie', '~> 3.5.7'
|
19
|
-
s.add_runtime_dependency 'yajl-ruby', '~> 1.1'
|
20
19
|
s.add_development_dependency 'rspec', '~> 3.7'
|
21
20
|
s.add_development_dependency 'webmock', '~> 3.4.1'
|
22
21
|
s.add_development_dependency 'timecop', '~> 0.9.1'
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Resterl::Caches::CacheKeyGenerator do
|
4
|
+
it 'generates a stable digest for the same url' do
|
5
|
+
a = described_class.generate('http://example.com', {}, {})
|
6
|
+
b = described_class.generate('http://example.com', {}, {})
|
7
|
+
|
8
|
+
expect(a).to eq b
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'generates a stable digest with the same parameters' do
|
12
|
+
a = described_class
|
13
|
+
.generate('http://example.com', { 'foo' => 'bar' }, {})
|
14
|
+
b = described_class
|
15
|
+
.generate('http://example.com', { 'foo' => 'bar' }, {})
|
16
|
+
|
17
|
+
expect(a).to eq b
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'generates a stable digest with the same headers' do
|
21
|
+
a = described_class
|
22
|
+
.generate('http://example.com', {}, 'x-test' => '0.5')
|
23
|
+
b = described_class
|
24
|
+
.generate('http://example.com', {}, 'x-test' => '0.5')
|
25
|
+
|
26
|
+
expect(a).to eq b
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'generates a stable digest with same url, params and headers' do
|
30
|
+
a = described_class
|
31
|
+
.generate('http://example.com', { 'xy' => 'xxx' }, 'x-test' => '0.5')
|
32
|
+
b = described_class
|
33
|
+
.generate('http://example.com', { 'xy' => 'xxx' }, 'x-test' => '0.5')
|
34
|
+
|
35
|
+
expect(a).to eq b
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'generates different digest for different urls' do
|
39
|
+
a = described_class.generate('http://example.net', {}, {})
|
40
|
+
b = described_class.generate('http://example.com', {}, {})
|
41
|
+
|
42
|
+
expect(a).not_to eq b
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'generates different digest with different parameters' do
|
46
|
+
a = described_class.generate('http://example.com', { 'blib' => 'blub' }, {})
|
47
|
+
b = described_class.generate('http://example.com', { 'blib' => 'oopf' }, {})
|
48
|
+
c = described_class.generate('http://example.com', { 'oopf' => 'blip' }, {})
|
49
|
+
|
50
|
+
expect([a, b, c].uniq.length).to eq 3
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'generates different digest with different headers' do
|
54
|
+
a = described_class
|
55
|
+
.generate('http://example.com', {}, 'accept' => 'json')
|
56
|
+
b = described_class
|
57
|
+
.generate('http://example.com', {}, 'accept' => '*/*')
|
58
|
+
|
59
|
+
expect(a).not_to eq b
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'generates the same digest with url parameters and headers ' \
|
63
|
+
'in diffrent order' do
|
64
|
+
a = described_class.generate(
|
65
|
+
'http://example.com',
|
66
|
+
{ 'a' => 'aaa', 'b' => 'bbb' },
|
67
|
+
'x-aaa' => 'aaa', 'x-bbb' => 'bbb'
|
68
|
+
)
|
69
|
+
b = described_class .generate(
|
70
|
+
'http://example.com',
|
71
|
+
{ 'b' => 'bbb', 'a' => 'aaa' },
|
72
|
+
'x-bbb' => 'bbb', 'x-aaa' => 'aaa'
|
73
|
+
)
|
74
|
+
|
75
|
+
expect(a).to eq b
|
76
|
+
end
|
77
|
+
end
|
@@ -4,6 +4,8 @@ require 'webmock/rspec'
|
|
4
4
|
require 'timecop'
|
5
5
|
|
6
6
|
describe Resterl::Client do
|
7
|
+
subject(:client) { Resterl::Client.new }
|
8
|
+
|
7
9
|
describe 'minimum cache lifetime' do
|
8
10
|
before do
|
9
11
|
Timecop.freeze(Time.parse('2015-01-01 01:00'))
|
@@ -14,7 +16,6 @@ describe Resterl::Client do
|
|
14
16
|
headers: { cache_control: 'max-age=0, private, must-revalidate' }
|
15
17
|
).then.to_raise('2 requests')
|
16
18
|
end
|
17
|
-
let(:client) { Resterl::Client.new }
|
18
19
|
|
19
20
|
it 'is used in "max-age=0" case' do
|
20
21
|
response = client.get 'http://www.example.com/', {}, {}
|
@@ -31,4 +32,12 @@ describe Resterl::Client do
|
|
31
32
|
end.not_to raise_error
|
32
33
|
end
|
33
34
|
end
|
35
|
+
|
36
|
+
it 'encodes url params' do
|
37
|
+
stub_request(
|
38
|
+
:get, "http://www.example.com/?text=Ein%20gro%C3%9Fer%20Spa%C3%9F!"
|
39
|
+
).to_return(status: 200, body: '', headers: {})
|
40
|
+
|
41
|
+
client.get 'http://www.example.com/', { text: 'Ein großer Spaß!' }, {}
|
42
|
+
end
|
34
43
|
end
|
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: resterl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Florian Dütsch
|
8
8
|
- Stefan Hoffmann
|
9
|
-
autorequire:
|
9
|
+
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2022-08-29 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
@@ -39,20 +39,6 @@ dependencies:
|
|
39
39
|
- - "~>"
|
40
40
|
- !ruby/object:Gem::Version
|
41
41
|
version: 3.5.7
|
42
|
-
- !ruby/object:Gem::Dependency
|
43
|
-
name: yajl-ruby
|
44
|
-
requirement: !ruby/object:Gem::Requirement
|
45
|
-
requirements:
|
46
|
-
- - "~>"
|
47
|
-
- !ruby/object:Gem::Version
|
48
|
-
version: '1.1'
|
49
|
-
type: :runtime
|
50
|
-
prerelease: false
|
51
|
-
version_requirements: !ruby/object:Gem::Requirement
|
52
|
-
requirements:
|
53
|
-
- - "~>"
|
54
|
-
- !ruby/object:Gem::Version
|
55
|
-
version: '1.1'
|
56
42
|
- !ruby/object:Gem::Dependency
|
57
43
|
name: rspec
|
58
44
|
requirement: !ruby/object:Gem::Requirement
|
@@ -123,7 +109,7 @@ dependencies:
|
|
123
109
|
- - ">="
|
124
110
|
- !ruby/object:Gem::Version
|
125
111
|
version: '0'
|
126
|
-
description:
|
112
|
+
description:
|
127
113
|
email:
|
128
114
|
- florian.duetsch@nix-wie-weg.de
|
129
115
|
- stefan.hoffmann@nix-wie-weg.de
|
@@ -134,6 +120,7 @@ files:
|
|
134
120
|
- ".document"
|
135
121
|
- ".gitignore"
|
136
122
|
- ".rubocop.yml"
|
123
|
+
- ".ruby-version"
|
137
124
|
- Gemfile
|
138
125
|
- LICENSE
|
139
126
|
- README.rdoc
|
@@ -141,6 +128,7 @@ files:
|
|
141
128
|
- lib/resterl.rb
|
142
129
|
- lib/resterl/base_object.rb
|
143
130
|
- lib/resterl/caches/cache_interface.rb
|
131
|
+
- lib/resterl/caches/cache_key_generator.rb
|
144
132
|
- lib/resterl/caches/key_prefix_decorator.rb
|
145
133
|
- lib/resterl/caches/nil_cache.rb
|
146
134
|
- lib/resterl/caches/rails_memcached_cache.rb
|
@@ -157,12 +145,13 @@ files:
|
|
157
145
|
- lib/resterl/version.rb
|
158
146
|
- resterl.gemspec
|
159
147
|
- spec/lib/resterl/base_object_spec.rb
|
148
|
+
- spec/lib/resterl/caches/cache_key_generator_spec.rb
|
160
149
|
- spec/lib/resterl/client_spec.rb
|
161
150
|
- spec/spec_helper.rb
|
162
151
|
homepage: https://github.com/Nix-wie-weg/resterl
|
163
152
|
licenses: []
|
164
153
|
metadata: {}
|
165
|
-
post_install_message:
|
154
|
+
post_install_message:
|
166
155
|
rdoc_options: []
|
167
156
|
require_paths:
|
168
157
|
- lib
|
@@ -177,12 +166,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
177
166
|
- !ruby/object:Gem::Version
|
178
167
|
version: '0'
|
179
168
|
requirements: []
|
180
|
-
|
181
|
-
|
182
|
-
signing_key:
|
169
|
+
rubygems_version: 3.1.6
|
170
|
+
signing_key:
|
183
171
|
specification_version: 4
|
184
172
|
summary: Rudimentary HTTP client with focus on caching
|
185
173
|
test_files:
|
186
174
|
- spec/lib/resterl/base_object_spec.rb
|
175
|
+
- spec/lib/resterl/caches/cache_key_generator_spec.rb
|
187
176
|
- spec/lib/resterl/client_spec.rb
|
188
177
|
- spec/spec_helper.rb
|