polyfill 0.6.0 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (136) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +1 -1
  3. data/.travis.yml +3 -2
  4. data/CHANGELOG.md +26 -10
  5. data/CONTRIBUTING.md +0 -2
  6. data/README.md +107 -28
  7. data/lib/polyfill.rb +168 -74
  8. data/lib/polyfill/utils.rb +8 -3
  9. data/lib/polyfill/v2_2.rb +9 -0
  10. data/lib/polyfill/v2_2/enumerable.rb +34 -0
  11. data/lib/polyfill/v2_2/kernel.rb +9 -0
  12. data/lib/polyfill/v2_3.rb +2 -0
  13. data/lib/polyfill/v2_3/array.rb +22 -3
  14. data/lib/polyfill/v2_3/enumerable.rb +48 -3
  15. data/lib/polyfill/v2_3/enumerator/lazy.rb +7 -3
  16. data/lib/polyfill/v2_3/hash.rb +39 -3
  17. data/lib/polyfill/v2_3/kernel.rb +17 -0
  18. data/lib/polyfill/v2_3/string.rb +23 -5
  19. data/lib/polyfill/v2_3/struct.rb +22 -3
  20. data/lib/polyfill/v2_4/array.rb +25 -3
  21. data/lib/polyfill/v2_4/comparable.rb +9 -3
  22. data/lib/polyfill/v2_4/dir.rb +5 -3
  23. data/lib/polyfill/v2_4/enumerable.rb +28 -3
  24. data/lib/polyfill/v2_4/enumerator/lazy.rb +15 -3
  25. data/lib/polyfill/v2_4/file.rb +5 -3
  26. data/lib/polyfill/v2_4/float.rb +38 -3
  27. data/lib/polyfill/v2_4/hash.rb +35 -3
  28. data/lib/polyfill/v2_4/i_p_addr.rb +11 -3
  29. data/lib/polyfill/v2_4/integer.rb +53 -3
  30. data/lib/polyfill/v2_4/io.rb +166 -4
  31. data/lib/polyfill/v2_4/match_data.rb +11 -3
  32. data/lib/polyfill/v2_4/numeric.rb +15 -3
  33. data/lib/polyfill/v2_4/object.rb +9 -3
  34. data/lib/polyfill/v2_4/pathname.rb +7 -3
  35. data/lib/polyfill/v2_4/regexp.rb +3 -3
  36. data/lib/polyfill/v2_4/string.rb +110 -4
  37. data/lib/polyfill/v2_4/string_io.rb +166 -2
  38. data/lib/polyfill/v2_4/symbol.rb +17 -3
  39. data/lib/polyfill/version.rb +1 -1
  40. data/polyfill.gemspec +1 -1
  41. metadata +7 -98
  42. data/lib/polyfill/v2_3/array/instance.rb +0 -11
  43. data/lib/polyfill/v2_3/array/instance/dig.rb +0 -42
  44. data/lib/polyfill/v2_3/enumerable/instance.rb +0 -15
  45. data/lib/polyfill/v2_3/enumerable/instance/chunk_while.rb +0 -70
  46. data/lib/polyfill/v2_3/enumerable/instance/grep_v.rb +0 -48
  47. data/lib/polyfill/v2_3/enumerable/instance/slice_before.rb +0 -48
  48. data/lib/polyfill/v2_3/enumerator/lazy/instance.rb +0 -13
  49. data/lib/polyfill/v2_3/enumerator/lazy/instance/grep_v.rb +0 -31
  50. data/lib/polyfill/v2_3/hash/instance.rb +0 -15
  51. data/lib/polyfill/v2_3/hash/instance/dig.rb +0 -17
  52. data/lib/polyfill/v2_3/hash/instance/fetch_values.rb +0 -32
  53. data/lib/polyfill/v2_3/hash/instance/to_proc.rb +0 -23
  54. data/lib/polyfill/v2_3/string/class.rb +0 -11
  55. data/lib/polyfill/v2_3/string/class/new.rb +0 -33
  56. data/lib/polyfill/v2_3/string/instance.rb +0 -13
  57. data/lib/polyfill/v2_3/string/instance/minus_unary.rb +0 -23
  58. data/lib/polyfill/v2_3/string/instance/plus_unary.rb +0 -23
  59. data/lib/polyfill/v2_3/struct/instance.rb +0 -11
  60. data/lib/polyfill/v2_3/struct/instance/dig.rb +0 -17
  61. data/lib/polyfill/v2_4/array/instance.rb +0 -13
  62. data/lib/polyfill/v2_4/array/instance/concat.rb +0 -30
  63. data/lib/polyfill/v2_4/array/instance/sum.rb +0 -17
  64. data/lib/polyfill/v2_4/comparable/instance.rb +0 -11
  65. data/lib/polyfill/v2_4/comparable/instance/clamp.rb +0 -35
  66. data/lib/polyfill/v2_4/dir/class.rb +0 -11
  67. data/lib/polyfill/v2_4/dir/class/empty_q.rb +0 -23
  68. data/lib/polyfill/v2_4/enumerable/instance.rb +0 -15
  69. data/lib/polyfill/v2_4/enumerable/instance/chunk.rb +0 -48
  70. data/lib/polyfill/v2_4/enumerable/instance/sum.rb +0 -52
  71. data/lib/polyfill/v2_4/enumerable/instance/uniq.rb +0 -45
  72. data/lib/polyfill/v2_4/enumerator/lazy/instance.rb +0 -15
  73. data/lib/polyfill/v2_4/enumerator/lazy/instance/chunk_while.rb +0 -29
  74. data/lib/polyfill/v2_4/enumerator/lazy/instance/uniq.rb +0 -33
  75. data/lib/polyfill/v2_4/file/class.rb +0 -11
  76. data/lib/polyfill/v2_4/file/class/empty_q.rb +0 -23
  77. data/lib/polyfill/v2_4/float/instance.rb +0 -15
  78. data/lib/polyfill/v2_4/float/instance/ceil.rb +0 -32
  79. data/lib/polyfill/v2_4/float/instance/floor.rb +0 -32
  80. data/lib/polyfill/v2_4/float/instance/truncate.rb +0 -32
  81. data/lib/polyfill/v2_4/hash/instance.rb +0 -17
  82. data/lib/polyfill/v2_4/hash/instance/compact.rb +0 -23
  83. data/lib/polyfill/v2_4/hash/instance/compact_e.rb +0 -23
  84. data/lib/polyfill/v2_4/hash/instance/transform_values.rb +0 -33
  85. data/lib/polyfill/v2_4/hash/instance/transform_values_e.rb +0 -33
  86. data/lib/polyfill/v2_4/i_p_addr/instance.rb +0 -13
  87. data/lib/polyfill/v2_4/i_p_addr/instance/equalequal.rb +0 -27
  88. data/lib/polyfill/v2_4/i_p_addr/instance/lessthanequalgreaterthan.rb +0 -27
  89. data/lib/polyfill/v2_4/integer/instance.rb +0 -19
  90. data/lib/polyfill/v2_4/integer/instance/ceil.rb +0 -28
  91. data/lib/polyfill/v2_4/integer/instance/digits.rb +0 -34
  92. data/lib/polyfill/v2_4/integer/instance/floor.rb +0 -28
  93. data/lib/polyfill/v2_4/integer/instance/round.rb +0 -31
  94. data/lib/polyfill/v2_4/integer/instance/truncate.rb +0 -28
  95. data/lib/polyfill/v2_4/io/class.rb +0 -13
  96. data/lib/polyfill/v2_4/io/class/foreach.rb +0 -55
  97. data/lib/polyfill/v2_4/io/class/readlines.rb +0 -37
  98. data/lib/polyfill/v2_4/io/instance.rb +0 -19
  99. data/lib/polyfill/v2_4/io/instance/each_line.rb +0 -54
  100. data/lib/polyfill/v2_4/io/instance/gets.rb +0 -37
  101. data/lib/polyfill/v2_4/io/instance/lines.rb +0 -54
  102. data/lib/polyfill/v2_4/io/instance/readline.rb +0 -37
  103. data/lib/polyfill/v2_4/io/instance/readlines.rb +0 -37
  104. data/lib/polyfill/v2_4/match_data/instance.rb +0 -13
  105. data/lib/polyfill/v2_4/match_data/instance/named_captures.rb +0 -25
  106. data/lib/polyfill/v2_4/match_data/instance/values_at.rb +0 -25
  107. data/lib/polyfill/v2_4/numeric/instance.rb +0 -17
  108. data/lib/polyfill/v2_4/numeric/instance/clone.rb +0 -23
  109. data/lib/polyfill/v2_4/numeric/instance/dup.rb +0 -23
  110. data/lib/polyfill/v2_4/numeric/instance/finite_q.rb +0 -23
  111. data/lib/polyfill/v2_4/numeric/instance/infinite_q.rb +0 -23
  112. data/lib/polyfill/v2_4/object/instance.rb +0 -11
  113. data/lib/polyfill/v2_4/object/instance/clone.rb +0 -29
  114. data/lib/polyfill/v2_4/pathname/instance.rb +0 -11
  115. data/lib/polyfill/v2_4/pathname/instance/empty_q.rb +0 -29
  116. data/lib/polyfill/v2_4/regexp/instance.rb +0 -11
  117. data/lib/polyfill/v2_4/regexp/instance/match_q.rb +0 -23
  118. data/lib/polyfill/v2_4/string/class.rb +0 -11
  119. data/lib/polyfill/v2_4/string/class/new.rb +0 -26
  120. data/lib/polyfill/v2_4/string/instance.rb +0 -23
  121. data/lib/polyfill/v2_4/string/instance/casecmp_q.rb +0 -23
  122. data/lib/polyfill/v2_4/string/instance/concat.rb +0 -30
  123. data/lib/polyfill/v2_4/string/instance/each_line.rb +0 -17
  124. data/lib/polyfill/v2_4/string/instance/lines.rb +0 -55
  125. data/lib/polyfill/v2_4/string/instance/match_q.rb +0 -23
  126. data/lib/polyfill/v2_4/string/instance/prepend.rb +0 -30
  127. data/lib/polyfill/v2_4/string/instance/unpack1.rb +0 -23
  128. data/lib/polyfill/v2_4/string_io/instance.rb +0 -17
  129. data/lib/polyfill/v2_4/string_io/instance/each_line.rb +0 -17
  130. data/lib/polyfill/v2_4/string_io/instance/gets.rb +0 -17
  131. data/lib/polyfill/v2_4/string_io/instance/readline.rb +0 -17
  132. data/lib/polyfill/v2_4/string_io/instance/readlines.rb +0 -17
  133. data/lib/polyfill/v2_4/symbol/instance.rb +0 -15
  134. data/lib/polyfill/v2_4/symbol/instance/casecmp_q.rb +0 -25
  135. data/lib/polyfill/v2_4/symbol/instance/match.rb +0 -27
  136. data/lib/polyfill/v2_4/symbol/instance/match_q.rb +0 -17
