faraday_hal_middleware 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: a7e094397fe655ac925713ff3747b751f468b1c7581b42b08784caafe1f58790
4
- data.tar.gz: 1cc42cd8fe10bb81be514aa2a8a1a3cafad1ed7ced10a2ad0b774e721968cf2f
3
+ metadata.gz: 129ae7965c9e0d8c0e7b4e83386f4555a1b694d704b559f18e7f62e16b815851
4
+ data.tar.gz: 639ae15211c5ec76fe2e29492a7c0fc2791127eddfd65360fb9442453cd7d825
5
5
  SHA512:
6
- metadata.gz: 69362407c7e92bd6f24bd174dfc8dc3fa79a43e67f5b978618615c993497606a6d77d72de8ca9a2fa224b834dd6f5bfc8782b30b6243a641bbd147a724ffa7fc
7
- data.tar.gz: 1d50efa0d668beb116a9a891442911a2d6b132bcbe06a6140ee16d2d2604ff9375458e0debc6c55d2cac1721cc51d8828e9d638423556066e342b43ff222be9a
6
+ metadata.gz: cd2271ad2df1acec1af6c6eeaba8ba187869a4196e0bb7d3a0c1b7b44f9fd699fe73d2affc7286d136f4e933c672673b236ef5aee11d9c40910f4cd7013442d5
7
+ data.tar.gz: 85c9cac01aa86c83994a19336db03754e9530b0dbe047c2a7fa11c51c6f996ea4921fdde98c51cf2c5c44360be6be2c428c227b87ce55c4fcd01014c460ac523
@@ -0,0 +1,16 @@
1
+ name: lint
2
+ on: [push, pull_request]
3
+ jobs:
4
+ rubocop:
5
+ name: RuboCop
6
+ runs-on: ubuntu-latest
7
+ steps:
8
+ - name: Checkout
9
+ uses: actions/checkout@v3
10
+ - name: Set up Ruby
11
+ uses: ruby/setup-ruby@v1
12
+ with:
13
+ ruby-version: 2.7
14
+ bundler-cache: true
15
+ - run: bundle exec rubocop
16
+
@@ -0,0 +1,18 @@
1
+ ---
2
+ name: test
3
+ on: [push, pull_request]
4
+ jobs:
5
+ test:
6
+ runs-on: ubuntu-latest
7
+ strategy:
8
+ fail-fast: false
9
+ matrix:
10
+ ruby: [ '2.7', '3.0', '3.1', '3.2' ]
11
+ name: test (${{ matrix.ruby }})
12
+ steps:
13
+ - uses: actions/checkout@v3
14
+ - uses: ruby/setup-ruby@v1
15
+ with:
16
+ ruby-version: ${{ matrix.ruby }}
17
+ - run: bundle install --jobs=3 --retry=3 --path=vendor/bundle
18
+ - run: bundle exec rake spec
data/.rubocop.yml CHANGED
@@ -1,5 +1,10 @@
1
1
  AllCops:
2
+ NewCops: enable
2
3
  Exclude:
3
4
  - vendor/**/*
4
5
 
6
+ require:
7
+ - rubocop-rake
8
+ - rubocop-rspec
9
+
5
10
  inherit_from: .rubocop_todo.yml
data/.rubocop_todo.yml CHANGED
@@ -1,36 +1,83 @@
1
1
  # This configuration was generated by
2
2
  # `rubocop --auto-gen-config`
3
- # on 2018-01-10 10:44:07 -0500 using RuboCop version 0.52.1.
3
+ # on 2024-02-01 13:35:51 UTC using RuboCop version 1.60.2.
4
4
  # The point is for the user to remove these configuration records
5
5
  # one by one as the offenses are removed from the code base.
6
6
  # Note that changes in the inspected code, or installation of new
7
7
  # versions of RuboCop, may require this file to be generated again.
8
8
 
