Compare commits

..

4 commits

Author SHA1 Message Date
ItsDrike 8a4d6ba1cb
Add python dependencies 2024-06-27 00:26:29 +02:00
ItsDrike 7c3098c74f
Add python packages 2024-06-26 23:48:04 +02:00
ItsDrike 507f364e5b
Support persisting data separately from config 2024-06-26 22:51:51 +02:00
ItsDrike 4a10a3536a
Update float window rules 2024-06-26 20:47:04 +02:00
15 changed files with 354 additions and 13 deletions

View file

@ -25,5 +25,18 @@ in {
# Docker, etc. Requires NixOS configuration programs.fuse.userAllowOther = true; # Docker, etc. Requires NixOS configuration programs.fuse.userAllowOther = true;
allowOther = true; allowOther = true;
}; };
home.persistence."${cfg.persistentDataMountPoint}" = {
directories = [
] ++ cfg.extraDataDirectories;
files = [
] ++ cfg.extraDataFiles;
# See comment for this above
allowOther = true;
};
}; };
} }

View file

@ -40,9 +40,10 @@
"float, class:^(com.github.wwmm.easyeffects)" "float, class:^(com.github.wwmm.easyeffects)"
"float, class:^(opensnitch_ui)$" "float, class:^(opensnitch_ui)$"
"float, class:^(Brave-browser)$,title:^(_crx_.+)$" "float, class:^(Brave-browser)$,title:^(_crx_.+)$"
"float, class:^(hyprland-share-picker)$" "float, class:^(floating)$"
"float,class:^(floating)$"
# Float hyprland-share-picker & some extra actions
"float, class:^(hyprland-share-picker)$"
"center, class:^(hyprland-share-picker)$" "center, class:^(hyprland-share-picker)$"
"animation slide, class:^(hyprland-share-picker)$" "animation slide, class:^(hyprland-share-picker)$"
@ -77,6 +78,9 @@
"float, class:^(splash)$" "float, class:^(splash)$"
"float, class:^(confirmreset)$" "float, class:^(confirmreset)$"
# Float all windows that don't have a title nor a class
"float, class:^$,title:^$"
# #
# Fixes # Fixes
# #

View file

@ -0,0 +1,5 @@
{
imports = [
./python
];
}

View file

@ -0,0 +1,11 @@
{
imports = [
./python.nix
./ipython.nix
./poetry.nix
./rye.nix
./pyright.nix
./mypy.nix
./ruff.nix
];
}

View file

@ -0,0 +1,14 @@
{
lib,
pkgs,
osConfig,
...
}: let
inherit (lib) mkIf;
cfg = osConfig.myOptions.home-manager.programs.coding.python;
in {
config = mkIf cfg.enable {
home.packages = with pkgs; [ python312Packages.ipython ];
};
}

View file

@ -0,0 +1,14 @@
{
lib,
pkgs,
osConfig,
...
}: let
inherit (lib) mkIf;
cfg = osConfig.myOptions.home-manager.programs.coding.python;
in {
config = mkIf cfg.enable {
home.packages = with pkgs; [ python312Packages.mypy ];
};
}

View file

@ -0,0 +1,27 @@
{
lib,
osConfig,
...
}: let
inherit (lib) mkIf;
cfg = osConfig.myOptions.home-manager.programs.coding.python;
in {
config = mkIf cfg.enable {
programs.poetry = {
enable = true;
settings = {
virtualenvs = {
in-project = true;
# use python the version of python that's globally installed on the system
# and exists in PATH, instead of the python version poetry was installed
# with. Annoyingly, there's no good way to override the python version at
# which NixOS will built poetry here, so this is the next best thing.
prefer-active-python = true;
};
};
};
};
}

View file

@ -0,0 +1,14 @@
{
lib,
pkgs,
osConfig,
...
}: let
inherit (lib) mkIf;
cfg = osConfig.myOptions.home-manager.programs.coding.python;
in {
config = mkIf cfg.enable {
home.packages = with pkgs; [ pyright ];
};
}

View file

@ -0,0 +1,14 @@
{
lib,
pkgs,
osConfig,
...
}: let
inherit (lib) mkIf;
cfg = osConfig.myOptions.home-manager.programs.coding.python;
in {
config = mkIf cfg.enable {
home.packages = with pkgs; [ python312 ];
};
}

View file

