mime-types 3.5.2 → 3.6.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cfc8b8464d84ae454c33d168638a3c496d4a7c9bcdcc5fb76905a4db3f7f8c68
4
- data.tar.gz: 90b122e2a9fb78b41e350f92038854491bf95520cd6764e7719a086da3afa5ff
3
+ metadata.gz: d32410a9932dbf1c1857f313b7881099d7bf97ea7f73002145fd1e769e0ab43e
4
+ data.tar.gz: c2edbde050f3f02cb2d6393a91dc31cf15360c4646452737ec8ceba7feb1831f
5
5
  SHA512:
6
- metadata.gz: '068f424c28bda754c9870faf925a80525721e7baff71b582ad9b91041510f078c6dc1d1316362347a406dd31c6843c28abd05fdcf7ec211ce35e617817f3741b'
7
- data.tar.gz: 7d47eb015acfb84adc666c2ba59eb38da6d349bb029d407725f1046b2ec375a61aee3fcf195bd92f663400a9c9e14ca9d3c53022ad4ba9049b2ef46e662b65ab
6
+ metadata.gz: 4f1f6f88f8e4175dd598eebbe5daa7948c542af1416f7bcf0392d05323169c470055d376b4fcf62bc3f3d3cb7243c94f31fca7fd0a8f5e8e849b38cd67e53ee3
7
+ data.tar.gz: ed34529568fd07a33459e1d6bfe4bced23eaea76b46edf98c4b060a57672e173e33cc5c2c71539cd3ad99e9e2cd16e49c2ca8d9d3c67dd64dca3601bea823453
data/Code-of-Conduct.md CHANGED
@@ -2,72 +2,127 @@
2
2
 
3
3
  ## Our Pledge
4
4
 
5
- In the interest of fostering an open and welcoming environment, we as
6
- contributors and maintainers pledge to making participation in our project and
7
- our community a harassment-free experience for everyone, regardless of age, body
8
- size, disability, ethnicity, sex characteristics, gender identity and expression,
9
- level of experience, education, socio-economic status, nationality, personal
10
- appearance, race, religion, or sexual identity and orientation.
5
+ We as members, contributors, and leaders pledge to make participation in our
6
+ community a harassment-free experience for everyone, regardless of age, body
7
+ size, visible or invisible disability, ethnicity, sex characteristics, gender
8
+ identity and expression, level of experience, education, socio-economic status,
9
+ nationality, personal appearance, race, caste, color, religion, or sexual
10
+ identity and orientation.
11
+
12
+ We pledge to act and interact in ways that contribute to an open, welcoming,
13
+ diverse, inclusive, and healthy community.
11
14
 
12
15
  ## Our Standards
13
16
 
14
- Examples of behavior that contributes to creating a positive environment
15
- include:
17
+ Examples of behavior that contributes to a positive environment for our
18
+ community include:
16
19
 
17
- - Using welcoming and inclusive language
18
- - Being respectful of differing viewpoints and experiences
19
- - Gracefully accepting constructive criticism
20
- - Focusing on what is best for the community
21
- - Showing empathy towards other community members
20
+ - Demonstrating empathy and kindness toward other people
21
+ - Being respectful of differing opinions, viewpoints, and experiences
22
+ - Giving and gracefully accepting constructive feedback
23
+ - Accepting responsibility and apologizing to those affected by our mistakes,
24
+ and learning from the experience
25
+ - Focusing on what is best not just for us as individuals, but for the overall
26
+ community
22
27
 
23
- Examples of unacceptable behavior by participants include:
28
+ Examples of unacceptable behavior include:
24
29
 
25
- - The use of sexualized language or imagery and unwelcome sexual attention or
26
- advances
27
- - Trolling, insulting/derogatory comments, and personal or political attacks
30
+ - The use of sexualized language or imagery, and sexual attention or advances of
31
+ any kind
32
+ - Trolling, insulting or derogatory comments, and personal or political attacks
28
33
  - Public or private harassment
29
- - Publishing others' private information, such as a physical or electronic
30
- address, without explicit permission
34
+ - Publishing others' private information, such as a physical or email address,
35
+ without their explicit permission
31
36
  - Other conduct which could reasonably be considered inappropriate in a
32
37
  professional setting
33
38
 
34
- ## Our Responsibilities
39
+ ## Enforcement Responsibilities
35
40
 
36
- Project maintainers are responsible for clarifying the standards of acceptable
37
- behavior and are expected to take appropriate and fair corrective action in
38
- response to any instances of unacceptable behavior.
41
+ Community leaders are responsible for clarifying and enforcing our standards of
42
+ acceptable behavior and will take appropriate and fair corrective action in
43
+ response to any behavior that they deem inappropriate, threatening, offensive,
44
+ or harmful.
39
45
 
40
- Project maintainers have the right and responsibility to remove, edit, or
41
- reject comments, commits, code, wiki edits, issues, and other contributions
42
- that are not aligned to this Code of Conduct, or to ban temporarily or
43
- permanently any contributor for other behaviors that they deem inappropriate,
44
- threatening, offensive, or harmful.
46
+ Community leaders have the right and responsibility to remove, edit, or reject
47
+ comments, commits, code, wiki edits, issues, and other contributions that are
48
+ not aligned to this Code of Conduct, and will communicate reasons for moderation
49
+ decisions when appropriate.
45
50
 
46
51
  ## Scope
