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 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