def _mimebundle(self, fmt: str) -> Mimebundle: if fmt not in self.valid_formats: raise ValueError( f"Invalid format: {fmt!r}. Must be one of {self.valid_formats}" ) if self._inline: html = INLINE_HTML_TEMPLATE.format( spec=json.dumps(self._spec), embed_opt=json.dumps(self._embed_opt), vega_version=self._package_versions["vega"], vegalite_version=self._package_versions["vega-lite"], vegaembed_version=self._package_versions["vega-embed"], vega_script=get_bundled_script("vega", self._package_versions["vega"]), vegalite_script=get_bundled_script( "vega-lite", self._package_versions["vega-lite"]), vegaembed_script=get_bundled_script( "vega-embed", self._package_versions["vega-embed"]), ) else: html = HTML_TEMPLATE.format( spec=json.dumps(self._spec), embed_opt=json.dumps(self._embed_opt), vega_url=self._package_url("vega"), vegalite_url=self._package_url("vega-lite"), vegaembed_url=self._package_url("vega-embed"), ) return {fmt_to_mimetype("html"): html}
def test_get_bundled_script_error() -> None: with pytest.raises(NoMatchingVersions) as err: get_bundled_script("vega-lite", "1.0") assert str(err.value).startswith("No matches for version='1.0'") with pytest.raises(ValueError) as err: get_bundled_script("vega-light") assert str(err.value).startswith("package 'vega-light' not recognized.")
def _extract(self, fmt: str) -> MimebundleContent: driver = self._registry.get(self._webdriver, self._driver_timeout) if self._offline: js_resources = { "vega.js": get_bundled_script("vega", self._package_versions["vega"]), "vega-lite.js": get_bundled_script("vega-lite", self._package_versions["vega-lite"]), "vega-embed.js": get_bundled_script("vega-embed", self._package_versions["vega-embed"]), } html = HTML_TEMPLATE.format( vega_url="/vega.js", vegalite_url="/vega-lite.js", vegaembed_url="/vega-embed.js", ) else: js_resources = {} html = HTML_TEMPLATE.format( vega_url=CDN_URL.format( package="vega", version=self._package_versions["vega"]), vegalite_url=CDN_URL.format( package="vega-lite", version=self._package_versions["vega-lite"]), vegaembed_url=CDN_URL.format( package="vega-embed", version=self._package_versions["vega-embed"]), ) url = self._serve(html, js_resources) driver.get("about:blank") driver.get(url) try: driver.find_element_by_id("vis") except NoSuchElementException: raise RuntimeError(f"Could not load {url}") if not self._offline: online = driver.execute_script("return navigator.onLine") if not online: raise RuntimeError( f"Internet connection required for saving chart as {fmt} with offline=False." ) opt = self._embed_options.copy() opt["mode"] = self._mode result = driver.execute_async_script(EXTRACT_CODE, self._spec, opt, fmt) if "error" in result: raise JavascriptError(result["error"]) return result["result"]
def _extract_data(spec: JSONDict, name: str = "data_0") -> pd.DataFrame: """Extract named data from a Vega-Lite chart spec. Parameters ---------- spec : dict The Vega-Lite specification containing the data to extract name : string The name of the data stream to extract Returns ------- data : pd.DataFrame The extracted data """ # Optional deps from selenium.common.exceptions import NoSuchElementException from altair_saver import SeleniumSaver from altair_viewer import get_bundled_script js_resources = { "vega.js": get_bundled_script("vega", alt.VEGA_VERSION), "vega-lite.js": get_bundled_script("vega-lite", alt.VEGALITE_VERSION), "vega-embed.js": get_bundled_script("vega-embed", alt.VEGAEMBED_VERSION), } html = HTML_TEMPLATE.format( vega_url="/vega.js", vegalite_url="/vega-lite.js", vegaembed_url="/vega-embed.js", ) url = SeleniumSaver._serve(html, js_resources) driver_name = SeleniumSaver._select_webdriver(20) driver = SeleniumSaver._registry.get(driver_name, 20) driver.get("about:blank") driver.get(url) try: driver.find_element_by_id("vis") except NoSuchElementException: raise RuntimeError(f"Could not load {url}") data = driver.execute_async_script(EXTRACT_CODE, spec, name) if "error" in data: raise ValueError(f"Javascript Error: {data['error']}") return pd.DataFrame.from_records(json.loads(data["data"]))
def _extract(self, fmt: str) -> MimeType: if fmt == "vega" and self._mode == "vega": return self._spec driver = self._registry.get(self._webdriver, self._driver_timeout) if self._offline: js_resources = { "vega.js": get_bundled_script("vega", self._vega_version), "vega-lite.js": get_bundled_script("vega-lite", self._vegalite_version), "vega-embed.js": get_bundled_script("vega-embed", self._vegaembed_version), } html = HTML_TEMPLATE.format( vega_url="/vega.js", vegalite_url="/vega-lite.js", vegaembed_url="/vega-embed.js", ) else: js_resources = {} html = HTML_TEMPLATE.format( vega_url=CDN_URL.format(package="vega", version=self._vega_version), vegalite_url=CDN_URL.format(package="vega-lite", version=self._vegalite_version), vegaembed_url=CDN_URL.format(package="vega-embed", version=self._vegaembed_version), ) url = self._serve(html, js_resources) driver.get("about:blank") driver.get(url) try: driver.find_element_by_id("vis") except NoSuchElementException: raise RuntimeError(f"Could not load {url}") if not self._offline: online = driver.execute_script("return navigator.onLine") if not online: raise RuntimeError( f"Internet connection required for saving chart as {fmt}") return driver.execute_async_script(EXTRACT_CODE, self._spec, self._mode, self._scale_factor, fmt)
def _serialize(self, fmt: str, content_type: str) -> MimebundleContent: standalone = self._standalone if standalone is None: standalone = content_type == "save" output_div = f"vega-visualization-{uuid.uuid4().hex}" if not standalone: if self._inline: warnings.warn("inline ignored for non-standalone HTML.") return RENDERER_HTML_TEMPLATE.format( spec=json.dumps(self._spec), embed_options=json.dumps(self._embed_options), vega_url=self._package_url("vega"), vegalite_url=self._package_url("vega-lite"), vegaembed_url=self._package_url("vega-embed"), output_div=output_div, ) elif self._inline: return INLINE_HTML_TEMPLATE.format( spec=json.dumps(self._spec), embed_options=json.dumps(self._embed_options), vega_version=self._package_versions["vega"], vegalite_version=self._package_versions["vega-lite"], vegaembed_version=self._package_versions["vega-embed"], vega_script=get_bundled_script("vega", self._package_versions["vega"]), vegalite_script=get_bundled_script( "vega-lite", self._package_versions["vega-lite"]), vegaembed_script=get_bundled_script( "vega-embed", self._package_versions["vega-embed"]), output_div=output_div, ) else: return HTML_TEMPLATE.format( spec=json.dumps(self._spec), embed_options=json.dumps(self._embed_options), vega_url=self._package_url("vega"), vegalite_url=self._package_url("vega-lite"), vegaembed_url=self._package_url("vega-embed"), output_div=output_div, )
def test_get_bundled_script(package): script = get_bundled_script(package) assert script.startswith("!function(")
def test_get_bundled_script_with_version(package: str, version: str) -> None: script = get_bundled_script(package) assert script.startswith("!function(")