[![PyPI version](https://badge.fury.io/py/nhl-api-py.svg)](https://badge.fury.io/py/nhl-api-py)
![nhl-api-py workflow](https://github.com/coreyjs/nhl-api-py/actions/workflows/python-app.yml/badge.svg?branch=main)
# NHL API & NHL Edge Stats
## About
NHL-api-py is a Python package that provides a simple wrapper around the
NHL API, allowing you to easily access and retrieve NHL data in your Python
applications.
Note: This is ~~very early~~ maturing, I created this to help me with some machine learning
projects around the NHL and the NHL data sets. Special thanks to https://github.com/erunion/sport-api-specifications/tree/master/nhl and https://gitlab.com/dword4/nhlapi/-/blob/master/stats-api.md.
### Developer Note: This is being updated with the new, also undocumented, NHL API.
As of 10/5/24 I seem to have a majority of the endpoints added from what I can tell, but every once and awhile I come across one that needs to be added/changed. These will most likely be a minor ver bump.
If you find any, open a ticket or post in the discussions tab. I would love to hear more.
---
## Contact
Im available on [Bluesky](https://bsky.app/profile/coreyjs.dev) for any questions or just general chats about enhancements.
---
# Usage
```bash
pip install nhl-api-py
```
```python
from nhlpy import NHLClient
client = NHLClient()
# Fore more verbose logging
client = NHLClient(verbose=True)
# OR Other available configurations:
client = NHLClient(verbose={bool}, timeout={int}, ssl_verify={bool}, follow_redirects={bool})
```
---
## Stats with QueryBuilder
The skater stats endpoint can be accessed using the new query builder. It should make
creating and understanding the queries a bit easier. Filters are being added as I go, and will match up
to what the NHL API will allow.
The idea is to easily, and programatically, build up more complex queries using the query filters. A quick example below:
```python
filters = [
GameTypeQuery(game_type="2"),
DraftQuery(year="2020", draft_round="2"),
SeasonQuery(season_start="20202021", season_end="20232024"),
PositionQuery(position=PositionTypes.ALL_FORWARDS)
]
```
### Sorting
The sorting is a list of dictionaries similar to below. You can supply your own, otherwise it will
default to the default sort properties that the stat dashboard uses. All sorting defaults are found
in the `nhl-api-py/nhlpy/api/query/sorting/sorting_options.py` file.
<details>
<summary>Default Sorting</summary>
```python
skater_summary_default_sorting = [
{"property": "points", "direction": "DESC"},
{"property": "gamesPlayed", "direction": "ASC"},
{"property": "playerId", "direction": "ASC"},
]
```
</details>
---
### Report Types
The following report types are available. These are used to build the request url. So `/summary`, `/bios`, etc.
```bash
summary
bios
faceoffpercentages
faceoffwins
goalsForAgainst
realtime
penalties
penaltykill
penaltyShots
powerplay
puckPossessions
summaryshooting
percentages
scoringRates
scoringpergame
shootout
shottype
timeonice
```
### Available Filters
```python
from nhlpy.api.query.filters.franchise import FranchiseQuery
from nhlpy.api.query.filters.shoot_catch import ShootCatchesQuery
from nhlpy.api.query.filters.draft import DraftQuery
from nhlpy.api.query.filters.season import SeasonQuery
from nhlpy.api.query.filters.game_type import GameTypeQuery
from nhlpy.api.query.filters.position import PositionQuery, PositionTypes
from nhlpy.api.query.filters.status import StatusQuery
from nhlpy.api.query.filters.opponent import OpponentQuery
from nhlpy.api.query.filters.home_road import HomeRoadQuery
from nhlpy.api.query.filters.experience import ExperienceQuery
from nhlpy.api.query.filters.decision import DecisionQuery
filters = [
GameTypeQuery(game_type="2"),
DraftQuery(year="2020", draft_round="2"),
SeasonQuery(season_start="20202021", season_end="20232024"),
PositionQuery(position=PositionTypes.ALL_FORWARDS),
ShootCatchesQuery(shoot_catch="L"),
HomeRoadQuery(home_road="H"),
FranchiseQuery(franchise_id="1"),
StatusQuery(is_active=True),#for active players OR for HOF players StatusQuery(is_hall_of_fame=True),
OpponentQuery(opponent_franchise_id="2"),
ExperienceQuery(is_rookie=True), # for rookies || ExperienceQuery(is_rookie=False) #for veteran
DecisionQuery(decision="W") # OR DecisionQuery(decision="L") OR DecisionQuery(decision="O")
]
```
### Example
```python
from nhlpy.api.query.builder import QueryBuilder, QueryContext
from nhlpy.nhl_client import NHLClient
from nhlpy.api.query.filters.draft import DraftQuery
from nhlpy.api.query.filters.season import SeasonQuery
from nhlpy.api.query.filters.game_type import GameTypeQuery
from nhlpy.api.query.filters.position import PositionQuery, PositionTypes
client = NHLClient(verbose=True)
filters = [
GameTypeQuery(game_type="2"),
DraftQuery(year="2020", draft_round="2"),
SeasonQuery(season_start="20202021", season_end="20232024"),
PositionQuery(position=PositionTypes.ALL_FORWARDS)
]
query_builder = QueryBuilder()
query_context: QueryContext = query_builder.build(filters=filters)
data = client.stats.skater_stats_with_query_context(
report_type='summary',
query_context=query_context,
aggregate=True
)
```
### Granular Filtering
Each API request uses an additional query parameter called `factCayenneExp`. This defaults to `gamesPlayed>=1`
but can be overridden by setting the `fact_query` parameter in the `QueryContextObject` object. These can
be combined together with `and` to create a more complex query. It supports `>`, `<`, `>=`, `<=`. For example: `shootingPct>=0.01 and timeOnIcePerGame>=60 and faceoffWinPct>=0.01 and shots>=1`
This should support the following filters:
- `gamesPlayed`
- `points`
- `goals`
- `pointsPerGame`
- `penaltyMinutes`
- `plusMinus`
- `ppGoals` # power play goals
- `evGoals` # even strength goals
- `pointsPerGame`
- `penaltyMinutes`
- `evPoints` # even strength points
- `ppPoints` # power play points
- `gameWinningGoals`
- `otGoals`
- `shPoints` # short handed points
- `shGoals` # short handed goals
- `shootingPct`
- `timeOnIcePerGame`
- `faceoffWinPct`
- `shots`
```python
.....
query_builder = QueryBuilder()
query_context: QueryContext = query_builder.build(filters=filters)
query_context.fact_query = "gamesPlayed>=1 and goals>=10" # defaults to gamesPlayed>=1
data = client.stats.skater_stats_with_query_context(
report_type='summary',
query_context=query_context,
aggregate=True
)
```
### Invalid Query / Errors
The `QueryContext` object will hold the result of the built query with the supplied queries.
In the event of an invalid query (bad data, wrong option, etc), the `QueryContext` object will
hold all the errors that were encountered during the build process. This should help in debugging.
You can quickly check the `QueryContext` object for errors by calling `query_context.is_valid()`. Any "invalid" filters
will be removed from the output query, but anything that is still valid will be included.
```python
...
query_context: QueryContext = query_builder.build(filters=filters)
query_context.is_valid() # False if any of the filters fails its validation check
query_context.errors
```
---
## Additional Stats Endpoints (In development)
```python
client.stats.club_stats_season(team_abbr="BUF") # kinda weird endpoint.
client.stats.player_career_stats(player_id="8478402")
client.stats.player_game_log(player_id="", season_id="20242025", game_type="2")
# Team Summary Stats.
# These have lots of available parameters. You can also tap into the apache cayenne expressions to build custom
# queries, if you have that knowledge.
client.stats.team_summary(start_season="20202021", end_season="20212022", game_type_id=2)
client.stats.team_summary(start_season="20202021", end_season="20212022")
# Skater Summary Stats.
# Queries for skaters for year ranges, filterable down by franchise.
client.stats.skater_stats_summary_simple(start_season="20232024", end_season="20232024")
client.stats.skater_stats_summary_simple(franchise_id=10, start_season="20232024", end_season="20232024")
# For the following query context endpoints, see the above section
client.stats.skater_stats_with_query_context(...)
# Goalies
client.stats.goalie_stats_summary_simple(start_season="20242025", stats_type="summary")
```
---
## Schedule Endpoints
```python
# Returns the games for the given date.
client.schedule.get_schedule(date="2021-01-13")
# Return games for the week of (date)
client.schedule.get_weekly_schedule(date="2021-01-13")
client.schedule.get_schedule_by_team_by_month(team_abbr="BUF")
client.schedule.get_schedule_by_team_by_month(team_abbr="BUF", month="2021-01")
client.schedule.get_schedule_by_team_by_week(team_abbr="BUF")
client.schedule.get_schedule_by_team_by_week(team_abbr="BUF", date="2024-01-01")
client.schedule.get_season_schedule(team_abbr="BUF", season="20212022")
client.schedule.schedule_calendar(date="2023-11-23")
```
---
## Standings Endpoints
```python
client.standings.get_standings()
client.standings.get_standings(date="2021-01-13")
client.standings.get_standings(season="202222023")
# standings manifest. This returns a ton of information for every season ever it seems like
# This calls the API for this info, I also cache this in /data/seasonal_information_manifest.json
# for less API calls since this only changes yearly.
client.standings.season_standing_manifest()
```
---
## Teams Endpoints
```python
client.teams.teams_info() # returns id + abbrevation + name of all teams
client.teams.team_stats_summary(lang="en") # I honestly dont know. This is missing teams and has teams long abandoned.
```
---
## Game Center
```python
client.game_center.boxscore(game_id="2023020280")
client.game_center.play_by_play(game_id="2023020280")
client.game_center.landing(game_id="2023020280")
client.game_center.score_now()
```
---
## Misc Endpoints
```python
client.misc.glossary()
client.misc.config()
client.misc.countries()
client.misc.season_specific_rules_and_info()
client.misc.draft_year_and_rounds()
```
---
## Insomnia Rest Client Export
[Insomnia Rest Client](https://insomnia.rest) is a great tool for testing
nhl_api-{ver}.json in the root folder is an export of the endpoints I have
been working through using the Insomnia Rest Client. You can import this directly
into the client and use it to test the endpoints. I will be updating this as I go
- - -
## Developers
1) Install [Poetry](https://python-poetry.org/docs/#installing-with-the-official-installer)
`curl -sSL https://install.python-poetry.org | python3 -`
or using pipx
`pipx install poetry`
2) `poetry install --with dev`
3) `poetry shell`
### Build Pipeline
The build pipeline will run `black`, `ruff`, and `pytest`. Please make sure these are passing before submitting a PR.
```python
$ poetry shell
# You can then run the following
$ pytest
$ ruff .
$ black .
```
#### Poetry version management
```
# View current version
poetry version
# Bump version
poetry version patch # 0.1.0 -> 0.1.1
poetry version minor # 0.1.0 -> 0.2.0
poetry version major # 0.1.0 -> 1.0.0
# Set specific version
poetry version 2.0.0
# Set pre-release versions
poetry version prepatch # 0.1.0 -> 0.1.1-alpha.0
poetry version preminor # 0.1.0 -> 0.2.0-alpha.0
poetry version premajor # 0.1.0 -> 1.0.0-alpha.0
# Specify pre-release identifier
poetry version prerelease # 0.1.0 -> 0.1.0-alpha.0
poetry version prerelease beta # 0.1.0-alpha.0 -> 0.1.0-beta.0
```
Raw data
{
"_id": null,
"home_page": "https://github.com/coreyjs/nhl-api-py",
"name": "nhl-api-py",
"maintainer": null,
"docs_url": null,
"requires_python": "<4.0,>=3.9",
"maintainer_email": null,
"keywords": "nhl, api, wrapper, hockey, sports, edge, edge stats, edge analytics, edge sports, edge hockey, edge nhl, edge nhl stats, edge nhl analytics, edge nhl sports, edge nhl hockey, edge nhl data, edge nhl data analytics, edge nhl data stats, edge nhl data sports, edge nhl data hockey, edge nhl data stats analytics, edge nhl data stats sports, edge nhl data stats hockey, hockey ai, hockey machine learning, nhl ML, nhl AI, nhl machine learning, nhl stats, nhl analytics, nhl sports, nhl hockey, nhl nhl, nhl nhl stats, nhl nhl analytics, nhl nhl sports, edge nhl data hockey stats",
"author": "Corey Schaf",
"author_email": "cschaf@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/c4/e0/483e7580a64deb2c27904858cecf54e8b570225a56d26db76e1075527fc6/nhl_api_py-2.12.4.tar.gz",
"platform": null,
"description": "[![PyPI version](https://badge.fury.io/py/nhl-api-py.svg)](https://badge.fury.io/py/nhl-api-py)\n![nhl-api-py workflow](https://github.com/coreyjs/nhl-api-py/actions/workflows/python-app.yml/badge.svg?branch=main)\n\n# NHL API & NHL Edge Stats\n\n\n## About\n\nNHL-api-py is a Python package that provides a simple wrapper around the \nNHL API, allowing you to easily access and retrieve NHL data in your Python \napplications.\n\nNote: This is ~~very early~~ maturing, I created this to help me with some machine learning\nprojects around the NHL and the NHL data sets. Special thanks to https://github.com/erunion/sport-api-specifications/tree/master/nhl and https://gitlab.com/dword4/nhlapi/-/blob/master/stats-api.md.\n\n### Developer Note: This is being updated with the new, also undocumented, NHL API. \n\nAs of 10/5/24 I seem to have a majority of the endpoints added from what I can tell, but every once and awhile I come across one that needs to be added/changed. These will most likely be a minor ver bump.\n\nIf you find any, open a ticket or post in the discussions tab. I would love to hear more.\n\n\n---\n## Contact\nIm available on [Bluesky](https://bsky.app/profile/coreyjs.dev) for any questions or just general chats about enhancements.\n\n---\n\n\n\n# Usage\n\n```bash\npip install nhl-api-py\n```\n\n```python\nfrom nhlpy import NHLClient\n\nclient = NHLClient()\n# Fore more verbose logging\nclient = NHLClient(verbose=True)\n# OR Other available configurations:\nclient = NHLClient(verbose={bool}, timeout={int}, ssl_verify={bool}, follow_redirects={bool})\n```\n---\n## Stats with QueryBuilder\n\nThe skater stats endpoint can be accessed using the new query builder. It should make\ncreating and understanding the queries a bit easier. Filters are being added as I go, and will match up\nto what the NHL API will allow.\n\nThe idea is to easily, and programatically, build up more complex queries using the query filters. A quick example below:\n```python\nfilters = [\n GameTypeQuery(game_type=\"2\"),\n DraftQuery(year=\"2020\", draft_round=\"2\"),\n SeasonQuery(season_start=\"20202021\", season_end=\"20232024\"),\n PositionQuery(position=PositionTypes.ALL_FORWARDS)\n]\n```\n\n\n\n### Sorting\nThe sorting is a list of dictionaries similar to below. You can supply your own, otherwise it will\ndefault to the default sort properties that the stat dashboard uses. All sorting defaults are found\nin the `nhl-api-py/nhlpy/api/query/sorting/sorting_options.py` file.\n\n<details>\n<summary>Default Sorting</summary>\n\n```python\nskater_summary_default_sorting = [\n {\"property\": \"points\", \"direction\": \"DESC\"},\n {\"property\": \"gamesPlayed\", \"direction\": \"ASC\"},\n {\"property\": \"playerId\", \"direction\": \"ASC\"},\n]\n```\n</details>\n\n---\n\n### Report Types\nThe following report types are available. These are used to build the request url. So `/summary`, `/bios`, etc.\n\n```bash\nsummary\nbios\nfaceoffpercentages\nfaceoffwins\ngoalsForAgainst\nrealtime\npenalties\npenaltykill\npenaltyShots\npowerplay\npuckPossessions\nsummaryshooting\npercentages\nscoringRates\nscoringpergame\nshootout\nshottype\ntimeonice\n```\n\n### Available Filters\n\n```python\nfrom nhlpy.api.query.filters.franchise import FranchiseQuery\nfrom nhlpy.api.query.filters.shoot_catch import ShootCatchesQuery\nfrom nhlpy.api.query.filters.draft import DraftQuery\nfrom nhlpy.api.query.filters.season import SeasonQuery\nfrom nhlpy.api.query.filters.game_type import GameTypeQuery\nfrom nhlpy.api.query.filters.position import PositionQuery, PositionTypes\nfrom nhlpy.api.query.filters.status import StatusQuery\nfrom nhlpy.api.query.filters.opponent import OpponentQuery\nfrom nhlpy.api.query.filters.home_road import HomeRoadQuery\nfrom nhlpy.api.query.filters.experience import ExperienceQuery\nfrom nhlpy.api.query.filters.decision import DecisionQuery\n\nfilters = [\n GameTypeQuery(game_type=\"2\"),\n DraftQuery(year=\"2020\", draft_round=\"2\"),\n SeasonQuery(season_start=\"20202021\", season_end=\"20232024\"),\n PositionQuery(position=PositionTypes.ALL_FORWARDS),\n ShootCatchesQuery(shoot_catch=\"L\"),\n HomeRoadQuery(home_road=\"H\"),\n FranchiseQuery(franchise_id=\"1\"),\n StatusQuery(is_active=True),#for active players OR for HOF players StatusQuery(is_hall_of_fame=True),\n OpponentQuery(opponent_franchise_id=\"2\"),\n ExperienceQuery(is_rookie=True), # for rookies || ExperienceQuery(is_rookie=False) #for veteran\n DecisionQuery(decision=\"W\") # OR DecisionQuery(decision=\"L\") OR DecisionQuery(decision=\"O\")\n]\n```\n\n\n### Example\n```python\nfrom nhlpy.api.query.builder import QueryBuilder, QueryContext\nfrom nhlpy.nhl_client import NHLClient\nfrom nhlpy.api.query.filters.draft import DraftQuery\nfrom nhlpy.api.query.filters.season import SeasonQuery\nfrom nhlpy.api.query.filters.game_type import GameTypeQuery\nfrom nhlpy.api.query.filters.position import PositionQuery, PositionTypes\n\nclient = NHLClient(verbose=True)\n\nfilters = [\n GameTypeQuery(game_type=\"2\"),\n DraftQuery(year=\"2020\", draft_round=\"2\"),\n SeasonQuery(season_start=\"20202021\", season_end=\"20232024\"),\n PositionQuery(position=PositionTypes.ALL_FORWARDS)\n]\n\nquery_builder = QueryBuilder()\nquery_context: QueryContext = query_builder.build(filters=filters)\n\ndata = client.stats.skater_stats_with_query_context(\n report_type='summary',\n query_context=query_context,\n aggregate=True\n)\n```\n\n### Granular Filtering\nEach API request uses an additional query parameter called `factCayenneExp`. This defaults to `gamesPlayed>=1`\nbut can be overridden by setting the `fact_query` parameter in the `QueryContextObject` object. These can\nbe combined together with `and` to create a more complex query. It supports `>`, `<`, `>=`, `<=`. For example: `shootingPct>=0.01 and timeOnIcePerGame>=60 and faceoffWinPct>=0.01 and shots>=1`\n\n\nThis should support the following filters:\n\n- `gamesPlayed`\n- `points`\n- `goals`\n- `pointsPerGame`\n- `penaltyMinutes`\n- `plusMinus`\n- `ppGoals` # power play goals\n- `evGoals` # even strength goals\n- `pointsPerGame`\n- `penaltyMinutes`\n- `evPoints` # even strength points\n- `ppPoints` # power play points\n- `gameWinningGoals`\n- `otGoals`\n- `shPoints` # short handed points\n- `shGoals` # short handed goals\n- `shootingPct`\n- `timeOnIcePerGame`\n- `faceoffWinPct`\n- `shots`\n\n```python\n.....\nquery_builder = QueryBuilder()\nquery_context: QueryContext = query_builder.build(filters=filters)\n\nquery_context.fact_query = \"gamesPlayed>=1 and goals>=10\" # defaults to gamesPlayed>=1\n\ndata = client.stats.skater_stats_with_query_context(\n report_type='summary',\n query_context=query_context,\n aggregate=True\n)\n```\n\n\n### Invalid Query / Errors\n\nThe `QueryContext` object will hold the result of the built query with the supplied queries.\nIn the event of an invalid query (bad data, wrong option, etc), the `QueryContext` object will\nhold all the errors that were encountered during the build process. This should help in debugging.\n\nYou can quickly check the `QueryContext` object for errors by calling `query_context.is_valid()`. Any \"invalid\" filters\nwill be removed from the output query, but anything that is still valid will be included.\n\n```python\n...\nquery_context: QueryContext = query_builder.build(filters=filters)\nquery_context.is_valid() # False if any of the filters fails its validation check\nquery_context.errors\n```\n\n---\n\n## Additional Stats Endpoints (In development)\n\n```python\n\nclient.stats.club_stats_season(team_abbr=\"BUF\") # kinda weird endpoint.\n\nclient.stats.player_career_stats(player_id=\"8478402\")\n\nclient.stats.player_game_log(player_id=\"\", season_id=\"20242025\", game_type=\"2\")\n\n# Team Summary Stats.\n# These have lots of available parameters. You can also tap into the apache cayenne expressions to build custom\n# queries, if you have that knowledge.\nclient.stats.team_summary(start_season=\"20202021\", end_season=\"20212022\", game_type_id=2)\nclient.stats.team_summary(start_season=\"20202021\", end_season=\"20212022\")\n\n\n# Skater Summary Stats.\n# Queries for skaters for year ranges, filterable down by franchise.\nclient.stats.skater_stats_summary_simple(start_season=\"20232024\", end_season=\"20232024\")\nclient.stats.skater_stats_summary_simple(franchise_id=10, start_season=\"20232024\", end_season=\"20232024\")\n\n# For the following query context endpoints, see the above section\nclient.stats.skater_stats_with_query_context(...)\n\n# Goalies\nclient.stats.goalie_stats_summary_simple(start_season=\"20242025\", stats_type=\"summary\")\n\n```\n---\n\n\n## Schedule Endpoints\n\n```python\n\n# Returns the games for the given date.\nclient.schedule.get_schedule(date=\"2021-01-13\")\n\n# Return games for the week of (date)\nclient.schedule.get_weekly_schedule(date=\"2021-01-13\")\n\nclient.schedule.get_schedule_by_team_by_month(team_abbr=\"BUF\")\nclient.schedule.get_schedule_by_team_by_month(team_abbr=\"BUF\", month=\"2021-01\")\n\nclient.schedule.get_schedule_by_team_by_week(team_abbr=\"BUF\")\nclient.schedule.get_schedule_by_team_by_week(team_abbr=\"BUF\", date=\"2024-01-01\")\n\nclient.schedule.get_season_schedule(team_abbr=\"BUF\", season=\"20212022\")\n\nclient.schedule.schedule_calendar(date=\"2023-11-23\")\n```\n\n---\n\n## Standings Endpoints\n\n```python\nclient.standings.get_standings()\nclient.standings.get_standings(date=\"2021-01-13\")\nclient.standings.get_standings(season=\"202222023\")\n\n# standings manifest. This returns a ton of information for every season ever it seems like\n# This calls the API for this info, I also cache this in /data/seasonal_information_manifest.json\n# for less API calls since this only changes yearly.\nclient.standings.season_standing_manifest()\n```\n---\n\n## Teams Endpoints\n\n```python\nclient.teams.teams_info() # returns id + abbrevation + name of all teams\n\nclient.teams.team_stats_summary(lang=\"en\") # I honestly dont know. This is missing teams and has teams long abandoned.\n```\n\n---\n\n## Game Center\n```python\nclient.game_center.boxscore(game_id=\"2023020280\")\n\nclient.game_center.play_by_play(game_id=\"2023020280\")\n\nclient.game_center.landing(game_id=\"2023020280\")\n\nclient.game_center.score_now()\n```\n\n---\n\n## Misc Endpoints\n```python\nclient.misc.glossary()\n\nclient.misc.config()\n\nclient.misc.countries()\n\nclient.misc.season_specific_rules_and_info()\n\nclient.misc.draft_year_and_rounds()\n```\n\n---\n## Insomnia Rest Client Export\n\n[Insomnia Rest Client](https://insomnia.rest) is a great tool for testing\n\nnhl_api-{ver}.json in the root folder is an export of the endpoints I have\nbeen working through using the Insomnia Rest Client. You can import this directly\ninto the client and use it to test the endpoints. I will be updating this as I go\n\n\n- - - \n\n\n## Developers\n\n1) Install [Poetry](https://python-poetry.org/docs/#installing-with-the-official-installer)\n\n`curl -sSL https://install.python-poetry.org | python3 -`\n\nor using pipx\n\n`pipx install poetry`\n\n\n2) `poetry install --with dev`\n\n3) `poetry shell`\n\n\n### Build Pipeline\nThe build pipeline will run `black`, `ruff`, and `pytest`. Please make sure these are passing before submitting a PR.\n\n```python\n\n$ poetry shell\n\n# You can then run the following\n$ pytest\n$ ruff .\n$ black .\n\n```\n\n\n#### Poetry version management\n```\n# View current version\npoetry version\n\n# Bump version\npoetry version patch # 0.1.0 -> 0.1.1\npoetry version minor # 0.1.0 -> 0.2.0\npoetry version major # 0.1.0 -> 1.0.0\n\n# Set specific version\npoetry version 2.0.0\n\n# Set pre-release versions\npoetry version prepatch # 0.1.0 -> 0.1.1-alpha.0\npoetry version preminor # 0.1.0 -> 0.2.0-alpha.0\npoetry version premajor # 0.1.0 -> 1.0.0-alpha.0\n\n# Specify pre-release identifier\npoetry version prerelease # 0.1.0 -> 0.1.0-alpha.0\npoetry version prerelease beta # 0.1.0-alpha.0 -> 0.1.0-beta.0\n```\n",
"bugtrack_url": null,
"license": "GPL-3.0-or-later",
"summary": "NHL API (Updated for 2024/2025) and EDGE Stats. For standings, team stats, outcomes, player information. Contains each individual API endpoint as well as convience methods as well as pythonic query builder for more indepth EDGE stats.",
"version": "2.12.4",
"project_urls": {
"Homepage": "https://github.com/coreyjs/nhl-api-py",
"Repository": "https://github.com/coreyjs/nhl-api-py"
},
"split_keywords": [
"nhl",
" api",
" wrapper",
" hockey",
" sports",
" edge",
" edge stats",
" edge analytics",
" edge sports",
" edge hockey",
" edge nhl",
" edge nhl stats",
" edge nhl analytics",
" edge nhl sports",
" edge nhl hockey",
" edge nhl data",
" edge nhl data analytics",
" edge nhl data stats",
" edge nhl data sports",
" edge nhl data hockey",
" edge nhl data stats analytics",
" edge nhl data stats sports",
" edge nhl data stats hockey",
" hockey ai",
" hockey machine learning",
" nhl ml",
" nhl ai",
" nhl machine learning",
" nhl stats",
" nhl analytics",
" nhl sports",
" nhl hockey",
" nhl nhl",
" nhl nhl stats",
" nhl nhl analytics",
" nhl nhl sports",
" edge nhl data hockey stats"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "8b199cd3ec3789c9819ae24fc1cbc68c41bf8450104c9ec15e6e708741fd4a90",
"md5": "001681823de70b0894f4b85407e9e87f",
"sha256": "870ea6add71a0cec9716cb8c60bad13722de9468bef018caa99ccb6f70d040cb"
},
"downloads": -1,
"filename": "nhl_api_py-2.12.4-py3-none-any.whl",
"has_sig": false,
"md5_digest": "001681823de70b0894f4b85407e9e87f",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": "<4.0,>=3.9",
"size": 29573,
"upload_time": "2024-11-19T22:56:37",
"upload_time_iso_8601": "2024-11-19T22:56:37.540766Z",
"url": "https://files.pythonhosted.org/packages/8b/19/9cd3ec3789c9819ae24fc1cbc68c41bf8450104c9ec15e6e708741fd4a90/nhl_api_py-2.12.4-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "c4e0483e7580a64deb2c27904858cecf54e8b570225a56d26db76e1075527fc6",
"md5": "ffc758ceda4b0977ff34ff5d7d32b029",
"sha256": "67d80d640ec92d3b8c72690e20a27ae35be29b3a30719005375e70d6ff39177f"
},
"downloads": -1,
"filename": "nhl_api_py-2.12.4.tar.gz",
"has_sig": false,
"md5_digest": "ffc758ceda4b0977ff34ff5d7d32b029",
"packagetype": "sdist",
"python_version": "source",
"requires_python": "<4.0,>=3.9",
"size": 25500,
"upload_time": "2024-11-19T22:56:39",
"upload_time_iso_8601": "2024-11-19T22:56:39.175849Z",
"url": "https://files.pythonhosted.org/packages/c4/e0/483e7580a64deb2c27904858cecf54e8b570225a56d26db76e1075527fc6/nhl_api_py-2.12.4.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-11-19 22:56:39",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "coreyjs",
"github_project": "nhl-api-py",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "nhl-api-py"
}