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")
Esempio n. 3
0
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()
Esempio n. 4
0
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,
    )
Esempio n. 5
0
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()
Esempio n. 6
0
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"
Esempio n. 7
0
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"])
Esempio n. 8
0
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]