Object-Oriented GitHub API

The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:

GitHub - потрясающая платформа для поддержки и отслеживания проблем проекта в Git. Около трех лет назад я перенес все свои проекты (как приватные, так и публичные) на GitHub и не жалею об этом. Более того, GitHub предоставляет доступ к почти всем своим функциям через RESTful JSON API.

Есть несколько Java SDK, которые обертывают и предоставляют доступ к API. Я пытался использовать их, но столкнулся с несколькими проблемами:

  • Они не основаны на JSR-353 (JSON Java API)

  • Они не предоставляют никаких инструментов для имитации.

  • Они не охватывают все API и не могут быть расширены.

С учетом всех этих недостатков, я создал свою собственную библиотеку - [jcabi-github] (http://github.jcabi.com). Давайте рассмотрим ее самые важные преимущества.

Сервер GitHub является объектом. Коллекция задач является объектом, отдельная задача является объектом, ее автор – это автор и т. д. Например, для получения имени автора мы используем:

Как несложно догадаться, GitHub, Repos, Repo, Issues, Issue и User являются интерфейсами. Классы, которые их реализуют, не видны в библиотеке.

MkGitHub class is a mock version of a GitHub server. It behaves almost exactly the same as a real server and is the perfect instrument for unit testing. For example, say that you’re testing a method that is supposed to post a new issue to GitHub and add a message into it. Here is how the unit test would look:

public class FooTest {
  @Test
  public void createsIssueAndPostsMessage() {
    GitHub github = new MkGitHub("jeff");
    github.repos().create(
      Json.createObjectBuilder().add("name", owner).build()
    );
    new Foo().doTheThing(github);
    MatcherAssert.assertThat(
      github.issues().get(1).comments().iterate(),
      Matchers.not(Matchers.emptyIterable())
    );
  }
}

Это намного удобнее и компактнее, чем традиционное подменное действие с помощью Mockito или аналогичного фреймворка.

Он основан на JSR-353 и использует jcabi-http для обработки HTTP-запросов. Эта комбинация делает его высоко настраиваемым и расширяемым, когда какая-то функция GitHub не поддерживается библиотекой (и их много).

Например, если вы хотите получить значение атрибута hireable пользователя User. Класс User.Smart не имеет для этого метода. Итак, вот как это можно сделать:

Мы используем метод json(), который возвращает экземпляр JsonObject из JSR-353 (часть Java7).

Ни одна другая библиотека не позволяет такой прямой доступ к JSON-объектам, возвращаемым сервером GitHub.

Давайте рассмотрим еще один пример. Допустим, вы хотите использовать некоторую функцию GitHub, которая не описана в API. Вы получаете объект Request из интерфейса GitHub и напрямую обращаетесь к точке входа HTTP-сервера.

jcabi-http HTTP-клиент используется jcabi-github.

Все классы абсолютно неизменяемы и аннотированы @Immutable. Это может показаться незначительным преимуществом, но для меня это было очень важно. Я использую эту аннотацию во всех своих проектах, чтобы гарантировать полную неизменяемость моих классов.

Несколько дней назад мы выпустили последнюю версию 0.8. Это значительное обновление, в которое вошло более 1200 коммитов. Оно охватывает весь функционал API GitHub и должно быть очень стабильным. Библиотека поставляется в виде зависимости JAR в Maven Central (получите последние версии в Maven Central).

Translated by ChatGPT gpt-3.5-turbo/42 on 2023-11-28 at 15:33

sixnines availability badge   GitHub stars