You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@buildr.apache.org by do...@apache.org on 2019/07/13 11:09:23 UTC

[buildr] 04/05: Add support for downloading external annotations and attaching them to IntelliJ IDEA module dependencies

This is an automated email from the ASF dual-hosted git repository.

donaldp pushed a commit to branch SupportExternalAnnotationArtifacts
in repository https://gitbox.apache.org/repos/asf/buildr.git

commit fbe7875ab5a40b1897c714f6a07117d4a07b753f
Author: Peter Donald <pe...@realityforge.org>
AuthorDate: Sat Jul 13 17:22:40 2019 +1000

    Add support for downloading external annotations and attaching them to IntelliJ IDEA module dependencies
---
 CHANGELOG                        |  1 +
 lib/buildr/ide/idea.rb           | 33 ++++++++++++++++++++++++---------
 lib/buildr/packaging/artifact.rb | 20 ++++++++++++++++++--
 3 files changed, 43 insertions(+), 11 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index c09b7ac..4323deb 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -4,6 +4,7 @@
 * Fixed:  Replace references to long removed `http://www.ibiblio.org/maven2/` repository with
           `https://repo1.maven.org/maven2`.
 * Fixed:  Ensure pom files used in tests use https when referring to maven repositories.
+* Added:  Add support for downloading external annotations and attaching them to IntelliJ IDEA module dependencies.
 
 1.5.7 (2019-02-16)
 * Fixed:  The fix that allowed special characters in usernames and passwords was only partially applied
diff --git a/lib/buildr/ide/idea.rb b/lib/buildr/ide/idea.rb
index dfd050d..3ead679 100644
--- a/lib/buildr/ide/idea.rb
+++ b/lib/buildr/ide/idea.rb
@@ -478,12 +478,18 @@ module Buildr #:nodoc:
           dependency_path = d.to_s
           export = true
           source_path = nil
+          annotations_path = nil
           if d.respond_to?(:to_spec_hash)
             source_spec = d.to_spec_hash.merge(:classifier => 'sources')
             source_path = Buildr.artifact(source_spec).to_s
             source_path = nil unless File.exist?(source_path)
           end
-          [dependency_path, export, source_path]
+          if d.respond_to?(:to_spec_hash)
+            annotations_spec = d.to_spec_hash.merge(:classifier => 'annotations')
+            annotations_path = Buildr.artifact(annotations_spec).to_s
+            annotations_path = nil unless File.exist?(annotations_path)
+          end
+          [dependency_path, export, source_path, annotations_path]
         end
       end
 
@@ -494,12 +500,18 @@ module Buildr #:nodoc:
           dependency_path = d.to_s
           export = main_dependencies_paths.include?(dependency_path)
           source_path = nil
+          annotations_path = nil
           if d.respond_to?(:to_spec_hash)
             source_spec = d.to_spec_hash.merge(:classifier => 'sources')
             source_path = Buildr.artifact(source_spec).to_s
             source_path = nil unless File.exist?(source_path)
           end
-          [dependency_path, export, source_path]
+          if d.respond_to?(:to_spec_hash)
+            annotations_spec = d.to_spec_hash.merge(:classifier => 'annotations')
+            annotations_path = Buildr.artifact(annotations_spec).to_s
+            annotations_path = nil unless File.exist?(annotations_path)
+          end
+          [dependency_path, export, source_path, annotations_path]
         end
       end
 
@@ -545,22 +557,22 @@ module Buildr #:nodoc:
           end
 
           main_project_dependencies = project_dependencies.dup
-          self.test_dependency_details.each do |dependency_path, export, source_path|
+          self.test_dependency_details.each do |dependency_path, export, source_path, annotations_path|
             next if export
-            generate_lib(xml, dependency_path, export, source_path, project_dependencies)
+            generate_lib(xml, dependency_path, export, source_path, annotations_path, project_dependencies)
           end
 
           test_project_dependencies = project_dependencies - main_project_dependencies
