mime-types 2.0 → 2.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 +9 -9
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +1 -5
- data/.travis.yml +24 -13
- data/Contributing.rdoc +19 -9
- data/Gemfile +3 -15
- data/History-Types.rdoc +209 -0
- data/History.rdoc +19 -1
- data/Manifest.txt +3 -1
- data/README.rdoc +43 -9
- data/Rakefile +8 -15
- data/data/mime-types.json +1 -1
- data/lib/mime.rb +2 -1
- data/lib/mime/type.rb +56 -18
- data/lib/mime/types.rb +1 -1
- data/lib/mime/types/cache.rb +1 -1
- data/support/apache_mime_types.rb +97 -0
- data/support/iana_registry.rb +148 -0
- data/test/test_mime_type.rb +11 -3
- data/test/test_mime_types_class.rb +4 -4
- metadata +29 -33
- metadata.gz.sig +0 -0
- data/support/iana_downloader.rb +0 -201
data/test/test_mime_type.rb
CHANGED
@@ -199,6 +199,12 @@ class TestMIMEType < Minitest::Test
|
|
199
199
|
yaml = make_yaml_mime_type
|
200
200
|
yaml.extensions = 'yaml'
|
201
201
|
assert_equal(%w(yaml), yaml.extensions)
|
202
|
+
|
203
|
+
yaml.extensions = %w(yaml yaml)
|
204
|
+
assert_equal(%w(yaml), yaml.extensions)
|
205
|
+
|
206
|
+
yaml.extensions = %w(yz yaml yz yml)
|
207
|
+
assert_equal(%w(yaml yml yz), yaml.extensions)
|
202
208
|
end
|
203
209
|
|
204
210
|
def test_like_eh
|
@@ -450,6 +456,9 @@ class TestMIMEType < Minitest::Test
|
|
450
456
|
yaml = make_yaml_mime_type
|
451
457
|
yaml.references = "IANA"
|
452
458
|
assert_equal(%W(IANA), yaml.references)
|
459
|
+
|
460
|
+
yaml.references = %w(IANA IANA)
|
461
|
+
assert_equal(%W(IANA), yaml.references)
|
453
462
|
end
|
454
463
|
|
455
464
|
def test_url
|
@@ -460,7 +469,7 @@ class TestMIMEType < Minitest::Test
|
|
460
469
|
|
461
470
|
def test_url_equals
|
462
471
|
yaml = make_yaml_mime_type
|
463
|
-
assert_deprecated("MIME::Type#url="
|
472
|
+
assert_deprecated("MIME::Type#url=") do
|
464
473
|
yaml.url = "IANA"
|
465
474
|
end
|
466
475
|
assert_equal(%W(IANA), yaml.url)
|
@@ -469,11 +478,10 @@ class TestMIMEType < Minitest::Test
|
|
469
478
|
def test_urls
|
470
479
|
yaml = make_yaml_mime_type
|
471
480
|
assert_empty(yaml.urls)
|
472
|
-
yaml.references = %w(IANA RFC123 DRAFT:xyz
|
481
|
+
yaml.references = %w(IANA RFC123 DRAFT:xyz [abc])
|
473
482
|
assert_equal(%w(http://www.iana.org/assignments/media-types/text/yaml
|
474
483
|
http://rfc-editor.org/rfc/rfc123.txt
|
475
484
|
http://datatracker.ietf.org/public/idindex.cgi?command=id_details&filename=xyz
|
476
|
-
http://www.ltsw.se/knbase/internet/text.htp
|
477
485
|
http://www.iana.org/assignments/contact-people.htm#abc),
|
478
486
|
yaml.urls)
|
479
487
|
yaml.references = '[def=lax]'
|
@@ -22,21 +22,21 @@ class TestMIMETypesQueryClassMethods < Minitest::Test
|
|
22
22
|
def test_index_with_mime_type
|
23
23
|
xtxp = MIME::Type.new('x-text/x-plain')
|
24
24
|
assert_includes(MIME::Types[xtxp], 'text/plain')
|
25
|
-
assert_equal(
|
25
|
+
assert_equal(1, MIME::Types[xtxp].size)
|
26
26
|
end
|
27
27
|
|
28
28
|
def test_index_with_regex
|
29
29
|
assert_includes(MIME::Types[/plain/], 'text/plain')
|
30
|
-
assert_equal(
|
30
|
+
assert_equal(1, MIME::Types[/plain/].size)
|
31
31
|
end
|
32
32
|
|
33
33
|
def test_index_with_string
|
34
34
|
assert_includes(MIME::Types['text/plain'], 'text/plain')
|
35
|
-
assert_equal(
|
35
|
+
assert_equal(1, MIME::Types['text/plain'].size)
|
36
36
|
end
|
37
37
|
|
38
38
|
def test_index_with_complete_flag
|
39
|
-
assert_empty(MIME::Types['
|
39
|
+
assert_empty(MIME::Types['application/1d-interleaved-parityfec', complete: true])
|
40
40
|
refute_empty(MIME::Types['text/plain', complete: true])
|
41
41
|
end
|
42
42
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mime-types
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '2.
|
4
|
+
version: '2.1'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Austin Ziegler
|
@@ -36,7 +36,7 @@ cert_chain:
|
|
36
36
|
SlF1Y3hPVG1URjFOYkxGcGlSd1FVWjF6b1piTmcyZTdtU2hjL2VleG5WTFdL
|
37
37
|
Rkt4Um9QNgpLUGozV29EK3NwQjhmQT09Ci0tLS0tRU5EIENFUlRJRklDQVRF
|
38
38
|
LS0tLS0K
|
39
|
-
date:
|
39
|
+
date: 2014-01-26 00:00:00.000000000 Z
|
40
40
|
dependencies:
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rubyforge
|
@@ -58,14 +58,14 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - ~>
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '5.
|
61
|
+
version: '5.2'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - ~>
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '5.
|
68
|
+
version: '5.2'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rdoc
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -80,20 +80,6 @@ dependencies:
|
|
80
80
|
- - ~>
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '4.0'
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: hoe-bundler
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - ~>
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: '1.2'
|
90
|
-
type: :development
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - ~>
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: '1.2'
|
97
83
|
- !ruby/object:Gem::Dependency
|
98
84
|
name: hoe-doofus
|
99
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -198,14 +184,14 @@ dependencies:
|
|
198
184
|
requirements:
|
199
185
|
- - ~>
|
200
186
|
- !ruby/object:Gem::Version
|
201
|
-
version: '3.
|
187
|
+
version: '3.8'
|
202
188
|
type: :development
|
203
189
|
prerelease: false
|
204
190
|
version_requirements: !ruby/object:Gem::Requirement
|
205
191
|
requirements:
|
206
192
|
- - ~>
|
207
193
|
- !ruby/object:Gem::Version
|
208
|
-
version: '3.
|
194
|
+
version: '3.8'
|
209
195
|
description: ! 'The mime-types library provides a library and registry for information
|
210
196
|
about
|
211
197
|
|
@@ -235,34 +221,42 @@ description: ! 'The mime-types library provides a library and registry for infor
|
|
235
221
|
registrations (see below for the link), RFCs, and W3C recommendations.
|
236
222
|
|
237
223
|
|
238
|
-
|
224
|
+
This is release 2.1, mostly changing how the MIME type registry is updated from
|
239
225
|
|
240
|
-
|
226
|
+
the IANA registry (the format of which was incompatibly changed shortly before
|
241
227
|
|
242
|
-
|
228
|
+
this release) and taking advantage of the extra data available from IANA
|
243
229
|
|
244
|
-
|
230
|
+
registry in the form of MIME::Type#xrefs. In addition, the {LTSW
|
245
231
|
|
232
|
+
list}[http://www.ltsw.se/knbase/internet/mime.htp] has been dropped as a
|
246
233
|
|
247
|
-
|
234
|
+
supported list.
|
248
235
|
|
249
|
-
MIME::Types for Perl by Mark Overmeer, copyright 2001 - 2009. It is built to
|
250
236
|
|
251
|
-
|
237
|
+
As a reminder, mime-types 2.x is no longer compatible with Ruby 1.8 and
|
238
|
+
|
239
|
+
mime-types 1.x is only being maintained for security issues. No new MIME types
|
252
240
|
|
253
|
-
|
241
|
+
or features will be added.
|
242
|
+
|
243
|
+
|
244
|
+
mime-types (previously called MIME::Types for Ruby) was originally based on
|
245
|
+
|
246
|
+
MIME::Types for Perl by Mark Overmeer, copyright 2001 - 2009. It is built to
|
254
247
|
|
255
|
-
|
248
|
+
conform to the MIME types of RFCs 2045 and 2231. It tracks the {IANA Media
|
256
249
|
|
257
|
-
|
250
|
+
Types registry}[https://www.iana.org/assignments/media-types/media-types.xhtml]
|
258
251
|
|
259
|
-
|
252
|
+
with some types added by the users of mime-types.'
|
260
253
|
email:
|
261
254
|
- austin@rubyforge.org
|
262
255
|
executables: []
|
263
256
|
extensions: []
|
264
257
|
extra_rdoc_files:
|
265
258
|
- Contributing.rdoc
|
259
|
+
- History-Types.rdoc
|
266
260
|
- History.rdoc
|
267
261
|
- Licence.rdoc
|
268
262
|
- Manifest.txt
|
@@ -277,6 +271,7 @@ files:
|
|
277
271
|
- .travis.yml
|
278
272
|
- Contributing.rdoc
|
279
273
|
- Gemfile
|
274
|
+
- History-Types.rdoc
|
280
275
|
- History.rdoc
|
281
276
|
- Licence.rdoc
|
282
277
|
- Manifest.txt
|
@@ -292,9 +287,10 @@ files:
|
|
292
287
|
- lib/mime/types/cache.rb
|
293
288
|
- lib/mime/types/loader.rb
|
294
289
|
- lib/mime/types/loader_path.rb
|
290
|
+
- support/apache_mime_types.rb
|
295
291
|
- support/benchmarker.rb
|
296
292
|
- support/convert.rb
|
297
|
-
- support/
|
293
|
+
- support/iana_registry.rb
|
298
294
|
- test/fixture/json.json
|
299
295
|
- test/fixture/old-data
|
300
296
|
- test/fixture/yaml.yaml
|
@@ -329,7 +325,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
329
325
|
version: '0'
|
330
326
|
requirements: []
|
331
327
|
rubyforge_project: mime-types
|
332
|
-
rubygems_version: 2.
|
328
|
+
rubygems_version: 2.2.1
|
333
329
|
signing_key:
|
334
330
|
specification_version: 4
|
335
331
|
summary: The mime-types library provides a library and registry for information about
|
metadata.gz.sig
CHANGED
Binary file
|
data/support/iana_downloader.rb
DELETED
@@ -1,201 +0,0 @@
|
|
1
|
-
# -*- ruby encoding: utf-8 -*-
|
2
|
-
|
3
|
-
$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
|
4
|
-
|
5
|
-
require 'open-uri'
|
6
|
-
require 'nokogiri'
|
7
|
-
require 'cgi'
|
8
|
-
require 'fileutils'
|
9
|
-
require 'yaml'
|
10
|
-
|
11
|
-
ENV['RUBY_MIME_TYPES_LAZY_LOAD'] = 'yes'
|
12
|
-
require 'mime/types'
|
13
|
-
|
14
|
-
class IANADownloader
|
15
|
-
INDEX_URL = %q(https://www.iana.org/assignments/media-types/)
|
16
|
-
MIME_HREF = %r{/assignments/media-types/(.+)/?$}
|
17
|
-
|
18
|
-
def self.download_to(destination)
|
19
|
-
new(destination).download_all
|
20
|
-
end
|
21
|
-
|
22
|
-
attr_reader :destination
|
23
|
-
|
24
|
-
def initialize(destination = nil)
|
25
|
-
@destination =
|
26
|
-
File.expand_path(destination ||
|
27
|
-
File.expand_path('../../type-lists', __FILE__))
|
28
|
-
end
|
29
|
-
|
30
|
-
def download_all
|
31
|
-
puts "Downloading index of MIME types from #{INDEX_URL}."
|
32
|
-
index = Nokogiri::HTML(open(INDEX_URL) { |f| f.read })
|
33
|
-
index.xpath('//a').each do |tag|
|
34
|
-
next unless tag['href']
|
35
|
-
href_match = MIME_HREF.match(tag['href'])
|
36
|
-
next unless href_match
|
37
|
-
href = href_match.captures.first
|
38
|
-
next if tag.content == 'example'
|
39
|
-
download_one(href, tag.content, href)
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
def download_one(url, name = url, type = nil)
|
44
|
-
if url =~ %r{^https?://}
|
45
|
-
name = File.basename(url) if name == url
|
46
|
-
else
|
47
|
-
url = File.join(INDEX_URL, url)
|
48
|
-
end
|
49
|
-
|
50
|
-
Parser.download(name, from: url, to: @destination, type: type)
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
class IANADownloader::Parser
|
55
|
-
def self.download(name, options = {})
|
56
|
-
new(name, options) do |parser|
|
57
|
-
parser.parse(parser.download)
|
58
|
-
parser.save
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
def initialize(name, options = {})
|
63
|
-
raise ArgumentError, ":from not specified" unless options[:from]
|
64
|
-
raise ArgumentError, ":to not specified" unless options[:to]
|
65
|
-
|
66
|
-
@name = "#{File.basename(name, '.yml')}.yml"
|
67
|
-
@from = options[:from]
|
68
|
-
@to = File.expand_path(options[:to])
|
69
|
-
@type = File.basename(options[:type] || name, '.yml')
|
70
|
-
@file = File.join(@to, @name)
|
71
|
-
@types = load_mime_types || MIME::Types.new
|
72
|
-
|
73
|
-
yield self if block_given?
|
74
|
-
end
|
75
|
-
|
76
|
-
def download
|
77
|
-
puts "Downloading #{@name} from #{@from}"
|
78
|
-
Nokogiri::HTML(open(@from) { |f| f.read })
|
79
|
-
end
|
80
|
-
|
81
|
-
def parse(html)
|
82
|
-
nodes = html.xpath('//table//table//tr')
|
83
|
-
|
84
|
-
# How many <td> children does the first node have?
|
85
|
-
node_count = child_elems(nodes.first).size
|
86
|
-
|
87
|
-
if node_count == 1
|
88
|
-
# The title node doesn't have what we expect. Let's try it based on
|
89
|
-
# the first real node.
|
90
|
-
node_count = child_elems(nodes.first.next).size
|
91
|
-
end
|
92
|
-
|
93
|
-
nodes.each do |node|
|
94
|
-
next if node == nodes.first
|
95
|
-
|
96
|
-
elems = child_elems(node)
|
97
|
-
next if elems.size.zero?
|
98
|
-
|
99
|
-
if elems.size != node_count
|
100
|
-
warn "size mismatch (#{elems.size} != #{node_count}) in node: #{node}"
|
101
|
-
next
|
102
|
-
end
|
103
|
-
|
104
|
-
sub_ix, ref_ix = case elems.size
|
105
|
-
when 3
|
106
|
-
[ 1, 2 ]
|
107
|
-
when 4
|
108
|
-
[ 1, 3 ]
|
109
|
-
else
|
110
|
-
warn "size error (#{elems.size} != {3,4}) in node: #{node}"
|
111
|
-
raise
|
112
|
-
end
|
113
|
-
subtype = elems[sub_ix].content.chomp.strip
|
114
|
-
refs = child_elems(elems[ref_ix]).map { |ref|
|
115
|
-
ref = ref.xpath('a') unless ref.name == 'a'
|
116
|
-
[ ref ].flatten.map { |r| href_to_ref(r) }
|
117
|
-
|
118
|
-
}.flatten
|
119
|
-
|
120
|
-
content_type = [ @type, subtype].join('/')
|
121
|
-
use_instead = nil
|
122
|
-
obsolete = false
|
123
|
-
|
124
|
-
if content_type =~ OBSOLETE
|
125
|
-
content_type = $1
|
126
|
-
obsolete = true
|
127
|
-
elsif content_type =~ DEPRECATED
|
128
|
-
content_type = $1
|
129
|
-
use_instead = [ $2 ]
|
130
|
-
obsolete = true
|
131
|
-
end
|
132
|
-
|
133
|
-
types = @types.select { |t|
|
134
|
-
(t.content_type == content_type)
|
135
|
-
}
|
136
|
-
|
137
|
-
if types.empty?
|
138
|
-
MIME::Type.new(content_type) do |mt|
|
139
|
-
mt.references = %w(IANA) + refs
|
140
|
-
mt.registered = true
|
141
|
-
mt.obsolete = obsolete if obsolete
|
142
|
-
mt.use_instead = use_instead if use_instead
|
143
|
-
@types << mt
|
144
|
-
end
|
145
|
-
else
|
146
|
-
types.each { |mt|
|
147
|
-
mt.references = %w(IANA) + refs
|
148
|
-
mt.registered = true
|
149
|
-
mt.obsolete = obsolete if obsolete
|
150
|
-
mt.use_instead = use_instead if use_instead
|
151
|
-
}
|
152
|
-
end
|
153
|
-
end
|
154
|
-
end
|
155
|
-
|
156
|
-
def save
|
157
|
-
FileUtils.mkdir_p(@to)
|
158
|
-
File.open(@file, 'wb') { |f|
|
159
|
-
f.puts @types.map.to_a.sort.to_yaml
|
160
|
-
}
|
161
|
-
end
|
162
|
-
|
163
|
-
private
|
164
|
-
def child_elems(node)
|
165
|
-
node.children.select { |n| n.elem? }
|
166
|
-
end
|
167
|
-
|
168
|
-
def load_mime_types
|
169
|
-
if File.exist?(@file)
|
170
|
-
MIME::Types::Loader.load_from_yaml(@file)
|
171
|
-
end
|
172
|
-
end
|
173
|
-
|
174
|
-
def href_to_ref(ref)
|
175
|
-
case ref['href']
|
176
|
-
when CONTACT_PEOPLE
|
177
|
-
tag = CGI::unescape($1).chomp.strip
|
178
|
-
if tag == ref.content
|
179
|
-
"[#{ref.content}]"
|
180
|
-
else
|
181
|
-
"[#{ref.content}=#{tag}]"
|
182
|
-
end
|
183
|
-
when RFC_EDITOR, IETF_RFC, IETF_RFC_TOOLS
|
184
|
-
"RFC#$1"
|
185
|
-
when RFC_BAD_EDITOR
|
186
|
-
ref.content
|
187
|
-
when %r{(https?://.*)}
|
188
|
-
"{#{ref.content}=#$1}"
|
189
|
-
else
|
190
|
-
ref
|
191
|
-
end
|
192
|
-
end
|
193
|
-
|
194
|
-
CONTACT_PEOPLE = %r{https?://www.iana.org/assignments/contact-people.html?l?#(.*)}
|
195
|
-
RFC_EDITOR = %r{https?://www.rfc-editor.org/rfc/rfc(\d+).txt}
|
196
|
-
RFC_BAD_EDITOR = %r{https?://www.rfc-editor.org/rfc/rfcxxxx.txt}
|
197
|
-
IETF_RFC = %r{https?://www.ietf.org/rfc/rfc(\d+).txt}
|
198
|
-
IETF_RFC_TOOLS = %r{https?://tools.ietf.org/html/rfc(\d+)}
|
199
|
-
OBSOLETE = %r{(.+)\s+\((?:obsolete|deprecated)\)}i
|
200
|
-
DEPRECATED = %r{(.+)\s+-\s+DEPRECATED\s+-\s+Please\s+use\s+(.+)}
|
201
|
-
end
|