@ -0,0 +1,164 @@
{
lib,
osConfig,
...
}: let
inherit (lib) mkIf;
cfg = osConfig.myOptions.home-manager.programs.coding.python;
in {
config = mkIf cfg.enable {
programs.ruff = {
enable = true;
settings = {
line-length = 119;
lint = {
select = [
"F" # Pyflakes
"E" # Pycodestyle (errors)
"W" # Pycodestyle (warnigns)
"N" # pep8-naming
"D" # pydocstyle
"UP" # pyupgrade
"YTT" # flake8-2020
"ANN" # flake8-annotations
"ASYNC" # flake8-async
"S" # flake8-bandit
"BLE" # flake8-blind-except
"B" # flake8-bugbear
"A" # flake8-builtins
"COM" # flake8-commas
"C4" # flake8-comprehensions
"DTZ" # flake8-datetimez
"T10" # flake8-debugger
"EM" # flake8-errmsg
"EXE" # flake8-executable
"FA" # flake8-future-annotations
"ISC" # flake8-implicit-str-concat
"ICN" # flake8-import-conventions
"LOG" # flake8-logging
"G" # flake8-logging-format
"INP" # flake8-no-pep420
"PIE" # flake8-pie
"T20" # flake8-print
"PYI" # flake8-pyi
"PT" # flake8-pytest-style
"Q" # flake8-quotes
"RSE" # flake8-raise
"RET" # flake8-return
"SLOT" # flake8-slots
"SIM" # flake8-simplify
"TID" # flake8-tidy-imports
"TCH" # flake8-type-checking
"INT" # flake8-gettext
"PTH" # flake8-use-pathlib
"TD" # flake8-todos
"ERA" # flake8-eradicate
"PGH" # pygrep-hooks
"PL" # pylint
"TRY" # tryceratops
"FLY" # flynt
"PERF" # perflint
"RUF" # ruff-specific rules
];
ignore = [
"D100" # Missing docstring in public module
"D104" # Missing docstring in public package
"D105" # Missing docstring in magic method
"D107" # Missing docstring in __init__
"D203" # Blank line required before class docstring
"D213" # Multi-line summary should start at second line (incompatible with D212)
"D301" # Use r""" if any backslashes in a docstring
"D405" # Section name should be properly capitalized
"D406" # Section name should end with a newline
"D407" # Missing dashed underline after section
"D408" # Section underline should be in the line following the section's name
"D409" # Section underline should match the length of its name
"D410" # Missing blank line after section
"D411" # Missing blank line before section
"D412" # No blank lines allowed between a section header and its content
"D413" # Missing blank line after last section
"D414" # Section has no content
"D416" # Section name should end with a colon
"D417" # Missing argument descrition in the docstring
"ANN002" # Missing type annotation for *args
"ANN003" # Missing type annotation for **kwargs
"ANN101" # Missing type annotation for self in method
"ANN102" # Missing type annotation for cls in classmethod
"ANN204" # Missing return type annotation for special method
"ANN401" # Dynamically typed expressions (typing.Any) disallowed
"SIM102" # use a single if statement instead of nested if statements
"SIM108" # Use ternary operator {contents} instead of if-else-block
"TCH001" # Move application imports used only for annotations into a type-checking block
"TCH002" # Move 3rd-party imports used only for annotations into a type-checking block
"TCH003" # Move standard library imports used only for annotations into a type-checking block
"TD002" # Missing author in TODO
"TD003" # Missing issue link on the line following this TODO
"PT011" # pytest.raises without match parameter is too broad # TODO: Unignore this
"TRY003" # No f-strings in raise statements
"EM101" # No string literals in exception init
"EM102" # No f-strings in exception init
"UP024" # Using errors that alias OSError
"PLR2004" # Using unnamed numerical constants
"PGH003" # Using specific rule codes in type ignores
"E731" # Don't asign a lambda expression, use a def
# Redundant rules with ruff-format:
"E111" # Indentation of a non-multiple of 4 spaces
"E114" # Comment with indentation of a non-multiple of 4 spaces
"E117" # Cheks for over-indented code
"D206" # Checks for docstrings indented with tabs
"D300" # Checks for docstring that use ''' instead of """
"Q000" # Checks of inline strings that use wrong quotes (' instead of ")
"Q001" # Multiline string that use wrong quotes (''' instead of """)
"Q002" # Checks for docstrings that use wrong quotes (''' instead of """)
"Q003" # Checks for avoidable escaped quotes ("\"" -> '"')
"COM812" # Missing trailing comma (in multi-line lists/tuples/...)
"COM819" # Prohibited trailing comma (in single-line lists/tuples/...)
"ISC001" # Single line implicit string concatenation ("hi" "hey" -> "hihey")
"ISC002" # Multi line implicit string concatenation
];
extend-per-file-ignores = {
"tests/*" = [
"ANN" # flake8-annotations
"S101" # Use of assert
];
"docs/conf.py" = [
"INP" # allow implicit namespace (pep 420)
];
};
isort = {
order-by-type = false;
case-sensitive = true;
combine-as-imports = true;
# Redundant rules with ruff-format
force-single-line = false; # forces all imports to appear on their own line
force-wrap-aliases = false; # Split imports with multiple members and at least one alias
lines-after-imports = -1; # The number of blank lines to place after imports
lines-between-types = 0; # Number of lines to place between "direct" and import from imports
split-on-trailing-comma = false; # if last member of multiline import has a comma, don't fold it to single line
};
pylint = {
max-args = 20;
max-branches = 20;
max-returns = 20;
max-statements = 250;
};
flake8-tidy-imports = {
ban-relative-imports = "all";
};
};
format = {
line-ending = "lf";
};
};
};
};
}

