shaf_client 0.1.1 → 0.2.0

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: 62a58d5dea41057a5152f4e366f88f2884409035aaf3dae28c0956119bcca8c5
4
- data.tar.gz: d5dc2e8dc48071545d8d4f61ca6ba2ef5e3160e0b14dfed9fa4a9473795a9967
3
+ metadata.gz: c22649fc5b9cf64045bfe2a8d00c7ee333875b908683f59371b111e23baa6e68
4
+ data.tar.gz: ea3690f1f041619f9d1f6491ac21784fdc5bf31b5ee496c80d2fe3bd3195e9b1
5
5
  SHA512:
6
- metadata.gz: b26661ac11a3181f0ce9ba65cfd78a6163dc0fed12cd767888439f2c9ab54534c4ad8ab2db542093f1fdece91e12d1147bc1a473706607b86660c89aafb27e2e
7
- data.tar.gz: 493058b76326556d3e4bf587138d772b179cbbab4b0732a3c1dacdfcab0e4bb50ca5190743cd3d14ae43106541d7779624ac741fba4588f31f28b38f4817b3b0
6
+ metadata.gz: c79cfd0da579e74134d9c01a5745f0f69b8e9dcc72532fcd88bbd3ca3c82410c48a0e61ee41923becbdcef72d67e2af551d00760be1521534494f331634f19d2
7
+ data.tar.gz: 748c0dee85126f1bda4db6bffbe338ff4b1d71ea50b02e4bb3779cd9479cc963dadeeefc62c3c5e3d09911b57d42b4cfab77de4d18416fd8194a5fedf6ea0bb6
checksums.yaml.gz.sig CHANGED
Binary file
@@ -17,11 +17,14 @@ class ShafClient
17
17
  parse
18
18
  end
19
19
 
20
- def to_s
20
+ def to_h
21
21
  attributes
22
22
  .merge(_links: transform_values_to_s(links))
23
23
  .merge(_embedded: transform_values_to_s(embedded_resources))
24
- .to_s
24
+ end
25
+
26
+ def to_s
27
+ JSON.pretty_generate(to_h)
25
28
  end
26
29
 
27
30
  def attribute(key)
@@ -48,12 +51,23 @@ class ShafClient
48
51
  links.keys
49
52
  end
50
53
 
51
- private
54
+ protected
52
55
 
53
56
  def payload
54
57
  @payload ||= {}
55
58
  end
56
59
 
60
+ def <<(other)
61
+ @payload = other.payload.dup
62
+ @attributes = other.attributes.dup
63
+ @links = other.links.dup
64
+ @curies = other.curies.dup
65
+ @embedded_resources = other.embedded_resources.dup
66
+ self
67
+ end
68
+
69
+ private
70
+
57
71
  def parse
58
72
  @attributes = payload.transform_keys(&:to_sym)
59
73
  parse_links
@@ -61,11 +75,10 @@ class ShafClient
61
75
  end
62
76
 
63
77
  def parse_links
64
- links = attributes.delete(:_links) || {}
65
78
  @links ||= {}
66
79
  @curies ||= {}
67
80
 
68
- links.each do |key, value|
81
+ (attributes.delete(:_links) || {}).each do |key, value|
69
82
  next parse_curies(value) if key == 'curies'
70
83
  @links[key.to_sym] = Link.from(value)
71
84
  end
@@ -93,11 +106,8 @@ class ShafClient
93
106
  end
94
107
 
95
108
  def method_missing(method_name, *args, &block)
96
- if attributes.key?(method_name)
97
- attribute(method_name)
98
- else
99
- super
100
- end
109
+ return super unless attributes.key?(method_name)
110
+ attribute(method_name)
101
111
  end
102
112
 
103
113
  def respond_to_missing?(method_name, include_private = false)
@@ -108,9 +118,9 @@ class ShafClient
108
118
  def transform_values_to_s(hash)
109
119
  hash.transform_values do |value|
110
120
  if value.is_a? Array
111
- value.map(&:to_s)
121
+ value.map(&:to_h)
112
122
  else
113
- value.to_s
123
+ value.to_h
114
124
  end
115
125
  end
116
126
  end
@@ -31,7 +31,21 @@ class ShafClient
31
31
  # def validate; end
32
32
 
33
33
  def submit
