{
    "file_diffs": [
        {
            "old_file_content": "from Orange.data import StringVariable, DiscreteVariable, ContinuousVariable, \\\n    TimeVariable\n\n\ndef format_variables_string(variables):\n    \"\"\"\n    A function that formats the descriptive part of the input/output summary for\n    either features, targets or metas of the input dataset.\n\n    :param variables: Features, targets or metas of the input dataset\n    :return: A formatted string\n    \"\"\"\n    if not variables:\n        return '—'\n\n    agg = []\n    for var_type_name, var_type in [('categorical', DiscreteVariable),\n                                    ('numeric', ContinuousVariable),\n                                    ('time', TimeVariable),\n                                    ('string', StringVariable)]:\n        # Disable pylint here because a `TimeVariable` is also a\n        # `ContinuousVariable`, and should be labelled as such. That is why\n        # it is necessary to check the type this way instead of using\n        # `isinstance`, which would fail in the above case\n        var_type_list = [v for v in variables if type(v) is var_type]  # pylint: disable=unidiomatic-typecheck\n        if var_type_list:\n            not_shown = ' (not shown)' if issubclass(var_type, StringVariable)\\\n                else ''\n            agg.append((f'{var_type_name}{not_shown}', len(var_type_list)))\n\n    attrs, counts = list(zip(*agg))\n    if len(attrs) > 1:\n        var_string = [f'{i} {j}' for i, j in zip(counts, attrs)]\n        var_string = f'{sum(counts)} ({\", \".join(var_string)})'\n    elif counts[0] == 1:\n        var_string = attrs[0]\n    else:\n        var_string = f'{counts[0]} {attrs[0]}'\n    return var_string\n\n\ndef format_summary_details(data):\n    \"\"\"\n    A function that forms the entire descriptive part of the input/output\n    summary.\n\n    :param data: A dataset\n    :type data: Orange.data.Table\n    :return: A formatted string\n    \"\"\"\n    def _plural(number):\n        return 's' * (number != 1)\n\n    details = ''\n    if data:\n        features = format_variables_string(data.domain.attributes)\n        targets = format_variables_string(data.domain.class_vars)\n        metas = format_variables_string(data.domain.metas)\n\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = \\\n            f'{len(data)} instance{_plural(len(data))}, ' \\\n            f'{n_features} feature{_plural(n_features)}\\n' \\\n            f'Features: {features}\\nTarget: {targets}\\nMetas: {metas}'\n\n    return details\n",
            "new_file_content": "from Orange.data import StringVariable, DiscreteVariable, ContinuousVariable, \\\n    TimeVariable\n\n\ndef format_variables_string(variables):\n    \"\"\"\n    A function that formats the descriptive part of the input/output summary for\n    either features, targets or metas of the input dataset.\n\n    :param variables: Features, targets or metas of the input dataset\n    :return: A formatted string\n    \"\"\"\n    if not variables:\n        return '—'\n\n    agg = []\n    for var_type_name, var_type in [('categorical', DiscreteVariable),\n                                    ('numeric', ContinuousVariable),\n                                    ('time', TimeVariable),\n                                    ('string', StringVariable)]:\n        # Disable pylint here because a `TimeVariable` is also a\n        # `ContinuousVariable`, and should be labelled as such. That is why\n        # it is necessary to check the type this way instead of using\n        # `isinstance`, which would fail in the above case\n        var_type_list = [v for v in variables if type(v) is var_type]  # pylint: disable=unidiomatic-typecheck\n        if var_type_list:\n            not_shown = ' (not shown)' if issubclass(var_type, StringVariable)\\\n                else ''\n            agg.append((f'{var_type_name}{not_shown}', len(var_type_list)))\n\n    attrs, counts = list(zip(*agg))\n    if len(attrs) > 1:\n        var_string = [f'{i} {j}' for i, j in zip(counts, attrs)]\n        var_string = f'{sum(counts)} ({\", \".join(var_string)})'\n    elif counts[0] == 1:\n        var_string = attrs[0]\n    else:\n        var_string = f'{counts[0]} {attrs[0]}'\n    return var_string\n\n\ndef format_summary_details(data):\n    \"\"\"\n    A function that forms the entire descriptive part of the input/output\n    summary.\n\n    :param data: A dataset\n    :type data: Orange.data.Table\n    :return: A formatted string\n    \"\"\"\n    def _plural(number):\n        return 's' * (number != 1)\n\n    details = ''\n    if data:\n        features = format_variables_string(data.domain.attributes)\n        targets = format_variables_string(data.domain.class_vars)\n        metas = format_variables_string(data.domain.metas)\n\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = \\\n            f'{len(data)} instance{_plural(len(data))}, ' \\\n            f'{n_features} variable{_plural(n_features)}\\n' \\\n            f'Features: {features}\\nTarget: {targets}\\nMetas: {metas}'\n\n    return details\n",
            "header": {
                "file": {
                    "path": "Orange/widgets/utils/state_summary.py"
                },
                "misc_line": null
            },
            "index_line": {
                "old_commit_hash": "17675fe5e",
                "new_commit_hash": "c43f14864",
                "mode": "100644"
            },
            "is_binary_file": false,
            "binary_line": null,
            "minus_file": {
                "path": "a/Orange/widgets/utils/state_summary.py"
            },
            "plus_file": {
                "path": "b/Orange/widgets/utils/state_summary.py"
            },
            "hunks": [
                {
                    "descriptor": {
                        "old_range": {
                            "start": 60,
                            "length": 7
                        },
                        "new_range": {
                            "start": 60,
                            "length": 7
                        },
                        "section": "def format_summary_details(data):"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "        n_features = len(data.domain.variables) + len(data.domain.metas)",
                                "type": "context"
                            },
                            {
                                "content": "        details = \\",
                                "type": "context"
                            },
                            {
                                "content": "            f'{len(data)} instance{_plural(len(data))}, ' \\",
                                "type": "context"
                            },
                            {
                                "content": "            f'{n_features} feature{_plural(n_features)}\\n' \\",
                                "type": "deleted"
                            },
                            {
                                "content": "            f'{n_features} variable{_plural(n_features)}\\n' \\",
                                "type": "added"
                            },
                            {
                                "content": "            f'Features: {features}\\nTarget: {targets}\\nMetas: {metas}'",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "    return details",
                                "type": "context"
                            }
                        ]
                    },
                    "modified_entities": [
                        {
                            "file_name": "Orange/widgets/utils/state_summary.py",
                            "type": "function",
                            "name": "format_summary_details",
                            "content": "def format_summary_details(data):\n    \"\"\"\n    A function that forms the entire descriptive part of the input/output\n    summary.\n\n    :param data: A dataset\n    :type data: Orange.data.Table\n    :return: A formatted string\n    \"\"\"\n    def _plural(number):\n        return 's' * (number != 1)\n\n    details = ''\n    if data:\n        features = format_variables_string(data.domain.attributes)\n        targets = format_variables_string(data.domain.class_vars)\n        metas = format_variables_string(data.domain.metas)\n\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = \\\n            f'{len(data)} instance{_plural(len(data))}, ' \\\n            f'{n_features} feature{_plural(n_features)}\\n' \\\n            f'Features: {features}\\nTarget: {targets}\\nMetas: {metas}'\n\n    return details",
                            "ast_type_str": "FunctionDef",
                            "start_lineno": 42,
                            "end_lineno": 66,
                            "parent": null
                        }
                    ],
                    "added_entities": [],
                    "deleted_entities": []
                }
            ]
        },
        {
            "old_file_content": "import unittest\nimport datetime\nfrom collections import namedtuple\n\nimport numpy as np\n\nfrom Orange.widgets.utils.state_summary import format_summary_details\nfrom Orange.data import Table, Domain, StringVariable, ContinuousVariable, \\\n    DiscreteVariable, TimeVariable\n\nVarDataPair = namedtuple('VarDataPair', ['variable', 'data'])\n\n# Continuous variable variations\ncontinuous_full = VarDataPair(\n    ContinuousVariable('continuous_full'),\n    np.array([0, 1, 2, 3, 4], dtype=float),\n)\ncontinuous_missing = VarDataPair(\n    ContinuousVariable('continuous_missing'),\n    np.array([0, 1, 2, np.nan, 4], dtype=float),\n)\n\n# Unordered discrete variable variations\nrgb_full = VarDataPair(\n    DiscreteVariable('rgb_full', values=['r', 'g', 'b']),\n    np.array([0, 1, 1, 1, 2], dtype=float),\n)\nrgb_missing = VarDataPair(\n    DiscreteVariable('rgb_missing', values=['r', 'g', 'b']),\n    np.array([0, 1, 1, np.nan, 2], dtype=float),\n)\n\n# Ordered discrete variable variations\nints_full = VarDataPair(\n    DiscreteVariable('ints_full', values=['2', '3', '4'], ordered=True),\n    np.array([0, 1, 1, 1, 2], dtype=float),\n)\nints_missing = VarDataPair(\n    DiscreteVariable('ints_missing', values=['2', '3', '4'], ordered=True),\n    np.array([0, 1, 1, np.nan, 2], dtype=float),\n)\n\ndef _to_timestamps(years):\n    return [datetime.datetime(year, 1, 1).timestamp() if not np.isnan(year)\n            else np.nan for year in years]\n\ntime_full = VarDataPair(\n    TimeVariable('time_full'),\n    np.array(_to_timestamps([2000, 2001, 2002, 2003, 2004]), dtype=float),\n)\ntime_missing = VarDataPair(\n    TimeVariable('time_missing'),\n    np.array(_to_timestamps([2000, np.nan, 2001, 2003, 2004]), dtype=float),\n)\n\n# String variable variations\nstring_full = VarDataPair(\n    StringVariable('string_full'),\n    np.array(['a', 'b', 'c', 'd', 'e'], dtype=object),\n)\nstring_missing = VarDataPair(\n    StringVariable('string_missing'),\n    np.array(['a', 'b', 'c', StringVariable.Unknown, 'e'], dtype=object),\n)\n\n\ndef make_table(attributes, target=None, metas=None):\n    \"\"\"Build an instance of a table given various variables.\n\n    Parameters\n    ----------\n    attributes : Iterable[Tuple[Variable, np.array]\n    target : Optional[Iterable[Tuple[Variable, np.array]]\n    metas : Optional[Iterable[Tuple[Variable, np.array]]\n\n    Returns\n    -------\n    Table\n\n    \"\"\"\n    attribute_vars, attribute_vals = list(zip(*attributes))\n    attribute_vals = np.array(attribute_vals).T\n\n    target_vars, target_vals = None, None\n    if target is not None:\n        target_vars, target_vals = list(zip(*target))\n        target_vals = np.array(target_vals).T\n\n    meta_vars, meta_vals = None, None\n    if metas is not None:\n        meta_vars, meta_vals = list(zip(*metas))\n        meta_vals = np.array(meta_vals).T\n\n    return Table.from_numpy(\n        Domain(attribute_vars, class_vars=target_vars, metas=meta_vars),\n        X=attribute_vals, Y=target_vals, metas=meta_vals,\n    )\n\n\nclass TestUtils(unittest.TestCase):\n    def test_details(self):\n        \"\"\"Check if details part of the summary is formatted correctly\"\"\"\n        data = Table('zoo')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} categorical\\n' \\\n                  f'Target: categorical\\n' \\\n                  f'Metas: string (not shown)'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = Table('housing')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} numeric\\n' \\\n                  f'Target: numeric\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = Table('heart_disease')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} ' \\\n                  f'(7 categorical, 6 numeric)\\n' \\\n                  f'Target: categorical\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table(\n            [continuous_full, continuous_missing],\n            target=[rgb_full, rgb_missing], metas=[ints_full, ints_missing]\n        )\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} numeric\\n' \\\n                  f'Target: {len(data.domain.class_vars)} categorical\\n' \\\n                  f'Metas: {len(data.domain.metas)} categorical'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table(\n            [continuous_full, time_full, ints_full, rgb_missing],\n            target=[rgb_full, continuous_missing],\n            metas=[string_full, string_missing]\n        )\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} ' \\\n                  f'(2 categorical, 1 numeric, 1 time)\\n' \\\n                  f'Target: {len(data.domain.class_vars)} ' \\\n                  f'(1 categorical, 1 numeric)\\n' \\\n                  f'Metas: {len(data.domain.metas)} string (not shown)'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([time_full, time_missing], target=[ints_missing],\n                          metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} time\\n'\\\n                  f'Target: categorical\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([rgb_full, ints_full], target=None, metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} features\\n' \\\n                  f'Features: {len(data.domain.variables)} categorical\\n' \\\n                  f'Target: —\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([rgb_full], target=None, metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} feature\\n' \\\n                  f'Features: categorical\\n' \\\n                  f'Target: —\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = None\n        self.assertEqual('', format_summary_details(data))\n",
            "new_file_content": "import unittest\nimport datetime\nfrom collections import namedtuple\n\nimport numpy as np\n\nfrom Orange.data import Table, Domain, StringVariable, ContinuousVariable, \\\n    DiscreteVariable, TimeVariable\nfrom Orange.widgets.utils.state_summary import format_summary_details\n\nVarDataPair = namedtuple('VarDataPair', ['variable', 'data'])\n\n# Continuous variable variations\ncontinuous_full = VarDataPair(\n    ContinuousVariable('continuous_full'),\n    np.array([0, 1, 2, 3, 4], dtype=float),\n)\ncontinuous_missing = VarDataPair(\n    ContinuousVariable('continuous_missing'),\n    np.array([0, 1, 2, np.nan, 4], dtype=float),\n)\n\n# Unordered discrete variable variations\nrgb_full = VarDataPair(\n    DiscreteVariable('rgb_full', values=['r', 'g', 'b']),\n    np.array([0, 1, 1, 1, 2], dtype=float),\n)\nrgb_missing = VarDataPair(\n    DiscreteVariable('rgb_missing', values=['r', 'g', 'b']),\n    np.array([0, 1, 1, np.nan, 2], dtype=float),\n)\n\n# Ordered discrete variable variations\nints_full = VarDataPair(\n    DiscreteVariable('ints_full', values=['2', '3', '4'], ordered=True),\n    np.array([0, 1, 1, 1, 2], dtype=float),\n)\nints_missing = VarDataPair(\n    DiscreteVariable('ints_missing', values=['2', '3', '4'], ordered=True),\n    np.array([0, 1, 1, np.nan, 2], dtype=float),\n)\n\n\ndef _to_timestamps(years):\n    return [datetime.datetime(year, 1, 1).timestamp() if not np.isnan(year)\n            else np.nan for year in years]\n\n\ntime_full = VarDataPair(\n    TimeVariable('time_full'),\n    np.array(_to_timestamps([2000, 2001, 2002, 2003, 2004]), dtype=float),\n)\ntime_missing = VarDataPair(\n    TimeVariable('time_missing'),\n    np.array(_to_timestamps([2000, np.nan, 2001, 2003, 2004]), dtype=float),\n)\n\n# String variable variations\nstring_full = VarDataPair(\n    StringVariable('string_full'),\n    np.array(['a', 'b', 'c', 'd', 'e'], dtype=object),\n)\nstring_missing = VarDataPair(\n    StringVariable('string_missing'),\n    np.array(['a', 'b', 'c', StringVariable.Unknown, 'e'], dtype=object),\n)\n\n\ndef make_table(attributes, target=None, metas=None):\n    \"\"\"Build an instance of a table given various variables.\n\n    Parameters\n    ----------\n    attributes : Iterable[Tuple[Variable, np.array]\n    target : Optional[Iterable[Tuple[Variable, np.array]]\n    metas : Optional[Iterable[Tuple[Variable, np.array]]\n\n    Returns\n    -------\n    Table\n\n    \"\"\"\n    attribute_vars, attribute_vals = list(zip(*attributes))\n    attribute_vals = np.array(attribute_vals).T\n\n    target_vars, target_vals = None, None\n    if target is not None:\n        target_vars, target_vals = list(zip(*target))\n        target_vals = np.array(target_vals).T\n\n    meta_vars, meta_vals = None, None\n    if metas is not None:\n        meta_vars, meta_vals = list(zip(*metas))\n        meta_vals = np.array(meta_vals).T\n\n    return Table.from_numpy(\n        Domain(attribute_vars, class_vars=target_vars, metas=meta_vars),\n        X=attribute_vals, Y=target_vals, metas=meta_vals,\n    )\n\n\nclass TestUtils(unittest.TestCase):\n    def test_details(self):\n        \"\"\"Check if details part of the summary is formatted correctly\"\"\"\n        data = Table('zoo')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} variables\\n' \\\n                  f'Features: {len(data.domain.attributes)} categorical\\n' \\\n                  f'Target: categorical\\n' \\\n                  f'Metas: string (not shown)'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = Table('housing')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} variables\\n' \\\n                  f'Features: {len(data.domain.attributes)} numeric\\n' \\\n                  f'Target: numeric\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = Table('heart_disease')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} variables\\n' \\\n                  f'Features: {len(data.domain.attributes)} ' \\\n                  f'(7 categorical, 6 numeric)\\n' \\\n                  f'Target: categorical\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table(\n            [continuous_full, continuous_missing],\n            target=[rgb_full, rgb_missing], metas=[ints_full, ints_missing]\n        )\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} variables\\n' \\\n                  f'Features: {len(data.domain.attributes)} numeric\\n' \\\n                  f'Target: {len(data.domain.class_vars)} categorical\\n' \\\n                  f'Metas: {len(data.domain.metas)} categorical'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table(\n            [continuous_full, time_full, ints_full, rgb_missing],\n            target=[rgb_full, continuous_missing],\n            metas=[string_full, string_missing]\n        )\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} variables\\n' \\\n                  f'Features: {len(data.domain.attributes)} ' \\\n                  f'(2 categorical, 1 numeric, 1 time)\\n' \\\n                  f'Target: {len(data.domain.class_vars)} ' \\\n                  f'(1 categorical, 1 numeric)\\n' \\\n                  f'Metas: {len(data.domain.metas)} string (not shown)'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([time_full, time_missing], target=[ints_missing],\n                          metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} variables\\n' \\\n                  f'Features: {len(data.domain.attributes)} time\\n' \\\n                  f'Target: categorical\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([rgb_full, ints_full], target=None, metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} variables\\n' \\\n                  f'Features: {len(data.domain.variables)} categorical\\n' \\\n                  f'Target: —\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([rgb_full], target=None, metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} variable\\n' \\\n                  f'Features: categorical\\n' \\\n                  f'Target: —\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = None\n        self.assertEqual('', format_summary_details(data))\n\n\nif __name__ == \"__main__\":\n    unittest.main()\n",
            "header": {
                "file": {
                    "path": "Orange/widgets/utils/tests/test_state_summary.py"
                },
                "misc_line": null
            },
            "index_line": {
                "old_commit_hash": "df9a5fbcd",
                "new_commit_hash": "f28885cb0",
                "mode": "100644"
            },
            "is_binary_file": false,
            "binary_line": null,
            "minus_file": {
                "path": "a/Orange/widgets/utils/tests/test_state_summary.py"
            },
            "plus_file": {
                "path": "b/Orange/widgets/utils/tests/test_state_summary.py"
            },
            "hunks": [
                {
                    "descriptor": {
                        "old_range": {
                            "start": 4,
                            "length": 9
                        },
                        "new_range": {
                            "start": 4,
                            "length": 9
                        },
                        "section": "from collections import namedtuple"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "import numpy as np",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "from Orange.widgets.utils.state_summary import format_summary_details",
                                "type": "deleted"
                            },
                            {
                                "content": "from Orange.data import Table, Domain, StringVariable, ContinuousVariable, \\",
                                "type": "context"
                            },
                            {
                                "content": "    DiscreteVariable, TimeVariable",
                                "type": "context"
                            },
                            {
                                "content": "from Orange.widgets.utils.state_summary import format_summary_details",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "VarDataPair = namedtuple('VarDataPair', ['variable', 'data'])",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            }
                        ]
                    },
                    "modified_entities": [
                        {
                            "file_name": "Orange/widgets/utils/tests/test_state_summary.py",
                            "type": "statement",
                            "name": "",
                            "content": "from Orange.widgets.utils.state_summary import format_summary_details",
                            "ast_type_str": "ImportFrom",
                            "start_lineno": 7,
                            "end_lineno": 7,
                            "parent": null
                        }
                    ],
                    "added_entities": [],
                    "deleted_entities": []
                },
                {
                    "descriptor": {
                        "old_range": {
                            "start": 40,
                            "length": 10
                        },
                        "new_range": {
                            "start": 40,
                            "length": 12
                        },
                        "section": "ints_missing = VarDataPair("
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "    np.array([0, 1, 1, np.nan, 2], dtype=float),",
                                "type": "context"
                            },
                            {
                                "content": ")",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "added"
                            },
                            {
                                "content": "def _to_timestamps(years):",
                                "type": "context"
                            },
                            {
                                "content": "    return [datetime.datetime(year, 1, 1).timestamp() if not np.isnan(year)",
                                "type": "context"
                            },
                            {
                                "content": "            else np.nan for year in years]",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "added"
                            },
                            {
                                "content": "time_full = VarDataPair(",
                                "type": "context"
                            },
                            {
                                "content": "    TimeVariable('time_full'),",
                                "type": "context"
                            },
                            {
                                "content": "    np.array(_to_timestamps([2000, 2001, 2002, 2003, 2004]), dtype=float),",
                                "type": "context"
                            }
                        ]
                    },
                    "modified_entities": [],
                    "added_entities": [],
                    "deleted_entities": []
                },
                {
                    "descriptor": {
                        "old_range": {
                            "start": 103,
                            "length": 7
                        },
                        "new_range": {
                            "start": 105,
                            "length": 7
                        },
                        "section": "class TestUtils(unittest.TestCase):"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "        data = Table('zoo')",
                                "type": "context"
                            },
                            {
                                "content": "        n_features = len(data.domain.variables) + len(data.domain.metas)",
                                "type": "context"
                            },
                            {
                                "content": "        details = f'{len(data)} instances, ' \\",
                                "type": "context"
                            },
                            {
                                "content": "                  f'{n_features} features\\n' \\",
                                "type": "deleted"
                            },
                            {
                                "content": "                  f'{n_features} variables\\n' \\",
                                "type": "added"
                            },
                            {
                                "content": "                  f'Features: {len(data.domain.attributes)} categorical\\n' \\",
                                "type": "context"
                            },
                            {
                                "content": "                  f'Target: categorical\\n' \\",
                                "type": "context"
                            },
                            {
                                "content": "                  f'Metas: string (not shown)'",
                                "type": "context"
                            }
                        ]
                    },
                    "modified_entities": [
                        {
                            "file_name": "Orange/widgets/utils/tests/test_state_summary.py",
                            "type": "method",
                            "name": "TestUtils.test_details",
                            "content": "class TestUtils(unittest.TestCase):\n    def test_details(self):\n        \"\"\"Check if details part of the summary is formatted correctly\"\"\"\n        data = Table('zoo')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} categorical\\n' \\\n                  f'Target: categorical\\n' \\\n                  f'Metas: string (not shown)'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = Table('housing')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} numeric\\n' \\\n                  f'Target: numeric\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = Table('heart_disease')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} ' \\\n                  f'(7 categorical, 6 numeric)\\n' \\\n                  f'Target: categorical\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table(\n            [continuous_full, continuous_missing],\n            target=[rgb_full, rgb_missing], metas=[ints_full, ints_missing]\n        )\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} numeric\\n' \\\n                  f'Target: {len(data.domain.class_vars)} categorical\\n' \\\n                  f'Metas: {len(data.domain.metas)} categorical'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table(\n            [continuous_full, time_full, ints_full, rgb_missing],\n            target=[rgb_full, continuous_missing],\n            metas=[string_full, string_missing]\n        )\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} ' \\\n                  f'(2 categorical, 1 numeric, 1 time)\\n' \\\n                  f'Target: {len(data.domain.class_vars)} ' \\\n                  f'(1 categorical, 1 numeric)\\n' \\\n                  f'Metas: {len(data.domain.metas)} string (not shown)'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([time_full, time_missing], target=[ints_missing],\n                          metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} time\\n'\\\n                  f'Target: categorical\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([rgb_full, ints_full], target=None, metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} features\\n' \\\n                  f'Features: {len(data.domain.variables)} categorical\\n' \\\n                  f'Target: —\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([rgb_full], target=None, metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} feature\\n' \\\n                  f'Features: categorical\\n' \\\n                  f'Target: —\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = None\n        self.assertEqual('', format_summary_details(data))",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 101,
                            "end_lineno": 184,
                            "parent": {
                                "file_name": "Orange/widgets/utils/tests/test_state_summary.py",
                                "type": "class",
                                "name": "TestUtils",
                                "content": "class TestUtils(unittest.TestCase):\n    def test_details(self):\n        \"\"\"Check if details part of the summary is formatted correctly\"\"\"\n        data = Table('zoo')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} categorical\\n' \\\n                  f'Target: categorical\\n' \\\n                  f'Metas: string (not shown)'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = Table('housing')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} numeric\\n' \\\n                  f'Target: numeric\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = Table('heart_disease')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} ' \\\n                  f'(7 categorical, 6 numeric)\\n' \\\n                  f'Target: categorical\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table(\n            [continuous_full, continuous_missing],\n            target=[rgb_full, rgb_missing], metas=[ints_full, ints_missing]\n        )\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} numeric\\n' \\\n                  f'Target: {len(data.domain.class_vars)} categorical\\n' \\\n                  f'Metas: {len(data.domain.metas)} categorical'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table(\n            [continuous_full, time_full, ints_full, rgb_missing],\n            target=[rgb_full, continuous_missing],\n            metas=[string_full, string_missing]\n        )\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} ' \\\n                  f'(2 categorical, 1 numeric, 1 time)\\n' \\\n                  f'Target: {len(data.domain.class_vars)} ' \\\n                  f'(1 categorical, 1 numeric)\\n' \\\n                  f'Metas: {len(data.domain.metas)} string (not shown)'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([time_full, time_missing], target=[ints_missing],\n                          metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} time\\n'\\\n                  f'Target: categorical\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([rgb_full, ints_full], target=None, metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} features\\n' \\\n                  f'Features: {len(data.domain.variables)} categorical\\n' \\\n                  f'Target: —\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([rgb_full], target=None, metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} feature\\n' \\\n                  f'Features: categorical\\n' \\\n                  f'Target: —\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = None\n        self.assertEqual('', format_summary_details(data))",
                                "ast_type_str": "ClassDef",
                                "start_lineno": 100,
                                "end_lineno": 184,
                                "parent": null
                            }
                        },
                        {
                            "file_name": "Orange/widgets/utils/tests/test_state_summary.py",
                            "type": "class",
                            "name": "TestUtils",
                            "content": "class TestUtils(unittest.TestCase):\n    def test_details(self):\n        \"\"\"Check if details part of the summary is formatted correctly\"\"\"\n        data = Table('zoo')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} categorical\\n' \\\n                  f'Target: categorical\\n' \\\n                  f'Metas: string (not shown)'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = Table('housing')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} numeric\\n' \\\n                  f'Target: numeric\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = Table('heart_disease')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} ' \\\n                  f'(7 categorical, 6 numeric)\\n' \\\n                  f'Target: categorical\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table(\n            [continuous_full, continuous_missing],\n            target=[rgb_full, rgb_missing], metas=[ints_full, ints_missing]\n        )\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} numeric\\n' \\\n                  f'Target: {len(data.domain.class_vars)} categorical\\n' \\\n                  f'Metas: {len(data.domain.metas)} categorical'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table(\n            [continuous_full, time_full, ints_full, rgb_missing],\n            target=[rgb_full, continuous_missing],\n            metas=[string_full, string_missing]\n        )\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} ' \\\n                  f'(2 categorical, 1 numeric, 1 time)\\n' \\\n                  f'Target: {len(data.domain.class_vars)} ' \\\n                  f'(1 categorical, 1 numeric)\\n' \\\n                  f'Metas: {len(data.domain.metas)} string (not shown)'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([time_full, time_missing], target=[ints_missing],\n                          metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} time\\n'\\\n                  f'Target: categorical\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([rgb_full, ints_full], target=None, metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} features\\n' \\\n                  f'Features: {len(data.domain.variables)} categorical\\n' \\\n                  f'Target: —\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([rgb_full], target=None, metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} feature\\n' \\\n                  f'Features: categorical\\n' \\\n                  f'Target: —\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = None\n        self.assertEqual('', format_summary_details(data))",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 100,
                            "end_lineno": 184,
                            "parent": null
                        }
                    ],
                    "added_entities": [],
                    "deleted_entities": []
                },
                {
                    "descriptor": {
                        "old_range": {
                            "start": 112,
                            "length": 7
                        },
                        "new_range": {
                            "start": 114,
                            "length": 7
                        },
                        "section": "class TestUtils(unittest.TestCase):"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "        data = Table('housing')",
                                "type": "context"
                            },
                            {
                                "content": "        n_features = len(data.domain.variables) + len(data.domain.metas)",
                                "type": "context"
                            },
                            {
                                "content": "        details = f'{len(data)} instances, ' \\",
                                "type": "context"
                            },
                            {
                                "content": "                  f'{n_features} features\\n' \\",
                                "type": "deleted"
                            },
                            {
                                "content": "                  f'{n_features} variables\\n' \\",
                                "type": "added"
                            },
                            {
                                "content": "                  f'Features: {len(data.domain.attributes)} numeric\\n' \\",
                                "type": "context"
                            },
                            {
                                "content": "                  f'Target: numeric\\n' \\",
                                "type": "context"
                            },
                            {
                                "content": "                  f'Metas: —'",
                                "type": "context"
                            }
                        ]
                    },
                    "modified_entities": [
                        {
                            "file_name": "Orange/widgets/utils/tests/test_state_summary.py",
                            "type": "method",
                            "name": "TestUtils.test_details",
                            "content": "class TestUtils(unittest.TestCase):\n    def test_details(self):\n        \"\"\"Check if details part of the summary is formatted correctly\"\"\"\n        data = Table('zoo')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} categorical\\n' \\\n                  f'Target: categorical\\n' \\\n                  f'Metas: string (not shown)'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = Table('housing')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} numeric\\n' \\\n                  f'Target: numeric\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = Table('heart_disease')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} ' \\\n                  f'(7 categorical, 6 numeric)\\n' \\\n                  f'Target: categorical\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table(\n            [continuous_full, continuous_missing],\n            target=[rgb_full, rgb_missing], metas=[ints_full, ints_missing]\n        )\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} numeric\\n' \\\n                  f'Target: {len(data.domain.class_vars)} categorical\\n' \\\n                  f'Metas: {len(data.domain.metas)} categorical'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table(\n            [continuous_full, time_full, ints_full, rgb_missing],\n            target=[rgb_full, continuous_missing],\n            metas=[string_full, string_missing]\n        )\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} ' \\\n                  f'(2 categorical, 1 numeric, 1 time)\\n' \\\n                  f'Target: {len(data.domain.class_vars)} ' \\\n                  f'(1 categorical, 1 numeric)\\n' \\\n                  f'Metas: {len(data.domain.metas)} string (not shown)'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([time_full, time_missing], target=[ints_missing],\n                          metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} time\\n'\\\n                  f'Target: categorical\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([rgb_full, ints_full], target=None, metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} features\\n' \\\n                  f'Features: {len(data.domain.variables)} categorical\\n' \\\n                  f'Target: —\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([rgb_full], target=None, metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} feature\\n' \\\n                  f'Features: categorical\\n' \\\n                  f'Target: —\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = None\n        self.assertEqual('', format_summary_details(data))",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 101,
                            "end_lineno": 184,
                            "parent": {
                                "file_name": "Orange/widgets/utils/tests/test_state_summary.py",
                                "type": "class",
                                "name": "TestUtils",
                                "content": "class TestUtils(unittest.TestCase):\n    def test_details(self):\n        \"\"\"Check if details part of the summary is formatted correctly\"\"\"\n        data = Table('zoo')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} categorical\\n' \\\n                  f'Target: categorical\\n' \\\n                  f'Metas: string (not shown)'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = Table('housing')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} numeric\\n' \\\n                  f'Target: numeric\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = Table('heart_disease')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} ' \\\n                  f'(7 categorical, 6 numeric)\\n' \\\n                  f'Target: categorical\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table(\n            [continuous_full, continuous_missing],\n            target=[rgb_full, rgb_missing], metas=[ints_full, ints_missing]\n        )\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} numeric\\n' \\\n                  f'Target: {len(data.domain.class_vars)} categorical\\n' \\\n                  f'Metas: {len(data.domain.metas)} categorical'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table(\n            [continuous_full, time_full, ints_full, rgb_missing],\n            target=[rgb_full, continuous_missing],\n            metas=[string_full, string_missing]\n        )\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} ' \\\n                  f'(2 categorical, 1 numeric, 1 time)\\n' \\\n                  f'Target: {len(data.domain.class_vars)} ' \\\n                  f'(1 categorical, 1 numeric)\\n' \\\n                  f'Metas: {len(data.domain.metas)} string (not shown)'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([time_full, time_missing], target=[ints_missing],\n                          metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} time\\n'\\\n                  f'Target: categorical\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([rgb_full, ints_full], target=None, metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} features\\n' \\\n                  f'Features: {len(data.domain.variables)} categorical\\n' \\\n                  f'Target: —\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([rgb_full], target=None, metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} feature\\n' \\\n                  f'Features: categorical\\n' \\\n                  f'Target: —\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = None\n        self.assertEqual('', format_summary_details(data))",
                                "ast_type_str": "ClassDef",
                                "start_lineno": 100,
                                "end_lineno": 184,
                                "parent": null
                            }
                        },
                        {
                            "file_name": "Orange/widgets/utils/tests/test_state_summary.py",
                            "type": "class",
                            "name": "TestUtils",
                            "content": "class TestUtils(unittest.TestCase):\n    def test_details(self):\n        \"\"\"Check if details part of the summary is formatted correctly\"\"\"\n        data = Table('zoo')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} categorical\\n' \\\n                  f'Target: categorical\\n' \\\n                  f'Metas: string (not shown)'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = Table('housing')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} numeric\\n' \\\n                  f'Target: numeric\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = Table('heart_disease')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} ' \\\n                  f'(7 categorical, 6 numeric)\\n' \\\n                  f'Target: categorical\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table(\n            [continuous_full, continuous_missing],\n            target=[rgb_full, rgb_missing], metas=[ints_full, ints_missing]\n        )\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} numeric\\n' \\\n                  f'Target: {len(data.domain.class_vars)} categorical\\n' \\\n                  f'Metas: {len(data.domain.metas)} categorical'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table(\n            [continuous_full, time_full, ints_full, rgb_missing],\n            target=[rgb_full, continuous_missing],\n            metas=[string_full, string_missing]\n        )\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} ' \\\n                  f'(2 categorical, 1 numeric, 1 time)\\n' \\\n                  f'Target: {len(data.domain.class_vars)} ' \\\n                  f'(1 categorical, 1 numeric)\\n' \\\n                  f'Metas: {len(data.domain.metas)} string (not shown)'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([time_full, time_missing], target=[ints_missing],\n                          metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} time\\n'\\\n                  f'Target: categorical\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([rgb_full, ints_full], target=None, metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} features\\n' \\\n                  f'Features: {len(data.domain.variables)} categorical\\n' \\\n                  f'Target: —\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([rgb_full], target=None, metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} feature\\n' \\\n                  f'Features: categorical\\n' \\\n                  f'Target: —\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = None\n        self.assertEqual('', format_summary_details(data))",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 100,
                            "end_lineno": 184,
                            "parent": null
                        }
                    ],
                    "added_entities": [],
                    "deleted_entities": []
                },
                {
                    "descriptor": {
                        "old_range": {
                            "start": 121,
                            "length": 7
                        },
                        "new_range": {
                            "start": 123,
                            "length": 7
                        },
                        "section": "class TestUtils(unittest.TestCase):"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "        data = Table('heart_disease')",
                                "type": "context"
                            },
                            {
                                "content": "        n_features = len(data.domain.variables) + len(data.domain.metas)",
                                "type": "context"
                            },
                            {
                                "content": "        details = f'{len(data)} instances, ' \\",
                                "type": "context"
                            },
                            {
                                "content": "                  f'{n_features} features\\n' \\",
                                "type": "deleted"
                            },
                            {
                                "content": "                  f'{n_features} variables\\n' \\",
                                "type": "added"
                            },
                            {
                                "content": "                  f'Features: {len(data.domain.attributes)} ' \\",
                                "type": "context"
                            },
                            {
                                "content": "                  f'(7 categorical, 6 numeric)\\n' \\",
                                "type": "context"
                            },
                            {
                                "content": "                  f'Target: categorical\\n' \\",
                                "type": "context"
                            }
                        ]
                    },
                    "modified_entities": [
                        {
                            "file_name": "Orange/widgets/utils/tests/test_state_summary.py",
                            "type": "method",
                            "name": "TestUtils.test_details",
                            "content": "class TestUtils(unittest.TestCase):\n    def test_details(self):\n        \"\"\"Check if details part of the summary is formatted correctly\"\"\"\n        data = Table('zoo')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} categorical\\n' \\\n                  f'Target: categorical\\n' \\\n                  f'Metas: string (not shown)'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = Table('housing')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} numeric\\n' \\\n                  f'Target: numeric\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = Table('heart_disease')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} ' \\\n                  f'(7 categorical, 6 numeric)\\n' \\\n                  f'Target: categorical\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table(\n            [continuous_full, continuous_missing],\n            target=[rgb_full, rgb_missing], metas=[ints_full, ints_missing]\n        )\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} numeric\\n' \\\n                  f'Target: {len(data.domain.class_vars)} categorical\\n' \\\n                  f'Metas: {len(data.domain.metas)} categorical'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table(\n            [continuous_full, time_full, ints_full, rgb_missing],\n            target=[rgb_full, continuous_missing],\n            metas=[string_full, string_missing]\n        )\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} ' \\\n                  f'(2 categorical, 1 numeric, 1 time)\\n' \\\n                  f'Target: {len(data.domain.class_vars)} ' \\\n                  f'(1 categorical, 1 numeric)\\n' \\\n                  f'Metas: {len(data.domain.metas)} string (not shown)'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([time_full, time_missing], target=[ints_missing],\n                          metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} time\\n'\\\n                  f'Target: categorical\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([rgb_full, ints_full], target=None, metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} features\\n' \\\n                  f'Features: {len(data.domain.variables)} categorical\\n' \\\n                  f'Target: —\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([rgb_full], target=None, metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} feature\\n' \\\n                  f'Features: categorical\\n' \\\n                  f'Target: —\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = None\n        self.assertEqual('', format_summary_details(data))",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 101,
                            "end_lineno": 184,
                            "parent": {
                                "file_name": "Orange/widgets/utils/tests/test_state_summary.py",
                                "type": "class",
                                "name": "TestUtils",
                                "content": "class TestUtils(unittest.TestCase):\n    def test_details(self):\n        \"\"\"Check if details part of the summary is formatted correctly\"\"\"\n        data = Table('zoo')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} categorical\\n' \\\n                  f'Target: categorical\\n' \\\n                  f'Metas: string (not shown)'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = Table('housing')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} numeric\\n' \\\n                  f'Target: numeric\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = Table('heart_disease')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} ' \\\n                  f'(7 categorical, 6 numeric)\\n' \\\n                  f'Target: categorical\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table(\n            [continuous_full, continuous_missing],\n            target=[rgb_full, rgb_missing], metas=[ints_full, ints_missing]\n        )\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} numeric\\n' \\\n                  f'Target: {len(data.domain.class_vars)} categorical\\n' \\\n                  f'Metas: {len(data.domain.metas)} categorical'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table(\n            [continuous_full, time_full, ints_full, rgb_missing],\n            target=[rgb_full, continuous_missing],\n            metas=[string_full, string_missing]\n        )\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} ' \\\n                  f'(2 categorical, 1 numeric, 1 time)\\n' \\\n                  f'Target: {len(data.domain.class_vars)} ' \\\n                  f'(1 categorical, 1 numeric)\\n' \\\n                  f'Metas: {len(data.domain.metas)} string (not shown)'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([time_full, time_missing], target=[ints_missing],\n                          metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} time\\n'\\\n                  f'Target: categorical\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([rgb_full, ints_full], target=None, metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} features\\n' \\\n                  f'Features: {len(data.domain.variables)} categorical\\n' \\\n                  f'Target: —\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([rgb_full], target=None, metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} feature\\n' \\\n                  f'Features: categorical\\n' \\\n                  f'Target: —\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = None\n        self.assertEqual('', format_summary_details(data))",
                                "ast_type_str": "ClassDef",
                                "start_lineno": 100,
                                "end_lineno": 184,
                                "parent": null
                            }
                        },
                        {
                            "file_name": "Orange/widgets/utils/tests/test_state_summary.py",
                            "type": "class",
                            "name": "TestUtils",
                            "content": "class TestUtils(unittest.TestCase):\n    def test_details(self):\n        \"\"\"Check if details part of the summary is formatted correctly\"\"\"\n        data = Table('zoo')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} categorical\\n' \\\n                  f'Target: categorical\\n' \\\n                  f'Metas: string (not shown)'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = Table('housing')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} numeric\\n' \\\n                  f'Target: numeric\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = Table('heart_disease')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} ' \\\n                  f'(7 categorical, 6 numeric)\\n' \\\n                  f'Target: categorical\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table(\n            [continuous_full, continuous_missing],\n            target=[rgb_full, rgb_missing], metas=[ints_full, ints_missing]\n        )\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} numeric\\n' \\\n                  f'Target: {len(data.domain.class_vars)} categorical\\n' \\\n                  f'Metas: {len(data.domain.metas)} categorical'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table(\n            [continuous_full, time_full, ints_full, rgb_missing],\n            target=[rgb_full, continuous_missing],\n            metas=[string_full, string_missing]\n        )\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} ' \\\n                  f'(2 categorical, 1 numeric, 1 time)\\n' \\\n                  f'Target: {len(data.domain.class_vars)} ' \\\n                  f'(1 categorical, 1 numeric)\\n' \\\n                  f'Metas: {len(data.domain.metas)} string (not shown)'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([time_full, time_missing], target=[ints_missing],\n                          metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} time\\n'\\\n                  f'Target: categorical\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([rgb_full, ints_full], target=None, metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} features\\n' \\\n                  f'Features: {len(data.domain.variables)} categorical\\n' \\\n                  f'Target: —\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([rgb_full], target=None, metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} feature\\n' \\\n                  f'Features: categorical\\n' \\\n                  f'Target: —\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = None\n        self.assertEqual('', format_summary_details(data))",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 100,
                            "end_lineno": 184,
                            "parent": null
                        }
                    ],
                    "added_entities": [],
                    "deleted_entities": []
                },
                {
                    "descriptor": {
                        "old_range": {
                            "start": 134,
                            "length": 7
                        },
                        "new_range": {
                            "start": 136,
                            "length": 7
                        },
                        "section": "class TestUtils(unittest.TestCase):"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "        )",
                                "type": "context"
                            },
                            {
                                "content": "        n_features = len(data.domain.variables) + len(data.domain.metas)",
                                "type": "context"
                            },
                            {
                                "content": "        details = f'{len(data)} instances, ' \\",
                                "type": "context"
                            },
                            {
                                "content": "                  f'{n_features} features\\n' \\",
                                "type": "deleted"
                            },
                            {
                                "content": "                  f'{n_features} variables\\n' \\",
                                "type": "added"
                            },
                            {
                                "content": "                  f'Features: {len(data.domain.attributes)} numeric\\n' \\",
                                "type": "context"
                            },
                            {
                                "content": "                  f'Target: {len(data.domain.class_vars)} categorical\\n' \\",
                                "type": "context"
                            },
                            {
                                "content": "                  f'Metas: {len(data.domain.metas)} categorical'",
                                "type": "context"
                            }
                        ]
                    },
                    "modified_entities": [
                        {
                            "file_name": "Orange/widgets/utils/tests/test_state_summary.py",
                            "type": "method",
                            "name": "TestUtils.test_details",
                            "content": "class TestUtils(unittest.TestCase):\n    def test_details(self):\n        \"\"\"Check if details part of the summary is formatted correctly\"\"\"\n        data = Table('zoo')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} categorical\\n' \\\n                  f'Target: categorical\\n' \\\n                  f'Metas: string (not shown)'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = Table('housing')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} numeric\\n' \\\n                  f'Target: numeric\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = Table('heart_disease')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} ' \\\n                  f'(7 categorical, 6 numeric)\\n' \\\n                  f'Target: categorical\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table(\n            [continuous_full, continuous_missing],\n            target=[rgb_full, rgb_missing], metas=[ints_full, ints_missing]\n        )\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} numeric\\n' \\\n                  f'Target: {len(data.domain.class_vars)} categorical\\n' \\\n                  f'Metas: {len(data.domain.metas)} categorical'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table(\n            [continuous_full, time_full, ints_full, rgb_missing],\n            target=[rgb_full, continuous_missing],\n            metas=[string_full, string_missing]\n        )\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} ' \\\n                  f'(2 categorical, 1 numeric, 1 time)\\n' \\\n                  f'Target: {len(data.domain.class_vars)} ' \\\n                  f'(1 categorical, 1 numeric)\\n' \\\n                  f'Metas: {len(data.domain.metas)} string (not shown)'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([time_full, time_missing], target=[ints_missing],\n                          metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} time\\n'\\\n                  f'Target: categorical\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([rgb_full, ints_full], target=None, metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} features\\n' \\\n                  f'Features: {len(data.domain.variables)} categorical\\n' \\\n                  f'Target: —\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([rgb_full], target=None, metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} feature\\n' \\\n                  f'Features: categorical\\n' \\\n                  f'Target: —\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = None\n        self.assertEqual('', format_summary_details(data))",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 101,
                            "end_lineno": 184,
                            "parent": {
                                "file_name": "Orange/widgets/utils/tests/test_state_summary.py",
                                "type": "class",
                                "name": "TestUtils",
                                "content": "class TestUtils(unittest.TestCase):\n    def test_details(self):\n        \"\"\"Check if details part of the summary is formatted correctly\"\"\"\n        data = Table('zoo')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} categorical\\n' \\\n                  f'Target: categorical\\n' \\\n                  f'Metas: string (not shown)'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = Table('housing')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} numeric\\n' \\\n                  f'Target: numeric\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = Table('heart_disease')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} ' \\\n                  f'(7 categorical, 6 numeric)\\n' \\\n                  f'Target: categorical\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table(\n            [continuous_full, continuous_missing],\n            target=[rgb_full, rgb_missing], metas=[ints_full, ints_missing]\n        )\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} numeric\\n' \\\n                  f'Target: {len(data.domain.class_vars)} categorical\\n' \\\n                  f'Metas: {len(data.domain.metas)} categorical'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table(\n            [continuous_full, time_full, ints_full, rgb_missing],\n            target=[rgb_full, continuous_missing],\n            metas=[string_full, string_missing]\n        )\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} ' \\\n                  f'(2 categorical, 1 numeric, 1 time)\\n' \\\n                  f'Target: {len(data.domain.class_vars)} ' \\\n                  f'(1 categorical, 1 numeric)\\n' \\\n                  f'Metas: {len(data.domain.metas)} string (not shown)'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([time_full, time_missing], target=[ints_missing],\n                          metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} time\\n'\\\n                  f'Target: categorical\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([rgb_full, ints_full], target=None, metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} features\\n' \\\n                  f'Features: {len(data.domain.variables)} categorical\\n' \\\n                  f'Target: —\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([rgb_full], target=None, metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} feature\\n' \\\n                  f'Features: categorical\\n' \\\n                  f'Target: —\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = None\n        self.assertEqual('', format_summary_details(data))",
                                "ast_type_str": "ClassDef",
                                "start_lineno": 100,
                                "end_lineno": 184,
                                "parent": null
                            }
                        },
                        {
                            "file_name": "Orange/widgets/utils/tests/test_state_summary.py",
                            "type": "class",
                            "name": "TestUtils",
                            "content": "class TestUtils(unittest.TestCase):\n    def test_details(self):\n        \"\"\"Check if details part of the summary is formatted correctly\"\"\"\n        data = Table('zoo')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} categorical\\n' \\\n                  f'Target: categorical\\n' \\\n                  f'Metas: string (not shown)'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = Table('housing')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} numeric\\n' \\\n                  f'Target: numeric\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = Table('heart_disease')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} ' \\\n                  f'(7 categorical, 6 numeric)\\n' \\\n                  f'Target: categorical\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table(\n            [continuous_full, continuous_missing],\n            target=[rgb_full, rgb_missing], metas=[ints_full, ints_missing]\n        )\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} numeric\\n' \\\n                  f'Target: {len(data.domain.class_vars)} categorical\\n' \\\n                  f'Metas: {len(data.domain.metas)} categorical'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table(\n            [continuous_full, time_full, ints_full, rgb_missing],\n            target=[rgb_full, continuous_missing],\n            metas=[string_full, string_missing]\n        )\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} ' \\\n                  f'(2 categorical, 1 numeric, 1 time)\\n' \\\n                  f'Target: {len(data.domain.class_vars)} ' \\\n                  f'(1 categorical, 1 numeric)\\n' \\\n                  f'Metas: {len(data.domain.metas)} string (not shown)'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([time_full, time_missing], target=[ints_missing],\n                          metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} time\\n'\\\n                  f'Target: categorical\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([rgb_full, ints_full], target=None, metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} features\\n' \\\n                  f'Features: {len(data.domain.variables)} categorical\\n' \\\n                  f'Target: —\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([rgb_full], target=None, metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} feature\\n' \\\n                  f'Features: categorical\\n' \\\n                  f'Target: —\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = None\n        self.assertEqual('', format_summary_details(data))",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 100,
                            "end_lineno": 184,
                            "parent": null
                        }
                    ],
                    "added_entities": [],
                    "deleted_entities": []
                },
                {
                    "descriptor": {
                        "old_range": {
                            "start": 147,
                            "length": 7
                        },
                        "new_range": {
                            "start": 149,
                            "length": 7
                        },
                        "section": "class TestUtils(unittest.TestCase):"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "        )",
                                "type": "context"
                            },
                            {
                                "content": "        n_features = len(data.domain.variables) + len(data.domain.metas)",
                                "type": "context"
                            },
                            {
                                "content": "        details = f'{len(data)} instances, ' \\",
                                "type": "context"
                            },
                            {
                                "content": "                  f'{n_features} features\\n' \\",
                                "type": "deleted"
                            },
                            {
                                "content": "                  f'{n_features} variables\\n' \\",
                                "type": "added"
                            },
                            {
                                "content": "                  f'Features: {len(data.domain.attributes)} ' \\",
                                "type": "context"
                            },
                            {
                                "content": "                  f'(2 categorical, 1 numeric, 1 time)\\n' \\",
                                "type": "context"
                            },
                            {
                                "content": "                  f'Target: {len(data.domain.class_vars)} ' \\",
                                "type": "context"
                            }
                        ]
                    },
                    "modified_entities": [
                        {
                            "file_name": "Orange/widgets/utils/tests/test_state_summary.py",
                            "type": "method",
                            "name": "TestUtils.test_details",
                            "content": "class TestUtils(unittest.TestCase):\n    def test_details(self):\n        \"\"\"Check if details part of the summary is formatted correctly\"\"\"\n        data = Table('zoo')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} categorical\\n' \\\n                  f'Target: categorical\\n' \\\n                  f'Metas: string (not shown)'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = Table('housing')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} numeric\\n' \\\n                  f'Target: numeric\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = Table('heart_disease')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} ' \\\n                  f'(7 categorical, 6 numeric)\\n' \\\n                  f'Target: categorical\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table(\n            [continuous_full, continuous_missing],\n            target=[rgb_full, rgb_missing], metas=[ints_full, ints_missing]\n        )\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} numeric\\n' \\\n                  f'Target: {len(data.domain.class_vars)} categorical\\n' \\\n                  f'Metas: {len(data.domain.metas)} categorical'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table(\n            [continuous_full, time_full, ints_full, rgb_missing],\n            target=[rgb_full, continuous_missing],\n            metas=[string_full, string_missing]\n        )\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} ' \\\n                  f'(2 categorical, 1 numeric, 1 time)\\n' \\\n                  f'Target: {len(data.domain.class_vars)} ' \\\n                  f'(1 categorical, 1 numeric)\\n' \\\n                  f'Metas: {len(data.domain.metas)} string (not shown)'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([time_full, time_missing], target=[ints_missing],\n                          metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} time\\n'\\\n                  f'Target: categorical\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([rgb_full, ints_full], target=None, metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} features\\n' \\\n                  f'Features: {len(data.domain.variables)} categorical\\n' \\\n                  f'Target: —\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([rgb_full], target=None, metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} feature\\n' \\\n                  f'Features: categorical\\n' \\\n                  f'Target: —\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = None\n        self.assertEqual('', format_summary_details(data))",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 101,
                            "end_lineno": 184,
                            "parent": {
                                "file_name": "Orange/widgets/utils/tests/test_state_summary.py",
                                "type": "class",
                                "name": "TestUtils",
                                "content": "class TestUtils(unittest.TestCase):\n    def test_details(self):\n        \"\"\"Check if details part of the summary is formatted correctly\"\"\"\n        data = Table('zoo')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} categorical\\n' \\\n                  f'Target: categorical\\n' \\\n                  f'Metas: string (not shown)'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = Table('housing')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} numeric\\n' \\\n                  f'Target: numeric\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = Table('heart_disease')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} ' \\\n                  f'(7 categorical, 6 numeric)\\n' \\\n                  f'Target: categorical\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table(\n            [continuous_full, continuous_missing],\n            target=[rgb_full, rgb_missing], metas=[ints_full, ints_missing]\n        )\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} numeric\\n' \\\n                  f'Target: {len(data.domain.class_vars)} categorical\\n' \\\n                  f'Metas: {len(data.domain.metas)} categorical'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table(\n            [continuous_full, time_full, ints_full, rgb_missing],\n            target=[rgb_full, continuous_missing],\n            metas=[string_full, string_missing]\n        )\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} ' \\\n                  f'(2 categorical, 1 numeric, 1 time)\\n' \\\n                  f'Target: {len(data.domain.class_vars)} ' \\\n                  f'(1 categorical, 1 numeric)\\n' \\\n                  f'Metas: {len(data.domain.metas)} string (not shown)'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([time_full, time_missing], target=[ints_missing],\n                          metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} time\\n'\\\n                  f'Target: categorical\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([rgb_full, ints_full], target=None, metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} features\\n' \\\n                  f'Features: {len(data.domain.variables)} categorical\\n' \\\n                  f'Target: —\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([rgb_full], target=None, metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} feature\\n' \\\n                  f'Features: categorical\\n' \\\n                  f'Target: —\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = None\n        self.assertEqual('', format_summary_details(data))",
                                "ast_type_str": "ClassDef",
                                "start_lineno": 100,
                                "end_lineno": 184,
                                "parent": null
                            }
                        },
                        {
                            "file_name": "Orange/widgets/utils/tests/test_state_summary.py",
                            "type": "class",
                            "name": "TestUtils",
                            "content": "class TestUtils(unittest.TestCase):\n    def test_details(self):\n        \"\"\"Check if details part of the summary is formatted correctly\"\"\"\n        data = Table('zoo')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} categorical\\n' \\\n                  f'Target: categorical\\n' \\\n                  f'Metas: string (not shown)'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = Table('housing')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} numeric\\n' \\\n                  f'Target: numeric\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = Table('heart_disease')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} ' \\\n                  f'(7 categorical, 6 numeric)\\n' \\\n                  f'Target: categorical\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table(\n            [continuous_full, continuous_missing],\n            target=[rgb_full, rgb_missing], metas=[ints_full, ints_missing]\n        )\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} numeric\\n' \\\n                  f'Target: {len(data.domain.class_vars)} categorical\\n' \\\n                  f'Metas: {len(data.domain.metas)} categorical'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table(\n            [continuous_full, time_full, ints_full, rgb_missing],\n            target=[rgb_full, continuous_missing],\n            metas=[string_full, string_missing]\n        )\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} ' \\\n                  f'(2 categorical, 1 numeric, 1 time)\\n' \\\n                  f'Target: {len(data.domain.class_vars)} ' \\\n                  f'(1 categorical, 1 numeric)\\n' \\\n                  f'Metas: {len(data.domain.metas)} string (not shown)'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([time_full, time_missing], target=[ints_missing],\n                          metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} time\\n'\\\n                  f'Target: categorical\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([rgb_full, ints_full], target=None, metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} features\\n' \\\n                  f'Features: {len(data.domain.variables)} categorical\\n' \\\n                  f'Target: —\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([rgb_full], target=None, metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} feature\\n' \\\n                  f'Features: categorical\\n' \\\n                  f'Target: —\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = None\n        self.assertEqual('', format_summary_details(data))",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 100,
                            "end_lineno": 184,
                            "parent": null
                        }
                    ],
                    "added_entities": [],
                    "deleted_entities": []
                },
                {
                    "descriptor": {
                        "old_range": {
                            "start": 158,
                            "length": 15
                        },
                        "new_range": {
                            "start": 160,
                            "length": 15
                        },
                        "section": "class TestUtils(unittest.TestCase):"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "        data = make_table([time_full, time_missing], target=[ints_missing],",
                                "type": "context"
                            },
                            {
                                "content": "                          metas=None)",
                                "type": "context"
                            },
                            {
                                "content": "        details = f'{len(data)} instances, ' \\",
                                "type": "context"
                            },
                            {
                                "content": "                  f'{len(data.domain.variables)} features\\n' \\",
                                "type": "deleted"
                            },
                            {
                                "content": "                  f'Features: {len(data.domain.attributes)} time\\n'\\",
                                "type": "deleted"
                            },
                            {
                                "content": "                  f'{len(data.domain.variables)} variables\\n' \\",
                                "type": "added"
                            },
                            {
                                "content": "                  f'Features: {len(data.domain.attributes)} time\\n' \\",
                                "type": "added"
                            },
                            {
                                "content": "                  f'Target: categorical\\n' \\",
                                "type": "context"
                            },
                            {
                                "content": "                  f'Metas: —'",
                                "type": "context"
                            },
                            {
                                "content": "        self.assertEqual(details, format_summary_details(data))",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "        data = make_table([rgb_full, ints_full], target=None, metas=None)",
                                "type": "context"
                            },
                            {
                                "content": "        details = f'{len(data)} instances, ' \\",
                                "type": "context"
                            },
                            {
                                "content": "                  f'{len(data.domain.variables)} features\\n' \\",
                                "type": "deleted"
                            },
                            {
                                "content": "                  f'{len(data.domain.variables)} variables\\n' \\",
                                "type": "added"
                            },
                            {
                                "content": "                  f'Features: {len(data.domain.variables)} categorical\\n' \\",
                                "type": "context"
                            },
                            {
                                "content": "                  f'Target: —\\n' \\",
                                "type": "context"
                            },
                            {
                                "content": "                  f'Metas: —'",
                                "type": "context"
                            }
                        ]
                    },
                    "modified_entities": [
                        {
                            "file_name": "Orange/widgets/utils/tests/test_state_summary.py",
                            "type": "method",
                            "name": "TestUtils.test_details",
                            "content": "class TestUtils(unittest.TestCase):\n    def test_details(self):\n        \"\"\"Check if details part of the summary is formatted correctly\"\"\"\n        data = Table('zoo')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} categorical\\n' \\\n                  f'Target: categorical\\n' \\\n                  f'Metas: string (not shown)'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = Table('housing')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} numeric\\n' \\\n                  f'Target: numeric\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = Table('heart_disease')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} ' \\\n                  f'(7 categorical, 6 numeric)\\n' \\\n                  f'Target: categorical\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table(\n            [continuous_full, continuous_missing],\n            target=[rgb_full, rgb_missing], metas=[ints_full, ints_missing]\n        )\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} numeric\\n' \\\n                  f'Target: {len(data.domain.class_vars)} categorical\\n' \\\n                  f'Metas: {len(data.domain.metas)} categorical'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table(\n            [continuous_full, time_full, ints_full, rgb_missing],\n            target=[rgb_full, continuous_missing],\n            metas=[string_full, string_missing]\n        )\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} ' \\\n                  f'(2 categorical, 1 numeric, 1 time)\\n' \\\n                  f'Target: {len(data.domain.class_vars)} ' \\\n                  f'(1 categorical, 1 numeric)\\n' \\\n                  f'Metas: {len(data.domain.metas)} string (not shown)'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([time_full, time_missing], target=[ints_missing],\n                          metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} time\\n'\\\n                  f'Target: categorical\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([rgb_full, ints_full], target=None, metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} features\\n' \\\n                  f'Features: {len(data.domain.variables)} categorical\\n' \\\n                  f'Target: —\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([rgb_full], target=None, metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} feature\\n' \\\n                  f'Features: categorical\\n' \\\n                  f'Target: —\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = None\n        self.assertEqual('', format_summary_details(data))",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 101,
                            "end_lineno": 184,
                            "parent": {
                                "file_name": "Orange/widgets/utils/tests/test_state_summary.py",
                                "type": "class",
                                "name": "TestUtils",
                                "content": "class TestUtils(unittest.TestCase):\n    def test_details(self):\n        \"\"\"Check if details part of the summary is formatted correctly\"\"\"\n        data = Table('zoo')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} categorical\\n' \\\n                  f'Target: categorical\\n' \\\n                  f'Metas: string (not shown)'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = Table('housing')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} numeric\\n' \\\n                  f'Target: numeric\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = Table('heart_disease')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} ' \\\n                  f'(7 categorical, 6 numeric)\\n' \\\n                  f'Target: categorical\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table(\n            [continuous_full, continuous_missing],\n            target=[rgb_full, rgb_missing], metas=[ints_full, ints_missing]\n        )\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} numeric\\n' \\\n                  f'Target: {len(data.domain.class_vars)} categorical\\n' \\\n                  f'Metas: {len(data.domain.metas)} categorical'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table(\n            [continuous_full, time_full, ints_full, rgb_missing],\n            target=[rgb_full, continuous_missing],\n            metas=[string_full, string_missing]\n        )\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} ' \\\n                  f'(2 categorical, 1 numeric, 1 time)\\n' \\\n                  f'Target: {len(data.domain.class_vars)} ' \\\n                  f'(1 categorical, 1 numeric)\\n' \\\n                  f'Metas: {len(data.domain.metas)} string (not shown)'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([time_full, time_missing], target=[ints_missing],\n                          metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} time\\n'\\\n                  f'Target: categorical\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([rgb_full, ints_full], target=None, metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} features\\n' \\\n                  f'Features: {len(data.domain.variables)} categorical\\n' \\\n                  f'Target: —\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([rgb_full], target=None, metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} feature\\n' \\\n                  f'Features: categorical\\n' \\\n                  f'Target: —\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = None\n        self.assertEqual('', format_summary_details(data))",
                                "ast_type_str": "ClassDef",
                                "start_lineno": 100,
                                "end_lineno": 184,
                                "parent": null
                            }
                        },
                        {
                            "file_name": "Orange/widgets/utils/tests/test_state_summary.py",
                            "type": "class",
                            "name": "TestUtils",
                            "content": "class TestUtils(unittest.TestCase):\n    def test_details(self):\n        \"\"\"Check if details part of the summary is formatted correctly\"\"\"\n        data = Table('zoo')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} categorical\\n' \\\n                  f'Target: categorical\\n' \\\n                  f'Metas: string (not shown)'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = Table('housing')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} numeric\\n' \\\n                  f'Target: numeric\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = Table('heart_disease')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} ' \\\n                  f'(7 categorical, 6 numeric)\\n' \\\n                  f'Target: categorical\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table(\n            [continuous_full, continuous_missing],\n            target=[rgb_full, rgb_missing], metas=[ints_full, ints_missing]\n        )\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} numeric\\n' \\\n                  f'Target: {len(data.domain.class_vars)} categorical\\n' \\\n                  f'Metas: {len(data.domain.metas)} categorical'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table(\n            [continuous_full, time_full, ints_full, rgb_missing],\n            target=[rgb_full, continuous_missing],\n            metas=[string_full, string_missing]\n        )\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} ' \\\n                  f'(2 categorical, 1 numeric, 1 time)\\n' \\\n                  f'Target: {len(data.domain.class_vars)} ' \\\n                  f'(1 categorical, 1 numeric)\\n' \\\n                  f'Metas: {len(data.domain.metas)} string (not shown)'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([time_full, time_missing], target=[ints_missing],\n                          metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} time\\n'\\\n                  f'Target: categorical\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([rgb_full, ints_full], target=None, metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} features\\n' \\\n                  f'Features: {len(data.domain.variables)} categorical\\n' \\\n                  f'Target: —\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([rgb_full], target=None, metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} feature\\n' \\\n                  f'Features: categorical\\n' \\\n                  f'Target: —\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = None\n        self.assertEqual('', format_summary_details(data))",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 100,
                            "end_lineno": 184,
                            "parent": null
                        }
                    ],
                    "added_entities": [],
                    "deleted_entities": []
                },
                {
                    "descriptor": {
                        "old_range": {
                            "start": 174,
                            "length": 7
                        },
                        "new_range": {
                            "start": 176,
                            "length": 7
                        },
                        "section": "class TestUtils(unittest.TestCase):"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "        data = make_table([rgb_full], target=None, metas=None)",
                                "type": "context"
                            },
                            {
                                "content": "        details = f'{len(data)} instances, ' \\",
                                "type": "context"
                            },
                            {
                                "content": "                  f'{len(data.domain.variables)} feature\\n' \\",
                                "type": "deleted"
                            },
                            {
                                "content": "                  f'{len(data.domain.variables)} variable\\n' \\",
                                "type": "added"
                            },
                            {
                                "content": "                  f'Features: categorical\\n' \\",
                                "type": "context"
                            },
                            {
                                "content": "                  f'Target: —\\n' \\",
                                "type": "context"
                            },
                            {
                                "content": "                  f'Metas: —'",
                                "type": "context"
                            }
                        ]
                    },
                    "modified_entities": [
                        {
                            "file_name": "Orange/widgets/utils/tests/test_state_summary.py",
                            "type": "method",
                            "name": "TestUtils.test_details",
                            "content": "class TestUtils(unittest.TestCase):\n    def test_details(self):\n        \"\"\"Check if details part of the summary is formatted correctly\"\"\"\n        data = Table('zoo')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} categorical\\n' \\\n                  f'Target: categorical\\n' \\\n                  f'Metas: string (not shown)'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = Table('housing')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} numeric\\n' \\\n                  f'Target: numeric\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = Table('heart_disease')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} ' \\\n                  f'(7 categorical, 6 numeric)\\n' \\\n                  f'Target: categorical\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table(\n            [continuous_full, continuous_missing],\n            target=[rgb_full, rgb_missing], metas=[ints_full, ints_missing]\n        )\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} numeric\\n' \\\n                  f'Target: {len(data.domain.class_vars)} categorical\\n' \\\n                  f'Metas: {len(data.domain.metas)} categorical'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table(\n            [continuous_full, time_full, ints_full, rgb_missing],\n            target=[rgb_full, continuous_missing],\n            metas=[string_full, string_missing]\n        )\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} ' \\\n                  f'(2 categorical, 1 numeric, 1 time)\\n' \\\n                  f'Target: {len(data.domain.class_vars)} ' \\\n                  f'(1 categorical, 1 numeric)\\n' \\\n                  f'Metas: {len(data.domain.metas)} string (not shown)'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([time_full, time_missing], target=[ints_missing],\n                          metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} time\\n'\\\n                  f'Target: categorical\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([rgb_full, ints_full], target=None, metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} features\\n' \\\n                  f'Features: {len(data.domain.variables)} categorical\\n' \\\n                  f'Target: —\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([rgb_full], target=None, metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} feature\\n' \\\n                  f'Features: categorical\\n' \\\n                  f'Target: —\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = None\n        self.assertEqual('', format_summary_details(data))",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 101,
                            "end_lineno": 184,
                            "parent": {
                                "file_name": "Orange/widgets/utils/tests/test_state_summary.py",
                                "type": "class",
                                "name": "TestUtils",
                                "content": "class TestUtils(unittest.TestCase):\n    def test_details(self):\n        \"\"\"Check if details part of the summary is formatted correctly\"\"\"\n        data = Table('zoo')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} categorical\\n' \\\n                  f'Target: categorical\\n' \\\n                  f'Metas: string (not shown)'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = Table('housing')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} numeric\\n' \\\n                  f'Target: numeric\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = Table('heart_disease')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} ' \\\n                  f'(7 categorical, 6 numeric)\\n' \\\n                  f'Target: categorical\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table(\n            [continuous_full, continuous_missing],\n            target=[rgb_full, rgb_missing], metas=[ints_full, ints_missing]\n        )\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} numeric\\n' \\\n                  f'Target: {len(data.domain.class_vars)} categorical\\n' \\\n                  f'Metas: {len(data.domain.metas)} categorical'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table(\n            [continuous_full, time_full, ints_full, rgb_missing],\n            target=[rgb_full, continuous_missing],\n            metas=[string_full, string_missing]\n        )\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} ' \\\n                  f'(2 categorical, 1 numeric, 1 time)\\n' \\\n                  f'Target: {len(data.domain.class_vars)} ' \\\n                  f'(1 categorical, 1 numeric)\\n' \\\n                  f'Metas: {len(data.domain.metas)} string (not shown)'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([time_full, time_missing], target=[ints_missing],\n                          metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} time\\n'\\\n                  f'Target: categorical\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([rgb_full, ints_full], target=None, metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} features\\n' \\\n                  f'Features: {len(data.domain.variables)} categorical\\n' \\\n                  f'Target: —\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([rgb_full], target=None, metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} feature\\n' \\\n                  f'Features: categorical\\n' \\\n                  f'Target: —\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = None\n        self.assertEqual('', format_summary_details(data))",
                                "ast_type_str": "ClassDef",
                                "start_lineno": 100,
                                "end_lineno": 184,
                                "parent": null
                            }
                        },
                        {
                            "file_name": "Orange/widgets/utils/tests/test_state_summary.py",
                            "type": "class",
                            "name": "TestUtils",
                            "content": "class TestUtils(unittest.TestCase):\n    def test_details(self):\n        \"\"\"Check if details part of the summary is formatted correctly\"\"\"\n        data = Table('zoo')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} categorical\\n' \\\n                  f'Target: categorical\\n' \\\n                  f'Metas: string (not shown)'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = Table('housing')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} numeric\\n' \\\n                  f'Target: numeric\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = Table('heart_disease')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} ' \\\n                  f'(7 categorical, 6 numeric)\\n' \\\n                  f'Target: categorical\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table(\n            [continuous_full, continuous_missing],\n            target=[rgb_full, rgb_missing], metas=[ints_full, ints_missing]\n        )\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} numeric\\n' \\\n                  f'Target: {len(data.domain.class_vars)} categorical\\n' \\\n                  f'Metas: {len(data.domain.metas)} categorical'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table(\n            [continuous_full, time_full, ints_full, rgb_missing],\n            target=[rgb_full, continuous_missing],\n            metas=[string_full, string_missing]\n        )\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} ' \\\n                  f'(2 categorical, 1 numeric, 1 time)\\n' \\\n                  f'Target: {len(data.domain.class_vars)} ' \\\n                  f'(1 categorical, 1 numeric)\\n' \\\n                  f'Metas: {len(data.domain.metas)} string (not shown)'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([time_full, time_missing], target=[ints_missing],\n                          metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} features\\n' \\\n                  f'Features: {len(data.domain.attributes)} time\\n'\\\n                  f'Target: categorical\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([rgb_full, ints_full], target=None, metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} features\\n' \\\n                  f'Features: {len(data.domain.variables)} categorical\\n' \\\n                  f'Target: —\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([rgb_full], target=None, metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} feature\\n' \\\n                  f'Features: categorical\\n' \\\n                  f'Target: —\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = None\n        self.assertEqual('', format_summary_details(data))",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 100,
                            "end_lineno": 184,
                            "parent": null
                        }
                    ],
                    "added_entities": [],
                    "deleted_entities": []
                },
                {
                    "descriptor": {
                        "old_range": {
                            "start": 182,
                            "length": 3
                        },
                        "new_range": {
                            "start": 184,
                            "length": 7
                        },
                        "section": "class TestUtils(unittest.TestCase):"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "        data = None",
                                "type": "context"
                            },
                            {
                                "content": "        self.assertEqual('', format_summary_details(data))",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "added"
                            },
                            {
                                "content": "if __name__ == \"__main__\":",
                                "type": "added"
                            },
                            {
                                "content": "    unittest.main()",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "context"
                            }
                        ]
                    },
                    "modified_entities": [],
                    "added_entities": [
                        {
                            "file_name": "Orange/widgets/utils/tests/test_state_summary.py",
                            "type": "statement",
                            "name": "",
                            "content": "if __name__ == \"__main__\":\n    unittest.main()",
                            "ast_type_str": "If",
                            "start_lineno": 189,
                            "end_lineno": 190,
                            "parent": null
                        }
                    ],
                    "deleted_entities": []
                }
            ]
        }
    ],
    "old_commit_hash": "b48474568b2bd28797b014fced0b27ae615a5a9f^",
    "new_commit_hash": "b48474568b2bd28797b014fced0b27ae615a5a9f",
    "commit_message": "format_summary_details: Replace 'features' with 'variables'",
    "commit_date": "2020-02-14T11:42:12+01:00",
    "metadata": {}
}
{
    "repo_name": "orange3",
    "new_commit_hash": "b48474568b2bd28797b014fced0b27ae615a5a9f",
    "test_file_codes": [
        "import unittest\nimport datetime\nfrom collections import namedtuple\n\nimport numpy as np\n\nfrom Orange.data import Table, Domain, StringVariable, ContinuousVariable, \\\n    DiscreteVariable, TimeVariable\nfrom Orange.widgets.utils.state_summary import format_summary_details\n\nVarDataPair = namedtuple('VarDataPair', ['variable', 'data'])\n\n# Continuous variable variations\ncontinuous_full = VarDataPair(\n    ContinuousVariable('continuous_full'),\n    np.array([0, 1, 2, 3, 4], dtype=float),\n)\ncontinuous_missing = VarDataPair(\n    ContinuousVariable('continuous_missing'),\n    np.array([0, 1, 2, np.nan, 4], dtype=float),\n)\n\n# Unordered discrete variable variations\nrgb_full = VarDataPair(\n    DiscreteVariable('rgb_full', values=['r', 'g', 'b']),\n    np.array([0, 1, 1, 1, 2], dtype=float),\n)\nrgb_missing = VarDataPair(\n    DiscreteVariable('rgb_missing', values=['r', 'g', 'b']),\n    np.array([0, 1, 1, np.nan, 2], dtype=float),\n)\n\n# Ordered discrete variable variations\nints_full = VarDataPair(\n    DiscreteVariable('ints_full', values=['2', '3', '4'], ordered=True),\n    np.array([0, 1, 1, 1, 2], dtype=float),\n)\nints_missing = VarDataPair(\n    DiscreteVariable('ints_missing', values=['2', '3', '4'], ordered=True),\n    np.array([0, 1, 1, np.nan, 2], dtype=float),\n)\n\n\ndef _to_timestamps(years):\n    return [datetime.datetime(year, 1, 1).timestamp() if not np.isnan(year)\n            else np.nan for year in years]\n\n\ntime_full = VarDataPair(\n    TimeVariable('time_full'),\n    np.array(_to_timestamps([2000, 2001, 2002, 2003, 2004]), dtype=float),\n)\ntime_missing = VarDataPair(\n    TimeVariable('time_missing'),\n    np.array(_to_timestamps([2000, np.nan, 2001, 2003, 2004]), dtype=float),\n)\n\n# String variable variations\nstring_full = VarDataPair(\n    StringVariable('string_full'),\n    np.array(['a', 'b', 'c', 'd', 'e'], dtype=object),\n)\nstring_missing = VarDataPair(\n    StringVariable('string_missing'),\n    np.array(['a', 'b', 'c', StringVariable.Unknown, 'e'], dtype=object),\n)\n\n\ndef make_table(attributes, target=None, metas=None):\n    \"\"\"Build an instance of a table given various variables.\n\n    Parameters\n    ----------\n    attributes : Iterable[Tuple[Variable, np.array]\n    target : Optional[Iterable[Tuple[Variable, np.array]]\n    metas : Optional[Iterable[Tuple[Variable, np.array]]\n\n    Returns\n    -------\n    Table\n\n    \"\"\"\n    attribute_vars, attribute_vals = list(zip(*attributes))\n    attribute_vals = np.array(attribute_vals).T\n\n    target_vars, target_vals = None, None\n    if target is not None:\n        target_vars, target_vals = list(zip(*target))\n        target_vals = np.array(target_vals).T\n\n    meta_vars, meta_vals = None, None\n    if metas is not None:\n        meta_vars, meta_vals = list(zip(*metas))\n        meta_vals = np.array(meta_vals).T\n\n    return Table.from_numpy(\n        Domain(attribute_vars, class_vars=target_vars, metas=meta_vars),\n        X=attribute_vals, Y=target_vals, metas=meta_vals,\n    )\n\n\nclass TestUtils(unittest.TestCase):\n    def test_details(self):\n        \"\"\"Check if details part of the summary is formatted correctly\"\"\"\n        data = Table('zoo')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} variables\\n' \\\n                  f'Features: {len(data.domain.attributes)} categorical\\n' \\\n                  f'Target: categorical\\n' \\\n                  f'Metas: string (not shown)'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = Table('housing')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} variables\\n' \\\n                  f'Features: {len(data.domain.attributes)} numeric\\n' \\\n                  f'Target: numeric\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = Table('heart_disease')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} variables\\n' \\\n                  f'Features: {len(data.domain.attributes)} ' \\\n                  f'(7 categorical, 6 numeric)\\n' \\\n                  f'Target: categorical\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table(\n            [continuous_full, continuous_missing],\n            target=[rgb_full, rgb_missing], metas=[ints_full, ints_missing]\n        )\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} variables\\n' \\\n                  f'Features: {len(data.domain.attributes)} numeric\\n' \\\n                  f'Target: {len(data.domain.class_vars)} categorical\\n' \\\n                  f'Metas: {len(data.domain.metas)} categorical'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table(\n            [continuous_full, time_full, ints_full, rgb_missing],\n            target=[rgb_full, continuous_missing],\n            metas=[string_full, string_missing]\n        )\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} variables\\n' \\\n                  f'Features: {len(data.domain.attributes)} ' \\\n                  f'(2 categorical, 1 numeric, 1 time)\\n' \\\n                  f'Target: {len(data.domain.class_vars)} ' \\\n                  f'(1 categorical, 1 numeric)\\n' \\\n                  f'Metas: {len(data.domain.metas)} string (not shown)'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([time_full, time_missing], target=[ints_missing],\n                          metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} variables\\n' \\\n                  f'Features: {len(data.domain.attributes)} time\\n' \\\n                  f'Target: categorical\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([rgb_full, ints_full], target=None, metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} variables\\n' \\\n                  f'Features: {len(data.domain.variables)} categorical\\n' \\\n                  f'Target: —\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = make_table([rgb_full], target=None, metas=None)\n        details = f'{len(data)} instances, ' \\\n                  f'{len(data.domain.variables)} variable\\n' \\\n                  f'Features: categorical\\n' \\\n                  f'Target: —\\n' \\\n                  f'Metas: —'\n        self.assertEqual(details, format_summary_details(data))\n\n        data = None\n        self.assertEqual('', format_summary_details(data))\n\n\nif __name__ == \"__main__\":\n    unittest.main()\n"
    ],
    "test_file_names": [
        "test_1.py"
    ],
    "setup_res_code": 0,
    "setup_res_stdout": "Starting Orange installation attempts...\nAttempting installation with Python 3.7...\nrunning build_ext\nrunning build_src\nbuild_src\nbuilding extension \"Orange.classification._simple_tree\" sources\nbuilding extension \"Orange.classification._tree_scorers\" sources\nbuilding extension \"Orange.data._valuecount\" sources\nbuilding extension \"Orange.data._contingency\" sources\nbuilding extension \"Orange.data._io\" sources\nbuilding extension \"Orange.data._variable\" sources\nbuilding extension \"Orange.distance._distance\" sources\nbuilding extension \"Orange.preprocess._discretize\" sources\nbuilding extension \"Orange.preprocess._relieff\" sources\nbuilding extension \"Orange.projection._som\" sources\nbuilding extension \"Orange.widgets.utils._grid_density\" sources\nbuild_src: building npy-pkg config files\ncustomize UnixCCompiler\nC compiler: cc -pthread -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/tools/deps/include -I/tools/deps/include/ncursesw -fPIC\n\ncreating /tmp/tmp8_mybhel/tmp\ncreating /tmp/tmp8_mybhel/tmp/tmp8_mybhel\ncompile options: '-MMD -MF /tmp/tmp8_mybhel/file.c.d -c'\ncc: /tmp/tmp8_mybhel/file.c\ncustomize UnixCCompiler using build_ext\ncustomize UnixCCompiler\nC compiler: cc -pthread -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/tools/deps/include -I/tools/deps/include/ncursesw -fPIC\n\ncreating /tmp/tmpxthcfxlb/tmp\ncreating /tmp/tmpxthcfxlb/tmp/tmpxthcfxlb\ncompile options: '-MMD -MF /tmp/tmpxthcfxlb/file.c.d -c'\ncc: /tmp/tmpxthcfxlb/file.c\ncustomize UnixCCompiler using build_ext\nbuilding 'Orange.classification._simple_tree' extension\ncompiling C sources\nC compiler: cc -pthread -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/tools/deps/include -I/tools/deps/include/ncursesw -fPIC\n\ncreating build/temp.linux-x86_64-3.7/Orange\ncreating build/temp.linux-x86_64-3.7/Orange/classification\ncompile options: '-I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/include -I/home/gcpuser/.local/share/uv/python/cpython-3.7.9-linux-x86_64-gnu/include/python3.7m -c'\ncc: Orange/classification/_simple_tree.c\ncc -pthread -shared -L/tools/deps/lib build/temp.linux-x86_64-3.7/Orange/classification/_simple_tree.o -L/home/gcpuser/.local/share/uv/python/cpython-3.7.9-linux-x86_64-gnu/lib -lm -lpython3.7m -o Orange/classification/_simple_tree.cpython-37m-x86_64-linux-gnu.so\nbuilding 'Orange.classification._tree_scorers' extension\ncompiling C sources\nC compiler: cc -pthread -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/tools/deps/include -I/tools/deps/include/ncursesw -fPIC\n\ncompile options: '-I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/include -I/home/gcpuser/.local/share/uv/python/cpython-3.7.9-linux-x86_64-gnu/include/python3.7m -c'\ncc: Orange/classification/_tree_scorers.c\ncc -pthread -shared -L/tools/deps/lib build/temp.linux-x86_64-3.7/Orange/classification/_tree_scorers.o -L/home/gcpuser/.local/share/uv/python/cpython-3.7.9-linux-x86_64-gnu/lib -lm -lpython3.7m -o Orange/classification/_tree_scorers.cpython-37m-x86_64-linux-gnu.so\nbuilding 'Orange.data._valuecount' extension\ncompiling C sources\nC compiler: cc -pthread -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/tools/deps/include -I/tools/deps/include/ncursesw -fPIC\n\ncreating build/temp.linux-x86_64-3.7/Orange/data\ncompile options: '-I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/include -I/home/gcpuser/.local/share/uv/python/cpython-3.7.9-linux-x86_64-gnu/include/python3.7m -c'\ncc: Orange/data/_valuecount.c\ncc -pthread -shared -L/tools/deps/lib build/temp.linux-x86_64-3.7/Orange/data/_valuecount.o -L/home/gcpuser/.local/share/uv/python/cpython-3.7.9-linux-x86_64-gnu/lib -lm -lpython3.7m -o Orange/data/_valuecount.cpython-37m-x86_64-linux-gnu.so\nbuilding 'Orange.data._contingency' extension\ncompiling C sources\nC compiler: cc -pthread -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/tools/deps/include -I/tools/deps/include/ncursesw -fPIC\n\ncompile options: '-I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/include -I/home/gcpuser/.local/share/uv/python/cpython-3.7.9-linux-x86_64-gnu/include/python3.7m -c'\ncc: Orange/data/_contingency.c\ncc -pthread -shared -L/tools/deps/lib build/temp.linux-x86_64-3.7/Orange/data/_contingency.o -L/home/gcpuser/.local/share/uv/python/cpython-3.7.9-linux-x86_64-gnu/lib -lm -lpython3.7m -o Orange/data/_contingency.cpython-37m-x86_64-linux-gnu.so\nbuilding 'Orange.data._io' extension\ncompiling C sources\nC compiler: cc -pthread -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/tools/deps/include -I/tools/deps/include/ncursesw -fPIC\n\ncompile options: '-I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/include -I/home/gcpuser/.local/share/uv/python/cpython-3.7.9-linux-x86_64-gnu/include/python3.7m -c'\ncc: Orange/data/_io.c\ncc -pthread -shared -L/tools/deps/lib build/temp.linux-x86_64-3.7/Orange/data/_io.o -L/home/gcpuser/.local/share/uv/python/cpython-3.7.9-linux-x86_64-gnu/lib -lm -lpython3.7m -o Orange/data/_io.cpython-37m-x86_64-linux-gnu.so\nbuilding 'Orange.data._variable' extension\ncompiling C sources\nC compiler: cc -pthread -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/tools/deps/include -I/tools/deps/include/ncursesw -fPIC\n\ncompile options: '-I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/include -I/home/gcpuser/.local/share/uv/python/cpython-3.7.9-linux-x86_64-gnu/include/python3.7m -c'\ncc: Orange/data/_variable.c\ncc -pthread -shared -L/tools/deps/lib build/temp.linux-x86_64-3.7/Orange/data/_variable.o -L/home/gcpuser/.local/share/uv/python/cpython-3.7.9-linux-x86_64-gnu/lib -lm -lpython3.7m -o Orange/data/_variable.cpython-37m-x86_64-linux-gnu.so\nbuilding 'Orange.distance._distance' extension\ncompiling C sources\nC compiler: cc -pthread -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/tools/deps/include -I/tools/deps/include/ncursesw -fPIC\n\ncreating build/temp.linux-x86_64-3.7/Orange/distance\ncompile options: '-I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/include -I/home/gcpuser/.local/share/uv/python/cpython-3.7.9-linux-x86_64-gnu/include/python3.7m -c'\ncc: Orange/distance/_distance.c\ncc -pthread -shared -L/tools/deps/lib build/temp.linux-x86_64-3.7/Orange/distance/_distance.o -L/home/gcpuser/.local/share/uv/python/cpython-3.7.9-linux-x86_64-gnu/lib -lm -lpython3.7m -o Orange/distance/_distance.cpython-37m-x86_64-linux-gnu.so\nbuilding 'Orange.preprocess._discretize' extension\ncompiling C sources\nC compiler: cc -pthread -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/tools/deps/include -I/tools/deps/include/ncursesw -fPIC\n\ncreating build/temp.linux-x86_64-3.7/Orange/preprocess\ncompile options: '-I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/include -I/home/gcpuser/.local/share/uv/python/cpython-3.7.9-linux-x86_64-gnu/include/python3.7m -c'\ncc: Orange/preprocess/_discretize.c\ncc -pthread -shared -L/tools/deps/lib build/temp.linux-x86_64-3.7/Orange/preprocess/_discretize.o -L/home/gcpuser/.local/share/uv/python/cpython-3.7.9-linux-x86_64-gnu/lib -lm -lpython3.7m -o Orange/preprocess/_discretize.cpython-37m-x86_64-linux-gnu.so\nbuilding 'Orange.preprocess._relieff' extension\ncompiling C++ sources\nC compiler: c++ -pthread -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/tools/deps/include -I/tools/deps/include/ncursesw -fPIC\n\ncompile options: '-I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/include -I/home/gcpuser/.local/share/uv/python/cpython-3.7.9-linux-x86_64-gnu/include/python3.7m -c'\nc++: Orange/preprocess/_relieff.cpp\nc++ -pthread -shared -L/tools/deps/lib build/temp.linux-x86_64-3.7/Orange/preprocess/_relieff.o -L/home/gcpuser/.local/share/uv/python/cpython-3.7.9-linux-x86_64-gnu/lib -lm -lpython3.7m -o Orange/preprocess/_relieff.cpython-37m-x86_64-linux-gnu.so\nbuilding 'Orange.projection._som' extension\ncompiling C sources\nC compiler: cc -pthread -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/tools/deps/include -I/tools/deps/include/ncursesw -fPIC\n\ncreating build/temp.linux-x86_64-3.7/Orange/projection\ncompile options: '-I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/include -I/home/gcpuser/.local/share/uv/python/cpython-3.7.9-linux-x86_64-gnu/include/python3.7m -c'\ncc: Orange/projection/_som.c\ncc -pthread -shared -L/tools/deps/lib build/temp.linux-x86_64-3.7/Orange/projection/_som.o -L/home/gcpuser/.local/share/uv/python/cpython-3.7.9-linux-x86_64-gnu/lib -lm -lpython3.7m -o Orange/projection/_som.cpython-37m-x86_64-linux-gnu.so\nbuilding 'Orange.widgets.utils._grid_density' extension\ncompiling C++ sources\nC compiler: c++ -pthread -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/tools/deps/include -I/tools/deps/include/ncursesw -fPIC\n\ncreating build/temp.linux-x86_64-3.7/Orange/widgets\ncreating build/temp.linux-x86_64-3.7/Orange/widgets/utils\ncompile options: '-I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages/numpy/core/include -I/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/include -I/home/gcpuser/.local/share/uv/python/cpython-3.7.9-linux-x86_64-gnu/include/python3.7m -c'\nc++: Orange/widgets/utils/_grid_density.cpp\nc++ -pthread -shared -L/tools/deps/lib build/temp.linux-x86_64-3.7/Orange/widgets/utils/_grid_density.o -L/home/gcpuser/.local/share/uv/python/cpython-3.7.9-linux-x86_64-gnu/lib -lm -lpython3.7m -o Orange/widgets/utils/_grid_density.cpython-37m-x86_64-linux-gnu.so\nrunning develop\nrunning build_scripts\nrunning egg_info\nrunning build_src\nbuild_src\nbuilding extension \"Orange.classification._simple_tree\" sources\nbuilding extension \"Orange.classification._tree_scorers\" sources\nbuilding extension \"Orange.data._valuecount\" sources\nbuilding extension \"Orange.data._contingency\" sources\nbuilding extension \"Orange.data._io\" sources\nbuilding extension \"Orange.data._variable\" sources\nbuilding extension \"Orange.distance._distance\" sources\nbuilding extension \"Orange.preprocess._discretize\" sources\nbuilding extension \"Orange.preprocess._relieff\" sources\nbuilding extension \"Orange.projection._som\" sources\nbuilding extension \"Orange.widgets.utils._grid_density\" sources\nbuild_src: building npy-pkg config files\ncreating Orange3.egg-info\nwriting Orange3.egg-info/PKG-INFO\nwriting dependency_links to Orange3.egg-info/dependency_links.txt\nwriting entry points to Orange3.egg-info/entry_points.txt\nwriting requirements to Orange3.egg-info/requires.txt\nwriting top-level names to Orange3.egg-info/top_level.txt\nwriting manifest file 'Orange3.egg-info/SOURCES.txt'\nreading manifest file 'Orange3.egg-info/SOURCES.txt'\nreading manifest template 'MANIFEST.in'\nwarning: no files found matching 'README*' under directory 'Orange'\nwarning: no files found matching 'LICENSE' under directory 'Orange'\nwarning: no files found matching '*.basket' under directory 'Orange/datasets'\nwarning: no files found matching '*.js' under directory 'Orange/widgets'\nwarning: no files found matching '*.css' under directory 'Orange/widgets'\nwarning: no files found matching '*.html' under directory 'Orange/widgets'\nwarning: no files found matching 'COPYING'\nadding license file 'LICENSE'\nwriting manifest file 'Orange3.egg-info/SOURCES.txt'\nrunning build_ext\ncustomize UnixCCompiler\nC compiler: cc -pthread -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/tools/deps/include -I/tools/deps/include/ncursesw -fPIC\n\ncreating /tmp/tmp63i9ak8v/tmp\ncreating /tmp/tmp63i9ak8v/tmp/tmp63i9ak8v\ncompile options: '-MMD -MF /tmp/tmp63i9ak8v/file.c.d -c'\ncc: /tmp/tmp63i9ak8v/file.c\ncustomize UnixCCompiler using build_ext\ncustomize UnixCCompiler\nC compiler: cc -pthread -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/tools/deps/include -I/tools/deps/include/ncursesw -fPIC\n\ncreating /tmp/tmpyzejf6hu/tmp\ncreating /tmp/tmpyzejf6hu/tmp/tmpyzejf6hu\ncompile options: '-MMD -MF /tmp/tmpyzejf6hu/file.c.d -c'\ncc: /tmp/tmpyzejf6hu/file.c\ncustomize UnixCCompiler using build_ext\nCreating /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages/Orange3.egg-link (link to .)\nAdding Orange3 3.25.0.dev0+b484745 to easy-install.pth file\nInstalling orange-canvas script to /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/bin\n\nInstalled /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f\nProcessing dependencies for Orange3==3.25.0.dev0+b484745\nSearching for XlsxWriter==3.2.0\nBest match: XlsxWriter 3.2.0\nAdding XlsxWriter 3.2.0 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for xlrd==2.0.1\nBest match: xlrd 2.0.1\nAdding xlrd 2.0.1 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for setuptools==59.8.0\nBest match: setuptools 59.8.0\nAdding setuptools 59.8.0 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for serverfiles==0.3.1\nBest match: serverfiles 0.3.1\nAdding serverfiles 0.3.1 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for scipy==1.7.3\nBest match: scipy 1.7.3\nAdding scipy 1.7.3 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for scikit-learn==1.0.2\nBest match: scikit-learn 1.0.2\nAdding scikit-learn 1.0.2 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for requests==2.31.0\nBest match: requests 2.31.0\nAdding requests 2.31.0 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for PyYAML==6.0.1\nBest match: PyYAML 6.0.1\nAdding PyYAML 6.0.1 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for python-louvain==0.16\nBest match: python-louvain 0.16\nAdding python-louvain 0.16 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for pyqtgraph==0.10.0\nBest match: pyqtgraph 0.10.0\nAdding pyqtgraph 0.10.0 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for pip==24.0\nBest match: pip 24.0\nAdding pip 24.0 to easy-install.pth file\nInstalling pip script to /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/bin\nInstalling pip3 script to /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/bin\nInstalling pip3.10 script to /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/bin\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for pandas==1.3.5\nBest match: pandas 1.3.5\nAdding pandas 1.3.5 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for orange-widget-base==4.22.0\nBest match: orange-widget-base 4.22.0\nAdding orange-widget-base 4.22.0 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for orange-canvas-core==0.1.35\nBest match: orange-canvas-core 0.1.35\nAdding orange-canvas-core 0.1.35 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for openpyxl==3.1.3\nBest match: openpyxl 3.1.3\nAdding openpyxl 3.1.3 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for openTSNE==1.0.1\nBest match: openTSNE 1.0.1\nAdding openTSNE 1.0.1 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for numpy==1.17.5\nBest match: numpy 1.17.5\nAdding numpy 1.17.5 to easy-install.pth file\nInstalling f2py script to /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/bin\nInstalling f2py3 script to /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/bin\nInstalling f2py3.7 script to /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/bin\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for networkx==2.6.3\nBest match: networkx 2.6.3\nAdding networkx 2.6.3 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for matplotlib==3.5.3\nBest match: matplotlib 3.5.3\nAdding matplotlib 3.5.3 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for keyrings.alt==4.2.0\nBest match: keyrings.alt 4.2.0\nAdding keyrings.alt 4.2.0 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for keyring==24.1.1\nBest match: keyring 24.1.1\nAdding keyring 24.1.1 to easy-install.pth file\nInstalling keyring script to /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/bin\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for joblib==1.3.2\nBest match: joblib 1.3.2\nAdding joblib 1.3.2 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for docutils==0.20.1\nBest match: docutils 0.20.1\nAdding docutils 0.20.1 to easy-install.pth file\nInstalling docutils script to /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/bin\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for chardet==5.2.0\nBest match: chardet 5.2.0\nAdding chardet 5.2.0 to easy-install.pth file\nInstalling chardetect script to /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/bin\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for Bottleneck==1.4.0\nBest match: Bottleneck 1.4.0\nAdding Bottleneck 1.4.0 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for baycomp==1.0.3\nBest match: baycomp 1.0.3\nAdding baycomp 1.0.3 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for AnyQt==0.2.0\nBest match: AnyQt 0.2.0\nAdding AnyQt 0.2.0 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for threadpoolctl==3.1.0\nBest match: threadpoolctl 3.1.0\nAdding threadpoolctl 3.1.0 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for urllib3==2.0.7\nBest match: urllib3 2.0.7\nAdding urllib3 2.0.7 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for idna==3.10\nBest match: idna 3.10\nAdding idna 3.10 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for certifi==2024.12.14\nBest match: certifi 2024.12.14\nAdding certifi 2024.12.14 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for charset-normalizer==3.4.1\nBest match: charset-normalizer 3.4.1\nAdding charset-normalizer 3.4.1 to easy-install.pth file\nInstalling normalizer script to /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/bin\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for python-dateutil==2.9.0.post0\nBest match: python-dateutil 2.9.0.post0\nAdding python-dateutil 2.9.0.post0 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for pytz==2024.2\nBest match: pytz 2024.2\nAdding pytz 2024.2 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for typing-extensions==4.7.1\nBest match: typing-extensions 4.7.1\nAdding typing-extensions 4.7.1 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for commonmark==0.9.1\nBest match: commonmark 0.9.1\nAdding commonmark 0.9.1 to easy-install.pth file\nInstalling cmark script to /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/bin\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for dictdiffer==0.9.0\nBest match: dictdiffer 0.9.0\nAdding dictdiffer 0.9.0 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for qasync==0.25.0\nBest match: qasync 0.25.0\nAdding qasync 0.25.0 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for packaging==24.0\nBest match: packaging 24.0\nAdding packaging 24.0 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for importlib-metadata==6.7.0\nBest match: importlib-metadata 6.7.0\nAdding importlib-metadata 6.7.0 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for requests-cache==1.1.1\nBest match: requests-cache 1.1.1\nAdding requests-cache 1.1.1 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for et-xmlfile==1.1.0\nBest match: et-xmlfile 1.1.0\nAdding et-xmlfile 1.1.0 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for fonttools==4.38.0\nBest match: fonttools 4.38.0\nAdding fonttools 4.38.0 to easy-install.pth file\nInstalling fonttools script to /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/bin\nInstalling pyftmerge script to /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/bin\nInstalling pyftsubset script to /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/bin\nInstalling ttx script to /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/bin\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for pyparsing==3.1.4\nBest match: pyparsing 3.1.4\nAdding pyparsing 3.1.4 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for kiwisolver==1.4.5\nBest match: kiwisolver 1.4.5\nAdding kiwisolver 1.4.5 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for cycler==0.11.0\nBest match: cycler 0.11.0\nAdding cycler 0.11.0 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for Pillow==9.5.0\nBest match: Pillow 9.5.0\nAdding Pillow 9.5.0 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for jaraco.classes==3.2.3\nBest match: jaraco.classes 3.2.3\nAdding jaraco.classes 3.2.3 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for jeepney==0.8.0\nBest match: jeepney 0.8.0\nAdding jeepney 0.8.0 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for importlib-resources==5.12.0\nBest match: importlib-resources 5.12.0\nAdding importlib-resources 5.12.0 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for SecretStorage==3.3.3\nBest match: SecretStorage 3.3.3\nAdding SecretStorage 3.3.3 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for six==1.17.0\nBest match: six 1.17.0\nAdding six 1.17.0 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for zipp==3.15.0\nBest match: zipp 3.15.0\nAdding zipp 3.15.0 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for platformdirs==4.0.0\nBest match: platformdirs 4.0.0\nAdding platformdirs 4.0.0 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for url-normalize==1.4.3\nBest match: url-normalize 1.4.3\nAdding url-normalize 1.4.3 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for attrs==24.2.0\nBest match: attrs 24.2.0\nAdding attrs 24.2.0 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for cattrs==23.1.2\nBest match: cattrs 23.1.2\nAdding cattrs 23.1.2 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for more-itertools==9.1.0\nBest match: more-itertools 9.1.0\nAdding more-itertools 9.1.0 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for cryptography==44.0.0\nBest match: cryptography 44.0.0\nAdding cryptography 44.0.0 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for exceptiongroup==1.2.2\nBest match: exceptiongroup 1.2.2\nAdding exceptiongroup 1.2.2 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for cffi==1.15.1\nBest match: cffi 1.15.1\nAdding cffi 1.15.1 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nSearching for pycparser==2.21\nBest match: pycparser 2.21\nAdding pycparser 2.21 to easy-install.pth file\n\nUsing /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages\nFinished processing dependencies for Orange3==3.25.0.dev0+b484745\nVerifying Orange installation...\n✅ Orange installation successful!\nSuccessfully installed orange using Python 3.7\n",
    "setup_res_stderr": "Using CPython 3.7.9\nCreating virtual environment at: .venv\nActivate with: source .venv/bin/activate\nResolved 18 packages in 152ms\nPrepared 18 packages in 2ms\nInstalled 18 packages in 119ms\n + cython==0.29.37\n + exceptiongroup==1.2.2\n + importlib-metadata==6.7.0\n + iniconfig==2.0.0\n + numpy==1.17.5\n + packaging==24.0\n + pluggy==1.2.0\n + pyqt5==5.15.10\n + pyqt5-qt5==5.15.16\n + pyqt5-sip==12.13.0\n + pyqtwebengine==5.15.6\n + pyqtwebengine-qt5==5.15.16\n + pytest==7.4.4\n + setuptools==59.8.0\n + tomli==2.0.1\n + typing-extensions==4.7.1\n + wheel==0.42.0\n + zipp==3.15.0\nResolved 48 packages in 279ms\nInstalled 42 packages in 485ms\n + baycomp==1.0.3\n + bottleneck==1.4.0\n + certifi==2024.12.14\n + cffi==1.15.1\n + chardet==5.2.0\n + charset-normalizer==3.4.1\n + cryptography==44.0.0\n + cycler==0.11.0\n + et-xmlfile==1.1.0\n + fonttools==4.38.0\n + idna==3.10\n + importlib-resources==5.12.0\n + jaraco-classes==3.2.3\n + jeepney==0.8.0\n + joblib==1.3.2\n + keyring==24.1.1\n + keyrings-alt==4.2.0\n + kiwisolver==1.4.5\n + matplotlib==3.5.3\n + more-itertools==9.1.0\n + networkx==2.6.3\n + openpyxl==3.1.3\n + opentsne==1.0.1\n + pandas==1.3.5\n + pillow==9.5.0\n + pip==24.0\n + pycparser==2.21\n + pyparsing==3.1.4\n + python-dateutil==2.9.0.post0\n + python-louvain==0.16\n + pytz==2024.2\n + pyyaml==6.0.1\n + requests==2.31.0\n + scikit-learn==1.0.2\n + scipy==1.7.3\n + secretstorage==3.3.3\n + serverfiles==0.3.1\n + six==1.17.0\n + threadpoolctl==3.1.0\n + urllib3==2.0.7\n + xlrd==2.0.1\n + xlsxwriter==3.2.0\nResolved 34 packages in 129ms\nInstalled 13 packages in 21ms\n + anyqt==0.2.0\n + attrs==24.2.0\n + cattrs==23.1.2\n + commonmark==0.9.1\n + dictdiffer==0.9.0\n + docutils==0.20.1\n + orange-canvas-core==0.1.35\n + orange-widget-base==4.22.0\n + platformdirs==4.0.0\n + pyqtgraph==0.10.0\n + qasync==0.25.0\n + requests-cache==1.1.1\n + url-normalize==1.4.3\nResolved 2 packages in 9ms\nInstalled 2 packages in 38ms\n + psycopg2==2.9.9\n + pymssql==2.3.2\nAudited 1 package in 17ms\nAudited 2 packages in 19ms\nOrange/classification/_simple_tree.c: In function ‘gain_ratio_c’:\nOrange/classification/_simple_tree.c:63:9: warning: implicit declaration of function ‘qsort_r’; did you mean ‘qsort’? [-Wimplicit-function-declaration]\n   63 |         qsort_r(base, nel, size, compar, thunk)\n      |         ^~~~~~~\nOrange/classification/_simple_tree.c:147:9: note: in expansion of macro ‘QSORT_R_FUNC’\n  147 |         QSORT_R_FUNC(examples, size, sizeof(struct Example), (void*) &compar_attr, compar_examples);\n      |         ^~~~~~~~~~~~\nIn file included from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/ndarraytypes.h:1830,\n                 from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/ndarrayobject.h:12,\n                 from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/arrayobject.h:4,\n                 from Orange/classification/_tree_scorers.c:567:\n/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/npy_1_7_deprecated_api.h:17:2: warning: #warning \"Using deprecated NumPy API, disable it with \" \"#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION\" [-Wcpp]\n   17 | #warning \"Using deprecated NumPy API, disable it with \" \\\n      |  ^~~~~~~\nOrange/classification/_tree_scorers.c: In function ‘__pyx_pf_6Orange_14classification_13_tree_scorers_2find_threshold_entropy’:\nOrange/classification/_tree_scorers.c:3115:27: warning: comparison of integer expressions of different signedness: ‘unsigned int’ and ‘int’ [-Wsign-compare]\n 3115 |   __pyx_t_7 = ((__pyx_v_N <= __pyx_v_min_leaf) != 0);\n      |                           ^~\nOrange/classification/_tree_scorers.c: In function ‘__pyx_pf_6Orange_14classification_13_tree_scorers_6find_threshold_MSE’:\nOrange/classification/_tree_scorers.c:4619:27: warning: comparison of integer expressions of different signedness: ‘unsigned int’ and ‘int’ [-Wsign-compare]\n 4619 |   __pyx_t_1 = ((__pyx_v_N <= __pyx_v_min_leaf) != 0);\n      |                           ^~\nOrange/classification/_tree_scorers.c: In function ‘__pyx_pf_6Orange_14classification_13_tree_scorers_8find_binarization_MSE’:\nOrange/classification/_tree_scorers.c:5396:43: warning: comparison of integer expressions of different signedness: ‘unsigned int’ and ‘int’ [-Wsign-compare]\n 5396 |           for (__pyx_t_22 = 0; __pyx_t_22 < __pyx_t_21; __pyx_t_22+=1) {\n      |                                           ^\nOrange/classification/_tree_scorers.c:5517:39: warning: comparison of integer expressions of different signedness: ‘unsigned int’ and ‘int’ [-Wsign-compare]\n 5517 |           __pyx_t_27 = ((__pyx_v_left >= __pyx_v_min_leaf) != 0);\n      |                                       ^~\nOrange/classification/_tree_scorers.c:5523:53: warning: comparison of integer expressions of different signedness: ‘unsigned int’ and ‘int’ [-Wsign-compare]\n 5523 |           __pyx_t_27 = (((__pyx_v_N - __pyx_v_left) >= __pyx_v_min_leaf) != 0);\n      |                                                     ^~\nOrange/classification/_tree_scorers.c: In function ‘__pyx_pf_6Orange_14classification_13_tree_scorers_14compute_predictions_csr’:\nOrange/classification/_tree_scorers.c:7051:41: warning: comparison of integer expressions of different signedness: ‘unsigned int’ and ‘int’ [-Wsign-compare]\n 7051 |         for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) {\n      |                                         ^\nOrange/classification/_tree_scorers.c: In function ‘__pyx_pf_6Orange_14classification_13_tree_scorers_16compute_predictions_csc’:\nOrange/classification/_tree_scorers.c:7741:41: warning: comparison of integer expressions of different signedness: ‘unsigned int’ and ‘int’ [-Wsign-compare]\n 7741 |         for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) {\n      |                                         ^\nOrange/classification/_tree_scorers.c:7801:143: warning: comparison of integer expressions of different signedness: ‘__pyx_t_5numpy_int32_t’ {aka ‘int’} and ‘unsigned int’ [-Wsign-compare]\n 7801 |               __pyx_t_17 = (((*((__pyx_t_5numpy_int32_t *) ( /* dim=0 */ (__pyx_v_indices.data + __pyx_t_18 * __pyx_v_indices.strides[0]) ))) != __pyx_v_i) != 0);\n      |                                                                                                                                               ^~\nIn file included from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/ndarraytypes.h:1830,\n                 from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/ndarrayobject.h:12,\n                 from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/arrayobject.h:4,\n                 from Orange/data/_valuecount.c:567:\n/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/npy_1_7_deprecated_api.h:17:2: warning: #warning \"Using deprecated NumPy API, disable it with \" \"#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION\" [-Wcpp]\n   17 | #warning \"Using deprecated NumPy API, disable it with \" \\\n      |  ^~~~~~~\nIn file included from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/ndarraytypes.h:1830,\n                 from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/ndarrayobject.h:12,\n                 from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/arrayobject.h:4,\n                 from Orange/data/_contingency.c:598:\n/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/npy_1_7_deprecated_api.h:17:2: warning: #warning \"Using deprecated NumPy API, disable it with \" \"#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION\" [-Wcpp]\n   17 | #warning \"Using deprecated NumPy API, disable it with \" \\\n      |  ^~~~~~~\nOrange/data/_io.c: In function ‘__pyx_pf_6Orange_4data_3_io_sparse_read_float.constprop’:\nOrange/data/_io.c:3881:24: warning: ‘__pyx_v_decs’ may be used uninitialized in this function [-Wmaybe-uninitialized]\n 3881 |           __pyx_v_decs = (__pyx_v_decs / 10.0);\n      |           ~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~\nOrange/data/_io.c:4070:24: warning: ‘__pyx_v_value’ may be used uninitialized in this function [-Wmaybe-uninitialized]\n 4070 |           __pyx_t_10 = PyFloat_FromDouble(__pyx_v_value); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 221, __pyx_L5_error)\n      |                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nOrange/data/_io.c:480:40: warning: ‘__pyx_v_attr_index’ may be used uninitialized in this function [-Wmaybe-uninitialized]\n  480 |   #define PyInt_FromLong               PyLong_FromLong\n      |                                        ^~~~~~~~~~~~~~~\nOrange/data/_io.c:1301:7: note: ‘__pyx_v_attr_index’ was declared here\n 1301 |   int __pyx_v_attr_index;\n      |       ^~~~~~~~~~~~~~~~~~\nOrange/data/_io.c:2935:25: warning: ‘__pyx_v_atomp’ may be used uninitialized in this function [-Wmaybe-uninitialized]\n 2935 |           __pyx_v_atomp = (__pyx_v_atomp + 1);\n      |           ~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~\nIn file included from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/ndarraytypes.h:1830,\n                 from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/ndarrayobject.h:12,\n                 from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/arrayobject.h:4,\n                 from Orange/distance/_distance.c:598:\n/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/npy_1_7_deprecated_api.h:17:2: warning: #warning \"Using deprecated NumPy API, disable it with \" \"#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION\" [-Wcpp]\n   17 | #warning \"Using deprecated NumPy API, disable it with \" \\\n      |  ^~~~~~~\nIn file included from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/ndarraytypes.h:1830,\n                 from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/ndarrayobject.h:12,\n                 from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/arrayobject.h:4,\n                 from Orange/preprocess/_discretize.c:567:\n/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/npy_1_7_deprecated_api.h:17:2: warning: #warning \"Using deprecated NumPy API, disable it with \" \"#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION\" [-Wcpp]\n   17 | #warning \"Using deprecated NumPy API, disable it with \" \\\n      |  ^~~~~~~\nIn file included from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/ndarraytypes.h:1830,\n                 from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/ndarrayobject.h:12,\n                 from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/arrayobject.h:4,\n                 from Orange/preprocess/_relieff.cpp:581:\n/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/npy_1_7_deprecated_api.h:17:2: warning: #warning \"Using deprecated NumPy API, disable it with \" \"#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION\" [-Wcpp]\n   17 | #warning \"Using deprecated NumPy API, disable it with \" \\\n      |  ^~~~~~~\nIn file included from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/ndarraytypes.h:1830,\n                 from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/ndarrayobject.h:12,\n                 from /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/arrayobject.h:4,\n                 from Orange/projection/_som.c:598:\n/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages/numpy/core/include/numpy/npy_1_7_deprecated_api.h:17:2: warning: #warning \"Using deprecated NumPy API, disable it with \" \"#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION\" [-Wcpp]\n   17 | #warning \"Using deprecated NumPy API, disable it with \" \\\n      |  ^~~~~~~\nOrange/projection/_som.c: In function ‘__pyx_pw_6Orange_10projection_4_som_5update_hex’:\nOrange/projection/_som.c:3655:7: warning: ‘__pyx_v_win_y’ may be used uninitialized in this function [-Wmaybe-uninitialized]\n 3655 |   int __pyx_v_win_y;\n      |       ^~~~~~~~~~~~~\nOrange/projection/_som.c:3654:7: warning: ‘__pyx_v_win_x’ may be used uninitialized in this function [-Wmaybe-uninitialized]\n 3654 |   int __pyx_v_win_x;\n      |       ^~~~~~~~~~~~~\nOrange/projection/_som.c: In function ‘__pyx_pw_6Orange_10projection_4_som_7get_winners_sparse’:\nOrange/projection/_som.c:4547:223: warning: ‘__pyx_v_win_y’ may be used uninitialized in this function [-Wmaybe-uninitialized]\n 4547 |           *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int16_t *, __pyx_pybuffernd_winners.rcbuffer->pybuffer.buf, __pyx_t_38, __pyx_pybuffernd_winners.diminfo[0].strides, __pyx_t_39, __pyx_pybuffernd_winners.diminfo[1].strides) = __pyx_v_win_y;\n      |           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~\nOrange/projection/_som.c:4114:7: note: ‘__pyx_v_win_y’ was declared here\n 4114 |   int __pyx_v_win_y;\n      |       ^~~~~~~~~~~~~\nOrange/projection/_som.c:4536:223: warning: ‘__pyx_v_win_x’ may be used uninitialized in this function [-Wmaybe-uninitialized]\n 4536 |           *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int16_t *, __pyx_pybuffernd_winners.rcbuffer->pybuffer.buf, __pyx_t_36, __pyx_pybuffernd_winners.diminfo[0].strides, __pyx_t_37, __pyx_pybuffernd_winners.diminfo[1].strides) = __pyx_v_win_x;\n      |           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~\nOrange/projection/_som.c:4113:7: note: ‘__pyx_v_win_x’ was declared here\n 4113 |   int __pyx_v_win_x;\n      |       ^~~~~~~~~~~~~\nOrange/projection/_som.c: In function ‘__pyx_pf_6Orange_10projection_4_som_8update_sparse.constprop’:\nOrange/projection/_som.c:4746:7: warning: ‘__pyx_v_win_y’ may be used uninitialized in this function [-Wmaybe-uninitialized]\n 4746 |   int __pyx_v_win_y;\n      |       ^~~~~~~~~~~~~\nOrange/projection/_som.c:4745:7: warning: ‘__pyx_v_win_x’ may be used uninitialized in this function [-Wmaybe-uninitialized]\n 4745 |   int __pyx_v_win_x;\n      |       ^~~~~~~~~~~~~\nOrange/projection/_som.c: In function ‘__pyx_pw_6Orange_10projection_4_som_3update’:\nOrange/projection/_som.c:3141:7: warning: ‘__pyx_v_win_y’ may be used uninitialized in this function [-Wmaybe-uninitialized]\n 3141 |   int __pyx_v_win_y;\n      |       ^~~~~~~~~~~~~\nOrange/projection/_som.c: In function ‘__pyx_pw_6Orange_10projection_4_som_1get_winners’:\nOrange/projection/_som.c:2964:223: warning: ‘__pyx_v_win_y’ may be used uninitialized in this function [-Wmaybe-uninitialized]\n 2964 |           *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int16_t *, __pyx_pybuffernd_winners.rcbuffer->pybuffer.buf, __pyx_t_27, __pyx_pybuffernd_winners.diminfo[0].strides, __pyx_t_28, __pyx_pybuffernd_winners.diminfo[1].strides) = __pyx_v_win_y;\n      |           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~\nOrange/projection/_som.c:2665:7: note: ‘__pyx_v_win_y’ was declared here\n 2665 |   int __pyx_v_win_y;\n      |       ^~~~~~~~~~~~~\nOrange/projection/_som.c:2953:223: warning: ‘__pyx_v_win_x’ may be used uninitialized in this function [-Wmaybe-uninitialized]\n 2953 |           *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_int16_t *, __pyx_pybuffernd_winners.rcbuffer->pybuffer.buf, __pyx_t_25, __pyx_pybuffernd_winners.diminfo[0].strides, __pyx_t_26, __pyx_pybuffernd_winners.diminfo[1].strides) = __pyx_v_win_x;\n      |           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~\nOrange/projection/_som.c:2664:7: note: ‘__pyx_v_win_x’ was declared here\n 2664 |   int __pyx_v_win_x;\n      |       ^~~~~~~~~~~~~\nOrange/projection/_som.c: In function ‘__pyx_pf_6Orange_10projection_4_som_10update_sparse_hex.constprop’:\nOrange/projection/_som.c:5515:7: warning: ‘__pyx_v_win_y’ may be used uninitialized in this function [-Wmaybe-uninitialized]\n 5515 |   int __pyx_v_win_y;\n      |       ^~~~~~~~~~~~~\nOrange/projection/_som.c:5514:7: warning: ‘__pyx_v_win_x’ may be used uninitialized in this function [-Wmaybe-uninitialized]\n 5514 |   int __pyx_v_win_x;\n      |       ^~~~~~~~~~~~~\n/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages/setuptools/command/install.py:37: SetuptoolsDeprecationWarning: setup.py install is deprecated. Use build and pip and other standards-based tools.\n  setuptools.SetuptoolsDeprecationWarning,\n/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages/setuptools/command/easy_install.py:159: EasyInstallDeprecationWarning: easy_install command is deprecated. Use build and pip and other standards-based tools.\n  EasyInstallDeprecationWarning,\n/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages/setuptools/command/install.py:37: SetuptoolsDeprecationWarning: setup.py install is deprecated. Use build and pip and other standards-based tools.\n  setuptools.SetuptoolsDeprecationWarning,\n/home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f/.venv/lib/python3.7/site-packages/setuptools/command/egg_info.py:628: SetuptoolsDeprecationWarning: Custom 'build_py' does not implement 'get_data_files_without_manifest'.\nPlease extend command classes from setuptools instead of distutils.\n  SetuptoolsDeprecationWarning\n",
    "new_commit_res_code": 0,
    "new_commit_res_stdout": "============================= test session starts ==============================\nplatform linux -- Python 3.7.9, pytest-7.4.4, pluggy-1.2.0\nrootdir: /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f\ncollected 1 item\n\nr2e_tests/test_1.py .                                                    [100%]\n\n==================================== PASSES ====================================\n=========================== short test summary info ============================\nPASSED r2e_tests/test_1.py::TestUtils::test_details\n============================== 1 passed in 1.22s ===============================\n",
    "new_commit_res_stderr": "",
    "old_commit_res_code": 1,
    "old_commit_res_stdout": "============================= test session starts ==============================\nplatform linux -- Python 3.7.9, pytest-7.4.4, pluggy-1.2.0\nrootdir: /home/gcpuser/buckets/local_repoeval_bucket/repos/orange3_b48474568b2bd28797b014fced0b27ae615a5a9f\ncollected 1 item\n\nr2e_tests/test_1.py F                                                    [100%]\n\n=================================== FAILURES ===================================\n____________________________ TestUtils.test_details ____________________________\n\nself = <r2e_tests.test_1.TestUtils testMethod=test_details>\n\n    def test_details(self):\n        \"\"\"Check if details part of the summary is formatted correctly\"\"\"\n        data = Table('zoo')\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = f'{len(data)} instances, ' \\\n                  f'{n_features} variables\\n' \\\n                  f'Features: {len(data.domain.attributes)} categorical\\n' \\\n                  f'Target: categorical\\n' \\\n                  f'Metas: string (not shown)'\n>       self.assertEqual(details, format_summary_details(data))\nE       AssertionError: '101 instances, 18 variables\\nFeatures: 16 categorical\\nTarg[38 chars]own)' != '101 instances, 18 features\\nFeatures: 16 categorical\\nTarge[37 chars]own)'\nE       - 101 instances, 18 variables\nE       ?                   ^  ----\nE       + 101 instances, 18 features\nE       ?                   ^^ ++\nE         Features: 16 categorical\nE         Target: categorical\nE         Metas: string (not shown)\n\nr2e_tests/test_1.py:112: AssertionError\n=========================== short test summary info ============================\nFAILED r2e_tests/test_1.py::TestUtils::test_details - AssertionError: '101 in...\n============================== 1 failed in 1.56s ===============================\n",
    "old_commit_res_stderr": ""
}
Orange/widgets/utils/state_summary.py Orange/widgets/utils/tests/test_state_summary.py
We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
[ISSUE]
### Inconsistent Terminology Between Code and Tests Causes Assertion Failures

