# 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.

namespace 'metrics' do
  desc 'run Saikuro reports'
  task 'saikuro' do
    gem 'atoulme-Saikuro'
    require 'saikuro'
    output_dir = File.expand_path(File.join(File.dirname(__FILE__), '..', '_reports', 'saikuro'))
    base_dir = Pathname.new(File.expand_path(File.join(File.dirname(__FILE__), '..')))
    rb_files = %w(lib addon).collect { |folder|
      FileList[File.expand_path(File.join(File.dirname(__FILE__), '..', folder, '**', '*.rb'))]
    }.flatten.collect {|path| 
      Pathname.new(path).relative_path_from(base_dir).to_s
    }
    SaikuroRunner.new.run(rb_files, output_dir)
  end
  
  desc 'generate ccn treemap'
  task 'ccn_treemap' do
    require 'saikuro_treemap'
    SaikuroTreemap.generate_treemap :code_dirs => %w(lib addon), :output_file => '_reports/saikuro_treemap.html'
  end
end

desc 'Run all metrics tools'
task 'metrics' => %w(metrics:saikuro metrics:ccn_treemap)