artifactory-cleaner 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (117) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +4 -0
  3. data/.idea/.gitignore +2 -0
  4. data/.idea/checkstyle-idea.xml +16 -0
  5. data/.idea/dictionaries/jgitlin.xml +7 -0
  6. data/.idea/misc.xml +6 -0
  7. data/.idea/modules.xml +8 -0
  8. data/.idea/vcs.xml +6 -0
  9. data/.rspec +3 -0
  10. data/.rspec_status +39 -0
  11. data/.travis.yml +6 -0
  12. data/CODE_OF_CONDUCT.md +74 -0
  13. data/Gemfile +12 -0
  14. data/README.md +73 -0
  15. data/Rakefile +20 -0
  16. data/artifactory-cleaner.gemspec +43 -0
  17. data/artifactory-cleaner.iml +9 -0
  18. data/bin/console +14 -0
  19. data/bin/setup +8 -0
  20. data/doc/rdoc/Artifactory.html +94 -0
  21. data/doc/rdoc/Artifactory/Cleaner.html +108 -0
  22. data/doc/rdoc/Artifactory/Cleaner/ArtifactBucket.html +504 -0
  23. data/doc/rdoc/Artifactory/Cleaner/ArtifactBucketCollection.html +570 -0
  24. data/doc/rdoc/Artifactory/Cleaner/ArtifactFilter.html +712 -0
  25. data/doc/rdoc/Artifactory/Cleaner/ArtifactFilterRule.html +519 -0
  26. data/doc/rdoc/Artifactory/Cleaner/CLI.html +625 -0
  27. data/doc/rdoc/Artifactory/Cleaner/Controller.html +1014 -0
  28. data/doc/rdoc/Artifactory/Cleaner/DiscoveredArtifact.html +400 -0
  29. data/doc/rdoc/Artifactory/Cleaner/DiscoveryWorker.html +466 -0
  30. data/doc/rdoc/Artifactory/Cleaner/Error.html +101 -0
  31. data/doc/rdoc/Artifactory/Cleaner/SpecHelpers.html +190 -0
  32. data/doc/rdoc/Artifactory/Cleaner/Util.html +157 -0
  33. data/doc/rdoc/CODE_OF_CONDUCT_md.html +228 -0
  34. data/doc/rdoc/Float.html +94 -0
  35. data/doc/rdoc/Gemfile.html +144 -0
  36. data/doc/rdoc/Gemfile_lock.html +217 -0
  37. data/doc/rdoc/Object.html +112 -0
  38. data/doc/rdoc/README_md.html +241 -0
  39. data/doc/rdoc/Rakefile.html +151 -0
  40. data/doc/rdoc/artifactory-cleaner_gemspec.html +173 -0
  41. data/doc/rdoc/artifactory-cleaner_iml.html +139 -0
  42. data/doc/rdoc/bin/setup.html +134 -0
  43. data/doc/rdoc/created.rid +219 -0
  44. data/doc/rdoc/css/fonts.css +167 -0
  45. data/doc/rdoc/css/rdoc.css +590 -0
  46. data/doc/rdoc/filterlist_yaml.html +149 -0
  47. data/doc/rdoc/filters/clean-amzn_yaml.html +133 -0
  48. data/doc/rdoc/filters/snapshots_yaml.html +137 -0
  49. data/doc/rdoc/filters/test-filter_yaml.html +137 -0
  50. data/doc/rdoc/filters/yum-test_yaml.html +141 -0
  51. data/doc/rdoc/fonts/Lato-Light.ttf +0 -0
  52. data/doc/rdoc/fonts/Lato-LightItalic.ttf +0 -0
  53. data/doc/rdoc/fonts/Lato-Regular.ttf +0 -0
  54. data/doc/rdoc/fonts/Lato-RegularItalic.ttf +0 -0
  55. data/doc/rdoc/fonts/SourceCodePro-Bold.ttf +0 -0
  56. data/doc/rdoc/fonts/SourceCodePro-Regular.ttf +0 -0
  57. data/doc/rdoc/images/add.png +0 -0
  58. data/doc/rdoc/images/arrow_up.png +0 -0
  59. data/doc/rdoc/images/brick.png +0 -0
  60. data/doc/rdoc/images/brick_link.png +0 -0
  61. data/doc/rdoc/images/bug.png +0 -0
  62. data/doc/rdoc/images/bullet_black.png +0 -0
  63. data/doc/rdoc/images/bullet_toggle_minus.png +0 -0
  64. data/doc/rdoc/images/bullet_toggle_plus.png +0 -0
  65. data/doc/rdoc/images/date.png +0 -0
  66. data/doc/rdoc/images/delete.png +0 -0
  67. data/doc/rdoc/images/find.png +0 -0
  68. data/doc/rdoc/images/loadingAnimation.gif +0 -0
  69. data/doc/rdoc/images/macFFBgHack.png +0 -0
  70. data/doc/rdoc/images/package.png +0 -0
  71. data/doc/rdoc/images/page_green.png +0 -0
  72. data/doc/rdoc/images/page_white_text.png +0 -0
  73. data/doc/rdoc/images/page_white_width.png +0 -0
  74. data/doc/rdoc/images/plugin.png +0 -0
  75. data/doc/rdoc/images/ruby.png +0 -0
  76. data/doc/rdoc/images/tag_blue.png +0 -0
  77. data/doc/rdoc/images/tag_green.png +0 -0
  78. data/doc/rdoc/images/transparent.png +0 -0
  79. data/doc/rdoc/images/wrench.png +0 -0
  80. data/doc/rdoc/images/wrench_orange.png +0 -0
  81. data/doc/rdoc/images/zoom.png +0 -0
  82. data/doc/rdoc/index.html +166 -0
  83. data/doc/rdoc/js/darkfish.js +161 -0
  84. data/doc/rdoc/js/jquery.js +4 -0
  85. data/doc/rdoc/js/navigation.js +141 -0
  86. data/doc/rdoc/js/navigation.js.gz +0 -0
  87. data/doc/rdoc/js/search.js +109 -0
  88. data/doc/rdoc/js/search_index.js +1 -0
  89. data/doc/rdoc/js/search_index.js.gz +0 -0
  90. data/doc/rdoc/js/searcher.js +229 -0
  91. data/doc/rdoc/js/searcher.js.gz +0 -0
  92. data/doc/rdoc/results/archive-test-4_log.html +762 -0
  93. data/doc/rdoc/results/buckets-2020-01-31_txt.html +233 -0
  94. data/doc/rdoc/results/clean-test-2_log.html +598 -0
  95. data/doc/rdoc/results/clean-test-3_log.html +128 -0
  96. data/doc/rdoc/results/clean-test-5_log.html +2721 -0
  97. data/doc/rdoc/results/clean-test-6_log.html +135 -0
  98. data/doc/rdoc/results/clean-test-7_log.html +137 -0
  99. data/doc/rdoc/results/clean-test-8-real_log.html +131 -0
  100. data/doc/rdoc/results/clean-test-9_log.html +131 -0
  101. data/doc/rdoc/results/clean-test1_log.html +1759 -0
  102. data/doc/rdoc/results/yum-test_2020-01-31_log.html +2854 -0
  103. data/doc/rdoc/results/yum-test_dry-run_log.html +1074 -0
  104. data/doc/rdoc/table_of_contents.html +581 -0
  105. data/exe/artifactory-cleaner +12 -0
  106. data/lib/artifactory/cleaner.rb +17 -0
  107. data/lib/artifactory/cleaner/artifact_bucket.rb +102 -0
  108. data/lib/artifactory/cleaner/artifact_bucket_collection.rb +118 -0
  109. data/lib/artifactory/cleaner/artifact_filter.rb +146 -0
  110. data/lib/artifactory/cleaner/artifact_filter_rule.rb +81 -0
  111. data/lib/artifactory/cleaner/cli.rb +415 -0
  112. data/lib/artifactory/cleaner/controller.rb +466 -0
  113. data/lib/artifactory/cleaner/discovered_artifact.rb +71 -0
  114. data/lib/artifactory/cleaner/discovery_worker.rb +126 -0
  115. data/lib/artifactory/cleaner/util.rb +21 -0
  116. data/lib/artifactory/cleaner/version.rb +7 -0
  117. metadata +252 -0
