declutter 1.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 +7 -0
- data/README.md +133 -0
- data/lib/declutter.rb +132 -0
- metadata +44 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 607c7167c298669ff221cbd00d7d8d984f1a1c936e2fbf2e5ae74cd4903cdfef
|
4
|
+
data.tar.gz: 654e400b781e186c44477c88f547c06935d4f733c41685524c6896d5b7e953b3
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: b32c7fda4d2420cf4bc7a0cc99b8016d70638ef3773e4297e0419b9773a4974ac00552a729726cadb120ebc09f0ca7f3b1917c02084bb0555d33bf661b18cfe1
|
7
|
+
data.tar.gz: 96acb8ef11156a427bc1447099acfa2273b302e0f020321ee6c35dd1b4ff8f5b2693b7d0b869f70741494594deb0dffed41f439fde32743bff14e615daf97253
|
data/README.md
ADDED
@@ -0,0 +1,133 @@
|
|
1
|
+
# declutter
|
2
|
+
Declutters your Ruby hashes and arrays by removing empty arrays and hashes.
|
3
|
+
Also has options for removing nils, redundancies and falses.
|
4
|
+
|
5
|
+
In this simple example, we create a hash structure that contains an empty array:
|
6
|
+
|
7
|
+
```ruby
|
8
|
+
#!/usr/bin/ruby -w
|
9
|
+
require 'declutter'
|
10
|
+
|
11
|
+
myhash = { 'title' => 'Titus Andronicus', 'episodes' => [] }
|
12
|
+
puts myhash # => {"title"=>"Titus Andronicus", "episodes"=>[]}
|
13
|
+
Declutter.process myhash
|
14
|
+
puts myhash # => {"title"=>"Titus Andronicus"}
|
15
|
+
```
|
16
|
+
|
17
|
+
By running the hash through `Declutter.process`, we remove the empty array. If
|
18
|
+
an array contains only an empty array, then the whole array structure is
|
19
|
+
removed:
|
20
|
+
|
21
|
+
```ruby
|
22
|
+
myhash = { 'title' => 'Titus Andronicus', 'episodes' => ['scenes'=>[]] };
|
23
|
+
puts myhash # => {"title"=>"Titus Andronicus", "episodes"=>[{"scenes"=>[]}]}
|
24
|
+
Declutter.process myhash
|
25
|
+
puts myhash # => {"title"=>"Titus Andronicus"}
|
26
|
+
```
|
27
|
+
|
28
|
+
The same concept goes for empty hashes:
|
29
|
+
|
30
|
+
```ruby
|
31
|
+
myhash = {'title' => 'Titus Andronicus', 'notes' => {'ideas'=>{}} }
|
32
|
+
puts myhash # => {"title"=>"Titus Andronicus", "notes"=>{}}
|
33
|
+
Declutter.process myhash
|
34
|
+
puts myhash # => {"title"=>"Titus Andronicus"}
|
35
|
+
```
|
36
|
+
|
37
|
+
## Object oriented approach
|
38
|
+
|
39
|
+
To refine what elements are deleted, instantiate `Declutter` to set what type of
|
40
|
+
elements are deleted.
|
41
|
+
|
42
|
+
### nil
|
43
|
+
|
44
|
+
To delete nils, set `declutter.delete_nils` to true:
|
45
|
+
|
46
|
+
```ruby
|
47
|
+
myhash = { 'episodes'=>['pilot', nil, 'transition'] }
|
48
|
+
puts myhash # => {"episodes"=>["pilot", nil, "transition"]}
|
49
|
+
|
50
|
+
declutter = Declutter.new()
|
51
|
+
declutter.delete_nils = true
|
52
|
+
declutter.process myhash
|
53
|
+
|
54
|
+
puts myhash # => {"episodes"=>["pilot", "transition"]}
|
55
|
+
```
|
56
|
+
|
57
|
+
If deleting the nil values results in an empty array, then the array is deleted.
|
58
|
+
|
59
|
+
```ruby
|
60
|
+
myhash = { 'episodes'=>[nil] }
|
61
|
+
puts myhash # => { 'episodes'=>[nil] }
|
62
|
+
|
63
|
+
declutter = Declutter.new()
|
64
|
+
declutter.delete_nils = true
|
65
|
+
declutter.process myhash
|
66
|
+
|
67
|
+
puts myhash # => {}
|
68
|
+
```
|
69
|
+
|
70
|
+
### redundancies
|
71
|
+
|
72
|
+
To delete redundant elements in arrays, set `declutter.delete_redundancies` to
|
73
|
+
true.
|
74
|
+
|
75
|
+
```ruby
|
76
|
+
myhash = { 'episodes'=>['pilot', 'pilot'] }
|
77
|
+
puts myhash # => { 'episodes'=>['pilot', 'pilot'] }
|
78
|
+
|
79
|
+
declutter = Declutter.new()
|
80
|
+
declutter.delete_redundancies = true
|
81
|
+
declutter.process myhash
|
82
|
+
|
83
|
+
puts myhash # => { 'episodes'=>['pilot'] }
|
84
|
+
```
|
85
|
+
|
86
|
+
### false
|
87
|
+
|
88
|
+
To delete false values, set `declutter.delete_falses` to true:
|
89
|
+
|
90
|
+
```ruby
|
91
|
+
myhash = { 'episodes'=>['pilot', false] }
|
92
|
+
puts myhash # => {"episodes"=>["pilot", false]}
|
93
|
+
|
94
|
+
declutter = Declutter.new()
|
95
|
+
declutter.delete_falses = true
|
96
|
+
declutter.process myhash
|
97
|
+
|
98
|
+
puts myhash # => {"episodes"=>["pilot"]}
|
99
|
+
```
|
100
|
+
|
101
|
+
### keep empty hashes and/or arrays
|
102
|
+
|
103
|
+
To keep empty hashes, set `declutter.delete_empty_hashes` to false:
|
104
|
+
|
105
|
+
```ruby
|
106
|
+
myhash = { 'episodes'=>[], 'notes'=>{} }
|
107
|
+
puts myhash # => {"episodes"=>[], "notes"=>{}}
|
108
|
+
|
109
|
+
declutter = Declutter.new()
|
110
|
+
declutter.delete_empty_hashes = false
|
111
|
+
declutter.process myhash
|
112
|
+
|
113
|
+
puts myhash # => {"notes"=>{}}
|
114
|
+
```
|
115
|
+
|
116
|
+
To keep empty arrays, set `declutter.delete_empty_arrays` to false:
|
117
|
+
|
118
|
+
```ruby
|
119
|
+
myhash = { 'episodes'=>[], 'notes'=>{} }
|
120
|
+
puts myhash # => {"episodes"=>[], "notes"=>{}}
|
121
|
+
|
122
|
+
declutter = Declutter.new()
|
123
|
+
declutter.delete_empty_arrays = false
|
124
|
+
declutter.process myhash
|
125
|
+
|
126
|
+
puts myhash # => {"episodes"=>[]}
|
127
|
+
```
|
128
|
+
|
129
|
+
## History
|
130
|
+
|
131
|
+
| date | version | notes |
|
132
|
+
|--------------|---------|-----------------|
|
133
|
+
| May 23, 2023 | 1.0 | Initial upload. |
|
data/lib/declutter.rb
ADDED
@@ -0,0 +1,132 @@
|
|
1
|
+
#===============================================================================
|
2
|
+
# Declutter
|
3
|
+
#
|
4
|
+
class Declutter
|
5
|
+
attr_accessor :delete_empty_hashes
|
6
|
+
attr_accessor :delete_empty_arrays
|
7
|
+
attr_accessor :delete_redundancies
|
8
|
+
attr_accessor :delete_nils
|
9
|
+
attr_accessor :delete_falses
|
10
|
+
|
11
|
+
#---------------------------------------------------------------------------
|
12
|
+
# initialize
|
13
|
+
#
|
14
|
+
def initialize
|
15
|
+
@delete_empty_hashes = true
|
16
|
+
@delete_empty_arrays = true
|
17
|
+
@delete_redundancies = false
|
18
|
+
@delete_nils = false
|
19
|
+
@delete_falses = false
|
20
|
+
end
|
21
|
+
#
|
22
|
+
# initialize
|
23
|
+
#---------------------------------------------------------------------------
|
24
|
+
|
25
|
+
|
26
|
+
#---------------------------------------------------------------------------
|
27
|
+
# process
|
28
|
+
# Process hash or array. Anything else is left as is.
|
29
|
+
#
|
30
|
+
def process(obj)
|
31
|
+
if obj.is_a?(Hash)
|
32
|
+
process_hash obj
|
33
|
+
elsif obj.is_a?(Array)
|
34
|
+
process_array obj
|
35
|
+
end
|
36
|
+
end
|
37
|
+
#
|
38
|
+
# process
|
39
|
+
#---------------------------------------------------------------------------
|
40
|
+
|
41
|
+
|
42
|
+
#---------------------------------------------------------------------------
|
43
|
+
# self.process
|
44
|
+
#
|
45
|
+
def self.process(obj)
|
46
|
+
self.new.process obj
|
47
|
+
end
|
48
|
+
#
|
49
|
+
# self.process
|
50
|
+
#---------------------------------------------------------------------------
|
51
|
+
|
52
|
+
|
53
|
+
#---------------------------------------------------------------------------
|
54
|
+
# process_hash
|
55
|
+
#
|
56
|
+
def process_hash(hsh)
|
57
|
+
hsh.keys.each do |k|
|
58
|
+
v = hsh[k]
|
59
|
+
process v
|
60
|
+
|
61
|
+
# delete or process element
|
62
|
+
if not keep_element?(v)
|
63
|
+
hsh.delete k
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
#
|
68
|
+
# process_hash
|
69
|
+
#---------------------------------------------------------------------------
|
70
|
+
|
71
|
+
|
72
|
+
#---------------------------------------------------------------------------
|
73
|
+
# process_array
|
74
|
+
#
|
75
|
+
def process_array(arr)
|
76
|
+
hold = arr.clone
|
77
|
+
arr.clear
|
78
|
+
|
79
|
+
# add back elements that are acceptable
|
80
|
+
hold.each do |child|
|
81
|
+
process child
|
82
|
+
|
83
|
+
if keep_element?(child)
|
84
|
+
arr.push child
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
# uniq array if necessary
|
89
|
+
if @delete_redundancies
|
90
|
+
arr.uniq!
|
91
|
+
end
|
92
|
+
end
|
93
|
+
#
|
94
|
+
# process_array
|
95
|
+
#---------------------------------------------------------------------------
|
96
|
+
|
97
|
+
|
98
|
+
#---------------------------------------------------------------------------
|
99
|
+
# keep_element
|
100
|
+
#
|
101
|
+
def keep_element?(v)
|
102
|
+
# hash
|
103
|
+
if v.is_a?(Hash)
|
104
|
+
if @delete_empty_hashes and v.empty?
|
105
|
+
return false
|
106
|
+
end
|
107
|
+
|
108
|
+
# array
|
109
|
+
elsif v.is_a?(Array)
|
110
|
+
if @delete_empty_arrays and v.empty?
|
111
|
+
return false
|
112
|
+
end
|
113
|
+
|
114
|
+
# nil
|
115
|
+
elsif v.nil?
|
116
|
+
return !@delete_nils
|
117
|
+
|
118
|
+
# false
|
119
|
+
elsif not v
|
120
|
+
return !@delete_falses
|
121
|
+
end
|
122
|
+
|
123
|
+
# if we get this far then we're keeping the element
|
124
|
+
return true
|
125
|
+
end
|
126
|
+
#
|
127
|
+
# keep_element
|
128
|
+
#---------------------------------------------------------------------------
|
129
|
+
end
|
130
|
+
#
|
131
|
+
# Declutter
|
132
|
+
#===============================================================================
|
metadata
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: declutter
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: '1.0'
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Mike O'Sullivan
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2023-05-23 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: Declutter your Ruby objects by removing empty hashes and arrays
|
14
|
+
email: mike@idocs.com
|
15
|
+
executables: []
|
16
|
+
extensions: []
|
17
|
+
extra_rdoc_files: []
|
18
|
+
files:
|
19
|
+
- README.md
|
20
|
+
- lib/declutter.rb
|
21
|
+
homepage: https://github.com/mikosullivan/declutter
|
22
|
+
licenses:
|
23
|
+
- MIT
|
24
|
+
metadata: {}
|
25
|
+
post_install_message:
|
26
|
+
rdoc_options: []
|
27
|
+
require_paths:
|
28
|
+
- lib
|
29
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
35
|
+
requirements:
|
36
|
+
- - ">="
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: '0'
|
39
|
+
requirements: []
|
40
|
+
rubygems_version: 3.1.2
|
41
|
+
signing_key:
|
42
|
+
specification_version: 4
|
43
|
+
summary: Declutter
|
44
|
+
test_files: []
|