-          self.main_dependency_details.each do |dependency_path, export, source_path|
+          self.main_dependency_details.each do |dependency_path, export, source_path, annotations_path|
             next unless export
-            generate_lib(xml, dependency_path, export, source_path, test_project_dependencies)
+            generate_lib(xml, dependency_path, export, source_path, annotations_path, test_project_dependencies)
           end
 
           xml.orderEntryProperties
         end
       end
 
-      def generate_lib(xml, dependency_path, export, source_path, project_dependencies)
+      def generate_lib(xml, dependency_path, export, source_path, annotations_path, project_dependencies)
         project_for_dependency = Buildr.projects.detect do |project|
           [project.packages, project.compile.target, project.resources.target, project.test.compile.target, project.test.resources.target].flatten.
             detect { |artifact| artifact.to_s == dependency_path }
@@ -573,7 +585,7 @@ module Buildr #:nodoc:
           end
           project_dependencies << project_for_dependency
         else
-          generate_module_lib(xml, url_for_path(dependency_path), export, (source_path ? url_for_path(source_path) : nil), !export)
+          generate_module_lib(xml, url_for_path(dependency_path), export, (source_path ? url_for_path(source_path) : nil), (annotations_path ? url_for_path(annotations_path) : nil), !export)
         end
       end
 
@@ -649,12 +661,15 @@ module Buildr #:nodoc:
         xml.orderEntry attribs
       end
 
-      def generate_module_lib(xml, path, export, source_path, test = false)
+      def generate_module_lib(xml, path, export, source_path, annotations_path, test = false)
         attribs = {:type => 'module-library'}
         attribs[:exported] = '' if export
         attribs[:scope] = 'TEST' if test
         xml.orderEntry attribs do
           xml.library do
+            xml.ANNOTATIONS do
+              xml.root :url => annotations_path
+            end if annotations_path
             xml.CLASSES do
               xml.root :url => path
             end
diff --git a/lib/buildr/packaging/artifact.rb b/lib/buildr/packaging/artifact.rb
index 2af68c7..27f87be 100644
--- a/lib/buildr/packaging/artifact.rb
+++ b/lib/buildr/packaging/artifact.rb
@@ -21,6 +21,9 @@ module Buildr #:nodoc:
   desc "Download all artifacts' sources"
   task 'artifacts:sources'
 
+  desc "Download all artifacts' external annotations"
+  task 'artifacts:annotations'
+
   desc "Download all artifacts' javadoc"
   task 'artifacts:javadoc'
 
@@ -127,7 +130,7 @@ module Buildr #:nodoc:
     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.send :apply_spec, sources_spec if sources_task.respond_to?(:apply_spec)
       sources_task
     end
 
@@ -138,11 +141,23 @@ module Buildr #:nodoc:
     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.send :apply_spec, javadoc_spec if javadoc_task.respond_to?(:apply_spec)
       javadoc_task
     end
 
     # :call-seq:
+    #   annotations_artifact => Artifact
+    #
+    # Convenience method that returns an annotations artifact. The annotations artifact is used by
+    # Intellij IDEA as a source of external annotations.
+    def annotations_artifact
+      annotations_spec = to_spec_hash.merge(:classifier=>'annotations')
+      annotations_task = OptionalArtifact.define_task(Buildr.repositories.locate(annotations_spec))
+      annotations_task.send :apply_spec, annotations_spec if annotations_task.respond_to?(:apply_spec)
+      annotations_task
+    end
+
+    # :call-seq:
     #   pom_xml => string
     #
     # Creates POM XML for this artifact.
@@ -948,6 +963,7 @@ module Buildr #:nodoc:
       unless spec[:type] == :pom
         Rake::Task['artifacts:sources'].enhance [task.sources_artifact]
         Rake::Task['artifacts:javadoc'].enhance [task.javadoc_artifact]
+        Rake::Task['artifacts:annotations'].enhance [task.annotations_artifact]
       end
     end
     task.enhance &block