delete_derived_data 0.0.2

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: f80bfe4f6605d37411e9448fe83f8b51a49d3bf758ccb7e06825e2fe6202c508
4
+ data.tar.gz: 2a031dc848460a5250a578d522105cb654b36c72781ccb926202bb1eece66f85
5
+ SHA512:
6
+ metadata.gz: dde7195c24042679dae743e345663d488d8a3d72916719888ea5cf812b7a25164e6f78580ffd606662fdfed798f1c14ec43ee0715f8b7e608c2b21abe908be04
7
+ data.tar.gz: 527bf98c50f94d2c44e8a0c462955bf6ac099d55fab33920895b690417fba74011e92f0774cb0dd65192118f7b8c5005f2123e3217b232c4048c692b64ac32cc
@@ -0,0 +1,41 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ if $PROGRAM_NAME == __FILE__
4
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
5
+ end
6
+
7
+ require 'delete_derived_data'
8
+ require 'optparse'
9
+
10
+ options = {}
11
+
12
+ OptionParser.new do |opts|
13
+ opts.banner = "Usage: delete_derived_data [options] | delete_derived_data"
14
+
15
+ opts.on('-d', '--directory PATH', "Directory that should be searching") do |path|
16
+ options[:root_dir] = path
17
+ end
18
+
19
+ opts.on('-a', '--archives', "Xcode Archives should be deleted") do |a|
20
+ options[:archives] = a
21
+ end
22
+
23
+ opts.on('-s', '--sempty', "Secure empty trash contents") do |s|
24
+ options[:sempty] = s
25
+ end
26
+
27
+ opts.on('-t', '--trash', "Empty trash contents") do |t|
28
+ options[:trash] = t
29
+ end
30
+
31
+ opts.on("-V", '--verbose', "Show more debugging information") do |v|
32
+ options[:verbose] = v
33
+ end
34
+
35
+ opts.on_tail('-h', '--help', 'Show this message') { puts opts; exit }
36
+ opts.on_tail("-v", "--version", "Show version") { puts DeleteDerivedData::VERSION; exit }
37
+ opts.parse!
38
+
39
+ end
40
+
41
+ DeleteDerivedData.delete(options)
@@ -0,0 +1,32 @@
1
+
2
+ require "find"
3
+ require "pathname"
4
+ require "tty-table"
5
+ require "tty-spinner"
6
+ require "delete_derived_data/trash"
7
+
8
+ require "tty-prompt"
9
+
10
+ module DeleteDerivedData
11
+ class Delete
12
+ def self.run(paths, options)
13
+ if paths == nil || paths.length <= 0
14
+ puts "No Data to be cleaning!"
15
+ return nil
16
+ end
17
+
18
+ paths.each {|d| Trash.move_to_trash(d)}
19
+
20
+ prompt = TTY::Prompt.new(enable_color: false, interrupt: :signal)
21
+ answer = options[:trash] || prompt.yes?("Are you sure you want to empty the trash (this cannot be undone)?")
22
+ return if !answer
23
+
24
+ if options[:sempty]
25
+ Trash.empty_securely_trash()
26
+ else
27
+ Trash.empty_trash()
28
+ end
29
+ end
30
+
31
+ end
32
+ end
@@ -0,0 +1,97 @@
1
+
2
+ require "delete_derived_data/utils"
3
+
4
+ module DeleteDerivedData
5
+ class Search
6
+ attr_accessor :verbose, :root_dir
7
+
8
+ def initialize(options = {})
9
+ @verbose = options[:verbose]
10
+ @root_dir = options[:root_dir] || ENV["HOME"]
11
+ end
12
+
13
+ def to_s
14
+ "#{verbose} #{root_dir}"
15
+ end
16
+
17
+ def getDerivedDatas
18
+
19
+ directory_paths = get_directory_paths(root_dir)
20
+ derived_paths = []
21
+ threads = []
22
+
23
+ table = TTY::Table.new(["Directory paths to be search"], directory_paths.map { |f| [f] })
24
+ puts table.render(:ascii)
25
+
26
+ directory_paths.each do |folder|
27
+ threads << Thread.new {
28
+ begin
29
+ Find.find(folder, ignore_error: true) {|path| derived_paths << path if path =~ /.*\DerivedData$/}
30
+ rescue Exception => e
31
+ puts e.message
32
+ end
33
+ }
34
+ end
35
+
36
+ spinner = TTY::Spinner.new("[:spinner] Search Derived Data ...", format: :dots_2)
37
+ spinner.auto_spin
38
+
39
+ threads.each {|t| t.join}
40
+
41
+ derived_size = 0
42
+ data = [:separator]
43
+ derived_paths.each { |d|
44
+ size = Filesize.dirSize(d)
45
+ derived_size = derived_size + size
46
+ data << [d, Filesize.size(size)] if verbose
47
+ }
48
+ data << :separator
49
+ data << ["Derived Data total size", Filesize.size(derived_size)]
50
+
51
+ spinner.stop
52
+
53
+ table = TTY::Table.new(["DerivedData", "Size"], data)
54
+ puts table.render(:ascii, alignments: [:left, :right], padding: [0,1,0,1])
55
+
56
+ derived_paths
57
+
58
+ end
59
+
60
+ def getArchives
61
+
62
+ spinner = TTY::Spinner.new("[:spinner] Search Xcode Archives ...", format: :dots_2)
63
+ spinner.auto_spin
64
+
65
+ xcode_archives = []
66
+ data = []
67
+ xcode_archives_size = 0
68
+
69
+ data << :separator
70
+ Dir["#{ENV["HOME"]}/Library/Developer/Xcode/Archives/**"].select { |d|
71
+ size = Filesize.dirSize(d)
72
+ xcode_archives_size = xcode_archives_size + size
73
+ data << [d, Filesize.size(size)] if verbose
74
+ xcode_archives << d
75
+ }
76
+ data << :separator
77
+ data << ["Xcode Archives total size", Filesize.size(xcode_archives_size)]
78
+
79
+ spinner.stop
80
+
81
+ table = TTY::Table.new(["Xcode Archives", "Size"], data)
82
+ puts table.render(:ascii, alignments: [:left, :right], padding: [0,1,0,1])
83
+
84
+ xcode_archives
85
+
86
+ end
87
+
88
+ private
89
+
90
+ def get_directory_paths(root_dir)
91
+ Pathname.new(root_dir).children.select { |c|
92
+ c.directory? && c.zero? == false && c.blockdev? == false && c.basename.to_s[0] != '.'
93
+ }
94
+ end
95
+ end
96
+
97
+ end
@@ -0,0 +1,26 @@
1
+
2
+ module DeleteDerivedData
3
+ class Trash
4
+ def self.move_to_trash(file)
5
+ puts "Telling Finder to move the file #{file} to trash... "
6
+ IO.popen("osascript", "w") do |stdin|
7
+ stdin.puts %Q{tell app "Finder" to move the POSIX file "#{file}" to trash}
8
+ end
9
+ end
10
+
11
+ def self.empty_trash
12
+ puts "Telling Finder to empty trash... "
13
+ IO.popen("osascript", "w") do |stdin|
14
+ stdin.puts %Q{tell app "Finder" to empty trash}
15
+ end
16
+ end
17
+
18
+ def self.empty_securely_trash
19
+ puts "Telling Finder to securely empty trash... "
20
+ IO.popen("osascript", "w") do |stdin|
21
+ stdin.puts %Q{tell app "Finder" to empty trash with security}
22
+ end
23
+ end
24
+
25
+ end
26
+ end
@@ -0,0 +1,18 @@
1
+
2
+ module DeleteDerivedData
3
+ class Filesize
4
+ def self.dirSize(path)
5
+ File.size(path) + Dir["#{path}/**/*"].select { |f| File.file?(f) }.sum { |f| File.size(f) }
6
+ end
7
+
8
+ def self.size(size)
9
+ units = ['B', 'KiB', 'MiB', 'GiB', 'TiB', 'Pib', 'EiB']
10
+
11
+ return '0.0 B' if size == 0
12
+ exp = (Math.log(size) / Math.log(1024)).to_i
13
+ exp = 6 if exp > 6
14
+
15
+ '%.1f %s' % [size.to_f / 1024 ** exp, units[exp]]
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,3 @@
1
+ module DeleteDerivedData
2
+ VERSION = "0.0.2".freeze
3
+ end
@@ -0,0 +1,20 @@
1
+
2
+ require "delete_derived_data/search"
3
+ require "delete_derived_data/delete"
4
+ require "delete_derived_data/version"
5
+
6
+ module DeleteDerivedData
7
+ def self.delete(options = {})
8
+ search = Search.new(options)
9
+ derived_paths = search.getDerivedDatas
10
+ archives_paths = search.getArchives if options[:archives]
11
+
12
+ if !derived_paths.nil? && derived_paths.length > 0
13
+ Delete.run(derived_paths, options)
14
+ end
15
+
16
+ if !archives_paths.nil? && archives_paths.length > 0
17
+ Delete.run(archives_paths, options)
18
+ end
19
+ end
20
+ end
data/lib/main2.rb ADDED
@@ -0,0 +1,261 @@
1
+
2
+ require 'find'
3
+ require "tty-spinner"
4
+ require "tty-prompt"
5
+ require "tty-table"
6
+ require 'trash'
7
+
8
+ require "pathname"
9
+
10
+ require 'logger'
11
+
12
+ class DerivedData
13
+ def self.hi(language = "english")
14
+ cmd = 'ls'
15
+ system(cmd)
16
+
17
+ puts "Hello world!"
18
+ puts language
19
+ spinner = TTY::Spinner.new("[:spinner] Loading ...", format: :pulse_2)
20
+
21
+ spinner.auto_spin # Automatic animation with default interval
22
+
23
+ # sleep(2) # Perform task
24
+
25
+ derived_paths = []
26
+ # Find.find('../..') do |path|
27
+ # derived_paths << path if path =~ /.*\DerivedData$/
28
+ # end
29
+ Find.find('../') do |path|
30
+ # derived_paths << File.expand_path(path, __dir__) if path =~ /.*\DerivedData$/
31
+ derived_paths << path if path =~ /.*\DerivedData$/
32
+ end
33
+
34
+ spinner.stop("Done!") # Stop animation
35
+
36
+ puts derived_paths
37
+ # trash = Trash.new
38
+ # trash.throw_out(*derived_paths)
39
+ # Trash.new.throw_out(*derived_paths)
40
+
41
+ somedir = derived_paths?.first
42
+ # FileUtils.mv(derived_paths.first, File.expand_path('~/.Trash/'))
43
+ if File.directory?(somedir)
44
+ puts somedir
45
+ FileUtils.remove_dir(somedir)
46
+ end
47
+
48
+ end
49
+
50
+ def self.clean
51
+ # cmd = 'sh delete_all_derived_data.sh'
52
+ # system(cmd)
53
+
54
+ # cmd = "echo 'hi'"
55
+ # value = %x( echo 'hi' )
56
+ # value = %x[ #{cmd} ]
57
+ # wasGood = system( "echo 'hi'" )
58
+ # wasGood = system( cmd )
59
+
60
+ spinner = TTY::Spinner.new("[:spinner] Search ...", format: :dots_2)
61
+ spinner.auto_spin
62
+ # puts File.expand_path('../', __dir__)
63
+ # system('find ../ -type d -name "DerivedData" 2>/dev/null -exec trash -v {} +')
64
+ # system('trash -e')
65
+ somedir = "/Users/nicolaerogojan/gitRepository/Personal/delete_all_derived_data/DerivedData"
66
+ # FileUtils.remove_dir(somedir)
67
+ system("echo #{somedir}")
68
+ # system("trash #{somedir}") # OK
69
+
70
+ system("trash", "-v", "#{somedir}")
71
+ # system("trash -e")
72
+ spinner.stop("Done!")
73
+ end
74
+
75
+ def find
76
+ logger = Logger.new(STDOUT)
77
+ logger.level = Logger::DEBUG
78
+ logger.debug(Dir.home)
79
+ puts "Started At #{Time.now}"
80
+
81
+ spinner = TTY::Spinner.new("[:spinner] Search ...", format: :dots_2)
82
+ spinner.auto_spin
83
+
84
+ # base_dir_path = Dir.home
85
+ # base_dir_path = "/Users/nicolaerogojan/gitRepository"
86
+ # base_dir_path = "/Users/nicolaerogojan/gitRepository/Personal/delete_all_derived_data"
87
+ base_dir_path = "/Users/nicolaerogojan/.Trash"
88
+ # directory_paths = Dir.glob(File.join(base_dir_path, '*', ''))
89
+ directory_paths = Pathname.new(base_dir_path).children.select { |c| c.directory? && c.basename(path)[0] != ?. }
90
+
91
+ logger.debug base_dir_path
92
+ logger.debug directory_paths
93
+
94
+ derived_paths = []
95
+ arr = []
96
+
97
+ # directory_paths.each do |f|
98
+ # arr << Thread.new {
99
+ # Find.find(f) {|path| derived_paths << path if path =~ /.*\DerivedData$/}
100
+ # }
101
+ # end
102
+
103
+ # directory_paths.each do |folder|
104
+ # Find.find(folder) do |path|
105
+ # if FileTest.directory?(path)
106
+ # if File.basename(path)[0] == ?.
107
+ # Find.prune # Don't look any further into this directory.
108
+ # else
109
+ # next
110
+ # end
111
+ # else
112
+ # if path =~ /.*\DerivedData$/
113
+ # puts path
114
+ # derived_paths << path
115
+ # end
116
+ # end
117
+ # end
118
+ # end
119
+
120
+ directory_paths.each do |folder|
121
+ arr << Thread.new {
122
+ Find.find(folder){ |path|
123
+ next if !File.directory?(path)
124
+ next if File.basename(path)[0] == ?.
125
+
126
+ # puts File.stat(path).blockdev?
127
+ next if File.stat(path).blockdev? == true
128
+ if path =~ /.*\DerivedData$/
129
+ puts path
130
+ derived_paths << path
131
+ end
132
+ }
133
+ }
134
+ end
135
+
136
+ arr.each {|t| t.join}
137
+
138
+ logger.debug arr.count
139
+ logger.debug derived_paths
140
+
141
+ # derived_paths.each {|f| logger.debug f; trash(f)}
142
+ spinner.stop("Done!")
143
+ puts "End at #{Time.now}"
144
+ end
145
+
146
+ def find_in_path(folder)
147
+ derived_paths = []
148
+ Find.find(folder) do |path|
149
+ derived_paths << path if path =~ /.*\DerivedData$/
150
+ end
151
+ puts derived_paths
152
+ end
153
+
154
+ def trash(file)
155
+ IO.popen("osascript", "w") do |stdin|
156
+ stdin.puts %Q{tell app "Finder" to move the POSIX file "#{file}" to trash}
157
+ end
158
+ end
159
+
160
+ def find2
161
+ spinner = TTY::Spinner.new("[:spinner] Search ...", format: :dots_2)
162
+ spinner.auto_spin
163
+
164
+ base_dir_path = ENV["HOME"]
165
+ # base_dir_path = "/Users/nicolaerogojan/.Trash"
166
+ # directory_paths = Dir.glob(File.join(base_dir_path, '*', ''))
167
+ directory_paths = []
168
+ derived_paths = []
169
+ threads = []
170
+
171
+ Pathname.new(base_dir_path).children.select do |c|
172
+ # c.directory? && c.zero?
173
+ # puts "dirname -> #{c.dirname}"
174
+ # puts "basename -> #{c.basename}"
175
+ # puts "directory -> #{c.directory?}"
176
+ # puts "blockdev -> #{c.blockdev?}"
177
+ # puts "zero -> #{c.zero?}"
178
+ # puts " -> #{c.to_s[0]}"
179
+ # puts " -> #{c.to_s[0] != '.'}"
180
+ # puts " -> #{c.basename != '.'}"
181
+ # puts " -> #{c.basename.to_s[0] != '.'}"
182
+ # puts "owned -> #{c.owned?}"
183
+ # puts "=============================="
184
+ # if c.directory? && c.zero? == false && c.blockdev? == false && c.basename.to_s[0] != '.' && c.basename.to_s != 'Library'
185
+ if c.directory? && c.zero? == false && c.blockdev? == false && c.basename.to_s[0] != '.'
186
+ directory_paths << c
187
+ end
188
+ end
189
+
190
+ # puts
191
+ # puts base_dir_path
192
+ # puts "=============================="
193
+ # puts directory_paths
194
+ # puts "=============================="
195
+
196
+ directory_paths.each do |folder|
197
+ threads << Thread.new {
198
+ begin
199
+ Find.find(folder, ignore_error: true) {|path| derived_paths << path if path =~ /.*\DerivedData$/}
200
+ rescue Exception => e
201
+ puts e.message
202
+ end
203
+ }
204
+ end
205
+
206
+ # Thread.abort_on_exception = false
207
+ # Thread.report_on_exception = false
208
+ # threads.each {|t| t.abort_on_exception = false; t.report_on_exception = false; t.join}
209
+ threads.each {|t| t.join}
210
+
211
+ # table = TTY::Table.new(["header1","header2"], [["a1", "a2"], ["b1", "b2"]])
212
+
213
+ # roys = [["a1"], ["a2"]]
214
+ # roys = []
215
+ # directory_paths.each do |folder|
216
+ # roys << [folder]
217
+ # end
218
+
219
+ roys = directory_paths.map { |f| [f] }
220
+ table = TTY::Table.new(["directory_paths"], roys)
221
+ puts
222
+ puts table.render(:ascii)
223
+
224
+ puts derived_paths
225
+ puts "=============================="
226
+
227
+ xcode_archives_size = Filesize.size(Dir["#{ENV["HOME"]}/Library/Developer/Xcode/Archives/**/*"].select { |f| File.file?(f) }.sum { |f| File.size(f) })
228
+ puts "Xcode Archives size: #{xcode_archives_size}"
229
+ spinner.stop("Done!")
230
+
231
+ prompt = TTY::Prompt.new
232
+
233
+ # answer = prompt.yes?("Do you like Ruby?")
234
+ answer = prompt.yes?("Are you a human?") do |q|
235
+ q.default false
236
+ q.positive "Yup"
237
+ q.negative "Nope"
238
+ end
239
+
240
+ puts "Answer: #{answer}"
241
+
242
+ end
243
+
244
+ end
245
+
246
+ class Filesize
247
+ def self.size(size)
248
+ units = ['B', 'KiB', 'MiB', 'GiB', 'TiB', 'Pib', 'EiB']
249
+
250
+ return '0.0 B' if size == 0
251
+ exp = (Math.log(size) / Math.log(1024)).to_i
252
+ exp = 6 if exp > 6
253
+
254
+ '%.1f %s' % [size.to_f / 1024 ** exp, units[exp]]
255
+ end
256
+ end
257
+
258
+ clean = DerivedData.new
259
+ # DerivedData.hi("Test")
260
+ # DerivedData.new.find()
261
+ DerivedData.new.find2()
metadata ADDED
@@ -0,0 +1,94 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: delete_derived_data
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - Rogojan Nicolae
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-05-10 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: tty-spinner
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.9.3
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.9.3
27
+ - !ruby/object:Gem::Dependency
28
+ name: tty-prompt
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.23.1
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.23.1
41
+ - !ruby/object:Gem::Dependency
42
+ name: tty-table
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 0.12.0
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 0.12.0
55
+ description: Search all DerivedData folders and moves files or folders to the trash.
56
+ Empty the trash (asks for confirmation)
57
+ email: rogojan.colea@gmail.com
58
+ executables:
59
+ - delete_derived_data
60
+ extensions: []
61
+ extra_rdoc_files: []
62
+ files:
63
+ - bin/delete_derived_data
64
+ - lib/delete_derived_data.rb
65
+ - lib/delete_derived_data/delete.rb
66
+ - lib/delete_derived_data/search.rb
67
+ - lib/delete_derived_data/trash.rb
68
+ - lib/delete_derived_data/utils.rb
69
+ - lib/delete_derived_data/version.rb
70
+ - lib/main2.rb
71
+ homepage: https://github.com/rognick/delete_derived_data
72
+ licenses:
73
+ - MIT
74
+ metadata: {}
75
+ post_install_message:
76
+ rdoc_options: []
77
+ require_paths:
78
+ - lib
79
+ required_ruby_version: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ required_rubygems_version: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ requirements: []
90
+ rubygems_version: 3.1.4
91
+ signing_key:
92
+ specification_version: 4
93
+ summary: Delete all derived data!
94
+ test_files: []