**Description**

The `format_summary_details` function currently uses the term "variables" when formatting summary details. However, the existing tests expect the term "features". This inconsistency leads to assertion failures since the output does not match the expected format.

**Example Code**

```python
def format_summary_details(data):
    n_features = len(data.domain.variables) + len(data.domain.metas)
    details = f'{len(data)} instances, {n_features} variables\nFeatures: {features}\nMetas: {metas}'
    return details
```

**Expected Behavior**

The summary details should use the term "features" to maintain consistency with the test expectations. For example:

```
101 instances, 18 features
Features: 16 categorical
Target: categorical
Metas: string (not shown)
```

**Actual Behavior**

Using the term "variables" instead of "features" results in a mismatch with the tests, leading to assertion errors like:

```
AssertionError: '101 instances, 18 variables\nFeatures: 16 categorical\nTarget: categorical\nMetas: string (not shown)' != '101 instances, 18 features\nFeatures: 16 categorical\nTarget: categorical\nMetas: string (not shown)'
```

This prevents tests from passing as the formatted summary does not align with the expected output.

[/ISSUE]
--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.

--- BEGIN FILE ---
```
### Orange/widgets/utils/state_summary.py
from Orange.data import StringVariable, DiscreteVariable, ContinuousVariable, \
    TimeVariable


def format_variables_string(variables):
    """
    A function that formats the descriptive part of the input/output summary for
    either features, targets or metas of the input dataset.

    :param variables: Features, targets or metas of the input dataset
    :return: A formatted string
    """
    if not variables:
        return '—'

    agg = []
    for var_type_name, var_type in [('categorical', DiscreteVariable),
                                    ('numeric', ContinuousVariable),
                                    ('time', TimeVariable),
                                    ('string', StringVariable)]:
        # Disable pylint here because a `TimeVariable` is also a
        # `ContinuousVariable`, and should be labelled as such. That is why
        # it is necessary to check the type this way instead of using
        # `isinstance`, which would fail in the above case
        var_type_list = [v for v in variables if type(v) is var_type]  # pylint: disable=unidiomatic-typecheck
        if var_type_list:
            not_shown = ' (not shown)' if issubclass(var_type, StringVariable)\
                else ''
            agg.append((f'{var_type_name}{not_shown}', len(var_type_list)))

    attrs, counts = list(zip(*agg))
    if len(attrs) > 1:
        var_string = [f'{i} {j}' for i, j in zip(counts, attrs)]
        var_string = f'{sum(counts)} ({", ".join(var_string)})'
    elif counts[0] == 1:
        var_string = attrs[0]
    else:
        var_string = f'{counts[0]} {attrs[0]}'
    return var_string


def format_summary_details(data):
    """
    A function that forms the entire descriptive part of the input/output
    summary.

    :param data: A dataset
    :type data: Orange.data.Table
    :return: A formatted string
    """
    def _plural(number):
        return 's' * (number != 1)

    details = ''
    if data:
        features = format_variables_string(data.domain.attributes)
        targets = format_variables_string(data.domain.class_vars)
        metas = format_variables_string(data.domain.metas)

        n_features = len(data.domain.variables) + len(data.domain.metas)
        details = \
            f'{len(data)} instance{_plural(len(data))}, ' \
            f'{n_features} feature{_plural(n_features)}\n' \
            f'Features: {features}\nTarget: {targets}\nMetas: {metas}'

    return details

```
--- END FILE ---