@@ -1,9 +1,11 @@
1
- require_relative 'file/class'
2
-
3
1
  module Polyfill
4
2
  module V2_4
5
3
  module File
6
- include Class
4
+ module ClassMethods
5
+ def empty?(file_name)
6
+ zero?(file_name)
7
+ end
8
+ end
7
9
  end
8
10
  end
9
11
  end
@@ -1,9 +1,44 @@
1
- require_relative 'float/instance'
2
-
3
1
  module Polyfill
4
2
  module V2_4
5
3
  module Float
6
- include Instance
4
+ def ceil(ndigits = 0)
5
+ ndigits = ndigits.to_int
6
+ return super() if ndigits == 0
7
+
8
+ if ndigits > 0
9
+ place = 10**ndigits
10
+ (self * place).ceil / place.to_f
11
+ else
12
+ place = 10**-ndigits
13
+ (self / place).ceil * place
14
+ end
15
+ end
16
+
17
+ def floor(ndigits = 0)
18
+ ndigits = ndigits.to_int
19
+ return super() if ndigits == 0
20
+
21
+ if ndigits > 0
22
+ place = 10**ndigits
23
+ (self * place).floor / place.to_f
24
+ else
25
+ place = 10**-ndigits
26
+ (self / place).floor * place
27
+ end
28
+ end
29
+
30
+ def truncate(ndigits = 0)
31
+ ndigits = ndigits.to_int
32
+ return super() if ndigits == 0
33
+
34
+ if ndigits > 0
35
+ place = 10**ndigits
36
+ (self * place).truncate / place.to_f
37
+ else
38
+ place = 10**-ndigits
39
+ (self / place).truncate * place
40
+ end
41
+ end
7
42
  end
