polyfill 0.8.0 → 0.9.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 +4 -4
- data/CHANGELOG.md +16 -0
- data/README.md +7 -7
- data/lib/polyfill.rb +127 -203
- data/lib/polyfill/internal_utils.rb +93 -0
- data/lib/polyfill/v2_2.rb +1 -2
- data/lib/polyfill/v2_2/enumerable.rb +36 -0
- data/lib/polyfill/v2_2/vector.rb +9 -0
- data/lib/polyfill/v2_3.rb +0 -7
- data/lib/polyfill/v2_4.rb +0 -21
- data/lib/polyfill/version.rb +1 -1
- metadata +4 -3
- data/lib/polyfill/utils.rb +0 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3b944cddd5bba115b1c21189a683eebfb41d3e85
|
4
|
+
data.tar.gz: d1069d216c3850bbb3687c1f39251403150c6912
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4b8fa7d1486148b1b305244ec0002fec739faa019e437f5163738ba0055d9ce0fe1ee1548a48fddc19ef628bdfada326b8fac6031ff5fda4497119943a54936b
|
7
|
+
data.tar.gz: 5f6f3e9a641cc20f9e9d06c420506b55084b1b379da2a90bd3509ea35f107422126bc8084edd22a1bcad2f0ba7706c6d4962439895450d934da18f8a7a51914c
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,18 @@
|
|
1
|
+
# [0.9.0][] (2017-05-05)
|
2
|
+
|
3
|
+
## Added
|
4
|
+
|
5
|
+
- v2.2 Enumerable#max
|
6
|
+
- v2.2 Enumerable#max_by
|
7
|
+
- v2.2 Enumerable#min
|
8
|
+
- v2.2 Enumerable#min_by
|
9
|
+
- v2.2 Vector#@+
|
10
|
+
- Polyfill.get can now be used with `prepend`
|
11
|
+
|
12
|
+
## Fixed
|
13
|
+
|
14
|
+
- Enumerable should add to Matrix and Vector as well
|
15
|
+
|
1
16
|
# [0.8.0][] (2017-04-27)
|
2
17
|
|
3
18
|
## Changed
|
@@ -141,6 +156,7 @@
|
|
141
156
|
- v2.4 String#concat?
|
142
157
|
- v2.4 String#prepend?
|
143
158
|
|
159
|
+
[0.9.0]: https://github.com/AaronLasseigne/polyfill/compare/v0.8.0...v0.9.0
|
144
160
|
[0.8.0]: https://github.com/AaronLasseigne/polyfill/compare/v0.7.0...v0.8.0
|
145
161
|
[0.7.0]: https://github.com/AaronLasseigne/polyfill/compare/v0.6.0...v0.7.0
|
146
162
|
[0.6.0]: https://github.com/AaronLasseigne/polyfill/compare/v0.5.0...v0.6.0
|
data/README.md
CHANGED
@@ -33,7 +33,7 @@ See the [implementation table](#implementation-table) for specifics about what h
|
|
33
33
|
Add it to your Gemfile:
|
34
34
|
|
35
35
|
```ruby
|
36
|
-
gem 'polyfill', '0.
|
36
|
+
gem 'polyfill', '0.9.0'
|
37
37
|
```
|
38
38
|
|
39
39
|
Or install it manually:
|
@@ -95,7 +95,7 @@ using Polyfill(native: true, Numeric: :all)
|
|
95
95
|
Prior to Ruby 2.4, refinements do not work on Modules. When using a polyfill
|
96
96
|
on a module it will instead refine the core classes that use the module. If
|
97
97
|
you're building your own class, it will not receive the polyfill. Instead,
|
98
|
-
you can `include` (or `extend`) in a polyfill with `Polyfill.get`.
|
98
|
+
you can `include` (or `extend` or `prepend`) in a polyfill with `Polyfill.get`.
|
99
99
|
|
100
100
|
```ruby
|
101
101
|
class Foo
|
@@ -316,10 +316,10 @@ end
|
|
316
316
|
| Binding | #local_variables | No |
|
317
317
|
| | #receiver | No |
|
318
318
|
| Dir | #fileno | No |
|
319
|
-
| Enumerable | #max |
|
320
|
-
| | #max_by |
|
321
|
-
| | #min |
|
322
|
-
| | #min_by |
|
319
|
+
| Enumerable | #max | Yes |
|
320
|
+
| | #max_by | Yes |
|
321
|
+
| | #min | Yes |
|
322
|
+
| | #min_by | Yes |
|
323
323
|
| | #slice_after | Yes |
|
324
324
|
| | #slice_when | Yes |
|
325
325
|
| Etc | .confstr | No |
|
@@ -371,7 +371,7 @@ end
|
|
371
371
|
| TSort | .each_strongly_connected_component | No |
|
372
372
|
| | .each_strongly_connected_component_from | No |
|
373
373
|
| | .tsort_each | No |
|
374
|
-
| Vector | #+@ |
|
374
|
+
| Vector | #+@ | Yes |
|
375
375
|
| | #-@ | No |
|
376
376
|
| | #angle_with | No |
|
377
377
|
| | .basis | No |
|
data/lib/polyfill.rb
CHANGED
@@ -1,31 +1,18 @@
|
|
1
|
-
require 'ipaddr'
|
2
|
-
require 'stringio'
|
3
1
|
require 'polyfill/version'
|
4
|
-
require 'polyfill/
|
2
|
+
require 'polyfill/internal_utils'
|
5
3
|
|
6
4
|
module Polyfill
|
7
|
-
module
|
5
|
+
module Module; end
|
8
6
|
|
9
7
|
def get(module_name, methods, options = {})
|
10
|
-
if Object.const_get(module_name.to_s).is_a?(Class)
|
8
|
+
if Object.const_get(module_name.to_s, false).is_a?(Class)
|
11
9
|
raise ArgumentError, "#{module_name} is a class not a module"
|
12
10
|
end
|
13
11
|
|
14
12
|
#
|
15
13
|
# parse options
|
16
14
|
#
|
17
|
-
versions =
|
18
|
-
'2.2' => Polyfill::V2_2,
|
19
|
-
'2.3' => Polyfill::V2_3,
|
20
|
-
'2.4' => Polyfill::V2_4
|
21
|
-
}
|
22
|
-
desired_version = options.delete(:version) || versions.keys.max
|
23
|
-
unless versions.keys.include?(desired_version)
|
24
|
-
raise ArgumentError, "invalid value for keyword version: #{desired_version}"
|
25
|
-
end
|
26
|
-
versions.reject! do |version_number, _|
|
27
|
-
version_number > desired_version
|
28
|
-
end
|
15
|
+
versions = InternalUtils.polyfill_versions_to_use(options.delete(:version))
|
29
16
|
|
30
17
|
unless options.empty?
|
31
18
|
raise ArgumentError, "unknown keyword: #{options.first[0]}"
|
@@ -34,75 +21,47 @@ module Polyfill
|
|
34
21
|
#
|
35
22
|
# find all polyfills for the module across all versions
|
36
23
|
#
|
37
|
-
|
38
|
-
current_ruby_version = RUBY_VERSION[/\A(\d+\.\d+)/, 1]
|
39
|
-
|
40
|
-
modules_with_updates = []
|
41
|
-
modules = []
|
42
|
-
versions.each do |version_number, version_module|
|
43
|
-
begin
|
44
|
-
final_module = module_names
|
45
|
-
.reduce(version_module) do |current_mod, name|
|
46
|
-
current_mod.const_get(name, false)
|
47
|
-
end
|
48
|
-
|
49
|
-
modules_with_updates << final_module
|
50
|
-
|
51
|
-
next if version_number <= current_ruby_version
|
52
|
-
|
53
|
-
modules << final_module.clone
|
54
|
-
rescue NameError
|
55
|
-
nil
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
if modules_with_updates.empty?
|
60
|
-
raise ArgumentError, %Q("#{module_name}" has no updates)
|
61
|
-
end
|
24
|
+
modules_with_updates, modules = InternalUtils.modules_to_use(module_name, versions)
|
62
25
|
|
63
26
|
#
|
64
27
|
# remove methods that were not requested
|
65
28
|
#
|
66
|
-
|
67
|
-
requested_methods = methods == :all ? methods_with_updates : methods
|
68
|
-
|
69
|
-
unless (leftovers = (requested_methods - methods_with_updates)).empty?
|
70
|
-
raise ArgumentError, %Q("##{leftovers.first}" is not a valid method on #{module_name} or has no updates)
|
71
|
-
end
|
29
|
+
requested_methods = InternalUtils.methods_to_keep(modules_with_updates, methods, '#', module_name)
|
72
30
|
|
73
31
|
modules.each do |instance_module|
|
74
|
-
instance_module
|
75
|
-
instance_module.send(:remove_method, name) unless requested_methods.include?(name)
|
76
|
-
end
|
32
|
+
InternalUtils.keep_only_these_methods!(instance_module, requested_methods)
|
77
33
|
end
|
78
34
|
|
79
35
|
#
|
80
36
|
# build the module to return
|
81
37
|
#
|
82
|
-
|
38
|
+
InternalUtils.create_module do |mod|
|
39
|
+
# make sure the methods get added if this module is included
|
40
|
+
mod.singleton_class.send(:define_method, :included) do |base|
|
41
|
+
modules.each do |module_to_add|
|
42
|
+
base.include module_to_add unless module_to_add.instance_methods.empty?
|
43
|
+
end
|
44
|
+
end
|
83
45
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
46
|
+
# make sure the methods get added if this module is extended
|
47
|
+
mod.singleton_class.send(:define_method, :extended) do |base|
|
48
|
+
modules.each do |module_to_add|
|
49
|
+
base.extend module_to_add unless module_to_add.instance_methods.empty?
|
50
|
+
end
|
88
51
|
end
|
89
|
-
end
|
90
52
|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
53
|
+
# make sure the methods get added if this module is prepended
|
54
|
+
mod.singleton_class.send(:define_method, :prepended) do |base|
|
55
|
+
modules.each do |module_to_add|
|
56
|
+
base.prepend module_to_add unless module_to_add.instance_methods.empty?
|
57
|
+
end
|
95
58
|
end
|
96
59
|
end
|
97
|
-
|
98
|
-
Polyfill::Parcel.const_set("O#{mod.object_id}", mod)
|
99
60
|
end
|
100
61
|
module_function :get
|
101
62
|
end
|
102
63
|
|
103
64
|
def Polyfill(options = {}) # rubocop:disable Style/MethodName
|
104
|
-
mod = Module.new
|
105
|
-
|
106
65
|
#
|
107
66
|
# parse options
|
108
67
|
#
|
@@ -116,21 +75,12 @@ def Polyfill(options = {}) # rubocop:disable Style/MethodName
|
|
116
75
|
0
|
117
76
|
end
|
118
77
|
end
|
119
|
-
|
120
|
-
|
121
|
-
versions = {
|
122
|
-
'2.2' => Polyfill::V2_2,
|
123
|
-
'2.3' => Polyfill::V2_3,
|
124
|
-
'2.4' => Polyfill::V2_4
|
125
|
-
}
|
126
|
-
desired_version = others.delete(:version) || versions.keys.max
|
127
|
-
unless versions.keys.include?(desired_version)
|
128
|
-
raise ArgumentError, "invalid value for keyword version: #{desired_version}"
|
129
|
-
end
|
130
|
-
versions.reject! do |version_number, _|
|
131
|
-
version_number > desired_version
|
78
|
+
objects.each do |object_name, _|
|
79
|
+
Object.const_get(object_name.to_s, false)
|
132
80
|
end
|
81
|
+
others = others.to_h
|
133
82
|
|
83
|
+
versions = Polyfill::InternalUtils.polyfill_versions_to_use(others.delete(:version))
|
134
84
|
native = others.delete(:native) { false }
|
135
85
|
|
136
86
|
unless others.empty?
|
@@ -138,160 +88,136 @@ def Polyfill(options = {}) # rubocop:disable Style/MethodName
|
|
138
88
|
end
|
139
89
|
|
140
90
|
#
|
141
|
-
#
|
91
|
+
# build the module to return
|
142
92
|
#
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
object_modules = versions
|
152
|
-
.map do |version_number, version_module|
|
93
|
+
Polyfill::InternalUtils.create_module do |mod|
|
94
|
+
objects.each do |object_name, methods|
|
95
|
+
#
|
96
|
+
# find all polyfills for the object across all versions
|
97
|
+
#
|
98
|
+
modules_with_updates, instance_modules = Polyfill::InternalUtils.modules_to_use(object_name, versions)
|
99
|
+
|
100
|
+
class_modules_with_updates = modules_with_updates.map do |module_with_updates|
|
153
101
|
begin
|
154
|
-
|
155
|
-
.reduce(version_module) do |current_mod, name|
|
156
|
-
current_mod.const_get(name, false)
|
157
|
-
end
|
158
|
-
|
159
|
-
[version_number, final_module]
|
102
|
+
module_with_updates.const_get(:ClassMethods, false)
|
160
103
|
rescue NameError
|
161
104
|
nil
|
162
105
|
end
|
163
|
-
end
|
164
|
-
.
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
106
|
+
end.compact
|
107
|
+
class_modules = instance_modules.map do |module_with_updates|
|
108
|
+
begin
|
109
|
+
module_with_updates.const_get(:ClassMethods, false).clone
|
110
|
+
rescue NameError
|
111
|
+
nil
|
112
|
+
end
|
113
|
+
end.compact
|
169
114
|
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
[version_number, object_module.const_get(:ClassMethods, false).clone]
|
176
|
-
rescue NameError
|
177
|
-
nil
|
115
|
+
#
|
116
|
+
# get all requested class and instance methods
|
117
|
+
#
|
118
|
+
if methods != :all && (method_name = methods.find { |method| method !~ /\A[.#]/ })
|
119
|
+
raise ArgumentError, %Q("#{method_name}" must start with a "." if it's a class method or "#" if it's an instance method)
|
178
120
|
end
|
179
|
-
end.compact
|
180
|
-
instance_modules = object_modules.map do |version_number, object_module|
|
181
|
-
[version_number, object_module.clone]
|
182
|
-
end
|
183
|
-
|
184
|
-
#
|
185
|
-
# get all requested class and instance methods
|
186
|
-
#
|
187
|
-
if methods != :all && (method_name = methods.find { |method| method !~ /\A[.#]/ })
|
188
|
-
raise ArgumentError, %Q("#{method_name}" must start with a "." if it's a class method or "#" if it's an instance method)
|
189
|
-
end
|
190
121
|
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
end
|
200
|
-
requested_class_methods = methods == :all ? available_class_methods : select_and_clean.call('.')
|
201
|
-
requested_instance_methods = methods == :all ? available_instance_methods : select_and_clean.call('#')
|
202
|
-
|
203
|
-
unless (leftovers = (requested_class_methods - available_class_methods)).empty?
|
204
|
-
raise ArgumentError, %Q(".#{leftovers.first}" is not a valid method on #{full_name} or has no updates)
|
205
|
-
end
|
206
|
-
unless (leftovers = (requested_instance_methods - available_instance_methods)).empty?
|
207
|
-
raise ArgumentError, %Q("##{leftovers.first}" is not a valid method on #{full_name} or has no updates)
|
208
|
-
end
|
122
|
+
instance_methods, class_methods =
|
123
|
+
if methods == :all
|
124
|
+
[:all, :all]
|
125
|
+
else
|
126
|
+
methods
|
127
|
+
.partition { |m| m.start_with?('#') }
|
128
|
+
.map { |method_list| method_list.map { |name| name[1..-1].to_sym } }
|
129
|
+
end
|
209
130
|
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
131
|
+
requested_instance_methods =
|
132
|
+
Polyfill::InternalUtils.methods_to_keep(modules_with_updates, instance_methods, '#', object_name)
|
133
|
+
requested_class_methods =
|
134
|
+
Polyfill::InternalUtils.methods_to_keep(class_modules_with_updates, class_methods, '.', object_name)
|
135
|
+
|
136
|
+
#
|
137
|
+
# get the class(es) to refine
|
138
|
+
#
|
139
|
+
base_object = object_name.to_s
|
140
|
+
base_objects =
|
141
|
+
case base_object
|
142
|
+
when 'Comparable'
|
143
|
+
%w[Numeric String Time]
|
144
|
+
when 'Enumerable'
|
145
|
+
%w[Array Dir Enumerator Hash IO Matrix Range StringIO Struct Vector]
|
146
|
+
when 'Kernel'
|
147
|
+
%w[Object]
|
148
|
+
else
|
149
|
+
[base_object]
|
150
|
+
end
|
151
|
+
base_objects.select! do |klass|
|
152
|
+
begin
|
153
|
+
Object.const_get(klass, false)
|
154
|
+
rescue NameError
|
155
|
+
false
|
156
|
+
end
|
224
157
|
end
|
225
158
|
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
159
|
+
#
|
160
|
+
# refine in class methods
|
161
|
+
#
|
162
|
+
class_modules.each do |class_module|
|
163
|
+
Polyfill::InternalUtils.keep_only_these_methods!(class_module, requested_class_methods)
|
231
164
|
|
232
|
-
|
233
|
-
class_module.send(:remove_method, name) unless requested_class_methods.include?(name)
|
234
|
-
end
|
165
|
+
next if class_module.instance_methods.empty?
|
235
166
|
|
236
|
-
|
167
|
+
mod.module_exec(requested_class_methods) do |methods_added|
|
168
|
+
base_objects.each do |klass|
|
169
|
+
refine Object.const_get(klass, false).singleton_class do
|
170
|
+
include class_module
|
237
171
|
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
172
|
+
if native
|
173
|
+
Polyfill::InternalUtils.ignore_warnings do
|
174
|
+
define_method :respond_to? do |name, include_all = false|
|
175
|
+
return true if methods_added.include?(name)
|
242
176
|
|
243
|
-
|
244
|
-
|
245
|
-
define_method :respond_to? do |name, include_all = false|
|
246
|
-
return true if methods_added.include?(name)
|
177
|
+
super(name, include_all)
|
178
|
+
end
|
247
179
|
|
248
|
-
|
249
|
-
|
180
|
+
define_method :__send__ do |name, *args, &block|
|
181
|
+
return super(name, *args, &block) unless methods_added.include?(name)
|
250
182
|
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
class_module.instance_method(name).bind(self).call(*args, &block)
|
183
|
+
class_module.instance_method(name).bind(self).call(*args, &block)
|
184
|
+
end
|
185
|
+
alias_method :send, :__send__
|
255
186
|
end
|
256
|
-
alias_method :send, :__send__
|
257
187
|
end
|
258
188
|
end
|
259
189
|
end
|
260
190
|
end
|
261
191
|
end
|
262
|
-
end
|
263
|
-
|
264
|
-
#
|
265
|
-
# refine in instance methods
|
266
|
-
#
|
267
|
-
instance_modules.each do |version_number, instance_module|
|
268
|
-
next if version_number <= current_ruby_version
|
269
192
|
|
270
|
-
|
271
|
-
|
272
|
-
|
193
|
+
#
|
194
|
+
# refine in instance methods
|
195
|
+
#
|
196
|
+
instance_modules.each do |instance_module|
|
197
|
+
Polyfill::InternalUtils.keep_only_these_methods!(instance_module, requested_instance_methods)
|
273
198
|
|
274
|
-
|
199
|
+
next if instance_module.instance_methods.empty?
|
275
200
|
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
201
|
+
mod.module_exec(requested_instance_methods) do |methods_added|
|
202
|
+
base_objects.each do |klass|
|
203
|
+
refine Object.const_get(klass, false) do
|
204
|
+
include instance_module
|
280
205
|
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
206
|
+
if native
|
207
|
+
Polyfill::InternalUtils.ignore_warnings do
|
208
|
+
define_method :respond_to? do |name, include_all = false|
|
209
|
+
return super(name, include_all) unless methods_added.include?(name)
|
285
210
|
|
286
|
-
|
287
|
-
|
211
|
+
true
|
212
|
+
end
|
288
213
|
|
289
|
-
|
290
|
-
|
214
|
+
define_method :__send__ do |name, *args, &block|
|
215
|
+
return super(name, *args, &block) unless methods_added.include?(name)
|
291
216
|
|
292
|
-
|
217
|
+
instance_module.instance_method(name).bind(self).call(*args, &block)
|
218
|
+
end
|
219
|
+
alias_method :send, :__send__
|
293
220
|
end
|
294
|
-
alias_method :send, :__send__
|
295
221
|
end
|
296
222
|
end
|
297
223
|
end
|
@@ -299,8 +225,6 @@ def Polyfill(options = {}) # rubocop:disable Style/MethodName
|
|
299
225
|
end
|
300
226
|
end
|
301
227
|
end
|
302
|
-
|
303
|
-
Polyfill::Parcel.const_set("O#{mod.object_id}", mod)
|
304
228
|
end
|
305
229
|
|
306
230
|
require 'polyfill/v2_2'
|
@@ -0,0 +1,93 @@
|
|
1
|
+
module Polyfill
|
2
|
+
module InternalUtils
|
3
|
+
VERSIONS = {
|
4
|
+
'2.2' => 'V2_2',
|
5
|
+
'2.3' => 'V2_3',
|
6
|
+
'2.4' => 'V2_4'
|
7
|
+
}.freeze
|
8
|
+
private_constant :VERSIONS
|
9
|
+
|
10
|
+
def current_ruby_version
|
11
|
+
@current_ruby_version ||= RUBY_VERSION[/\A(\d+\.\d+)/, 1]
|
12
|
+
end
|
13
|
+
module_function :current_ruby_version
|
14
|
+
|
15
|
+
def ignore_warnings
|
16
|
+
orig = $VERBOSE
|
17
|
+
$VERBOSE = nil
|
18
|
+
|
19
|
+
yield
|
20
|
+
|
21
|
+
$VERBOSE = orig
|
22
|
+
end
|
23
|
+
module_function :ignore_warnings
|
24
|
+
|
25
|
+
def polyfill_versions_to_use(desired_version = nil)
|
26
|
+
desired_version = VERSIONS.keys.max if desired_version.nil?
|
27
|
+
|
28
|
+
unless VERSIONS.keys.include?(desired_version)
|
29
|
+
raise ArgumentError, "invalid value for keyword version: #{desired_version}"
|
30
|
+
end
|
31
|
+
|
32
|
+
VERSIONS
|
33
|
+
.reject { |version, _| version > desired_version }
|
34
|
+
.map { |version, mod| [version, Polyfill.const_get(mod, false)] }
|
35
|
+
.to_h
|
36
|
+
end
|
37
|
+
module_function :polyfill_versions_to_use
|
38
|
+
|
39
|
+
def keep_only_these_methods!(mod, whitelist)
|
40
|
+
mod.instance_methods.each do |name|
|
41
|
+
mod.send(:remove_method, name) unless whitelist.include?(name)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
module_function :keep_only_these_methods!
|
45
|
+
|
46
|
+
def modules_to_use(module_name, versions)
|
47
|
+
modules_with_updates = []
|
48
|
+
modules = []
|
49
|
+
|
50
|
+
versions.each do |version_number, version_module|
|
51
|
+
begin
|
52
|
+
final_module = version_module.const_get(module_name.to_s, false)
|
53
|
+
|
54
|
+
modules_with_updates << final_module
|
55
|
+
|
56
|
+
next if version_number <= InternalUtils.current_ruby_version
|
57
|
+
|
58
|
+
modules << final_module.clone
|
59
|
+
rescue NameError
|
60
|
+
nil
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
if modules_with_updates.empty?
|
65
|
+
raise ArgumentError, %Q("#{module_name}" has no updates)
|
66
|
+
end
|
67
|
+
|
68
|
+
[modules_with_updates, modules]
|
69
|
+
end
|
70
|
+
module_function :modules_to_use
|
71
|
+
|
72
|
+
def methods_to_keep(modules, methods, lead_symbol, module_name)
|
73
|
+
methods_with_updates = modules.flat_map(&:instance_methods).uniq
|
74
|
+
requested_methods = methods == :all ? methods_with_updates : methods
|
75
|
+
|
76
|
+
unless (leftovers = (requested_methods - methods_with_updates)).empty?
|
77
|
+
raise ArgumentError, %Q("#{lead_symbol}#{leftovers.first}" is not a valid method on #{module_name} or has no updates)
|
78
|
+
end
|
79
|
+
|
80
|
+
requested_methods
|
81
|
+
end
|
82
|
+
module_function :methods_to_keep
|
83
|
+
|
84
|
+
def create_module
|
85
|
+
mod = ::Module.new
|
86
|
+
|
87
|
+
yield(mod)
|
88
|
+
|
89
|
+
Polyfill::Module.const_set("M#{mod.object_id}", mod)
|
90
|
+
end
|
91
|
+
module_function :create_module
|
92
|
+
end
|
93
|
+
end
|
data/lib/polyfill/v2_2.rb
CHANGED
@@ -1,6 +1,42 @@
|
|
1
1
|
module Polyfill
|
2
2
|
module V2_2
|
3
3
|
module Enumerable
|
4
|
+
def max(n = nil)
|
5
|
+
return block_given? ? super(&::Proc.new) : super() if n.nil? || n == 1
|
6
|
+
|
7
|
+
raise ArgumentError, "negative size (#{n})" if n < 0
|
8
|
+
|
9
|
+
(block_given? ? sort(&::Proc.new) : sort).last(n).reverse
|
10
|
+
end
|
11
|
+
|
12
|
+
def max_by(n = nil)
|
13
|
+
if n.nil? || n == 1 || !block_given?
|
14
|
+
return block_given? ? super(&::Proc.new) : super()
|
15
|
+
end
|
16
|
+
|
17
|
+
raise ArgumentError, "negative size (#{n})" if n < 0
|
18
|
+
|
19
|
+
sort_by(&::Proc.new).last(n).reverse
|
20
|
+
end
|
21
|
+
|
22
|
+
def min(n = nil)
|
23
|
+
return block_given? ? super(&::Proc.new) : super() if n.nil? || n == 1
|
24
|
+
|
25
|
+
raise ArgumentError, "negative size (#{n})" if n < 0
|
26
|
+
|
27
|
+
(block_given? ? sort(&::Proc.new) : sort).first(n)
|
28
|
+
end
|
29
|
+
|
30
|
+
def min_by(n = nil)
|
31
|
+
if n.nil? || n == 1 || !block_given?
|
32
|
+
return block_given? ? super(&::Proc.new) : super()
|
33
|
+
end
|
34
|
+
|
35
|
+
raise ArgumentError, "negative size (#{n})" if n < 0
|
36
|
+
|
37
|
+
sort_by(&::Proc.new).first(n)
|
38
|
+
end
|
39
|
+
|
4
40
|
def slice_after(pattern = nil)
|
5
41
|
raise ArgumentError, 'both pattern and block are given' if pattern && block_given?
|
6
42
|
raise ArgumentError, 'wrong number of arguments (given 0, expected 1)' if !pattern && !block_given?
|
data/lib/polyfill/v2_3.rb
CHANGED
data/lib/polyfill/v2_4.rb
CHANGED
@@ -21,26 +21,5 @@ require_relative 'v2_4/pathname'
|
|
21
21
|
|
22
22
|
module Polyfill
|
23
23
|
module V2_4
|
24
|
-
include Array
|
25
|
-
include Comparable
|
26
|
-
include Dir
|
27
|
-
include Enumerable
|
28
|
-
include Enumerator::Lazy
|
29
|
-
include File
|
30
|
-
include Float
|
31
|
-
include Hash
|
32
|
-
include Integer
|
33
|
-
include IO
|
34
|
-
include Kernel
|
35
|
-
include MatchData
|
36
|
-
include Numeric
|
37
|
-
include Object
|
38
|
-
include Regexp
|
39
|
-
include String
|
40
|
-
include StringIO
|
41
|
-
include Symbol
|
42
|
-
|
43
|
-
include IPAddr
|
44
|
-
include Pathname
|
45
24
|
end
|
46
25
|
end
|
data/lib/polyfill/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: polyfill
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Aaron Lasseigne
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-05-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -86,10 +86,11 @@ files:
|
|
86
86
|
- bin/console
|
87
87
|
- bin/setup
|
88
88
|
- lib/polyfill.rb
|
89
|
-
- lib/polyfill/
|
89
|
+
- lib/polyfill/internal_utils.rb
|
90
90
|
- lib/polyfill/v2_2.rb
|
91
91
|
- lib/polyfill/v2_2/enumerable.rb
|
92
92
|
- lib/polyfill/v2_2/kernel.rb
|
93
|
+
- lib/polyfill/v2_2/vector.rb
|
93
94
|
- lib/polyfill/v2_3.rb
|
94
95
|
- lib/polyfill/v2_3/array.rb
|
95
96
|
- lib/polyfill/v2_3/enumerable.rb
|