more_core_extensions 3.0.0 → 3.1.0

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
  SHA1:
3
- metadata.gz: c8d64c7762ab50f5ccf50df6ab0617196c5033ff
4
- data.tar.gz: 6eddc491ea72be38afd73e62e1f81440c52622fb
3
+ metadata.gz: de0bf2437f3829de0a5f82ebd288a6cac59f0a71
4
+ data.tar.gz: 386ac9e9871d381269e507143b72df08619bfd75
5
5
  SHA512:
6
- metadata.gz: e31fdff37332985b3849f2047b5826988060bfcf53ee2fd34c934e3b2b0f3174a8a99321719eb2af6376b14dddd730d887352cbe5d20a4dbdbab80784a26c5eb
7
- data.tar.gz: 4b54bf02dc41e38429d4b819981444e1a868708214dff14c14b9f0583b0aac533b90b26f6a46b35f92f75a2cd39e1c75ee9ca6d89fe6e57eda6590d740cbd783
6
+ metadata.gz: a132740693a2bd42601ef83c2cedb3680a742e7ad87a44c0643953d1f0f10a77c51118609532c184e21e5766404acdc90fcb0222e7b2a123d846c5d69dbec777
7
+ data.tar.gz: e7c599a6db36661dc88a85666aaac6ac6355441c059e9a54e04b6834f68359a4a970a104e9ba7321b037084527c49fa440db207096caccd303199aecdcd49c1f
data/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # MoreCoreExtensions
2
2
 