47
52
 
48
- This Code of Conduct applies both within project spaces and in public spaces
49
- when an individual is representing the project or its community. Examples of
50
- representing a project or community include using an official project e-mail
51
- address, posting via an official social media account, or acting as an appointed
52
- representative at an online or offline event. Representation of a project may be
53
- further defined and clarified by project maintainers.
53
+ This Code of Conduct applies within all community spaces, and also applies when
54
+ an individual is officially representing the community in public spaces.
55
+ Examples of representing our community include using an official email address,
56
+ posting via an official social media account, or acting as an appointed
57
+ representative at an online or offline event.
54
58
 
55
59
  ## Enforcement
56
60
 
57
61
  Instances of abusive, harassing, or otherwise unacceptable behavior may be
58
- reported by contacting the project team at [INSERT EMAIL ADDRESS]. All
59
- complaints will be reviewed and investigated and will result in a response that
60
- is deemed necessary and appropriate to the circumstances. The project team is
61
- obligated to maintain confidentiality with regard to the reporter of an incident.
62
- Further details of specific enforcement policies may be posted separately.
62
+ reported to the community leaders responsible for enforcement at [INSERT CONTACT
63
+ METHOD]. All complaints will be reviewed and investigated promptly and fairly.
64
+
65
+ All community leaders are obligated to respect the privacy and security of the
66
+ reporter of any incident.
67
+
68
+ ## Enforcement Guidelines
69
+
70
+ Community leaders will follow these Community Impact Guidelines in determining
71
+ the consequences for any action they deem in violation of this Code of Conduct:
72
+
73
+ ### 1. Correction
74
+
75
+ **Community Impact**: Use of inappropriate language or other behavior deemed
76
+ unprofessional or unwelcome in the community.
77
+
78
+ **Consequence**: A private, written warning from community leaders, providing
79
+ clarity around the nature of the violation and an explanation of why the
80
+ behavior was inappropriate. A public apology may be requested.
81
+
82
+ ### 2. Warning
83
+
84
+ **Community Impact**: A violation through a single incident or series of
85
+ actions.
63
86
 
64
- Project maintainers who do not follow or enforce the Code of Conduct in good
65
- faith may face temporary or permanent repercussions as determined by other
66
- members of the project's leadership.
87
+ **Consequence**: A warning with consequences for continued behavior. No
88
+ interaction with the people involved, including unsolicited interaction with
89
+ those enforcing the Code of Conduct, for a specified period of time. This
90
+ includes avoiding interactions in community spaces as well as external channels
91
+ like social media. Violating these terms may lead to a temporary or permanent
92
+ ban.
93
+
94
+ ### 3. Temporary Ban
95
+
96
+ **Community Impact**: A serious violation of community standards, including
97
+ sustained inappropriate behavior.
98
+
99
+ **Consequence**: A temporary ban from any sort of interaction or public
100
+ communication with the community for a specified period of time. No public or
101
+ private interaction with the people involved, including unsolicited interaction
102
+ with those enforcing the Code of Conduct, is allowed during this period.
103
+ Violating these terms may lead to a permanent ban.
104
+
105
+ ### 4. Permanent Ban
106
+
107
+ **Community Impact**: Demonstrating a pattern of violation of community
108
+ standards, including sustained inappropriate behavior, harassment of an
109
+ individual, or aggression toward or disparagement of classes of individuals.
110
+
111
+ **Consequence**: A permanent ban from any sort of public interaction within the
112
+ community.
67
113
 
68
114
  ## Attribution
69
115
 
