class Release < ActiveRecord::Base TRUNK_RELEASE_NAME = 'bleeding_edge' belongs_to :plugin validates_presence_of :plugin, :name, :source_url, :revision_number validates_format_of :email, :with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i, :if => Proc.new { |v| !v.email.blank? } before_save :normalise_source_url before_validation :get_revision_number_from_repository before_create :load_data_from_plugin_meta def load_data_from_plugin_meta begin about = get_about_file about.only(:author, :email, :homepage, :summary, :description, :license).keys.each do |key| write_attribute(key, about[key.to_s]) end write_attribute('has_meta_file', true) rescue Exception write_attribute('has_meta_file', false) # do nothing for now. end true end def test_results if self.name == TRUNK_RELEASE_NAME self.plugin.test_results.find(:all, :conditions => ["revision_number > ?", self.plugin.latest_release.revision_number]) else self.plugin.test_results.find(:all, :conditions => ["revision_number = ?", self.revision_number]) end end def health TestResult.average(:percentage_passed, :conditions => ["plugin_id = ? and revision_number = ?", self.plugin.id, self.revision_number]) end protected def normalise_source_url write_attribute('source_url', StringUtilities.normalise_url(read_attribute('source_url'))) end def get_about_file RemoteResources.remote_yaml_document(self.source_url + 'about.yml') end def get_revision_number_from_repository if self.revision_number.blank? self.revision_number = RemoteResources.repository_info(self.source_url)['Last Changed Rev'].value.to_i end true end end #class ReleaseMetaDataMissing < Exception #end