Skip to content

Commit 8fce50b

Browse files
authored
deprecation warnings for automatically generated DSL (#876)
1 parent 92cecf8 commit 8fce50b

File tree

13 files changed

+223
-84
lines changed

13 files changed

+223
-84
lines changed

docs/Home.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ Browse the Jenkins issue tracker to see any [open issues](https://issues.jenkins
2929
* 1.49 (unreleased)
3030
* Enhanced support for the [Sauce OnDemand Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Sauce+OnDemand+Plugin)
3131
([JENKINS-36370](https://issues.jenkins-ci.org/browse/JENKINS-36370))
32+
* Updated [Structs Plugin](https://github.com/jenkinsci/structs-plugin) dependency to version 1.2
33+
* Improved support for [[Automatically Generated DSL]]: print deprecation warnings and show deprecated methods in API
34+
viewer
3235
* 1.48 (June 24 2016)
3336
* Added option to ignore missing DSL script files or empty wildcards
3437
([JENKINS-34060](https://issues.jenkins-ci.org/browse/JENKINS-34060))

docs/Testing-DSL-Scripts.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ when running the DSL scripts, e.g. for testing [[extensions|Extending the DSL]]
5050
// Job DSL plugin including plugin dependencies
5151
testCompile "org.jenkins-ci.plugins:job-dsl:${jobDslVersion}"
5252
testCompile "org.jenkins-ci.plugins:job-dsl:${jobDslVersion}@jar"
53-
testCompile 'org.jenkins-ci.plugins:structs:1.1@jar'
53+
testCompile 'org.jenkins-ci.plugins:structs:1.2@jar'
5454

5555
// plugins to install in test instance
5656
testPlugins 'org.jenkins-ci.plugins:ghprb:1.31.4'

job-dsl-plugin/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ jpi {
6161
dependencies {
6262
compile project(':job-dsl-core')
6363
compile 'org.jenkins-ci:symbol-annotation:1.1'
64-
jenkinsPlugins 'org.jenkins-ci.plugins:structs:1.1@jar'
64+
jenkinsPlugins 'org.jenkins-ci.plugins:structs:1.2@jar'
6565
optionalJenkinsPlugins 'org.jenkins-ci.plugins:vsphere-cloud:1.1.11@jar'
6666
optionalJenkinsPlugins 'org.jenkins-ci.plugins:config-file-provider:2.8.1@jar'
6767
optionalJenkinsPlugins 'org.jenkinsci.plugins:managed-scripts:1.2.1@jar'

job-dsl-plugin/src/main/groovy/javaposse/jobdsl/plugin/EmbeddedApiDocGenerator.groovy

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,7 @@ class EmbeddedApiDocGenerator {
214214
private JSONObject generateSignature(DescribableParameter parameter) {
215215
JSONObject signature = new JSONObject()
216216
.element('parameters', [generateParameter(parameter.type)])
217+
.element('deprecated', parameter.deprecated)
217218
.element('generated', true)
218219

219220
if (isContextParameter(parameter.type)) {

job-dsl-plugin/src/main/groovy/javaposse/jobdsl/plugin/ExtensionPointHelper.groovy

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package javaposse.jobdsl.plugin
22

33
import javaposse.jobdsl.dsl.ContextHelper
44
import javaposse.jobdsl.dsl.ExtensibleContext
5+
import javaposse.jobdsl.dsl.JobManagement
56
import javaposse.jobdsl.plugin.structs.DescribableContext
67
import org.apache.commons.lang.ClassUtils
78
import org.jenkinsci.plugins.structs.describable.DescribableModel
@@ -63,7 +64,8 @@ class ExtensionPointHelper {
6364
}
6465

6566
interface DslExtension {
66-
Object call(DslEnvironment environment, Object[] args) throws InvocationTargetException
67+
Object call(DslEnvironment environment, JobManagement jobManagement, Object[] args)
68+
throws InvocationTargetException
6769
}
6870

6971
static class ExtensionPointMethod implements DslExtension {
@@ -81,7 +83,7 @@ class ExtensionPointHelper {
8183
}
8284

8385
@Override
84-
Object call(DslEnvironment environment, Object[] args) {
86+
Object call(DslEnvironment environment, JobManagement jobManagement, Object[] args) {
8587
Class<?>[] parameterTypes = method.parameterTypes
8688
Object[] processedArgs = new Object[parameterTypes.length]
8789
int j = 0
@@ -100,8 +102,8 @@ class ExtensionPointHelper {
100102
}
101103

102104
@Override
103-
Object call(DslEnvironment environment, Object[] args) {
104-
DescribableContext delegate = new DescribableContext(describableModel)
105+
Object call(DslEnvironment environment, JobManagement jobManagement, Object[] args) {
106+
DescribableContext delegate = new DescribableContext(describableModel, jobManagement)
105107
if (args.length == 1 && args[0] instanceof Closure) {
106108
ContextHelper.executeInContext((Closure) args[0], delegate)
107109
}

job-dsl-plugin/src/main/groovy/javaposse/jobdsl/plugin/JenkinsJobManagement.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -422,7 +422,7 @@ public Node callExtension(String name, javaposse.jobdsl.dsl.Item item,
422422
}
423423

424424
try {
425-
Object result = Iterables.getOnlyElement(candidates).call(getSession(item), args);
425+
Object result = Iterables.getOnlyElement(candidates).call(getSession(item), this, args);
426426
return result == null ? NO_VALUE : new XmlParser().parseText(Items.XSTREAM2.toXML(result));
427427
} catch (InvocationTargetException e) {
428428
throw e.getCause();

job-dsl-plugin/src/main/groovy/javaposse/jobdsl/plugin/structs/DescribableContext.groovy

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package javaposse.jobdsl.plugin.structs
33
import javaposse.jobdsl.dsl.Context
44
import javaposse.jobdsl.dsl.DslException
55
import javaposse.jobdsl.dsl.DslScriptException
6+
import javaposse.jobdsl.dsl.JobManagement
67
import org.jenkinsci.plugins.structs.describable.ArrayType
78
import org.jenkinsci.plugins.structs.describable.AtomicType
89
import org.jenkinsci.plugins.structs.describable.DescribableModel
@@ -22,10 +23,12 @@ import static org.apache.commons.lang.ClassUtils.isAssignable
2223
*/
2324
class DescribableContext implements Context {
2425
private final DescribableModel describableModel
26+
private final JobManagement jobManagement
2527
private final Map<String, ?> values = [:]
2628

27-
DescribableContext(DescribableModel describableModel) {
29+
DescribableContext(DescribableModel describableModel, JobManagement jobManagement) {
2830
this.describableModel = describableModel
31+
this.jobManagement = jobManagement
2932
}
3033

3134
/**
@@ -56,6 +59,9 @@ class DescribableContext implements Context {
5659
throw new ParameterMissingException(name, DescribableContext, argsArray, describableModel)
5760
}
5861
if (isValidValue(parameter.type, value)) {
62+
if (parameter.deprecated) {
63+
jobManagement.logDeprecationWarning()
64+
}
5965
values[name] = getValue(parameter.type, value)
6066
return null
6167
}
@@ -91,20 +97,27 @@ class DescribableContext implements Context {
9197
false
9298
}
9399

94-
private static Object getValue(ParameterType parameterType, Object value) {
100+
private Object getValue(ParameterType parameterType, Object value) {
95101
if (value instanceof Closure) {
96102
if (parameterType instanceof ArrayType) {
97-
ArrayType arrayType = (ArrayType) parameterType
98-
DescribableListContext delegate = new DescribableListContext(getArrayElementTypes(arrayType))
103+
DescribableListContext delegate = new DescribableListContext(
104+
getArrayElementTypes((ArrayType) parameterType),
105+
jobManagement
106+
)
99107
executeInContext(value, delegate)
100108
return delegate.values
101109
} else if (parameterType instanceof HomogeneousObjectType) {
102-
DescribableContext delegate = new DescribableContext(((HomogeneousObjectType) parameterType).schemaType)
110+
DescribableContext delegate = new DescribableContext(
111+
((HomogeneousObjectType) parameterType).schemaType,
112+
jobManagement
113+
)
103114
executeInContext((Closure) value, delegate)
104115
return delegate.createInstance()
105116
} else if (parameterType instanceof HeterogeneousObjectType) {
106-
HeterogeneousObjectType heterogeneousObjectType = (HeterogeneousObjectType) parameterType
107-
DescribableListContext delegate = new DescribableListContext(heterogeneousObjectType.types.values())
117+
DescribableListContext delegate = new DescribableListContext(
118+
((HeterogeneousObjectType) parameterType).types.values(),
119+
jobManagement
120+
)
108121
executeInContext(value, delegate)
109122
return delegate.values ? delegate.values[-1] : null
110123
}

job-dsl-plugin/src/main/groovy/javaposse/jobdsl/plugin/structs/DescribableListContext.groovy

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package javaposse.jobdsl.plugin.structs
22

33
import javaposse.jobdsl.dsl.Context
44
import javaposse.jobdsl.dsl.DslException
5+
import javaposse.jobdsl.dsl.JobManagement
56
import javaposse.jobdsl.plugin.Messages
67
import org.jenkinsci.plugins.structs.describable.DescribableModel
78

@@ -17,10 +18,12 @@ import static DescribableHelper.isOptionalClosureArgument
1718
*/
1819
class DescribableListContext implements Context {
1920
private final Collection<DescribableModel> describableModels
21+
private final JobManagement jobManagement
2022
final List values = []
2123

22-
DescribableListContext(Collection<DescribableModel> types) {
24+
DescribableListContext(Collection<DescribableModel> types, JobManagement jobManagement) {
2325
this.describableModels = types
26+
this.jobManagement = jobManagement
2427
}
2528

2629
Object methodMissing(String name, args) {
@@ -35,7 +38,7 @@ class DescribableListContext implements Context {
3538
Arrays.toString(candidates*.type*.name)
3639
))
3740
} else if (candidates.size() == 1) {
38-
DescribableContext delegate = new DescribableContext(candidates.first())
41+
DescribableContext delegate = new DescribableContext(candidates.first(), jobManagement)
3942
if (args.size() == 1) {
4043
executeInContext((Closure) argsArray[0], delegate)
4144
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package javaposse.jobdsl.plugin.fixtures
2+
3+
import hudson.Extension
4+
import hudson.model.Item
5+
import hudson.model.Job
6+
import hudson.triggers.Trigger
7+
import hudson.triggers.TriggerDescriptor
8+
import org.jenkinsci.Symbol
9+
import org.kohsuke.stapler.DataBoundConstructor
10+
import org.kohsuke.stapler.DataBoundSetter
11+
12+
class DeprecatedTrigger extends Trigger<Job> {
13+
@SuppressWarnings('UnnecessaryConstructor')
14+
@DataBoundConstructor
15+
DeprecatedTrigger() {
16+
}
17+
18+
@DataBoundSetter
19+
@Deprecated
20+
@SuppressWarnings(['EmptyMethod', 'UnusedMethodParameter'])
21+
void setDeprecatedOption(String value) {
22+
}
23+
24+
@Extension
25+
@Symbol('old')
26+
static class DescriptorImpl extends TriggerDescriptor {
27+
final String displayName = null
28+
29+
@Override
30+
boolean isApplicable(Item item) {
31+
false
32+
}
33+
}
34+
}

0 commit comments

Comments
 (0)