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.
@@ -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
@@ -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