Skip to content

Commit ec7d60c

Browse files
committed
Implement venv check during installation
Use the right prefix for installation without assumptions Add verbose functionality for commandline
1 parent f5aaaa5 commit ec7d60c

7 files changed

+86
-26
lines changed

.pre-commit-config.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ repos:
4949
args: [ --max-line-length=120, --extend-ignore=SFS3 D107 SFS301 D100 D104 D401 SFS101 SFS201 D412 ]
5050

5151
- repo: https://github.com/PyCQA/isort
52-
rev: 5.12.0
52+
rev: 5.13.2
5353
hooks:
5454
- id: isort
5555
args: [ --profile, black ]

docs/genindex.html

+6-2
Original file line numberDiff line numberDiff line change
@@ -384,10 +384,10 @@ <h2 id="C">C</h2>
384384
</li>
385385
<li><a href="index.html#jarvis.api.triggers.stock_monitor.StockMonitor.closest_maximum">closest_maximum() (jarvis.api.triggers.stock_monitor.StockMonitor static method)</a>
386386
</li>
387-
</ul></td>
388-
<td style="width: 33%; vertical-align: top;"><ul>
389387
<li><a href="index.html#jarvis.api.triggers.stock_monitor.StockMonitor.closest_minimum">closest_minimum() (jarvis.api.triggers.stock_monitor.StockMonitor static method)</a>
390388
</li>
389+
</ul></td>
390+
<td style="width: 33%; vertical-align: top;"><ul>
391391
<li><a href="index.html#jarvis.modules.models.classes.Indicators.coin">coin (jarvis.modules.models.classes.Indicators attribute)</a>
392392
</li>
393393
<li><a href="index.html#jarvis.modules.utils.util.comma_separator">comma_separator() (in module jarvis.modules.utils.util)</a>
@@ -403,6 +403,8 @@ <h2 id="C">C</h2>
403403
<li><a href="index.html#jarvis.modules.models.classes.FileIO.conditions">conditions (jarvis.modules.models.classes.FileIO attribute)</a>
404404
</li>
405405
<li><a href="index.html#jarvis.executors.conditions.conditions">conditions() (in module jarvis.executors.conditions)</a>
406+
</li>
407+
<li><a href="index.html#jarvis.lib.installer.confirmation_prompt">confirmation_prompt() (in module jarvis.lib.installer)</a>
406408
</li>
407409
<li><a href="index.html#jarvis.modules.utils.support.connected_to_network">connected_to_network() (in module jarvis.modules.utils.support)</a>
408410
</li>
@@ -3359,6 +3361,8 @@ <h2 id="U">U</h2>
33593361
<li><a href="index.html#jarvis.modules.utils.support.unrecognized_dumper">unrecognized_dumper() (in module jarvis.modules.utils.support)</a>
33603362
</li>
33613363
<li><a href="index.html#jarvis.lib.installer.unsupported_arch">unsupported_arch() (in module jarvis.lib.installer)</a>
3364+
</li>
3365+
<li><a href="index.html#jarvis.lib.installer.unsupported_env">unsupported_env() (in module jarvis.lib.installer)</a>
33623366
</li>
33633367
<li><a href="index.html#jarvis.modules.utils.support.unsupported_features">unsupported_features() (in module jarvis.modules.utils.support)</a>
33643368
</li>

docs/index.html

+12
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,12 @@ <h1>Jarvis - Voice-Activated Natural Language UI<a class="headerlink" href="#jar
105105
</dl>
106106
</dd></dl>
107107

108+
<dl class="py function">
109+
<dt class="sig sig-object py" id="jarvis.lib.installer.confirmation_prompt">
110+
<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>
111+
<dd><p>Prompts a confirmation from the user to continue or exit.</p>
112+
</dd></dl>
113+
108114
<dl class="py class">
109115
<dt class="sig sig-object py" id="jarvis.lib.installer.Env">
110116
<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>
@@ -177,6 +183,12 @@ <h1>Jarvis - Voice-Activated Natural Language UI<a class="headerlink" href="#jar
177183
</dl>
178184
</dd></dl>
179185