Please first localize the bug based on the issue statement, and then generate *SEARCH/REPLACE* edits to fix the issue.

Every *SEARCH/REPLACE* edit must use this format:
1. The file path
2. The start of search block: <<<<<<< SEARCH
3. A contiguous chunk of lines to search for in the existing source code
4. The dividing line: =======
5. The lines to replace into the source code
6. The end of the replace block: >>>>>>> REPLACE

Here is an example:

```python
### mathweb/flask/app.py
<<<<<<< SEARCH
from flask import Flask
=======
import math
from flask import Flask
>>>>>>> REPLACE
```
</solution>

Please note that the *SEARCH/REPLACE* edit REQUIRES PROPER INDENTATION. If you would like to add the line '        print(x)', you must fully write that out, with all those spaces before the code!
Wrap each *SEARCH/REPLACE* edit in a code block as shown in the example above. If you have multiple *SEARCH/REPLACE* edits, use a separate code block for each one.
[ISSUE]
### Inconsistent Terminology Between Code and Tests Causes Assertion Failures

**Description**

The `format_summary_details` function currently uses the term "variables" when formatting summary details. However, the existing tests expect the term "features". This inconsistency leads to assertion failures since the output does not match the expected format.

**Example Code**

```python
def format_summary_details(data):
    n_features = len(data.domain.variables) + len(data.domain.metas)
    details = f'{len(data)} instances, {n_features} variables\nFeatures: {features}\nMetas: {metas}'
    return details
```