34
- client.send(http_method, target, @values)
34
+ client.send(http_method, target, payload: @values)
35
+ end
36
+
37
+ def reload!
38
+ self << get_form(:self, skip_cache: true)
39
+ end
40
+
41
+ protected
42
+
43
+ def <<(other)
44
+ @values = {}
45
+ other.values.each do |key, value|
46
+ @values[key] = value.dup
47
+ end
48
+ super
35
49
  end
36
50
  end
37
51
  end
@@ -32,11 +32,11 @@ class ShafClient
32
32
  end
33
33
  end
34
34
 
35
- def to_s
35
+ def to_h
36
36
  {
37
37
  href: href,
38
38
  templated: templated?
39
- }.to_s
39
+ }
40
40
  end
41
41
  end
42
42
  end
@@ -122,9 +122,11 @@ class ShafClient
122
122
  end
123
123
 
124
124
  def call(request_env)
125
- key = cache_key(request_env)
125
+ key = cache_key(request_env[:url], request_env[:request_headers])
126
126
 
127
- if request_env[:method] == :get
127
+ skip_cache = request_env[:request_headers].delete :skip_cache
128
+
129
+ if !skip_cache && request_env[:method] == :get
128
130
  cached = self.class.get(key: key)
129
131
  return Response.new(body: cached, headers: {}) if cached
130
132
  end
@@ -132,6 +134,8 @@ class ShafClient
132
134
  add_etag(request_env, key)
133
135
 
134
136
  @app.call(request_env).on_complete do |response_env|
137
+ # key might have changed in other middleware
138
+ key = cache_key(response_env[:url], request_env[:request_headers])
135
139
  add_cached_payload(response_env, key)
136
140
  cache_response(response_env, key)
137
141
  self.class.inc_request_count
@@ -139,7 +143,8 @@ class ShafClient
139
143
  end
140
144
 
141
145
  def add_etag(env, key = nil)
142
- key ||= cache_key(env)
146
+ return unless %i[get head].include? env[:method]
147
+ key ||= cache_key(env[:url], env[:request_headers])
143
148
  etag = self.class.get_etag(key: key)
144
149
  env[:request_headers]['If-None-Match'] = etag if etag
145
150
  end
@@ -162,8 +167,8 @@ class ShafClient
162
167
  )
163
168
  end
164
169
 
165
- def cache_key(env)
166
- :"#{env[:url]}.#{env[:request_headers][auth_header]}"
170
+ def cache_key(url, request_headers)
171
+ :"#{url}.#{request_headers&.dig(auth_header)}"
167
172
  end
168
173
 
169
174
  def auth_header
@@ -0,0 +1,35 @@
1
+ require 'uri'
2
+
3
+ class ShafClient
4
+ module Middleware
5
+ class Redirect
6
+
7
+ def initialize(app)
8
+ @app = app
9
+ end
10
+
11
+ def call(request_env)
12
+ @app.call(request_env).on_complete do |response_env|
13
+ status = response_env[:status]
14
+ location = response_env[:response_headers]['Location']
15
+ next unless redirect? status
16
+ next unless location
17
+ update_env(request_env, status, location)
18
+ @app.call(request_env)
19
+ end
20
+ end
21
+
22
+ def redirect?(status)
23
+ [301, 302, 303, 307, 308].include? status
24
+ end
25
+
26
+ def update_env(request_env, status, location)
27
+ if status == 303
28
+ request_env[:method] = :get
29
+ request_env[:body] = nil
30
+ end
31
+ request_env[:url] = URI(location)
32
+ end
33
+ end
34
+ end
35
+ end
@@ -3,18 +3,20 @@ require 'shaf_client/base_resource'
3
3
 
4
4
  class ShafClient
5
5
  class Resource < BaseResource
6
+ attr_reader :http_status, :headers
6
7
 
7
- def initialize(client, payload)
8
+ def initialize(client, payload, status = nil, headers = nil)
8
9
  @client = client
10
+ @http_status = status
11
+ @headers = headers
9
12
  super(payload)
10
13
  end
11
14
 
12
15
  %i[get put post delete patch get_form].each do |method|
13
- define_method(method) do |rel, payload = nil|
16
+ define_method(method) do |rel, payload = nil, **options|
14
17
  href = link(rel).href
15
18
  args = [method, href]
16
- args << payload unless method.to_s.start_with? 'get'
17
- client.send(*args)
19
+ client.send(*args, payload: payload, **options)
18
20
  end
19
21
  end
