project_content.rb 3.35 KB
class MezuroPlugin::ProjectContent < Article
  include ActionView::Helpers::TagHelper

  settings_items :project_id

  validate_on_create :validate_kalibro_project_name
  validate_on_create :validate_repository_url

  def self.short_description
    'Mezuro project'
  end

  def self.description
    'Software project tracked by Kalibro'
  end

  def to_html(options = {})
    lambda do
      render :file => 'content_viewer/show_project.rhtml'
    end
  end

  def project
    begin
      @project ||= Kalibro::Project.find(project_id)
    rescue Exception => error
      errors.add_to_base(error.message)
    end
    @project
  end

  def repositories
    begin
      @repositories ||= Kalibro::Repository.repositories_of(project_id)
    rescue Exception => error
      errors.add_to_base(error.message)
    end
    @repositories
  end

  def processing(repository_id)
    begin
      if Kalibro::Processing.has_ready_processing(repository_id)
        @processing ||= Kalibro::Processing.last_ready_processing_of(repository_id)
      else
        @processing = Kalibro::Processing.last_processing_of(repository_id)
      end
    rescue Exception => error
      errors.add_to_base(error.message)
    end
    @processing
  end

  def processing_with_date(repository_id, date)
    begin
      if Kalibro::Processing.has_processing_after(repository_id, date)
        @processing ||= Kalibro::Processing.first_processing_after(repository_id, date)
      elsif Kalibro::Processing.has_processing_before(repository_id, date)
        @processing ||= Kalibro::Processing.last_processing_before(repository_id, date)
      end
    rescue Exception => error
      errors.add_to_base(error.message)
    end
    @processing
  end

  def module_result(repository_id, date = nil)
    @processing ||= date.nil? ? processing(repository_id) : processing_with_date(repository_id, date)
    begin
      @module_result ||= Kalibro::ModuleResult.find(@processing.results_root_id)
    rescue Exception => error
      errors.add_to_base(error.message)
    end
    @module_result
  end

  def result_history(module_result_id)
    begin
      @result_history ||= Kalibro::MetricResult.history_of(module_result_id)
    rescue Exception => error
      errors.add_to_base(error.message)
    end
  end

  def description=(value)
    @description=value
  end
  
  def description
    @description
  end

  def repositories=(value)
    @repositories = value.kind_of?(Array) ? value : [value]
    @repositories = @repositories.map { |element| to_repository(element) }
  end

  after_save :send_project_to_service
  after_destroy :destroy_project_from_service

  private
  
  def self.to_repository value
    value.kind_of?(Hash) ? Kalibro::Repository.new(value) : value
  end

  def validate_repository_url
    if(@repositories.nil? || repository_url == "")
      errors.add_to_base("Repository URL is mandatory")
    end
  end

  def send_project_to_service
    created_project = create_kalibro_project
    created_project.process_project(periodicity_in_days)
  end

  def create_kalibro_project
   Kalibro::Project.create(
      :name => name,
      :license => project_license,
      :description => description,
      :repository => {
        :type => repository_type,
        :address => repository_url
      },
      :configuration_name => configuration_name
    )
  end

  def destroy_project_from_service
    project.destroy unless project.nil?
  end

end