**Expected Behavior**

The summary details should use the term "features" to maintain consistency with the test expectations. For example:

```
101 instances, 18 features
Features: 16 categorical
Target: categorical
Metas: string (not shown)
```

**Actual Behavior**

Using the term "variables" instead of "features" results in a mismatch with the tests, leading to assertion errors like:

```
AssertionError: '101 instances, 18 variables\nFeatures: 16 categorical\nTarget: categorical\nMetas: string (not shown)' != '101 instances, 18 features\nFeatures: 16 categorical\nTarget: categorical\nMetas: string (not shown)'
```

This prevents tests from passing as the formatted summary does not align with the expected output.

[/ISSUE]
{
    "TestUtils.test_details": "PASSED"
}
diff --git a/Orange/widgets/utils/state_summary.py b/Orange/widgets/utils/state_summary.py
index 17675fe5e..c43f14864 100644
--- a/Orange/widgets/utils/state_summary.py
+++ b/Orange/widgets/utils/state_summary.py
@@ -60,7 +60,7 @@ def format_summary_details(data):
         n_features = len(data.domain.variables) + len(data.domain.metas)
         details = \
             f'{len(data)} instance{_plural(len(data))}, ' \
-            f'{n_features} feature{_plural(n_features)}\n' \
+            f'{n_features} variable{_plural(n_features)}\n' \
             f'Features: {features}\nTarget: {targets}\nMetas: {metas}'
 
     return details

