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