diff options
author | Austin Ziegler <austin@zieglers.ca> | 2013-10-26 18:17:06 -0400 |
---|---|---|
committer | Austin Ziegler <austin@zieglers.ca> | 2013-10-26 18:17:06 -0400 |
commit | c2ed9d286655f5420124b4270772bd425ab00e7a (patch) | |
tree | 9af77a95f95e5d5fc300966fe5ea9e445b8caa6d /Rakefile | |
parent | ade226b48b6f7f4be5c72c33924f771365b00203 (diff) | |
download | mime-types-c2ed9d286655f5420124b4270772bd425ab00e7a.tar.gz |
mime-types 2.0
A substantial upgrade to the mime-types library. Major features:
- No longer compatible with Ruby 1.8.
- Several major API changes and deprecations.
- The default mime-types registry is now stored as JSON.
- Improved developer tools.
- Improved repackager tools.
See History.rdoc for full details.
Diffstat (limited to 'Rakefile')
-rw-r--r-- | Rakefile | 227 |
1 files changed, 42 insertions, 185 deletions
@@ -14,6 +14,9 @@ Hoe.plugin :travis spec = Hoe.spec 'mime-types' do developer('Austin Ziegler', 'austin@rubyforge.org') + self.need_tar = true + + self.require_ruby_version '>= 1.9.2' self.remote_rdoc_dir = '.' self.rsync_args << ' --exclude=statsvn/' @@ -31,202 +34,34 @@ spec = Hoe.spec 'mime-types' do self.extra_dev_deps << ['hoe-travis', '~> 1.2'] self.extra_dev_deps << ['minitest', '~> 4.5'] self.extra_dev_deps << ['rake', '~> 10.0'] -end - -def reload_mime_types(repeats = 1, force_load = false) - repeats.times { - Object.send(:remove_const, :MIME) if defined? MIME - load 'lib/mime/types.rb' - MIME::Types.send(:__types__) if force_load - } + self.extra_dev_deps << ['simplecov', '~> 0.7'] end desc 'Benchmark' task :benchmark, :repeats do |t, args| - repeats = args.repeats.to_i - repeats = 50 if repeats.zero? - require 'benchmark' - $LOAD_PATH.unshift 'lib' - - cache_file = File.expand_path('../cache.mtx', __FILE__) - rm cache_file if File.exist? cache_file - - Benchmark.bm(17) do |x| - x.report("Normal:") { reload_mime_types repeats } - - ENV['RUBY_MIME_TYPES_LAZY_LOAD'] = 'yes' - x.report("Lazy:") { reload_mime_types repeats } - x.report("Lazy+Load:") { reload_mime_types repeats, true } + $LOAD_PATH.unshift('support') + require 'benchmarker' - ENV.delete('RUBY_MIME_TYPES_LAZY_LOAD') - - ENV['RUBY_MIME_TYPES_CACHE'] = cache_file - reload_mime_types - - x.report("Cached:") { reload_mime_types repeats } - ENV['RUBY_MIME_TYPES_LAZY_LOAD'] = 'yes' - x.report("Lazy Cached:") { reload_mime_types repeats } - x.report("Lazy Cached Load:") { reload_mime_types repeats, true } + Benchmarker.benchmark(args.repeats) +end +namespace :test do + task :coverage do + spec.test_prelude = [ + 'require "simplecov"', + 'SimpleCov.start("test_frameworks") { command_name "Minitest" }', + 'gem "minitest"' + ].join('; ') + Rake::Task['test'].execute end - - rm cache_file end namespace :mime do desc "Download the current MIME type registrations from IANA." - task :iana, :save, :destination do |t, args| - save_type = (args.save || :text).to_sym - - case save_type - when :text, :both, :html - nil - else - raise "Unknown save type provided. Must be one of text, both, or html." - end - - destination = args.destination || "type-lists" - - require 'open-uri' - require 'nokogiri' - require 'cgi' - - class IANAParser - include Comparable - - INDEX = %q(http://www.iana.org/assignments/media-types/) - CONTACT_PEOPLE = %r{http://www.iana.org/assignments/contact-people.html?#(.*)} - RFC_EDITOR = %r{http://www.rfc-editor.org/rfc/rfc(\d+).txt} - IETF_RFC = %r{http://www.ietf.org/rfc/rfc(\d+).txt} - IETF_RFC_TOOLS = %r{http://tools.ietf.org/html/rfc(\d+)} - - class << self - def load_index - @types ||= {} - - Nokogiri::HTML(open(INDEX) { |f| f.read }).xpath('//p/a').each do |tag| - href_match = %r{^/assignments/media-types/(.+)/$}.match(tag['href']) - next if href_match.nil? - type = href_match.captures[0] - @types[tag.content] = IANAParser.new(tag.content, type) - end - end - - attr_reader :types - end - - def initialize(name, type) - @name = name - @type = type - @url = File.join(INDEX, @type) - end - - attr_reader :name - attr_reader :type - attr_reader :url - attr_reader :html - - def download(name = nil) - @html = Nokogiri::HTML(open(name || @url) { |f| f.read }) - end - - def save_html - File.open("#@name.html", "wb") { |w| w.write @html } - end - - def <=>(o) - self.name <=> o.name - end - - def parse - nodes = html.xpath("//table//table//tr") - - # How many <td> children does the first node have? - node_count = nodes.first.children.select { |n| n.elem? }.size - - if node_count == 1 - # The title node doesn't have what we expect. Let's try it based - # on the first real node. - node_count = nodes.first.next.children.select { |n| n.elem? }.size - end - - @mime_types = nodes.map do |node| - next if node == nodes.first - elems = node.children.select { |n| n.elem? } - next if elems.size.zero? - - if elems.size != node_count - warn "size mismatch (#{elems.size} != #{node_count}) in node: #{node}" - next - end - - case elems.size - when 3 - subtype_index = 1 - refnode_index = 2 - when 4 - subtype_index = 1 - refnode_index = 3 - else - raise "Unknown element size." - end - - subtype = elems[subtype_index].content.chomp.strip - refnodes = elems[refnode_index].children.select { |n| n.elem? }.map { |ref| - case ref['href'] - when CONTACT_PEOPLE - tag = CGI::unescape($1).chomp.strip - if tag == ref.content - "[#{ref.content}]" - else - "[#{ref.content}=#{tag}]" - end - when RFC_EDITOR, IETF_RFC, IETF_RFC_TOOLS - "RFC#$1" - when %r{(https?://.*)} - "{#{ref.content}=#$1}" - else - ref - end - } - refs = refnodes.join(',') - - "#@type/#{subtype} 'IANA,#{refs}" - end.compact - - @mime_types - end - - def save_text - File.open("#@name.txt", "wb") { |w| w.write @mime_types.join("\n") } - end - end - - puts "Downloading index of MIME types from #{IANAParser::INDEX}." - IANAParser.load_index - - require 'fileutils' - FileUtils.mkdir_p destination - Dir.chdir destination do - IANAParser.types.values.sort.each do |parser| - next if parser.name == "example" or parser.name == "mime" - puts "Downloading #{parser.name} from #{parser.url}" - parser.download - - if :html == save_type || :both == save_type - puts "Saving #{parser.name}.html" - parser.save_html - end - - if :text == save_type || :both == save_type - puts "Parsing #{parser.name} HTML" - parser.parse - - puts "Saving #{parser.name}.txt" - parser.save_text - end - end - end + task :iana, :destination do |t, args| + $LOAD_PATH.unshift('support') + require 'iana_downloader' + IANADownloader.download_to(args.destination) end desc "Shows known MIME type sources." @@ -242,4 +77,26 @@ http://www.iana.org/assignments/media-types/ end end +Rake::Task['gem'].prerequisites.unshift("convert:yaml:json") + +namespace :convert do + namespace :yaml do + desc "Convert from YAML to JSON" + task :json, :source, :destination, :multiple_files do |t, args| + $LOAD_PATH.unshift('support') + require 'convert' + Convert.from_yaml_to_json(args) + end + end + + namespace :json do + desc "Convert from JSON to YAML" + task :yaml, :source, :destination, :multiple_files do |t, args| + $LOAD_PATH.unshift('support') + require 'convert' + Convert.from_json_to_yaml(args) + end + end +end + # vim: syntax=ruby |