Методы API gem имеют несогласованные структуры ответов

Не уверен, стоит ли об этом упоминать, но сегодня я столкнулся с этим при парсинге ответов от методов create_topic и edit_post этого гема.

create_topic вызывает метод post. Этот метод возвращает либо response.body, либо выбрасывает исключение DiscourseApi::Error:

    def post(path, params = {})
      response = request(:post, path, params)
      case response.status
      when 200, 201, 204
        response.body
      else
        raise DiscourseApi::Error, response.body
      end
    end

edit_post вызывает метод put. Этот метод возвращает объект Faraday::Env:

#<struct Faraday::Env method=:put, request_body="post%5Braw%5D=It%27s+a+minor+thing%2C+but+it+comes+up+a+lot.+I%27ll+do+some+tests....

Для приложений, использующих этот гем, это означает, что ответы от запросов post и put нужно обрабатывать по-разному. Чтобы обработать запрос put, приложение, выполняющее запрос, должно сделать то же самое, что и API-гем для запросов post:

  def update_topic_from_note(markdown:, post_id:)
    response = @client.edit_post(post_id, markdown)
    case response.status
    when 200, 201, 204
      response.body
    else
    # ...

Это не конец света, но это было неожиданно. Я понимаю, что вносить изменения в код API непросто.

2 лайка