From ab59149159564a4fffc3961bff08a1f2eb5a0444 Mon Sep 17 00:00:00 2001 From: Austin Ziegler Date: Tue, 1 Jun 2021 23:19:09 -0400 Subject: [PATCH] IANA Provisional Registration Support - 1 minor enhancement: - Added a new field to `MIME::Type` for checking provisional registrations from IANA. - Documentation: - Kevin Menard synced the documentation so that all examples are correct [#153]. - Administrivia: - Added Ruby 3.0 to the CI test matrix. Added `windows/jruby` to the CI exclusion list; it refuses to run successfully. - Removed the Travis CI configuration and changed it to Github Workflows [#150]. Removed Coveralls configuration. - Igor Victor added TruffleRuby to the Travis CI configuration [#149]. - Koichi ITO loosened an excessively tight dependency [#147]. --- History.md | 7 +++- README.rdoc | 1 + lib/mime/type.rb | 15 ++++++- lib/mime/type/columnar.rb | 4 +- lib/mime/types.rb | 1 + lib/mime/types/_columnar.rb | 1 + mime-types.gemspec | 56 +++++++++----------------- support/benchmarks/load_allocations.rb | 2 +- test/test_mime_type.rb | 15 ++++++- 9 files changed, 58 insertions(+), 44 deletions(-) diff --git a/History.md b/History.md index e73a7a6..9f22814 100644 --- a/History.md +++ b/History.md @@ -1,6 +1,11 @@ # Changelog -## NEXT / 2021-MM-DD +## 3.4.0 / 2021-06-02 + +- 1 minor enhancement: + + - Added a new field to `MIME::Type` for checking provisional registrations + from IANA. - Documentation: diff --git a/README.rdoc b/README.rdoc index 76e7d16..1f3dca5 100644 --- a/README.rdoc +++ b/README.rdoc @@ -65,6 +65,7 @@ files). A MIME::Type stores the known information about one MIME type. puts text.ascii? # => true puts text.obsolete? # => false puts text.registered? # => true + puts text.provisional? # => false puts text.complete? # => true puts text # => 'text/plain' diff --git a/lib/mime/type.rb b/lib/mime/type.rb index cdf2471..ba7e6bf 100644 --- a/lib/mime/type.rb +++ b/lib/mime/type.rb @@ -25,6 +25,7 @@ module MIME # puts text.ascii? # => true # puts text.obsolete? # => false # puts text.registered? # => true +# puts text.provisional? # => false # puts text.complete? # => true # # puts text # => 'text/plain' @@ -92,7 +93,7 @@ def to_s end # The released version of the mime-types library. - VERSION = "3.3.1" + VERSION = "3.4.0" include Comparable @@ -123,7 +124,7 @@ def to_s # Yields the newly constructed +self+ object. def initialize(content_type) # :yields: self @friendly = {} - @obsolete = @registered = false + @obsolete = @registered = @provisional = false @preferred_extension = @docs = @use_instead = nil self.extensions = [] @@ -419,6 +420,14 @@ def xref_urls attr_accessor :registered alias_method :registered?, :registered + # Indicates whether the MIME type's registration with IANA is provisional. + attr_accessor :provisional + + # Indicates whether the MIME type's registration with IANA is provisional. + def provisional? + registered? && @provisional + end + # MIME types can be specified to be sent across a network in particular # formats. This method returns +true+ when the MIME::Type encoding is set # to base64. @@ -493,6 +502,7 @@ def encode_with(coder) end end coder["registered"] = registered? + coder["provisional"] = provisional? if provisional? coder["signature"] = signature? if signature? coder end @@ -509,6 +519,7 @@ def init_with(coder) self.preferred_extension = coder["preferred-extension"] self.obsolete = coder["obsolete"] || false self.registered = coder["registered"] || false + self.provisional = coder["provisional"] || false self.signature = coder["signature"] self.xrefs = coder["xrefs"] || {} self.use_instead = coder["use-instead"] diff --git a/lib/mime/type/columnar.rb b/lib/mime/type/columnar.rb index 93a3350..1b7c3ca 100644 --- a/lib/mime/type/columnar.rb +++ b/lib/mime/type/columnar.rb @@ -35,8 +35,8 @@ def self.column(*methods, file: nil) # :nodoc: column :encoding, :encoding= column :docs, :docs= column :preferred_extension, :preferred_extension= - column :obsolete, :obsolete=, :obsolete?, :registered, :registered=, - :registered?, :signature, :signature=, :signature?, file: "flags" + column :obsolete, :obsolete=, :obsolete?, :registered, :registered=, :registered?, :signature, :signature=, + :signature?, :provisional, :provisional=, :provisional?, file: "flags" column :xrefs, :xrefs=, :xref_urls column :use_instead, :use_instead= diff --git a/lib/mime/types.rb b/lib/mime/types.rb index 2cf7fc4..1424666 100644 --- a/lib/mime/types.rb +++ b/lib/mime/types.rb @@ -61,6 +61,7 @@ class Types # puts plaintext.ascii? # => true # puts plaintext.obsolete? # => false # puts plaintext.registered? # => true +# puts plaintext.provisional? # => false # puts plaintext == 'text/plain' # => true # puts MIME::Type.simplified('x-appl/x-zip') # => 'appl/zip' # diff --git a/lib/mime/types/_columnar.rb b/lib/mime/types/_columnar.rb index 777c316..3a52d30 100644 --- a/lib/mime/types/_columnar.rb +++ b/lib/mime/types/_columnar.rb @@ -85,6 +85,7 @@ def load_flags type.instance_variable_set(:@obsolete, flag(line.shift)) type.instance_variable_set(:@registered, flag(line.shift)) type.instance_variable_set(:@signature, flag(line.shift)) + type.instance_variable_set(:@provisional, flag(line.shift)) end end diff --git a/mime-types.gemspec b/mime-types.gemspec index 7689f7e..e290aeb 100644 --- a/mime-types.gemspec +++ b/mime-types.gemspec @@ -9,7 +9,7 @@ Gem::Specification.new do |s| s.metadata = { "bug_tracker_uri" => "https://github.com/mime-types/ruby-mime-types/issues", "changelog_uri" => "https://github.com/mime-types/ruby-mime-types/blob/master/History.md", "homepage_uri" => "https://github.com/mime-types/ruby-mime-types/", "source_code_uri" => "https://github.com/mime-types/ruby-mime-types/" } if s.respond_to? :metadata= s.require_paths = ["lib".freeze] s.authors = ["Austin Ziegler".freeze] - s.date = "2021-03-24" + s.date = "2021-06-02" s.description = "The mime-types library provides a library and registry for information about\nMIME content type definitions. It can be used to determine defined filename\nextensions for MIME types, or to use filename extensions to look up the likely\nMIME type definitions.\n\nVersion 3.0 is a major release that requires Ruby 2.0 compatibility and removes\ndeprecated functions. The columnar registry format introduced in 2.6 has been\nmade the primary format; the registry data has been extracted from this library\nand put into {mime-types-data}[https://github.com/mime-types/mime-types-data].\nAdditionally, mime-types is now licensed exclusively under the MIT licence and\nthere is a code of conduct in effect. There are a number of other smaller\nchanges described in the History file.".freeze s.email = ["halostatue@gmail.com".freeze] s.extra_rdoc_files = ["Code-of-Conduct.md".freeze, "Contributing.md".freeze, "History.md".freeze, "Licence.md".freeze, "Manifest.txt".freeze, "README.rdoc".freeze] @@ -18,45 +18,29 @@ Gem::Specification.new do |s| s.licenses = ["MIT".freeze] s.rdoc_options = ["--main".freeze, "README.rdoc".freeze] s.required_ruby_version = Gem::Requirement.new(">= 2.0".freeze) - s.rubygems_version = "3.0.3".freeze + s.rubygems_version = "3.1.6".freeze s.summary = "The mime-types library provides a library and registry for information about MIME content type definitions".freeze if s.respond_to? :specification_version then s.specification_version = 4 + end - if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then - s.add_runtime_dependency(%q.freeze, ["~> 3.2015"]) - s.add_development_dependency(%q.freeze, ["~> 5.14"]) - s.add_development_dependency(%q.freeze, ["~> 1.0"]) - s.add_development_dependency(%q.freeze, ["~> 1.1"]) - s.add_development_dependency(%q.freeze, ["~> 1.6"]) - s.add_development_dependency(%q.freeze, ["~> 1.0"]) - s.add_development_dependency(%q.freeze, ["~> 1.0"]) - s.add_development_dependency(%q.freeze, ["~> 1.0"]) - s.add_development_dependency(%q.freeze, ["~> 1.0"]) - s.add_development_dependency(%q.freeze, ["~> 3.0"]) - s.add_development_dependency(%q.freeze, ["~> 1.4"]) - s.add_development_dependency(%q.freeze, [">= 10.0", "< 14.0"]) - s.add_development_dependency(%q.freeze, ["~> 0.7"]) - s.add_development_dependency(%q.freeze, [">= 4.0", "< 7"]) - s.add_development_dependency(%q.freeze, ["~> 3.22"]) - else - s.add_dependency(%q.freeze, ["~> 3.2015"]) - s.add_dependency(%q.freeze, ["~> 5.14"]) - s.add_dependency(%q.freeze, ["~> 1.0"]) - s.add_dependency(%q.freeze, ["~> 1.1"]) - s.add_dependency(%q.freeze, ["~> 1.6"]) - s.add_dependency(%q.freeze, ["~> 1.0"]) - s.add_dependency(%q.freeze, ["~> 1.0"]) - s.add_dependency(%q.freeze, ["~> 1.0"]) - s.add_dependency(%q.freeze, ["~> 1.0"]) - s.add_dependency(%q.freeze, ["~> 3.0"]) - s.add_dependency(%q.freeze, ["~> 1.4"]) - s.add_dependency(%q.freeze, [">= 10.0", "< 14.0"]) - s.add_dependency(%q.freeze, ["~> 0.7"]) - s.add_dependency(%q.freeze, [">= 4.0", "< 7"]) - s.add_dependency(%q.freeze, ["~> 3.22"]) - end + if s.respond_to? :add_runtime_dependency then + s.add_runtime_dependency(%q.freeze, ["~> 3.2015"]) + s.add_development_dependency(%q.freeze, ["~> 5.14"]) + s.add_development_dependency(%q.freeze, ["~> 1.0"]) + s.add_development_dependency(%q.freeze, ["~> 1.1"]) + s.add_development_dependency(%q.freeze, ["~> 1.6"]) + s.add_development_dependency(%q.freeze, ["~> 1.0"]) + s.add_development_dependency(%q.freeze, ["~> 1.0"]) + s.add_development_dependency(%q.freeze, ["~> 1.0"]) + s.add_development_dependency(%q.freeze, ["~> 1.0"]) + s.add_development_dependency(%q.freeze, ["~> 3.0"]) + s.add_development_dependency(%q.freeze, ["~> 1.4"]) + s.add_development_dependency(%q.freeze, [">= 10.0", "< 14.0"]) + s.add_development_dependency(%q.freeze, ["~> 0.7"]) + s.add_development_dependency(%q.freeze, [">= 4.0", "< 7"]) + s.add_development_dependency(%q.freeze, ["~> 3.23"]) else s.add_dependency(%q.freeze, ["~> 3.2015"]) s.add_dependency(%q.freeze, ["~> 5.14"]) @@ -72,6 +56,6 @@ Gem::Specification.new do |s| s.add_dependency(%q.freeze, [">= 10.0", "< 14.0"]) s.add_dependency(%q.freeze, ["~> 0.7"]) s.add_dependency(%q.freeze, [">= 4.0", "< 7"]) - s.add_dependency(%q.freeze, ["~> 3.22"]) + s.add_dependency(%q.freeze, ["~> 3.23"]) end end diff --git a/support/benchmarks/load_allocations.rb b/support/benchmarks/load_allocations.rb index 27f59d4..e05f71a 100644 --- a/support/benchmarks/load_allocations.rb +++ b/support/benchmarks/load_allocations.rb @@ -54,7 +54,7 @@ def report_top_x }.compact! head = (ObjectSpace::AllocationTracer.header - [:line]).map { |h| - h.to_s.split(/_/).map(&:capitalize).join(" ") + h.to_s.split("_").map(&:capitalize).join(" ") } table.unshift head diff --git a/test/test_mime_type.rb b/test/test_mime_type.rb index 87cbfb8..5ef4aeb 100644 --- a/test/test_mime_type.rb +++ b/test/test_mime_type.rb @@ -461,12 +461,23 @@ def assert_priority(left, middle, right) end describe "#to_json" do - let(:expected) { + let(:expected_1) { '{"content-type":"a/b","encoding":"base64","registered":false}' } + let(:expected_2) { + '{"content-type":"a/b","encoding":"base64","registered":true,"provisional":true}' + } it "converts to JSON when requested" do - assert_equal expected, mime_type("a/b").to_json + assert_equal expected_1, mime_type("a/b").to_json + end + + it "converts to JSON with provisional when requested" do + type = mime_type("a/b") do |t| + t.registered = true + t.provisional = true + end + assert_equal expected_2, type.to_json end end