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 2014/05/24 05:57:22 UTC

[6/7] git commit: Add scss_lint tasks scss_lint:xml and scss_lint:html that support source code analysis of SCSS files.

Add scss_lint tasks scss_lint:xml and scss_lint:html that support source code analysis of SCSS files.


Project: http://git-wip-us.apache.org/repos/asf/buildr/repo
Commit: http://git-wip-us.apache.org/repos/asf/buildr/commit/44082045
Tree: http://git-wip-us.apache.org/repos/asf/buildr/tree/44082045
Diff: http://git-wip-us.apache.org/repos/asf/buildr/diff/44082045

Branch: refs/heads/master
Commit: 44082045e1781983ddf83764a7ce6e1977c6e557
Parents: 7ed3fac
Author: Peter Donald <pe...@realityforge.org>
Authored: Sat May 24 13:33:54 2014 +1000
Committer: Peter Donald <pe...@realityforge.org>
Committed: Sat May 24 13:56:07 2014 +1000

----------------------------------------------------------------------
 CHANGELOG                         |   2 +
 addon/buildr/scss_link.rake       | 195 +++++++++++++++++++++++++++++++++
 addon/buildr/scss_lint-report.xsl |  79 +++++++++++++
 doc/more_stuff.textile            |  31 ++++++
 4 files changed, 307 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/buildr/blob/44082045/CHANGELOG
----------------------------------------------------------------------
diff --git a/CHANGELOG b/CHANGELOG
index 772742d..22c84c3 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,8 @@
 1.4.17 (Pending)
 * Fixed:  Fix the vcs detection in IDEA addon for 1.8.6 (!) versions
           of ruby by reordering blocks.
+* Added:  Add scss_lint tasks scss_lint:xml and scss_lint:html that
+          support source code analysis of SCSS files.
 * Added:  Import 'buildr/custom_pom' addon to make it easier to
           build POMs for projects publishing to Maven Central.
 * Added:  Add flag to allow non portable extensions in wsgen addon.

