Merge branch 'main' into qrcodemaker
This commit is contained in:
commit
618717b529
59
.github/workflows/tests.yml
vendored
59
.github/workflows/tests.yml
vendored
|
@ -68,11 +68,11 @@ jobs:
|
||||||
uses: codecov/codecov-action@v3
|
uses: codecov/codecov-action@v3
|
||||||
with:
|
with:
|
||||||
file: ./coverage.xml
|
file: ./coverage.xml
|
||||||
pipenv-sqlite:
|
poetry-sqlite:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
python-version: [3.7, 3.8, 3.9]
|
python-version: [3.9]
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
- name: Set up Python ${{ matrix.python-version }}
|
- name: Set up Python ${{ matrix.python-version }}
|
||||||
|
@ -80,9 +80,56 @@ jobs:
|
||||||
with:
|
with:
|
||||||
python-version: ${{ matrix.python-version }}
|
python-version: ${{ matrix.python-version }}
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
|
env:
|
||||||
|
VIRTUAL_ENV: ./venv
|
||||||
|
PATH: ${{ env.VIRTUAL_ENV }}/bin:${{ env.PATH }}
|
||||||
run: |
|
run: |
|
||||||
pip install pipenv
|
python -m venv ${{ env.VIRTUAL_ENV }}
|
||||||
pipenv install --dev
|
./venv/bin/python -m pip install --upgrade pip
|
||||||
pipenv install importlib-metadata
|
./venv/bin/pip install -r requirements.txt
|
||||||
|
./venv/bin/pip install pytest pytest-asyncio pytest-cov requests mock
|
||||||
- name: Run tests
|
- name: Run tests
|
||||||
run: make test-pipenv
|
run: make test
|
||||||
|
poetry-postgres:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
services:
|
||||||
|
postgres:
|
||||||
|
image: postgres:latest
|
||||||
|
env:
|
||||||
|
POSTGRES_USER: postgres
|
||||||
|
POSTGRES_PASSWORD: postgres
|
||||||
|
POSTGRES_DB: postgres
|
||||||
|
ports:
|
||||||
|
# maps tcp port 5432 on service container to the host
|
||||||
|
- 5432:5432
|
||||||
|
options: >-
|
||||||
|
--health-cmd pg_isready
|
||||||
|
--health-interval 10s
|
||||||
|
--health-timeout 5s
|
||||||
|
--health-retries 5
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
python-version: [3.9]
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- name: Set up Python ${{ matrix.python-version }}
|
||||||
|
uses: actions/setup-python@v2
|
||||||
|
with:
|
||||||
|
python-version: ${{ matrix.python-version }}
|
||||||
|
- name: Install dependencies
|
||||||
|
env:
|
||||||
|
VIRTUAL_ENV: ./venv
|
||||||
|
PATH: ${{ env.VIRTUAL_ENV }}/bin:${{ env.PATH }}
|
||||||
|
run: |
|
||||||
|
python -m venv ${{ env.VIRTUAL_ENV }}
|
||||||
|
./venv/bin/python -m pip install --upgrade pip
|
||||||
|
./venv/bin/pip install -r requirements.txt
|
||||||
|
./venv/bin/pip install pytest pytest-asyncio pytest-cov requests mock
|
||||||
|
- name: Run tests
|
||||||
|
env:
|
||||||
|
LNBITS_DATABASE_URL: postgres://postgres:postgres@0.0.0.0:5432/postgres
|
||||||
|
run: make test
|
||||||
|
- name: Upload coverage to Codecov
|
||||||
|
uses: codecov/codecov-action@v3
|
||||||
|
with:
|
||||||
|
file: ./coverage.xml
|
46
Pipfile
46
Pipfile
|
@ -1,46 +0,0 @@
|
||||||
[[source]]
|
|
||||||
name = "pypi"
|
|
||||||
url = "https://pypi.org/simple"
|
|
||||||
verify_ssl = true
|
|
||||||
|
|
||||||
[requires]
|
|
||||||
python_version = "3.8"
|
|
||||||
|
|
||||||
[packages]
|
|
||||||
bitstring = "*"
|
|
||||||
cerberus = "*"
|
|
||||||
ecdsa = "*"
|
|
||||||
environs = "*"
|
|
||||||
lnurl = "==0.3.6"
|
|
||||||
loguru = "*"
|
|
||||||
pyscss = "*"
|
|
||||||
shortuuid = "*"
|
|
||||||
typing-extensions = "*"
|
|
||||||
httpx = "*"
|
|
||||||
sqlalchemy-aio = "*"
|
|
||||||
embit = "*"
|
|
||||||
pyqrcode = "*"
|
|
||||||
pypng = "*"
|
|
||||||
sqlalchemy = "==1.3.23"
|
|
||||||
psycopg2-binary = "*"
|
|
||||||
aiofiles = "*"
|
|
||||||
asyncio = "*"
|
|
||||||
fastapi = "*"
|
|
||||||
uvicorn = {extras = ["standard"], version = "*"}
|
|
||||||
sse-starlette = "*"
|
|
||||||
jinja2 = "==3.0.1"
|
|
||||||
pyngrok = "*"
|
|
||||||
secp256k1 = "==0.14.0"
|
|
||||||
cffi = "==1.15.0"
|
|
||||||
pycryptodomex = "*"
|
|
||||||
|
|
||||||
[dev-packages]
|
|
||||||
black = "==20.8b1"
|
|
||||||
mock = "*"
|
|
||||||
mypy = "*"
|
|
||||||
pytest = "*"
|
|
||||||
pytest-asyncio = "*"
|
|
||||||
pytest-cov = "*"
|
|
||||||
requests = "*"
|
|
||||||
types-mock = "*"
|
|
||||||
types-protobuf = "*"
|
|
1224
Pipfile.lock
generated
1224
Pipfile.lock
generated
File diff suppressed because it is too large
Load Diff
|
@ -8,7 +8,7 @@ nav_order: 1
|
||||||
# Installation
|
# Installation
|
||||||
|
|
||||||
This guide has been moved to the [installation guide](../guide/installation.md).
|
This guide has been moved to the [installation guide](../guide/installation.md).
|
||||||
To install the developer packages, use `pipenv install --dev`.
|
To install the developer packages for running tests etc before pr'ing, use `./venv/bin/pip install pytest pytest-asyncio pytest-cov requests mock black mypy isort`.
|
||||||
|
|
||||||
## Notes:
|
## Notes:
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,7 @@ nav_order: 2
|
||||||
|
|
||||||
# Basic installation
|
# Basic installation
|
||||||
|
|
||||||
You can choose between four package managers, `poetry`, `pipenv`, `venv` and `nix`.
|
You can choose between four package managers, `poetry`, `nix` and `venv`.
|
||||||
|
|
||||||
By default, LNbits will use SQLite as its database. You can also use PostgreSQL which is recommended for applications with a high load (see guide below).
|
By default, LNbits will use SQLite as its database. You can also use PostgreSQL which is recommended for applications with a high load (see guide below).
|
||||||
|
|
||||||
|
@ -33,36 +33,26 @@ poetry run lnbits
|
||||||
# To change port/host pass 'poetry run lnbits --port 9000 --host 0.0.0.0'
|
# To change port/host pass 'poetry run lnbits --port 9000 --host 0.0.0.0'
|
||||||
```
|
```
|
||||||
|
|
||||||
## Option 2: pipenv
|
## Option 2: Nix
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
git clone https://github.com/lnbits/lnbits-legend.git
|
git clone https://github.com/lnbits/lnbits-legend.git
|
||||||
cd lnbits-legend/
|
cd lnbits-legend/
|
||||||
|
# Modern debian distros usually include Nix, however you can install with:
|
||||||
|
# 'sh <(curl -L https://nixos.org/nix/install) --daemon', or use setup here https://nixos.org/download.html#nix-verify-installation
|
||||||
|
|
||||||
sudo apt update && sudo apt install -y pipenv
|
nix build .#lnbits
|
||||||
pipenv install --dev
|
mkdir data
|
||||||
# pipenv --python 3.9 install --dev (if you wish to use a version of Python higher than 3.7)
|
|
||||||
pipenv shell
|
|
||||||
# pipenv --python 3.9 shell (if you wish to use a version of Python higher than 3.7)
|
|
||||||
|
|
||||||
# If any of the modules fails to install, try checking and upgrading your setupTool module
|
|
||||||
# pip install -U setuptools wheel
|
|
||||||
|
|
||||||
# install libffi/libpq in case "pipenv install" fails
|
|
||||||
# sudo apt-get install -y libffi-dev libpq-dev
|
|
||||||
|
|
||||||
mkdir data && cp .env.example .env
|
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Running the server
|
#### Running the server
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
pipenv run python -m uvicorn lnbits.__main__:app --port 5000 --host 0.0.0.0
|
# .env variables are currently passed when running
|
||||||
|
LNBITS_DATA_FOLDER=data LNBITS_BACKEND_WALLET_CLASS=LNbitsWallet LNBITS_ENDPOINT=https://legend.lnbits.com LNBITS_KEY=7b1a78d6c78f48b09a202f2dcb2d22eb ./result/bin/lnbits --port 9000
|
||||||
```
|
```
|
||||||
|
|
||||||
Add the flag `--reload` for development (includes hot-reload).
|
|
||||||
|
|
||||||
|
|
||||||
## Option 3: venv
|
## Option 3: venv
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
|
@ -84,26 +74,6 @@ mkdir data && cp .env.example .env
|
||||||
|
|
||||||
If you want to host LNbits on the internet, run with the option `--host 0.0.0.0`.
|
If you want to host LNbits on the internet, run with the option `--host 0.0.0.0`.
|
||||||
|
|
||||||
## Option 4: Nix
|
|
||||||
|
|
||||||
```sh
|
|
||||||
git clone https://github.com/lnbits/lnbits-legend.git
|
|
||||||
cd lnbits-legend/
|
|
||||||
# Install nix, modern debian distros usually already include
|
|
||||||
sh <(curl -L https://nixos.org/nix/install) --daemon
|
|
||||||
|
|
||||||
nix build .#lnbits
|
|
||||||
mkdir data
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Running the server
|
|
||||||
|
|
||||||
```sh
|
|
||||||
# .env variables are currently passed when running
|
|
||||||
LNBITS_DATA_FOLDER=data LNBITS_BACKEND_WALLET_CLASS=LNbitsWallet LNBITS_ENDPOINT=https://legend.lnbits.com LNBITS_KEY=7b1a78d6c78f48b09a202f2dcb2d22eb ./result/bin/lnbits --port 9000
|
|
||||||
```
|
|
||||||
|
|
||||||
### Troubleshooting
|
### Troubleshooting
|
||||||
|
|
||||||
Problems installing? These commands have helped us install LNbits.
|
Problems installing? These commands have helped us install LNbits.
|
||||||
|
@ -112,10 +82,10 @@ Problems installing? These commands have helped us install LNbits.
|
||||||
sudo apt install pkg-config libffi-dev libpq-dev
|
sudo apt install pkg-config libffi-dev libpq-dev
|
||||||
|
|
||||||
# if the secp256k1 build fails:
|
# if the secp256k1 build fails:
|
||||||
# if you used pipenv (option 1)
|
# if you used venv
|
||||||
pipenv install setuptools wheel
|
|
||||||
# if you used venv (option 2)
|
|
||||||
./venv/bin/pip install setuptools wheel
|
./venv/bin/pip install setuptools wheel
|
||||||
|
# if you used poetry
|
||||||
|
poetry add setuptools wheel
|
||||||
# build essentials for debian/ubuntu
|
# build essentials for debian/ubuntu
|
||||||
sudo apt install python3-dev gcc build-essential
|
sudo apt install python3-dev gcc build-essential
|
||||||
```
|
```
|
||||||
|
|
|
@ -61,7 +61,7 @@ def decode(pr: str) -> Invoice:
|
||||||
invoice = Invoice()
|
invoice = Invoice()
|
||||||
|
|
||||||
# decode the amount from the hrp
|
# decode the amount from the hrp
|
||||||
m = re.search("[^\d]+", hrp[2:])
|
m = re.search(r"[^\d]+", hrp[2:])
|
||||||
if m:
|
if m:
|
||||||
amountstr = hrp[2 + m.end() :]
|
amountstr = hrp[2 + m.end() :]
|
||||||
if amountstr != "":
|
if amountstr != "":
|
||||||
|
@ -296,7 +296,7 @@ def _unshorten_amount(amount: str) -> int:
|
||||||
# BOLT #11:
|
# BOLT #11:
|
||||||
# A reader SHOULD fail if `amount` contains a non-digit, or is followed by
|
# A reader SHOULD fail if `amount` contains a non-digit, or is followed by
|
||||||
# anything except a `multiplier` in the table above.
|
# anything except a `multiplier` in the table above.
|
||||||
if not re.fullmatch("\d+[pnum]?", str(amount)):
|
if not re.fullmatch(r"\d+[pnum]?", str(amount)):
|
||||||
raise ValueError("Invalid amount '{}'".format(amount))
|
raise ValueError("Invalid amount '{}'".format(amount))
|
||||||
|
|
||||||
if unit in units:
|
if unit in units:
|
||||||
|
|
|
@ -488,7 +488,8 @@ async def api_lnurlscan(code: str, wallet: WalletTypeInfo = Depends(get_key_type
|
||||||
)
|
)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
tag = data["tag"]
|
tag: str = data.get("tag")
|
||||||
|
params.update(**data)
|
||||||
if tag == "channelRequest":
|
if tag == "channelRequest":
|
||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
status_code=HTTPStatus.BAD_REQUEST,
|
status_code=HTTPStatus.BAD_REQUEST,
|
||||||
|
@ -498,10 +499,7 @@ async def api_lnurlscan(code: str, wallet: WalletTypeInfo = Depends(get_key_type
|
||||||
"message": "unsupported",
|
"message": "unsupported",
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
elif tag == "withdrawRequest":
|
||||||
params.update(**data)
|
|
||||||
|
|
||||||
if tag == "withdrawRequest":
|
|
||||||
params.update(kind="withdraw")
|
params.update(kind="withdraw")
|
||||||
params.update(fixed=data["minWithdrawable"] == data["maxWithdrawable"])
|
params.update(fixed=data["minWithdrawable"] == data["maxWithdrawable"])
|
||||||
|
|
||||||
|
@ -519,8 +517,7 @@ async def api_lnurlscan(code: str, wallet: WalletTypeInfo = Depends(get_key_type
|
||||||
query=urlencode(qs, doseq=True)
|
query=urlencode(qs, doseq=True)
|
||||||
)
|
)
|
||||||
params.update(callback=urlunparse(parsed_callback))
|
params.update(callback=urlunparse(parsed_callback))
|
||||||
|
elif tag == "payRequest":
|
||||||
if tag == "payRequest":
|
|
||||||
params.update(kind="pay")
|
params.update(kind="pay")
|
||||||
params.update(fixed=data["minSendable"] == data["maxSendable"])
|
params.update(fixed=data["minSendable"] == data["maxSendable"])
|
||||||
|
|
||||||
|
@ -538,8 +535,8 @@ async def api_lnurlscan(code: str, wallet: WalletTypeInfo = Depends(get_key_type
|
||||||
params.update(image=data_uri)
|
params.update(image=data_uri)
|
||||||
if k == "text/email" or k == "text/identifier":
|
if k == "text/email" or k == "text/identifier":
|
||||||
params.update(targetUser=v)
|
params.update(targetUser=v)
|
||||||
|
|
||||||
params.update(commentAllowed=data.get("commentAllowed", 0))
|
params.update(commentAllowed=data.get("commentAllowed", 0))
|
||||||
|
|
||||||
except KeyError as exc:
|
except KeyError as exc:
|
||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
status_code=HTTPStatus.SERVICE_UNAVAILABLE,
|
status_code=HTTPStatus.SERVICE_UNAVAILABLE,
|
||||||
|
|
|
@ -21,7 +21,7 @@ class Jinja2Templates(templating.Jinja2Templates):
|
||||||
self.env = self.get_environment(loader)
|
self.env = self.get_environment(loader)
|
||||||
|
|
||||||
def get_environment(self, loader: "jinja2.BaseLoader") -> "jinja2.Environment":
|
def get_environment(self, loader: "jinja2.BaseLoader") -> "jinja2.Environment":
|
||||||
@jinja2.contextfunction
|
@jinja2.pass_context
|
||||||
def url_for(context: dict, name: str, **path_params: typing.Any) -> str:
|
def url_for(context: dict, name: str, **path_params: typing.Any) -> str:
|
||||||
request: Request = context["request"]
|
request: Request = context["request"]
|
||||||
return request.app.url_path_for(name, **path_params)
|
return request.app.url_path_for(name, **path_params)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user