diff --git a/pkgs/development/python-modules/arelle/default.nix b/pkgs/development/python-modules/arelle/default.nix
index 36429cc7fd47..b7d147c411a8 100644
--- a/pkgs/development/python-modules/arelle/default.nix
+++ b/pkgs/development/python-modules/arelle/default.nix
@@ -1,21 +1,26 @@
{
+ callPackage,
lib,
buildPythonPackage,
- pythonAtLeast,
fetchFromGitHub,
setuptools,
setuptools-scm,
+ bottle,
certifi,
filelock,
isodate,
+ jsonschema,
lxml,
numpy,
openpyxl,
+ pillow,
pyparsing,
python-dateutil,
regex,
+ truststore,
+ typing-extensions,
gui ? true,
tkinter,
@@ -43,116 +48,131 @@
boto3,
}:
-buildPythonPackage rec {
- pname = "arelle${lib.optionalString (!gui) "-headless"}";
- version = "2.30.25";
- pyproject = true;
+# ideally we'd use finalAttrs.finalPackage instead of lib.fix for self-reference,
+# but buildPythonPackage doesn't support it yet
+lib.fix (
+ self:
+ buildPythonPackage rec {
+ pname = "arelle${lib.optionalString (!gui) "-headless"}";
+ version = "2.37.59";
+ pyproject = true;
- disabled = pythonAtLeast "3.13"; # Note: when updating, check if this is still needed
+ src = fetchFromGitHub {
+ owner = "Arelle";
+ repo = "Arelle";
+ tag = version;
+ hash = "sha256-ao4OKe3e1V3Df7396gVn4nqmpKNAbs5ny2y/GsxQwcE=";
+ };
- src = fetchFromGitHub {
- owner = "Arelle";
- repo = "Arelle";
- tag = version;
- hash = "sha256-xzTrFie97HDIqPZ4nzCh+0p/w0bTK12cS0FSsuIi7tY=";
- };
-
- outputs = [
- "out"
- "doc"
- ];
-
- postPatch = ''
- substituteInPlace pyproject.toml --replace-fail \
- 'requires = ["setuptools~=73.0", "wheel~=0.44", "setuptools_scm[toml]~=8.1"]' \
- 'requires = ["setuptools", "wheel", "setuptools_scm[toml]"]'
- '';
-
- build-system = [
- setuptools
- setuptools-scm
- ];
-
- dependencies = [
- certifi
- filelock
- isodate
- lxml
- numpy
- openpyxl
- pyparsing
- python-dateutil
- regex
- ]
- ++ lib.optionals gui [ tkinter ];
-
- optional-dependencies = {
- crypto = [ pycryptodome ];
- db = [
- pg8000
- pymysql
- pyodbc
- rdflib
+ outputs = [
+ "out"
+ "doc"
];
- efm = [
- holidays
- pytz
- ];
- esef = [ tinycss2 ];
- objectmaker = [ graphviz ];
- webserver = [
- cheroot
- cherrypy
- tornado
- ];
- };
- nativeBuildInputs = [
- # deps for docs
- sphinxHook
- sphinx-autodoc2
- myst-parser
- sphinx-copybutton
- furo
- ];
-
- # the arelleGUI executable doesn't work when the gui option is false
- postInstall = lib.optionalString (!gui) ''
- find $out/bin -name "*arelleGUI*" -delete
- '';
-
- nativeCheckInputs = [
- pytestCheckHook
- boto3
- ]
- ++ lib.flatten (lib.attrValues optional-dependencies);
-
- preCheck = ''
- export HOME=$(mktemp -d)
- '';
-
- disabledTestPaths = [
- "tests/integration_tests"
- ]
- ++ lib.optionals (!gui) [
- # these tests import tkinter
- "tests/unit_tests/arelle/test_updater.py"
- "tests/unit_tests/arelle/test_import.py"
- ];
-
- meta = {
- description = "Open source XBRL platform";
- longDescription = ''
- An open source facility for XBRL, the eXtensible Business Reporting
- Language supporting various standards, exposed through a Python or
- REST API ${lib.optionalString gui " and a graphical user interface"}.
+ postPatch = ''
+ substituteInPlace pyproject.toml --replace-fail \
+ 'requires = ["setuptools>=80.9,<81", "wheel>=0.45,<1", "setuptools_scm[toml]>=9.2,<10"]' \
+ 'requires = ["setuptools", "wheel", "setuptools_scm[toml]"]'
'';
- mainProgram = "arelle";
- homepage = "http://arelle.org/";
- license = lib.licenses.asl20;
- maintainers = with lib.maintainers; [
- tomasajt
- roberth
+
+ build-system = [
+ setuptools
+ setuptools-scm
];
- };
-}
+
+ dependencies = [
+ bottle
+ certifi
+ filelock
+ isodate
+ jsonschema
+ lxml
+ numpy
+ openpyxl
+ pillow
+ pyparsing
+ python-dateutil
+ regex
+ truststore
+ typing-extensions
+ ]
+ ++ lib.optionals gui [ tkinter ];
+
+ optional-dependencies = {
+ crypto = [ pycryptodome ];
+ db = [
+ pg8000
+ pymysql
+ pyodbc
+ rdflib
+ ];
+ efm = [
+ holidays
+ pytz
+ ];
+ esef = [ tinycss2 ];
+ objectmaker = [ graphviz ];
+ webserver = [
+ cheroot
+ cherrypy
+ tornado
+ ];
+ };
+
+ nativeBuildInputs = [
+ # deps for docs
+ sphinxHook
+ sphinx-autodoc2
+ myst-parser
+ sphinx-copybutton
+ furo
+ ];
+
+ # the arelleGUI executable doesn't work when the gui option is false
+ postInstall = lib.optionalString (!gui) ''
+ find $out/bin -name "*arelleGUI*" -delete
+ '';
+
+ nativeCheckInputs = [
+ pytestCheckHook
+ boto3
+ ]
+ ++ lib.flatten (lib.attrValues optional-dependencies);
+
+ preCheck = ''
+ export HOME=$(mktemp -d)
+ '';
+
+ disabledTestPaths = [
+ "tests/integration_tests"
+ ]
+ ++ lib.optionals (!gui) [
+ # these tests import tkinter
+ "tests/unit_tests/arelle/test_updater.py"
+ "tests/unit_tests/arelle/test_import.py"
+ ];
+
+ passthru.hasGUI = gui;
+
+ passthru.tests = {
+ cli = callPackage ./test-cli.nix { arelle = self; };
+ };
+
+ meta = {
+ changelog = "https://github.com/Arelle/Arelle/releases/tag/${src.tag}";
+ description = "Open source XBRL platform";
+ longDescription = ''
+ An open source facility for XBRL, the eXtensible Business Reporting
+ Language supporting various standards, exposed through a Python or
+ REST API ${lib.optionalString gui " and a graphical user interface"}.
+ '';
+ mainProgram = "arelle";
+ homepage = "http://arelle.org/";
+ license = lib.licenses.asl20;
+ maintainers = with lib.maintainers; [
+ tomasajt
+ roberth
+ ];
+ };
+ }
+)
diff --git a/pkgs/development/python-modules/arelle/test-cli.nix b/pkgs/development/python-modules/arelle/test-cli.nix
new file mode 100644
index 000000000000..17a0ebc0b6ce
--- /dev/null
+++ b/pkgs/development/python-modules/arelle/test-cli.nix
@@ -0,0 +1,117 @@
+# Run with:
+# cd nixpkgs
+# nix-build -A python3Packages.arelle.passthru.tests.cli
+#
+# Note: These are uninteresting generated smoke tests to verify basic functionality
+{
+ lib,
+ runCommand,
+ arelle,
+}:
+
+runCommand "arelle-test-cli${lib.optionalString (!arelle.hasGUI) "-headless"}"
+ {
+ nativeBuildInputs = [ arelle ];
+ }
+ ''
+ # Set up temporary home directory
+ export HOME=$(mktemp -d)
+
+ # Test basic CLI commands work with proper assertions
+ arelleCmdLine --version --disablePersistentConfig 2>&1 | grep "Arelle(r) 2.37.59" > /dev/null
+ arelleCmdLine --help --disablePersistentConfig 2>&1 | grep "Usage: arelleCmdLine \[options\]" > /dev/null
+ arelleCmdLine --about --disablePersistentConfig 2>&1 | grep "An open source XBRL platform" > /dev/null
+
+ ${lib.optionalString arelle.hasGUI ''
+ # check if the arelleGUI command is available
+ command -v arelleGUI
+ ''}
+
+ # Create a simple but valid XBRL instance for testing validation functionality
+ cat > test-instance.xbrl << 'EOF'
+
+
+
+
+
+
+
+ TEST_ENTITY
+
+
+ 2023-12-31
+
+
+
+
+ EOF
+
+ # Also create a minimal test schema for more comprehensive testing
+ cat > test-schema.xsd << 'EOF'
+
+
+
+
+
+
+
+
+ EOF
+
+ # Test XBRL validation functionality
+ arelleCmdLine \
+ --file test-instance.xbrl \
+ --validate \
+ --disablePersistentConfig \
+ --internetConnectivity=offline \
+ --logLevel=info 2>&1 | grep "\[info\] validated in .* secs - .*test-instance.xbrl" > /dev/null
+
+ # Test with the built-in empty instance from arelle config
+ arelleCmdLine \
+ --file "${arelle}/lib/python3.13/site-packages/arelle/config/empty-instance.xml" \
+ --validate \
+ --disablePersistentConfig \
+ --internetConnectivity=offline \
+ --logLevel=info 2>&1 | grep "\[info\] validated in .* secs - .*empty-instance.xml" > /dev/null
+
+ # Test formula functionality (without running - just checking it loads)
+ arelleCmdLine \
+ --file test-instance.xbrl \
+ --formula=none \
+ --disablePersistentConfig \
+ --internetConnectivity=offline 2>&1 | grep "\[info\] loaded in .* secs.*test-instance.xbrl" > /dev/null
+
+ # Test facts output functionality
+ TEMP_DIR=$(mktemp -d)
+ arelleCmdLine \
+ --file test-instance.xbrl \
+ --facts="$TEMP_DIR/test-facts.csv" \
+ --disablePersistentConfig \
+ --internetConnectivity=offline 2>&1 | grep "\[info\] loaded in .* secs.*test-instance.xbrl" > /dev/null
+
+ # Test schema validation
+ arelleCmdLine \
+ --file test-schema.xsd \
+ --validate \
+ --disablePersistentConfig \
+ --internetConnectivity=offline \
+ --logLevel=info 2>&1 | grep "\[info\] validated in .* secs - .*test-schema.xsd" > /dev/null
+
+ # Test disclosure system validation option
+ arelleCmdLine \
+ --disclosureSystem=help \
+ --disablePersistentConfig 2>&1 | grep "Disclosure system choices:" > /dev/null
+
+ # Create success marker
+ touch $out
+ ''