artifactory 1.0.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.travis.yml +13 -1
- data/CHANGELOG.md +7 -2
- data/lib/artifactory.rb +1 -0
- data/lib/artifactory/client.rb +4 -2
- data/lib/artifactory/resources/base.rb +56 -19
- data/lib/artifactory/resources/group.rb +171 -0
- data/lib/artifactory/resources/user.rb +138 -13
- data/lib/artifactory/version.rb +1 -1
- data/spec/integration/resources/group_spec.rb +45 -0
- data/spec/integration/resources/user_spec.rb +45 -0
- data/spec/support/api_server.rb +4 -0
- data/spec/support/api_server/group_endpoints.rb +53 -0
- data/spec/support/api_server/user_endpoints.rb +59 -0
- data/spec/unit/resources/base_spec.rb +7 -4
- data/spec/unit/resources/group_spec.rb +75 -0
- data/spec/unit/resources/user_spec.rb +82 -0
- metadata +15 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6b8e07b7674ce29c0b313ce8d5be4a551fd007ac
|
4
|
+
data.tar.gz: 37eec0ba96fdb294d4e285977cc0b8d8aec7579a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e2b460025528de4d36e1addf26d2b32656c05bc68656143c06524afe0ac6bcde325ed85c3f1c63035cf76294d99fe41fe2e474e6a1460984e6885a099ee0218e
|
7
|
+
data.tar.gz: 6e00717ca7b4a2e90185adc6677eb10fa762c912f9406e5003a15c02be13b44146b901399d8fce08f8ec43a268cc8761fe53abe4bec6ca6f872957794adac792
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Test on modern
|
1
|
+
# Test on modern rubies
|
2
2
|
rvm:
|
3
3
|
- 1.9.3
|
4
4
|
- 2.0.0
|
@@ -6,3 +6,15 @@ rvm:
|
|
6
6
|
|
7
7
|
# Setup parallel downloaders
|
8
8
|
bundler_args: --jobs 7
|
9
|
+
|
10
|
+
# Only test master (PRs are still tested)
|
11
|
+
branches:
|
12
|
+
only:
|
13
|
+
- master
|
14
|
+
|
15
|
+
# Notifications
|
16
|
+
notifications:
|
17
|
+
hipchat:
|
18
|
+
rooms:
|
19
|
+
- secure: eUtMt0CeB2bbIcTeQA3rUJsTtBkq/Ng5AnM59NOCzutcPTnNDeM4kNQEfgJ5QEZZkx08IXyiPJ14gEQUaV0bF0s0FLyzFxjlX9p2jem99FmEA404KJ7axoUiGGxgATbq9V7tUOrp1zG+a8xVQTahZASKadPlC9TSRgKqjUL+Dvg= # Release Engineering
|
20
|
+
- secure: fQEeBZSIV9mKpM5XeKxmvcgUb19skv3+qW6TiyvuPReB4B/mc5vf3AABWhbdnnHzjsKnq2iQtcppXVG0eJwuRM5D1werMO91zwSRNBU/ClOLHaYBp5l4tVkuHzAd3eo/Z67vxE0BAV9lGWeWv7r3y/BLgJ265nQMyfgZSyz1i44= # Build Statuses
|
data/CHANGELOG.md
CHANGED
@@ -4,6 +4,11 @@ This file is used to document the changes between releases of the Artifactory
|
|
4
4
|
Ruby client.
|
5
5
|
|
6
6
|
|
7
|
-
v1.
|
8
|
-
|
7
|
+
v1.1.0 (2014-02-11)
|
8
|
+
-------------------
|
9
|
+
- Add support for group resources
|
10
|
+
- Add support for user resources
|
11
|
+
|
12
|
+
v1.0.0 (2014-02-10)
|
13
|
+
-------------------
|
9
14
|
- Initial release
|
data/lib/artifactory.rb
CHANGED
@@ -16,6 +16,7 @@ module Artifactory
|
|
16
16
|
autoload :Artifact, 'artifactory/resources/artifact'
|
17
17
|
autoload :Base, 'artifactory/resources/base'
|
18
18
|
autoload :Build, 'artifactory/resources/build'
|
19
|
+
autoload :Group, 'artifactory/resources/group'
|
19
20
|
autoload :Plugin, 'artifactory/resources/plugin'
|
20
21
|
autoload :Repository, 'artifactory/resources/repository'
|
21
22
|
autoload :System, 'artifactory/resources/system'
|
data/lib/artifactory/client.rb
CHANGED
@@ -190,7 +190,7 @@ module Artifactory
|
|
190
190
|
raise Error::NotFound.new(url: url)
|
191
191
|
when 405
|
192
192
|
raise Error::MethodNotAllowed.new(url: url)
|
193
|
-
|
193
|
+
else
|
194
194
|
raise Error::ConnectionError.new(url: url, body: response.body)
|
195
195
|
end
|
196
196
|
rescue SocketError, Errno::ECONNREFUSED, EOFError
|
@@ -212,7 +212,9 @@ module Artifactory
|
|
212
212
|
# the parsed response, as an object
|
213
213
|
#
|
214
214
|
def parse_response(response)
|
215
|
-
|
215
|
+
content_type = response.headers['Content-Type']
|
216
|
+
|
217
|
+
if content_type && content_type.include?('json')
|
216
218
|
JSON.parse(response.body)
|
217
219
|
else
|
218
220
|
response.body
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
1
3
|
module Artifactory
|
2
4
|
class Resource::Base
|
3
5
|
class << self
|
@@ -23,8 +25,13 @@ module Artifactory
|
|
23
25
|
# @return [Boolean]
|
24
26
|
#
|
25
27
|
def attribute(key, default = nil)
|
28
|
+
key = key.to_sym unless key.is_a?(Symbol)
|
29
|
+
|
30
|
+
# Set the key on the top attributes, mostly for asthetic purposes
|
31
|
+
attributes[key] = nil
|
32
|
+
|
26
33
|
define_method(key) do
|
27
|
-
value =
|
34
|
+
value = attributes[key]
|
28
35
|
return value unless value.nil?
|
29
36
|
|
30
37
|
if default.nil?
|
@@ -37,11 +44,11 @@ module Artifactory
|
|
37
44
|
end
|
38
45
|
|
39
46
|
define_method("#{key}?") do
|
40
|
-
!!
|
47
|
+
!!attributes[key]
|
41
48
|
end
|
42
49
|
|
43
50
|
define_method("#{key}=") do |value|
|
44
|
-
|
51
|
+
set(key, value)
|
45
52
|
end
|
46
53
|
end
|
47
54
|
|
@@ -96,6 +103,10 @@ module Artifactory
|
|
96
103
|
def url_safe(value)
|
97
104
|
URI.escape(value.to_s)
|
98
105
|
end
|
106
|
+
|
107
|
+
def attributes
|
108
|
+
@attributes ||= {}
|
109
|
+
end
|
99
110
|
end
|
100
111
|
|
101
112
|
attribute :client, ->{ Artifactory.client }
|
@@ -104,42 +115,68 @@ module Artifactory
|
|
104
115
|
# Create a new instance
|
105
116
|
#
|
106
117
|
def initialize(attributes = {})
|
107
|
-
attributes.each
|
118
|
+
attributes.each do |key, value|
|
119
|
+
set(key, value)
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
#
|
124
|
+
# The list of attributes for this resource.
|
125
|
+
#
|
126
|
+
# @return [hash]
|
127
|
+
#
|
128
|
+
def attributes
|
129
|
+
@attributes ||= self.class.attributes.dup
|
130
|
+
end
|
131
|
+
|
132
|
+
#
|
133
|
+
# Set a given attribute on this resource.
|
134
|
+
#
|
135
|
+
# @param [#to_sym] key
|
136
|
+
# the attribute to set
|
137
|
+
# @param [Object] value
|
138
|
+
# the value to set
|
139
|
+
#
|
140
|
+
# @return [Object]
|
141
|
+
# the set value
|
142
|
+
#
|
143
|
+
def set(key, value)
|
144
|
+
attributes[key.to_sym] = value
|
108
145
|
end
|
109
146
|
|
110
|
-
# @see
|
147
|
+
# @see Resource::Base.extract_client!
|
111
148
|
def extract_client!(options)
|
112
149
|
self.class.extract_client!(options)
|
113
150
|
end
|
114
151
|
|
115
|
-
# @see
|
152
|
+
# @see Resource::Base.format_repos!
|
116
153
|
def format_repos!(options)
|
117
154
|
self.class.format_repos!(options)
|
118
155
|
end
|
119
156
|
|
120
|
-
# @see
|
157
|
+
# @see Resource::Base.url_safe
|
121
158
|
def url_safe(value)
|
122
159
|
self.class.url_safe(value)
|
123
160
|
end
|
124
161
|
|
162
|
+
# @private
|
125
163
|
def to_s
|
126
|
-
"#<#{
|
164
|
+
"#<#{short_classname}>"
|
127
165
|
end
|
128
166
|
|
167
|
+
# @private
|
129
168
|
def inspect
|
130
|
-
|
131
|
-
unless
|
132
|
-
value = instance_variable_get(k)
|
133
|
-
|
134
|
-
if !value.nil?
|
135
|
-
"#{k.to_s.gsub(/^@/, '')}: #{value.inspect}"
|
136
|
-
else
|
137
|
-
nil
|
138
|
-
end
|
139
|
-
end
|
169
|
+
list = attributes.collect do |key, value|
|
170
|
+
"#{key}: #{value.inspect}" unless key == :client
|
140
171
|
end.compact
|
141
172
|
|
142
|
-
"#<#{
|
173
|
+
"#<#{short_classname} #{list.join(', ')}>"
|
174
|
+
end
|
175
|
+
|
176
|
+
private
|
177
|
+
|
178
|
+
def short_classname
|
179
|
+
@short_classname ||= self.class.name.split('::').last
|
143
180
|
end
|
144
181
|
end
|
145
182
|
end
|
@@ -0,0 +1,171 @@
|
|
1
|
+
module Artifactory
|
2
|
+
class Resource::Group < Resource::Base
|
3
|
+
class << self
|
4
|
+
#
|
5
|
+
# Get a list of all groups in the system.
|
6
|
+
#
|
7
|
+
# @param [Hash] options
|
8
|
+
# the list of options
|
9
|
+
#
|
10
|
+
# @option options [Artifactory::Client] :client
|
11
|
+
# the client object to make the request with
|
12
|
+
#
|
13
|
+
# @return [Array<Resource::Group>]
|
14
|
+
# the list of groups
|
15
|
+
#
|
16
|
+
def all(options = {})
|
17
|
+
client = extract_client!(options)
|
18
|
+
client.get('/api/security/groups').map do |hash|
|
19
|
+
from_url(hash['uri'], client: client)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
#
|
24
|
+
# Find (fetch) a group by its name.
|
25
|
+
#
|
26
|
+
# @example Find a group by its name
|
27
|
+
# Group.find('readers') #=> #<Group name: 'readers' ...>
|
28
|
+
#
|
29
|
+
# @param [String] name
|
30
|
+
# the name of the group to find
|
31
|
+
# @param [Hash] options
|
32
|
+
# the list of options
|
33
|
+
#
|
34
|
+
# @option options [Artifactory::Client] :client
|
35
|
+
# the client object to make the request with
|
36
|
+
#
|
37
|
+
# @return [Resource::Group, nil]
|
38
|
+
# an instance of the group that matches the given name, or +nil+
|
39
|
+
# if one does not exist
|
40
|
+
#
|
41
|
+
def find(name, options = {})
|
42
|
+
client = extract_client!(options)
|
43
|
+
|
44
|
+
response = client.get("/api/security/groups/#{url_safe(name)}")
|
45
|
+
from_hash(response, client: client)
|
46
|
+
rescue Error::NotFound
|
47
|
+
nil
|
48
|
+
end
|
49
|
+
|
50
|
+
#
|
51
|
+
# Construct a group from the given URL.
|
52
|
+
#
|
53
|
+
# @example Create an group object from the given URL
|
54
|
+
# Group.from_url('/security/groups/readers') #=> #<Resource::Group>
|
55
|
+
#
|
56
|
+
# @param [Artifactory::Client] client
|
57
|
+
# the client object to make the request with
|
58
|
+
# @param [String] url
|
59
|
+
# the URL to find the group from
|
60
|
+
#
|
61
|
+
# @return [Resource::Group]
|
62
|
+
#
|
63
|
+
def from_url(url, options = {})
|
64
|
+
client = extract_client!(options)
|
65
|
+
from_hash(client.get(url), client: client)
|
66
|
+
end
|
67
|
+
|
68
|
+
#
|
69
|
+
# Create a instance from the given Hash. This method extracts the "safe"
|
70
|
+
# information from the hash and adds them to the instance.
|
71
|
+
#
|
72
|
+
# @example Create a new group from a hash
|
73
|
+
# Group.from_hash('realmAttributes' => '...', 'name' => '...')
|
74
|
+
#
|
75
|
+
# @param [Artifactory::Client] client
|
76
|
+
# the client object to make the request with
|
77
|
+
# @param [Hash] hash
|
78
|
+
# the hash to create the instance from
|
79
|
+
#
|
80
|
+
# @return [Resource::Group]
|
81
|
+
#
|
82
|
+
def from_hash(hash, options = {})
|
83
|
+
client = extract_client!(options)
|
84
|
+
|
85
|
+
new.tap do |instance|
|
86
|
+
instance.auto_join = hash['autoJoin']
|
87
|
+
instance.client = client
|
88
|
+
instance.description = hash['description']
|
89
|
+
instance.name = hash['name']
|
90
|
+
instance.realm = hash['realm']
|
91
|
+
instance.realm_attributes = hash['realmAttributes']
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
attribute :auto_join
|
97
|
+
attribute :description
|
98
|
+
attribute :name, ->{ raise 'Name missing!' }
|
99
|
+
attribute :realm
|
100
|
+
attribute :realm_attributes
|
101
|
+
|
102
|
+
#
|
103
|
+
# Delete this group from artifactory, suppressing any +ResourceNotFound+
|
104
|
+
# exceptions might occur.
|
105
|
+
#
|
106
|
+
# @return [Boolean]
|
107
|
+
# true if the object was deleted successfully, false otherwise
|
108
|
+
#
|
109
|
+
def delete
|
110
|
+
!!client.delete(api_path)
|
111
|
+
rescue Error::NotFound
|
112
|
+
false
|
113
|
+
end
|
114
|
+
|
115
|
+
#
|
116
|
+
# Save the group to the artifactory server.
|
117
|
+
#
|
118
|
+
# @return [Boolean]
|
119
|
+
#
|
120
|
+
def save
|
121
|
+
client.put(api_path, to_json, headers)
|
122
|
+
true
|
123
|
+
end
|
124
|
+
|
125
|
+
#
|
126
|
+
# The hash format for this group.
|
127
|
+
#
|
128
|
+
# @return [Hash]
|
129
|
+
#
|
130
|
+
def to_hash
|
131
|
+
{
|
132
|
+
'autoJoin' => auto_join,
|
133
|
+
'description' => description,
|
134
|
+
'name' => name,
|
135
|
+
'realm' => realm,
|
136
|
+
'realmAttributes' => realm_attributes,
|
137
|
+
}
|
138
|
+
end
|
139
|
+
|
140
|
+
#
|
141
|
+
# The JSON representation of this resource.
|
142
|
+
#
|
143
|
+
# @return [String]
|
144
|
+
#
|
145
|
+
def to_json
|
146
|
+
JSON.fast_generate(to_hash)
|
147
|
+
end
|
148
|
+
|
149
|
+
private
|
150
|
+
|
151
|
+
#
|
152
|
+
# The path to this group on the server.
|
153
|
+
#
|
154
|
+
# @return [String]
|
155
|
+
#
|
156
|
+
def api_path
|
157
|
+
@api_path ||= "/api/security/groups/#{url_safe(name)}"
|
158
|
+
end
|
159
|
+
|
160
|
+
#
|
161
|
+
# The default headers for this object. This includes the +Content-Type+.
|
162
|
+
#
|
163
|
+
# @return [Hash]
|
164
|
+
#
|
165
|
+
def headers
|
166
|
+
@headers ||= {
|
167
|
+
'Content-Type' => 'application/vnd.org.jfrog.artifactory.security.Group+json'
|
168
|
+
}
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
@@ -2,7 +2,16 @@ module Artifactory
|
|
2
2
|
class Resource::User < Resource::Base
|
3
3
|
class << self
|
4
4
|
#
|
5
|
+
# Get a list of all users in the system.
|
5
6
|
#
|
7
|
+
# @param [Hash] options
|
8
|
+
# the list of options
|
9
|
+
#
|
10
|
+
# @option options [Artifactory::Client] :client
|
11
|
+
# the client object to make the request with
|
12
|
+
#
|
13
|
+
# @return [Array<Resource::User>]
|
14
|
+
# the list of users
|
6
15
|
#
|
7
16
|
def all(options = {})
|
8
17
|
client = extract_client!(options)
|
@@ -12,19 +21,44 @@ module Artifactory
|
|
12
21
|
end
|
13
22
|
|
14
23
|
#
|
24
|
+
# Find (fetch) a user by its name.
|
25
|
+
#
|
26
|
+
# @example Find a user by its name
|
27
|
+
# User.find('readers') #=> #<User name: 'readers' ...>
|
15
28
|
#
|
29
|
+
# @param [String] name
|
30
|
+
# the name of the user to find
|
31
|
+
# @param [Hash] options
|
32
|
+
# the list of options
|
16
33
|
#
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
34
|
+
# @option options [Artifactory::Client] :client
|
35
|
+
# the client object to make the request with
|
36
|
+
#
|
37
|
+
# @return [Resource::User, nil]
|
38
|
+
# an instance of the user that matches the given name, or +nil+
|
39
|
+
# if one does not exist
|
40
|
+
#
|
41
|
+
def find(name, options = {})
|
42
|
+
client = extract_client!(options)
|
43
|
+
|
44
|
+
response = client.get("/api/security/users/#{url_safe(name)}")
|
21
45
|
from_hash(response, client: client)
|
22
46
|
rescue Error::NotFound
|
23
47
|
nil
|
24
48
|
end
|
25
49
|
|
26
50
|
#
|
51
|
+
# Construct a user from the given URL.
|
52
|
+
#
|
53
|
+
# @example Create an user object from the given URL
|
54
|
+
# User.from_url('/security/users/readers') #=> #<Resource::User>
|
55
|
+
#
|
56
|
+
# @param [Artifactory::Client] client
|
57
|
+
# the client object to make the request with
|
58
|
+
# @param [String] url
|
59
|
+
# the URL to find the user from
|
27
60
|
#
|
61
|
+
# @return [Resource::User]
|
28
62
|
#
|
29
63
|
def from_url(url, options = {})
|
30
64
|
client = extract_client!(options)
|
@@ -32,26 +66,117 @@ module Artifactory
|
|
32
66
|
end
|
33
67
|
|
34
68
|
#
|
69
|
+
# Create a instance from the given Hash. This method extracts the "safe"
|
70
|
+
# information from the hash and adds them to the instance.
|
35
71
|
#
|
72
|
+
# @example Create a new user from a hash
|
73
|
+
# User.from_hash('realmAttributes' => '...', 'name' => '...')
|
74
|
+
#
|
75
|
+
# @param [Artifactory::Client] client
|
76
|
+
# the client object to make the request with
|
77
|
+
# @param [Hash] hash
|
78
|
+
# the hash to create the instance from
|
79
|
+
#
|
80
|
+
# @return [Resource::User]
|
36
81
|
#
|
37
82
|
def from_hash(hash, options = {})
|
38
83
|
client = extract_client!(options)
|
39
84
|
|
40
|
-
new
|
41
|
-
instance.admin
|
42
|
-
instance.email
|
43
|
-
instance.
|
44
|
-
instance.
|
45
|
-
instance.
|
85
|
+
new.tap do |instance|
|
86
|
+
instance.admin = !!hash['admin']
|
87
|
+
instance.email = hash['email']
|
88
|
+
instance.groups = Array(hash['groups'])
|
89
|
+
instance.internal_password_disabled = hash['internalPasswordDisabled']
|
90
|
+
instance.last_logged_in = hash['lastLoggedIn']
|
91
|
+
instance.name = hash['name']
|
92
|
+
instance.password = hash['password']
|
93
|
+
instance.profile_updatable = !!hash['profileUpdatable']
|
94
|
+
instance.realm = hash['realm']
|
46
95
|
end
|
47
96
|
end
|
48
97
|
end
|
49
98
|
|
50
99
|
attribute :admin, false
|
51
100
|
attribute :email
|
52
|
-
attribute :
|
53
|
-
attribute :
|
54
|
-
attribute :
|
101
|
+
attribute :groups, []
|
102
|
+
attribute :internal_password_disabled, false
|
103
|
+
attribute :last_logged_in
|
104
|
+
attribute :name, -> { raise 'Name missing' }
|
105
|
+
attribute :password # write only, never returned
|
106
|
+
attribute :profile_updatable, true
|
55
107
|
attribute :realm
|
108
|
+
|
109
|
+
#
|
110
|
+
# Delete this user from artifactory, suppressing any +ResourceNotFound+
|
111
|
+
# exceptions might occur.
|
112
|
+
#
|
113
|
+
# @return [Boolean]
|
114
|
+
# true if the object was deleted successfully, false otherwise
|
115
|
+
#
|
116
|
+
def delete
|
117
|
+
!!client.delete(api_path)
|
118
|
+
rescue Error::NotFound
|
119
|
+
false
|
120
|
+
end
|
121
|
+
|
122
|
+
#
|
123
|
+
# Save the user to the artifactory server.
|
124
|
+
#
|
125
|
+
# @return [Boolean]
|
126
|
+
#
|
127
|
+
def save
|
128
|
+
client.put(api_path, to_json, headers)
|
129
|
+
true
|
130
|
+
end
|
131
|
+
|
132
|
+
#
|
133
|
+
# The hash format for this user.
|
134
|
+
#
|
135
|
+
# @return [Hash]
|
136
|
+
#
|
137
|
+
def to_hash
|
138
|
+
{
|
139
|
+
'admin' => admin,
|
140
|
+
'email' => email,
|
141
|
+
'groups' => groups,
|
142
|
+
'internalPasswordDisabled' => internal_password_disabled,
|
143
|
+
'lastLoggedIn' => last_logged_in,
|
144
|
+
'name' => name,
|
145
|
+
'password' => password,
|
146
|
+
'profileUpdatable' => profile_updatable,
|
147
|
+
'realm' => realm,
|
148
|
+
}
|
149
|
+
end
|
150
|
+
|
151
|
+
#
|
152
|
+
# The JSON representation of this resource.
|
153
|
+
#
|
154
|
+
# @return [String]
|
155
|
+
#
|
156
|
+
def to_json
|
157
|
+
JSON.fast_generate(to_hash)
|
158
|
+
end
|
159
|
+
|
160
|
+
private
|
161
|
+
|
162
|
+
#
|
163
|
+
# The path to this user on the server.
|
164
|
+
#
|
165
|
+
# @return [String]
|
166
|
+
#
|
167
|
+
def api_path
|
168
|
+
@api_path ||= "/api/security/users/#{url_safe(name)}"
|
169
|
+
end
|
170
|
+
|
171
|
+
#
|
172
|
+
# The default headers for this object. This includes the +Content-Type+.
|
173
|
+
#
|
174
|
+
# @return [Hash]
|
175
|
+
#
|
176
|
+
def headers
|
177
|
+
@headers ||= {
|
178
|
+
'Content-Type' => 'application/vnd.org.jfrog.artifactory.security.User+json'
|
179
|
+
}
|
180
|
+
end
|
56
181
|
end
|
57
182
|
end
|
data/lib/artifactory/version.rb
CHANGED
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Artifactory
|
4
|
+
describe Resource::Group, :integration do
|
5
|
+
describe '.all' do
|
6
|
+
it 'returns an array of group objects' do
|
7
|
+
results = described_class.all
|
8
|
+
expect(results).to be_a(Array)
|
9
|
+
expect(results.first).to be_a(described_class)
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'includes the information from the server' do
|
13
|
+
results = described_class.all
|
14
|
+
readers = results[0]
|
15
|
+
leads = results[1]
|
16
|
+
|
17
|
+
expect(readers.name).to eq('readers')
|
18
|
+
expect(leads.name).to eq('tech-leads')
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe '.find' do
|
23
|
+
it 'finds a group by name' do
|
24
|
+
readers = described_class.find('readers')
|
25
|
+
|
26
|
+
expect(readers).to be_a(described_class)
|
27
|
+
expect(readers.name).to eq('readers')
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe '#delete' do
|
32
|
+
it 'deletes the group from the server' do
|
33
|
+
readers = described_class.find('readers')
|
34
|
+
expect(readers.delete).to be_true
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe '#save' do
|
39
|
+
it 'saves the group to the server' do
|
40
|
+
group = described_class.new(name: 'testing')
|
41
|
+
expect(group.save).to be_true
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Artifactory
|
4
|
+
describe Resource::User, :integration do
|
5
|
+
describe '.all' do
|
6
|
+
it 'returns an array of user objects' do
|
7
|
+
results = described_class.all
|
8
|
+
expect(results).to be_a(Array)
|
9
|
+
expect(results.first).to be_a(described_class)
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'includes the information from the server' do
|
13
|
+
results = described_class.all
|
14
|
+
seth = results[0]
|
15
|
+
yvonne = results[1]
|
16
|
+
|
17
|
+
expect(seth.name).to eq('sethvargo')
|
18
|
+
expect(yvonne.name).to eq('yzl')
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe '.find' do
|
23
|
+
it 'finds a user by name' do
|
24
|
+
seth = described_class.find('sethvargo')
|
25
|
+
|
26
|
+
expect(seth).to be_a(described_class)
|
27
|
+
expect(seth.name).to eq('sethvargo')
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe '#delete' do
|
32
|
+
it 'deletes the user from the server' do
|
33
|
+
sethvargo = described_class.find('sethvargo')
|
34
|
+
expect(sethvargo.delete).to be_true
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe '#save' do
|
39
|
+
it 'saves the user to the server' do
|
40
|
+
user = described_class.new(name: 'schisamo')
|
41
|
+
expect(user.save).to be_true
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
data/spec/support/api_server.rb
CHANGED
@@ -8,15 +8,19 @@ module Artifactory
|
|
8
8
|
class APIServer < Sinatra::Base
|
9
9
|
require_relative 'api_server/artifact_endpoints'
|
10
10
|
require_relative 'api_server/build_endpoints'
|
11
|
+
require_relative 'api_server/group_endpoints'
|
11
12
|
require_relative 'api_server/repository_endpoints'
|
12
13
|
require_relative 'api_server/status_endpoints'
|
13
14
|
require_relative 'api_server/system_endpoints'
|
15
|
+
require_relative 'api_server/user_endpoints'
|
14
16
|
|
15
17
|
register APIServer::ArtifactEndpoints
|
16
18
|
register APIServer::BuildEndpoints
|
19
|
+
register APIServer::GroupEndpoints
|
17
20
|
register APIServer::RepositoryEndpoints
|
18
21
|
register APIServer::StatusEndpoints
|
19
22
|
register APIServer::SystemEndpoints
|
23
|
+
register APIServer::UserEndpoints
|
20
24
|
|
21
25
|
private
|
22
26
|
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module Artifactory
|
2
|
+
module APIServer::GroupEndpoints
|
3
|
+
def self.registered(app)
|
4
|
+
app.get('/api/security/groups') do
|
5
|
+
content_type 'application/vnd.org.jfrog.artifactory.security.Groups+json'
|
6
|
+
JSON.fast_generate([
|
7
|
+
{
|
8
|
+
'name' => 'readers',
|
9
|
+
'uri' => server_url.join('/api/security/groups/readers'),
|
10
|
+
},
|
11
|
+
{
|
12
|
+
'name' => 'tech-leads',
|
13
|
+
'uri' => server_url.join('/api/security/groups/tech-leads')
|
14
|
+
}
|
15
|
+
])
|
16
|
+
end
|
17
|
+
|
18
|
+
app.get('/api/security/groups/readers') do
|
19
|
+
content_type 'application/vnd.org.jfrog.artifactory.security.Group+json'
|
20
|
+
JSON.fast_generate(
|
21
|
+
'name' => 'readers',
|
22
|
+
'description' => 'This list of read-only users',
|
23
|
+
'autoJoin' => true,
|
24
|
+
'realm' => 'artifactory',
|
25
|
+
'realmAttributes' => nil,
|
26
|
+
)
|
27
|
+
end
|
28
|
+
|
29
|
+
app.get('/api/security/groups/tech-leads') do
|
30
|
+
content_type 'application/vnd.org.jfrog.artifactory.security.Group+json'
|
31
|
+
JSON.fast_generate(
|
32
|
+
'name' => 'tech-leads',
|
33
|
+
'description' => 'This development leads group',
|
34
|
+
'autoJoin' => false,
|
35
|
+
'realm' => 'artifactory',
|
36
|
+
'realmAttributes' => nil,
|
37
|
+
)
|
38
|
+
end
|
39
|
+
|
40
|
+
app.put('/api/security/groups/:name') do
|
41
|
+
return 415 unless request.content_type == 'application/vnd.org.jfrog.artifactory.security.Group+json'
|
42
|
+
|
43
|
+
# Attempt to parse the response; if this succeeds, all is well...
|
44
|
+
JSON.parse(request.body.read)
|
45
|
+
nil
|
46
|
+
end
|
47
|
+
|
48
|
+
app.delete('/api/security/groups/:name') do
|
49
|
+
nil
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module Artifactory
|
2
|
+
module APIServer::UserEndpoints
|
3
|
+
def self.registered(app)
|
4
|
+
app.get('/api/security/users') do
|
5
|
+
content_type 'application/vnd.org.jfrog.artifactory.security.Users+json'
|
6
|
+
JSON.fast_generate([
|
7
|
+
{
|
8
|
+
'name' => 'sethvargo',
|
9
|
+
'uri' => server_url.join('/api/security/users/sethvargo'),
|
10
|
+
},
|
11
|
+
{
|
12
|
+
'name' => 'yzl',
|
13
|
+
'uri' => server_url.join('/api/security/users/yzl')
|
14
|
+
}
|
15
|
+
])
|
16
|
+
end
|
17
|
+
|
18
|
+
app.get('/api/security/users/sethvargo') do
|
19
|
+
content_type 'application/vnd.org.jfrog.artifactory.security.User+json'
|
20
|
+
JSON.fast_generate(
|
21
|
+
'admin' => false,
|
22
|
+
'email' => 'sethvargo@gmail.com',
|
23
|
+
'groups' => ['admin'],
|
24
|
+
'internalPasswordDisabled' => true,
|
25
|
+
'lastLoggedIn' => nil,
|
26
|
+
'name' => 'sethvargo',
|
27
|
+
'profileUpdatable' => true,
|
28
|
+
'realm' => 'artifactory',
|
29
|
+
)
|
30
|
+
end
|
31
|
+
|
32
|
+
app.get('/api/security/users/yzl') do
|
33
|
+
content_type 'application/vnd.org.jfrog.artifactory.security.User+json'
|
34
|
+
JSON.fast_generate(
|
35
|
+
'admin' => true,
|
36
|
+
'email' => 'yvonne@getchef.com',
|
37
|
+
'groups' => ['admin'],
|
38
|
+
'internalPasswordDisabled' => true,
|
39
|
+
'lastLoggedIn' => nil,
|
40
|
+
'name' => 'yzl',
|
41
|
+
'profileUpdatable' => true,
|
42
|
+
'realm' => 'crowd',
|
43
|
+
)
|
44
|
+
end
|
45
|
+
|
46
|
+
app.put('/api/security/users/:name') do
|
47
|
+
return 415 unless request.content_type == 'application/vnd.org.jfrog.artifactory.security.User+json'
|
48
|
+
|
49
|
+
# Attempt to parse the response; if this succeeds, all is well...
|
50
|
+
JSON.parse(request.body.read)
|
51
|
+
nil
|
52
|
+
end
|
53
|
+
|
54
|
+
app.delete('/api/security/users/:name') do
|
55
|
+
nil
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -126,14 +126,17 @@ module Artifactory
|
|
126
126
|
|
127
127
|
describe '#to_s' do
|
128
128
|
it 'returns the name of the class' do
|
129
|
-
expect(subject.to_s).to eq('#<
|
129
|
+
expect(subject.to_s).to eq('#<Base>')
|
130
130
|
end
|
131
131
|
end
|
132
132
|
|
133
133
|
describe '#inspect' do
|
134
|
-
it 'includes all the
|
135
|
-
subject.
|
136
|
-
|
134
|
+
it 'includes all the attributes' do
|
135
|
+
subject.stub(:attributes) do
|
136
|
+
{ foo: 'bar' }
|
137
|
+
end
|
138
|
+
|
139
|
+
expect(subject.inspect).to eq(%q|#<Base foo: "bar">|)
|
137
140
|
end
|
138
141
|
end
|
139
142
|
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Artifactory
|
4
|
+
describe Resource::Group do
|
5
|
+
let(:client) { double(:client) }
|
6
|
+
|
7
|
+
before(:each) do
|
8
|
+
Artifactory.stub(:client).and_return(client)
|
9
|
+
client.stub(:get).and_return(response) if defined?(response)
|
10
|
+
end
|
11
|
+
|
12
|
+
describe '.all' do
|
13
|
+
let(:response) do
|
14
|
+
[
|
15
|
+
{ 'uri' => 'a' },
|
16
|
+
{ 'uri' => 'b' },
|
17
|
+
{ 'uri' => 'c' },
|
18
|
+
]
|
19
|
+
end
|
20
|
+
before do
|
21
|
+
described_class.stub(:from_url).with('a', client: client).and_return('a')
|
22
|
+
described_class.stub(:from_url).with('b', client: client).and_return('b')
|
23
|
+
described_class.stub(:from_url).with('c', client: client).and_return('c')
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'gets /api/security/groups' do
|
27
|
+
expect(client).to receive(:get).with('/api/security/groups').once
|
28
|
+
described_class.all
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'returns the groups' do
|
32
|
+
expect(described_class.all).to eq(['a', 'b', 'c'])
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe '.find' do
|
37
|
+
let(:response) { {} }
|
38
|
+
|
39
|
+
it 'gets /api/repositories/#{name}' do
|
40
|
+
expect(client).to receive(:get).with('/api/security/groups/readers').once
|
41
|
+
described_class.find('readers')
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe '.from_url' do
|
46
|
+
let(:response) { {} }
|
47
|
+
|
48
|
+
it 'constructs a new instance from the result' do
|
49
|
+
expect(described_class).to receive(:from_hash).once
|
50
|
+
described_class.from_url('/api/security/groups/readers')
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
describe '.from_hash' do
|
55
|
+
let(:hash) do
|
56
|
+
{
|
57
|
+
'name' => 'readers',
|
58
|
+
'description' => 'This list of read-only users',
|
59
|
+
'autoJoin' => true,
|
60
|
+
'realm' => 'artifactory',
|
61
|
+
'realmAttributes' => nil,
|
62
|
+
}
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'creates a new instnace' do
|
66
|
+
instance = described_class.from_hash(hash)
|
67
|
+
expect(instance.name).to eq('readers')
|
68
|
+
expect(instance.description).to eq('This list of read-only users')
|
69
|
+
expect(instance.auto_join).to be_true
|
70
|
+
expect(instance.realm).to eq('artifactory')
|
71
|
+
expect(instance.realm_attributes).to be_nil
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Artifactory
|
4
|
+
describe Resource::User do
|
5
|
+
let(:client) { double(:client) }
|
6
|
+
|
7
|
+
before(:each) do
|
8
|
+
Artifactory.stub(:client).and_return(client)
|
9
|
+
client.stub(:get).and_return(response) if defined?(response)
|
10
|
+
end
|
11
|
+
|
12
|
+
describe '.all' do
|
13
|
+
let(:response) do
|
14
|
+
[
|
15
|
+
{ 'uri' => 'a' },
|
16
|
+
{ 'uri' => 'b' },
|
17
|
+
{ 'uri' => 'c' },
|
18
|
+
]
|
19
|
+
end
|
20
|
+
before do
|
21
|
+
described_class.stub(:from_url).with('a', client: client).and_return('a')
|
22
|
+
described_class.stub(:from_url).with('b', client: client).and_return('b')
|
23
|
+
described_class.stub(:from_url).with('c', client: client).and_return('c')
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'gets /api/security/users' do
|
27
|
+
expect(client).to receive(:get).with('/api/security/users').once
|
28
|
+
described_class.all
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'returns the users' do
|
32
|
+
expect(described_class.all).to eq(['a', 'b', 'c'])
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe '.find' do
|
37
|
+
let(:response) { {} }
|
38
|
+
|
39
|
+
it 'gets /api/repositories/#{name}' do
|
40
|
+
expect(client).to receive(:get).with('/api/security/users/readers').once
|
41
|
+
described_class.find('readers')
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe '.from_url' do
|
46
|
+
let(:response) { {} }
|
47
|
+
|
48
|
+
it 'constructs a new instance from the result' do
|
49
|
+
expect(described_class).to receive(:from_hash).once
|
50
|
+
described_class.from_url('/api/security/users/readers')
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
describe '.from_hash' do
|
55
|
+
let(:hash) do
|
56
|
+
{
|
57
|
+
'admin' => false,
|
58
|
+
'email' => 'admin@example.com',
|
59
|
+
'groups' => ['admin'],
|
60
|
+
'internalPasswordDisabled' => true,
|
61
|
+
'lastLoggedIn' => nil,
|
62
|
+
'name' => 'admin',
|
63
|
+
'profileUpdatable' => true,
|
64
|
+
'realm' => 'artifactory',
|
65
|
+
}
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'creates a new instnace' do
|
69
|
+
instance = described_class.from_hash(hash)
|
70
|
+
expect(instance.admin).to be_false
|
71
|
+
expect(instance.email).to eq('admin@example.com')
|
72
|
+
expect(instance.groups).to eq(['admin'])
|
73
|
+
expect(instance.internal_password_disabled).to be_true
|
74
|
+
expect(instance.last_logged_in).to be_nil
|
75
|
+
expect(instance.name).to eq('admin')
|
76
|
+
expect(instance.password).to be_nil
|
77
|
+
expect(instance.profile_updatable).to be_true
|
78
|
+
expect(instance.realm).to eq('artifactory')
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: artifactory
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Seth Vargo
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-02-
|
11
|
+
date: 2014-02-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: httpclient
|
@@ -90,6 +90,7 @@ files:
|
|
90
90
|
- lib/artifactory/resources/artifact.rb
|
91
91
|
- lib/artifactory/resources/base.rb
|
92
92
|
- lib/artifactory/resources/build.rb
|
93
|
+
- lib/artifactory/resources/group.rb
|
93
94
|
- lib/artifactory/resources/plugin.rb
|
94
95
|
- lib/artifactory/resources/repository.rb
|
95
96
|
- lib/artifactory/resources/system.rb
|
@@ -99,23 +100,29 @@ files:
|
|
99
100
|
- locales/en.yml
|
100
101
|
- spec/integration/resources/artifact_spec.rb
|
101
102
|
- spec/integration/resources/build_spec.rb
|
103
|
+
- spec/integration/resources/group_spec.rb
|
102
104
|
- spec/integration/resources/repository_spec.rb
|
103
105
|
- spec/integration/resources/system_spec.rb
|
106
|
+
- spec/integration/resources/user_spec.rb
|
104
107
|
- spec/spec_helper.rb
|
105
108
|
- spec/support/api_server.rb
|
106
109
|
- spec/support/api_server/artifact_endpoints.rb
|
107
110
|
- spec/support/api_server/build_endpoints.rb
|
111
|
+
- spec/support/api_server/group_endpoints.rb
|
108
112
|
- spec/support/api_server/repository_endpoints.rb
|
109
113
|
- spec/support/api_server/status_endpoints.rb
|
110
114
|
- spec/support/api_server/system_endpoints.rb
|
115
|
+
- spec/support/api_server/user_endpoints.rb
|
111
116
|
- spec/unit/artifactory_spec.rb
|
112
117
|
- spec/unit/client_spec.rb
|
113
118
|
- spec/unit/resources/artifact_spec.rb
|
114
119
|
- spec/unit/resources/base_spec.rb
|
115
120
|
- spec/unit/resources/build_spec.rb
|
121
|
+
- spec/unit/resources/group_spec.rb
|
116
122
|
- spec/unit/resources/plugin_spec.rb
|
117
123
|
- spec/unit/resources/repository_spec.rb
|
118
124
|
- spec/unit/resources/system_spec.rb
|
125
|
+
- spec/unit/resources/user_spec.rb
|
119
126
|
homepage: https://github.com/opscode/artifactory-client
|
120
127
|
licenses:
|
121
128
|
- Apache 2.0
|
@@ -144,21 +151,27 @@ summary: Artifactory is a simple, lightweight Ruby client for interacting with t
|
|
144
151
|
test_files:
|
145
152
|
- spec/integration/resources/artifact_spec.rb
|
146
153
|
- spec/integration/resources/build_spec.rb
|
154
|
+
- spec/integration/resources/group_spec.rb
|
147
155
|
- spec/integration/resources/repository_spec.rb
|
148
156
|
- spec/integration/resources/system_spec.rb
|
157
|
+
- spec/integration/resources/user_spec.rb
|
149
158
|
- spec/spec_helper.rb
|
150
159
|
- spec/support/api_server.rb
|
151
160
|
- spec/support/api_server/artifact_endpoints.rb
|
152
161
|
- spec/support/api_server/build_endpoints.rb
|
162
|
+
- spec/support/api_server/group_endpoints.rb
|
153
163
|
- spec/support/api_server/repository_endpoints.rb
|
154
164
|
- spec/support/api_server/status_endpoints.rb
|
155
165
|
- spec/support/api_server/system_endpoints.rb
|
166
|
+
- spec/support/api_server/user_endpoints.rb
|
156
167
|
- spec/unit/artifactory_spec.rb
|
157
168
|
- spec/unit/client_spec.rb
|
158
169
|
- spec/unit/resources/artifact_spec.rb
|
159
170
|
- spec/unit/resources/base_spec.rb
|
160
171
|
- spec/unit/resources/build_spec.rb
|
172
|
+
- spec/unit/resources/group_spec.rb
|
161
173
|
- spec/unit/resources/plugin_spec.rb
|
162
174
|
- spec/unit/resources/repository_spec.rb
|
163
175
|
- spec/unit/resources/system_spec.rb
|
176
|
+
- spec/unit/resources/user_spec.rb
|
164
177
|
has_rdoc:
|