Skip to content

Commit c803f37

Browse files
committed
configure base package name (for additional files) and location-based package name (#115)
1 parent e7952a8 commit c803f37

9 files changed

Lines changed: 99 additions & 18 deletions

File tree

openapi-processor-core/src/main/kotlin/io/openapiprocessor/core/converter/ApiOptions.kt

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ package io.openapiprocessor.core.converter
77

88
import io.openapiprocessor.core.converter.mapping.*
99
import io.openapiprocessor.core.converter.options.BasePathOptions
10+
import io.openapiprocessor.core.converter.options.PackageOptions
1011
import io.openapiprocessor.core.converter.options.TargetDirOptions
1112
import io.openapiprocessor.core.support.Empty
1213

@@ -34,8 +35,15 @@ class ApiOptions: MappingSettings {
3435
* - models => "${packageName}.model"
3536
*/
3637
var packageName = "io.openapiprocessor.generated"
37-
var packageNameFromPath = false
3838

39+
/**
40+
* package-name related options
41+
*/
42+
var packageOptions: PackageOptions = PackageOptions()
43+
44+
val packageNameFromLocation get() = packageOptions.fromLocation
45+
46+
// todo move to packageOptions
3947
var packageNameApi : String = "api"
4048
var packageNameModel: String = "model"
4149
var packageNameSupport: String = "support"

openapi-processor-core/src/main/kotlin/io/openapiprocessor/core/converter/OptionsConverter.kt

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,19 @@ class OptionsConverter(private val checkObsoleteProcessorOptions: Boolean = fals
6565
}
6666

6767
options.packageName = mapping.options.packageName
68-
options.packageNameFromPath = mapping.options.packageNameFromPath
68+
with(mapping.options.packageNames) {
69+
options.packageOptions.base = base
70+
options.packageOptions.location = location
71+
72+
// sync base package name
73+
if (options.packageOptions.base != null) {
74+
options.packageName = options.packageOptions.base!!
75+
}
76+
else {
77+
options.packageOptions.base = mapping.options.packageName
78+
}
79+
}
80+
6981
options.modelType = mapping.options.modelType
7082
options.modelAccessors = mapping.options.modelAccessors
7183
options.enumType = mapping.options.enumType
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/*
2+
* Copyright 2024 https://github.com/openapi-processor/openapi-processor-base
3+
* PDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.openapiprocessor.core.converter.options
7+
8+
class PackageOptions {
9+
/**
10+
* Java base package name of the generated source files. Sames 'package-name'.
11+
*/
12+
var base: String? = null
13+
14+
/**
15+
* Java base package name of location-based generated source files
16+
*/
17+
var location: String? = null
18+
19+
val fromLocation: Boolean
20+
get() = location != null
21+
}

openapi-processor-core/src/main/kotlin/io/openapiprocessor/core/processor/mapping/v2/Options.kt

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,7 @@ data class Options(
2222
*/
2323
val packageName: String = "io.openapiprocessor.generated",
2424

25-
/**
26-
* enable/disable location based package names (optional)
27-
*/
28-
val packageNameFromPath: Boolean = false,
25+
val packageNames: PackageNames = PackageNames(),
2926

3027
/**
3128
* enable/disable clearing of targetDir (optional).
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/*
2+
* Copyright 2025 https://github.com/openapi-processor/openapi-processor-base
3+
* PDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.openapiprocessor.core.processor.mapping.v2
7+
8+
/**
9+
* package-name options
10+
*/
11+
data class PackageNames(
12+
/**
13+
* Java base package name of the generated source files. Sames 'package-name'.
14+
*/
15+
val base: String? = null,
16+
17+
/**
18+
* Java base package name of location-based generated source files
19+
*/
20+
val location: String? = null
21+
)
22+
23+

openapi-processor-core/src/main/resources/mapping/v13/mapping.example.yaml

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,13 @@ options: # general processor options (required)
1010
# the target package (required): io.openapiprocessor.generated (default)
1111
package-name: io.openapiprocessor.generated
1212

13-
# derive the package name from the document location (optional): true or false (default)
14-
package-name-from-path: true
13+
# package-name related options
14+
package-names:
15+
# same as package-name
16+
base: io.openapiprocessor.generated
17+
18+
# base package name of location-based generated files
19+
location: io.openapiprocessor
1520

1621
# enable validation annotations (optional): true or false (default), javax, jakarta
1722
bean-validation: jakarta

openapi-processor-core/src/main/resources/mapping/v13/mapping.yaml.json

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,25 @@
3232
"type": "object",
3333
"properties": {
3434
"package-name": {
35-
"description": "java root package name to use in the generated source files.",
35+
"description": "java base package name of the generated source files.",
3636
"type": "string",
3737
"default": "io.openapiprocessor.generated"
3838
},
39-
"package-name-from-path": {
40-
"description": "derive the package name from the document location.",
41-
"type": "boolean",
42-
"default": false
39+
"package-names": {
40+
"description": "package name related options",
41+
"type": "object",
42+
"properties": {
43+
"base": {
44+
"description": "java base package name of the generated source files. Alternative to 'package-name'.",
45+
"type": "string",
46+
"default": "io.openapiprocessor.generated"
47+
},
48+
"location": {
49+
"description": "java base package name of location based generated source files.",
50+
"type": "string",
51+
"default": null
52+
}
53+
}
4354
},
4455
"bean-validation": {
4556
"description": "enable bean validation annotations for OpenAPI constraints.",

openapi-processor-core/src/test/kotlin/io/openapiprocessor/core/converter/OptionsConverterSpec.kt

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ class OptionsConverterSpec: StringSpec({
2828
options.targetDirOptions.layout shouldBe TargetDirLayout.CLASSIC
2929

3030
options.packageName shouldBe "io.openapiprocessor.generated"
31-
options.packageNameFromPath shouldBe false
31+
options.packageOptions.base shouldBe null
32+
options.packageOptions.location shouldBe null
3233
options.beanValidation shouldBe false
3334
options.javadoc shouldBe false
3435
options.modelType shouldBe "default"
@@ -104,12 +105,15 @@ class OptionsConverterSpec: StringSpec({
104105

105106
val options = converter.convertOptions(mapOf(
106107
"mapping" to """
107-
openapi-processor-mapping: v9
108+
openapi-processor-mapping: v13
108109
options:
109110
clear-target-dir: false
110111
target-dir:
111112
layout: standard
112113
package-name: generated
114+
package-names:
115+
location: production
116+
package-name-base: production
113117
package-name-from-path: true
114118
model-name-suffix: Suffix
115119
model-type: record
@@ -132,7 +136,8 @@ class OptionsConverterSpec: StringSpec({
132136
options.targetDirOptions.clear.shouldBeFalse()
133137
options.targetDirOptions.layout.isStandard().shouldBeTrue()
134138
options.packageName shouldBe "generated"
135-
options.packageNameFromPath shouldBe true
139+
options.packageOptions.base shouldBe "generated"
140+
options.packageOptions.location shouldBe "production"
136141
options.modelNameSuffix shouldBe "Suffix"
137142
options.modelType shouldBe "record"
138143
options.modelAccessors shouldBe false

openapi-processor-core/src/test/kotlin/io/openapiprocessor/core/writer/DefaultWriterFactorySpec.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ class DefaultWriterFactorySpec : StringSpec({
241241
val writerFactory = object : DefaultWriterFactory(options) {
242242
override fun initAdditionalPackages(options: ApiOptions): Map<String, Path> {
243243
val pkgPaths = HashMap<String, Path>()
244-
val (name, path) = initTargetPackage("foo/bar")
244+
val (name, path) = initTargetPackage("io.openapiprocessor.foo.bar")
245245
pkgPaths[name] = path
246246
return pkgPaths
247247
}
@@ -257,7 +257,6 @@ class DefaultWriterFactorySpec : StringSpec({
257257
"lazy initialize additional package folders" {
258258
options.targetDir = listOf(target.toString()).joinToString(File.separator)
259259
options.targetDirOptions.layout = TargetDirLayout.CLASSIC
260-
options.packageNameFromPath = true
261260

262261
val writerFactory = DefaultWriterFactory(options)
263262
writerFactory.init()

0 commit comments

Comments
 (0)