This is an automated email from the ASF dual-hosted git repository.
michaelsmolina pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/superset.git
The following commit(s) were added to refs/heads/master by this push:
new d36ddbbb33 feat(extensions-cli): Add .gitignore generation to init
command (#36768)
d36ddbbb33 is described below
commit d36ddbbb3347b72c856681652a1ec873b390be9b
Author: Michael S. Molina <[email protected]>
AuthorDate: Fri Dec 19 13:33:37 2025 -0300
feat(extensions-cli): Add .gitignore generation to init command (#36768)
---
.../src/superset_extensions_cli/cli.py | 5 +++
.../templates/.gitignore.j2 | 36 ++++++++++++++++++++++
superset-extensions-cli/tests/test_cli_init.py | 32 ++++++++++++++++---
superset-extensions-cli/tests/utils.py | 2 +-
4 files changed, 70 insertions(+), 5 deletions(-)
diff --git a/superset-extensions-cli/src/superset_extensions_cli/cli.py
b/superset-extensions-cli/src/superset_extensions_cli/cli.py
index 2eed72e138..0f75f4cf14 100644
--- a/superset-extensions-cli/src/superset_extensions_cli/cli.py
+++ b/superset-extensions-cli/src/superset_extensions_cli/cli.py
@@ -484,6 +484,11 @@ def init(
(target_dir / "extension.json").write_text(extension_json)
click.secho("✅ Created extension.json", fg="green")
+ # Create .gitignore
+ gitignore = env.get_template(".gitignore.j2").render(ctx)
+ (target_dir / ".gitignore").write_text(gitignore)
+ click.secho("✅ Created .gitignore", fg="green")
+
# Initialize frontend files
if include_frontend:
frontend_dir = target_dir / "frontend"
diff --git
a/superset-extensions-cli/src/superset_extensions_cli/templates/.gitignore.j2
b/superset-extensions-cli/src/superset_extensions_cli/templates/.gitignore.j2
new file mode 100644
index 0000000000..5c0740a1fd
--- /dev/null
+++
b/superset-extensions-cli/src/superset_extensions_cli/templates/.gitignore.j2
@@ -0,0 +1,36 @@
+# Dependencies
+node_modules/
+
+# Build outputs
+dist/
+*.supx
+
+# Python
+__pycache__/
+*.py[cod]
+*$py.class
+*.egg-info/
+.eggs/
+*.egg
+.venv/
+venv/
+env/
+ENV/
+
+# IDE
+.idea/
+.vscode/
+*.swp
+*.swo
+
+# OS
+.DS_Store
+Thumbs.db
+
+# Logs
+*.log
+npm-debug.log*
+
+# Environment
+.env
+.env.local
diff --git a/superset-extensions-cli/tests/test_cli_init.py
b/superset-extensions-cli/tests/test_cli_init.py
index 60d5f99dba..8bf00d3c77 100644
--- a/superset-extensions-cli/tests/test_cli_init.py
+++ b/superset-extensions-cli/tests/test_cli_init.py
@@ -296,10 +296,34 @@ def test_init_command_output_messages(cli_runner,
isolated_filesystem, cli_input
output = result.output
# Check for expected success messages
- assert "✅ Created extension.json" in output
- assert "✅ Created frontend folder structure" in output
- assert "✅ Created backend folder structure" in output
- assert "🎉 Extension Test Extension (ID: test_extension) initialized" in
output
+ assert "Created extension.json" in output
+ assert "Created .gitignore" in output
+ assert "Created frontend folder structure" in output
+ assert "Created backend folder structure" in output
+ assert "Extension Test Extension (ID: test_extension) initialized" in
output
+
+
[email protected]
+def test_gitignore_content_is_correct(cli_runner, isolated_filesystem,
cli_input_both):
+ """Test that the generated .gitignore has the correct content."""
+ result = cli_runner.invoke(app, ["init"], input=cli_input_both)
+ assert result.exit_code == 0
+
+ extension_path = isolated_filesystem / "test_extension"
+ gitignore_path = extension_path / ".gitignore"
+
+ assert_file_exists(gitignore_path, ".gitignore")
+
+ content = gitignore_path.read_text()
+
+ # Verify key patterns are present
+ assert "node_modules/" in content
+ assert "dist/" in content
+ assert "*.supx" in content
+ assert "__pycache__" in content
+ assert ".venv/" in content
+ assert ".DS_Store" in content
+ assert ".env" in content
@pytest.mark.cli
diff --git a/superset-extensions-cli/tests/utils.py
b/superset-extensions-cli/tests/utils.py
index 77513bcb85..0a65d7a395 100644
--- a/superset-extensions-cli/tests/utils.py
+++ b/superset-extensions-cli/tests/utils.py
@@ -191,7 +191,7 @@ def create_test_extension_structure(
Dictionary with expected paths and metadata
"""
extension_path = base_path / id_
- expected_files = ["extension.json"]
+ expected_files = ["extension.json", ".gitignore"]
expected_dirs: list[str] = []
if include_frontend: