|
24 | 24 | import org.slf4j.Logger; |
25 | 25 | import org.slf4j.LoggerFactory; |
26 | 26 |
|
| 27 | +import java.io.File; |
27 | 28 | import java.net.URI; |
28 | | -import java.nio.file.Path; |
29 | | -import java.nio.file.Paths; |
30 | 29 | import java.util.ArrayList; |
31 | 30 | import java.util.Arrays; |
32 | 31 | import java.util.Deque; |
33 | 32 | import java.util.List; |
34 | 33 | import java.util.Objects; |
| 34 | +import java.util.Optional; |
35 | 35 | import java.util.regex.Pattern; |
36 | 36 | import java.util.stream.Collectors; |
37 | 37 | import java.util.stream.Stream; |
38 | | -import java.util.stream.StreamSupport; |
39 | 38 |
|
40 | 39 | import static io.qameta.allure.util.ResultsUtils.createFeatureLabel; |
41 | 40 | import static io.qameta.allure.util.ResultsUtils.createFrameworkLabel; |
42 | 41 | import static io.qameta.allure.util.ResultsUtils.createHostLabel; |
43 | 42 | import static io.qameta.allure.util.ResultsUtils.createLabel; |
44 | 43 | import static io.qameta.allure.util.ResultsUtils.createLanguageLabel; |
45 | | -import static io.qameta.allure.util.ResultsUtils.createPackageLabel; |
46 | 44 | import static io.qameta.allure.util.ResultsUtils.createStoryLabel; |
47 | 45 | import static io.qameta.allure.util.ResultsUtils.createSuiteLabel; |
48 | 46 | import static io.qameta.allure.util.ResultsUtils.createTestClassLabel; |
@@ -122,13 +120,16 @@ class LabelBuilder { |
122 | 120 | createThreadLabel(), |
123 | 121 | createFeatureLabel(featureName), |
124 | 122 | createStoryLabel(scenario.getName()), |
125 | | - createPackageLabel(featurePackage(uri, featureName)), |
126 | 123 | createSuiteLabel(featureName), |
127 | 124 | createTestClassLabel(scenario.getName()), |
128 | 125 | createFrameworkLabel("cucumber4jvm"), |
129 | 126 | createLanguageLabel("java"), |
130 | 127 | createLabel("gherkin_uri", uri) |
131 | 128 | )); |
| 129 | + |
| 130 | + featurePackage(uri, featureName) |
| 131 | + .map(ResultsUtils::createPackageLabel) |
| 132 | + .ifPresent(getScenarioLabels()::add); |
132 | 133 | } |
133 | 134 |
|
134 | 135 | public List<Label> getScenarioLabels() { |
@@ -162,15 +163,32 @@ private void tryHandleNamedLink(final String tagString) { |
162 | 163 | } |
163 | 164 | } |
164 | 165 |
|
165 | | - private String featurePackage(final String uri, final String featureName) { |
166 | | - final Path parent = Paths.get(URI.create(uri).getSchemeSpecificPart()).getParent(); |
167 | | - if (Objects.nonNull(parent)) { |
168 | | - final Stream<String> folders = StreamSupport.stream(parent.spliterator(), false) |
169 | | - .map(Path::toString); |
170 | | - final Stream<String> name = Stream.of(featureName); |
171 | | - return Stream.concat(folders, name).collect(Collectors.joining(".")); |
| 166 | + private Optional<String> featurePackage(final String uriString, final String featureName) { |
| 167 | + final Optional<URI> maybeUri = safeUri(uriString); |
| 168 | + if (!maybeUri.isPresent()) { |
| 169 | + return Optional.empty(); |
| 170 | + } |
| 171 | + URI uri = maybeUri.get(); |
| 172 | + |
| 173 | + if (!uri.isOpaque()) { |
| 174 | + final URI work = new File("").toURI(); |
| 175 | + uri = work.relativize(uri); |
172 | 176 | } |
173 | | - return featureName; |
| 177 | + final String schemeSpecificPart = uri.normalize().getSchemeSpecificPart(); |
| 178 | + final Stream<String> folders = Stream.of(schemeSpecificPart.replaceAll("\\.", "_").split("/")); |
| 179 | + final Stream<String> name = Stream.of(featureName); |
| 180 | + return Optional.of(Stream.concat(folders, name) |
| 181 | + .filter(Objects::nonNull) |
| 182 | + .filter(s -> !s.isEmpty()) |
| 183 | + .collect(Collectors.joining("."))); |
174 | 184 | } |
175 | 185 |
|
| 186 | + private static Optional<URI> safeUri(final String uri) { |
| 187 | + try { |
| 188 | + return Optional.of(URI.create(uri)); |
| 189 | + } catch (Exception e) { |
| 190 | + LOGGER.debug("could not parse feature uri {}", uri, e); |
| 191 | + } |
| 192 | + return Optional.empty(); |
| 193 | + } |
176 | 194 | } |
0 commit comments