Class: Task

Inherits:
ActiveRecord::Base
  • Object
show all
Defined in:
app/models/task.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.checked_out_by(user, during: nil) ⇒ Object

Raises:

  • (ArgumentError)


69
70
71
72
# File 'app/models/task.rb', line 69

def checked_out_by(user, during: nil)
  raise ArgumentError, "Please specify :during which Sprint" unless during
  all.merge(SprintTask.where(sprint_id: during.id))
end

.committedObject



45
46
47
# File 'app/models/task.rb', line 45

def committed
  where(arel_table[:first_commit_at].not_eq(nil))
end

.completedObject



57
58
59
# File 'app/models/task.rb', line 57

def completed
  where(arel_table[:completed_at].not_eq(nil))
end

.completed_during(sprint) ⇒ Object



61
62
63
# File 'app/models/task.rb', line 61

def completed_during(sprint)
  where(arel_table[:completed_at].in(sprint.range).or(arel_table[:first_commit_at].in(sprint.range)))
end

.defaultObject



37
38
39
# File 'app/models/task.rb', line 37

def default
  where description: nil
end

.find_by_project_and_shorthand(project_slug, shorthand) ⇒ Object



74
75
76
77
78
79
# File 'app/models/task.rb', line 74

def find_by_project_and_shorthand(project_slug, shorthand)
  with_shorthand(shorthand)
    .merge(Ticket.joins(:project)
      .where(Project.arel_table[:slug].eq(project_slug)))
    .first
end

.in_current_sprintObject



65
66
67
# File 'app/models/task.rb', line 65

def in_current_sprint
  joins(:sprint).where("sprints.end_date >= current_date")
end

.lettered(*letters) ⇒ Object



33
34
35
# File 'app/models/task.rb', line 33

def lettered(*letters)
  numbered letters.flatten.map { |letter| to_number(letter) }
end

.numbered(*numbers) ⇒ Object



29
30
31
# File 'app/models/task.rb', line 29

def numbered(*numbers)
  where number: numbers.flatten
end

.openObject



25
26
27
# File 'app/models/task.rb', line 25

def open
  where completed_at: nil
end

.releasedObject



53
54
55
# File 'app/models/task.rb', line 53

def released
  where(arel_table[:first_release_at].not_eq(nil))
end

.uncommittedObject



41
42
43
# File 'app/models/task.rb', line 41

def uncommitted
  where first_commit_at: nil
end

.unreleasedObject



49
50
51
# File 'app/models/task.rb', line 49

def unreleased
  where first_release_at: nil
end

.versionsObject



88
89
90
# File 'app/models/task.rb', line 88

def versions
  VestalVersions::Version.where(versioned_type: "Task", versioned_id: pluck(:id))
end

.with_shorthand(shorthand) ⇒ Object



81
82
83
84
85
86
# File 'app/models/task.rb', line 81

def with_shorthand(shorthand)
  _, ticket_number, letter = shorthand.split /(\d+)([a-z]+)/
  joins(:ticket)
    .where(Ticket.arel_table[:number].eq(ticket_number))
    .lettered(letter)
end

Instance Method Details

#check_in!(sprint) ⇒ Object



184
185
186
# File 'app/models/task.rb', line 184

def check_in!(sprint)
  SprintTask.where(sprint_id: sprint.id, task_id: id).check_in!
end

#check_out!(sprint, user) ⇒ Object



180
181
182
# File 'app/models/task.rb', line 180

def check_out!(sprint, user)
  SprintTask.where(sprint_id: sprint.id, task_id: id).check_out!(user)
end

#checked_out?(sprint) ⇒ Boolean

Returns:

  • (Boolean)


172
173
174
# File 'app/models/task.rb', line 172

def checked_out?(sprint)
  SprintTask.where(sprint_id: sprint.id, task_id: id).checked_out.exists?
end

#checked_out_by_me?(sprint, user) ⇒ Boolean

Returns:

  • (Boolean)


176
177
178
# File 'app/models/task.rb', line 176

def checked_out_by_me?(sprint, user)
  SprintTask.where(sprint_id: sprint.id, task_id: id).checked_out_by(user).exists?
end

#committed?Boolean

Returns:

  • (Boolean)


132
133
134
# File 'app/models/task.rb', line 132

def committed?
  first_commit_at.present?
end

#completed!Object Also known as: complete!



138
139
140
141
142
# File 'app/models/task.rb', line 138

def completed!
  return if completed?
  touch :completed_at
  Houston.observer.fire "task:completed", self
end

#completed?Boolean

Returns:

  • (Boolean)


145
146
147
# File 'app/models/task.rb', line 145

def completed?
  completed_at.present?
end

#completed_during?(sprint) ⇒ Boolean

Returns:

  • (Boolean)


153
154
155
156
# File 'app/models/task.rb', line 153

def completed_during?(sprint)
  return false unless completed?
  completed_at < sprint.ends_at
end

#default_task?Boolean

Returns:

  • (Boolean)


190
191
192
# File 'app/models/task.rb', line 190

def default_task?
  number == 1 && read_attribute(:description).nil?
end

#descriptionObject



105
106
107
# File 'app/models/task.rb', line 105

def description
  super || ticket.summary
end

#letterObject



95
96
97
98
99
100
101
102
103
# File 'app/models/task.rb', line 95

def letter
  bytes = []
  remaining = number
  while remaining > 0
    bytes.unshift (remaining - 1) % 26 + 97
    remaining = (remaining - 1) / 26
  end
  bytes.pack "c*"
end

#manually_completed?Boolean

Returns:

  • (Boolean)


149
150
151
# File 'app/models/task.rb', line 149

def manually_completed?
  completed? && !committed? && !released?
end

#mark_committed!(commit) ⇒ Object



127
128
129
130
# File 'app/models/task.rb', line 127

def mark_committed!(commit)
  update_column :first_commit_at, commit.authored_at unless committed?
  Houston.observer.fire "task:committed", self
end

#open?Boolean

Returns:

  • (Boolean)


166
167
168
# File 'app/models/task.rb', line 166

def open?
  !completed?
end

#released!(release) ⇒ Object



115
116
117
118
119
# File 'app/models/task.rb', line 115

def released!(release)
  self.releases << release unless releases.exists?(release.id)
  update_column :first_release_at, release.created_at unless released?
  Houston.observer.fire "task:released", self
end

#released?Boolean

Returns:

  • (Boolean)


121
122
123
# File 'app/models/task.rb', line 121

def released?
  first_release_at.present?
end

#reopen!Object



160
161
162
163
164
# File 'app/models/task.rb', line 160

def reopen!
  return unless manually_completed?
  update_column :completed_at, nil
  Houston.observer.fire "task:reopened", self
end

#shorthandObject



109
110
111
# File 'app/models/task.rb', line 109

def shorthand
  "#{ticket.number}#{letter}"
end