Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
86 changes: 75 additions & 11 deletions .github/workflows/build-macos.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -178,6 +177,13 @@ jobs:
</plist>
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
Expand All @@ -191,29 +197,47 @@ 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

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
Expand Down Expand Up @@ -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: |
Expand Down
7 changes: 3 additions & 4 deletions .github/workflows/build-windows.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,21 +9,20 @@ on:

jobs:
build-windows:
runs-on: windows-latest

runs-on: windows-latest
steps:
- name: Checkout code
uses: actions/checkout@v4

- 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: |
Expand Down
64 changes: 19 additions & 45 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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**
Expand Down Expand Up @@ -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/)

---

Expand Down
12 changes: 6 additions & 6 deletions docs/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -439,8 +439,8 @@ <h2 class="section-title">About RequestFlow</h2>
<p>
<strong>Current Version:</strong> 1.0.0<br>
<strong>License:</strong> MIT License<br>
<strong>Website:</strong> <a href="https://fatehmtd.github.io/RequestFlow" target="_blank">fatehmtd.github.io/RequestFlow</a><br>
<strong>Email:</strong> <a href="mailto:fateh+requestflow@gmail.com">fateh+requestflow@gmail.com</a>
<strong>Website:</strong> <a href="https://fatehbmz.com" target="_blank">http://fatehbmz.com</a><br>
<strong>Email:</strong> <a href="mailto:fateh.bmzg+requestflow@gmail.com">fateh.bmzg+requestflow@gmail.com</a>
</p>
</div>
</div>
Expand Down Expand Up @@ -480,7 +480,7 @@ <h2 class="section-title">Built With</h2>
<div class="footer-section">
<h4>RequestFlow</h4>
<p>REST API Testing for Human Beings</p>
<p>&copy; 2025 Fateh Benmerzoug, Ph.D</p>
<p>&copy; 2026 Fateh Benmerzoug, Ph.D</p>
</div>

<div class="footer-section">
Expand All @@ -498,15 +498,15 @@ <h4>Resources</h4>
<ul>
<li><a href="https://github.com/fatehmtd/RequestFlow#readme" target="_blank">Documentation</a></li>
<li><a href="https://github.com/fatehmtd/RequestFlow/blob/main/LICENSE" target="_blank">License</a></li>
<li><a href="https://fatehmtd.github.io/RequestFlow" target="_blank">Website</a></li>
<li><a href="https://github.com/fatehmtd/RequestFlow" target="_blank">Github</a></li>
</ul>
</div>

<div class="footer-section">
<h4>Contact</h4>
<ul>
<li><a href="mailto:fatehmtd+requestflow@gmail.com">fatehmtd+requestflow@gmail.com</a></li>
<li><a href="https://fatehmtd.github.io/RequestFlow" target="_blank">fatehmtd.github.io/RequestFlow</a></li>
<li><a href="mailto:fateh.bmzg+requestflow@gmail.com">fateh.bmzg+requestflow@gmail.com</a></li>
<li><a href="https://fatehbmz.com" target="_blank">fatehbmz.com</a></li>
</ul>
</div>
</div>
Expand Down