@@ -0,0 +1,1014 @@
1
+ <!DOCTYPE html>
2
+
3
+ <html>
4
+ <head>
5
+ <meta charset="UTF-8">
6
+
7
+ <title>class Artifactory::Cleaner::Controller - RDoc Documentation</title>
8
+
9
+ <script type="text/javascript">
10
+ var rdoc_rel_prefix = "../../";
11
+ var index_rel_prefix = "../../";
12
+ </script>
13
+
14
+ <script src="../../js/jquery.js"></script>
15
+ <script src="../../js/darkfish.js"></script>
16
+
17
+ <link href="../../css/fonts.css" rel="stylesheet">
18
+ <link href="../../css/rdoc.css" rel="stylesheet">
19
+
20
+
21
+
22
+ <body id="top" role="document" class="class">
23
+ <nav role="navigation">
24
+ <div id="project-navigation">
25
+ <div id="home-section" role="region" title="Quick navigation" class="nav-section">
26
+ <h2>
27
+ <a href="../../index.html" rel="home">Home</a>
28
+ </h2>
29
+
30
+ <div id="table-of-contents-navigation">
31
+ <a href="../../table_of_contents.html#pages">Pages</a>
32
+ <a href="../../table_of_contents.html#classes">Classes</a>
33
+ <a href="../../table_of_contents.html#methods">Methods</a>
34
+ </div>
35
+ </div>
36
+
37
+ <div id="search-section" role="search" class="project-section initially-hidden">
38
+ <form action="#" method="get" accept-charset="utf-8">
39
+ <div id="search-field-wrapper">
40
+ <input id="search-field" role="combobox" aria-label="Search"
41
+ aria-autocomplete="list" aria-controls="search-results"
42
+ type="text" name="search" placeholder="Search" spellcheck="false"
43
+ title="Type to search, Up and Down to navigate, Enter to load">
44
+ </div>
45
+
46
+ <ul id="search-results" aria-label="Search Results"
47
+ aria-busy="false" aria-expanded="false"
48
+ aria-atomic="false" class="initially-hidden"></ul>
49
+ </form>
50
+ </div>
51
+
52
+ </div>
53
+
54
+
55
+
56
+ <div id="class-metadata">
57
+
58
+ <div id="parent-class-section" class="nav-section">
59
+ <h3>Parent</h3>
60
+
61
+
62
+ <p class="link"><a href="../../Object.html">Object</a>
63
+
64
+ </div>
65
+
66
+
67
+
68
+ <!-- Method Quickref -->
69
+ <div id="method-list-section" class="nav-section">
70
+ <h3>Methods</h3>
71
+
72
+ <ul class="link-list" role="directory">
73
+
74
+ <li ><a href="#method-c-new">::new</a>
75
+
76
+ <li ><a href="#method-i-archive_artifact">#archive_artifact</a>
77
+
78
+ <li ><a href="#method-i-artifact_usage_search">#artifact_usage_search</a>
79
+
80
+ <li ><a href="#method-i-bucketize_artifacts">#bucketize_artifacts</a>
81
+
82
+ <li ><a href="#method-i-bucketized_artifact_report">#bucketized_artifact_report</a>
83
+
84
+ <li ><a href="#method-i-catagorize_old_assets">#catagorize_old_assets</a>
85
+
86
+ <li ><a href="#method-i-delete_artifact">#delete_artifact</a>
87
+
88
+ <li ><a href="#method-i-discover_artifacts_from_search">#discover_artifacts_from_search</a>
89
+
90
+ <li ><a href="#method-i-discover_repos">#discover_repos</a>
91
+
92
+ <li ><a href="#method-i-verbose-3D">#verbose=</a>
93
+
94
+ <li ><a href="#method-i-verbose-3F">#verbose?</a>
95
+
96
+ <li ><a href="#method-i-with_discovered_artifacts">#with_discovered_artifacts</a>
97
+
98
+ <li ><a href="#method-i-yaml_format">#yaml_format</a>
99
+
100
+ </ul>
101
+ </div>
102
+
103
+ </div>
104
+ </nav>
105
+
106
+ <main role="main" aria-labelledby="class-Artifactory::Cleaner::Controller">
107
+ <h1 id="class-Artifactory::Cleaner::Controller" class="class">
108
+ class Artifactory::Cleaner::Controller
109
+ </h1>
110
+
111
+ <section class="description">
112
+
113
+ <p><a href="../../Artifactory.html">Artifactory</a> <a
114
+ href="../Cleaner.html">Cleaner</a> Logic <a
115
+ href="Controller.html">Controller</a></p>
116
+
117
+ <p>The <a href="Controller.html">Artifactory::Cleaner::Controller</a> class
118
+ provides logic central to <a href="../../Artifactory.html">Artifactory</a>
119
+ <a href="../Cleaner.html">Cleaner</a>. <a
120
+ href="Controller.html">Artifactory::Cleaner::Controller</a> manages the <a
121
+ href="../../Artifactory.html">Artifactory</a> API client, performs
122
+ searches, discovers artifacts, and more. It is capable of executing tasks
123
+ in a multi-threaded fashion, making multiple requests to the <a
124
+ href="../../Artifactory.html">Artifactory</a> server in parallel.</p>
125
+
126
+ </section>
127
+
128
+
129
+ <section id="5Buntitled-5D" class="documentation-section">
130
+
131
+
132
+
133
+
134
+
135
+ <section class="constants-list">
136
+ <header>
137
+ <h3>Constants</h3>
138
+ </header>
139
+ <dl>
140
+
141
+ <dt id="ProcessingQueues">ProcessingQueues
142
+
143
+ <dd><p>Struct to contain the processing queues used internally within the
144
+ controller</p>
145
+ <hr>
146
+
147
+ <p>The controller contains two <a
148
+ href="https://ruby-doc.org/core-2.6/Queue.html">Queues</a> which are used
149
+ for multi-threaded processing of artifacts. The :incoming queue is fed
150
+ tasks to be done, which <a
151
+ href="DiscoveryWorker.html">Artifactory::Cleaner::DiscoveryWorker</a>
152
+ instances pop from, process, and push the results back into the :outgoing
153
+ queue. The <a href="Controller.html">Artifactory::Cleaner::Controller</a>
154
+ will then pop from the outgoing queue and send the results back to the
155
+ caller</p>
156
+
157
+
158
+ </dl>
159
+ </section>
160
+
161
+
162
+
163
+
164
+
165
+ <section id="public-class-5Buntitled-5D-method-details" class="method-section">
166
+ <header>
167
+ <h3>Public Class Methods</h3>
168
+ </header>
169
+
170
+
171
+ <div id="method-c-new" class="method-detail ">
172
+
173
+ <div class="method-heading">
174
+ <span class="method-name">new</span><span
175
+ class="method-args">(artifactory_config)</span>
176
+
177
+ <span class="method-click-advice">click to toggle source</span>
178
+
179
+ </div>
180
+
181
+
182
+ <div class="method-description">
183
+
184
+ <p>Initialize and configure a new <a
185
+ href="Controller.html">Artifactory::Cleaner::Controller</a> Params:</p>
186
+ <dl class="rdoc-list note-list"><dt><code>artifactory_config</code>
187
+ <dd>
188
+ <p>Hash of configuration for the <a
189
+ href="../../Artifactory.html">Artifactory</a> client. Used as a splat for a
190
+ call to Artifactory::Client.new</p>
191
+ </dd></dl>
192
+
193
+
194
+
195
+
196
+ <div class="method-source-code" id="new-source">
197
+ <pre><span class="ruby-comment"># File lib/artifactory/cleaner/controller.rb, line 26</span>
198
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">initialize</span>(<span class="ruby-identifier">artifactory_config</span>)
199
+ <span class="ruby-ivar">@artifactory_client</span> = <span class="ruby-identifier">client</span> = <span class="ruby-constant">Artifactory</span><span class="ruby-operator">::</span><span class="ruby-constant">Client</span>.<span class="ruby-identifier">new</span>(<span class="ruby-operator">**</span><span class="ruby-identifier">artifactory_config</span>)
200
+ <span class="ruby-ivar">@verbose</span> = <span class="ruby-keyword">false</span>
201
+ <span class="ruby-identifier">initialize_queues</span>
202
+ <span class="ruby-ivar">@workers</span> = []
203
+ <span class="ruby-ivar">@num_workers</span> = <span class="ruby-value">6</span>
204
+ <span class="ruby-keyword">end</span></pre>
205
+ </div>
206
+
207
+ </div>
208
+
209
+
210
+
211
+
212
+ </div>
213
+
214
+
215
+ </section>
216
+
217
+ <section id="public-instance-5Buntitled-5D-method-details" class="method-section">
218
+ <header>
219
+ <h3>Public Instance Methods</h3>
220
+ </header>
221
+
222
+
223
+ <div id="method-i-archive_artifact" class="method-detail ">
224
+
225
+ <div class="method-heading">
226
+ <span class="method-name">archive_artifact</span><span
227
+ class="method-args">(artifact, path)</span>
228
+
229
+ <span class="method-click-advice">click to toggle source</span>
230
+
231
+ </div>
232
+
233
+
234
+ <div class="method-description">
235
+
236
+ <p>Download a copy of an artifact to the local filesystem prior to deletion</p>
237
+
238
+ <p>Given an Artifactory::Resource::Artifact `artifact`, download the artifact
239
+ to the local filesystem directory specified by the `path` param</p>
240
+
241
+ <p>*<strong>Note:</strong>* Downloading an artifact will update the
242
+ artifact&#39;s last_downloaded date so it may no longer match the same
243
+ search criteria it originally die (if last_downlaoded was used to discover
244
+ this artifact)</p>
245
+
246
+ <p>This method is meant to be used prior to calling `delete_artifact`</p>
247
+
248
+
249
+
250
+
251
+ <div class="method-source-code" id="archive_artifact-source">
252
+ <pre><span class="ruby-comment"># File lib/artifactory/cleaner/controller.rb, line 346</span>
253
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">archive_artifact</span>(<span class="ruby-identifier">artifact</span>, <span class="ruby-identifier">path</span>)
254
+ <span class="ruby-identifier">debuglog</span> <span class="ruby-node">&quot;[DEBUG] downloading #{artifact} (#{artifact.uri}) to #{path}&quot;</span>
255
+ <span class="ruby-identifier">timing</span> = <span class="ruby-constant">Benchmark</span>.<span class="ruby-identifier">measure</span> <span class="ruby-keyword">do</span>
256
+ <span class="ruby-identifier">artifact</span>.<span class="ruby-identifier">download</span>(<span class="ruby-identifier">path</span>)
257
+ <span class="ruby-keyword">end</span>
258
+ <span class="ruby-identifier">debuglog</span> <span class="ruby-node">&quot;[DEBUG] #{artifact.uri} #{Util.filesize artifact.size} downloaded in #{timing.real.round(2)} seconds (#{Util.filesize(artifact.size/timing.real)})/s&quot;</span>
259
+ <span class="ruby-keyword">end</span></pre>
260
+ </div>
261
+
262
+ </div>
263
+
264
+
265
+
266
+
267
+ </div>
268
+
269
+
270
+ <div id="method-i-artifact_usage_search" class="method-detail ">
271
+
272
+ <div class="method-heading">
273
+ <span class="method-name">artifact_usage_search</span><span
274
+ class="method-args">(from: nil, to: nil, repos: nil, threads: 4)</span>
275
+
276
+ <span class="method-click-advice">click to toggle source</span>
277
+
278
+ </div>
279
+
280
+
281
+ <div class="method-description">
282
+
283
+ <p>Search for an artifact by its usage</p>
284
+
285
+ <p>@example Search for all repositories with the given usage statistics</p>
286
+
287
+ <pre class="ruby"><span class="ruby-constant">Artifact</span>.<span class="ruby-identifier">usage_search</span>(
288
+ <span class="ruby-value">notUsedSince:</span> <span class="ruby-value">1388534400000</span>,
289
+ <span class="ruby-value">createdBefore:</span> <span class="ruby-value">1388534400000</span>,
290
+ )
291
+ </pre>
292
+
293
+ <p>@example Search for all artifacts with the given usage statistics in a repo</p>
294
+
295
+ <pre class="ruby"><span class="ruby-constant">Artifact</span>.<span class="ruby-identifier">usage_search</span>(
296
+ <span class="ruby-value">notUsedSince:</span> <span class="ruby-value">1388534400000</span>,
297
+ <span class="ruby-value">createdBefore:</span> <span class="ruby-value">1388534400000</span>,
298
+ <span class="ruby-value">repos:</span> <span class="ruby-string">&#39;libs-release-local&#39;</span>,
299
+ )
300
+ </pre>
301
+
302
+ <p>@param [Hash] options</p>
303
+
304
+ <pre class="ruby"><span class="ruby-identifier">the</span> <span class="ruby-identifier">list</span> <span class="ruby-identifier">of</span> <span class="ruby-identifier">options</span> <span class="ruby-identifier">to</span> <span class="ruby-identifier">search</span> <span class="ruby-identifier">with</span>
305
+ </pre>
306
+
307
+ <p>@option options [Artifactory::Client] :client</p>
308
+
309
+ <pre class="ruby"><span class="ruby-identifier">the</span> <span class="ruby-identifier">client</span> <span class="ruby-identifier">object</span> <span class="ruby-identifier">to</span> <span class="ruby-identifier">make</span> <span class="ruby-identifier">the</span> <span class="ruby-identifier">request</span> <span class="ruby-identifier">with</span>
310
+ </pre>
311
+
312
+ <p>@option options [Long] :notUsedSince</p>
313
+
314
+ <pre>the last downloaded cutoff date of the artifact to search for (millis since epoch)</pre>
315
+
316
+ <p>@option options [Long] :createdBefore</p>
317
+
318
+ <pre>the creation cutoff date of the artifact to search for (millis since epoch)</pre>
319
+
320
+ <p>@option options [String, Array&lt;String&gt;] :repos</p>
321
+
322
+ <pre class="ruby"><span class="ruby-identifier">the</span> <span class="ruby-identifier">list</span> <span class="ruby-identifier">of</span> <span class="ruby-identifier">repos</span> <span class="ruby-identifier">to</span> <span class="ruby-identifier">search</span>
323
+ </pre>
324
+
325
+ <p>@return [Array&lt;Resource::Artifact&gt;]</p>
326
+
327
+ <pre class="ruby"><span class="ruby-identifier">a</span> <span class="ruby-identifier">list</span> <span class="ruby-identifier">of</span> <span class="ruby-identifier">artifacts</span> <span class="ruby-identifier">that</span> <span class="ruby-identifier">match</span> <span class="ruby-identifier">the</span> <span class="ruby-identifier">query</span>
328
+ </pre>
329
+
330
+
331
+
332
+
333
+ <div class="method-source-code" id="artifact_usage_search-source">
334
+ <pre><span class="ruby-comment"># File lib/artifactory/cleaner/controller.rb, line 173</span>
335
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">artifact_usage_search</span>(<span class="ruby-value">from:</span> <span class="ruby-keyword">nil</span>, <span class="ruby-value">to:</span> <span class="ruby-keyword">nil</span>, <span class="ruby-value">repos:</span> <span class="ruby-keyword">nil</span>, <span class="ruby-value">threads:</span> <span class="ruby-value">4</span>)
336
+ <span class="ruby-identifier">to</span> = <span class="ruby-constant">Time</span>.<span class="ruby-identifier">now</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">to</span>.<span class="ruby-identifier">nil?</span>
337
+
338
+ <span class="ruby-identifier">params</span> = {
339
+ <span class="ruby-value">dateFields:</span> <span class="ruby-string">&#39;created,lastModified,lastDownloaded&#39;</span>,
340
+ <span class="ruby-value">from:</span> <span class="ruby-identifier">from</span>.<span class="ruby-identifier">is_a?</span>(<span class="ruby-constant">Time</span>) <span class="ruby-operator">?</span> <span class="ruby-identifier">from</span>.<span class="ruby-identifier">to_i</span> <span class="ruby-operator">*</span> <span class="ruby-value">1000</span> <span class="ruby-operator">:</span> <span class="ruby-identifier">from</span>.<span class="ruby-identifier">to_i</span>,
341
+ <span class="ruby-value">to:</span> <span class="ruby-identifier">to</span>.<span class="ruby-identifier">is_a?</span>(<span class="ruby-constant">Time</span>) <span class="ruby-operator">?</span> <span class="ruby-identifier">to</span>.<span class="ruby-identifier">to_i</span> <span class="ruby-operator">*</span> <span class="ruby-value">1000</span> <span class="ruby-operator">:</span> <span class="ruby-identifier">to</span>.<span class="ruby-identifier">to_i</span>
342
+ }
343
+ <span class="ruby-identifier">repos</span> = <span class="ruby-identifier">repos</span>.<span class="ruby-identifier">compact</span>.<span class="ruby-identifier">join</span>(<span class="ruby-string">&quot;,&quot;</span>) <span class="ruby-keyword">unless</span> <span class="ruby-identifier">repos</span>.<span class="ruby-identifier">nil?</span>
344
+ <span class="ruby-identifier">params</span>[<span class="ruby-value">:repos</span>] = <span class="ruby-identifier">repos</span> <span class="ruby-keyword">unless</span> <span class="ruby-identifier">repos</span>.<span class="ruby-identifier">nil?</span>
345
+
346
+ <span class="ruby-identifier">result</span> = <span class="ruby-keyword">nil</span>
347
+
348
+ <span class="ruby-identifier">debuglog</span>(<span class="ruby-node">&quot;[DEBUG] Making Artifactory request /api/search/dates for #{params.inspect}&quot;</span>)
349
+ <span class="ruby-identifier">timing</span> = {}
350
+ <span class="ruby-identifier">timing</span>[<span class="ruby-value">:search</span>] = <span class="ruby-constant">Benchmark</span>.<span class="ruby-identifier">measure</span> <span class="ruby-keyword">do</span>
351
+ <span class="ruby-keyword">begin</span>
352
+ <span class="ruby-identifier">result</span> = <span class="ruby-ivar">@artifactory_client</span>.<span class="ruby-identifier">get</span>(<span class="ruby-string">&quot;/api/search/dates&quot;</span>, <span class="ruby-identifier">params</span>)
353
+ <span class="ruby-keyword">rescue</span> <span class="ruby-constant">Artifactory</span><span class="ruby-operator">::</span><span class="ruby-constant">Error</span><span class="ruby-operator">::</span><span class="ruby-constant">HTTPError</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-identifier">err</span>
354
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">err</span>.<span class="ruby-identifier">code</span> <span class="ruby-operator">==</span> <span class="ruby-value">404</span>
355
+ <span class="ruby-identifier">debuglog</span> <span class="ruby-string">&quot; HTTP 404 Not Found fetching: /api/search/dates -- assuming no assets for this date range&quot;</span>
356
+ <span class="ruby-identifier">result</span> = []
357
+ <span class="ruby-comment">#Pry::rescued(err) if defined?(Pry::rescue)</span>
358
+ <span class="ruby-keyword">else</span>
359
+ <span class="ruby-constant">STDERR</span>.<span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;HTTP Error while performing an artifact usage search: #{err}&quot;</span>
360
+ <span class="ruby-constant">STDERR</span>.<span class="ruby-identifier">puts</span> <span class="ruby-identifier">err</span>.<span class="ruby-identifier">full_message</span>
361
+ <span class="ruby-constant">STDERR</span>.<span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;Parameters were: #{params.inspect}&quot;</span>
362
+ <span class="ruby-constant">STDERR</span>.<span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;Caused by #{err.cause.full_message}&quot;</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">err</span>.<span class="ruby-identifier">cause</span>
363
+ <span class="ruby-constant">Pry</span><span class="ruby-operator">::</span><span class="ruby-identifier">rescued</span>(<span class="ruby-identifier">err</span>) <span class="ruby-keyword">if</span> <span class="ruby-keyword">defined?</span>(<span class="ruby-constant">Pry</span><span class="ruby-operator">::</span><span class="ruby-identifier">rescue</span>)
364
+ <span class="ruby-keyword">end</span>
365
+ <span class="ruby-keyword">end</span>
366
+ <span class="ruby-keyword">end</span>
367
+ <span class="ruby-identifier">debuglog</span>(<span class="ruby-node">&quot;[DEBUG] Got #{result[&quot;results&quot;].length} results from search in #{timing[:search].real} seconds&quot;</span>) <span class="ruby-keyword">unless</span> <span class="ruby-identifier">result</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-keyword">or</span> <span class="ruby-identifier">result</span>.<span class="ruby-identifier">empty?</span>
368
+ <span class="ruby-identifier">timing</span>[<span class="ruby-value">:fetch</span>] = <span class="ruby-constant">Benchmark</span>.<span class="ruby-identifier">measure</span> <span class="ruby-keyword">do</span>
369
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">threads</span> <span class="ruby-operator">&gt;</span> <span class="ruby-value">1</span>
370
+ <span class="ruby-keyword">unless</span> <span class="ruby-identifier">result</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-keyword">or</span> <span class="ruby-identifier">result</span>.<span class="ruby-identifier">empty?</span>
371
+ <span class="ruby-identifier">result</span> = <span class="ruby-identifier">discover_artifacts_from_search</span>(<span class="ruby-identifier">result</span>[<span class="ruby-string">&quot;results&quot;</span>], <span class="ruby-value">threads:</span> <span class="ruby-identifier">threads</span>)
372
+ <span class="ruby-keyword">end</span>
373
+ <span class="ruby-keyword">else</span>
374
+ <span class="ruby-keyword">unless</span> <span class="ruby-identifier">result</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-keyword">or</span> <span class="ruby-identifier">result</span>.<span class="ruby-identifier">empty?</span>
375
+ <span class="ruby-identifier">result</span> = <span class="ruby-identifier">result</span>[<span class="ruby-string">&quot;results&quot;</span>].<span class="ruby-identifier">map</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">artifact</span><span class="ruby-operator">|</span>
376
+ <span class="ruby-identifier">a</span> = <span class="ruby-keyword">nil</span>
377
+ <span class="ruby-identifier">retries</span> = <span class="ruby-value">10</span>
378
+ <span class="ruby-keyword">while</span> <span class="ruby-identifier">a</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-keyword">and</span> <span class="ruby-identifier">retries</span> <span class="ruby-operator">&gt;</span> <span class="ruby-value">0</span>
379
+ <span class="ruby-keyword">begin</span>
380
+ <span class="ruby-identifier">retries</span> <span class="ruby-operator">-=</span> <span class="ruby-value">1</span>
381
+ <span class="ruby-identifier">a</span> = <span class="ruby-constant">Artifactory</span><span class="ruby-operator">::</span><span class="ruby-constant">Cleaner</span><span class="ruby-operator">::</span><span class="ruby-constant">DiscoveredArtifact</span>.<span class="ruby-identifier">from_url</span>(<span class="ruby-identifier">artifact</span>[<span class="ruby-string">&quot;uri&quot;</span>], <span class="ruby-value">client:</span> <span class="ruby-ivar">@artifactory_client</span>)
382
+ <span class="ruby-identifier">a</span>.<span class="ruby-identifier">last_downloaded</span> = <span class="ruby-constant">Time</span>.<span class="ruby-identifier">parse</span>(<span class="ruby-identifier">artifact</span>[<span class="ruby-string">&quot;lastDownloaded&quot;</span>]) <span class="ruby-keyword">unless</span> <span class="ruby-identifier">artifact</span>[<span class="ruby-string">&quot;lastDownloaded&quot;</span>].<span class="ruby-identifier">to_s</span>.<span class="ruby-identifier">empty?</span>
383
+ <span class="ruby-keyword">rescue</span> <span class="ruby-constant">Net</span><span class="ruby-operator">::</span><span class="ruby-constant">OpenTimeout</span>, <span class="ruby-constant">Artifactory</span><span class="ruby-operator">::</span><span class="ruby-constant">Error</span><span class="ruby-operator">::</span><span class="ruby-constant">ConnectionError</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-identifier">err</span>
384
+ <span class="ruby-constant">STDERR</span>.<span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;[WARN] Connection Failure attempting to reach Artifactory API: #{err}&quot;</span>
385
+ <span class="ruby-identifier">debuglog</span> <span class="ruby-node">&quot; Parameters were: #{params.inspect}&quot;</span>
386
+ <span class="ruby-identifier">debuglog</span> <span class="ruby-node">&quot; Caused by #{err.cause.full_message}&quot;</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">err</span>.<span class="ruby-identifier">cause</span>
387
+ <span class="ruby-constant">STDERR</span>.<span class="ruby-identifier">puts</span> <span class="ruby-string">&quot; Retrying in 10 seconds&quot;</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">retries</span>
388
+ <span class="ruby-identifier">sleep</span> <span class="ruby-value">10</span>
389
+ <span class="ruby-keyword">rescue</span> <span class="ruby-constant">Artifactory</span><span class="ruby-operator">::</span><span class="ruby-constant">Error</span><span class="ruby-operator">::</span><span class="ruby-constant">HTTPError</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-identifier">err</span>
390
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">err</span>.<span class="ruby-identifier">code</span> <span class="ruby-operator">==</span> <span class="ruby-value">404</span>
391
+ <span class="ruby-constant">STDERR</span>.<span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;[WARN] HTTP 404 Not Found fetching: #{artifact[&quot;uri&quot;]}&quot;</span>
392
+ <span class="ruby-identifier">retries</span> = <span class="ruby-value">0</span>
393
+ <span class="ruby-keyword">else</span>
394
+ <span class="ruby-identifier">retries</span> = <span class="ruby-identifier">min</span>(<span class="ruby-identifier">retries</span>, <span class="ruby-value">1</span>)
395
+ <span class="ruby-constant">STDERR</span>.<span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;[ERROR] HTTP Error while fetching an artifact from a usage search: #{err}&quot;</span>
396
+ <span class="ruby-identifier">debuglog</span> <span class="ruby-identifier">err</span>.<span class="ruby-identifier">full_message</span>
397
+ <span class="ruby-identifier">debuglog</span> <span class="ruby-node">&quot; Artifact was: #{artifact.inspect}&quot;</span>
398
+ <span class="ruby-identifier">debuglog</span> <span class="ruby-node">&quot; Parameters were: #{params.inspect}&quot;</span>
399
+ <span class="ruby-identifier">debuglog</span> <span class="ruby-node">&quot; Caused by #{err.cause.full_message}&quot;</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">err</span>.<span class="ruby-identifier">cause</span>
400
+ <span class="ruby-constant">Pry</span><span class="ruby-operator">::</span><span class="ruby-identifier">rescued</span>(<span class="ruby-identifier">err</span>) <span class="ruby-keyword">if</span> <span class="ruby-keyword">defined?</span>(<span class="ruby-constant">Pry</span><span class="ruby-operator">::</span><span class="ruby-identifier">rescue</span>)
401
+ <span class="ruby-constant">STDERR</span>.<span class="ruby-identifier">puts</span> <span class="ruby-string">&quot; Will retry download once&quot;</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">retries</span>
402
+ <span class="ruby-keyword">end</span>
403
+ <span class="ruby-keyword">end</span>
404
+ <span class="ruby-keyword">end</span>
405
+ <span class="ruby-identifier">a</span>
406
+ <span class="ruby-keyword">end</span>
407
+ <span class="ruby-keyword">end</span>
408
+ <span class="ruby-identifier">result</span>.<span class="ruby-identifier">compact!</span>
409
+ <span class="ruby-keyword">end</span>
410
+ <span class="ruby-keyword">end</span>
411
+ <span class="ruby-identifier">debuglog</span>(<span class="ruby-node">&quot;[DEBUG][Perfdata] Artifactory request /api/search/dates timing: #{timing[:search]}&quot;</span>)
412
+ <span class="ruby-identifier">debuglog</span>(<span class="ruby-node">&quot;[DEBUG][Perfdata] Fetching artifacts timing: #{timing[:fetch]}&quot;</span>)
413
+ <span class="ruby-identifier">total_time</span> = <span class="ruby-identifier">timing</span>.<span class="ruby-identifier">values</span>.<span class="ruby-identifier">reduce</span>(<span class="ruby-value">0</span>) {<span class="ruby-operator">|</span><span class="ruby-identifier">s</span>,<span class="ruby-identifier">t</span><span class="ruby-operator">|</span> <span class="ruby-identifier">s</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">t</span>.<span class="ruby-identifier">real</span>}
414
+ <span class="ruby-identifier">debuglog</span>(<span class="ruby-node">&quot;[DEBUG] #{result.length} artifacts fetched in #{total_time.round 2} seconds&quot;</span>)
415
+ <span class="ruby-identifier">result</span>
416
+ <span class="ruby-keyword">end</span></pre>
417
+ </div>
418
+
419
+ </div>
420
+
421
+
422
+
423
+
424
+ </div>
425
+
426
+
427
+ <div id="method-i-bucketize_artifacts" class="method-detail ">
428
+
429
+ <div class="method-heading">
430
+ <span class="method-name">bucketize_artifacts</span><span
431
+ class="method-args">(from: nil, to: nil, increment: 30 * 24 * 3600, repos: nil, buckets: nil, threads: 4)</span>
432
+
433
+ <span class="method-click-advice">click to toggle source</span>
434
+
435
+ </div>
436
+
437
+
438
+ <div class="method-description">
439
+
440
+
441
+
442
+
443
+
444
+
445
+ <div class="method-source-code" id="bucketize_artifacts-source">
446
+ <pre><span class="ruby-comment"># File lib/artifactory/cleaner/controller.rb, line 289</span>
447
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">bucketize_artifacts</span>(<span class="ruby-value">from:</span> <span class="ruby-keyword">nil</span>, <span class="ruby-value">to:</span> <span class="ruby-keyword">nil</span>, <span class="ruby-value">increment:</span> <span class="ruby-value">30</span> <span class="ruby-operator">*</span> <span class="ruby-value">24</span> <span class="ruby-operator">*</span> <span class="ruby-value">3600</span>, <span class="ruby-value">repos:</span> <span class="ruby-keyword">nil</span>, <span class="ruby-value">buckets:</span> <span class="ruby-keyword">nil</span>, <span class="ruby-value">threads:</span> <span class="ruby-value">4</span>)
448
+ <span class="ruby-identifier">buckets</span> = <span class="ruby-constant">ArtifactBucketCollection</span>.<span class="ruby-identifier">new</span> <span class="ruby-keyword">unless</span> <span class="ruby-identifier">buckets</span>.<span class="ruby-identifier">is_a?</span> <span class="ruby-constant">ArtifactBucketCollection</span>
449
+ <span class="ruby-identifier">with_discovered_artifacts</span>(<span class="ruby-value">from:</span> <span class="ruby-identifier">from</span>, <span class="ruby-value">to:</span> <span class="ruby-identifier">to</span>, <span class="ruby-value">repos:</span> <span class="ruby-identifier">repos</span>, <span class="ruby-value">increment:</span> <span class="ruby-identifier">increment</span>, <span class="ruby-value">threads:</span> <span class="ruby-identifier">threads</span>) <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">artifact</span><span class="ruby-operator">|</span>
450
+ <span class="ruby-identifier">buckets</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">artifact</span>
451
+ <span class="ruby-keyword">end</span>
452
+ <span class="ruby-identifier">buckets</span>
453
+ <span class="ruby-keyword">end</span></pre>
454
+ </div>
455
+
456
+ </div>
457
+
458
+
459
+
460
+
461
+ </div>
462
+
463
+
464
+ <div id="method-i-bucketized_artifact_report" class="method-detail ">
465
+
466
+ <div class="method-heading">
467
+ <span class="method-name">bucketized_artifact_report</span><span
468
+ class="method-args">(buckets)</span>
469
+
470
+ <span class="method-click-advice">click to toggle source</span>
471
+
472
+ </div>
473
+
474
+
475
+ <div class="method-description">
476
+
477
+ <p>Given a <a
478
+ href="ArtifactBucketCollection.html">Artifactory::Cleaner::ArtifactBucketCollection</a>,
479
+ return a String summarizing the contents</p>
480
+
481
+ <p>TODO: This really should be a method on <a
482
+ href="ArtifactBucketCollection.html">Artifactory::Cleaner::ArtifactBucketCollection</a></p>
483
+
484
+
485
+
486
+
487
+ <div class="method-source-code" id="bucketized_artifact_report-source">
488
+ <pre><span class="ruby-comment"># File lib/artifactory/cleaner/controller.rb, line 301</span>
489
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">bucketized_artifact_report</span>(<span class="ruby-identifier">buckets</span>)
490
+ <span class="ruby-identifier">total_size</span> = <span class="ruby-value">0</span>
491
+ <span class="ruby-identifier">total_count</span> = <span class="ruby-value">0</span>
492
+ <span class="ruby-identifier">lines</span> = <span class="ruby-identifier">buckets</span>.<span class="ruby-identifier">map</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">bucket</span><span class="ruby-operator">|</span>
493
+ <span class="ruby-identifier">total_size</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">bucket</span>.<span class="ruby-identifier">filesize</span>
494
+ <span class="ruby-identifier">total_count</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">bucket</span>.<span class="ruby-identifier">length</span>
495
+ <span class="ruby-node">&quot;#{bucket.length} artifacts between #{bucket.min} and #{bucket.max} days, totaling #{Artifactory::Cleaner::Util::filesize bucket.filesize}&quot;</span>
496
+ <span class="ruby-keyword">end</span>
497
+ <span class="ruby-identifier">lines</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-node">&quot;Total: #{Artifactory::Cleaner::Util::filesize total_size} across #{total_count} artifacts&quot;</span>
498
+ <span class="ruby-keyword">end</span></pre>
499
+ </div>
500
+
501
+ </div>
502
+
503
+
504
+
505
+
506
+ </div>
507
+
508
+
509
+ <div id="method-i-catagorize_old_assets" class="method-detail ">
510
+
511
+ <div class="method-heading">
512
+ <span class="method-name">catagorize_old_assets</span><span
513
+ class="method-args">(days)</span>
514
+
515
+ <span class="method-click-advice">click to toggle source</span>
516
+
517
+ </div>
518
+
519
+
520
+ <div class="method-description">
521
+
522
+ <p>Deprecated, do not use</p>
523
+
524
+
525
+
526
+
527
+ <div class="method-source-code" id="catagorize_old_assets-source">
528
+ <pre><span class="ruby-comment"># File lib/artifactory/cleaner/controller.rb, line 370</span>
529
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">catagorize_old_assets</span>(<span class="ruby-identifier">days</span>)
530
+ <span class="ruby-identifier">buckets</span> = {
531
+ <span class="ruby-value">730</span> <span class="ruby-operator">=&gt;</span> {<span class="ruby-value">count:</span> <span class="ruby-value">0</span>, <span class="ruby-value">size:</span> <span class="ruby-value">0</span>},
532
+ <span class="ruby-value">365</span> <span class="ruby-operator">=&gt;</span> {<span class="ruby-value">count:</span> <span class="ruby-value">0</span>, <span class="ruby-value">size:</span> <span class="ruby-value">0</span>},
533
+ <span class="ruby-value">180</span> <span class="ruby-operator">=&gt;</span> {<span class="ruby-value">count:</span> <span class="ruby-value">0</span>, <span class="ruby-value">size:</span> <span class="ruby-value">0</span>},
534
+ <span class="ruby-value">90</span> <span class="ruby-operator">=&gt;</span> {<span class="ruby-value">count:</span> <span class="ruby-value">0</span>, <span class="ruby-value">size:</span> <span class="ruby-value">0</span>},
535
+ <span class="ruby-value">30</span> <span class="ruby-operator">=&gt;</span> {<span class="ruby-value">count:</span> <span class="ruby-value">0</span>, <span class="ruby-value">size:</span> <span class="ruby-value">0</span>},
536
+ }
537
+ <span class="ruby-identifier">discover_repos</span>
538
+ <span class="ruby-ivar">@repos</span>[<span class="ruby-value">:local</span>].<span class="ruby-identifier">each_pair</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">id</span>,<span class="ruby-identifier">repo</span><span class="ruby-operator">|</span>
539
+ <span class="ruby-keyword">begin</span>
540
+ <span class="ruby-identifier">pkgs</span> = <span class="ruby-value">0</span>
541
+ <span class="ruby-identifier">purgable</span> = <span class="ruby-value">0</span>
542
+ <span class="ruby-identifier">timings</span> = <span class="ruby-constant">Benchmark</span>.<span class="ruby-identifier">bm</span>(<span class="ruby-value">12</span>) <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">bm</span><span class="ruby-operator">|</span>
543
+ <span class="ruby-identifier">debuglog</span> <span class="ruby-node">&quot;Searching Repo #{id}:&quot;</span>
544
+ <span class="ruby-identifier">old_packages</span> = <span class="ruby-keyword">nil</span>
545
+ <span class="ruby-identifier">bm</span>.<span class="ruby-identifier">report</span>(<span class="ruby-string">&#39;api call&#39;</span>) {
546
+ <span class="ruby-identifier">old_packages</span> = <span class="ruby-ivar">@artifactory_client</span>.<span class="ruby-identifier">artifact_usage_search</span>(
547
+ <span class="ruby-value">notUsedSince:</span> (<span class="ruby-constant">Time</span>.<span class="ruby-identifier">now</span>.<span class="ruby-identifier">to_i</span> <span class="ruby-operator">-</span> <span class="ruby-value">24</span> <span class="ruby-operator">*</span> <span class="ruby-value">3600</span> <span class="ruby-operator">*</span> <span class="ruby-identifier">days</span>) <span class="ruby-operator">*</span> <span class="ruby-value">1000</span>,
548
+ <span class="ruby-value">createdBefore:</span> (<span class="ruby-constant">Time</span>.<span class="ruby-identifier">now</span>.<span class="ruby-identifier">to_i</span> <span class="ruby-operator">-</span> <span class="ruby-value">24</span> <span class="ruby-operator">*</span> <span class="ruby-value">3600</span> <span class="ruby-operator">*</span> <span class="ruby-identifier">days</span>) <span class="ruby-operator">*</span> <span class="ruby-value">1000</span>,
549
+ <span class="ruby-value">repos:</span> <span class="ruby-identifier">id</span>
550
+ )
551
+ }
552
+ <span class="ruby-identifier">debuglog</span> <span class="ruby-node">&quot; Artifactory search returned #{old_packages.length} assets older than #{days}...&quot;</span>
553
+ <span class="ruby-identifier">bm</span>.<span class="ruby-identifier">report</span>(<span class="ruby-string">&#39;loop&#39;</span>) { <span class="ruby-identifier">old_packages</span>.<span class="ruby-identifier">each_with_index</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">pkg</span>,<span class="ruby-identifier">i</span><span class="ruby-operator">|</span>
554
+ <span class="ruby-identifier">pkgs</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
555
+ <span class="ruby-identifier">uri</span> = <span class="ruby-constant">URI</span>(<span class="ruby-identifier">pkg</span>.<span class="ruby-identifier">uri</span>)
556
+ <span class="ruby-identifier">purgable</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">pkg</span>.<span class="ruby-identifier">size</span>
557
+ <span class="ruby-comment"># Calculate the age of this package in days and increment the bucket it belongs in</span>
558
+ <span class="ruby-identifier">age</span> = (<span class="ruby-constant">Time</span>.<span class="ruby-identifier">now</span> <span class="ruby-operator">-</span> <span class="ruby-identifier">pkg</span>.<span class="ruby-identifier">last_modified</span>)<span class="ruby-operator">/</span>(<span class="ruby-value">3600</span><span class="ruby-operator">*</span><span class="ruby-value">24</span>)
559
+ <span class="ruby-keyword">if</span> (<span class="ruby-identifier">bucket</span> = <span class="ruby-identifier">buckets</span>.<span class="ruby-identifier">keys</span>.<span class="ruby-identifier">find</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">v</span><span class="ruby-operator">|</span> <span class="ruby-identifier">age</span> <span class="ruby-operator">&gt;=</span> <span class="ruby-identifier">v</span> })
560
+ <span class="ruby-identifier">buckets</span>[<span class="ruby-identifier">bucket</span>][<span class="ruby-value">:count</span>] <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
561
+ <span class="ruby-identifier">buckets</span>[<span class="ruby-identifier">bucket</span>][<span class="ruby-value">:size</span>] <span class="ruby-operator">+=</span> <span class="ruby-identifier">pkg</span>.<span class="ruby-identifier">size</span>
562
+ <span class="ruby-keyword">end</span>
563
+ <span class="ruby-identifier">debuglog</span> <span class="ruby-node">&quot; ##{i}: #{File.basename(uri.path)} #{Util.filesize pkg.size} Created #{pkg.created} Modified #{pkg.last_modified}&quot;</span>
564
+ <span class="ruby-keyword">end</span> }
565
+ <span class="ruby-keyword">end</span>
566
+ <span class="ruby-identifier">debuglog</span> <span class="ruby-node">&quot;Found #{pkgs} assets from #{id} older than #{days} days totaling #{Util.filesize purgable} in #{timings.reduce {|sum, t| sum + t.real}} seconds&quot;</span>
567
+ <span class="ruby-keyword">rescue</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-identifier">ex</span>
568
+ <span class="ruby-constant">STDERR</span>.<span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;Caught an exception trying to handle repo #{id}: #{ex}&quot;</span>
569
+ <span class="ruby-constant">STDERR</span>.<span class="ruby-identifier">puts</span> <span class="ruby-identifier">ex</span>.<span class="ruby-identifier">full_message</span>
570
+ <span class="ruby-constant">STDERR</span>.<span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;Caused by #{ex.cause.full_message}&quot;</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">ex</span>.<span class="ruby-identifier">cause</span>
571
+ <span class="ruby-keyword">end</span>
572
+ <span class="ruby-keyword">end</span>
573
+
574
+ <span class="ruby-identifier">buckets</span>.<span class="ruby-identifier">each_pair</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">age</span>,<span class="ruby-identifier">bucket</span><span class="ruby-operator">|</span>
575
+ <span class="ruby-identifier">debuglog</span> <span class="ruby-node">&quot;#{bucket[:count]} packages older than #{age} days, totaling #{Util.filesize bucket[:size]}&quot;</span>
576
+ <span class="ruby-keyword">end</span>
577
+
578
+ <span class="ruby-identifier">buckets</span>
579
+ <span class="ruby-keyword">end</span></pre>
580
+ </div>
581
+
582
+ </div>
583
+
584
+
585
+
586
+
587
+ </div>
588
+
589
+
590
+ <div id="method-i-delete_artifact" class="method-detail ">
591
+
592
+ <div class="method-heading">
593
+ <span class="method-name">delete_artifact</span><span
594
+ class="method-args">(artifact)</span>
595
+
596
+ <span class="method-click-advice">click to toggle source</span>
597
+
598
+ </div>
599
+
600
+
601
+ <div class="method-description">
602
+
603
+ <p>Delete an artifact from the <a
604
+ href="../../Artifactory.html">Artifactory</a> server</p>
605
+
606
+ <p>Given an Artifactory::Resource::Artifact `artifact`, delete it from the <a
607
+ href="../../Artifactory.html">Artifactory</a> server. **This is a
608
+ destructive operation – use with caution!**</p>
609
+
610
+ <p>Consider using `archive_artifact` first to save artifacts locally</p>
611
+
612
+ <p>This function writes to the remote <a
613
+ href="../../Artifactory.html">Artifactory</a> server (specifically it makes
614
+ a delete call)</p>
615
+
616
+
617
+
618
+
619
+ <div class="method-source-code" id="delete_artifact-source">
620
+ <pre><span class="ruby-comment"># File lib/artifactory/cleaner/controller.rb, line 363</span>
621
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">delete_artifact</span>(<span class="ruby-identifier">artifact</span>)
622
+ <span class="ruby-identifier">debuglog</span> <span class="ruby-node">&quot;[DEBUG] DELETE Artifact #{artifact} at #{artifact.uri}!&quot;</span>
623
+ <span class="ruby-identifier">artifact</span>.<span class="ruby-identifier">delete</span>
624
+ <span class="ruby-keyword">end</span></pre>
625
+ </div>
626
+
627
+ </div>
628
+
629
+
630
+
631
+
632
+ </div>
633
+
634
+
635
+ <div id="method-i-discover_artifacts_from_search" class="method-detail ">
636
+
637
+ <div class="method-heading">
638
+ <span class="method-name">discover_artifacts_from_search</span><span
639
+ class="method-args">(artifact_list, threads: 4)</span>
640
+
641
+ <span class="method-click-advice">click to toggle source</span>
642
+
643
+ </div>
644
+
645
+
646
+ <div class="method-description">
647
+
648
+ <p>Given a list of Artifacts, fetch information about them and return a list
649
+ of <a
650
+ href="DiscoveredArtifact.html">Artifactory::Cleaner::DiscoveredArtifact</a>
651
+ instances</p>
652
+
653
+ <p>This is a helper function for <a
654
+ href="Controller.html#method-i-artifact_usage_search">artifact_usage_search</a></p>
655
+
656
+ <p>TODO: Document format of the `artifact_list` parameter</p>
657
+
658
+ <p>This method may throw network errors from the underlying <a
659
+ href="../../Artifactory.html">Artifactory</a> client</p>
660
+
661
+ <p>This method is multi-threaded and will spawn workers in order to make
662
+ multiple concurrent HTTP connections to the <a
663
+ href="../../Artifactory.html">Artifactory</a> API. The number of threads
664
+ can be tuned with the +`threads`+ parameter. Be careful not to cause
665
+ excessive load on the <a href="../../Artifactory.html">Artifactory</a> API!</p>
666
+
667
+
668
+
669
+
670
+ <div class="method-source-code" id="discover_artifacts_from_search-source">
671
+ <pre><span class="ruby-comment"># File lib/artifactory/cleaner/controller.rb, line 96</span>
672
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">discover_artifacts_from_search</span>(<span class="ruby-identifier">artifact_list</span>, <span class="ruby-value">threads:</span> <span class="ruby-value">4</span>)
673
+ <span class="ruby-identifier">result</span> = []
674
+ <span class="ruby-identifier">timing</span> = {}
675
+ <span class="ruby-comment">#kill_threads</span>
676
+ <span class="ruby-ivar">@num_workers</span> = <span class="ruby-identifier">threads</span>
677
+ <span class="ruby-identifier">timing</span>[<span class="ruby-value">:enqueue</span>] = <span class="ruby-constant">Benchmark</span>.<span class="ruby-identifier">measure</span> <span class="ruby-keyword">do</span>
678
+ <span class="ruby-identifier">artifact_list</span>.<span class="ruby-identifier">each</span> {<span class="ruby-operator">|</span><span class="ruby-identifier">a</span><span class="ruby-operator">|</span> <span class="ruby-identifier">queue_discovery_of_artifact</span> <span class="ruby-identifier">a</span>}
679
+ <span class="ruby-keyword">end</span>
680
+
681
+ <span class="ruby-identifier">timing</span>[<span class="ruby-value">:dequeue</span>] = <span class="ruby-constant">Benchmark</span>.<span class="ruby-identifier">measure</span> <span class="ruby-keyword">do</span>
682
+ <span class="ruby-keyword">until</span> <span class="ruby-ivar">@discovery_queues</span>.<span class="ruby-identifier">incoming</span>.<span class="ruby-identifier">empty?</span> <span class="ruby-keyword">and</span> <span class="ruby-ivar">@discovery_queues</span>.<span class="ruby-identifier">outgoing</span>.<span class="ruby-identifier">empty?</span> <span class="ruby-keyword">and</span> <span class="ruby-keyword">not</span> <span class="ruby-ivar">@workers</span>.<span class="ruby-identifier">any?</span> <span class="ruby-operator">&amp;</span><span class="ruby-value">:working?</span>
683
+ <span class="ruby-keyword">begin</span>
684
+ <span class="ruby-identifier">item</span> = <span class="ruby-ivar">@discovery_queues</span>.<span class="ruby-identifier">outgoing</span>.<span class="ruby-identifier">pop</span>
685
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">item</span>.<span class="ruby-identifier">kind_of?</span> <span class="ruby-constant">Artifactory</span><span class="ruby-operator">::</span><span class="ruby-constant">Resource</span><span class="ruby-operator">::</span><span class="ruby-constant">Artifact</span>
686
+ <span class="ruby-identifier">result</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">item</span>
687
+ <span class="ruby-comment">#debuglog &quot;[DEBUG] Discovered #{item} from a child thread&quot;</span>
688
+ <span class="ruby-keyword">elsif</span> <span class="ruby-identifier">item</span>.<span class="ruby-identifier">kind_of?</span> <span class="ruby-constant">Error</span>
689
+ <span class="ruby-constant">STDERR</span>.<span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;[ERROR] Error from artifact fetch: #{item}&quot;</span>
690
+ <span class="ruby-constant">STDERR</span>.<span class="ruby-identifier">puts</span> <span class="ruby-identifier">item</span>.<span class="ruby-identifier">full_message</span>
691
+ <span class="ruby-constant">STDERR</span>.<span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;Caused by #{item.cause.full_message}&quot;</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">item</span>.<span class="ruby-identifier">cause</span>
692
+ <span class="ruby-keyword">elsif</span> <span class="ruby-operator">!</span><span class="ruby-identifier">artifact</span>.<span class="ruby-identifier">nil?</span>
693
+ <span class="ruby-constant">STDERR</span>.<span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;[ERROR] Got #{item} back from the discovery queue, expected an Artifactory::Resource::Artifact&quot;</span>
694
+ <span class="ruby-keyword">end</span>
695
+ <span class="ruby-keyword">rescue</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-identifier">processing_ex</span>
696
+ <span class="ruby-constant">STDERR</span>.<span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;[ERROR] Caught an exception when processing from the outgoing discovery queue: #{processing_ex}&quot;</span>
697
+ <span class="ruby-constant">STDERR</span>.<span class="ruby-identifier">puts</span> <span class="ruby-identifier">processing_ex</span>.<span class="ruby-identifier">full_message</span>
698
+ <span class="ruby-constant">STDERR</span>.<span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;Caused by #{processing_ex.cause.full_message}&quot;</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">processing_ex</span>.<span class="ruby-identifier">cause</span>
699
+ <span class="ruby-keyword">end</span>
700
+ <span class="ruby-keyword">end</span>
701
+ <span class="ruby-keyword">end</span>
702
+
703
+ <span class="ruby-keyword">begin</span>
704
+ <span class="ruby-identifier">kill_threads</span>
705
+ <span class="ruby-keyword">rescue</span> <span class="ruby-operator">=&gt;</span> <span class="ruby-identifier">ex</span>
706
+ <span class="ruby-constant">STDERR</span>.<span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;[ERROR] Caught an exception when killing threads: #{ex}&quot;</span>
707
+ <span class="ruby-constant">STDERR</span>.<span class="ruby-identifier">puts</span> <span class="ruby-identifier">ex</span>.<span class="ruby-identifier">full_message</span>
708
+ <span class="ruby-constant">STDERR</span>.<span class="ruby-identifier">puts</span> <span class="ruby-node">&quot;Caused by #{ex.cause.full_message}&quot;</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">ex</span>.<span class="ruby-identifier">cause</span>
709
+ <span class="ruby-keyword">end</span>
710
+
711
+ <span class="ruby-identifier">debuglog</span>(<span class="ruby-node">&quot;[DEBUG][Perfdata] Enqueue URLs for workers to discover: #{timing[:enqueue]}&quot;</span>)
712
+ <span class="ruby-identifier">debuglog</span>(<span class="ruby-node">&quot;[DEBUG][Perfdata] Dequeue found Artifacts from workers: #{timing[:dequeue]}&quot;</span>)
713
+ <span class="ruby-identifier">total_time</span> = <span class="ruby-identifier">timing</span>.<span class="ruby-identifier">values</span>.<span class="ruby-identifier">reduce</span>(<span class="ruby-value">0</span>) {<span class="ruby-operator">|</span><span class="ruby-identifier">s</span>,<span class="ruby-identifier">t</span><span class="ruby-operator">|</span> <span class="ruby-identifier">s</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">t</span>.<span class="ruby-identifier">real</span>}
714
+ <span class="ruby-identifier">debuglog</span>(<span class="ruby-node">&quot;[DEBUG] #{result.length} artifacts fetched in #{total_time.round 2} seconds&quot;</span>)
715
+ <span class="ruby-identifier">result</span>
716
+ <span class="ruby-keyword">end</span></pre>
717
+ </div>
718
+
719
+ </div>
720
+
721
+
722
+
723
+
724
+ </div>
725
+
726
+
727
+ <div id="method-i-discover_repos" class="method-detail ">
728
+
729
+ <div class="method-heading">
730
+ <span class="method-name">discover_repos</span><span
731
+ class="method-args">()</span>
732
+
733
+ <span class="method-click-advice">click to toggle source</span>
734
+
735
+ </div>
736
+
737
+
738
+ <div class="method-description">
739
+
740
+ <p>Return an ordered structure of repositories from the <a
741
+ href="../../Artifactory.html">Artifactory</a> server.</p>
742
+
743
+ <p>This method will query <a href="../../Artifactory.html">Artifactory</a> and
744
+ fetch information about all available repositories. The result returned is
745
+ a Hash with three keys, one for each repo type: `:local`, `:remote` and
746
+ `:virtual` Under each of these keys is a hash mapping repo keys to their
747
+ Artifactory::Resource::Repository objects</p>
748
+
749
+ <p>This method may raise network errors from the underlying <a
750
+ href="../../Artifactory.html">Artifactory</a> client</p>
751
+
752
+ <p>This method is not multi-threaded</p>
753
+
754
+
755
+
756
+
757
+ <div class="method-source-code" id="discover_repos-source">
758
+ <pre><span class="ruby-comment"># File lib/artifactory/cleaner/controller.rb, line 57</span>
759
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">discover_repos</span>
760
+ <span class="ruby-identifier">timing</span> = {}
761
+ <span class="ruby-ivar">@repos</span> = {
762
+ <span class="ruby-value">local:</span> {},
763
+ <span class="ruby-value">remote:</span> {},
764
+ <span class="ruby-value">virtual:</span> {},
765
+ }
766
+ <span class="ruby-identifier">i</span> = <span class="ruby-value">0</span>
767
+ <span class="ruby-identifier">timing</span>[<span class="ruby-value">:loop</span>] = <span class="ruby-constant">Benchmark</span>.<span class="ruby-identifier">measure</span> <span class="ruby-keyword">do</span>
768
+ <span class="ruby-ivar">@artifactory_client</span>.<span class="ruby-identifier">repository_all</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">repo</span><span class="ruby-operator">|</span>
769
+ <span class="ruby-identifier">debuglog</span> <span class="ruby-node">&quot;[DEBUG] Found #{repo.package_type} repo: #{repo.key}&quot;</span>
770
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">repo</span>.<span class="ruby-identifier">rclass</span> <span class="ruby-operator">==</span> <span class="ruby-string">&#39;remote&#39;</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-identifier">repo</span>.<span class="ruby-identifier">url</span>
771
+ <span class="ruby-identifier">debuglog</span> <span class="ruby-node">&quot; +-&gt; repo #{repo.key} is a mirror of remote at #{repo.url}&quot;</span>
772
+ <span class="ruby-ivar">@repos</span>[<span class="ruby-value">:remote</span>][<span class="ruby-identifier">repo</span>.<span class="ruby-identifier">key</span>] = <span class="ruby-identifier">repo</span>
773
+ <span class="ruby-keyword">elsif</span> <span class="ruby-identifier">repo</span>.<span class="ruby-identifier">rclass</span> <span class="ruby-operator">==</span> <span class="ruby-string">&#39;virtual&#39;</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-identifier">repo</span>.<span class="ruby-identifier">repositories</span>
774
+ <span class="ruby-identifier">debuglog</span> <span class="ruby-node">&quot; +-&gt; repo #{repo.key} is a virtual repo containing: #{repo.repositories.join &#39;, &#39;}&quot;</span>
775
+ <span class="ruby-ivar">@repos</span>[<span class="ruby-value">:remote</span>][<span class="ruby-identifier">repo</span>.<span class="ruby-identifier">key</span>] = <span class="ruby-identifier">repo</span>
776
+ <span class="ruby-keyword">else</span>
777
+ <span class="ruby-ivar">@repos</span>[<span class="ruby-value">:local</span>][<span class="ruby-identifier">repo</span>.<span class="ruby-identifier">key</span>] = <span class="ruby-identifier">repo</span>
778
+ <span class="ruby-keyword">end</span>
779
+ <span class="ruby-identifier">i</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
780
+ <span class="ruby-keyword">end</span>
781
+ <span class="ruby-keyword">end</span>
782
+ <span class="ruby-identifier">debuglog</span>(<span class="ruby-node">&quot;[DEBUG][Perfdata] Fetched #{i} repos; timing: #{timing[:loop]}&quot;</span>)
783
+ <span class="ruby-ivar">@repos</span>
784
+ <span class="ruby-keyword">end</span></pre>
785
+ </div>
786
+
787
+ </div>
788
+
789
+
790
+
791
+
792
+ </div>
793
+
794
+
795
+ <div id="method-i-verbose-3D" class="method-detail ">
796
+
797
+ <div class="method-heading">
798
+ <span class="method-name">verbose=</span><span
799
+ class="method-args">(val)</span>
800
+
801
+ <span class="method-click-advice">click to toggle source</span>
802
+
803
+ </div>
804
+
805
+
806
+ <div class="method-description">
807
+
808
+ <p>Enable or disable verbose mode (see <a
809
+ href="Controller.html#method-i-verbose-3F">#verbose?</a>) When verbose mode
810
+ is enabled, the controller will print debugging and status information to
811
+ STDERR</p>
812
+
813
+
814
+
815
+
816
+ <div class="method-source-code" id="verbose-3D-source">
817
+ <pre><span class="ruby-comment"># File lib/artifactory/cleaner/controller.rb, line 43</span>
818
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">verbose=</span>(<span class="ruby-identifier">val</span>)
819
+ <span class="ruby-ivar">@verbose</span> = <span class="ruby-operator">!</span><span class="ruby-operator">!</span><span class="ruby-identifier">val</span>
820
+ <span class="ruby-keyword">end</span></pre>
821
+ </div>
822
+
823
+ </div>
824
+
825
+
826
+
827
+
828
+ </div>
829
+
830
+
831
+ <div id="method-i-verbose-3F" class="method-detail ">
832
+
833
+ <div class="method-heading">
834
+ <span class="method-name">verbose?</span><span
835
+ class="method-args">()</span>
836
+
837
+ <span class="method-click-advice">click to toggle source</span>
838
+
839
+ </div>
840
+
841
+
842
+ <div class="method-description">
843
+
844
+ <p>Is verbose output enabled? If so, the controller will print debugging and
845
+ status information to STDERR</p>
846
+
847
+
848
+
849
+
850
+ <div class="method-source-code" id="verbose-3F-source">
851
+ <pre><span class="ruby-comment"># File lib/artifactory/cleaner/controller.rb, line 36</span>
852
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">verbose?</span>
853
+ <span class="ruby-ivar">@verbose</span>
854
+ <span class="ruby-keyword">end</span></pre>
855
+ </div>
856
+
857
+ </div>
858
+
859
+
860
+
861
+
862
+ </div>
863
+
864
+
865
+ <div id="method-i-with_discovered_artifacts" class="method-detail ">
866
+
867
+ <div class="method-heading">
868
+ <span class="method-name">with_discovered_artifacts</span><span
869
+ class="method-args">(from: nil, to: nil, repos: nil, increment: 30 * 24 * 3600, threads: 4) { |pkg| ... }</span>
870
+
871
+ <span class="method-click-advice">click to toggle source</span>
872
+
873
+ </div>
874
+
875
+
876
+ <div class="method-description">
877
+
878
+ <p>Iterator method for an artifact search</p>
879
+
880
+ <p>the `with_discovered_artifacts` method is used to iterate over artifacts
881
+ from a search which potentially covers a large period of time. This method
882
+ will break the period up into small chunks of time defined by the
883
+ `increment` argument (defaulting to 30 days) and will perform multiple
884
+ searches to avoid large searches which may time out or overload the <a
885
+ href="../../Artifactory.html">Artifactory</a> server.</p>
886
+
887
+ <p>Pass a block and the block will be called with every <a
888
+ href="DiscoveredArtifact.html">Artifactory::Cleaner::DiscoveredArtifact</a>
889
+ that is found</p>
890
+
891
+ <p>This method is not mult-threaded however it calls <a
892
+ href="Controller.html#method-i-artifact_usage_search">#artifact_usage_search</a>
893
+ which is multi-threaded; number of threads is controlled by the `threads`
894
+ argument</p>
895
+
896
+ <p>This method calls <a
897
+ href="Controller.html#method-i-artifact_usage_search">#artifact_usage_search</a>
898
+ which may raise network exceptions</p>
899
+
900
+ <p>Params:</p>
901
+ <dl class="rdoc-list note-list"><dt><code>from</code>
902
+ <dd>
903
+ <p>Time instance for the start date of the search</p>
904
+ </dd><dt><code>to</code>
905
+ <dd>
906
+ <p>Time instance for the end date of the search; defaults to Time.now</p>
907
+ </dd><dt><code>repos</code>
908
+ <dd>
909
+ <p>Optional array of repository names to search within; searches all
910
+ repositories if omitted</p>
911
+ </dd><dt><code>increment</code>
912
+ <dd>
913
+ <p>Integer number of seconds to chunk the search period into, defaults to 30
914
+ days</p>
915
+ </dd><dt><code>threads</code>
916
+ <dd>
917
+ <p>Number of threads to use to fetch artifacts; defayult is 4 (passed to <a
918
+ href="Controller.html#method-i-artifact_usage_search">#artifact_usage_search</a>)</p>
919
+ </dd></dl>
920
+
921
+
922
+
923
+
924
+ <div class="method-source-code" id="with_discovered_artifacts-source">
925
+ <pre><span class="ruby-comment"># File lib/artifactory/cleaner/controller.rb, line 277</span>
926
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">with_discovered_artifacts</span>(<span class="ruby-value">from:</span> <span class="ruby-keyword">nil</span>, <span class="ruby-value">to:</span> <span class="ruby-keyword">nil</span>, <span class="ruby-value">repos:</span> <span class="ruby-keyword">nil</span>, <span class="ruby-value">increment:</span> <span class="ruby-value">30</span> <span class="ruby-operator">*</span> <span class="ruby-value">24</span> <span class="ruby-operator">*</span> <span class="ruby-value">3600</span>, <span class="ruby-value">threads:</span> <span class="ruby-value">4</span>)
927
+ <span class="ruby-identifier">chunk_end</span> = <span class="ruby-identifier">to</span> <span class="ruby-operator">||</span> <span class="ruby-constant">Time</span>.<span class="ruby-identifier">now</span>
928
+ <span class="ruby-keyword">while</span> <span class="ruby-identifier">chunk_end</span> <span class="ruby-operator">&gt;</span> <span class="ruby-identifier">from</span>
929
+ <span class="ruby-identifier">chunk_start</span> = <span class="ruby-identifier">chunk_end</span> <span class="ruby-operator">-</span> <span class="ruby-identifier">increment</span>
930
+ <span class="ruby-identifier">chunk_start</span> = <span class="ruby-identifier">from</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">chunk_start</span> <span class="ruby-operator">&lt;</span> <span class="ruby-identifier">from</span>
931
+ <span class="ruby-identifier">artifact_usage_search</span>(<span class="ruby-value">from:</span> <span class="ruby-identifier">chunk_start</span>, <span class="ruby-value">to:</span> <span class="ruby-identifier">chunk_end</span>, <span class="ruby-value">repos:</span> <span class="ruby-identifier">repos</span>, <span class="ruby-value">threads:</span> <span class="ruby-identifier">threads</span>).<span class="ruby-identifier">each</span> <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">pkg</span><span class="ruby-operator">|</span>
932
+ <span class="ruby-keyword">yield</span> <span class="ruby-identifier">pkg</span>
933
+ <span class="ruby-keyword">end</span>
934
+ <span class="ruby-identifier">chunk_end</span> = <span class="ruby-identifier">chunk_start</span>
935
+ <span class="ruby-keyword">end</span>
936
+ <span class="ruby-keyword">end</span></pre>
937
+ </div>
938
+
939
+ </div>
940
+
941
+
942
+
943
+
944
+ </div>
945
+
946
+
947
+ <div id="method-i-yaml_format" class="method-detail ">
948
+
949
+ <div class="method-heading">
950
+ <span class="method-name">yaml_format</span><span
951
+ class="method-args">(artifact, indent = 0)</span>
952
+
953
+ <span class="method-click-advice">click to toggle source</span>
954
+
955
+ </div>
956
+
957
+
958
+ <div class="method-description">
959
+
960
+ <p>Return a YAML representation of a module <a
961
+ href="DiscoveredArtifact.html">Artifactory::Cleaner::DiscoveredArtifact</a></p>
962
+
963
+ <p>Provide a <a
964
+ href="DiscoveredArtifact.html">Artifactory::Cleaner::DiscoveredArtifact</a>
965
+ and this method will return a String containing a YAML representation of
966
+ the properties of the <a
967
+ href="DiscoveredArtifact.html">DiscoveredArtifact</a>. If the `indent`
968
+ parameter is provided, then a YAML fragment will be returned, indented by
969
+ `indent` spaces. This allows for “streaming” a list of Artifact YAML to an
970
+ IOStream</p>
971
+
972
+
973
+
974
+
975
+ <div class="method-source-code" id="yaml_format-source">
976
+ <pre><span class="ruby-comment"># File lib/artifactory/cleaner/controller.rb, line 319</span>
977
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">yaml_format</span>(<span class="ruby-identifier">artifact</span>, <span class="ruby-identifier">indent</span> = <span class="ruby-value">0</span>)
978
+ <span class="ruby-identifier">properties</span> = [<span class="ruby-value">:uri</span>, <span class="ruby-value">:last_downloaded</span>, <span class="ruby-value">:repo</span>, <span class="ruby-value">:created</span>, <span class="ruby-value">:last_modified</span>, <span class="ruby-value">:last_updated</span>, <span class="ruby-value">:download_uri</span>, <span class="ruby-value">:mime_type</span>, <span class="ruby-value">:size</span>, <span class="ruby-value">:checksums</span> ]
979
+ <span class="ruby-identifier">result</span> = <span class="ruby-constant">YAML</span>.<span class="ruby-identifier">dump</span>(<span class="ruby-identifier">properties</span>.<span class="ruby-identifier">each_with_object</span>({}) {<span class="ruby-operator">|</span><span class="ruby-identifier">prop</span>,<span class="ruby-identifier">export</span><span class="ruby-operator">|</span> <span class="ruby-identifier">export</span>[<span class="ruby-identifier">prop</span>] = <span class="ruby-identifier">artifact</span>.<span class="ruby-identifier">send</span>(<span class="ruby-identifier">prop</span>) })
980
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">indent</span>
981
+ <span class="ruby-identifier">i</span> = <span class="ruby-value">0</span>
982
+ <span class="ruby-identifier">result</span>.<span class="ruby-identifier">each_line</span>.<span class="ruby-identifier">reduce</span>(<span class="ruby-string">&#39;&#39;</span>) <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">str</span>,<span class="ruby-identifier">line</span><span class="ruby-operator">|</span>
983
+ <span class="ruby-keyword">if</span> (<span class="ruby-identifier">i</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>) <span class="ruby-operator">&gt;</span> <span class="ruby-value">2</span>
984
+ <span class="ruby-identifier">str</span> <span class="ruby-operator">+</span> (<span class="ruby-string">&#39; &#39;</span> <span class="ruby-operator">*</span> <span class="ruby-identifier">indent</span>) <span class="ruby-operator">+</span> <span class="ruby-identifier">line</span>
985
+ <span class="ruby-keyword">elsif</span> <span class="ruby-identifier">i</span> <span class="ruby-operator">==</span> <span class="ruby-value">2</span>
986
+ <span class="ruby-identifier">str</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">line</span>
987
+ <span class="ruby-keyword">else</span>
988
+ <span class="ruby-identifier">str</span>
989
+ <span class="ruby-keyword">end</span>
990
+ <span class="ruby-keyword">end</span>
991
+ <span class="ruby-keyword">end</span>
992
+ <span class="ruby-keyword">end</span></pre>
993
+ </div>
994
+
995
+ </div>
996
+
997
+
998
+
999
+
1000
+ </div>
1001
+
1002
+
1003
+ </section>
1004
+
1005
+ </section>
1006
+ </main>
1007
+
1008
+
1009
+ <footer id="validator-badges" role="contentinfo">
1010
+ <p><a href="https://validator.w3.org/check/referer">Validate</a>
1011
+ <p>Generated by <a href="https://ruby.github.io/rdoc/">RDoc</a> 6.0.1.
1012
+ <p>Based on <a href="http://deveiate.org/projects/Darkfish-RDoc/">Darkfish</a> by <a href="http://deveiate.org">Michael Granger</a>.
1013
+ </footer>
1014
+