bulk rename to flupdt, add CLI, add README, add .gitignore

Signed-off-by: ahuston-0 <aliceghuston@gmail.com>
This commit is contained in:
ahuston-0 2024-07-29 18:29:54 -04:00
parent adb422829c
commit 18acb7250e
14 changed files with 297 additions and 23 deletions

165
.gitignore vendored
View File

@ -25,3 +25,168 @@ post-diff
# ruff cache # ruff cache
.ruff_cache .ruff_cache
# borrowed from https://github.com/github/gitignore/blob/bfa56dc5d8465f558383f6764e1219b4e983b725/Python.gitignore
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# C extensions
*.so
# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# 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
# For a library or package, you might want to ignore these files since the code is
# intended to run in multiple environments; otherwise, check them in:
# .python-version
# pipenv
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
# However, in case of collaboration, if having platform-specific dependencies or dependencies
# having no cross-platform support, pipenv may install dependencies that don't work, or not
# install all needed dependencies.
#Pipfile.lock
# poetry
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
# This is especially recommended for binary packages to ensure reproducibility, and is more
# commonly ignored for libraries.
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
#poetry.lock
# pdm
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
#pdm.lock
# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
# in version control.
# https://pdm.fming.dev/latest/usage/project/#working-with-version-control
.pdm.toml
.pdm-python
.pdm-build/
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
__pypackages__/
# Celery stuff
celerybeat-schedule
celerybeat.pid
# SageMath parsed files
*.sage.py
# Environments
.env
.venv
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
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
# and can be added to the global gitignore or merged into this file. For a more nuclear
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
#.idea/

View File

@ -0,0 +1,27 @@
# Flake Update Diff Tool
This is the Nix flake update validator. A tool which is able to evaluate a flake
at two points in history, check that everything evaluates, and provide a diff
of the two. In its target state, it will provide a similar function to
DeterminateSystems' awesome `update-flake-lock` tool, but with `nvd` integration
and other bells and whistles that we've come to like.
## How to Use
Currently, this only supports locally-stored flakes, although we are planning to
add support for `git`-based URLs for usage outside of CI pipelines where the
repository is already downloaded.
``` shell
nix run github:RAD-Development/flake-update-diff-tool -- <path to local flake>
```
For use in other nix-based projects, `flpudt` is available as
`packages.${system}.flupdt`. Please see our `examples/` folder for common
use-cases.
## Why the name?
`flupdt` comes from Fl(ake) Up(date) D(iff) T(ool). The cli is also available as
`flake-update-diff-tool`, for ease-of-use and those who use screen readers or
similar accessibility tools that may not react well to `flupdt`.

View File

@ -1,10 +0,0 @@
#!/usr/bin/env python3
from app.flake_show import get_derivations
def main():
print(get_derivations("/home/alice/.gitprojects/nix-dotfiles"))
if __name__ == "__main__":
main()

View File