{"Orange/widgets/utils/state_summary.py": "from Orange.data import StringVariable, DiscreteVariable, ContinuousVariable, \\\n    TimeVariable\n\n\ndef format_variables_string(variables):\n    \"\"\"\n    A function that formats the descriptive part of the input/output summary for\n    either features, targets or metas of the input dataset.\n\n    :param variables: Features, targets or metas of the input dataset\n    :return: A formatted string\n    \"\"\"\n    if not variables:\n        return '\u2014'\n\n    agg = []\n    for var_type_name, var_type in [('categorical', DiscreteVariable),\n                                    ('numeric', ContinuousVariable),\n                                    ('time', TimeVariable),\n                                    ('string', StringVariable)]:\n        # Disable pylint here because a `TimeVariable` is also a\n        # `ContinuousVariable`, and should be labelled as such. That is why\n        # it is necessary to check the type this way instead of using\n        # `isinstance`, which would fail in the above case\n        var_type_list = [v for v in variables if type(v) is var_type]  # pylint: disable=unidiomatic-typecheck\n        if var_type_list:\n            not_shown = ' (not shown)' if issubclass(var_type, StringVariable)\\\n                else ''\n            agg.append((f'{var_type_name}{not_shown}', len(var_type_list)))\n\n    attrs, counts = list(zip(*agg))\n    if len(attrs) > 1:\n        var_string = [f'{i} {j}' for i, j in zip(counts, attrs)]\n        var_string = f'{sum(counts)} ({\", \".join(var_string)})'\n    elif counts[0] == 1:\n        var_string = attrs[0]\n    else:\n        var_string = f'{counts[0]} {attrs[0]}'\n    return var_string\n\n\ndef format_summary_details(data):\n    \"\"\"\n    A function that forms the entire descriptive part of the input/output\n    summary.\n\n    :param data: A dataset\n    :type data: Orange.data.Table\n    :return: A formatted string\n    \"\"\"\n    def _plural(number):\n        return 's' * (number != 1)\n\n    details = ''\n    if data:\n        features = format_variables_string(data.domain.attributes)\n        targets = format_variables_string(data.domain.class_vars)\n        metas = format_variables_string(data.domain.metas)\n\n        n_features = len(data.domain.variables) + len(data.domain.metas)\n        details = \\\n            f'{len(data)} instance{_plural(len(data))}, ' \\\n            f'{n_features} feature{_plural(n_features)}\\n' \\\n            f'Features: {features}\\nTarget: {targets}\\nMetas: {metas}'\n\n    return details\n"}
A user will ask you to solve a task. You should first draft your thinking process (inner monologue). Then, generate the solution.

