Skip to content

Commit

Permalink
Fixing bugs and adding documentation to __init__.init
Browse files Browse the repository at this point in the history
Bug with uninitialized variable in data_providers.py
Use generator comp instead of list in browser
Better formatting of options - added options doc string to notebooklet init. Refactored large __init__ function in notebooklet
Updating requirements.txt to msticpy>=1.0.0
  • Loading branch information
ianhelle committed Apr 27, 2021
1 parent cb49ec0 commit d330b22
Show file tree
Hide file tree
Showing 7 changed files with 57 additions and 9 deletions.
35 changes: 31 additions & 4 deletions msticnb/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
"""
import sys
from typing import Any, Dict, List, Optional

from .data_providers import DataProviders, init as dp_init # noqa:F401
from .read_modules import discover_modules, nblts, nb_index, find # noqa:F401
Expand All @@ -53,10 +54,36 @@
print(f"Notebooklets: {len(list(nblts.iter_classes()))} notebooklets loaded.")


def init(namespace: dict = None, **kwargs):
"""Initialize notebooklets dataproviders and pivots."""
query_provider = kwargs.pop("query_provider", None)
providers = kwargs.pop("providers", None)
def init(
query_provider: str,
namespace: Optional[Dict[str, Any]] = None,
providers: Optional[List[str]] = None,
**kwargs,
):
"""
Initialize notebooklets dataproviders and pivots.
Parameters
----------
query_provider : str
The default query provider to use with notebooklets
namespace : Optional[Dict[str, Any]], optional
The global namespace - used to add pivot functions
providers : Optional[List[str]], optional
A list of other provider names to load
Other parameters
----------------
kwargs :
Optional keyword arguments to pass to DataProviders
and Pivot initializers.
Notes
-----
Use msticnb.DataProviders.list_providers() to get a list
of accepted providers.
"""
dp_init(query_provider=query_provider, providers=providers, **kwargs)
if not namespace:
# Try to get the globals namespace from top-level caller
Expand Down
1 change: 1 addition & 0 deletions msticnb/data_providers.py
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,7 @@ def __init__(
self.providers: Dict[str, Any] = {}

self.query_provider = None
parsed_provider = DataEnvironment.Unknown
if isinstance(query_provider, str):
parsed_provider = self._parse_provider_name(query_provider)
self.provider_names.add(parsed_provider.name)
Expand Down
2 changes: 1 addition & 1 deletion msticnb/nb_browser.py
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ def _get_class_index(tgt_class):
@staticmethod
def _pyvar_case(in_name):
return "_".join(
[part.lower() for part in re.split(r"([A-Z][a-z]*)", in_name) if part]
part.lower() for part in re.split(r"([A-Z][a-z]*)", in_name) if part
)

def _update_nbdetails(self, change):
Expand Down
3 changes: 2 additions & 1 deletion msticnb/nb_metadata.py
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,8 @@ def options_doc(self) -> str:
)
else:
opt_list.append(" None")
opt_list.append("")
# Add a blank line to the end
opt_list.extend(["", ""])
return "\n".join(opt_list)

# pylint: enable=not-an-iterable
Expand Down
20 changes: 19 additions & 1 deletion msticnb/notebooklet.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,9 +64,17 @@ def __init__(self, data_providers: Optional[DataProviders] = None, **kwargs):
self._current_run_silent: Optional[bool] = None
set_opt("temp_silent", self.silent)

# update "run" function documentation on first run
self._add_run_doc_options()

# Check required data providers are loaded.
# pylint: disable=no-member
self.data_providers = data_providers or DataProviders.current() # type: ignore
# pylint: enable=no-member
self._check_nb_providers(**kwargs)

def _check_nb_providers(self, **kwargs):
"""Check that providers required for notebooklet are available."""
if not self.data_providers:
raise MsticnbDataProviderError(
"No current DataProviders instance was found.",
Expand All @@ -90,8 +98,9 @@ def __init__(self, data_providers: Optional[DataProviders] = None, **kwargs):
prov_add_errs.append(err)

if missing_provs:
missing_mssg = [prov.replace("|", " or ") for prov in missing_provs]
raise MsticnbDataProviderError(
f"Required data provider(s) {', '.join(missing_provs)} not loaded.",
f"Required data provider(s) {', '.join(missing_mssg)} not loaded.",
f"Class {self.__class__.__name__}",
*prov_add_errs,
)
Expand All @@ -101,6 +110,15 @@ def __init__(self, data_providers: Optional[DataProviders] = None, **kwargs):
+ f"Class {self.__class__.__name__}"
)

def _add_run_doc_options(self):
"""Add options documentation to run function."""
if "Default Options" in self.__class__.run.__doc__:
return
options_doc = (f" {line}" for line in self.metadata.options_doc.split("\n"))
self.__class__.run.__doc__ = (self.__class__.run.__doc__ or "") + "\n".join(
options_doc
)

@abstractmethod
def run(
self,
Expand Down
2 changes: 1 addition & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ ipython>=7.14.0
ipywidgets>=7.5.1
lxml>=4.4.2
Markdown>=3.2.1
msticpy[azure]==1.0.0rc3
msticpy==1.0.0
numpy>=1.17.3
pandas>=0.25.3
python-dateutil>=2.8.1
Expand Down
3 changes: 2 additions & 1 deletion tests/nb/azsent/account/test_account_summary.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ def test_account_summary_notebooklet(monkeypatch):
test_data = str(Path(TEST_DATA_PATH).absolute())
monkeypatch.setattr(data_providers, "GeoLiteLookup", GeoIPLiteMock)
data_providers.init(
query_provider="LocalData",
"LocalData",
providers=["-tilookup"],
LocalData_data_paths=[test_data],
LocalData_query_paths=[test_data],
)
Expand Down

0 comments on commit d330b22

Please sign in to comment.