lib/rallycat/update.rb in rallycat-0.2.0 vs lib/rallycat/update.rb in rallycat-0.3.0
- old
+ new
@@ -1,38 +1,88 @@
module Rallycat
class Update
+ class UserNotFound < StandardError; end
+ class TaskNotFound < StandardError; end
+
def initialize(api)
@api = api
end
def task(task_number, attributes)
- results = @api.find(:task) do
- equal :formatted_id, task_number
- end
+ task = find_task(task_number)
- task = results.first
-
+ # When we set the state of the task and we don't explicitly set it to
+ # blocked we want to remove the block. In our workflow, when you change
+ # the state of the task it is also unblocked.
if attributes[:state] && !attributes[:blocked]
attributes[:blocked] = false
end
- user_name = attributes[:owner]
-
- if user_name
- user_results = @api.find(:user) do
- equal :display_name, user_name
- end
- attributes[:owner] = user_results.first.login_name
+ # The value in attributes[:owner] should be equal to the desired owner's
+ # display name in Rally. We need to fetch the user in order to get their
+ # login_name. The login_name is needed in order to set the owner
+ # attribute of a task.
+ #
+ # We decided it would be easier for the user to enter 'John Smith'
+ # instead of 'john.smith@foobar.com'.
+ if display_name = attributes[:owner]
+ login_name = find_user(display_name)
+ attributes[:owner] = login_name
end
task.update(attributes)
messages = []
- messages << %{Task (#{task_number}) was set to "#{attributes[:state]}".} if attributes[:state]
- messages << "Task (#{task_number}) was blocked." if attributes[:blocked]
- messages << %{Task (#{task_number}) was assigned to "#{user_name}".} if attributes[:owner]
+ if attributes[:state]
+ messages << state_message(task_number, attributes[:state])
+ end
+ if attributes[:blocked]
+ messages << blocked_message(task_number)
+ end
+
+ if attributes[:owner]
+ messages << owner_message(task_number, display_name)
+ end
+
messages.join("\n")
+ end
+
+ private
+ def find_task(task_number)
+ results = @api.find(:task) do
+ equal :formatted_id, task_number
+ end
+
+ if results.total_result_count == 0
+ raise TaskNotFound, "Task (#{task_number}) does not exist."
+ end
+
+ results.first
+ end
+
+ def find_user(display_name)
+ user_results = @api.find(:user) do
+ equal :display_name, display_name
+ end
+
+ if user_results.total_result_count == 0
+ raise UserNotFound, "User (#{display_name}) does not exist."
+ end
+
+ user_results.first.login_name
+ end
+
+ def state_message(task_number, state)
+ %{Task (#{task_number}) was set to "#{state}".}
+ end
+
+ def blocked_message(task_number)
+ "Task (#{task_number}) was blocked."
+ end
+
+ def owner_message(task_number, owner)
+ %{Task (#{task_number}) was assigned to "#{owner}".}
end
end
end