Skip to content

Commit

Permalink
Merge pull request #51 from Lemon4ksan/major
Browse files Browse the repository at this point in the history
Крупное обновление библиотеки
  • Loading branch information
Lemon4ksan authored Jan 4, 2025
2 parents 52d6585 + 29019d8 commit ccb9e76
Show file tree
Hide file tree
Showing 52 changed files with 2,150 additions and 4,059 deletions.
3 changes: 2 additions & 1 deletion .github/ISSUE_TEMPLATE/bug-report.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ labels: bug

**Воспроизведение:**
Шаги для воспроизведения бага:

1. Создать объект '...'
2. Вызвать метод '....'
3. Увидеть ошибку
Expand All @@ -21,4 +22,4 @@ labels: bug
Если это возможно, прикрепите сообщения об ошибке и полученный стектрэйс.

**Дополнительная информация:**
Добавьте любой другой контекст о проблеме здесь.
Добавьте любой другой контекст о проблеме здесь.
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/feature-request.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,4 @@ labels: feature-request
Опишите как вашу идею можно реализовать, или приложите ваши наработки

**Дополнительная информация:**
Добавьте любой другой контекст о проблеме здесь.
Добавьте любой другой контекст о проблеме здесь.
30 changes: 30 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
name: ci
on:
push:
branches:
- master
- main
permissions:
contents: write
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Configure Git Credentials
run: |
git config user.name github-actions[bot]
git config user.email 41898282+github-actions[bot]@users.noreply.github.com
- uses: actions/setup-python@v5
with:
python-version: 3.x
- run: echo "cache_id=$(date --utc '+%V')" >> $GITHUB_ENV
- uses: actions/cache@v4
with:
key: mkdocs-material-${{ env.cache_id }}
path: .cache
restore-keys: |
mkdocs-material-
- run: pip install 'mkdocstrings[python]'
- run: pip install mkdocs-material
- run: mkdocs gh-deploy --force
91 changes: 3 additions & 88 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,6 @@ __pycache__/
*.py[cod]
*$py.class

# C extensions
*.so

# Distribution / packaging
.Python
build/
Expand All @@ -26,12 +23,6 @@ share/python-wheels/
*.egg
MANIFEST

# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec

# Installer logs
pip-log.txt
pip-delete-this-directory.txt
Expand All @@ -51,76 +42,13 @@ coverage.xml
.pytest_cache/
cover/

# Translations
*.mo
*.pot

# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal

# Flask stuff:
instance/
.webassets-cache

# Scrapy stuff:
.scrapy

# Sphinx documentation
docs/_build/

# PyBuilder
.pybuilder/
target/

# Jupyter Notebook
.ipynb_checkpoints

# IPython
profile_default/
ipython_config.py

# pyenv
# For a library or package, you might want to ignore these files since the code is
# intended to run in multiple environments; otherwise, check them in:
# .python-version

# pipenv
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
# However, in case of collaboration, if having platform-specific dependencies or dependencies
# having no cross-platform support, pipenv may install dependencies that don't work, or not
# install all needed dependencies.
#Pipfile.lock

# poetry
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
# This is especially recommended for binary packages to ensure reproducibility, and is more
# commonly ignored for libraries.
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
#poetry.lock

# pdm
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
#pdm.lock
# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
# in version control.
# https://pdm.fming.dev/latest/usage/project/#working-with-version-control
.pdm.toml
.pdm-python
.pdm-build/

# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
__pypackages__/

# Celery stuff
celerybeat-schedule
celerybeat.pid

# SageMath parsed files
*.sage.py

# Environments
.env
.venv
Expand All @@ -130,13 +58,6 @@ ENV/
env.bak/
venv.bak/

# Spyder project settings
.spyderproject
.spyproject

# Rope project settings
.ropeproject

# mkdocs documentation
/site

Expand All @@ -151,12 +72,6 @@ dmypy.json
# pytype static type analyzer
.pytype/

# Cython debug symbols
cython_debug/

# PyCharm
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
# and can be added to the global gitignore or merged into this file. For a more nuclear
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
#.idea/
# IDE stuff
.vscode/
.idea/
49 changes: 24 additions & 25 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,39 +1,41 @@
# SteamTrader-Wrapper

![PyPI - Downloads](https://img.shields.io/pypi/dm/steam-trader)
![PyPI - License](https://img.shields.io/pypi/l/steam-trader)
![PyPI - Status](https://img.shields.io/pypi/status/steam-trader)

⚠️ Это неофициальная библиотека.

### Содержание
- [Введение](#введение)
- [Получение токена](#получение-токена)
- [Установка](#установка)
- [Начало работы](#начало-работы)
- [Примеры](#примеры)
- [Документация](#документация)
- [Лицензия](#лицензия)
## Содержание

- [Введение](#введение)
- [Получение токена](#получение-токена)
- [Получение sessionid](#получение-sessionid)
- [Установка](#установка)
- [Начало работы](#начало-работы)
- [Примеры](#примеры)
- [Документация](#документация)
- [Лицензия](#лицензия)

### Введение
## Введение

Эта библиотека представляет Python обёртку для REST и WEB API [Steam-Trader](https://steam-trader.com/).

Она совместима с версиями Python 3.12+ и поддерживает работу как с синхронным, так и с асинхронным (asyncio) кодом.

В дополнение к реализации чистого API данная библиотека имеет ряд объектов высокого уровня и логирование,
В дополнение к реализации чистого API данная библиотека имеет ряд объектов высокого уровня и логирование,
дабы сделать разработку клиентов и скриптов простой и понятной. Документация была написана исходя из API документации сайта.

#### Получение токена
### Получение токена

Токен можно получить на сайте перейдя на вкладку [API](https://steam-trader.com/api/). В коде указывается один раз при создании клиента.

#### Получение sessionid
### Получение sessionid

Чтобы получить ID сессии, нужно зарегистрироваться на сайте, зайти в панель разработчика браузера, перейти к файлам куки и скопировать значение ключа sid.
Учтите, что это значение сбрасывается когда вы выходите из своего аккаунта.

### Установка
## Установка

Вы можете установить или обновить Steam-Trader API с помощью команды:

Expand All @@ -49,7 +51,7 @@ cd SteamTrader-Wrapper
python setup.py install
```

### Начало работы
## Начало работы

Приступив к работе, первым делом необходимо создать экземпляр клиента.

Expand All @@ -65,7 +67,7 @@ from steam_trader.api import ClientAsync
client = ClientAsync('Ваш токен')
```

Для использования логирования, добавьте эти строчки в свой код. Будет приходить полученный результат всех методов,
Для использования логирования, добавьте эти строчки в свой код. Будет приходить полученный результат всех методов,
а если указать уровень logging.DEBUG, то будут приходить входы и выходы из функций.

```python
Expand All @@ -92,7 +94,7 @@ from steam_trader.exceptions import Unauthorized, UnknownItem, WrongTradeLink
from steam_trader.constants import TEAM_FORTRESS2_APPID, TF2_CRAFTABLE, DOTA2_RARITY_COMMON
```

### Примеры
## Примеры

Пример скрипта для продажи всего Очищенного металла в инвентаре TF2 с помощью синхронного клиента.

Expand All @@ -109,7 +111,7 @@ for item in inventory.items:
client.sell(item.itemid, item.assetid, price=new_price)
```

С помощью get_inventory мы получаем все предметы из инвенторя TF2, которые не находятся в продаже, проходим по каждому,
С помощью get_inventory мы получаем все предметы из инвенторя TF2, которые не находятся в продаже, проходим по каждому,
находим Очищенный металл и выставляем его по цене на копейку меньше рыночной, чтобы быть впереди. Узнать минимальную стоимость предмета можно через get_min_prices.

Пример покупки всех предметов по GID ниже заданной стоимости.
Expand Down Expand Up @@ -171,20 +173,17 @@ with WebClient('Ваш токен') as client:
print(item_info.descriptions[offer.itemid])
```

### Документация

Полную документацию можно найти здесь: https://lemon4ksan.github.io/steam-trader/
## Документация

### Внесение своего вклада в проект
Полную документацию можно найти [здесь](https://lemon4ksan.github.io/steam-trader/).

Внесение своего вклада максимально приветствуется!
## Внесение своего вклада в проект

Вы можете помочь, сообщив о [баге](https://github.com/Lemon4ksan/SteamTrader-Wrapper/issues/new?assignees=&labels=bug&projects=&template=bug-report.md&title=) или [предложив](https://github.com/Lemon4ksan/SteamTrader-Wrapper/issues/new?assignees=&labels=feature-request&projects=&template=feature-request.md&title=) новый функционал.

Данная библиотека будет переодически обновляться и дополняться.

### Лицензия
См. Оригинал на английском [LICENSE](https://github.com/Lemon4ksan/SteamTrader-Wrapper/blob/master/LICENSE)

См. Оригинал [LICENSE](https://github.com/Lemon4ksan/SteamTrader-Wrapper/blob/master/LICENSE).

Разрешается повторное распространение и использование как в виде исходного кода, так и в двоичной форме, с изменениями или без, при соблюдении следующих условий:

Expand Down
85 changes: 85 additions & 0 deletions convert_to_async.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
"""Сгенерировать асинхронную версию клиента."""

DISCLAIMER = "# ЭТО АВТОМАТИЧЕСКИ СОЗДАННАЯ КОПИЯ СИНХРОННОГО КЛИЕНТА. НЕ ИЗМЕНЯЙТЕ САМОСТОЯТЕЛЬНО #"
DISCLAIMER = f'{"#" * len(DISCLAIMER)}\n{DISCLAIMER}\n{"#" * len(DISCLAIMER)}\n\n'

REQUEST_METHODS = ('_request_wrapper', 'get', 'post', 'retrieve', 'download')


def gen_client(source: str, output: str) -> None:
"""Generate async version of client.py."""
with open(source, 'r', encoding='UTF-8') as f:
code = f.read()

code = code.replace('class Client(', 'class ClientAsync(')
code = code.replace('ExtClient(Client)', 'ExtClientAsync(ClientAsync)')
code = code.replace('class WebClient', 'class WebClientAsync')
code = code.replace("""from steam_trader.api import (
Client,""", """from steam_trader.api import (
ClientAsync,""")

code = code.replace('def wrapper', 'async def wrapper')
code = code.replace('result = method(', 'result = await method(')
code = code.replace('@log\n def', '@log\n async def')
code = code.replace('@property\n def', '@property\n async def')
code = code.replace('self._get_request', 'await self._get_request')
code = code.replace('self._post_request', 'await self._post_request')

code = code.replace('def _get_request(', 'async def _get_request(')
code = code.replace('(self._httpx_client or httpx).get(', 'await self._httpx_client.get(')

code = code.replace('def _post_request(', 'async def _post_request(')
code = code.replace('result = (self._httpx_client or httpx).post(', 'result = await self._httpx_client.post(')

code = code.replace('self._httpx_client.close()', 'await self._httpx_client.aclose()')
code = code.replace('self._httpx_client = httpx.Client(', 'self._httpx_client = httpx.AsyncClient(')

code = code.replace('def __enter__(self) -> Self:', 'async def __aenter__(self) -> Self:')
code = code.replace('def __exit__(self, exc_type, exc_val, exc_tb) -> None:', 'async def __aexit__(self, exc_type, exc_val, exc_tb) -> None:')

code = code.replace('url: str = self.base_url + method', """if not self._httpx_client:
raise ClientError('Необходимо использовать контекст async with ClientAsync()')
url: str = self.base_url + method""")

code = code.replace("""result = (self._httpx_client or httpx).get(
url,
headers=headers,
params=params,
cookies=cookies,
**kwargs
)
)""", """if not self._httpx_client:
raise ClientError('Необходимо использовать контекст async with ClientAsync()')
result = (self._httpx_client or httpx).get(
url,
headers=headers,
params=params,
cookies=cookies,
**kwargs
)""")
code = code.replace("""result = await self._httpx_client.post(
url,
headers=self.headers,
data=data
)""", """if not self._httpx_client:
raise ClientError('Необходимо использовать контекст async with ClientAsync()')
result = (await self._httpx_client.post(
url,
headers=self.headers,
data=data
))""")

code = code.replace('self.get_order_book(gid)', 'await self.get_order_book(gid)')
code = code.replace('self.get_item_info(', 'await self.get_item_info(')

code = code.replace('await self.get_item_info(item.gid).filters', '(await self.get_item_info(item.gid)).filters')

code = DISCLAIMER + code
with open(output, 'w', encoding='UTF-8') as f:
f.write(code)


if __name__ == '__main__':
gen_client('steam_trader/api/_client.py', 'steam_trader/api/_client_async.py')
gen_client('steam_trader/web/_client.py', 'steam_trader/web/_client_async.py')
gen_client('steam_trader/api/ext/_client_ext.py', 'steam_trader/api/ext/_client_async_ext.py')
Loading

0 comments on commit ccb9e76

Please sign in to comment.