prompt: You will be provided with a partial code base and an issue statement explaining a problem to resolve.
  <issue>
  Dev docs: globalVars.appDir is not defined when attempting to build docs with Sphinx
  Hi,
  Related to #11970 and actually blocks it:
  
  ### Steps to reproduce:
  When trying to build dev docs using "scons devDocs":
  
  1. Run scons devDocs.
  2. Once Sphinx is instlaled and ready, Sphinx will try to build dev docs for the source code.
  
  ### Actual behavior:
  A traceback shows up, ending with:
  AttributeError: module 'globalVars' has no attribute 'appDir'
  
  ### Expected behavior:
  No errors with the dev docs building completing.
  
  ### System configuration
  #### NVDA installed/portable/running from source:
  Source
  
  #### NVDA version:
  Alpha-21561,7e5ffde2391c
  
  #### Windows version:
  Windows 10 Version 20H2 (build 19042.685)
  
  #### Name and version of other software in use when reproducing the issue:
  Python 3.7.9
  
  #### Other information about your system:
  N/A
  
  ### Other questions
  #### Does the issue still occur after restarting your computer?
  Yes
  
  #### Have you tried any other versions of NVDA? If so, please report their behaviors.
  Not applicable
  
  #### If addons are disabled, is your problem still occurring?
  Not applicable
  
  #### Did you try to run the COM registry fixing tool in NVDA menu / tools?
  Not applicable
  
  ### Cause:
  This is caused by config file error, specifically when a mock config.conf instance is created. Prior to this, importing config module fails because globalVars.appDir is not defined by the time scons devDocs is run.
  
  ### Solution:
  one solution is to define globalVars.appDir to point to the source directory.
  
  Thanks.
  
  </issue>
  <code>
  [start of devDocs/conf.py]
  1 # A part of NonVisual Desktop Access (NVDA)
  2 # Copyright (C) 2019 NV Access Limited, Leonard de Ruijter
  3 # This file is covered by the GNU General Public License.
  4 # See the file COPYING for more details.
  5 
  6 # Configuration file for the Sphinx documentation builder.
  7 
  8 # -- Path setup --------------------------------------------------------------
  9 
  10 import os
  11 import sys
  12 sys.path.insert(0, os.path.abspath('../source'))
  13 import sourceEnv  # noqa: F401, E402
  14 
  15 # Initialize languageHandler so that sphinx is able to deal with translatable strings.
  16 import languageHandler  # noqa: E402
  17 languageHandler.setLanguage("en")
  18 
  19 # Initialize globalvars.appArgs to something sensible.
  20 import globalVars  # noqa: E402
  21 
  22 
  23 class AppArgs:
  24 	# Set an empty comnfig path
  25 	# This is never used as we don't initialize config, but some modules expect this to be set.
  26 	configPath = ""
  27 	secure = False
  28 	disableAddons = True
  29 	launcher = False
  30 
  31 
  32 globalVars.appArgs = AppArgs()
  33 
  34 # Import NVDA's versionInfo module.
  35 import versionInfo  # noqa: E402
  36 # Set a suitable updateVersionType for the updateCheck module to be imported
  37 versionInfo.updateVersionType = "stable"
  38 
  39 # -- Project information -----------------------------------------------------
  40 
  41 project = versionInfo.name
  42 copyright = versionInfo.copyright
  43 author = versionInfo.publisher
  44 
  45 # The major project version
  46 version = versionInfo.formatVersionForGUI(
  47 	versionInfo.version_year,
  48 	versionInfo.version_major,
  49 	versionInfo.version_minor
  50 )
  51 
  52 # The full version, including alpha/beta/rc tags
  53 release = versionInfo.version
  54 
  55 # -- General configuration ---------------------------------------------------
  56 
  57 default_role = 'py:obj'
  58 
  59 # Add any Sphinx extension module names here, as strings. They can be
  60 # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
  61 # ones.
  62 extensions = [
  63 	'sphinx.ext.autodoc',
  64 ]
  65 
  66 # Add any paths that contain templates here, relative to this directory.
  67 templates_path = ['_templates']
  68 
  69 # List of patterns, relative to source directory, that match files and
  70 # directories to ignore when looking for source files.
  71 # This pattern also affects html_static_path and html_extra_path.
  72 exclude_patterns = [
  73 	"_build"
  74 ]
  75 
  76 
  77 # -- Options for HTML output -------------------------------------------------
  78 
  79 # The theme to use for HTML and HTML Help pages.
  80 
  81 html_theme = "sphinx_rtd_theme"
  82 
  83 # Add any paths that contain custom static files (such as style sheets) here,
  84 # relative to this directory. They are copied after the builtin static files,
  85 # so a file named "default.css" will overwrite the builtin "default.css".
  86 html_static_path = ['_static']
  87 
  88 # -- Extension configuration -------------------------------------------------
  89 
  90 # sphinx.ext.autodoc configuration
  91 
  92 # Both the class’ and the __init__ method’s docstring are concatenated and inserted.
  93 autoclass_content = "both"
  94 autodoc_member_order = 'bysource'
  95 autodoc_mock_imports = [
  96 	"louis",  # Not our project
  97 ]
  98 
  99 # Perform some manual mocking of specific objects.
  100 # autodoc can only mock modules, not objects.
  101 from sphinx.ext.autodoc.mock import _make_subclass  # noqa: E402
  102 
  103 import config  # noqa: E402
  104 # Mock an instance of the configuration manager.
  105 config.conf = _make_subclass("conf", "config")()
  106
  [end of devDocs/conf.py]
  </code>
  
  I need you to solve this issue by generating a single patch file that I can apply directly to this repository using git apply. Please respond with a single patch file in the following format.
  <patch>
  diff --git a/file.py b/file.py
  --- a/file.py
  +++ b/file.py
  @@ -1,27 +1,35 @@
   def euclidean(a, b):
  -    while b:
  -        a, b = b, a % b
  -    return a
  +    if b == 0:
  +        return a
  +    return euclidean(b, a % b)
   
   
   def bresenham(x0, y0, x1, y1):
       points = []
       dx = abs(x1 - x0)
       dy = abs(y1 - y0)
  -    sx = 1 if x0 < x1 else -1
  -    sy = 1 if y0 < y1 else -1
  -    err = dx - dy
  +    x, y = x0, y0
  +    sx = -1 if x0 > x1 else 1
  +    sy = -1 if y0 > y1 else 1
   
  -    while True:
  -        points.append((x0, y0))
  -        if x0 == x1 and y0 == y1:
  -            break
  -        e2 = 2 * err
  -        if e2 > -dy:
  -            err -= dy
  -            x0 += sx
  -        if e2 < dx:
  -            err += dx
  -            y0 += sy
  +    if dx > dy:
  +        err = dx / 2.0
  +        while x != x1:
  +            points.append((x, y))
  +            err -= dy
  +            if err < 0:
  +                y += sy
  +                err += dx
  +            x += sx
  +    else:
  +        err = dy / 2.0
  +        while y != y1:
  +            points.append((x, y))
  +            err -= dx
  +            if err < 0:
  +                x += sx
  +                err += dy
  +            y += sy
  +
  +    points.append((x, y))
       return points
  
  </patch>
