def __init__(self, hass, api_key, name): from pyaftership import AfterShip self._aftership = AfterShip() self.hass = hass self._name = name self._api_key = api_key self._state = 0 self.hass.data[DATA] = {} self.update()
def handle_new_tracking(call): """Call when a user creates a new Afterhip tracking from HASS.""" from pyaftership import AfterShip title = call.data[TITLE] slug = call.data[SLUG] tracking_number = call.data[TRACKING_NUMBER] _aftership = AfterShip() result = _aftership.add_tracking(api_key, slug, title, tracking_number) if not result['success']: _LOGGER.debug("Created Aftership tracking") else: _LOGGER.error("Failed to create new tracking")
async def test_base_exceptions(aresponses): """Test base.""" async with aiohttp.ClientSession() as session: aftership = AfterShip(API_KEY, session) with pytest.raises(AfterShipException): await aftership.trackings.list() aftership = AfterShip(API_KEY, session, 0) with patch( "pyaftership.base.AfterShipBase._session.request", side_effect=asyncio.TimeoutError, ): with pytest.raises(AfterShipException): await aftership.trackings.list()
async def async_setup_platform( hass: HomeAssistant, config: ConfigType, async_add_entities: AddEntitiesCallback, discovery_info: DiscoveryInfoType | None = None, ) -> None: """Set up the AfterShip sensor platform.""" apikey = config[CONF_API_KEY] name = config[CONF_NAME] session = async_get_clientsession(hass) aftership = AfterShip(api_key=apikey, session=session) try: await aftership.trackings.list() except AfterShipException as err: _LOGGER.error("No tracking data found. Check API key is correct: %s", err) return async_add_entities([AfterShipSensor(aftership, name)], True) async def handle_add_tracking(call: ServiceCall) -> None: """Call when a user adds a new Aftership tracking from Home Assistant.""" await aftership.trackings.add( tracking_number=call.data[CONF_TRACKING_NUMBER], title=call.data.get(CONF_TITLE), slug=call.data.get(CONF_SLUG), ) async_dispatcher_send(hass, UPDATE_TOPIC) hass.services.async_register( DOMAIN, SERVICE_ADD_TRACKING, handle_add_tracking, schema=ADD_TRACKING_SERVICE_SCHEMA, ) async def handle_remove_tracking(call: ServiceCall) -> None: """Call when a user removes an Aftership tracking from Home Assistant.""" await aftership.trackings.remove( tracking_number=call.data[CONF_TRACKING_NUMBER], slug=call.data[CONF_SLUG], ) async_dispatcher_send(hass, UPDATE_TOPIC) hass.services.async_register( DOMAIN, SERVICE_REMOVE_TRACKING, handle_remove_tracking, schema=REMOVE_TRACKING_SERVICE_SCHEMA, )
async def test_base_none_valid_code(aresponses): """Test base.""" aresponses.add( "api.aftership.com", "/v4/trackings", "get", aresponses.Response( text=load_fixture("error_server_is_down"), status=500, headers={"Content-Type": "application/json"}, ), ) async with aiohttp.ClientSession() as session: aftership = AfterShip(API_KEY, session) with pytest.raises(AfterShipException): await aftership.trackings.list()
async def test_remove(aresponses): """Test remove tracking.""" aresponses.add( "api.aftership.com", "/v4/trackings/fedex/772857780801111", "delete", aresponses.Response( text=load_fixture("delete_trackings"), status=200, headers={"Content-Type": "application/json"}, ), ) async with aiohttp.ClientSession() as session: aftership = AfterShip(API_KEY, session) trackings = await aftership.trackings.remove( tracking_number="772857780801111", slug="fedex") assert trackings["tracking"]["tracking_number"] == "772857780801111"
async def test_list(aresponses): """Test list trackings.""" aresponses.add( "api.aftership.com", "/v4/trackings", "get", aresponses.Response( text=load_fixture("get_trackings"), status=200, headers={"Content-Type": "application/json"}, ), ) async with aiohttp.ClientSession() as session: aftership = AfterShip(API_KEY, session) trackings = await aftership.trackings.list() assert trackings["count"] != 0 assert trackings["count"] == len(trackings["trackings"])
async def test_add(aresponses): """Test add trackings.""" aresponses.add( "api.aftership.com", "/v4/trackings", "post", aresponses.Response( text=load_fixture("post_trackings"), status=201, headers={"Content-Type": "application/json"}, ), ) async with aiohttp.ClientSession() as session: aftership = AfterShip(API_KEY, session) trackings = await aftership.trackings.add( tracking_number="1111111111111", slug="fedex", title="sample", tracking_postal_code=2223, ) assert trackings["tracking"]["tracking_number"] == "1111111111111"
class AftershipSensor(Entity): """The sensor class""" def __init__(self, hass, api_key, name): from pyaftership import AfterShip self._aftership = AfterShip() self.hass = hass self._name = name self._api_key = api_key self._state = 0 self.hass.data[DATA] = {} self.update() def update(self): """Update the sensor""" base_link = 'https://track.aftership.com/' result = self._aftership.get_trackings(self._api_key) if 'count' not in str(result['data']): self._state = 0 return False else: _LOGGER.warning(result) self.hass.data[DATA] = {} data = result['data'] self._state = data['count'] for parcel in data['trackings']: parcel_data = {} if not parcel['title']: title = parcel['tracking_number'] else: title = parcel['title'] parcel_data['title'] = title if parcel['tag'] == 'InTransit': parcel_data['status'] = 'In transit' else: parcel_data['status'] = parcel['tag'] parcel_data['slug'] = parcel['slug'] parcel_data['last_update'] = parcel['updated_at'] parcel_data['tracking_number'] = parcel['tracking_number'] link = parcel['slug'] + '/' + parcel['tracking_number'] parcel_data['link'] = base_link + link self.hass.data[DATA][parcel['tracking_number']] = parcel_data @property def name(self): """Return the name of the sensor""" return self._name @property def state(self): """Return the state of the sensor""" return self._state @property def icon(self): """Return the icon of the sensor""" return 'mdi:package' @property def device_state_attributes(self): """Return the attributes of the sensor""" return self.hass.data[DATA]