feat: initialize FetchML ML platform with core project structure
- Add comprehensive README with architecture overview and quick start guide - Set up Go module with production-ready dependencies - Configure build system with Makefile for development and production builds - Add Docker Compose for local development environment - Include project configuration files (linting, Python, etc.) This establishes the foundation for a production-ready ML experiment platform with task queuing, monitoring, and modern CLI/API interface.
This commit is contained in:
commit
c5049a2fdf
11 changed files with 1577 additions and 0 deletions
47
.flake8
Normal file
47
.flake8
Normal file
|
|
@ -0,0 +1,47 @@
|
||||||
|
[flake8]
|
||||||
|
max-line-length = 80
|
||||||
|
max-complexity = 10
|
||||||
|
exclude =
|
||||||
|
.git,
|
||||||
|
__pycache__,
|
||||||
|
*.pyc,
|
||||||
|
.pytest_cache,
|
||||||
|
.mypy_cache,
|
||||||
|
.venv,
|
||||||
|
venv,
|
||||||
|
build,
|
||||||
|
dist,
|
||||||
|
# ML experiment code - exclude from style checks
|
||||||
|
podman/workspace,
|
||||||
|
workspace,
|
||||||
|
tests/fixtures/examples,
|
||||||
|
tests/fixtures/podman,
|
||||||
|
results,
|
||||||
|
data,
|
||||||
|
logs,
|
||||||
|
secrets,
|
||||||
|
.agent
|
||||||
|
|
||||||
|
ignore =
|
||||||
|
E203,
|
||||||
|
E501,
|
||||||
|
W503,
|
||||||
|
W504,
|
||||||
|
F401,
|
||||||
|
E402,
|
||||||
|
C901
|
||||||
|
|
||||||
|
per-file-ignores =
|
||||||
|
__init__.py:F401
|
||||||
|
tests/*:F401,F811
|
||||||
|
*_test.py:F401,F811
|
||||||
|
conftest.py:F401,F811
|
||||||
|
|
||||||
|
# Additional Google Style Guide recommendations
|
||||||
|
inline-quotes = single
|
||||||
|
multiline-quotes = double
|
||||||
|
docstring-quotes = double
|
||||||
|
|
||||||
|
# Import ordering (Google style)
|
||||||
|
import-order-style = google
|
||||||
|
application-import-names = fetch_ml
|
||||||
224
.gitignore
vendored
Normal file
224
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,224 @@
|
||||||
|
# Binaries for programs and plugins
|
||||||
|
*.exe
|
||||||
|
*.exe~
|
||||||
|
*.dll
|
||||||
|
*.so
|
||||||
|
*.dylib
|
||||||
|
|
||||||
|
# Test binary, built with `go test -c`
|
||||||
|
*.test
|
||||||
|
|
||||||
|
# Output of the go coverage tool, specifically when used with LiteIDE
|
||||||
|
*.out
|
||||||
|
|
||||||
|
# Dependency directories (remove the comment below to include it)
|
||||||
|
# vendor/
|
||||||
|
|
||||||
|
# Go workspace file
|
||||||
|
go.work
|
||||||
|
|
||||||
|
# IDE files
|
||||||
|
.vscode/
|
||||||
|
.idea/
|
||||||
|
*.swp
|
||||||
|
*.swo
|
||||||
|
*~
|
||||||
|
|
||||||
|
# OS generated files
|
||||||
|
.DS_Store
|
||||||
|
.DS_Store?
|
||||||
|
._*
|
||||||
|
.Spotlight-V100
|
||||||
|
.Trashes
|
||||||
|
ehthumbs.db
|
||||||
|
Thumbs.db
|
||||||
|
|
||||||
|
# Python cache and artifacts
|
||||||
|
__pycache__/
|
||||||
|
*.py[cod]
|
||||||
|
*$py.class
|
||||||
|
*.so
|
||||||
|
.Python
|
||||||
|
build/
|
||||||
|
develop-eggs/
|
||||||
|
dist/
|
||||||
|
downloads/
|
||||||
|
eggs/
|
||||||
|
.eggs/
|
||||||
|
# Python lib directories
|
||||||
|
**/site-packages/
|
||||||
|
**/lib/python*/
|
||||||
|
# Allow scripts/lib for shell libraries
|
||||||
|
!scripts/lib/
|
||||||
|
parts/
|
||||||
|
sdist/
|
||||||
|
var/
|
||||||
|
wheels/
|
||||||
|
share/python-wheels/
|
||||||
|
*.egg-info/
|
||||||
|
.installed.cfg
|
||||||
|
*.egg
|
||||||
|
MANIFEST
|
||||||
|
|
||||||
|
# PyInstaller
|
||||||
|
*.manifest
|
||||||
|
*.spec
|
||||||
|
|
||||||
|
# Installer logs
|
||||||
|
pip-log.txt
|
||||||
|
pip-delete-this-directory.txt
|
||||||
|
|
||||||
|
# Unit test / coverage reports
|
||||||
|
htmlcov/
|
||||||
|
.tox/
|
||||||
|
.nox/
|
||||||
|
.coverage
|
||||||
|
.coverage.*
|
||||||
|
.cache
|
||||||
|
nosetests.xml
|
||||||
|
coverage.xml
|
||||||
|
*.cover
|
||||||
|
*.py,cover
|
||||||
|
.hypothesis/
|
||||||
|
.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
|
||||||
|
.python-version
|
||||||
|
|
||||||
|
# pipenv
|
||||||
|
Pipfile.lock
|
||||||
|
|
||||||
|
# poetry
|
||||||
|
poetry.lock
|
||||||
|
|
||||||
|
# pdm
|
||||||
|
.pdm.toml
|
||||||
|
|
||||||
|
# PEP 582
|
||||||
|
__pypackages__/
|
||||||
|
|
||||||
|
# Celery stuff
|
||||||
|
celerybeat-schedule
|
||||||
|
celerybeat.pid
|
||||||
|
|
||||||
|
# SageMath parsed files
|
||||||
|
*.sage.py
|
||||||
|
|
||||||
|
# Environments
|
||||||
|
.env
|
||||||
|
.venv
|
||||||
|
env/
|
||||||
|
venv/
|
||||||
|
ENV/
|
||||||
|
env.bak/
|
||||||
|
venv.bak/
|
||||||
|
|
||||||
|
# Spyder project settings
|
||||||
|
.spyderproject
|
||||||
|
.spyproject
|
||||||
|
|
||||||
|
# Rope project settings
|
||||||
|
.ropeproject
|
||||||
|
|
||||||
|
# mkdocs documentation
|
||||||
|
/site
|
||||||
|
|
||||||
|
# mypy
|
||||||
|
.mypy_cache/
|
||||||
|
.dmypy.json
|
||||||
|
dmypy.json
|
||||||
|
|
||||||
|
# Pyre type checker
|
||||||
|
.pyre/
|
||||||
|
|
||||||
|
# pytype static type analyzer
|
||||||
|
.pytype/
|
||||||
|
|
||||||
|
# Cython debug symbols
|
||||||
|
cython_debug/
|
||||||
|
|
||||||
|
# PyCharm
|
||||||
|
.idea/
|
||||||
|
|
||||||
|
# Project-specific
|
||||||
|
ml_jobs/
|
||||||
|
test_output/
|
||||||
|
# Python build directory only
|
||||||
|
**/build/lib/
|
||||||
|
**/build/bdist*/
|
||||||
|
**/build/scripts*/
|
||||||
|
# Allow build/ directory for Docker configs
|
||||||
|
!build/
|
||||||
|
!build/**
|
||||||
|
# But ignore Python build artifacts if they happen
|
||||||
|
build/lib/
|
||||||
|
build/bdist*/
|
||||||
|
coverage.out
|
||||||
|
coverage.html
|
||||||
|
queue-coverage.out
|
||||||
|
coverage/
|
||||||
|
|
||||||
|
# Redis dump
|
||||||
|
dump.rdb
|
||||||
|
|
||||||
|
# Configuration files with secrets
|
||||||
|
!config_*.yaml
|
||||||
|
!config_local.yaml.example
|
||||||
|
!config_prod.yaml.example
|
||||||
|
|
||||||
|
# Database files
|
||||||
|
db/*.db
|
||||||
|
!db/.gitkeep
|
||||||
|
|
||||||
|
# API keys and secrets
|
||||||
|
*.key
|
||||||
|
*.pem
|
||||||
|
secrets/
|
||||||
|
cli/src/assets/rsync_release.bin
|
||||||
|
|
||||||
|
# Test files
|
||||||
|
test_*.go
|
||||||
|
*_test_output/
|
||||||
|
|
||||||
|
# Build artifacts
|
||||||
|
bin/
|
||||||
|
cli/zig-out/
|
||||||
|
cli/.zig-cache/
|
||||||
|
zig-out/
|
||||||
|
.zig-cache/
|
||||||
|
|
||||||
|
# Experiment data (local testing)
|
||||||
|
experiments/
|
||||||
|
data/
|
||||||
79
.golangci.yml
Normal file
79
.golangci.yml
Normal file
|
|
@ -0,0 +1,79 @@
|
||||||
|
---
|
||||||
|
version: "2"
|
||||||
|
run:
|
||||||
|
timeout: 5m
|
||||||
|
tests: true
|
||||||
|
output:
|
||||||
|
format: colored-line-number
|
||||||
|
linters-settings:
|
||||||
|
govet:
|
||||||
|
enable:
|
||||||
|
- shadow
|
||||||
|
- fieldalignment
|
||||||
|
gocyclo:
|
||||||
|
min-complexity: 15
|
||||||
|
dupl:
|
||||||
|
threshold: 100
|
||||||
|
goconst:
|
||||||
|
min-len: 3
|
||||||
|
min-occurrences: 3
|
||||||
|
misspell:
|
||||||
|
locale: US
|
||||||
|
lll:
|
||||||
|
line-length: 100
|
||||||
|
revive:
|
||||||
|
confidence: 0.8
|
||||||
|
depguard:
|
||||||
|
rules:
|
||||||
|
main:
|
||||||
|
allow:
|
||||||
|
- $gostd
|
||||||
|
- github.com/jfraeys/fetch_ml
|
||||||
|
linters:
|
||||||
|
disable-all: true
|
||||||
|
enable:
|
||||||
|
- bodyclose
|
||||||
|
- depguard
|
||||||
|
- dogsled
|
||||||
|
- dupl
|
||||||
|
- errcheck
|
||||||
|
- exhaustive
|
||||||
|
- gochecknoinits
|
||||||
|
- goconst
|
||||||
|
- gocritic
|
||||||
|
- gocyclo
|
||||||
|
- goprintffuncname
|
||||||
|
- gosec
|
||||||
|
- govet
|
||||||
|
- ineffassign
|
||||||
|
- lll
|
||||||
|
- misspell
|
||||||
|
- nakedret
|
||||||
|
- noctx
|
||||||
|
- nolintlint
|
||||||
|
- rowserrcheck
|
||||||
|
- staticcheck
|
||||||
|
- unconvert
|
||||||
|
- unparam
|
||||||
|
- unused
|
||||||
|
- whitespace
|
||||||
|
- revive
|
||||||
|
issues:
|
||||||
|
exclude-rules:
|
||||||
|
- path: _test\.go
|
||||||
|
linters:
|
||||||
|
- gocyclo
|
||||||
|
- errcheck
|
||||||
|
- dupl
|
||||||
|
- gosec
|
||||||
|
- lll
|
||||||
|
- text: "weak cryptographic primitive"
|
||||||
|
linters:
|
||||||
|
- gosec
|
||||||
|
- text: "Use of weak random number generator"
|
||||||
|
linters:
|
||||||
|
- gosec
|
||||||
|
max-issues-per-linter: 0
|
||||||
|
max-same-issues: 0
|
||||||
|
severity:
|
||||||
|
default-severity: error
|
||||||
307
.pylintrc
Normal file
307
.pylintrc
Normal file
|
|
@ -0,0 +1,307 @@
|
||||||
|
[MASTER]
|
||||||
|
# Google Python Style Guide Configuration
|
||||||
|
# Based on https://google.github.io/styleguide/pyguide.html
|
||||||
|
|
||||||
|
# Files or directories to be skipped over when performing analysis.
|
||||||
|
ignore=
|
||||||
|
.git,
|
||||||
|
__pycache__,
|
||||||
|
*.pyc,
|
||||||
|
.pytest_cache,
|
||||||
|
.mypy_cache,
|
||||||
|
.venv,
|
||||||
|
venv,
|
||||||
|
# ML experiment code - exclude from style checks
|
||||||
|
podman/workspace,
|
||||||
|
workspace,
|
||||||
|
tests/fixtures/examples,
|
||||||
|
tests/fixtures/podman,
|
||||||
|
results,
|
||||||
|
data,
|
||||||
|
logs,
|
||||||
|
secrets,
|
||||||
|
.agent
|
||||||
|
|
||||||
|
# Regular expression matching files that should be skipped entirely.
|
||||||
|
ignore-patterns=
|
||||||
|
^\.#,
|
||||||
|
^setup\.py$,
|
||||||
|
^conftest\.py$
|
||||||
|
|
||||||
|
# Add files or directories matching the regex patterns to the ignore list.
|
||||||
|
ignore-paths=
|
||||||
|
|
||||||
|
# Files or directories to be added to the list of ignored regular expressions.
|
||||||
|
ignore-paths=
|
||||||
|
|
||||||
|
# Pickle collected data for later comparisons.
|
||||||
|
persistent=yes
|
||||||
|
|
||||||
|
# Use multiple processes to speed up Pylint.
|
||||||
|
jobs=1
|
||||||
|
|
||||||
|
# List of plugins (as comma separated values of python module names) to load,
|
||||||
|
# usually to register additional checkers.
|
||||||
|
load-plugins=
|
||||||
|
|
||||||
|
# Load all enabled extensions.
|
||||||
|
load-all-plugins=no
|
||||||
|
|
||||||
|
# Control the amount of potential astroid warnings (0, 1 or 2).
|
||||||
|
unsafe-load-any-extension=no
|
||||||
|
|
||||||
|
# A comma-separated list of package or module names from where C extensions may
|
||||||
|
# be loaded. Extensions are loading into the active Python interpreter and may
|
||||||
|
# run arbitrary code.
|
||||||
|
extension-pkg-whitelist=
|
||||||
|
|
||||||
|
[MESSAGES CONTROL]
|
||||||
|
# Only show warnings with the listed confidence levels.
|
||||||
|
confidence=
|
||||||
|
|
||||||
|
# Disable the message, report, category or checker with the given id(s).
|
||||||
|
disable=
|
||||||
|
# Google Style Guide allows some of these
|
||||||
|
missing-module-docstring,
|
||||||
|
missing-function-docstring,
|
||||||
|
too-many-locals,
|
||||||
|
too-many-arguments,
|
||||||
|
too-many-instance-attributes,
|
||||||
|
too-many-public-methods,
|
||||||
|
too-few-public-methods,
|
||||||
|
too-many-lines,
|
||||||
|
too-many-statements,
|
||||||
|
too-many-branches,
|
||||||
|
too-many-nested-blocks,
|
||||||
|
# Not relevant for ML projects
|
||||||
|
invalid-name,
|
||||||
|
C0114, # missing-module-docstring
|
||||||
|
C0115, # missing-class-docstring
|
||||||
|
C0116, # missing-function-docstring
|
||||||
|
R0903, # too-few-public-methods
|
||||||
|
R0902, # too-many-instance-attributes
|
||||||
|
R0913, # too-many-arguments
|
||||||
|
R0914, # too-many-locals
|
||||||
|
R0915, # too-many-statements
|
||||||
|
R0912, # too-many-branches
|
||||||
|
R0911, # too-many-return-statements
|
||||||
|
W0613, # unused-argument (common in callbacks)
|
||||||
|
|
||||||
|
# Enable the message, report, category or checker with the given id(s).
|
||||||
|
enable=
|
||||||
|
|
||||||
|
[REPORTS]
|
||||||
|
# Set the output format.
|
||||||
|
output-format=text
|
||||||
|
|
||||||
|
# Tells whether to display a full report or only the messages.
|
||||||
|
reports=no
|
||||||
|
|
||||||
|
# Python expression which determines if a message should not be displayed.
|
||||||
|
evaluation=
|
||||||
|
|
||||||
|
# Template used to display messages.
|
||||||
|
msg-template=
|
||||||
|
|
||||||
|
[BASIC]
|
||||||
|
# Good variable names which should always be accepted, separated by a comma.
|
||||||
|
good-names=
|
||||||
|
i,j,k,ex,Run,_
|
||||||
|
|
||||||
|
# Bad variable names which should always be refused.
|
||||||
|
bad-names=
|
||||||
|
foo,bar,baz,toto,tutu,tata
|
||||||
|
|
||||||
|
# List of builtins function names that should not be used.
|
||||||
|
bad-functions=
|
||||||
|
|
||||||
|
# Regular expression for correct variable names.
|
||||||
|
variable-rgx=^[a-z_][a-z0-9_]{2,30}$
|
||||||
|
|
||||||
|
# Regular expression for correct constant names.
|
||||||
|
const-rgx=^(_?[A-Z][A-Z0-9_]{2,30}|__.*__)$
|
||||||
|
|
||||||
|
# Regular expression for correct function names.
|
||||||
|
function-rgx=^(?:(?P<camel_case>_?[A-Z][a-zA-Z0-9]{2,30})|(?P<snake_case>_?[a-z][a-z0-9_]{2,30}))$
|
||||||
|
|
||||||
|
# Regular expression for correct class names.
|
||||||
|
class-rgx=^_?[A-Z][a-zA-Z0-9]{2,30}$
|
||||||
|
|
||||||
|
# Regular expression for correct attribute names.
|
||||||
|
attr-rgx=^_{0,2}[a-z][a-z0-9_]{2,30}$
|
||||||
|
|
||||||
|
# Regular expression for correct argument names.
|
||||||
|
argument-rgx=^[a-z][a-z0-9_]{2,30}$
|
||||||
|
|
||||||
|
# Regular expression for correct method resolution order names.
|
||||||
|
method-rgx=^_{0,2}[a-z][a-z0-9_]{2,30}$
|
||||||
|
|
||||||
|
# Regular expression which should only match function or class names that do
|
||||||
|
# not require a docstring.
|
||||||
|
no-docstring-rgx=^_
|
||||||
|
|
||||||
|
# Minimum line length for functions/classes that require docstrings.
|
||||||
|
docstring-min-length=-1
|
||||||
|
|
||||||
|
[TYPECHECK]
|
||||||
|
# List of decorators that produce context managers.
|
||||||
|
contextmanager-decorators=contextlib.contextmanager
|
||||||
|
|
||||||
|
# List of member names which should be excluded from the access member check.
|
||||||
|
exclude-members=
|
||||||
|
|
||||||
|
# List of qualified names (objects) which require a disable protection.
|
||||||
|
generated-members=
|
||||||
|
|
||||||
|
[MISCELLANEOUS]
|
||||||
|
# List of note tags to take in consideration.
|
||||||
|
notes=
|
||||||
|
|
||||||
|
[VARIABLES]
|
||||||
|
# Tells whether we should check for unused imports.
|
||||||
|
init-import=no
|
||||||
|
|
||||||
|
# A regular expression matching the name of dummy variables.
|
||||||
|
dummy-variable-rgx=^_|dummy
|
||||||
|
|
||||||
|
# List of variable names that should not be used.
|
||||||
|
additional-builtins=
|
||||||
|
|
||||||
|
# List of variables which are ignored for the undefined-variable check.
|
||||||
|
ignored-classes=
|
||||||
|
|
||||||
|
# List of members which are skipped from the member access check.
|
||||||
|
ignored-modules=
|
||||||
|
|
||||||
|
# List of deprecated symbols which should not be used.
|
||||||
|
deprecated-modules=
|
||||||
|
|
||||||
|
# List of symbols that can be safely accessed.
|
||||||
|
allowed-redefined-builtins=
|
||||||
|
|
||||||
|
[FORMAT]
|
||||||
|
# Maximum number of characters on a single line.
|
||||||
|
max-line-length=80
|
||||||
|
|
||||||
|
# Regexp for a line that is allowed to be longer than the limit.
|
||||||
|
long-line-regexp=^[\t ]*(# )?<?https?://\S+>?$
|
||||||
|
|
||||||
|
# Allow the body of an if to be on the same line as the test.
|
||||||
|
single-line-if-stmt=no
|
||||||
|
|
||||||
|
# List of optional parameters for which we don't want to call a linting
|
||||||
|
# function.
|
||||||
|
single-line-class-stmt=no
|
||||||
|
|
||||||
|
# Maximum number of characters on a single line, when there are no multiline
|
||||||
|
# strings.
|
||||||
|
max-line-length-sigil-fallback=80
|
||||||
|
|
||||||
|
[SIMILARITIES]
|
||||||
|
# Minimum lines number of a similarity.
|
||||||
|
min-similarity-lines=4
|
||||||
|
|
||||||
|
# Ignore comments when computing similarities.
|
||||||
|
ignore-comments=yes
|
||||||
|
|
||||||
|
# Ignore docstrings when computing similarities.
|
||||||
|
ignore-docstrings=yes
|
||||||
|
|
||||||
|
# Ignore imports when computing similarities.
|
||||||
|
ignore-imports=no
|
||||||
|
|
||||||
|
[LOGGING]
|
||||||
|
# Logging modules to check that the string formatting arguments are in
|
||||||
|
# logging function parameter format.
|
||||||
|
logging-modules=logging
|
||||||
|
|
||||||
|
[DESIGN]
|
||||||
|
# Maximum number of arguments for function / method.
|
||||||
|
max-args=5
|
||||||
|
|
||||||
|
# Argument names that match this regular expression are ignored.
|
||||||
|
ignored-argument-names=
|
||||||
|
|
||||||
|
# Maximum number of locals for function / method body.
|
||||||
|
max-locals=15
|
||||||
|
|
||||||
|
# Maximum number of return statements for function / method body.
|
||||||
|
max-returns=6
|
||||||
|
|
||||||
|
# Maximum number of branch for function / method body.
|
||||||
|
max-branches=12
|
||||||
|
|
||||||
|
# Maximum number of statements in function / method body.
|
||||||
|
max-statements=50
|
||||||
|
|
||||||
|
# Maximum number of parents for a class.
|
||||||
|
max-parents=7
|
||||||
|
|
||||||
|
# Maximum number of attributes for a class.
|
||||||
|
max-attributes=7
|
||||||
|
|
||||||
|
# Minimum number of public methods for a class.
|
||||||
|
min-public-methods=2
|
||||||
|
|
||||||
|
# Maximum number of public methods for a class.
|
||||||
|
max-public-methods=20
|
||||||
|
|
||||||
|
# Maximum number of boolean expressions in a if statement.
|
||||||
|
max-bool-expr=5
|
||||||
|
|
||||||
|
[CLASSES]
|
||||||
|
# List of method names used to declare (i.e. assign) instance attributes.
|
||||||
|
defining-attr-methods=__init__,__new__,setUp
|
||||||
|
|
||||||
|
# List of valid names for the first argument in a class method.
|
||||||
|
valid-classmethod-first-arg=cls
|
||||||
|
|
||||||
|
# List of valid names for the first argument in a metaclass class method.
|
||||||
|
valid-metaclass-classmethod-first-arg=mcls
|
||||||
|
|
||||||
|
# List of member names which should be excluded from the access member check.
|
||||||
|
exclude-protected=_asdict,_fields,_replace,_source,_make
|
||||||
|
|
||||||
|
[IMPORTS]
|
||||||
|
# Deprecated modules which should not be used.
|
||||||
|
deprecated-modules=
|
||||||
|
|
||||||
|
# Create a graph of every module's dependencies.
|
||||||
|
import-graph=
|
||||||
|
|
||||||
|
# Create a graph of every (i.e. internal and external) dependencies in the
|
||||||
|
# current file.
|
||||||
|
ext-import-graph=
|
||||||
|
|
||||||
|
# Create a graph of external dependencies in the current file.
|
||||||
|
int-import-graph=
|
||||||
|
|
||||||
|
# Force import order to match a specific order.
|
||||||
|
import-order-style=google
|
||||||
|
|
||||||
|
# Add files or directories to the blacklist.
|
||||||
|
ignore-on-import-order=no
|
||||||
|
|
||||||
|
# List of modules that can be imported at any level from the specified
|
||||||
|
# application modules.
|
||||||
|
known-third-party=
|
||||||
|
|
||||||
|
# Analyse import fallback blocks.
|
||||||
|
analyse-fallback-blocks=no
|
||||||
|
|
||||||
|
[EXCEPTIONS]
|
||||||
|
# Exceptions that will emit a warning when being caught.
|
||||||
|
overgeneral-exceptions=Exception,BaseException
|
||||||
|
|
||||||
|
# Exceptions that will emit a warning when being returned.
|
||||||
|
return-exceptions=no
|
||||||
|
|
||||||
|
# Exceptions that will emit a warning when being instantiated.
|
||||||
|
nonstandard-exceptions=no
|
||||||
|
|
||||||
|
[REFACTORING]
|
||||||
|
# Maximum number of nested blocks.
|
||||||
|
max-nested-blocks=5
|
||||||
|
|
||||||
|
# Complete name of the function that returns the YAPF version.
|
||||||
|
yapf-version=
|
||||||
21
LICENSE
Normal file
21
LICENSE
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2024 Fetch ML
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
198
Makefile
Normal file
198
Makefile
Normal file
|
|
@ -0,0 +1,198 @@
|
||||||
|
.PHONY: all build clean clean-docs test test-unit test-integration test-e2e test-coverage lint install dev prod setup validate configlint ci-local docs
|
||||||
|
|
||||||
|
# Default target
|
||||||
|
all: build
|
||||||
|
|
||||||
|
# Build all components
|
||||||
|
build:
|
||||||
|
go build -o bin/api-server cmd/api-server/main.go
|
||||||
|
go build -o bin/worker cmd/worker/worker_server.go cmd/worker/worker_config.go
|
||||||
|
go build -o bin/tui ./cmd/tui
|
||||||
|
cd cli && zig build prod
|
||||||
|
@echo "✓ All components built"
|
||||||
|
|
||||||
|
# Build production-optimized binaries
|
||||||
|
prod:
|
||||||
|
go build -ldflags="-s -w" -o bin/api-server cmd/api-server/main.go
|
||||||
|
go build -ldflags="-s -w" -o bin/worker cmd/worker/worker_server.go
|
||||||
|
go build -ldflags="-s -w" -o bin/tui ./cmd/tui
|
||||||
|
cd cli && zig build prod && strip zig-out/prod/ml
|
||||||
|
@echo "✓ Production binaries built"
|
||||||
|
|
||||||
|
# Development build (faster compilation)
|
||||||
|
dev:
|
||||||
|
go build -o bin/api-server cmd/api-server/main.go
|
||||||
|
go build -o bin/worker cmd/worker/worker_server.go cmd/worker/worker_config.go
|
||||||
|
go build -o bin/tui ./cmd/tui
|
||||||
|
cd cli && zig build dev
|
||||||
|
@echo "✓ Development binaries built"
|
||||||
|
|
||||||
|
# Clean build artifacts
|
||||||
|
clean:
|
||||||
|
rm -rf bin/ coverage/
|
||||||
|
rm -rf cli/zig-out/
|
||||||
|
rm -rf cli/.zig-cache/
|
||||||
|
go clean
|
||||||
|
@echo "✓ Cleaned"
|
||||||
|
|
||||||
|
clean-docs:
|
||||||
|
rm -rf docs/_site/
|
||||||
|
@echo "✓ Cleaned docs"
|
||||||
|
|
||||||
|
# Run tests
|
||||||
|
test:
|
||||||
|
go test ./...
|
||||||
|
cd cli && zig build test
|
||||||
|
@echo "✓ All tests passed"
|
||||||
|
|
||||||
|
# Lint Go and Zig code
|
||||||
|
lint:
|
||||||
|
gofmt -w ./cmd ./internal ./tests || true
|
||||||
|
go vet ./...
|
||||||
|
cd cli && zig fmt .
|
||||||
|
@echo "✓ Lint completed"
|
||||||
|
|
||||||
|
# Install to system (requires sudo)
|
||||||
|
install: prod
|
||||||
|
sudo cp bin/api-server /usr/local/bin/fetchml-api
|
||||||
|
sudo cp bin/worker /usr/local/bin/fetchml-worker
|
||||||
|
sudo cp bin/tui /usr/local/bin/fetchml-tui
|
||||||
|
sudo cp cli/zig-out/prod/ml /usr/local/bin/ml
|
||||||
|
@echo "✓ Installed"
|
||||||
|
|
||||||
|
# Setup production environment
|
||||||
|
setup:
|
||||||
|
@if [ "$(shell uname)" = "Linux" ]; then \
|
||||||
|
sudo ./scripts/setup-prod.sh; \
|
||||||
|
else \
|
||||||
|
echo "Production setup is for Linux only. You're on $(shell uname)."; \
|
||||||
|
echo "Use docker-compose for local development."; \
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Validate production configuration
|
||||||
|
validate:
|
||||||
|
./scripts/validate-prod-config.sh configs/config-prod.yaml configs/worker-prod.toml
|
||||||
|
|
||||||
|
# Validate YAML configs against JSON schema
|
||||||
|
configlint:
|
||||||
|
go run ./cmd/configlint --schema configs/schema/config_schema.yaml \
|
||||||
|
configs/config-prod.yaml \
|
||||||
|
configs/config-no-tls.yaml \
|
||||||
|
configs/config-dev.yaml
|
||||||
|
|
||||||
|
# Run a local approximation of the CI pipeline
|
||||||
|
ci-local:
|
||||||
|
make test
|
||||||
|
make lint
|
||||||
|
make configlint
|
||||||
|
@echo "Running queue package tests with race detector..."
|
||||||
|
go test -v -race -coverprofile=coverage/queue-coverage.out ./internal/queue/...
|
||||||
|
@echo "Running coverage..."
|
||||||
|
make test-coverage
|
||||||
|
|
||||||
|
# Docker targets
|
||||||
|
docker-build:
|
||||||
|
docker build -f build/docker/simple.Dockerfile -t fetchml:latest .
|
||||||
|
@echo "✓ Docker image built"
|
||||||
|
|
||||||
|
docker-run:
|
||||||
|
docker-compose up -d
|
||||||
|
@echo "✓ Services started"
|
||||||
|
|
||||||
|
docker-stop:
|
||||||
|
docker-compose down
|
||||||
|
@echo "✓ Services stopped"
|
||||||
|
|
||||||
|
docker-logs:
|
||||||
|
docker-compose logs -f
|
||||||
|
|
||||||
|
# Monitoring setup (Linux only)
|
||||||
|
setup-monitoring:
|
||||||
|
@if [ "$(shell uname)" = "Linux" ]; then \
|
||||||
|
sudo ./scripts/setup-monitoring-prod.sh; \
|
||||||
|
else \
|
||||||
|
echo "Monitoring setup is for Linux production. Use docker-compose for local development."; \
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Enhanced test targets
|
||||||
|
test-unit:
|
||||||
|
go test -v -short ./...
|
||||||
|
|
||||||
|
test-integration:
|
||||||
|
go test -v ./...
|
||||||
|
|
||||||
|
test-e2e:
|
||||||
|
go test -v ./tests/e2e/...
|
||||||
|
|
||||||
|
test-coverage:
|
||||||
|
go test -coverprofile=coverage/coverage.out ./...
|
||||||
|
go tool cover -html=coverage/coverage.out -o coverage/coverage.html
|
||||||
|
@echo "✓ Coverage report: coverage/coverage.html"
|
||||||
|
|
||||||
|
# Documentation setup
|
||||||
|
docs-setup:
|
||||||
|
@echo "Setting up MkDocs documentation..."
|
||||||
|
@if ! command -v mkdocs >/dev/null 2>&1; then \
|
||||||
|
echo "MkDocs not found. Please install it manually:"; \
|
||||||
|
echo " macOS: brew install mkdocs mkdocs-material"; \
|
||||||
|
echo " Linux: pip install mkdocs mkdocs-material"; \
|
||||||
|
echo "Or visit: https://www.mkdocs.org/user-guide/installation/"; \
|
||||||
|
exit 1; \
|
||||||
|
fi
|
||||||
|
@if ! python3 -c "import pymdownx.superfences" >/dev/null 2>&1; then \
|
||||||
|
echo "pymdown-extensions not found. Please install it manually:"; \
|
||||||
|
echo " pip3 install --user pymdown-extensions"; \
|
||||||
|
echo " Or use a virtual environment: python3 -m venv docs-env && source docs-env/bin/activate && pip install pymdown-extensions"; \
|
||||||
|
exit 1; \
|
||||||
|
fi
|
||||||
|
@echo "Documentation setup complete!"
|
||||||
|
|
||||||
|
# Documentation
|
||||||
|
docs: docs-setup docs-build
|
||||||
|
@echo "Starting MkDocs development server..."
|
||||||
|
cd docs && mkdocs serve
|
||||||
|
|
||||||
|
# Build documentation
|
||||||
|
docs-build:
|
||||||
|
@echo "Building static documentation..."
|
||||||
|
cd docs && mkdocs build
|
||||||
|
|
||||||
|
# Help
|
||||||
|
help:
|
||||||
|
@echo "FetchML Build System"
|
||||||
|
@echo ""
|
||||||
|
@echo "Build Targets:"
|
||||||
|
@echo " make build - Build all components (default)"
|
||||||
|
@echo " make prod - Build production-optimized binaries"
|
||||||
|
@echo " make dev - Build development binaries (faster)"
|
||||||
|
@echo " make clean - Remove build artifacts"
|
||||||
|
@echo ""
|
||||||
|
@echo "Docker Targets:"
|
||||||
|
@echo " make docker-build - Build Docker image"
|
||||||
|
@echo " make docker-run - Start services with docker-compose"
|
||||||
|
@echo " make docker-stop - Stop docker-compose services"
|
||||||
|
@echo " make docker-logs - View docker-compose logs"
|
||||||
|
@echo ""
|
||||||
|
@echo "Test Targets:"
|
||||||
|
@echo " make test - Run all tests"
|
||||||
|
@echo " make test-unit - Run unit tests only"
|
||||||
|
@echo " make test-integration - Run integration tests"
|
||||||
|
@echo " make test-coverage - Generate coverage report"
|
||||||
|
@echo " make lint - Run formatters and linters"
|
||||||
|
@echo " make ci-local - Run local CI dry-run (tests, lint, config validation, coverage)"
|
||||||
|
@echo " make configlint - Validate YAML configs against schema"
|
||||||
|
@echo ""
|
||||||
|
@echo "Setup Targets:"
|
||||||
|
@echo " make install - Install binaries to /usr/local/bin (requires sudo)"
|
||||||
|
@echo " make setup - Run production setup (Linux only)"
|
||||||
|
@echo " make setup-monitoring - Setup monitoring stack (Linux only)"
|
||||||
|
@echo " make validate - Validate production configuration"
|
||||||
|
@echo ""
|
||||||
|
@echo "Documentation:"
|
||||||
|
@echo " make docs-setup - Install MkDocs and dependencies"
|
||||||
|
@echo " make docs - Start MkDocs development server with live reload"
|
||||||
|
@echo " make docs-build - Build static documentation for deployment"
|
||||||
|
@echo ""
|
||||||
|
@echo "Utility:"
|
||||||
|
@echo " make size - Show binary sizes"
|
||||||
|
@echo " make help - Show this help"
|
||||||
200
README.md
Normal file
200
README.md
Normal file
|
|
@ -0,0 +1,200 @@
|
||||||
|
# FetchML - Machine Learning Platform
|
||||||
|
|
||||||
|
A production-ready ML experiment platform with task queuing, monitoring, and a modern CLI/API.
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- **🚀 Production Resilience** - Task leasing, smart retries, dead-letter queues
|
||||||
|
- **📊 Monitoring** - Grafana/Prometheus/Loki with auto-provisioned dashboards
|
||||||
|
- **🔐 Security** - API key auth, TLS, rate limiting, IP whitelisting
|
||||||
|
- **⚡ Performance** - Go API server + Zig CLI for speed
|
||||||
|
- **📦 Easy Deployment** - Docker Compose (dev) or systemd (prod)
|
||||||
|
|
||||||
|
## Quick Start
|
||||||
|
|
||||||
|
### Development (macOS/Linux)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Clone and start
|
||||||
|
git clone <your-repo>
|
||||||
|
cd fetch_ml
|
||||||
|
docker-compose up -d
|
||||||
|
|
||||||
|
# Access Grafana: http://localhost:3000 (admin/admin)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Production (Linux)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Setup application
|
||||||
|
sudo ./scripts/setup-prod.sh
|
||||||
|
|
||||||
|
# Setup monitoring
|
||||||
|
sudo ./scripts/setup-monitoring-prod.sh
|
||||||
|
|
||||||
|
# Build and install
|
||||||
|
make prod
|
||||||
|
make install
|
||||||
|
|
||||||
|
# Start services
|
||||||
|
sudo systemctl start fetchml-api fetchml-worker
|
||||||
|
sudo systemctl start prometheus grafana loki promtail
|
||||||
|
```
|
||||||
|
|
||||||
|
## Architecture
|
||||||
|
|
||||||
|
```
|
||||||
|
┌──────────────┐ WebSocket ┌──────────────┐
|
||||||
|
│ Zig CLI/TUI │◄─────────────►│ API Server │
|
||||||
|
└──────────────┘ │ (Go) │
|
||||||
|
└──────┬───────┘
|
||||||
|
│
|
||||||
|
┌─────────────┼─────────────┐
|
||||||
|
│ │ │
|
||||||
|
┌────▼────┐ ┌───▼────┐ ┌───▼────┐
|
||||||
|
│ Redis │ │ Worker │ │ Loki │
|
||||||
|
│ (Queue) │ │ (Go) │ │ (Logs) │
|
||||||
|
└─────────┘ └────────┘ └────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
### API Server
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Development (stderr logging)
|
||||||
|
go run cmd/api-server/main.go --config configs/config-dev.yaml
|
||||||
|
|
||||||
|
# Production (file logging)
|
||||||
|
go run cmd/api-server/main.go --config configs/config-no-tls.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
### CLI
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Build
|
||||||
|
cd cli && zig build prod
|
||||||
|
|
||||||
|
# Run experiment
|
||||||
|
./cli/zig-out/bin/ml run --config config.toml
|
||||||
|
|
||||||
|
# Check status
|
||||||
|
./cli/zig-out/bin/ml status
|
||||||
|
```
|
||||||
|
|
||||||
|
### Docker
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make docker-run # Start all services
|
||||||
|
make docker-logs # View logs
|
||||||
|
make docker-stop # Stop services
|
||||||
|
```
|
||||||
|
|
||||||
|
## Development
|
||||||
|
|
||||||
|
### Prerequisites
|
||||||
|
|
||||||
|
- Go 1.21+
|
||||||
|
- Zig 0.11+
|
||||||
|
- Redis
|
||||||
|
- Docker (for local dev)
|
||||||
|
|
||||||
|
### Build
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make build # All components
|
||||||
|
make dev # Fast dev build
|
||||||
|
make prod # Optimized production build
|
||||||
|
```
|
||||||
|
|
||||||
|
### Test
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make test # All tests
|
||||||
|
make test-unit # Unit tests only
|
||||||
|
make test-coverage # With coverage report
|
||||||
|
```
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
### Development (`configs/config-dev.yaml`)
|
||||||
|
```yaml
|
||||||
|
logging:
|
||||||
|
level: "info"
|
||||||
|
file: "" # stderr only
|
||||||
|
|
||||||
|
redis:
|
||||||
|
url: "redis://localhost:6379"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Production (`configs/config-no-tls.yaml`)
|
||||||
|
```yaml
|
||||||
|
logging:
|
||||||
|
level: "info"
|
||||||
|
file: "./logs/fetch_ml.log" # file only
|
||||||
|
|
||||||
|
redis:
|
||||||
|
url: "redis://redis:6379"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Monitoring
|
||||||
|
|
||||||
|
### Grafana Dashboards (Auto-Provisioned)
|
||||||
|
|
||||||
|
- **ML Task Queue** - Queue depth, task duration, failure rates
|
||||||
|
- **Application Logs** - Log streams, error tracking, search
|
||||||
|
|
||||||
|
Access: `http://localhost:3000` (dev) or `http://YOUR_SERVER:3000` (prod)
|
||||||
|
|
||||||
|
### Metrics
|
||||||
|
|
||||||
|
- Queue depth and task processing rates
|
||||||
|
- Retry attempts by error category
|
||||||
|
- Dead letter queue size
|
||||||
|
- Lease expirations
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
- **[Getting Started](docs/getting-started.md)** - Detailed setup guide
|
||||||
|
- **[Production Deployment](docs/production-monitoring.md)** - Linux deployment
|
||||||
|
- **[WebSocket API](docs/api/)** - Protocol documentation
|
||||||
|
- **[Architecture](docs/architecture/)** - System design
|
||||||
|
|
||||||
|
## Makefile Targets
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Build
|
||||||
|
make build # Build all components
|
||||||
|
make prod # Production build
|
||||||
|
make clean # Clean artifacts
|
||||||
|
|
||||||
|
# Docker
|
||||||
|
make docker-build # Build image
|
||||||
|
make docker-run # Start services
|
||||||
|
make docker-stop # Stop services
|
||||||
|
|
||||||
|
# Test
|
||||||
|
make test # All tests
|
||||||
|
make test-coverage # With coverage
|
||||||
|
|
||||||
|
# Production (Linux only)
|
||||||
|
make setup # Setup app
|
||||||
|
make setup-monitoring # Setup monitoring
|
||||||
|
make install # Install binaries
|
||||||
|
```
|
||||||
|
|
||||||
|
## Security
|
||||||
|
|
||||||
|
- **TLS/HTTPS** - End-to-end encryption
|
||||||
|
- **API Keys** - Hashed with SHA256
|
||||||
|
- **Rate Limiting** - Per-user quotas
|
||||||
|
- **IP Whitelist** - Network restrictions
|
||||||
|
- **Audit Logging** - All API access logged
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
MIT - See [LICENSE](LICENSE)
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
Contributions welcome! This is a personal homelab project but PRs are appreciated.
|
||||||
128
docker-compose.yml
Normal file
128
docker-compose.yml
Normal file
|
|
@ -0,0 +1,128 @@
|
||||||
|
# Homelab Docker Compose with Centralized Monitoring
|
||||||
|
# Includes: API, Redis, Prometheus, Grafana, Loki
|
||||||
|
|
||||||
|
services:
|
||||||
|
redis:
|
||||||
|
image: redis:7-alpine
|
||||||
|
container_name: ml-experiments-redis
|
||||||
|
ports:
|
||||||
|
- "6379:6379"
|
||||||
|
volumes:
|
||||||
|
- redis_data:/data
|
||||||
|
restart: unless-stopped
|
||||||
|
command: redis-server --appendonly yes
|
||||||
|
healthcheck:
|
||||||
|
test: [ "CMD", "redis-cli", "ping" ]
|
||||||
|
interval: 30s
|
||||||
|
timeout: 10s
|
||||||
|
retries: 3
|
||||||
|
|
||||||
|
api-server:
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: build/docker/simple.Dockerfile
|
||||||
|
container_name: ml-experiments-api
|
||||||
|
ports:
|
||||||
|
- "9101:9101"
|
||||||
|
- "9100:9100" # Prometheus metrics endpoint
|
||||||
|
volumes:
|
||||||
|
- ./data:/data/experiments
|
||||||
|
- ./logs:/logs
|
||||||
|
- ./configs/config-no-tls.yaml:/app/configs/config.yaml
|
||||||
|
depends_on:
|
||||||
|
redis:
|
||||||
|
condition: service_healthy
|
||||||
|
restart: unless-stopped
|
||||||
|
environment:
|
||||||
|
- REDIS_URL=redis://redis:6379
|
||||||
|
- LOG_LEVEL=info
|
||||||
|
healthcheck:
|
||||||
|
test: [ "CMD", "curl", "http://localhost:9101/health" ]
|
||||||
|
interval: 30s
|
||||||
|
timeout: 10s
|
||||||
|
retries: 3
|
||||||
|
start_period: 40s
|
||||||
|
labels:
|
||||||
|
logging: "promtail"
|
||||||
|
job: "api-server"
|
||||||
|
|
||||||
|
# Prometheus - Metrics collection
|
||||||
|
prometheus:
|
||||||
|
image: prom/prometheus:latest
|
||||||
|
container_name: ml-experiments-prometheus
|
||||||
|
ports:
|
||||||
|
- "9090:9090"
|
||||||
|
volumes:
|
||||||
|
- ./monitoring/prometheus.yml:/etc/prometheus/prometheus.yml
|
||||||
|
- prometheus_data:/prometheus
|
||||||
|
command:
|
||||||
|
- '--config.file=/etc/prometheus/prometheus.yml'
|
||||||
|
- '--storage.tsdb.path=/prometheus'
|
||||||
|
- '--web.console.libraries=/etc/prometheus/console_libraries'
|
||||||
|
- '--web.console.templates=/etc/prometheus/consoles'
|
||||||
|
- '--web.enable-lifecycle'
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
# Grafana - Visualization
|
||||||
|
grafana:
|
||||||
|
image: grafana/grafana:latest
|
||||||
|
container_name: ml-experiments-grafana
|
||||||
|
ports:
|
||||||
|
- "3000:3000"
|
||||||
|
volumes:
|
||||||
|
- grafana_data:/var/lib/grafana
|
||||||
|
- ./monitoring/grafana/provisioning:/etc/grafana/provisioning
|
||||||
|
- ./monitoring/grafana-dashboard.json:/var/lib/grafana/dashboards/ml-queue.json
|
||||||
|
- ./monitoring/logs-dashboard.json:/var/lib/grafana/dashboards/logs.json
|
||||||
|
environment:
|
||||||
|
- GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_ADMIN_PASSWORD:-admin}
|
||||||
|
- GF_USERS_ALLOW_SIGN_UP=false
|
||||||
|
- GF_SERVER_ROOT_URL=http://localhost:3000
|
||||||
|
- GF_AUTH_ANONYMOUS_ENABLED=false
|
||||||
|
restart: unless-stopped
|
||||||
|
depends_on:
|
||||||
|
- prometheus
|
||||||
|
- loki
|
||||||
|
|
||||||
|
# Loki - Log aggregation
|
||||||
|
loki:
|
||||||
|
image: grafana/loki:latest
|
||||||
|
container_name: ml-experiments-loki
|
||||||
|
ports:
|
||||||
|
- "3100:3100"
|
||||||
|
volumes:
|
||||||
|
- ./monitoring/loki-config.yml:/etc/loki/local-config.yaml
|
||||||
|
- loki_data:/loki
|
||||||
|
command: -config.file=/etc/loki/local-config.yaml
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
# Promtail - Log collector
|
||||||
|
promtail:
|
||||||
|
image: grafana/promtail:latest
|
||||||
|
container_name: ml-experiments-promtail
|
||||||
|
volumes:
|
||||||
|
- ./monitoring/promtail-config.yml:/etc/promtail/config.yml
|
||||||
|
- ./logs:/var/log/app
|
||||||
|
- /var/lib/docker/containers:/var/lib/docker/containers:ro
|
||||||
|
- /var/run/docker.sock:/var/run/docker.sock
|
||||||
|
command: -config.file=/etc/promtail/config.yml
|
||||||
|
restart: unless-stopped
|
||||||
|
depends_on:
|
||||||
|
- loki
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
redis_data:
|
||||||
|
driver: local
|
||||||
|
prometheus_data:
|
||||||
|
driver: local
|
||||||
|
grafana_data:
|
||||||
|
driver: local
|
||||||
|
loki_data:
|
||||||
|
driver: local
|
||||||
|
|
||||||
|
networks:
|
||||||
|
default:
|
||||||
|
name: ml-experiments-network
|
||||||
|
backend:
|
||||||
|
name: ml-backend-network
|
||||||
|
internal: true # No external access
|
||||||
73
go.mod
Normal file
73
go.mod
Normal file
|
|
@ -0,0 +1,73 @@
|
||||||
|
module github.com/jfraeys/fetch_ml
|
||||||
|
|
||||||
|
go 1.25.0
|
||||||
|
|
||||||
|
// Fetch ML - Secure Machine Learning Platform
|
||||||
|
// Copyright (c) 2024 Fetch ML
|
||||||
|
// Licensed under the MIT License
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/BurntSushi/toml v1.5.0
|
||||||
|
github.com/alicebob/miniredis/v2 v2.35.0
|
||||||
|
github.com/charmbracelet/bubbles v0.21.0
|
||||||
|
github.com/charmbracelet/bubbletea v1.3.10
|
||||||
|
github.com/charmbracelet/lipgloss v1.1.0
|
||||||
|
github.com/go-redis/redis/v8 v8.11.5
|
||||||
|
github.com/google/uuid v1.6.0
|
||||||
|
github.com/gorilla/websocket v1.5.3
|
||||||
|
github.com/lib/pq v1.10.9
|
||||||
|
github.com/mattn/go-sqlite3 v1.14.32
|
||||||
|
github.com/prometheus/client_golang v1.23.2
|
||||||
|
github.com/redis/go-redis/v9 v9.17.2
|
||||||
|
github.com/stretchr/testify v1.11.1
|
||||||
|
github.com/xeipuuv/gojsonschema v1.2.0
|
||||||
|
github.com/zalando/go-keyring v0.2.6
|
||||||
|
golang.org/x/crypto v0.45.0
|
||||||
|
golang.org/x/time v0.14.0
|
||||||
|
gopkg.in/yaml.v3 v3.0.1
|
||||||
|
)
|
||||||
|
|
||||||
|
require (
|
||||||
|
al.essio.dev/pkg/shellescape v1.6.0 // indirect
|
||||||
|
github.com/atotto/clipboard v0.1.4 // indirect
|
||||||
|
github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
|
||||||
|
github.com/beorn7/perks v1.0.1 // indirect
|
||||||
|
github.com/cespare/xxhash/v2 v2.3.0 // indirect
|
||||||
|
github.com/charmbracelet/colorprofile v0.3.3 // indirect
|
||||||
|
github.com/charmbracelet/x/ansi v0.11.2 // indirect
|
||||||
|
github.com/charmbracelet/x/cellbuf v0.0.14 // indirect
|
||||||
|
github.com/charmbracelet/x/term v0.2.2 // indirect
|
||||||
|
github.com/clipperhouse/displaywidth v0.6.1 // indirect
|
||||||
|
github.com/clipperhouse/stringish v0.1.1 // indirect
|
||||||
|
github.com/clipperhouse/uax29/v2 v2.3.0 // indirect
|
||||||
|
github.com/danieljoos/wincred v1.2.3 // indirect
|
||||||
|
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||||
|
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
|
||||||
|
github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect
|
||||||
|
github.com/fsnotify/fsnotify v1.9.0 // indirect
|
||||||
|
github.com/godbus/dbus/v5 v5.2.0 // indirect
|
||||||
|
github.com/kr/text v0.2.0 // indirect
|
||||||
|
github.com/lucasb-eyer/go-colorful v1.3.0 // indirect
|
||||||
|
github.com/mattn/go-isatty v0.0.20 // indirect
|
||||||
|
github.com/mattn/go-localereader v0.0.1 // indirect
|
||||||
|
github.com/mattn/go-runewidth v0.0.19 // indirect
|
||||||
|
github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 // indirect
|
||||||
|
github.com/muesli/cancelreader v0.2.2 // indirect
|
||||||
|
github.com/muesli/termenv v0.16.0 // indirect
|
||||||
|
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
|
||||||
|
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||||
|
github.com/prometheus/client_model v0.6.2 // indirect
|
||||||
|
github.com/prometheus/common v0.67.4 // indirect
|
||||||
|
github.com/prometheus/procfs v0.19.2 // indirect
|
||||||
|
github.com/rivo/uniseg v0.4.7 // indirect
|
||||||
|
github.com/sahilm/fuzzy v0.1.1 // indirect
|
||||||
|
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect
|
||||||
|
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
|
||||||
|
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect
|
||||||
|
github.com/yuin/gopher-lua v1.1.1 // indirect
|
||||||
|
go.yaml.in/yaml/v2 v2.4.3 // indirect
|
||||||
|
golang.org/x/net v0.47.0 // indirect
|
||||||
|
golang.org/x/sys v0.38.0 // indirect
|
||||||
|
golang.org/x/text v0.31.0 // indirect
|
||||||
|
google.golang.org/protobuf v1.36.10 // indirect
|
||||||
|
)
|
||||||
168
go.sum
Normal file
168
go.sum
Normal file
|
|
@ -0,0 +1,168 @@
|
||||||
|
al.essio.dev/pkg/shellescape v1.6.0 h1:NxFcEqzFSEVCGN2yq7Huv/9hyCEGVa/TncnOOBBeXHA=
|
||||||
|
al.essio.dev/pkg/shellescape v1.6.0/go.mod h1:6sIqp7X2P6mThCQ7twERpZTuigpr6KbZWtls1U8I890=
|
||||||
|
github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg=
|
||||||
|
github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
|
||||||
|
github.com/alicebob/miniredis/v2 v2.35.0 h1:QwLphYqCEAo1eu1TqPRN2jgVMPBweeQcR21jeqDCONI=
|
||||||
|
github.com/alicebob/miniredis/v2 v2.35.0/go.mod h1:TcL7YfarKPGDAthEtl5NBeHZfeUQj6OXMm/+iu5cLMM=
|
||||||
|
github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4=
|
||||||
|
github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI=
|
||||||
|
github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k=
|
||||||
|
github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8=
|
||||||
|
github.com/aymanbagabas/go-udiff v0.2.0 h1:TK0fH4MteXUDspT88n8CKzvK0X9O2xu9yQjWpi6yML8=
|
||||||
|
github.com/aymanbagabas/go-udiff v0.2.0/go.mod h1:RE4Ex0qsGkTAJoQdQQCA0uG+nAzJO/pI/QwceO5fgrA=
|
||||||
|
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
|
||||||
|
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
|
||||||
|
github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=
|
||||||
|
github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=
|
||||||
|
github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=
|
||||||
|
github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=
|
||||||
|
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
|
||||||
|
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||||
|
github.com/charmbracelet/bubbles v0.21.0 h1:9TdC97SdRVg/1aaXNVWfFH3nnLAwOXr8Fn6u6mfQdFs=
|
||||||
|
github.com/charmbracelet/bubbles v0.21.0/go.mod h1:HF+v6QUR4HkEpz62dx7ym2xc71/KBHg+zKwJtMw+qtg=
|
||||||
|
github.com/charmbracelet/bubbletea v1.3.10 h1:otUDHWMMzQSB0Pkc87rm691KZ3SWa4KUlvF9nRvCICw=
|
||||||
|
github.com/charmbracelet/bubbletea v1.3.10/go.mod h1:ORQfo0fk8U+po9VaNvnV95UPWA1BitP1E0N6xJPlHr4=
|
||||||
|
github.com/charmbracelet/colorprofile v0.3.3 h1:DjJzJtLP6/NZ8p7Cgjno0CKGr7wwRJGxWUwh2IyhfAI=
|
||||||
|
github.com/charmbracelet/colorprofile v0.3.3/go.mod h1:nB1FugsAbzq284eJcjfah2nhdSLppN2NqvfotkfRYP4=
|
||||||
|
github.com/charmbracelet/lipgloss v1.1.0 h1:vYXsiLHVkK7fp74RkV7b2kq9+zDLoEU4MZoFqR/noCY=
|
||||||
|
github.com/charmbracelet/lipgloss v1.1.0/go.mod h1:/6Q8FR2o+kj8rz4Dq0zQc3vYf7X+B0binUUBwA0aL30=
|
||||||
|
github.com/charmbracelet/x/ansi v0.11.2 h1:XAG3FSjiVtFvgEgGrNBkCNNYrsucAt8c6bfxHyROLLs=
|
||||||
|
github.com/charmbracelet/x/ansi v0.11.2/go.mod h1:9tY2bzX5SiJCU0iWyskjBeI2BRQfvPqI+J760Mjf+Rg=
|
||||||
|
github.com/charmbracelet/x/cellbuf v0.0.14 h1:iUEMryGyFTelKW3THW4+FfPgi4fkmKnnaLOXuc+/Kj4=
|
||||||
|
github.com/charmbracelet/x/cellbuf v0.0.14/go.mod h1:P447lJl49ywBbil/KjCk2HexGh4tEY9LH0/1QrZZ9rA=
|
||||||
|
github.com/charmbracelet/x/exp/golden v0.0.0-20241011142426-46044092ad91 h1:payRxjMjKgx2PaCWLZ4p3ro9y97+TVLZNaRZgJwSVDQ=
|
||||||
|
github.com/charmbracelet/x/exp/golden v0.0.0-20241011142426-46044092ad91/go.mod h1:wDlXFlCrmJ8J+swcL/MnGUuYnqgQdW9rhSD61oNMb6U=
|
||||||
|
github.com/charmbracelet/x/term v0.2.2 h1:xVRT/S2ZcKdhhOuSP4t5cLi5o+JxklsoEObBSgfgZRk=
|
||||||
|
github.com/charmbracelet/x/term v0.2.2/go.mod h1:kF8CY5RddLWrsgVwpw4kAa6TESp6EB5y3uxGLeCqzAI=
|
||||||
|
github.com/clipperhouse/displaywidth v0.6.1 h1:/zMlAezfDzT2xy6acHBzwIfyu2ic0hgkT83UX5EY2gY=
|
||||||
|
github.com/clipperhouse/displaywidth v0.6.1/go.mod h1:R+kHuzaYWFkTm7xoMmK1lFydbci4X2CicfbGstSGg0o=
|
||||||
|
github.com/clipperhouse/stringish v0.1.1 h1:+NSqMOr3GR6k1FdRhhnXrLfztGzuG+VuFDfatpWHKCs=
|
||||||
|
github.com/clipperhouse/stringish v0.1.1/go.mod h1:v/WhFtE1q0ovMta2+m+UbpZ+2/HEXNWYXQgCt4hdOzA=
|
||||||
|
github.com/clipperhouse/uax29/v2 v2.3.0 h1:SNdx9DVUqMoBuBoW3iLOj4FQv3dN5mDtuqwuhIGpJy4=
|
||||||
|
github.com/clipperhouse/uax29/v2 v2.3.0/go.mod h1:Wn1g7MK6OoeDT0vL+Q0SQLDz/KpfsVRgg6W7ihQeh4g=
|
||||||
|
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
||||||
|
github.com/danieljoos/wincred v1.2.3 h1:v7dZC2x32Ut3nEfRH+vhoZGvN72+dQ/snVXo/vMFLdQ=
|
||||||
|
github.com/danieljoos/wincred v1.2.3/go.mod h1:6qqX0WNrS4RzPZ1tnroDzq9kY3fu1KwE7MRLQK4X0bs=
|
||||||
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
|
||||||
|
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
|
||||||
|
github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f h1:Y/CXytFA4m6baUTXGLOoWe4PQhGxaX0KpnayAqC48p4=
|
||||||
|
github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f/go.mod h1:vw97MGsxSvLiUE2X8qFplwetxpGLQrlU1Q9AUEIzCaM=
|
||||||
|
github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k=
|
||||||
|
github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
|
||||||
|
github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI=
|
||||||
|
github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo=
|
||||||
|
github.com/godbus/dbus/v5 v5.2.0 h1:3WexO+U+yg9T70v9FdHr9kCxYlazaAXUhx2VMkbfax8=
|
||||||
|
github.com/godbus/dbus/v5 v5.2.0/go.mod h1:3AAv2+hPq5rdnr5txxxRwiGjPXamgoIHgz9FPBfOp3c=
|
||||||
|
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
|
||||||
|
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
|
||||||
|
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4=
|
||||||
|
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=
|
||||||
|
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
|
||||||
|
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
|
github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg=
|
||||||
|
github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
||||||
|
github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo=
|
||||||
|
github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=
|
||||||
|
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
|
||||||
|
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
|
||||||
|
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
||||||
|
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
||||||
|
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
|
||||||
|
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
|
||||||
|
github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
|
||||||
|
github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
|
||||||
|
github.com/lucasb-eyer/go-colorful v1.3.0 h1:2/yBRLdWBZKrf7gB40FoiKfAWYQ0lqNcbuQwVHXptag=
|
||||||
|
github.com/lucasb-eyer/go-colorful v1.3.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
|
||||||
|
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
|
||||||
|
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
|
||||||
|
github.com/mattn/go-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2JC/oIi4=
|
||||||
|
github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88=
|
||||||
|
github.com/mattn/go-runewidth v0.0.19 h1:v++JhqYnZuu5jSKrk9RbgF5v4CGUjqRfBm05byFGLdw=
|
||||||
|
github.com/mattn/go-runewidth v0.0.19/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs=
|
||||||
|
github.com/mattn/go-sqlite3 v1.14.32 h1:JD12Ag3oLy1zQA+BNn74xRgaBbdhbNIDYvQUEuuErjs=
|
||||||
|
github.com/mattn/go-sqlite3 v1.14.32/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
|
||||||
|
github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 h1:ZK8zHtRHOkbHy6Mmr5D264iyp3TiX5OmNcI5cIARiQI=
|
||||||
|
github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6/go.mod h1:CJlz5H+gyd6CUWT45Oy4q24RdLyn7Md9Vj2/ldJBSIo=
|
||||||
|
github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA=
|
||||||
|
github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo=
|
||||||
|
github.com/muesli/termenv v0.16.0 h1:S5AlUN9dENB57rsbnkPyfdGuWIlkmzJjbFf0Tf5FWUc=
|
||||||
|
github.com/muesli/termenv v0.16.0/go.mod h1:ZRfOIKPFDYQoDFF4Olj7/QJbW60Ol/kL1pU3VfY/Cnk=
|
||||||
|
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
|
||||||
|
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
|
||||||
|
github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
|
||||||
|
github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
|
||||||
|
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
|
||||||
|
github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
|
||||||
|
github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE=
|
||||||
|
github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
|
github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o=
|
||||||
|
github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg=
|
||||||
|
github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk=
|
||||||
|
github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE=
|
||||||
|
github.com/prometheus/common v0.67.4 h1:yR3NqWO1/UyO1w2PhUvXlGQs/PtFmoveVO0KZ4+Lvsc=
|
||||||
|
github.com/prometheus/common v0.67.4/go.mod h1:gP0fq6YjjNCLssJCQp0yk4M8W6ikLURwkdd/YKtTbyI=
|
||||||
|
github.com/prometheus/procfs v0.19.2 h1:zUMhqEW66Ex7OXIiDkll3tl9a1ZdilUOd/F6ZXw4Vws=
|
||||||
|
github.com/prometheus/procfs v0.19.2/go.mod h1:M0aotyiemPhBCM0z5w87kL22CxfcH05ZpYlu+b4J7mw=
|
||||||
|
github.com/redis/go-redis/v9 v9.17.2 h1:P2EGsA4qVIM3Pp+aPocCJ7DguDHhqrXNhVcEp4ViluI=
|
||||||
|
github.com/redis/go-redis/v9 v9.17.2/go.mod h1:u410H11HMLoB+TP67dz8rL9s6QW2j76l0//kSOd3370=
|
||||||
|
github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
|
||||||
|
github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
|
||||||
|
github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
|
||||||
|
github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
|
||||||
|
github.com/sahilm/fuzzy v0.1.1 h1:ceu5RHF8DGgoi+/dR5PsECjCDH1BE3Fnmpo7aVXOdRA=
|
||||||
|
github.com/sahilm/fuzzy v0.1.1/go.mod h1:VFvziUEIMCrT6A6tw2RFIXPXXmzXbOsSHF0DOI8ZK9Y=
|
||||||
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
|
github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=
|
||||||
|
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
|
||||||
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
|
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
|
||||||
|
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
|
||||||
|
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
|
||||||
|
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo=
|
||||||
|
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
|
||||||
|
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0=
|
||||||
|
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ=
|
||||||
|
github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74=
|
||||||
|
github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=
|
||||||
|
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no=
|
||||||
|
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM=
|
||||||
|
github.com/yuin/gopher-lua v1.1.1 h1:kYKnWBjvbNP4XLT3+bPEwAXJx262OhaHDWDVOPjL46M=
|
||||||
|
github.com/yuin/gopher-lua v1.1.1/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw=
|
||||||
|
github.com/zalando/go-keyring v0.2.6 h1:r7Yc3+H+Ux0+M72zacZoItR3UDxeWfKTcabvkI8ua9s=
|
||||||
|
github.com/zalando/go-keyring v0.2.6/go.mod h1:2TCrxYrbUNYfNS/Kgy/LSrkSQzZ5UPVH85RwfczwvcI=
|
||||||
|
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
|
||||||
|
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
|
||||||
|
go.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0=
|
||||||
|
go.yaml.in/yaml/v2 v2.4.3/go.mod h1:zSxWcmIDjOzPXpjlTTbAsKokqkDNAVtZO0WOMiT90s8=
|
||||||
|
golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q=
|
||||||
|
golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4=
|
||||||
|
golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI=
|
||||||
|
golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo=
|
||||||
|
golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY=
|
||||||
|
golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU=
|
||||||
|
golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc=
|
||||||
|
golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
|
||||||
|
golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU=
|
||||||
|
golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254=
|
||||||
|
golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM=
|
||||||
|
golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM=
|
||||||
|
golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI=
|
||||||
|
golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4=
|
||||||
|
google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE=
|
||||||
|
google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
|
||||||
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
||||||
|
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
||||||
|
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
|
||||||
|
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
|
||||||
|
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
||||||
|
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
||||||
|
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||||
|
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
132
pyproject.toml
Normal file
132
pyproject.toml
Normal file
|
|
@ -0,0 +1,132 @@
|
||||||
|
[build-system]
|
||||||
|
requires = ["setuptools>=45", "wheel", "setuptools_scm[toml]>=6.2"]
|
||||||
|
build-backend = "setuptools.build_meta"
|
||||||
|
|
||||||
|
[tool.black]
|
||||||
|
# Google Python Style Guide Configuration for Black
|
||||||
|
line-length = 80
|
||||||
|
target-version = ['py38']
|
||||||
|
include = '\.pyi?$'
|
||||||
|
extend-exclude = '''
|
||||||
|
/(
|
||||||
|
# directories
|
||||||
|
\.eggs
|
||||||
|
| \.git
|
||||||
|
| \.hg
|
||||||
|
| \.mypy_cache
|
||||||
|
| \.tox
|
||||||
|
| \.venv
|
||||||
|
| venv
|
||||||
|
| _build
|
||||||
|
| buck-out
|
||||||
|
| build
|
||||||
|
| dist
|
||||||
|
# ML experiment code - exclude from formatting
|
||||||
|
| podman/workspace
|
||||||
|
| workspace
|
||||||
|
| tests/fixtures/examples
|
||||||
|
| tests/fixtures/podman
|
||||||
|
| results
|
||||||
|
| data
|
||||||
|
| logs
|
||||||
|
| secrets
|
||||||
|
| .agent
|
||||||
|
)/
|
||||||
|
'''
|
||||||
|
|
||||||
|
[tool.isort]
|
||||||
|
# Google Python Style Guide Configuration for isort
|
||||||
|
profile = "google"
|
||||||
|
line_length = 80
|
||||||
|
multi_line_output = 3
|
||||||
|
include_trailing_comma = true
|
||||||
|
force_grid_wrap = 0
|
||||||
|
use_parentheses = true
|
||||||
|
ensure_newline_before_comments = true
|
||||||
|
split_on_trailing_comma = true
|
||||||
|
known_first_party = ["fetch_ml"]
|
||||||
|
skip_glob = [
|
||||||
|
"podman/workspace/*",
|
||||||
|
"workspace/*",
|
||||||
|
"tests/fixtures/examples/*",
|
||||||
|
"tests/fixtures/podman/*",
|
||||||
|
]
|
||||||
|
|
||||||
|
[tool.mypy]
|
||||||
|
# Google Python Style Guide Configuration for mypy
|
||||||
|
python_version = "3.8"
|
||||||
|
warn_return_any = true
|
||||||
|
warn_unused_configs = true
|
||||||
|
disallow_untyped_defs = true
|
||||||
|
disallow_incomplete_defs = true
|
||||||
|
check_untyped_defs = true
|
||||||
|
disallow_untyped_decorators = true
|
||||||
|
no_implicit_optional = true
|
||||||
|
warn_redundant_casts = true
|
||||||
|
warn_unused_ignores = true
|
||||||
|
warn_no_return = true
|
||||||
|
warn_unreachable = true
|
||||||
|
strict_equality = true
|
||||||
|
|
||||||
|
[[tool.mypy.overrides]]
|
||||||
|
module = [
|
||||||
|
"torch.*",
|
||||||
|
"tensorflow.*",
|
||||||
|
"sklearn.*",
|
||||||
|
"pandas.*",
|
||||||
|
"numpy.*",
|
||||||
|
"matplotlib.*",
|
||||||
|
"seaborn.*",
|
||||||
|
"scipy.*",
|
||||||
|
"joblib.*",
|
||||||
|
]
|
||||||
|
ignore_missing_imports = true
|
||||||
|
|
||||||
|
[tool.pytest.ini_options]
|
||||||
|
# Google Python Style Guide Configuration for pytest
|
||||||
|
minversion = "6.0"
|
||||||
|
addopts = "-ra -q --strict-markers --strict-config"
|
||||||
|
testpaths = ["tests"]
|
||||||
|
python_files = ["*_test.py", "test_*.py"]
|
||||||
|
python_classes = ["Test*"]
|
||||||
|
python_functions = ["test_*"]
|
||||||
|
markers = [
|
||||||
|
"slow: marks tests as slow (deselect with '-m \"not slow\"')",
|
||||||
|
"integration: marks tests as integration tests",
|
||||||
|
"unit: marks tests as unit tests",
|
||||||
|
]
|
||||||
|
|
||||||
|
[tool.coverage.run]
|
||||||
|
source = ["."]
|
||||||
|
omit = [
|
||||||
|
"tests/*",
|
||||||
|
"*/tests/*",
|
||||||
|
"test_*",
|
||||||
|
"*_test.py",
|
||||||
|
"setup.py",
|
||||||
|
"*/site-packages/*",
|
||||||
|
# ML experiment code
|
||||||
|
"podman/workspace/*",
|
||||||
|
"workspace/*",
|
||||||
|
"tests/fixtures/examples/*",
|
||||||
|
"tests/fixtures/podman/*",
|
||||||
|
"results/*",
|
||||||
|
"data/*",
|
||||||
|
"logs/*",
|
||||||
|
"secrets/*",
|
||||||
|
".agent/*",
|
||||||
|
]
|
||||||
|
|
||||||
|
[tool.coverage.report]
|
||||||
|
exclude_lines = [
|
||||||
|
"pragma: no cover",
|
||||||
|
"def __repr__",
|
||||||
|
"if self.debug:",
|
||||||
|
"if settings.DEBUG",
|
||||||
|
"raise AssertionError",
|
||||||
|
"raise NotImplementedError",
|
||||||
|
"if 0:",
|
||||||
|
"if __name__ == .__main__.:",
|
||||||
|
"class .*\\bProtocol\\):",
|
||||||
|
"@(abc\\.)?abstractmethod",
|
||||||
|
]
|
||||||
Loading…
Reference in a new issue