artrest 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +15 -0
- data/.gitignore +20 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +29 -0
- data/Rakefile +31 -0
- data/artrest.gemspec +30 -0
- data/bin/artrest +194 -0
- data/lib/artrest.rb +81 -0
- data/lib/artrest/build.rb +31 -0
- data/lib/artrest/buildnumber.rb +26 -0
- data/lib/artrest/builds.rb +46 -0
- data/lib/artrest/dir_entry.rb +115 -0
- data/lib/artrest/repositories.rb +61 -0
- data/lib/artrest/repository.rb +42 -0
- data/lib/artrest/resource.rb +366 -0
- data/lib/artrest/resources.rb +54 -0
- data/lib/artrest/system.rb +74 -0
- data/lib/artrest/system_general_configuration.rb +45 -0
- data/lib/artrest/version.rb +3 -0
- data/spec/artrest/build_spec.rb +62 -0
- data/spec/artrest/buildnumber_spec.rb +45 -0
- data/spec/artrest/builds_spec.rb +69 -0
- data/spec/artrest/folder_spec.rb +88 -0
- data/spec/artrest/repositories_spec.rb +47 -0
- data/spec/artrest/repository_spec.rb +63 -0
- data/spec/artrest/resource_spec.rb +385 -0
- data/spec/artrest/resources_spec.rb +66 -0
- data/spec/artrest/system_general_configuration_spec.rb +72 -0
- data/spec/artrest/system_spec.rb +50 -0
- data/spec/artrest_spec.rb +30 -0
- data/spec/fixtures/build/build_response_correct.txt +7 -0
- data/spec/fixtures/buildnumber/buildnumber_25_response.txt +7 -0
- data/spec/fixtures/builds/build_api_response_correct.txt +7 -0
- data/spec/fixtures/folder/pom_file_response_1.txt +7 -0
- data/spec/fixtures/folder/sub_folder_response.txt +7 -0
- data/spec/fixtures/folder/top_folder_response.txt +7 -0
- data/spec/fixtures/repositories/libs_snapshot_local_folder_response.txt +7 -0
- data/spec/fixtures/repositories/repositories_response.txt +7 -0
- data/spec/fixtures/repository/libs_snapshot_local_response.txt +7 -0
- data/spec/fixtures/resource/artifact_response.txt +7 -0
- data/spec/fixtures/resource/build_response.txt +7 -0
- data/spec/fixtures/resource/buildnumber_response.txt +7 -0
- data/spec/fixtures/resource/builds_response.txt +7 -0
- data/spec/fixtures/resource/folder_response.txt +7 -0
- data/spec/fixtures/resource/json_response.txt +7 -0
- data/spec/fixtures/resource/repositories_response.txt +7 -0
- data/spec/fixtures/resource/repository_not_found_response.txt +7 -0
- data/spec/fixtures/resource/repository_response.txt +7 -0
- data/spec/fixtures/resource/repository_unauthorized_response.txt +8 -0
- data/spec/fixtures/resource/string_response.txt +188 -0
- data/spec/fixtures/resource/sub_response.txt +188 -0
- data/spec/fixtures/resource/system_general_configuration_response.txt +654 -0
- data/spec/fixtures/resource/system_response.txt +188 -0
- data/spec/fixtures/resources/resources_response.txt +7 -0
- data/spec/fixtures/system/200_OK_ping_response.txt +7 -0
- data/spec/fixtures/system/general_configuration_response.txt +654 -0
- data/spec/fixtures/system/system_response.txt +188 -0
- data/spec/spec.opts +5 -0
- data/spec/spec_helper.rb +38 -0
- metadata +269 -0
@@ -0,0 +1,54 @@
|
|
1
|
+
|
2
|
+
module ArtRest
|
3
|
+
|
4
|
+
# An ArtRest::Resource that doubles as a collection of resources, each such
|
5
|
+
# resource being an ArtRest::Resource instance. This is an abstract base
|
6
|
+
# class that is *not* meant to be instantiated.
|
7
|
+
#
|
8
|
+
# === Example
|
9
|
+
#
|
10
|
+
# An ArtRest::Builds instance is a collection of ArtRest::Build instances.
|
11
|
+
#
|
12
|
+
class Resources < ArtRest::Resource
|
13
|
+
include Enumerable
|
14
|
+
|
15
|
+
class << self
|
16
|
+
|
17
|
+
# An ArtRest::Resources instance is represented by a parsed
|
18
|
+
# JSON hash. In order to be able to iterate over the contained
|
19
|
+
# ArtRest::Resource instances we need a means of converting
|
20
|
+
# that JSON hash into an array of ArtRest::Resource instances
|
21
|
+
# of an appropriate subtype. We choose a +block+ taking the JSON hash
|
22
|
+
# and the +options+ hash and returning an array of ArtRest::Resource
|
23
|
+
# instances.
|
24
|
+
#
|
25
|
+
# This method assigns that block to this class.
|
26
|
+
#
|
27
|
+
# * *Args* :
|
28
|
+
# - +block+ -> A +block+ taking a parsed JSON hash and an +options+
|
29
|
+
# hash and returning an array of appropriate ArtRest::Resource
|
30
|
+
# instances
|
31
|
+
#
|
32
|
+
def resources_creator=(block)
|
33
|
+
self.singleton_class.class_eval do
|
34
|
+
define_method(:resources_creator) do
|
35
|
+
block
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
public
|
42
|
+
|
43
|
+
# Iterate over all ArtRest::Resource instances contained in this
|
44
|
+
# instance. Yield each such instance to the supplied +block+.
|
45
|
+
#
|
46
|
+
# * *Args* :
|
47
|
+
# - +block+ -> The +block+ to yield each contained ArtRest::Resource
|
48
|
+
# instance to
|
49
|
+
#
|
50
|
+
def each &block # :yields: content, options
|
51
|
+
self.class.resources_creator.call(content, options).each &block
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
module ArtRest
|
2
|
+
|
3
|
+
# Represents the {Artifactory}[http://www.jfrog.com/home/v_artifactory_opensource_overview]
|
4
|
+
# {System}[http://wiki.jfrog.org/confluence/display/RTF/Artifactory's+REST+API#Artifactory'sRESTAPI-SystemInfo]
|
5
|
+
# resource. Its content is a formatted multiline string listing
|
6
|
+
#
|
7
|
+
# * Java version used
|
8
|
+
# * Memory consumption
|
9
|
+
# * ...
|
10
|
+
#
|
11
|
+
# === Example
|
12
|
+
#
|
13
|
+
# sysInfo = ArtRest::System.new('http://localhost:8081/artifactory/api/system', { ... })
|
14
|
+
#
|
15
|
+
class System < ArtRest::Resource
|
16
|
+
|
17
|
+
class << self
|
18
|
+
public
|
19
|
+
|
20
|
+
# Shortcut method to retrieve *the* ArtRest::System resource.
|
21
|
+
#
|
22
|
+
# * *Args* :
|
23
|
+
# - +base_url+ -> Our Artifactory server's base URL
|
24
|
+
# - +options+ -> A Hash containing username and password
|
25
|
+
# * *Returns* :
|
26
|
+
# - *The* ArtRest::System resource
|
27
|
+
#
|
28
|
+
def get(base_url, options)
|
29
|
+
System.new("#{base_url}/api/system", options)
|
30
|
+
end
|
31
|
+
|
32
|
+
def matches_path(path, options) # :nodoc:
|
33
|
+
path =~ %r|^/api/system/?$|
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
self.mime_type = MIME::Types['text/plain']
|
38
|
+
|
39
|
+
# Get this system resource's {ping}[http://wiki.jfrog.org/confluence/display/RTF/Artifactory's+REST+API#Artifactory'sRESTAPI-SystemHealthPing]
|
40
|
+
# subresource, i.e. issue a ping request to test whether the
|
41
|
+
# Artifactory server this resource represents is still in a healthy
|
42
|
+
# state.
|
43
|
+
#
|
44
|
+
# Returns the plain RestClient::Response object returned by the server.
|
45
|
+
# In case the server is functioning properly this response will carry
|
46
|
+
# an HTTP 200 return code, and its body will contain the string
|
47
|
+
# "OK". Otherwise, the response returned will carry a return code from
|
48
|
+
# the 5xx family, and its body will be a text describing the problem.
|
49
|
+
#
|
50
|
+
# * *Returns* :
|
51
|
+
# - The plain RestClient::Response object as returned by the server
|
52
|
+
#
|
53
|
+
def ping
|
54
|
+
# Directly accessing the ping resource from this resource contravenes
|
55
|
+
# our design. For consistency reasons, we ought to explicitly model
|
56
|
+
# this ping resource as e.g. an instance of ArtRest::SystemPing.
|
57
|
+
# However, here we try to strike a balance between perfectionism
|
58
|
+
# and pragmatism and lean towards the latter.
|
59
|
+
RestClient::Resource.new("#{base_url}/api/system/ping", user, password).get
|
60
|
+
end
|
61
|
+
|
62
|
+
# Get this system resource's {general configuration}[http://wiki.jfrog.org/confluence/display/RTF/Artifactory's+REST+API#Artifactory'sRESTAPI-GeneralConfiguration]
|
63
|
+
# subresource, i.e. the resource representing Artifactory's
|
64
|
+
# +artifactory.config.xml+ file.
|
65
|
+
#
|
66
|
+
# * *Returns* :
|
67
|
+
# - Artifactory's general configuration, represented as an instance of
|
68
|
+
# ArtRest::System::GeneralConfiguration
|
69
|
+
#
|
70
|
+
def configuration
|
71
|
+
ArtRest::System::GeneralConfiguration.new("#{base_url}/api/system/configuration", options, block)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module ArtRest
|
2
|
+
|
3
|
+
class System
|
4
|
+
|
5
|
+
# Represents Artifactory's {General Configuration}[http://wiki.jfrog.org/confluence/display/RTF/Artifactory's+REST+API#Artifactory'sRESTAPI-GeneralConfiguration]
|
6
|
+
# resource. Essentially, this is Artifactory's +artifactory.config.xml+
|
7
|
+
# file.
|
8
|
+
#
|
9
|
+
# This class serves to
|
10
|
+
#
|
11
|
+
# * retrieve Artifactory's general configuration as an in-memory
|
12
|
+
# XML data structure,
|
13
|
+
# * download Artifactory's general configuration to a folder/file, and
|
14
|
+
# * update (post) Artifactory's general configuration.
|
15
|
+
#
|
16
|
+
class GeneralConfiguration < ArtRest::Resource
|
17
|
+
|
18
|
+
class << self
|
19
|
+
public
|
20
|
+
|
21
|
+
# Shortcut method to retrieve *the*
|
22
|
+
# ArtRest::System::GeneralConfiguration resource.
|
23
|
+
#
|
24
|
+
# * *Args* :
|
25
|
+
# - +base_url+ -> Our Artifactory server's base URL
|
26
|
+
# - +options+ -> A Hash containing username and password
|
27
|
+
# * *Returns* :
|
28
|
+
# - *The* ArtRest::System::GeneralConfiguration resource
|
29
|
+
#
|
30
|
+
def get(base_url, options)
|
31
|
+
System::GeneralConfiguration.new("#{base_url}/api/system/configuration", options)
|
32
|
+
end
|
33
|
+
|
34
|
+
def matches_path(path, options) # :nodoc:
|
35
|
+
path =~ %r|^/api/system/configuration/?$|
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
self.mime_type = MIME::Types['application/xml']
|
40
|
+
|
41
|
+
# Make update! available on this class as it supports updates
|
42
|
+
public :update!, :update_with!
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require File.expand_path("../../spec_helper", __FILE__)
|
2
|
+
|
3
|
+
describe ArtRest::Build do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
@build_name = 'vnet.sms.common.shell'
|
7
|
+
@build_path = "api/build/#{@build_name}"
|
8
|
+
@build_url = "#{ARTIFACTORY_URL}/#{@build_path}"
|
9
|
+
@artbuild = ArtRest::Build.new @build_url, OPTIONS
|
10
|
+
register_stub_request('./build/build_response_correct.txt', "#{@build_path}")
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "#each" do
|
14
|
+
it "should iterate over all build numbers" do
|
15
|
+
expected_number_of_build_numbers = 63
|
16
|
+
actual_number_of_build_numbers = 0
|
17
|
+
@artbuild.each do |build_number|
|
18
|
+
actual_number_of_build_numbers += 1
|
19
|
+
end
|
20
|
+
actual_number_of_build_numbers.should equal expected_number_of_build_numbers
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should return each build number as an instance of ArtRest::BuildNumber" do
|
24
|
+
@artbuild.each do |build_number|
|
25
|
+
build_number.should_not be_nil
|
26
|
+
build_number.should be_an_instance_of ArtRest::Buildnumber
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "[all resource attributes]" do
|
32
|
+
|
33
|
+
before(:each) do
|
34
|
+
@resource_attributes = [:uri, :buildsNumbers]
|
35
|
+
end
|
36
|
+
|
37
|
+
context "when no block given" do
|
38
|
+
it "should return a non-nil value" do
|
39
|
+
@resource_attributes.each do |attr|
|
40
|
+
value = @artbuild.send(attr)
|
41
|
+
value.should_not be_nil
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
context "when block given" do
|
47
|
+
it "should yield a non-nil value to that block" do
|
48
|
+
@resource_attributes.each do |attr|
|
49
|
+
@artbuild.send(attr) do |value|
|
50
|
+
value.should_not be_nil
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe "#url" do
|
58
|
+
it "should expose the url property" do
|
59
|
+
@artbuild.url.should eq @build_url
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require File.expand_path("../../spec_helper", __FILE__)
|
2
|
+
|
3
|
+
describe ArtRest::Buildnumber do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
@build_name = 'vnet.sms.common.shell'
|
7
|
+
@build_no = 25
|
8
|
+
@buildnumber_path = "api/build/#{@build_name}/#{@build_no}"
|
9
|
+
@buildnumber_url = "#{ARTIFACTORY_URL}/#{@buildnumber_path}"
|
10
|
+
@artbuildnumber = ArtRest::Buildnumber.new(@buildnumber_url, OPTIONS)
|
11
|
+
register_stub_request('./buildnumber/buildnumber_25_response.txt', "#{@buildnumber_path}")
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "#url" do
|
15
|
+
it "should expose the url property" do
|
16
|
+
@artbuildnumber.url.should eq @buildnumber_url
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "[all resource attributes]" do
|
21
|
+
|
22
|
+
before(:each) do
|
23
|
+
@resource_attributes = [:uri, :buildInfo]
|
24
|
+
end
|
25
|
+
|
26
|
+
context "when no block given" do
|
27
|
+
it "should return a non-nil value" do
|
28
|
+
@resource_attributes.each do |attr|
|
29
|
+
value = @artbuildnumber.send(attr)
|
30
|
+
value.should_not be_nil
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context "when block given" do
|
36
|
+
it "should yield a non-nil value to that block" do
|
37
|
+
@resource_attributes.each do |attr|
|
38
|
+
@artbuildnumber.send(attr) do |value|
|
39
|
+
value.should_not be_nil
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require File.expand_path("../../spec_helper", __FILE__)
|
2
|
+
|
3
|
+
describe ArtRest::Builds do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
@builds_path = "api/build"
|
7
|
+
@builds_url = "#{ARTIFACTORY_URL}/#{@builds_path}"
|
8
|
+
@artbuilds = ArtRest::Builds.new @builds_url, OPTIONS
|
9
|
+
register_stub_request('./builds/build_api_response_correct.txt', @builds_path)
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "::get" do
|
13
|
+
it "should expose a shortcut method to retrieve all builds" do
|
14
|
+
all_builds = ArtRest::Builds.get ARTIFACTORY_URL, OPTIONS
|
15
|
+
all_builds.should_not be_nil
|
16
|
+
all_builds.should be_an_instance_of ArtRest::Builds
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "#each" do
|
21
|
+
it "should iterate over all builds" do
|
22
|
+
expected_number_of_builds = 64
|
23
|
+
actual_number_of_builds = 0
|
24
|
+
@artbuilds.each do |build|
|
25
|
+
actual_number_of_builds += 1
|
26
|
+
end
|
27
|
+
actual_number_of_builds.should equal expected_number_of_builds
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should return all builds as an instance of ArtRest::Build" do
|
31
|
+
@artbuilds.each do |build|
|
32
|
+
build.should be_an_instance_of ArtRest::Build
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe "[all resource attributes]" do
|
38
|
+
|
39
|
+
before(:each) do
|
40
|
+
@resource_attributes = [:uri, :builds]
|
41
|
+
end
|
42
|
+
|
43
|
+
context "when no block given" do
|
44
|
+
it "should return a non-nil value" do
|
45
|
+
@resource_attributes.each do |attr|
|
46
|
+
value = @artbuilds.send(attr)
|
47
|
+
value.should_not be_nil
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
context "when block given" do
|
53
|
+
it "should yield a non-nil value to that block" do
|
54
|
+
@resource_attributes.each do |attr|
|
55
|
+
@artbuilds.send(attr) do |value|
|
56
|
+
value.should_not be_nil
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
describe "#url" do
|
64
|
+
it "should expose the url property" do
|
65
|
+
@artbuilds.url.should eq @builds_url
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
require File.expand_path("../../spec_helper", __FILE__)
|
2
|
+
|
3
|
+
describe ArtRest::Folder do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
@repo_name = 'ext-snapshot-local'
|
7
|
+
@folder_path = '/vnet/sms/infrastructure/rpm-elasticsearch'
|
8
|
+
@folder_url = "#{ARTIFACTORY_URL}/api/storage/#{@repo_name}#{@folder_path}"
|
9
|
+
@artfolder = ArtRest::Folder.new @folder_url, OPTIONS
|
10
|
+
register_stub_request('./folder/top_folder_response.txt', "api/storage/#{@repo_name}#{@folder_path}")
|
11
|
+
register_stub_request('./folder/sub_folder_response.txt', "api/storage/#{@repo_name}#{@folder_path}/1.0.0-SNAPSHOT")
|
12
|
+
register_stub_request('./folder/pom_file_response_1.txt', "api/storage/#{@repo_name}#{@folder_path}/1.0.0-SNAPSHOT/rpm-elasticsearch-1.0.0-20120411.155423-1.pom")
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "#each" do
|
16
|
+
it "should iterate over all child folders" do
|
17
|
+
expected_number_of_folders = 1
|
18
|
+
actual_number_of_folders = 0
|
19
|
+
@artfolder.each do |folder|
|
20
|
+
actual_number_of_folders += 1
|
21
|
+
end
|
22
|
+
actual_number_of_folders.should equal expected_number_of_folders
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should return each child folder as an ArtRest::Folder instance" do
|
26
|
+
@artfolder.each do |folder|
|
27
|
+
folder.should be_an_instance_of ArtRest::Folder
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "[all resource attributes]" do
|
33
|
+
|
34
|
+
before(:each) do
|
35
|
+
@resource_attributes = [:path,
|
36
|
+
:lastUpdated,
|
37
|
+
:repo,
|
38
|
+
:uri,
|
39
|
+
:modifiedBy,
|
40
|
+
:created,
|
41
|
+
:createdBy,
|
42
|
+
:lastModified,
|
43
|
+
:metadataUri]
|
44
|
+
end
|
45
|
+
|
46
|
+
context "when no block given" do
|
47
|
+
it "should return a non-nil value" do
|
48
|
+
@resource_attributes.each do |attr|
|
49
|
+
value = @artfolder.send(attr)
|
50
|
+
value.should_not be_nil
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
context "when block given" do
|
56
|
+
it "should yield a non-nil value to that block" do
|
57
|
+
@resource_attributes.each do |attr|
|
58
|
+
@artfolder.send(attr) do |value|
|
59
|
+
value.should_not be_nil
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
describe "#[]" do
|
67
|
+
it "should return a subfolder as an instance of ArtRest::Folder" do
|
68
|
+
folder = @artfolder['1.0.0-SNAPSHOT']
|
69
|
+
folder.should_not be_nil
|
70
|
+
folder.should be_an_instance_of ArtRest::Folder
|
71
|
+
end
|
72
|
+
|
73
|
+
it "should return a contained artifact as an instance of ArtRest::Artifact" do
|
74
|
+
artifact = @artfolder['1.0.0-SNAPSHOT/rpm-elasticsearch-1.0.0-20120411.155423-1.pom']
|
75
|
+
artifact.should_not be_nil
|
76
|
+
artifact.should be_an_instance_of ArtRest::Artifact
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
describe "#traverse" do
|
81
|
+
it "should traverse the whole subtree rooted at itself" do
|
82
|
+
@artfolder.traverse do |child|
|
83
|
+
child.should be_a_kind_of ArtRest::DirEntry
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|