8
43
  end
9
44
  end
@@ -1,9 +1,41 @@
1
- require_relative 'hash/instance'
2
-
3
1
  module Polyfill
4
2
  module V2_4
5
3
  module Hash
6
- include Instance
4
+ def compact
5
+ reject { |_, v| v.nil? }
6
+ end
7
+
8
+ def compact!
9
+ reject! { |_, v| v.nil? }
10
+ end
11
+
12
+ def transform_values
13
+ unless block_given?
14
+ return ::Enumerator.new(keys.size) do |yielder|
15
+ each_with_object({}) do |(k, v), acc|
16
+ acc[k] = yielder.yield(v)
17
+ end
18
+ end
19
+ end
20
+
21
+ each_with_object({}) do |(k, v), acc|
22
+ acc[k] = yield(v)
23
+ end
24
+ end
25
+
26
+ def transform_values!
27
+ unless block_given?
28
+ return ::Enumerator.new(keys.size) do |yielder|
29
+ replace(each_with_object({}) do |(k, v), acc|
30
+ acc[k] = yielder.yield(v)
31
+ end)
32
+ end
33
+ end
34
+
35
+ replace(each_with_object({}) do |(k, v), acc|
36
+ acc[k] = yield(v)
37
+ end)
38
+ end
7
39
  end
