Skip to content

Commit

Permalink
feat(RepositoryConfiguration): Add support for snippet choice
Browse files Browse the repository at this point in the history
Signed-off-by: Nicolas Nobelis <[email protected]>
  • Loading branch information
nnobelis committed Feb 23, 2024
1 parent bf5661b commit e78cae4
Show file tree
Hide file tree
Showing 8 changed files with 486 additions and 1 deletion.
85 changes: 85 additions & 0 deletions integrations/schemas/repository-configuration-schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,84 @@
}
}
}
},
"snippet_choices": {
"type": "array",
"description": "A configuration to select a snippet from a package with multiple snippet findings.",
"items": {
"type": "object",
"properties": {
"provenance": {
"type": "object",
"properties": {
"url": {
"type": "string"
}
},
"required": [
"url"
]
},
"choices": {
"type": "array",
"items": {
"type": "object",
"properties": {
"given": {
"type": "object",
"properties": {
"sourceLocation": {
"type": "object",
"properties": {
"path": {
"type": "string"
},
"lineStart": {
"type": "integer"
},
"lineEnd": {
"type": "integer"
}
},
"required": [
"path",
"lineStart",
"lineEnd"
]
}
}
},
"choice": {
"type": "object",
"properties": {
"purl": {
"type": "string"
},
"reason": {
"$ref": "#/definitions/snippetChoiceReason"
},
"comment": {
"type": "string"
}
},
"required": [
"reason",
"reasoning"
]
}
},
"required": [
"given",
"choice"
]
}
}
},
"required": [
"provenance",
"choices"
]
}
}
},
"definitions": {
Expand Down Expand Up @@ -210,6 +288,13 @@
"NOT_DETECTED",
"REFERENCE"
]
},
"snippetChoiceReason": {
"enum": [
"NO_RELEVANT_FINDING",
"ORIGINAL_FINDING",
"OTHER"
]
}
}
}
8 changes: 7 additions & 1 deletion model/src/main/kotlin/config/RepositoryConfiguration.kt
Original file line number Diff line number Diff line change
Expand Up @@ -68,5 +68,11 @@ data class RepositoryConfiguration(
* Defines license choices within this repository.
*/
@JsonInclude(value = JsonInclude.Include.CUSTOM, valueFilter = LicenseChoicesFilter::class)
val licenseChoices: LicenseChoices = LicenseChoices()
val licenseChoices: LicenseChoices = LicenseChoices(),

/**
* Defines snippet choices for projects in this repository.
*/
@JsonInclude(value = JsonInclude.Include.NON_EMPTY)
val snippetChoices: List<SnippetChoices> = emptyList()
)
38 changes: 38 additions & 0 deletions model/src/main/kotlin/config/SnippetChoices.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
/*
* Copyright (C) 2024 The ORT Project Authors (see <https://github.com/oss-review-toolkit/ort/blob/main/NOTICE>)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* SPDX-License-Identifier: Apache-2.0
* License-Filename: LICENSE
*/

package org.ossreviewtoolkit.model.config

import org.ossreviewtoolkit.model.config.snippet.Provenance
import org.ossreviewtoolkit.model.config.snippet.SnippetChoice

/**
* A collection of snippet choices for a given provenance.
*/
data class SnippetChoices(
/**
* The provenance this snippet choice applies to.
*/
val provenance: Provenance,

/**
* The snippet choices for this package.
*/
val choices: List<SnippetChoice>
)
27 changes: 27 additions & 0 deletions model/src/main/kotlin/config/snippet/Provenance.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
/*
* Copyright (C) 2024 The ORT Project Authors (see <https://github.com/oss-review-toolkit/ort/blob/main/NOTICE>)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* SPDX-License-Identifier: Apache-2.0
* License-Filename: LICENSE
*/

package org.ossreviewtoolkit.model.config.snippet

import org.ossreviewtoolkit.model.RepositoryProvenance

/**
* The URL of the [RepositoryProvenance] the snippet choice applies to.
*/
data class Provenance(val url: String)
68 changes: 68 additions & 0 deletions model/src/main/kotlin/config/snippet/SnippetChoice.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
/*
* Copyright (C) 2024 The ORT Project Authors (see <https://github.com/oss-review-toolkit/ort/blob/main/NOTICE>)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* SPDX-License-Identifier: Apache-2.0
* License-Filename: LICENSE
*/

