Esempio n. 1
0
 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}
Esempio n. 2
0
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.")
Esempio n. 3
0
    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"]
Esempio n. 4
0
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"]))
Esempio n. 5
0
    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)
Esempio n. 6
0
    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,
            )
Esempio n. 7
0
def test_get_bundled_script(package):
    script = get_bundled_script(package)
    assert script.startswith("!function(")
Esempio n. 8
0
def test_get_bundled_script_with_version(package: str, version: str) -> None:
    script = get_bundled_script(package)
    assert script.startswith("!function(")