<commit_before>require 'spec_helper'
require 'metric_fu/cli/client'

describe MetricFu do
  let(:helper)  { MetricFu::Cli::Helper.new }

  before do
    setup_fs
  end

  def base_directory
    directory('base_directory')
  end

  def output_directory
    directory('output_directory')
  end

  def data_directory
    directory('data_directory')
  end

  context "given configured metrics, when run" do

    before do

      # TODO: Should probably use some sort of fake metric
      # to speed up tests. For now, just configuring with a
      # limited set, so we can test the basic functionality
      # without significantly slowing down the specs.
      MetricFu.configuration.configure_metrics do |metric|
        if metric.name == :churn
          metric.enable
          metric.activated = true
        else
          metric.enabled = false
        end
      end

    end

    it "creates a report yaml file" do
      expect { metric_fu }.to create_file("#{base_directory}/report.yml")
    end

    it "creates a data yaml file" do
      expect { metric_fu }.to create_file("#{data_directory}/#{Time.now.strftime("%Y%m%d")}.yml")
    end

    it "creates a report html file" do
      expect { metric_fu }.to create_file("#{output_directory}/index.html")
    end

    context "with configured formatter" do
      it "outputs using configured formatter" do
        expect {
          MetricFu::Configuration.run do |config|
            config.configure_formatter(:yaml)
          end
          metric_fu
        }.to create_file("#{base_directory}/report.yml")
      end

      it "doesn't output using formatters not configured" do
        expect {
          MetricFu::Configuration.run do |config|
            config.configure_formatter(:yaml)
          end
          metric_fu
        }.to_not create_file("#{output_directory}/index.html")
      end

    end

    context "with command line formatter" do
      it "outputs using command line formatter" do
        expect { metric_fu "--format yaml"}.to create_file("#{base_directory}/report.yml")
      end

      it "doesn't output using formatters not configured" do
        expect { metric_fu "--format yaml"}.to_not create_file("#{output_directory}/index.html")
      end

    end

    context "with configured and command line formatter" do

      before do
        MetricFu::Configuration.run do |config|
          config.configure_formatter(:html)
        end
      end

      it "outputs using command line formatter" do
        expect { metric_fu "--format yaml"}.to create_file("#{base_directory}/report.yml")
      end

      it "doesn't output using configured formatter (cli takes precedence)" do
        expect { metric_fu "--format yaml"}.to_not create_file("#{output_directory}/index.html")
      end

    end

    context "with configured specified out" do
      it "outputs using configured out" do
        expect {
          MetricFu::Configuration.run do |config|
            config.configure_formatter(:yaml, "customreport.yml")
          end
          metric_fu
        }.to create_file("#{base_directory}/customreport.yml")
      end

      it "doesn't output using formatters not configured" do
        expect {
          MetricFu::Configuration.run do |config|
            config.configure_formatter(:yaml, "customreport.yml")
          end
          metric_fu
        }.to_not create_file("#{base_directory}/report.yml")
      end

    end

    context "with command line specified formatter + out" do
      it "outputs to the specified path" do
        expect { metric_fu "--format yaml --out customreport.yml"}.to create_file("#{base_directory}/customreport.yml")
      end

      it "doesn't output to default path" do
        expect { metric_fu "--format yaml --out customreport.yml"}.to_not create_file("#{base_directory}/report.yml")
      end

    end

    context "with command line specified out only" do
      it "outputs to the specified path" do
        expect { metric_fu "--out customdir --no-open"}.to create_file("#{base_directory}/customdir/index.html")
      end

      it "doesn't output to default path" do
        expect { metric_fu "--out customdir --no-open"}.to_not create_file("#{output_directory}/index.html")
      end

    end


    after do
      MetricFu::Configuration.run do |config|
        config.formatters.clear
      end
    end
  end

  context "given other options" do

    it "displays help" do
      out = metric_fu "--help"
      out.should include helper.banner
    end

    it "displays version" do
      out = metric_fu "--version"
      out.should include "#{MetricFu::VERSION}"
    end

    it "errors on unknown flags" do
      out = metric_fu "--asdasdasda"
      out.should include 'invalid option'
    end

  end

  after do
    cleanup_fs
  end

  def metric_fu(options = "--no-open")
    message = ''
    out = MfDebugger::Logger.capture_output {
      begin
        argv = Shellwords.shellwords(options)
        MetricFu::Cli::Client.new.run(argv)
        # Catch system exit so that it doesn't halt spec.
      rescue SystemExit => system_exit
        status =  system_exit.success? ? "SUCCESS" : "FAILURE"
        message << "#{status} with code #{system_exit.status}: " <<
          "#{system_exist.message} #{system_exit.backtrace}"
      end
    }
    STDERR.puts message if message.start_with?('FAILURE')
    out
  end

end<commit_msg>[FIX] system_exist type as system_exit<commit_after>require 'spec_helper'
require 'metric_fu/cli/client'

describe MetricFu do
  let(:helper)  { MetricFu::Cli::Helper.new }

  before do
    setup_fs
  end

  def base_directory
    directory('base_directory')
  end

  def output_directory
    directory('output_directory')
  end

  def data_directory
    directory('data_directory')
  end

  context "given configured metrics, when run" do

    before do

      # TODO: Should probably use some sort of fake metric
      # to speed up tests. For now, just configuring with a
      # limited set, so we can test the basic functionality
      # without significantly slowing down the specs.
      MetricFu.configuration.configure_metrics do |metric|
        if metric.name == :churn
          metric.enable
          metric.activated = true
        else
          metric.enabled = false
        end
      end

    end

    it "creates a report yaml file" do
      expect { metric_fu }.to create_file("#{base_directory}/report.yml")
    end

    it "creates a data yaml file" do
      expect { metric_fu }.to create_file("#{data_directory}/#{Time.now.strftime("%Y%m%d")}.yml")
    end

    it "creates a report html file" do
      expect { metric_fu }.to create_file("#{output_directory}/index.html")
    end

    context "with configured formatter" do
      it "outputs using configured formatter" do
        expect {
          MetricFu::Configuration.run do |config|
            config.configure_formatter(:yaml)
          end
          metric_fu
        }.to create_file("#{base_directory}/report.yml")
      end

      it "doesn't output using formatters not configured" do
        expect {
          MetricFu::Configuration.run do |config|
            config.configure_formatter(:yaml)
          end
          metric_fu
        }.to_not create_file("#{output_directory}/index.html")
      end

    end

    context "with command line formatter" do
      it "outputs using command line formatter" do
        expect { metric_fu "--format yaml"}.to create_file("#{base_directory}/report.yml")
      end

      it "doesn't output using formatters not configured" do
        expect { metric_fu "--format yaml"}.to_not create_file("#{output_directory}/index.html")
      end

    end

    context "with configured and command line formatter" do

      before do
        MetricFu::Configuration.run do |config|
          config.configure_formatter(:html)
        end
      end

      it "outputs using command line formatter" do
        expect { metric_fu "--format yaml"}.to create_file("#{base_directory}/report.yml")
      end

      it "doesn't output using configured formatter (cli takes precedence)" do
        expect { metric_fu "--format yaml"}.to_not create_file("#{output_directory}/index.html")
      end

    end

    context "with configured specified out" do
      it "outputs using configured out" do
        expect {
          MetricFu::Configuration.run do |config|
            config.configure_formatter(:yaml, "customreport.yml")
          end
          metric_fu
        }.to create_file("#{base_directory}/customreport.yml")
      end

      it "doesn't output using formatters not configured" do
        expect {
          MetricFu::Configuration.run do |config|
            config.configure_formatter(:yaml, "customreport.yml")
          end
          metric_fu
        }.to_not create_file("#{base_directory}/report.yml")
      end

    end

    context "with command line specified formatter + out" do
      it "outputs to the specified path" do
        expect { metric_fu "--format yaml --out customreport.yml"}.to create_file("#{base_directory}/customreport.yml")
      end

      it "doesn't output to default path" do
        expect { metric_fu "--format yaml --out customreport.yml"}.to_not create_file("#{base_directory}/report.yml")
      end

    end

    context "with command line specified out only" do
      it "outputs to the specified path" do
        expect { metric_fu "--out customdir --no-open"}.to create_file("#{base_directory}/customdir/index.html")
      end

      it "doesn't output to default path" do
        expect { metric_fu "--out customdir --no-open"}.to_not create_file("#{output_directory}/index.html")
      end

    end


    after do
      MetricFu::Configuration.run do |config|
        config.formatters.clear
      end
    end
  end

  context "given other options" do

    it "displays help" do
      out = metric_fu "--help"
      out.should include helper.banner
    end

    it "displays version" do
      out = metric_fu "--version"
      out.should include "#{MetricFu::VERSION}"
    end

    it "errors on unknown flags" do
      out = metric_fu "--asdasdasda"
      out.should include 'invalid option'
    end

  end

  after do
    cleanup_fs
  end

  def metric_fu(options = "--no-open")
    message = ''
    out = MfDebugger::Logger.capture_output {
      begin
        argv = Shellwords.shellwords(options)
        MetricFu::Cli::Client.new.run(argv)
        # Catch system exit so that it doesn't halt spec.
      rescue SystemExit => system_exit
        status =  system_exit.success? ? "SUCCESS" : "FAILURE"
        message << "#{status} with code #{system_exit.status}: "
        message << "#{system_exit.message} #{system_exit.backtrace}"
      end
    }
    STDERR.puts message if message.start_with?('FAILURE')
    out
  end

end
{'fraction_non_alphanumeric': 0.09547645532072674, 'fraction_numerical': 0.0, 'mean_word_length': 2.449168797953964, 'pattern_counts': {'":': 0, '<': 11, '<?xml version=': 0, '>': 5, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '6784665', 'n_tokens_mistral': 3178, 'n_tokens_neox': 2941, 'n_words': 912}