Via the 'grep -r watcher/ -e "import [A-Z]"' command, we can see that there are many places in the watcher codebase where we are importing classes instead of their parent modules.
The objective would be to tidy up our codebase by refactoring these import statements to import the parent module instead of importing the class directly.
NOTE: sqlalchemy imports shouldn't be fixed as they are an exception to the rule (see http://docs.openstack.org/developer/hacking/#imports)
Here below is the current list of imports to fix:
watcher/db/sqlalchemy/models.py:from sqlalchemy.types import TypeDecorator, TEXT
watcher/common/ceilometer_helper.py:from ceilometerclient.exc import HTTPUnauthorized
watcher/decision_engine/messaging/events.py:from enum import Enum
watcher/decision_engine/model/resource.py:from enum import Enum
watcher/decision_engine/model/power_state.py:from enum import Enum
watcher/decision_engine/model/hypervisor_state.py:from enum import Enum
watcher/decision_engine/model/mapping.py:from threading import Lock
watcher/decision_engine/model/hypervisor.py:from watcher.decision_engine.model.compute_resource import ComputeResource
watcher/decision_engine/model/hypervisor.py:from watcher.decision_engine.model.hypervisor_state import HypervisorState
watcher/decision_engine/model/hypervisor.py:from watcher.decision_engine.model.power_state import PowerState
watcher/decision_engine/model/vm_state.py:from enum import Enum
watcher/decision_engine/model/vm.py:from watcher.decision_engine.model.compute_resource import ComputeResource
watcher/decision_engine/model/vm.py:from watcher.decision_engine.model.vm_state import VMState
watcher/tests/common/loader/test_loader.py:from stevedore.extension import Extension
watcher/tests/common/messaging/test_notification_handler.py:from watcher.common.messaging.notification_handler import NotificationHandler
watcher/tests/common/messaging/test_notification_handler.py:from watcher.common.messaging.utils.observable import Observable
watcher/tests/common/messaging/event/test_event_dispatcher.py:from mock import MagicMock
watcher/tests/common/messaging/event/test_event_dispatcher.py:from watcher.common.messaging.events.event import Event
watcher/tests/common/messaging/event/test_event_dispatcher.py:from watcher.common.messaging.events.event_dispatcher import EventDispatcher
watcher/tests/common/messaging/event/test_event_dispatcher.py:from watcher.decision_engine.messaging.events import Events
watcher/tests/cmd/test_applier.py:from watcher.tests.base import BaseTestCase
watcher/tests/decision_engine/messaging/test_audit_endpoint.py:from watcher.decision_engine.audit.default import DefaultAuditHandler
watcher/tests/decision_engine/messaging/test_audit_endpoint.py:from watcher.decision_engine.messaging.audit_endpoint import AuditEndpoint
watcher/tests/decision_engine/messaging/test_audit_endpoint.py:from watcher.tests.db.base import DbTestCase
watcher/tests/decision_engine/messaging/test_audit_endpoint.py: import FakerModelCollector
watcher/tests/decision_engine/model/test_model.py:from watcher.common.exception import IllegalArgumentException
watcher/tests/decision_engine/model/test_model.py:from watcher.decision_engine.model.hypervisor import Hypervisor
watcher/tests/decision_engine/model/test_model.py:from watcher.decision_engine.model.hypervisor_state import HypervisorState
watcher/tests/decision_engine/model/test_model.py:from watcher.decision_engine.model.model_root import ModelRoot
watcher/tests/decision_engine/model/test_named_element.py:from watcher.decision_engine.model.compute_resource import ComputeResource
watcher/tests/decision_engine/model/test_disk_info.py:from watcher.decision_engine.model.disk_info import DiskInfo
watcher/tests/decision_engine/model/test_vm.py:from watcher.decision_engine.model.vm import VM
watcher/tests/decision_engine/model/test_vm.py:from watcher.decision_engine.model.vm_state import VMState
watcher/tests/decision_engine/test_rpcapi.py:from watcher.decision_engine.rpcapi import DecisionEngineAPI
watcher/tests/applier/test_rpcapi.py:from watcher.applier.rpcapi import ApplierAPI
watcher/tests/objects/test_action_plan.py:from testtools.matchers import HasLength
watcher/tests/objects/test_action.py:from testtools.matchers import HasLength
watcher/tests/objects/test_audit.py:from testtools.matchers import HasLength
watcher/tests/objects/test_efficacy_indicator.py:from testtools.matchers import HasLength
Fix proposed to branch: master /review. openstack. org/332241
Review: https:/