fsteg 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,487 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "v*.*.*"
7
+ - "v*"
8
+ workflow_dispatch:
9
+ inputs:
10
+ publish_to_pypi:
11
+ description: "Publish package to PyPI"
12
+ type: boolean
13
+ default: true
14
+ required: true
15
+
16
+ env:
17
+ BIN_NAME: fsteg
18
+ PACKAGE_NAME: fsteg
19
+ RELEASE: "true"
20
+
21
+ permissions:
22
+ contents: write # Needed to create GitHub releases & upload assets
23
+ id-token: write # Needed for PyPI Trusted Publishing
24
+
25
+ jobs:
26
+ # ─── 0. Run Tests ───────────────────────────────────────────────────────────
27
+ test:
28
+ name: Run Test Suite
29
+ runs-on: ubuntu-latest
30
+ steps:
31
+ - name: Checkout repository
32
+ uses: actions/checkout@v4
33
+
34
+ - name: Set up uv
35
+ uses: astral-sh/setup-uv@v5
36
+ with:
37
+ enable-cache: true
38
+
39
+ - name: Set up Python
40
+ run: uv python install 3.11
41
+
42
+ - name: Install dependencies
43
+ run: uv sync --extra test
44
+
45
+ - name: Run test suite
46
+ run: uv run pytest -v
47
+
48
+ # ─── 1. Publish to PyPI (with Manual Approval Gate) ──────────────────────────
49
+ pypi:
50
+ name: Publish to PyPI
51
+ needs: test
52
+ if: github.event_name != 'workflow_dispatch' || inputs.publish_to_pypi
53
+ runs-on: ubuntu-latest
54
+ environment:
55
+ name: release
56
+ url: https://pypi.org/p/fsteg
57
+ steps:
58
+ - name: Checkout repository
59
+ uses: actions/checkout@v4
60
+
61
+ - name: Set up uv
62
+ uses: astral-sh/setup-uv@v5
63
+ with:
64
+ enable-cache: true
65
+
66
+ - name: Set up Python
67
+ run: uv python install 3.11
68
+
69
+ - name: Build distributions
70
+ run: uv build
71
+
72
+ - name: Publish to PyPI
73
+ run: uv publish
74
+
75
+ - name: Upload dist artifacts
76
+ uses: actions/upload-artifact@v4
77
+ with:
78
+ name: pypi-dist
79
+ path: dist/*
80
+
81
+ # ─── 2. Build Standalone Binaries ───────────────────────────────────────────
82
+ build-binaries:
83
+ name: Build Binary — ${{ matrix.target }}
84
+ needs: test
85
+ runs-on: ${{ matrix.os }}
86
+ strategy:
87
+ fail-fast: false
88
+ matrix:
89
+ include:
90
+ # Linux x86_64
91
+ - target: x86_64-unknown-linux-gnu
92
+ os: ubuntu-22.04
93
+ archive: tar.gz
94
+ exe: fsteg
95
+
96
+ # Linux ARM64
97
+ - target: aarch64-unknown-linux-gnu
98
+ os: ubuntu-22.04
99
+ archive: tar.gz
100
+ exe: fsteg
101
+ arm64: true
102
+
103
+ # macOS Intel (x86_64)
104
+ - target: x86_64-apple-darwin
105
+ os: macos-13
106
+ archive: tar.gz
107
+ exe: fsteg
108
+
109
+ # macOS Apple Silicon (arm64)
110
+ - target: aarch64-apple-darwin
111
+ os: macos-14
112
+ archive: tar.gz
113
+ exe: fsteg
114
+
115
+ # Windows x86_64
116
+ - target: x86_64-pc-windows-msvc
117
+ os: windows-latest
118
+ archive: zip
119
+ exe: fsteg.exe
120
+
121
+ steps:
122
+ - name: Checkout repository
123
+ uses: actions/checkout@v4
124
+
125
+ - name: Set up uv
126
+ uses: astral-sh/setup-uv@v5
127
+ with:
128
+ enable-cache: true
129
+
130
+ - name: Set up Python
131
+ if: "!matrix.arm64"
132
+ run: uv python install 3.11
133
+
134
+ # ── Linux ARM64 cross build using QEMU & Docker ──
135
+ - name: Build binary (Linux ARM64 via QEMU)
136
+ if: matrix.arm64
137
+ run: |
138
+ docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
139
+ docker run --rm -v "${PWD}:/app" -w /app arm64v8/python:3.11-slim bash -c "
140
+ apt-get update && apt-get install -y binutils gcc
141
+ pip install --no-cache-dir pyinstaller numpy pillow
142
+ pyinstaller --onefile --name fsteg src/fsteg/main.py --clean
143
+ "
144
+
145
+ # ── Native build (Linux x86_64, macOS, Windows) ──
146
+ - name: Build binary (Native)
147
+ if: "!matrix.arm64"
148
+ run: |
149
+ uv pip install --system pyinstaller numpy pillow
150
+ pyinstaller --onefile --name fsteg src/fsteg/main.py --clean
151
+
152
+ # ── Package Archive ──
153
+ - name: Package (tar.gz — Linux/macOS)
154
+ if: matrix.archive == 'tar.gz'
155
+ shell: bash
156
+ run: |
157
+ ASSET="${{ env.BIN_NAME }}-${{ github.ref_name }}-${{ matrix.target }}.tar.gz"
158
+ cp README.md LICENSE dist/
159
+ tar -czf "${ASSET}" -C dist "${{ matrix.exe }}" README.md LICENSE
160
+ echo "ASSET=${ASSET}" >> "$GITHUB_ENV"
161
+
162
+ - name: Package (zip — Windows)
163
+ if: matrix.archive == 'zip'
164
+ shell: pwsh
165
+ run: |
166
+ $asset = "${{ env.BIN_NAME }}-${{ github.ref_name }}-${{ matrix.target }}.zip"
167
+ Copy-Item "README.md", "LICENSE" -Destination "dist\"
168
+ Compress-Archive -Path "dist\${{ matrix.exe }}", "dist\README.md", "dist\LICENSE" -DestinationPath $asset
169
+ echo "ASSET=$asset" | Out-File -FilePath $env:GITHUB_ENV -Append
170
+
171
+ - name: Compute SHA-256 Checksum
172
+ shell: bash
173
+ run: |
174
+ if command -v sha256sum &>/dev/null; then
175
+ sha256sum "${ASSET}" | awk '{print $1}' > "${ASSET}.sha256"
176
+ else
177
+ shasum -a 256 "${ASSET}" | awk '{print $1}' > "${ASSET}.sha256"
178
+ fi
179
+
180
+ - name: Upload Binary Artifact
181
+ uses: actions/upload-artifact@v4
182
+ with:
183
+ name: binary-${{ matrix.target }}
184
+ path: |
185
+ ${{ env.ASSET }}
186
+ ${{ env.ASSET }}.sha256
187
+
188
+ # ─── 3. Create GitHub Release ───────────────────────────────────────────────
189
+ release:
190
+ name: GitHub Release
191
+ needs: build-binaries
192
+ runs-on: ubuntu-latest
193
+ environment: release
194
+ outputs:
195
+ version: ${{ steps.version.outputs.version }}
196
+ steps:
197
+ - name: Checkout repository
198
+ uses: actions/checkout@v4
199
+
200
+ - name: Extract clean version
201
+ id: version
202
+ run: echo "version=${GITHUB_REF_NAME#v}" >> "$GITHUB_OUTPUT"
203
+
204
+ - name: Download all binary artifacts
205
+ uses: actions/download-artifact@v4
206
+ with:
207
+ path: artifacts
208
+ merge-multiple: true
209
+
210
+ - name: Create GitHub Release
211
+ uses: softprops/action-gh-release@v2
212
+ with:
213
+ generate_release_notes: true
214
+ files: artifacts/**
215
+
216
+ # ─── 4. Build & Publish Debian/Ubuntu .deb (APT) ────────────────────────────
217
+ apt:
218
+ name: Package .deb (APT)
219
+ needs: release
220
+ runs-on: ubuntu-22.04
221
+ steps:
222
+ - name: Checkout repository
223
+ uses: actions/checkout@v4
224
+
225
+ - name: Download Linux x86_64 binary
226
+ uses: actions/download-artifact@v4
227
+ with:
228
+ name: binary-x86_64-unknown-linux-gnu
229
+ path: bin-x86_64
230
+
231
+ - name: Assemble Debian Package
232
+ run: |
233
+ VERSION="${{ needs.release.outputs.version }}"
234
+ PKG_DIR="fsteg_${VERSION}_amd64"
235
+ tar -xzf bin-x86_64/*.tar.gz
236
+
237
+ mkdir -p "${PKG_DIR}/DEBIAN"
238
+ mkdir -p "${PKG_DIR}/usr/bin"
239
+ mkdir -p "${PKG_DIR}/usr/share/doc/fsteg"
240
+
241
+ install -m 755 fsteg "${PKG_DIR}/usr/bin/fsteg"
242
+ cp README.md LICENSE "${PKG_DIR}/usr/share/doc/fsteg/"
243
+
244
+ cat <<EOF > "${PKG_DIR}/DEBIAN/control"
245
+ Package: fsteg
246
+ Version: ${VERSION}
247
+ Section: utils
248
+ Priority: optional
249
+ Architecture: amd64
250
+ Maintainer: Kishan Agarwal <kishanagarwal028@gmail.com>
251
+ Description: High-fidelity FFT block-based frequency domain steganography CLI
252
+ Embeds and extracts arbitrary UTF-8 text messages in images via 2D-DFT.
253
+ EOF
254
+
255
+ dpkg-deb --build --root-owner-group "${PKG_DIR}"
256
+ echo "DEB_FILE=${PKG_DIR}.deb" >> "$GITHUB_ENV"
257
+
258
+ - name: Attach .deb to GitHub Release
259
+ uses: softprops/action-gh-release@v2
260
+ with:
261
+ files: ${{ env.DEB_FILE }}
262
+
263
+ - name: Upload .deb Artifact for APT Repo
264
+ uses: actions/upload-artifact@v4
265
+ with:
266
+ name: debian-package
267
+ path: ${{ env.DEB_FILE }}
268
+
269
+ # ─── 4.5. Host APT Repository on GitHub Pages ──────────────────────────────
270
+ apt-repo:
271
+ name: Update gh-pages APT Repository
272
+ needs: apt
273
+ runs-on: ubuntu-latest
274
+ environment: release
275
+ continue-on-error: true
276
+ steps:
277
+ - name: Checkout gh-pages branch
278
+ uses: actions/checkout@v4
279
+ with:
280
+ ref: gh-pages
281
+
282
+ - name: Download .deb package
283
+ uses: actions/download-artifact@v4
284
+ with:
285
+ name: debian-package
286
+ path: pool/main/
287
+
288
+ - name: Generate APT repository metadata
289
+ run: |
290
+ sudo apt-get update
291
+ sudo apt-get install -y dpkg-dev apt-utils
292
+ dpkg-scanpackages --multiversion pool/ > Packages
293
+ gzip -k -f Packages
294
+ apt-ftparchive release . > Release
295
+
296
+ - name: Commit and push APT repo
297
+ uses: stefanzweifel/git-auto-commit-action@v5
298
+ with:
299
+ commit_message: "Update APT repository with fsteg ${{ needs.release.outputs.version }}"
300
+ branch: gh-pages
301
+
302
+ # ─── 5. Update Homebrew Formula ────────────────────────────────────────────
303
+ homebrew:
304
+ name: Generate Homebrew Formula
305
+ needs: release
306
+ runs-on: ubuntu-latest
307
+ environment: release
308
+ steps:
309
+ - name: Checkout repository
310
+ uses: actions/checkout@v4
311
+
312
+ - name: Download artifacts
313
+ uses: actions/download-artifact@v4
314
+ with:
315
+ path: artifacts
316
+ merge-multiple: true
317
+
318
+ - name: Generate Homebrew Formula
319
+ run: |
320
+ VERSION="${{ needs.release.outputs.version }}"
321
+ ARM64_DARWIN_SHA=$(cat artifacts/fsteg-v${VERSION}-aarch64-apple-darwin.tar.gz.sha256)
322
+ X86_64_DARWIN_SHA=$(cat artifacts/fsteg-v${VERSION}-x86_64-apple-darwin.tar.gz.sha256)
323
+ AARCH64_LINUX_SHA=$(cat artifacts/fsteg-v${VERSION}-aarch64-unknown-linux-gnu.tar.gz.sha256)
324
+ X86_64_LINUX_SHA=$(cat artifacts/fsteg-v${VERSION}-x86_64-unknown-linux-gnu.tar.gz.sha256)
325
+
326
+ sed -e "s/__VERSION__/${VERSION}/g" \
327
+ -e "s/__ARM64_DARWIN_SHA256__/${ARM64_DARWIN_SHA}/g" \
328
+ -e "s/__X86_64_DARWIN_SHA256__/${X86_64_DARWIN_SHA}/g" \
329
+ -e "s/__AARCH64_LINUX_SHA256__/${AARCH64_LINUX_SHA}/g" \
330
+ -e "s/__X86_64_LINUX_SHA256__/${X86_64_LINUX_SHA}/g" \
331
+ packaging/homebrew/fsteg.rb.tpl > fsteg.rb
332
+
333
+ - name: Attach Homebrew Formula to Release
334
+ uses: softprops/action-gh-release@v2
335
+ with:
336
+ files: fsteg.rb
337
+
338
+ - name: Push to homebrew-tap repository
339
+ if: env.HOMEBREW_TAP_TOKEN != ''
340
+ uses: mislav/bump-homebrew-formula-action@v3
341
+ with:
342
+ formula-name: fsteg
343
+ formula-path: Formula/fsteg.rb
344
+ homebrew-tap: Kishan-Agarwal-28/homebrew-tap
345
+ tag-name: ${{ github.ref_name }}
346
+ download-url: https://github.com/${{ github.repository }}/releases/download/${{ github.ref_name }}/fsteg-${{ github.ref_name }}-aarch64-apple-darwin.tar.gz
347
+ env:
348
+ COMMITTER_TOKEN: ${{ secrets.HOMEBREW_TAP_TOKEN }}
349
+
350
+ # ─── 6. Chocolatey Package ─────────────────────────────────────────────────
351
+ chocolatey:
352
+ name: Package & Publish Chocolatey
353
+ needs: release
354
+ runs-on: windows-latest
355
+ environment: release
356
+ steps:
357
+ - name: Checkout repository
358
+ uses: actions/checkout@v4
359
+
360
+ - name: Download Windows artifact
361
+ uses: actions/download-artifact@v4
362
+ with:
363
+ name: binary-x86_64-pc-windows-msvc
364
+ path: artifacts
365
+
366
+ - name: Build Chocolatey Package
367
+ shell: pwsh
368
+ run: |
369
+ $version = "${{ needs.release.outputs.version }}"
370
+ $sha = (Get-Content "artifacts\${{ env.BIN_NAME }}-${{ github.ref_name }}-x86_64-pc-windows-msvc.zip.sha256").Trim().Split()[0]
371
+ $url = "https://github.com/${{ github.repository }}/releases/download/v$version/${{ env.BIN_NAME }}-v$version-x86_64-pc-windows-msvc.zip"
372
+
373
+ New-Item -ItemType Directory -Path "chocolatey\tools" -Force | Out-Null
374
+ Copy-Item "packaging\chocolatey\fsteg.nuspec" -Destination "chocolatey\fsteg.nuspec"
375
+ Copy-Item "packaging\chocolatey\tools\chocolateyUninstall.ps1" -Destination "chocolatey\tools\chocolateyUninstall.ps1"
376
+
377
+ (Get-Content "packaging\chocolatey\tools\chocolateyInstall.ps1.tpl") `
378
+ -replace '__URL__', $url `
379
+ -replace '__SHA256__', $sha |
380
+ Set-Content "chocolatey\tools\chocolateyInstall.ps1"
381
+
382
+ choco pack chocolatey\fsteg.nuspec --version $version --outputdirectory dist-choco
383
+
384
+ - name: Attach .nupkg to Release
385
+ uses: softprops/action-gh-release@v2
386
+ with:
387
+ files: dist-choco/*.nupkg
388
+
389
+ - name: Push to Chocolatey Community
390
+ if: env.CHOCOLATEY_API_KEY != ''
391
+ shell: pwsh
392
+ run: |
393
+ $version = "${{ needs.release.outputs.version }}"
394
+ choco push "dist-choco\fsteg.$version.nupkg" `
395
+ --source https://push.chocolatey.org/ `
396
+ --api-key ${{ secrets.CHOCOLATEY_API_KEY }}
397
+ env:
398
+ CHOCOLATEY_API_KEY: ${{ secrets.CHOCOLATEY_API_KEY }}
399
+
400
+ # ─── 7. Scoop Manifest ─────────────────────────────────────────────────────
401
+ scoop:
402
+ name: Generate Scoop Manifest
403
+ needs: release
404
+ runs-on: ubuntu-latest
405
+ steps:
406
+ - name: Checkout repository
407
+ uses: actions/checkout@v4
408
+
409
+ - name: Download Windows artifact
410
+ uses: actions/download-artifact@v4
411
+ with:
412
+ name: binary-x86_64-pc-windows-msvc
413
+ path: artifacts
414
+
415
+ - name: Generate Scoop Manifest
416
+ run: |
417
+ VERSION="${{ needs.release.outputs.version }}"
418
+ SHA=$(cat artifacts/fsteg-v${VERSION}-x86_64-pc-windows-msvc.zip.sha256 | awk '{print $1}')
419
+
420
+ sed -e "s/__VERSION__/${VERSION}/g" \
421
+ -e "s/__SHA256__/${SHA}/g" \
422
+ packaging/scoop/fsteg.json.tpl > fsteg.json
423
+
424
+ - name: Attach Scoop Manifest to Release
425
+ uses: softprops/action-gh-release@v2
426
+ with:
427
+ files: fsteg.json
428
+
429
+ # ─── 8. WinGet Manifest ────────────────────────────────────────────────────
430
+ winget:
431
+ name: Generate WinGet Manifest
432
+ needs: release
433
+ runs-on: ubuntu-latest
434
+ steps:
435
+ - name: Checkout repository
436
+ uses: actions/checkout@v4
437
+
438
+ - name: Download Windows artifact
439
+ uses: actions/download-artifact@v4
440
+ with:
441
+ name: binary-x86_64-pc-windows-msvc
442
+ path: artifacts
443
+
444
+ - name: Generate WinGet Manifest
445
+ run: |
446
+ VERSION="${{ needs.release.outputs.version }}"
447
+ SHA=$(cat artifacts/fsteg-v${VERSION}-x86_64-pc-windows-msvc.zip.sha256 | awk '{print $1}')
448
+
449
+ sed -e "s/__VERSION__/${VERSION}/g" \
450
+ -e "s/__SHA256__/${SHA}/g" \
451
+ packaging/winget/fsteg.yaml.tpl > fsteg.yaml
452
+
453
+ - name: Attach WinGet Manifest to Release
454
+ uses: softprops/action-gh-release@v2
455
+ with:
456
+ files: fsteg.yaml
457
+
458
+ # ─── 9. Arch Linux (Pacman PKGBUILD) ───────────────────────────────────────
459
+ pacman:
460
+ name: Generate Arch Linux PKGBUILD
461
+ needs: release
462
+ runs-on: ubuntu-latest
463
+ steps:
464
+ - name: Checkout repository
465
+ uses: actions/checkout@v4
466
+
467
+ - name: Download artifacts
468
+ uses: actions/download-artifact@v4
469
+ with:
470
+ path: artifacts
471
+ merge-multiple: true
472
+
473
+ - name: Generate PKGBUILD
474
+ run: |
475
+ VERSION="${{ needs.release.outputs.version }}"
476
+ X86_SHA=$(cat artifacts/fsteg-v${VERSION}-x86_64-unknown-linux-gnu.tar.gz.sha256 | awk '{print $1}')
477
+ ARM_SHA=$(cat artifacts/fsteg-v${VERSION}-aarch64-unknown-linux-gnu.tar.gz.sha256 | awk '{print $1}')
478
+
479
+ sed -e "s/__VERSION__/${VERSION}/g" \
480
+ -e "s/__X86_64_SHA__/${X86_SHA}/g" \
481
+ -e "s/__AARCH64_SHA__/${ARM_SHA}/g" \
482
+ packaging/arch/PKGBUILD.tpl > PKGBUILD
483
+
484
+ - name: Attach PKGBUILD to Release
485
+ uses: softprops/action-gh-release@v2
486
+ with:
487
+ files: PKGBUILD
fsteg-0.1.0/.gitignore ADDED
@@ -0,0 +1,15 @@
1
+ # Python-generated files
2
+ __pycache__/
3
+ *.py[oc]
4
+ build/
5
+ dist/
6
+ wheels/
7
+ *.egg-info
8
+
9
+ # Virtual environments
10
+ .venv
11
+ *.json
12
+ report.md
13
+ *.jpg
14
+ *.spec
15
+ .pytest_cache/
@@ -0,0 +1 @@
1
+ 3.11
fsteg-0.1.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Kishan Agarwal
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.