http://git-wip-us.apache.org/repos/asf/buildr/blob/44082045/addon/buildr/scss_link.rake
----------------------------------------------------------------------
diff --git a/addon/buildr/scss_link.rake b/addon/buildr/scss_link.rake
new file mode 100644
index 0000000..bd79994
--- /dev/null
+++ b/addon/buildr/scss_link.rake
@@ -0,0 +1,195 @@
+# 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>scss_lint:html</code> and <code>scss_lint:xml</code> tasks.
+  # Require explicitly using <code>require "buildr/scss_lint"</code>.
+  module ScssLint
+    class << self
+
+      def scss_lint(output_file, source_paths, options = {})
+        args = []
+        if ENV['BUNDLE_GEMFILE']
+          args << 'bundle'
+          args << 'exec'
+        end
+        args << 'scss-lint'
+        if options[:configuration_file]
+          args << '--config'
+          args << options[:configuration_file]
+        end
+        if options[:file_excludes]
+          args << '--exclude'
+          args << options[:file_excludes].join(',')
+        end
+        if options[:formatter]
+          args << '--format'
+          args << options[:formatter]
+        end
+        if options[:linter_includes] && !options[:linter_includes].empty?
+          args << '--include-linter'
+          args << options[:linter_includes].join(',')
+        end
+        if options[:linter_excludes] && !options[:linter_excludes].empty?
+          args << '--exclude-linter'
+          args << options[:linter_excludes].join(',')
+        end
+
+        source_paths.each do |source_path|
+          args << source_path
+        end
+
+        mkdir_p File.dirname(output_file)
+        File.open(output_file, 'wb') do |f|
+          f.write `#{args.join(' ')}`
+        end
+      end
+    end
+
+    class Config
+      def enabled?
+        File.exist?(self.configuration_file)
+      end
+
+      def html_enabled?
+        File.exist?(self.style_file)
+      end
+
+      attr_writer :config_directory
+
+      def config_directory
+        @config_directory || project._(:source, :main, :etc, :scss_lint)
+      end
+
+      attr_writer :report_dir
+
+      def report_dir
+        @report_dir || project._(:reports, :scss_lint)
+      end
+
+      attr_writer :file_excludes
+
+      def file_excludes
+        @file_excludes ||= []
+      end
+
+      attr_writer :linter_includes
+
+      def linter_includes
+        @linter_includes ||= []
+      end
+
+      attr_writer :linter_excludes
+
+      def linter_excludes
+        @linter_excludes ||= []
+      end
+
+      attr_writer :configuration_file
+
+      def configuration_file
+        @configuration_file || "#{self.config_directory}/checks.yml"
+      end
+
+      attr_writer :format
+
+      def format
+        @format || 'XML'
+      end
+
+      attr_writer :xml_output_file
+
+      def xml_output_file
+        @xml_output_file || "#{self.report_dir}/scss_lint.xml"
+      end
+
+      attr_writer :html_output_file
+
+      def html_output_file
+        @html_output_file || "#{self.report_dir}/scss_lint.html"
+      end
+
+      attr_writer :style_file
+
+      def style_file
+        unless @style_file
+          project_xsl = "#{self.config_directory}/scss_lint-report.xsl"
+          if File.exist?(project_xsl)
+            @style_file = project_xsl
+          else
+            @style_file = "#{File.dirname(__FILE__)}/scss_lint-report.xsl"
+          end
+        end
+        @style_file
+      end
+
+      def source_paths
+        @source_paths ||= [self.project._(:source, :main, :webapp, :sass)]
+      end
+
+      protected
+
+      def initialize(project)
+        @project = project
+      end
+
+      attr_reader :project
+
+    end
+
+    module ProjectExtension
+      include Extension
+
+      def scss_lint
+        @scss_lint ||= Buildr::ScssLint::Config.new(project)
+      end
+
+      after_define do |project|
+        if project.scss_lint.enabled?
+          desc "Generate scss-lint xml report."
+          project.task("scss_lint:xml") do
+            puts "ScssLint: Analyzing source code..."
+            Buildr::ScssLint.scss_lint(project.scss_lint.xml_output_file,
+                                       project.scss_lint.source_paths.flatten.compact,
+                                       :formatter => project.scss_lint.format,
+                                       :configuration_file => project.scss_lint.configuration_file,
+                                       :file_excludes => project.scss_lint.file_excludes,
+                                       :linter_includes => project.scss_lint.linter_includes,
+                                       :linter_excludes => project.scss_lint.linter_excludes)
+          end
+
+          if project.scss_lint.html_enabled?
+            xml_task = project.task("scss_lint:xml")
+            desc "Generate scss_lint html report."
+            project.task("scss_lint:html" => xml_task) do
+              puts "ScssLint: Generating report"
+              mkdir_p File.dirname(project.scss_lint.html_output_file)
+              Buildr.ant "scss_lint" do |ant|
+                ant.xslt :in => project.scss_lint.xml_output_file,
+                         :out => project.scss_lint.html_output_file,
+                         :style => project.scss_lint.style_file
+              end
+            end
+
+          end
+        end
+      end
+    end
+  end
+end
+
+class Buildr::Project
+  include Buildr::ScssLint::ProjectExtension
+end

