class GeoJsonFeedEntityManager: """Feed Entity Manager for GeoJSON feeds.""" def __init__(self, hass, add_entities, scan_interval, coordinates, url, radius_in_km): """Initialize the GeoJSON Feed Manager.""" self._hass = hass self._feed_manager = GenericFeedManager( self._generate_entity, self._update_entity, self._remove_entity, coordinates, url, filter_radius=radius_in_km, ) self._add_entities = add_entities self._scan_interval = scan_interval def startup(self): """Start up this manager.""" self._feed_manager.update() self._init_regular_updates() def _init_regular_updates(self): """Schedule regular updates at the specified interval.""" track_time_interval(self._hass, lambda now: self._feed_manager.update(), self._scan_interval) def get_entry(self, external_id): """Get feed entry by external id.""" return self._feed_manager.feed_entries.get(external_id) def _generate_entity(self, external_id): """Generate new entity.""" new_entity = GeoJsonLocationEvent(self, external_id) # Add new entities to HA. self._add_entities([new_entity], True) def _update_entity(self, external_id): """Update entity.""" dispatcher_send(self._hass, f"geo_json_events_update_{external_id}") def _remove_entity(self, external_id): """Remove entity.""" dispatcher_send(self._hass, f"geo_json_events_delete_{external_id}")
class GeoJsonFeedEntityManager: """Feed Entity Manager for GeoJSON feeds.""" def __init__(self, hass, add_entities, scan_interval, coordinates, url, radius_in_km): """Initialize the GeoJSON Feed Manager.""" from geojson_client.generic_feed import GenericFeedManager self._hass = hass self._feed_manager = GenericFeedManager( self._generate_entity, self._update_entity, self._remove_entity, coordinates, url, filter_radius=radius_in_km) self._add_entities = add_entities self._scan_interval = scan_interval def startup(self): """Start up this manager.""" self._feed_manager.update() self._init_regular_updates() def _init_regular_updates(self): """Schedule regular updates at the specified interval.""" track_time_interval( self._hass, lambda now: self._feed_manager.update(), self._scan_interval) def get_entry(self, external_id): """Get feed entry by external id.""" return self._feed_manager.feed_entries.get(external_id) def _generate_entity(self, external_id): """Generate new entity.""" new_entity = GeoJsonLocationEvent(self, external_id) # Add new entities to HA. self._add_entities([new_entity], True) def _update_entity(self, external_id): """Update entity.""" dispatcher_send(self._hass, SIGNAL_UPDATE_ENTITY.format(external_id)) def _remove_entity(self, external_id): """Remove entity.""" dispatcher_send(self._hass, SIGNAL_DELETE_ENTITY.format(external_id))
def __init__(self, hass, add_entities, scan_interval, coordinates, url, radius_in_km): """Initialize the GeoJSON Feed Manager.""" from geojson_client.generic_feed import GenericFeedManager self._hass = hass self._feed_manager = GenericFeedManager( self._generate_entity, self._update_entity, self._remove_entity, coordinates, url, filter_radius=radius_in_km) self._add_entities = add_entities self._scan_interval = scan_interval
def test_feed_manager(self, mock_session, mock_request): """Test the feed manager.""" home_coordinates = (-31.0, 151.0) mock_session.return_value.__enter__.return_value.send.return_value.ok = True mock_session.return_value.__enter__.return_value.send.return_value.text = ( load_fixture("generic_feed_1.json") ) # This will just record calls and keep track of external ids. generated_entity_external_ids = [] updated_entity_external_ids = [] removed_entity_external_ids = [] def _generate_entity(external_id): """Generate new entity.""" generated_entity_external_ids.append(external_id) def _update_entity(external_id): """Update entity.""" updated_entity_external_ids.append(external_id) def _remove_entity(external_id): """Remove entity.""" removed_entity_external_ids.append(external_id) feed_manager = GenericFeedManager( _generate_entity, _update_entity, _remove_entity, home_coordinates, None ) assert ( repr(feed_manager) == "<GenericFeedManager(feed=<GenericFeed(" "home=(-31.0, 151.0), url=None, " "radius=None)>)>" ) feed_manager.update() entries = feed_manager.feed_entries self.assertIsNotNone(entries) assert len(entries) == 5 self.assertIsNotNone(feed_manager.last_update) assert len(generated_entity_external_ids) == 5 assert len(updated_entity_external_ids) == 0 assert len(removed_entity_external_ids) == 0 feed_entry = entries.get("3456") assert feed_entry.title == "Title 1" assert feed_entry.external_id == "3456" assert feed_entry.coordinates == (-37.2345, 149.1234) self.assertAlmostEqual(feed_entry.distance_to_home, 714.4, 1) assert repr(feed_entry) == "<GenericFeedEntry(id=3456)>" feed_entry = entries.get("4567") assert feed_entry.title == "Title 2" assert feed_entry.external_id == "4567" feed_entry = entries.get("Title 3") assert feed_entry.title == "Title 3" assert feed_entry.external_id == "Title 3" external_id = hash((-37.8901, 149.7890)) feed_entry = entries.get(external_id) self.assertIsNone(feed_entry.title) assert feed_entry.external_id == external_id feed_entry = entries.get("7890") assert feed_entry.title == "Title 5" assert feed_entry.external_id == "7890" # Simulate an update with several changes. generated_entity_external_ids.clear() updated_entity_external_ids.clear() removed_entity_external_ids.clear() mock_session.return_value.__enter__.return_value.send.return_value.text = ( load_fixture("generic_feed_2.json") ) feed_manager.update() entries = feed_manager.feed_entries self.assertIsNotNone(entries) assert len(entries) == 3 assert len(generated_entity_external_ids) == 1 assert len(updated_entity_external_ids) == 2 assert len(removed_entity_external_ids) == 3 feed_entry = entries.get("3456") assert feed_entry.title == "Title 1 UPDATED" feed_entry = entries.get("4567") assert feed_entry.title == "Title 2" feed_entry = entries.get("8901") assert feed_entry.title == "Title 6" # Simulate an update with no data. generated_entity_external_ids.clear() updated_entity_external_ids.clear() removed_entity_external_ids.clear() mock_session.return_value.__enter__.return_value.send.return_value.ok = False feed_manager.update() entries = feed_manager.feed_entries assert len(entries) == 0 assert len(generated_entity_external_ids) == 0 assert len(updated_entity_external_ids) == 0 assert len(removed_entity_external_ids) == 3