artifactory 2.5.2 → 2.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +3 -2
- data/CHANGELOG.md +6 -0
- data/Gemfile +9 -13
- data/README.md +10 -1
- data/Rakefile +16 -7
- data/appveyor.yml +4 -2
- data/artifactory.gemspec +14 -14
- data/lib/artifactory.rb +26 -26
- data/lib/artifactory/client.rb +25 -23
- data/lib/artifactory/configurable.rb +1 -0
- data/lib/artifactory/defaults.rb +24 -15
- data/lib/artifactory/errors.rb +2 -2
- data/lib/artifactory/resources/artifact.rb +34 -33
- data/lib/artifactory/resources/backup.rb +5 -5
- data/lib/artifactory/resources/base.rb +7 -7
- data/lib/artifactory/resources/build.rb +15 -15
- data/lib/artifactory/resources/build_component.rb +4 -4
- data/lib/artifactory/resources/group.rb +4 -4
- data/lib/artifactory/resources/layout.rb +3 -3
- data/lib/artifactory/resources/ldap_setting.rb +7 -6
- data/lib/artifactory/resources/mail_server.rb +3 -3
- data/lib/artifactory/resources/permission_target.rb +20 -20
- data/lib/artifactory/resources/plugin.rb +1 -1
- data/lib/artifactory/resources/repository.rb +20 -20
- data/lib/artifactory/resources/system.rb +6 -6
- data/lib/artifactory/resources/url_base.rb +4 -3
- data/lib/artifactory/resources/user.rb +4 -4
- data/lib/artifactory/util.rb +10 -10
- data/lib/artifactory/version.rb +1 -1
- data/spec/integration/resources/artifact_spec.rb +31 -31
- data/spec/integration/resources/backup.rb +7 -7
- data/spec/integration/resources/build_component_spec.rb +18 -18
- data/spec/integration/resources/build_spec.rb +15 -15
- data/spec/integration/resources/group_spec.rb +16 -16
- data/spec/integration/resources/layout_spec.rb +7 -7
- data/spec/integration/resources/ldap_setting_spec.rb +7 -7
- data/spec/integration/resources/mail_server_spec.rb +7 -7
- data/spec/integration/resources/permission_target_spec.rb +35 -35
- data/spec/integration/resources/repository_spec.rb +14 -14
- data/spec/integration/resources/system_spec.rb +20 -21
- data/spec/integration/resources/url_base_spec.rb +7 -7
- data/spec/integration/resources/user_spec.rb +16 -16
- data/spec/spec_helper.rb +11 -11
- data/spec/support/api_server.rb +13 -13
- data/spec/support/api_server/artifact_endpoints.rb +94 -94
- data/spec/support/api_server/build_component_endpoints.rb +18 -18
- data/spec/support/api_server/build_endpoints.rb +76 -76
- data/spec/support/api_server/group_endpoints.rb +24 -24
- data/spec/support/api_server/permission_target_endpoints.rb +24 -24
- data/spec/support/api_server/repository_endpoints.rb +82 -82
- data/spec/support/api_server/status_endpoints.rb +5 -5
- data/spec/support/api_server/system_endpoints.rb +17 -18
- data/spec/support/api_server/user_endpoints.rb +30 -30
- data/spec/unit/artifactory_spec.rb +17 -17
- data/spec/unit/client_spec.rb +43 -43
- data/spec/unit/resources/artifact_spec.rb +256 -256
- data/spec/unit/resources/backup_spec.rb +8 -8
- data/spec/unit/resources/base_spec.rb +51 -51
- data/spec/unit/resources/build_component_spec.rb +45 -45
- data/spec/unit/resources/build_spec.rb +98 -98
- data/spec/unit/resources/defaults_spec.rb +4 -4
- data/spec/unit/resources/group_spec.rb +36 -36
- data/spec/unit/resources/layout_spec.rb +8 -8
- data/spec/unit/resources/ldap_setting_spec.rb +8 -8
- data/spec/unit/resources/mail_server_spec.rb +8 -8
- data/spec/unit/resources/permission_target_spec.rb +79 -79
- data/spec/unit/resources/plugin_spec.rb +7 -7
- data/spec/unit/resources/repository_spec.rb +98 -98
- data/spec/unit/resources/system_spec.rb +30 -30
- data/spec/unit/resources/url_base_spec.rb +8 -8
- data/spec/unit/resources/user_spec.rb +40 -40
- metadata +3 -3
@@ -14,7 +14,7 @@
|
|
14
14
|
# limitations under the License.
|
15
15
|
#
|
16
16
|
|
17
|
-
require
|
17
|
+
require "rexml/document"
|
18
18
|
|
19
19
|
module Artifactory
|
20
20
|
class Resource::Layout < Resource::Base
|
@@ -33,7 +33,7 @@ module Artifactory
|
|
33
33
|
#
|
34
34
|
def all(options = {})
|
35
35
|
config = Resource::System.configuration(options)
|
36
|
-
list_from_config(
|
36
|
+
list_from_config("config/repoLayouts/repoLayout", config, options)
|
37
37
|
end
|
38
38
|
|
39
39
|
#
|
@@ -63,7 +63,7 @@ module Artifactory
|
|
63
63
|
end
|
64
64
|
end
|
65
65
|
|
66
|
-
attribute :name, ->{ raise
|
66
|
+
attribute :name, -> { raise "Name missing!" }
|
67
67
|
attribute :artifact_path_pattern
|
68
68
|
attribute :distinctive_descriptor_path_pattern, true
|
69
69
|
attribute :descriptor_path_pattern
|
@@ -14,7 +14,7 @@
|
|
14
14
|
# limitations under the License.
|
15
15
|
#
|
16
16
|
|
17
|
-
require
|
17
|
+
require "rexml/document"
|
18
18
|
|
19
19
|
module Artifactory
|
20
20
|
class Resource::LDAPSetting < Resource::Base
|
@@ -33,7 +33,7 @@ module Artifactory
|
|
33
33
|
#
|
34
34
|
def all(options = {})
|
35
35
|
config = Resource::System.configuration(options)
|
36
|
-
list_from_config(
|
36
|
+
list_from_config("config/security/ldapSettings/ldapSetting", config, options)
|
37
37
|
end
|
38
38
|
|
39
39
|
#
|
@@ -63,6 +63,7 @@ module Artifactory
|
|
63
63
|
end
|
64
64
|
|
65
65
|
private
|
66
|
+
|
66
67
|
#
|
67
68
|
# List all the child text elements in the Artifactory configuration file
|
68
69
|
# of a node matching the specified xpath
|
@@ -78,7 +79,7 @@ module Artifactory
|
|
78
79
|
#
|
79
80
|
def list_from_config(xpath, config, options = {})
|
80
81
|
REXML::XPath.match(config, xpath).map do |r|
|
81
|
-
hash = Util.xml_to_hash(r,
|
82
|
+
hash = Util.xml_to_hash(r, "search")
|
82
83
|
from_hash(hash, options)
|
83
84
|
end
|
84
85
|
end
|
@@ -99,7 +100,7 @@ module Artifactory
|
|
99
100
|
def find_from_config(xpath, config, options = {})
|
100
101
|
name_node = REXML::XPath.match(config, xpath)
|
101
102
|
return nil if name_node.empty?
|
102
|
-
properties = Util.xml_to_hash(name_node[0].parent,
|
103
|
+
properties = Util.xml_to_hash(name_node[0].parent, "search")
|
103
104
|
from_hash(properties, options)
|
104
105
|
end
|
105
106
|
end
|
@@ -107,7 +108,7 @@ module Artifactory
|
|
107
108
|
# Ordered to match the artifactory xsd to make consuming the attributes
|
108
109
|
# hash when writing artifactory xml more convenient.
|
109
110
|
# http://bit.ly/UHMrHc
|
110
|
-
attribute :key, ->{ raise
|
111
|
+
attribute :key, -> { raise "name missing!" }
|
111
112
|
attribute :enabled, true
|
112
113
|
attribute :ldap_url
|
113
114
|
attribute :search_filter
|
@@ -116,6 +117,6 @@ module Artifactory
|
|
116
117
|
attribute :manager_dn
|
117
118
|
attribute :manager_password
|
118
119
|
attribute :auto_create_user
|
119
|
-
attribute :email_attribute,
|
120
|
+
attribute :email_attribute, "mail"
|
120
121
|
end
|
121
122
|
end
|
@@ -14,7 +14,7 @@
|
|
14
14
|
# limitations under the License.
|
15
15
|
#
|
16
16
|
|
17
|
-
require
|
17
|
+
require "rexml/document"
|
18
18
|
|
19
19
|
module Artifactory
|
20
20
|
class Resource::MailServer < Resource::Base
|
@@ -33,7 +33,7 @@ module Artifactory
|
|
33
33
|
#
|
34
34
|
def all(options = {})
|
35
35
|
config = Resource::System.configuration(options)
|
36
|
-
list_from_config(
|
36
|
+
list_from_config("config/mailServer", config, options)
|
37
37
|
end
|
38
38
|
|
39
39
|
#
|
@@ -64,7 +64,7 @@ module Artifactory
|
|
64
64
|
end
|
65
65
|
|
66
66
|
attribute :enabled
|
67
|
-
attribute :host, ->{ raise
|
67
|
+
attribute :host, -> { raise "host missing!" }
|
68
68
|
attribute :port
|
69
69
|
attribute :username
|
70
70
|
attribute :password
|
@@ -1,11 +1,11 @@
|
|
1
1
|
module Artifactory
|
2
2
|
class Resource::PermissionTarget < Resource::Base
|
3
3
|
VERBOSE_PERMS = {
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
4
|
+
"d" => "delete",
|
5
|
+
"m" => "admin",
|
6
|
+
"n" => "annotate",
|
7
|
+
"r" => "read",
|
8
|
+
"w" => "deploy",
|
9
9
|
}
|
10
10
|
class << self
|
11
11
|
#
|
@@ -22,8 +22,8 @@ module Artifactory
|
|
22
22
|
#
|
23
23
|
def all(options = {})
|
24
24
|
client = extract_client!(options)
|
25
|
-
client.get(
|
26
|
-
from_url(hash[
|
25
|
+
client.get("/api/security/permissions").map do |hash|
|
26
|
+
from_url(hash["uri"], client: client)
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
@@ -61,7 +61,7 @@ module Artifactory
|
|
61
61
|
#
|
62
62
|
def from_hash(hash, options = {})
|
63
63
|
super.tap do |instance|
|
64
|
-
%w
|
64
|
+
%w{users groups}.each do |key|
|
65
65
|
if instance.principals[key] && !instance.principals[key].nil?
|
66
66
|
instance.principals[key] = Hash[instance.principals[key].map { |k, v| [k, verbose(v)] } ]
|
67
67
|
end
|
@@ -93,7 +93,7 @@ module Artifactory
|
|
93
93
|
# @return [Hash]
|
94
94
|
#
|
95
95
|
def to_abbreviated
|
96
|
-
{
|
96
|
+
{ "users" => abbreviate_principal(@users), "groups" => abbreviate_principal(@groups) }
|
97
97
|
end
|
98
98
|
|
99
99
|
private
|
@@ -103,7 +103,7 @@ module Artifactory
|
|
103
103
|
#
|
104
104
|
def abbreviate_permissions(array)
|
105
105
|
inverse = VERBOSE_PERMS.invert
|
106
|
-
if (inverse.keys & array).sort != array.sort
|
106
|
+
if (inverse.keys & array).sort != array.sort
|
107
107
|
raise "One of your principals contains an invalid permission. Valid permissions are #{inverse.keys.join(', ')}"
|
108
108
|
end
|
109
109
|
array.map { |elt| inverse[elt] }.sort
|
@@ -117,14 +117,14 @@ module Artifactory
|
|
117
117
|
end
|
118
118
|
end
|
119
119
|
|
120
|
-
attribute :name, ->{ raise
|
121
|
-
attribute :includes_pattern,
|
122
|
-
attribute :excludes_pattern,
|
120
|
+
attribute :name, -> { raise "Name missing!" }
|
121
|
+
attribute :includes_pattern, "**"
|
122
|
+
attribute :excludes_pattern, ""
|
123
123
|
attribute :repositories
|
124
|
-
attribute :principals, {
|
124
|
+
attribute :principals, { "users" => {}, "groups" => {} }
|
125
125
|
|
126
126
|
def client_principal
|
127
|
-
@client_principal ||= Principal.new(principals[
|
127
|
+
@client_principal ||= Principal.new(principals["users"], principals["groups"])
|
128
128
|
end
|
129
129
|
|
130
130
|
#
|
@@ -136,9 +136,9 @@ module Artifactory
|
|
136
136
|
#
|
137
137
|
def delete
|
138
138
|
client.delete(api_path)
|
139
|
-
|
140
|
-
|
141
|
-
|
139
|
+
true
|
140
|
+
rescue Error::HTTPError
|
141
|
+
false
|
142
142
|
end
|
143
143
|
|
144
144
|
#
|
@@ -148,7 +148,7 @@ module Artifactory
|
|
148
148
|
# @return [Boolean]
|
149
149
|
#
|
150
150
|
def save
|
151
|
-
send("
|
151
|
+
send("principals=", client_principal.to_abbreviated)
|
152
152
|
client.put(api_path, to_json, headers)
|
153
153
|
true
|
154
154
|
end
|
@@ -199,7 +199,7 @@ module Artifactory
|
|
199
199
|
#
|
200
200
|
def headers
|
201
201
|
@headers ||= {
|
202
|
-
|
202
|
+
"Content-Type" => "application/vnd.org.jfrog.artifactory.security.PermissionTarget+json",
|
203
203
|
}
|
204
204
|
end
|
205
205
|
end
|
@@ -31,8 +31,8 @@ module Artifactory
|
|
31
31
|
#
|
32
32
|
def all(options = {})
|
33
33
|
client = extract_client!(options)
|
34
|
-
client.get(
|
35
|
-
find(hash[
|
34
|
+
client.get("/api/repositories").map do |hash|
|
35
|
+
find(hash["key"], client: client)
|
36
36
|
end.compact
|
37
37
|
end
|
38
38
|
|
@@ -67,21 +67,21 @@ module Artifactory
|
|
67
67
|
|
68
68
|
attribute :blacked_out, false
|
69
69
|
attribute :description
|
70
|
-
attribute :checksum_policy_type,
|
71
|
-
attribute :excludes_pattern,
|
70
|
+
attribute :checksum_policy_type, "client-checksums"
|
71
|
+
attribute :excludes_pattern, ""
|
72
72
|
attribute :handle_releases, true
|
73
73
|
attribute :handle_snapshots, true
|
74
|
-
attribute :includes_pattern,
|
75
|
-
attribute :key, ->{ raise
|
74
|
+
attribute :includes_pattern, "**/*"
|
75
|
+
attribute :key, -> { raise "Key is missing!" }
|
76
76
|
attribute :max_unique_snapshots, 0
|
77
77
|
attribute :notes
|
78
|
-
attribute :package_type,
|
78
|
+
attribute :package_type, "generic"
|
79
79
|
attribute :property_sets, []
|
80
|
-
attribute :repo_layout_ref,
|
81
|
-
attribute :rclass,
|
82
|
-
attribute :snapshot_version_behavior,
|
80
|
+
attribute :repo_layout_ref, "simple-default"
|
81
|
+
attribute :rclass, "local"
|
82
|
+
attribute :snapshot_version_behavior, "non-unique"
|
83
83
|
attribute :suppress_pom_consistency_checks, false
|
84
|
-
attribute :url,
|
84
|
+
attribute :url, ""
|
85
85
|
attribute :yum_root_depth, 0
|
86
86
|
attribute :calculate_yum_metadata, false
|
87
87
|
|
@@ -154,7 +154,7 @@ module Artifactory
|
|
154
154
|
#
|
155
155
|
def artifacts
|
156
156
|
@artifacts ||= Collection::Artifact.new(self, repos: key) do
|
157
|
-
Resource::Artifact.search(name:
|
157
|
+
Resource::Artifact.search(name: ".*", repos: key)
|
158
158
|
end
|
159
159
|
end
|
160
160
|
|
@@ -169,7 +169,7 @@ module Artifactory
|
|
169
169
|
includeRootPath: 0,
|
170
170
|
})
|
171
171
|
|
172
|
-
response[
|
172
|
+
response["children"]
|
173
173
|
end
|
174
174
|
|
175
175
|
#
|
@@ -204,7 +204,7 @@ module Artifactory
|
|
204
204
|
#
|
205
205
|
def headers
|
206
206
|
@headers ||= {
|
207
|
-
|
207
|
+
"Content-Type" => content_type,
|
208
208
|
}
|
209
209
|
end
|
210
210
|
|
@@ -216,12 +216,12 @@ module Artifactory
|
|
216
216
|
#
|
217
217
|
def content_type
|
218
218
|
case rclass.to_s.downcase
|
219
|
-
when
|
220
|
-
|
221
|
-
when
|
222
|
-
|
223
|
-
when
|
224
|
-
|
219
|
+
when "local"
|
220
|
+
"application/vnd.org.jfrog.artifactory.repositories.LocalRepositoryConfiguration+json"
|
221
|
+
when "remote"
|
222
|
+
"application/vnd.org.jfrog.artifactory.repositories.RemoteRepositoryConfiguration+json"
|
223
|
+
when "virtual"
|
224
|
+
"application/vnd.org.jfrog.artifactory.repositories.VirtualRepositoryConfiguration+json"
|
225
225
|
else
|
226
226
|
raise "Unknown Repository type `#{rclass}'!"
|
227
227
|
end
|
@@ -34,7 +34,7 @@ module Artifactory
|
|
34
34
|
#
|
35
35
|
def info(options = {})
|
36
36
|
client = extract_client!(options)
|
37
|
-
client.get(
|
37
|
+
client.get("/api/system")
|
38
38
|
end
|
39
39
|
|
40
40
|
#
|
@@ -59,7 +59,7 @@ module Artifactory
|
|
59
59
|
#
|
60
60
|
def ping(options = {})
|
61
61
|
client = extract_client!(options)
|
62
|
-
!!client.get(
|
62
|
+
!!client.get("/api/system/ping")
|
63
63
|
rescue Error::ConnectionError
|
64
64
|
false
|
65
65
|
end
|
@@ -81,7 +81,7 @@ module Artifactory
|
|
81
81
|
#
|
82
82
|
def configuration(options = {})
|
83
83
|
client = extract_client!(options)
|
84
|
-
response = client.get(
|
84
|
+
response = client.get("/api/system/configuration")
|
85
85
|
|
86
86
|
REXML::Document.new(response)
|
87
87
|
end
|
@@ -106,8 +106,8 @@ module Artifactory
|
|
106
106
|
|
107
107
|
# The Artifactory api requires a content type of 'application/xml'.
|
108
108
|
# See http://bit.ly/1l2IvZY
|
109
|
-
headers = {
|
110
|
-
client.post(
|
109
|
+
headers = { "Content-Type" => "application/xml" }
|
110
|
+
client.post("/api/system/configuration", xml, headers)
|
111
111
|
end
|
112
112
|
|
113
113
|
#
|
@@ -127,7 +127,7 @@ module Artifactory
|
|
127
127
|
#
|
128
128
|
def version(options = {})
|
129
129
|
client = extract_client!(options)
|
130
|
-
client.get(
|
130
|
+
client.get("/api/system/version")
|
131
131
|
end
|
132
132
|
end
|
133
133
|
end
|
@@ -14,7 +14,7 @@
|
|
14
14
|
# limitations under the License.
|
15
15
|
#
|
16
16
|
|
17
|
-
require
|
17
|
+
require "rexml/document"
|
18
18
|
|
19
19
|
module Artifactory
|
20
20
|
class Resource::URLBase < Resource::Base
|
@@ -33,7 +33,7 @@ module Artifactory
|
|
33
33
|
#
|
34
34
|
def all(options = {})
|
35
35
|
config = Resource::System.configuration(options)
|
36
|
-
simple_text_from_config(
|
36
|
+
simple_text_from_config("config/urlBase", config, options)
|
37
37
|
end
|
38
38
|
|
39
39
|
#
|
@@ -63,6 +63,7 @@ module Artifactory
|
|
63
63
|
end
|
64
64
|
|
65
65
|
private
|
66
|
+
|
66
67
|
#
|
67
68
|
# List all the text elements in the Artifactory configuration file
|
68
69
|
# matching the given xpath. Ignore any children of elements that match the xpath.
|
@@ -85,6 +86,6 @@ module Artifactory
|
|
85
86
|
end
|
86
87
|
end
|
87
88
|
|
88
|
-
attribute :url_base, ->{ raise
|
89
|
+
attribute :url_base, -> { raise "URL base missing!" }
|
89
90
|
end
|
90
91
|
end
|
@@ -31,8 +31,8 @@ module Artifactory
|
|
31
31
|
#
|
32
32
|
def all(options = {})
|
33
33
|
client = extract_client!(options)
|
34
|
-
client.get(
|
35
|
-
from_url(hash[
|
34
|
+
client.get("/api/security/users").map do |hash|
|
35
|
+
from_url(hash["uri"], client: client)
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
@@ -70,7 +70,7 @@ module Artifactory
|
|
70
70
|
attribute :groups, []
|
71
71
|
attribute :internal_password_disabled, false
|
72
72
|
attribute :last_logged_in
|
73
|
-
attribute :name, -> { raise
|
73
|
+
attribute :name, -> { raise "Name missing" }
|
74
74
|
attribute :password # write only, never returned
|
75
75
|
attribute :profile_updatable, true
|
76
76
|
attribute :realm
|
@@ -122,7 +122,7 @@ module Artifactory
|
|
122
122
|
#
|
123
123
|
def headers
|
124
124
|
@headers ||= {
|
125
|
-
|
125
|
+
"Content-Type" => "application/vnd.org.jfrog.artifactory.security.User+json",
|
126
126
|
}
|
127
127
|
end
|
128
128
|
end
|
data/lib/artifactory/util.rb
CHANGED
@@ -30,10 +30,10 @@ module Artifactory
|
|
30
30
|
def underscore(string)
|
31
31
|
string
|
32
32
|
.to_s
|
33
|
-
.gsub(/::/,
|
34
|
-
.gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2')
|
35
|
-
.gsub(/([a-z\d])([A-Z])/,'\1_\2')
|
36
|
-
.tr(
|
33
|
+
.gsub(/::/, "/")
|
34
|
+
.gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
|
35
|
+
.gsub(/([a-z\d])([A-Z])/, '\1_\2')
|
36
|
+
.tr("-", "_")
|
37
37
|
.downcase
|
38
38
|
end
|
39
39
|
|
@@ -48,12 +48,12 @@ module Artifactory
|
|
48
48
|
def camelize(string, lowercase = false)
|
49
49
|
result = string
|
50
50
|
.to_s
|
51
|
-
.split(
|
51
|
+
.split("_")
|
52
52
|
.map { |e| e.capitalize }
|
53
53
|
.join
|
54
54
|
|
55
55
|
if lowercase
|
56
|
-
result[0,1].downcase + result[1..-1]
|
56
|
+
result[0, 1].downcase + result[1..-1]
|
57
57
|
else
|
58
58
|
result
|
59
59
|
end
|
@@ -71,7 +71,7 @@ module Artifactory
|
|
71
71
|
length = options[:length] || 30
|
72
72
|
|
73
73
|
if string.length > length
|
74
|
-
string[0..length-3] +
|
74
|
+
string[0..length - 3] + "..."
|
75
75
|
else
|
76
76
|
string
|
77
77
|
end
|
@@ -119,7 +119,7 @@ module Artifactory
|
|
119
119
|
# @param [REXML] element
|
120
120
|
# xml element
|
121
121
|
#
|
122
|
-
def xml_to_hash(element, child_with_children =
|
122
|
+
def xml_to_hash(element, child_with_children = "", unique_children = true)
|
123
123
|
properties = {}
|
124
124
|
element.each_element_with_text do |e|
|
125
125
|
if e.name.eql?(child_with_children)
|
@@ -141,8 +141,8 @@ module Artifactory
|
|
141
141
|
end
|
142
142
|
|
143
143
|
def to_type(string)
|
144
|
-
return true if string.eql?(
|
145
|
-
return false if string.eql?(
|
144
|
+
return true if string.eql?("true")
|
145
|
+
return false if string.eql?("false")
|
146
146
|
return string.to_i if numeric?(string)
|
147
147
|
return string
|
148
148
|
end
|