9
- # Offense count: 2
10
- # Configuration parameters: CountComments, ExcludedMethods.
11
- Metrics/BlockLength:
12
- Max: 72
9
+ # Offense count: 1
10
+ # Configuration parameters: Severity, Include.
11
+ # Include: **/*.gemspec
12
+ Gemspec/RequiredRubyVersion:
13
+ Exclude:
14
+ - 'faraday_hal_middleware.gemspec'
13
15
 
14
16
  # Offense count: 1
15
- # Configuration parameters: NamePrefix, NamePrefixBlacklist, NameWhitelist, MethodDefinitionMacros.
16
- # NamePrefix: is_, has_, have_
17
- # NamePrefixBlacklist: is_, has_, have_
18
- # NameWhitelist: is_a?
19
- # MethodDefinitionMacros: define_method, define_singleton_method
20
- Naming/PredicateName:
17
+ # Configuration parameters: AllowedMethods, AllowedPatterns, CountRepeatedAttributes.
18
+ Metrics/AbcSize:
19
+ Max: 21
20
+
21
+ # Offense count: 10
22
+ # Configuration parameters: Prefixes, AllowedPatterns.
23
+ # Prefixes: when, with, without
24
+ RSpec/ContextWording:
21
25
  Exclude:
22
- - 'spec/**/*'
23
- - 'lib/faraday_middleware/request/encode_hal_json.rb'
26
+ - 'spec/unit/request_spec.rb'
27
+ - 'spec/unit/response_spec.rb'
24
28
 
25
29
  # Offense count: 2
26
- Style/Documentation:
30
+ # Configuration parameters: Include, CustomTransform, IgnoreMethods, SpecSuffixOnly.
31
+ # Include: **/*_spec*rb*, **/spec/**/*
32
+ RSpec/FilePath:
27
33
  Exclude:
28
- - 'spec/**/*'
29
- - 'test/**/*'
30
- - 'lib/faraday_hal_middleware.rb'
34
+ - 'spec/unit/request_spec.rb'
35
+ - 'spec/unit/response_spec.rb'
36
+
37
+ # Offense count: 4
38
+ # Configuration parameters: .
39
+ # SupportedStyles: have_received, receive
40
+ RSpec/MessageSpies:
41
+ EnforcedStyle: receive
42
+
43
+ # Offense count: 7
44
+ RSpec/MultipleExpectations:
45
+ Max: 2
46
+
47
+ # Offense count: 4
48
+ # Configuration parameters: AllowSubject.
49
+ RSpec/MultipleMemoizedHelpers:
50
+ Max: 6
51
+
52
+ # Offense count: 2
53
+ RSpec/RepeatedExample:
54
+ Exclude:
55
+ - 'spec/unit/response_spec.rb'
56
+
57
+ # Offense count: 2
58
+ # Configuration parameters: Include, CustomTransform, IgnoreMethods, IgnoreMetadata.
59
+ # Include: **/*_spec.rb
60
+ RSpec/SpecFilePathFormat:
61
+ Exclude:
62
+ - '**/spec/routing/**/*'
63
+ - 'spec/unit/request_spec.rb'
64
+ - 'spec/unit/response_spec.rb'
65
+
66
+ # Offense count: 4
67
+ RSpec/StubbedMock:
68
+ Exclude:
69
+ - 'spec/unit/response_spec.rb'
31
70
 
32
71
  # Offense count: 1
33
- # Configuration parameters: MinBodyLength.
34
- Style/GuardClause:
72
+ # Configuration parameters: IgnoreNameless, IgnoreSymbolicNames.
73
+ RSpec/VerifiedDoubles:
35
74
  Exclude:
