Skip to content

Commit

Permalink
feat(gradle): Support template expression for version variables… (#5195)
Browse files Browse the repository at this point in the history
  • Loading branch information
jGleitz authored and rarkins committed Jan 21, 2020
1 parent 4b29858 commit c1ee1ef
Show file tree
Hide file tree
Showing 2 changed files with 183 additions and 13 deletions.
26 changes: 14 additions & 12 deletions lib/manager/gradle/build-gradle.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,18 +22,20 @@ interface UpdateFunction {
): string;
}

const groovyQuotes = `(?:["'](?:""|'')?)`;

// https://github.com/patrikerdes/gradle-use-latest-versions-plugin/blob/8cf9c3917b8b04ba41038923cab270d2adda3aa6/src/main/groovy/se/patrikerdes/DependencyUpdate.groovy#L27-L29
function moduleStringVersionFormatMatch(dependency: GradleDependency): RegExp {
return new RegExp(
`(["']${dependency.group}:${dependency.name}:)[^$].*?(([:@].*?)?["'])`
`(${groovyQuotes}${dependency.group}:${dependency.name}:)[^$].*?(([:@].*?)?${groovyQuotes})`
);
}

function groovyPluginStringVersionFormatMatch(
dependency: GradleDependency
): RegExp {
return new RegExp(
`(id\\s+["']${dependency.group}["']\\s+version\\s+["'])[^$].*?(["'])`
`(id\\s+${groovyQuotes}${dependency.group}${groovyQuotes}\\s+version\\s+${groovyQuotes})[^$].*?(${groovyQuotes})`
);
}

Expand All @@ -48,9 +50,9 @@ function kotlinPluginStringVersionFormatMatch(
function moduleMapVersionFormatMatch(dependency: GradleDependency): RegExp {
// prettier-ignore
return new RegExp(
`(group\\s*:\\s*["']${dependency.group}["']\\s*,\\s*` +
`name\\s*:\\s*["']${dependency.name}["']\\s*,\\s*` +
`version\\s*:\\s*["']).*?(["'])`
`(group\\s*:\\s*${groovyQuotes}${dependency.group}${groovyQuotes}\\s*,\\s*` +
`name\\s*:\\s*${groovyQuotes}${dependency.name}${groovyQuotes}\\s*,\\s*` +
`version\\s*:\\s*${groovyQuotes})[^{}$"']+?(${groovyQuotes})`
);
}

Expand All @@ -61,7 +63,7 @@ function moduleKotlinNamedArgumentVersionFormatMatch(
return new RegExp(
`(group\\s*=\\s*"${dependency.group}"\\s*,\\s*` +
`name\\s*=\\s*"${dependency.name}"\\s*,\\s*` +
`version\\s*=\\s*").*?(")`
`version\\s*=\\s*")[^{}$]*?(")`
);
}

Expand All @@ -70,9 +72,9 @@ function moduleMapVariableVersionFormatMatch(
): RegExp {
// prettier-ignore
return new RegExp(
`group\\s*:\\s*["']${dependency.group}["']\\s*,\\s*` +
`name\\s*:\\s*["']${dependency.name}["']\\s*,\\s*` +
`version\\s*:\\s*([^\\s"')]+)\\s*`
`group\\s*:\\s*${groovyQuotes}${dependency.group}${groovyQuotes}\\s*,\\s*` +
`name\\s*:\\s*${groovyQuotes}${dependency.name}${groovyQuotes}\\s*,\\s*` +
`version\\s*:\\s*(?:${groovyQuotes}\\$)?{?([^\\s"'{}$)]+)}?${groovyQuotes}?\\s*`
);
}

Expand All @@ -83,23 +85,23 @@ function moduleKotlinNamedArgumentVariableVersionFormatMatch(
return new RegExp(
`group\\s*=\\s*"${dependency.group}"\\s*,\\s*` +
`name\\s*=\\s*"${dependency.name}"\\s*,\\s*` +
`version\\s*=\\s*([^\\s"]+?)[\\s\\),]`
`version\\s*=\\s*(?:"\\$)?{?([^\\s"{}$]+?)}?"?[\\s\\),]`
);
}

function moduleStringVariableInterpolationVersionFormatMatch(
dependency: GradleDependency
): RegExp {
return new RegExp(
`["']${dependency.group}:${dependency.name}:\\$([^{].*?)["']`
`${groovyQuotes}${dependency.group}:${dependency.name}:\\$([^{].*?)${groovyQuotes}`
);
}

function moduleStringVariableExpressionVersionFormatMatch(
dependency: GradleDependency
): RegExp {
return new RegExp(
`["']${dependency.group}:${dependency.name}:\\$\{([^{].*?)}["']`
`${groovyQuotes}${dependency.group}:${dependency.name}:\\$\{([^{].*?)}${groovyQuotes}`
);
}

Expand Down
170 changes: 169 additions & 1 deletion test/manager/gradle/build-gradle.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ describe('lib/manager/gradle/updateGradleVersion', () => {
);
});

it('returns a file updated if the version defined as map is found', () => {
it('returns an updated file if the version in single quotes defined as map is found', () => {
const gradleFile = `compile group : 'mysql' ,
name : 'mysql-connector-java',
version: '6.0.5'`;
Expand All @@ -82,6 +82,54 @@ describe('lib/manager/gradle/updateGradleVersion', () => {
);
});

it('returns an updated file if the version in double quotes defined as map is found', () => {
const gradleFile = `compile group : 'mysql' ,
name : 'mysql-connector-java',
version: "6.0.5"`;
const updatedGradleFile = updateGradleVersion(
gradleFile,
{ group: 'mysql', name: 'mysql-connector-java', version: '6.0.5' },
'7.0.0'
);
expect(updatedGradleFile).toEqual(
`compile group : 'mysql' ,
name : 'mysql-connector-java',
version: "7.0.0"`
);
});

it('returns an updated file if the version in triple single quotes defined as map is found', () => {
const gradleFile = `compile group : 'mysql' ,
name : 'mysql-connector-java',
version: '''6.0.5'''`;
const updatedGradleFile = updateGradleVersion(
gradleFile,
{ group: 'mysql', name: 'mysql-connector-java', version: '6.0.5' },
'7.0.0'
);
expect(updatedGradleFile).toEqual(
`compile group : 'mysql' ,
name : 'mysql-connector-java',
version: '''7.0.0'''`
);
});

it('returns an updated file if the version in triple double quotes defined as map is found', () => {
const gradleFile = `compile group : 'mysql' ,
name : 'mysql-connector-java',
version: """6.0.5"""`;
const updatedGradleFile = updateGradleVersion(
gradleFile,
{ group: 'mysql', name: 'mysql-connector-java', version: '6.0.5' },
'7.0.0'
);
expect(updatedGradleFile).toEqual(
`compile group : 'mysql' ,
name : 'mysql-connector-java',
version: """7.0.0"""`
);
});

it('returns a file updated if the version defined as a Kotlin named argument is found', () => {
const gradleFile = `compile(group = "mysql" ,
name = "mysql-connector-java",
Expand Down Expand Up @@ -146,6 +194,86 @@ describe('lib/manager/gradle/updateGradleVersion', () => {
);
});

it('returns an updated file if the version defined in a variable in a simple template string without curly braces as a map is found', () => {
const gradleFile = `String mysqlVersion = "6.0.5"
compile group : 'mysql' ,
name : 'mysql-connector-java',
version : "$mysqlVersion"
`;
const updatedGradleFile = updateGradleVersion(
gradleFile,
{ group: 'mysql', name: 'mysql-connector-java', version: '6.0.5' },
'7.0.0'
);
expect(updatedGradleFile).toEqual(
`String mysqlVersion = "7.0.0"
compile group : 'mysql' ,
name : 'mysql-connector-java',
version : "$mysqlVersion"
`
);
});

it('returns an updated file if the version defined in a variable in a simple template string with curly braces as a map is found', () => {
const gradleFile = `String mysqlVersion = "6.0.5"
compile group : 'mysql' ,
name : 'mysql-connector-java',
version : "\${mysqlVersion}"
`;
const updatedGradleFile = updateGradleVersion(
gradleFile,
{ group: 'mysql', name: 'mysql-connector-java', version: '6.0.5' },
'7.0.0'
);
expect(updatedGradleFile).toEqual(
`String mysqlVersion = "7.0.0"
compile group : 'mysql' ,
name : 'mysql-connector-java',
version : "\${mysqlVersion}"
`
);
});

it('returns an updated file if the version defined in a variable in a triple template string without curly braces as a map is found', () => {
const gradleFile = `String mysqlVersion = "6.0.5"
compile group : 'mysql' ,
name : 'mysql-connector-java',
version : """$mysqlVersion"""
`;
const updatedGradleFile = updateGradleVersion(
gradleFile,
{ group: 'mysql', name: 'mysql-connector-java', version: '6.0.5' },
'7.0.0'
);
expect(updatedGradleFile).toEqual(
`String mysqlVersion = "7.0.0"
compile group : 'mysql' ,
name : 'mysql-connector-java',
version : """$mysqlVersion"""
`
);
});

it('returns an updated file if the version defined in a variable in a triple template string with curly braces as a map is found', () => {
const gradleFile = `String mysqlVersion = "6.0.5"
compile group : 'mysql' ,
name : 'mysql-connector-java',
version : """\${mysqlVersion}"""
`;
const updatedGradleFile = updateGradleVersion(
gradleFile,
{ group: 'mysql', name: 'mysql-connector-java', version: '6.0.5' },
'7.0.0'
);
expect(updatedGradleFile).toEqual(
`String mysqlVersion = "7.0.0"
compile group : 'mysql' ,
name : 'mysql-connector-java',
version : """\${mysqlVersion}"""
`
);
});

it('should returns a file updated if the version defined in a variable as a Kotlin named argument is found', () => {
const gradleFile = `val mysqlVersion = "6.0.5"
compile(group = "mysql" ,
Expand All @@ -166,6 +294,46 @@ describe('lib/manager/gradle/updateGradleVersion', () => {
);
});

it('returns an updated file if the version defined in a variable in a template string without curly braces as a Kotlin named argument is found', () => {
const gradleFile = `val mysqlVersion = "6.0.5"
compile(group = "mysql" ,
name = "mysql-connector-java",
version = "$mysqlVersion")
`;
const updatedGradleFile = updateGradleVersion(
gradleFile,
{ group: 'mysql', name: 'mysql-connector-java', version: '6.0.5' },
'7.0.0'
);
expect(updatedGradleFile).toEqual(
`val mysqlVersion = "7.0.0"
compile(group = "mysql" ,
name = "mysql-connector-java",
version = "$mysqlVersion")
`
);
});

it('returns an updated file if the version defined in a variable in a template string with curly braces as a Kotlin named argument is found', () => {
const gradleFile = `val mysqlVersion = "6.0.5"
compile(group = "mysql" ,
name = "mysql-connector-java",
version = "\${mysqlVersion}")
`;
const updatedGradleFile = updateGradleVersion(
gradleFile,
{ group: 'mysql', name: 'mysql-connector-java', version: '6.0.5' },
'7.0.0'
);
expect(updatedGradleFile).toEqual(
`val mysqlVersion = "7.0.0"
compile(group = "mysql" ,
name = "mysql-connector-java",
version = "\${mysqlVersion}")
`
);
});

it('should replace a external groovy variable assigned to a specific dependency', () => {
const gradleFile =
'runtime ( "mysql:mysql-connector-java:${mysqlVersion}" )'; // eslint-disable-line no-template-curly-in-string
Expand Down

0 comments on commit c1ee1ef

Please sign in to comment.