Module: Buildr::ActsAsArtifact

Included in:
Artifact
Defined in:
lib/buildr/packaging/artifact.rb

Overview

Mixin with a task to make it behave like an artifact. Implemented by the packaging tasks.

An artifact has an identifier, group identifier, type, version number and optional classifier. All can be used to locate it in the local repository, download from or upload to a remote repository.

The #to_spec and #to_hash methods allow it to be used everywhere an artifact is accepted.

Constant Summary collapse

ARTIFACT_ATTRIBUTES =
[:group, :id, :type, :classifier, :version]

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#classifierObject (readonly)

Optional artifact classifier.



56
57
58
# File 'lib/buildr/packaging/artifact.rb', line 56

def classifier
  @classifier
end

#groupObject (readonly)

The group identifier.



50
51
52
# File 'lib/buildr/packaging/artifact.rb', line 50

def group
  @group
end

#idObject (readonly)

The artifact identifier.



48
49
50
# File 'lib/buildr/packaging/artifact.rb', line 48

def id
  @id
end

#typeObject (readonly)

The file type. (Symbol)



52
53
54
# File 'lib/buildr/packaging/artifact.rb', line 52

def type
  @type
end

#versionObject (readonly)

The version number.



54
55
56
# File 'lib/buildr/packaging/artifact.rb', line 54

def version
  @version
end

Instance Method Details

#installObject



114
115
116
117
118
119
120
121
122
123
124
125
# File 'lib/buildr/packaging/artifact.rb', line 114

def install
  pom.install if pom && pom != self
  invoke
  installed = Buildr.repositories.locate(self)
  unless installed == name # If not already in local repository.
    verbose(Buildr.application.options.trace || false) do
      mkpath File.dirname(installed)
      cp name, installed
    end
    info "Installed #{installed}"
  end
end

#pomObject

:call-seq:

pom => Artifact

Convenience method that returns a POM artifact.



93
94
95
96
# File 'lib/buildr/packaging/artifact.rb', line 93

def pom
  return self if type == :pom
  Buildr.artifact(:group=>group, :id=>id, :version=>version, :type=>:pom)
end

#pom_xmlObject

:call-seq:

pom_xml => string

Creates POM XML for this artifact.



102
103
104
105
106
107
108
109
110
111
112
# File 'lib/buildr/packaging/artifact.rb', line 102

def pom_xml
  xml = Builder::XmlMarkup.new(:indent=>2)
  xml.instruct!
  xml.project do
    xml.modelVersion  '4.0.0'
    xml.groupId       group
    xml.artifactId    id
    xml.version       version
    xml.classifier    classifier if classifier
  end
end

#snapshot?Boolean

Returns:

  • (Boolean)


58
59
60
# File 'lib/buildr/packaging/artifact.rb', line 58

def snapshot?
  version =~ /-SNAPSHOT$/
end

#to_specObject

:call-seq:

to_spec => String

Returns the artifact specification, in the structure:

<group>:<artifact>:<type>:<version>

or

<group>:<artifact>:<type>:<classifier><:version>


85
86
87
# File 'lib/buildr/packaging/artifact.rb', line 85

def to_spec
  classifier ? "#{group}:#{id}:#{type}:#{classifier}:#{version}" : "#{group}:#{id}:#{type}:#{version}"
end

#to_spec_hashObject Also known as: to_hash

:call-seq:

to_spec_hash => Hash

Returns the artifact specification as a hash. For example:

com.example:app:jar:1.2

becomes:

{ :group=>'com.example',
  :id=>'app',
  :type=>:jar,
  :version=>'1.2' }


72
73
74
75
# File 'lib/buildr/packaging/artifact.rb', line 72

def to_spec_hash
  base = { :group=>group, :id=>id, :type=>type, :version=>version }
  classifier ? base.merge(:classifier=>classifier) : base
end

#uninstallObject



127
128
129
130
131
132
133
# File 'lib/buildr/packaging/artifact.rb', line 127

def uninstall
  verbose(Buildr.application.options.trace || false) do
    installed = Buildr.repositories.locate(self)
    rm installed if File.exist?(installed) 
    pom.uninstall if pom && pom != self
  end
end

#upload(upload_to = nil) ⇒ Object

:call-seq:

upload
upload(url)
upload(options)

Uploads the artifact, its POM and digital signatures to remote server.

In the first form, uses the upload options specified by repositories.release_to. In the second form, uses a URL that includes all the relevant information. In the third form, uses a hash with the options :url, :username, :password, and :permissions. All but :url are optional.

Raises:

  • (ArgumentError)


146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
# File 'lib/buildr/packaging/artifact.rb', line 146

def upload(upload_to = nil)
  # Where do we release to?
  upload_to ||= Buildr.repositories.release_to
  upload_to = { :url=>upload_to } unless Hash === upload_to
  raise ArgumentError, 'Don\'t know where to upload, perhaps you forgot to set repositories.release_to' unless upload_to[:url]
  invoke # Make sure we exist.

  # Upload POM ahead of package, so we don't fail and find POM-less package (the horror!)
  pom.upload(upload_to) if pom && pom != self

  # Set the upload URI, including mandatory slash (we expect it to be the base directory).
  # Username/password may be part of URI, or separate entities.
  uri = URI.parse(upload_to[:url].clone)
  uri.path = uri.path + '/' unless uri.path[-1] == '/'
  uri.user = upload_to[:username] if upload_to[:username]
  uri.password = upload_to[:password] if upload_to[:password]

  # Upload artifact relative to base URL, need to create path before uploading.
  info "Deploying #{to_spec}"
  path = group.gsub('.', '/') + "/#{id}/#{version}/#{File.basename(name)}"
  URI.upload uri + path, name, :permissions=>upload_to[:permissions]
end