8
40
  end
9
41
  end
@@ -1,9 +1,17 @@
1
- require_relative 'i_p_addr/instance'
2
-
3
1
  module Polyfill
4
2
  module V2_4
5
3
  module IPAddr
6
- include Instance
4
+ def ==(*)
5
+ super
6
+ rescue
7
+ false
8
+ end
9
+
10
+ def <=>(*)
11
+ super
12
+ rescue
13
+ nil
14
+ end
7
15
  end
8
16
  end
9
17
  end
@@ -1,9 +1,59 @@
1
- require_relative 'integer/instance'
2
-
3
1
  module Polyfill
4
2
  module V2_4
5
3
  module Integer
6
- include Instance
4
+ def ceil(ndigits = 0)
5
+ ndigits = ndigits.to_int
6
+ return super() if ndigits == 0
7
+ return to_f if ndigits > 0
8
+
9
+ place = 10**-ndigits
10
+ (to_f / place).ceil * place
11
+ end
12
+
13
+ def digits(base = 10)
14
+ base = base.to_int
15
+ raise Math::DomainError, 'out of domain' if self < 0
16
+ raise ArgumentError, 'negative radix' if base < 0
17
+ raise ArgumentError, "invalid radix #{base}" if base < 2
18
+
19
+ acc = []
20
+ remainder = self
21
+ while remainder > 0
22
+ remainder, value = remainder.divmod(base)
23
+ acc.push(value)
24
+ end
25
+ acc
26
+ end
27
+
28
+ def floor(ndigits = 0)
29
+ ndigits = ndigits.to_int
30
+ return super() if ndigits == 0
31
+ return to_f if ndigits > 0
32
+
33
+ place = 10**-ndigits
34
+ (to_f / place).floor * place
35
+ end
36
+
37
+ def round(ndigits = 0, half: nil)
38
+ unless [nil, :down, :even, :up, 'down', 'even', 'up'].include?(half)
39
+ raise ArgumentError, "invalid rounding mode: #{half}"
40
+ end
41
+ ndigits = ndigits.to_int
42
+ return super() if ndigits == 0
43
+ return to_f if ndigits > 0
44
+
45
+ place = 10**-ndigits
46
+ (to_f / place).round * place
47
+ end
48
+
49
+ def truncate(ndigits = 0)
50
+ ndigits = ndigits.to_int
51
+ return super() if ndigits == 0
52
+ return to_f if ndigits > 0
53
+
54
+ place = 10**-ndigits
55
+ (to_f / place).truncate * place
56
+ end
7
57
  end