golden_diff: diff --git a/devDocs/conf.py b/devDocs/conf.py
  --- a/devDocs/conf.py
  +++ b/devDocs/conf.py
  @@ -1,5 +1,5 @@
   # A part of NonVisual Desktop Access (NVDA)
  -# Copyright (C) 2019 NV Access Limited, Leonard de Ruijter
  +# Copyright (C) 2019-2020 NV Access Limited, Leonard de Ruijter, Joseph Lee
   # This file is covered by the GNU General Public License.
   # See the file COPYING for more details.
   
  @@ -16,7 +16,7 @@
   import languageHandler  # noqa: E402
   languageHandler.setLanguage("en")
   
  -# Initialize globalvars.appArgs to something sensible.
  +# Initialize globalVars.appArgs to something sensible.
   import globalVars  # noqa: E402
   
   
  @@ -30,6 +30,11 @@
   
   
   globalVars.appArgs = AppArgs()
  +# #11971: NVDA is not running, therefore app dir is undefined.
  +# Therefore tell NVDA that apt source directory is app dir.
  +appDir = os.path.join("..", "source")
  +globalVars.appDir = os.path.abspath(appDir)
  +
   
   # Import NVDA's versionInfo module.
   import versionInfo  # noqa: E402
  
verification_info: {"golden_diff": "diff --git a/devDocs/conf.py b/devDocs/conf.py\n--- a/devDocs/conf.py\n+++ b/devDocs/conf.py\n@@ -1,5 +1,5 @@\n # A part of NonVisual Desktop Access (NVDA)\n-# Copyright (C) 2019 NV Access Limited, Leonard de Ruijter\n+# Copyright (C) 2019-2020 NV Access Limited, Leonard de Ruijter, Joseph Lee\n # This file is covered by the GNU General Public License.\n # See the file COPYING for more details.\n \n@@ -16,7 +16,7 @@\n import languageHandler  # noqa: E402\n languageHandler.setLanguage(\"en\")\n \n-# Initialize globalvars.appArgs to something sensible.\n+# Initialize globalVars.appArgs to something sensible.\n import globalVars  # noqa: E402\n \n \n@@ -30,6 +30,11 @@\n \n \n globalVars.appArgs = AppArgs()\n+# #11971: NVDA is not running, therefore app dir is undefined.\n+# Therefore tell NVDA that apt source directory is app dir.\n+appDir = os.path.join(\"..\", \"source\")\n+globalVars.appDir = os.path.abspath(appDir)\n+\n \n # Import NVDA's versionInfo module.\n import versionInfo  # noqa: E402\n", "issue": "Dev docs: globalVars.appDir is not defined when attempting to build docs with Sphinx\nHi,\r\nRelated to #11970 and actually blocks it:\r\n\r\n### Steps to reproduce:\r\nWhen trying to build dev docs using \"scons devDocs\":\r\n\r\n1. Run scons devDocs.\r\n2. Once Sphinx is instlaled and ready, Sphinx will try to build dev docs for the source code.\r\n\r\n### Actual behavior:\r\nA traceback shows up, ending with:\r\nAttributeError: module 'globalVars' has no attribute 'appDir'\r\n\r\n### Expected behavior:\r\nNo errors with the dev docs building completing.\r\n\r\n### System configuration\r\n#### NVDA installed/portable/running from source:\r\nSource\r\n\r\n#### NVDA version:\r\nAlpha-21561,7e5ffde2391c\r\n\r\n#### Windows version:\r\nWindows 10 Version 20H2 (build 19042.685)\r\n\r\n#### Name and version of other software in use when reproducing the issue:\r\nPython 3.7.9\r\n\r\n#### Other information about your system:\r\nN/A\r\n\r\n### Other questions\r\n#### Does the issue still occur after restarting your computer?\r\nYes\r\n\r\n#### Have you tried any other versions of NVDA? If so, please report their behaviors.\r\nNot applicable\r\n\r\n#### If addons are disabled, is your problem still occurring?\r\nNot applicable\r\n\r\n#### Did you try to run the COM registry fixing tool in NVDA menu / tools?\r\nNot applicable\r\n\r\n### Cause:\r\nThis is caused by config file error, specifically when a mock config.conf instance is created. Prior to this, importing config module fails because globalVars.appDir is not defined by the time scons devDocs is run.\r\n\r\n### Solution:\r\none solution is to define globalVars.appDir to point to the source directory.\r\n\r\nThanks.\n", "before_files": [{"content": "# A part of NonVisual Desktop Access (NVDA)\n# Copyright (C) 2019 NV Access Limited, Leonard de Ruijter\n# This file is covered by the GNU General Public License.\n# See the file COPYING for more details.\n\n# Configuration file for the Sphinx documentation builder.\n\n# -- Path setup --------------------------------------------------------------\n\nimport os\nimport sys\nsys.path.insert(0, os.path.abspath('../source'))\nimport sourceEnv  # noqa: F401, E402\n\n# Initialize languageHandler so that sphinx is able to deal with translatable strings.\nimport languageHandler  # noqa: E402\nlanguageHandler.setLanguage(\"en\")\n\n# Initialize globalvars.appArgs to something sensible.\nimport globalVars  # noqa: E402\n\n\nclass AppArgs:\n\t# Set an empty comnfig path\n\t# This is never used as we don't initialize config, but some modules expect this to be set.\n\tconfigPath = \"\"\n\tsecure = False\n\tdisableAddons = True\n\tlauncher = False\n\n\nglobalVars.appArgs = AppArgs()\n\n# Import NVDA's versionInfo module.\nimport versionInfo  # noqa: E402\n# Set a suitable updateVersionType for the updateCheck module to be imported\nversionInfo.updateVersionType = \"stable\"\n\n# -- Project information -----------------------------------------------------\n\nproject = versionInfo.name\ncopyright = versionInfo.copyright\nauthor = versionInfo.publisher\n\n# The major project version\nversion = versionInfo.formatVersionForGUI(\n\tversionInfo.version_year,\n\tversionInfo.version_major,\n\tversionInfo.version_minor\n)\n\n# The full version, including alpha/beta/rc tags\nrelease = versionInfo.version\n\n# -- General configuration ---------------------------------------------------\n\ndefault_role = 'py:obj'\n\n# Add any Sphinx extension module names here, as strings. They can be\n# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom\n# ones.\nextensions = [\n\t'sphinx.ext.autodoc',\n]\n\n# Add any paths that contain templates here, relative to this directory.\ntemplates_path = ['_templates']\n\n# List of patterns, relative to source directory, that match files and\n# directories to ignore when looking for source files.\n# This pattern also affects html_static_path and html_extra_path.\nexclude_patterns = [\n\t\"_build\"\n]\n\n\n# -- Options for HTML output -------------------------------------------------\n\n# The theme to use for HTML and HTML Help pages.\n\nhtml_theme = \"sphinx_rtd_theme\"\n\n# Add any paths that contain custom static files (such as style sheets) here,\n# relative to this directory. They are copied after the builtin static files,\n# so a file named \"default.css\" will overwrite the builtin \"default.css\".\nhtml_static_path = ['_static']\n\n# -- Extension configuration -------------------------------------------------\n\n# sphinx.ext.autodoc configuration\n\n# Both the class\u2019 and the __init__ method\u2019s docstring are concatenated and inserted.\nautoclass_content = \"both\"\nautodoc_member_order = 'bysource'\nautodoc_mock_imports = [\n\t\"louis\",  # Not our project\n]\n\n# Perform some manual mocking of specific objects.\n# autodoc can only mock modules, not objects.\nfrom sphinx.ext.autodoc.mock import _make_subclass  # noqa: E402\n\nimport config  # noqa: E402\n# Mock an instance of the configuration manager.\nconfig.conf = _make_subclass(\"conf\", \"config\")()\n", "path": "devDocs/conf.py"}]}