Skip to content

Commit

Permalink
updated stuff
Browse files Browse the repository at this point in the history
  • Loading branch information
mookid8000 committed Oct 5, 2015
1 parent 5f7edb4 commit c92ed74
Show file tree
Hide file tree
Showing 6 changed files with 116 additions and 12 deletions.
28 changes: 25 additions & 3 deletions GoCommando.Tests/TestArgParser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public class TestArgParser
[Test]
public void CanReturnSimpleCommand()
{
var arguments = Parse(new[] {"run"});
var arguments = Parse(new[] { "run" });

Assert.That(arguments.Command, Is.EqualTo("run"));
}
Expand All @@ -22,7 +22,7 @@ public void DoesNotAcceptSwitchAsCommand()
{
var ex = Assert.Throws<GoCommandoException>(() =>
{
Parse(new[] {"-file", @"""C:\temp\file.json"""});
Parse(new[] { "-file", @"""C:\temp\file.json""" });
});

Console.WriteLine(ex);
Expand All @@ -37,7 +37,7 @@ public void CanParseOrdinaryArguments()
-dir
c:\Windows\Microsoft.NET\Framework
-flag
-moreflag".Split(new[] {Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries);
-moreflag".Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);

var arguments = Parse(args);

Expand All @@ -53,6 +53,28 @@ public void CanParseOrdinaryArguments()
Assert.That(arguments.Get<bool>("flag_not_specified_should_default_to_false"), Is.False);
}

[TestCase(@"-path:""c:\temp""")]
[TestCase(@"-path=""c:\temp""")]
[TestCase(@"-path""c:\temp""")]
public void SupportsVariousSingleTokenAliases(string alias)
{
var arguments = Parse(new[] { alias });

Assert.That(arguments.Switches.Count(), Is.EqualTo(1));
Assert.That(arguments.Switches.Single().Key, Is.EqualTo("path"));
Assert.That(arguments.Switches.Single().Value, Is.EqualTo(@"""c:\temp"""));
}

[TestCase(@"-n23")]
public void SupportsShortFormWithNumber(string alias)
{
var arguments = Parse(new[] { alias });

Assert.That(arguments.Switches.Count(), Is.EqualTo(1));
Assert.That(arguments.Switches.Single().Key, Is.EqualTo("n"));
Assert.That(arguments.Switches.Single().Value, Is.EqualTo(@"23"));
}

static Arguments Parse(IEnumerable<string> args)
{
return Go.Parse(args, new Settings());
Expand Down
42 changes: 42 additions & 0 deletions GoCommando/Go.cs
Original file line number Diff line number Diff line change
Expand Up @@ -235,6 +235,18 @@ internal static Arguments Parse(IEnumerable<string> args, Settings settings)
}

key = arg.Substring(settings.SwitchPrefix.Length);

if (HasKeyAndValue(key))
{
var keyAndValue = GetKeyAndValueFromKey(key);
if (keyAndValue == null)
{
throw new ApplicationException($"Expected to get key-value-pair from key '{key}'");
}
switches.Add(Switch.KeyValue(keyAndValue.Value.Key, keyAndValue.Value.Value));
key = null;
}

continue;
}

Expand All @@ -257,5 +269,35 @@ internal static Arguments Parse(IEnumerable<string> args, Settings settings)

return new Arguments(command, switches, settings);
}

static bool HasKeyAndValue(string key)
{
return GetKeyAndValueFromKey(key) != null;
}

static KeyValuePair<string,string>? GetKeyAndValueFromKey(string key)
{
for (var index = 0; index < key.Length; index++)
{
var c = key[index];

if (c == ':')
{
return new KeyValuePair<string, string>(key.Substring(0, index), key.Substring(index + 1));
}

if (c == '=')
{
return new KeyValuePair<string, string>(key.Substring(0, index), key.Substring(index + 1));
}

if (!char.IsLetter(c))
{
return new KeyValuePair<string, string>(key.Substring(0, index), key.Substring(index));
}
}

return null;
}
}
}
23 changes: 19 additions & 4 deletions GoCommando/Internals/Command.cs
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,8 @@ IEnumerable<Parameter> GetParameters(Type type)
a.ParameterAttribute.ShortName,
a.ParameterAttribute.Optional,
a.DescriptionAttribute?.DescriptionText,
a.ExampleAttributes.Select(e => e.ExampleValue)))
a.ExampleAttributes.Select(e => e.ExampleValue),
a.ParameterAttribute.DefaultValue))
.ToList();
}

