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.
This commit is contained in:
vjgit96
2026-04-07 15:22:36 -04:00
committed by GitHub
parent dbd31e0472
commit 4f9beebc00
3 changed files with 53 additions and 53 deletions

View File

@ -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']}")

View File

@ -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"
}
}

88
uv.lock generated
View File

@ -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 = [