Merge pull request #707 from DJ2LS/dev-pip-package

WIP: Pip installer
This commit is contained in:
DJ2LS 2024-04-17 22:32:33 +02:00 committed by GitHub
commit 9ac9f4766e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
9 changed files with 212 additions and 13 deletions

View file

@ -0,0 +1,117 @@
name: Build and Release APPIMAGE Installer
on: [push]
jobs:
build-and-release:
runs-on: ubuntu-latest
steps:
- name: Check out repository
uses: actions/checkout@v4
- name: Set up Python 3.11
uses: actions/setup-python@v5
with:
python-version: "3.11"
- name: Electron Builder
working-directory: gui
run: |
npm i
npm run build
- name: LIST ALL FILES
run: ls -R
- name: Install Linux dependencies
run: |
sudo apt install -y portaudio19-dev libhamlib-dev libhamlib-utils build-essential cmake python3-libhamlib2 patchelf
- name: Install Python dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
- name: Build binaries
working-directory: modem
run: |
python3 -m nuitka --remove-output --assume-yes-for-downloads --follow-imports --include-data-dir=lib=lib --include-data-files=lib/codec2/*=lib/codec2/ --include-data-files=config.ini.example=config.ini --standalone server.py --output-filename=freedata-server
- name: Prepare AppImage folder
run: |
mkdir -p $HOME/freedata-appimage
- name: Copy GUI
run: |
cp -r gui/release/linux-unpacked/* $HOME/freedata-appimage/gui
- name: Copy server
run: |
cp -r modem/server.dist/* $HOME/freedata-appimage/server
- name: Copy Icon
run: |
cp gui/build/icon.png $HOME/freedata-appimage/icon.png
- name: Create Desktop shortcut
run: |
echo '
# Create desktop file
echo "[Desktop Entry]
Type=Application
Name=FreeDATA
Icon=icon
Exec=AppRun
Categories=Utility ' > $HOME/freedata-appimage/FreeDATA.desktop
- name: Create AppImage build script
run: |
echo '#!/bin/bash
# Navigate to the AppDir root; this ensures relative paths work as expected
cd "$(dirname "$(readlink -f "${0}")")"
# check if config exists in ~/.config/FreeDATA/config.ini else create it
SERVER_CONFIG_FILE=~/.config/FreeDATA/config.ini
if test -f "$SERVER_CONFIG_FILE"; then
echo "$SERVER_CONFIG_FILE exists."
else
echo "$SERVER_CONFIG_FILE does not exist. Copying the default one"
mkdir ~/.config/FreeDATA
cp server.dist/config.ini $SERVER_CONFIG_FILE
fi
export FREEDATA_CONFIG=$SERVER_CONFIG_FILE
# Launch the main application executable from the linux-unpacked directory
./linux-unpacked/freedata
' > $HOME/AppRun
chmod +x $HOME/freedata-appimage/AppRun
- name: Download AppImage
run: |
wget https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage -O appimagetool-x86_64.AppImage
chmod +x appimagetool-x86_64.AppImage
- name: Execute AppImage
run: |
./appimagetool-x86_64.AppImage freedata-appimage/
- name: LIST ALL FILES
run: ls -R
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: 'FreeDATA-x86_64.AppImage'
path: ./$HOME/FreeDATA-x86_64.AppImage
- name: Upload Installer to Release
uses: softprops/action-gh-release@v1
if: startsWith(github.ref, 'refs/tags/v')
with:
draft: true
files: ./$HOME/FreeDATA-x86_64.AppImage
tag_name: ${{ github.ref_name }}
name: 'FreeDATA-x86_64.AppImage'

38
.github/workflows/pip_package.yml vendored Normal file
View file

@ -0,0 +1,38 @@
name: Deploy Python Package
on:
push:
tags:
- '*'
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Python 3.11
uses: actions/setup-python@v5
with:
python-version: "3.11"
- name: Install Linux dependencies
run: |
sudo apt install -y portaudio19-dev libhamlib-dev libhamlib-utils build-essential cmake python3-libhamlib2 patchelf
- name: Install Python dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
pip install wheel
- name: Build package
run: |
python setup.py sdist bdist_wheel
- name: Publish to PyPI
uses: pypa/gh-action-pypi-publish@v1.4.2
with:
user: __token__
password: ${{ secrets.PYPI_API_TOKEN }}

View file

@ -111,11 +111,12 @@ app.whenReady().then(() => {
//serverProcess = spawn(serverPath, [], { detached: true });
//serverProcess.unref(); // Allow the server process to continue running independently of the parent process
// break;
//case "linux":
//serverPath = join(basePath, "freedata-server", "freedata-server.exe");
//serverProcess = spawn(serverPath, [], { detached: true });
//serverProcess.unref(); // Allow the server process to continue running independently of the parent process
// break;
case "linux":
serverPath = join(basePath, "server.dist", "freedata-server");
console.log(`Starting server with path: ${serverPath}`);
serverProcess = spawn(serverPath, [], { detached: true });
serverProcess.unref(); // Allow the server process to continue running independently of the parent process
break;
case "win32":
serverPath = join(basePath, "freedata-server", "freedata-server.exe");
console.log(`Starting server with path: ${serverPath}`);

0
modem/__init__.py Normal file
View file

View file

@ -82,14 +82,14 @@ def freedv_get_mode_name_by_value(mode: int) -> str:
"""
return FREEDV_MODE(mode).name
# Get the directory of the current script file
script_dir = os.path.dirname(os.path.abspath(__file__))
sys.path.append(script_dir)
# Use script_dir to construct the paths for file search
if sys.platform == "linux":
files = glob.glob(os.path.join(script_dir, "**/*libcodec2*"), recursive=True)
files.append(os.path.join(script_dir, "libcodec2.so"))
#files.append(os.path.join(script_dir, "libcodec2.so"))
elif sys.platform == "darwin":
if hasattr(sys, "_MEIPASS"):
files = glob.glob(os.path.join(getattr(sys, "_MEIPASS"), '**/*libcodec2*'), recursive=True)
@ -100,6 +100,8 @@ elif sys.platform in ["win32", "win64"]:
else:
files = []
api = None
print(files)
for file in files:
try:
api = ctypes.CDLL(file)