Expand All @@ -64,13 +65,13 @@ public void Invoke(IEnumerable<Switch> switches)
var commandInstance = (ICommand)Activator.CreateInstance(Type);

var requiredParametersMissing = Parameters
.Where(p => !p.Optional && !switches.Any(s => s.Key == p.Name))
.Where(p => !p.Optional && !p.HasDefaultValue && !switches.Any(s => s.Key == p.Name))
.ToList();

if (requiredParametersMissing.Any())
{
var requiredParametersMissingString = string.Join(Environment.NewLine,
requiredParametersMissing.Select(p => " " + p.Name));
requiredParametersMissing.Select(p => $" {_settings.SwitchPrefix}{p.Name}"));

throw new GoCommandoException($@"The following required parameters are missing:
Expand All @@ -93,11 +94,25 @@ public void Invoke(IEnumerable<Switch> switches)
{switchesWithoutMathingParameterString}");
}

var setParameters = new HashSet<Parameter>();

foreach (var switchToSet in switches)
{
var correspondingParameter = Parameters.FirstOrDefault(p => p.MatchesKey(switchToSet.Key));

correspondingParameter?.SetValue(commandInstance, switchToSet.Value);
if (correspondingParameter == null)
{
throw new GoCommandoException($"The switch {_settings}{switchToSet.Key} does not correspond to a parameter of the '{Command}' command!");
}

correspondingParameter.SetValue(commandInstance, switchToSet.Value);

setParameters.Add(correspondingParameter);
}

foreach (var parameterWithDefaultValue in Parameters.Where(p => p.HasDefaultValue).Except(setParameters))
{
parameterWithDefaultValue.ApplyDefaultValue(commandInstance);
}

commandInstance.Run();
Expand Down
23 changes: 21 additions & 2 deletions GoCommando/Internals/Parameter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,24 +5,28 @@

namespace GoCommando.Internals
{
class Parameter
class Parameter : IEquatable<Parameter>
{
public PropertyInfo PropertyInfo { get; }
public string Name { get; }
public string Shortname { get; }
public bool Optional { get; }
public string DescriptionText { get; }
public string DefaultValue { get; }
public string[] ExampleValues { get; }

public bool IsFlag => PropertyInfo.PropertyType == typeof (bool);

public Parameter(PropertyInfo propertyInfo, string name, string shortname, bool optional, string descriptionText, IEnumerable<string> exampleValues)
public bool HasDefaultValue => DefaultValue != null;

public Parameter(PropertyInfo propertyInfo, string name, string shortname, bool optional, string descriptionText, IEnumerable<string> exampleValues, string defaultValue)
{
PropertyInfo = propertyInfo;
Name = name;
Shortname = shortname;
Optional = optional;
DescriptionText = descriptionText;
DefaultValue = defaultValue;
ExampleValues = exampleValues.ToArray();
}

Expand All @@ -48,5 +52,20 @@ public void SetValue(object commandInstance, string value)
throw new FormatException($"Could not set value '{value}' on property named '{PropertyInfo.Name}' on {PropertyInfo.DeclaringType}", exception);
}
}

public void ApplyDefaultValue(ICommand commandInstance)
{
if (!HasDefaultValue)
{
throw new InvalidOperationException($"Cannot apply default value of '{Name}' parameter because it has no default!");
}

SetValue(commandInstance, DefaultValue);
}

public bool Equals(Parameter other)
{
return Name.Equals(other.Name);
}
}
}
4 changes: 3 additions & 1 deletion GoCommando/ParameterAttribute.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,14 @@ public class ParameterAttribute : Attribute
public string Name { get; }
public string ShortName { get; }
public bool Optional { get; }
public string DefaultValue { get; }

public ParameterAttribute(string name, string shortName = null, bool optional = false)
public ParameterAttribute(string name, string shortName = null, bool optional = false, string defaultValue = null)
{
Name = name;
ShortName = shortName;
Optional = optional;
DefaultValue = defaultValue;
}
}
}
8 changes: 6 additions & 2 deletions TestApp/Commands/StopCommand.cs
Original file line number Diff line number Diff line change
@@ -1,13 +1,17 @@
using GoCommando;
using System;
using GoCommando;

namespace TestApp.Commands
{
[Command("stop")]
public class StopCommand : ICommand
{
[Parameter("bimse", defaultValue: "default_value")]
public string Bimse { get; set; }

public void Run()
{

Console.WriteLine("BIMSE: {0}", Bimse);
}
}
}

0 comments on commit c92ed74

Please sign in to comment.