cp-sparrow 0.0.11 → 0.0.12

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9052fb54e2eab83298497e0037a54c517bd7429a
4
- data.tar.gz: 3c871cad86f27adf06bbdcc2cbf35bac4ed479fe
3
+ metadata.gz: 8c0adb0e16e2c7a97a4b7c4d6db2506cd3c3f91e
4
+ data.tar.gz: 7e58676322eb7f4981618f359ab3a2fcef609bd4
5
5
  SHA512:
6
- metadata.gz: 92ec954024212d99c3e5d606072f1703131301774de50721360057aaffd256bfa5ef5659e62599153a2672720f5014c33d9023961351b9595e65237cfece1c55
7
- data.tar.gz: 7c8ffca7814f4968e898b37d0a827871ce41d311795c92aca695076e6fd408741148f7ba1dafd3f5108dce76d83fee3f877c5c3da9de74c3a41a9cd165d1cd07
6
+ metadata.gz: e653bf471ed0d7d59ce627d1b26dd219b9807bf42e52663af3a3a4f884ea53c3a1c6472fdeb02cda302666ebdb2a9d293cbcdd0195d6f163b8581f1f38cec34c
7
+ data.tar.gz: a4542efb1cd4984760480db9b200bc1e6da846bbfde61b44294715c83ae3d625e486be14bef7bf01c9ccf4fa49daa6c0c9d91a4de6d6858e724e59e5094c2e0b
@@ -0,0 +1,8 @@
1
+ language: ruby
2
+ rvm:
3
+ # - 2.0.0
4
+ - 2.1.0
5
+ # - 2.2.0
6
+ env:
7
+ - RAILS_VERSION: 3.2.21
8
+ - RAILS_VERSION: 4.0.13
data/README.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  A Rack middleware for converting the params keys and JSON response keys of a Rack application.
4
4
 
