mime-types 3.5.2 → 3.6.0.beta1

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 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