8
58
  end
9
59
  end
@@ -1,11 +1,173 @@
1
- require_relative 'io/class'
2
- require_relative 'io/instance'
1
+ require 'English'
3
2
 
4
3
  module Polyfill
5
4
  module V2_4
6
5
  module IO
7
- include Class
8
- include Instance
6
+ module ClassMethods
7
+ def foreach(name, *args)
8
+ hash, others = args.partition { |arg| arg.is_a?(::Hash) }
9
+ chomps = hash[0] && hash[0][:chomp]
10
+
11
+ unless block_given?
12
+ return super(name, *others) unless chomps
13
+
14
+ separator = others.find do |other|
15
+ other.respond_to?(:to_str)
16
+ end || $INPUT_RECORD_SEPARATOR
17
+
18
+ return ::Enumerator.new do |yielder|
19
+ super(name, *others) do |line|
20
+ yielder.yield(line.chomp(separator))
21
+ end
22
+ end
23
+ end
24
+
25
+ block =
26
+ if chomps
27
+ separator = others.find do |other|
28
+ other.respond_to?(:to_str)
29
+ end || $INPUT_RECORD_SEPARATOR
30
+
31
+ proc do |line|
32
+ yield(line.chomp(separator))
33
+ end
34
+ else
35
+ ::Proc.new
36
+ end
37
+
38
+ super(name, *others, &block)
39
+ end
40
+
41
+ def readlines(file_name, *args)
42
+ hash, others = args.partition { |arg| arg.is_a?(::Hash) }
43
+
44
+ inputs = super(file_name, *others)
45
+
46
+ if hash[0] && hash[0][:chomp]
47
+ separator = others.find do |other|
48
+ other.respond_to?(:to_str)
49
+ end || $INPUT_RECORD_SEPARATOR
50
+
51
+ inputs.each { |input| input.chomp!(separator) }
52
+ end
53
+
54
+ inputs
55
+ end
56
+ end
57
+
58
+ def each_line(*args)
59
+ hash, others = args.partition { |arg| arg.is_a?(::Hash) }
60
+ chomps = hash[0] && hash[0][:chomp]
61
+
62
+ unless block_given?
63
+ return super(*others) unless chomps
64
+
65
+ separator = others.find do |other|
66
+ other.respond_to?(:to_str)
67
+ end || $INPUT_RECORD_SEPARATOR
68
+ return ::Enumerator.new do |yielder|
69
+ super(*others) do |line|
70
+ yielder.yield(line.chomp(separator))
71
+ end
72
+ end
73
+ end
74
+
75
+ block =
76
+ if chomps
77
+ separator = others.find do |other|
78
+ other.respond_to?(:to_str)
79
+ end || $INPUT_RECORD_SEPARATOR
80
+
81
+ proc do |line|
82
+ yield(line.chomp(separator))
83
+ end
84
+ else
85
+ ::Proc.new
86
+ end
87
+
88
+ super(*others, &block)
89
+ end
90
+
91
+ def gets(*args)
92
+ hash, others = args.partition { |arg| arg.is_a?(::Hash) }
93
+
94
+ input = super(*others)
95
+
96
+ if !input.nil? && hash[0] && hash[0][:chomp]
97
+ separator = others.find do |other|
98
+ other.respond_to?(:to_str)
99
+ end || $INPUT_RECORD_SEPARATOR
100
+
101
+ input.chomp!(separator)
102
+ end
103
+
104
+ input
105
+ end
106
+
107
+ def lines(*args)
108
+ hash, others = args.partition { |arg| arg.is_a?(::Hash) }
109
+ chomps = hash[0] && hash[0][:chomp]
110
+
111
+ unless block_given?
112
+ return super(*others) unless chomps
113
+
114
+ separator = others.find do |other|
115
+ other.respond_to?(:to_str)
116
+ end || $INPUT_RECORD_SEPARATOR
117
+ return ::Enumerator.new do |yielder|
118
+ super(*others) do |line|
119
+ yielder.yield(line.chomp(separator))
120
+ end
121
+ end
122
+ end
123
+
124
+ block =
125
+ if chomps
126
+ separator = others.find do |other|
127
+ other.respond_to?(:to_str)
128
+ end || $INPUT_RECORD_SEPARATOR
129
+
130
+ proc do |line|
131
+ yield(line.chomp(separator))
132
+ end
133
+ else
134
+ ::Proc.new
135
+ end
136
+
137
+ super(*others, &block)
138
+ end
139
+
140
+ def readline(*args)
141
+ hash, others = args.partition { |arg| arg.is_a?(::Hash) }
142
+
143
+ input = super(*others)
144
+
145
+ if hash[0] && hash[0][:chomp]
146
+ separator = others.find do |other|
147
+ other.respond_to?(:to_str)
148
+ end || $INPUT_RECORD_SEPARATOR
149
+
150
+ input.chomp!(separator)
151
+ end
152
+
153
+ input
154
+ end
155
+
156
+ def readlines(*args)
157
+ hash, others = args.partition { |arg| arg.is_a?(::Hash) }
158
+
159
+ inputs = super(*others)
160
+
161
+ if hash[0] && hash[0][:chomp]
162
+ separator = others.find do |other|
163
+ other.respond_to?(:to_str)
164
+ end || $INPUT_RECORD_SEPARATOR
165
+
166
+ inputs.each { |input| input.chomp!(separator) }
167
+ end
168
+
169
+ inputs
170
+ end
9
171
  end