186+
<dl class="py function">
187+
<dt class="sig sig-object py" id="jarvis.lib.installer.unsupported_env">
188+
<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>
189+
<dd><p>Function to handle installations that are NOT on virtual environments.</p>
190+
</dd></dl>
191+
180192
<dl class="py class">
181193
<dt class="sig sig-object py" id="jarvis.lib.installer.Requirements">
182194
<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>

docs/objects.inv

17 Bytes
Binary file not shown.

docs/searchindex.js

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

jarvis/__init__.py

+1
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ def commandline() -> None:
7777
case "dev-uninstall" | "dev-cleanup":
7878
installer.dev_uninstall()
7979
case "start" | "run":
80+
os.environ["debug"] = str(os.environ.get("JARVIS_VERBOSITY", "-1") == "1")
8081
init = __preflight_check__()
8182
init()
8283
case "version" | "-v" | "-V" | "--version":

jarvis/lib/installer.py

+65-22
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@
2727
logger = logging.getLogger(__name__)
2828
logger.addHandler(logging.StreamHandler())
2929
logger.setLevel(logging.DEBUG)
30+
if os.environ.get("JARVIS_VERBOSITY", "-1") == "1":
31+
verbose = " --verbose"
32+
else:
33+
verbose = ""
3034

3135

3236
def pretext() -> str:
@@ -66,6 +70,16 @@ def get_arch() -> str | NoReturn:
6670
return architecture
6771

6872

73+
def confirmation_prompt() -> None:
74+
"""Prompts a confirmation from the user to continue or exit."""
75+
prompt = input("Are you sure you want to continue? <Y/N> ")
76+
if not re.match(r"^[yY](es)?$", prompt):
77+
logger.info(pretext())
78+
logger.info("Bye. Hope to see you soon.")
79+
logger.info(pretext())
80+
exit(0)
81+
82+
6983
class Env:
7084
"""Custom configuration variables, passed on to shell scripts as env vars.
7185
@@ -78,7 +92,8 @@ def __init__(self):
7892
self.osname: str = platform.system().lower()
7993
self.architecture: str = get_arch()
8094
self.pyversion: str = f"{sys.version_info.major}{sys.version_info.minor}"
81-
self.current_dir: str = os.path.dirname(__file__)
95+
self.current_dir: os.PathLike | str = os.path.dirname(__file__)
96+
self.python: os.PathLike | str = sys.executable
8297

8398

8499
env = Env()
@@ -144,12 +159,7 @@ def windows_caveat() -> None | NoReturn:
144159
)
145160
logger.info(pretext())
146161
logger.info(pretext())
147-
prompt = input("Are you sure you want to continue? <Y/N> ")
148-
if not re.match(r"^[yY](es)?$", prompt):
149-
logger.info(pretext())
150-
logger.info("Bye. Hope to see you soon.")
151-
logger.info(pretext())
152-
exit(0)
162+
confirmation_prompt()
153163

154164

155165
def unsupported_os() -> NoReturn:
@@ -180,6 +190,24 @@ def unsupported_arch() -> NoReturn:
180190
exit(1)
181191

182192

193+
def unsupported_env() -> None:
194+
"""Function to handle installations that are NOT on virtual environments."""
195+
logger.info(pretext())
196+
logger.info(pretext())
197+
logger.info(
198+
center(
199+
"""
200+
Using a virtual environment is highly recommended to avoid version conflicts in dependencies
201+
* Creating Virtual Environments: https://docs.python.org/3/library/venv.html#creating-virtual-environments
202+
* How Virtual Environments work: https://docs.python.org/3/library/venv.html#how-venvs-work
203+
"""
204+
)
205+
)
206+
logger.info(pretext())
207+
logger.info(pretext())
208+
confirmation_prompt()
209+
210+
183211
class Requirements:
184212
"""Install locations for pinned, locked and upgrade-able packages.
185213
@@ -252,7 +280,7 @@ def dev_uninstall() -> None:
252280
logger.info(center("Uninstalling dev dependencies"))
253281
logger.info(pretext())
254282
run_subprocess(
255-
"python -m pip uninstall --no-cache-dir sphinx==5.1.1 pre-commit recommonmark gitverse -y"
283+
f"{env.python} -m pip uninstall{verbose} --no-cache-dir sphinx==5.1.1 pre-commit recommonmark gitverse -y"
256284
)
257285