http://git-wip-us.apache.org/repos/asf/buildr/blob/44082045/addon/buildr/scss_lint-report.xsl
----------------------------------------------------------------------
diff --git a/addon/buildr/scss_lint-report.xsl b/addon/buildr/scss_lint-report.xsl
new file mode 100644
index 0000000..b378207
--- /dev/null
+++ b/addon/buildr/scss_lint-report.xsl
@@ -0,0 +1,79 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+
+  <xsl:template match="/">
+    <html>
+      <head>
+        <title>ScssLint Violations</title>
+      </head>
+      <body bgcolor="#FFFFEF">
+        <p>
+          <b>Coding Style Check Results</b>
+        </p>
+        <table border="1" cellspacing="0" cellpadding="2">
+          <tr bgcolor="#CC9966">
+            <th colspan="2">
+              <b>Summary</b>
+            </th>
+          </tr>
+          <tr bgcolor="#F3F3E1">
+            <td>Files with errors</td>
+            <td>
+              <xsl:number level="any" value="count(descendant::file)"/>
+            </td>
+          </tr>
+          <tr bgcolor="#CCF3D0">
+            <td>Total errors</td>
+            <td>
+              <xsl:number level="any" value="count(descendant::issue)"/>
+            </td>
+          </tr>
+        </table>
+        <hr align="left" width="95%" size="1"/>
+        <p>The following are violations of the ScssLint Rules:</p>
+        <p/>
+        <xsl:apply-templates/>
+      </body>
+    </html>
+  </xsl:template>
+
+  <xsl:template match="file[issue]">
+    <table bgcolor="#AFFFFF" width="95%" border="1" cellspacing="0" cellpadding="2">
+      <tr>
+        <th>File:</th>
+        <td>
+          <xsl:value-of select="@name"/>
+        </td>
+      </tr>
+    </table>
+    <table bgcolor="#DFFFFF" width="95%" border="1" cellspacing="0" cellpadding="2">
+      <tr>
+        <th style="width: 4em; padding: 0; margin: 0;">Line</th>
+        <th style="width: 4em; padding: 0; margin: 0;">Column</th>
+        <th style="width: 7em; padding: 0; margin: 0;">Severity</th>
+        <th>Reason</th>
+      </tr>
+      <xsl:apply-templates select="issue"/>
+    </table>
+    <p/>
+  </xsl:template>
+
+  <xsl:template match="issue">
+    <tr>
+      <td>
+        <xsl:value-of select="@line"/>
+      </td>
+      <td>
+        <xsl:value-of select="@column"/>
+      </td>
+      <td>
+        <xsl:value-of select="@severity"/>
+      </td>
+      <td>
+        <xsl:value-of select="@reason"/>
+      </td>
+    </tr>
+  </xsl:template>
+
+</xsl:stylesheet>

http://git-wip-us.apache.org/repos/asf/buildr/blob/44082045/doc/more_stuff.textile
----------------------------------------------------------------------
diff --git a/doc/more_stuff.textile b/doc/more_stuff.textile
index 6f44f4b..fe26bba 100644
--- a/doc/more_stuff.textile
+++ b/doc/more_stuff.textile
@@ -1059,6 +1059,37 @@ The method compile_jaxb accepts either an array of files or a single file as the
 * <tt>:keep_content</tt>: By default the generated directory will be deleted. If <tt>true</tt> is specified for this parameter the directory will not be deleted.
 * <tt>:package</tt>: The package in which the source is generated.
 
+h2(#scss_lint). ScssLint
+
+"ScssLint":https://github.com/causes/scss-lint is integrated into Buildr through an extension. The extension adds the "scss_lint:xml" task to generate an xml report listing scss lint violations and a "scss_lint:html" task for a html variant of the same data. A buildr project that makes uses of the extension is expected to have added 'scss_lint' gem to the projects Gemfile by adding a line such as;
+
+{% highlight ruby %}
+gem 'scss-lint', '= 0.24.0'
+{% endhighlight %}
+
+A typical project that uses the extension may look something like;
+
+{% highlight ruby %}
+require 'buildr/scss_lint'
+
+define "foo" do
+  project.version = "1.0.0"
+
+  define "bar" do ... end
+
+  scss_lint.configuration_file = _('etc/scss_lint/checks.yml')
+  scss_lint.source_paths << project('web')._(:source, :main, :webapp, 'sass')
+  scss_lint.file_excludes = FileList["#{project('web')._(:source, :main, :webapp, 'sass')}/vendor/**/*"]
+end
+{% endhighlight %}
+
+By default scss_lint will look for all configuration files in the src/main/etc/scss_lint directory but this can be overriden by the setting the "scss_lint.config_directory" parameter. The "scss_lint:xml" task will be defined if the scss_lint rules file is found. The rules file is named "checks.yml" by default but can be overridden by setting the "scss_lint.configuration_file" parameter.
+
+[self.project._(:source, :main, :webapp, :sass)]
+The extension will lint the sass files in the "_(:source, :main, :webapp, :sass)" directory by default. The set of source directories linted can be controlled by the "scss_lint.source_paths" parameter.
+
+If the xsl file named "scss_lint-report.xsl" is present in the configuration directory then that will be used in the "scss_lint:html" task otherwise a default xsl included with buildr will be used. The name of the xsl file can be overridden by the parameter "scss_lint.style_file".
+
 h2(#anything_ruby). Anything Ruby Can Do
 
 Buildr is Ruby code.  That's an implementation detail for some, but a useful features for others.  You can use Ruby to keep your build scripts simple and DRY, tackle ad hoc tasks and write reusable features without the complexity of "plugins".