package org.ossreviewtoolkit.model.config.snippet

import org.ossreviewtoolkit.model.TextLocation

/**
* A snippet choice for a given source file.
*/
data class SnippetChoice(
/**
* The source file criteria for which the snippet choice is made.
*/
val given: Given,

/**
* The snippet criteria to make the snippet choice.
*/
val choice: Choice
)

/**
* A source file criteria for which the snippet choice is made.
*/
data class Given(
/**
* The source file for which the snippet choice is made.
*/
val sourceLocation: TextLocation
)

/**
* A snippet criteria to make the snippet choice.
*/
data class Choice(
/**
* The purl of the snippet chosen by this snippet choice. If [reason] is [SnippetChoiceReason.NO_RELEVANT_FINDING],
* it is null.
*/
val purl: String? = null,

/**
* The reason why this snippet choice was made.
*/
val reason: SnippetChoiceReason,

/**
* An optional comment describing the snippet choice.
*/
val comment: String? = null
)
40 changes: 40 additions & 0 deletions model/src/main/kotlin/config/snippet/SnippetChoiceReason.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
/*
* Copyright (C) 2024 The ORT Project Authors (see <https://github.com/oss-review-toolkit/ort/blob/main/NOTICE>)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* SPDX-License-Identifier: Apache-2.0
* License-Filename: LICENSE
*/

package org.ossreviewtoolkit.model.config.snippet

/**
* The reason for which the snippet choice has been made.
*/
enum class SnippetChoiceReason {
/**
* No relevant finding has been found for the corresponding source file. All snippets will be ignored.
*/
NO_RELEVANT_FINDING,

/**
* One snippet finding is relevant for the corresponding source file. All other snippets will be ignored.
*/
ORIGINAL_FINDING,

/**
* Other reason.
*/
OTHER
}
29 changes: 29 additions & 0 deletions model/src/test/kotlin/config/RepositoryConfigurationTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,15 @@ import com.fasterxml.jackson.databind.exc.ValueInstantiationException
import io.kotest.assertions.throwables.shouldThrow
import io.kotest.core.spec.style.WordSpec
import io.kotest.matchers.collections.haveSize
import io.kotest.matchers.nulls.beNull
import io.kotest.matchers.should
import io.kotest.matchers.shouldBe
import io.kotest.matchers.string.shouldContain
import io.kotest.matchers.string.shouldNotContain

import org.ossreviewtoolkit.model.Identifier
import org.ossreviewtoolkit.model.TextLocation
import org.ossreviewtoolkit.model.config.snippet.SnippetChoiceReason
import org.ossreviewtoolkit.model.fromYaml
import org.ossreviewtoolkit.utils.spdx.toSpdx
import org.ossreviewtoolkit.utils.test.shouldNotBeNull
Expand Down Expand Up @@ -121,6 +124,18 @@ class RepositoryConfigurationTest : WordSpec({
- given: MPL-2.0 or EPL-1.0
choice: MPL-2.0
- choice: MPL-2.0 AND MIT
snippet_choices:
- provenance:
url: "https://github.com/vdurmont/semver4j.git"
choices:
- given:
source_location:
path: "CHANGELOG.md"
start_line: 2
end_line: 5
choice:
reason: "NO_RELEVANT_FINDING"
comment: "Explain why this location has only false positive snippets"
""".trimIndent()

val repositoryConfiguration = configuration.fromYaml<RepositoryConfiguration>()
Expand Down Expand Up @@ -197,6 +212,20 @@ class RepositoryConfigurationTest : WordSpec({
choice shouldBe "MPL-2.0 AND MIT".toSpdx()
}
}

val snippetChoices = repositoryConfiguration.snippetChoices
snippetChoices should haveSize(1)

with(snippetChoices.first()) {
provenance.url shouldBe "https://github.com/vdurmont/semver4j.git"
with(choices.first()) {
given.sourceLocation shouldBe TextLocation("CHANGELOG.md", 2, 5)

choice.purl should beNull()
choice.reason shouldBe SnippetChoiceReason.NO_RELEVANT_FINDING
choice.comment shouldBe "Explain why this location has only false positive snippets"
}
}
}
}
})
Loading

0 comments on commit e78cae4

Please sign in to comment.