3838import javax .xml .xpath .XPathFactory ;
3939import java .io .File ;
4040import java .io .IOException ;
41+ import java .nio .file .Files ;
42+ import java .nio .file .Path ;
4143import java .util .List ;
4244import java .util .concurrent .atomic .AtomicReference ;
4345import java .util .function .Function ;
4446import java .util .regex .Matcher ;
4547import java .util .regex .Pattern ;
48+ import java .util .stream .Stream ;
4649
4750import static com .predic8 .membrane .examples .util .TestFileUtil .getFileContentAsLines ;
4851import static com .predic8 .membrane .examples .util .TestFileUtil .writeLinesToFile ;
@@ -69,6 +72,7 @@ public class ConsistentVersionNumbers {
6972 private static final Pattern CONSTANTS_VERSION_PATTERN = Pattern .compile ("(\\ s*String version = \" )(\\ d+.\\ d+)(\" ;.*)" );
7073 private static final Pattern RPM_SPEC_VERSION_PATTERN = Pattern .compile ("(Version:\\ s+)(\\ S+)(.*)" );
7174 private static final Pattern HELP_REFERENCE_VERSION_PATTERN = Pattern .compile ("(path.replace\\ (\" %VERSION%\" , \" )([^\" ]*)(\" \\ ))" );
75+ private static final Pattern YAML_SCHEMA_VERSION_PATTERN = Pattern .compile ("(\\ s*#\\ s*yaml-language-server:\\ s*\\ $schema=https://www\\ .membrane-api\\ .io/v)(\\ d+\\ .\\ d+(?:\\ .\\ d+)?)(\\ .json\\ b.*)" );
7276
7377 @ Test
7478 public void doit () throws Exception {
@@ -142,6 +146,8 @@ private static void transformRecursively(File baseDirectory, VersionTransformer
142146 handleHelpReference (new File (baseDirectory .getAbsolutePath (), "/annot/src/main/java/com/predic8/membrane/annot/generator/HelpReference.java" ), versionTransformer );
143147 handleRpmSpec (new File (baseDirectory .getAbsolutePath (), "/membrane.spec" ), versionTransformer );
144148 handleConstants (new File (baseDirectory .getAbsolutePath (), "core/src/main/java/com/predic8/membrane/core/Constants.java" ), versionTransformer );
149+
150+ handleYamlSchemas (baseDirectory , versionTransformer );
145151 }
146152
147153 private static void handleConstants (File file , VersionTransformer versionTransformer ) throws Exception {
@@ -277,4 +283,59 @@ public Semver withIncPatch() {
277283 private interface VersionTransformer {
278284 Semver map (File file , Semver old );
279285 }
286+
287+ private static void handleYamlSchemas (File baseDirectory , VersionTransformer versionTransformer ) throws Exception {
288+ try (Stream <Path > s = Files .walk (baseDirectory .toPath ())) {
289+ s .filter (Files ::isRegularFile )
290+ .filter (p -> {
291+ String n = p .getFileName ().toString ();
292+ return n .endsWith (".yml" ) || n .endsWith (".yaml" );
293+ })
294+ .filter (p -> !p .toString ().contains (File .separator + "target" + File .separator ))
295+ .forEach (p -> {
296+ try {
297+ handleYamlSchemaFile (p .toFile (), versionTransformer );
298+ } catch (Exception e ) {
299+ throw new RuntimeException ("in file " + p .toAbsolutePath (), e );
300+ }
301+ });
302+ }
303+ }
304+
305+ private static void handleYamlSchemaFile (File file , VersionTransformer versionTransformer ) throws Exception {
306+ List <String > content = getFileContentAsLines (file );
307+
308+ boolean touched = false ;
309+ for (int i = 0 ; i < content .size (); i ++) {
310+ Matcher m = YAML_SCHEMA_VERSION_PATTERN .matcher (content .get (i ));
311+ if (!m .find ())
312+ continue ;
313+
314+ touched = true ;
315+
316+ Semver mapped = versionTransformer .map (file , new MembraneVersion (m .group (2 )));
317+
318+ // Snapshot must NOT change YAML schema.
319+ if (!isFullRelease (mapped ))
320+ continue ;
321+
322+ content .set (i , m .replaceFirst (Matcher .quoteReplacement (m .group (1 ) + formatYamlSchemaVersion (mapped ) + m .group (3 ))));
323+ }
324+
325+ if (touched ) {
326+ writeLinesToFile (file , content );
327+ }
328+ }
329+
330+ private static boolean isFullRelease (Semver v ) {
331+ return v .getValue ().indexOf ('-' ) < 0 ;
332+ }
333+
334+ private static String formatYamlSchemaVersion (Semver v ) {
335+ if (v .getPatch () == null ) {
336+ return "%d.%d" .formatted (v .getMajor (), v .getMinor () == null ? 0 : v .getMinor ());
337+ }
338+ return "%d.%d.%d" .formatted (v .getMajor (), v .getMinor () == null ? 0 : v .getMinor (), v .getPatch ());
339+ }
340+
280341}
0 commit comments