Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ protected internal override void ValidateFunctionApp(string functionAppRoot, Pac
dir => PackValidationHelper.RunInvalidFlagComboValidation(
options.NoBuild && BuildNativeDeps,
"Invalid options: --no-build cannot be used with --build-native-deps."),
dir => PackValidationHelper.RunRequiredFilesValidation(dir, new[] { "requirements.txt" }, "Validate Folder Structure"),
dir => RunPythonDependencyFilesValidation(dir),
dir =>
{
// Validate .python_packages directory exists and is not empty
Expand Down Expand Up @@ -173,5 +173,31 @@ public static void RunPythonProgrammingModelValidation(string directory)
throw new CliException(modelError);
}
}

/// <summary>
/// Runs a Python dependency files validation and displays results.
/// Validates that the project has either requirements.txt OR pyproject.toml (with optional uv.lock).
/// Throws CliException if validation fails.
/// </summary>
internal static void RunPythonDependencyFilesValidation(string directory)
{
var hasRequirementsTxt = FileSystemHelpers.FileExists(Path.Combine(directory, Constants.RequirementsTxt));
var hasPyProjectToml = FileSystemHelpers.FileExists(Path.Combine(directory, Constants.PyProjectToml));
var hasUvLock = FileSystemHelpers.FileExists(Path.Combine(directory, Constants.UvLock));

var hasDependencyFiles = hasRequirementsTxt || hasPyProjectToml;

PackValidationHelper.DisplayValidationResult(
"Validate Folder Structure",
hasDependencyFiles);

if (!hasDependencyFiles)
{
PackValidationHelper.DisplayValidationEnd();
throw new CliException(
$"Required dependency file(s) not found in {directory}. " +
$"Python projects require either '{Constants.RequirementsTxt}' or '{Constants.PyProjectToml}' (optionally with '{Constants.UvLock}').");
}
}
}
}
2 changes: 2 additions & 0 deletions src/Cli/func/Common/Constants.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ internal static partial class Constants
public const string FunctionsWorkerRuntime = "FUNCTIONS_WORKER_RUNTIME";
public const string FunctionsWorkerRuntimeVersion = "FUNCTIONS_WORKER_RUNTIME_VERSION";
public const string RequirementsTxt = "requirements.txt";
public const string PyProjectToml = "pyproject.toml";
public const string UvLock = "uv.lock";
public const string PythonGettingStarted = "getting_started.md";
public const string PySteinFunctionAppPy = "function_app.py";
public const string FunctionJsonFileName = "function.json";
Expand Down
Loading