{ lib, buildPythonPackage, fetchFromGitHub, hatchling, attrs, chardet, humanize, isodate, jinja2, jsonschema, marko, petl, pydantic, python-dateutil, python-slugify, pyyaml, requests, rfc3986, simpleeval, tabulate, typer, typing-extensions, validators, # Optional formats boto3, google-api-python-client, datasette, duckdb, duckdb-engine, sqlalchemy, pygithub, pyquery, ijson, jsonlines, pymysql, ezodf, lxml, pandas, pyarrow, fastparquet, psycopg, psycopg2, visidata, tatsu, # Tests pytestCheckHook, pytest-lazy-fixtures, pytest-mock, pytest-timeout, pytest-vcr, moto, requests-mock, # Tests depending on excel openpyxl, xlrd, }: buildPythonPackage rec { pname = "frictionless"; version = "5.18.1"; pyproject = true; src = fetchFromGitHub { owner = "frictionlessdata"; repo = "frictionless-py"; tag = "v${version}"; hash = "sha256-svspEHcEw994pEjnuzWf0FFaYeFZuqriK96yFAB6/gI="; }; postPatch = '' substituteInPlace frictionless/conftest.py \ --replace-fail "from pytest_cov.embed import cleanup_on_sigterm" "" \ --replace-fail "cleanup_on_sigterm()" "" ''; build-system = [ hatchling ]; dependencies = [ attrs chardet humanize isodate jinja2 jsonschema marko petl pydantic python-dateutil python-slugify pyyaml requests rfc3986 simpleeval tabulate typer typing-extensions validators ]; optional-dependencies = { # The commented-out formats require dependencies that have not been packaged # They are intentionally left in for reference - Please do not remove them aws = [ boto3 ]; bigquery = [ google-api-python-client ]; #ckan = [ # frictionless-ckan-mapper # not packaged #]; datasette = [ datasette ]; duckdb = [ duckdb duckdb-engine sqlalchemy ]; #excel = [ # openpyxl # tableschema-to-template # not packaged # xlrd # xlwt #]; github = [ pygithub ]; #gsheets = [ # pygsheets # not packaged #]; html = [ pyquery ]; json = [ ijson jsonlines ]; mysql = [ pymysql sqlalchemy ]; ods = [ ezodf lxml ]; pandas = [ pandas pyarrow ]; parquet = [ fastparquet ]; postgresql = [ psycopg psycopg2 sqlalchemy ]; #spss = [ # savreaderwriter # not packaged #]; sql = [ sqlalchemy ]; visidata = [ # Not ideal: This is actually outside pythonPackages set and depends on whatever # Python version the top-level python3Packages set refers to visidata ]; wkt = [ tatsu ]; #zenodo = [ # pyzenodo3 # not packaged #]; }; nativeCheckInputs = [ pytestCheckHook pytest-lazy-fixtures pytest-mock pytest-timeout pytest-vcr moto requests-mock # We do not have all packages for the `excel` format to fully function, # but it's required for some of the tests. openpyxl xlrd ] ++ lib.concatAttrValues optional-dependencies; disabledTestPaths = [ # Requires optional dependencies that have not been packaged (commented out above) # The tests of other unavailable formats are auto-skipped "frictionless/formats/excel" "frictionless/formats/spss" # Console CLI tests fail due to typer/Click CliRunner output capture issues # result.stdout is empty when error messages are expected "frictionless/console/__spec__/test_console.py" "frictionless/console/commands/__spec__/test_summary.py" # We're well-ahead of requirements for duckdb and sqlalchemy # https://github.com/frictionlessdata/frictionless-py/blob/be08dcf491781a565d230f47e08707e703292d85/pyproject.toml#L84 "frictionless/formats/sql/__spec__/duckdb/test_adapter.py" "frictionless/formats/sql/__spec__/duckdb/test_parser.py" "frictionless/indexer/__spec__/test_resource.py::test_resource_index_sqlite[duckdb_url]" "frictionless/indexer/__spec__/test_resource.py::test_resource_index_sqlite_with_metadata[duckdb_url]" "frictionless/indexer/__spec__/test_resource.py::test_resource_index_sqlite_on_progress[duckdb_url]" ]; pythonImportsCheck = [ "frictionless" ]; meta = { description = "Data management framework for Python that provides functionality to describe, extract, validate, and transform tabular data"; homepage = "https://github.com/frictionlessdata/frictionless-py"; changelog = "https://github.com/frictionlessdata/frictionless-py/blob/${src.rev}/CHANGELOG.md"; license = lib.licenses.mit; maintainers = with lib.maintainers; [ zhaofengli ]; }; }