ruby3-backward-compatibility 1.1.1 → 1.3.0

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: e72c4f9ed9be362ed3bcc227865c004eb1c87ba49a878f47fe8aa0af60503744
4
- data.tar.gz: d362dbf046076652989f7530b7cbe5f6acc36dd5f45ed3d5be930f56cbedbbfb
3
+ metadata.gz: d727adf8f484386c84adf5f03c83b8b8e237d072e9755e34770f4c37c87c3f27
4
+ data.tar.gz: ccb5329f49247817fbc12f9b72d1a893a57ed53f2c71b7c769d7c397d2e074ec
5
5
  SHA512:
6
- metadata.gz: 9ea7a3617ed5bcf3664d376827ee1f5a8e6c3b2aaac33af0460f3c43b8787e535b917a81d448d8e2b3935977c64b2e80c0bc8eba2d7fb7c0d6c06d673b8842bd
7
- data.tar.gz: e2fdbf510be4111c4dc4611432eddd696b75db90dca65a023f98f7a61a9ca1a8a270dcbffaa905d480bdd04ef1de584bb41aff8b406e974c7fb646966071f134
6
+ metadata.gz: c92cb15cc48cf8c4c78c73ebad18e980a73cdd889993d68de2a4873666a1f81a6a2715140bddb8a14f8e8b6cfd3270eb7481d9bb33c74c702495606d623ca300
7
+ data.tar.gz: b8c56baf3948241066277afc1289d9421df3cb8854a11b38f35b5cd18155a51180f1935418e8ed294b82900e14a8e9d33d48452fe226c3eea8be0d6afc237470
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 3.1.2
1
+ 3.3.0
data/CHANGELOG.md CHANGED
@@ -1,5 +1,15 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [1.3.0] - 2024-04-16
4
+
5
+ - Ruby 3.2+: Add back third argument to Regexp.new, to allow passing "n" to set `Regexp::NOENCODING`.
6
+
7
+ ## [1.2.0] - 2024-04-10
8
+
9
+ - First release with dedicated suport to Ruby 3.3.
10
+ - Added back `File.exists?` and `Dir.exists?` on Ruby 3.2+.
11
+ - Added back `Fixnum` as an alias for `Integer`.
12
+
3
13
  ## [1.1.1] - 2022-12-01
4
14
 