70
- This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
71
- available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
116
+ This Code of Conduct is adapted from the [Contributor Covenant][homepage],
117
+ version 2.1, available at
118
+ <https://www.contributor-covenant.org/version/2/1/code_of_conduct.html>.
119
+
120
+ Community Impact Guidelines were inspired by
121
+ [Mozilla's code of conduct enforcement ladder][Mozilla CoC].
122
+
123
+ For answers to common questions about this code of conduct, see the FAQ at
124
+ <https://www.contributor-covenant.org/faq>. Translations are available at
125
+ <https://www.contributor-covenant.org/translations>.
72
126
 
73
127
  [homepage]: https://www.contributor-covenant.org
128
+ [Mozilla CoC]: https://github.com/mozilla/diversity
data/History.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # Changelog
2
2
 
3
+ ## 3.6 / 2024-09-30
4
+
5
+ - 2 deprecations:
6
+
7
+ - Array-based MIME::Type initialization
8
+ - String-based MIME::Type initialization
9
+
10
+ Use of these these will result in deprecation warnings.
11
+
12
+ - Added `logger` to the gemspec to suppress a bundled gem warning with Ruby
13
+ 3.3.5. This warning should not be showing up until Ruby 3.4.0 is released and
14
+ will be suppressed in Ruby 3.3.6.
15
+
16
+ - Reworked the deprecation message code to be somewhat more flexible and allow
17
+ for outputting certain warnings once. Because there will be at least one other
18
+ release after 3.6, we do not need to make the type initialization deprecations
19
+ frequent with this release.
20
+
3
21
  ## 3.5.2 / 2024-01-02
4
22
 
5
23
  There are no primary code changes, but we are releasing this as an update as
data/README.rdoc CHANGED
@@ -183,7 +183,8 @@ MAJOR.MINOR:
183
183
  MAJOR.MINOR.PATCH.
184
184
 
185
185
  In practical terms, there will be fewer releases of mime-types focussing on
186
- features because of the existence of the [mime-types-data][] gem, and if
186
+ features because of the existence of the
187
+ {mime-types-data}[https://github.com/mime-types/mime-types-data] gem, and if
187
188
  features are marked deprecated in the course of mime-types 3.x, they will not
188
189
  be removed until mime-types 4.x or possibly later.
189
190
 
data/Rakefile CHANGED
@@ -22,6 +22,7 @@ spec = Hoe.spec "mime-types" do
22
22
  spec_extras[:metadata] = ->(val) { val["rubygems_mfa_required"] = "true" }
23
23
 
24
24
  extra_deps << ["mime-types-data", "~> 3.2015"]
25
+ extra_deps << ["logger", ">= 0"]
25
26
 
26
27
  extra_dev_deps << ["hoe", ">= 3.0", "< 5"]
27
28
  extra_dev_deps << ["hoe-doofus", "~> 1.0"]
data/lib/mime/type.rb CHANGED
@@ -4,20 +4,22 @@
4
4
  module MIME
5
5
  end
6
6
 
7
+ require "mime/types/deprecations"
8
+
7
9
  # The definition of one MIME content-type.
8
10
  #
9
11
  # == Usage
10
- # require 'mime/types'
12
+ # require "mime/types"
11
13
  #
12
- # plaintext = MIME::Types['text/plain'] # => [ text/plain ]
14
+ # plaintext = MIME::Types["text/plain"] # => [ text/plain ]
13
15
  # text = plaintext.first
14
- # puts text.media_type # => 'text'
15
- # puts text.sub_type # => 'plain'
16
+ # puts text.media_type # => "text"
17
+ # puts text.sub_type # => "plain"
16
18
  #
17
- # puts text.extensions.join(' ') # => 'txt asc c cc h hh cpp hpp dat hlp'
18
- # puts text.preferred_extension # => 'txt'
19
- # puts text.friendly # => 'Text Document'
20
- # puts text.i18n_key # => 'text.plain'
19
+ # puts text.extensions.join(" ") # => "txt asc c cc h hh cpp hpp dat hlp"
20
+ # puts text.preferred_extension # => "txt"
21
+ # puts text.friendly # => "Text Document"
22
+ # puts text.i18n_key # => "text.plain"
21
23
  #
22
24
  # puts text.encoding # => quoted-printable
23
25
  # puts text.default_encoding # => quoted-printable
@@ -28,45 +30,45 @@ end
28
30
  # puts text.provisional? # => false
29
31
  # puts text.complete? # => true
30
32
  #
31
- # puts text # => 'text/plain'
33
+ # puts text # => "text/plain"
32
34
  #
33
- # puts text == 'text/plain' # => true
34
- # puts 'text/plain' == text # => true
35
- # puts text == 'text/x-plain' # => false
36
- # puts 'text/x-plain' == text # => false
35
+ # puts text == "text/plain" # => true
36
+ # puts "text/plain" == text # => true
37
+ # puts text == "text/x-plain" # => false
38
+ # puts "text/x-plain" == text # => false
37
39
  #
38
- # puts MIME::Type.simplified('x-appl/x-zip') # => 'x-appl/x-zip'
39
- # puts MIME::Type.i18n_key('x-appl/x-zip') # => 'x-appl.x-zip'
40
+ # puts MIME::Type.simplified("x-appl/x-zip") # => "x-appl/x-zip"
41
+ # puts MIME::Type.i18n_key("x-appl/x-zip") # => "x-appl.x-zip"
40
42
  #
41
- # puts text.like?('text/x-plain') # => true
42
- # puts text.like?(MIME::Type.new('x-text/x-plain')) # => true
43
+ # puts text.like?("text/x-plain") # => true
44
+ # puts text.like?(MIME::Type.new("content-type" => "x-text/x-plain")) # => true
43
45
  #
44
46
  # puts text.xrefs.inspect # => { "rfc" => [ "rfc2046", "rfc3676", "rfc5147" ] }
45
47
  # puts text.xref_urls # => [ "http://www.iana.org/go/rfc2046",
46
48
  # # "http://www.iana.org/go/rfc3676",
47
49
  # # "http://www.iana.org/go/rfc5147" ]
48
50
  #
49
- # xtext = MIME::Type.new('x-text/x-plain')
50
- # puts xtext.media_type # => 'text'
51
- # puts xtext.raw_media_type # => 'x-text'
52
- # puts xtext.sub_type # => 'plain'
53
- # puts xtext.raw_sub_type # => 'x-plain'
51
+ # xtext = MIME::Type.new("x-text/x-plain")
52
+ # puts xtext.media_type # => "text"
53
+ # puts xtext.raw_media_type # => "x-text"
54
+ # puts xtext.sub_type # => "plain"
55
+ # puts xtext.raw_sub_type # => "x-plain"
54
56
  # puts xtext.complete? # => false
55
57
  #
56
- # puts MIME::Types.any? { |type| type.content_type == 'text/plain' } # => true
58
+ # puts MIME::Types.any? { |type| type.content_type == "text/plain" } # => true
57
59
  # puts MIME::Types.all?(&:registered?) # => false
58
60
  #
59
61
  # # Various string representations of MIME types
60
- # qcelp = MIME::Types['audio/QCELP'].first # => audio/QCELP
61
- # puts qcelp.content_type # => 'audio/QCELP'
62
- # puts qcelp.simplified # => 'audio/qcelp'
62
+ # qcelp = MIME::Types["audio/QCELP"].first # => audio/QCELP
63
+ # puts qcelp.content_type # => "audio/QCELP"
64
+ # puts qcelp.simplified # => "audio/qcelp"
63
65
  #
64
- # xwingz = MIME::Types['application/x-Wingz'].first # => application/x-Wingz
65
- # puts xwingz.content_type # => 'application/x-Wingz'
66
- # puts xwingz.simplified # => 'application/x-wingz'
66
+ # xwingz = MIME::Types["application/x-Wingz"].first # => application/x-Wingz
67
+ # puts xwingz.content_type # => "application/x-Wingz"
68
+ # puts xwingz.simplified # => "application/x-wingz"
67
69
  class MIME::Type
68
70
  # Reflects a MIME content-type specification that is not correctly
69
- # formatted (it isn't +type+/+subtype+).
71
+ # formatted (it is not +type+/+subtype+).
70
72
  class InvalidContentType < ArgumentError
71
73
  # :stopdoc:
72
74
  def initialize(type_string)
@@ -93,14 +95,20 @@ class MIME::Type
93
95
  end
94
96
 
95
97
  # The released version of the mime-types library.
96
- VERSION = "3.5.2"
98
+ VERSION = "3.6.0.beta1"
97
99
 
98
100
  include Comparable
99
101
 
100
102
  # :stopdoc:
101
- # TODO verify mime-type character restrictions; I am pretty sure that this is
102
- # too wide open.
103
- MEDIA_TYPE_RE = %r{([-\w.+]+)/([-\w.+]*)}.freeze
103
+ # Full conformance with RFC 6838 §4.2 (the recommendation for < 64 characters is not
104
+ # enforced or reported because MIME::Types mostly deals with registered data). RFC 4288
105
+ # §4.2 does not restrict the first character to alphanumeric, but the total length of
106
+ # each part is limited to 127 characters. RFCC 2045 §5.1 does not restrict the character
107
+ # composition except for whitespace, but MIME::Type was always more strict than this.
108
+ restricted_name_first = "[0-9a-zA-Z]"
109
+ restricted_name_chars = "[-!#{$&}^_.+0-9a-zA-Z]{0,126}"
110
+ restricted_name = "#{restricted_name_first}#{restricted_name_chars}"
111
+ MEDIA_TYPE_RE = %r{(#{restricted_name})/(#{restricted_name})}.freeze
104
112
  I18N_RE = /[^[:alnum:]]/.freeze
105
113
  BINARY_ENCODINGS = %w[base64 8bit].freeze
106
114
  ASCII_ENCODINGS = %w[7bit quoted-printable].freeze
@@ -110,12 +118,15 @@ class MIME::Type
110
118
  :ASCII_ENCODINGS
111
119
 
112
120
  # Builds a MIME::Type object from the +content_type+, a MIME Content Type
113
- # value (e.g., 'text/plain' or 'application/x-eruby'). The constructed object
121
+ # value (e.g., "text/plain" or "application/x-eruby"). The constructed object
114
122
  # is yielded to an optional block for additional configuration, such as
115
123
  # associating extensions and encoding information.
116
124
  #
117
125
  # * When provided a Hash or a MIME::Type, the MIME::Type will be
118
126
  # constructed with #init_with.
127
+ #
128
+ # There are two deprecated initialization forms:
129
+ #
119
130
  # * When provided an Array, the MIME::Type will be constructed using
120
131
  # the first element as the content type and the remaining flattened
121
132
  # elements as extensions.
@@ -132,11 +143,23 @@ class MIME::Type
132
143
  when Hash
133
144
  init_with(content_type)
134
145
  when Array
146
+ MIME::Types.deprecated(
147
+ class: MIME::Type,
148
+ method: :new,
149
+ pre: "when called with an Array",
150
+ once: true
151
+ )
135
152
  self.content_type = content_type.shift
136
153
  self.extensions = content_type.flatten
137
154
  when MIME::Type
138
155
  init_with(content_type.to_h)
139
156
  else
157
+ MIME::Types.deprecated(
158
+ class: MIME::Type,
159
+ method: :new,
160
+ pre: "when called with a String",
161
+ once: true
162
+ )
140
163
  self.content_type = content_type
141
164
  end
142
165
 
@@ -181,7 +204,7 @@ class MIME::Type
181
204
  # comparisons involved are:
182
205
  #
183
206
  # 1. self.simplified <=> other.simplified (ensures that we
184
- # don't try to compare different types)
207
+ # do not try to compare different types)
185
208
  # 2. IANA-registered definitions < other definitions.
186
209
  # 3. Complete definitions < incomplete definitions.
187
210
  # 4. Current definitions < obsolete definitions.
@@ -243,7 +266,7 @@ class MIME::Type
243
266
  # +a.simplified+.
244
267
  #
245
268
  # Presumably, if <code>a.simplified <=> b.simplified</code> is +0+, then
246
- # +a.simplified+ has the same hash as +b.simplified+. So we assume it's
269
+ # +a.simplified+ has the same hash as +b.simplified+. So we assume it is
247
270
  # suitable for #hash to delegate to #simplified in service of the #eql?
248
271
  # invariant.
249
272
  def hash
@@ -319,7 +342,7 @@ class MIME::Type
319
342
  # exceptions defined, the first extension will be used.
320
343
  #
321
344
  # When setting #preferred_extensions, if #extensions does not contain this
322
- # extension, this will be added to #xtensions.
345
+ # extension, this will be added to #extensions.
323
346
  #
324
347
  # :attr_accessor: preferred_extension
325
348
 
@@ -330,7 +353,9 @@ class MIME::Type
330
353
 
331
354
  ##
332
355
  def preferred_extension=(value) # :nodoc:
333
- add_extensions(value) if value
356
+ if value
357
+ add_extensions(value)
358
+ end
334
359
  @preferred_extension = value
335
360
  end
336
361
 
@@ -343,7 +368,7 @@ class MIME::Type
343
368
  # provided is invalid.
344
369
  #
345
370
  # If the encoding is not provided on construction, this will be either
346
- # 'quoted-printable' (for text/* media types) and 'base64' for eveything
371
+ # "quoted-printable" (for text/* media types) and "base64" for eveything
347
372
  # else.
348
373
  #
349
374
  # :attr_accessor: encoding
@@ -393,7 +418,7 @@ class MIME::Type
393
418
  #
394
419
  # call-seq:
395
420
  # text_plain.friendly # => "Text File"
396
- # text_plain.friendly('en') # => "Text File"
421
+ # text_plain.friendly("en") # => "Text File"
397
422
  def friendly(lang = "en")
398
423
  @friendly ||= {}
399
424
 
@@ -486,7 +511,7 @@ class MIME::Type
486
511
  # Returns the MIME::Type as a string for implicit conversions. This allows
487
512
  # MIME::Type objects to appear on either side of a comparison.
488
513
  #
489
- # 'text/plain' == MIME::Type.new('text/plain')
514
+ # "text/plain" == MIME::Type.new("content-type" => "text/plain")
490
515
  def to_str
491
516
  content_type
492
517
  end
@@ -627,7 +652,7 @@ class MIME::Type
627
652
  -string
628
653
  end
629
654
  else
630
- # MRI 2.2 and older don't have a method for string interning,
655
+ # MRI 2.2 and older do not have a method for string interning,
631
656
  # so we simply freeze them for keeping a similar interface
632
657
  def intern_string(string)
633
658
  string.freeze
@@ -5,10 +5,10 @@ require "forwardable"
5
5
 
6
6
  # MIME::Types requires a serializable keyed container that returns an empty Set
7
7
  # on a key miss. Hash#default_value cannot be used because, while it traverses
8
- # the Marshal format correctly, it won't survive any other serialization
8
+ # the Marshal format correctly, it will not survive any other serialization
9
9
  # format (plus, a default of a mutable object resuls in a shared mess).
10
10
  # Hash#default_proc cannot be used without a wrapper because it prevents
11
- # Marshal serialization (and doesn't survive the round-trip).
11
+ # Marshal serialization (and does not survive the round-trip).
12
12
  class MIME::Types::Container # :nodoc:
13
13
  extend Forwardable
14
14
 
@@ -2,35 +2,55 @@
2
2
 
3
3
  require "mime/types/logger"
4
4
 
5
- # The namespace for MIME applications, tools, and libraries.
6
- module MIME
7
- ##
8
- class Types
9
- # Used to mark a method as deprecated in the mime-types interface.
10
- def self.deprecated(klass, sym, message = nil, &block) # :nodoc:
11
- level =
12
- case klass
5
+ class << MIME::Types
6
+ # Used to mark a method as deprecated in the mime-types interface.
7
+ def deprecated(options = {}, &block) # :nodoc:
8
+ message =
9
+ if options[:message]
10
+ options[:message]
11
+ else
12
+ klass = options.fetch(:class)
13
+
14
+ msep = case klass
13
15
  when Class, Module
14
16
  "."
15
17
  else
16
18
  klass = klass.class
17
19
  "#"
18
20
  end
19
- message =
20
- case message
21
+
22
+ method = "#{klass}#{msep}#{options.fetch(:method)}"
23
+ pre = " #{options[:pre]}" if options[:pre]
24
+ post = case options[:next]
21
25
  when :private, :protected
22
- "and will be #{message}"
23
- when nil
24
- "and will be removed"
26
+ " and will be made #{options[:next]}"
27
+ when :removed
28
+ " and will be removed"
29
+ when nil, ""
30
+ nil
25
31
  else
26
- message
32
+ " #{options[:next]}"
27
33
  end
28
- MIME::Types.logger.debug <<-WARNING.chomp.strip
29
- #{caller(2..2).first}: #{klass}#{level}#{sym} is deprecated #{message}.
30
- WARNING
31
34
 
32
- return unless block
33
- block.call
35
+ <<-WARNING.chomp.strip
36
+ #{caller(2..2).first}: #{klass}#{msep}#{method}#{pre} is deprecated#{post}.
37
+ WARNING
38
+ end
39
+
40
+ if !__deprecation_logged?(message, options[:once])
41
+ MIME::Types.logger.__send__(options[:level] || :debug, message)
34
42
  end
43
+
44
+ return unless block
45
+ block.call
46
+ end
47
+
48
+ private
49
+
50
+ def __deprecation_logged?(message, once)
51
+ return false unless once
52
+
53
+ @__deprecations_logged = {} unless defined?(@__deprecations_logged)
54
+ @__deprecations_logged.key?(message)
35
55
  end
36
56
  end
@@ -13,7 +13,7 @@ require "mime/types/data"
13
13
  #
14
14
  # The Loader will use one of the following paths:
15
15
  # 1. The +path+ provided in its constructor argument;
16
- # 2. The value of ENV['RUBY_MIME_TYPES_DATA']; or
16
+ # 2. The value of ENV["RUBY_MIME_TYPES_DATA"]; or
17
17
  # 3. The value of MIME::Types::Data::PATH.
18
18
  #
19
19
  # When #load is called, the +path+ will be searched recursively for all YAML
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "mime/types/deprecations"
4
+
3
5
  class << MIME::Types
4
6
  include Enumerable
5
7
 
@@ -45,11 +47,11 @@ class << MIME::Types
45
47
  def lazy_load?
46
48
  return unless ENV.key?("RUBY_MIME_TYPES_LAZY_LOAD")
47
49
 
48
- MIME::Types.logger.debug <<-WARNING.chomp.strip
49
- Lazy loading ($RUBY_MIME_TYPES_LAZY_LOAD) is deprecated and will be removed.
50
- WARNING
50
+ deprecated(
51
+ message: "Lazy loading ($RUBY_MIME_TYPES_LAZY_LOAD) is deprecated and will be removed."
52
+ )
51
53
 
52
- (lazy = ENV["RUBY_MIME_TYPES_LAZY_LOAD"]) && (lazy != "false")
54
+ ENV["RUBY_MIME_TYPES_LAZY_LOAD"] != "false"
53
55
  end
54
56
 
55
57
  def __types__
@@ -9,13 +9,13 @@ describe MIME::Type do
9
9
  end
10
10
 
11
11
  let(:x_appl_x_zip) {
12
- mime_type("x-appl/x-zip") { |t| t.extensions = %w[zip zp] }
12
+ mime_type("content-type" => "x-appl/x-zip") { |t| t.extensions = %w[zip zp] }
13
13
  }
14
- let(:text_plain) { mime_type("text/plain") }
15
- let(:text_html) { mime_type("text/html") }
16
- let(:image_jpeg) { mime_type("image/jpeg") }
14
+ let(:text_plain) { mime_type("content-type" => "text/plain") }
15
+ let(:text_html) { mime_type("content-type" => "text/html") }
16
+ let(:image_jpeg) { mime_type("content-type" => "image/jpeg") }
17
17
  let(:application_javascript) {
18
- mime_type("application/javascript") do |js|
18
+ mime_type("content-type" => "application/javascript") do |js|
19
19
  js.friendly("en" => "JavaScript")
20
20
  js.xrefs = {
21
21
  "rfc" => %w[rfc4239 rfc4239],
@@ -27,7 +27,7 @@ describe MIME::Type do
27
27
  end
28
28
  }
29
29
  let(:text_x_yaml) {
30
- mime_type("text/x-yaml") do |yaml|
30
+ mime_type("content-type" => "text/x-yaml") do |yaml|
31
31
  yaml.extensions = %w[yaml yml]
32
32
  yaml.encoding = "8bit"
33
33
  yaml.friendly("en" => "YAML Structured Document")
@@ -88,20 +88,22 @@ describe MIME::Type do
88
88
  describe ".new" do
89
89
  it "fails if an invalid content type is provided" do
90
90
  exception = assert_raises MIME::Type::InvalidContentType do
91
- MIME::Type.new("apps")
91
+ MIME::Type.new("content-type" => "apps")
92
92
  end
93
93
  assert_equal 'Invalid Content-Type "apps"', exception.to_s
94
94
  end
95
95
 
96
96
  it "creates a valid content type just from a string" do
97
- type = MIME::Type.new("text/x-yaml")
97
+ assert_output "", /MIME::Type.new when called with a String is deprecated\./ do
98
+ type = MIME::Type.new("text/x-yaml")
98
99
 
99
- assert_instance_of MIME::Type, type
100
- assert_equal "text/x-yaml", type.content_type
100
+ assert_instance_of MIME::Type, type
101
+ assert_equal "text/x-yaml", type.content_type
102
+ end
101
103
  end
102
104
 
103
105
  it "yields the content type in a block" do
104
- MIME::Type.new("text/x-yaml") do |type|
106
+ MIME::Type.new("content-type" => "text/x-yaml") do |type|
105
107
  assert_instance_of MIME::Type, type
106
108
  assert_equal "text/x-yaml", type.content_type
107
109
  end
@@ -118,10 +120,12 @@ describe MIME::Type do
118
120
  end
119
121
 
120
122
  it "creates a valid content type from an array" do
121
- type = MIME::Type.new(%w[text/x-yaml yaml yml yz])
122
- assert_instance_of MIME::Type, type
123
- assert_equal "text/x-yaml", type.content_type
124
- assert_equal %w[yaml yml yz], type.extensions
123
+ assert_output "", /MIME::Type.new when called with an Array is deprecated\./ do
124
+ type = MIME::Type.new(%w[text/x-yaml yaml yml yz])
125
+ assert_instance_of MIME::Type, type
126
+ assert_equal "text/x-yaml", type.content_type
127
+ assert_equal %w[yaml yml yz], type.extensions
128
+ end
125
129
  end
126
130
  end
127
131
 
@@ -143,7 +147,7 @@ describe MIME::Type do
143
147
  end
144
148
 
145
149
  it "correctly compares equivalent types" do
146
- right = mime_type("text/Plain")
150
+ right = mime_type("content-type" => "text/Plain")
147
151
  refute_same text_plain, right
148
152
  assert_equal text_plain, right
149
153
  end
@@ -204,14 +208,14 @@ describe MIME::Type do
204
208
  end
205
209
 
206
210
  it "is false when there are no extensions" do
207
- refute mime_type("text/plain").complete?
211
+ refute mime_type("content-type" => "text/plain").complete?
208
212
  end
209
213
  end
210
214
 
211
215
  describe "#content_type" do
212
216
  it "preserves the original case" do
213
217
  assert_equal "text/plain", text_plain.content_type
214
- assert_equal "text/vCard", mime_type("text/vCard").content_type
218
+ assert_equal "text/vCard", mime_type("content-type" => "text/vCard").content_type
215
219
  end
216
220
 
217
221
  it "does not remove x- prefixes" do
@@ -266,27 +270,27 @@ describe MIME::Type do
266
270
  end
267
271
 
268
272
  it "is true for an equivalent MIME::Type" do
269
- assert text_plain.eql?(mime_type("text/Plain"))
273
+ assert text_plain.eql?(mime_type("content-type" => "text/Plain"))
270
274
  end
271
275
 
272
276
  it "is true for an equivalent subclass of MIME::Type" do
273
277
  subclass = Class.new(MIME::Type)
274
- assert text_plain.eql?(subclass.new("text/plain"))
278
+ assert text_plain.eql?(subclass.new("content-type" => "text/plain"))
275
279
  end
276
280
  end
277
281
 
278
282
  describe "#hash" do
279
283
  it "is the same between #eql? MIME::Type instances" do
280
- assert_equal text_plain.hash, mime_type("text/plain").hash
284
+ assert_equal text_plain.hash, mime_type("content-type" => "text/plain").hash
281
285
  end
282
286
 
283
287
  it "is the same between #eql? MIME::Type instances of different classes" do
284
288
  subclass = Class.new(MIME::Type)
285
- assert_equal text_plain.hash, subclass.new("text/plain").hash
289
+ assert_equal text_plain.hash, subclass.new("content-type" => "text/plain").hash
286
290
  end
287
291
 
288
292
  it "uses the #simplified value" do
289
- assert_equal text_plain.hash, mime_type("text/Plain").hash
293
+ assert_equal text_plain.hash, mime_type("content-type" => "text/Plain").hash
290
294
  end
291
295
  end
292
296
 
@@ -340,9 +344,9 @@ describe MIME::Type do
340
344
  assert_priority_more right, left
341
345
  end
342
346
 
343
- let(:text_1) { mime_type("text/1") }
344
- let(:text_1p) { mime_type("text/1") }
345
- let(:text_2) { mime_type("text/2") }
347
+ let(:text_1) { mime_type("content-type" => "text/1") }
348
+ let(:text_1p) { mime_type("content-type" => "text/1") }
349
+ let(:text_2) { mime_type("content-type" => "text/2") }
346
350
 
347
351
  it "sorts (1) based on the simplified type" do
348
352
  assert_priority text_1, text_1p, text_2
@@ -395,7 +399,7 @@ describe MIME::Type do
395
399
 
396
400
  describe "#raw_media_type" do
397
401
  it "extracts the media type as case-preserved" do
398
- assert_equal "Text", mime_type("Text/plain").raw_media_type
402
+ assert_equal "Text", mime_type("content-type" => "Text/plain").raw_media_type
399
403
  end
400
404
 
401
405
  it "does not remove x- prefixes" do
@@ -415,7 +419,7 @@ describe MIME::Type do
415
419
 
416
420
  describe "#raw_media_type" do
417
421
  it "extracts the media type as case-preserved" do
418
- assert_equal "Text", mime_type("Text/plain").raw_media_type
422
+ assert_equal "Text", mime_type("content-type" => "Text/plain").raw_media_type
419
423
  end
420
424
 
421
425
  it "does not remove x- prefixes" do
@@ -435,7 +439,7 @@ describe MIME::Type do
435
439
 
436
440
  describe "#raw_sub_type" do
437
441
  it "extracts the sub type as case-preserved" do
438
- assert_equal "Plain", mime_type("text/Plain").raw_sub_type
442
+ assert_equal "Plain", mime_type("content-type" => "text/Plain").raw_sub_type
439
443
  end
440
444
 
441
445
  it "does not remove x- prefixes" do
@@ -444,7 +448,7 @@ describe MIME::Type do
444
448
  end
445
449
 
446
450
  describe "#to_h" do
447
- let(:t) { mime_type("a/b") }
451
+ let(:t) { mime_type("content-type" => "a/b") }
448
452
 
449
453
  def assert_has_keys(wanted_keys, actual, msg = nil)
450
454
  wanted_keys = Array(wanted_keys).uniq.sort
@@ -505,11 +509,11 @@ describe MIME::Type do
505
509
  }
506
510
 
507
511
  it "converts to JSON when requested" do
508
- assert_equal expected_1, mime_type("a/b").to_json
512
+ assert_equal expected_1, mime_type("content-type" => "a/b").to_json
509
513
  end
510
514
 
511
515
  it "converts to JSON with provisional when requested" do
512
- type = mime_type("a/b") do |t|
516
+ type = mime_type("content-type" => "a/b") do |t|
513
517
  t.registered = true
514
518
  t.provisional = true
515
519
  end
@@ -559,7 +563,7 @@ describe MIME::Type do
559
563
  }
560
564
 
561
565
  let(:type) {
562
- mime_type("a/b").tap do |t|
566
+ mime_type("content-type" => "a/b").tap do |t|
563
567
  t.xrefs = {
564
568
  "draft" => ["RFC1"],
565
569
  "template" => ["a/b"],
@@ -6,19 +6,14 @@ require "minitest_helper"
6
6
  describe MIME::Types do
7
7
  def mime_types
8
8
  @mime_types ||= MIME::Types.new.tap { |mt|
9
- mt.add MIME::Type.new(["text/plain", %w[txt]]),
10
- MIME::Type.new(["image/jpeg", %w[jpg jpeg]]),
11
- MIME::Type.new("application/x-wordperfect6.1"),
12
- MIME::Type.new(
13
- "content-type" => "application/x-www-form-urlencoded",
14
- "registered" => true
15
- ),
16
- MIME::Type.new(["application/x-gzip", %w[gz]]),
17
- MIME::Type.new(
18
- "content-type" => "application/gzip",
19
- "extensions" => "gz",
20
- "registered" => true
21
- )
9
+ mt.add(
10
+ MIME::Type.new("content-type" => "text/plain", "extensions" => %w[txt]),
11
+ MIME::Type.new("content-type" => "image/jpeg", "extensions" => %w[jpg jpeg]),
12
+ MIME::Type.new("content-type" => "application/x-wordperfect6.1"),
13
+ MIME::Type.new("content-type" => "application/x-www-form-urlencoded", "registered" => true),
14
+ MIME::Type.new("content-type" => "application/x-gzip", "extensions" => %w[gz]),
15
+ MIME::Type.new("content-type" => "application/gzip", "extensions" => "gz", "registered" => true)
16
+ )
22
17
  }
23
18
  end
24
19
 
@@ -45,7 +40,7 @@ describe MIME::Types do
45
40
 
46
41
  describe "#[]" do
47
42
  it "can be searched with a MIME::Type" do
48
- text_plain = MIME::Type.new("text/plain")
43
+ text_plain = MIME::Type.new("content-type" => "text/plain")
49
44
  assert_includes mime_types[text_plain], "text/plain"
50
45
  assert_equal 1, mime_types[text_plain].size
51
46
  end
@@ -92,8 +87,8 @@ describe MIME::Types do
92
87
  end
93
88
 
94
89
  describe "#add" do
95
- let(:eruby) { MIME::Type.new("application/x-eruby") }
96
- let(:jinja) { MIME::Type.new("application/jinja2") }
90
+ let(:eruby) { MIME::Type.new("content-type" => "application/x-eruby") }
91
+ let(:jinja) { MIME::Type.new("content-type" => "application/jinja2") }
97
92
 
98
93
  it "successfully adds a new type" do
99
94
  mime_types.add(eruby)
@@ -31,7 +31,7 @@ describe MIME::Types, "registry" do
31
31
 
32
32
  describe ".[]" do
33
33
  it "can be searched with a MIME::Type" do
34
- text_plain = MIME::Type.new("text/plain")
34
+ text_plain = MIME::Type.new("content-type" => "text/plain")
35
35
  assert_includes MIME::Types[text_plain], "text/plain"
36
36
  assert_equal 1, MIME::Types[text_plain].size
37
37
  end
@@ -119,8 +119,8 @@ describe MIME::Types, "registry" do
119
119
  MIME::Types.send(:load_default_mime_types)
120
120
  end
121
121
 
122
- let(:eruby) { MIME::Type.new("application/x-eruby") }
123
- let(:jinja) { MIME::Type.new("application/jinja2") }
122
+ let(:eruby) { MIME::Type.new("content-type" => "application/x-eruby") }
123
+ let(:jinja) { MIME::Type.new("content-type" => "application/jinja2") }
124
124
 
125
125
  it "successfully adds a new type" do
126
126
  MIME::Types.add(eruby)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mime-types
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.5.2
4
+ version: 3.6.0.beta1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Austin Ziegler
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-01-02 00:00:00.000000000 Z
11
+ date: 2024-09-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mime-types-data
@@ -24,20 +24,34 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '3.2015'
27
+ - !ruby/object:Gem::Dependency
28
+ name: logger
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: minitest
29
43
  requirement: !ruby/object:Gem::Requirement
30
44
  requirements:
31
45
  - - "~>"
32
46
  - !ruby/object:Gem::Version
33
- version: '5.20'
47
+ version: '5.25'
34
48
  type: :development
35
49
  prerelease: false
36
50
  version_requirements: !ruby/object:Gem::Requirement
37
51
  requirements:
38
52
  - - "~>"
39
53
  - !ruby/object:Gem::Version
40
- version: '5.20'
54
+ version: '5.25'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: hoe
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -307,7 +321,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
307
321
  - !ruby/object:Gem::Version
308
322
  version: '0'
309
323
  requirements: []
310
- rubygems_version: 3.5.3
324
+ rubygems_version: 3.5.16
311
325
  signing_key:
312
326
  specification_version: 4
313
327
  summary: The mime-types library provides a library and registry for information about