festivalapi 0.2.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- festivalapi-0.2.0/PKG-INFO +84 -0
- festivalapi-0.2.0/README.md +61 -0
- festivalapi-0.2.0/festivalapi/__init__.py +32 -0
- festivalapi-0.2.0/festivalapi/client.py +165 -0
- festivalapi-0.2.0/festivalapi/exceptions.py +28 -0
- festivalapi-0.2.0/festivalapi.egg-info/PKG-INFO +84 -0
- festivalapi-0.2.0/festivalapi.egg-info/SOURCES.txt +9 -0
- festivalapi-0.2.0/festivalapi.egg-info/dependency_links.txt +1 -0
- festivalapi-0.2.0/festivalapi.egg-info/top_level.txt +1 -0
- festivalapi-0.2.0/pyproject.toml +35 -0
- festivalapi-0.2.0/setup.cfg +4 -0
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: festivalapi
|
|
3
|
+
Version: 0.2.0
|
|
4
|
+
Summary: Python client for the Festival API — film festival data for developers
|
|
5
|
+
Author-email: Festival API <hello@festivalapi.com>
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://festivalapi.com
|
|
8
|
+
Project-URL: Documentation, https://festivalapi.com/docs
|
|
9
|
+
Project-URL: Repository, https://github.com/rv888/festivalapi_com
|
|
10
|
+
Project-URL: Issues, https://github.com/rv888/festivalapi_com/issues
|
|
11
|
+
Keywords: film-festival,festival,submissions,film,api
|
|
12
|
+
Classifier: Development Status :: 4 - Beta
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: Programming Language :: Python :: 3
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
20
|
+
Classifier: Topic :: Internet :: WWW/HTTP
|
|
21
|
+
Requires-Python: >=3.9
|
|
22
|
+
Description-Content-Type: text/markdown
|
|
23
|
+
|
|
24
|
+
# Festival API — Python Client
|
|
25
|
+
|
|
26
|
+
Client library for the [Festival API](https://festivalapi.com).
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
pip install festivalapi
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Usage
|
|
33
|
+
|
|
34
|
+
```python
|
|
35
|
+
from festivalapi import FestivalAPI
|
|
36
|
+
|
|
37
|
+
client = FestivalAPI("fda_your_api_key")
|
|
38
|
+
|
|
39
|
+
# Search festivals
|
|
40
|
+
festivals = client.festivals.list(category="short_film")
|
|
41
|
+
|
|
42
|
+
# Get festival detail
|
|
43
|
+
festival = client.festivals.get(1)
|
|
44
|
+
|
|
45
|
+
# Get festival roster
|
|
46
|
+
roster = client.festivals.roster(1)
|
|
47
|
+
|
|
48
|
+
# Get scored festivals
|
|
49
|
+
scored = client.festivals.scored(min_score=70)
|
|
50
|
+
|
|
51
|
+
# List categories (no auth required)
|
|
52
|
+
categories = client.categories()
|
|
53
|
+
|
|
54
|
+
# Health check (no auth)
|
|
55
|
+
client.health()
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## API Key
|
|
59
|
+
|
|
60
|
+
Sign up at [festivalapi.com](https://festivalapi.com) to get your API key. You can also set the `FESTIVALAPI_KEY` environment variable.
|
|
61
|
+
|
|
62
|
+
## Error Handling
|
|
63
|
+
|
|
64
|
+
```python
|
|
65
|
+
from festivalapi import FestivalAPI, NotFoundError, InsufficientCreditsError
|
|
66
|
+
|
|
67
|
+
client = FestivalAPI("fda_your_api_key")
|
|
68
|
+
|
|
69
|
+
try:
|
|
70
|
+
festival = client.festivals.get(999999)
|
|
71
|
+
except NotFoundError:
|
|
72
|
+
print("Festival not found")
|
|
73
|
+
except InsufficientCreditsError as e:
|
|
74
|
+
print(f"Need more credits: {e}")
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Requirements
|
|
78
|
+
|
|
79
|
+
- Python 3.9+
|
|
80
|
+
- Zero dependencies (uses only stdlib `urllib`)
|
|
81
|
+
|
|
82
|
+
## License
|
|
83
|
+
|
|
84
|
+
MIT
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Festival API — Python Client
|
|
2
|
+
|
|
3
|
+
Client library for the [Festival API](https://festivalapi.com).
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
pip install festivalapi
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
## Usage
|
|
10
|
+
|
|
11
|
+
```python
|
|
12
|
+
from festivalapi import FestivalAPI
|
|
13
|
+
|
|
14
|
+
client = FestivalAPI("fda_your_api_key")
|
|
15
|
+
|
|
16
|
+
# Search festivals
|
|
17
|
+
festivals = client.festivals.list(category="short_film")
|
|
18
|
+
|
|
19
|
+
# Get festival detail
|
|
20
|
+
festival = client.festivals.get(1)
|
|
21
|
+
|
|
22
|
+
# Get festival roster
|
|
23
|
+
roster = client.festivals.roster(1)
|
|
24
|
+
|
|
25
|
+
# Get scored festivals
|
|
26
|
+
scored = client.festivals.scored(min_score=70)
|
|
27
|
+
|
|
28
|
+
# List categories (no auth required)
|
|
29
|
+
categories = client.categories()
|
|
30
|
+
|
|
31
|
+
# Health check (no auth)
|
|
32
|
+
client.health()
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## API Key
|
|
36
|
+
|
|
37
|
+
Sign up at [festivalapi.com](https://festivalapi.com) to get your API key. You can also set the `FESTIVALAPI_KEY` environment variable.
|
|
38
|
+
|
|
39
|
+
## Error Handling
|
|
40
|
+
|
|
41
|
+
```python
|
|
42
|
+
from festivalapi import FestivalAPI, NotFoundError, InsufficientCreditsError
|
|
43
|
+
|
|
44
|
+
client = FestivalAPI("fda_your_api_key")
|
|
45
|
+
|
|
46
|
+
try:
|
|
47
|
+
festival = client.festivals.get(999999)
|
|
48
|
+
except NotFoundError:
|
|
49
|
+
print("Festival not found")
|
|
50
|
+
except InsufficientCreditsError as e:
|
|
51
|
+
print(f"Need more credits: {e}")
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Requirements
|
|
55
|
+
|
|
56
|
+
- Python 3.9+
|
|
57
|
+
- Zero dependencies (uses only stdlib `urllib`)
|
|
58
|
+
|
|
59
|
+
## License
|
|
60
|
+
|
|
61
|
+
MIT
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"""Festival API Python Client
|
|
2
|
+
|
|
3
|
+
A lightweight Python client for the Festival API.
|
|
4
|
+
|
|
5
|
+
pip install festivalapi
|
|
6
|
+
|
|
7
|
+
Usage:
|
|
8
|
+
from festivalapi import FestivalAPI
|
|
9
|
+
|
|
10
|
+
client = FestivalAPI("fda_your_api_key")
|
|
11
|
+
|
|
12
|
+
# Search festivals
|
|
13
|
+
festivals = client.festivals.list(category="short_film")
|
|
14
|
+
|
|
15
|
+
# Get festival detail
|
|
16
|
+
festival = client.festivals.get(1)
|
|
17
|
+
|
|
18
|
+
# Get festival roster
|
|
19
|
+
roster = client.festivals.roster(1)
|
|
20
|
+
|
|
21
|
+
# Get scored festivals
|
|
22
|
+
scored = client.festivals.scored(min_score=70)
|
|
23
|
+
|
|
24
|
+
# Health check (no auth)
|
|
25
|
+
health = client.health()
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
from .client import FestivalAPI
|
|
29
|
+
from .exceptions import FestivalAPIError, AuthenticationError, InsufficientCreditsError
|
|
30
|
+
|
|
31
|
+
__all__ = ["FestivalAPI", "FestivalAPIError", "AuthenticationError", "InsufficientCreditsError"]
|
|
32
|
+
__version__ = "0.2.0"
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import urllib.request
|
|
2
|
+
import urllib.error
|
|
3
|
+
import urllib.parse
|
|
4
|
+
import json
|
|
5
|
+
import os
|
|
6
|
+
from typing import Optional, Dict, Any, List
|
|
7
|
+
from .exceptions import (
|
|
8
|
+
AuthenticationError,
|
|
9
|
+
InsufficientCreditsError,
|
|
10
|
+
NotFoundError,
|
|
11
|
+
RateLimitError,
|
|
12
|
+
ServerError,
|
|
13
|
+
FestivalAPIError,
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class FestivalAPI:
|
|
18
|
+
"""Client for the Festival API.
|
|
19
|
+
|
|
20
|
+
Args:
|
|
21
|
+
api_key: Your Festival API key (starts with 'fda_').
|
|
22
|
+
base_url: Override the API base URL. Defaults to production.
|
|
23
|
+
timeout: Request timeout in seconds. Default 30.
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
BASE_URL = "https://festivalapi.com/v1"
|
|
27
|
+
|
|
28
|
+
def __init__(
|
|
29
|
+
self,
|
|
30
|
+
api_key: Optional[str] = None,
|
|
31
|
+
base_url: Optional[str] = None,
|
|
32
|
+
timeout: int = 30,
|
|
33
|
+
):
|
|
34
|
+
self.api_key = api_key or os.environ.get("FESTIVALAPI_KEY")
|
|
35
|
+
self.base_url = base_url or self.BASE_URL
|
|
36
|
+
self.timeout = timeout
|
|
37
|
+
self.festivals = FestivalEndpoints(self)
|
|
38
|
+
self.health = lambda: self._get("/health", auth_required=False)
|
|
39
|
+
self.categories = lambda: self._get("/categories", auth_required=False)
|
|
40
|
+
|
|
41
|
+
def _auth_headers(self) -> Dict[str, str]:
|
|
42
|
+
return {"Authorization": f"Bearer {self.api_key}"}
|
|
43
|
+
|
|
44
|
+
def _request(
|
|
45
|
+
self,
|
|
46
|
+
method: str,
|
|
47
|
+
path: str,
|
|
48
|
+
params: Optional[Dict[str, Any]] = None,
|
|
49
|
+
auth_required: bool = True,
|
|
50
|
+
) -> Dict[str, Any]:
|
|
51
|
+
url = f"{self.base_url}{path}"
|
|
52
|
+
headers = {"Accept": "application/json", "User-Agent": "festivalapi-python/0.1.0"}
|
|
53
|
+
if auth_required:
|
|
54
|
+
if not self.api_key:
|
|
55
|
+
raise AuthenticationError(
|
|
56
|
+
"API key required. Pass api_key='fda_...' to FestivalAPI(), "
|
|
57
|
+
"or set FESTIVALAPI_KEY environment variable."
|
|
58
|
+
)
|
|
59
|
+
headers.update(self._auth_headers())
|
|
60
|
+
|
|
61
|
+
if params:
|
|
62
|
+
filtered = {k: v for k, v in params.items() if v is not None}
|
|
63
|
+
if filtered:
|
|
64
|
+
url = f"{url}?{urllib.parse.urlencode(filtered)}"
|
|
65
|
+
|
|
66
|
+
req = urllib.request.Request(url, method=method, headers=headers)
|
|
67
|
+
|
|
68
|
+
try:
|
|
69
|
+
with urllib.request.urlopen(req, timeout=self.timeout) as resp:
|
|
70
|
+
return json.loads(resp.read().decode("utf-8"))
|
|
71
|
+
except urllib.error.HTTPError as e:
|
|
72
|
+
body = {}
|
|
73
|
+
try:
|
|
74
|
+
body = json.loads(e.read().decode("utf-8"))
|
|
75
|
+
except Exception:
|
|
76
|
+
pass
|
|
77
|
+
self._raise_error(e.code, body)
|
|
78
|
+
return {} # unreachable, satisfies type checker
|
|
79
|
+
except urllib.error.URLError as e:
|
|
80
|
+
raise FestivalAPIError(f"Connection error: {e.reason}") from e
|
|
81
|
+
|
|
82
|
+
def _get(
|
|
83
|
+
self, path: str, params=None, auth_required=True
|
|
84
|
+
) -> Dict[str, Any]:
|
|
85
|
+
return self._request("GET", path, params, auth_required)
|
|
86
|
+
|
|
87
|
+
@staticmethod
|
|
88
|
+
def _raise_error(status: int, body: dict):
|
|
89
|
+
detail = body.get("detail") or body.get("message", "")
|
|
90
|
+
if status == 401:
|
|
91
|
+
raise AuthenticationError(detail or "Invalid or missing API key.")
|
|
92
|
+
if status == 402:
|
|
93
|
+
required = body.get("required", "?")
|
|
94
|
+
balance = body.get("balance", "?")
|
|
95
|
+
msg = f"Insufficient credits. Need {required}, have {balance}."
|
|
96
|
+
raise InsufficientCreditsError(msg)
|
|
97
|
+
if status == 404:
|
|
98
|
+
raise NotFoundError(detail or "Resource not found.")
|
|
99
|
+
if status == 429:
|
|
100
|
+
raise RateLimitError(detail or "Too many requests.")
|
|
101
|
+
if 500 <= status < 600:
|
|
102
|
+
raise ServerError(detail or f"Server error (HTTP {status}).")
|
|
103
|
+
raise FestivalAPIError(f"HTTP {status}: {detail or 'Unknown error'}")
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
class FestivalEndpoints:
|
|
107
|
+
"""Access festival-related endpoints."""
|
|
108
|
+
|
|
109
|
+
def __init__(self, client: FestivalAPI):
|
|
110
|
+
self._client = client
|
|
111
|
+
|
|
112
|
+
def list(
|
|
113
|
+
self,
|
|
114
|
+
category: Optional[str] = None,
|
|
115
|
+
country: Optional[str] = None,
|
|
116
|
+
genre: Optional[str] = None,
|
|
117
|
+
deadline_before: Optional[str] = None,
|
|
118
|
+
fee_max: Optional[int] = None,
|
|
119
|
+
q: Optional[str] = None,
|
|
120
|
+
) -> Dict[str, Any]:
|
|
121
|
+
"""List festivals with optional filters.
|
|
122
|
+
|
|
123
|
+
Args:
|
|
124
|
+
category: Festival category (e.g. short_film, feature, documentary).
|
|
125
|
+
country: Country code (e.g. US, UK, CA).
|
|
126
|
+
genre: Accepted genre (e.g. drama, comedy, horror).
|
|
127
|
+
deadline_before: Filter by submission deadline before date (YYYY-MM-DD).
|
|
128
|
+
fee_max: Maximum submission fee in USD.
|
|
129
|
+
q: Full-text search on festival name.
|
|
130
|
+
"""
|
|
131
|
+
return self._client._get("/festivals", {
|
|
132
|
+
"category": category,
|
|
133
|
+
"country": country,
|
|
134
|
+
"genre": genre,
|
|
135
|
+
"deadline_before": deadline_before,
|
|
136
|
+
"fee_max": fee_max,
|
|
137
|
+
"q": q,
|
|
138
|
+
})
|
|
139
|
+
|
|
140
|
+
def get(self, festival_id: int) -> Dict[str, Any]:
|
|
141
|
+
"""Get full detail for a single festival."""
|
|
142
|
+
return self._client._get(f"/festivals/{festival_id}")
|
|
143
|
+
|
|
144
|
+
def roster(self, festival_id: int) -> Dict[str, Any]:
|
|
145
|
+
"""Get the submission roster for a festival."""
|
|
146
|
+
return self._client._get(f"/festivals/{festival_id}/roster")
|
|
147
|
+
|
|
148
|
+
def scored(
|
|
149
|
+
self,
|
|
150
|
+
category: Optional[str] = None,
|
|
151
|
+
min_score: Optional[int] = None,
|
|
152
|
+
limit: Optional[int] = None,
|
|
153
|
+
) -> Dict[str, Any]:
|
|
154
|
+
"""Get festivals ranked by Festival Score.
|
|
155
|
+
|
|
156
|
+
Args:
|
|
157
|
+
category: Filter by category.
|
|
158
|
+
min_score: Minimum score threshold (0-100).
|
|
159
|
+
limit: Max results.
|
|
160
|
+
"""
|
|
161
|
+
return self._client._get("/festivals/scored", {
|
|
162
|
+
"category": category,
|
|
163
|
+
"min_score": min_score,
|
|
164
|
+
"limit": limit,
|
|
165
|
+
})
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
class FestivalAPIError(Exception):
|
|
2
|
+
"""Base exception for Festival API errors."""
|
|
3
|
+
pass
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class AuthenticationError(FestivalAPIError):
|
|
7
|
+
"""Invalid or missing API key (HTTP 401)."""
|
|
8
|
+
pass
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class InsufficientCreditsError(FestivalAPIError):
|
|
12
|
+
"""Not enough credits for the request (HTTP 402)."""
|
|
13
|
+
pass
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class NotFoundError(FestivalAPIError):
|
|
17
|
+
"""Resource not found (HTTP 404)."""
|
|
18
|
+
pass
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class RateLimitError(FestivalAPIError):
|
|
22
|
+
"""Rate limit exceeded (HTTP 429)."""
|
|
23
|
+
pass
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class ServerError(FestivalAPIError):
|
|
27
|
+
"""Server-side error (HTTP 5xx)."""
|
|
28
|
+
pass
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: festivalapi
|
|
3
|
+
Version: 0.2.0
|
|
4
|
+
Summary: Python client for the Festival API — film festival data for developers
|
|
5
|
+
Author-email: Festival API <hello@festivalapi.com>
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://festivalapi.com
|
|
8
|
+
Project-URL: Documentation, https://festivalapi.com/docs
|
|
9
|
+
Project-URL: Repository, https://github.com/rv888/festivalapi_com
|
|
10
|
+
Project-URL: Issues, https://github.com/rv888/festivalapi_com/issues
|
|
11
|
+
Keywords: film-festival,festival,submissions,film,api
|
|
12
|
+
Classifier: Development Status :: 4 - Beta
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: Programming Language :: Python :: 3
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
20
|
+
Classifier: Topic :: Internet :: WWW/HTTP
|
|
21
|
+
Requires-Python: >=3.9
|
|
22
|
+
Description-Content-Type: text/markdown
|
|
23
|
+
|
|
24
|
+
# Festival API — Python Client
|
|
25
|
+
|
|
26
|
+
Client library for the [Festival API](https://festivalapi.com).
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
pip install festivalapi
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Usage
|
|
33
|
+
|
|
34
|
+
```python
|
|
35
|
+
from festivalapi import FestivalAPI
|
|
36
|
+
|
|
37
|
+
client = FestivalAPI("fda_your_api_key")
|
|
38
|
+
|
|
39
|
+
# Search festivals
|
|
40
|
+
festivals = client.festivals.list(category="short_film")
|
|
41
|
+
|
|
42
|
+
# Get festival detail
|
|
43
|
+
festival = client.festivals.get(1)
|
|
44
|
+
|
|
45
|
+
# Get festival roster
|
|
46
|
+
roster = client.festivals.roster(1)
|
|
47
|
+
|
|
48
|
+
# Get scored festivals
|
|
49
|
+
scored = client.festivals.scored(min_score=70)
|
|
50
|
+
|
|
51
|
+
# List categories (no auth required)
|
|
52
|
+
categories = client.categories()
|
|
53
|
+
|
|
54
|
+
# Health check (no auth)
|
|
55
|
+
client.health()
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## API Key
|
|
59
|
+
|
|
60
|
+
Sign up at [festivalapi.com](https://festivalapi.com) to get your API key. You can also set the `FESTIVALAPI_KEY` environment variable.
|
|
61
|
+
|
|
62
|
+
## Error Handling
|
|
63
|
+
|
|
64
|
+
```python
|
|
65
|
+
from festivalapi import FestivalAPI, NotFoundError, InsufficientCreditsError
|
|
66
|
+
|
|
67
|
+
client = FestivalAPI("fda_your_api_key")
|
|
68
|
+
|
|
69
|
+
try:
|
|
70
|
+
festival = client.festivals.get(999999)
|
|
71
|
+
except NotFoundError:
|
|
72
|
+
print("Festival not found")
|
|
73
|
+
except InsufficientCreditsError as e:
|
|
74
|
+
print(f"Need more credits: {e}")
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Requirements
|
|
78
|
+
|
|
79
|
+
- Python 3.9+
|
|
80
|
+
- Zero dependencies (uses only stdlib `urllib`)
|
|
81
|
+
|
|
82
|
+
## License
|
|
83
|
+
|
|
84
|
+
MIT
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
festivalapi
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=64", "wheel"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "festivalapi"
|
|
7
|
+
version = "0.2.0"
|
|
8
|
+
description = "Python client for the Festival API — film festival data for developers"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
license = "MIT"
|
|
11
|
+
license-files = ["LICENSE*"]
|
|
12
|
+
authors = [{name = "Festival API", email = "hello@festivalapi.com"}]
|
|
13
|
+
keywords = ["film-festival", "festival", "submissions", "film", "api"]
|
|
14
|
+
classifiers = [
|
|
15
|
+
"Development Status :: 4 - Beta",
|
|
16
|
+
"Intended Audience :: Developers",
|
|
17
|
+
"Programming Language :: Python :: 3",
|
|
18
|
+
"Programming Language :: Python :: 3.9",
|
|
19
|
+
"Programming Language :: Python :: 3.10",
|
|
20
|
+
"Programming Language :: Python :: 3.11",
|
|
21
|
+
"Programming Language :: Python :: 3.12",
|
|
22
|
+
"Programming Language :: Python :: 3.13",
|
|
23
|
+
"Topic :: Internet :: WWW/HTTP",
|
|
24
|
+
]
|
|
25
|
+
requires-python = ">=3.9"
|
|
26
|
+
dependencies = []
|
|
27
|
+
|
|
28
|
+
[project.urls]
|
|
29
|
+
Homepage = "https://festivalapi.com"
|
|
30
|
+
Documentation = "https://festivalapi.com/docs"
|
|
31
|
+
Repository = "https://github.com/rv888/festivalapi_com"
|
|
32
|
+
Issues = "https://github.com/rv888/festivalapi_com/issues"
|
|
33
|
+
|
|
34
|
+
[tool.setuptools]
|
|
35
|
+
packages = ["festivalapi"]
|