rearmed 1.3.0 → 1.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/README.md +30 -13
- data/lib/rearmed/default_enabled_patches.hash +3 -1
- data/lib/rearmed/methods.rb +30 -18
- data/lib/rearmed/monkey_patches/date.rb +7 -3
- data/lib/rearmed/monkey_patches/enumerable.rb +10 -0
- data/lib/rearmed/monkey_patches/string.rb +12 -6
- data/lib/rearmed/version.rb +1 -1
- data/test/tc_rearmed.rb +42 -25
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8cd8b9873096a342bb640e7bab688970350bf050
|
4
|
+
data.tar.gz: 84ac122091acba8d89b1c4f1b99bf2e9ff3896e2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 704335a6f2403d194b54bfbca86c6660d49f3c6a5eab6eb2031d813032e9c7d62ea7b03f35d11dd6a11adf251a6b15c706e39046e2fb298f093d2904e313ddd7
|
7
|
+
data.tar.gz: d8d2552250bacd242eac8e83d492d6cde941a0177d4cbbc8888fececb7ffe568b7f336fa553bcc18746214dc02836744f3542aa34c998ba4694f8ea820e170fd
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,10 @@
|
|
1
1
|
CHANGELOG
|
2
2
|
---------
|
3
3
|
|
4
|
+
- **1.3.1 - Sept 2, 2017**
|
5
|
+
- Add `Enumerable#select_map`
|
6
|
+
- Add `String#casecmp?` for Ruby 2.3.x and below
|
7
|
+
- Fix ruby 1.9.3 lambda syntax cannot contain space between stab and parenthesis
|
4
8
|
- **1.3.0 - Feb 28, 2017**
|
5
9
|
- Remove Rails and Minitest methods. Those methods moved to https://github.com/westonganger/rearmed_rails
|
6
10
|
- Change methods names of Rearmed namespaced hash methods to convey better meaning
|
data/README.md
CHANGED
@@ -1,17 +1,18 @@
|
|
1
|
-
# Rearmed Ruby
|
2
|
-
<a href='https://ko-fi.com/A5071NK' target='_blank'><img height='32' style='border:0px;height:32px;' src='https://az743702.vo.msecnd.net/cdn/kofi1.png?v=a' border='0' alt='Buy Me a Coffee' /></a>
|
1
|
+
# Rearmed Ruby <a href='https://travis-ci.org/westonganger/rearmed-rb' target='_blank'><img src='https://api.travis-ci.org/westonganger/rearmed-rb.svg?branch=master' border='0' alt='Build Status' /></a>
|
3
2
|
|
4
|
-
|
3
|
+
<a href='https://ko-fi.com/A5071NK' target='_blank'><img height='32' style='border:0px;height:32px;' src='https://az743702.vo.msecnd.net/cdn/kofi1.png?v=a' border='0' alt='Buy Me a Coffee' /></a>
|
5
4
|
|
6
|
-
|
5
|
+
A collection of helpful methods and monkey patches for Arrays, Hash, Enumerables, Strings, Objects & Dates in Ruby. [Rearmed is a collection of plugins](https://github.com/westonganger?utf8=%E2%9C%93&tab=repositories&q=rearmed) which are driven by making life easier & coding more natural.
|
7
6
|
|
8
7
|
The difference between this library and others is that all monkey patching is performed in an opt-in way because you shouldnt be using methods you dont know about anyways.
|
9
8
|
|
10
9
|
When possible I have placed the method implementations inside the Rearmed module so if you don't like monkey patching or are working on the project with a team then you can use these methods instead. You can then skip the config and see how to use each implementation below the relevant methods documentation.
|
11
10
|
|
12
|
-
```ruby
|
13
|
-
# Gemfile
|
14
11
|
|
12
|
+
# Install
|
13
|
+
|
14
|
+
Add the following line to your gemfile:
|
15
|
+
```ruby
|
15
16
|
gem 'rearmed'
|
16
17
|
```
|
17
18
|
|
@@ -33,7 +34,8 @@ Rearmed.enabled_patches = {
|
|
33
34
|
},
|
34
35
|
enumerable: {
|
35
36
|
natural_sort: false,
|
36
|
-
natural_sort_by: false
|
37
|
+
natural_sort_by: false,
|
38
|
+
select_map: false
|
37
39
|
},
|
38
40
|
hash: {
|
39
41
|
compact: false,
|
@@ -48,6 +50,7 @@ Rearmed.enabled_patches = {
|
|
48
50
|
},
|
49
51
|
string: {
|
50
52
|
begins_with: false,
|
53
|
+
casecmp?: false
|
51
54
|
ends_with: false,
|
52
55
|
starts_with: false,
|
53
56
|
to_bool: false,
|
@@ -72,7 +75,7 @@ puts array # => [4,1]
|
|
72
75
|
|
73
76
|
array.not_empty? # => true
|
74
77
|
|
75
|
-
# Only
|
78
|
+
# Only monkey patched if using Ruby 2.2.x or below as this method was added to Ruby core in 2.3.0
|
76
79
|
items = [{foo: ['foo','bar']}, {test: 'thing'}]
|
77
80
|
items.dig(0, :foo, 1) # => 'bar'
|
78
81
|
# or without monkey patch: Rearmed.dig(items, 0, :foo, 1)
|
@@ -88,6 +91,10 @@ items.natural_sort(reverse: true) # because natural_sort does not accept a block
|
|
88
91
|
items = [{version: "1.1"}, {version: "1.11"}, {version: "1.2"}]
|
89
92
|
items.natural_sort_by{|x| x[:version]}
|
90
93
|
# or without monkey patch: Rearmed.natural_sort_by(items){|x| x[:version]}
|
94
|
+
|
95
|
+
items = [{version: "1.1"}, {version: nil}, {version: false}]
|
96
|
+
items.select_map{|x| x[:version]} #=> [{version: "1.1"}]
|
97
|
+
# or without monkey patch: Rearmed.select_map(items){|x| x[:version]}
|
91
98
|
```
|
92
99
|
|
93
100
|
## Date
|
@@ -108,12 +115,12 @@ hash.only!(:foo, :bar)
|
|
108
115
|
hash.to_struct
|
109
116
|
# or without monkey patch: Rearmed.hash_to_struct(hash)
|
110
117
|
|
111
|
-
# Only
|
118
|
+
# Only monkey patched if using Ruby 2.2.x or below as this method was added to Ruby core in 2.3.0
|
112
119
|
items = [{foo: ['foo','bar']}, {test: 'thing'}]
|
113
120
|
items.dig(0, :foo, 1) # => 'bar'
|
114
121
|
# or without monkey patch: Rearmed.dig(items, 0, :foo, 1)
|
115
122
|
|
116
|
-
# Only
|
123
|
+
# Only monkey patched if using Ruby 2.3.x or below as this method was added to Ruby core in 2.4.0
|
117
124
|
hash.compact
|
118
125
|
# or without monkey patch: Rearmed.hash_compact(hash)
|
119
126
|
hash.compact!
|
@@ -123,7 +130,7 @@ hash.compact!
|
|
123
130
|
```ruby
|
124
131
|
my_var.not_nil?
|
125
132
|
|
126
|
-
#
|
133
|
+
# Only monkey patched if not using ActiveSupport / Rails as this method is already defined there
|
127
134
|
my_var.in?([1,2,3])
|
128
135
|
my_var.in?(1,2,3) # or with splat arguments
|
129
136
|
```
|
@@ -143,6 +150,11 @@ my_var.in?(1,2,3) # or with splat arguments
|
|
143
150
|
'foo'.starts_with?('fo') # => true
|
144
151
|
'foo'.begins_with?('fo') # => true
|
145
152
|
'bar'.ends_with?('ar') # => true
|
153
|
+
|
154
|
+
# Only monkey patched if using Ruby 2.3.x or below as this method was added to Ruby core in 2.4.0
|
155
|
+
'foo'.casecmp?('FOO') #=> true
|
156
|
+
'foo'.casecmp?('FOOBAR') #=> false
|
157
|
+
# or without monkey patch: Rearmed.casecmp?('foo', 'FOO')
|
146
158
|
```
|
147
159
|
|
148
160
|
# Contributing / Todo
|
@@ -154,6 +166,11 @@ If you want to contribute here are a couple of things you could do:
|
|
154
166
|
|
155
167
|
|
156
168
|
# Credits
|
157
|
-
Created by Weston Ganger - @westonganger
|
169
|
+
Created by Weston Ganger - [@westonganger](https://github.com/westonganger)
|
158
170
|
|
159
|
-
|
171
|
+
For any consulting or contract work please contact me via my company website: [Solid Foundation Web Development](https://solidfoundationwebdev.com)
|
172
|
+
|
173
|
+
## Similar Libraries Created By Me
|
174
|
+
- [Rearmed Rails](https://github.com/westonganger/rearmed_rails)
|
175
|
+
- [Rearmed-JS](https://github.com/westonganger/rearmed-js)
|
176
|
+
- [Rearmed-CSS](https://github.com/westonganger/rearmed-css)
|
@@ -9,7 +9,8 @@
|
|
9
9
|
},
|
10
10
|
enumerable: {
|
11
11
|
natural_sort: false,
|
12
|
-
natural_sort_by: false
|
12
|
+
natural_sort_by: false,
|
13
|
+
select_map: false
|
13
14
|
},
|
14
15
|
hash: {
|
15
16
|
compact: false,
|
@@ -24,6 +25,7 @@
|
|
24
25
|
},
|
25
26
|
string: {
|
26
27
|
begins_with: false,
|
28
|
+
casecmp?: false,
|
27
29
|
ends_with: false,
|
28
30
|
starts_with: false,
|
29
31
|
to_bool: false,
|
data/lib/rearmed/methods.rb
CHANGED
@@ -1,5 +1,11 @@
|
|
1
1
|
module Rearmed
|
2
2
|
|
3
|
+
def self.casecmp?(str1, str2)
|
4
|
+
if str1.is_a?(String) && str2.is_a?(String)
|
5
|
+
str1.casecmp(str2) == 0
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
3
9
|
def self.dig(collection, *values)
|
4
10
|
current_val = nil
|
5
11
|
current_collection = collection
|
@@ -35,11 +41,13 @@ module Rearmed
|
|
35
41
|
return current_val
|
36
42
|
end
|
37
43
|
|
44
|
+
def self.hash_compact(hash)
|
45
|
+
hash.reject{|_, value| value.nil?}
|
46
|
+
end
|
47
|
+
|
38
48
|
def self.hash_join(hash, delimiter=', ', &block)
|
39
49
|
unless block_given?
|
40
|
-
block = ->
|
41
|
-
"#{k}: #{v}"
|
42
|
-
}
|
50
|
+
block = ->(k,v){ "#{k}: #{v}" }
|
43
51
|
end
|
44
52
|
|
45
53
|
str = ""
|
@@ -59,15 +67,24 @@ module Rearmed
|
|
59
67
|
return str
|
60
68
|
end
|
61
69
|
|
62
|
-
def self.
|
63
|
-
|
70
|
+
def self.hash_only(hash, *keys)
|
71
|
+
keys.map!{|key| hash.convert_key(key)} if hash.respond_to?(:convert_key, true)
|
72
|
+
keys.each_with_object(hash.class.new){|k, new_hash| new_hash[k] = hash[k] if hash.has_key?(k)}
|
73
|
+
end
|
74
|
+
|
75
|
+
def self.hash_to_struct(hash)
|
76
|
+
Struct.new(*hash.keys).new(*hash.values)
|
77
|
+
end
|
78
|
+
|
79
|
+
def self.natural_sort_by(collection)
|
80
|
+
collection.sort_by{|x| self.naturalize_str(yield(x))}
|
64
81
|
end
|
65
82
|
|
66
|
-
def self.natural_sort(
|
83
|
+
def self.natural_sort(collection, options={})
|
67
84
|
if block_given?
|
68
85
|
Rearmed::Exceptions::BlockFoundError
|
69
86
|
else
|
70
|
-
|
87
|
+
collection.sort do |a,b|
|
71
88
|
if options[:reverse] == true
|
72
89
|
self.naturalize_str(b.to_s) <=> self.naturalize_str(a.to_s)
|
73
90
|
else
|
@@ -76,14 +93,13 @@ module Rearmed
|
|
76
93
|
end
|
77
94
|
end
|
78
95
|
end
|
79
|
-
|
80
|
-
def self.hash_compact(hash)
|
81
|
-
hash.reject{|_, value| value.nil?}
|
82
|
-
end
|
83
96
|
|
84
|
-
def self.
|
85
|
-
|
86
|
-
|
97
|
+
def self.select_map(collection)
|
98
|
+
if block_given?
|
99
|
+
collection.select{|x| yield(x) }.map{|x| yield(x) }
|
100
|
+
else
|
101
|
+
collection.select.map
|
102
|
+
end
|
87
103
|
end
|
88
104
|
|
89
105
|
def self.to_bool(str)
|
@@ -104,10 +120,6 @@ module Rearmed
|
|
104
120
|
str =~ /(^(\d+)(\.)?(\d+)?$)|(^(\d+)?(\.)(\d+)$)/ ? true : false
|
105
121
|
end
|
106
122
|
|
107
|
-
def self.hash_to_struct(hash)
|
108
|
-
Struct.new(*hash.keys).new(*hash.values)
|
109
|
-
end
|
110
|
-
|
111
123
|
private
|
112
124
|
|
113
125
|
def self.naturalize_str(str)
|
@@ -1,9 +1,13 @@
|
|
1
|
-
|
1
|
+
if Rearmed.enabled_patches[:date] == true || Rearmed.dig(Rearmed.enabled_patches, :date, :now)
|
2
|
+
|
3
|
+
require 'date'
|
4
|
+
|
5
|
+
Date.class_eval do
|
2
6
|
|
3
|
-
Date.class_eval do
|
4
|
-
if date_enabled || Rearmed.dig(Rearmed.enabled_patches, :date, :now)
|
5
7
|
def self.now
|
6
8
|
DateTime.now.to_date
|
7
9
|
end
|
10
|
+
|
8
11
|
end
|
12
|
+
|
9
13
|
end
|
@@ -16,4 +16,14 @@ Enumerable.module_eval do
|
|
16
16
|
end
|
17
17
|
end
|
18
18
|
end
|
19
|
+
|
20
|
+
if enumerable_enabled || Rearmed.dig(Rearmed.enabled_patches, :enumerable, :select_map)
|
21
|
+
def select_map
|
22
|
+
if block_given?
|
23
|
+
Rearmed.select_map(self){|x| yield(x)}
|
24
|
+
else
|
25
|
+
Rearmed.select_map(self)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
19
29
|
end
|
@@ -1,6 +1,18 @@
|
|
1
1
|
string_enabled = Rearmed.enabled_patches[:string] == true
|
2
2
|
|
3
3
|
String.class_eval do
|
4
|
+
if !''.respond_to?(:casecmp?) && (string_enabled || Rearmed.dig(Rearmed.enabled_patches, :string, :casecmp?))
|
5
|
+
def casecmp?(str)
|
6
|
+
Rearmed.casecmp?(self, str)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
if string_enabled || Rearmed.dig(Rearmed.enabled_patches, :string, :to_bool)
|
11
|
+
def to_bool
|
12
|
+
Rearmed.to_bool(self)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
4
16
|
if string_enabled || Rearmed.dig(Rearmed.enabled_patches, :string, :valid_integer)
|
5
17
|
def valid_integer?
|
6
18
|
Rearmed.valid_integer?(self)
|
@@ -13,12 +25,6 @@ String.class_eval do
|
|
13
25
|
end
|
14
26
|
end
|
15
27
|
|
16
|
-
if string_enabled || Rearmed.dig(Rearmed.enabled_patches, :string, :to_bool)
|
17
|
-
def to_bool
|
18
|
-
Rearmed.to_bool(self)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
28
|
if string_enabled || Rearmed.dig(Rearmed.enabled_patches, :string, :starts_with)
|
23
29
|
alias_method :starts_with?, :start_with?
|
24
30
|
end
|
data/lib/rearmed/version.rb
CHANGED
data/test/tc_rearmed.rb
CHANGED
@@ -42,6 +42,10 @@ class TestRearmed < MiniTest::Test
|
|
42
42
|
str = '32a'
|
43
43
|
eql(str.valid_integer?, false)
|
44
44
|
|
45
|
+
|
46
|
+
str = '12'
|
47
|
+
eql(Rearmed.valid_integer?(str), true)
|
48
|
+
|
45
49
|
str = '132.2'
|
46
50
|
eql(str.valid_float?, true)
|
47
51
|
|
@@ -51,6 +55,10 @@ class TestRearmed < MiniTest::Test
|
|
51
55
|
str = '12.1a'
|
52
56
|
eql(str.valid_float?, false)
|
53
57
|
|
58
|
+
str = '1.2'
|
59
|
+
eql(Rearmed.valid_float?(str), true)
|
60
|
+
|
61
|
+
|
54
62
|
str = 'true'
|
55
63
|
eql(str.to_bool, true)
|
56
64
|
|
@@ -60,15 +68,29 @@ class TestRearmed < MiniTest::Test
|
|
60
68
|
str = 'not true'
|
61
69
|
assert_nil(str.to_bool)
|
62
70
|
|
63
|
-
|
64
71
|
str = 'true'
|
65
72
|
eql(Rearmed.to_bool(str), true)
|
66
73
|
|
67
|
-
str = '12'
|
68
|
-
eql(Rearmed.valid_integer?(str), true)
|
69
74
|
|
70
|
-
|
71
|
-
|
75
|
+
str1 = 'foo'
|
76
|
+
str2 = 'foo'
|
77
|
+
eql(str1.casecmp?(str2), true)
|
78
|
+
|
79
|
+
str1 = 'foo'
|
80
|
+
str2 = 'FOO'
|
81
|
+
eql(str1.casecmp?(str2), true)
|
82
|
+
|
83
|
+
str1 = 'foo'
|
84
|
+
str2 = 'foobar'
|
85
|
+
eql(str1.casecmp?(str2), false)
|
86
|
+
|
87
|
+
str1 = 'foo'
|
88
|
+
str2 = 'fo'
|
89
|
+
eql(str1.casecmp?(str2), false)
|
90
|
+
|
91
|
+
str1 = 'foo'
|
92
|
+
str2 = 'foo'
|
93
|
+
eql(Rearmed.casecmp?(str1, str2), true)
|
72
94
|
end
|
73
95
|
|
74
96
|
def test_date
|
@@ -77,36 +99,21 @@ class TestRearmed < MiniTest::Test
|
|
77
99
|
|
78
100
|
def test_enumerable
|
79
101
|
items = ['1.1', '1.11', '1.2']
|
80
|
-
|
81
102
|
eql(items.natural_sort, ['1.1','1.2','1.11'])
|
82
|
-
|
83
103
|
eql(items.natural_sort(reverse: true), ['1.11','1.2','1.1'])
|
84
|
-
|
85
104
|
eql(Rearmed.natural_sort(items), ['1.1','1.2','1.11'])
|
86
|
-
|
87
105
|
eql(Rearmed.natural_sort(items, reverse: true), ['1.11','1.2','1.1'])
|
88
106
|
|
89
|
-
|
90
107
|
items = [{version: "1.1"}, {version: "1.11"}, {version: "1.2"}]
|
91
|
-
|
92
108
|
eql(items.natural_sort_by{|x| x[:version]}, [{version: "1.1"}, {version: "1.2"}, {version: "1.11"}])
|
93
|
-
|
94
109
|
eql(Rearmed.natural_sort_by(items){|x| x[:version]}, [{version: "1.1"}, {version: "1.2"}, {version: "1.11"}])
|
95
110
|
|
111
|
+
items = [0, 1, 2, 3, nil, false]
|
112
|
+
eql(items.select_map{|x| x}, [0,1,2,3])
|
113
|
+
eql(Rearmed.select_map(items){|x| x}, [0,1,2,3])
|
96
114
|
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
eql(array.dig(0, :foo, 1), 'bar')
|
101
|
-
assert_nil(array.dig(0, :foo, 2))
|
102
|
-
|
103
|
-
eql(Rearmed.dig(array, 1, :test), 'thing')
|
104
|
-
assert_nil(Rearmed.dig(array, 1, :bar))
|
105
|
-
|
106
|
-
hash = {a: {foo: ['bar']}, b: {c: 'c'}}
|
107
|
-
|
108
|
-
eql(hash.dig(:a, :foo, 0), 'bar')
|
109
|
-
eql(Rearmed.dig(hash, :b, :c), 'c')
|
115
|
+
assert items.select_map.is_a?(Enumerator)
|
116
|
+
assert Rearmed.select_map(items).is_a?(Enumerator)
|
110
117
|
end
|
111
118
|
|
112
119
|
def test_array
|
@@ -123,6 +130,12 @@ class TestRearmed < MiniTest::Test
|
|
123
130
|
eql(array, [1,2,1,3,4,1])
|
124
131
|
|
125
132
|
eql(array.not_empty?, true)
|
133
|
+
|
134
|
+
array = [{foo: ['foo','bar']}, {test: 'thing'}]
|
135
|
+
eql(array.dig(0, :foo, 1), 'bar')
|
136
|
+
assert_nil(array.dig(0, :foo, 2))
|
137
|
+
eql(Rearmed.dig(array, 1, :test), 'thing')
|
138
|
+
assert_nil(Rearmed.dig(array, 1, :bar))
|
126
139
|
end
|
127
140
|
|
128
141
|
def test_hash
|
@@ -164,6 +177,10 @@ class TestRearmed < MiniTest::Test
|
|
164
177
|
assert(struct.is_a?(Struct))
|
165
178
|
eql(struct.foo, :bar)
|
166
179
|
eql(struct.bar, 'foo')
|
180
|
+
|
181
|
+
hash = {a: {foo: ['bar']}, b: {c: 'c'}}
|
182
|
+
eql(hash.dig(:a, :foo, 0), 'bar')
|
183
|
+
eql(Rearmed.dig(hash, :b, :c), 'c')
|
167
184
|
end
|
168
185
|
|
169
186
|
def test_object
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rearmed
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.
|
4
|
+
version: 1.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Weston Ganger
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-02
|
11
|
+
date: 2017-09-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|