{"library":"scim2-filter-parser","title":"SCIM2 Filter Parser","description":"scim2-filter-parser (SFP) is a customizable Python library designed to parse and transpile SCIM 2.0 filter queries. It breaks down SCIM queries into tokens, constructs an Abstract Syntax Tree (AST), and can then convert this AST into other query languages, such as SQL WHERE clauses or Django Q objects. The library is currently at version 0.7.0 and is actively maintained.","language":"python","status":"active","last_verified":"Fri May 15","install":{"commands":["pip install scim2-filter-parser"],"cli":null},"imports":["from scim2_filter_parser.queries import SQLQuery","from scim2_filter_parser.transpilers.django_q_object import get_query"],"auth":{"required":false,"env_vars":[]},"quickstart":{"code":"from scim2_filter_parser.queries import SQLQuery\n\n# Define a mapping from SCIM attributes to your database column names.\n# This is crucial for the parser to generate correct SQL.\nattribute_map = {\n    'userName': 'users.username',\n    'emails.value': 'emails.email_address',\n    'emails.type': 'emails.type',\n    'name.familyName': 'users.last_name',\n    'name.givenName': 'users.first_name'\n}\n\n# Define necessary SQL JOINs if your SCIM attributes span multiple tables.\njoins = [\n    'LEFT JOIN emails ON emails.user_id = users.id'\n]\n\nscim_filter = 'userName eq \"bjensen\" or emails[type eq \"work\" and value co \"@example.com\"]'\n\ntry:\n    # Instantiate the SQLQuery parser\n    query_builder = SQLQuery(\n        scim_filter=scim_filter,\n        attribute_map=attribute_map,\n        joins=joins\n    )\n\n    # Get the generated SQL WHERE clause and parameters\n    sql_where_clause = query_builder.sql\n    query_parameters = query_builder.params\n\n    print(f\"Generated SQL WHERE clause: {sql_where_clause}\")\n    print(f\"Query parameters: {query_parameters}\")\n\n    # Example of how you might use it (DO NOT run this directly without proper DB connection and sanitization):\n    # import sqlite3\n    # conn = sqlite3.connect(':memory:')\n    # cursor = conn.cursor()\n    # # For demonstration, imagine 'users' and 'emails' tables exist\n    # # cursor.execute(f\"SELECT * FROM users {joins[0]} WHERE {sql_where_clause}\", query_parameters)\n    # # results = cursor.fetchall()\n    # # print(f\"Query results: {results}\")\n\nexcept Exception as e:\n    print(f\"An error occurred: {e}\")","lang":"python","description":"This quickstart demonstrates how to use `scim2-filter-parser` to convert a SCIM filter string into a SQL WHERE clause and corresponding parameters. It highlights the use of `SQLQuery`, an `attribute_map` to link SCIM attributes to database columns, and optional `joins` for complex queries. The output provides a parameterized query suitable for execution with database connectors, emphasizing safe practices against SQL injection.","tag":null,"tag_description":null,"last_tested":null,"results":[]},"compatibility":{"tag":null,"tag_description":null,"last_tested":"2026-05-15","installed_version":"0.7.0","pypi_latest":"0.7.0","is_stale":false,"summary":{"python_range":"3.10–3.9","success_rate":100,"avg_install_s":1.6,"avg_import_s":0.07,"wheel_type":"wheel"},"results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"scim2-filter-parser","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.04,"mem_mb":1.8,"disk_size":"18.2M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"scim2-filter-parser","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":1.5,"import_time_s":0.03,"mem_mb":1.8,"disk_size":"19M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"scim2-filter-parser","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.08,"mem_mb":2,"disk_size":"20.0M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"scim2-filter-parser","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":1.6,"import_time_s":0.08,"mem_mb":2,"disk_size":"21M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"scim2-filter-parser","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.07,"mem_mb":1.8,"disk_size":"11.9M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"scim2-filter-parser","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":1.5,"import_time_s":0.1,"mem_mb":1.8,"disk_size":"12M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"scim2-filter-parser","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.1,"mem_mb":2.5,"disk_size":"11.7M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"scim2-filter-parser","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":1.5,"import_time_s":0.09,"mem_mb":2.3,"disk_size":"12M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"scim2-filter-parser","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.04,"mem_mb":1.8,"disk_size":"17.6M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"scim2-filter-parser","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":1.8,"import_time_s":0.04,"mem_mb":1.8,"disk_size":"18M"}]}}