accept_headers 0.0.1
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 +7 -0
- data/.gitignore +14 -0
- data/.travis.yml +17 -0
- data/CHANGELOG.md +3 -0
- data/Gemfile +16 -0
- data/Guardfile +9 -0
- data/LICENSE.txt +22 -0
- data/README.md +117 -0
- data/Rakefile +10 -0
- data/accept_headers.gemspec +27 -0
- data/lib/accept_headers.rb +8 -0
- data/lib/accept_headers/acceptable.rb +51 -0
- data/lib/accept_headers/charset.rb +53 -0
- data/lib/accept_headers/encoding.rb +53 -0
- data/lib/accept_headers/language.rb +83 -0
- data/lib/accept_headers/media_type.rb +114 -0
- data/lib/accept_headers/version.rb +3 -0
- data/spec/charset_spec.rb +126 -0
- data/spec/encoding_spec.rb +126 -0
- data/spec/language_spec.rb +149 -0
- data/spec/media_type_spec.rb +173 -0
- data/spec/spec_helper.rb +21 -0
- data/wercker.yml +27 -0
- metadata +142 -0
@@ -0,0 +1,173 @@
|
|
1
|
+
require_relative "spec_helper"
|
2
|
+
|
3
|
+
module AcceptHeaders
|
4
|
+
describe MediaType do
|
5
|
+
subject do
|
6
|
+
AcceptHeaders::MediaType
|
7
|
+
end
|
8
|
+
|
9
|
+
it "defaults type to *" do
|
10
|
+
subject.new.type.must_equal '*'
|
11
|
+
end
|
12
|
+
|
13
|
+
it "defaults subtype to *" do
|
14
|
+
subject.new('text').subtype.must_equal '*'
|
15
|
+
end
|
16
|
+
|
17
|
+
it "strips and downcases the type" do
|
18
|
+
subject.new("\t\nTEXt\s\r", '*').type.must_equal "text"
|
19
|
+
end
|
20
|
+
|
21
|
+
it "strips and downcases the subtype" do
|
22
|
+
subject.new("text", "\s\npLAIn\r\t").subtype.must_equal "plain"
|
23
|
+
end
|
24
|
+
|
25
|
+
it "sets subtype to * if value passed in is nil and type is *" do
|
26
|
+
subject.new('*', nil).subtype.must_equal '*'
|
27
|
+
end
|
28
|
+
|
29
|
+
it "strips the keys and values in the params hash" do
|
30
|
+
subject.new('*', '*', params: { "\s\nLEVEL\r\t" => "\t\nX\s\n"}).params['LEVEL'].must_equal 'X'
|
31
|
+
end
|
32
|
+
|
33
|
+
it "optionally supports a q argument" do
|
34
|
+
subject.new('text', 'html', q: 0.8).q.must_equal 0.8
|
35
|
+
end
|
36
|
+
|
37
|
+
it "optionally supports a params argument" do
|
38
|
+
subject.new('text', 'html', params: { 'level' => '1' }).params['level'].must_equal '1'
|
39
|
+
end
|
40
|
+
|
41
|
+
it "compares on q value all other values remaining equal" do
|
42
|
+
subject.new(q: 0.514).must_be :>, subject.new(q: 0.1)
|
43
|
+
subject.new(q: 0).must_be :<, subject.new(q: 1)
|
44
|
+
subject.new(q: 0.9).must_equal subject.new(q: 0.9)
|
45
|
+
end
|
46
|
+
|
47
|
+
it "compares on subtype then type all other values remaining equal" do
|
48
|
+
subject.new('text', 'html').must_be :>, subject.new('text', '*')
|
49
|
+
subject.new('*', '*').must_be :<, subject.new('text', '*')
|
50
|
+
end
|
51
|
+
|
52
|
+
it "raises an InvalidQError if q can't be converted to a float" do
|
53
|
+
e = -> do
|
54
|
+
subject.new('text', 'html', q: 'a')
|
55
|
+
end.must_raise MediaType::InvalidQError
|
56
|
+
|
57
|
+
e.message.must_equal 'invalid value for Float(): "a"'
|
58
|
+
|
59
|
+
subject.new('text', 'html', q: '1')
|
60
|
+
end
|
61
|
+
|
62
|
+
it "raises an OutOfRangeError unless q value is between 0 and 1" do
|
63
|
+
[-1.0, -0.1, 1.1].each do |q|
|
64
|
+
e = -> do
|
65
|
+
subject.new('text', 'html', q: q)
|
66
|
+
end.must_raise MediaType::OutOfRangeError
|
67
|
+
|
68
|
+
e.message.must_equal "q must be between 0 and 1"
|
69
|
+
end
|
70
|
+
|
71
|
+
subject.new('text', 'html', q: 1)
|
72
|
+
subject.new('text', 'html', q: 0)
|
73
|
+
end
|
74
|
+
|
75
|
+
it "raises an InvalidPrecisionError if q has more than a precision of 3" do
|
76
|
+
e = -> do
|
77
|
+
subject.new('text', 'html', q: 0.1234)
|
78
|
+
end.must_raise MediaType::InvalidPrecisionError
|
79
|
+
|
80
|
+
e.message.must_equal "q must be at most 3 decimal places"
|
81
|
+
|
82
|
+
subject.new('text', 'html', q: 0.123)
|
83
|
+
end
|
84
|
+
|
85
|
+
it "converts to hash" do
|
86
|
+
subject.new('text', 'html').to_h.must_equal({
|
87
|
+
type: 'text',
|
88
|
+
subtype: 'html',
|
89
|
+
q: 1.0,
|
90
|
+
params: {}
|
91
|
+
})
|
92
|
+
end
|
93
|
+
|
94
|
+
it "convers to string" do
|
95
|
+
s = subject.new('text', 'html', q: 0.9, params: { 'level' => '1' }).to_s
|
96
|
+
s.must_equal "text/html;q=0.9;level=1"
|
97
|
+
end
|
98
|
+
|
99
|
+
describe "parsing an accept header" do
|
100
|
+
it "returns a sorted array of media types" do
|
101
|
+
subject.parse("audio/*; q=0.2, audio/basic").must_equal [
|
102
|
+
MediaType.new('audio', 'basic'),
|
103
|
+
MediaType.new('audio', '*', q: 0.2)
|
104
|
+
]
|
105
|
+
subject.parse("text/plain; q=0.5, text/html, text/x-dvi; q=0.8, text/x-c").must_equal [
|
106
|
+
MediaType.new('text', 'html'),
|
107
|
+
MediaType.new('text', 'x-c'),
|
108
|
+
MediaType.new('text', 'x-dvi', q: 0.8),
|
109
|
+
MediaType.new('text', 'plain', q: 0.5)
|
110
|
+
]
|
111
|
+
|
112
|
+
subject.parse("text/*, text/html, text/html;level=1, */*").must_equal [
|
113
|
+
MediaType.new('text', 'html', params: { 'level' => '1' }),
|
114
|
+
MediaType.new('text', 'html'),
|
115
|
+
MediaType.new('text', '*'),
|
116
|
+
MediaType.new('*', '*')
|
117
|
+
]
|
118
|
+
|
119
|
+
subject.parse("text/*;q=0.3, text/html;q=0.7, text/html;level=1, text/html;level=2;q=0.4, */*;q=0.5").must_equal [
|
120
|
+
MediaType.new('text', 'html', params: { 'level' => '1' }),
|
121
|
+
MediaType.new('text', 'html', q: 0.7),
|
122
|
+
MediaType.new('*', '*', q: 0.5),
|
123
|
+
MediaType.new('text', 'html', q: 0.4, params: { 'level' => '2' }),
|
124
|
+
MediaType.new('text', '*', q: 0.3)
|
125
|
+
]
|
126
|
+
end
|
127
|
+
|
128
|
+
it "sets media type to */* when the accept header is empty" do
|
129
|
+
subject.parse('').must_equal [
|
130
|
+
MediaType.new('*', '*')
|
131
|
+
]
|
132
|
+
end
|
133
|
+
|
134
|
+
it "sets media type to */* when the type is only *" do
|
135
|
+
subject.parse('*').must_equal [
|
136
|
+
MediaType.new('*', '*')
|
137
|
+
]
|
138
|
+
end
|
139
|
+
|
140
|
+
it "defaults q to 1 if it's not explicitly specified" do
|
141
|
+
subject.parse("text/plain").must_equal [
|
142
|
+
MediaType.new('text', 'plain', q: 1.0)
|
143
|
+
]
|
144
|
+
end
|
145
|
+
|
146
|
+
it "strips whitespace from between media types" do
|
147
|
+
subject.parse("\ttext/plain\r,\napplication/json\s").must_equal [
|
148
|
+
MediaType.new('text', 'plain'),
|
149
|
+
MediaType.new('application', 'json')
|
150
|
+
]
|
151
|
+
end
|
152
|
+
|
153
|
+
it "strips whitespace around q and params" do
|
154
|
+
subject.parse("text/plain;\tq\r=\n1, application/json;q=0.8;\slevel\t\t=\r\n1\n").must_equal [
|
155
|
+
MediaType.new('text', 'plain'),
|
156
|
+
MediaType.new('application', 'json', q: 0.8, params: { "level" => "1" })
|
157
|
+
]
|
158
|
+
end
|
159
|
+
|
160
|
+
it "has a q value of 0.001 when parsed q is invalid" do
|
161
|
+
subject.parse("text/plain;q=x").must_equal [
|
162
|
+
MediaType.new('text', 'plain', q: 0.001)
|
163
|
+
]
|
164
|
+
end
|
165
|
+
|
166
|
+
it "skips invalid media types" do
|
167
|
+
subject.parse("text/html, text/plain/omg;q=0.9").must_equal [
|
168
|
+
MediaType.new('text', 'html', q: 1)
|
169
|
+
]
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
require "minitest/autorun"
|
2
|
+
require "minitest/focus"
|
3
|
+
require "awesome_print"
|
4
|
+
require "pry"
|
5
|
+
|
6
|
+
if defined?(CodeClimate)
|
7
|
+
CodeClimate::TestReporter.configure do |config|
|
8
|
+
config.logger.level = Logger::WARN
|
9
|
+
end
|
10
|
+
|
11
|
+
SimpleCov.start do
|
12
|
+
formatter SimpleCov::Formatter::MultiFormatter[
|
13
|
+
SimpleCov::Formatter::HTMLFormatter,
|
14
|
+
CodeClimate::TestReporter::Formatter
|
15
|
+
]
|
16
|
+
end
|
17
|
+
elsif defined?(SimpleCov)
|
18
|
+
SimpleCov.start
|
19
|
+
end
|
20
|
+
|
21
|
+
require_relative "../lib/accept_headers"
|
data/wercker.yml
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
box: wercker/rvm
|
2
|
+
# Build definition
|
3
|
+
build:
|
4
|
+
# The steps that will be executed on build
|
5
|
+
# See the Ruby section on the wercker devcenter:
|
6
|
+
# http://devcenter.wercker.com/articles/languages/ruby.html
|
7
|
+
steps:
|
8
|
+
# Uncomment this to force RVM to use a specific Ruby version
|
9
|
+
- rvm-use:
|
10
|
+
version: 2.1.5
|
11
|
+
|
12
|
+
# A step that executes `bundle install` command
|
13
|
+
- bundle-install
|
14
|
+
|
15
|
+
# A custom script step, name value is used in the UI
|
16
|
+
# and the code value contains the command that get executed
|
17
|
+
- script:
|
18
|
+
name: echo ruby information
|
19
|
+
code: |
|
20
|
+
echo "ruby version $(ruby --version) running"
|
21
|
+
echo "from location $(which ruby)"
|
22
|
+
echo -p "gem list: $(gem list)"
|
23
|
+
|
24
|
+
# Add more steps here:
|
25
|
+
- script:
|
26
|
+
name: rake
|
27
|
+
code: bundle exec rake
|
metadata
ADDED
@@ -0,0 +1,142 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: accept_headers
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Jack Chu
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-11-14 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.7'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.7'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ~>
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: minitest
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ~>
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '5.4'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '5.4'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: guard
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: guard-minitest
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
description: A ruby library that parses and sorts http accept headers. Adheres to
|
84
|
+
RFC 2616.
|
85
|
+
email:
|
86
|
+
- kamuigt@gmail.com
|
87
|
+
executables: []
|
88
|
+
extensions: []
|
89
|
+
extra_rdoc_files: []
|
90
|
+
files:
|
91
|
+
- .gitignore
|
92
|
+
- .travis.yml
|
93
|
+
- CHANGELOG.md
|
94
|
+
- Gemfile
|
95
|
+
- Guardfile
|
96
|
+
- LICENSE.txt
|
97
|
+
- README.md
|
98
|
+
- Rakefile
|
99
|
+
- accept_headers.gemspec
|
100
|
+
- lib/accept_headers.rb
|
101
|
+
- lib/accept_headers/acceptable.rb
|
102
|
+
- lib/accept_headers/charset.rb
|
103
|
+
- lib/accept_headers/encoding.rb
|
104
|
+
- lib/accept_headers/language.rb
|
105
|
+
- lib/accept_headers/media_type.rb
|
106
|
+
- lib/accept_headers/version.rb
|
107
|
+
- spec/charset_spec.rb
|
108
|
+
- spec/encoding_spec.rb
|
109
|
+
- spec/language_spec.rb
|
110
|
+
- spec/media_type_spec.rb
|
111
|
+
- spec/spec_helper.rb
|
112
|
+
- wercker.yml
|
113
|
+
homepage: ''
|
114
|
+
licenses:
|
115
|
+
- MIT
|
116
|
+
metadata: {}
|
117
|
+
post_install_message:
|
118
|
+
rdoc_options: []
|
119
|
+
require_paths:
|
120
|
+
- lib
|
121
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
122
|
+
requirements:
|
123
|
+
- - '>='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0'
|
126
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
127
|
+
requirements:
|
128
|
+
- - '>='
|
129
|
+
- !ruby/object:Gem::Version
|
130
|
+
version: '0'
|
131
|
+
requirements: []
|
132
|
+
rubyforge_project:
|
133
|
+
rubygems_version: 2.4.3
|
134
|
+
signing_key:
|
135
|
+
specification_version: 4
|
136
|
+
summary: A ruby library that parses and sorts http accept headers.
|
137
|
+
test_files:
|
138
|
+
- spec/charset_spec.rb
|
139
|
+
- spec/encoding_spec.rb
|
140
|
+
- spec/language_spec.rb
|
141
|
+
- spec/media_type_spec.rb
|
142
|
+
- spec/spec_helper.rb
|