183 lines
4.7 KiB
Nix
183 lines
4.7 KiB
Nix
{ lib
|
|
, stdenv
|
|
, python3
|
|
, fetchFromGitHub
|
|
, tesseract4
|
|
, leptonica
|
|
, wl-clipboard
|
|
, libnotify
|
|
, xorg
|
|
, makeDesktopItem
|
|
, copyDesktopItems
|
|
}:
|
|
|
|
let
|
|
|
|
ps = python3.pkgs;
|
|
|
|
wrapperDeps = [
|
|
leptonica
|
|
tesseract4
|
|
libnotify
|
|
] ++ lib.optionals stdenv.hostPlatform.isLinux [
|
|
wl-clipboard
|
|
];
|
|
|
|
in
|
|
|
|
ps.buildPythonApplication rec {
|
|
pname = "normcap";
|
|
version = "0.5.9";
|
|
format = "pyproject";
|
|
|
|
disabled = ps.pythonOlder "3.9";
|
|
|
|
src = fetchFromGitHub {
|
|
owner = "dynobo";
|
|
repo = "normcap";
|
|
rev = "refs/tags/v${version}";
|
|
hash = "sha256-K8BkPRHmcJSzYPxv49a1whKpe+StK7m0ea7t2YNUESw=";
|
|
};
|
|
|
|
pythonRemoveDeps = [
|
|
"pyside6-essentials"
|
|
];
|
|
|
|
pythonRelaxDeps = [
|
|
"shiboken6"
|
|
];
|
|
|
|
build-system = [
|
|
ps.hatchling
|
|
ps.babel
|
|
] ++ lib.optionals stdenv.hostPlatform.isDarwin [
|
|
ps.toml
|
|
];
|
|
|
|
nativeBuildInputs = [
|
|
copyDesktopItems
|
|
];
|
|
|
|
dependencies = [
|
|
ps.pyside6
|
|
ps.jeepney
|
|
];
|
|
|
|
preFixup = ''
|
|
makeWrapperArgs+=(
|
|
"''${qtWrapperArgs[@]}"
|
|
--set QT_QPA_PLATFORM xcb
|
|
--prefix PATH : ${lib.makeBinPath wrapperDeps}
|
|
)
|
|
'';
|
|
|
|
postInstall = lib.optionalString stdenv.hostPlatform.isLinux ''
|
|
mkdir -p $out/share/pixmaps
|
|
ln -s $out/${python3.sitePackages}/normcap/resources/icons/normcap.png $out/share/pixmaps/
|
|
'';
|
|
|
|
nativeCheckInputs = wrapperDeps ++ [
|
|
ps.pytestCheckHook
|
|
ps.pytest-cov-stub
|
|
ps.pytest-instafail
|
|
ps.pytest-qt
|
|
ps.toml
|
|
] ++ lib.optionals stdenv.hostPlatform.isLinux [
|
|
ps.pytest-xvfb
|
|
xorg.xvfb
|
|
];
|
|
|
|
preCheck = ''
|
|
export HOME=$(mktemp -d)
|
|
'' + lib.optionalString stdenv.hostPlatform.isLinux ''
|
|
# setup a virtual x11 display
|
|
export DISPLAY=:$((2000 + $RANDOM % 1000))
|
|
Xvfb $DISPLAY -screen 5 1024x768x8 &
|
|
xvfb_pid=$!
|
|
'';
|
|
|
|
postCheck = lib.optionalString stdenv.hostPlatform.isLinux ''
|
|
# cleanup the virtual x11 display
|
|
sleep 0.5
|
|
kill $xvfb_pid
|
|
'';
|
|
|
|
disabledTests = [
|
|
# requires a wayland session (no xclip support)
|
|
"test_wl_copy"
|
|
# RuntimeError: Please destroy the QApplication singleton before creating a new QApplication instance
|
|
"test_get_application"
|
|
# times out, unknown why
|
|
"test_update_checker_triggers_checked_signal"
|
|
# touches network
|
|
"test_urls_reachable"
|
|
# requires xdg
|
|
"test_synchronized_capture"
|
|
# flaky
|
|
"test_normcap_ocr_testcases"
|
|
] ++ lib.optionals stdenv.hostPlatform.isDarwin [
|
|
# requires display
|
|
"test_send_via_qt_tray"
|
|
"test_screens"
|
|
# requires impure pbcopy
|
|
"test_get_copy_func_with_pbcopy"
|
|
"test_get_copy_func_without_pbcopy"
|
|
"test_perform_pbcopy"
|
|
"test_pbcopy"
|
|
"test_copy"
|
|
# NSXPCSharedListener endpointForReply:withListenerName:replyErrorCode:
|
|
# while obtaining endpoint 'ClientCallsAuxiliary': Connection interrupted
|
|
# since v5.0.0
|
|
"test_introduction_initialize_checkbox_state"
|
|
"test_introduction_checkbox_sets_return_code"
|
|
"test_introduction_toggle_checkbox_changes_return_code"
|
|
"test_show_introduction"
|
|
];
|
|
|
|
disabledTestPaths = [
|
|
# touches network
|
|
"tests/tests_gui/test_downloader.py"
|
|
# fails to import, causes pytest to freeze
|
|
"tests/tests_gui/test_language_manager.py"
|
|
# RuntimeError("Internal C++ object (PySide6.QtGui.QHideEvent) already deleted.")
|
|
# AttributeError("'LoadingIndicator' object has no attribute 'timer'")
|
|
"tests/tests_gui/test_loading_indicator.py"
|
|
] ++ lib.optionals stdenv.hostPlatform.isDarwin [
|
|
# requires a display
|
|
"tests/integration/test_normcap.py"
|
|
"tests/integration/test_tray_menu.py"
|
|
"tests/integration/test_settings_menu.py"
|
|
"tests/tests_clipboard/test_handlers/test_qtclipboard.py"
|
|
"tests/tests_gui/test_tray.py"
|
|
"tests/tests_gui/test_window.py"
|
|
"tests/tests_screengrab/"
|
|
# failure unknown, crashes in first test with `.show()`
|
|
"tests/tests_gui/test_loading_indicator.py"
|
|
"tests/tests_gui/test_menu_button.py"
|
|
"tests/tests_gui/test_resources.py"
|
|
"tests/tests_gui/test_update_check.py"
|
|
];
|
|
|
|
desktopItems = [
|
|
(makeDesktopItem {
|
|
name = "com.github.dynobo.normcap";
|
|
desktopName = "NormCap";
|
|
genericName = "OCR powered screen-capture tool";
|
|
comment = "Extract text from an image directly into clipboard";
|
|
exec = "normcap";
|
|
icon = "normcap";
|
|
terminal = false;
|
|
categories = ["Utility" "Office"];
|
|
keywords = ["Text" "Extraction" "OCR"];
|
|
})
|
|
];
|
|
|
|
meta = with lib; {
|
|
description = "OCR powered screen-capture tool to capture information instead of images";
|
|
homepage = "https://dynobo.github.io/normcap/";
|
|
changelog = "https://github.com/dynobo/normcap/releases/tag/v${version}";
|
|
license = licenses.gpl3Plus;
|
|
maintainers = with maintainers; [ cafkafk pbsds ];
|
|
mainProgram = "normcap";
|
|
};
|
|
}
|