@ -4,6 +4,9 @@
formatter, formatter,
... ...
}: }:
let
pkgs = inputs.nixpkgs.legacyPackages.${system};
in
{ {
pre-commit-check = inputs.pre-commit-hooks.lib.${system}.run { pre-commit-check = inputs.pre-commit-hooks.lib.${system}.run {
src = ./.; src = ./.;
@ -43,6 +46,18 @@
# toml hooks # toml hooks
check-toml.enable = true; check-toml.enable = true;
# markdown hooks
mdl = {
enable = true;
settings.style =
(pkgs.writeText ".mdl_style.rb" ''
#!/usr/bin/env ruby
all
rule 'MD013', :tables => false
'').outPath;
};
# git hooks # git hooks
check-merge-conflicts.enable = true; check-merge-conflicts.enable = true;
## prevents committing to main ## prevents committing to main

View File

@ -70,10 +70,10 @@
in in
rec { rec {
packages = { packages = {
myapp = poetry2nix.mkPoetryApplication poetryConfig // { flupdt = poetry2nix.mkPoetryApplication poetryConfig // {
develop = true; develop = true;
}; };
default = self.packages.${system}.myapp; default = self.packages.${system}.flupdt;
}; };
formatter = pkgs.nixfmt-rfc-style; formatter = pkgs.nixfmt-rfc-style;

11
flupdt/cli.py Normal file
View File

@ -0,0 +1,11 @@
#!/usr/bin/env python3
import argparse
def parse_inputs():
parser = argparse.ArgumentParser()
parser.add_argument(
"flake_path", metavar="flake-path", help="path to flake to evaluate"
)
args = parser.parse_args()
return args

View File

@ -1,7 +1,7 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
import json import json
from app.common import bash_wrapper from flupdt.common import bash_wrapper
import shutil import shutil

13
flupdt/main.py Normal file
View File

@ -0,0 +1,13 @@
#!/usr/bin/env python3
from flupdt.flake_show import get_derivations
from flupdt.cli import parse_inputs
def main():
args = parse_inputs()
print(get_derivations(args.flake_path))
if __name__ == "__main__":
main()

52
flupdt/model.py Normal file
View File

@ -0,0 +1,52 @@
#!/usr/bin/env python3
from sqlalchemy import Column, Integer, String, ForeignKey, Table
from sqlalchemy.orm import relationship, backref
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
author_publisher = Table(
"author_publisher",
Base.metadata,
Column("author_id", Integer, ForeignKey("author.author_id")),
Column("publisher_id", Integer, ForeignKey("publisher.publisher_id")),
)
book_publisher = Table(
"book_publisher",
Base.metadata,
Column("book_id", Integer, ForeignKey("book.book_id")),
Column("publisher_id", Integer, ForeignKey("publisher.publisher_id")),
)
class Author(Base):
__tablename__ = "author"
author_id = Column(Integer, primary_key=True)
first_name = Column(String)
last_name = Column(String)
books = relationship("Book", backref=backref("author"))
publishers = relationship(
"Publisher", secondary=author_publisher, back_populates="authors"
)
class Book(Base):
__tablename__ = "book"
book_id = Column(Integer, primary_key=True)
author_id = Column(Integer, ForeignKey("author.author_id"))
title = Column(String)
publishers = relationship(
"Publisher", secondary=book_publisher, back_populates="books"
)
class Publisher(Base):
__tablename__ = "publisher"
publisher_id = Column(Integer, primary_key=True)
name = Column(String)
authors = relationship(
"Author", secondary=author_publisher, back_populates="publishers"
)
books = relationship("Book", secondary=book_publisher, back_populates="publishers")

View File

@ -1,5 +0,0 @@
#!/usr/bin/env python3
from app.flake_show import get_derivations
print(get_derivations("/home/alice/.gitprojects/nix-dotfiles"))

View File

@ -1,17 +1,23 @@
[tool.poetry] [tool.poetry]
name = "app" name = "flupdt"
version = "0.1.0" version = "0.1.0"
description = "" description = """\
Nix flake update diff checker. \
Useful for validating and diffing flakes after updates. \
Short for fl(ake) up(date) d(iff).\
"""
authors = ["Alice Huston <aliceghuston@gmail.com>"] authors = ["Alice Huston <aliceghuston@gmail.com>"]
license = "MIT" license = "MIT"
readme = "README.md" readme = "README.md"
packages = [{ include = "flupdt" }]
[tool.poetry.dependencies] [tool.poetry.dependencies]
python = "^3.11" python = "^3.11"
sqlalchemy = "^2.0.31" sqlalchemy = "^2.0.31"
[tool.poetry.scripts] [tool.poetry.scripts]
main = "app.main:main" flupdt = "flupdt.main:main"
flake-update-diff = "flupdt.main:main"
[tool.poetry.group.dev.dependencies] [tool.poetry.group.dev.dependencies]
ruff = "0.5.5" ruff = "0.5.5"

View File

@ -31,7 +31,7 @@ let
}; };
# constructs the application in-place # constructs the application in-place
app = pkgs.mkShell { inputsFrom = [ self.packages.${system}.myapp ]; }; flupdt = pkgs.mkShell { inputsFrom = [ self.packages.${system}.flupdt ]; };
# pull in python/poetry dependencies # pull in python/poetry dependencies
poetry = pkgs.mkShell { packages = [ pkgs.poetry ]; }; poetry = pkgs.mkShell { packages = [ pkgs.poetry ]; };
@ -43,7 +43,7 @@ in
inputsFrom = [ inputsFrom = [
pre-commit pre-commit
rad-dev rad-dev
app flupdt
poetry poetry
poetry2nixshell poetry2nixshell
]; ];