20
22
 
@@ -32,6 +34,18 @@ class ShafClient
32
34
  client.get_doc(uri)
33
35
  end
34
36
 
37
+ def reload!
38
+ self << get(:self, skip_cache: true)
39
+ end
40
+
41
+ protected
42
+
43
+ def <<(other)
44
+ @http_status = other.http_status.dup
45
+ @headers = other.headers.dup
46
+ super
47
+ end
48
+
35
49
  private
36
50
 
37
51
  attr_reader :client
data/lib/shaf_client.rb CHANGED
@@ -1,6 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'faraday'
2
4
  require 'json'
3
5
  require 'shaf_client/middleware/cache'
6
+ require 'shaf_client/middleware/redirect'
4
7
  require 'shaf_client/resource'
5
8
  require 'shaf_client/form'
6
9
 
@@ -17,29 +20,34 @@ class ShafClient
17
20
  @client = Faraday.new(url: root_uri) do |conn|
18
21
  conn.basic_auth(@user, @pass) if basic_auth?
19
22
  conn.use Middleware::Cache, auth_header: auth_header
23
+ conn.use Middleware::Redirect
20
24
  conn.adapter adapter
21
25
  end
22
26
  end
23
27
 
24
- def get_root
25
- get(@root_uri)
28
+ def get_root(**options)
29
+ get(@root_uri, **options)
26
30
  end
27
31
 
28
- def get_form(uri)
29
- response = request(method: :get, uri: uri)
30
- Form.new(self, response.body)
32
+ def get_form(uri, **options)
33
+ response = request(method: :get, uri: uri, opts: options)
34
+ Form.new(self, response.body, response.status, response.headers)
31
35
  end
32
36
 
33
- def get_doc(uri)
34
- response = request(method: :get, uri: uri)
37
+ def get_doc(uri, **options)
38
+ response = request(method: :get, uri: uri, opts: options)
35
39
  response&.body || ''
36
40
  end
37
41
 
38
42
  %i[get put post delete patch].each do |method|
39
- define_method(method) do |uri, payload = nil|
40
- with_resource do
41
- request(method: method, uri: uri, payload: payload)
42
- end
43
+ define_method(method) do |uri, payload: nil, **options|
44
+ response = request(
45
+ method: method,
46
+ uri: uri,
47
+ payload: payload,
48
+ opts: options
49
+ )
50
+ Resource.new(self, response.body, response.status, response.headers)
43
51
  end
44
52
  end
45
53
 
@@ -71,17 +79,15 @@ class ShafClient
71
79
  @user && @pass
72
80
  end
73
81
 
74
- def with_resource
75
- response = yield
76
- Resource.new(self, response.body)
77
- end
78
-
79
- def request(method:, uri:, payload: nil, headers: {})
82
+ def request(method:, uri:, payload: nil, opts: {})
80
83
  payload = JSON.generate(payload) if payload&.is_a?(Hash)
84
+ headers = @default_headers.merge(opts.fetch(:headers, {}))
85
+ headers[:skip_cache] = true if opts[:skip_cache]
86
+
81
87
  @client.send(method) do |req|
82
88
  req.url uri
83
89
  req.body = payload if payload
84
- req.headers.merge! @default_headers.merge(headers)
90
+ req.headers.merge! headers
85
91
  end
86
92
  end
87
93
  end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shaf_client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sammy Henningsson
@@ -30,7 +30,7 @@ cert_chain:
30
30
  ZMhjYR7sRczGJx+GxGU2EaR0bjRsPVlC4ywtFxoOfRG3WaJcpWGEoAoMJX6Z0bRv
31
31
  M40=
32
32
  -----END CERTIFICATE-----
33
- date: 2018-12-09 00:00:00.000000000 Z
33
+ date: 2018-12-18 00:00:00.000000000 Z
34
34
  dependencies:
35
35
  - !ruby/object:Gem::Dependency
36
36
  name: faraday
@@ -92,6 +92,7 @@ files:
92
92
  - lib/shaf_client/form.rb
93
93
  - lib/shaf_client/link.rb
94
94
  - lib/shaf_client/middleware/cache.rb
95
+ - lib/shaf_client/middleware/redirect.rb
95
96
  - lib/shaf_client/resource.rb
96
97
  homepage: https://github.com/sammyhenningsson/shaf_client
97
98
  licenses:
metadata.gz.sig CHANGED
Binary file