Return-Path: X-Original-To: apmail-buildr-commits-archive@www.apache.org Delivered-To: apmail-buildr-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 192F97056 for ; Sun, 30 Oct 2011 11:49:39 +0000 (UTC) Received: (qmail 9105 invoked by uid 500); 30 Oct 2011 11:49:39 -0000 Delivered-To: apmail-buildr-commits-archive@buildr.apache.org Received: (qmail 9082 invoked by uid 500); 30 Oct 2011 11:49:39 -0000 Mailing-List: contact commits-help@buildr.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@buildr.apache.org Delivered-To: mailing list commits@buildr.apache.org Received: (qmail 9074 invoked by uid 99); 30 Oct 2011 11:49:39 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 30 Oct 2011 11:49:39 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 30 Oct 2011 11:49:37 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id BEFB02388847 for ; Sun, 30 Oct 2011 11:49:16 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1195152 - in /buildr/trunk: CHANGELOG addon/buildr/jdepend.rb doc/more_stuff.textile Date: Sun, 30 Oct 2011 11:49:16 -0000 To: commits@buildr.apache.org From: donaldp@apache.org X-Mailer: svnmailer-1.0.8-patched Message-Id: <20111030114916.BEFB02388847@eris.apache.org> Author: donaldp Date: Sun Oct 30 11:49:16 2011 New Revision: 1195152 URL: http://svn.apache.org/viewvc?rev=1195152&view=rev Log: Update the jdepend extension to make it parameterizable like the other analysis extensions. Update the documetation to reflect this change Modified: buildr/trunk/CHANGELOG buildr/trunk/addon/buildr/jdepend.rb buildr/trunk/doc/more_stuff.textile Modified: buildr/trunk/CHANGELOG URL: http://svn.apache.org/viewvc/buildr/trunk/CHANGELOG?rev=1195152&r1=1195151&r2=1195152&view=diff ============================================================================== --- buildr/trunk/CHANGELOG (original) +++ buildr/trunk/CHANGELOG Sun Oct 30 11:49:16 2011 @@ -1,4 +1,7 @@ 1.4.7 (Pending) +* Change: Make it possible to parameterize the JDepend extension and control the projects that + are included in the analysis and to enable support for loading a per project + jdepend.properties. * Added: Add a Checkstyle extension. * Added: Add a JavaNCSS extension. * Added: Add a PMD extension. Modified: buildr/trunk/addon/buildr/jdepend.rb URL: http://svn.apache.org/viewvc/buildr/trunk/addon/buildr/jdepend.rb?rev=1195152&r1=1195151&r2=1195152&view=diff ============================================================================== --- buildr/trunk/addon/buildr/jdepend.rb (original) +++ buildr/trunk/addon/buildr/jdepend.rb Sun Oct 30 11:49:16 2011 @@ -14,43 +14,161 @@ # the License. module Buildr - - # Addes the jdepend:swing, jdepend:text and jdepend:xml tasks. + # Addes the projectname:jdepend:swing, projectname:jdepend:text and + # projectname:jdepend:xml tasks. + # # Require explicitly using require "buildr/jdepend". - module Jdepend - - REQUIRES = ["jdepend:jdepend:jar:2.9.1"] + module JDepend class << self - def requires() - @requires ||= Buildr.artifacts(REQUIRES).each(&:invoke).map(&:to_s) + # The specs for requirements + def dependencies + [ + 'jdepend:jdepend:jar:2.9.1' + ] end - def paths() - Project.projects.map(&:compile).each(&:invoke).map(&:target). - map(&:to_s).select { |path| File.exist?(path) }.map { |path| File.expand_path(path) } + def jdepend(output_file, target_paths, options = {}) + dependencies = (options[:dependencies] || []) + self.dependencies + cp = Buildr.artifacts(dependencies).each(&:invoke).map(&:to_s) + + args = [] + if output_file + args << "-file" + args << output_file + end + target_paths.each do |target_path| + file(target_path).invoke + args << target_path + end + + # If no output file then we must be trying to run the swing app + command = output_file ? 'jdepend.xmlui.JDepend' : 'jdepend.swingui.JDepend' + + begin + Java::Commands.java command, *(args + [{:classpath => cp, :properties => options[:properties], :java_args => options[:java_args]}]) + rescue => e + raise e if options[:fail_on_error] + end end - end - namespace "jdepend" do + class Config + def enabled? + !!@enabled + end + + attr_writer :enabled - desc "Runs JDepend on all your projects (Swing UI)" - task "swing" do - Java::Commands.java "jdepend.swingui.JDepend", paths, :classpath=>requires, :name=>"JDepend" + def html_enabled? + File.exist?(self.style_file) end - desc "Runs JDepend on all your projects (Text UI)" - task "text" do - Java::Commands.java "jdepend.textui.JDepend", paths, :classpath=>requires, :name=>"JDepend" + attr_writer :config_directory + + def config_directory + @config_directory || project._(:source, :main, :etc, :jdepend) end - desc "Runs JDepend on all your projects (XML output to jdepend.xml)" - task "xml" do - Java::Commands.java "jdepend.xmlui.JDepend", "-file", "jdepend.xml", paths, :classpath=>requires, :name=>"JDepend" - puts "Created jdepend.xml" + attr_writer :report_dir + + def report_dir + @report_dir || project._(:reports, :jdepend) + end + + attr_writer :fail_on_error + + def fail_on_error? + @fail_on_error.nil? ? false : @fail_on_error + end + + attr_writer :xml_output_file + + def xml_output_file + @xml_output_file || "#{self.report_dir}/jdepend.xml" + end + + attr_writer :html_output_file + + def html_output_file + @html_output_file || "#{self.report_dir}/jdepend.html" + end + + attr_writer :style_file + + def style_file + @style_file || "#{self.config_directory}/jdepend.xsl" + end + + def target_paths + @target_paths ||= [self.project.compile.target, self.project.test.compile.target] + end + + def to_options + { + :fail_on_error => project.jdepend.fail_on_error?, + # Set user home so that jdepend.properties will be loaded from there if present + :properties => { 'user.home' => project.jdepend.config_directory } + } + end + + protected + + def initialize(project) + @project = project + end + + attr_reader :project + + end + + module ProjectExtension + include Extension + + def jdepend + @jdepend ||= Buildr::JDepend::Config.new(project) + end + + after_define do |project| + if project.jdepend.enabled? + desc "Generate JDepend xml report." + project.task("jdepend:xml") do + puts "JDepend: Analyzing source code..." + mkdir_p File.dirname(project.jdepend.xml_output_file) + Buildr::JDepend.jdepend(project.jdepend.xml_output_file, + project.jdepend.target_paths.flatten.compact, + project.jdepend.to_options) + end + + desc "Run JDepend with Swing UI." + project.task("jdepend:swing") do + puts "JDepend: Analyzing source code..." + Buildr::JDepend.jdepend(nil, + project.jdepend.target_paths.flatten.compact, + project.jdepend.to_options) + end + + if project.jdepend.html_enabled? + xml_task = project.task("jdepend:xml") + desc "Generate JDepend html report." + project.task("jdepend:html" => xml_task) do + puts "JDepend: Generating report" + mkdir_p File.dirname(project.jdepend.html_output_file) + Buildr.ant "jdepend" do |ant| + ant.xslt :in => project.jdepend.xml_output_file, + :out => project.jdepend.html_output_file, + :style => project.jdepend.style_file + end + end + + end + end end end end end + +class Buildr::Project + include Buildr::JDepend::ProjectExtension +end Modified: buildr/trunk/doc/more_stuff.textile URL: http://svn.apache.org/viewvc/buildr/trunk/doc/more_stuff.textile?rev=1195152&r1=1195151&r2=1195152&view=diff ============================================================================== --- buildr/trunk/doc/more_stuff.textile (original) +++ buildr/trunk/doc/more_stuff.textile Sun Oct 30 11:49:16 2011 @@ -738,7 +738,7 @@ h4. Buildr plugin for IDEA Also, check out the "Buildr plugin for IDEA":http://www.digitalsanctum.com/buildr-plug-in/ (IDEA 7 and later). Once installed, open your project with IDEA. If IDEA finds that you have Buildr installed and finds a buildfile in the project's directory, it will show all the tasks available for that project. To run a task, double-click it. When the task completes, IDEA will show the results in the Buildr Output window. -h2(#cobertura_emma_jdepend). Cobertura, Emma, JDepend +h2(#cobertura_emma). Cobertura, Emma You can use "Cobertura":http://cobertura.sourceforge.net/ or "Emma":http://emma.sourceforge.net/ to instrument your code, run the tests and create a test coverage report in either HTML or XML format. @@ -783,20 +783,11 @@ end The @cobertura:check@ task supports all of the configuration parameters allowed by the @cobertura-check@ Ant task (as "documented here":http://cobertura.sourceforge.net/anttaskreference.html). Configuration parameters are "Ruby-ized" (as demonstrated in the example above). -You can use "JDepend":http://clarkware.com/software/JDepend.html on to generate design quality metrics. There are three tasks this time, the eye candy one: - -{% highlight sh %} -$ buildr jdepend:swing -{% endhighlight %} - -The other two tasks are @jdepend:text@ and @jdepend:xml@. - We want Buildr to load fast, and not everyone cares for these tasks, so we don't include them by default. If you want to use one of them, you need to require it explicitly. The proper way to do it in Ruby: {% highlight ruby %} require 'buildr/java/cobertura' require 'buildr/java/emma' -require 'buildr/jdepend' {% endhighlight %} You may want to add those to the Buildfile. Alternatively, you can use these tasks for all your projects without modifying the Buildfile. One convenient method is to add these lines to the @buildr.rb@ file in the @.buildr@ directory under your home directory. @@ -804,7 +795,6 @@ You may want to add those to the Buildfi Another option is to require it from the command line (@--require@ or @-r@), for example: {% highlight sh %} -$ buildr --require buildr/jdepend jdepend:swing $ buildr -rbuildr/java/cobertura cobertura:html {% endhighlight %} @@ -856,6 +846,29 @@ The extension will include the source an By default javancss will look for all configuration files in the src/main/etc/javancss directory but this can be overriden by the setting the "javancss.config_directory" parameter. The "javancss:xml" task will be defined if the "javancss.enabled" property is set to true. If the xsl file named "javancss2html.xsl" is present in the configuration directory then a "javancss:html" task will be defined. The name of the xsl file can be overridden by the parameter "javancss.style_file". +h2(#jdepend). JDepend + +"JDepend":http://clarkware.com/software/JDepend.html is integrated into Buildr through an extension. The extension adds the "jdepend:xml" task that generates an xml report, "jdepend:swing" that shows a Swing UI, and may add a "jdepend:html" task if an appropriate xsl is present. A typical project that uses the extension may look something like; + +{% highlight ruby %} +require 'buildr/jdepend' + +define "foo" do + project.version = "1.0.0" + + define "bar" do ... end + + jdepend.enabled = true + jdepend.config_directory = _('etc/jdepend') + jdepend.target_paths << project('bar').compile.target + +end +{% endhighlight %} + +The extension will include the compiled source and test directories of the project when invoking the JDepend tool. These can be added to by the parameters "jdepend.target_paths". + +By default JDepend will look for all configuration files in the src/main/etc/jdepend directory but this can be overriden by the setting the "jdepend.config_directory" parameter. The "jdepend:xml" and "jdepend:swing" task will be defined if the "jdepend.enabled" property is set to true. If a "jdepend.properties" is included in the configuration directory then jdepend will load it during the analysis. If the xsl file named "jdepend.xsl" is present in the configuration directory then a "jdepend:html" task will be defined. The name of the xsl file can be overridden by the parameter "jdepend.style_file". + h2(#pmd). PMD PMD is integrated into Buildr through an extension. The extension adds the "pmd:rule:xml" and "pmd:rule:html" tasks. A typical project that uses the extension may look something like;