# 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 scss_lint:html
and scss_lint:xml
tasks.
# Require explicitly using require "buildr/scss_lint"
.
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
source_paths = project.scss_lint.source_paths.flatten.compact
source_paths.each do |path|
path.respond_to?(:invoke) ? path.invoke : project.file(path).invoke
end
puts "ScssLint: Analyzing source code..."
Buildr::ScssLint.scss_lint(project.scss_lint.xml_output_file,
source_paths,
: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