Compare commits
3 Commits
2212bbb0c4
...
a08bc2d839
Author | SHA1 | Date | |
---|---|---|---|
a08bc2d839 | |||
a3aabb3b88 | |||
4a0c045b27 |
56
.github/workflows/ci.yml
vendored
56
.github/workflows/ci.yml
vendored
@ -1,30 +1,28 @@
|
|||||||
name: test and deploy
|
name: test and deploy
|
||||||
on: [push]
|
on: [push]
|
||||||
|
|
||||||
|
env:
|
||||||
|
python-version: '3.11'
|
||||||
|
poetry-version: 1.5.1
|
||||||
|
node-version: 20
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
strategy:
|
runs-on: ubuntu-latest
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
python-version: ['3.11']
|
|
||||||
poetry-version: [1.5.1]
|
|
||||||
node: [20]
|
|
||||||
os: [ubuntu-latest]
|
|
||||||
runs-on: ${{ matrix.os }}
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3 # get source
|
- uses: actions/checkout@v3 # get source
|
||||||
|
|
||||||
# PYTHON
|
# PYTHON
|
||||||
- name: Install Python ${{ matrix.python-version }}
|
- name: Install Python ${{ env.python-version }}
|
||||||
uses: actions/setup-python@v4
|
uses: actions/setup-python@v4
|
||||||
with:
|
with:
|
||||||
python-version: ${{ matrix.python-version }}
|
python-version: ${{ env.python-version }}
|
||||||
|
|
||||||
# PYTHON dependency management
|
# PYTHON dependency management
|
||||||
- name: Install Poetry ${{ matrix.poetry-version }}
|
- name: Install Poetry ${{ env.poetry-version }}
|
||||||
uses: abatilo/actions-poetry@v2.1.6
|
uses: abatilo/actions-poetry@v2.1.6
|
||||||
with:
|
with:
|
||||||
poetry-version: ${{ matrix.poetry-version }}
|
poetry-version: ${{ env.poetry-version }}
|
||||||
|
|
||||||
# PYTHON install dependencies
|
# PYTHON install dependencies
|
||||||
- name: Install Python Dependencies
|
- name: Install Python Dependencies
|
||||||
@ -43,10 +41,10 @@ jobs:
|
|||||||
run: poetry run python -m unittest discover -s tests
|
run: poetry run python -m unittest discover -s tests
|
||||||
|
|
||||||
# JS setup for testing
|
# JS setup for testing
|
||||||
- name: Install Node ${{ matrix.node }}
|
- name: Install Node ${{ env.node-version }}
|
||||||
uses: actions/setup-node@v2
|
uses: actions/setup-node@v2
|
||||||
with:
|
with:
|
||||||
node-version: ${{ matrix.node }}
|
node-version: ${{ env.node-version }}
|
||||||
|
|
||||||
# JS install from lock.json
|
# JS install from lock.json
|
||||||
- name: Install Node Packages
|
- name: Install Node Packages
|
||||||
@ -62,32 +60,33 @@ jobs:
|
|||||||
|
|
||||||
documentation:
|
documentation:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
environment: prod
|
||||||
needs: build # for ignoring bad builds
|
needs: build # for ignoring bad builds
|
||||||
if: github.event_name == 'push' && github.ref == 'refs/heads/master'
|
if: github.event_name == 'push' && github.ref == 'refs/heads/master'
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3 # get source
|
- uses: actions/checkout@v3 # get source
|
||||||
|
|
||||||
# PYTHON
|
# PYTHON
|
||||||
- name: Install Python 3.11
|
- name: Install Python ${{ env.python-version }}
|
||||||
uses: actions/setup-python@v4
|
uses: actions/setup-python@v4
|
||||||
with:
|
with:
|
||||||
python-version: '3.11'
|
python-version: ${{ env.python-version }}
|
||||||
|
|
||||||
# PYTHON for dependency export only, not installing
|
# PYTHON for dependency export only, not installing
|
||||||
- name: Install Poetry 1.5.1
|
- name: Install Poetry ${{ env.poetry-version }}
|
||||||
uses: abatilo/actions-poetry@v2.1.6
|
uses: abatilo/actions-poetry@v2.1.6
|
||||||
with:
|
with:
|
||||||
poetry-version: 1.5.1
|
poetry-version: ${{ env.poetry-version }}
|
||||||
|
|
||||||
# PYTHON install dependencies
|
# PYTHON install dependencies
|
||||||
- name: Install Python Dependencies
|
- name: Install Python Dependencies
|
||||||
run: poetry install
|
run: poetry install
|
||||||
|
|
||||||
# # JS setup for jsdoc
|
# # JS setup for jsdoc
|
||||||
# - name: Install Node 20
|
# - name: Install Node ${{ env.node-version }}
|
||||||
# uses: actions/setup-node@v2
|
# uses: actions/setup-node@v2
|
||||||
# with:
|
# with:
|
||||||
# node-version: 20
|
# node-version: ${{ env.node-version }}
|
||||||
|
|
||||||
# # JS setup for jsdoc
|
# # JS setup for jsdoc
|
||||||
# - name: Install jsdoc
|
# - name: Install jsdoc
|
||||||
@ -118,8 +117,8 @@ jobs:
|
|||||||
publish_dir: ./public
|
publish_dir: ./public
|
||||||
|
|
||||||
package:
|
package:
|
||||||
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
environment: prod
|
||||||
needs: [build] # for ignoring bad builds
|
needs: [build] # for ignoring bad builds
|
||||||
if: github.event_name == 'push' && github.ref == 'refs/heads/master'
|
if: github.event_name == 'push' && github.ref == 'refs/heads/master'
|
||||||
|
|
||||||
@ -147,32 +146,33 @@ jobs:
|
|||||||
|
|
||||||
deploy:
|
deploy:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
environment: prod
|
||||||
needs: build # for ignoring bad builds
|
needs: build # for ignoring bad builds
|
||||||
if: github.event_name == 'push' && github.ref == 'refs/heads/master'
|
if: github.event_name == 'push' && github.ref == 'refs/heads/master'
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3 # get source
|
- uses: actions/checkout@v3 # get source
|
||||||
|
|
||||||
# PYTHON (pinned to 3.9 for gcloud attribute mapping error)
|
# PYTHON (pinned to 3.9 for gcloud attribute mapping error)
|
||||||
- name: Install Python 3.11
|
- name: Install Python ${{ env.python-version }}
|
||||||
uses: actions/setup-python@v4
|
uses: actions/setup-python@v4
|
||||||
with:
|
with:
|
||||||
python-version: '3.11'
|
python-version: ${{ env.python-version }}
|
||||||
|
|
||||||
# PYTHON for dependency export only, not installing
|
# PYTHON for dependency export only, not installing
|
||||||
- name: Install Poetry 1.5.1
|
- name: Install Poetry ${{ env.poetry-version }}
|
||||||
uses: abatilo/actions-poetry@v2.1.6
|
uses: abatilo/actions-poetry@v2.1.6
|
||||||
with:
|
with:
|
||||||
poetry-version: 1.5.1
|
poetry-version: ${{ env.poetry-version }}
|
||||||
|
|
||||||
# PYTHON Export Poetry dependencies as requirements.txt
|
# PYTHON Export Poetry dependencies as requirements.txt
|
||||||
- name: Export Poetry Dependencies
|
- name: Export Poetry Dependencies
|
||||||
run: python admin.py pydepend
|
run: python admin.py pydepend
|
||||||
|
|
||||||
# JS setup
|
# JS setup
|
||||||
- name: Install Node 20
|
- name: Install Node ${{ env.node-version }}
|
||||||
uses: actions/setup-node@v2
|
uses: actions/setup-node@v2
|
||||||
with:
|
with:
|
||||||
node-version: 20
|
node-version: ${{ env.node-version }}
|
||||||
|
|
||||||
# JS install from lock.json
|
# JS install from lock.json
|
||||||
- name: Install Node Packages
|
- name: Install Node Packages
|
||||||
@ -199,7 +199,7 @@ jobs:
|
|||||||
|
|
||||||
# DEPLOY set project
|
# DEPLOY set project
|
||||||
- name: Set GCP Project
|
- name: Set GCP Project
|
||||||
run: python admin.py set_project
|
run: python admin.py set_project ${{ vars.GCP_PROJECT }}
|
||||||
|
|
||||||
# DEPLOY domain routes
|
# DEPLOY domain routes
|
||||||
- name: Deploy dispatch.yaml
|
- name: Deploy dispatch.yaml
|
||||||
|
11
admin.py
11
admin.py
@ -74,7 +74,14 @@ class Admin(Cmd):
|
|||||||
Set project setting in gcloud console
|
Set project setting in gcloud console
|
||||||
"""
|
"""
|
||||||
print('>> setting project')
|
print('>> setting project')
|
||||||
subprocess.check_call('gcloud config set project sarsooxyz', shell=True)
|
subprocess.check_call(f'gcloud config set project {args.strip()}', shell=True)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def gcloud_project(self):
|
||||||
|
return subprocess.run(["gcloud", "config", "get-value", "project"], stdout=subprocess.PIPE).stdout.decode("utf-8").strip()
|
||||||
|
|
||||||
|
def do_project(self, args):
|
||||||
|
print(f"\"{self.gcloud_project}\"")
|
||||||
|
|
||||||
def deploy_function(self, name, timeout: int = 60, region='europe-west2'):
|
def deploy_function(self, name, timeout: int = 60, region='europe-west2'):
|
||||||
"""
|
"""
|
||||||
@ -83,9 +90,11 @@ class Admin(Cmd):
|
|||||||
subprocess.check_call(
|
subprocess.check_call(
|
||||||
f'gcloud functions deploy {name} '
|
f'gcloud functions deploy {name} '
|
||||||
f'--region {region} '
|
f'--region {region} '
|
||||||
|
f'--gen2 '
|
||||||
'--runtime=python311 '
|
'--runtime=python311 '
|
||||||
f'--trigger-topic {name} '
|
f'--trigger-topic {name} '
|
||||||
'--set-env-vars DEPLOY_DESTINATION=PROD '
|
'--set-env-vars DEPLOY_DESTINATION=PROD '
|
||||||
|
f'--service-account {name.replace("_", "-")}-func@{self.gcloud_project}.iam.gserviceaccount.com '
|
||||||
f'--timeout={timeout}s', shell=True
|
f'--timeout={timeout}s', shell=True
|
||||||
)
|
)
|
||||||
|
|
||||||
|
2
app.yaml
2
app.yaml
@ -1,5 +1,5 @@
|
|||||||
runtime: python311
|
runtime: python311
|
||||||
service: spotify
|
service: web_api
|
||||||
|
|
||||||
#instance_class: F1
|
#instance_class: F1
|
||||||
|
|
||||||
|
12
main.cron.py
12
main.cron.py
@ -1,13 +1,19 @@
|
|||||||
|
from cloudevents.http import CloudEvent
|
||||||
|
import functions_framework
|
||||||
|
|
||||||
from music.cloud.tasks import update_all_user_playlists, refresh_all_user_playlist_stats, update_all_user_tags
|
from music.cloud.tasks import update_all_user_playlists, refresh_all_user_playlist_stats, update_all_user_tags
|
||||||
|
|
||||||
|
|
||||||
def run_all_playlists(event, context):
|
@functions_framework.cloud_event
|
||||||
|
def run_all_playlists(event: CloudEvent):
|
||||||
update_all_user_playlists()
|
update_all_user_playlists()
|
||||||
|
|
||||||
|
|
||||||
def run_all_playlist_stats(event, context):
|
@functions_framework.cloud_event
|
||||||
|
def run_all_playlist_stats(event: CloudEvent):
|
||||||
refresh_all_user_playlist_stats()
|
refresh_all_user_playlist_stats()
|
||||||
|
|
||||||
|
|
||||||
def run_all_tags(event, context):
|
@functions_framework.cloud_event
|
||||||
|
def run_all_tags(event: CloudEvent):
|
||||||
update_all_user_tags()
|
update_all_user_tags()
|
||||||
|
@ -1,15 +1,18 @@
|
|||||||
def run_user_playlist(event, context):
|
from cloudevents.http import CloudEvent
|
||||||
|
import functions_framework
|
||||||
|
|
||||||
|
# Register a CloudEvent function with the Functions Framework
|
||||||
|
@functions_framework.cloud_event
|
||||||
|
def run_user_playlist_new(event: CloudEvent):
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
logger = logging.getLogger('music')
|
logger = logging.getLogger('music')
|
||||||
|
|
||||||
if event.get('attributes'):
|
attr = event.get_data()['message']['attributes']
|
||||||
if 'username' in event['attributes'] and 'name' in event['attributes']:
|
if 'username' in attr and 'name' in attr:
|
||||||
|
|
||||||
from music.tasks.run_user_playlist import run_user_playlist as do_run_user_playlist
|
from music.tasks.run_user_playlist import run_user_playlist as do_run_user_playlist
|
||||||
do_run_user_playlist(user=event['attributes']['username'], playlist=event['attributes']["name"])
|
do_run_user_playlist(user=attr['username'], playlist=attr["name"])
|
||||||
|
|
||||||
else:
|
else:
|
||||||
logger.error('no parameters in event attributes')
|
logger.error('no parameters in event attributes')
|
||||||
else:
|
|
||||||
logger.error('no attributes in event')
|
|
||||||
|
@ -1,15 +1,19 @@
|
|||||||
def update_tag(event, context):
|
from cloudevents.http import CloudEvent
|
||||||
|
import functions_framework
|
||||||
|
|
||||||
|
# Register a CloudEvent function with the Functions Framework
|
||||||
|
@functions_framework.cloud_event
|
||||||
|
def update_tag(event: CloudEvent):
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
logger = logging.getLogger('music')
|
logger = logging.getLogger('music')
|
||||||
|
|
||||||
if event.get('attributes'):
|
attr = event.get_data()['message']['attributes']
|
||||||
if 'username' in event['attributes'] and 'tag_id' in event['attributes']:
|
|
||||||
|
if 'username' in attr and 'tag_id' in attr:
|
||||||
|
|
||||||
from music.tasks.update_tag import update_tag as do_update_tag
|
from music.tasks.update_tag import update_tag as do_update_tag
|
||||||
do_update_tag(user=event['attributes']['username'], tag=event['attributes']["tag_id"])
|
do_update_tag(user=attr['username'], tag=attr["tag_id"])
|
||||||
|
|
||||||
else:
|
else:
|
||||||
logger.error('no parameters in event attributes')
|
logger.error('no parameters in event attributes')
|
||||||
else:
|
|
||||||
logger.error('no attributes in event')
|
|
||||||
|
138
poetry.lock
generated
138
poetry.lock
generated
@ -1,4 +1,4 @@
|
|||||||
# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand.
|
# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand.
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "alabaster"
|
name = "alabaster"
|
||||||
@ -206,6 +206,23 @@ files = [
|
|||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
colorama = {version = "*", markers = "platform_system == \"Windows\""}
|
colorama = {version = "*", markers = "platform_system == \"Windows\""}
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "cloudevents"
|
||||||
|
version = "1.9.0"
|
||||||
|
description = "CloudEvents Python SDK"
|
||||||
|
optional = false
|
||||||
|
python-versions = "*"
|
||||||
|
files = [
|
||||||
|
{file = "cloudevents-1.9.0-py3-none-any.whl", hash = "sha256:1011459d56d8f0184a46456f5d72632a2565f18171e51b33e06f643e723d30c9"},
|
||||||
|
{file = "cloudevents-1.9.0.tar.gz", hash = "sha256:8beb27503f97e215f886f73c17671012e96bb6268137fb3b2f9ef552727ab5b1"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
deprecation = ">=2.0,<3.0"
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
pydantic = ["pydantic (>=1.0.0,<2.0)"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "colorama"
|
name = "colorama"
|
||||||
version = "0.4.6"
|
version = "0.4.6"
|
||||||
@ -217,6 +234,20 @@ files = [
|
|||||||
{file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"},
|
{file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"},
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "deprecation"
|
||||||
|
version = "2.1.0"
|
||||||
|
description = "A library to handle automated deprecations"
|
||||||
|
optional = false
|
||||||
|
python-versions = "*"
|
||||||
|
files = [
|
||||||
|
{file = "deprecation-2.1.0-py2.py3-none-any.whl", hash = "sha256:a10811591210e1fb0e768a8c25517cabeabcba6f0bf96564f8ff45189f90b14a"},
|
||||||
|
{file = "deprecation-2.1.0.tar.gz", hash = "sha256:72b3bde64e5d778694b0cf68178aed03d15e15477116add3fb773e581f9518ff"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
packaging = "*"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "dill"
|
name = "dill"
|
||||||
version = "0.3.7"
|
version = "0.3.7"
|
||||||
@ -300,6 +331,24 @@ url = "https://github.com/Sarsoo/pyfmframework.git"
|
|||||||
reference = "master"
|
reference = "master"
|
||||||
resolved_reference = "0561b0036e9f45bc35f51ff83fb33d79f61329e7"
|
resolved_reference = "0561b0036e9f45bc35f51ff83fb33d79f61329e7"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "functions-framework"
|
||||||
|
version = "3.4.0"
|
||||||
|
description = "An open source FaaS (Function as a service) framework for writing portable Python functions -- brought to you by the Google Cloud Functions team."
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.5, <4"
|
||||||
|
files = [
|
||||||
|
{file = "functions-framework-3.4.0.tar.gz", hash = "sha256:c05639bcdd19f11a2eef1b6dabde5998f7d67cbddbffdf2f06ca56dc13c54e95"},
|
||||||
|
{file = "functions_framework-3.4.0-py3-none-any.whl", hash = "sha256:e22f30a66aab7180373f9a81f88114da088915b3622c62dcd6ec972ac908e0c4"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
click = ">=7.0,<9.0"
|
||||||
|
cloudevents = ">=1.2.0,<2.0.0"
|
||||||
|
flask = ">=1.0,<3.0"
|
||||||
|
gunicorn = {version = ">=19.2.0,<21.0", markers = "platform_system != \"Windows\""}
|
||||||
|
watchdog = ">=1.0.0"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "google-api-core"
|
name = "google-api-core"
|
||||||
version = "2.11.1"
|
version = "2.11.1"
|
||||||
@ -314,14 +363,8 @@ files = [
|
|||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
google-auth = ">=2.14.1,<3.0.dev0"
|
google-auth = ">=2.14.1,<3.0.dev0"
|
||||||
googleapis-common-protos = ">=1.56.2,<2.0.dev0"
|
googleapis-common-protos = ">=1.56.2,<2.0.dev0"
|
||||||
grpcio = [
|
grpcio = {version = ">=1.49.1,<2.0dev", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}
|
||||||
{version = ">=1.33.2,<2.0dev", optional = true, markers = "extra == \"grpc\""},
|
grpcio-status = {version = ">=1.49.1,<2.0.dev0", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}
|
||||||
{version = ">=1.49.1,<2.0dev", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""},
|
|
||||||
]
|
|
||||||
grpcio-status = [
|
|
||||||
{version = ">=1.33.2,<2.0.dev0", optional = true, markers = "extra == \"grpc\""},
|
|
||||||
{version = ">=1.49.1,<2.0.dev0", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""},
|
|
||||||
]
|
|
||||||
protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0.dev0"
|
protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0.dev0"
|
||||||
requests = ">=2.18.0,<3.0.0.dev0"
|
requests = ">=2.18.0,<3.0.0.dev0"
|
||||||
|
|
||||||
@ -604,6 +647,26 @@ googleapis-common-protos = ">=1.5.5"
|
|||||||
grpcio = ">=1.56.2"
|
grpcio = ">=1.56.2"
|
||||||
protobuf = ">=4.21.6"
|
protobuf = ">=4.21.6"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "gunicorn"
|
||||||
|
version = "20.1.0"
|
||||||
|
description = "WSGI HTTP Server for UNIX"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.5"
|
||||||
|
files = [
|
||||||
|
{file = "gunicorn-20.1.0-py3-none-any.whl", hash = "sha256:9dcc4547dbb1cb284accfb15ab5667a0e5d1881cc443e0677b4882a4067a807e"},
|
||||||
|
{file = "gunicorn-20.1.0.tar.gz", hash = "sha256:e0a968b5ba15f8a328fdfd7ab1fcb5af4470c28aaf7e55df02a99bc13138e6e8"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
setuptools = ">=3.0"
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
eventlet = ["eventlet (>=0.24.1)"]
|
||||||
|
gevent = ["gevent (>=1.4.0)"]
|
||||||
|
setproctitle = ["setproctitle"]
|
||||||
|
tornado = ["tornado (>=0.2)"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "h11"
|
name = "h11"
|
||||||
version = "0.14.0"
|
version = "0.14.0"
|
||||||
@ -1073,6 +1136,22 @@ files = [
|
|||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
pyasn1 = ">=0.1.3"
|
pyasn1 = ">=0.1.3"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "setuptools"
|
||||||
|
version = "68.1.2"
|
||||||
|
description = "Easily download, build, install, upgrade, and uninstall Python packages"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.8"
|
||||||
|
files = [
|
||||||
|
{file = "setuptools-68.1.2-py3-none-any.whl", hash = "sha256:3d8083eed2d13afc9426f227b24fd1659489ec107c0e86cec2ffdde5c92e790b"},
|
||||||
|
{file = "setuptools-68.1.2.tar.gz", hash = "sha256:3d4dfa6d95f1b101d695a6160a7626e15583af71a5f52176efa5d39a054d475d"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5,<=7.1.2)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"]
|
||||||
|
testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"]
|
||||||
|
testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "six"
|
name = "six"
|
||||||
version = "1.16.0"
|
version = "1.16.0"
|
||||||
@ -1320,6 +1399,45 @@ brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"]
|
|||||||
secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"]
|
secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"]
|
||||||
socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"]
|
socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "watchdog"
|
||||||
|
version = "3.0.0"
|
||||||
|
description = "Filesystem events monitoring"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.7"
|
||||||
|
files = [
|
||||||
|
{file = "watchdog-3.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:336adfc6f5cc4e037d52db31194f7581ff744b67382eb6021c868322e32eef41"},
|
||||||
|
{file = "watchdog-3.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a70a8dcde91be523c35b2bf96196edc5730edb347e374c7de7cd20c43ed95397"},
|
||||||
|
{file = "watchdog-3.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:adfdeab2da79ea2f76f87eb42a3ab1966a5313e5a69a0213a3cc06ef692b0e96"},
|
||||||
|
{file = "watchdog-3.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2b57a1e730af3156d13b7fdddfc23dea6487fceca29fc75c5a868beed29177ae"},
|
||||||
|
{file = "watchdog-3.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7ade88d0d778b1b222adebcc0927428f883db07017618a5e684fd03b83342bd9"},
|
||||||
|
{file = "watchdog-3.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7e447d172af52ad204d19982739aa2346245cc5ba6f579d16dac4bfec226d2e7"},
|
||||||
|
{file = "watchdog-3.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9fac43a7466eb73e64a9940ac9ed6369baa39b3bf221ae23493a9ec4d0022674"},
|
||||||
|
{file = "watchdog-3.0.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8ae9cda41fa114e28faf86cb137d751a17ffd0316d1c34ccf2235e8a84365c7f"},
|
||||||
|
{file = "watchdog-3.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:25f70b4aa53bd743729c7475d7ec41093a580528b100e9a8c5b5efe8899592fc"},
|
||||||
|
{file = "watchdog-3.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4f94069eb16657d2c6faada4624c39464f65c05606af50bb7902e036e3219be3"},
|
||||||
|
{file = "watchdog-3.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7c5f84b5194c24dd573fa6472685b2a27cc5a17fe5f7b6fd40345378ca6812e3"},
|
||||||
|
{file = "watchdog-3.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3aa7f6a12e831ddfe78cdd4f8996af9cf334fd6346531b16cec61c3b3c0d8da0"},
|
||||||
|
{file = "watchdog-3.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:233b5817932685d39a7896b1090353fc8efc1ef99c9c054e46c8002561252fb8"},
|
||||||
|
{file = "watchdog-3.0.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:13bbbb462ee42ec3c5723e1205be8ced776f05b100e4737518c67c8325cf6100"},
|
||||||
|
{file = "watchdog-3.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:8f3ceecd20d71067c7fd4c9e832d4e22584318983cabc013dbf3f70ea95de346"},
|
||||||
|
{file = "watchdog-3.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c9d8c8ec7efb887333cf71e328e39cffbf771d8f8f95d308ea4125bf5f90ba64"},
|
||||||
|
{file = "watchdog-3.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0e06ab8858a76e1219e68c7573dfeba9dd1c0219476c5a44d5333b01d7e1743a"},
|
||||||
|
{file = "watchdog-3.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:d00e6be486affb5781468457b21a6cbe848c33ef43f9ea4a73b4882e5f188a44"},
|
||||||
|
{file = "watchdog-3.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:c07253088265c363d1ddf4b3cdb808d59a0468ecd017770ed716991620b8f77a"},
|
||||||
|
{file = "watchdog-3.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:5113334cf8cf0ac8cd45e1f8309a603291b614191c9add34d33075727a967709"},
|
||||||
|
{file = "watchdog-3.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:51f90f73b4697bac9c9a78394c3acbbd331ccd3655c11be1a15ae6fe289a8c83"},
|
||||||
|
{file = "watchdog-3.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:ba07e92756c97e3aca0912b5cbc4e5ad802f4557212788e72a72a47ff376950d"},
|
||||||
|
{file = "watchdog-3.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:d429c2430c93b7903914e4db9a966c7f2b068dd2ebdd2fa9b9ce094c7d459f33"},
|
||||||
|
{file = "watchdog-3.0.0-py3-none-win32.whl", hash = "sha256:3ed7c71a9dccfe838c2f0b6314ed0d9b22e77d268c67e015450a29036a81f60f"},
|
||||||
|
{file = "watchdog-3.0.0-py3-none-win_amd64.whl", hash = "sha256:4c9956d27be0bb08fc5f30d9d0179a855436e655f046d288e2bcc11adfae893c"},
|
||||||
|
{file = "watchdog-3.0.0-py3-none-win_ia64.whl", hash = "sha256:5d9f3a10e02d7371cd929b5d8f11e87d4bad890212ed3901f9b4d68767bee759"},
|
||||||
|
{file = "watchdog-3.0.0.tar.gz", hash = "sha256:4d98a320595da7a7c5a18fc48cb633c2e73cda78f93cac2ef42d42bf609a33f9"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
watchmedo = ["PyYAML (>=3.10)"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "werkzeug"
|
name = "werkzeug"
|
||||||
version = "2.3.6"
|
version = "2.3.6"
|
||||||
@ -1424,4 +1542,4 @@ files = [
|
|||||||
[metadata]
|
[metadata]
|
||||||
lock-version = "2.0"
|
lock-version = "2.0"
|
||||||
python-versions = "~3.11"
|
python-versions = "~3.11"
|
||||||
content-hash = "6078bb265686e365bd85f887faf7ccad94131fd398d83ce0a9d9474b2515ed13"
|
content-hash = "a62b8ff1d207a4c91dd32c0dbbaa6cfd54ad8517ca2af1496ab8f7bb5bbc02c8"
|
||||||
|
@ -24,6 +24,7 @@ google-cloud-tasks = "^2.10.0"
|
|||||||
requests = "^2.28.1"
|
requests = "^2.28.1"
|
||||||
httpx = {extras = ["http2"], version = "^0.24.1"}
|
httpx = {extras = ["http2"], version = "^0.24.1"}
|
||||||
PyJWT = "^2.4.0"
|
PyJWT = "^2.4.0"
|
||||||
|
functions-framework = "^3.4.0"
|
||||||
|
|
||||||
spotframework = { git = "https://github.com/Sarsoo/spotframework.git", branch = "master" }
|
spotframework = { git = "https://github.com/Sarsoo/spotframework.git", branch = "master" }
|
||||||
fmframework = { git = "https://github.com/Sarsoo/pyfmframework.git", branch = "master" }
|
fmframework = { git = "https://github.com/Sarsoo/pyfmframework.git", branch = "master" }
|
||||||
|
Loading…
Reference in New Issue
Block a user