Hi John,
Here is my code that I have, this is the first method I attemepted since
this is one of the interesting logic. I thought I post my code for you
to review as well. This passed most of the test as well[
{
returnString = path;
}
[
{
}
[
{RubyMethod(“basename”,
RubyMethodAttributes.PublicSingleton)]publicstaticMutableStringBasename(CodeContext/!/context,
object/!/self, [NotNull]MutableString/!/path)MutableString[] tokens
= path.Split(@“/”.ToCharArray(), Int32.MaxValue,
StringSplitOptions.RemoveEmptyEntries);MutableStringreturnString =
(tokens.GetLength(0) > 0) ? tokens[tokens.GetLength(0) - 1] : path;
if((tokens.GetLength(0) > 0) &&
(returnString.GetChar(returnString.Length -
1).Equals(‘:’)))returnreturnString;RubyMethod(“basename”,
RubyMethodAttributes.PublicSingleton)]publicstaticMutableStringBasename(CodeContext/!/context,
object/!/self, object/!/path)returnBasename(context, self,
Protocols.CastToString(context, path));RubyMethod(“basename”,
RubyMethodAttributes.PublicSingleton)]publicstaticMutableStringBasename(CodeContext/!/context,
object/!/self, [NotNull]MutableString/!/path,
[NotNull]MutableString/!/filter)MutableStringfilename =
Basename(context, self,
path);//Treat ? speciallyif(filter.IndexOf(‘?’) >=
0)returnfilename;//Treat .* and exetions specially using regex{
filter.Clear();
filter.Append(
}if(filter.Equals(MutableString.Create(“.“)))@”(?x)(.[^.]$|$)”);else{
filter.Append(
}
System.Text.RegularExpressions.
filename.Replace(mat.Index, mat.Length,
}
[
{
}
Let me know what do you think? Yes, I found some problems with test spec
as well, (bar.txt should be baz)
Thanks.“$”);RubyRegexreg = newRubyRegex(filter,
System.Text.RegularExpressions.RegexOptions.Singleline);Matchmat =
reg.Match(filename);if(mat.Success)MutableString.Create(“”));returnfilename;RubyMethod(“basename”,
RubyMethodAttributes.PublicSingleton)]publicstaticMutableStringBasename(CodeContext/!/context,
object/!/self, object/!/path,
object/!/filter)returnBasename(context, self,
Protocols.CastToString(context, path), Protocols.CastToString(context,
filter));
----- Original Message ----
From: John L. (IRONRUBY) [email protected]
To: “[email protected]” [email protected]
Sent: Saturday, May 10, 2008 3:25:16 PM
Subject: Re: [Ironruby-core] RubyForge bug fixes
Unnikrishnan N.:
Quick question, are these following assertions are correct?
  should_raise(TypeError){ File.basename(1) }
  should_raise(TypeError){ File.basename(“bar.txt”, 1) }
  should_raise(TypeError){ File.basename(true) }
Yes they are. You can easily verify this in MRI yourself.
In first and third cases, it hits the overload that accepts a nullable
object as the first parameter. The TypeError is raised via
Protocols.CastToString().
In the second case, it also hits an overload that accepts a nullable
object as its second parameter, which raises TypeError via
Protocols.CastToString().
FYI, this is the implementation of #basename that I have in my
shelveset. It passes all of the (valid) specs - there are some
legitimate bugs in our old copy of the specs (I haven’t checked with the
latest version of the rubinius specs - I’ll do that next week). I’m a
bit worried about how I’m handling the special cases for Windows.
[RubyMethod(“basename”, RubyMethodAttributes.PublicSingleton)]
public static MutableString/!/ Basename(CodeContext/!/ context,
object/!/ self, [NotNull]MutableString/!/ path,
[NotNull]MutableString/!/ extensionFilter) {
  if (path.Length == 0)
    return path;
  MutableString trimmedPath = TrimTrailingSlashes(path);
  // Special cases of drive letters C:\ or C:/
  if (trimmedPath.Length == 2)
    if (Char.IsLetter(trimmedPath.GetChar(0)) &&
trimmedPath.GetChar(1) == ‘:’)
      return Kernel.FlowTaint(context, path, (path.Length > 2 ?
MutableString.Create(path.GetChar(2).ToString()) :
MutableString.Create(String.Empty)));
  string trimmedPathAsString = trimmedPath.ConvertToString();
  if (trimmedPathAsString == “/”)
    return trimmedPath;
  string filename =
System.IO.Path.GetFileName(trimmedPath.ConvertToString());
  // Handle UNC host names correctly
  string root =
System.IO.Path.GetPathRoot(trimmedPath.ConvertToString());
  if (extensionFilter.Length == 0)
    return trimmedPathAsString == root ? MutableString.Create(root)
: MutableString.Create(filename);
  string fileExtension = System.IO.Path.GetExtension(filename);
  string basename =
System.IO.Path.GetFileNameWithoutExtension(filename);
  string result = WildcardExtensionMatch(fileExtension,
extensionFilter.ConvertToString()) ? basename : filename;
  return Kernel.FlowTaint(context, self, (result.Equals(root) ?
MutableString.Create(root) : MutableString.Create(result)));
}
[RubyMethod(“basename”, RubyMethodAttributes.PublicSingleton)]
public static MutableString/!/ Basename(CodeContext/!/ context,
object/!/ self, [NotNull]MutableString/!/ path) {
  return Basename(context, self, path, MutableString.Empty);
}
[RubyMethod(“basename”, RubyMethodAttributes.PublicSingleton)]
public static MutableString/!/ Basename(CodeContext/!/ context,
object/!/ self, object path, object extension) {
  return Basename(context, self, Protocols.CastToString(context,
path), Protocols.CastToString(context, extension));
}
[RubyMethod(“basename”, RubyMethodAttributes.PublicSingleton)]
public static MutableString/!/ Basename(CodeContext/!/ context,
object/!/ self, object path) {
  return Basename(context, self, Protocols.CastToString(context,
path));
}
Also, in the basename_spec the test setup has wrong parameter on
File.open(@name, ‘w+’), if I change it to ‘w’, the test runs fine
otherwise none of the test works.
This is correct. There is a bug in how we map the semantics of ‘w+’ to
.NET IO. It’s fixed in my shelveset.
Thanks,
-John