faraday_hal_middleware 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: c3637cc5447e62741f3caaa3e072397a77f1f0cb
4
+ data.tar.gz: 8e04a568630bc6483f97244fca384369c4c45550
5
+ SHA512:
6
+ metadata.gz: 281711339d4ba5c6b6269ba6d030401554d503b7da0c90f52138416364c27770a96d0f772ab5c31656a2de410f8869da4007b0bcafdc9d7c8d603a763959dc3a
7
+ data.tar.gz: a52c62b9784cde48d71dc48f1dea6ae4588283c4e3a953ca0d03b78263ef32f40d746bca51b030901ab89af520a36956d62deee8cddc713fd9d99bf616f873eb
data/.gitignore ADDED
@@ -0,0 +1,22 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ *.bundle
19
+ *.so
20
+ *.o
21
+ *.a
22
+ mkmf.log
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --require spec_helper
data/Gemfile ADDED
@@ -0,0 +1,11 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'json'
4
+ gem 'rake', '>= 0.9'
5
+
6
+ group :test do
7
+ gem 'rspec', '>= 3'
8
+ gem 'webmock'
9
+ end
10
+
11
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Koen Punt <koen@fetch.nl>
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,29 @@
1
+ # FaradayHalMiddleware
2
+
3
+ Faraday Middleware for JSON HAL requests and responses
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'faraday_hal_middleware'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install faraday_hal_middleware
18
+
19
+ ## Usage
20
+
21
+ TODO: Write usage instructions here
22
+
23
+ ## Contributing
24
+
25
+ 1. Fork it ( https://github.com/fetch/faraday_hal_middleware/fork )
26
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
27
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
28
+ 4. Push to the branch (`git push origin my-new-feature`)
29
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require 'bundler/gem_tasks'
2
+
3
+ task :default => [:spec]
4
+
5
+ require 'rspec/core/rake_task'
6
+ RSpec::Core::RakeTask.new(:spec)
@@ -0,0 +1,25 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'faraday_hal_middleware/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'faraday_hal_middleware'
8
+ spec.version = FaradayHalMiddleware::VERSION
9
+ spec.authors = ['Koen Punt']
10
+ spec.email = ['koen@fetch.nl']
11
+ spec.summary = %q{Faraday Middleware for JSON HAL requests and responses}
12
+ spec.description = %q{Faraday Middleware for JSON HAL requests and responses}
13
+ spec.homepage = 'https://github.com/fetch/faraday_hal_middleware'
14
+ spec.license = 'MIT'
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ['lib']
20
+
21
+ spec.add_development_dependency 'bundler', '~> 1.6'
22
+
23
+ spec.add_dependency 'faraday_middleware', ['>= 0.9', '< 0.10']
24
+
25
+ end
@@ -0,0 +1,20 @@
1
+ require 'faraday_hal_middleware/version'
2
+ require 'faraday'
3
+ require 'faraday_middleware'
4
+
5
+ module FaradayHalMiddleware
6
+
7
+ end
8
+
9
+ module FaradayMiddleware
10
+ autoload :EncodeHalJson, 'faraday_middleware/request/encode_hal_json'
11
+ autoload :ParseHalJson, 'faraday_middleware/response/parse_hal_json'
12
+
13
+ if Faraday::Middleware.respond_to? :register_middleware
14
+ Faraday::Request.register_middleware \
15
+ :hal_json => lambda { EncodeHalJson }
16
+
17
+ Faraday::Response.register_middleware \
18
+ :hal_json => lambda { ParseHalJson }
19
+ end
20
+ end
@@ -0,0 +1,3 @@
1
+ module FaradayHalMiddleware
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,52 @@
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) and (type.empty? or type == MIME_TYPE)
40
+ end
41
+
42
+ def has_body?(env)
43
+ body = env[:body] and !(body.respond_to?(:to_str) and 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
@@ -0,0 +1,7 @@
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
@@ -0,0 +1,44 @@
1
+ require 'rspec'
2
+ require 'webmock/rspec'
3
+ 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) { Hash.new }
18
+ base.let(:headers) { Hash.new }
19
+ base.let(:middleware) {
20
+ described_class.new(lambda {|env|
21
+ Faraday::Response.new(env)
22
+ }, options)
23
+ }
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
37
+
38
+ RSpec.configure do |config|
39
+ config.include EnvCompatibility
40
+ config.include ResponseMiddlewareExampleGroup, :type => :response
41
+ config.expect_with :rspec do |c|
42
+ c.syntax = :expect
43
+ end
44
+ end
@@ -0,0 +1,94 @@
1
+ require 'faraday_middleware/request/encode_hal_json'
2
+
3
+ describe FaradayMiddleware::EncodeHalJson do
4
+ let(:middleware) { described_class.new(lambda{|env| env}) }
5
+
6
+ def process(body, content_type = nil)
7
+ env = {:body => body, :request_headers => Faraday::Utils::Headers.new}
8
+ env[:request_headers]['content-type'] = content_type if content_type
9
+ middleware.call(faraday_env(env))
10
+ end
11
+
12
+ def result_body() result[:body] end
13
+ def result_type() result[:request_headers]['content-type'] end
14
+
15
+ context "no body" do
16
+ let(:result) { process(nil) }
17
+
18
+ it "doesn't change body" do
19
+ expect(result_body).to be_nil
20
+ end
21
+
22
+ it "doesn't add content type" do
23
+ expect(result_type).to be_nil
24
+ end
25
+ end
26
+
27
+ context "empty body" do
28
+ let(:result) { process('') }
29
+
30
+ it "doesn't change body" do
31
+ expect(result_body).to be_empty
32
+ end
33
+
34
+ it "doesn't add content type" do
35
+ expect(result_type).to be_nil
36
+ end
37
+ end
38
+
39
+ context "string body" do
40
+ let(:result) { process('{"a":1}') }
41
+
42
+ it "doesn't change body" do
43
+ expect(result_body).to eq('{"a":1}')
44
+ end
45
+
46
+ it "adds content type" do
47
+ expect(result_type).to eq('application/hal+json')
48
+ end
49
+ end
50
+
51
+ context "object body" do
52
+ let(:result) { process({:a => 1}) }
53
+
54
+ it "encodes body" do
55
+ expect(result_body).to eq('{"a":1}')
56
+ end
57
+
58
+ it "adds content type" do
59
+ expect(result_type).to eq('application/hal+json')
60
+ end
61
+ end
62
+
63
+ context "empty object body" do
64
+ let(:result) { process({}) }
65
+
66
+ it "encodes body" do
67
+ expect(result_body).to eq('{}')
68
+ end
69
+ end
70
+
71
+ context "object body with json type" do
72
+ let(:result) { process({:a => 1}, 'application/hal+json; charset=utf-8') }
73
+
74
+ it "encodes body" do
75
+ expect(result_body).to eq('{"a":1}')
76
+ end
77
+
78
+ it "doesn't change content type" do
79
+ expect(result_type).to eq('application/hal+json; charset=utf-8')
80
+ end
81
+ end
82
+
83
+ context "object body with incompatible type" do
84
+ let(:result) { process({:a => 1}, 'application/xml; charset=utf-8') }
85
+
86
+ it "doesn't change body" do
87
+ expect(result_body).to eq({:a => 1})
88
+ end
89
+
90
+ it "doesn't change content type" do
91
+ expect(result_type).to eq('application/xml; charset=utf-8')
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,79 @@
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"', 'true', 'null', '1'].each do |data|
64
+ expect{ process(data) }.to raise_error(Faraday::Error::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
metadata ADDED
@@ -0,0 +1,96 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: faraday_hal_middleware
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Koen Punt
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-12-01 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.6'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.6'
27
+ - !ruby/object:Gem::Dependency
28
+ name: faraday_middleware
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0.9'
34
+ - - <
35
+ - !ruby/object:Gem::Version
36
+ version: '0.10'
37
+ type: :runtime
38
+ prerelease: false
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0.9'
44
+ - - <
45
+ - !ruby/object:Gem::Version
46
+ version: '0.10'
47
+ description: Faraday Middleware for JSON HAL requests and responses
48
+ email:
49
+ - koen@fetch.nl
50
+ executables: []
51
+ extensions: []
52
+ extra_rdoc_files: []
53
+ files:
54
+ - .gitignore
55
+ - .rspec
56
+ - Gemfile
57
+ - LICENSE.txt
58
+ - README.md
59
+ - Rakefile
60
+ - faraday_hal_middleware.gemspec
61
+ - lib/faraday_hal_middleware.rb
62
+ - lib/faraday_hal_middleware/version.rb
63
+ - lib/faraday_middleware/request/encode_hal_json.rb
64
+ - lib/faraday_middleware/response/parse_hal_json.rb
65
+ - spec/spec_helper.rb
66
+ - spec/unit/encode_hal_json_spec.rb
67
+ - spec/unit/parse_hal_json_spec.rb
68
+ homepage: https://github.com/fetch/faraday_hal_middleware
69
+ licenses:
70
+ - MIT
71
+ metadata: {}
72
+ post_install_message:
73
+ rdoc_options: []
74
+ require_paths:
75
+ - lib
76
+ required_ruby_version: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - '>='
79
+ - !ruby/object:Gem::Version
80
+ version: '0'
81
+ required_rubygems_version: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ requirements: []
87
+ rubyforge_project:
88
+ rubygems_version: 2.2.2
89
+ signing_key:
90
+ specification_version: 4
91
+ summary: Faraday Middleware for JSON HAL requests and responses
92
+ test_files:
93
+ - spec/spec_helper.rb
94
+ - spec/unit/encode_hal_json_spec.rb
95
+ - spec/unit/parse_hal_json_spec.rb
96
+ has_rdoc: