Skip to content
Merged
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
2 changes: 2 additions & 0 deletions acceptance/localenv/cluster-stale-environment/out.test.toml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions acceptance/localenv/cluster-stale-environment/output.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@

>>> [CLI] environments setup-local --cluster-name my-cluster --dry-run
warning: [tool.databricks.environment] environment_version "5" is left from a serverless target but the current target is a cluster; it is not updated
Plan: [TEST_TMP_DIR]/pyproject.toml
changed region: tool.uv.constraint-dependencies
Check complete. No files were modified.
15 changes: 15 additions & 0 deletions acceptance/localenv/cluster-stale-environment/script
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# An existing project set up for serverless carries [tool.databricks.environment].
# Re-running against a cluster target leaves it untouched but warns it is stale.
cat > pyproject.toml <<'PY'
[project]
name = "demo"
requires-python = ">=3.11"

[dependency-groups]
dev = ["databricks-connect~=15.4.0"]

[tool.databricks.environment]
environment_version = "5"
PY

trace $CLI environments setup-local --cluster-name my-cluster --dry-run
36 changes: 36 additions & 0 deletions acceptance/localenv/cluster-stale-environment/test.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
EnvMatrix.DATABRICKS_BUNDLE_ENGINE = ["direct"]

# The script writes pyproject.toml as the merge input; --dry-run leaves it unchanged.
Ignore = ["pyproject.toml"]

[Env]
DATABRICKS_LOCALENV_CONSTRAINT_SOURCE_URL_TEST_OVERRIDE = "$DATABRICKS_HOST"

# A cluster target does not manage [tool.databricks.environment], so a leftover
# serverless environment_version is reported as stale.
[[Server]]
Pattern = "GET /api/2.1/clusters/list"
Response.Body = '''
{
"clusters": [
{"cluster_id": "cid-123", "cluster_name": "my-cluster", "spark_version": "15.4.x-scala2.12"}
]
}
'''

[[Server]]
Pattern = "GET /dbr/15.4.x-scala2.12/pyproject.toml"
Response.Body = '''
[project]
requires-python = ">=3.11"

[dependency-groups]
dev = ["databricks-connect~=15.4.0"]

[tool.uv]
constraint-dependencies = ["pyarrow<19"]
'''