Your response format must follow the template below:
<think>
Your thoughts or/and draft, like working through an exercise on scratch paper. Be as casual and as long as you want until you are confident to generate a correct solution.
</think>
<solution>
Final solution presented to the user.
</solution>
system
We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
[ISSUE]
### Inconsistent Terminology Between Code and Tests Causes Assertion Failures

**Description**

The `format_summary_details` function currently uses the term "variables" when formatting summary details. However, the existing tests expect the term "features". This inconsistency leads to assertion failures since the output does not match the expected format.

**Example Code**

```python
def format_summary_details(data):
    n_features = len(data.domain.variables) + len(data.domain.metas)
    details = f'{len(data)} instances, {n_features} variables\nFeatures: {features}\nMetas: {metas}'
    return details
```

**Expected Behavior**

The summary details should use the term "features" to maintain consistency with the test expectations. For example:

```
101 instances, 18 features
Features: 16 categorical
Target: categorical
Metas: string (not shown)
```

**Actual Behavior**

Using the term "variables" instead of "features" results in a mismatch with the tests, leading to assertion errors like:

```
AssertionError: '101 instances, 18 variables\nFeatures: 16 categorical\nTarget: categorical\nMetas: string (not shown)' != '101 instances, 18 features\nFeatures: 16 categorical\nTarget: categorical\nMetas: string (not shown)'
```

