Compare commits

...

3 Commits

Author SHA1 Message Date
b8ae633ed5 Update readme 2023-05-12 20:53:44 +02:00
ea690f0479 Remove deprecated product functions 2023-05-11 19:54:23 +02:00
fc79f5c579 Remove purchase product code and add details to exceptions 2023-05-11 17:05:55 +02:00
5 changed files with 46 additions and 94 deletions

View File

@ -1,7 +1,7 @@
# FairHopper JavaScript SDK
Requirements:
- Node 1.16+
- Node 18+
## Running demo

View File

@ -138,47 +138,6 @@ class FairHopper {
}
return await r.json();
}
async getProducts() {
const r = await fetch(this.formatUrl("/products"), {
headers: this.defaultHeaders,
});
return await r.json();
}
async getProduct(productId) {
const r = await fetch(this.formatUrl(`/products/${productId}`), {
headers: this.defaultHeaders,
});
switch (r.status) {
case 422:
throw new ValidationError();
}
return await r.json();
}
async purchaseProduct(playerId, productId) {
const url = this.formatUrl(`/player/${playerId}/product/purchase`);
const postData = {
product_id: productId,
};
const r = await fetch(url, {
method: "post",
headers: this.defaultHeaders,
body: JSON.stringify(postData),
});
switch (r.status) {
case 403:
throw new PlayerInactiveError();
case 404:
throw new PlayerNotFoundError();
case 409:
throw new PositionError();
case 422:
throw new ValidationError();
}
return await r.json();
}
}
module.exports = {

View File

@ -5,6 +5,8 @@ Requirements:
## Setting up environment
### Recommended: Using Poetry
Project uses [Poetry](https://python-poetry.org), ultimate dependency management software for Python.
Install Poetry:
@ -17,6 +19,23 @@ Install virtual environment:
poetry install
```
### Simple: Using virtualenv
Create virtual environment:
```sh
virtualenv .env
```
Activate virtual environment:
```sh
source .env/bin/activate
```
Install required dependencies:
```sh
pip install -r requirements.txt
```
## Running demo
Check `demo.py` for usage example.
@ -29,7 +48,15 @@ FAIRHOPPER_HOST = "http://127.0.0.1:8010"
Activate environment and run example:
### Poetry
```sh
poetry shell
python demo.py
```
### Virtualenv
```sh
source .env/bin/activate
python demo.py
```

View File

@ -1,28 +1,35 @@
from typing import List, Optional
from pydantic import BaseModel
from enum import Enum
from typing import List, Optional
import requests
from pydantic import BaseModel
class BaseError(Exception):
...
detail: str = "BaseError"
def __str__(self) -> str:
return self.detail
class PositionError(BaseError):
...
detail = "Invalid position"
class PlayerInactiveError(BaseError):
...
detail = "Player inactive"
class PlayerNotFoundError(BaseError):
...
detail = "Player not found"
class GameLockedError(BaseError):
detail = "Game locked. Product selection in progress."
class ValidationError(BaseError):
...
detail = "Validation error"
class Direction(str, Enum):
@ -63,12 +70,6 @@ class Player(BaseModel):
state: PlayerState
class Product(BaseModel):
name: str
id: str
description: Optional[str] = None
class PingResponse(BaseModel):
message: str
@ -88,10 +89,6 @@ class GameInfoResponse(BaseModel):
destination: Destination
class ProductListResponse(BaseModel):
products: List[Product]
class FairHopper:
def __init__(self, host: str) -> None:
self.host = host
@ -160,42 +157,9 @@ class FairHopper:
raise PositionError()
elif r.status_code == 422:
raise ValidationError()
elif r.status_code == 423:
raise GameLockedError()
else:
r.raise_for_status()
return PlayerInfoResponse(**r.json())
def get_products(self) -> List[Product]:
r = requests.get(self.format_url("/products"))
response_data = ProductListResponse(**r.json())
return response_data.products
def get_product(self, product_id: str) -> Product:
r = requests.get(self.format_url(f"/products/{product_id}"))
if r.status_code == 422:
raise ValidationError()
else:
r.raise_for_status()
return Product(**r.json())
def purchase_product(self, player_id: str, product_id: str) -> Product:
url = self.format_url(f"/player/{player_id}/product/purchase")
payload = {
"product_id": product_id,
}
r = requests.post(url, json=payload)
if r.status_code == 403:
raise PlayerInactiveError()
elif r.status_code == 404:
raise PlayerNotFoundError()
elif r.status_code == 409:
raise PositionError()
elif r.status_code == 422:
raise ValidationError()
else:
r.raise_for_status()
return Product(**r.json())

2
python/requirements.txt Normal file
View File

@ -0,0 +1,2 @@
pydantic
requests