We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
Allow the installer to go pro after the user has already installed!
**Describe the bug**
A clear and concise description of what the bug is.

**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error

Please include the relevant dataset if the bug you encountered is dataset specific. Make sure to anonymize the data properly.

**Expected behavior**
A clear and concise description of what you expected to happen.

**Screenshots**
If applicable, add screenshots to help explain your problem.

**Desktop (please complete the following information):**
 - OS: [e.g. Windows 11]
 - Browser [e.g. Chrome, Firefox]
 - Mito Version [e.g. 0.3.331] (you can find this with `pip list`)

**Additional context**
Add any other context about the problem here.


--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `mitoinstaller/mitoinstaller/user_install.py`
Content:
```
1 import json
2 import os
3 from typing import Optional
4 import uuid
5 from copy import deepcopy
6 
7 from mitoinstaller import __version__
8 
9 # Where all global .mito files are stored
10 MITO_FOLDER = os.path.join(os.path.expanduser("~"), '.mito')
11 
12 # The path of the user.json file, which notably is the same
13 # path as the USER_JSON_PATH in mitosheet
14 USER_JSON_PATH = os.path.join(MITO_FOLDER, 'user.json')
15 
16 def get_random_id() -> str:
17     """
18     Creates a new random ID for the user, which for any given user,
19     should only happen once.
20     """
21     return str(uuid.uuid1())
22 
23 def is_running_test() -> bool:
24     """
25     A helper function that quickly returns if the current code is running inside 
26     of a test, which is useful for making sure we don't generate tons of logs 
27     """
28     running_pytests = "PYTEST_CURRENT_TEST" in os.environ
29     running_ci = 'CI' in os.environ and os.environ['CI'] is not None
30 
31     return running_pytests or running_ci
32 
33 
34 # NOTE: the installer only creates the static id for the user, and
35 # otherwise does nothing with the user_json file. This makes sure
36 # we keep the dependencies as simple as possible with this file. 
37 # We also add the telemetry, which we turn off if the user has a 
38 # pro subscription.
39 # NOTE: if you delete a field from this, you need to update the 
40 # user_json_is_installer_default to handle this properly
41 USER_JSON_DEFAULT = {
42     'static_user_id': get_random_id() if not is_running_test() else 'github_action',
43     'mitosheet_telemetry': True,
44     'mitosheet_pro': False,
45 }
46 
47 def try_create_user_json_file(is_pro: bool=False) -> None:
48     # Create the mito folder if it does not exist
49     if not os.path.exists(MITO_FOLDER):
50         os.mkdir(MITO_FOLDER)
51         
52     # We only create a user.json file if it does not exist
53     if not os.path.exists(USER_JSON_PATH):
54         with open(USER_JSON_PATH, 'w+') as f:
55             # And write the default object
56             default_user_json = deepcopy(USER_JSON_DEFAULT)
57             default_user_json['mitosheet_telemetry'] = not is_pro
58             default_user_json['mitosheet_pro'] = is_pro
59 
60             f.write(json.dumps(default_user_json))
61     else:
62         # Otherwise, we make sure to update the mitosheet_telemetry variable 
63         with open(USER_JSON_PATH, 'r') as f:
64             updated_user_json = json.loads(f.read())
65             updated_user_json['mitosheet_telemetry'] = not is_pro
66             updated_user_json['mitosheet_pro'] = is_pro      
67         with open(USER_JSON_PATH, 'w') as f:
68             f.write(json.dumps(updated_user_json))
69 
70 
71 def get_static_user_id() -> Optional[str]:
72     try:
73         with open(USER_JSON_PATH) as f:
74             return json.load(f)['static_user_id']
75     except: 
76         return None
77 
78 def get_mitosheet_telemetry() -> bool:
79     try:
80         with open(USER_JSON_PATH) as f:
81             return json.load(f)['mitosheet_telemetry']
82     except: 
83         return True
84 
85 def user_json_is_installer_default() -> bool:
86     """
87     Returns True if the user.json file is the installer default, 
88     and otherwise returns False. 
89 
90     This allows us to not call identify if we have already done
91     so in the mitosheet package (which would overwrite things
92     we don't want to).
93     """
94     try:
95         with open(USER_JSON_PATH) as f:
96             user_json_object = json.load(f)
97             return len(user_json_object) <= len(USER_JSON_DEFAULT)
98     except:
99         return False
100
```