[[Repls]]
Old = 'uv uv \S+(?: \([^)]+\))?'
New = 'uv [UV_VERSION]'
2 changes: 1 addition & 1 deletion acceptance/localenv/constraints-only-existing/output.txt
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
"wouldWrite": "[TEST_TMP_DIR]/pyproject.toml",
"wouldBackup": "[TEST_TMP_DIR]/pyproject.toml.bak",
"wouldInstallPython": "3.12",
"diff": "--- pyproject.toml\n+++ pyproject.toml.new\n@@ -1,8 +1,15 @@\n [project]\n name = \"demo\"\n-requires-python = \"\u003e=3.10\"\n+requires-python = \"\u003e=3.12\"\n dependencies = [\"databricks-connect==15.1.*\"]\n \n [dependency-groups]\n dev = [\"databricks-connect~=16.0\"]\n docs = [\"databricks-connect==15.0.0\"]\n+\n+# managed by databricks environments setup-local — do not edit\n+[tool.uv]\n+constraint-dependencies = [\n+ \"pyarrow\u003c19\",\n+]\n+# end managed by databricks environments setup-local\n"
"diff": "--- pyproject.toml\n+++ pyproject.toml.new\n@@ -1,8 +1,18 @@\n [project]\n name = \"demo\"\n-requires-python = \"\u003e=3.10\"\n+requires-python = \"\u003e=3.12\"\n dependencies = [\"databricks-connect==15.1.*\"]\n \n [dependency-groups]\n dev = [\"databricks-connect~=16.0\"]\n docs = [\"databricks-connect==15.0.0\"]\n+\n+[tool.databricks.environment]\n+environment_version = \"4\"\n+\n+# managed by databricks environments setup-local — do not edit\n+[tool.uv]\n+constraint-dependencies = [\n+ \"pyarrow\u003c19\",\n+]\n+# end managed by databricks environments setup-local\n"
},
"phases": [
{
Expand Down
2 changes: 1 addition & 1 deletion acceptance/localenv/constraints-only/output.txt
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
"plan": {
"wouldWrite": "[TEST_TMP_DIR]/pyproject.toml",
"wouldInstallPython": "3.12",
"diff": "--- pyproject.toml\n+++ pyproject.toml\n@@ -1 +1,15 @@\n+[project]\n+name = \"001\"\n+version = \"0.0.0\"\n+requires-python = \"\u003e=3.12\"\n+\n+[dependency-groups]\n+dev = []\n+\n+# managed by databricks environments setup-local — do not edit\n+[tool.uv]\n+constraint-dependencies = [\n+ \"pyarrow\u003c19\",\n+ \"pandas\u003c3\",\n+]\n+# end managed by databricks environments setup-local\n"
"diff": "--- pyproject.toml\n+++ pyproject.toml\n@@ -1 +1,18 @@\n+[project]\n+name = \"001\"\n+version = \"0.0.0\"\n+requires-python = \"\u003e=3.12\"\n+\n+[dependency-groups]\n+dev = []\n+\n+[tool.databricks.environment]\n+environment_version = \"4\"\n+\n+# managed by databricks environments setup-local — do not edit\n+[tool.uv]\n+constraint-dependencies = [\n+ \"pyarrow\u003c19\",\n+ \"pandas\u003c3\",\n+]\n+# end managed by databricks environments setup-local\n"
},
"phases": [
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
"wouldWrite": "[TEST_TMP_DIR]/pyproject.toml",
"wouldBackup": "[TEST_TMP_DIR]/pyproject.toml.bak",
"wouldInstallPython": "3.12",
"diff": "--- pyproject.toml\n+++ pyproject.toml.new\n@@ -1,6 +1,6 @@\n [project]\n name = \"demo\"\n-requires-python = \"\u003e=3.10\"\n+requires-python = \"\u003e=3.12\"\n dependencies = [\n \"databricks-connect\u003e=15\",\n \"databricks-connect ; python_version \u003c '3.13'\",\n@@ -10,5 +10,11 @@\n extra = [\"databricks-connect\"]\n \n [dependency-groups]\n-dev = [\"databricks-connect~=16.0\"]\n+dev = [\"databricks-connect~=17.2.0\"]\n test = [\"databricks-connect\u003e=15,\u003c20\"]\n+\n+# managed by databricks environments setup-local — do not edit\n+[tool.uv]\n+constraint-dependencies = [\n+]\n+# end managed by databricks environments setup-local\n"
"diff": "--- pyproject.toml\n+++ pyproject.toml.new\n@@ -1,6 +1,6 @@\n [project]\n name = \"demo\"\n-requires-python = \"\u003e=3.10\"\n+requires-python = \"\u003e=3.12\"\n dependencies = [\n \"databricks-connect\u003e=15\",\n \"databricks-connect ; python_version \u003c '3.13'\",\n@@ -10,5 +10,14 @@\n extra = [\"databricks-connect\"]\n \n [dependency-groups]\n-dev = [\"databricks-connect~=16.0\"]\n+dev = [\"databricks-connect~=17.2.0\"]\n test = [\"databricks-connect\u003e=15,\u003c20\"]\n+\n+[tool.databricks.environment]\n+environment_version = \"4\"\n+\n+# managed by databricks environments setup-local — do not edit\n+[tool.uv]\n+constraint-dependencies = [\n+]\n+# end managed by databricks environments setup-local\n"
},
"phases": [
{
Expand Down
2 changes: 1 addition & 1 deletion acceptance/localenv/dbconnect-consolidate-check/output.txt
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
"wouldWrite": "[TEST_TMP_DIR]/pyproject.toml",
"wouldBackup": "[TEST_TMP_DIR]/pyproject.toml.bak",
"wouldInstallPython": "3.12",
"diff": "--- pyproject.toml\n+++ pyproject.toml.new\n@@ -1,15 +1,20 @@\n [project]\n name = \"demo\"\n-requires-python = \"\u003e=3.10\"\n+requires-python = \"\u003e=3.12\"\n dependencies = [\n \"databricks-dlt\",\n- \"databricks-connect==15.1.*\",\n \"pytest\",\n ]\n \n [project.optional-dependencies]\n-extra = [\"databricks-connect==14.0.0\"]\n+extra = []\n \n [dependency-groups]\n-dev = [\"databricks-connect~=16.0\"]\n-docs = [\"databricks-connect==15.0.0\"]\n+dev = [\"databricks-connect~=17.2.0\"]\n+docs = []\n+\n+# managed by databricks environments setup-local — do not edit\n+[tool.uv]\n+constraint-dependencies = [\n+]\n+# end managed by databricks environments setup-local\n"
"diff": "--- pyproject.toml\n+++ pyproject.toml.new\n@@ -1,15 +1,23 @@\n [project]\n name = \"demo\"\n-requires-python = \"\u003e=3.10\"\n+requires-python = \"\u003e=3.12\"\n dependencies = [\n \"databricks-dlt\",\n- \"databricks-connect==15.1.*\",\n \"pytest\",\n ]\n \n [project.optional-dependencies]\n-extra = [\"databricks-connect==14.0.0\"]\n+extra = []\n \n [dependency-groups]\n-dev = [\"databricks-connect~=16.0\"]\n-docs = [\"databricks-connect==15.0.0\"]\n+dev = [\"databricks-connect~=17.2.0\"]\n+docs = []\n+\n+[tool.databricks.environment]\n+environment_version = \"4\"\n+\n+# managed by databricks environments setup-local — do not edit\n+[tool.uv]\n+constraint-dependencies = [\n+]\n+# end managed by databricks environments setup-local\n"
},
"phases": [
{
Expand Down
1 change: 1 addition & 0 deletions acceptance/localenv/job-serverless-check/output.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,5 @@ Plan: [TEST_TMP_DIR]/pyproject.toml
changed region: requires-python
changed region: tool.uv.constraint-dependencies
changed region: databricks-connect
changed region: tool.databricks.environment
Check complete. No files were modified.
1 change: 1 addition & 0 deletions acceptance/localenv/job-task-foreach/output.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,5 @@ Plan: [TEST_TMP_DIR]/pyproject.toml
changed region: requires-python
changed region: tool.uv.constraint-dependencies
changed region: databricks-connect
changed region: tool.databricks.environment
Check complete. No files were modified.
2 changes: 1 addition & 1 deletion acceptance/localenv/merge-warnings-json/output.txt
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
"wouldWrite": "[TEST_TMP_DIR]/pyproject.toml",
"wouldBackup": "[TEST_TMP_DIR]/pyproject.toml.bak",
"wouldInstallPython": "3.12",
"diff": "--- pyproject.toml\n+++ pyproject.toml.new\n@@ -1,9 +1,17 @@\n [project]\n name = \"demo\"\n-requires-python = \"\u003e=3.10\"\n+requires-python = \"\u003e=3.12\"\n dependencies = [\"pyarrow==21.0.0\"]\n \n [dependency-groups]\n-dev = [\"databricks-connect~=16.0.0\", {include-group = \"spark\"}]\n-spark = [\"databricks-connect==15.0.0\"]\n+dev = [\"databricks-connect~=17.2.0\", {include-group = \"spark\"}]\n+spark = []\n qa = [\"pandas==4.0.0\"]\n+\n+# managed by databricks environments setup-local — do not edit\n+[tool.uv]\n+constraint-dependencies = [\n+ \"pyarrow\u003c19\",\n+ \"pandas\u003c3\",\n+]\n+# end managed by databricks environments setup-local\n"
"diff": "--- pyproject.toml\n+++ pyproject.toml.new\n@@ -1,9 +1,20 @@\n [project]\n name = \"demo\"\n-requires-python = \"\u003e=3.10\"\n+requires-python = \"\u003e=3.12\"\n dependencies = [\"pyarrow==21.0.0\"]\n \n [dependency-groups]\n-dev = [\"databricks-connect~=16.0.0\", {include-group = \"spark\"}]\n-spark = [\"databricks-connect==15.0.0\"]\n+dev = [\"databricks-connect~=17.2.0\", {include-group = \"spark\"}]\n+spark = []\n qa = [\"pandas==4.0.0\"]\n+\n+[tool.databricks.environment]\n+environment_version = \"4\"\n+\n+# managed by databricks environments setup-local — do not edit\n+[tool.uv]\n+constraint-dependencies = [\n+ \"pyarrow\u003c19\",\n+ \"pandas\u003c3\",\n+]\n+# end managed by databricks environments setup-local\n"
},
"phases": [
{
Expand Down
1 change: 1 addition & 0 deletions acceptance/localenv/merge-warnings/output.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,6 @@ warning: dependency "pandas==4.0.0" conflicts with the environment constraint "p
Plan: [TEST_TMP_DIR]/pyproject.toml
changed region: requires-python
changed region: databricks-connect
changed region: tool.databricks.environment
changed region: tool.uv.constraint-dependencies
Check complete. No files were modified.
1 change: 1 addition & 0 deletions acceptance/localenv/serverless-check/output.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,5 @@ Plan: [TEST_TMP_DIR]/pyproject.toml
changed region: requires-python
changed region: tool.uv.constraint-dependencies
changed region: databricks-connect
changed region: tool.databricks.environment
Check complete. No files were modified.
2 changes: 1 addition & 1 deletion acceptance/localenv/serverless-json-major-pin/output.txt
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
"plan": {
"wouldWrite": "[TEST_TMP_DIR]/pyproject.toml",
"wouldInstallPython": "3.12",
"diff": "--- pyproject.toml\n+++ pyproject.toml\n@@ -1 +1,17 @@\n+[project]\n+name = \"001\"\n+version = \"0.0.0\"\n+requires-python = \"\u003e=3.12\"\n+\n+[dependency-groups]\n+dev = [\n+ \"databricks-connect~=17.0\",\n+]\n+\n+# managed by databricks environments setup-local — do not edit\n+[tool.uv]\n+constraint-dependencies = [\n+ \"pyarrow\u003c19\",\n+ \"pandas\u003c3\",\n+]\n+# end managed by databricks environments setup-local\n"
"diff": "--- pyproject.toml\n+++ pyproject.toml\n@@ -1 +1,20 @@\n+[project]\n+name = \"001\"\n+version = \"0.0.0\"\n+requires-python = \"\u003e=3.12\"\n+\n+[dependency-groups]\n+dev = [\n+ \"databricks-connect~=17.0\",\n+]\n+\n+[tool.databricks.environment]\n+environment_version = \"4\"\n+\n+# managed by databricks environments setup-local — do not edit\n+[tool.uv]\n+constraint-dependencies = [\n+ \"pyarrow\u003c19\",\n+ \"pandas\u003c3\",\n+]\n+# end managed by databricks environments setup-local\n"
},
"phases": [
{
Expand Down
2 changes: 1 addition & 1 deletion acceptance/localenv/serverless-json/output.txt
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
"plan": {
"wouldWrite": "[TEST_TMP_DIR]/pyproject.toml",
"wouldInstallPython": "3.12",
"diff": "--- pyproject.toml\n+++ pyproject.toml\n@@ -1 +1,17 @@\n+[project]\n+name = \"001\"\n+version = \"0.0.0\"\n+requires-python = \"\u003e=3.12\"\n+\n+[dependency-groups]\n+dev = [\n+ \"databricks-connect~=17.2.0\",\n+]\n+\n+# managed by databricks environments setup-local — do not edit\n+[tool.uv]\n+constraint-dependencies = [\n+ \"pyarrow\u003c19\",\n+ \"pandas\u003c3\",\n+]\n+# end managed by databricks environments setup-local\n"
"diff": "--- pyproject.toml\n+++ pyproject.toml\n@@ -1 +1,20 @@\n+[project]\n+name = \"001\"\n+version = \"0.0.0\"\n+requires-python = \"\u003e=3.12\"\n+\n+[dependency-groups]\n+dev = [\n+ \"databricks-connect~=17.2.0\",\n+]\n+\n+[tool.databricks.environment]\n+environment_version = \"4\"\n+\n+# managed by databricks environments setup-local — do not edit\n+[tool.uv]\n+constraint-dependencies = [\n+ \"pyarrow\u003c19\",\n+ \"pandas\u003c3\",\n+]\n+# end managed by databricks environments setup-local\n"
},
"phases": [
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,6 @@ warning: requires-python ">=3.10" is replaced by the environment's ">=3.12"
warning: dependency "pyarrow==18.*" conflicts with the environment constraint "pyarrow~=19.0"
Plan: [TEST_TMP_DIR]/pyproject.toml
changed region: requires-python
changed region: tool.databricks.environment
changed region: tool.uv.constraint-dependencies
Check complete. No files were modified.
5 changes: 5 additions & 0 deletions libs/localenv/constraints.go
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,11 @@ type Constraints struct {
DatabricksConnect string
// ConstraintDeps is the list of entries from [tool.uv].constraint-dependencies.
ConstraintDeps []string
// EnvironmentVersion is the serverless environment version written into
// [tool.databricks.environment].environment_version (e.g. "5"). It is not
// parsed from the artifact but set by the pipeline from the resolved compute
// target; it is empty for cluster targets, where the section is not managed.
EnvironmentVersion string
}

// cacheFileName maps an env key to a single, collision-free cache filename.
Expand Down
75 changes: 68 additions & 7 deletions libs/localenv/merge.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,20 @@ var (

// Region names reported back to the caller via MergeManaged's regions return value.
const (
regionRequiresPython = "requires-python"
regionDatabricksConnect = "databricks-connect"
regionToolUv = "tool.uv.constraint-dependencies"
regionRequiresPython = "requires-python"
regionDatabricksConnect = "databricks-connect"
regionToolUv = "tool.uv.constraint-dependencies"
regionDatabricksEnvironment = "tool.databricks.environment"
)

// databricksEnvironmentTable is the TOML table header that carries the
// serverless environment version, and environmentVersionRe matches the start of
// its managed environment_version assignment (capturing leading whitespace so it
// is preserved when the value is replaced).
const databricksEnvironmentTable = "[tool.databricks.environment]"

var environmentVersionRe = regexp.MustCompile(`^(\s*)environment_version\s*=`)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why aren't we using a TOML library to do this merging rather than hand-rolling regexes?

Not a blocker since it seems the rest of this file does the same. This is the first of the merging code I'm reviewing so I'm curious why this approach was taken

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The merge preserves the user's file byte-for-byte outside the small managed regions — comments, key ordering, and whitespace all survive. A TOML library round-trip (decode → re-encode) reformats the whole document, drops comments, and reorders keys, which isn't acceptable for a user-owned pyproject.toml we only partially manage. So it's deliberately line-based with targeted edits, and it refuses to merge (rather than risk corruption) on shapes it can't safely edit line-wise — e.g. multi-line strings (errMultilineString).


var (
// tableHeaderRe matches a TOML table header line: a standard table like
// "[project]" / "[tool.uv]" or an array-of-tables like "[[tool.uv.index]]",
Expand Down Expand Up @@ -88,7 +97,7 @@ func planDBConnect(target []byte, c Constraints) dbconnectPlan {
return dbconnectPlan{replacedDevPin: replaced, removed: removed}
}

// MergeManaged applies the three managed transforms to target, preserving every other
// MergeManaged applies the managed transforms to target, preserving every other
// byte (comments, ordering, whitespace). It returns the merged bytes and the list of
// regions that actually changed. The operation is idempotent: feeding its own output
// back in produces identical bytes.
Expand Down Expand Up @@ -144,6 +153,11 @@ func MergeManaged(target []byte, c Constraints) (merged []byte, regions []string
regions = append(regions, regionDatabricksConnect)
}

lines, envChanged := mergeDatabricksEnvironment(lines, c.EnvironmentVersion)
if envChanged {
regions = append(regions, regionDatabricksEnvironment)
}

lines, uvChanged := mergeToolUv(lines, c.ConstraintDeps)
if uvChanged {
regions = append(regions, regionToolUv)
Expand Down Expand Up @@ -239,6 +253,45 @@ func mergeRequiresPython(lines []string, value string) ([]string, bool) {
return inserted, true
}

// mergeDatabricksEnvironment pins environment_version to version within the
// env-owned [tool.databricks.environment] table: it replaces an existing value
// (preserving the line's indentation and any inline comment), inserts the key
// when the table exists without it, and appends the table when it is absent.
// An empty version (a cluster target) is a no-op — the section is only written
// for serverless targets, so an existing one is left untouched rather than
// removed. Returns whether the line slice changed.
func mergeDatabricksEnvironment(lines []string, version string) ([]string, bool) {
if version == "" {
return lines, false
}

header, end, found := tableBounds(lines, databricksEnvironmentTable)
if !found {
return appendManagedBlock(lines, []string{databricksEnvironmentTable, fmt.Sprintf(`environment_version = "%s"`, version)}), true
}

for i := header + 1; i < end; i++ {
m := environmentVersionRe.FindStringSubmatch(lines[i])
if m == nil {
continue
}
// Only the value is managed; a trailing inline comment is user content.
replacement := fmt.Sprintf(`%senvironment_version = "%s"%s`, m[1], version, trailingComment(lines[i]))
if lines[i] == replacement {
return lines, false
}
lines[i] = replacement
return lines, true
}

// Table exists but has no environment_version: insert directly under the header.
inserted := make([]string, 0, len(lines)+1)
inserted = append(inserted, lines[:header+1]...)
inserted = append(inserted, fmt.Sprintf(`environment_version = "%s"`, version))
inserted = append(inserted, lines[header+1:]...)
return inserted, true
}

// trailingComment returns the inline TOML comment suffix of a line (including the
// leading whitespace and "#"), or "" if there is none. It ignores "#" characters
// inside a quoted string so a value like requires-python = ">=3.10 # x" is not
Expand Down Expand Up @@ -1100,9 +1153,10 @@ func equalLines(a, b []string) bool {
const freshProjectVersion = "0.0.0"

// RenderFreshPyproject produces a complete managed pyproject.toml for a project that has
// none, with [project], [dependency-groups].dev (carrying the databricks-connect pin), and
// the marker-bracketed [tool.uv] constraint block. When c.DatabricksConnect is empty
// (constraints-only mode) the dev group is emitted empty rather than with a blank entry.
// none, with [project], [dependency-groups].dev (carrying the databricks-connect pin), the
// [tool.databricks.environment] section (serverless targets only), and the marker-bracketed
// [tool.uv] constraint block. When c.DatabricksConnect is empty (constraints-only mode) the
// dev group is emitted empty rather than with a blank entry.
func RenderFreshPyproject(projectName string, c Constraints) []byte {
var b strings.Builder
b.WriteString("[project]\n")
Expand All @@ -1120,6 +1174,13 @@ func RenderFreshPyproject(projectName string, c Constraints) []byte {
b.WriteString("dev = []\n")
}
b.WriteString("\n")
// The serverless environment version is written only for serverless targets;
// a cluster target leaves EnvironmentVersion empty and omits the section.
if c.EnvironmentVersion != "" {
b.WriteString(databricksEnvironmentTable + "\n")
fmt.Fprintf(&b, "environment_version = %q\n", c.EnvironmentVersion)
b.WriteString("\n")
}
for _, line := range renderToolUvBlock(c.ConstraintDeps, true) {
b.WriteString(line)
b.WriteString("\n")
Expand Down
Loading
Loading