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]
MAVEN_METADATA =
'maven-metadata.xml'

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#buildr_projectObject

Returns the value of attribute buildr_project.



76
77
78
# File 'lib/buildr/packaging/artifact.rb', line 76

def buildr_project
  @buildr_project
end

#classifierObject (readonly)

Optional artifact classifier.



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

def classifier
  @classifier
end

#groupObject (readonly)

The group identifier.



68
69
70
# File 'lib/buildr/packaging/artifact.rb', line 68

def group
  @group
end

#idObject (readonly)

The artifact identifier.



66
67
68
# File 'lib/buildr/packaging/artifact.rb', line 66

def id
  @id
end

#typeObject (readonly)

The file type. (Symbol)



70
71
72
# File 'lib/buildr/packaging/artifact.rb', line 70

def type
  @type
end

#versionObject (readonly)

The version number.



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

def version
  @version
end

Instance Method Details

#final_versionObject



82
83
84
85
# File 'lib/buildr/packaging/artifact.rb', line 82

def final_version
  return version unless snapshot?
  Time.now.strftime("%Y%m%d.%H%M%S")
end

#installObject



188
189
190
191
192
193
194
195
196
197
198
199
200
# File 'lib/buildr/packaging/artifact.rb', line 188

def install
  invoke
  in_local_repository = Buildr.repositories.locate(self)
  if pom && pom != self && classifier.nil?
    pom.invoke
    pom.install
  end
  if name != in_local_repository
    mkpath File.dirname(in_local_repository)
    cp name, in_local_repository, :preserve => false
    info "Installed #{name} to #{in_local_repository}"
  end
end

#javadoc_artifactObject

:call-seq:

javadoc_artifact => Artifact

Convenience method that returns the associated javadoc artifact



138
139
140
141
142
143
# File 'lib/buildr/packaging/artifact.rb', line 138

def javadoc_artifact
  javadoc_spec = to_spec_hash.merge(:classifier=>'javadoc')
  javadoc_task = OptionalArtifact.define_task(Buildr.repositories.locate(javadoc_spec))
  javadoc_task.send :apply_spec, javadoc_spec
  javadoc_task
end

#maven_metadata_xmlObject

:call-seq:

 => string

Creates Maven Metadata XML content for this artifact.



171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
# File 'lib/buildr/packaging/artifact.rb', line 171

def 
  xml = Builder::XmlMarkup.new(:indent=>2)
  xml.instruct!
  xml. do
    xml.groupId       group
    xml.artifactId    id
    xml.version       version
    xml.versioning do
      xml.snapshot do
        xml.timestamp final_version
        xml.buildNumber 1
      end
      xml.lastupdated Time.now.strftime("%Y%m%d%H%M%S")
    end
  end
end

#pomObject

:call-seq:

pom => Artifact

Convenience method that returns a POM artifact.



118
119
120
121
# File 'lib/buildr/packaging/artifact.rb', line 118

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.



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

def pom_xml
  if self.buildr_project
    Buildr::CustomPom.pom_xml(self.buildr_project, self)
  else
    Proc.new do
      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
  end
end

#snapshot?Boolean

Returns:

  • (Boolean)


78
79
80
# File 'lib/buildr/packaging/artifact.rb', line 78

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

#sources_artifactObject

:call-seq:

sources_artifact => Artifact

Convenience method that returns a sources artifact.



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

def sources_artifact
  sources_spec = to_spec_hash.merge(:classifier=>'sources')
  sources_task = OptionalArtifact.define_task(Buildr.repositories.locate(sources_spec))
  sources_task.send :apply_spec, sources_spec
  sources_task
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>


110
111
112
# File 'lib/buildr/packaging/artifact.rb', line 110

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' }


97
98
99
100
# File 'lib/buildr/packaging/artifact.rb', line 97

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

#uninstallObject



202
203
204
205
206
# File 'lib/buildr/packaging/artifact.rb', line 202

def uninstall
  installed = Buildr.repositories.locate(self)
  rm installed if File.exist?(installed)
  pom.uninstall if pom && pom != self && classifier.nil?
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 or repositories.snapshot_to if the subject is a snapshot artifact. 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.



220
221
222
# File 'lib/buildr/packaging/artifact.rb', line 220

def upload(upload_to = nil)
  upload_task(upload_to).invoke
end

#upload_task(upload_to = nil) ⇒ Object

Raises:

  • (ArgumentError)


224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
# File 'lib/buildr/packaging/artifact.rb', line 224

def upload_task(upload_to = nil)
  upload_to ||= Buildr.repositories.snapshot_to if snapshot? && Buildr.repositories.snapshot_to != nil && Buildr.repositories.snapshot_to[:url] != nil
  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]

  # 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]

  path = group.gsub('.', '/') + "/#{id}/#{version}/#{upload_name}"

  unless task = Buildr.application.lookup(uri+path)
    deps = [self]
    deps << pom.upload_task( upload_to ) if pom && pom != self && classifier.nil?

    task = Rake::Task.define_task uri + path => deps do
      # Upload artifact relative to base URL, need to create path before uploading.
      options = upload_to[:options] || {:permissions => upload_to[:permissions]}
      info "Deploying #{to_spec}"
      URI.upload uri + path, name, options
      if snapshot? && pom != self
          = group.gsub('.', '/') + "/#{id}/#{version}/#{MAVEN_METADATA}"
         URI.write uri + , , :permissions => upload_to[:permissions]
      end
    end
  end
  task
end