mime-types 2.99.3 → 3.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +5 -5
  2. data/{Code-of-Conduct.rdoc → Code-of-Conduct.md} +19 -20
  3. data/Contributing.md +143 -0
  4. data/History.md +240 -0
  5. data/{Licence.rdoc → Licence.md} +4 -18
  6. data/Manifest.txt +8 -25
  7. data/README.rdoc +62 -73
  8. data/Rakefile +175 -58
  9. data/lib/mime-types.rb +1 -1
  10. data/lib/mime/type.rb +213 -424
  11. data/lib/mime/type/columnar.rb +29 -62
  12. data/lib/mime/types.rb +46 -141
  13. data/lib/mime/types/_columnar.rb +136 -0
  14. data/lib/mime/types/cache.rb +51 -73
  15. data/lib/mime/types/columnar.rb +2 -147
  16. data/lib/mime/types/container.rb +96 -0
  17. data/lib/mime/types/deprecations.rb +4 -25
  18. data/lib/mime/types/full.rb +19 -0
  19. data/lib/mime/types/loader.rb +12 -141
  20. data/lib/mime/types/logger.rb +5 -1
  21. data/lib/mime/types/registry.rb +90 -0
  22. data/test/minitest_helper.rb +5 -13
  23. data/test/test_mime_type.rb +470 -456
  24. data/test/test_mime_types.rb +135 -87
  25. data/test/test_mime_types_cache.rb +82 -54
  26. data/test/test_mime_types_class.rb +118 -98
  27. data/test/test_mime_types_lazy.rb +26 -24
  28. data/test/test_mime_types_loader.rb +6 -33
  29. metadata +107 -64
  30. data/Contributing.rdoc +0 -170
  31. data/History-Types.rdoc +0 -454
  32. data/History.rdoc +0 -590
  33. data/data/mime-types.json +0 -1
  34. data/data/mime.content_type.column +0 -1980
  35. data/data/mime.docs.column +0 -1980
  36. data/data/mime.encoding.column +0 -1980
  37. data/data/mime.friendly.column +0 -1980
  38. data/data/mime.obsolete.column +0 -1980
  39. data/data/mime.registered.column +0 -1980
  40. data/data/mime.signature.column +0 -1980
  41. data/data/mime.use_instead.column +0 -1980
  42. data/data/mime.xrefs.column +0 -1980
  43. data/docs/COPYING.txt +0 -339
  44. data/docs/artistic.txt +0 -127
  45. data/lib/mime/types/loader_path.rb +0 -15
  46. data/support/apache_mime_types.rb +0 -108
  47. data/support/benchmarks/load.rb +0 -64
  48. data/support/benchmarks/load_allocations.rb +0 -83
  49. data/support/benchmarks/object_counts.rb +0 -41
  50. data/support/convert.rb +0 -158
  51. data/support/convert/columnar.rb +0 -88
  52. data/support/iana_registry.rb +0 -172
