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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b68065b7aadc9963519eeb642c21a30fd9d1e9dc36d382d1a3be6f9c38f1b499
4
- data.tar.gz: 7928ae1d052c0848bc9f30c8e2b70f503033d636948303b032c479526c140747
3
+ metadata.gz: d8d52470776addb4edcca50184d26029d46a6a513cbc51125d539816974c2758
4
+ data.tar.gz: a0bbdb4f9f454eef6881cc85babc15523dcab44c1d5516f67aeae0037b69491b
5
5
  SHA512:
6
- metadata.gz: d2cb37b00b2a1b9d8109d2527b6cc84010ff7ae39701419ff10ebbeaf6fd4afbb740a4e1abe3d6643e21943b8a2afa49f290a2fb9092c4add4338d5101d34ac9
7
- data.tar.gz: 7e4521d99ffea1646088357448bf3da5009eed637c8c3e53a2fdb5554fea66bfc28baf4de06851f1efc2b6034bf9304c60b6d09f0bcd37be18da3ec37f18e049
6
+ metadata.gz: f1bc6f58dffd72b60a0746ad568bf9b7a4dbc0c7e0b742f9546ea10b75a54f9a098938726cde53fcfcec1a810b173d20d164ee15c0d570cac2033a785c702ca1
7
+ data.tar.gz: b301d6ed331a268b9ecf6d5e7b8ea0afdfb4b2a6333dc1eb8886e5a496be807bdc43a9c9335e6f514ac32ba3717bc8e8068cc4cf4feecd007ed8a77f21d27677
@@ -1,21 +1,18 @@
1
1
  language: ruby
2
2
  rvm:
3
- - "2.0"
4
- - "2.1.10"
5
- - "2.2.10"
6
- - "2.3.8"
7
- - "2.4.5"
8
- - "2.5.3"
9
- - "2.6.0"
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
@@ -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/v3.7.0...HEAD
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
- # HACK: Rails 5 dropped support for Ruby < 2.2.2
7
- active_support_version = "< 5" if Gem::Version.new(RUBY_VERSION) < Gem::Version.new("2.2.2")
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/, '').slice(0, width)
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
@@ -1,3 +1,3 @@
1
1
  module MoreCoreExtensions
2
- VERSION = "4.1.0".freeze
2
+ VERSION = "4.2.0".freeze
3
3
  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.1.0
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-04-30 00:00:00.000000000 Z
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.1.2
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