5
+ [![Build Status](https://travis-ci.org/GateprotectGmbH/sparrow.svg?branch=master)](https://travis-ci.org/GateprotectGmbH/sparrow) [![Gem Version](https://badge.fury.io/rb/cp-sparrow.svg)](http://badge.fury.io/rb/cp-sparrow)
6
+
5
7
  ## Installation
6
8
 
7
9
  Add this line to your application's Gemfile:
@@ -14,7 +16,7 @@ And then execute:
14
16
 
15
17
  Or install it yourself as:
16
18
 
17
- $ gem install sparrow
19
+ $ gem install cp-sparrow
18
20
 
19
21
  ## Usage
20
22
 
data/Rakefile CHANGED
@@ -4,7 +4,7 @@ require "rspec/core/rake_task"
4
4
  RSpec::Core::RakeTask.new(:spec)
5
5
 
6
6
  RAILS_VERSIONS = [
7
- "3.2.17",
7
+ "3.2.21",
8
8
  "4.0.13"
9
9
  ]
10
10
 
@@ -12,14 +12,14 @@ def run_tests_for_version(version)
12
12
  commands = []
13
13
 
14
14
  commands << "rm Gemfile.lock"
15
- commands << "export RAILS_VERSION=#{version}"
16
- commands << "bundle update"
15
+ commands << "gem install rails -v #{version}"
16
+ commands << "bundle install"
17
17
  commands << "bundle exec rspec"
18
18
 
19
- system(commands.join(';'))
19
+ system({'RAILS_VERSION' => version}, commands.join(';'))
20
20
  end
21
21
 
22
- task :default do
22
+ task :all do
23
23
  RAILS_VERSIONS.each do |version|
24
24
  puts "Testing gem for rails version: #{version}"
25
25
  success = run_tests_for_version(version)
@@ -30,3 +30,7 @@ task :default do
30
30
  end
31
31
  end
32
32
  end
33
+
34
+ task :default do
35
+ run_tests_for_version(ENV['RAILS_VERSION'] || '3.2.21')
36
+ end
@@ -24,12 +24,10 @@ module Sparrow
24
24
 
25
25
  def strategy
26
26
  if is_processable?
27
- if last_env[Strategies::FormHash::REQUEST_FORM_HASH_KEY]
28
- Strategies::FormHash
29
- else
30
- Strategies::RawInput
31
- end
27
+ Rails.logger.debug 'Choosing strategy RawInput' if defined? Rails
28
+ Strategies::RawInput
32
29
  else
30
+ Rails.logger.debug 'Choosing strategy Ignore' if defined? Rails
33
31
  Strategies::Ignore
34
32
  end
35
33
  end
@@ -44,7 +42,7 @@ module Sparrow
44
42
  end
45
43
 
46
44
  def accepted_content_type?
47
- content_type_equals?(request_content_type) || content_type_matches?(request_content_type)
45
+ content_type_equals?(content_type) || content_type_matches?(content_type)
48
46
  end
49
47
 
50
48
  def accepted_accept_header?
@@ -68,15 +66,6 @@ module Sparrow
68
66
  request_class.new(last_env)
69
67
  end
70
68
 
71
- def request_content_type
72
- content_type = request.content_type ||
73
- last_env['CONTENT-TYPE'] ||
74
- last_env['Content-Type'] ||
75
- last_env['CONTENT_TYPE']
76
-
77
- content_type.present? ? content_type : nil
78
- end
79
-
80
69
  def content_type_equals?(type)
81
70
  Sparrow.configuration.allowed_content_types.include?(type)
82
71
  end
@@ -7,5 +7,23 @@ module Sparrow
7
7
  strategy.handle(env, :request)
8
8
  env
9
9
  end
10
+
11
+ def content_type
12
+ my_content_type = request.content_type ||
13
+ last_env['CONTENT-TYPE'] ||
14
+ last_env['Content-Type'] ||
15
+ last_env['CONTENT_TYPE']
16
+
17
+ my_content_type.present? ? my_content_type : nil
18
+ end
19
+
20
+ def strategy
21
+ if is_processable? && last_env[Strategies::FormHash::REQUEST_FORM_HASH_KEY]
22
+ Rails.logger.debug 'Choosing strategy FormHash' if defined? Rails
23
+ Strategies::FormHash
24
+ else
25
+ super
26
+ end
27
+ end
10
28
  end
11
29
  end
@@ -33,5 +33,12 @@ module Sparrow
33
33
  def unprocessable_status?
34
34
  @status.in?(500..511) || @status == 404
35
35
  end
36
+
37
+ def content_type
38
+ headers['Content-Type'].split(';').first #||
39
+ # last_env['CONTENT-TYPE'] ||
40
+ # last_env['Content-Type'] ||
41
+ # last_env['CONTENT_TYPE']
42
+ end
36
43
  end
37
44
  end
@@ -34,6 +34,10 @@ module Sparrow
34
34
  @env
35
35
  end
36
36
 
37
+ def json_body
38
+ params
39
+ end
40
+
37
41
  def transform_params
38
42
  ensure_json
39
43
  end
@@ -1,3 +1,3 @@
1
1
  module Sparrow
2
- VERSION = '0.0.11'
2
+ VERSION = '0.0.12'
3
3
  end
@@ -11,6 +11,16 @@ class WelcomeController < ApplicationController
11
11
  render json: {keys: extract_keys, camelCase: false, snake_case: true}
12
12
  end
13
13
 
14
+ def non_json_text_response
15
+ render text: "----- BEGIN PUBLIC KEY -----\n#{extract_keys}\n----- END PUBLIC KEY -----"
16
+ end
17
+
18
+ def non_json_binary_response
19
+ file = File.join(Rails.root, 'app', 'assets', 'images', 'grumpy-cat.gif')
20
+
21
+ send_file(file, filename: "#{params}.gif")
22
+ end
23
+
14
24
  def posts
15
25
  render json: {keys: extract_keys}
16
26
  end
@@ -51,9 +51,13 @@ Dummy::Application.routes.draw do
51
51
  root :to => 'welcome#index', defaults: { format: 'json' }
52
52
  post '/posts' => 'welcome#posts', defaults: {format: 'json'}
53
53
  get '/welcome' => 'welcome#show', default: {format: 'json'}
54
+ get '/welcome/non_json_text_response' => 'welcome#non_json_text_response', default: {format: 'json'}
55
+ get '/welcome/non_json_binary_response' => 'welcome#non_json_binary_response', default: {format: 'json'}
54
56
  get '/array_of_elements' => 'welcome#array_of_elements', default: {format: 'json'}
55
57
  get '/upcase_first_name' => 'welcome#upcase_first_name', default: {format: 'json'}
56
58
  get '/ignore' => 'welcome#ignore', default: {format: 'json'}
59
+ get '/ignore/non_json_text_response' => 'welcome#non_json_text_response', default: {format: 'json'}
60
+ get '/ignore/non_json_binary_response' => 'welcome#non_json_binary_response', default: {format: 'json'}
57
61
  get '/error' => 'welcome#error', default: {format: 'json'}
58
62
 
59
63
  # See how all your routes lay out with "rake routes"
@@ -5,8 +5,9 @@ describe "camel caser middleware for Rails", type: :rails do
5
5
  let(:json_object) do
6
6
  {
7
7
  userName: 'dsci',
8
+ last_name: 'smith',
8
9
  bar: { lordFüü: 12 },
9
- "DE" => 'german'
10
+ "DE" => 'german',
10
11
  }
11
12
  end
12
13
  let(:json) { MultiJson.dump(json_object) }
@@ -32,21 +33,121 @@ describe "camel caser middleware for Rails", type: :rails do
32
33
  end
33
34
 
34
35
  context 'exclude paths' do
35
- before do
36
- get '/ignore', json_object, { 'CONTENT-TYPE' => 'application/json',
37
- 'request-json-format' => 'underscore',
38
- 'response-json-format' => 'underscore' }
36
+ context 'ignored json in and out' do
37
+ before do
38
+ get '/ignore', json_object, { 'CONTENT-TYPE' => 'application/json',
39
+ 'request-json-format' => 'underscore',
40
+ 'response-json-format' => 'underscore' }
41
+ end
42
+
43
+ subject { MultiJson.load(last_response.body) }
44
+
45
+ it 'should not touch the input keys and the response' do
46
+ expect(subject).to have_key('camelCase')
47
+ expect(subject).to have_key('snake_case')
48
+ expect(subject).to have_key('keys')
49
+ keys = subject['keys']
50
+ %w(userName lordFüü bar).each do |key|
51
+ expect(keys).to include(key)
52
+ end
53
+ end
39
54
  end
40
55
 
41
- subject { MultiJson.load(last_response.body) }
56
+ context 'ignored json in and ignored text out' do
57
+ before do
58
+ get '/ignore/non_json_text_response', json_object,
59
+ { 'CONTENT-TYPE' => 'application/json',
60
+ 'request-json-format' => 'underscore',
61
+ 'response-json-format' => 'underscore' }
62
+ end
63
+
64
+ subject { last_response }
65
+
66
+ it { is_expected.to be_successful }
67
+
68
+ it 'should answer with a KEY' do
69
+ expect(subject.body).to match /BEGIN PUBLIC KEY/
70
+ end
71
+
72
+ it 'should not touch the keys' do
73
+ expect(subject.body).to match /userName/
74
+ expect(subject.body).to match /lordFüü/
75
+ expect(subject.body).to match /bar/
76
+ expect(subject.body).to match /last_name/
77
+ end
78
+
79
+ it 'should be content-type html' do
80
+ expect(subject.header['Content-Type']).to match /text\/html/
81
+ end
82
+ end
83
+
84
+ context 'ignored json in and ignored binary out' do
85
+ before do
86
+ get '/ignore/non_json_binary_response', json_object,
87
+ { 'CONTENT-TYPE' => 'application/json',
88
+ 'request-json-format' => 'underscore',
89
+ 'response-json-format' => 'underscore' }
90
+ end
91
+
92
+ subject { last_response }
93
+
94
+ it { is_expected.to be_successful }
95
+
96
+ it 'should be content-type gif' do
97
+ expect(subject.header['Content-Type']).to eql "image/gif"
98
+ end
99
+ end
100
+
101
+ context 'convert json in and ignored text out' do
102
+ before do
103
+ get '/welcome/non_json_text_response', json_object,
104
+ { 'CONTENT-TYPE' => 'application/json',
105
+ 'request-json-format' => 'underscore',
106
+ 'response-json-format' => 'underscore' }
107
+ end
108
+
109
+ subject { last_response }
110
+
111
+ it { is_expected.to be_successful }
112
+
113
+ it 'should answer with a KEY' do
114
+ expect(last_response.body).to match /BEGIN PUBLIC KEY/
115
+ end
116
+
117
+ it 'should touch the keys' do
118
+ expect(subject.body).to match /user_name/
119
+ expect(subject.body).to match /lord_füü/
120
+ expect(subject.body).to match /bar/
121
+ expect(subject.body).to match /last_name/
122
+ end
123
+
124
+ it 'should be content-type html' do
125
+ expect(last_response.header['Content-Type']).to match /text\/html/
126
+ end
127
+ end
128
+
129
+ context "convert json in and don't stumble over binary out" do
130
+ before do
131
+ get '/welcome/non_json_binary_response', json_object,
132
+ { 'CONTENT-TYPE' => 'application/json',
133
+ 'request-json-format' => 'underscore',
134
+ 'response-json-format' => 'underscore' }
135
+ end
42
136
 
43
- it 'should not touch the input keys and the response' do
44
- expect(subject).to have_key('camelCase')
45
- expect(subject).to have_key('snake_case')
46
- expect(subject).to have_key('keys')
47
- keys = subject['keys']
48
- %w(userName lordFüü bar).each do |key|
49
- expect(keys).to include(key)
137
+ subject { last_response }
138
+
139
+ it { is_expected.to be_successful }
140
+
141
+ it 'should be content-type html' do
142
+ expect(last_response.header['Content-Type']).to eq('image/gif')
143
+ end
144
+
145
+ it 'should show the converted input params as file name content' do
146
+ expect(last_response.header['Content-Disposition']).
147
+ to include("user_name")
148
+
149
+ expect(last_response.header['Content-Disposition']).
150
+ to include("lord_füü")
50
151
  end
51
152
  end
52
153
  end
@@ -145,9 +246,8 @@ describe "camel caser middleware for Rails", type: :rails do
145
246
  end
146
247
 
147
248
  describe 'the configuration of allowed content types' do
148
- it 'does not process requests and responses that have disallowed content
149
- types' do
150
- get '/welcome', json_object, { 'CONTENT-TYPE' => 'text/html',
249
+ it 'does not process requests and responses that have disallowed content types' do
250
+ get '/welcome', json_object, { 'CONTENT_TYPE' => 'text/html',
151
251
  'request-json-format' => 'underscore' }
152
252
 
153
253
  last_json = MultiJson.load(last_response.body)
@@ -162,7 +262,8 @@ describe "camel caser middleware for Rails", type: :rails do
162
262
 
163
263
  post '/posts', json, { 'request-json-format' => 'underscore',
164
264
  'response-json-format' => 'underscore',
165
- 'CONTENT-TYPE' => 'something' }
265
+ 'CONTENT-TYPE' => '' }
266
+
166
267
  last_json = MultiJson.load(last_response.body)
167
268
  expect(last_json['keys']).to include('userName')
168
269
  expect(last_json['keys']).to include('DE')
@@ -174,9 +275,8 @@ describe "camel caser middleware for Rails", type: :rails do
174
275
  end
175
276
 
176
277
  post '/posts', json, { 'request-json-format' => 'underscore',
177
- 'response-json-format' => 'underscore',
178
- 'CONTENT_TYPE' => ''
179
- }
278
+ 'response-json-format' => 'underscore',
279
+ 'CONTENT_TYPE' => ''}
180
280
 
181
281
  last_json = MultiJson.load(last_response.body)
182
282
  expect(last_json['keys']).to include('user_name')
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cp-sparrow
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.11
4
+ version: 0.0.12
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Schmidt
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-06-10 00:00:00.000000000 Z
12
+ date: 2015-06-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -150,6 +150,7 @@ files:
150
150
  - ".gitignore"
151
151
  - ".ruby-gemset"
152
152
  - ".ruby-version"
153
+ - ".travis.yml"
153
154
  - Gemfile
154
155
  - LICENSE.txt
155
156
  - README.md
@@ -181,6 +182,7 @@ files:
181
182
  - spec/integration/apps/rack_app/config.ru
182
183
  - spec/integration/apps/rails_app/README.rdoc
183
184
  - spec/integration/apps/rails_app/Rakefile
185
+ - spec/integration/apps/rails_app/app/assets/images/grumpy-cat.gif
184
186
  - spec/integration/apps/rails_app/app/assets/javascripts/application.js
185
187
  - spec/integration/apps/rails_app/app/assets/stylesheets/application.css
186
188
  - spec/integration/apps/rails_app/app/controllers/application_controller.rb
@@ -251,6 +253,7 @@ test_files:
251
253
  - spec/integration/apps/rack_app/config.ru
252
254
  - spec/integration/apps/rails_app/README.rdoc
253
255
  - spec/integration/apps/rails_app/Rakefile
256
+ - spec/integration/apps/rails_app/app/assets/images/grumpy-cat.gif
254
257
  - spec/integration/apps/rails_app/app/assets/javascripts/application.js
255
258
  - spec/integration/apps/rails_app/app/assets/stylesheets/application.css
256
259
  - spec/integration/apps/rails_app/app/controllers/application_controller.rb