class Abt::Providers::Devops::Services::WorkItemPicker

Attributes

board[R]
cli[R]
config[R]
path[R]

Public Class Methods

call(**args) click to toggle source
# File lib/abt/providers/devops/services/work_item_picker.rb, line 17
def self.call(**args)
  new(**args).call
end
new(cli:, path:, config:, board:) click to toggle source
# File lib/abt/providers/devops/services/work_item_picker.rb, line 23
def initialize(cli:, path:, config:, board:)
  @cli = cli
  @config = config
  @path = path
  @board = board
end

Public Instance Methods

call() click to toggle source
# File lib/abt/providers/devops/services/work_item_picker.rb, line 30
def call
  work_item = select_work_item

  path_with_work_item = Path.from_ids(
    organization_name: path.organization_name,
    project_name: path.project_name,
    team_name: path.team_name,
    board_name: path.board_name,
    work_item_id: work_item["id"]
  )

  Result.new(work_item: work_item, path: path_with_work_item)
end
columns() click to toggle source
# File lib/abt/providers/devops/services/work_item_picker.rb, line 82
def columns
  board["columns"] ||
    api.get("#{path.project_name}/#{path.team_name}/_apis/work/boards/#{path.board_name}")["columns"]
end
prompt_work_item(work_items) click to toggle source
# File lib/abt/providers/devops/services/work_item_picker.rb, line 57
def prompt_work_item(work_items)
  options = work_items.map do |work_item|
    {
      "id" => work_item["id"],
      "name" => "##{work_item['id']} #{work_item['name']}"
    }
  end

  choice = cli.prompt.choice("Select a work item", options, nil_option: true)
  choice && work_items.find { |work_item| work_item["id"] == choice["id"] }
end
select_work_item() click to toggle source
# File lib/abt/providers/devops/services/work_item_picker.rb, line 44
def select_work_item
  column = cli.prompt.choice("Which column in #{board['name']}?", columns)
  cli.warn("Fetching work items...")
  work_items = work_items_in_column(column)

  if work_items.length.zero?
    cli.warn("Section is empty")
    select_work_item
  else
    prompt_work_item(work_items) || select_work_item
  end
end
work_items_in_column(column) click to toggle source
# File lib/abt/providers/devops/services/work_item_picker.rb, line 69
          def work_items_in_column(column)
            work_items = api.work_item_query(
              <<~WIQL
                SELECT [System.Id]
                FROM WorkItems
                WHERE [System.BoardColumn] = '#{column['name']}'
                ORDER BY [Microsoft.VSTS.Common.BacklogPriority] ASC
              WIQL
            )

            work_items.map { |work_item| api.sanitize_work_item(work_item) }
          end

Private Instance Methods

api() click to toggle source
# File lib/abt/providers/devops/services/work_item_picker.rb, line 89
def api
  Abt::Providers::Devops::Api.new(organization_name: path.organization_name,
                                  username: config.username_for_organization(path.organization_name),
                                  access_token: config.access_token_for_organization(path.organization_name),
                                  cli: cli)
end