From 4f9beebc007c615e00a2ce9bf19d3b846af8783f Mon Sep 17 00:00:00 2001 From: vjgit96 Date: Tue, 7 Apr 2026 15:22:36 -0400 Subject: [PATCH] fix: add trailing newline to component_index.json (#12545) The build_component_index.py script was generating component_index.json without a trailing newline, causing CI failures when autofix.ci tried to add the missing newline. This fix ensures the generated JSON file always ends with a newline character, following POSIX text file standards. Fixes the 'No newline at end of file' error in the update-component-index workflow job. --- scripts/build_component_index.py | 2 +- src/lfx/src/lfx/_assets/component_index.json | 16 ++-- uv.lock | 88 ++++++++++---------- 3 files changed, 53 insertions(+), 53 deletions(-) diff --git a/scripts/build_component_index.py b/scripts/build_component_index.py index 86dca78f03..6116e7d6df 100644 --- a/scripts/build_component_index.py +++ b/scripts/build_component_index.py @@ -179,7 +179,7 @@ def main(): # Pretty-print for readable git diffs and resolvable merge conflicts print(f"\nWriting formatted index to {output_path}") json_bytes = orjson.dumps(index, option=orjson.OPT_SORT_KEYS | orjson.OPT_INDENT_2) - output_path.write_text(json_bytes.decode("utf-8"), encoding="utf-8") + output_path.write_text(json_bytes.decode("utf-8") + "\n", encoding="utf-8") print("\nIndex successfully written!") print(f" Version: {index['version']}") diff --git a/src/lfx/src/lfx/_assets/component_index.json b/src/lfx/src/lfx/_assets/component_index.json index b617e7353f..bb4e8ba711 100644 --- a/src/lfx/src/lfx/_assets/component_index.json +++ b/src/lfx/src/lfx/_assets/component_index.json @@ -102061,13 +102061,9 @@ "icon": "braces", "legacy": true, "metadata": { - "code_hash": "2ad980f8bac3", + "code_hash": "cf5cd4144fff", "dependencies": { "dependencies": [ - { - "name": "jq", - "version": "1.11.0" - }, { "name": "json_repair", "version": "0.30.3" @@ -102075,6 +102071,10 @@ { "name": "lfx", "version": null + }, + { + "name": "jq", + "version": "1.11.0" } ], "total_dependencies": 3 @@ -102121,7 +102121,7 @@ "show": true, "title_case": false, "type": "code", - "value": "import json\nfrom json import JSONDecodeError\n\nimport jq\nfrom json_repair import repair_json\n\nfrom lfx.custom.custom_component.component import Component\nfrom lfx.inputs.inputs import HandleInput, MessageTextInput\nfrom lfx.io import Output\nfrom lfx.log.logger import logger\nfrom lfx.schema.data import Data\nfrom lfx.schema.message import Message\n\n\nclass ParseJSONDataComponent(Component):\n display_name = \"Parse JSON\"\n description = \"Convert and extract JSON fields.\"\n icon = \"braces\"\n name = \"ParseJSONData\"\n legacy: bool = True\n replacement = [\"processing.ParserComponent\"]\n\n inputs = [\n HandleInput(\n name=\"input_value\",\n display_name=\"Input\",\n info=\"Data object to filter.\",\n required=True,\n input_types=[\"Message\", \"Data\", \"JSON\"],\n ),\n MessageTextInput(\n name=\"query\",\n display_name=\"JQ Query\",\n info=\"JQ Query to filter the data. The input is always a JSON list.\",\n required=True,\n ),\n ]\n\n outputs = [\n Output(display_name=\"Filtered Data\", name=\"filtered_data\", method=\"filter_data\"),\n ]\n\n def _parse_data(self, input_value) -> str:\n if isinstance(input_value, Message) and isinstance(input_value.text, str):\n return input_value.text\n if isinstance(input_value, Data):\n return json.dumps(input_value.data)\n return str(input_value)\n\n def filter_data(self) -> list[Data]:\n to_filter = self.input_value\n if not to_filter:\n return []\n # Check if input is a list\n if isinstance(to_filter, list):\n to_filter = [self._parse_data(f) for f in to_filter]\n else:\n to_filter = self._parse_data(to_filter)\n\n # If input is not a list, don't wrap it in a list\n if not isinstance(to_filter, list):\n to_filter = repair_json(to_filter)\n try:\n to_filter_as_dict = json.loads(to_filter)\n except JSONDecodeError:\n try:\n to_filter_as_dict = json.loads(repair_json(to_filter))\n except JSONDecodeError as e:\n msg = f\"Invalid JSON: {e}\"\n raise ValueError(msg) from e\n else:\n to_filter = [repair_json(f) for f in to_filter]\n to_filter_as_dict = []\n for f in to_filter:\n try:\n to_filter_as_dict.append(json.loads(f))\n except JSONDecodeError:\n try:\n to_filter_as_dict.append(json.loads(repair_json(f)))\n except JSONDecodeError as e:\n msg = f\"Invalid JSON: {e}\"\n raise ValueError(msg) from e\n to_filter = to_filter_as_dict\n\n full_filter_str = json.dumps(to_filter_as_dict)\n\n logger.info(\"to_filter: %s\", to_filter)\n\n results = jq.compile(self.query).input_text(full_filter_str).all()\n logger.info(\"results: %s\", results)\n return [Data(data=value) if isinstance(value, dict) else Data(text=str(value)) for value in results]\n" + "value": "import json\nfrom json import JSONDecodeError\n\nfrom json_repair import repair_json\n\nfrom lfx.custom.custom_component.component import Component\nfrom lfx.inputs.inputs import HandleInput, MessageTextInput\nfrom lfx.io import Output\nfrom lfx.log.logger import logger\nfrom lfx.schema.data import Data\nfrom lfx.schema.message import Message\n\n\nclass ParseJSONDataComponent(Component):\n display_name = \"Parse JSON\"\n description = \"Convert and extract JSON fields.\"\n icon = \"braces\"\n name = \"ParseJSONData\"\n legacy: bool = True\n replacement = [\"processing.ParserComponent\"]\n\n inputs = [\n HandleInput(\n name=\"input_value\",\n display_name=\"Input\",\n info=\"Data object to filter.\",\n required=True,\n input_types=[\"Message\", \"Data\", \"JSON\"],\n ),\n MessageTextInput(\n name=\"query\",\n display_name=\"JQ Query\",\n info=\"JQ Query to filter the data. The input is always a JSON list.\",\n required=True,\n ),\n ]\n\n outputs = [\n Output(display_name=\"Filtered Data\", name=\"filtered_data\", method=\"filter_data\"),\n ]\n\n def _parse_data(self, input_value) -> str:\n if isinstance(input_value, Message) and isinstance(input_value.text, str):\n return input_value.text\n if isinstance(input_value, Data):\n return json.dumps(input_value.data)\n return str(input_value)\n\n def filter_data(self) -> list[Data]:\n to_filter = self.input_value\n if not to_filter:\n return []\n # Check if input is a list\n if isinstance(to_filter, list):\n to_filter = [self._parse_data(f) for f in to_filter]\n else:\n to_filter = self._parse_data(to_filter)\n\n # If input is not a list, don't wrap it in a list\n if not isinstance(to_filter, list):\n to_filter = repair_json(to_filter)\n try:\n to_filter_as_dict = json.loads(to_filter)\n except JSONDecodeError:\n try:\n to_filter_as_dict = json.loads(repair_json(to_filter))\n except JSONDecodeError as e:\n msg = f\"Invalid JSON: {e}\"\n raise ValueError(msg) from e\n else:\n to_filter = [repair_json(f) for f in to_filter]\n to_filter_as_dict = []\n for f in to_filter:\n try:\n to_filter_as_dict.append(json.loads(f))\n except JSONDecodeError:\n try:\n to_filter_as_dict.append(json.loads(repair_json(f)))\n except JSONDecodeError as e:\n msg = f\"Invalid JSON: {e}\"\n raise ValueError(msg) from e\n to_filter = to_filter_as_dict\n\n full_filter_str = json.dumps(to_filter_as_dict)\n\n logger.info(\"to_filter: %s\", to_filter)\n\n try:\n import jq\n except ImportError:\n msg = \"jq is required for Parse JSON. Install with: pip install jq\"\n raise ImportError(msg) from None\n\n results = jq.compile(self.query).input_text(full_filter_str).all()\n logger.info(\"results: %s\", results)\n return [Data(data=value) if isinstance(value, dict) else Data(text=str(value)) for value in results]\n" }, "input_value": { "_input_type": "HandleInput", @@ -117836,6 +117836,6 @@ "num_components": 354, "num_modules": 97 }, - "sha256": "02f57aa656a8b35375b6ad34d68e4a054f582e7fece325ee538df9d183044bc7", + "sha256": "84f6f6d00ef76cb536616c7dc63cec2ddab4c0ad18985d1f8361ae8a131f733e", "version": "0.4.0" -} \ No newline at end of file +} diff --git a/uv.lock b/uv.lock index 8b6b07b718..6c0d975179 100644 --- a/uv.lock +++ b/uv.lock @@ -119,33 +119,33 @@ name = "agent-lifecycle-toolkit" version = "0.10.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "aiofiles" }, - { name = "black" }, - { name = "docstring-parser" }, - { name = "genson" }, - { name = "ibm-watsonx-ai", version = "1.3.42", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "ibm-watsonx-ai", version = "1.5.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "jinja2" }, - { name = "jsonschema" }, - { name = "langchain-chroma" }, - { name = "langchain-community" }, - { name = "langchain-core" }, - { name = "langchain-huggingface" }, - { name = "langchain-text-splitters" }, - { name = "litellm", version = "1.75.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.13' or sys_platform != 'win32'" }, + { name = "aiofiles", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, + { name = "black", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, + { name = "docstring-parser", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, + { name = "genson", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, + { name = "ibm-watsonx-ai", version = "1.3.42", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.11' and platform_machine != 'x86_64') or (python_full_version < '3.11' and sys_platform != 'darwin')" }, + { name = "ibm-watsonx-ai", version = "1.5.3", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.11' and platform_machine != 'x86_64') or (python_full_version >= '3.11' and sys_platform != 'darwin')" }, + { name = "jinja2", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, + { name = "jsonschema", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, + { name = "langchain-chroma", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, + { name = "langchain-community", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, + { name = "langchain-core", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, + { name = "langchain-huggingface", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, + { name = "langchain-text-splitters", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, + { name = "litellm", version = "1.75.3", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.13' and sys_platform == 'win32') or (platform_machine != 'x86_64' and sys_platform == 'darwin') or (sys_platform != 'darwin' and sys_platform != 'win32')" }, { name = "litellm", version = "1.80.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.13' and sys_platform == 'win32'" }, - { name = "llm-sandbox", extra = ["docker", "podman"] }, - { name = "nltk" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "onnxruntime", version = "1.23.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "openai" }, - { name = "pydantic" }, - { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "scipy", version = "1.17.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "smolagents" }, - { name = "tomli" }, - { name = "typing-extensions" }, + { name = "llm-sandbox", extra = ["docker", "podman"], marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, + { name = "nltk", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.11' and platform_machine != 'x86_64') or (python_full_version < '3.11' and sys_platform != 'darwin')" }, + { name = "numpy", version = "2.4.3", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.11' and platform_machine != 'x86_64') or (python_full_version >= '3.11' and sys_platform != 'darwin')" }, + { name = "onnxruntime", version = "1.23.2", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.11' and platform_machine != 'x86_64') or (python_full_version < '3.11' and sys_platform != 'darwin')" }, + { name = "openai", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, + { name = "pydantic", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, + { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.11' and platform_machine != 'x86_64') or (python_full_version < '3.11' and sys_platform != 'darwin')" }, + { name = "scipy", version = "1.17.1", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.11' and platform_machine != 'x86_64') or (python_full_version >= '3.11' and sys_platform != 'darwin')" }, + { name = "smolagents", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, + { name = "tomli", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, + { name = "typing-extensions", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/70/34/46b02b1d4942279a19437632a65d0b964715cbb60b443d43012671d691e6/agent_lifecycle_toolkit-0.10.1.tar.gz", hash = "sha256:940920d84b844616b33baedaf4bbed34b9e678142f4a4f8a012e588aaa8a20b4", size = 8655370, upload-time = "2026-03-16T20:58:23.576Z" } wheels = [ @@ -5537,9 +5537,9 @@ name = "langchain-huggingface" version = "1.2.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "huggingface-hub" }, - { name = "langchain-core" }, - { name = "tokenizers" }, + { name = "huggingface-hub", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, + { name = "langchain-core", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, + { name = "tokenizers", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/42/5b/4910551367de5c6ec246616fcc0ddb0bc6f9e5d353d4a22dcb5ab1f87e60/langchain_huggingface-1.2.1.tar.gz", hash = "sha256:33d52a30a56775380c6b4321b78136a410eb079132a80fe7120ddd4b954b4efa", size = 253106, upload-time = "2026-03-02T18:44:39.163Z" } wheels = [ @@ -6047,7 +6047,7 @@ aioboto3 = [ ] all = [ { name = "ag2" }, - { name = "agent-lifecycle-toolkit" }, + { name = "agent-lifecycle-toolkit", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, { name = "aioboto3" }, { name = "apify-client" }, { name = "arize-phoenix-otel" }, @@ -6102,7 +6102,7 @@ all = [ { name = "langchain-google-vertexai" }, { name = "langchain-graph-retriever" }, { name = "langchain-groq" }, - { name = "langchain-huggingface" }, + { name = "langchain-huggingface", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, { name = "langchain-mcp-adapters" }, { name = "langchain-milvus" }, { name = "langchain-mistralai" }, @@ -6162,7 +6162,7 @@ all = [ { name = "zep-python" }, ] altk = [ - { name = "agent-lifecycle-toolkit" }, + { name = "agent-lifecycle-toolkit", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, ] anthropic = [ { name = "langchain-anthropic" }, @@ -6213,7 +6213,7 @@ cohere = [ ] complete = [ { name = "ag2" }, - { name = "agent-lifecycle-toolkit" }, + { name = "agent-lifecycle-toolkit", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, { name = "aioboto3" }, { name = "apify-client" }, { name = "arize-phoenix-otel" }, @@ -6268,7 +6268,7 @@ complete = [ { name = "langchain-google-vertexai" }, { name = "langchain-graph-retriever" }, { name = "langchain-groq" }, - { name = "langchain-huggingface" }, + { name = "langchain-huggingface", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, { name = "langchain-mcp-adapters" }, { name = "langchain-milvus" }, { name = "langchain-mistralai" }, @@ -6421,7 +6421,7 @@ kubernetes = [ { name = "kubernetes" }, ] langchain-huggingface = [ - { name = "langchain-huggingface" }, + { name = "langchain-huggingface", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, ] langchain-mcp-adapters = [ { name = "langchain-mcp-adapters" }, @@ -6631,7 +6631,7 @@ dev = [ [package.metadata] requires-dist = [ { name = "ag2", marker = "extra == 'ag2'", specifier = ">=0.1.0" }, - { name = "agent-lifecycle-toolkit", marker = "extra == 'altk'", specifier = ">=0.10.1,<1.0" }, + { name = "agent-lifecycle-toolkit", marker = "(platform_machine != 'x86_64' and extra == 'altk') or (sys_platform != 'darwin' and extra == 'altk')", specifier = ">=0.10.1,<1.0" }, { name = "aioboto3", marker = "extra == 'aioboto3'", specifier = ">=15.2.0,<16.0.0" }, { name = "aiofile", specifier = ">=3.9.0,<4.0.0" }, { name = "aiofiles", specifier = ">=24.1.0,<25.0.0" }, @@ -6727,7 +6727,7 @@ requires-dist = [ { name = "langchain-google-vertexai", marker = "extra == 'google'", specifier = "~=3.2.0" }, { name = "langchain-graph-retriever", marker = "extra == 'graph-retriever'", specifier = "==0.8.0" }, { name = "langchain-groq", marker = "extra == 'groq'", specifier = "~=1.1.1" }, - { name = "langchain-huggingface", marker = "extra == 'langchain-huggingface'", specifier = "~=1.2.0" }, + { name = "langchain-huggingface", marker = "(platform_machine != 'x86_64' and extra == 'langchain-huggingface') or (sys_platform != 'darwin' and extra == 'langchain-huggingface')", specifier = "~=1.2.0" }, { name = "langchain-ibm", specifier = "~=1.0.2" }, { name = "langchain-mcp-adapters", marker = "extra == 'langchain-mcp-adapters'", specifier = ">=0.1.14,<0.2.0" }, { name = "langchain-milvus", marker = "extra == 'milvus'", specifier = "~=0.3.2" }, @@ -7383,7 +7383,7 @@ name = "llm-sandbox" version = "0.3.37" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pydantic" }, + { name = "pydantic", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ff/96/fa676c1551ed96a6d4814c1a5ad8561d723be7344e03bc293d9ee53b3db7/llm_sandbox-0.3.37.tar.gz", hash = "sha256:bec2d2d2b6eb5311fd70e4aa6a21e60c3c7e8dee36f89aac47a1fd072485adc6", size = 605861, upload-time = "2026-03-02T06:45:28.168Z" } wheels = [ @@ -7392,11 +7392,11 @@ wheels = [ [package.optional-dependencies] docker = [ - { name = "docker" }, + { name = "docker", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, ] podman = [ - { name = "docker" }, - { name = "podman" }, + { name = "docker", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, + { name = "podman", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, ] [[package]] @@ -10259,9 +10259,9 @@ name = "podman" version = "5.8.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "requests" }, - { name = "tomli", marker = "python_full_version < '3.11'" }, - { name = "urllib3" }, + { name = "requests", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, + { name = "tomli", marker = "(python_full_version < '3.11' and platform_machine != 'x86_64') or (python_full_version < '3.11' and sys_platform != 'darwin')" }, + { name = "urllib3", marker = "platform_machine != 'x86_64' or sys_platform != 'darwin'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/18/f1/ea8988ff2085d1a898f7f27b7fa26a5b5e296949c6ef4df26ebc2be1aac0/podman-5.8.0.tar.gz", hash = "sha256:bc39b77f4a6a0598bbe860d199e0d54ef2ec551131ae7eab66f0557c43331fb3", size = 121596, upload-time = "2026-03-25T15:21:22.353Z" } wheels = [