Class: Release
- Inherits:
-
ActiveRecord::Base
- Object
- ActiveRecord::Base
- Release
- Defined in:
- app/models/release.rb
Instance Attribute Summary collapse
-
#commit_not_found_error_message ⇒ Object
readonly
Returns the value of attribute commit_not_found_error_message.
Class Method Summary collapse
- .after(time) ⇒ Object
- .before(time) ⇒ Object
- .earliest ⇒ Object
- .for_deploy(deploy) ⇒ Object
- .for_projects(*projects) ⇒ Object
- .latest ⇒ Object
- .most_recent ⇒ Object
- .most_recent_commit ⇒ Object
- .reindex! ⇒ Object
- .search(query_string) ⇒ Object
- .to_environment(environment_name) ⇒ Object (also: to)
- .with_message ⇒ Object
Instance Method Summary collapse
- #antecedents ⇒ Object
- #build_changes_from_commits ⇒ Object
- #can_read_commits? ⇒ Boolean
- #commit0 ⇒ Object
- #commit0=(sha) ⇒ Object
- #commit1 ⇒ Object
- #commit1=(sha) ⇒ Object
- #environment_name=(value) ⇒ Object
- #ignore? ⇒ Boolean
- #load_commits! ⇒ Object
- #load_tickets! ⇒ Object
- #message=(value) ⇒ Object
- #name ⇒ Object
- #notification_recipients ⇒ Object
- #release_changes ⇒ Object
- #release_changes=(changes) ⇒ Object
- #release_changes_attributes=(params) ⇒ Object
- #release_date ⇒ Object (also: #date)
- #released_at ⇒ Object
- #search_vector_should_change? ⇒ Boolean
- #update_search_vector ⇒ Object
Instance Attribute Details
#commit_not_found_error_message ⇒ Object (readonly)
Returns the value of attribute commit_not_found_error_message.
137 138 139 |
# File 'app/models/release.rb', line 137 def @commit_not_found_error_message end |
Class Method Details
.after(time) ⇒ Object
54 55 56 57 |
# File 'app/models/release.rb', line 54 def after(time) return all if time.nil? where(arel_table[:created_at].gt(time)) end |
.before(time) ⇒ Object
49 50 51 52 |
# File 'app/models/release.rb', line 49 def before(time) return all if time.nil? where(arel_table[:created_at].lt(time)) end |
.earliest ⇒ Object
63 64 65 |
# File 'app/models/release.rb', line 63 def earliest last end |
.for_deploy(deploy) ⇒ Object
40 41 42 |
# File 'app/models/release.rb', line 40 def for_deploy(deploy) where(deploy_id: deploy.id) end |
.for_projects(*projects) ⇒ Object
35 36 37 38 |
# File 'app/models/release.rb', line 35 def for_projects(*projects) ids = projects.flatten.map { |project| project.is_a?(Project) ? project.id : project } where(project_id: ids) end |
.latest ⇒ Object
59 60 61 |
# File 'app/models/release.rb', line 59 def latest first end |
.most_recent ⇒ Object
71 72 73 74 75 76 77 78 79 80 81 82 |
# File 'app/models/release.rb', line 71 def most_recent joins <<-SQL INNER JOIN ( SELECT project_id, environment_name, MAX(created_at) AS created_at FROM releases GROUP BY project_id, environment_name ) AS most_recent_releases ON releases.project_id=most_recent_releases.project_id AND releases.environment_name=most_recent_releases.environment_name AND releases.created_at=most_recent_releases.created_at SQL end |
.most_recent_commit ⇒ Object
44 45 46 47 |
# File 'app/models/release.rb', line 44 def most_recent_commit release = where(arel_table[:commit1].not_eq("")).first release ? release.commit1 : Houston::NULL_GIT_COMMIT end |
.reindex! ⇒ Object
84 85 86 |
# File 'app/models/release.rb', line 84 def reindex! update_all "search_vector = to_tsvector('english', release_changes)" end |
.search(query_string) ⇒ Object
88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 |
# File 'app/models/release.rb', line 88 def search(query_string) config = PgSearch::Configuration.new({against: "plain_text"}, self) normalizer = PgSearch::Normalizer.new(config) = { dictionary: "english", tsvector_column: "search_vector" } query = PgSearch::Features::TSearch.new(query_string, , config.columns, self, normalizer) excerpt = ts_headline(:release_changes, query, start_sel: "<em>", stop_sel: "</em>", # Hack: show the entire value of `release_changes` min_words: 65534, max_words: 65535, max_fragments: 0) columns = (column_names - %w{release_changes search_vector}).map { |column| "releases.\"#{column}\"" } columns.push excerpt.as("release_changes") where(query.conditions).select(*columns) end |
.to_environment(environment_name) ⇒ Object Also known as: to
30 31 32 |
# File 'app/models/release.rb', line 30 def to_environment(environment_name) where(environment_name: environment_name) end |
.with_message ⇒ Object
67 68 69 |
# File 'app/models/release.rb', line 67 def where arel_table[:message].not_eq("") end |
Instance Method Details
#antecedents ⇒ Object
192 193 194 195 196 197 |
# File 'app/models/release.rb', line 192 def antecedents @antecedents ||= (tickets.map(&:antecedents) + commits.map(&:antecedents)) .flatten .uniq .sort end |
#build_changes_from_commits ⇒ Object
176 177 178 179 180 |
# File 'app/models/release.rb', line 176 def build_changes_from_commits self.release_changes = commits .map { |commit| ReleaseChange.from_commit(self, commit) } .reject { |change| change.tag.nil? } end |
#can_read_commits? ⇒ Boolean
127 128 129 |
# File 'app/models/release.rb', line 127 def can_read_commits? (commit_before.present? || commit0 == Houston::NULL_GIT_COMMIT) && commit_after.present? end |
#commit0 ⇒ Object
111 112 113 |
# File 'app/models/release.rb', line 111 def commit0 super || commit_before.try(:sha) end |
#commit0=(sha) ⇒ Object
115 116 117 |
# File 'app/models/release.rb', line 115 def commit0=(sha) super; self.commit_before = identify_commit(sha) end |
#commit1 ⇒ Object
119 120 121 |
# File 'app/models/release.rb', line 119 def commit1 super || commit_after.try(:sha) end |
#commit1=(sha) ⇒ Object
123 124 125 |
# File 'app/models/release.rb', line 123 def commit1=(sha) super; self.commit_after = identify_commit(sha) end |
#environment_name=(value) ⇒ Object
131 132 133 |
# File 'app/models/release.rb', line 131 def environment_name=(value) super value.downcase end |
#ignore? ⇒ Boolean
201 202 203 |
# File 'app/models/release.rb', line 201 def ignore? !project.show_release_notes_for?(environment_name) end |
#load_commits! ⇒ Object
182 183 184 |
# File 'app/models/release.rb', line 182 def load_commits! self.commits = project.commits.between(commit_before, commit_after) end |
#load_tickets! ⇒ Object
186 187 188 |
# File 'app/models/release.rb', line 186 def load_tickets! self.tickets = project.tickets.mentioned_by_commits(commits) end |
#message=(value) ⇒ Object
156 157 158 |
# File 'app/models/release.rb', line 156 def (value) super value.to_s.strip end |
#name ⇒ Object
152 153 154 |
# File 'app/models/release.rb', line 152 def name release_date.strftime("%A, %b %e, %Y") end |
#notification_recipients ⇒ Object
205 206 207 |
# File 'app/models/release.rb', line 205 def notification_recipients @notification_recipients ||= project.followers.unretired end |
#release_changes ⇒ Object
160 161 162 |
# File 'app/models/release.rb', line 160 def release_changes super.lines.map { |s| ReleaseChange.from_s(self, s) } end |
#release_changes=(changes) ⇒ Object
164 165 166 |
# File 'app/models/release.rb', line 164 def release_changes=(changes) super changes.map(&:to_s).join("\n") end |
#release_changes_attributes=(params) ⇒ Object
168 169 170 171 172 |
# File 'app/models/release.rb', line 168 def release_changes_attributes=(params) self.release_changes = params.values .reject { |attrs| attrs["_destroy"] == "1" } .map { |attrs| ReleaseChange.new(self, attrs["tag_slug"], attrs["description"]) } end |
#release_date ⇒ Object Also known as: date
145 146 147 |
# File 'app/models/release.rb', line 145 def release_date released_at.to_date end |
#released_at ⇒ Object
141 142 143 |
# File 'app/models/release.rb', line 141 def released_at deploy ? deploy.completed_at : created_at end |
#search_vector_should_change? ⇒ Boolean
215 216 217 |
# File 'app/models/release.rb', line 215 def search_vector_should_change? (changed & %w{release_changes}).any? end |
#update_search_vector ⇒ Object
211 212 213 |
# File 'app/models/release.rb', line 211 def update_search_vector self.class.where(id: id).reindex! end |