5
15
  - Gem no longer requires Ruby 3. It will not do anything when used on Ruby 2.x, but you can add it to your Gemfile if you need that for a Ruby migration strategy. (Thanks to @BigAirJosh)
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- ruby3-backward-compatibility (1.1.0)
4
+ ruby3-backward-compatibility (1.3.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/README.md CHANGED
@@ -71,6 +71,16 @@ This will wrap the given method and convert a hash given as the last argument in
71
71
 
72
72
  *Note:* In case the method is also defined in a prepended module, you need to put the `extend Ruby3BackwardCompatibility::CallableWithHash` above the `prepend`.
73
73
 
74
+ ### Dir
75
+
76
+ `Dir.exists?` has been removed in favor of `Dir.exist?`.
77
+
78
+ To add `Dir.exists?` as an alias for `Dir.exist?`, use
79
+
80
+ ```
81
+ require 'ruby3_backward_compatibility/compatibility/dir'
82
+ ```
83
+
74
84
  ### ERB
75
85
 
76
86
  `ERB.new` used to have the signature
@@ -91,6 +101,25 @@ To allow both styles, use
91
101
  require 'ruby3_backward_compatibility/compatibility/erb'
92
102
  ```
93
103
 
104
+ ### File
105
+
106
+ `File.exists?` has been removed in favor of `File.exist?`.
107
+
108
+ To add `File.exists?` as an alias for `File.exist?`, use
109
+
110
+ ```
111
+ require 'ruby3_backward_compatibility/compatibility/file'
112
+ ```
113
+
114
+ ### Fixnum
115
+
116
+ `Fixnum` has been an alias for `Integer` for a while, but was removed.
117
+
118
+ To add back `Fixnum` as an alias for `Integer`, use
119
+
120
+ ```
121
+ require 'ruby3_backward_compatibility/compatibility/fixnum'
122
+ ```
94
123
 
95
124
  ### I18n
96
125
 
@@ -113,6 +142,17 @@ To add them back as no-ops, use
113
142
  require 'ruby3_backward_compatibility/compatibility/object'
114
143
  ```
115
144
 
145
+ ### Regexp (Ruby 3.2+)
146
+
147
+ It was possible to instantiate a Regexp with `Regexp.new('foo', Regexp::IGNORECASE, 'n')`. The last argument used to indicate the encoding in Ruby 1.8. Up to Ruby 3.2 an argument of "n" or "N" indicated a regexp that ignores encoding (same as the Regexp::NOENCODING flag).
148
+
149
+ In Ruby 3 this raises an `ArgumentError`.
150
+
151
+ To bring back the old behavior, use
152
+
153
+ ```
154
+ require 'ruby3_backward_compatibility/compatibility/regexp'
155
+ ```
116
156
 
117
157
  ### YAML (Psych)
118
158
 
@@ -130,13 +170,13 @@ Psych version 4 (default for Ruby 3.1) has two changes:
130
170
  Psych.safe_load(yaml, permitted_classes: [], permitted_symbols: [], aliases: false, filename: nil)
131
171
  ```
132
172
 
133
- To alias `Psych.unsafe_load` as `Psych.load`, and to allow both styles of calling `Psych.safe_load`, use
173
+ To allow both styles of calling `Psych.safe_load`, use
134
174
 
135
175
  ```
136
176
  require 'ruby3_backward_compatibility/compatibility/psych'
137
177
  ```
138
178
 
139
- **Attention:** There has been a very good reason why Psych renamed the `.load` method: You may never use `.load` on any external strings. It is possible to create valid YAML strings that lead to the execution of arbitrary code, so calling `YAML.load` on user input is a major security vulnerability.
179
+ **Attention:** There has been a very good reason why Psych renamed the `.load` method: You may never use `.load` on any external strings. It is possible to create valid YAML strings that lead to the execution of arbitrary code, so calling `YAML.load` on user input is a major security vulnerability. For that reason, this library does not change the safe behavior of `YAML.load`.
140
180
 
141
181
 
142
182
  ### String
data/Rakefile CHANGED
@@ -3,6 +3,18 @@
3
3
  require 'bundler/gem_tasks'
4
4
  require 'rspec/core/rake_task'
5
5
 
6
- RSpec::Core::RakeTask.new(:spec)
6
+ ruby2_specs = 'spec/ruby2/**/*_spec.rb'
7
+ rake_task = RSpec::Core::RakeTask.new(:spec)
8
+
9
+ if RUBY_VERSION < '3'
10
+ rake_task.pattern = 'spec/ruby2/**/*_spec.rb'
11
+ task default: :spec
12
+ else
13
+ rake_task.exclude_pattern = 'spec/{ruby2,isolated}/**/*_spec.rb'
14
+
15
+ isolated_rake_task = RSpec::Core::RakeTask.new(:isolated_specs)
16
+ isolated_rake_task.pattern = 'spec/isolated/**/*_spec.rb'
17
+
18
+ task default: [:spec, :isolated_specs]
19
+ end
7
20
 
8
- task default: :spec
@@ -1,8 +1,12 @@
1
1
  require 'ruby3_backward_compatibility'
2
2
 
3
+ require 'ruby3_backward_compatibility/compatibility/dir'
3
4
  require 'ruby3_backward_compatibility/compatibility/erb' if defined?(ERB)
5
+ require 'ruby3_backward_compatibility/compatibility/file'
6
+ require 'ruby3_backward_compatibility/compatibility/fixnum'
4
7
  require 'ruby3_backward_compatibility/compatibility/i18n' if defined?(I18n)
5
8
  require 'ruby3_backward_compatibility/compatibility/object'
6
9
  require 'ruby3_backward_compatibility/compatibility/psych' if defined?(Psych)
10
+ require 'ruby3_backward_compatibility/compatibility/regexp'
7
11
  require 'ruby3_backward_compatibility/compatibility/string'
8
12
  require 'ruby3_backward_compatibility/compatibility/uri' if defined?(URI)
@@ -0,0 +1,5 @@
1
+ class Dir
2
+ class << self
3
+ alias_method :exists?, :exist? unless method_defined?(:exists?)
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class File
2
+ class << self
3
+ alias_method :exists?, :exist? unless method_defined?(:exists?)
4
+ end
5
+ end
@@ -0,0 +1,3 @@
1
+ unless defined?(::Fixnum)
2
+ Fixnum = Integer
3
+ end
@@ -0,0 +1,51 @@
1
+ if RUBY_VERSION >= '3.2'
2
+ # on 3.2 exactly, we get deprecation errors
3
+ # however, this is somewhat hard to fix, since 3.2 added some different ways to pass "options" that we do not want to rebuild
4
+
5
+ module Ruby3BackwardCompatibility
6
+ module RegexpCompatibility
7
+ LEGITIMATE_FLAGS = /\A[mix]+\z/
8
+
9
+ def self.prepended(by)
10
+ by.singleton_class.prepend ClassMethods
11
+ end
12
+
13
+ module ClassMethods
14
+ def new(regexp_or_string, options = NOT_GIVEN, n_flag = NOT_GIVEN, **kwargs)
15
+ if options == NOT_GIVEN
16
+ super(regexp_or_string, **kwargs)
17
+ elsif n_flag == 'n' || n_flag == 'N'
18
+ unless options.is_a?(Integer)
19
+ if RUBY_VERSION < '3.3' && options.is_a?(String) && options =~ LEGITIMATE_FLAGS
20
+ # on Ruby 3.2 we can legitimately have options "mix" treated as flags, so parse them
21
+ # on Ruby 3.3 this would never have been legitimate, since a third argument would not have been allowed
22
+ new_options = 0
23
+ new_options |= Regexp::MULTILINE if options.include?('m')
24
+ new_options |= Regexp::IGNORECASE if options.include?('i')
25
+ new_options |= Regexp::EXTENDED if options.include?('x')
26
+ options = new_options
27
+ else
28
+ # on all other Ruby, truish is IGNORECASE
29
+ options = options ? Regexp::IGNORECASE : 0
30
+ end
31
+ end
32
+ super(regexp_or_string, options | Regexp::NOENCODING, **kwargs)
33
+ elsif options.is_a?(String)
34
+ if options =~ LEGITIMATE_FLAGS && n_flag == NOT_GIVEN
35
+ # this (like any trueish value) would have been "ignore case" in Ruby < 3.2, but now is not
36
+ # we have to assume this is Ruby 3.2 syntax
37
+ super(regexp_or_string, options, **kwargs)
38
+ else
39
+ # this crashes on Ruby 3.2, so assume it is < 3.2 syntax
40
+ super(regexp_or_string, true, **kwargs)
41
+ end
42
+ else
43
+ super(regexp_or_string, options, **kwargs)
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+
50
+ Regexp.prepend Ruby3BackwardCompatibility::RegexpCompatibility
51
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Ruby3BackwardCompatibility
4
- VERSION = '1.1.1'
4
+ VERSION = '1.3.0'
5
5
  end
@@ -3,8 +3,6 @@
3
3
  if RUBY_VERSION.start_with?('3')
4
4
  module Ruby3BackwardCompatibility
5
5
  NOT_GIVEN = Object.new
6
-
7
- # TODO private?
8
6
  end
9
7
 
10
8
  require 'ruby3_backward_compatibility/callable_with_hash'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby3-backward-compatibility
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.1
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tobias Kraze
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-02-23 00:00:00.000000000 Z
11
+ date: 2024-04-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: byebug
@@ -45,10 +45,14 @@ files:
45
45
  - lib/ruby3_backward_compatibility.rb
46
46
  - lib/ruby3_backward_compatibility/callable_with_hash.rb
47
47
  - lib/ruby3_backward_compatibility/compatibility/all.rb
48
+ - lib/ruby3_backward_compatibility/compatibility/dir.rb
48
49
  - lib/ruby3_backward_compatibility/compatibility/erb.rb
50
+ - lib/ruby3_backward_compatibility/compatibility/file.rb
51
+ - lib/ruby3_backward_compatibility/compatibility/fixnum.rb
49
52
  - lib/ruby3_backward_compatibility/compatibility/i18n.rb
50
53
  - lib/ruby3_backward_compatibility/compatibility/object.rb
51
54
  - lib/ruby3_backward_compatibility/compatibility/psych.rb
55
+ - lib/ruby3_backward_compatibility/compatibility/regexp.rb
52
56
  - lib/ruby3_backward_compatibility/compatibility/string.rb
53
57
  - lib/ruby3_backward_compatibility/compatibility/uri.rb
54
58
  - lib/ruby3_backward_compatibility/version.rb
@@ -75,7 +79,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
75
79
  - !ruby/object:Gem::Version
76
80
  version: '0'
77
81
  requirements: []
78
- rubygems_version: 3.3.7
82
+ rubygems_version: 3.5.3
79
83
  signing_key:
80
84
  specification_version: 4
81
85
  summary: Backward compatibility for Ruby 3 stdlib