Значение общего события pull_request и других более специфических событий pull_request, таких как pull_request.opened

Я разрабатываю приложение GitHub, используя структуру nodejs и probot. Я вижу класс Application (https://probot.github.io/api/latest/classes/application.html) платформы probot содержит такие события, как:

> event: "pull_request" | "pull_request.assigned" |
> "pull_request.closed" | "pull_request.edited" | "pull_request.labeled"
> | "pull_request.opened" | "pull_request.reopened" |
> "pull_request.review_request_removed" |
> "pull_request.review_requested" | "pull_request.unassigned" |
> "pull_request.unlabeled" | "pull_request.synchronize

Я заметил, что при нажатии кнопки Создать запрос на вытягивание запускаются события pull_request, а также pull_request.opened.

Чтобы понять это поведение запуска нескольких, казалось бы, похожих событий по нажатию одной и той же кнопки, я попытался повторно открыть закрытый запрос и распечатать объект Context для обоих pull_request. событие, а также событие pull_request.reopened.

Я провел сравнение обоих контекстов и обнаружил, что контексты, возвращаемые обоими событиями, идентичны, за исключением того, что контекст события pull_request содержит следующие дополнительные свойства:

merged: false,
        mergeable: null,
        rebaseable: null,
        mergeable_state: 'unknown',
        merged_by: null,
        comments: 6,
        review_comments: 0,
        maintainer_can_modify: false,
        commits: 1,
        additions: 1,
        deletions: 0,
        changed_files: 1 },
     repository:
      { id: 123456789,
        node_id: '',
        name: '',
        full_name: '',
        private: true,
        owner: [Object],
        html_url: 'some-url-here'
        .
        .
        ///////////////////--------many more urls-------//////////////////////
        created_at: '2020-04-0',
        updated_at: '2020-04-0',

Мы знаем, что общий формат возвращаемого объекта контекста следующий:

Context {
  name: 'pull_request',
  id: '187128937812-8219-89891892133-16752-1234576765545',
  payload:
   { action: 'reopened',
     number: 1,
     pull_request:
      { url:
        .
        .
        .and so on.......

Эта вышеуказанная информация присутствует в обоих контекстах. Мы видим, что это также говорит нам о конкретном действии, которое было выполнено, и это обозначается context.payload.action. Таким образом, если кому-то требуется получить pull_request.opened, он может сделать это, просто используя событие pull_request следующим образом:

app.on('pull_request', async context => {
    console.log('---------------------- on pull_request event')
    console.log('Context returned :----', context)
  })

И ему не нужно заботиться о других более конкретных событиях (здесь pull_request.opened), т. е. кроме того, что достигается с помощью приведенного выше кода, приведенный ниже код не предоставит реальной дополнительной помощи:

app.on('pull_request.opened', async context => {
    console.log('---------------------- on pull_request.opened')
    console.log('Context returned :----', context)
  })

Итак, вот вопрос, который меня беспокоит: какова цель события pull_request , если другие его конкретные формы (например, pull_request.reopened) не несут другой информации (точнее , если их контексты не содержат разной информации) ?

Я совершенно уверен, что за этим действительно скрывается некоторая мудрость. Я не могу найти ничего в Интернете, ничего в документах, что могло бы объяснить это.

Пожалуйста, помогите мне понять скрытую мудрость.

РЕДАКТИРОВАТЬ 1: НАЧАТЬ

Забыл упомянуть одно наблюдение: повторное открытие запроса на включение также вызывает событие issue_comment.created. Итак, три события запускаются одним действием (нажатием Создать запрос на включение).

РЕДАКТИРОВАТЬ 2: НАЧАТЬ


person Asif Kamran Malick    schedule 10.04.2020    source источник


Ответы (1)


Какова цель события pull_request, если его другие конкретные формы (например, pull_request.reopened) не несут другой информации (точнее, если их контексты не содержат другой информации) ?

Это просто функция Probot для упрощения обработки событий веб-перехватчика из GitHub. Я постараюсь объяснить, почему это полезно.

Если бы вы использовали события веб-перехватчиков без Probot, вам пришлось бы анализировать каждое событие pull_request, проверять поле action на наличие случая и решать, обрабатывать ли его.

Есть несколько событий, которые имеют поле action верхнего уровня в полезной нагрузке, в том числе:

Вместо того, чтобы заставлять разработчиков приложений выполнять этот синтаксический анализ и проверку JSON самостоятельно, они решили упростить обратные вызовы, чтобы вы могли подписаться на веб-перехватчики, используя определенный шаблон [event].[action], а платформа позаботится о вызове вашего обратного вызова при получении соответствующего события и действия.

Таким образом, у вас есть два варианта обработки событий pull_request:

  • если вы не знаете, какие события вам нужны, или вам нужно динамически обрабатывать события, подписка на pull_request — это то, как вы будете получать все события запросов на вытягивание.
  • если вы знаете, какие события вы должны обрабатывать, и можете игнорировать остальные, подпишитесь на явную pull_request.[event], чтобы упростить код вашего приложения.

Вы также можете подписаться на *, который представляет все события, которые получает приложение probot, вместо того, чтобы явно перечислять все поддерживаемые события в вашем приложении.

person Brendan Forster    schedule 11.04.2020
comment
большое спасибо за это хорошее объяснение. Таким образом, мы можем смело предположить, что нет никаких дополнительных преимуществ, кроме того, что вы упомянули, т.е. синтаксического анализа. Меня просто интересует, какой подход лучше с точки зрения производительности, используя event.action или просто события, а затем анализируя действие. - person Asif Kamran Malick; 12.04.2020
comment
Фреймворк генерирует события как для event, так и для event.action, поэтому подписывайтесь только на те события (или события), которые вам нужны в коде вашего приложения github.com/probot/probot/blob/ - person Brendan Forster; 13.04.2020