Ruby более прозрачный и чистый код при использовании карты - PullRequest
0 голосов
/ 07 февраля 2020

У меня есть два простых метода, которые выбирают данные из проекта Jira с назначенными пользователю задачами, которые еще предстоит выполнить. Прямо сейчас я извлек customfields из Jira API (time_to_resolution и required_time_to_resolution), и это не выглядит хорошо, возможно ли сделать это более чистым, читабельным способом?

def assigned_task_list
  assigned_tasks.map do |issue|
    fields = issue.fields

    {
      key: issue.key,
      desired_time_to_resolution: issue.customfield_14777.dig('ongoingCycle', 'remainingTime', 'friendly'),
      time_to_resolution: issue.customfield_10031.dig('ongoingCycle', 'remainingTime', 'friendly'),
      name: fields.dig('assignee', 'name'),
      email: fields.dig('assignee', 'emailAddress'),
      status: fields.dig('status', 'name')
    }
  end
end

The assigned_tasks метод ниже:

def assigned_tasks
  project.issues.select do |issue|
    issue.fields.dig('status', 'name') != 'Done' &&
      issue.fields.dig('assignee', 'name')
  end
end

Ответы [ 3 ]

3 голосов
/ 07 февраля 2020

Вы можете создать несколько методов и скрыть внутри них логи c.

def assigned_task_list
  assigned_tasks.map do |issue|
    {
      key: issue.key,
      desired_time_to_resolution: desired_time_to_resolution(issue),
      time_to_resolution: time_to_resolution(issue),
      name: name(issue),
      email: email(issue),
      status: status(issue)
    }
  end
end

private

def desired_time_to_resolution(issue)
  issue.customfield_14777.dig('ongoingCycle', 'remainingTime', 'friendly')
end

def time_to_resolution(issue)
  issue.customfield_10031.dig('ongoingCycle', 'remainingTime', 'friendly')
end

def name(issue)
  issue.fields.dig('assignee', 'name')
end

def email(issue)
  issue.fields.dig('assignee', 'emailAddress')
end

def status(issue)
  issue.fields.dig('status', 'name')
end
2 голосов
/ 07 февраля 2020

Вы можете создать новый класс, который инкапсулирует логику преобразования / извлечения c. Он взял бы экземпляр Jira Issue и возвратил бы новый Ha sh в нужном формате.

def assigned_task_list
  assigned_tasks.map do |jira_issue|
    IssueTransformer.new(jira_issue).transform
  end
end


# issue_transformer.rb

class IssueTransformer
  attr_reader :jira_issue

  def initialize(jira_issue)
    @jira_issue = jira_issue
  end

  def transform
    {
      key: key,
      desired_time_to_resolution: desired_time_to_resolution,
      time_to_resolution: time_to_resolution,
      name: name,
      email: email,
      status: status
    }
  end

  private

  def key
    jira_issue.key
  end

  def desired_time_to_resolution
    jira_issue.customfield_14777.dig('ongoingCycle', 'remainingTime', 'friendly')
  end

  # etc.
end

На данный момент это, скорее всего, излишне, предложение @ Yakov'а просто обернуть логи c в частные методы это, вероятно, путь к go. Но если вам нужно расширить логику преобразования / извлечения c дальше, было бы неплохо сделать что-то подобное (с собственными модульными тестами), чтобы отделить логи c отдельно.

2 голосов
/ 07 февраля 2020

Это может быть хорошей возможностью протестировать совершенно новый Ruby 2.7 деструктурируемый функция сопоставления с образцом :

def assigned_task_list
  assigned_tasks.map do |issue|
    case issue
    in {
      key: key,
      customfield_14777: {
        ongoingCycle: { remainingTime: { friendly: desired_time_to_resolution }}
      },
      customfield_10031: {
        ongoingCycle: { remainingTime: { friendly: time_to_resolution }}
      },
      fields: {
        assignee: { name: name, emailAddress: email },
        status: { name: status }
      }
    }
      {
        key: key, 
        desired_time_to_resolution: desired_time_to_resolution,
        time_to_resolution: time_to_resolution,
        name: name,
        email: email,
        status: status
      }
  end
end

То же самое относится к assigned_tasks.

...