Compare commits

..
Author SHA1 Message Date
james.maesandCodex d88fcc6c2f ci: centralize release branch verification and workflows
Co-Authored-By: Codex <noreply@openai.com>
2026-10-21 13:32:03 -05:00
10 changed files with 11 additions and 142 deletions

No files matched your search

+2 -2
View File
@@ -1,12 +1,12 @@
version: 2.1
setup: true
orbs:
qqq-orb: kingsrook/qqq-orb@0.8
qqq-orb: kingsrook/qqq-orb@0.7.16
workflows:
setup:
jobs:
- qqq-orb/generate_pipeline:
orb_version: '0.8'
orb_version: 0.7.16
filters:
branches:
ignore: automation/qbit-rc-pending
-7
View File
@@ -1,7 +0,0 @@
name: build
on:
push:
jobs:
maven:
uses: self:KofTwentyTwo/ci-workflows/.gitea/workflows/maven.yaml@v1
secrets: inherit
+1 -1
View File
@@ -1,5 +1,5 @@
profile: qbit
orb_version: '0.8'
orb_version: 0.7.16
default_branch: main
java_version: '21'
browsers: true
+1 -1
View File
@@ -24,7 +24,7 @@ This QBit provides a declarative workflow engine. Define states and transitions,
### Prerequisites
- QQQ application (v4.1.0+)
- QQQ application (v0.35.0+)
- Database backend configured
### Installation
+2 -18
View File
@@ -23,8 +23,7 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<properties>
<revision>0.5.0-SNAPSHOT</revision>
<qqq.version>4.1.0-RC.21</qqq.version>
<revision>0.4.0</revision>
</properties>
<parent>
@@ -70,19 +69,6 @@
</scm>
<dependencyManagement>
<dependencies>
<!-- Published QQQ 4.1 core (minimum QQQ 4.1), imported ahead of the parent's BOM. -->
<dependency>
<groupId>com.kingsrook.qqq</groupId>
<artifactId>qqq-bom-pom</artifactId>
<version>${qqq.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>com.kingsrook.qqq</groupId>
@@ -100,10 +86,8 @@
</dependency>
<dependency>
<groupId>com.kingsrook.qqq</groupId>
<!-- 0.27.0-RC.1 references com.kingsrook.qqq.backend.javalin.QJavalinMetaData, which QQQ 4.x moved to com.kingsrook.qqq.middleware.javalin
(NoClassDefFoundError when the form adjusters register). 0.42.0-RC.2 is the published line for 4.x; its public API is a superset. -->
<artifactId>qqq-frontend-material-dashboard</artifactId>
<version>0.42.0-RC.2</version>
<version>0.27.0-RC.1</version>
</dependency>
<dependency>
@@ -39,7 +39,6 @@ import com.kingsrook.qbits.workflows.model.Workflow;
import com.kingsrook.qbits.workflows.model.WorkflowRevision;
import com.kingsrook.qbits.workflows.model.WorkflowStep;
import com.kingsrook.qqq.api.actions.GetTableApiFieldsAction;
import com.kingsrook.qqq.api.model.actions.GetTableApiFieldsInput;
import com.kingsrook.qqq.api.utils.ApiQueryFilterUtils;
import com.kingsrook.qqq.backend.core.actions.tables.GetAction;
import com.kingsrook.qqq.backend.core.context.QContext;
@@ -255,7 +254,7 @@ public class InputRecordFilterStep extends WorkflowStepType implements WorkflowS
String apiName = workflowRevision.getValueString("apiName");
String apiVersion = workflowRevision.getValueString("apiVersion");
String tableName = workflow.getValueString("tableName");
Map<String, QFieldMetaData> tableApiFields = GetTableApiFieldsAction.getTableApiFieldMap(new GetTableApiFieldsInput().withApiName(apiName).withVersion(apiVersion).withTableName(tableName));
Map<String, QFieldMetaData> tableApiFields = GetTableApiFieldsAction.getTableApiFieldMap(new GetTableApiFieldsAction.ApiNameVersionAndTableName(apiName, apiVersion, tableName));
ArrayList<String> badRequestMessages = new ArrayList<>();
ApiQueryFilterUtils.manageCriteriaFields(filter, tableApiFields, badRequestMessages, apiName, apiVersion, new QueryInput(tableName).withFilter(filter));
errors.addAll(badRequestMessages);
@@ -31,7 +31,6 @@ import com.kingsrook.qbits.workflows.execution.WorkflowExecutionContext;
import com.kingsrook.qbits.workflows.model.Workflow;
import com.kingsrook.qbits.workflows.model.WorkflowRevision;
import com.kingsrook.qqq.api.actions.GetTableApiFieldsAction;
import com.kingsrook.qqq.api.model.actions.GetTableApiFieldsInput;
import com.kingsrook.qqq.api.utils.ApiQueryFilterUtils;
import com.kingsrook.qqq.backend.core.actions.tables.CountAction;
import com.kingsrook.qqq.backend.core.actions.tables.DeleteAction;
@@ -180,7 +179,7 @@ public class RecordWorkflowUtils
{
WorkflowRevision workflowRevision = context.getWorkflowRevision();
Workflow workflow = context.getWorkflow();
Map<String, QFieldMetaData> tableApiFields = GetTableApiFieldsAction.getTableApiFieldMap(new GetTableApiFieldsInput().withApiName(workflowRevision.getApiName()).withVersion(workflowRevision.getApiVersion()).withTableName(workflow.getTableName()));
Map<String, QFieldMetaData> tableApiFields = GetTableApiFieldsAction.getTableApiFieldMap(new GetTableApiFieldsAction.ApiNameVersionAndTableName(workflowRevision.getApiName(), workflowRevision.getApiVersion(), workflow.getTableName()));
List<String> badRequestMessages = new ArrayList<>();
CountInput countInput = new CountInput(context.getWorkflow().getTableName())
@@ -78,9 +78,9 @@ public class RunRecordWorkflowExtractStep extends ExtractViaQueryStep
** Make sure associations are fetched (so api records have children!)
*******************************************************************************/
@Override
protected void customizeInputPreQuery(RunBackendStepInput runBackendStepInput, QueryInput queryInput)
protected void customizeInputPreQuery(QueryInput queryInput)
{
super.customizeInputPreQuery(runBackendStepInput, queryInput);
super.customizeInputPreQuery(queryInput);
queryInput.setIncludeAssociations(true);
}
@@ -142,7 +142,7 @@ public class BaseTest
// basic definition of an instance //
/////////////////////////////////////
QInstance qInstance = new QInstance();
qInstance.withInstanceDefaultAuthentication(new QAuthenticationMetaData().withType(QAuthenticationType.FULLY_ANONYMOUS));
qInstance.setAuthentication(new QAuthenticationMetaData().withType(QAuthenticationType.FULLY_ANONYMOUS));
qInstance.addBackend(new RDBMSBackendMetaData()
.withName(RDBMS_BACKEND_NAME)
.withVendor("h2")
@@ -1,106 +0,0 @@
/*
* QQQ - Low-code Application Framework for Engineers.
* Copyright (C) 2021-2025. Kingsrook, LLC
* 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States
* contact@kingsrook.com
* https://github.com/Kingsrook/
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.kingsrook.qbits.workflows.metadata;
import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.kingsrook.qbits.workflows.BaseTest;
import com.kingsrook.qbits.workflows.WorkflowsTestDataSource;
import com.kingsrook.qbits.workflows.implementations.recordworkflows.RecordWorkflowsDefinition;
import com.kingsrook.qbits.workflows.model.Workflow;
import com.kingsrook.qbits.workflows.model.WorkflowTestScenario;
import com.kingsrook.qqq.backend.core.actions.processes.RunProcessAction;
import com.kingsrook.qqq.backend.core.actions.tables.InsertAction;
import com.kingsrook.qqq.backend.core.model.actions.processes.RunProcessInput;
import com.kingsrook.qqq.backend.core.model.actions.processes.RunProcessOutput;
import com.kingsrook.qqq.backend.core.model.actions.tables.insert.InsertInput;
import com.kingsrook.qqq.backend.core.utils.JsonUtils;
import com.kingsrook.qqq.frontend.materialdashboard.actions.formadjuster.RunFormAdjusterProcess;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
/*******************************************************************************
** Runs the workflows form adjusters through the current Material Dashboard
** form-adjuster process, the same way the UI API's table form-adjuster route
** does (path params + multipart-style form params) - not by calling them directly.
*******************************************************************************/
class WorkflowTestAssertionFormAdjusterTest extends BaseTest
{
/*******************************************************************************
**
*******************************************************************************/
@Test
void testVariableNameAdjusterThroughMaterialDashboardProcess() throws Exception
{
Workflow workflow = WorkflowsTestDataSource.insertWorkflowAndInitialRevision(RecordWorkflowsDefinition.WORKFLOW_TYPE, TABLE_NAME_PERSON);
Integer scenarioId = new InsertAction().execute(new InsertInput(WorkflowTestScenario.TABLE_NAME).withRecordEntity(
new WorkflowTestScenario().withWorkflowId(workflow.getId()).withName("s").withApiName(API_NAME).withApiVersion(V3).withApiJson("{}"))).getRecords().get(0).getValueInteger("id");
Map<String, Object> output = runAdjuster("WorkflowTestAssertion.variableName", RunFormAdjusterProcess.EVENT_ON_CHANGE,
TABLE_NAME_PERSON + ".firstName", Map.of("workflowTestScenarioId", scenarioId));
@SuppressWarnings("unchecked")
Map<String, Object> expectedValueField = (Map<String, Object>) ((Map<String, Object>) output.get("updatedFieldMetaData")).get("expectedValue");
assertNotNull(expectedValueField);
assertTrue(String.valueOf(expectedValueField.get("label")).startsWith("Expected Value ("), "label: " + expectedValueField.get("label"));
assertEquals(List.of("expectedValue"), output.get("fieldsToClear"));
}
/***************************************************************************
**
***************************************************************************/
private Map<String, Object> runAdjuster(String identifier, String event, String newValue, Map<String, Object> allValues) throws Exception
{
Map<String, List<String>> formParams = new HashMap<>();
formParams.put("event", List.of(event));
formParams.put("fieldName", List.of("variableName"));
formParams.put("newValue", List.of(newValue));
formParams.put("allValues", List.of(JsonUtils.toJson(allValues)));
RunProcessInput input = new RunProcessInput();
input.setProcessName(RunFormAdjusterProcess.NAME);
input.setFrontendStepBehavior(RunProcessInput.FrontendStepBehavior.SKIP);
input.addValue("pathParams", new HashMap<>(Map.of("identifier", identifier, "event", event)));
input.addValue("formParams", (Serializable) formParams);
RunProcessOutput processOutput = new RunProcessAction().execute(input);
if(processOutput.getException().isPresent())
{
throw (processOutput.getException().get());
}
@SuppressWarnings("unchecked")
Map<String, Object> result = JsonUtils.toObject(processOutput.getValueString("responseString"), Map.class);
return (result);
}
}