Example #1
0
        /// <summary>
        /// If supported, convert the provided value into a <see cref="IPropertyToken"/>.
        /// </summary>
        /// <param name="converter">Converter for conversion of additional values.</param>
        /// <param name="value">The value to convert.</param>
        /// <param name="result">Value converted to <see cref="IPropertyToken"/> if conversion was successful.</param>
        /// <returns><c>true</c> if the value could be converted under this policy; <c>false</c> otherwise.</returns>
        public bool TryConvert(IPropertyConverter converter, object value, out IPropertyToken result)
        {
            result = null;

            if (converter == null)
            {
                throw new ArgumentNullException(nameof(converter));
            }

            var enumerable = value as IEnumerable;

            if (enumerable == null)
            {
                return(false);
            }
            if (value.GetType().IsDictionary())
            {
                return(false);
            }

            var elements = enumerable.Cast <object>();

            if (_config.ItemLimit > 0)
            {
                elements = elements.Take(_config.ItemLimit);
            }

            result = new SequenceToken(elements.Select(converter.Convert));
            return(true);
        }
        public static ArrayContextData ToContextData(this SequenceToken sequence)
        {
            var token       = sequence as TemplateToken;
            var contextData = token.ToContextData();

            return(contextData.AssertArray("converted sequence token"));
        }
        internal Boolean AllowSequenceStart(
            Boolean expand,
            out SequenceToken sequence)
        {
            m_memory.IncrementEvents();

            if (expand)
            {
                Unravel(expand: true);
            }

            if (m_current is SequenceState sequenceState && sequenceState.IsStart)
            {
                sequence = new SequenceToken(sequenceState.Value.FileId, sequenceState.Value.Line, sequenceState.Value.Column);

                // Add bytes before they are emitted to the caller (so the caller doesn't have to track bytes)
                m_memory.AddBytes(sequence);

                MoveNext();
                return(true);
            }

            sequence = null;
            return(false);
        }
Example #4
0
        public void Evaluate_ContainerAction_Args()
        {
            try
            {
                //Arrange
                Setup();

                var actionManifest = new ActionManifestManager();
                actionManifest.Initialize(_hc);

                var arguments = new SequenceToken(null, null, null);
                arguments.Add(new BasicExpressionToken(null, null, null, "inputs.greeting"));
                arguments.Add(new StringToken(null, null, null, "test"));

                var inputsContext = new DictionaryContextData();
                inputsContext.Add("greeting", new StringContextData("hello"));

                var evaluateContext = new Dictionary <string, PipelineContextData>(StringComparer.OrdinalIgnoreCase);
                evaluateContext["inputs"] = inputsContext;
                //Act

                var result = actionManifest.EvaluateContainerArguments(_ec.Object, arguments, evaluateContext);

                //Assert
                Assert.Equal("hello", result[0]);
                Assert.Equal("test", result[1]);
                Assert.Equal(2, result.Count);
            }
            finally
            {
                Teardown();
            }
        }
        public void Write(StringBuilder builder, SequenceToken sequence)
        {
            if (builder == null || sequence == null)
            {
                return;
            }

            builder.Append(SequenceToken.Keyword);
        }
Example #6
0
        public ILexicalElementable EnsureStartToken()
        {
            if (SequenceStartToken == null)
            {
                SequenceStartToken = new SequenceToken();
            }

            return(SequenceStartToken);
        }
Example #7
0
        public void SequenceToken_TokenSequence_SequenceContainsInputElements()
        {
            var elements = Enumerable.Range(0, 3).Select(v => new ScalarToken(v)).ToList();

            var sequence = new SequenceToken(elements);

            Assert.Equal(3, sequence.Elements.Count);
            Assert.True(sequence.Elements.SequenceEqual(elements));
        }
Example #8
0
        // todo: remove after feature-flag DistributedTask.EvaluateContainerOnRunner is enabled everywhere
        internal static TemplateToken ConvertToTemplateToken(ContainerResource resource)
        {
            var result = new MappingToken(null, null, null);

            var image = resource.Image;

            if (!string.IsNullOrEmpty(image))
            {
                result.Add(new StringToken(null, null, null, "image"), new StringToken(null, null, null, image));
            }

            var options = resource.Options;

            if (!string.IsNullOrEmpty(options))
            {
                result.Add(new StringToken(null, null, null, "options"), new StringToken(null, null, null, options));
            }

            var environment = resource.Environment;

            if (environment?.Count > 0)
            {
                var mapping = new MappingToken(null, null, null);
                foreach (var pair in environment)
                {
                    mapping.Add(new StringToken(null, null, null, pair.Key), new StringToken(null, null, null, pair.Value));
                }
                result.Add(new StringToken(null, null, null, "env"), mapping);
            }

            var ports = resource.Ports;

            if (ports?.Count > 0)
            {
                var sequence = new SequenceToken(null, null, null);
                foreach (var item in ports)
                {
                    sequence.Add(new StringToken(null, null, null, item));
                }
                result.Add(new StringToken(null, null, null, "ports"), sequence);
            }

            var volumes = resource.Volumes;

            if (volumes?.Count > 0)
            {
                var sequence = new SequenceToken(null, null, null);
                foreach (var item in volumes)
                {
                    sequence.Add(new StringToken(null, null, null, item));
                }
                result.Add(new StringToken(null, null, null, "volumes"), sequence);
            }

            return(result);
        }
        public void Format_EmptySequenceToken_IsFormattedAsArray()
        {
            var output   = new StringWriter();
            var formater = new JsonPropertyFormatter(output);
            var token    = new SequenceToken(null);

            token.Render(formater);

            Assert.Equal("[]", output.ToString());
        }
        public void Format_NonEmptySequenceToken_IsFormattedAsArray()
        {
            var output   = new StringWriter();
            var formater = new JsonPropertyFormatter(output);
            var token    = new SequenceToken(new[] { new ScalarToken(1), new ScalarToken("foo") });

            token.Render(formater);

            Assert.Equal("[1, \"foo\"]", output.ToString());
        }
Example #11
0
        public void Render_SomeFormatter_FormatterIsCalled()
        {
            var formatterMock = new Mock <IPropertyFormatter>();

            var formatter = formatterMock.Object;
            var sequence  = new SequenceToken(null);

            sequence.Render(formatter);

            formatterMock.Verify(m => m.Format(sequence), Times.Once);
        }
Example #12
0
        public Boolean AllowSequenceStart(out SequenceToken value)
        {
            if (EvaluateCurrent() is SequenceStart sequenceStart)
            {
                value = new SequenceToken(m_fileId, sequenceStart.Start.Line, sequenceStart.Start.Column);
                MoveNext();
                return(true);
            }

            value = default;
            return(false);
        }
Example #13
0
        internal static TemplateToken ToTemplateToken(this PipelineContextData data)
        {
            if (data is null)
            {
                return(new NullToken(null, null, null));
            }

            switch (data.Type)
            {
            case PipelineContextDataType.Dictionary:
                var dictionary = data.AssertDictionary("dictionary");
                var mapping    = new MappingToken(null, null, null);
                if (dictionary.Count > 0)
                {
                    foreach (var pair in dictionary)
                    {
                        var key   = new StringToken(null, null, null, pair.Key);
                        var value = pair.Value.ToTemplateToken();
                        mapping.Add(key, value);
                    }
                }
                return(mapping);

            case PipelineContextDataType.Array:
                var array    = data.AssertArray("array");
                var sequence = new SequenceToken(null, null, null);
                if (array.Count > 0)
                {
                    foreach (var item in array)
                    {
                        sequence.Add(item.ToTemplateToken());
                    }
                }
                return(sequence);

            case PipelineContextDataType.String:
                var stringData = data as StringContextData;
                return(new StringToken(null, null, null, stringData.Value));

            case PipelineContextDataType.Boolean:
                var booleanData = data as BooleanContextData;
                return(new BooleanToken(null, null, null, booleanData.Value));

            case PipelineContextDataType.Number:
                var numberData = data as NumberContextData;
                return(new NumberToken(null, null, null, numberData.Value));

            default:
                throw new NotSupportedException($"Unexpected {nameof(PipelineContextDataType)} type '{data.Type}'");
            }
        }
        public Boolean AllowSequenceStart(out SequenceToken sequence)
        {
            var current = m_enumerator.Current;

            if (current.Type == ParseEventType.SequenceStart)
            {
                sequence = new SequenceToken(m_fileId, current.Line, current.Column);
                m_enumerator.MoveNext();
                return(true);
            }

            sequence = null;
            return(false);
        }
        /// <summary>
        /// Formats content of <see cref="SequenceToken"/>.
        /// </summary>
        /// <param name="token">Token to be formatted.</param>
        public void Format(SequenceToken token)
        {
            _output.Write('[');

            int allButLast = token.Elements.Count - 1;

            for (int i = 0; i < allButLast; ++i)
            {
                token.Elements[i].Render(this);
                _output.Write(", ");
            }

            if (token.Elements.Count > 0)
            {
                token.Elements[token.Elements.Count - 1].Render(this);
            }

            _output.Write(']');
        }
Example #16
0
        public List <string> EvaluateContainerArguments(
            IExecutionContext executionContext,
            SequenceToken token,
            IDictionary <string, PipelineContextData> extraExpressionValues)
        {
            var result = new List <string>();

            if (token != null)
            {
                var context = CreateContext(executionContext, extraExpressionValues);
                try
                {
                    var evaluateResult = TemplateEvaluator.Evaluate(context, "container-runs-args", token, 0, null, omitHeader: true);
                    context.Errors.Check();

                    Trace.Info($"Arguments evaluate result: {StringUtil.ConvertToJson(evaluateResult)}");

                    // Sequence
                    var args = evaluateResult.AssertSequence("container args");

                    foreach (var arg in args)
                    {
                        var str = arg.AssertString("container arg").Value;
                        result.Add(str);
                        Trace.Info($"Add argument {str}");
                    }
                }
                catch (Exception ex) when(!(ex is TemplateValidationException))
                {
                    Trace.Error(ex);
                    context.Errors.Add(ex);
                }

                context.Errors.Check();
            }

            return(result);
        }
Example #17
0
        public void SequenceToken_NullSequence_SequenceContainsZeroElements()
        {
            var sequence = new SequenceToken(null);

            Assert.Equal(0, sequence.Elements.Count);
        }
 public override string ToString()
 {
     return(string.Format("<SimpleQueueCacheCursor: Element={0}, SequenceToken={1}>",
                          Element != null ? Element.Value.Batch.ToString() : "null", SequenceToken != null ? SequenceToken.ToString() : "null"));
 }
        internal void AddBytes(SequenceToken sequence)
        {
            var bytes = CalculateBytes(sequence);

            AddBytes(bytes);
        }
Example #20
0
        public void Render_NullFormatter_ThrowsArgumentNullException()
        {
            var sequence = new SequenceToken(null);

            Assert.Throws <ArgumentNullException>(() => sequence.Render(null));
        }