From eaafc901979a9d3ba14b96a4811cf81a11d97d12 Mon Sep 17 00:00:00 2001 From: Kris De Volder Date: Thu, 6 Apr 2017 08:56:24 -0700 Subject: [PATCH] Support for `time` resource type --- .../concourse/ConcourseValueParsers.java | 20 ++++ .../vscode/concourse/PipelineYmlSchema.java | 25 +++++ .../main/resources/desc/TimeSource/days.md | 6 ++ .../resources/desc/TimeSource/interval.md | 2 + .../resources/desc/TimeSource/location.md | 7 ++ .../main/resources/desc/TimeSource/start.md | 11 +++ .../main/resources/desc/TimeSource/stop.md | 11 +++ .../vscode/concourse/ConcourseEditorTest.java | 57 ++++++++++++ .../vscode/concourse/TimeOfDayParserTest.java | 92 +++++++++++++++++++ 9 files changed, 231 insertions(+) create mode 100644 vscode-extensions/vscode-concourse/src/main/resources/desc/TimeSource/days.md create mode 100644 vscode-extensions/vscode-concourse/src/main/resources/desc/TimeSource/interval.md create mode 100644 vscode-extensions/vscode-concourse/src/main/resources/desc/TimeSource/location.md create mode 100644 vscode-extensions/vscode-concourse/src/main/resources/desc/TimeSource/start.md create mode 100644 vscode-extensions/vscode-concourse/src/main/resources/desc/TimeSource/stop.md create mode 100644 vscode-extensions/vscode-concourse/src/test/java/org/springframework/ide/vscode/concourse/TimeOfDayParserTest.java diff --git a/vscode-extensions/vscode-concourse/src/main/java/org/springframework/ide/vscode/concourse/ConcourseValueParsers.java b/vscode-extensions/vscode-concourse/src/main/java/org/springframework/ide/vscode/concourse/ConcourseValueParsers.java index 09edf1e85..35283cf0f 100644 --- a/vscode-extensions/vscode-concourse/src/main/java/org/springframework/ide/vscode/concourse/ConcourseValueParsers.java +++ b/vscode-extensions/vscode-concourse/src/main/java/org/springframework/ide/vscode/concourse/ConcourseValueParsers.java @@ -74,4 +74,24 @@ public class ConcourseValueParsers { + " '2h45m'. Valid time units are 'ns', 'us' (or 'µs'), 'ms', 's', " + "'m', 'h'." ); + + public static final ValueParser TIME_OF_DAY = new RegexpParser( + createTimeRegexp(), + "Time", + "Supported time formats are: 3:04 PM, 3PM, 3 PM, 15:04, and 1504. " + + "Deprecation: an offset may be appended, e.g. +0700 or -0400, but " + + "you should use location instead." + ); + + private static String createTimeRegexp() { + String hours = "([0-2]?[0-9])"; + String minutes = "([0-6][0-9])"; + String time = hours+"((:"+minutes+")|"+minutes+")?"; + String pm = "(\\s?[AP]M)?"; + String zone = "(\\s(\\+|\\-)[0-9][0-9][0-9][0-9])?"; + + return time + pm + zone; + } + + } diff --git a/vscode-extensions/vscode-concourse/src/main/java/org/springframework/ide/vscode/concourse/PipelineYmlSchema.java b/vscode-extensions/vscode-concourse/src/main/java/org/springframework/ide/vscode/concourse/PipelineYmlSchema.java index abd5e0ac3..0f4be308e 100644 --- a/vscode-extensions/vscode-concourse/src/main/java/org/springframework/ide/vscode/concourse/PipelineYmlSchema.java +++ b/vscode-extensions/vscode-concourse/src/main/java/org/springframework/ide/vscode/concourse/PipelineYmlSchema.java @@ -70,6 +70,7 @@ public class PipelineYmlSchema implements YamlSchema { .collect(Collectors.toSet()) .block(); + private final AbstractType TOPLEVEL_TYPE; private final YTypeUtil TYPE_UTIL; @@ -103,6 +104,8 @@ public class PipelineYmlSchema implements YamlSchema { public final YType t_duration = f.yatomic("Duration") .parseWith(ConcourseValueParsers.DURATION); + public final YType t_time_of_day = f.yatomic("TimeOfDay") + .parseWith(ConcourseValueParsers.TIME_OF_DAY); public final AbstractType task; @@ -123,6 +126,10 @@ public class PipelineYmlSchema implements YamlSchema { "us-east-2" ); + public final YType t_day = f.yenum("Day", + //See https://github.com/concourse/time-resource#source-configuration + "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" + ); public PipelineYmlSchema(ConcourseModel models) { this.models = models; @@ -531,6 +538,24 @@ public class PipelineYmlSchema implements YamlSchema { resourceTypes.def("semver", source, get, put); } + //time: + { + AbstractType source = f.ybean("TimeSource"); + addProp(source, "interval", t_duration); + addProp(source, "location", t_ne_string); + addProp(source, "start", t_time_of_day); + addProp(source, "stop", t_time_of_day); + addProp(source, "days", f.yseq(t_day)); + + AbstractType get = f.ybean("TimeGetParams"); + //get params deliberately left empty + + AbstractType put = f.ybean("TimePutParams"); + //put params deliberately left empty + + resourceTypes.def("time", source, get, put); + + } } private String getSemverDriverName(DynamicSchemaContext dc) { diff --git a/vscode-extensions/vscode-concourse/src/main/resources/desc/TimeSource/days.md b/vscode-extensions/vscode-concourse/src/main/resources/desc/TimeSource/days.md new file mode 100644 index 000000000..9745a7732 --- /dev/null +++ b/vscode-extensions/vscode-concourse/src/main/resources/desc/TimeSource/days.md @@ -0,0 +1,6 @@ +*Optional.* Run only on these day(s). Supported days are: `Sunday`, +`Monday`, `Tuesday`, `Wednesday`, `Thursday`, `Friday` and `Saturday`. + +e.g. + + days: [Monday, Wednesday] diff --git a/vscode-extensions/vscode-concourse/src/main/resources/desc/TimeSource/interval.md b/vscode-extensions/vscode-concourse/src/main/resources/desc/TimeSource/interval.md new file mode 100644 index 000000000..7284eb0ac --- /dev/null +++ b/vscode-extensions/vscode-concourse/src/main/resources/desc/TimeSource/interval.md @@ -0,0 +1,2 @@ +*Optional.* The interval on which to report new versions. Valid +values: `60s`, `90m`, `1h`. \ No newline at end of file diff --git a/vscode-extensions/vscode-concourse/src/main/resources/desc/TimeSource/location.md b/vscode-extensions/vscode-concourse/src/main/resources/desc/TimeSource/location.md new file mode 100644 index 000000000..566d5fed2 --- /dev/null +++ b/vscode-extensions/vscode-concourse/src/main/resources/desc/TimeSource/location.md @@ -0,0 +1,7 @@ +*Optional. Default `UTC`.* The +[location](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) in +which to interpret `start`, `stop`, and `days`. + +e.g. + + location: Africa/Abidjan diff --git a/vscode-extensions/vscode-concourse/src/main/resources/desc/TimeSource/start.md b/vscode-extensions/vscode-concourse/src/main/resources/desc/TimeSource/start.md new file mode 100644 index 000000000..bac338139 --- /dev/null +++ b/vscode-extensions/vscode-concourse/src/main/resources/desc/TimeSource/start.md @@ -0,0 +1,11 @@ +*Optional.* Only create new time versions between `start` and `stop` +time range. The supported time formats are: `3:04 PM`, `3PM`, `3 PM`, +`15:04`, and `1504`. + +e.g. + + start: 8:00 PM + stop: 9:00 PM + +**Deprecation: an offset may be appended, e.g. `+0700` or `-0400`, but you +should use `location` instead.** diff --git a/vscode-extensions/vscode-concourse/src/main/resources/desc/TimeSource/stop.md b/vscode-extensions/vscode-concourse/src/main/resources/desc/TimeSource/stop.md new file mode 100644 index 000000000..bac338139 --- /dev/null +++ b/vscode-extensions/vscode-concourse/src/main/resources/desc/TimeSource/stop.md @@ -0,0 +1,11 @@ +*Optional.* Only create new time versions between `start` and `stop` +time range. The supported time formats are: `3:04 PM`, `3PM`, `3 PM`, +`15:04`, and `1504`. + +e.g. + + start: 8:00 PM + stop: 9:00 PM + +**Deprecation: an offset may be appended, e.g. `+0700` or `-0400`, but you +should use `location` instead.** diff --git a/vscode-extensions/vscode-concourse/src/test/java/org/springframework/ide/vscode/concourse/ConcourseEditorTest.java b/vscode-extensions/vscode-concourse/src/test/java/org/springframework/ide/vscode/concourse/ConcourseEditorTest.java index b5a49ba0a..a4443a060 100644 --- a/vscode-extensions/vscode-concourse/src/test/java/org/springframework/ide/vscode/concourse/ConcourseEditorTest.java +++ b/vscode-extensions/vscode-concourse/src/test/java/org/springframework/ide/vscode/concourse/ConcourseEditorTest.java @@ -742,6 +742,63 @@ public class ConcourseEditorTest { ); } + @Test public void timeResourceCompletions() throws Exception { + assertContextualCompletions( + "resources:\n" + + "- name: every5minutes\n" + + " type: time\n" + + " source:\n" + + " <*>" + , // ====================== + "<*>" + , // => + "days:\n"+ + " - <*>", + "interval: <*>", + "location: <*>", + "start: <*>", + "stop: <*>" + ); + + assertContextualCompletions( + "resources:\n" + + "- name: every5minutes\n" + + " type: time\n" + + " source:\n" + + " days:\n" + + " - <*>" + , // ====================== + "<*>" + , // => + "Friday<*>", + "Monday<*>", + "Saturday<*>", + "Sunday<*>", + "Thursday<*>", + "Tuesday<*>", + "Wednesday<*>" + ); + } + + @Test public void timeResourceSourceHovers() throws Exception { + Editor editor = harness.newEditor( + "resources:\n" + + "- name: timed-trigger\n" + + " type: time\n" + + " source:\n" + + " interval: 5m\n" + + " location: UTC\n" + + " start: 8:00PM\n" + + " stop: 9:00PM\n" + + " days: [Monday, Wednesday, Friday]" + ); + editor.assertHoverContains("interval", "interval on which to report new versions"); + editor.assertHoverContains("location", "*Optional. Default `UTC`"); + editor.assertHoverContains("start", "The supported time formats are"); + editor.assertHoverContains("stop", "The supported time formats are"); + editor.assertHoverContains("days", "Run only on these day(s)"); + } + @Test public void gitResourceSourceReconcile() throws Exception { Editor editor = harness.newEditor( "resources:\n" + diff --git a/vscode-extensions/vscode-concourse/src/test/java/org/springframework/ide/vscode/concourse/TimeOfDayParserTest.java b/vscode-extensions/vscode-concourse/src/test/java/org/springframework/ide/vscode/concourse/TimeOfDayParserTest.java new file mode 100644 index 000000000..cd2f83154 --- /dev/null +++ b/vscode-extensions/vscode-concourse/src/test/java/org/springframework/ide/vscode/concourse/TimeOfDayParserTest.java @@ -0,0 +1,92 @@ +/******************************************************************************* + * Copyright (c) 2017 Pivotal, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Pivotal, Inc. - initial API and implementation + *******************************************************************************/ +package org.springframework.ide.vscode.concourse; + +import static org.junit.Assert.fail; +import static org.springframework.ide.vscode.languageserver.testharness.TestAsserts.assertContains; + +import org.junit.Test; +import org.springframework.ide.vscode.commons.util.ExceptionUtil; +import org.springframework.ide.vscode.commons.util.ValueParser; + +public class TimeOfDayParserTest { + + private ValueParser parser = ConcourseValueParsers.TIME_OF_DAY; + + @Test + public void goodExamples() throws Exception { + String[] examples = { + "3:04 PM -0700", + "3:04 PM +0700", + "3:04 AM +0700", + "00:00 AM +0700", + "23:59 PM +0800", + + "3PM -0700", + "0AM +0800", + "24AM +0800", + + "3 PM -0700", + "0 AM -0700", + "24 PM -1234", + + "15:04 -0700", + "0:00 -0700", + "23:59 -0700", + + "304 -0700", + "1504 -0700", + "0004 -0700", + "2359 -0700", + + "3:04 PM", + "0:00 AM", + "11:59 PM", + + "3PM", + "1AM", + "23PM", + + "3 PM", + "1 AM", + "23 PM", + + "15:04", + "0:00", + "00:00", + "23:59", + + "1504", + "0000", + "2359" + }; + for (String string : examples) { + System.out.println(string); + parser.parse(string); + } + } + + @Test + public void badExamples() { + does_not_parse("arbirary garbage"); + does_not_parse("3:04 PM -0700 extra"); + } + + private void does_not_parse(String string) { + try { + parser.parse(string); + fail("Should have failed parsing!"); + } catch (Exception e) { + assertContains("Time", ExceptionUtil.getMessage(e)); + } + } + +}