258286

@@ -262,18 +290,19 @@ def main_uninstall() -> None:
262290
logger.info(pretext())
263291
logger.info(center("Uninstalling ALL dependencies"))
264292
logger.info(pretext())
265-
exc = thread_worker(
293+
exception = thread_worker(
266294
[
267-
f"python -m pip uninstall --no-cache-dir -r {requirements.pinned} -y",
268-
f"python -m pip uninstall --no-cache-dir -r {requirements.locked} -y",
269-
f"python -m pip uninstall --no-cache-dir -r {requirements.upgrade} -y",
270-
f"python -m pip uninstall --no-cache-dir {' '.join(os_specific_pip())} -y",
295+
f"{env.python} -m pip uninstall{verbose} --no-cache-dir -r {requirements.pinned} -y",
296+
f"{env.python} -m pip uninstall{verbose} --no-cache-dir -r {requirements.locked} -y",
297+
f"{env.python} -m pip uninstall{verbose} --no-cache-dir -r {requirements.upgrade} -y",
298+
f"{env.python} -m pip uninstall{verbose} --no-cache-dir {' '.join(os_specific_pip())} -y",
271299
]
272300
)
273301
logger.info(pretext())
274-
logger.info(center("Cleanup has completed!")) if exc else logger.info(
275-
center("One or many cleanup threads have failed!!")
276-
)
302+
if exception:
303+
logger.error(center("One or more cleanup threads have failed!!"))
304+
else:
305+
logger.info(center("Cleanup has completed!"))
277306
logger.info(pretext())
278307

279308

@@ -282,13 +311,22 @@ def os_agnostic() -> None:
282311
logger.info(pretext())
283312
logger.info(center("Installing OS agnostic dependencies"))
284313
logger.info(pretext())
285-
thread_worker(
314+
exception = thread_worker(
286315
[
287-
f"python -m pip install --no-cache -r {requirements.pinned}",
288-
f"python -m pip install --no-cache -r {requirements.locked}",
289-
f"python -m pip install --no-cache --upgrade -r {requirements.upgrade}",
316+
f"{env.python} -m pip install{verbose} --no-cache -r {requirements.pinned}",
317+
f"{env.python} -m pip install{verbose} --no-cache -r {requirements.locked}",
318+
f"{env.python} -m pip install{verbose} --no-cache --upgrade -r {requirements.upgrade}",
290319
]
291320
)
321+
logger.info(pretext())
322+
if exception:
323+
logger.error(center("One or more installation threads have failed!!"))
324+
logger.error(
325+
center("Please set JARVIS_VERBOSITY=1 and retry to identify root cause.")
326+
)
327+
else:
328+
logger.info(center("Installation has completed!"))
329+
logger.info(pretext())
292330

293331

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

340+
if sys.prefix == sys.base_prefix:
341+
unsupported_env()
342+
302343
pyversion: str = (
303344
f"{sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}"
304345
)
@@ -314,7 +355,9 @@ def init() -> None:
314355
"Please use any python version between 3.10.* and 3.11.*"
315356
)
316357
exit(1)
317-
run_subprocess("python -m pip install --upgrade pip setuptools wheel")
358+
run_subprocess(
359+
f"{env.python} -m pip install{verbose} --upgrade pip setuptools wheel"
360+
)
318361

319362

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

330373

0 commit comments

Comments
 (0)