This prevents tests from passing as the formatted summary does not align with the expected output.

[/ISSUE]
--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.

--- BEGIN FILE ---
```
### Orange/widgets/utils/state_summary.py
from Orange.data import StringVariable, DiscreteVariable, ContinuousVariable, \
    TimeVariable


def format_variables_string(variables):
    """
    A function that formats the descriptive part of the input/output summary for
    either features, targets or metas of the input dataset.

    :param variables: Features, targets or metas of the input dataset
    :return: A formatted string
    """
    if not variables:
        return '—'

    agg = []
    for var_type_name, var_type in [('categorical', DiscreteVariable),
                                    ('numeric', ContinuousVariable),
                                    ('time', TimeVariable),
                                    ('string', StringVariable)]:
        # Disable pylint here because a `TimeVariable` is also a
        # `ContinuousVariable`, and should be labelled as such. That is why
        # it is necessary to check the type this way instead of using
        # `isinstance`, which would fail in the above case
        var_type_list = [v for v in variables if type(v) is var_type]  # pylint: disable=unidiomatic-typecheck
        if var_type_list:
            not_shown = ' (not shown)' if issubclass(var_type, StringVariable)\
                else ''
            agg.append((f'{var_type_name}{not_shown}', len(var_type_list)))

    attrs, counts = list(zip(*agg))
    if len(attrs) > 1:
        var_string = [f'{i} {j}' for i, j in zip(counts, attrs)]
        var_string = f'{sum(counts)} ({", ".join(var_string)})'
    elif counts[0] == 1:
        var_string = attrs[0]
    else:
        var_string = f'{counts[0]} {attrs[0]}'
    return var_string


def format_summary_details(data):
    """
    A function that forms the entire descriptive part of the input/output
    summary.

    :param data: A dataset
    :type data: Orange.data.Table
    :return: A formatted string
    """
    def _plural(number):
        return 's' * (number != 1)

    details = ''
    if data:
        features = format_variables_string(data.domain.attributes)
        targets = format_variables_string(data.domain.class_vars)
        metas = format_variables_string(data.domain.metas)

        n_features = len(data.domain.variables) + len(data.domain.metas)
        details = \
            f'{len(data)} instance{_plural(len(data))}, ' \
            f'{n_features} feature{_plural(n_features)}\n' \
            f'Features: {features}\nTarget: {targets}\nMetas: {metas}'

    return details

```
--- END FILE ---

Please first localize the bug based on the issue statement, and then generate *SEARCH/REPLACE* edits to fix the issue.

Every *SEARCH/REPLACE* edit must use this format:
1. The file path
2. The start of search block: <<<<<<< SEARCH
3. A contiguous chunk of lines to search for in the existing source code
4. The dividing line: =======
5. The lines to replace into the source code
6. The end of the replace block: >>>>>>> REPLACE

Here is an example:

```python
### mathweb/flask/app.py
<<<<<<< SEARCH
from flask import Flask
=======
import math
from flask import Flask
>>>>>>> REPLACE
```
</solution>

Please note that the *SEARCH/REPLACE* edit REQUIRES PROPER INDENTATION. If you would like to add the line '        print(x)', you must fully write that out, with all those spaces before the code!
Wrap each *SEARCH/REPLACE* edit in a code block as shown in the example above. If you have multiple *SEARCH/REPLACE* edits, use a separate code block for each one.
user