View file

@ -0,0 +1,14 @@
{
lib,
pkgs,
osConfig,
...
}: let
inherit (lib) mkIf;
cfg = osConfig.myOptions.home-manager.programs.coding.python;
in {
config = mkIf cfg.enable {
home.packages = with pkgs; [ rye ];
};
}

View file

@ -5,5 +5,6 @@ _: {
./editors ./editors
./file-managers ./file-managers
./emulators ./emulators
./coding
]; ];
} }

View file

@ -53,14 +53,6 @@
enable = true; enable = true;
persistentMountPoint = "/persist/home"; persistentMountPoint = "/persist/home";
extraDirectories = [ extraDirectories = [
# Nixos flake
"dots"
# Personal data
"Downloads"
"Personal"
"Media"
# Browsers # Browsers
".mozilla" ".mozilla"
".mullvad" ".mullvad"
@ -95,6 +87,20 @@
".config/pcmanfm-qt/default/recent-files.conf" ".config/pcmanfm-qt/default/recent-files.conf"
".config/qalculate/qalculate-gtk.cfg" ".config/qalculate/qalculate-gtk.cfg"
]; ];
persistentDataMountPoint = "/data/Data";
extraDataDirectories = [
# Nixos flake
"dots"
# XDG user dirs
"Downloads"
"Media"
# Other personal data
"Personal"
];
extraDataFiles = [];
}; };
# Configure automatic root subvolume wiping on boot from initrd # Configure automatic root subvolume wiping on boot from initrd
@ -201,6 +207,9 @@
file-managers = { file-managers = {
pcmanfm-qt.enable = true; pcmanfm-qt.enable = true;
}; };
coding = {
python.enable = true;
};
}; };
services = { services = {

View file

@ -57,5 +57,9 @@ in
fastfetch.enable = mkEnableOption "FastFetch (fast neofetch)"; fastfetch.enable = mkEnableOption "FastFetch (fast neofetch)";
hyfetch.enable = mkEnableOption "Neofetch with pride flags"; hyfetch.enable = mkEnableOption "Neofetch with pride flags";
}; };
coding = {
python.enable = mkEnableOption "Python coding utilities";
};
}; };
} }

View file

@ -60,7 +60,7 @@ in
extraDirectories = mkOption { extraDirectories = mkOption {
default = []; default = [];
type = types.listOf types.str; type = types.listOf types.str;
example = literalExpression ''["Downloads"]''; example = literalExpression ''[".config/chromium"]'';
description = '' description = ''
Additional directories in home to link to persistent storage. Additional directories in home to link to persistent storage.
''; '';
@ -70,13 +70,46 @@ in
default = "/persist/home"; default = "/persist/home";
description = '' description = ''
Path to a persistent directory (usually a mount point to a Path to a persistent directory (usually a mount point to a
standalone partition / subvolume), which will hold the persistent standalone partition or subvolume), which will hold the persistent
system state files. system state files.
This does not expect any subdirectories, all of the persistent home files This does not create any subdirectories, all of the persistent home files
will be put directly in here. The user should be the owner of this direcotry. will be put directly in here. The user should be the owner of this direcotry.
''; '';
}; };
persistentDataMountPoint = mkOption {
default = "/persist/home";
description = ''
Path to a persistent directory (usually a mount point to a
standalone partition or subvolume), which will hold the persistent
data files.
This does not create any subdirectories, all of the persistent home files
fill be put directly in here. The user should be the owner of this directory.
If you don't wish to distinguish between data and system / configuration files,
you can point this to the same location.
'';
};
extraDataFiles = mkOption {
default = [];
type = types.listOf types.str;
example = literalExpression ''["notes.txt"]'';
description = ''
Additional files in home to link to persistent data storage.
'';
};
extraDataDirectories = mkOption {
default = [];
type = types.listOf types.str;
example = literalExpression ''["Downloads"]'';
description = ''
Additional directories in home to link to persistent data storage.
'';
};
}; };
autoWipeBtrfs = let autoWipeBtrfs = let