-
Notifications
You must be signed in to change notification settings - Fork 0
FAQ
Frequently asked questions about QQQ framework development and usage. This document covers common questions from contributors and users.
QQQ is a Low-code Application Framework for Engineers that provides a complete foundation for building business applications. It uses a metadata-driven architecture where you define your data models, business logic, and UI through configuration rather than starting from scratch.
QQQ is designed for:
- Engineers who want to build applications quickly without boilerplate
- Teams that need consistent, maintainable application architecture
- Organizations that want to standardize their application development process
- Contributors who want to extend and improve the framework
Yes! QQQ is open source and welcomes contributions from the community. See Contribution Guidelines for how to get involved.
- Set up environment: Follow Developer Onboarding
- Build locally: Use Building Locally guide
- Understand architecture: Read High-Level Architecture
- Pick an issue: Start with something marked "good first issue"
- Java 17+ (required for QQQ features)
- Maven 3.8+ (for build system)
- Git (for version control)
- macOS (QQQ dev tools are macOS-optimized)
# Clone repository
git clone git@github.com:QRun-IO/qqq.git
cd qqq
# Install QQQ dev tools
./qqq-dev-tools/install.sh
# Build everything
mvn clean install- Developing QQQ: Working on the framework itself (adding features, fixing bugs)
- Using QQQ: Building applications with the QQQ framework
This wiki focuses on developing QQQ - extending the framework for others to use.
QQQ uses a metadata-driven architecture with these key components:
- QInstance: Central metadata container for applications
- Actions: Business logic implemented as typed functions
- Backend Modules: Pluggable storage and data processing
- Middleware: HTTP servers, CLI tools, Lambda functions
- Frontend: React dashboard with Material-UI
See High-Level Architecture for detailed information.
QQQ provides a unified data layer through backend modules:
- RDBMS: MySQL, PostgreSQL, SQL Server support
- MongoDB: Document database operations
- Filesystem: Local files and S3 integration
- SQLite: Embedded database for development
All backends implement the same interfaces, so your code works with any storage backend.
QContext provides thread-local state management for QQQ operations:
- QInstance: Current application metadata
- QSession: User session and authentication
- Transaction: Database transaction context
- Action Stack: Call chain for debugging
Always initialize and clean up QContext when executing QQQ actions.
- Find an issue: Look for issues marked "good first issue" or "help wanted"
- Set up environment: Follow Developer Onboarding
- Create branch: Use GitFlow branching strategy
- Make changes: Follow Code Review Standards
- Submit PR: Follow Contribution Guidelines
QQQ enforces strict standards:
- Checkstyle: Kingsrook-specific code style rules
- Coverage: 80% instruction, 95% class coverage minimum
- Formatting: 3-space indentation, next-line braces
- Documentation: Javadoc on public methods, flower-box comments
See Code Review Standards for complete details.
- Design: Understand how it fits into QQQ's architecture
- Implement: Follow established patterns and interfaces
- Test: Meet coverage requirements and test thoroughly
- Document: Update relevant documentation and examples
- Submit: Create PR following contribution guidelines
See Feature Development for detailed guidance.
- Search issues: Check if it's already reported
- Create issue: Provide clear reproduction steps
- Fix it: If you can, create a fix following contribution guidelines
- Test: Ensure your fix resolves the issue
- Submit PR: Include issue reference and test coverage
QQQ uses modern Java testing tools:
- JUnit 5: Testing framework with lifecycle hooks
- AssertJ: Fluent assertions for readable tests
- JaCoCo: Code coverage analysis and enforcement
- BaseTest: QQQ's common test base class
See Testing for complete testing strategy.
# Run all tests
mvn test
# Run specific module tests
mvn test -pl qqq-backend-core
# Run with coverage
mvn test jacoco:report
# Check coverage thresholds
mvn verifyQQQ enforces strict coverage requirements:
- Instructions: 80% minimum (build fails if below)
- Classes: 95% minimum (build fails if below)
- Lines: Monitored but not enforced
- Branches: Monitored but not enforced
Extend QQQ's BaseTest class for consistent test setup:
public class MyActionTest extends BaseTest
{
@Test
void testMyFeature()
{
// BaseTest provides QContext and test setup
// Your test logic here
}
}# Build everything
mvn clean install
# Build specific module
mvn clean install -pl qqq-backend-core
# Build with sample project
mvn clean install -P withSample
# Build for release
mvn clean install -P releaseQQQ has three build modes:
- Default: Core framework only
- Sample: Include sample project for testing
- Release: Maven Central publishing preparation
QQQ uses custom versioning with GitFlow integration:
- develop: Continuous SNAPSHOT builds
- release/*: Release candidate builds
- main: Production releases
- hotfix/*: Emergency patch releases
See Branching & Versioning for details.
Start with the core and add what you need:
<!-- Always include core -->
<dependency>
<groupId>com.kingsrook.qqq</groupId>
<artifactId>qqq-backend-core</artifactId>
</dependency>
<!-- Add backend modules as needed -->
<dependency>
<groupId>com.kingsrook.qqq</groupId>
<artifactId>qqq-backend-module-rdbms</artifactId>
</dependency>
<!-- Add middleware as needed -->
<dependency>
<groupId>com.kingsrook.qqq</groupId>
<artifactId>qqq-middleware-javalin</artifactId>
</dependency>-
Implement interface: Extend
QBackendModuleInterface - Register module: Use static initialization block
-
Add to project: Include in parent
pom.xml - Test thoroughly: Ensure integration with QQQ core
See Feature Development for examples.
QQQ's React dashboard is extensible:
- Custom widgets: Implement widget interfaces
- New components: Add React components
- Theme customization: Override Material-UI themes
- API integration: Connect to QQQ backend actions
- Check Java version: Must be Java 17+
- Check Maven version: Must be 3.8+
- Check coverage: Ensure tests meet thresholds
-
Check style: Run
mvn checkstyle:check -
Clean and rebuild:
mvn clean install
-
Check test output: Look in
target/surefire-reports/ -
Run single test:
mvn test -Dtest=ClassName#methodName - Check coverage: Ensure you meet thresholds
- Verify setup: Check QContext and test data setup
- Import IDE settings: Use Kingsrook code style
-
Run locally:
mvn checkstyle:check - Fix formatting: Use IDE auto-format
- Check headers: Ensure Kingsrook copyright headers
- Add unit tests: Test all code paths
- Test edge cases: Include error conditions
- Mock dependencies: Use mocks for external calls
- Check thresholds: Verify 80% instruction, 95% class coverage
- Documentation: Start with this wiki
- Issues: Search existing GitHub issues
- Discussions: Use GitHub discussions for questions
- Team: Ask in team channels for urgent issues
- Search first: Check if already reported
- Create issue: Use bug report template
- Be specific: Include steps to reproduce
- Provide context: Environment, versions, logs
- Search first: Check if already requested
- Create issue: Use feature request template
- Explain use case: Why is this feature needed?
- Consider implementation: Is this feasible for QQQ?
Documentation contributions are welcome:
- Wiki updates: Improve existing pages
- Code comments: Add Javadoc and examples
- Examples: Create working code samples
- Tutorials: Write how-to guides
- Check documentation: This wiki covers most topics
- Search issues: Look for similar problems
- Ask community: Use GitHub discussions
- Team support: Reach out to maintainers
- Start small: Fix typos, improve documentation
- Pick issues: Look for "good first issue" labels
- Follow guidelines: Read Contribution Guidelines
- Ask questions: We're here to help you succeed
- Developer Onboarding - Development setup
- Common Errors - Troubleshooting