mirror of
https://github.com/retspen/webvirtcloud
synced 2026-11-08 11:16:47 +00:00
ci: replace super-linter with ruff
Super-linter ran from the unpinned :latest image and, because of branches-ignore: [master], never on pull requests to master. Ruff now checks syntax errors and pyflakes rules (E9, F) on every push and PR. Fixes the existing findings: unused imports and variables, an unused duplicate import in instances/tests.py, and the star import in accounts/views.py. settings-dev.py keeps its star import of the base settings.
This commit is contained in:
parent
a8725ee325
commit
b04f656d2b
31 changed files with 37 additions and 114 deletions
95
.github/workflows/linter.yml
vendored
95
.github/workflows/linter.yml
vendored
|
|
@ -1,92 +1,27 @@
|
|||
###########################
|
||||
###########################
|
||||
## Linter GitHub Actions ##
|
||||
###########################
|
||||
###########################
|
||||
name: Lint
|
||||
|
||||
name: Lint Code Base
|
||||
|
||||
#
|
||||
# Documentation:
|
||||
# https://help.github.com/en/articles/workflow-syntax-for-github-actions
|
||||
#
|
||||
|
||||
#############################
|
||||
# Start the job on all push #
|
||||
#############################
|
||||
on:
|
||||
push:
|
||||
branches: [master]
|
||||
pull_request:
|
||||
branches-ignore: [master]
|
||||
|
||||
branches: [master]
|
||||
|
||||
###############
|
||||
# Set the Job #
|
||||
###############
|
||||
jobs:
|
||||
build:
|
||||
name: Lint Code Base
|
||||
# Set the agent to run on
|
||||
ruff:
|
||||
name: Ruff
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
##################
|
||||
# Load all steps #
|
||||
###################
|
||||
steps:
|
||||
##########################
|
||||
# Checkout the code base #
|
||||
##########################
|
||||
- name: Checkout Code
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
# Full git history is needed to get a proper list of changed files within `super-linter`
|
||||
fetch-depth: 0
|
||||
- name: Checkout Code
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: '3.12'
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: '3.12'
|
||||
|
||||
- name: Install Required packages
|
||||
run: |
|
||||
sudo apt-get update -qq
|
||||
sudo apt-get install -y python3-venv python3-virtualenv libvirt-dev libldap2-dev libsasl2-dev python3-lxml zlib1g-dev libxslt1-dev pkg-config gcc libssl-dev
|
||||
|
||||
- name: Create & Activate VENV
|
||||
run: |
|
||||
python3 -m venv venv
|
||||
echo "$GITHUB_WORKSPACE/venv/bin" >> "$GITHUB_PATH"
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
pip3 install --upgrade pip setuptools wheel
|
||||
if [ -f dev/requirements.txt ]; then pip3 install -r dev/requirements.txt; else pip3 install -r conf/requirements.txt; fi
|
||||
################################
|
||||
# Run Linter against code base #
|
||||
################################
|
||||
- name: Lint Code Base
|
||||
uses: docker://github/super-linter:latest
|
||||
env:
|
||||
FILTER_REGEX_EXCLUDE: .*(static|scss|venv|locale|templates)/.*
|
||||
DEFAULT_BRANCH: master
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
VALIDATE_ALL_CODEBASE: false
|
||||
VALIDATE_MARKDOWN: false
|
||||
VALIDATE_HTML: false
|
||||
VALIDATE_JSCPD: false
|
||||
VALIDATE_ANSIBLE: false
|
||||
VALIDATE_CLOJURE: false
|
||||
VALIDATE_COFFEE: false
|
||||
VALIDATE_DART: false
|
||||
VALIDATE_GO: false
|
||||
VALIDATE_JSX: false
|
||||
VALIDATE_KOTLIN: false
|
||||
VALIDATE_POWERSHELL: false
|
||||
VALIDATE_PERL: false
|
||||
VALIDATE_PHP: false
|
||||
VALIDATE_RAKU: false
|
||||
VALIDATE_RUBY: false
|
||||
VALIDATE_TSX: false
|
||||
VALIDATE_TERRAFORM: false
|
||||
# Same ruff version as dev/requirements.txt
|
||||
- name: Install Ruff
|
||||
run: pip install "$(grep '^ruff==' dev/requirements.txt)"
|
||||
|
||||
- name: Run Ruff
|
||||
run: ruff check --output-format=github .
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
import base64
|
||||
import struct
|
||||
from unittest.mock import patch
|
||||
|
||||
from django.contrib.auth import get_user_model
|
||||
from django.core import mail
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@ from accounts.apps import admin_password_path
|
|||
from instances.models import Instance
|
||||
|
||||
from accounts.forms import EmailOTPForm, ProfileForm, UserSSHKeyForm
|
||||
from accounts.models import *
|
||||
from accounts.models import User, UserAttributes, UserInstance, UserSSHKey
|
||||
|
||||
from . import forms
|
||||
from .utils import get_user_totp_device, send_email_with_otp
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
from django.db import models, migrations
|
||||
from django.db import migrations
|
||||
|
||||
def apply_migration(apps, schema_editor):
|
||||
Group = apps.get_model('auth', 'Group')
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
from .settings import app_settings, get_settings
|
||||
from .settings import get_settings
|
||||
|
||||
|
||||
class AppSettingsMiddleware(object):
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
# Generated by Django 3.2.13 on 2022-06-30 07:17
|
||||
|
||||
from django.db import migrations
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
|
||||
def update_default_settings(apps, schema_editor):
|
||||
setting = apps.get_model("appsettings", "AppSettings")
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
from django.test import Client, TestCase
|
||||
from django.test import TestCase
|
||||
from django.urls import reverse
|
||||
|
||||
from appsettings.models import AppSettings
|
||||
|
|
|
|||
|
|
@ -1,3 +1,2 @@
|
|||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
||||
|
|
|
|||
|
|
@ -3,7 +3,6 @@ import os
|
|||
import sass
|
||||
from admin.decorators import superuser_only
|
||||
from django.contrib import messages
|
||||
from django.contrib.auth.decorators import login_required
|
||||
from django.http import HttpResponseRedirect
|
||||
from django.shortcuts import render
|
||||
from django.utils.translation import gettext_noop as _
|
||||
|
|
|
|||
|
|
@ -8,10 +8,6 @@ from django.utils import timezone
|
|||
from instances.models import Instance
|
||||
from libvirt import libvirtError
|
||||
from vrtManager.connection import (
|
||||
CONN_SOCKET,
|
||||
CONN_SSH,
|
||||
CONN_TCP,
|
||||
CONN_TLS,
|
||||
connection_manager,
|
||||
wvmConnect,
|
||||
)
|
||||
|
|
|
|||
|
|
@ -1,3 +1,2 @@
|
|||
from django.db import models
|
||||
|
||||
# Create your models here.
|
||||
|
|
|
|||
|
|
@ -1,11 +1,10 @@
|
|||
import json
|
||||
from unittest.mock import MagicMock, patch
|
||||
|
||||
from django.test import RequestFactory, TestCase
|
||||
from django.urls import reverse
|
||||
|
||||
from computes.models import Compute
|
||||
from datasource.views import get_client_ip, get_hostname_by_ip, os_index, os_metadata_json, os_userdata
|
||||
from datasource.views import get_client_ip, get_hostname_by_ip
|
||||
|
||||
|
||||
class DataSourceTestCase(TestCase):
|
||||
|
|
|
|||
|
|
@ -1,3 +1,2 @@
|
|||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
||||
|
|
|
|||
|
|
@ -290,7 +290,7 @@ class CreateInstanceViewSet(viewsets.ViewSet):
|
|||
volume_list.append(volume)
|
||||
|
||||
with utils.libvirt_compute_lock(compute):
|
||||
ret = conn.create_instance(
|
||||
conn.create_instance(
|
||||
name=serializer.validated_data["name"],
|
||||
memory=serializer.validated_data["memory"],
|
||||
vcpu=serializer.validated_data["vcpu"],
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ disk and media mutation views must be superuser-only (matching the UI, where
|
|||
the Disk tab is only rendered for superusers), and even for superusers the
|
||||
views must not act on volumes or option values taken blindly from the client.
|
||||
"""
|
||||
from unittest.mock import MagicMock, patch
|
||||
from unittest.mock import patch
|
||||
|
||||
from django.contrib.auth import get_user_model
|
||||
from django.test import TestCase
|
||||
|
|
|
|||
|
|
@ -271,7 +271,7 @@ class InstanceSecurityMutationsTestCase(TestCase):
|
|||
|
||||
with patch("instances.utils.connection_manager.host_is_up", return_value=True), \
|
||||
patch("instances.utils.wvmInstances") as mock_instances_cls, \
|
||||
patch("instances.utils.wvmInstance") as mock_instance_cls, \
|
||||
patch("instances.utils.wvmInstance"), \
|
||||
patch("instances.utils.transaction.atomic"), \
|
||||
patch("instances.utils.Instance") as mock_instance_model:
|
||||
|
||||
|
|
|
|||
|
|
@ -10,7 +10,6 @@ from django.contrib.auth.models import Permission
|
|||
from django.http.response import Http404
|
||||
from django.shortcuts import reverse
|
||||
from django.test import TestCase
|
||||
from instances.views import instance
|
||||
from libvirt import VIR_DOMAIN_UNDEFINE_NVRAM
|
||||
from vrtManager.create import wvmCreate
|
||||
from vrtManager.util import randomUUID
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
from admin.permissions import IsSuperUser
|
||||
from django.shortcuts import get_object_or_404
|
||||
from computes.models import Compute
|
||||
from rest_framework import status, viewsets
|
||||
from rest_framework import viewsets
|
||||
from rest_framework.response import Response
|
||||
from vrtManager.interface import wvmInterfaces, wvmInterface
|
||||
|
||||
|
|
|
|||
|
|
@ -1,3 +1,2 @@
|
|||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
||||
|
|
|
|||
|
|
@ -1,3 +1,2 @@
|
|||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
||||
|
|
|
|||
|
|
@ -1,3 +1,2 @@
|
|||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
||||
|
|
|
|||
|
|
@ -1,3 +1,2 @@
|
|||
from django.db import models
|
||||
|
||||
# Create your models here.
|
||||
|
|
|
|||
11
pyproject.toml
Normal file
11
pyproject.toml
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
[tool.ruff]
|
||||
target-version = "py310"
|
||||
extend-exclude = ["static"]
|
||||
|
||||
[tool.ruff.lint]
|
||||
# Syntax errors and pyflakes; widen the rule set step by step.
|
||||
select = ["E9", "F"]
|
||||
|
||||
[tool.ruff.lint.per-file-ignores]
|
||||
# Settings overlay: re-exports the base settings by design.
|
||||
"webvirtcloud/settings-dev.py" = ["F403", "F405"]
|
||||
|
|
@ -3,7 +3,7 @@ from appsettings.settings import app_settings
|
|||
from computes.models import Compute
|
||||
from django.shortcuts import get_object_or_404
|
||||
from drf_spectacular.utils import extend_schema, inline_serializer
|
||||
from rest_framework import serializers, status, viewsets
|
||||
from rest_framework import serializers, viewsets
|
||||
from rest_framework.decorators import action
|
||||
from rest_framework.response import Response
|
||||
from vrtManager.storage import wvmStorage, wvmStorages
|
||||
|
|
|
|||
|
|
@ -290,8 +290,6 @@ def create_volume(request, compute_id, pool):
|
|||
compute.hostname, compute.login, compute.password, compute.type, pool
|
||||
)
|
||||
|
||||
storages = conn.get_storages()
|
||||
|
||||
form = CreateVolumeForm(request.POST or None)
|
||||
if form.is_valid():
|
||||
data = form.cleaned_data
|
||||
|
|
|
|||
|
|
@ -1,3 +1,2 @@
|
|||
from django.db import models
|
||||
|
||||
# Create your models here.
|
||||
|
|
|
|||
|
|
@ -1,3 +1,2 @@
|
|||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
||||
|
|
|
|||
|
|
@ -128,7 +128,6 @@ class TestReadWriteLock(unittest.TestCase):
|
|||
def test_writer_blocks_subsequent_readers(self):
|
||||
"""Pending writers take priority and should block subsequent new readers."""
|
||||
order = []
|
||||
lock_held_event = threading.Event()
|
||||
writer_ready_event = threading.Event()
|
||||
|
||||
# Step 1: Initial reader holds read lock
|
||||
|
|
|
|||
|
|
@ -1,4 +1,3 @@
|
|||
import re
|
||||
import unittest
|
||||
|
||||
from django.conf import settings
|
||||
|
|
|
|||
|
|
@ -290,7 +290,6 @@ class TestPersistentDiskEditing(unittest.TestCase):
|
|||
)
|
||||
|
||||
def test_running_bus_change_preserves_disk_and_pending_domain_configuration(self):
|
||||
from lxml import etree
|
||||
self.assertTrue(self.domain.isActive())
|
||||
live_before = self.domain.XMLDesc(0)
|
||||
self.edit(bus="sata")
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ import string
|
|||
import libvirt
|
||||
import lxml.etree as etree
|
||||
|
||||
from django.conf import UserSettingsHolder, settings
|
||||
from django.conf import settings
|
||||
|
||||
|
||||
def is_kvm_available(xml):
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue