Skip to content

Commit

Permalink
Implement venv check during installation
Browse files Browse the repository at this point in the history
Use the right prefix for installation without assumptions
Add verbose functionality for commandline
  • Loading branch information
dormant-user committed Jun 14, 2024
1 parent f5aaaa5 commit ec7d60c
Show file tree
Hide file tree
Showing 7 changed files with 86 additions and 26 deletions.
2 changes: 1 addition & 1 deletion .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ repos:
args: [ --max-line-length=120, --extend-ignore=SFS3 D107 SFS301 D100 D104 D401 SFS101 SFS201 D412 ]

- repo: https://github.com/PyCQA/isort
rev: 5.12.0
rev: 5.13.2
hooks:
- id: isort
args: [ --profile, black ]
Expand Down
8 changes: 6 additions & 2 deletions docs/genindex.html
Original file line number Diff line number Diff line change
Expand Up @@ -384,10 +384,10 @@ <h2 id="C">C</h2>
</li>
<li><a href="index.html#jarvis.api.triggers.stock_monitor.StockMonitor.closest_maximum">closest_maximum() (jarvis.api.triggers.stock_monitor.StockMonitor static method)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="index.html#jarvis.api.triggers.stock_monitor.StockMonitor.closest_minimum">closest_minimum() (jarvis.api.triggers.stock_monitor.StockMonitor static method)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
<li><a href="index.html#jarvis.modules.models.classes.Indicators.coin">coin (jarvis.modules.models.classes.Indicators attribute)</a>
</li>
<li><a href="index.html#jarvis.modules.utils.util.comma_separator">comma_separator() (in module jarvis.modules.utils.util)</a>
Expand All @@ -403,6 +403,8 @@ <h2 id="C">C</h2>
<li><a href="index.html#jarvis.modules.models.classes.FileIO.conditions">conditions (jarvis.modules.models.classes.FileIO attribute)</a>
</li>
<li><a href="index.html#jarvis.executors.conditions.conditions">conditions() (in module jarvis.executors.conditions)</a>
</li>
<li><a href="index.html#jarvis.lib.installer.confirmation_prompt">confirmation_prompt() (in module jarvis.lib.installer)</a>
</li>
<li><a href="index.html#jarvis.modules.utils.support.connected_to_network">connected_to_network() (in module jarvis.modules.utils.support)</a>
</li>
Expand Down Expand Up @@ -3359,6 +3361,8 @@ <h2 id="U">U</h2>
<li><a href="index.html#jarvis.modules.utils.support.unrecognized_dumper">unrecognized_dumper() (in module jarvis.modules.utils.support)</a>
</li>
<li><a href="index.html#jarvis.lib.installer.unsupported_arch">unsupported_arch() (in module jarvis.lib.installer)</a>
</li>
<li><a href="index.html#jarvis.lib.installer.unsupported_env">unsupported_env() (in module jarvis.lib.installer)</a>
</li>
<li><a href="index.html#jarvis.modules.utils.support.unsupported_features">unsupported_features() (in module jarvis.modules.utils.support)</a>
</li>
Expand Down
12 changes: 12 additions & 0 deletions docs/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,12 @@ <h1>Jarvis - Voice-Activated Natural Language UI<a class="headerlink" href="#jar
</dl>
</dd></dl>

<dl class="py function">
<dt class="sig sig-object py" id="jarvis.lib.installer.confirmation_prompt">
<span class="sig-prename descclassname"><span class="pre">jarvis.lib.installer.</span></span><span class="sig-name descname"><span class="pre">confirmation_prompt</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#jarvis.lib.installer.confirmation_prompt" title="Permalink to this definition">¶</a></dt>
<dd><p>Prompts a confirmation from the user to continue or exit.</p>
</dd></dl>

<dl class="py class">
<dt class="sig sig-object py" id="jarvis.lib.installer.Env">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">jarvis.lib.installer.</span></span><span class="sig-name descname"><span class="pre">Env</span></span><a class="headerlink" href="#jarvis.lib.installer.Env" title="Permalink to this definition">¶</a></dt>
Expand Down Expand Up @@ -177,6 +183,12 @@ <h1>Jarvis - Voice-Activated Natural Language UI<a class="headerlink" href="#jar
</dl>
</dd></dl>

<dl class="py function">
<dt class="sig sig-object py" id="jarvis.lib.installer.unsupported_env">
<span class="sig-prename descclassname"><span class="pre">jarvis.lib.installer.</span></span><span class="sig-name descname"><span class="pre">unsupported_env</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span> <span class="sig-return"><span class="sig-return-icon">&#x2192;</span> <span class="sig-return-typehint"><span class="pre">None</span></span></span><a class="headerlink" href="#jarvis.lib.installer.unsupported_env" title="Permalink to this definition">¶</a></dt>
<dd><p>Function to handle installations that are NOT on virtual environments.</p>
</dd></dl>

<dl class="py class">
<dt class="sig sig-object py" id="jarvis.lib.installer.Requirements">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">jarvis.lib.installer.</span></span><span class="sig-name descname"><span class="pre">Requirements</span></span><a class="headerlink" href="#jarvis.lib.installer.Requirements" title="Permalink to this definition">¶</a></dt>
Expand Down
Binary file modified docs/objects.inv
Binary file not shown.
2 changes: 1 addition & 1 deletion docs/searchindex.js

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions jarvis/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ def commandline() -> None:
case "dev-uninstall" | "dev-cleanup":
installer.dev_uninstall()
case "start" | "run":
os.environ["debug"] = str(os.environ.get("JARVIS_VERBOSITY", "-1") == "1")
init = __preflight_check__()
init()
case "version" | "-v" | "-V" | "--version":
Expand Down
87 changes: 65 additions & 22 deletions jarvis/lib/installer.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,10 @@
logger = logging.getLogger(__name__)
logger.addHandler(logging.StreamHandler())
logger.setLevel(logging.DEBUG)
if os.environ.get("JARVIS_VERBOSITY", "-1") == "1":
verbose = " --verbose"
else:
verbose = ""


def pretext() -> str:
Expand Down Expand Up @@ -66,6 +70,16 @@ def get_arch() -> str | NoReturn:
return architecture


def confirmation_prompt() -> None:
"""Prompts a confirmation from the user to continue or exit."""
prompt = input("Are you sure you want to continue? <Y/N> ")
if not re.match(r"^[yY](es)?$", prompt):
logger.info(pretext())
logger.info("Bye. Hope to see you soon.")
logger.info(pretext())
exit(0)


class Env:
"""Custom configuration variables, passed on to shell scripts as env vars.
Expand All @@ -78,7 +92,8 @@ def __init__(self):
self.osname: str = platform.system().lower()
self.architecture: str = get_arch()
self.pyversion: str = f"{sys.version_info.major}{sys.version_info.minor}"
self.current_dir: str = os.path.dirname(__file__)
self.current_dir: os.PathLike | str = os.path.dirname(__file__)
self.python: os.PathLike | str = sys.executable


env = Env()
Expand Down Expand Up @@ -144,12 +159,7 @@ def windows_caveat() -> None | NoReturn:
)
logger.info(pretext())
logger.info(pretext())
prompt = input("Are you sure you want to continue? <Y/N> ")
if not re.match(r"^[yY](es)?$", prompt):
logger.info(pretext())
logger.info("Bye. Hope to see you soon.")
logger.info(pretext())
exit(0)
confirmation_prompt()


def unsupported_os() -> NoReturn:
Expand Down Expand Up @@ -180,6 +190,24 @@ def unsupported_arch() -> NoReturn:
exit(1)


def unsupported_env() -> None:
"""Function to handle installations that are NOT on virtual environments."""
logger.info(pretext())
logger.info(pretext())
logger.info(
center(
"""
Using a virtual environment is highly recommended to avoid version conflicts in dependencies
* Creating Virtual Environments: https://docs.python.org/3/library/venv.html#creating-virtual-environments
* How Virtual Environments work: https://docs.python.org/3/library/venv.html#how-venvs-work
"""
)
)
logger.info(pretext())
logger.info(pretext())
confirmation_prompt()


class Requirements:
"""Install locations for pinned, locked and upgrade-able packages.
Expand Down Expand Up @@ -252,7 +280,7 @@ def dev_uninstall() -> None:
logger.info(center("Uninstalling dev dependencies"))
logger.info(pretext())
run_subprocess(
"python -m pip uninstall --no-cache-dir sphinx==5.1.1 pre-commit recommonmark gitverse -y"
f"{env.python} -m pip uninstall{verbose} --no-cache-dir sphinx==5.1.1 pre-commit recommonmark gitverse -y"
)