View file

@ -13,6 +13,8 @@ class DatabaseManager:
def __init__(self, event_manger, db_file=None):
self.event_manager = event_manger
if not db_file:
print(os.environ)
script_dir = os.path.dirname(os.path.abspath(__file__))
db_path = os.path.join(script_dir, 'freedata-messages.db')
db_file = 'sqlite:///' + db_path

View file

@ -1,10 +1,13 @@
import time
import sys
import os
script_directory = os.path.dirname(os.path.abspath(__file__))
sys.path.append(script_directory)
import time
from flask import Flask, request, jsonify, make_response, abort, Response
from flask_sock import Sock
from flask_cors import CORS
import os
import sys
import serial_ports
from config import CONFIG
import audio
@ -33,7 +36,7 @@ from schedule_manager import ScheduleManager
app = Flask(__name__)
CORS(app, resources={r"/*": {"origins": "*"}})
sock = Sock(app)
MODEM_VERSION = "0.15.2-alpha"
MODEM_VERSION = "0.15.3-alpha"
# set config file to use
def set_config():
@ -343,7 +346,7 @@ def stop_server():
print('Server shutdown...')
print("------------------------------------------")
if __name__ == "__main__":
def main():
app.config['SOCK_SERVER_OPTIONS'] = {'ping_interval': 10}
# define global MODEM_VERSION
app.MODEM_VERSION = MODEM_VERSION
@ -382,3 +385,5 @@ if __name__ == "__main__":
app.run(modemaddress, modemport)
if __name__ == "__main__":
main()

34
setup.py Normal file
View file

@ -0,0 +1,34 @@
from setuptools import setup, find_packages
# Reading requirements.txt for dependencies
with open('requirements.txt') as f:
required = f.read().splitlines()
with open("README.md", "r", encoding="utf-8") as fh:
long_description = fh.read()
setup(
name='freedata-server',
version='0.15.3',
packages=find_packages(where='.'),
package_dir={'': '.'},
install_requires=required,
python_requires='>=3.9',
author='DJ2LS',
author_email='dj2ls@proton.me',
description='A free, open-source, multi-platform application for sending files and messages, using the codec2 HF modems.',
long_description=long_description,
long_description_content_type="text/markdown",
url='https://freedata.app',
license='GPL3.0',
entry_points={
'console_scripts': [
'freedata-server=modem.server:main', # Points to the main() function in server.py
],
},
include_package_data=True, # Ensure non-python files are included if specified
package_data={
# Include all files under any directory within the 'modem' package
'modem': ['lib/**/*'], # Recursive include for all files in 'lib' and its subdirectories
},
)

View file

@ -1,3 +1,3 @@
#autopep8 --in-place --select W291,W293,W391,E231 --ignore E501 ../modem.py ../deprecated_data_handler.py ../deprecated_main.py ../deprecated_sock.py ../deprecated_static.py ../helpers.py
#autopep8 --in-place --select W291,W293,W391,E231 --ignore E501 ../encoder_decoder.py ../deprecated_data_handler.py ../deprecated_main.py ../deprecated_sock.py ../deprecated_static.py ../helpers.py
autopep8 --in-place --ignore E501 ../modem.py ../data_handler.py ../main.py ../sock.py ../static.py ../helpers.py