Skip to main content

ESY is an ESI wrapper aiming to be simple and pythonic.

Project description


<h1>Introduction</h1>
<p><a href="https://travis-ci.org/kriberg/esy"><img alt="Build Status" src="https://travis-ci.org/kriberg/esy.svg?branch=master" /></a>
<a href="https://coveralls.io/github/kriberg/esy?branch=master"><img alt="Coverage Status" src="https://coveralls.io/repos/github/kriberg/esy/badge.svg?branch=master" /></a>
<a href="https://esy.readthedocs.io/en/latest/?badge=latest"><img alt="Documentation Status" src="https://readthedocs.org/projects/esy/badge/?version=latest" /></a></p>
<p>There are many options for consuming the ESI web services. ESY aims to be an easy-to-use library with the nuts and
bolts of dealing with an OpenAPI interface abstracted away. </p>
<p>ESY is inspired by Entity's gloriously pythonic <a href="https://github.com/ntt/eveapi/">eveapi</a> library. </p>
<h2>Installation</h2>
<p>The latest stable version of ESY is available from PyPI:
<code>bash
$ pip install esy</code></p>
<h2>Documentation</h2>
<p>Documentation is available at <a href="https://esy.readthedocs.io/en/latest/">esy.readthedocs.io</a>.</p>
<p>For documentation of the various ESI routes, ESY also provides a
<a href="https://esy.readthedocs.io/en/latest/source/esi.html">terse list</a> of their parameters and return types. Further
information can be explored at the main <a href="https://esi.evetech.net/ui">ESI documentation site</a></p>
<h2>Usage</h2>
<p>To use ESI, first initialize a client:</p>
<p><code>python
from esy.client import ESIClient
client = ESIClient.get_client('my-user-agent')</code></p>
<p>The client can take a second or two to initialize, as the swagger specification is downloaded and parsed. To speed this
up, you can download the specification locally:</p>
<p><code>bash
$ curl https://esi.evetech.net/latest/swagger.json -o swagger.json</code></p>
<p>Then initialize the client using the local file:</p>
<p>```python
import json
from esy.client import ESIClient</p>
<p>with open('swagger.json', 'r') as spec_file:
spec = json.load(spec_file)
client = ESIClient.get_client('my-user-agent', spec=spec)
```</p>
<p>For production instances, keeping the spec in <a href="https://redis.io">Redis</a> or some other cache is highly recommended.</p>
<h3>Calling ESI routes</h3>
<p>Once your client is initialized, you can fetch data:</p>
<p>```python
from esy.client import ESIClient
client = ESIClient.get_client('my-user-agent')</p>
<h1>Get list of alliances</h1>
<p>alliances = client.Alliance.get_alliances()</p>
<h1>Get info on a corporation</h1>
<p>evolution = client.Corporation.get_corporations_corporation_id(corporation_id=144749962)
print(evolution)</p>
<p>{'alliance_id': 1727758877,
'ceo_id': 144509256,
'creator_id': 144509256,
'date_founded': datetime.datetime(2003, 7, 30, 8, 33, tzinfo=tzutc()),
'description': 'Those who cannot adapt become victims of Evolution.',
'home_station_id': 60013843,
'member_count': 316,
'name': 'Evolution',
'shares': 1000,
'tax_rate': 0.5,
'ticker': 'EVOL',
'url': 'http://www.eve-evol.com',
'faction_id': None}
```</p>
<p>For ESI routes which are paginated, ESY will return a <a href="source/modules.html#esy.client.ESIPageGenerator">ESIPageGenerator</a> which is a generator yielding the
native data type of the route. </p>
<p>```python</p>
<h1>Get paginated asset list</h1>
<p>swag = client.Corporation.get_corporations_corporation_id_assets(corporation_id=144749962,
_token='esi token')</p>
<h1>swag is an ESIPageGenerator, implementing the generator interface</h1>
<h1>Loop through it to get the asset pages</h1>
<p>for page in swag: # Returns a list of assets
for asset in page: # Asset dict
print(asset.get('type_id'),
asset.get('location_id'))
# 22457
# 16074150552
```</p>
<h3>Caching</h3>
<p>ESY does not implement caching itself, but supports using a cache through a cache proxy object. The proxy needs
to implement the following interface:</p>
<p>```python
class Cache(object): <br />
def get(self, key: int) -&gt; object:
pass</p>
<pre><code>def set(self, key: int, data: object, cached_until: datetime.datetime):
pass

def __contains__(self, item: object) -&gt; bool:
pass
</code></pre>
<p>```</p>
<h3>Authentication and devel mode</h3>
<p>ESY can handle the authentication flow for you:</p>
<p>```python
from esy.auth import ESIAuthenticator</p>
<p>auth = ESIAuthenticator()
refresh_token, access_token = auth.verify_authorization_code('authorization code from esi',
'your client ID',
'your secret key')</p>
<p>auth.verify_access_token(access_token)
{'CharacterID': 941287462,
'CharacterName': 'Vittoros',
'ExpiresOn': '2018-06-11T19:01:15.182864Z',
'Scopes': ' ',
'TokenType': 'Character',
'CharacterOwnerHash': '<strong><em>*</em></strong>***'}</p>
<p>new_access_token = auth.get_access_token(refresh_token,
'your client ID',
'your secret key')</p>
<p>auth.revoke_token(refresh_token,
'your client ID',
'your secret key')</p>
<p>auth.revoke_token(access_token,
'your client ID',
'your secret key',
token_type='access_token')
```</p>
<p>To help developers getting started without having to implement the entire authentication
workflow, ESY also implements an ad-hoc web server to get you refresh tokens. You can use
it directly in the python prompt to do some API exploration or you can use it in your tests
to produce refresh or access tokens for testing your ESI calls.</p>
<p>First, create a new application at <a href="https://developers.eveonline.com/">https://developers.eveonline.com/</a>
with callback URL set to http://localhost:8000 or whichever address and port you'll be
running the devel server.</p>
<p>```python
import esy.devel</p>
<h1>get_authorization_code has many parameters, but for basic usage:</h1>
<p>auth_code = esy.devel.get_authorization_code(client_id='your client ID',
callback_url='your callback URL',
scopes='your space-delimited scopes')</p>
<h1>This will start the web server in the background (per-default listening on localhost:8000)</h1>
<h1>and print the login URL on stdout. After authenticating in your browser, the web server</h1>
<h1>will get redirect from the SSO with the authorization code, then return that.</h1>
<h1>For situations where you are not able to reach the network where you are running ESY,</h1>
<h1>you can also use CLI login:</h1>
<p>auth_code = esy.devel.get_authorization_code(cli_login=True,
client_id='your client ID',
callback_url='your callback URL',
scopes='your space-delimited scopes')</p>
<h1>This will prompt for username and password, then let you pick a character.</h1>
<h1>If you are running tests, you can also supply username, password and character_id as</h1>
<h1>keyword arguments to get_authorization_code, in addition to cli_login=True. This will</h1>
<h1>automate the entire flow. Remember to revoke your tokens afterwards and for bob's sake;</h1>
<h1>don't display your username and/or password!</h1>
<h1>After getting the authorization code, you can get the tokens:</h1>
<p>refresh_token, access_token = esy.devel.verify_authorization_code(auth_code,
client_id='your client ID',
secret_key='your secret key')</p>
<h1>Character info</h1>
<p>char_info = esy.devel.verify_access_token(access_token)</p>
<h1>Get your swag</h1>
<p>from esy.client import ESIClient
client = ESIClient.get_client('your-user-agent')
assets = client.Assets.get_characters_character_id_assets(
character_id=char_info.get('CharacterId'), _token=access_token)</p>
<p>for page in assets:
print(page)
```</p>
<p>The devel mode will use parameters from environment settings, if present:</p>
<p>Parameter | Environment setting | Default
---| --- | ---
CLIENT_ID | ESY_CLIENT_ID | None
SECRET_KEY | ESY_SECRET_KEY | None
SCOPES | ESY_SCOPES | None
CALLBACK_URL | ESY_CALLBACK_URL | http://localhost:8000
SERVER_ADDRESS | ESY_SERVER_ADDRESS | localhost
SERVER_PORT | ESY_SERVER_PORT | 8000</p>
<h2>Development</h2>
<p>ESY uses the <a href="https://github.com/Yelp/bravado-core">Bravado</a> OpenAPI library to parse the ESI swagger schema and create
an usable interface. The purpose of creating a custom wrapper of Bravado for ESI, is to make the interface a bit more
user friendly. Pagination is handled automatically by returning generators for any route which accepts a page
parameter, while non-paginated data is handled in their native data type. Tokens can be set per-call, instead of
per-client, allowing for using headers and still getting data for many tokens without the ned to reinitialize the client.</p>
<p>The authentication flow uses <a href="https://github.com/requests/requests-oauthlib">requests-oauthlib</a>.</p>

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

esy-1.1.0.tar.gz (15.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

esy-1.1.0-py2.py3-none-any.whl (16.4 kB view details)

Uploaded Python 2Python 3

File details

Details for the file esy-1.1.0.tar.gz.

File metadata

  • Download URL: esy-1.1.0.tar.gz
  • Upload date:
  • Size: 15.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for esy-1.1.0.tar.gz
Algorithm Hash digest
SHA256 bdc53c8ccd97582bd56fd8240f272bc50791ac40bc1d67aba3e0d91a90bafdd5
MD5 aaf70917dbf3290e72b5a045fc587ae1
BLAKE2b-256 be8f8a5dccf237037e0788eeb0146890458981821eb17be74234b0f39721f1fa

See more details on using hashes here.

File details

Details for the file esy-1.1.0-py2.py3-none-any.whl.

File metadata

File hashes

Hashes for esy-1.1.0-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 7607ac8a78226266546b2d401fe83bb74633207bfc53138bc02642547ad991e9
MD5 ac69b4834303a22b069ed7e635d27184
BLAKE2b-256 1d21a0c30c342725a8f108041e30f7997cc7ec50ee769c5144e68a16a666ecc7

See more details on using hashes here.

Supported by

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