# Copyright 2008-2015 Nokia Networks
# Copyright 2016- Robot Framework Foundation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from robot.htmldata import JsonWriter
[docs]
class JsResultWriter:
_output_attr = "window.output"
_settings_attr = "window.settings"
_suite_key = "suite"
_strings_key = "strings"
def __init__(
self,
output,
start_block='<script type="text/javascript">\n',
end_block="</script>\n",
split_threshold=9500,
):
writer = JsonWriter(output, separator=end_block + start_block)
self._write = writer.write
self._write_json = writer.write_json
self._start_block = start_block
self._end_block = end_block
self._split_threshold = split_threshold
[docs]
def write(self, result, settings):
self._start_output_block()
self._write_suite(result.suite)
self._write_strings(result.strings)
self._write_data(result.data)
self._write_settings_and_end_output_block(settings)
def _start_output_block(self):
self._write(self._start_block, postfix="", separator=False)
self._write(f"{self._output_attr} = {{}}")
def _write_suite(self, suite):
writer = SuiteWriter(self._write_json, self._split_threshold)
writer.write(suite, self._output_var(self._suite_key))
def _write_strings(self, strings):
variable = self._output_var(self._strings_key)
self._write(f"{variable} = []")
prefix = f"{variable} = {variable}.concat("
postfix = ");\n"
threshold = self._split_threshold
for index in range(0, len(strings), threshold):
self._write_json(prefix, strings[index : index + threshold], postfix)
def _write_data(self, data):
for key in data:
self._write_json(f"{self._output_var(key)} = ", data[key])
def _write_settings_and_end_output_block(self, settings):
self._write_json(f"{self._settings_attr} = ", settings, separator=False)
self._write(self._end_block, postfix="", separator=False)
def _output_var(self, key):
return f'{self._output_attr}["{key}"]'
[docs]
class SuiteWriter:
def __init__(self, write_json, split_threshold):
self._write_json = write_json
self._split_threshold = split_threshold
[docs]
def write(self, suite, variable):
mapping = {}
self._write_parts_over_threshold(suite, mapping)
self._write_json(f"{variable} = ", suite, mapping=mapping)
def _write_parts_over_threshold(self, data, mapping):
if not isinstance(data, tuple):
return 1
not_written = 1
for item in data:
not_written += self._write_parts_over_threshold(item, mapping)
if not_written > self._split_threshold:
self._write_part(data, mapping)
return 1
return not_written
def _write_part(self, data, mapping):
part_name = f"window.sPart{len(mapping)}"
self._write_json(f"{part_name} = ", data, mapping=mapping)
mapping[data] = part_name
[docs]
class SplitLogWriter:
def __init__(self, output):
self._writer = JsonWriter(output)
[docs]
def write(self, keywords, strings, index, notify):
self._writer.write_json(f"window.keywords{index} = ", keywords)
self._writer.write_json(f"window.strings{index} = ", strings)
self._writer.write(f'window.fileLoading.notify("{notify}")')