From 8a56dbf58710e8a3bbcfa83ce92c427a6c793fbe Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Fri, 19 Mar 2021 13:41:09 +0100 Subject: [PATCH] Add flake8 comprehensions checks to pre-commit & CI (#48111) --- .pre-commit-config.yaml | 1 + homeassistant/components/denon/media_player.py | 2 +- homeassistant/components/emulated_hue/hue_api.py | 8 +++----- homeassistant/components/flux_led/light.py | 2 +- homeassistant/components/light/__init__.py | 2 +- homeassistant/components/nad/media_player.py | 2 +- homeassistant/components/sms/gateway.py | 4 ++-- homeassistant/components/uk_transport/sensor.py | 4 +--- homeassistant/components/unifi/config_flow.py | 2 +- homeassistant/components/webostv/media_player.py | 2 +- homeassistant/util/dt.py | 2 +- requirements_test_pre_commit.txt | 1 + tests/common.py | 2 +- tests/components/automation/test_trace.py | 2 +- tests/components/group/test_init.py | 2 +- tests/components/zwave/test_init.py | 8 ++++---- tests/helpers/test_json.py | 2 +- tests/util/test_dt.py | 8 ++++---- 18 files changed, 27 insertions(+), 29 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 6629065005a..031d0659aad 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -32,6 +32,7 @@ repos: # default yet due to https://github.com/plinss/flake8-noqa/issues/1 # - flake8-noqa==1.1.0 - pydocstyle==5.1.1 + - flake8-comprehensions==3.4.0 files: ^(homeassistant|script|tests)/.+\.py$ - repo: https://github.com/PyCQA/bandit rev: 1.7.0 diff --git a/homeassistant/components/denon/media_player.py b/homeassistant/components/denon/media_player.py index b909dc7c070..82427f8aa16 100644 --- a/homeassistant/components/denon/media_player.py +++ b/homeassistant/components/denon/media_player.py @@ -230,7 +230,7 @@ class DenonDevice(MediaPlayerEntity): @property def source_list(self): """Return the list of available input sources.""" - return sorted(list(self._source_list)) + return sorted(self._source_list) @property def media_title(self): diff --git a/homeassistant/components/emulated_hue/hue_api.py b/homeassistant/components/emulated_hue/hue_api.py index 1630405a73e..647d9db1335 100644 --- a/homeassistant/components/emulated_hue/hue_api.py +++ b/homeassistant/components/emulated_hue/hue_api.py @@ -391,11 +391,9 @@ class HueOneLightChangeView(HomeAssistantView): return self.json_message("Bad request", HTTP_BAD_REQUEST) if HUE_API_STATE_XY in request_json: try: - parsed[STATE_XY] = tuple( - ( - float(request_json[HUE_API_STATE_XY][0]), - float(request_json[HUE_API_STATE_XY][1]), - ) + parsed[STATE_XY] = ( + float(request_json[HUE_API_STATE_XY][0]), + float(request_json[HUE_API_STATE_XY][1]), ) except ValueError: _LOGGER.error("Unable to parse data (2): %s", request_json) diff --git a/homeassistant/components/flux_led/light.py b/homeassistant/components/flux_led/light.py index 4bfd0c0a26c..2f8d2cc5536 100644 --- a/homeassistant/components/flux_led/light.py +++ b/homeassistant/components/flux_led/light.py @@ -98,7 +98,7 @@ TRANSITION_GRADUAL = "gradual" TRANSITION_JUMP = "jump" TRANSITION_STROBE = "strobe" -FLUX_EFFECT_LIST = sorted(list(EFFECT_MAP)) + [EFFECT_RANDOM] +FLUX_EFFECT_LIST = sorted(EFFECT_MAP) + [EFFECT_RANDOM] CUSTOM_EFFECT_SCHEMA = vol.Schema( { diff --git a/homeassistant/components/light/__init__.py b/homeassistant/components/light/__init__.py index c2e2fdbeaa9..7934874db0b 100644 --- a/homeassistant/components/light/__init__.py +++ b/homeassistant/components/light/__init__.py @@ -610,7 +610,7 @@ class LightEntity(ToggleEntity): data[ATTR_EFFECT_LIST] = self.effect_list data[ATTR_SUPPORTED_COLOR_MODES] = sorted( - list(self._light_internal_supported_color_modes) + self._light_internal_supported_color_modes ) return data diff --git a/homeassistant/components/nad/media_player.py b/homeassistant/components/nad/media_player.py index 782b8735e3a..e7f83c66efa 100644 --- a/homeassistant/components/nad/media_player.py +++ b/homeassistant/components/nad/media_player.py @@ -163,7 +163,7 @@ class NAD(MediaPlayerEntity): @property def source_list(self): """List of available input sources.""" - return sorted(list(self._reverse_mapping)) + return sorted(self._reverse_mapping) @property def available(self): diff --git a/homeassistant/components/sms/gateway.py b/homeassistant/components/sms/gateway.py index e28b3947e37..51667ef8f77 100644 --- a/homeassistant/components/sms/gateway.py +++ b/homeassistant/components/sms/gateway.py @@ -43,7 +43,7 @@ class Gateway: ) entries = self.get_and_delete_all_sms(state_machine) _LOGGER.debug("SMS entries:%s", entries) - data = list() + data = [] for entry in entries: decoded_entry = gammu.DecodeSMS(entry) @@ -78,7 +78,7 @@ class Gateway: start_remaining = remaining # Get all sms start = True - entries = list() + entries = [] all_parts = -1 all_parts_arrived = False _LOGGER.debug("Start remaining:%i", start_remaining) diff --git a/homeassistant/components/uk_transport/sensor.py b/homeassistant/components/uk_transport/sensor.py index 80b97b186be..f5e4b4373c0 100644 --- a/homeassistant/components/uk_transport/sensor.py +++ b/homeassistant/components/uk_transport/sensor.py @@ -32,9 +32,7 @@ CONF_DESTINATION = "destination" _QUERY_SCHEME = vol.Schema( { - vol.Required(CONF_MODE): vol.All( - cv.ensure_list, [vol.In(list(["bus", "train"]))] - ), + vol.Required(CONF_MODE): vol.All(cv.ensure_list, [vol.In(["bus", "train"])]), vol.Required(CONF_ORIGIN): cv.string, vol.Required(CONF_DESTINATION): cv.string, } diff --git a/homeassistant/components/unifi/config_flow.py b/homeassistant/components/unifi/config_flow.py index 6d8c37e8b04..094bae05881 100644 --- a/homeassistant/components/unifi/config_flow.py +++ b/homeassistant/components/unifi/config_flow.py @@ -319,7 +319,7 @@ class UnifiOptionsFlowHandler(config_entries.OptionsFlow): if "name" in wlan } ) - ssid_filter = {ssid: ssid for ssid in sorted(list(ssids))} + ssid_filter = {ssid: ssid for ssid in sorted(ssids)} return self.async_show_form( step_id="device_tracker", diff --git a/homeassistant/components/webostv/media_player.py b/homeassistant/components/webostv/media_player.py index 0fc442b37e9..75c1bdd2bcc 100644 --- a/homeassistant/components/webostv/media_player.py +++ b/homeassistant/components/webostv/media_player.py @@ -271,7 +271,7 @@ class LgWebOSMediaPlayerEntity(MediaPlayerEntity): @property def source_list(self): """List of available input sources.""" - return sorted(list(self._source_list)) + return sorted(self._source_list) @property def media_content_type(self): diff --git a/homeassistant/util/dt.py b/homeassistant/util/dt.py index a659d0add38..aae01c56bf3 100644 --- a/homeassistant/util/dt.py +++ b/homeassistant/util/dt.py @@ -227,7 +227,7 @@ def parse_time_expression(parameter: Any, min_value: int, max_value: int) -> lis elif not hasattr(parameter, "__iter__"): res = [int(parameter)] else: - res = list(sorted(int(x) for x in parameter)) + res = sorted(int(x) for x in parameter) for val in res: if val < min_value or val > max_value: diff --git a/requirements_test_pre_commit.txt b/requirements_test_pre_commit.txt index fd5329a8ca1..be881f09f7c 100644 --- a/requirements_test_pre_commit.txt +++ b/requirements_test_pre_commit.txt @@ -3,6 +3,7 @@ bandit==1.7.0 black==20.8b1 codespell==2.0.0 +flake8-comprehensions==3.4.0 flake8-docstrings==1.5.0 flake8==3.8.4 isort==5.7.0 diff --git a/tests/common.py b/tests/common.py index f1449721c29..5f8626afb4e 100644 --- a/tests/common.py +++ b/tests/common.py @@ -766,7 +766,7 @@ class MockConfigEntry(config_entries.ConfigEntry): def patch_yaml_files(files_dict, endswith=True): """Patch load_yaml with a dictionary of yaml files.""" # match using endswith, start search with longest string - matchlist = sorted(list(files_dict.keys()), key=len) if endswith else [] + matchlist = sorted(files_dict.keys(), key=len) if endswith else [] def mock_open_f(fname, **_): """Mock open() in the yaml module, used by load_yaml.""" diff --git a/tests/components/automation/test_trace.py b/tests/components/automation/test_trace.py index 818f1ee1768..612a0ccfcab 100644 --- a/tests/components/automation/test_trace.py +++ b/tests/components/automation/test_trace.py @@ -32,7 +32,7 @@ def test_json_encoder(hass): # Test serializing a set() data = {"milk", "beer"} - assert sorted(ha_json_enc.default(data)) == sorted(list(data)) + assert sorted(ha_json_enc.default(data)) == sorted(data) # Test serializong object which implements as_dict assert ha_json_enc.default(state) == state.as_dict() diff --git a/tests/components/group/test_init.py b/tests/components/group/test_init.py index 627e3c5bbe0..d68fdd7f717 100644 --- a/tests/components/group/test_init.py +++ b/tests/components/group/test_init.py @@ -579,7 +579,7 @@ async def test_service_group_set_group_remove_group(hass): assert group_state.attributes[group.ATTR_AUTO] assert group_state.attributes["friendly_name"] == "Test2" assert group_state.attributes["icon"] == "mdi:camera" - assert sorted(list(group_state.attributes["entity_id"])) == sorted( + assert sorted(group_state.attributes["entity_id"]) == sorted( ["test.entity_bla1", "test.entity_id2"] ) diff --git a/tests/components/zwave/test_init.py b/tests/components/zwave/test_init.py index e76754a9872..e857675c545 100644 --- a/tests/components/zwave/test_init.py +++ b/tests/components/zwave/test_init.py @@ -861,7 +861,7 @@ async def test_entity_discovery( assert values.primary is value_class.primary assert len(list(values)) == 3 - assert sorted(list(values), key=lambda a: id(a)) == sorted( + assert sorted(values, key=lambda a: id(a)) == sorted( [value_class.primary, None, None], key=lambda a: id(a) ) @@ -885,7 +885,7 @@ async def test_entity_discovery( assert values.secondary is value_class.secondary assert len(list(values)) == 3 - assert sorted(list(values), key=lambda a: id(a)) == sorted( + assert sorted(values, key=lambda a: id(a)) == sorted( [value_class.primary, value_class.secondary, None], key=lambda a: id(a) ) @@ -902,7 +902,7 @@ async def test_entity_discovery( assert values.optional is value_class.optional assert len(list(values)) == 3 - assert sorted(list(values), key=lambda a: id(a)) == sorted( + assert sorted(values, key=lambda a: id(a)) == sorted( [value_class.primary, value_class.secondary, value_class.optional], key=lambda a: id(a), ) @@ -961,7 +961,7 @@ async def test_entity_existing_values( assert values.secondary is value_class.secondary assert values.optional is value_class.optional assert len(list(values)) == 3 - assert sorted(list(values), key=lambda a: id(a)) == sorted( + assert sorted(values, key=lambda a: id(a)) == sorted( [value_class.primary, value_class.secondary, value_class.optional], key=lambda a: id(a), ) diff --git a/tests/helpers/test_json.py b/tests/helpers/test_json.py index 55d566f5edd..1a68f2b8da5 100644 --- a/tests/helpers/test_json.py +++ b/tests/helpers/test_json.py @@ -17,7 +17,7 @@ def test_json_encoder(hass): # Test serializing a set() data = {"milk", "beer"} - assert sorted(ha_json_enc.default(data)) == sorted(list(data)) + assert sorted(ha_json_enc.default(data)) == sorted(data) # Test serializing an object which implements as_dict assert ha_json_enc.default(state) == state.as_dict() diff --git a/tests/util/test_dt.py b/tests/util/test_dt.py index 7c4ca77fd79..1327bc51f8a 100644 --- a/tests/util/test_dt.py +++ b/tests/util/test_dt.py @@ -177,14 +177,14 @@ def test_get_age(): def test_parse_time_expression(): """Test parse_time_expression.""" - assert [x for x in range(60)] == dt_util.parse_time_expression("*", 0, 59) - assert [x for x in range(60)] == dt_util.parse_time_expression(None, 0, 59) + assert list(range(60)) == dt_util.parse_time_expression("*", 0, 59) + assert list(range(60)) == dt_util.parse_time_expression(None, 0, 59) - assert [x for x in range(0, 60, 5)] == dt_util.parse_time_expression("/5", 0, 59) + assert list(range(0, 60, 5)) == dt_util.parse_time_expression("/5", 0, 59) assert [1, 2, 3] == dt_util.parse_time_expression([2, 1, 3], 0, 59) - assert [x for x in range(24)] == dt_util.parse_time_expression("*", 0, 23) + assert list(range(24)) == dt_util.parse_time_expression("*", 0, 23) assert [42] == dt_util.parse_time_expression(42, 0, 59) assert [42] == dt_util.parse_time_expression("42", 0, 59)