Have query_yes_no return boolean
authorgfyoung <redacted>
Sun, 14 May 2017 04:09:36 +0000 (00:09 -0400)
committergfyoung <redacted>
Sun, 14 May 2017 04:15:58 +0000 (00:15 -0400)
Bugs have been found where we assumed
that query_yes_no returned True/False.
Not only is it easier to check booleans
instead of strings, but it also looks
a lot cleaner in the code.

updateHostsFile.py

index 2c6444fd2f6cc44c6968e5f53e1e140be1920784..0564345558cdabb5b125ec4ec9d9ef49ffb081fb 100644 (file)
@@ -157,6 +157,7 @@ def main():
 
     promptForMove(finalFile)
 
+
 # Prompt the User
 def promptForUpdate():
     # Create hosts file if it doesn't exists
@@ -164,30 +165,34 @@ def promptForUpdate():
         try:
             open(os.path.join(BASEDIR_PATH, "hosts"), "w+").close()
         except:
-            printFailure("ERROR: No 'hosts' file in the folder, try creating one manually")
+            printFailure("ERROR: No 'hosts' file in the folder,"
+                         "try creating one manually")
 
     if not settings["freshen"]:
         return
 
-    response = "yes" if settings["auto"] else query_yes_no("Do you want to update all data sources?")
-    if response == "yes":
+    prompt = "Do you want to update all data sources?"
+    if settings["auto"] or query_yes_no(prompt):
         updateAllSources()
-    else:
-        if not settings["auto"]:
-            print ("OK, we'll stick with what we've  got locally.")
+    elif not settings["auto"]:
+        print("OK, we'll stick with what we've  got locally.")
+
 
 def promptForExclusions():
-    response = "no" if settings["auto"] else query_yes_no("Do you want to exclude any domains?\n" +
-                            "For example, hulu.com video streaming must be able to access " +
-                            "its tracking and ad servers in order to play video.")
-    if response == "yes":
-        displayExclusionOptions()
-    else:
-        if not settings["auto"]:
-            print ("OK, we'll only exclude domains in the whitelist.")
+    prompt = ("Do you want to exclude any domains?\n"
+              "For example, hulu.com video streaming must be able to access "
+              "its tracking and ad servers in order to play video.")
+
+    if not settings["auto"]:
+        if query_yes_no(prompt):
+            displayExclusionOptions()
+        else:
+            print("OK, we'll only exclude domains in the whitelist.")
 
-def promptForMoreCustomExclusions(question="Do you have more domains you want to enter?"):
-    return query_yes_no(question) == "yes"
+
+def promptForMoreCustomExclusions(question="Do you have more domains "
+                                           "you want to enter?"):
+    return query_yes_no(question)
 
 
 def promptForFlushDnsCache():
@@ -195,38 +200,42 @@ def promptForFlushDnsCache():
         flushDnsCache()
 
     if not settings["auto"]:
-        response = query_yes_no("Attempt to flush the DNS cache?")
-
-        if response == "yes":
+        if query_yes_no("Attempt to flush the DNS cache?"):
             flushDnsCache()
 
 
 def promptForMove(finalFile):
-
     if settings["replace"] and not settings["skipstatichosts"]:
-        response = "yes"
+        move_file = True
+    elif settings["auto"] or settings["skipstatichosts"]:
+        move_file = False
     else:
-        response = "no" if settings["auto"] or settings["skipstatichosts"] else query_yes_no("Do you want to replace your existing hosts file " +
-                            "with the newly generated file?")
-    if response == "yes":
+        prompt = ("Do you want to replace your existing hosts file " +
+                  "with the newly generated file?")
+        move_file = query_yes_no(prompt)
+
+    if move_file:
         moveHostsFileIntoPlace(finalFile)
         promptForFlushDnsCache()
     else:
         return False
 # End Prompt the User
 
+
 # Exclusion logic
 def displayExclusionOptions():
     for exclusionOption in settings["commonexclusions"]:
-        response = query_yes_no("Do you want to exclude the domain " + exclusionOption + " ?")
-        if response == "yes":
+        prompt = "Do you want to exclude the domain " + exclusionOption + " ?"
+
+        if query_yes_no(prompt):
             excludeDomain(exclusionOption)
         else:
             continue
-    response = query_yes_no("Do you want to exclude any other domains?")
-    if response == "yes":
+
+    if query_yes_no("Do you want to exclude any other domains?"):
         gatherCustomExclusions()
 
+
 def gatherCustomExclusions():
     while True:
         # Cross-python Input
@@ -504,40 +513,59 @@ def removeOldHostsFile():               # hotfix since merging with an already e
     os.remove(oldFilePath)
     open(oldFilePath, "a").close()        # create new empty hostsfile
 
+
 # End File Logic
 
 # Helper Functions
-## {{{ http://code.activestate.com/recipes/577058/ (r2)
-def query_yes_no(question, default = "yes"):
-    """Ask a yes/no question via raw_input() and return their answer.
+def query_yes_no(question, default="yes"):
+    """
+    Ask a yes/no question via raw_input() and get answer from the user.
 
-    "question" is a string that is presented to the user.
-    "default" is the presumed answer if the user just hits <Enter>.
-        It must be "yes" (the default), "no" or None (meaning
-        an answer is required of the user).
+    Inspired by the following implementation:
 
-    The "answer" return value is one of "yes" or "no".
+    http://code.activestate.com/recipes/577058
+
+    Parameters
+    ----------
+    question : str
+        The question presented to the user.
+    default : str, default "yes"
+        The presumed answer if the user just hits <Enter>. It must be "yes",
+        "no", or None (means an answer is required of the user).
+
+    Returns
+    -------
+    yes : Whether or not the user replied yes to the question.
     """
-    valid = {"yes":"yes", "y":"yes", "ye":"yes",
-             "no":"no", "n":"no"}
+
+    valid = {"yes": "yes", "y": "yes", "ye": "yes",
+             "no": "no", "n": "no"}
     prompt = {None: " [y/n] ",
               "yes": " [Y/n] ",
               "no": " [y/N] "}.get(default, None)
+
     if not prompt:
         raise ValueError("invalid default answer: '%s'" % default)
 
-    while 1:
+    reply = None
+
+    while not reply:
         sys.stdout.write(colorize(question, colors.PROMPT) + prompt)
+
         # Changed to be cross-python
         choice = raw_input().lower()
+        reply = None
+
         if default and not choice:
-            return default
+            reply = default
         elif choice in valid:
-            return valid[choice]
+            reply = valid[choice]
         else:
-            printFailure(
-                "Please respond with 'yes' or 'no' (or 'y' or 'n').\n")
-## end of http://code.activestate.com/recipes/577058/ }}}
+            printFailure("Please respond with 'yes' or 'no' "
+                         "(or 'y' or 'n').\n")
+
+    return reply == "yes"
+
 
 def isValidDomainFormat(domain):
     if domain == "":
git clone https://git.99rst.org/PROJECT