diff --git a/.github/workflows/build-macos.yml b/.github/workflows/build-macos.yml index 769195f..a6b488d 100644 --- a/.github/workflows/build-macos.yml +++ b/.github/workflows/build-macos.yml @@ -18,7 +18,6 @@ jobs: - name: Install Qt uses: jurplel/install-qt-action@v4 with: - version: '6.7.3' host: 'mac' target: 'desktop' arch: 'clang_64' @@ -141,7 +140,7 @@ jobs: done cd ../../.. - - name: Create Info.plist + - name: Create Info.plist and qt.conf run: | cd build if [ -d "RequestFlow/release" ]; then @@ -178,6 +177,13 @@ jobs: EOF + # Create qt.conf to help Qt find plugins + cat > RequestFlow.app/Contents/Resources/qt.conf << 'EOF' + [Paths] + Plugins = PlugIns + EOF + echo "Created qt.conf to specify plugin paths" + - name: Deploy Qt dependencies run: | cd build @@ -191,6 +197,13 @@ jobs: QT_DIR=$(qmake -query QT_INSTALL_PREFIX) echo "Qt installation directory: $QT_DIR" + # Copy QtSvg framework BEFORE plugins, so macdeployqt can properly link it + if [ -d "$QT_DIR/lib/QtSvg.framework" ]; then + mkdir -p RequestFlow.app/Contents/Frameworks + cp -R "$QT_DIR/lib/QtSvg.framework" RequestFlow.app/Contents/Frameworks/ + echo "Copied QtSvg framework" + fi + # Copy SVG plugins BEFORE running macdeployqt so it can fix their dependencies mkdir -p RequestFlow.app/Contents/PlugIns/imageformats mkdir -p RequestFlow.app/Contents/PlugIns/iconengines @@ -198,22 +211,33 @@ jobs: if [ -f "$QT_DIR/plugins/imageformats/libqsvg.dylib" ]; then cp "$QT_DIR/plugins/imageformats/libqsvg.dylib" RequestFlow.app/Contents/PlugIns/imageformats/ echo "Copied SVG image format plugin" + else + echo "ERROR: libqsvg.dylib not found in Qt plugins" + exit 1 fi if [ -f "$QT_DIR/plugins/iconengines/libqsvgicon.dylib" ]; then cp "$QT_DIR/plugins/iconengines/libqsvgicon.dylib" RequestFlow.app/Contents/PlugIns/iconengines/ echo "Copied SVG icon engine plugin" - fi - - # Copy QtSvg framework if not already present - if [ -d "$QT_DIR/lib/QtSvg.framework" ] && [ ! -d "RequestFlow.app/Contents/Frameworks/QtSvg.framework" ]; then - cp -R "$QT_DIR/lib/QtSvg.framework" RequestFlow.app/Contents/Frameworks/ - echo "Copied QtSvg framework" + else + echo "ERROR: libqsvgicon.dylib not found in Qt plugins" + exit 1 fi # Deploy Qt dependencies - this will fix library paths for all plugins and frameworks macdeployqt RequestFlow.app -verbose=2 -always-overwrite + # Verify SVG plugins are still present after macdeployqt + if [ ! -f "RequestFlow.app/Contents/PlugIns/imageformats/libqsvg.dylib" ]; then + echo "WARNING: libqsvg.dylib missing after macdeployqt, re-copying" + cp "$QT_DIR/plugins/imageformats/libqsvg.dylib" RequestFlow.app/Contents/PlugIns/imageformats/ + fi + + if [ ! -f "RequestFlow.app/Contents/PlugIns/iconengines/libqsvgicon.dylib" ]; then + echo "WARNING: libqsvgicon.dylib missing after macdeployqt, re-copying" + cp "$QT_DIR/plugins/iconengines/libqsvgicon.dylib" RequestFlow.app/Contents/PlugIns/iconengines/ + fi + - name: Fix library paths run: | cd build @@ -264,17 +288,57 @@ jobs: echo "=== Frameworks directory ===" ls -la RequestFlow.app/Contents/Frameworks/ echo "=== Check for QtSvg framework ===" - ls -la RequestFlow.app/Contents/Frameworks/QtSvg.framework/Versions/A/ 2>/dev/null || echo "QtSvg.framework NOT FOUND" + if [ -d "RequestFlow.app/Contents/Frameworks/QtSvg.framework" ]; then + ls -la RequestFlow.app/Contents/Frameworks/QtSvg.framework/Versions/A/ + echo "QtSvg.framework FOUND" + else + echo "ERROR: QtSvg.framework NOT FOUND" + exit 1 + fi echo "=== PlugIns/imageformats ===" - ls -la RequestFlow.app/Contents/PlugIns/imageformats/ 2>/dev/null || echo "imageformats directory NOT FOUND" + if [ -d "RequestFlow.app/Contents/PlugIns/imageformats" ]; then + ls -la RequestFlow.app/Contents/PlugIns/imageformats/ + if [ -f "RequestFlow.app/Contents/PlugIns/imageformats/libqsvg.dylib" ]; then + echo "libqsvg.dylib FOUND" + else + echo "ERROR: libqsvg.dylib NOT FOUND" + exit 1 + fi + else + echo "ERROR: imageformats directory NOT FOUND" + exit 1 + fi echo "=== PlugIns/iconengines ===" - ls -la RequestFlow.app/Contents/PlugIns/iconengines/ 2>/dev/null || echo "iconengines directory NOT FOUND" + if [ -d "RequestFlow.app/Contents/PlugIns/iconengines" ]; then + ls -la RequestFlow.app/Contents/PlugIns/iconengines/ + if [ -f "RequestFlow.app/Contents/PlugIns/iconengines/libqsvgicon.dylib" ]; then + echo "libqsvgicon.dylib FOUND" + else + echo "ERROR: libqsvgicon.dylib NOT FOUND" + exit 1 + fi + else + echo "ERROR: iconengines directory NOT FOUND" + exit 1 + fi + echo "=== Resources directory (qt.conf) ===" + if [ -f "RequestFlow.app/Contents/Resources/qt.conf" ]; then + echo "qt.conf FOUND" + cat RequestFlow.app/Contents/Resources/qt.conf + else + echo "ERROR: qt.conf NOT FOUND" + exit 1 + fi echo "=== Main executable dependencies ===" otool -L RequestFlow.app/Contents/MacOS/RequestFlow echo "=== libCoreView dependencies ===" otool -L RequestFlow.app/Contents/Frameworks/libCoreView.1.0.0.dylib 2>/dev/null || echo "libCoreView not found" echo "=== SVG plugin dependencies ===" otool -L RequestFlow.app/Contents/PlugIns/imageformats/libqsvg.dylib 2>/dev/null || echo "libqsvg not found" + echo "=== SVG icon engine dependencies ===" + otool -L RequestFlow.app/Contents/PlugIns/iconengines/libqsvgicon.dylib 2>/dev/null || echo "libqsvgicon not found" + echo "" + echo "=== All verification checks passed! ===" - name: Remove quarantine attributes run: | diff --git a/.github/workflows/build-windows.yml b/.github/workflows/build-windows.yml index 01bfd00..e197b54 100644 --- a/.github/workflows/build-windows.yml +++ b/.github/workflows/build-windows.yml @@ -9,8 +9,7 @@ on: jobs: build-windows: - runs-on: windows-latest - + runs-on: windows-latest steps: - name: Checkout code uses: actions/checkout@v4 @@ -18,12 +17,12 @@ jobs: - name: Install Qt with MinGW uses: jurplel/install-qt-action@v4 with: - version: '6.7.3' + version: 6.8.3 host: 'windows' target: 'desktop' arch: 'win64_mingw' cache: true - tools: 'tools_mingw90' + tools: 'tools_mingw1310' - name: Add MinGW to PATH and verify tools run: | diff --git a/README.md b/README.md index d84683f..c6c13d8 100644 --- a/README.md +++ b/README.md @@ -146,8 +146,21 @@ Configure HTTP or SOCKS5 proxy with optional authentication in Settings. - **Mouse Wheel** - Zoom in/out (no Ctrl required) - **Middle Mouse Button** - Pan canvas -### Recent Projects & Samples -Quick access to recently opened projects from the File menu. Sample projects are automatically discovered from the `samples/` directory and accessible via File > Sample projects. +### Sample Project + +Want to see RequestFlow in action? Download our sample project that demonstrates common API testing workflows. + +**Download the sample:** + +1. **Direct download:** [samples.rqfl](https://github.com/fatehmtd/RequestFlow/raw/main/RequestFlowApp/samples/samples.rqfl) +2. **Via Git:** Clone the repository and find it at `RequestFlowApp/samples/samples.rqfl` + ```bash + git clone https://github.com/fatehmtd/RequestFlow.git + cd RequestFlow/RequestFlowApp/samples + ``` +3. **Via browser:** Navigate to the [samples directory](https://github.com/fatehmtd/RequestFlow/tree/main/RequestFlowApp/samples) on GitHub, click `samples.rqfl`, then click "Download" + +Once downloaded, open the file in RequestFlow via **File > Open Project** to explore pre-built workflows and learn by example. ### Swagger/OpenAPI Import Import API definitions from Swagger JSON files (Tools > Swagger Import). Imported endpoints appear in the Inventory panel where you can drag and drop them directly onto the canvas as pre-configured Endpoint nodes with URL, HTTP method, and parameters already set. @@ -211,46 +224,6 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for detailed build instructions and devel --- -## Quick Example - -**Scenario**: Fetch a user, then fetch their posts using the user ID. - -1. **Create environment** - Add a variable `baseUrl` = `https://jsonplaceholder.typicode.com` - -2. **Add Payload Node** - Define path variables: - - `userId` = `1` - -3. **Add first Endpoint Node** - Configure: - - URL: `{baseUrl}/users/{userId}` - - Method: GET - - Connect Payload → Endpoint - -4. **Add Script Node** - Extract user data: - ```javascript - Response.body = Request.body; - Response.context.userName = Request.body.name; - ``` - Connect Endpoint → Script - -5. **Add second Endpoint Node** - Fetch posts: - - URL: `{baseUrl}/posts?userId={userId}` - - Method: GET - - Connect Script → Endpoint - -6. **Add Assertion Node** - Validate response: - ```javascript - Assert.true(Request.body.length > 0, "User should have posts"); - ``` - Connect Endpoint → Assertion - -7. **Add Viewer Node** - Inspect final data - - Set JSONPath filter: `$[0].title` to see first post title - - Connect Assertion → Viewer - -8. **Run** - Click Execute and watch data flow through each node - ---- - ## Project Status ⚠️ **Early Release Notice** @@ -309,11 +282,12 @@ RequestFlow is open source software licensed under the [MIT License](LICENSE). ## Author -Created and maintained by **Fateh Benmerzoug, Ph.D** +Created and maintained by **Fateh Benmerzoug, Ph.D.** -- Email: fatehmtd+requestflow@gmail.com -- Website: [fatehmtd.github.io/RequestFlow](https://fatehmtd.github.io/RequestFlow) +- Email: fateh.bmzg+requestflow@gmail.com +- Website: [https://fatehbmz.com](https://fatehbmz.com) - GitHub: [@fatehmtd](https://github.com/fatehmtd) +- Linkedin: [https://www.linkedin.com/in/fateh-benmerzoug-phd-50763929/](https://www.linkedin.com/in/fateh-benmerzoug-phd-50763929/) --- diff --git a/docs/index.html b/docs/index.html index df9ac50..a089c8d 100644 --- a/docs/index.html +++ b/docs/index.html @@ -439,8 +439,8 @@
Current Version: 1.0.0
License: MIT License
- Website: fatehmtd.github.io/RequestFlow
- Email: fateh+requestflow@gmail.com
+ Website: http://fatehbmz.com
+ Email: fateh.bmzg+requestflow@gmail.com