Skip to main content

Python bindings to efidgy services.

Project description

efidgy

Python bindings to efidgy services.

Overview

Environment

Environment in terms of efidgy package is a set of settings to work with efidgy backend. Theese settings includes customer code and access token that will be used to communicate with backend.

Unit System

If you will not set the unit system directly, efidgy will use current user settings: console.efidgy.com/profile

Anyway, it is a good practice to define the unit system in your code:

efidgy.env = efidgy.env.override(
    unit_system=efidgy.models.UnitSystem.IMPERIAL,
)

Credentials

efidgy.env is initialized with settings fetched from the shell environment. The following environment variables are used:

You can always override code and/or token with the code like this:

efidgy.env = efidgy.env.override(
    code='hardcoded customer code',
)

API documentation

Find out more at: efidgy.com/docs

Sample usage

export EFIDGY_CUSTOMER_CODE=code  # https://console.efidgy.com/profile/company
export EFIDGY_ACCESS_TOKEN=token  # https://console.efidgy.com/profile/tokens

Sync API

import datetime
import efidgy


def create_project():
    project = efidgy.models.Project.service.create(
        name='Demo',
        currency='USD',
        project_type=efidgy.models.ProjectTypeCode.IDD_OR,
        shared_mode=efidgy.models.SharedMode.PRIVATE,
    )

    store_address = '6133 Broadway Terr., Oakland, CA 94618, USA'
    lat, lon = efidgy.tools.geocode(store_address)
    store = efidgy.models.idd_or.Store.service.create(
        project=project,
        address=store_address,
        lat=lat,
        lon=lon,
        name='Delivery Inc.',
        open_time=datetime.time(8, 0),
        close_time=datetime.time(18, 0),
    )

    efidgy.models.idd_or.Vehicle.service.create(
        project=project,
        store=store,
        name='Gary Bailey',
        fuel_consumption=11.76,
        fuel_price=3.25,
        salary_per_duration=21,
        duration_limit=datetime.timedelta(hours=9),
    )

    order_address = '1 Downey Pl, Oakland, CA 94610, USA'
    lat, lon = efidgy.tools.geocode(order_address)
    efidgy.models.idd_or.Order.service.create(
        project=project,
        store=store,
        name='#00001',
        address=order_address,
        lat=lat,
        lon=lon,
        ready_time=datetime.time(8, 0),
        delivery_time_from=datetime.time(12, 0),
        delivery_time_to=datetime.time(16, 0),
        load_duration=datetime.timedelta(minutes=1),
        unload_duration=datetime.timedelta(minutes=5),
        items=1,
        volume=3.53,
        weight=22.05,
    )

    return project


def solve(project):
    project.computate()

    solutions = efidgy.models.Solution.service.all(
        project=project,
    )

    if not solutions:
        return None

    return solutions[0]


def report(project, solution):
    print('Total Cost: {cost:.2f}{currency}'.format(
        cost=solution.cost,
        currency=project.currency.symbol,
    ))

    vehicles = efidgy.models.idd_or.Vehicle.service.all(
        project=project,
        solution=solution,
    )

    for vehicle in vehicles:
        print('{vehicle} Schedule'.format(
            vehicle=vehicle.name,
        ))
        if vehicle.route is not None:
            arr = vehicle.route.start_time
            for schedule in vehicle.route.schedule:
                dep = schedule.departure_time
                print('{at}\t{arr}\t{dep}'.format(
                    at=schedule.start_point.name,
                    arr=arr,
                    dep=dep,
                ))
                arr = schedule.arrival_time
            if vehicle.route.schedule:
                print('{at}\t{arr}\t{dep}'.format(
                    at=vehicle.route.schedule[-1].end_point.name,
                    arr=vehicle.route.schedule[-1].arrival_time,
                    dep='',
                ))


def main():
    project = create_project()
    solution = solve(project)
    if solution:
        report(project, solution)


if __name__ == '__main__':
    main()

Output

Total Cost: 12.51$
Gary Bailey Schedule
Delivery Inc.   15:45:00        15:46:00
#00001          15:55:00        16:00:00
Delivery Inc.   16:09:00

Async API

import datetime
import asyncio
import efidgy.asyncapi as efidgy


