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.



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

def classifier
  @classifier
end

#groupObject (readonly)

The group identifier.



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

def group
  @group
end

#idObject (readonly)

The artifact identifier.



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

def id
  @id
end

#typeObject (readonly)

The file type. (Symbol)



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

def type
  @type
end

#versionObject (readonly)

The version number.



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

def version
  @version
end

Instance Method Details

#installObject



161
162
163
164
165
166
167
168
169
170
171
172
173
# File 'lib/buildr/packaging/artifact.rb', line 161

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

#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
# File 'lib/buildr/packaging/artifact.rb', line 149

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)


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

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



175
176
177
178
179
# File 'lib/buildr/packaging/artifact.rb', line 175

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. 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.



192
193
194
# File 'lib/buildr/packaging/artifact.rb', line 192

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

#upload_task(upload_to = nil) ⇒ Object

Raises:

  • (ArgumentError)


196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
# File 'lib/buildr/packaging/artifact.rb', line 196

def upload_task(upload_to = 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}/#{File.basename(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.
      info "Deploying #{to_spec}"
      URI.upload uri + path, name, :permissions=>upload_to[:permissions]
    end
  end
  task
end