10
172
  end
11
173
  end
@@ -1,9 +1,17 @@
1
- require_relative 'match_data/instance'
2
-
3
1
  module Polyfill
4
2
  module V2_4
5
3
  module MatchData
6
- include Instance
4
+ def named_captures
5
+ names.each_with_object({}) do |name, acc|
6
+ acc[name] = self[name]
7
+ end
8
+ end
9
+
10
+ def values_at(*indexes)
11
+ indexes.each_with_object([]) do |index, acc|
12
+ acc.push(self[index])
13
+ end
14
+ end
7
15
  end
8
16
  end
9
17
  end
@@ -1,9 +1,21 @@
1
- require_relative 'numeric/instance'
2
-
3
1
  module Polyfill
4
2
  module V2_4
5
3
  module Numeric
6
- include Instance
4
+ def clone(freeze: true) # rubocop:disable Lint/UnusedMethodArgument
5
+ self
6
+ end
7
+
8
+ def dup
9
+ self
10
+ end
11
+
12
+ def finite?
13
+ true
14
+ end
15
+
16
+ def infinite?
17
+ nil
18
+ end
7
19
  end
8
20
  end
9
21
  end
@@ -1,9 +1,15 @@
1
- require_relative 'object/instance'
2
-
3
1
  module Polyfill
4
2
  module V2_4
5
3
  module Object
6
- include Instance
4
+ def clone(freeze: true)
5
+ return super() if freeze
6
+
7
+ cloned = dup
8
+ (singleton_class.ancestors - self.class.ancestors).drop(1).each do |ancestor|
9
+ cloned.extend(ancestor)
10
+ end
11
+ cloned
12
+ end
7
13
  end
8
14
  end
9
15
  end
@@ -1,9 +1,13 @@
1
- require_relative 'pathname/instance'
2
-
3
1
  module Polyfill
4
2
  module V2_4
5
3
  module Pathname
6
- include Instance
4
+ def empty?
5
+ if directory?
6
+ children.empty?
7
+ else
8
+ zero?
9
+ end
10
+ end
7
11
  end
8
12
  end
9
13
  end