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,71 @@
1
+ require 'uri'
2
+ require 'artifactory'
3
+
4
+ module Artifactory
5
+ module Cleaner
6
+ ##
7
+ # An Artifact discovered during a repository search
8
+ #
9
+ # This class is a wrapper of Artifactory::Resource::Artifact because the parent class does not have a concept of
10
+ # `last_downloaded` nor the most recent date for any action on an Artifact. These are important to deciding if an
11
+ # Artifcat should be deleted
12
+ class DiscoveredArtifact < Artifactory::Resource::Artifact
13
+ ##
14
+ # Time representing the date and time this artifact was last downloaded by a client (presumably to be installed)
15
+ attribute :last_downloaded
16
+
17
+ ##
18
+ # What's the earliest Time of any of the date/time properties on this object?
19
+ def earliest_date
20
+ self.class.earliest_date_from(self)
21
+ end
22
+
23
+ ##
24
+ # What's the most recent Time of any of the date/time properties on this object?
25
+ def latest_date
26
+ self.class.latest_date_from(self)
27
+ end
28
+
29
+ ##
30
+ # The filename componet (basename) of this artifact's URL
31
+ def filename
32
+ uri = URI(self.uri)
33
+ File.basename(uri.path)
34
+ end
35
+
36
+ ##
37
+ # A string representation of this artifact
38
+ def to_s
39
+ "#<DiscoveredArtifact #{filename} last accessed #{latest_date}>"
40
+ end
41
+
42
+ ##
43
+ # Given an Artifactory::Resource::Artifact, return the value of the earliest date property on that object
44
+ #
45
+ # Designed to answer the question "what's the first time anything happened to a given Artifact?", this method
46
+ # returns the earliest (longest ago) date from the given artifact's created, last modified and last downloaded
47
+ # timestamps.
48
+ def self.earliest_date_from(artifact)
49
+ [
50
+ artifact.created,
51
+ artifact.last_modified,
52
+ artifact.respond_to?(:last_downloaded) ? artifact.last_downloaded : nil,
53
+ ].compact.sort.first
54
+ end
55
+
56
+ ##
57
+ # Given an Artifactory::Resource::Artifact, return the value of the latest date property on that object
58
+ #
59
+ # Designed to answer the question "what's the most recent interaction with a given Artifact?", this method
60
+ # returns the latest (most recent) date from the given artifact's created, last modified and last downloaded
61
+ # timestamps.
62
+ def self.latest_date_from(artifact)
63
+ [
64
+ artifact.created,
65
+ artifact.last_modified,
66
+ artifact.respond_to?(:last_downloaded) ? artifact.last_downloaded : nil,
67
+ ].compact.sort.last
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,126 @@
1
+ module Artifactory
2
+ module Cleaner
3
+ ##
4
+ # Helper class representing Threads spawned to discover Artifacts
5
+ class DiscoveryWorker
6
+ def initialize(processing_queues, artifactory_client)
7
+ @running = false
8
+ @working = false
9
+ @thread = nil
10
+ @queues = processing_queues
11
+ @artifactory_client = artifactory_client
12
+ end
13
+
14
+ ##
15
+ # Is this DiscoveryWorker running, listening to the queue and processing requests
16
+ def running?
17
+ @running
18
+ end
19
+
20
+ ##
21
+ # Is this DiscoveryWorker currently processing a request?
22
+ #
23
+ # when #running? is true and #working? is not, then the worker is idle, blocked, waiting for an action.
24
+ #
25
+ # when #working? is true, there will be at least one more result pushed to the outgoing queue when the current
26
+ # request finishes
27
+ def working?
28
+ @working
29
+ end
30
+
31
+ ##
32
+ # Is the Thread for this worker alive?
33
+ def alive?
34
+ @thread ? @thread.alive? : false
35
+ end
36
+
37
+ ##
38
+ # Start the DiscoveryWorker and begin processing from the queue
39
+ def start
40
+ @running = true
41
+ @thread = Thread.new do
42
+ while running?
43
+ process @queues.incoming.pop(false)
44
+ end
45
+ end
46
+ self
47
+ end
48
+
49
+ ##
50
+ # Stop the Thread and re-join the parent
51
+ def shutdown(timeout = 300)
52
+ @running = false
53
+ @thread.join(timeout) if @thread and @thread.alive?
54
+ end
55
+
56
+ ##
57
+ # Forcibly kill the Thread and destroy it
58
+ def stop
59
+ @running = false
60
+ @thread.kill if @thread and @thread.alive?
61
+ @thread = nil
62
+ end
63
+ alias_method :kill, :stop
64
+
65
+ ##
66
+ # String representation of this DiscoveryWorker and it's status
67
+ def to_s
68
+ "#<#{self.class}:#{self.object_id}; #{running? ? 'running' : 'not running'}, #{working? ? 'working' : 'idle'}, #{alive? ? 'alive' : 'dead'}>"
69
+ end
70
+
71
+ private
72
+
73
+ ##
74
+ # debug / verbose logging
75
+ # TODO: add a verbose conditional, maybe a different log destination
76
+ def log(msg)
77
+ STDERR.puts msg
78
+ end
79
+
80
+ ##
81
+ # pop from the incoming queue, process, push result to outgoing
82
+ def process(payload)
83
+ @working = true
84
+ begin
85
+ @queues.outgoing.push discover_artifact_from payload
86
+ rescue => ex
87
+ return ex # TODO: Should this be pushed to the outgoing queue instead?
88
+ ensure
89
+ @working = false
90
+ end
91
+ end
92
+
93
+ ##
94
+ # main method, given artifact info, generate a Artifactory::Cleaner::DiscoveredArtifact
95
+ #
96
+ # this method makes HTTP calls to the Artifactory API
97
+ def discover_artifact_from(artifact_info, retries = 10)
98
+ artifact = nil
99
+ while retries > 0
100
+ begin
101
+ retries -= 1
102
+ artifact = Artifactory::Cleaner::DiscoveredArtifact.from_url(artifact_info["uri"], client: @artifactory_client)
103
+ artifact.last_downloaded = Time.parse(artifact_info["lastDownloaded"]) unless artifact_info["lastDownloaded"].to_s.empty?
104
+ return artifact
105
+ rescue Net::OpenTimeout, Artifactory::Error::ConnectionError => err
106
+ artifact = err
107
+ if retries
108
+ log "[WARN] Connection Failure attempting to reach Artifactory API: #{err}; Retrying in 10 seconds"
109
+ sleep 10
110
+ end
111
+ rescue Artifactory::Error::HTTPError => err
112
+ artifact = err
113
+ if err.code == 404
114
+ log "[WARN] HTTP 404 Not Found fetching: #{artifact["uri"]}"
115
+ return nil
116
+ else
117
+ retries = min(retries, 1)
118
+ log "[ERROR] HTTP Error while fetching an artifact from a usage search: #{err}; #{retries ? 'Will' : 'Will not'} retry"
119
+ end
120
+ end
121
+ end
122
+ artifact
123
+ end
124
+ end
125
+ end
126
+ end
@@ -0,0 +1,21 @@
1
+ module Artifactory
2
+ module Cleaner
3
+ module Util
4
+ ##
5
+ # Given a size in bytes, return a "human readable" size with a unit suffix (MiB, GiB)
6
+ #
7
+ # Taken from https://stackoverflow.com/a/47486815/75801
8
+ # Used instead of a gem due to simplicity and speed
9
+ def self.filesize(size)
10
+ units = ['B', 'KiB', 'MiB', 'GiB', 'TiB', 'Pib', 'EiB']
11
+
12
+ return '0.0 B' if size == 0
13
+ exp = (Math.log(size) / Math.log(1024)).to_i
14
+ exp += 1 if (size.to_f / 1024 ** exp >= 1024 - 0.05)
15
+ exp = 6 if exp > 6
16
+
17
+ '%.1f %s' % [size.to_f / 1024 ** exp, units[exp]]
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,7 @@
1
+ module Artifactory
2
+ module Cleaner
3
+ ##
4
+ # Version number of the Artifactory::Cleaner gem
5
+ VERSION = "1.0.1"
6
+ end
7
+ end
metadata ADDED
@@ -0,0 +1,252 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: artifactory-cleaner
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Josh Gitlin
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2020-02-09 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: cucumber
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.3'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 1.3.20
23
+ type: :development
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '1.3'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 1.3.20
33
+ - !ruby/object:Gem::Dependency
34
+ name: aruba
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '0.14'
40
+ type: :development
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '0.14'
47
+ - !ruby/object:Gem::Dependency
48
+ name: rdoc
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ - !ruby/object:Gem::Dependency
62
+ name: thor
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: 1.0.1
68
+ type: :runtime
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: 1.0.1
75
+ - !ruby/object:Gem::Dependency
76
+ name: sysexits
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: 1.2.0
82
+ type: :runtime
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: 1.2.0
89
+ - !ruby/object:Gem::Dependency
90
+ name: artifactory
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ type: :runtime
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ description: Will provide maintainence tasks for Artifactory, like cleaning up old
104
+ artifacts
105
+ email:
106
+ - jgitlin@pinnacle21.com
107
+ executables:
108
+ - artifactory-cleaner
109
+ extensions: []
110
+ extra_rdoc_files: []
111
+ files:
112
+ - ".gitignore"
113
+ - ".idea/.gitignore"
114
+ - ".idea/checkstyle-idea.xml"
115
+ - ".idea/dictionaries/jgitlin.xml"
116
+ - ".idea/misc.xml"
117
+ - ".idea/modules.xml"
118
+ - ".idea/vcs.xml"
119
+ - ".rspec"
120
+ - ".rspec_status"
121
+ - ".travis.yml"
122
+ - CODE_OF_CONDUCT.md
123
+ - Gemfile
124
+ - README.md
125
+ - Rakefile
126
+ - artifactory-cleaner.gemspec
127
+ - artifactory-cleaner.iml
128
+ - bin/console
129
+ - bin/setup
130
+ - doc/rdoc/Artifactory.html
131
+ - doc/rdoc/Artifactory/Cleaner.html
132
+ - doc/rdoc/Artifactory/Cleaner/ArtifactBucket.html
133
+ - doc/rdoc/Artifactory/Cleaner/ArtifactBucketCollection.html
134
+ - doc/rdoc/Artifactory/Cleaner/ArtifactFilter.html
135
+ - doc/rdoc/Artifactory/Cleaner/ArtifactFilterRule.html
136
+ - doc/rdoc/Artifactory/Cleaner/CLI.html
137
+ - doc/rdoc/Artifactory/Cleaner/Controller.html
138
+ - doc/rdoc/Artifactory/Cleaner/DiscoveredArtifact.html
139
+ - doc/rdoc/Artifactory/Cleaner/DiscoveryWorker.html
140
+ - doc/rdoc/Artifactory/Cleaner/Error.html
141
+ - doc/rdoc/Artifactory/Cleaner/SpecHelpers.html
142
+ - doc/rdoc/Artifactory/Cleaner/Util.html
143
+ - doc/rdoc/CODE_OF_CONDUCT_md.html
144
+ - doc/rdoc/Float.html
145
+ - doc/rdoc/Gemfile.html
146
+ - doc/rdoc/Gemfile_lock.html
147
+ - doc/rdoc/Object.html
148
+ - doc/rdoc/README_md.html
149
+ - doc/rdoc/Rakefile.html
150
+ - doc/rdoc/artifactory-cleaner_gemspec.html
151
+ - doc/rdoc/artifactory-cleaner_iml.html
152
+ - doc/rdoc/bin/setup.html
153
+ - doc/rdoc/created.rid
154
+ - doc/rdoc/css/fonts.css
155
+ - doc/rdoc/css/rdoc.css
156
+ - doc/rdoc/filterlist_yaml.html
157
+ - doc/rdoc/filters/clean-amzn_yaml.html
158
+ - doc/rdoc/filters/snapshots_yaml.html
159
+ - doc/rdoc/filters/test-filter_yaml.html
160
+ - doc/rdoc/filters/yum-test_yaml.html
161
+ - doc/rdoc/fonts/Lato-Light.ttf
162
+ - doc/rdoc/fonts/Lato-LightItalic.ttf
163
+ - doc/rdoc/fonts/Lato-Regular.ttf
164
+ - doc/rdoc/fonts/Lato-RegularItalic.ttf
165
+ - doc/rdoc/fonts/SourceCodePro-Bold.ttf
166
+ - doc/rdoc/fonts/SourceCodePro-Regular.ttf
167
+ - doc/rdoc/images/add.png
168
+ - doc/rdoc/images/arrow_up.png
169
+ - doc/rdoc/images/brick.png
170
+ - doc/rdoc/images/brick_link.png
171
+ - doc/rdoc/images/bug.png
172
+ - doc/rdoc/images/bullet_black.png
173
+ - doc/rdoc/images/bullet_toggle_minus.png
174
+ - doc/rdoc/images/bullet_toggle_plus.png
175
+ - doc/rdoc/images/date.png
176
+ - doc/rdoc/images/delete.png
177
+ - doc/rdoc/images/find.png
178
+ - doc/rdoc/images/loadingAnimation.gif
179
+ - doc/rdoc/images/macFFBgHack.png
180
+ - doc/rdoc/images/package.png
181
+ - doc/rdoc/images/page_green.png
182
+ - doc/rdoc/images/page_white_text.png
183
+ - doc/rdoc/images/page_white_width.png
184
+ - doc/rdoc/images/plugin.png
185
+ - doc/rdoc/images/ruby.png
186
+ - doc/rdoc/images/tag_blue.png
187
+ - doc/rdoc/images/tag_green.png
188
+ - doc/rdoc/images/transparent.png
189
+ - doc/rdoc/images/wrench.png
190
+ - doc/rdoc/images/wrench_orange.png
191
+ - doc/rdoc/images/zoom.png
192
+ - doc/rdoc/index.html
193
+ - doc/rdoc/js/darkfish.js
194
+ - doc/rdoc/js/jquery.js
195
+ - doc/rdoc/js/navigation.js
196
+ - doc/rdoc/js/navigation.js.gz
197
+ - doc/rdoc/js/search.js
198
+ - doc/rdoc/js/search_index.js
199
+ - doc/rdoc/js/search_index.js.gz
200
+ - doc/rdoc/js/searcher.js
201
+ - doc/rdoc/js/searcher.js.gz
202
+ - doc/rdoc/results/archive-test-4_log.html
203
+ - doc/rdoc/results/buckets-2020-01-31_txt.html
204
+ - doc/rdoc/results/clean-test-2_log.html
205
+ - doc/rdoc/results/clean-test-3_log.html
206
+ - doc/rdoc/results/clean-test-5_log.html
207
+ - doc/rdoc/results/clean-test-6_log.html
208
+ - doc/rdoc/results/clean-test-7_log.html
209
+ - doc/rdoc/results/clean-test-8-real_log.html
210
+ - doc/rdoc/results/clean-test-9_log.html
211
+ - doc/rdoc/results/clean-test1_log.html
212
+ - doc/rdoc/results/yum-test_2020-01-31_log.html
213
+ - doc/rdoc/results/yum-test_dry-run_log.html
214
+ - doc/rdoc/table_of_contents.html
215
+ - exe/artifactory-cleaner
216
+ - lib/artifactory/cleaner.rb
217
+ - lib/artifactory/cleaner/artifact_bucket.rb
218
+ - lib/artifactory/cleaner/artifact_bucket_collection.rb
219
+ - lib/artifactory/cleaner/artifact_filter.rb
220
+ - lib/artifactory/cleaner/artifact_filter_rule.rb
221
+ - lib/artifactory/cleaner/cli.rb
222
+ - lib/artifactory/cleaner/controller.rb
223
+ - lib/artifactory/cleaner/discovered_artifact.rb
224
+ - lib/artifactory/cleaner/discovery_worker.rb
225
+ - lib/artifactory/cleaner/util.rb
226
+ - lib/artifactory/cleaner/version.rb
227
+ homepage: https://bitbucket.org/pinnacle21/artifactory-cleaner/src/master/
228
+ licenses:
229
+ - MIT
230
+ metadata:
231
+ source_code_uri: https://bitbucket.org/pinnacle21/artifactory-cleaner/src/master/
232
+ post_install_message:
233
+ rdoc_options: []
234
+ require_paths:
235
+ - lib
236
+ required_ruby_version: !ruby/object:Gem::Requirement
237
+ requirements:
238
+ - - ">="
239
+ - !ruby/object:Gem::Version
240
+ version: 2.3.0
241
+ required_rubygems_version: !ruby/object:Gem::Requirement
242
+ requirements:
243
+ - - ">="
244
+ - !ruby/object:Gem::Version
245
+ version: '0'
246
+ requirements: []
247
+ rubyforge_project:
248
+ rubygems_version: 2.7.6.2
249
+ signing_key:
250
+ specification_version: 4
251
+ summary: Performs maintainence tasks on Artifactory repositories
252
+ test_files: []