Path: `mitoinstaller/mitoinstaller/installer_steps/initial_installer_steps.py`
Content:
```
1 import os
2 import sys
3 
4 from mitoinstaller import __version__
5 from mitoinstaller.commands import upgrade_mito_installer
6 from mitoinstaller.installer_steps.installer_step import InstallerStep
7 from mitoinstaller.log_utils import identify, log
8 from mitoinstaller.user_install import (USER_JSON_PATH,
9                                         try_create_user_json_file)
10 
11 
12 def initial_install_step_create_user():
13 
14     if not os.path.exists(USER_JSON_PATH):
15         try_create_user_json_file(is_pro=('--pro' in sys.argv))
16 
17     # Only try and log if we're not pro
18     if not ('--pro' in sys.argv):
19         identify()
20         log('install_started', {
21             'mitoinstaller_version': __version__
22         })
23 
24 
25 INITIAL_INSTALLER_STEPS = [
26     InstallerStep(
27         'Create mito user',
28         initial_install_step_create_user
29     ),
30     InstallerStep(
31         'Upgrade mitoinstaller',
32         upgrade_mito_installer,
33         optional=True
34     ),
35 ]
36
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/mitoinstaller/mitoinstaller/installer_steps/initial_installer_steps.py b/mitoinstaller/mitoinstaller/installer_steps/initial_installer_steps.py
--- a/mitoinstaller/mitoinstaller/installer_steps/initial_installer_steps.py
+++ b/mitoinstaller/mitoinstaller/installer_steps/initial_installer_steps.py
@@ -5,7 +5,7 @@
 from mitoinstaller.commands import upgrade_mito_installer
 from mitoinstaller.installer_steps.installer_step import InstallerStep
 from mitoinstaller.log_utils import identify, log
-from mitoinstaller.user_install import (USER_JSON_PATH,
+from mitoinstaller.user_install import (USER_JSON_PATH, go_pro,
                                         try_create_user_json_file)
 
 
@@ -14,13 +14,15 @@
     if not os.path.exists(USER_JSON_PATH):
         try_create_user_json_file(is_pro=('--pro' in sys.argv))
 
-    # Only try and log if we're not pro
     if not ('--pro' in sys.argv):
+        # Only try and log if we're not pro
         identify()
         log('install_started', {
             'mitoinstaller_version': __version__
         })
-
+    else:
+        # If the user is going pro, make sure they are set to pro
+        go_pro()
 
 INITIAL_INSTALLER_STEPS = [
     InstallerStep(
diff --git a/mitoinstaller/mitoinstaller/user_install.py b/mitoinstaller/mitoinstaller/user_install.py
--- a/mitoinstaller/mitoinstaller/user_install.py
+++ b/mitoinstaller/mitoinstaller/user_install.py
@@ -97,3 +97,12 @@
             return len(user_json_object) <= len(USER_JSON_DEFAULT)
     except:
         return False
+
+def go_pro() -> None:
+    with open(USER_JSON_PATH, 'r') as f:
+        updated_user_json = json.loads(f.read())
+        updated_user_json['mitosheet_telemetry'] = False
+        updated_user_json['mitosheet_pro'] = True
+    
+    with open(USER_JSON_PATH, 'w') as f:
+        f.write(json.dumps(updated_user_json))
\ No newline at end of file

{"golden_diff": "diff --git a/mitoinstaller/mitoinstaller/installer_steps/initial_installer_steps.py b/mitoinstaller/mitoinstaller/installer_steps/initial_installer_steps.py\n--- a/mitoinstaller/mitoinstaller/installer_steps/initial_installer_steps.py\n+++ b/mitoinstaller/mitoinstaller/installer_steps/initial_installer_steps.py\n@@ -5,7 +5,7 @@\n from mitoinstaller.commands import upgrade_mito_installer\n from mitoinstaller.installer_steps.installer_step import InstallerStep\n from mitoinstaller.log_utils import identify, log\n-from mitoinstaller.user_install import (USER_JSON_PATH,\n+from mitoinstaller.user_install import (USER_JSON_PATH, go_pro,\n                                         try_create_user_json_file)\n \n \n@@ -14,13 +14,15 @@\n     if not os.path.exists(USER_JSON_PATH):\n         try_create_user_json_file(is_pro=('--pro' in sys.argv))\n \n-    # Only try and log if we're not pro\n     if not ('--pro' in sys.argv):\n+        # Only try and log if we're not pro\n         identify()\n         log('install_started', {\n             'mitoinstaller_version': __version__\n         })\n-\n+    else:\n+        # If the user is going pro, make sure they are set to pro\n+        go_pro()\n \n INITIAL_INSTALLER_STEPS = [\n     InstallerStep(\ndiff --git a/mitoinstaller/mitoinstaller/user_install.py b/mitoinstaller/mitoinstaller/user_install.py\n--- a/mitoinstaller/mitoinstaller/user_install.py\n+++ b/mitoinstaller/mitoinstaller/user_install.py\n@@ -97,3 +97,12 @@\n             return len(user_json_object) <= len(USER_JSON_DEFAULT)\n     except:\n         return False\n+\n+def go_pro() -> None:\n+    with open(USER_JSON_PATH, 'r') as f:\n+        updated_user_json = json.loads(f.read())\n+        updated_user_json['mitosheet_telemetry'] = False\n+        updated_user_json['mitosheet_pro'] = True\n+    \n+    with open(USER_JSON_PATH, 'w') as f:\n+        f.write(json.dumps(updated_user_json))\n\\ No newline at end of file\n", "issue": "Allow the installer to go pro after the user has already installed!\n**Describe the bug**\r\nA clear and concise description of what the bug is.\r\n\r\n**To Reproduce**\r\nSteps to reproduce the behavior:\r\n1. Go to '...'\r\n2. Click on '....'\r\n3. Scroll down to '....'\r\n4. See error\r\n\r\nPlease include the relevant dataset if the bug you encountered is dataset specific. Make sure to anonymize the data properly.\r\n\r\n**Expected behavior**\r\nA clear and concise description of what you expected to happen.\r\n\r\n**Screenshots**\r\nIf applicable, add screenshots to help explain your problem.\r\n\r\n**Desktop (please complete the following information):**\r\n - OS: [e.g. Windows 11]\r\n - Browser [e.g. Chrome, Firefox]\r\n - Mito Version [e.g. 0.3.331] (you can find this with `pip list`)\r\n\r\n**Additional context**\r\nAdd any other context about the problem here.\r\n\n", "before_files": [{"content": "import json\nimport os\nfrom typing import Optional\nimport uuid\nfrom copy import deepcopy\n\nfrom mitoinstaller import __version__\n\n# Where all global .mito files are stored\nMITO_FOLDER = os.path.join(os.path.expanduser(\"~\"), '.mito')\n\n# The path of the user.json file, which notably is the same\n# path as the USER_JSON_PATH in mitosheet\nUSER_JSON_PATH = os.path.join(MITO_FOLDER, 'user.json')\n\ndef get_random_id() -> str:\n    \"\"\"\n    Creates a new random ID for the user, which for any given user,\n    should only happen once.\n    \"\"\"\n    return str(uuid.uuid1())\n\ndef is_running_test() -> bool:\n    \"\"\"\n    A helper function that quickly returns if the current code is running inside \n    of a test, which is useful for making sure we don't generate tons of logs \n    \"\"\"\n    running_pytests = \"PYTEST_CURRENT_TEST\" in os.environ\n    running_ci = 'CI' in os.environ and os.environ['CI'] is not None\n\n    return running_pytests or running_ci\n\n\n# NOTE: the installer only creates the static id for the user, and\n# otherwise does nothing with the user_json file. This makes sure\n# we keep the dependencies as simple as possible with this file. \n# We also add the telemetry, which we turn off if the user has a \n# pro subscription.\n# NOTE: if you delete a field from this, you need to update the \n# user_json_is_installer_default to handle this properly\nUSER_JSON_DEFAULT = {\n    'static_user_id': get_random_id() if not is_running_test() else 'github_action',\n    'mitosheet_telemetry': True,\n    'mitosheet_pro': False,\n}\n\ndef try_create_user_json_file(is_pro: bool=False) -> None:\n    # Create the mito folder if it does not exist\n    if not os.path.exists(MITO_FOLDER):\n        os.mkdir(MITO_FOLDER)\n        \n    # We only create a user.json file if it does not exist\n    if not os.path.exists(USER_JSON_PATH):\n        with open(USER_JSON_PATH, 'w+') as f:\n            # And write the default object\n            default_user_json = deepcopy(USER_JSON_DEFAULT)\n            default_user_json['mitosheet_telemetry'] = not is_pro\n            default_user_json['mitosheet_pro'] = is_pro\n\n            f.write(json.dumps(default_user_json))\n    else:\n        # Otherwise, we make sure to update the mitosheet_telemetry variable \n        with open(USER_JSON_PATH, 'r') as f:\n            updated_user_json = json.loads(f.read())\n            updated_user_json['mitosheet_telemetry'] = not is_pro\n            updated_user_json['mitosheet_pro'] = is_pro      \n        with open(USER_JSON_PATH, 'w') as f:\n            f.write(json.dumps(updated_user_json))\n\n\ndef get_static_user_id() -> Optional[str]:\n    try:\n        with open(USER_JSON_PATH) as f:\n            return json.load(f)['static_user_id']\n    except: \n        return None\n\ndef get_mitosheet_telemetry() -> bool:\n    try:\n        with open(USER_JSON_PATH) as f:\n            return json.load(f)['mitosheet_telemetry']\n    except: \n        return True\n\ndef user_json_is_installer_default() -> bool:\n    \"\"\"\n    Returns True if the user.json file is the installer default, \n    and otherwise returns False. \n\n    This allows us to not call identify if we have already done\n    so in the mitosheet package (which would overwrite things\n    we don't want to).\n    \"\"\"\n    try:\n        with open(USER_JSON_PATH) as f:\n            user_json_object = json.load(f)\n            return len(user_json_object) <= len(USER_JSON_DEFAULT)\n    except:\n        return False\n", "path": "mitoinstaller/mitoinstaller/user_install.py"}, {"content": "import os\nimport sys\n\nfrom mitoinstaller import __version__\nfrom mitoinstaller.commands import upgrade_mito_installer\nfrom mitoinstaller.installer_steps.installer_step import InstallerStep\nfrom mitoinstaller.log_utils import identify, log\nfrom mitoinstaller.user_install import (USER_JSON_PATH,\n                                        try_create_user_json_file)\n\n\ndef initial_install_step_create_user():\n\n    if not os.path.exists(USER_JSON_PATH):\n        try_create_user_json_file(is_pro=('--pro' in sys.argv))\n\n    # Only try and log if we're not pro\n    if not ('--pro' in sys.argv):\n        identify()\n        log('install_started', {\n            'mitoinstaller_version': __version__\n        })\n\n\nINITIAL_INSTALLER_STEPS = [\n    InstallerStep(\n        'Create mito user',\n        initial_install_step_create_user\n    ),\n    InstallerStep(\n        'Upgrade mitoinstaller',\n        upgrade_mito_installer,\n        optional=True\n    ),\n]\n", "path": "mitoinstaller/mitoinstaller/installer_steps/initial_installer_steps.py"}], "after_files": [{"content": "import json\nimport os\nfrom typing import Optional\nimport uuid\nfrom copy import deepcopy\n\nfrom mitoinstaller import __version__\n\n# Where all global .mito files are stored\nMITO_FOLDER = os.path.join(os.path.expanduser(\"~\"), '.mito')\n\n# The path of the user.json file, which notably is the same\n# path as the USER_JSON_PATH in mitosheet\nUSER_JSON_PATH = os.path.join(MITO_FOLDER, 'user.json')\n\ndef get_random_id() -> str:\n    \"\"\"\n    Creates a new random ID for the user, which for any given user,\n    should only happen once.\n    \"\"\"\n    return str(uuid.uuid1())\n\ndef is_running_test() -> bool:\n    \"\"\"\n    A helper function that quickly returns if the current code is running inside \n    of a test, which is useful for making sure we don't generate tons of logs \n    \"\"\"\n    running_pytests = \"PYTEST_CURRENT_TEST\" in os.environ\n    running_ci = 'CI' in os.environ and os.environ['CI'] is not None\n\n    return running_pytests or running_ci\n\n\n# NOTE: the installer only creates the static id for the user, and\n# otherwise does nothing with the user_json file. This makes sure\n# we keep the dependencies as simple as possible with this file. \n# We also add the telemetry, which we turn off if the user has a \n# pro subscription.\n# NOTE: if you delete a field from this, you need to update the \n# user_json_is_installer_default to handle this properly\nUSER_JSON_DEFAULT = {\n    'static_user_id': get_random_id() if not is_running_test() else 'github_action',\n    'mitosheet_telemetry': True,\n    'mitosheet_pro': False,\n}\n\ndef try_create_user_json_file(is_pro: bool=False) -> None:\n    # Create the mito folder if it does not exist\n    if not os.path.exists(MITO_FOLDER):\n        os.mkdir(MITO_FOLDER)\n        \n    # We only create a user.json file if it does not exist\n    if not os.path.exists(USER_JSON_PATH):\n        with open(USER_JSON_PATH, 'w+') as f:\n            # And write the default object\n            default_user_json = deepcopy(USER_JSON_DEFAULT)\n            default_user_json['mitosheet_telemetry'] = not is_pro\n            default_user_json['mitosheet_pro'] = is_pro\n\n            f.write(json.dumps(default_user_json))\n    else:\n        # Otherwise, we make sure to update the mitosheet_telemetry variable \n        with open(USER_JSON_PATH, 'r') as f:\n            updated_user_json = json.loads(f.read())\n            updated_user_json['mitosheet_telemetry'] = not is_pro\n            updated_user_json['mitosheet_pro'] = is_pro      \n        with open(USER_JSON_PATH, 'w') as f:\n            f.write(json.dumps(updated_user_json))\n\n\ndef get_static_user_id() -> Optional[str]:\n    try:\n        with open(USER_JSON_PATH) as f:\n            return json.load(f)['static_user_id']\n    except: \n        return None\n\ndef get_mitosheet_telemetry() -> bool:\n    try:\n        with open(USER_JSON_PATH) as f:\n            return json.load(f)['mitosheet_telemetry']\n    except: \n        return True\n\ndef user_json_is_installer_default() -> bool:\n    \"\"\"\n    Returns True if the user.json file is the installer default, \n    and otherwise returns False. \n\n    This allows us to not call identify if we have already done\n    so in the mitosheet package (which would overwrite things\n    we don't want to).\n    \"\"\"\n    try:\n        with open(USER_JSON_PATH) as f:\n            user_json_object = json.load(f)\n            return len(user_json_object) <= len(USER_JSON_DEFAULT)\n    except:\n        return False\n\ndef go_pro() -> None:\n    with open(USER_JSON_PATH, 'r') as f:\n        updated_user_json = json.loads(f.read())\n        updated_user_json['mitosheet_telemetry'] = False\n        updated_user_json['mitosheet_pro'] = True\n    \n    with open(USER_JSON_PATH, 'w') as f:\n        f.write(json.dumps(updated_user_json))", "path": "mitoinstaller/mitoinstaller/user_install.py"}, {"content": "import os\nimport sys\n\nfrom mitoinstaller import __version__\nfrom mitoinstaller.commands import upgrade_mito_installer\nfrom mitoinstaller.installer_steps.installer_step import InstallerStep\nfrom mitoinstaller.log_utils import identify, log\nfrom mitoinstaller.user_install import (USER_JSON_PATH, go_pro,\n                                        try_create_user_json_file)\n\n\ndef initial_install_step_create_user():\n\n    if not os.path.exists(USER_JSON_PATH):\n        try_create_user_json_file(is_pro=('--pro' in sys.argv))\n\n    if not ('--pro' in sys.argv):\n        # Only try and log if we're not pro\n        identify()\n        log('install_started', {\n            'mitoinstaller_version': __version__\n        })\n    else:\n        # If the user is going pro, make sure they are set to pro\n        go_pro()\n\nINITIAL_INSTALLER_STEPS = [\n    InstallerStep(\n        'Create mito user',\n        initial_install_step_create_user\n    ),\n    InstallerStep(\n        'Upgrade mitoinstaller',\n        upgrade_mito_installer,\n        optional=True\n    ),\n]\n", "path": "mitoinstaller/mitoinstaller/installer_steps/initial_installer_steps.py"}]}