36
- - 'lib/faraday_middleware/request/encode_hal_json.rb'
75
+ - 'spec/unit/response_spec.rb'
76
+
77
+ # Offense count: 1
78
+ # Configuration parameters: AllowedConstants.
79
+ Style/Documentation:
80
+ Exclude:
81
+ - 'spec/**/*'
82
+ - 'test/**/*'
83
+ - 'lib/faraday/hal_json.rb'
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ ### 0.2.0 (2024/02/01)
2
+
3
+ * [#11](https://github.com/fetch/faraday_hal_middleware/pull/11): Refactor into Faraday::HalJson::Request and Response - [@dblock](https://github.com/dblock).
4
+ * [#9](https://github.com/fetch/faraday_hal_middleware/pull/9): Added support for Faraday 2, removed dependency on deprecated `faraday_hal_middleware` - [@dblock](https://github.com/dblock).
5
+
1
6
  ### 0.1.1 (2020/05/10)
2
7
 
3
8
  * [#6](https://github.com/fetch/faraday_hal_middleware/pull/6): Added CHANGELOG, CONTRIBUTING and RELEASING - [@dblock](https://github.com/dblock).
data/Gemfile CHANGED
@@ -1,10 +1,14 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source 'https://rubygems.org'
2
4
 
3
5
  gem 'json'
4
6
  gem 'rake', '>= 0.9'
5
7
 
6
8
  group :development do
7
- gem 'rubocop', '0.52.1'
9
+ gem 'rubocop', '1.60.2'
10
+ gem 'rubocop-rake'
11
+ gem 'rubocop-rspec'
8
12
  end
9
13
 
10
14
  group :test do
data/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [Faraday](https://github.com/lostisland/faraday) Middleware for JSON HAL requests and responses with `application/hal+json` content-type.
4
4
 
5
- [![Build Status](https://travis-ci.org/fetch/faraday_hal_middleware.svg?branch=master)](https://travis-ci.org/fetch/faraday_hal_middleware)
5
+ [![test](https://github.com/fetch/faraday_hal_middleware/actions/workflows/test.yml/badge.svg)](https://github.com/fetch/faraday_hal_middleware/actions/workflows/test.yml)
6
6
 
7
7
  ## Installation
8
8
 
@@ -12,9 +12,11 @@ Add this line to your application's Gemfile:
12
12
  gem 'faraday_hal_middleware'
13
13
  ```
14
14
 
15
+ Use version 0.1.1 for Faraday 1.x, and >= 0.2.0 for newer versions of Faraday.
16
+
15
17
  ## Usage
16
18
 
17
- Use `faraday_hal_middleware` in a similar way to [other Faraday middleware](https://github.com/lostisland/faraday_middleware).
19
+ Use `faraday_hal_middleware`.
18
20
 
19
21
  ```ruby
20
22
  require 'faraday_hal_middleware'
data/Rakefile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'bundler/gem_tasks'
2
4
 
3
5
  require 'rspec/core/rake_task'
@@ -1,11 +1,13 @@
1
+ # frozen_string_literal: true
1
2
 
2
- lib = File.expand_path('../lib', __FILE__)
3
+ lib = File.expand_path('lib', __dir__)
3
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'faraday_hal_middleware/version'
5
+
6
+ require 'faraday/hal_json/version'
5
7
 
6
8
  Gem::Specification.new do |spec|
7
9
  spec.name = 'faraday_hal_middleware'
8
- spec.version = FaradayHalMiddleware::VERSION
10
+ spec.version = Faraday::HalJson::VERSION
9
11
  spec.authors = ['Koen Punt']
10
12
  spec.email = ['koen@fetch.nl']
11
13
  spec.summary = 'Faraday Middleware for JSON HAL requests and responses.'
@@ -15,8 +17,8 @@ Gem::Specification.new do |spec|
15
17
 
16
18
  spec.files = `git ls-files -z`.split("\x0")
17
19
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
- spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
20
  spec.require_paths = ['lib']
20
21
 
21
- spec.add_dependency 'faraday_middleware', '>= 0.9'
22
+ spec.add_dependency 'faraday', '~> 2.0'
23
+ spec.metadata['rubygems_mfa_required'] = 'true'
22
24
  end
@@ -0,0 +1,68 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'faraday'
4
+
5
+ module Faraday
6
+ module HalJson
7
+ # Request middleware that encodes the body as JSON.
8
+ #
9
+ # Processes only requests with matching Content-type or those without a type.
10
+ # If a request doesn't have a type but has a body, it sets the Content-type
11
+ # to JSON MIME-type.
12
+ #
13
+ # Doesn't try to encode bodies that already are in string form.
14
+ class Request < Faraday::Middleware
15
+ CONTENT_TYPE = 'Content-Type'
16
+ MIME_TYPE = 'application/hal+json'
17
+
18
+ def on_request(env)
19
+ match_content_type(env) do |data|
20
+ env[:body] = encode(data)
21
+ end
22
+ end
23
+
24
+ private
25
+
26
+ def encode(data)
27
+ if options[:encoder].is_a?(Array) && options[:encoder].size >= 2
28
+ options[:encoder][0].public_send(options[:encoder][1], data)
29
+ elsif options[:encoder].respond_to?(:dump)
30
+ options[:encoder].dump(data)
31
+ else
32
+ ::JSON.generate(data)
33
+ end
34
+ end
35
+
36
+ def match_content_type(env)
37
+ return unless process_request?(env)
38
+
39
+ env[:request_headers][CONTENT_TYPE] ||= MIME_TYPE
40
+ yield env[:body] unless env[:body].respond_to?(:to_str)
41
+ end
42
+
43
+ def process_request?(env)
44
+ type = request_type(env)
45
+ body?(env) && (type.empty? || type == MIME_TYPE)
46
+ end
47
+
48
+ def body?(env)
49
+ body = env[:body]
50
+ case body
51
+ when true, false
52
+ true
53
+ when nil
54
+ # NOTE: nil can be converted to `"null"`, but this middleware doesn't process `nil` for the compatibility.
55
+ false
56
+ else
57
+ !(body.respond_to?(:to_str) && body.empty?)
58
+ end
59
+ end
60
+
61
+ def request_type(env)
62
+ type = env[:request_headers][CONTENT_TYPE].to_s
63
+ type = type.split(';', 2).first if type.index(';')
64
+ type
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Faraday
4
+ module HalJson
5
+ # JSON+HAL is just JSON
6
+ class Response < ::Faraday::Response::Json; end
7
+ end
8
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Faraday
4
+ module HalJson
5
+ VERSION = '0.2.0'
6
+ end
7
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'hal_json/version'
4
+ require_relative 'hal_json/request'
5
+ require_relative 'hal_json/response'
6
+
7
+ module Faraday
8
+ module HalJson
9
+ ::Faraday::Request.register_middleware(hal_json: ::Faraday::HalJson::Request)
10
+ ::Faraday::Response.register_middleware(hal_json: ::Faraday::HalJson::Response)
11
+ end
12
+ end
@@ -1,19 +1,4 @@
1
- require 'faraday_hal_middleware/version'
2
- require 'faraday'
3
- require 'faraday_middleware'
4
-
5
- module FaradayHalMiddleware
6
- end
7
-
8
- module FaradayMiddleware
9
- autoload :EncodeHalJson, 'faraday_middleware/request/encode_hal_json'
10
- autoload :ParseHalJson, 'faraday_middleware/response/parse_hal_json'
1
+ # frozen_string_literal: true
11
2
 
12
- if Faraday::Middleware.respond_to? :register_middleware
13
- Faraday::Request.register_middleware \
14
- hal_json: -> { EncodeHalJson }
15
-
16
- Faraday::Response.register_middleware \
17
- hal_json: -> { ParseHalJson }
18
- end
19
- end
3
+ require 'faraday'
4
+ require_relative 'faraday/hal_json'
data/spec/spec_helper.rb CHANGED
@@ -1,43 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rspec'
2
4
  require 'webmock/rspec'
3
5
  require 'faraday'
4
-
5
- module EnvCompatibility
6
- def faraday_env(env)
7
- if defined?(Faraday::Env)
8
- Faraday::Env.from(env)
9
- else
10
- env
11
- end
12
- end
13
- end
14
-
15
- module ResponseMiddlewareExampleGroup
16
- def self.included(base)
17
- base.let(:options) { {} }
18
- base.let(:headers) { {} }
19
- base.let(:middleware) do
20
- described_class.new(lambda { |env|
21
- Faraday::Response.new(env)
22
- }, options)
23
- end
24
- end
25
-
26
- def process(body, content_type = nil, options = {})
27
- env = {
28
- body: body, request: options,
29
- request_headers: Faraday::Utils::Headers.new,
30
- response_headers: Faraday::Utils::Headers.new(headers)
31
- }
32
- env[:response_headers]['content-type'] = content_type if content_type
33
- yield(env) if block_given?
34
- middleware.call(faraday_env(env))
35
- end
36
- end
6
+ require 'faraday_hal_middleware'
37
7
 
38
8
  RSpec.configure do |config|
39
- config.include EnvCompatibility
40
- config.include ResponseMiddlewareExampleGroup, type: :response
41
9
  config.expect_with :rspec do |c|
42
10
  c.syntax = :expect
43
11
  end
@@ -1,12 +1,15 @@
1
- require 'faraday_middleware/request/encode_hal_json'
1
+ # frozen_string_literal: true
2
2
 
3
- describe FaradayMiddleware::EncodeHalJson do
4
- let(:middleware) { described_class.new(->(env) { env }) }
3
+ require 'spec_helper'
4
+
5
+ # mostly https://github.com/lostisland/faraday/blob/main/spec/faraday/request/json_spec.rb
6
+ describe Faraday::HalJson::Request, type: :request do
7
+ let(:middleware) { described_class.new(->(env) { Faraday::Response.new(env) }) }
5
8
 
6
9
  def process(body, content_type = nil)
7
10
  env = { body: body, request_headers: Faraday::Utils::Headers.new }
8
11
  env[:request_headers]['content-type'] = content_type if content_type
9
- middleware.call(faraday_env(env))
12
+ middleware.call(Faraday::Env.from(env)).env
10
13
  end
11
14
 
12
15
  def result_body
@@ -0,0 +1,192 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ # copy of https://github.com/lostisland/faraday/blob/main/spec/faraday/response/json_spec.rb
6
+ describe Faraday::HalJson::Response do
7
+ let(:options) { {} }
8
+ let(:headers) { {} }
9
+ let(:middleware) do
10
+ described_class.new(lambda { |env|
11
+ Faraday::Response.new(env)
12
+ }, **options)
13
+ end
14
+
15
+ def process(body, content_type = 'application/json', options = {})
16
+ env = {
17
+ body: body, request: options,
18
+ request_headers: Faraday::Utils::Headers.new,
19
+ response_headers: Faraday::Utils::Headers.new(headers)
20
+ }
21
+ env[:response_headers]['content-type'] = content_type if content_type
22
+ yield(env) if block_given?
23
+ middleware.call(Faraday::Env.from(env))
24
+ end
25
+
26
+ context 'no type matching' do
27
+ it "doesn't change nil body" do
28
+ expect(process(nil).body).to be_nil
29
+ end
30
+
31
+ it 'nullifies empty body' do
32
+ expect(process('').body).to be_nil
33
+ end
34
+
35
+ it 'parses json body' do
36
+ response = process('{"a":1}')
37
+ expect(response.body).to eq('a' => 1)
38
+ expect(response.env[:raw_body]).to be_nil
39
+ end
40
+ end
41
+
42
+ context 'with preserving raw' do
43
+ let(:options) { { preserve_raw: true } }
44
+
45
+ it 'parses json body' do
46
+ response = process('{"a":1}')
47
+ expect(response.body).to eq('a' => 1)
48
+ expect(response.env[:raw_body]).to eq('{"a":1}')
49
+ end
50
+ end
51
+
52
+ context 'with default regexp type matching' do
53
+ it 'parses json body of correct type' do
54
+ response = process('{"a":1}', 'application/x-json')
55
+ expect(response.body).to eq('a' => 1)
56
+ end
57
+
58
+ it 'ignores json body of incorrect type' do
59
+ response = process('{"a":1}', 'text/json-xml')
60
+ expect(response.body).to eq('{"a":1}')
61
+ end
62
+ end
63
+
64
+ context 'with array type matching' do
65
+ let(:options) { { content_type: %w[a/b c/d] } }
66
+
67
+ it 'parses json body of correct type' do
68
+ expect(process('{"a":1}', 'a/b').body).to be_a(Hash)
69
+ expect(process('{"a":1}', 'c/d').body).to be_a(Hash)
70
+ end
71
+
72
+ it 'ignores json body of incorrect type' do
73
+ expect(process('{"a":1}', 'a/d').body).not_to be_a(Hash)
74
+ end
75
+ end
76
+
77
+ it 'chokes on invalid json' do
78
+ expect { process('{!') }.to raise_error(Faraday::ParsingError)
79
+ end
80
+
81
+ it 'includes the response on the ParsingError instance' do
82
+ process('{') { |env| env[:response] = Faraday::Response.new }
83
+ raise 'Parsing should have failed.'
84
+ rescue Faraday::ParsingError => e
85
+ expect(e.response).to be_a(Faraday::Response)
86
+ end
87
+
88
+ context 'HEAD responses' do
89
+ it "nullifies the body if it's only one space" do
90
+ response = process(' ')
91
+ expect(response.body).to be_nil
92
+ end
93
+
94
+ it "nullifies the body if it's two spaces" do
95
+ response = process(' ')
96
+ expect(response.body).to be_nil
97
+ end
98
+ end
99
+
100
+ context 'JSON options' do
101
+ let(:body) { '{"a": 1}' }
102
+ let(:result) { { a: 1 } }
103
+ let(:options) do
104
+ {
105
+ parser_options: {
106
+ symbolize_names: true
107
+ }
108
+ }
109
+ end
110
+
111
+ it 'passes relevant options to JSON parse' do
112
+ expect(JSON).to receive(:parse)
113
+ .with(body, options[:parser_options])
114
+ .and_return(result)
115
+
116
+ response = process(body)
117
+ expect(response.body).to eq(result)
118
+ end
119
+ end
120
+
121
+ context 'with decoder' do
122
+ let(:decoder) do
123
+ double('Decoder').tap do |e|
124
+ allow(e).to receive(:load) { |s, opts| JSON.parse(s, opts) }
125
+ end
126
+ end
127
+
128
+ let(:body) { '{"a": 1}' }
129
+ let(:result) { { a: 1 } }
130
+
131
+ context 'when decoder is passed as object' do
132
+ let(:options) do
133
+ {
134
+ parser_options: {
135
+ decoder: decoder,
136
+ option: :option_value,
137
+ symbolize_names: true
138
+ }
139
+ }
140
+ end
141
+
142
+ it 'passes relevant options to specified decoder\'s load method' do
143
+ expect(decoder).to receive(:load)
144
+ .with(body, { option: :option_value, symbolize_names: true })
145
+ .and_return(result)
146
+
147
+ response = process(body)
148
+ expect(response.body).to eq(result)
149
+ end
150
+ end
151
+
152
+ context 'when decoder is passed as an object-method pair' do
153
+ let(:options) do
154
+ {
155
+ parser_options: {
156
+ decoder: [decoder, :load],
157
+ option: :option_value,
158
+ symbolize_names: true
159
+ }
160
+ }
161
+ end
162
+
163
+ it 'passes relevant options to specified decoder\'s method' do
164
+ expect(decoder).to receive(:load)
165
+ .with(body, { option: :option_value, symbolize_names: true })
166
+ .and_return(result)
167
+
168
+ response = process(body)
169
+ expect(response.body).to eq(result)
170
+ end
171
+ end
172
+
173
+ context 'when decoder is not passed' do
174
+ let(:options) do
175
+ {
176
+ parser_options: {
177
+ symbolize_names: true
178
+ }
179
+ }
180
+ end
181
+
182
+ it 'passes relevant options to JSON parse' do
183
+ expect(JSON).to receive(:parse)
184
+ .with(body, { symbolize_names: true })
185
+ .and_return(result)
186
+
187
+ response = process(body)
188
+ expect(response.body).to eq(result)
189
+ end
190
+ end
191
+ end
192
+ end
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: faraday_hal_middleware
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
  - Koen Punt
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-05-10 00:00:00.000000000 Z
11
+ date: 2024-02-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: faraday_middleware
14
+ name: faraday
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0.9'
19
+ version: '2.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '0.9'
26
+ version: '2.0'
27
27
  description: Faraday Middleware for JSON HAL requests and responses.
28
28
  email:
29
29
  - koen@fetch.nl
@@ -31,11 +31,12 @@ executables: []
31
31
  extensions: []
32
32
  extra_rdoc_files: []
33
33
  files:
34
+ - ".github/workflows/lint.yml"
35
+ - ".github/workflows/test.yml"
34
36
  - ".gitignore"
35
37
  - ".rspec"
36
38
  - ".rubocop.yml"
37
39
  - ".rubocop_todo.yml"
38
- - ".travis.yml"
39
40
  - CHANGELOG.md
40
41
  - CONTRIBUTING.md
41
42
  - Gemfile
@@ -44,18 +45,20 @@ files:
44
45
  - RELEASING.md
45
46
  - Rakefile
46
47
  - faraday_hal_middleware.gemspec
48
+ - lib/faraday/hal_json.rb
49
+ - lib/faraday/hal_json/request.rb
50
+ - lib/faraday/hal_json/response.rb
51
+ - lib/faraday/hal_json/version.rb
47
52
  - lib/faraday_hal_middleware.rb
48
- - lib/faraday_hal_middleware/version.rb
49
- - lib/faraday_middleware/request/encode_hal_json.rb
50
- - lib/faraday_middleware/response/parse_hal_json.rb
51
53
  - spec/spec_helper.rb
52
- - spec/unit/encode_hal_json_spec.rb
53
- - spec/unit/parse_hal_json_spec.rb
54
+ - spec/unit/request_spec.rb
55
+ - spec/unit/response_spec.rb
54
56
  homepage: https://github.com/fetch/faraday_hal_middleware
55
57
  licenses:
56
58
  - MIT
57
- metadata: {}
58
- post_install_message:
59
+ metadata:
60
+ rubygems_mfa_required: 'true'
61
+ post_install_message:
59
62
  rdoc_options: []
60
63
  require_paths:
61
64
  - lib
@@ -70,11 +73,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
70
73
  - !ruby/object:Gem::Version
71
74
  version: '0'
72
75
  requirements: []
73
- rubygems_version: 3.0.3
74
- signing_key:
76
+ rubygems_version: 3.1.6
77
+ signing_key:
75
78
  specification_version: 4
76
79
  summary: Faraday Middleware for JSON HAL requests and responses.
77
- test_files:
78
- - spec/spec_helper.rb
79
- - spec/unit/encode_hal_json_spec.rb
80
- - spec/unit/parse_hal_json_spec.rb
80
+ test_files: []
data/.travis.yml DELETED
@@ -1,6 +0,0 @@
1
- language: ruby
2
-
3
- cache: bundler
4
-
5
- rvm:
6
- - 2.6.6
@@ -1,3 +0,0 @@
1
- module FaradayHalMiddleware
2
- VERSION = '0.1.1'.freeze
3
- end
@@ -1,52 +0,0 @@
1
- require 'faraday'
2
-
3
- module FaradayMiddleware
4
- # Request middleware that encodes the body as JSON.
5
- #
6
- # Processes only requests with matching Content-type or those without a type.
7
- # If a request doesn't have a type but has a body, it sets the Content-type
8
- # to JSON MIME-type.
9
- #
10
- # Doesn't try to encode bodies that already are in string form.
11
- class EncodeHalJson < Faraday::Middleware
12
- CONTENT_TYPE = 'Content-Type'.freeze
13
- MIME_TYPE = 'application/hal+json'.freeze
14
-
15
- dependency do
16
- require 'json' unless defined?(::JSON)
17
- end
18
-
19
- def call(env)
20
- match_content_type(env) do |data|
21
- env[:body] = encode data
22
- end
23
- @app.call env
24
- end
25
-
26
- def encode(data)
27
- ::JSON.dump data
28
- end
29
-
30
- def match_content_type(env)
31
- if process_request?(env)
32
- env[:request_headers][CONTENT_TYPE] ||= MIME_TYPE
33
- yield env[:body] unless env[:body].respond_to?(:to_str)
34
- end
35
- end
36
-
37
- def process_request?(env)
38
- type = request_type(env)
39
- has_body?(env) && (type.empty? || (type == MIME_TYPE))
40
- end
41
-
42
- def has_body?(env)
43
- (body = env[:body]) && !(body.respond_to?(:to_str) && body.empty?)
44
- end
45
-
46
- def request_type(env)
47
- type = env[:request_headers][CONTENT_TYPE].to_s
48
- type = type.split(';', 2).first if type.index(';')
49
- type
50
- end
51
- end
52
- end
@@ -1,7 +0,0 @@
1
- require 'faraday_middleware/response/parse_json'
2
-
3
- module FaradayMiddleware
4
- # JSON+HAL is just JSON
5
- class ParseHalJson < ParseJson
6
- end
7
- end
@@ -1,79 +0,0 @@
1
- require 'faraday_middleware/response/parse_hal_json'
2
-
3
- describe FaradayMiddleware::ParseHalJson, type: :response do
4
- context 'no type matching' do
5
- it "doesn't change nil body" do
6
- expect(process(nil).body).to be_nil
7
- end
8
-
9
- it 'nullifies empty body' do
10
- expect(process('').body).to be_nil
11
- end
12
-
13
- it 'parses json body' do
14
- response = process('{"a":1}')
15
- expect(response.body).to eq('a' => 1)
16
- expect(response.env[:raw_body]).to be_nil
17
- end
18
- end
19
-
20
- context 'with preserving raw' do
21
- let(:options) { { preserve_raw: true } }
22
-
23
- it 'parses json body' do
24
- response = process('{"a":1}')
25
- expect(response.body).to eq('a' => 1)
26
- expect(response.env[:raw_body]).to eq('{"a":1}')
27
- end
28
-
29
- it 'can opt out of preserving raw' do
30
- response = process('{"a":1}', nil, preserve_raw: false)
31
- expect(response.env[:raw_body]).to be_nil
32
- end
33
- end
34
-
35
- context 'with regexp type matching' do
36
- let(:options) { { content_type: /\bjson$/ } }
37
-
38
- it 'parses json body of correct type' do
39
- response = process('{"a":1}', 'application/x-json')
40
- expect(response.body).to eq('a' => 1)
41
- end
42
-
43
- it 'ignores json body of incorrect type' do
44
- response = process('{"a":1}', 'text/json-xml')
45
- expect(response.body).to eq('{"a":1}')
46
- end
47
- end
48
-
49
- context 'with array type matching' do
50
- let(:options) { { content_type: %w[a/b c/d] } }
51
-
52
- it 'parses json body of correct type' do
53
- expect(process('{"a":1}', 'a/b').body).to be_a(Hash)
54
- expect(process('{"a":1}', 'c/d').body).to be_a(Hash)
55
- end
56
-
57
- it 'ignores json body of incorrect type' do
58
- expect(process('{"a":1}', 'a/d').body).not_to be_a(Hash)
59
- end
60
- end
61
-
62
- it 'chokes on invalid json' do
63
- ['{!', '"a'].each do |data|
64
- expect { process(data) }.to raise_error(Faraday::ParsingError)
65
- end
66
- end
67
-
68
- context 'HEAD responses' do
69
- it "nullifies the body if it's only one space" do
70
- response = process(' ')
71
- expect(response.body).to be_nil
72
- end
73
-
74
- it "nullifies the body if it's two spaces" do
75
- response = process(' ')
76
- expect(response.body).to be_nil
77
- end
78
- end
79
- end