more_core_extensions 4.1.0 → 4.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +7 -10
- data/CHANGELOG.md +15 -1
- data/Gemfile +10 -2
- data/README.md +3 -0
- data/lib/more_core_extensions/all.rb +1 -0
- data/lib/more_core_extensions/core_ext/array/deletes.rb +9 -0
- data/lib/more_core_extensions/core_ext/array/tableize.rb +37 -3
- data/lib/more_core_extensions/core_ext/digest.rb +1 -0
- data/lib/more_core_extensions/core_ext/digest/uuid.rb +26 -0
- data/lib/more_core_extensions/core_ext/hash/deletes.rb +10 -0
- data/lib/more_core_extensions/core_ext/shared/nested.rb +15 -0
- data/lib/more_core_extensions/version.rb +1 -1
- data/more_core_extensions.gemspec +0 -1
- metadata +5 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d8d52470776addb4edcca50184d26029d46a6a513cbc51125d539816974c2758
|
4
|
+
data.tar.gz: a0bbdb4f9f454eef6881cc85babc15523dcab44c1d5516f67aeae0037b69491b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f1bc6f58dffd72b60a0746ad568bf9b7a4dbc0c7e0b742f9546ea10b75a54f9a098938726cde53fcfcec1a810b173d20d164ee15c0d570cac2033a785c702ca1
|
7
|
+
data.tar.gz: b301d6ed331a268b9ecf6d5e7b8ea0afdfb4b2a6333dc1eb8886e5a496be807bdc43a9c9335e6f514ac32ba3717bc8e8068cc4cf4feecd007ed8a77f21d27677
|
data/.travis.yml
CHANGED
@@ -1,21 +1,18 @@
|
|
1
1
|
language: ruby
|
2
2
|
rvm:
|
3
|
-
- "2.
|
4
|
-
- "2.
|
5
|
-
- "2.
|
6
|
-
- "2.
|
7
|
-
- "2.
|
8
|
-
- "2.
|
9
|
-
- "2.
|
10
|
-
- "2.7.0"
|
3
|
+
- "2.1"
|
4
|
+
- "2.2"
|
5
|
+
- "2.3"
|
6
|
+
- "2.4"
|
7
|
+
- "2.5.8"
|
8
|
+
- "2.6.6"
|
9
|
+
- "2.7.1"
|
11
10
|
- ruby-head
|
12
11
|
- jruby-head
|
13
|
-
sudo: false
|
14
12
|
cache: bundler
|
15
13
|
after_script: bundle exec codeclimate-test-reporter
|
16
14
|
matrix:
|
17
15
|
allow_failures:
|
18
|
-
- rvm: "2.6.0"
|
19
16
|
- rvm: ruby-head
|
20
17
|
- rvm: jruby-head
|
21
18
|
fast_finish: true
|
data/CHANGELOG.md
CHANGED
@@ -4,6 +4,16 @@ This project adheres to [Semantic Versioning](http://semver.org/).
|
|
4
4
|
|
5
5
|
## [Unreleased]
|
6
6
|
|
7
|
+
## [4.2.0] - 2020-07-20
|
8
|
+
### Added
|
9
|
+
- Add bundler-inject allowing developers to override dependencies [[#89](https://github.com/ManageIQ/more_core_extensions/pull/89)]
|
10
|
+
- Add Array and Hash #deep_clone and #deep_delete [[#91](https://github.com/ManageIQ/more_core_extensions/pull/91)]
|
11
|
+
- Add Digest::UUID.clean to properly format UUID strings [[#81](https://github.com/ManageIQ/more_core_extensions/pull/81)]
|
12
|
+
|
13
|
+
###Changed
|
14
|
+
- Update ArrayTableize to properly set field width for color text [[#87](https://github.com/ManageIQ/more_core_extensions/pull/87)]
|
15
|
+
- Change Array#format_table header output to markdown vs postgres [[#83](https://github.com/ManageIQ/more_core_extensions/pull/83)]
|
16
|
+
|
7
17
|
## [4.1.0] - 2020-04-30
|
8
18
|
### Added
|
9
19
|
- Added Ruby 2.7 support [[#79](https://github.com/ManageIQ/more_core_extensions/pull/79)]
|
@@ -87,7 +97,11 @@ This project adheres to [Semantic Versioning](http://semver.org/).
|
|
87
97
|
- Upgraded to RSpec 3 [[#16](https://github.com/ManageIQ/more_core_extensions/pull/16)]
|
88
98
|
- Added the Change Log!
|
89
99
|
|
90
|
-
[Unreleased]: https://github.com/ManageIQ/more_core_extensions/compare/
|
100
|
+
[Unreleased]: https://github.com/ManageIQ/more_core_extensions/compare/v4.2.0...HEAD
|
101
|
+
[4.2.0]: https://github.com/ManageIQ/more_core_extensions/compare/v4.1.0...v4.2.0
|
102
|
+
[4.1.0]: https://github.com/ManageIQ/more_core_extensions/compare/v4.0.0...v4.1.0
|
103
|
+
[4.0.0]: https://github.com/ManageIQ/more_core_extensions/compare/v3.8.0...v4.0.0
|
104
|
+
[3.8.0]: https://github.com/ManageIQ/more_core_extensions/compare/v3.7.0...v3.8.0
|
91
105
|
[3.7.0]: https://github.com/ManageIQ/more_core_extensions/compare/v3.6.0...v3.7.0
|
92
106
|
[3.6.0]: https://github.com/ManageIQ/more_core_extensions/compare/v3.5.0...v3.6.0
|
93
107
|
[3.5.0]: https://github.com/ManageIQ/more_core_extensions/compare/v3.4.0...v3.5.0
|
data/Gemfile
CHANGED
@@ -1,8 +1,16 @@
|
|
1
1
|
source 'https://rubygems.org'
|
2
2
|
|
3
|
+
plugin 'bundler-inject'
|
4
|
+
require File.join(Bundler::Plugin.index.load_paths("bundler-inject")[0], "bundler-inject") rescue nil
|
5
|
+
|
3
6
|
# Specify your gem's dependencies in more_core_extensions.gemspec
|
4
7
|
gemspec
|
5
8
|
|
6
|
-
#
|
7
|
-
|
9
|
+
# Rails 5 dropped support for Ruby < 2.2.2
|
10
|
+
# Rails 6 dropped support for Ruby < 2.4.4
|
11
|
+
if Gem::Version.new(RUBY_VERSION) < Gem::Version.new("2.2.2")
|
12
|
+
active_support_version = "< 5"
|
13
|
+
elsif Gem::Version.new(RUBY_VERSION) < Gem::Version.new("2.4.4")
|
14
|
+
active_support_version = "< 6"
|
15
|
+
end
|
8
16
|
gem 'activesupport', active_support_version
|
data/README.md
CHANGED
@@ -19,6 +19,7 @@ MoreCoreExtensions are a set of core extensions beyond those provided by ActiveS
|
|
19
19
|
* core_ext/array/deletes.rb
|
20
20
|
* `#delete_blanks` - Deletes all items where the value is blank
|
21
21
|
* `#delete_nils` - Deletes all items where the value is nil
|
22
|
+
* `#deep_delete` - Deletes nested hash key elements
|
22
23
|
* core_ext/array/duplicates.rb
|
23
24
|
* `#duplicates` - Returns an Array of the duplicates found
|
24
25
|
* core_ext/array/element_counts.rb
|
@@ -61,6 +62,7 @@ MoreCoreExtensions are a set of core extensions beyond those provided by ActiveS
|
|
61
62
|
* core_ext/hash/deletes.rb
|
62
63
|
* `#delete_blanks` - Deletes all keys where the value is blank
|
63
64
|
* `#delete_nils` - Deletes all keys where the value is nil
|
65
|
+
* `#deep_delete` - Deletes nested hash key elements
|
64
66
|
* core_ext/hash/nested.rb (see [Shared](#shared))
|
65
67
|
* `#delete_blank_paths` - Deletes all paths where the value is blank
|
66
68
|
* core_ext/hash/sorting.rb (see [Shared](#shared))
|
@@ -129,6 +131,7 @@ MoreCoreExtensions are a set of core extensions beyond those provided by ActiveS
|
|
129
131
|
#### Shared
|
130
132
|
|
131
133
|
* core_ext/shared/nested.rb
|
134
|
+
* `#deep_clone` - Performs a Marshal based deep clone
|
132
135
|
* `#delete_path` - Delete the value at the specified nesting
|
133
136
|
* `#fetch_path` - Fetch the value at the specified nesting
|
134
137
|
* `#find_path` - Detect which nesting holds the specified value
|
@@ -3,6 +3,7 @@ require 'more_core_extensions/version'
|
|
3
3
|
require 'more_core_extensions/core_ext/array'
|
4
4
|
require 'more_core_extensions/core_ext/benchmark'
|
5
5
|
require 'more_core_extensions/core_ext/class'
|
6
|
+
require 'more_core_extensions/core_ext/digest'
|
6
7
|
require 'more_core_extensions/core_ext/hash'
|
7
8
|
require 'more_core_extensions/core_ext/math'
|
8
9
|
require 'more_core_extensions/core_ext/module'
|
@@ -15,6 +15,15 @@ module MoreCoreExtensions
|
|
15
15
|
def delete_blanks
|
16
16
|
delete_if { |i| i.blank? }
|
17
17
|
end
|
18
|
+
|
19
|
+
# Deletes all keys and subkeys that match +key+.
|
20
|
+
#
|
21
|
+
# [{:a => {:b => 2, :c => 3}}].deep_delete(:b) # => [{:a => {:c => 3}}]
|
22
|
+
#
|
23
|
+
def deep_delete(key)
|
24
|
+
each { |i| i.deep_delete(key) if i.respond_to?(:deep_delete) }
|
25
|
+
self
|
26
|
+
end
|
18
27
|
end
|
19
28
|
end
|
20
29
|
|
@@ -53,6 +53,9 @@ module MoreCoreExtensions
|
|
53
53
|
|
54
54
|
private
|
55
55
|
|
56
|
+
ANSI_ESCAPE_SEQUENCE = /\e\[[^m]+m/.freeze
|
57
|
+
ANSI_RESET = "\e[0m".freeze
|
58
|
+
|
56
59
|
def tableize_hashes
|
57
60
|
# Convert the target to an Array of Arrays
|
58
61
|
keys = options[:columns] || columns_from_hash_keys
|
@@ -102,7 +105,7 @@ module MoreCoreExtensions
|
|
102
105
|
end
|
103
106
|
|
104
107
|
def apply_width!(widths, field, field_i)
|
105
|
-
widths[field_i] = [widths[field_i].to_i, field.to_s.length].max
|
108
|
+
widths[field_i] = [widths[field_i].to_i, ansi_strip(field.to_s).length].max
|
106
109
|
widths[field_i] = [options[:max_width], widths[field_i].to_i].min if options[:max_width]
|
107
110
|
end
|
108
111
|
|
@@ -118,13 +121,44 @@ module MoreCoreExtensions
|
|
118
121
|
end
|
119
122
|
|
120
123
|
def format_field(field, width, justification)
|
121
|
-
field = field.to_s.gsub(/\n|\r/, '')
|
124
|
+
field = field.to_s.gsub(/\n|\r/, '')
|
125
|
+
field = ansi_truncate(field, width)
|
122
126
|
"%0#{justification}#{width}s" % field
|
123
127
|
end
|
124
128
|
|
129
|
+
def ansi_escapes?(field)
|
130
|
+
!!field.match(ANSI_ESCAPE_SEQUENCE)
|
131
|
+
end
|
132
|
+
|
133
|
+
def ansi_escapes(field)
|
134
|
+
field.to_enum(:scan, ANSI_ESCAPE_SEQUENCE).map { Regexp.last_match }
|
135
|
+
end
|
136
|
+
|
137
|
+
def ansi_strip(field)
|
138
|
+
field.gsub(ANSI_ESCAPE_SEQUENCE, '')
|
139
|
+
end
|
140
|
+
|
141
|
+
def ansi_truncate(field, width)
|
142
|
+
escapes = ansi_escapes(field)
|
143
|
+
if escapes.none?
|
144
|
+
field.slice(0, width)
|
145
|
+
else
|
146
|
+
escape_widths = 0
|
147
|
+
escapes.each do |e|
|
148
|
+
break if e.offset(0).first - escape_widths >= width
|
149
|
+
|
150
|
+
escape_widths += e[0].size
|
151
|
+
end
|
152
|
+
|
153
|
+
field = field.slice(0, width + escape_widths)
|
154
|
+
field << ANSI_RESET if ansi_escapes?(field) && !field.end_with?(ANSI_RESET)
|
155
|
+
field
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
125
159
|
def format_table(table, widths)
|
126
160
|
if options[:header] && table.size > 1
|
127
|
-
header_separator = widths.collect { |w| "-" * (w + 2) }.join("
|
161
|
+
header_separator = widths.collect { |w| "-" * (w + 2) }.join("|")
|
128
162
|
table.insert(1, header_separator)
|
129
163
|
end
|
130
164
|
table.join("\n") << "\n"
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'more_core_extensions/core_ext/digest/uuid'
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'active_support/core_ext/digest/uuid'
|
2
|
+
|
3
|
+
module Digest
|
4
|
+
module UUID
|
5
|
+
UUID_REGEX_FORMAT = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/.freeze
|
6
|
+
|
7
|
+
# Takes a UUID string of varying formats and cleans it. It will strip invalid characters,
|
8
|
+
# such as leading and trailing brackets as well as whitespace. The result is a lowercased,
|
9
|
+
# canonical UUID string.
|
10
|
+
#
|
11
|
+
# If the +guid+ argument is nil or blank, then nil is returned. If the +guid+ is already
|
12
|
+
# clean, then no additional cleaning occurs, and it is returned as-is.
|
13
|
+
#
|
14
|
+
# @param guid [String] A string that should more or less represent a UUID.
|
15
|
+
# @return [String] A lowercase v4 UUID string stripped of any extraneous characters.
|
16
|
+
#
|
17
|
+
def self.clean(guid)
|
18
|
+
return nil if guid.nil?
|
19
|
+
g = guid.to_s.downcase
|
20
|
+
return nil if g.strip.empty?
|
21
|
+
return g if g.length == 36 && g =~ UUID_REGEX_FORMAT
|
22
|
+
g.delete!('^0-9a-f')
|
23
|
+
g.sub!(/^([0-9a-f]{8})([0-9a-f]{4})([0-9a-f]{4})([0-9a-f]{4})([0-9a-f]{12})$/, '\1-\2-\3-\4-\5')
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -15,6 +15,16 @@ module MoreCoreExtensions
|
|
15
15
|
def delete_blanks
|
16
16
|
delete_if { |k, v| v.blank? }
|
17
17
|
end
|
18
|
+
|
19
|
+
# Deletes all keys and subkeys that match +key+.
|
20
|
+
#
|
21
|
+
# {:a => {:b => 2, :c => 3}}.deep_delete(:b) # => {:a => {:c => 3}}
|
22
|
+
#
|
23
|
+
def deep_delete(key)
|
24
|
+
key = [key] unless key.kind_of?(Array)
|
25
|
+
key.each { |k| delete(k) }
|
26
|
+
each_value { |v| v.deep_delete(key) if v.respond_to?(:deep_delete) }
|
27
|
+
end
|
18
28
|
end
|
19
29
|
end
|
20
30
|
|
@@ -100,6 +100,21 @@ module MoreCoreExtensions
|
|
100
100
|
end
|
101
101
|
[]
|
102
102
|
end
|
103
|
+
|
104
|
+
# Create a deep clone of the object. This is similar to deep_dup
|
105
|
+
# but uses a Marshal based approach instead.
|
106
|
+
#
|
107
|
+
# h1 = {:a => "hello"}
|
108
|
+
# h2 = h1.deep_clone
|
109
|
+
#
|
110
|
+
# h1[:a] << " world"
|
111
|
+
#
|
112
|
+
# h1[:a] # "hello world"
|
113
|
+
# h2[:a] # "hello"
|
114
|
+
#
|
115
|
+
def deep_clone
|
116
|
+
Marshal.load(Marshal.dump(self))
|
117
|
+
end
|
103
118
|
end
|
104
119
|
end
|
105
120
|
end
|
@@ -27,7 +27,6 @@ Gem::Specification.new do |spec|
|
|
27
27
|
spec.add_development_dependency "rake"
|
28
28
|
spec.add_development_dependency "rspec", ">= 3.0"
|
29
29
|
spec.add_development_dependency "simplecov"
|
30
|
-
spec.add_development_dependency "sys-proctable", "~> 1.2.2"
|
31
30
|
spec.add_development_dependency "timecop"
|
32
31
|
|
33
32
|
spec.add_runtime_dependency "activesupport"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: more_core_extensions
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.
|
4
|
+
version: 4.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jason Frey
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date: 2020-
|
12
|
+
date: 2020-07-20 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -81,20 +81,6 @@ dependencies:
|
|
81
81
|
- - ">="
|
82
82
|
- !ruby/object:Gem::Version
|
83
83
|
version: '0'
|
84
|
-
- !ruby/object:Gem::Dependency
|
85
|
-
name: sys-proctable
|
86
|
-
requirement: !ruby/object:Gem::Requirement
|
87
|
-
requirements:
|
88
|
-
- - "~>"
|
89
|
-
- !ruby/object:Gem::Version
|
90
|
-
version: 1.2.2
|
91
|
-
type: :development
|
92
|
-
prerelease: false
|
93
|
-
version_requirements: !ruby/object:Gem::Requirement
|
94
|
-
requirements:
|
95
|
-
- - "~>"
|
96
|
-
- !ruby/object:Gem::Version
|
97
|
-
version: 1.2.2
|
98
84
|
- !ruby/object:Gem::Dependency
|
99
85
|
name: timecop
|
100
86
|
requirement: !ruby/object:Gem::Requirement
|
@@ -176,6 +162,8 @@ files:
|
|
176
162
|
- lib/more_core_extensions/core_ext/benchmark/realtime_store.rb
|
177
163
|
- lib/more_core_extensions/core_ext/class.rb
|
178
164
|
- lib/more_core_extensions/core_ext/class/hierarchy.rb
|
165
|
+
- lib/more_core_extensions/core_ext/digest.rb
|
166
|
+
- lib/more_core_extensions/core_ext/digest/uuid.rb
|
179
167
|
- lib/more_core_extensions/core_ext/hash.rb
|
180
168
|
- lib/more_core_extensions/core_ext/hash/deletes.rb
|
181
169
|
- lib/more_core_extensions/core_ext/hash/nested.rb
|
@@ -224,7 +212,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
224
212
|
- !ruby/object:Gem::Version
|
225
213
|
version: '0'
|
226
214
|
requirements: []
|
227
|
-
rubygems_version: 3.
|
215
|
+
rubygems_version: 3.0.6
|
228
216
|
signing_key:
|
229
217
|
specification_version: 4
|
230
218
|
summary: MoreCoreExtensions are a set of core extensions beyond those provided by
|