3
+ [![Join the chat at https://gitter.im/ManageIQ/more_core_extensions](https://badges.gitter.im/ManageIQ/more_core_extensions.svg)](https://gitter.im/ManageIQ/more_core_extensions?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
4
+
3
5
  MoreCoreExtensions are a set of core extensions beyond those provided by ActiveSupport.
4
6
 
5
7
  [![Gem Version](https://badge.fury.io/rb/more_core_extensions.svg)](http://badge.fury.io/rb/more_core_extensions)
@@ -14,8 +16,9 @@ MoreCoreExtensions are a set of core extensions beyond those provided by ActiveS
14
16
  * delete_nils
15
17
  * delete_blanks
16
18
  * delete_blank_paths
17
- * duplicates
18
19
  * delete_path
20
+ * deviation
21
+ * duplicates
19
22
  * include_any?
20
23
  * include_none?
21
24
  * include_all?
@@ -25,13 +28,16 @@ MoreCoreExtensions are a set of core extensions beyond those provided by ActiveS
25
28
  * include_path?
26
29
  * key_path?
27
30
  * member_path?
31
+ * mean
28
32
  * random_index
29
33
  * random_element
34
+ * squares
30
35
  * store_path
31
36
  * stretch
32
37
  * stretch!
33
38
  * zip_stretched
34
39
  * tableize
40
+ * variance
35
41
  * Hash
36
42
  * delete_nils
37
43
  * delete_blanks
@@ -44,6 +50,10 @@ MoreCoreExtensions are a set of core extensions beyond those provided by ActiveS
44
50
  * key_path?
45
51
  * member_path?
46
52
  * store_path
53
+ * Numeric
54
+ * square
55
+ * round_down
56
+ * round_up
47
57
  * String
48
58
  * email?
49
59
  * domain_name?
@@ -3,5 +3,6 @@ require 'more_core_extensions/version'
3
3
  require 'more_core_extensions/core_ext/array'
4
4
  require 'more_core_extensions/core_ext/hash'
5
5
  require 'more_core_extensions/core_ext/module'
6
+ require 'more_core_extensions/core_ext/numeric'
6
7
  require 'more_core_extensions/core_ext/object'
7
8
  require 'more_core_extensions/core_ext/string'
@@ -1,4 +1,4 @@
1
- require 'more_core_extensions/core_ext/object/blank'
1
+ require 'active_support/core_ext/object/blank'
2
2
 
3
3
  module MoreCoreExtensions
4
4
  module ArrayDeletes
@@ -0,0 +1,35 @@
1
+ require 'active_support/core_ext/enumerable' # For Array#sum
2
+
3
+ module MoreCoreExtensions
4
+ module ArrayMath
5
+ #
6
+ # Returns the mean of an Array of Numerics.
7
+ #
8
+ # [1, 2, 3, 4, 5].mean #=> 3.0
9
+ # [1.0, 2.0, 3.0].mean #=> 2.0
10
+ def mean
11
+ sum.to_f / length
12
+ end
13
+
14
+ #
15
+ # Returns the standard deviation of an Array of Numerics.
16
+ #
17
+ # [1, 2, 3, 4, 5].stddev #=> 1.5811388300841898
18
+ # [1.0, 2.0, 3.0].stddev #=> 1.0
19
+ def stddev
20
+ Math.sqrt(variance)
21
+ end
22
+
23
+ #
24
+ # Returns the variance of an Array of Numerics.
25
+ #
26
+ # [1, 2, 3, 4, 5].variance #=> 2.5
27
+ # [1.0, 2.0, 3.0].variance #=> 1.0
28
+ def variance
29
+ μ = mean
30
+ reduce(0) { |m, i| m + (i - μ).square } / (length - 1)
31
+ end
32
+ end
33
+ end
34
+
35
+ Array.send(:include, MoreCoreExtensions::ArrayMath)
@@ -2,6 +2,7 @@ require 'more_core_extensions/core_ext/array/deletes'
2
2
  require 'more_core_extensions/core_ext/array/duplicates'
3
3
  require 'more_core_extensions/core_ext/array/element_counts'
4
4
  require 'more_core_extensions/core_ext/array/inclusions'
5
+ require 'more_core_extensions/core_ext/array/math'
5
6
  require 'more_core_extensions/core_ext/array/nested'
6
7
  require 'more_core_extensions/core_ext/array/random'
7
8
  require 'more_core_extensions/core_ext/array/stretch'
@@ -1,4 +1,4 @@
1
- require 'more_core_extensions/core_ext/object/blank'
1
+ require 'active_support/core_ext/object/blank'
2
2
 
3
3
  module MoreCoreExtensions
4
4
  module HashDeletes
@@ -0,0 +1,14 @@
1
+ module MoreCoreExtensions
2
+ module NumericMath
3
+ #
4
+ # Returns the square of a Numeric.
5
+ #
6
+ # 2.square #=> 4
7
+ # 10.0.square #=> 100.0
8
+ def square
9
+ self * self
10
+ end
11
+ end
12
+ end
13
+
14
+ Numeric.send(:prepend, MoreCoreExtensions::NumericMath)
@@ -0,0 +1,17 @@
1
+ module MoreCoreExtensions
2
+ module NumericRounding
3
+ def round_up(nearest = 1)
4
+ return self if nearest == 0
5
+ return self if (self % nearest) == 0
6
+ self + nearest - (self % nearest)
7
+ end
8
+
9
+ def round_down(nearest = 1)
10
+ return self if nearest == 0
11
+ return self if (self % nearest) == 0
12
+ self - (self % nearest)
13
+ end
14
+ end
15
+ end
16
+
17
+ Numeric.send(:prepend, MoreCoreExtensions::NumericRounding)
@@ -0,0 +1,2 @@
1
+ require 'more_core_extensions/core_ext/numeric/math'
2
+ require 'more_core_extensions/core_ext/numeric/rounding'
@@ -1,2 +1,2 @@
1
- require 'more_core_extensions/core_ext/object/blank'
1
+ require 'active_support/core_ext/object/blank'
2
2
  require 'more_core_extensions/core_ext/object/namespace'
@@ -1,3 +1,3 @@
1
1
  module MoreCoreExtensions
2
- VERSION = "3.0.0"
2
+ VERSION = "3.1.0"
3
3
  end
@@ -0,0 +1,16 @@
1
+ describe Array do
2
+ let(:floats) { [1.1, 2.2, 3.3, 4.4, 5.5] }
3
+ let(:integers) { [1, 2, 3, 4, 5] }
4
+
5
+ context "with floats" do
6
+ it("#stddev") { expect(floats.stddev).to be_within(0.00001).of(1.73925) }
7
+ it("#mean") { expect(floats.mean).to be_within(0.00001).of(3.30000) }
8
+ it("#variance") { expect(floats.variance).to be_within(0.00001).of(3.02500) }
9
+ end
10
+
11
+ context "with integers" do
12
+ it("#stddev") { expect(integers.stddev).to be_within(0.00001).of(1.58113) }
13
+ it("#mean") { expect(integers.mean).to be_within(0.00001).of(3.00000) }
14
+ it("#variance") { expect(integers.variance).to be_within(0.00001).of(2.50000) }
15
+ end
16
+ end
@@ -0,0 +1,6 @@
1
+ describe Numeric do
2
+ context "#square" do
3
+ it("Fixnum") { expect(10.square).to eq(100) }
4
+ it("Float") { expect(10.2.square).to eq(104.03999999999999) }
5
+ end
6
+ end
@@ -0,0 +1,19 @@
1
+ describe Numeric do
2
+ context "#round_up" do
3
+ it("Fixnum") { expect(1.round_up).to eq(1) }
4
+ it("Float") { expect(1.1.round_up).to eq(2.0) }
5
+ context "with a 'nearest' param" do
6
+ it("Fixnum") { expect(1.round_up(10)).to eq(10) }
7
+ it("Float") { expect(1.1.round_up(0.5)).to eq(1.5) }
8
+ end
9
+ end
10
+
11
+ context "#round_down" do
12
+ it("Fixnum") { expect(1.round_down).to eq(1) }
13
+ it("Float") { expect(1.1.round_down).to eq(1.0) }
14
+ context "with a 'nearest' param" do
15
+ it("Fixnum") { expect(11.round_down(10)).to eq(10) }
16
+ it("Float") { expect(1.6.round_down(0.5)).to eq(1.5) }
17
+ end
18
+ end
19
+ end
metadata CHANGED
@@ -1,14 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: more_core_extensions
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.0
4
+ version: 3.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jason Frey
8
+ - Brandon Dunne
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2016-07-07 00:00:00.000000000 Z
12
+ date: 2016-08-11 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: bundler
@@ -73,7 +74,7 @@ dependencies:
73
74
  - - ">="
74
75
  - !ruby/object:Gem::Version
75
76
  version: '0'
76
- type: :development
77
+ type: :runtime
77
78
  prerelease: false
78
79
  version_requirements: !ruby/object:Gem::Requirement
79
80
  requirements:
@@ -84,6 +85,7 @@ description: MoreCoreExtensions are a set of core extensions beyond those provid
84
85
  by ActiveSupport.
85
86
  email:
86
87
  - fryguy9@gmail.com
88
+ - bdunne@redhat.com
87
89
  executables: []
88
90
  extensions: []
89
91
  extra_rdoc_files: []
@@ -98,6 +100,7 @@ files:
98
100
  - lib/more_core_extensions/core_ext/array/duplicates.rb
99
101
  - lib/more_core_extensions/core_ext/array/element_counts.rb
100
102
  - lib/more_core_extensions/core_ext/array/inclusions.rb
103
+ - lib/more_core_extensions/core_ext/array/math.rb
101
104
  - lib/more_core_extensions/core_ext/array/nested.rb
102
105
  - lib/more_core_extensions/core_ext/array/random.rb
103
106
  - lib/more_core_extensions/core_ext/array/stretch.rb
@@ -107,8 +110,10 @@ files:
107
110
  - lib/more_core_extensions/core_ext/hash/nested.rb
108
111
  - lib/more_core_extensions/core_ext/module.rb
109
112
  - lib/more_core_extensions/core_ext/module/namespace.rb
113
+ - lib/more_core_extensions/core_ext/numeric.rb
114
+ - lib/more_core_extensions/core_ext/numeric/math.rb
115
+ - lib/more_core_extensions/core_ext/numeric/rounding.rb
110
116
  - lib/more_core_extensions/core_ext/object.rb
111
- - lib/more_core_extensions/core_ext/object/blank.rb
112
117
  - lib/more_core_extensions/core_ext/object/namespace.rb
113
118
  - lib/more_core_extensions/core_ext/shared/nested.rb
114
119
  - lib/more_core_extensions/core_ext/string.rb
@@ -119,13 +124,15 @@ files:
119
124
  - spec/core_ext/array/duplicates_spec.rb
120
125
  - spec/core_ext/array/element_counts_spec.rb
121
126
  - spec/core_ext/array/inclusions_spec.rb
127
+ - spec/core_ext/array/math_spec.rb
122
128
  - spec/core_ext/array/nested_spec.rb
123
129
  - spec/core_ext/array/random_spec.rb
124
130
  - spec/core_ext/array/stretch_spec.rb
125
131
  - spec/core_ext/array/tableize_spec.rb
126
132
  - spec/core_ext/hash/deletes_spec.rb
127
133
  - spec/core_ext/hash/nested_spec.rb
128
- - spec/core_ext/object/blank_spec.rb
134
+ - spec/core_ext/numeric/math_spec.rb
135
+ - spec/core_ext/numeric/rounding_spec.rb
129
136
  - spec/core_ext/object/namespace_spec.rb
130
137
  - spec/core_ext/string/formats_spec.rb
131
138
  - spec/core_ext/string/hex_dump_spec.rb
@@ -150,7 +157,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
150
157
  version: '0'
151
158
  requirements: []
152
159
  rubyforge_project:
153
- rubygems_version: 2.6.3
160
+ rubygems_version: 2.5.1
154
161
  signing_key:
155
162
  specification_version: 4
156
163
  summary: MoreCoreExtensions are a set of core extensions beyond those provided by
@@ -160,13 +167,15 @@ test_files:
160
167
  - spec/core_ext/array/duplicates_spec.rb
161
168
  - spec/core_ext/array/element_counts_spec.rb
162
169
  - spec/core_ext/array/inclusions_spec.rb
170
+ - spec/core_ext/array/math_spec.rb
163
171
  - spec/core_ext/array/nested_spec.rb
164
172
  - spec/core_ext/array/random_spec.rb
165
173
  - spec/core_ext/array/stretch_spec.rb
166
174
  - spec/core_ext/array/tableize_spec.rb
167
175
  - spec/core_ext/hash/deletes_spec.rb
168
176
  - spec/core_ext/hash/nested_spec.rb
169
- - spec/core_ext/object/blank_spec.rb
177
+ - spec/core_ext/numeric/math_spec.rb
178
+ - spec/core_ext/numeric/rounding_spec.rb
170
179
  - spec/core_ext/object/namespace_spec.rb
171
180
  - spec/core_ext/string/formats_spec.rb
172
181
  - spec/core_ext/string/hex_dump_spec.rb
@@ -1,149 +0,0 @@
1
- # Copied from https://github.com/rails/rails/blob/v5.0.0/activesupport/lib/active_support/core_ext/object/blank.rb
2
- # With the release of ActiveSupport v5.0.0 a minimum required_ruby_version of '>= 2.2.2' was added.
3
- # This code has been copied here so that we can continue to support ruby versions that don't meet that requirement.
4
-
5
- unless Object.respond_to?(:blank?)
6
- class Object
7
- # An object is blank if it's false, empty, or a whitespace string.
8
- # For example, +false+, '', ' ', +nil+, [], and {} are all blank.
9
- #
10
- # This simplifies
11
- #
12
- # !address || address.empty?
13
- #
14
- # to
15
- #
16
- # address.blank?
17
- #
18
- # @return [true, false]
19
- def blank?
20
- respond_to?(:empty?) ? !!empty? : !self
21
- end
22
-
23
- # An object is present if it's not blank.
24
- #
25
- # @return [true, false]
26
- def present?
27
- !blank?
28
- end
29
-
30
- # Returns the receiver if it's present otherwise returns +nil+.
31
- # <tt>object.presence</tt> is equivalent to
32
- #
33
- # object.present? ? object : nil
34
- #
35
- # For example, something like
36
- #
37
- # state = params[:state] if params[:state].present?
38
- # country = params[:country] if params[:country].present?
39
- # region = state || country || 'US'
40
- #
41
- # becomes
42
- #
43
- # region = params[:state].presence || params[:country].presence || 'US'
44
- #
45
- # @return [Object]
46
- def presence
47
- self if present?
48
- end
49
- end
50
-
51
- class NilClass
52
- # +nil+ is blank:
53
- #
54
- # nil.blank? # => true
55
- #
56
- # @return [true]
57
- def blank?
58
- true
59
- end
60
- end
61
-
62
- class FalseClass
63
- # +false+ is blank:
64
- #
65
- # false.blank? # => true
66
- #
67
- # @return [true]
68
- def blank?
69
- true
70
- end
71
- end
72
-
73
- class TrueClass
74
- # +true+ is not blank:
75
- #
76
- # true.blank? # => false
77
- #
78
- # @return [false]
79
- def blank?
80
- false
81
- end
82
- end
83
-
84
- class Array
85
- # An array is blank if it's empty:
86
- #
87
- # [].blank? # => true
88
- # [1,2,3].blank? # => false
89
- #
90
- # @return [true, false]
91
- alias_method :blank?, :empty?
92
- end
93
-
94
- class Hash
95
- # A hash is blank if it's empty:
96
- #
97
- # {}.blank? # => true
98
- # { key: 'value' }.blank? # => false
99
- #
100
- # @return [true, false]
101
- alias_method :blank?, :empty?
102
- end
103
-
104
- class String
105
- BLANK_RE = /\A[[:space:]]*\z/
106
-
107
- # A string is blank if it's empty or contains whitespaces only:
108
- #
109
- # ''.blank? # => true
110
- # ' '.blank? # => true
111
- # "\t\n\r".blank? # => true
112
- # ' blah '.blank? # => false
113
- #
114
- # Unicode whitespace is supported:
115
- #
116
- # "\u00a0".blank? # => true
117
- #
118
- # @return [true, false]
119
- def blank?
120
- # The regexp that matches blank strings is expensive. For the case of empty
121
- # strings we can speed up this method (~3.5x) with an empty? call. The
122
- # penalty for the rest of strings is marginal.
123
- empty? || BLANK_RE === self
124
- end
125
- end
126
-
127
- class Numeric #:nodoc:
128
- # No number is blank:
129
- #
130
- # 1.blank? # => false
131
- # 0.blank? # => false
132
- #
133
- # @return [false]
134
- def blank?
135
- false
136
- end
137
- end
138
-
139
- class Time #:nodoc:
140
- # No Time is blank:
141
- #
142
- # Time.now.blank? # => false
143
- #
144
- # @return [false]
145
- def blank?
146
- false
147
- end
148
- end
149
- end
@@ -1,46 +0,0 @@
1
- describe "blank" do
2
- class EmptyTrue
3
- def empty?
4
- 0
5
- end
6
- end
7
-
8
- class EmptyFalse
9
- def empty?
10
- nil
11
- end
12
- end
13
-
14
- BLANK = [EmptyTrue.new, nil, false, '', ' ', " \n\t \r ", ' ', "\u00a0", [], {}].freeze
15
- PRESENT = [EmptyFalse.new, Object.new, true, 0, 1, 'a', [nil], {nil => 0}].freeze
16
-
17
- describe "#blank?" do
18
- context "true" do
19
- BLANK.each { |v| it(v.inspect) { expect(v).to be_blank } }
20
- end
21
-
22
- context "false" do
23
- PRESENT.each { |v| it(v.inspect) { expect(v).to_not be_blank } }
24
- end
25
- end
26
-
27
- describe "#present?" do
28
- context "true" do
29
- PRESENT.each { |v| it(v.inspect) { expect(v).to be_present } }
30
- end
31
-
32
- context "false" do
33
- BLANK.each { |v| it(v.inspect) { expect(v).to_not be_present } }
34
- end
35
- end
36
-
37
- describe "#presence" do
38
- context "object" do
39
- PRESENT.each { |v| it(v.inspect) { expect(v.presence).to eq(v) } }
40
- end
41
-
42
- context "nil" do
43
- BLANK.each { |v| it(v.inspect) { expect(v.presence).to be_nil } }
44
- end
45
- end
46
- end