async def create_project():
    project = await efidgy.models.Project.service.create(
        name='Demo',
        currency='USD',
        project_type=efidgy.models.ProjectTypeCode.IDD_OR,
        shared_mode=efidgy.models.SharedMode.PRIVATE,
    )

    store_address = '6133 Broadway Terr., Oakland, CA 94618, USA'
    lat, lon = await efidgy.tools.geocode(store_address)
    store = await efidgy.models.idd_or.Store.service.create(
        project=project,
        address=store_address,
        lat=lat,
        lon=lon,
        name='Delivery Inc.',
        open_time=datetime.time(8, 0),
        close_time=datetime.time(18, 0),
    )

    await efidgy.models.idd_or.Vehicle.service.create(
        project=project,
        store=store,
        name='Gary Bailey',
        fuel_consumption=11.76,
        fuel_price=3.25,
        salary_per_duration=21,
        duration_limit=datetime.timedelta(hours=9),
    )

    order_address = '1 Downey Pl, Oakland, CA 94610, USA'
    lat, lon = await efidgy.tools.geocode(order_address)
    await efidgy.models.idd_or.Order.service.create(
        project=project,
        store=store,
        name='#00001',
        address=order_address,
        lat=lat,
        lon=lon,
        ready_time=datetime.time(8, 0),
        delivery_time_from=datetime.time(12, 0),
        delivery_time_to=datetime.time(16, 0),
        load_duration=datetime.timedelta(minutes=1),
        unload_duration=datetime.timedelta(minutes=5),
        items=1,
        volume=3.53,
        weight=22.05,
    )

    return project


async def solve(project):
    await project.computate()

    solutions = await efidgy.models.Solution.service.all(
        project=project,
    )

    if not solutions:
        return None

    return solutions[0]


async def report(project, solution):
    print('Total Cost: {cost:.2f}{currency}'.format(
        cost=solution.cost,
        currency=project.currency.symbol,
    ))

    vehicles = await efidgy.models.idd_or.Vehicle.service.all(
        project=project,
        solution=solution,
    )

    for vehicle in vehicles:
        print('{vehicle} Schedule'.format(
            vehicle=vehicle.name,
        ))
        if vehicle.route is not None:
            arr = vehicle.route.start_time
            for schedule in vehicle.route.schedule:
                dep = schedule.departure_time
                print('{at}\t{arr}\t{dep}'.format(
                    at=schedule.start_point.name,
                    arr=arr,
                    dep=dep,
                ))
                arr = schedule.arrival_time
            if vehicle.route.schedule:
                print('{at}\t{arr}\t{dep}'.format(
                    at=vehicle.route.schedule[-1].end_point.name,
                    arr=vehicle.route.schedule[-1].arrival_time,
                    dep='',
                ))


async def main():
    project = await create_project()
    solution = await solve(project)
    if solution:
        await report(project, solution)


if __name__ == '__main__':
    asyncio.run(main())

Output

Total Cost: 12.51$
Gary Bailey Schedule
Delivery Inc.   15:45:00        15:46:00
#00001          15:55:00        16:00:00
Delivery Inc.   16:09:00

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

efidgy-0.15.tar.gz (27.4 kB view details)

Uploaded Source

Built Distribution

efidgy-0.15-py3-none-any.whl (29.5 kB view details)

Uploaded Python 3

File details

Details for the file efidgy-0.15.tar.gz.

File metadata

  • Download URL: efidgy-0.15.tar.gz
  • Upload date:
  • Size: 27.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.11.1

File hashes

Hashes for efidgy-0.15.tar.gz
Algorithm Hash digest
SHA256 14a4539003c48f517015cc0442cd9b75de8cecb86080d332b87d060b7b855a26
MD5 b54e88a4e155930a7edc66baa7023f02
BLAKE2b-256 0e0f5445c420d3da7792183f01270cc6e43891f15d6f79bec591ee6dd9899569

See more details on using hashes here.

File details

Details for the file efidgy-0.15-py3-none-any.whl.

File metadata

  • Download URL: efidgy-0.15-py3-none-any.whl
  • Upload date:
  • Size: 29.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.11.1

File hashes

Hashes for efidgy-0.15-py3-none-any.whl
Algorithm Hash digest
SHA256 7da4d85d53eb86e1bfcd3704a393c444499ff178847380290889d83731b6119f
MD5 9b56c80996977c88aafc3a557c31fe8b
BLAKE2b-256 4226fbee6a0c5b9e757c2082b0418b0e24634df8fd97f10be2d8c5b590e19a7f

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page