Expand All @@ -262,18 +290,19 @@ def main_uninstall() -> None:
logger.info(pretext())
logger.info(center("Uninstalling ALL dependencies"))
logger.info(pretext())
exc = thread_worker(
exception = thread_worker(
[
f"python -m pip uninstall --no-cache-dir -r {requirements.pinned} -y",
f"python -m pip uninstall --no-cache-dir -r {requirements.locked} -y",
f"python -m pip uninstall --no-cache-dir -r {requirements.upgrade} -y",
f"python -m pip uninstall --no-cache-dir {' '.join(os_specific_pip())} -y",
f"{env.python} -m pip uninstall{verbose} --no-cache-dir -r {requirements.pinned} -y",
f"{env.python} -m pip uninstall{verbose} --no-cache-dir -r {requirements.locked} -y",
f"{env.python} -m pip uninstall{verbose} --no-cache-dir -r {requirements.upgrade} -y",
f"{env.python} -m pip uninstall{verbose} --no-cache-dir {' '.join(os_specific_pip())} -y",
]
)
logger.info(pretext())
logger.info(center("Cleanup has completed!")) if exc else logger.info(
center("One or many cleanup threads have failed!!")
)
if exception:
logger.error(center("One or more cleanup threads have failed!!"))
else:
logger.info(center("Cleanup has completed!"))
logger.info(pretext())


Expand All @@ -282,13 +311,22 @@ def os_agnostic() -> None:
logger.info(pretext())
logger.info(center("Installing OS agnostic dependencies"))
logger.info(pretext())
thread_worker(
exception = thread_worker(
[
f"python -m pip install --no-cache -r {requirements.pinned}",
f"python -m pip install --no-cache -r {requirements.locked}",
f"python -m pip install --no-cache --upgrade -r {requirements.upgrade}",
f"{env.python} -m pip install{verbose} --no-cache -r {requirements.pinned}",
f"{env.python} -m pip install{verbose} --no-cache -r {requirements.locked}",
f"{env.python} -m pip install{verbose} --no-cache --upgrade -r {requirements.upgrade}",
]
)
logger.info(pretext())
if exception:
logger.error(center("One or more installation threads have failed!!"))
logger.error(
center("Please set JARVIS_VERBOSITY=1 and retry to identify root cause.")
)
else:
logger.info(center("Installation has completed!"))
logger.info(pretext())


def init() -> None:
Expand All @@ -299,6 +337,9 @@ def init() -> None:
if env.architecture != "amd64":
unsupported_arch()

if sys.prefix == sys.base_prefix:
unsupported_env()

pyversion: str = (
f"{sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}"
)
Expand All @@ -314,7 +355,9 @@ def init() -> None:
"Please use any python version between 3.10.* and 3.11.*"
)
exit(1)
run_subprocess("python -m pip install --upgrade pip setuptools wheel")
run_subprocess(
f"{env.python} -m pip install{verbose} --upgrade pip setuptools wheel"
)


def dev_install() -> None:
Expand All @@ -324,7 +367,7 @@ def dev_install() -> None:
logger.info(center("Installing dev dependencies"))
logger.info(pretext())
run_subprocess(
"python -m pip install sphinx==5.1.1 pre-commit recommonmark gitverse"
f"{env.python} -m pip install{verbose} sphinx==5.1.1 pre-commit recommonmark gitverse"
)


Expand Down

0 comments on commit ec7d60c

Please sign in to comment.