Bitbucket с его RESTful API 2.0 поддерживает управление pull-запросами без интерфейса. В CLI вы можете запросить его с помощью CURL. Эта более ранняя версия документации имеет более подробные сведения о интерфейсе.
Получить полные данные о конкретном запросе на pull:
$ curl --user s3m3n:bbpassword https://bitbucket.org/api/2.0/repositories/s3m3n/reponame/pullrequests/4
В ответ я получаю JSON с полной информацией о моем запросе на тягу №4 (добавьте свое имя пользователя дважды, пароль и повторите команду).
]
Чтобы создать новый запрос на перенос, нам нужно предоставить много данных с помощью команды POST ниже, как она выглядит в моем RESTClient:
[/g8]
После стрельбы Bitbucket немедленно показывает запрос на тягу:
[/g9]
Вы все равно можете создать тот же запрос на pull с одним лайнером:
$ curl -X POST -H "Content-Type: application/json" -u s3m3n:bbpassword https://bitbucket.org/api/2.0/repositories/s3m3n/reponame/pullrequests -d '{ "title": "Merge some branches", "description": "stackoverflow example", "source": { "branch": { "name": "choose branch to merge with" }, "repository": { "full_name": "s3m3n/reponame" } }, "destination": { "branch": { "name": "choose branch that is getting changes" } }, "reviewers": [ { "username": "some other user needed to review changes" } ], "close_source_branch": false }'
Если вы хотите протестировать все возможные методы API-переходов на инструмент браузера REST Bitbucket. Он покажет вам все возможные запросы, возвращая данные реального репо.
Это должно сработать, но не самая «чистая» реализация:
Мне пришлось вытащить df
из блеска, чтобы ваш код работал. Использовал assign
для замены df
в глобальной среде (не лучшая идея ...) после редактирования данных. Но данные не пересчитываются до нажатия Run
. После нажатия Run
данные модели перезаписываются: (modelData <- df
). Опять же, не самая лучшая идея, вероятно, создание реактивного modelData
будет лучшей идеей.
Также взгляните на DT::replaceData
. Это может быть лучшей идеей, чем восстановление полного стола.
library(shiny)
library(DT)
library(dplyr)
df <- data.frame(Channel = c("A", "B","C"),
Current = c(2000, 3000, 4000),
Modified = c(2500, 3500,3000),
New_Membership = c(450, 650,700),
stringsAsFactors = FALSE)
#### Module 1 renders the first table
tableMod <- function(input, output, session, modelRun,modelData,budget){
observeEvent( input$x1_cell_edit, {
cat ('input$x1_cell_edit \n')
info = input$x1_cell_edit
str(info)
i = info$row
j = info$col
v = info$value
df[i, j] <- DT:::coerceValue(v, df[i, j])
assign("df", df, envir = .GlobalEnv)
})
output$x1 <- DT::renderDataTable({
modelRun()
modelData <- df
isolate(
datatable(
modelData %>%
mutate(New_Membership = as.numeric(Modified * 0.01)*(budget())),
selection = 'none', editable = TRUE
)
)
})
}
tableUI <- function(id) {
ns <- NS(id)
dataTableOutput(ns("x1"))
}
ui <- function(request) {
fluidPage(
tableUI("opfun"),
numericInput("budget_input", "Total Forecast", value = 2),
actionButton("opt_run", "Run")
)
}
server <- function(input, output, session) {
callModule( tableMod,"opfun",
modelRun = reactive(input$opt_run),
modelData = df,
budget = reactive(input$budget_input))
observeEvent(input$opt_run, {
cat('HJE')
})
}
shinyApp(ui, server, enableBookmarking = "url")