Skip to content

Commit 480b93e

Browse files
Merge pull request #291 from nebula-plugins/modernization
Modernization, Phase 3: Lazy property access via Provider API and findProperty
2 parents 77bae44 + a24fd6f commit 480b93e

File tree

7 files changed

+146
-65
lines changed

7 files changed

+146
-65
lines changed

src/main/groovy/nebula/plugin/dependencylock/DependencyLockReader.groovy

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -67,21 +67,25 @@ class DependencyLockReader {
6767
Map overrides = [:]
6868

6969
// Load overrides from a file if the user has specified one via a property.
70-
if (project.hasProperty(OVERRIDE_FILE)) {
71-
File dependenciesLock = new File(project.rootDir, project[OVERRIDE_FILE] as String)
70+
// Use findProperty() to check both gradle properties (-P) and project extras (ext)
71+
def overrideFile = project.findProperty(OVERRIDE_FILE)
72+
if (overrideFile) {
73+
File dependenciesLock = new File(project.rootDir, overrideFile as String)
7274
def lockOverride = parseLockFile(dependenciesLock)
7375
def isDeprecatedFormat = lockOverride.any { it.value.getClass() != String && it.value.locked }
7476
// the old lock override files specified the version to override under the "locked" property
7577
if (isDeprecatedFormat) {
7678
logger.warn("The override file ${dependenciesLock.name} is using a deprecated format. Support for this format may be removed in future versions.")
7779
}
7880
lockOverride.each { overrides[it.key] = isDeprecatedFormat ? it.value.locked : it.value }
79-
logger.debug "Override file loaded: ${project[OVERRIDE_FILE]}"
81+
logger.debug "Override file loaded: ${overrideFile}"
8082
}
8183

8284
// Allow the user to specify overrides via a property as well.
83-
if (project.hasProperty('dependencyLock.override')) {
84-
project['dependencyLock.override'].tokenize(',').each {
85+
// Use findProperty() to check both gradle properties (-P) and project extras (ext)
86+
def override = project.findProperty('dependencyLock.override')
87+
if (override) {
88+
override.toString().tokenize(',').each {
8589
def (group, artifact, version) = it.tokenize(':')
8690
overrides["${group}:${artifact}".toString()] = version
8791
logger.debug "Override added for: ${it}"

src/main/groovy/nebula/plugin/dependencylock/DependencyLockTaskConfigurer.groovy

Lines changed: 29 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,9 @@ class DependencyLockTaskConfigurer {
6666
}
6767

6868
private boolean isGlobalLockDisabled() {
69-
return project.hasProperty(DISABLE_GLOBAL_LOCK) &&
70-
Boolean.parseBoolean(project.property(DISABLE_GLOBAL_LOCK) as String)
69+
return project.providers.gradleProperty(DISABLE_GLOBAL_LOCK)
70+
.map { it.toBoolean() }
71+
.getOrElse(false)
7172
}
7273

7374
String configureTasks(String globalLockFilename, String lockFilename, DependencyLockExtension extension, DependencyLockCommitExtension commitExtension, Map overrides) {
@@ -137,14 +138,24 @@ class DependencyLockTaskConfigurer {
137138
if (globalSaveTask) {
138139
it.mustRunAfter(globalSaveTask)
139140
}
140-
String commitMessageValue = project.hasProperty('commitDependencyLock.message') ?
141-
project['commitDependencyLock.message'] : commitExtension.message.get()
142-
commitMessage.set(commitMessageValue)
141+
// Use provider to allow gradle property to override extension
142+
commitMessage.set(
143+
project.providers.gradleProperty('commitDependencyLock.message')
144+
.orElse(commitExtension.message)
145+
)
143146
patternsToCommit.set(getPatternsToCommit(clLockFileName, globalLockFileName, lockExtension))
144147
remoteRetries.set(commitExtension.remoteRetries.get())
145-
shouldCreateTag.set(project.hasProperty('commitDependencyLock.tag') ?: commitExtension.shouldCreateTag.get())
146-
String tagValue = project.hasProperty('commitDependencyLock.tag') ? project['commitDependencyLock.tag'] : commitExtension.tag.get()
147-
tag.set(tagValue)
148+
149+
// If gradle property is present, shouldCreateTag is true
150+
shouldCreateTag.set(
151+
project.providers.gradleProperty('commitDependencyLock.tag')
152+
.map { true }
153+
.orElse(commitExtension.shouldCreateTag)
154+
)
155+
tag.set(
156+
project.providers.gradleProperty('commitDependencyLock.tag')
157+
.orElse(commitExtension.tag)
158+
)
148159
rootDirPath.set(project.rootProject.projectDir.absolutePath)
149160
}
150161
}
@@ -372,12 +383,16 @@ class DependencyLockTaskConfigurer {
372383
}
373384

374385
public static boolean shouldIgnoreDependencyLock(Project project) {
375-
if (project.hasProperty('dependencyLock.ignore')) {
376-
def prop = project.property('dependencyLock.ignore')
377-
(prop instanceof String) ? prop.toBoolean() : prop.asBoolean()
378-
} else {
379-
false
380-
}
386+
// Use provider that checks both gradle properties (-P) and project extras (ext)
387+
// This maintains backward compatibility with existing usage
388+
return project.providers.provider {
389+
def prop = project.findProperty('dependencyLock.ignore')
390+
if (prop != null) {
391+
// Handle both String and other types (Boolean, Integer, etc.)
392+
return (prop instanceof String) ? prop.toBoolean() : prop.asBoolean()
393+
}
394+
return false
395+
}.get()
381396
}
382397

383398
private TaskProvider<DiffLockTask> configureDiffLockTask(String lockFileName, DependencyLockExtension extension) {

src/main/groovy/nebula/plugin/dependencylock/utils/CoreLockingHelper.groovy

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,10 @@ class CoreLockingHelper {
4444

4545
CoreLockingHelper(Project project) {
4646
this.project = project
47-
shouldLockAllConfigurations = project.hasProperty("lockAllConfigurations") && (project.property("lockAllConfigurations") as String).toBoolean()
47+
// Use provider API for lazy evaluation
48+
shouldLockAllConfigurations = project.providers.gradleProperty("lockAllConfigurations")
49+
.map { it.toBoolean() }
50+
.getOrElse(false)
4851
configsWithActivatedDependencyLocking = new HashSet<Configuration>()
4952
configsNotGettingLocked = new HashSet<Configuration>()
5053
}
@@ -128,9 +131,10 @@ class CoreLockingHelper {
128131

129132
private Collection<String> gatherAdditionalConfigurationsToLock() {
130133
def dependencyLockExtension = project.extensions.findByType(DependencyLockExtension)
131-
def additionalConfigurationsToLockViaProperty = project.hasProperty(ADDITIONAL_CONFIGS_TO_LOCK)
132-
? (project[ADDITIONAL_CONFIGS_TO_LOCK] as String).split(",") as Set<String>
133-
: []
134+
// Use provider API for lazy evaluation
135+
def additionalConfigurationsToLockViaProperty = project.providers.gradleProperty(ADDITIONAL_CONFIGS_TO_LOCK)
136+
.map { it.split(",") as Set<String> }
137+
.getOrElse([] as Set)
134138
def additionalConfigurationsToLockViaExtension = dependencyLockExtension.additionalConfigurationsToLock.get() as Set<String>
135139
def additionalConfigNames = additionalConfigurationsToLockViaProperty + additionalConfigurationsToLockViaExtension
136140
additionalConfigNames

src/main/kotlin/nebula/plugin/dependencylock/DependencyLockPlugin.kt

Lines changed: 40 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,11 @@ class DependencyLockPlugin @Inject constructor(val buildFeatures: BuildFeatures)
144144
" - Legacy global lock: ${globalLockFile.absolutePath}")
145145
}
146146
} else {
147-
val lockAfterEvaluating = if (project.hasProperty(LOCK_AFTER_EVALUATING)) project.property(LOCK_AFTER_EVALUATING).toString().toBoolean() else extension.lockAfterEvaluating.get()
147+
// Use provider chain to allow gradle property to override extension property
148+
val lockAfterEvaluating = project.providers.gradleProperty(LOCK_AFTER_EVALUATING)
149+
.map { it.toBoolean() }
150+
.orElse(extension.lockAfterEvaluating)
151+
.get()
148152
if (lockAfterEvaluating) {
149153
LOGGER.info("Delaying dependency lock apply until beforeResolve ($LOCK_AFTER_EVALUATING set to true)")
150154
} else {
@@ -203,11 +207,32 @@ class DependencyLockPlugin @Inject constructor(val buildFeatures: BuildFeatures)
203207
val taskNames = project.gradle.startParameter.taskNames
204208
val hasUpdateTask = hasUpdateTask(taskNames)
205209

206-
val updates = if (project.hasProperty(UPDATE_DEPENDENCIES)) parseUpdates(project.property(UPDATE_DEPENDENCIES) as String) else extension.updateDependencies.get()
210+
// Use provider to allow gradle property to override extension property
211+
val updates = project.providers.gradleProperty(UPDATE_DEPENDENCIES)
212+
.map { parseUpdates(it) }
213+
.orElse(extension.updateDependencies)
214+
.get()
215+
216+
// Resolve validation flags using Provider API
217+
val validateCoordinates = project.providers.gradleProperty(VALIDATE_DEPENDENCY_COORDINATES)
218+
.map { it.toBoolean() }
219+
.orElse(extension.updateDependenciesFailOnInvalidCoordinates)
220+
.get()
221+
val validateSimultaneousTasks = project.providers.gradleProperty(VALIDATE_SIMULTANEOUS_TASKS)
222+
.map { it.toBoolean() }
223+
.orElse(extension.updateDependenciesFailOnSimultaneousTaskUsage)
224+
.get()
225+
val validateSpecifiedDependenciesToUpdate = project.providers.gradleProperty(VALIDATE_SPECIFIED_DEPENDENCIES_TO_UPDATE)
226+
.map { it.toBoolean() }
227+
.orElse(extension.updateDependenciesFailOnNonSpecifiedDependenciesToUpdate)
228+
.get()
229+
207230
UpdateDependenciesValidator.validate(
208231
updates, overrides, hasUpdateTask,
209232
hasTask(taskNames, GENERATION_TASK_NAMES - UPDATE_TASK_NAMES),
210-
project, extension
233+
validateCoordinates,
234+
validateSimultaneousTasks,
235+
validateSpecifiedDependenciesToUpdate
211236
)
212237
val projectCoord = "${project.group}:${project.name}"
213238
if (hasUpdateTask && updates.any { it == projectCoord }) {
@@ -292,13 +317,19 @@ class DependencyLockPlugin @Inject constructor(val buildFeatures: BuildFeatures)
292317
}
293318

294319
private fun applyOverrides(conf: Configuration, overrides: Map<*, *>) {
295-
if (project.hasProperty(OVERRIDE_FILE)) {
296-
LOGGER.info("Using override file ${project.property(OVERRIDE_FILE)} to lock dependencies")
297-
reasons.add("com.netflix.nebula.dependency-lock using override file: ${project.property(OVERRIDE_FILE)}")
320+
// Use providers to check for gradle properties
321+
val overrideFileProvider = project.providers.gradleProperty(OVERRIDE_FILE)
322+
if (overrideFileProvider.isPresent) {
323+
val overrideFile = overrideFileProvider.get()
324+
LOGGER.info("Using override file $overrideFile to lock dependencies")
325+
reasons.add("com.netflix.nebula.dependency-lock using override file: $overrideFile")
298326
}
299-
if (project.hasProperty(OVERRIDE)) {
300-
LOGGER.info("Using command line overrides ${project.property(OVERRIDE)}")
301-
reasons.add("com.netflix.nebula.dependency-lock using override: ${project.property(OVERRIDE)}")
327+
328+
val overrideProvider = project.providers.gradleProperty(OVERRIDE)
329+
if (overrideProvider.isPresent) {
330+
val override = overrideProvider.get()
331+
LOGGER.info("Using command line overrides $override")
332+
reasons.add("com.netflix.nebula.dependency-lock using override: $override")
302333
}
303334

304335
val overrideDeps = overrides.map {

src/main/kotlin/nebula/plugin/dependencylock/validation/UpdateDependenciesValidator.kt

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,8 @@
11
package nebula.plugin.dependencylock.validation
22

3-
import nebula.plugin.dependencylock.DependencyLockExtension
43
import nebula.plugin.dependencylock.DependencyLockPlugin.Companion.UPDATE_DEPENDENCIES
5-
import nebula.plugin.dependencylock.DependencyLockPlugin.Companion.VALIDATE_DEPENDENCY_COORDINATES
6-
import nebula.plugin.dependencylock.DependencyLockPlugin.Companion.VALIDATE_SIMULTANEOUS_TASKS
74
import nebula.plugin.dependencylock.DependencyLockPlugin.Companion.VALIDATE_SPECIFIED_DEPENDENCIES_TO_UPDATE
85
import nebula.plugin.dependencylock.exceptions.DependencyLockException
9-
import org.gradle.api.Project
106
import org.gradle.api.logging.Logger
117
import org.gradle.api.logging.Logging
128

@@ -18,22 +14,10 @@ class UpdateDependenciesValidator {
1814
fun validate(
1915
updateDependencies: Set<String>, overrides: Map<*, *>,
2016
hasUpdateTask: Boolean, hasGenerateTask: Boolean,
21-
project: Project,
22-
extension: DependencyLockExtension
17+
validateCoordinates: Boolean,
18+
validateSimultaneousTasks: Boolean,
19+
validateSpecifiedDependenciesToUpdate: Boolean
2320
) {
24-
val validateCoordinates =
25-
if (project.hasProperty(VALIDATE_DEPENDENCY_COORDINATES)) project.property(
26-
VALIDATE_DEPENDENCY_COORDINATES
27-
).toString().toBoolean() else extension.updateDependenciesFailOnInvalidCoordinates.get()
28-
val validateSimultaneousTasks =
29-
if (project.hasProperty(VALIDATE_SIMULTANEOUS_TASKS)) project.property(
30-
VALIDATE_SIMULTANEOUS_TASKS
31-
).toString().toBoolean() else extension.updateDependenciesFailOnSimultaneousTaskUsage.get()
32-
val validateSpecifiedDependenciesToUpdate =
33-
if (project.hasProperty(VALIDATE_SPECIFIED_DEPENDENCIES_TO_UPDATE)) project.property(
34-
VALIDATE_SPECIFIED_DEPENDENCIES_TO_UPDATE
35-
).toString().toBoolean() else extension.updateDependenciesFailOnNonSpecifiedDependenciesToUpdate.get()
36-
3721
validateCoordinates(updateDependencies, validateCoordinates)
3822
validateSimultaneousTasks(hasUpdateTask, hasGenerateTask, validateSimultaneousTasks)
3923
validateSpecifiedDependenciesToUpdate(

src/main/kotlin/nebula/plugin/dependencyverifier/DependencyResolutionVerifier.kt

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,10 @@ class DependencyResolutionVerifier {
6161
this.project = project
6262
this.extension = project.rootProject.extensions.findByType(DependencyResolutionVerifierExtension::class.java)!!
6363
this.configurationsToExcludeOverride = mutableSetOf()
64-
if (project.hasProperty(CONFIGURATIONS_TO_EXCLUDE)) {
65-
configurationsToExcludeOverride.addAll((project.property(CONFIGURATIONS_TO_EXCLUDE) as String).split(","))
64+
// Use findProperty to check both gradle properties (-P) and project extras (ext)
65+
val configurationsToExclude = project.findProperty(CONFIGURATIONS_TO_EXCLUDE)
66+
if (configurationsToExclude != null) {
67+
configurationsToExcludeOverride.addAll(configurationsToExclude.toString().split(","))
6668
}
6769
val uniqueProjectKey = uniqueProjectKey(project)
6870
failedDependenciesPerProjectForConfigurations[uniqueProjectKey] = mutableMapOf()
@@ -344,8 +346,10 @@ class DependencyResolutionVerifier {
344346
}
345347

346348
private fun unresolvedDependenciesShouldFailTheBuild(): Boolean {
347-
return if (project.hasProperty(UNRESOLVED_DEPENDENCIES_FAIL_THE_BUILD)) {
348-
(project.property(UNRESOLVED_DEPENDENCIES_FAIL_THE_BUILD) as String).toBoolean()
349+
// Use findProperty to check both gradle properties (-P) and project extras (ext)
350+
val shouldFailProp = project.findProperty(UNRESOLVED_DEPENDENCIES_FAIL_THE_BUILD)
351+
return if (shouldFailProp != null) {
352+
shouldFailProp.toString().toBoolean()
349353
} else {
350354
extension.shouldFailTheBuild.get()
351355
}

0 commit comments

Comments
 (0)