faraday_json 0.1.0

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 797f339a60927cd80ecb7e6b6a61d992402e21cc
4
+ data.tar.gz: 181e9fbcff6c9a45754dd287bb54d71d09b695fb
5
+ SHA512:
6
+ metadata.gz: dd2b02b134d0cc13fcca62b60669c62a5d9e5596337b1c06f0dc31d2a73ef7e9603e3a886467aa4995bfa336ff20b0f150b5bfe9c61fe28c7e56a17da6bd2118
7
+ data.tar.gz: 1d42a2368bc4d7525a000e32ffffda78a88332aadc771d1406d8cd4c61fc68a1ac0964a1e1c8782c119ff44e22215fdb11d569c7b59d54a9f8371ea4033316f5
data/.gitignore ADDED
@@ -0,0 +1,38 @@
1
+ *.gem
2
+ *.rbc
3
+ /.config
4
+ /coverage/
5
+ /InstalledFiles
6
+ /pkg/
7
+ /spec/reports/
8
+ /test/tmp/
9
+ /test/version_tmp/
10
+ /tmp/
11
+
12
+ ## Specific to RubyMotion:
13
+ .dat*
14
+ .repl_history
15
+ build/
16
+
17
+ ## Documentation cache and generated files:
18
+ /.yardoc/
19
+ /_yardoc/
20
+ /doc/
21
+ /rdoc/
22
+
23
+ ## Environment normalisation:
24
+ /.bundle/
25
+ /vendor/bundle
26
+ /lib/bundler/man/
27
+
28
+ # for a library or gem, you might want to ignore these files since the code is
29
+ # intended to run in multiple environments; otherwise, check them in:
30
+ # Gemfile.lock
31
+ .ruby-version
32
+ .ruby-gemset
33
+
34
+ # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
35
+ .rvmrc
36
+
37
+ # Editor files
38
+ .*.sw*
data/.travis.yml ADDED
@@ -0,0 +1,25 @@
1
+ bundler_args: --without development
2
+ language: ruby
3
+ rvm:
4
+ - 1.8.7
5
+ - 1.9.2
6
+ - 1.9.3
7
+ - 2.0.0
8
+ - 2.1.6
9
+ - jruby-head
10
+ - rbx-2
11
+ - ruby-head
12
+ gemfile:
13
+ - Gemfile
14
+ - Gemfile-0.7.rb
15
+ - Gemfile-0.8.rb
16
+ env:
17
+ - LC_ALL=C LANG=C
18
+ - LC_ALL=en_US.UTF-8 LANG=C
19
+ matrix:
20
+ allow_failures:
21
+ - rvm: jruby-head
22
+ - rvm: rbx-2
23
+ - rvm: ruby-head
24
+ - rvm: 2.2.2
25
+ fast_finish: true
data/Gemfile ADDED
@@ -0,0 +1,18 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'json', :platforms => [:jruby, :rbx, :ruby_18]
4
+ gem 'rake', '>= 0.9'
5
+
6
+ group :test do
7
+ gem 'parallel', '= 1.3.3', :platforms => [:mri_19]
8
+ gem 'cane', '>= 2.2.2', :platforms => [:mri_19, :mri_20, :mri_21, :mri_22]
9
+ gem 'rspec', '>= 3'
10
+ gem 'simplecov'
11
+ # gem 'webmock'
12
+ end
13
+
14
+ platforms :ruby_18 do
15
+ gem 'iconv'
16
+ end
17
+
18
+ gemspec
data/Gemfile-0.7.rb ADDED
@@ -0,0 +1,3 @@
1
+ eval File.read(File.expand_path('../Gemfile', __FILE__))
2
+
3
+ gem 'faraday', '~> 0.7.4'
@@ -0,0 +1,57 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ faraday_json (0.1.0)
5
+ faraday (>= 0.7.4, < 0.10)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ addressable (2.3.8)
11
+ cane (2.6.2)
12
+ parallel
13
+ diff-lcs (1.2.5)
14
+ docile (1.1.5)
15
+ faraday (0.7.6)
16
+ addressable (~> 2.2)
17
+ multipart-post (~> 1.1)
18
+ rack (~> 1.1)
19
+ iconv (1.0.4)
20
+ json (1.8.2)
21
+ multipart-post (1.2.0)
22
+ parallel (1.3.3)
23
+ rack (1.6.1)
24
+ rake (10.4.2)
25
+ rspec (3.2.0)
26
+ rspec-core (~> 3.2.0)
27
+ rspec-expectations (~> 3.2.0)
28
+ rspec-mocks (~> 3.2.0)
29
+ rspec-core (3.2.3)
30
+ rspec-support (~> 3.2.0)
31
+ rspec-expectations (3.2.1)
32
+ diff-lcs (>= 1.2.0, < 2.0)
33
+ rspec-support (~> 3.2.0)
34
+ rspec-mocks (3.2.1)
35
+ diff-lcs (>= 1.2.0, < 2.0)
36
+ rspec-support (~> 3.2.0)
37
+ rspec-support (3.2.2)
38
+ simplecov (0.10.0)
39
+ docile (~> 1.1.0)
40
+ json (~> 1.8)
41
+ simplecov-html (~> 0.10.0)
42
+ simplecov-html (0.10.0)
43
+
44
+ PLATFORMS
45
+ ruby
46
+
47
+ DEPENDENCIES
48
+ bundler (~> 1.6)
49
+ cane (>= 2.2.2)
50
+ faraday (~> 0.7.4)
51
+ faraday_json!
52
+ iconv
53
+ json
54
+ parallel (= 1.3.3)
55
+ rake (>= 0.9)
56
+ rspec (>= 3)
57
+ simplecov
data/Gemfile-0.8.rb ADDED
@@ -0,0 +1,3 @@
1
+ eval File.read(File.expand_path('../Gemfile', __FILE__))
2
+
3
+ gem 'faraday', '~> 0.8.8'
@@ -0,0 +1,53 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ faraday_json (0.1.0)
5
+ faraday (>= 0.7.4, < 0.10)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ cane (2.6.2)
11
+ parallel
12
+ diff-lcs (1.2.5)
13
+ docile (1.1.5)
14
+ faraday (0.8.9)
15
+ multipart-post (~> 1.2.0)
16
+ iconv (1.0.4)
17
+ json (1.8.2)
18
+ multipart-post (1.2.0)
19
+ parallel (1.3.3)
20
+ rake (10.4.2)
21
+ rspec (3.2.0)
22
+ rspec-core (~> 3.2.0)
23
+ rspec-expectations (~> 3.2.0)
24
+ rspec-mocks (~> 3.2.0)
25
+ rspec-core (3.2.3)
26
+ rspec-support (~> 3.2.0)
27
+ rspec-expectations (3.2.1)
28
+ diff-lcs (>= 1.2.0, < 2.0)
29
+ rspec-support (~> 3.2.0)
30
+ rspec-mocks (3.2.1)
31
+ diff-lcs (>= 1.2.0, < 2.0)
32
+ rspec-support (~> 3.2.0)
33
+ rspec-support (3.2.2)
34
+ simplecov (0.10.0)
35
+ docile (~> 1.1.0)
36
+ json (~> 1.8)
37
+ simplecov-html (~> 0.10.0)
38
+ simplecov-html (0.10.0)
39
+
40
+ PLATFORMS
41
+ ruby
42
+
43
+ DEPENDENCIES
44
+ bundler (~> 1.6)
45
+ cane (>= 2.2.2)
46
+ faraday (~> 0.8.8)
47
+ faraday_json!
48
+ iconv
49
+ json
50
+ parallel (= 1.3.3)
51
+ rake (>= 0.9)
52
+ rspec (>= 3)
53
+ simplecov
data/Gemfile.lock ADDED
@@ -0,0 +1,52 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ faraday_json (0.1.0)
5
+ faraday (>= 0.7.4, < 0.10)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ cane (2.6.2)
11
+ parallel
12
+ diff-lcs (1.2.5)
13
+ docile (1.1.5)
14
+ faraday (0.9.1)
15
+ multipart-post (>= 1.2, < 3)
16
+ iconv (1.0.4)
17
+ json (1.8.2)
18
+ multipart-post (2.0.0)
19
+ parallel (1.3.3)
20
+ rake (10.4.2)
21
+ rspec (3.2.0)
22
+ rspec-core (~> 3.2.0)
23
+ rspec-expectations (~> 3.2.0)
24
+ rspec-mocks (~> 3.2.0)
25
+ rspec-core (3.2.3)
26
+ rspec-support (~> 3.2.0)
27
+ rspec-expectations (3.2.1)
28
+ diff-lcs (>= 1.2.0, < 2.0)
29
+ rspec-support (~> 3.2.0)
30
+ rspec-mocks (3.2.1)
31
+ diff-lcs (>= 1.2.0, < 2.0)
32
+ rspec-support (~> 3.2.0)
33
+ rspec-support (3.2.2)
34
+ simplecov (0.10.0)
35
+ docile (~> 1.1.0)
36
+ json (~> 1.8)
37
+ simplecov-html (~> 0.10.0)
38
+ simplecov-html (0.10.0)
39
+
40
+ PLATFORMS
41
+ ruby
42
+
43
+ DEPENDENCIES
44
+ bundler (~> 1.6)
45
+ cane (>= 2.2.2)
46
+ faraday_json!
47
+ iconv
48
+ json
49
+ parallel (= 1.3.3)
50
+ rake (>= 0.9)
51
+ rspec (>= 3)
52
+ simplecov
data/LICENSE ADDED
@@ -0,0 +1,30 @@
1
+ Copyright spriteCloud B.V. (http://www.spritecloud.com/) and other faraday_json
2
+ contributors. All rights not covered below are reserved.
3
+
4
+ MIT +no-false-attribs License
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ of this software and associated documentation files (the "Software"), to
8
+ deal in the Software without restriction, including without limitation the
9
+ rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10
+ sell copies of the Software, and to permit persons to whom the Software is
11
+ furnished to do so, subject to the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be included in
14
+ all copies or substantial portions of the Software.
15
+
16
+ Distributions of all or part of the Software intended to be used by the
17
+ recipients as they would use the unmodified Software, containing modifications
18
+ that substantially alter, remove, or disable functionality of the Software,
19
+ outside of the documented configuration mechanisms provided by the Software,
20
+ shall be modified such that the Original Author's bug reporting email addresses
21
+ and urls are either replaced with the contact information of the parties
22
+ responsible for the changes, or removed entirely.
23
+
24
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
25
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
26
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
27
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
28
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
29
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
30
+ IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,30 @@
1
+ # Introduction
2
+ This is a character encoding-aware JSON middleware for Faraday.
3
+
4
+ [![Build Status](https://travis-ci.org/spriteCloud/faraday_json.svg)](https://travis-ci.org/spriteCloud/faraday_json)
5
+
6
+ The default JSON middleware from lostisland/faraday_middleware is not character
7
+ encoding aware. This is problematic because by default, Ruby performs I/O based
8
+ on locale settings. If your locale specifies one character encoding, but the
9
+ request or response body is encoded in another, you will end up with a Ruby
10
+ string that pretends to be one encoding, but cannot correctly be interpreted as
11
+ such.
12
+
13
+ Worse, Ruby 1.8 and later Ruby versions will not behave consistently, as 1.8
14
+ does not yet understand character encodings internally. There is a lengthy
15
+ discussion about this at https://bugs.ruby-lang.org/issues/2567
16
+
17
+ Still worse, JSON used to specify UTF-8 encoding as mandatory, but now loosened
18
+ this to any Unicode character set. The result is that some JSON libraries still
19
+ only understand UTF-8.
20
+
21
+ This middleware fixes these issues rather brute-force by:
22
+
23
+ - Accepting the Content-Type charset value as the correct encoding, and
24
+ converting the body from Faraday adapters to this encoding.
25
+ - Only sending UTF-8 encoded JSON, converting raw data if necessary.
26
+ - Always setting the UTF-8 charset when sending this UTF-8 encoded JSON.
27
+
28
+ When no charset is provided, all bets are off. The correct default would be to
29
+ assume US-ASCII, but that may break some code. This middleware lets you override
30
+ this default.
data/Rakefile ADDED
@@ -0,0 +1,28 @@
1
+ ruby_19 = RUBY_VERSION > '1.9'
2
+ ruby_mri = !defined?(RUBY_ENGINE) || 'ruby' == RUBY_ENGINE
3
+ default_gemfile = ENV['BUNDLE_GEMFILE'] =~ /Gemfile$/
4
+
5
+ if ruby_19 && ruby_mri && default_gemfile
6
+ task :default => [:enable_coverage, :spec, :quality]
7
+ else
8
+ task :default => [:spec]
9
+ end
10
+
11
+ require 'bundler'
12
+ Bundler::GemHelper.install_tasks
13
+
14
+ require 'rspec/core/rake_task'
15
+ RSpec::Core::RakeTask.new(:spec)
16
+
17
+ task :enable_coverage do
18
+ ENV['COVERAGE'] = 'yes'
19
+ end
20
+
21
+ desc %(Check code quality metrics with Cane)
22
+ task :quality do
23
+ sh 'cane',
24
+ '--abc-max=15',
25
+ '--style-measure=110',
26
+ '--gte=coverage/covered_percent,88.89',
27
+ '--max-violations=0'
28
+ end
@@ -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_json/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "faraday_json"
8
+ spec.version = FaradayJSON::VERSION
9
+ spec.authors = ["Jens Finkhaeuser"]
10
+ spec.email = ["foss@spritecloud.com"]
11
+ spec.description = %q{This is a character encoding-aware JSON middleware for Faraday.}
12
+ spec.summary = %q{This is a character encoding-aware JSON middleware for Faraday.}
13
+ spec.homepage = "https://github.com/spriteCloud/faraday_json"
14
+ spec.license = "MITNFA"
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
+ spec.add_development_dependency "rake"
23
+
24
+ spec.add_dependency 'faraday', ['>= 0.7.4', '< 0.10']
25
+ end
@@ -0,0 +1,22 @@
1
+ #
2
+ # FaradayJSON
3
+ # https://github.com/spriteCloud/faraday_json
4
+ #
5
+ # Copyright (c) 2015 spriteCloud B.V. and other FaradayJSON contributors.
6
+ # All rights reserved.
7
+ #
8
+
9
+ require 'faraday'
10
+
11
+ module FaradayJSON
12
+ autoload :ParseJson, 'faraday_json/parse_json'
13
+
14
+ if Faraday::Middleware.respond_to? :register_middleware
15
+ Faraday::Request.register_middleware \
16
+ :json => lambda { EncodeJson }
17
+
18
+ Faraday::Response.register_middleware \
19
+ :json => lambda { ParseJson },
20
+ :json_fix => lambda { ParseJsonMimeTypeFix }
21
+ end
22
+ end
@@ -0,0 +1,94 @@
1
+ #
2
+ # FaradayJSON
3
+ # https://github.com/spriteCloud/faraday_json
4
+ #
5
+ # Copyright (c) 2015 spriteCloud B.V. and other FaradayJSON contributors.
6
+ # All rights reserved.
7
+ #
8
+
9
+ require 'faraday'
10
+ require 'faraday_json/encoding'
11
+
12
+ module FaradayJSON
13
+ # Request middleware that encodes the body as JSON.
14
+ #
15
+ # Processes only requests with matching Content-type or those without a type.
16
+ # If a request doesn't have a type but has a body, it sets the Content-type
17
+ # to JSON MIME-type.
18
+ #
19
+ # Doesn't try to encode bodies that already are in string form.
20
+ class EncodeJson < Faraday::Middleware
21
+ CONTENT_TYPE = 'Content-Type'.freeze
22
+ CONTENT_LENGTH = 'Content-Length'.freeze
23
+ MIME_TYPE = 'application/json'.freeze
24
+ MIME_TYPE_UTF8 = 'application/json; charset=utf-8'.freeze
25
+
26
+ include ::FaradayJSON::Encoding
27
+
28
+ dependency do
29
+ require 'json' unless defined?(::JSON)
30
+ end
31
+
32
+ def call(env)
33
+ if process_request?(env)
34
+ body = env[:body]
35
+
36
+ # Detect and honour input charset. Basically, all requests without a
37
+ # charset should be considered malformed, but we can make a best guess.
38
+ # Whether the body is a string or another data structure does not
39
+ # matter: all strings *contained* within it must be encoded properly.
40
+ charset = request_charset(env)
41
+
42
+ # Strip BOM, if any
43
+ body = strip_bom(body, charset, { 'default_encoding' => 'us-ascii' })
44
+
45
+ # Transcode to UTF-8
46
+ body = to_utf8(body, charset, { 'force_input_charset' => true })
47
+
48
+ # If the body is a stirng, we assume it's already JSON. No further
49
+ # processing is necessary.
50
+ # XXX Is :to_str really a good indicator for Strings? Taken from old
51
+ # code.
52
+ if not body.respond_to?(:to_str)
53
+ # If body isn't a string yet, we need to encode it. We also know it's
54
+ # then going to be UTF-8, because JSON defaults to that.
55
+ # Thanks to to_utf8 above, JSON.dump should not have any issues here.
56
+ body = ::JSON.dump(body)
57
+ end
58
+
59
+ env[:body] = body
60
+
61
+ # We'll add a content length, because otherwise we're relying on every
62
+ # component down the line properly interpreting UTF-8 - that can fail.
63
+ env[:request_headers][CONTENT_LENGTH] ||= env[:body].bytesize
64
+
65
+ # Always base the encoding we're sending in the content type header on
66
+ # the string encoding.
67
+ env[:request_headers][CONTENT_TYPE] = MIME_TYPE_UTF8
68
+ end
69
+ @app.call env
70
+ end
71
+
72
+ def process_request?(env)
73
+ type = request_type(env)
74
+ has_body?(env) and (type.empty? or type == MIME_TYPE)
75
+ end
76
+
77
+ def request_charset(env)
78
+ enc = env[:request_headers][CONTENT_TYPE].to_s
79
+ enc = enc.split(';', 2).last if enc.index(';')
80
+ enc = enc.split('=', 2).last if enc.index('=')
81
+ return enc
82
+ end
83
+
84
+ def has_body?(env)
85
+ body = env[:body] and !(body.respond_to?(:to_str) and body.empty?)
86
+ end
87
+
88
+ def request_type(env)
89
+ type = env[:request_headers][CONTENT_TYPE].to_s
90
+ type = type.split(';', 2).first if type.index(';')
91
+ type
92
+ end
93
+ end
94
+ end