lib/nexus_cli/remote.rb in nexus_cli-0.1.2 vs lib/nexus_cli/remote.rb in nexus_cli-0.2.0
- old
+ new
@@ -1,118 +1,132 @@
require 'restclient'
+require 'rexml/document'
require 'yaml'
require 'open3'
module NexusCli
class Remote
class << self
def configuration=(config = {})
- validate_config(config)
@configuration = config
end
def configuration
return @configuration if @configuration
- begin
- config = YAML::load_file(File.expand_path("~/.nexus_cli"))
- rescue Errno::ENOENT
- raise MissingSettingsFileException
- end
- validate_config(config)
- @configuration = config
end
def nexus
@nexus ||= RestClient::Resource.new configuration["url"], :user => configuration["username"], :password => configuration["password"]
end
+ def status
+ doc = REXML::Document.new(nexus['service/local/status'].get).elements['status/data']
+ data = Hash.new
+ data['app_name'] = doc.elements['appName'].text
+ data['version'] = doc.elements['version'].text
+ data['edition_long'] = doc.elements['editionLong'].text
+ data['state'] = doc.elements['state'].text
+ data['started_at'] = doc.elements['startedAt'].text
+ data['base_url'] = doc.elements['baseUrl'].text
+ return data
+ end
+
def pull_artifact(artifact, destination, overrides)
- parse_overrides(overrides)
split_artifact = artifact.split(":")
if(split_artifact.size < 4)
raise ArtifactMalformedException
end
+ group_id, artifact_id, version, extension = split_artifact
begin
- fileData = nexus['service/local/artifact/maven/redirect'].get ({params: {r: configuration['repository'], g: split_artifact[0], a: split_artifact[1], v: split_artifact[2], e: split_artifact[3]}})
+ fileData = nexus['service/local/artifact/maven/redirect'].get ({params: {r: configuration['repository'], g: group_id, a: artifact_id, v: version, e: extension}})
rescue RestClient::ResourceNotFound
raise ArtifactNotFoundException
end
artifact = nil
- destination = File.join(File.expand_path(destination || "."), "#{split_artifact[1]}-#{split_artifact[2]}.#{split_artifact[3]}")
+ destination = File.join(File.expand_path(destination || "."), "#{artifact_id}-#{version}.#{extension}")
artifact = File.open(destination, 'w')
artifact.write(fileData)
artifact.close()
File.expand_path(artifact.path)
end
def push_artifact(artifact, file, insecure, overrides)
- #Build up the pieces that will make up the PUT request
- parse_overrides(overrides)
split_artifact = artifact.split(":")
if(split_artifact.size < 4)
raise ArtifactMalformedException
end
- artifact_id = split_artifact[0].gsub(".", "/")
- group_id = split_artifact[1].gsub(".", "/")
- version = split_artifact[2]
- file_name = "#{split_artifact[1]}-#{version}.#{split_artifact[3]}"
- put_string = "content/repositories/#{configuration['repository']}/#{artifact_id}/#{group_id}/#{version}/#{file_name}"
- Open3.popen3("curl -I #{insecure ? "-k" : ""} -T #{file} #{File.join(configuration['url'], put_string)} -u #{configuration['username']}:#{configuration['password']}") do |stdin, stdout, stderr, wait_thr|
- exit_code = wait_thr.value.exitstatus
- standard_out = stdout.read
- if (standard_out.match('403 Forbidden') || standard_out.match('401 Unauthorized'))
- raise PermissionsException
- elsif standard_out.match('400 Bad Request')
+ group_id, artifact_id, version, extension = split_artifact
+ nexus['service/local/artifact/maven/content'].post hasPom: false, g: group_id, a: artifact_id, v: version, e: extension, p: extension, r: configuration['repository'],
+ file: File.new(file) do |response, request, result, &block|
+ case response.code
+ when 400
raise BadUploadRequestException
- end
- case exit_code
- when 60
- raise NonSecureConnectionException
- when 7
+ when 401
+ raise PermissionsException
+ when 403
+ raise PermissionsException
+ when 404
raise CouldNotConnectToNexusException
end
end
end
def delete_artifact(artifact)
split_artifact = artifact.split(":")
if(split_artifact.size < 4)
raise ArtifactMalformedException
end
- artifact_id = split_artifact[0].gsub(".", "/")
- group_id = split_artifact[1].gsub(".", "/")
+ group_id = split_artifact[0].gsub(".", "/")
+ artifact_id = split_artifact[1].gsub(".", "/")
version = split_artifact[2]
- delete_string = "content/repositories/releases/#{artifact_id}/#{group_id}/#{version}"
+ delete_string = "content/repositories/releases/#{group_id}/#{artifact_id}/#{version}"
Kernel.quietly {`curl --request DELETE #{File.join(configuration['url'], delete_string)} -u #{configuration['username']}:#{configuration['password']}`}
end
def get_artifact_info(artifact, overrides)
- parse_overrides(overrides)
split_artifact = artifact.split(":")
if(split_artifact.size < 4)
raise ArtifactMalformedException
end
begin
nexus['service/local/artifact/maven/resolve'].get ({params: {r: configuration['repository'], g: split_artifact[0], a: split_artifact[1], v: split_artifact[2], e: split_artifact[3]}})
rescue RestClient::ResourceNotFound => e
raise ArtifactNotFoundException
end
end
+
+ def get_artifact_custom_info(artifact, overrides)
+ raise NotNexusProException unless running_nexus_pro?
+ split_artifact = artifact.split(":")
+ if(split_artifact.size < 4)
+ raise ArtifactMalformedException
+ end
+ group_id, artifact_id, version, extension = split_artifact
+ file_name = "#{artifact_id}-#{version}.#{extension}"
+ get_string = "content/repositories/#{configuration['repository']}/.meta/#{group_id.gsub(".", "/")}/#{artifact_id.gsub(".", "/")}/#{version}/#{file_name}.n3"
+ begin
+ n3_data = nexus[get_string].get
+ parse_n3(n3_data)
+ rescue RestClient::ResourceNotFound => e
+ raise ArtifactNotFoundException
+ end
+ end
private
-
- def validate_config(configuration)
- ["url", "repository", "username","password"].each do |key|
- raise InvalidSettingsException.new(key) unless configuration.has_key?(key)
- end
+ def running_nexus_pro?
+ return status['edition_long'] == "Professional" ? true : false
end
- def parse_overrides(overrides)
- overrides.each do |key, value|
- configuration[key] = value unless configuration[key].nil?
- end
+ def parse_n3(data)
+ result = ""
+ data.each_line { |item|
+ tag = item.match(/#(\w*)>/) ? "#{$1}" : ""
+ value = item.match(/"([^"]*)"/) ? "#{$1}" : ""
+ result += " <#{tag}>#{value}</#{tag}>\n" unless tag.empty? && value.empty?
+ }
+ return "<artifact-resolution>\n <data>\n" + result + " </data>\n</artifact-resolution>"
end
end
end
end
\ No newline at end of file