@@ -1,88 +0,0 @@
1
- require 'convert'
2
-
3
- class Convert::Columnar < Convert
4
- class << self
5
- # Converts from YAML to Columnar format. This *always* converts to multiple
6
- # files.
7
- def from_yaml_to_columnar(args)
8
- from_yaml(yaml_path(args.source)).
9
- to_columnar(destination: columnar_path(args.destination))
10
- end
11
-
12
- private
13
-
14
- def columnar_path(path)
15
- path_or_default(path, 'data')
16
- end
17
- end
18
-
19
- # Convert the data to multiple text files.
20
- def to_columnar(options = {})
21
- root = options[:destination] or require_destination!
22
- @root = must_be_directory!(root)
23
- @data = @loader.container.sort.map(&:to_h)
24
-
25
- column_file('content_type') do |type|
26
- [ type['content-type'], Array(type['extensions']).join(' ') ].
27
- flatten.join(' ').strip
28
- end
29
-
30
- required_file('encoding')
31
- optional_file('docs')
32
- bool_file('obsolete')
33
- bool_file('registered')
34
- bool_file('signature')
35
- dict_file('xrefs')
36
- dict_file('friendly')
37
- optional_file('use_instead', 'use-instead')
38
- end
39
-
40
- def column_file(name, &block)
41
- File.open(File.join(@root, "mime.#{name}.column"), 'wb') do |f|
42
- f.puts @data.map(&block)
43
- end
44
- end
45
-
46
- def bool_file(name, *fields)
47
- fields = [ name ] if fields.empty?
48
- column_file(name) do |type|
49
- fields.map { |field|
50
- type[field] ? 1 : 0
51
- }.join(' ')
52
- end
53
- end
54
-
55
- def required_file(name, field = name)
56
- column_file(name) { |type| type[field] }
57
- end
58
-
59
- def optional_file(name, field = name)
60
- column_file(name) { |type| opt(type[field]) }
61
- end
62
-
63
- def array_file(name, field = name)
64
- column_file(name) { |type| arr(type[field]) }
65
- end
66
-
67
- def dict_file(name, field = name)
68
- column_file(name) { |type| dict(type[field]) }
69
- end
70
-
71
- def opt(value)
72
- value || '-'
73
- end
74
-
75
- def arr(value)
76
- Array(opt(value)).join('|')
77
- end
78
-
79
- def dict(value)
80
- if value
81
- value.sort.map { |k, v|
82
- [ k, Array(v).compact.join('^') ].join('^')
83
- }.join('|')
84
- else
85
- '-'
86
- end
87
- end
88
- end
@@ -1,172 +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 'pathname'
9
- require 'yaml'
10
-
11
- ENV['RUBY_MIME_TYPES_LAZY_LOAD'] = 'yes'
12
- require 'mime/types'
13
-
14
- class MIME::Types
15
- def self.deprecated(*_args, &_block)
16
- # We are an internal tool. Silence deprecation warnings.
17
- end
18
- end
19
-
20
- class MIME::Type
21
- public_constant :MEDIA_TYPE_RE if respond_to? :public_constant
22
- end
23
-
24
- class IANARegistry
25
- DEFAULTS = {
26
- url: %q(https://www.iana.org/assignments/media-types/media-types.xml),
27
- to: Pathname(__FILE__).join('../../type-lists')
28
- }.freeze.each_value(&:freeze)
29
-
30
- def self.download(options = {})
31
- dest = Pathname(options[:to] || DEFAULTS[:to]).expand_path
32
- url = options.fetch(:url, DEFAULTS[:url])
33
-
34
- puts 'Downloading IANA MIME type assignments.'
35
- puts "\t#{url}"
36
- xml = Nokogiri::XML(open(url) { |f| f.read })
37
-
38
- xml.css('registry registry').each do |registry|
39
- next if registry.at_css('title').text == 'example'
40
- new(registry: registry, to: dest) do |parser|
41
- puts "Extracting #{parser.type}/*."
42
- parser.parse
43
- parser.save
44
- end
45
- end
46
- end
47
-
48
- attr_reader :type
49
-
50
- def initialize(options = {})
51
- @registry = options.fetch(:registry)
52
- @to = Pathname(options.fetch(:to)).expand_path
53
- @type = @registry.at_css('title').text
54
- @name = "#{@type}.yaml"
55
- @file = @to.join(@name)
56
- @types = mime_types_for(@file)
57
-
58
- yield self if block_given?
59
- end
60
-
61
- ASSIGNMENT_FILE_REF = '{%s=http://www.iana.org/assignments/media-types/%s}'
62
-
63
- def parse
64
- @registry.css('record').each do |record|
65
- subtype = record.at_css('name').text
66
- obsolete = record.at_css('obsolete').text rescue nil
67
- use_instead = record.at_css('deprecated').text rescue nil
68
-
69
- if subtype =~ /OBSOLETE|DEPRECATE/i
70
- use_instead ||= $1 if subtype =~ /in favou?r of (#{MIME::Type::MEDIA_TYPE_RE})/
71
- obsolete = true
72
- end
73
-
74
- subtype, notes = subtype.split(/ /, 2)
75
-
76
- refs, xrefs = parse_refs_and_files(
77
- record.css('xref'),
78
- record.css('file'),
79
- subtype
80
- )
81
-
82
- xrefs['notes'] << notes if notes
83
-
84
- content_type = [ @type, subtype ].join('/')
85
-
86
- types = @types.select { |t|
87
- (t.content_type.downcase == content_type.downcase)
88
- }
89
-
90
- if types.empty?
91
- MIME::Type.new(content_type) do |mt|
92
- mt.xrefs = xrefs
93
- mt.registered = true
94
- mt.obsolete = obsolete if obsolete
95
- mt.use_instead = use_instead if use_instead
96
- @types << mt
97
- end
98
- else
99
- types.each { |mt|
100
- mt.registered = true
101
- mt.xrefs = xrefs
102
- mt.obsolete = obsolete if obsolete
103
- mt.use_instead = use_instead if use_instead
104
- }
105
- end
106
- end
107
- end
108
-
109
- def save
110
- @to.mkpath
111
- File.open(@file, 'wb') { |f| f.puts @types.map.to_a.sort.uniq.to_yaml }
112
- end
113
-
114
- private
115
-
116
- def mime_types_for(file)
117
- if file.exist?
118
- MIME::Types::Loader.load_from_yaml(file)
119
- else
120
- MIME::Types.new
121
- end
122
- end
123
-
124
- def parse_refs_and_files(refs, files, subtype)
125
- xr = MIME::Types::Container.new
126
- r = []
127
-
128
- refs.each do |xref|
129
- type = xref['type']
130
- data = xref['data']
131
-
132
- next if data.nil? || data.empty?
133
-
134
- r << ref_from_type(type, data)
135
-
136
- xr[type] << data
137
- end
138
-
139
- files.each do |file|
140
- file_name = if file.text == subtype
141
- [ @type, subtype ].join('/')
142
- else
143
- file.text
144
- end
145
-
146
- if file['type'] == 'template'
147
- r << (ASSIGNMENT_FILE_REF % [ file_name, file_name ])
148
- end
149
-
150
- xr[file['type']] << file_name
151
- end
152
-
153
- [ r, xr ]
154
- end
155
-
156
- def ref_from_type(type, data)
157
- case type
158
- when 'person'
159
- "[#{data}]"
160
- when 'rfc'
161
- data.upcase
162
- when 'draft'
163
- "DRAFT:#{data.sub(/^RFC-/, 'draft-')}"
164
- when 'rfc-errata'
165
- "{RFC Errata #{data}=http://www.rfc-editor.org/errata_search.php?eid=#{data}}"
166
- when 'uri'
167
- "{#{data}}"
168
- else # 'text' or something else
169
- data
170
- end
171
- end
172
- end