declutter 1.0 → 1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +57 -3
  3. data/lib/declutter.rb +36 -1
  4. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 607c7167c298669ff221cbd00d7d8d984f1a1c936e2fbf2e5ae74cd4903cdfef
4
- data.tar.gz: 654e400b781e186c44477c88f547c06935d4f733c41685524c6896d5b7e953b3
3
+ metadata.gz: f9dbc1622dadba96ab55c42f8e7a477dac2ed481557703e074b096b6c4fffaa5
4
+ data.tar.gz: d147bd94493a740d1854a94bed6adb1d09891217ff60637b8c4d75dbc331e5a7
5
5
  SHA512:
6
- metadata.gz: b32c7fda4d2420cf4bc7a0cc99b8016d70638ef3773e4297e0419b9773a4974ac00552a729726cadb120ebc09f0ca7f3b1917c02084bb0555d33bf661b18cfe1
7
- data.tar.gz: 96acb8ef11156a427bc1447099acfa2273b302e0f020321ee6c35dd1b4ff8f5b2693b7d0b869f70741494594deb0dffed41f439fde32743bff14e615daf97253
6
+ metadata.gz: 6c08b8c3c36da7bd3b3af62eded77f0843b4af7f8b77ce01c12d5af248e6584cc3daf5942568c617b7a4c2bba75e736420dc1490b3bfb71e770fa65885118677
7
+ data.tar.gz: 47d13c23af1e61d2e4d2c2b7809c175fc61e194dd86ddf3d57ee7a748548fb65efcd50527374d11ed38af99c031034840ac00a44ca15ed5ca174dc01a0446780
data/README.md CHANGED
@@ -1,6 +1,8 @@
1
- # declutter
1
+ # Declutter
2
+
2
3
  Declutters your Ruby hashes and arrays by removing empty arrays and hashes.
3
- Also has options for removing nils, redundancies and falses.
4
+ Also has options for removing nils, redundancies and falses, and objects that
5
+ respond to `#declutter`.
4
6
 
5
7
  In this simple example, we create a hash structure that contains an empty array:
6
8
 
@@ -126,8 +128,60 @@ declutter.process myhash
126
128
  puts myhash # => {"episodes"=>[]}
127
129
  ```
128
130
 
131
+ ### objects of other classes
132
+
133
+ Objects of your own custom class can be decluttered if they have a `#declutter`
134
+ method. Consider these two classes.
135
+
136
+ ```ruby
137
+ class KeepMe
138
+ def declutter
139
+ return true
140
+ end
141
+ end
142
+
143
+ class DeleteMe
144
+ def declutter
145
+ return false
146
+ end
147
+ end
148
+ ```
149
+
150
+ Both classes have declutter methods. `KeepMe#declutter` returns true and
151
+ `DeleteMe#declutter` returns false. In this first example, we use the default
152
+ settings to declutter the hash.
153
+
154
+ ```ruby
155
+ hsh = {}
156
+ hsh['keep-it'] = KeepMe.new
157
+ hsh['delete-it'] = DeleteMe.new
158
+
159
+ Declutter.process hsh
160
+
161
+ puts hsh # => {"keep-it"=>#<KeepMe:0x0000559f8574b718>}
162
+ ```
163
+
164
+ The `keep-it` element was kept because `KeepMe#declutter` returns true. However,
165
+ the `delete-it` element was deleted because `DeleteMe#declutter` returns false.
166
+
167
+ To bypass decluttering objects that have a `#declutter` method, use the object
168
+ oriented approach and set `process_others` to false:
169
+
170
+ ```ruby
171
+ hsh = {}
172
+ hsh['keep-it'] = KeepMe.new
173
+ hsh['delete-it'] = DeleteMe.new
174
+
175
+ declutter = Declutter.new
176
+ declutter.process_others = false
177
+ declutter.process hsh
178
+
179
+ puts hsh # => {"keep-it"=>#<KeepMe:0x000055e5ffd46f80>, "delete-it"=>#<DeleteMe:0x000055e5ffd46f30>}
180
+ ```
181
+
129
182
  ## History
130
183
 
131
184
  | date | version | notes |
132
185
  |--------------|---------|-----------------|
133
- | May 23, 2023 | 1.0 | Initial upload. |
186
+ | May 23, 2023 | 1.0 | Initial upload. |
187
+ | May 29, 2023 | 1.1 | Added ability to call #declutter on any object that responds to that method. |
data/lib/declutter.rb CHANGED
@@ -2,21 +2,38 @@
2
2
  # Declutter
3
3
  #
4
4
  class Declutter
5
+ # If empty hashes should be deleted. True by default.
5
6
  attr_accessor :delete_empty_hashes
7
+
8
+ # If empty arrays should be deleted. True by default.
6
9
  attr_accessor :delete_empty_arrays
10
+
11
+ # If redundant array elements should be deleted. False by default.
7
12
  attr_accessor :delete_redundancies
13
+
14
+ # If nils should be deleted. False by default.
8
15
  attr_accessor :delete_nils
16
+
17
+ # If falses should be deleted. False by default.
9
18
  attr_accessor :delete_falses
10
19
 
20
+ # If objects that respond to #declutter should be processed Defaults
21
+ # to true.
22
+ attr_accessor :process_others
23
+
11
24
  #---------------------------------------------------------------------------
12
25
  # initialize
13
26
  #
27
+
28
+ # Creates a new Declutter object. Takes no params.
29
+
14
30
  def initialize
15
31
  @delete_empty_hashes = true
16
32
  @delete_empty_arrays = true
17
33
  @delete_redundancies = false
18
34
  @delete_nils = false
19
35
  @delete_falses = false
36
+ @process_others = true
20
37
  end
21
38
  #
22
39
  # initialize
@@ -25,11 +42,16 @@ class Declutter
25
42
 
26
43
  #---------------------------------------------------------------------------
27
44
  # process
28
- # Process hash or array. Anything else is left as is.
29
45
  #
46
+
47
+ # Declutter a hash or array.
48
+
30
49
  def process(obj)
50
+ # declutter hash
31
51
  if obj.is_a?(Hash)
32
52
  process_hash obj
53
+
54
+ # declutter array
33
55
  elsif obj.is_a?(Array)
34
56
  process_array obj
35
57
  end
@@ -42,6 +64,9 @@ class Declutter
42
64
  #---------------------------------------------------------------------------
43
65
  # self.process
44
66
  #
67
+
68
+ # Shortcut for decluttering with default settings.
69
+
45
70
  def self.process(obj)
46
71
  self.new.process obj
47
72
  end
@@ -50,6 +75,10 @@ class Declutter
50
75
  #---------------------------------------------------------------------------
51
76
 
52
77
 
78
+ # private
79
+ private
80
+
81
+
53
82
  #---------------------------------------------------------------------------
54
83
  # process_hash
55
84
  #
@@ -118,6 +147,12 @@ class Declutter
118
147
  # false
119
148
  elsif not v
120
149
  return !@delete_falses
150
+
151
+ # other class
152
+ elsif @process_others and v.respond_to?('declutter')
153
+ if not v.declutter
154
+ return false
155
+ end
121
156
  end
122
157
 
123
158
  # if we get this far then we're keeping the element
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: declutter
3
3
  version: !ruby/object:Gem::Version
4
- version: '1.0'
4
+ version: '1.1'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike O'Sullivan
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-05-23 00:00:00.000000000 Z
11
+ date: 2023-05-29 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Declutter your Ruby objects by removing empty hashes and arrays
14
14
  email: mike@idocs.com