Propagate destination of watched folder moves (#70252)
This commit is contained in:
parent
9f15234b92
commit
22b8afe966
2 changed files with 59 additions and 9 deletions
|
@ -63,19 +63,30 @@ def create_event_handler(patterns, hass):
|
||||||
super().__init__(patterns)
|
super().__init__(patterns)
|
||||||
self.hass = hass
|
self.hass = hass
|
||||||
|
|
||||||
def process(self, event):
|
def process(self, event, moved=False):
|
||||||
"""On Watcher event, fire HA event."""
|
"""On Watcher event, fire HA event."""
|
||||||
_LOGGER.debug("process(%s)", event)
|
_LOGGER.debug("process(%s)", event)
|
||||||
if not event.is_directory:
|
if not event.is_directory:
|
||||||
folder, file_name = os.path.split(event.src_path)
|
folder, file_name = os.path.split(event.src_path)
|
||||||
self.hass.bus.fire(
|
fireable = {
|
||||||
DOMAIN,
|
|
||||||
{
|
|
||||||
"event_type": event.event_type,
|
"event_type": event.event_type,
|
||||||
"path": event.src_path,
|
"path": event.src_path,
|
||||||
"file": file_name,
|
"file": file_name,
|
||||||
"folder": folder,
|
"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,
|
||||||
|
fireable,
|
||||||
)
|
)
|
||||||
|
|
||||||
def on_modified(self, event):
|
def on_modified(self, event):
|
||||||
|
@ -84,7 +95,7 @@ def create_event_handler(patterns, hass):
|
||||||
|
|
||||||
def on_moved(self, event):
|
def on_moved(self, event):
|
||||||
"""File moved."""
|
"""File moved."""
|
||||||
self.process(event)
|
self.process(event, moved=True)
|
||||||
|
|
||||||
def on_created(self, event):
|
def on_created(self, event):
|
||||||
"""File created."""
|
"""File created."""
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
"""The tests for the folder_watcher component."""
|
"""The tests for the folder_watcher component."""
|
||||||
import os
|
import os
|
||||||
|
from types import SimpleNamespace
|
||||||
from unittest.mock import Mock, patch
|
from unittest.mock import Mock, patch
|
||||||
|
|
||||||
from homeassistant.components import folder_watcher
|
from homeassistant.components import folder_watcher
|
||||||
|
@ -43,7 +44,9 @@ def test_event():
|
||||||
hass = Mock()
|
hass = Mock()
|
||||||
handler = folder_watcher.create_event_handler(["*"], hass)
|
handler = folder_watcher.create_event_handler(["*"], hass)
|
||||||
handler.on_created(
|
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.called
|
||||||
assert hass.bus.fire.mock_calls[0][1][0] == folder_watcher.DOMAIN
|
assert hass.bus.fire.mock_calls[0][1][0] == folder_watcher.DOMAIN
|
||||||
|
@ -53,3 +56,39 @@ def test_event():
|
||||||
"file": "world.txt",
|
"file": "world.txt",
|
||||||
"folder": "/hello",
|
"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…
Add table
Add a link
Reference in a new issue