more_core_extensions 4.1.0 → 4.2.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/.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
|