Propagate destination of watched folder moves (#70252)
parent
9f15234b92
commit
22b8afe966
|
@ -63,19 +63,30 @@ def create_event_handler(patterns, hass):
|
|||
super().__init__(patterns)
|
||||
self.hass = hass
|
||||
|
||||
def process(self, event):
|
||||
def process(self, event, moved=False):
|
||||
"""On Watcher event, fire HA event."""
|
||||
_LOGGER.debug("process(%s)", event)
|
||||
if not event.is_directory:
|
||||
folder, file_name = os.path.split(event.src_path)
|
||||
fireable = {
|
||||
"event_type": event.event_type,
|
||||
"path": event.src_path,
|
||||
"file": file_name,
|
||||
"folder": folder,
|
||||
}
|
||||
|
||||
if moved:
|
||||
dest_folder, dest_file_name = os.path.split(event.dest_path)
|
||||
fireable.update(
|
||||
{
|
||||
"dest_path": event.dest_path,
|
||||
"dest_file": dest_file_name,
|
||||
"dest_folder": dest_folder,
|
||||
}
|
||||
)
|
||||
self.hass.bus.fire(
|
||||
DOMAIN,
|
||||
{
|
||||
"event_type": event.event_type,
|
||||
"path": event.src_path,
|
||||
"file": file_name,
|
||||
"folder": folder,
|
||||
},
|
||||
fireable,
|
||||
)
|
||||
|
||||
def on_modified(self, event):
|
||||
|
@ -84,7 +95,7 @@ def create_event_handler(patterns, hass):
|
|||
|
||||
def on_moved(self, event):
|
||||
"""File moved."""
|
||||
self.process(event)
|
||||
self.process(event, moved=True)
|
||||
|
||||
def on_created(self, event):
|
||||
"""File created."""
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
"""The tests for the folder_watcher component."""
|
||||
import os
|
||||
from types import SimpleNamespace
|
||||
from unittest.mock import Mock, patch
|
||||
|
||||
from homeassistant.components import folder_watcher
|
||||
|
@ -43,7 +44,9 @@ def test_event():
|
|||
hass = Mock()
|
||||
handler = folder_watcher.create_event_handler(["*"], hass)
|
||||
handler.on_created(
|
||||
Mock(is_directory=False, src_path="/hello/world.txt", event_type="created")
|
||||
SimpleNamespace(
|
||||
is_directory=False, src_path="/hello/world.txt", event_type="created"
|
||||
)
|
||||
)
|
||||
assert hass.bus.fire.called
|
||||
assert hass.bus.fire.mock_calls[0][1][0] == folder_watcher.DOMAIN
|
||||
|
@ -53,3 +56,39 @@ def test_event():
|
|||
"file": "world.txt",
|
||||
"folder": "/hello",
|
||||
}
|
||||
|
||||
|
||||
def test_move_event():
|
||||
"""Check that Home Assistant events are fired correctly on watchdog event."""
|
||||
|
||||
class MockPatternMatchingEventHandler:
|
||||
"""Mock base class for the pattern matcher event handler."""
|
||||
|
||||
def __init__(self, patterns):
|
||||
pass
|
||||
|
||||
with patch(
|
||||
"homeassistant.components.folder_watcher.PatternMatchingEventHandler",
|
||||
MockPatternMatchingEventHandler,
|
||||
):
|
||||
hass = Mock()
|
||||
handler = folder_watcher.create_event_handler(["*"], hass)
|
||||
handler.on_moved(
|
||||
SimpleNamespace(
|
||||
is_directory=False,
|
||||
src_path="/hello/world.txt",
|
||||
dest_path="/hello/earth.txt",
|
||||
event_type="moved",
|
||||
)
|
||||
)
|
||||
assert hass.bus.fire.called
|
||||
assert hass.bus.fire.mock_calls[0][1][0] == folder_watcher.DOMAIN
|
||||
assert hass.bus.fire.mock_calls[0][1][1] == {
|
||||
"event_type": "moved",
|
||||
"path": "/hello/world.txt",
|
||||
"dest_path": "/hello/earth.txt",
|
||||
"file": "world.txt",
|
||||
"dest_file": "earth.txt",
|
||||
"folder": "/hello",
|
||||
"dest_folder": "/hello",
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue