Implement a Python 2 compatible isalpha function for Skylark strings.

--
MOS_MIGRATED_REVID=102263878
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/MethodLibrary.java b/src/main/java/com/google/devtools/build/lib/syntax/MethodLibrary.java
index ef958d3..996ae41 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/MethodLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/MethodLibrary.java
@@ -541,6 +541,28 @@
     }
   };
 
+  @SkylarkSignature(name = "isalpha", objectType = StringModule.class, returnType = Boolean.class,
+    doc = "Returns True if all characters in the string are alphabetic ([a-zA-Z]) and it "
+        + "contains at least one character.",
+    mandatoryPositionals = {
+        @Param(name = "self", type = String.class, doc = "This string.")})
+  private static BuiltinFunction isalpha = new BuiltinFunction("isalpha") {
+    public Boolean invoke(String self) throws EvalException {
+      int length = self.length();
+      if (length < 1) {
+        return false;
+      }
+      for (int index = 0; index < length; index++) {
+        char character = self.charAt(index);
+        if (!((character >= 'A' && character <= 'Z')
+            || (character >= 'a' && character <= 'z'))) {
+          return false;
+        }
+      }
+      return true;
+    }
+  };
+
   @SkylarkSignature(name = "count", objectType = StringModule.class, returnType = Integer.class,
       doc = "Returns the number of (non-overlapping) occurrences of substring <code>sub</code> in "
           + "string, optionally restricting to [<code>start</code>:<code>end</code>], "
@@ -1091,7 +1113,7 @@
       }
     }
   };
-  
+
   @SkylarkSignature(name = "dict", returnType = Map.class,
       doc =
       "Creates a <a href=\"#modules.dict\">dictionary</a> from an optional positional "
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/MethodLibraryTest.java b/src/test/java/com/google/devtools/build/lib/syntax/MethodLibraryTest.java
index 309b97b..60536e3 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/MethodLibraryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/MethodLibraryTest.java
@@ -1035,4 +1035,15 @@
     new SkylarkTest()  // because of set
         .testStatement("str(zip([1], set([2])))", "[(1, 2)]");
   }
+
+  @Test
+  public void testIsAlphaFunction() throws Exception {
+    new BothModesTest()
+        .testStatement("''.isalpha()", false)
+        .testStatement("'abz'.isalpha()", true)
+        .testStatement("'a1'.isalpha()", false)
+        .testStatement("'a '.isalpha()", false)
+        .testStatement("'A'.isalpha()", true)
+        .testStatement("'AbZ'.isalpha()", true);
+  }
 }