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 2011/10/29 02:28:41 UTC
svn commit: r1190713 - in /buildr/trunk: CHANGELOG addon/buildr/pmd.rake
doc/more_stuff.textile
Author: donaldp
Date: Sat Oct 29 00:28:41 2011
New Revision: 1190713
URL: http://svn.apache.org/viewvc?rev=1190713&view=rev
Log:
Add a PMD extension and some minimalistic documentation
Added:
buildr/trunk/addon/buildr/pmd.rake
Modified:
buildr/trunk/CHANGELOG
buildr/trunk/doc/more_stuff.textile
Modified: buildr/trunk/CHANGELOG
URL: http://svn.apache.org/viewvc/buildr/trunk/CHANGELOG?rev=1190713&r1=1190712&r2=1190713&view=diff
==============================================================================
--- buildr/trunk/CHANGELOG (original)
+++ buildr/trunk/CHANGELOG Sat Oct 29 00:28:41 2011
@@ -1,6 +1,7 @@
1.4.7 (Pending)
* Added: Add a Checkstyle extension.
* Added: Add a JavaNCSS extension.
+* Added: Add a PMD extension.
* Change: Parameterize the the directory where the top level cobertura tasks will generate
reports. Specify using Buildr::Cobertura.report_dir = '....'
* Fixed: BUILDR-611 Buildr should not unnecessarily recompile Java files
Added: buildr/trunk/addon/buildr/pmd.rake
URL: http://svn.apache.org/viewvc/buildr/trunk/addon/buildr/pmd.rake?rev=1190713&view=auto
==============================================================================
--- buildr/trunk/addon/buildr/pmd.rake (added)
+++ buildr/trunk/addon/buildr/pmd.rake Sat Oct 29 00:28:41 2011
@@ -0,0 +1,166 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with this
+# work for additional information regarding copyright ownership. The ASF
+# licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations under
+# the License.
+
+module Buildr
+ # Provides the <code>pmd:rule:xml</code>, <code>pmd:rule:html</code>, <code>pmd:cpd:xml</code>
+ # and <code>pmd:cpd:html</code> tasks.
+ #
+ # Require explicitly using <code>require "buildr/pmd"</code>.
+ module Pmd
+
+ class << self
+
+ # The specs for requirements
+ def dependencies
+ [
+ 'pmd:pmd:jar:4.2.6',
+ 'jaxen:jaxen:jar:1.1.1',
+ 'asm:asm:jar:3.2'
+ ]
+ end
+
+ def pmd(rule_set_files, format, output_file_prefix, source_paths, options = {})
+ dependencies = (options[:dependencies] || []) + self.dependencies
+ cp = Buildr.artifacts(dependencies).each(&:invoke).map(&:to_s)
+ (options[:rule_set_paths] || []).each {|p| cp << p}
+
+ puts "PMD: Analyzing source code..."
+ mkdir_p File.dirname(output_file_prefix)
+
+ Buildr.ant("pmd-report") do |ant|
+ ant.taskdef :name=> 'pmd', :classpath => cp.join(';'), :classname => 'net.sourceforge.pmd.ant.PMDTask'
+ ant.pmd :shortFilenames => true, :rulesetfiles => rule_set_files.join(',') do
+ ant.formatter :type => format, :toFile => "#{output_file_prefix}.#{format}"
+ source_paths.each do |src|
+ ant.fileset :dir=> src, :includes=>'**/*.java'
+ end
+ end
+
+ end
+ end
+
+ def cpd(format, output_file_prefix, source_paths, options = {})
+ dependencies = (options[:dependencies] || []) + self.dependencies
+ cp = Buildr.artifacts(dependencies).each(&:invoke).map(&:to_s)
+
+ puts "PMD-CPD: Analyzing source code..."
+ mkdir_p File.dirname(output_file_prefix)
+
+ Buildr.ant("cpd-report") do |ant|
+ ant.taskdef :name=> 'cpd', :classpath => cp.join(';'), :classname => 'net.sourceforge.pmd.cpd.CPDTask'
+ ant.cpd :format => format, :minimumTokenCount => 100, :outputFile => "#{output_file_prefix}.#{format}" do
+ source_paths.each do |src|
+ ant.fileset :dir=> src, :includes=>'**/*.java'
+ end
+ end
+
+ end
+ end
+ end
+
+ class Config
+
+ def enable
+ @enabled = true
+ end
+
+ def enabled?
+ !!@enabled
+ end
+
+ attr_writer :rule_set_files
+
+ def rule_set_files
+ @rule_set_files || ['basic','imports','unusedcode']
+ end
+
+ attr_writer :rule_set_paths
+
+ def rule_set_paths
+ @rule_set_paths ||= []
+ end
+
+ attr_writer :report_dir
+
+ def report_dir
+ @report_dir || project._(:reports, :pmd)
+ end
+
+ attr_writer :output_file_prefix
+
+ def output_file_prefix
+ @output_file_prefix || "#{self.report_dir}/pmd"
+ end
+
+ attr_writer :cpd_output_file_prefix
+
+ def cpd_output_file_prefix
+ @cpd_output_file_prefix || "#{self.report_dir}/cpd"
+ end
+
+ def source_paths
+ @source_paths ||= [self.project.compile.sources, self.project.test.compile.sources]
+ end
+
+ def flat_source_paths
+ source_paths.flatten.compact
+ end
+
+ protected
+
+ def initialize(project)
+ @project = project
+ end
+
+ attr_reader :project
+ end
+
+ module ProjectExtension
+ include Extension
+
+ def pmd
+ @pmd ||= Buildr::Pmd::Config.new(project)
+ end
+
+ after_define do |project|
+ if project.pmd.enabled?
+ desc "Generate pmd xml report."
+ project.task("pmd:rule:xml") do
+ Buildr::Pmd.pmd(project.pmd.rule_set_files, 'xml', project.pmd.output_file_prefix, project.pmd.flat_source_paths, :rule_set_paths => project.pmd.rule_set_paths)
+ end
+
+ desc "Generate pmd html report."
+ project.task("pmd:rule:html") do
+ Buildr::Pmd.pmd(project.pmd.rule_set_files, 'html', project.pmd.output_file_prefix, project.pmd.flat_source_paths, :rule_set_paths => project.pmd.rule_set_paths)
+ end
+
+ desc "Generate pmd cpd xml report."
+ project.task("pmd:cpd:xml") do
+ Buildr::Pmd.cpd('xml', project.pmd.cpd_output_file_prefix, project.pmd.flat_source_paths)
+ end
+
+ desc "Generate pmd cpd text report."
+ project.task("pmd:cpd:text") do
+ Buildr::Pmd.cpd('text', project.pmd.cpd_output_file_prefix, project.pmd.flat_source_paths)
+ end
+ end
+ end
+ end
+ end
+end
+
+class Buildr::Project
+ include Buildr::Pmd::ProjectExtension
+end
Modified: buildr/trunk/doc/more_stuff.textile
URL: http://svn.apache.org/viewvc/buildr/trunk/doc/more_stuff.textile?rev=1190713&r1=1190712&r2=1190713&view=diff
==============================================================================
--- buildr/trunk/doc/more_stuff.textile (original)
+++ buildr/trunk/doc/more_stuff.textile Sat Oct 29 00:28:41 2011
@@ -810,7 +810,7 @@ $ buildr -rbuildr/java/cobertura cobertu
h2(#checkstyle). Checkstyle
-Checkstyle is integrated into Buildr through an extension. The extension adds the "checkstyle:xml" task that generates an xml report listing checkstyle violations and may add a "checkstyle:html" task if an appropriate xsl is preset. A typical project that uses the extension may look something like;
+Checkstyle is integrated into Buildr through an extension. The extension adds the "checkstyle:xml" task that generates an xml report listing checkstyle violations and may add a "checkstyle:html" task if an appropriate xsl is present. A typical project that uses the extension may look something like;
{% highlight ruby %}
require 'buildr/checkstyle'
@@ -835,7 +835,7 @@ If the xsl file named "checkstyle-report
h2(#javancss). JavaNCSS
-JavaNCSS is integrated into Buildr through an extension. The extension adds the "javancss:xml" task that generates an xml report and may add a "javancss:html" task if an appropriate xsl is preset. A typical project that uses the extension may look something like;
+JavaNCSS is integrated into Buildr through an extension. The extension adds the "javancss:xml" task that generates an xml report and may add a "javancss:html" task if an appropriate xsl is present. A typical project that uses the extension may look something like;
{% highlight ruby %}
require 'buildr/javancss'
@@ -854,7 +854,34 @@ end
The extension will include the source and test directories of the project when invoking the javancss tool. These can be added to by the parameters "javancss.source_paths".
-By default checkstyle 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".
+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(#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;
+
+
+{% highlight ruby %}
+require 'buildr/javancss'
+
+define "foo" do
+ project.version = "1.0.0"
+
+ define "bar" do ... end
+
+ pmd.enable
+ pmd.rule_set_paths = _('etc/pmd') + "/"
+ pmd.source_paths << project('bar')._(:source, :main, :java)
+ pmd.rule_set_files = ['basic','imports','unusedcode','logging-java','finalizers']
+
+end
+{% endhighlight %}
+
+The "pmd:rule:xml" task will be defined if the "pmd.enable" method is invoked.
+
+The extension will include the source and test directories of the project when invoking the pmd tool. These can be added to by the parameters "pmd.source_paths".
+
+By default the pmd rule files 'basic','imports' and 'unusedcode' will be evaluated but this can be overriden by the "pmd.rule_set_files" parameter. The rule sets will be loaded from the classpath and this can be added to by modifying the "pmd.rule_set_paths" parameter.
h2(#jaxb_xjc). JAXB Xjc Compiler