diff --git a/.gitignore b/.gitignore index d371217..93f56dd 100644 --- a/.gitignore +++ b/.gitignore @@ -12,5 +12,8 @@ dist dist/* dist/** build +env *.env **.env +*.ipynb +prep_dev_env.py diff --git a/helloworld_core/helloworld_full.py b/helloworld_core/helloworld_full.py index f292179..e8b11d9 100644 --- a/helloworld_core/helloworld_full.py +++ b/helloworld_core/helloworld_full.py @@ -9,10 +9,25 @@ from collections import OrderedDict import requests from copy import deepcopy -from IPython.core.magic import (Magics, magics_class, line_magic, cell_magic, line_cell_magic) +from IPython.core.magic import ( + Magics, + magics_class, + line_magic, + cell_magic, + line_cell_magic, +) from IPython.core.display import HTML -from IPython.display import display_html, display, Markdown, Javascript, FileLink, FileLinks, Image +from IPython.display import ( + display_html, + display, + Markdown, + Javascript, + FileLink, + FileLinks, + Image, +) import pandas as pd + # Widgets from ipywidgets import GridspecLayout, widgets import jupyter_integrations_utility as jiu @@ -20,6 +35,7 @@ from helloworld_core._version import __desc__ from addon_core import Addon + @magics_class class Helloworld(Addon): # Static Variables @@ -29,44 +45,51 @@ class Helloworld(Addon): custom_evars = [] # Addons required to be loaded - req_addons = ['helloworld', 'display', 'persist', 'profile', 'sharedfunc', 'vis', 'namedpw', 'feat', 'pyvis', 'pivot'] - req_full_addons = ['display', 'namedpw'] + req_addons = [ + "helloworld", + "display", + "persist", + "profile", + "sharedfunc", + "vis", + "namedpw", + "feat", + "pyvis", + "pivot", + ] + req_full_addons = ["display", "namedpw"] custom_allowed_set_opts = [] - myopts = {} -# myopts['profile_max_rows_full'] = [10000, "Row threshold for doing full analysis. Over there and we default to minimal analysis with a warning"] + # myopts['profile_max_rows_full'] = [10000, "Row threshold for doing full analysis. Over there and we default to minimal analysis with a warning"] - - def __init__(self, shell, debug=False, *args, **kwargs): + def __init__(self, shell, debug=False, *args, **kwargs): super(Helloworld, self).__init__(shell, debug=debug) self.debug = debug - #Add local variables to opts dict + # Add local variables to opts dict for k in self.myopts.keys(): self.opts[k] = self.myopts[k] self.load_env(self.custom_evars) - if 'jupyter_loaded_addons' not in self.ipy.user_ns: - self.ipy.user_ns['jupyter_loaded_addons'] = {} - self.ipy.user_ns['jupyter_loaded_addons']['helloworld'] = 'helloworld_full' + if "jupyter_loaded_addons" not in self.ipy.user_ns: + self.ipy.user_ns["jupyter_loaded_addons"] = {} + self.ipy.user_ns["jupyter_loaded_addons"]["helloworld"] = "helloworld_full" self.check_req_addons() # Loading doc_and_batch -# self.ipy.ex("from helloworld_core.doc_and_batch import *\n") -# self.ipy.ex("from jupyter_integrations_utility.doc_and_batch import *\n") + # self.ipy.ex("from helloworld_core.doc_and_batch import *\n") + # self.ipy.ex("from jupyter_integrations_utility.doc_and_batch import *\n") self.ipy.ex("from jupyter_integrations_utility.funcdoc import *\n") self.ipy.ex("from jupyter_integrations_utility.batchquery import *\n") - - -# shell.user_ns['helloworld_var'] = self.creation_name + # shell.user_ns['helloworld_var'] = self.creation_name # We will maybe have to load helloworld first def check_req_addons(self): for addon in self.req_addons: chk = addon - if 'jupyter_loaded_addons' not in self.ipy.user_ns: - self.ipy.user_ns['jupyter_loaded_addons'] = {} - if chk not in self.ipy.user_ns['jupyter_loaded_addons'].keys(): + if "jupyter_loaded_addons" not in self.ipy.user_ns: + self.ipy.user_ns["jupyter_loaded_addons"] = {} + if chk not in self.ipy.user_ns["jupyter_loaded_addons"].keys(): if self.debug: print("%s not found in user_ns - Running" % chk) objname = addon.capitalize() @@ -81,86 +104,84 @@ def check_req_addons(self): if self.debug: print(runcode) res = self.ipy.ex(runcode) - self.ipy.user_ns['jupyter_loaded_addons'][chk] = varobjname + self.ipy.user_ns["jupyter_loaded_addons"][chk] = varobjname else: if self.debug: print("%s found in user_ns - Not loading" % chk) - - - - - - def listIntsAdsMD(self): - myout = "" - myout += "\n" - myout += "Additional help for each integration and addon can be found by running the magic string for each integration or addon\n" - myout += "\n" - myout += "### Installed Integrations and Addons\n" - myout += "---------------\n" - myout += "| Integration | Desc | | Addon | Desc |\n" - myout += "| ------ | ------ | --- | ----- | ---------|\n" - - myints = list(self.ipy.user_ns['jupyter_loaded_integrations'].keys()) - myadds = list(self.ipy.user_ns['jupyter_loaded_addons'].keys()) - for i in range(max(len(myints), len(myadds))): - try: - cn = self.ipy.user_ns['jupyter_loaded_integrations'][myints[i]] - mn = self.ipy.user_ns[cn].magic_name - myintdesc = self.ipy.user_ns[cn].retCustomDesc() - myintdesc = "
".join(textwrap.wrap(myintdesc, 40)) - - myint = "%" + mn - myintstatus = str(True) - except: - myint = " " - myintstatus = " " - myintdesc = " " - - try: - cn = self.ipy.user_ns['jupyter_loaded_addons'][myadds[i]] - mn = self.ipy.user_ns[cn].magic_name - myadddesc = self.ipy.user_ns[cn].retCustomDesc() - myadddesc = "
".join(textwrap.wrap(myadddesc, 40)) - myadd = "%" + mn - myaddstatus = str(True) - except: - myadd = " " - myaddstatus = " " - myadddesc = " " - myout += "| %s | %s | | %s | %s|\n" % (myint, myintdesc, myadd, myadddesc) - myout += "\n" - return myout - - def customHelp(self, curout): + def list_installed_integrations_and_addons(self): + """Generate markdown tables for the loaded integrations and addons in the user's ipy namespace + + Returns: + final_markdown : str - a markdown-ready string containing the tables of loaded integrations and addons + """ + integrations = list(self.ipy.user_ns["jupyter_loaded_integrations"].keys()) + addons = list(self.ipy.user_ns["jupyter_loaded_addons"].keys()) + + additional_help_md = "Additional help for each integration and addon can be found by running the magic string for each integration or addon\n" + + installed_integrations_md = ( + "### Installed integrations\n" + "-------------------------------------\n" + "| Integration | Desc | Version |\n" + "| ----------- | ---- | ------- |\n" + ) + + for integration in integrations: + base_name = self.ipy.user_ns["jupyter_loaded_integrations"][integration] + magic_name = self.ipy.user_ns[base_name].magic_name + description = "
".join( + textwrap.wrap(self.ipy.user_ns[base_name].retCustomDesc(), 70) + ) + installed_integrations_md += ( + f"| %{magic_name} | {description} | coming soon |\n" + ) + + installed_addons_md = ( + "### Installed addons\n" + "-------------------------------------\n" + "| Addon | Desc | Version |\n" + "| ----- | ---- | ------- |\n" + ) + + for addon in addons: + base_name = self.ipy.user_ns["jupyter_loaded_addons"][addon] + magic_name = self.ipy.user_ns[base_name].magic_name + description = "
".join( + textwrap.wrap(self.ipy.user_ns[base_name].retCustomDesc(), 70) + ) + installed_addons_md += f"| %{magic_name} | {description} | coming soon |\n" + + final_markdown = "\n".join( + [additional_help_md, installed_integrations_md, installed_addons_md] + ) + + return final_markdown + + def customHelp(self, current_output): n = self.magic_name m = "%" + n mq = "%" + m - table_header = "| Magic | Description |\n" - table_header += "| -------- | ----- |\n" - - out = curout - - out += "\n" - out += f"### {m} line magics\n" - out += "---------------\n" - out += table_header - out += f"| {m + ' batch'} | Print the batch_query_help() (Same as typing batch_query_help() ) |\n" - out += f"| {m + ' func'} | Print the function_doc_help() (Same as typing function_doc_help() ) |\n" - out += f"| {m + ' go'} | Put the helloworld go (defined in the variable hello_go) into the next cell. You can specify this in an py file in the .ipython profile_default startup folder |\n" - out += "\n\n" - out += "\n" - out += self.listIntsAdsMD() - - return out + custom_help_markdown = ( + f"{current_output}\n" + f"### {m} line magics\n" + "----------------------\n" + "| Magic | Description |\n" + "| ----- | ----------- |\n" + f"| {m + ' batch'} | Print the batch_query_help() (Same as typing batch_query_help() ) |\n" + f"| {m + ' func'} | Print the function_doc_help() (Same as typing function_doc_help() ) |\n" + f"| {m + ' go'} | Put the helloworld go (defined in the variable hello_go) into the next cell. You can specify this in an py file in the .ipython profile_default startup folder |\n" + "\n\n\n" + f"{self.list_installed_integrations_and_addons()}" + ) + + return custom_help_markdown def retCustomDesc(self): return __desc__ - def fillGo(self, varname): - fullvar = f"hello_{varname}" if fullvar in self.ipy.user_ns: @@ -170,18 +191,18 @@ def fillGo(self, varname): else: print("We shouldn't get here") - - # This is the magic name. @line_cell_magic def helloworld(self, line, cell=None): if self.debug: - print("line: %s" % line) - print("cell: %s" % cell) + print("line: %s" % line) + print("cell: %s" % cell) line = line.replace("\r", "") if cell is None: line_handled = self.handleLine(line) - if not line_handled: # We based on this we can do custom things for integrations. + if ( + not line_handled + ): # We based on this we can do custom things for integrations. if line.lower().strip() == "go": self.fillGo("go") elif line.lower().strip() == "batch": @@ -191,9 +212,10 @@ def helloworld(self, line, cell=None): elif f"hello_{line.lower().strip()}" in self.ipy.user_ns: self.fillGo(line.lower().strip()) else: - print("I am sorry, I don't know what you want to do with your line magic, try just %" + self.name_str + " for help options") - else: # This is run is the cell is not none, thus it's a cell to process - For us, that means a query + print( + "I am sorry, I don't know what you want to do with your line magic, try just %" + + self.name_str + + " for help options" + ) + else: # This is run is the cell is not none, thus it's a cell to process - For us, that means a query print("No Cell Magic for %s" % self.name_str) - - -