Skip to content

Commit

Permalink
Merge pull request #256 from blink1073/flake8-mypy
Browse files Browse the repository at this point in the history
Add flake8 and mypy settings
  • Loading branch information
blink1073 committed Apr 13, 2022
2 parents 071adf8 + 9925476 commit 73eb091
Show file tree
Hide file tree
Showing 14 changed files with 160 additions and 88 deletions.
24 changes: 22 additions & 2 deletions .github/workflows/test.yml
Expand Up @@ -15,11 +15,11 @@ jobs:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
python-version: [3.6, 3.7, 3.8, 3.9, 3.10-dev, pypy-3.7]
python-version: [3.7, 3.8, 3.9, "3.10", pypy-3.7]
exclude:
# pywin32 not available
- os: windows-latest
python-version: 3.10-dev
python-version: "3.10"
steps:
- uses: actions/checkout@v2
- name: Set up Python ${{ matrix.python-version }}
Expand Down Expand Up @@ -51,3 +51,23 @@ jobs:
run: |
pip install check-manifest
check-manifest -v
pre-commit:
name: pre-commit
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-python@v2
- uses: pre-commit/action@v2.0.0
with:
extra_args: --all-files --hook-stage=manual
- name: Help message if pre-commit fail
if: ${{ failure() }}
run: |
echo "You can install pre-commit hooks to automatically run formatting"
echo "on each commit with:"
echo " pre-commit install"
echo "or you can run by hand on staged files with"
echo " pre-commit run"
echo "or after-the-fact on already committed files with"
echo " pre-commit run --all-files --hook-stage=manual"
43 changes: 26 additions & 17 deletions .pre-commit-config.yaml
@@ -1,6 +1,3 @@
ci:
skip: [check-jsonschema]

repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.2.0
Expand Down Expand Up @@ -47,22 +44,33 @@ repos:
hooks:
- id: doc8
args: [--max-line-length=200]
stages: [manual]

# - repo: https://github.com/pycqa/flake8
# rev: 4.0.1
# hooks:
# - id: flake8
# additional_dependencies:
# [
# "flake8-bugbear==20.1.4",
# "flake8-logging-format==0.6.0",
# "flake8-implicit-str-concat==0.2.0",
# ]
- repo: https://github.com/pycqa/flake8
rev: 4.0.1
hooks:
- id: flake8
additional_dependencies:
[
"flake8-bugbear==20.1.4",
"flake8-logging-format==0.6.0",
"flake8-implicit-str-concat==0.2.0",
]
stages: [manual]

# - repo: https://github.com/pre-commit/mirrors-mypy
# rev: v0.942
# hooks:
# - id: mypy
- repo: https://github.com/pre-commit/mirrors-mypy
rev: v0.942
hooks:
- id: mypy
args: ["--config-file", "pyproject.toml"]
stages: [manual]
additional_dependencies: [pytest]
exclude: |
exclude: |
(?x)^(
jupyter_core/tests/.*_config.py |
scripts/jupyter
)$
- repo: https://github.com/sirosen/check-jsonschema
rev: 0.14.2
Expand All @@ -72,3 +80,4 @@ repos:
files: ^\.github/workflows/
types: [yaml]
args: ["--schemafile", "https://json.schemastore.org/github-workflow"]
stages: [manual]
1 change: 1 addition & 0 deletions MANIFEST.in
Expand Up @@ -2,6 +2,7 @@ include COPYING.md
include CONTRIBUTING.md
include README.md
include dev-requirements.txt
include jupyter_core/py.typed

exclude .pre-commit-config.yaml
exclude .git-blame-ignore-revs
Expand Down
11 changes: 1 addition & 10 deletions docs/conf.py
Expand Up @@ -208,16 +208,7 @@

# -- Options for LaTeX output ---------------------------------------------

latex_elements = {
# The paper size ('letterpaper' or 'a4paper').
#'papersize': 'letterpaper',
# The font size ('10pt', '11pt' or '12pt').
#'pointsize': '10pt',
# Additional stuff for the LaTeX preamble.
#'preamble': '',
# Latex figure (float) alignment
#'figure_align': 'htbp',
}
latex_elements: dict = {}

# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title,
Expand Down
2 changes: 1 addition & 1 deletion jupyter_core/__init__.py
@@ -1 +1 @@
from .version import __version__, version_info
from .version import __version__, version_info # noqa
2 changes: 1 addition & 1 deletion jupyter_core/command.py
Expand Up @@ -21,7 +21,7 @@


class JupyterParser(argparse.ArgumentParser):
@property
@property # type:ignore[override]
def epilog(self):
"""Add subcommands to epilog on request
Expand Down
54 changes: 30 additions & 24 deletions jupyter_core/paths.py
Expand Up @@ -17,6 +17,7 @@
import warnings
from contextlib import contextmanager
from pathlib import Path
from typing import Optional

pjoin = os.path.join

Expand All @@ -43,7 +44,7 @@ def get_home_dir():
return homedir


_dtemps = {}
_dtemps: dict = {}


def _mkdtemp_once(name):
Expand Down Expand Up @@ -159,7 +160,7 @@ def jupyter_path(*subdirs):
['~/.local/jupyter/kernels', '/usr/local/share/jupyter/kernels']
"""

paths = []
paths: list = []

# highest priority is explicit environment variable
if os.environ.get("JUPYTER_PATH"):
Expand All @@ -170,13 +171,16 @@ def jupyter_path(*subdirs):
if site.ENABLE_USER_SITE:
# Check if site.getuserbase() exists to be compatible with virtualenv,
# which often does not have this method.
userbase: Optional[str]
if hasattr(site, "getuserbase"):
userbase = site.getuserbase()
else:
userbase = site.USER_BASE
userdir = os.path.join(userbase, "share", "jupyter")
if userdir not in user:
user.append(userdir)

if userbase:
userdir = os.path.join(userbase, "share", "jupyter")
if userdir not in user:
user.append(userdir)

env = [p for p in ENV_JUPYTER_PATH if p not in SYSTEM_JUPYTER_PATH]

Expand Down Expand Up @@ -225,7 +229,7 @@ def jupyter_config_path():
# jupyter_config_dir makes a blank config when JUPYTER_NO_CONFIG is set.
return [jupyter_config_dir()]

paths = []
paths: list = []

# highest priority is explicit environment variable
if os.environ.get("JUPYTER_CONFIG_PATH"):
Expand All @@ -234,16 +238,18 @@ def jupyter_config_path():
# Next is environment or user, depending on the JUPYTER_PREFER_ENV_PATH flag
user = [jupyter_config_dir()]
if site.ENABLE_USER_SITE:
userbase: Optional[str]
# Check if site.getuserbase() exists to be compatible with virtualenv,
# which often does not have this method.
if hasattr(site, "getuserbase"):
userbase = site.getuserbase()
else:
userbase = site.USER_BASE

userdir = os.path.join(userbase, "etc", "jupyter")
if userdir not in user:
user.append(userdir)
if userbase:
userdir = os.path.join(userbase, "etc", "jupyter")
if userdir not in user:
user.append(userdir)

env = [p for p in ENV_CONFIG_PATH if p not in SYSTEM_CONFIG_PATH]

Expand Down Expand Up @@ -298,7 +304,7 @@ def is_file_hidden_win(abs_path, stat_res=None):
raise

try:
if stat_res.st_file_attributes & stat.FILE_ATTRIBUTE_HIDDEN:
if stat_res.st_file_attributes & stat.FILE_ATTRIBUTE_HIDDEN: # type:ignore[attr-defined]
return True
except AttributeError:
# allow AttributeError on PyPy for Windows
Expand Down Expand Up @@ -424,12 +430,12 @@ def win32_restrict_file_to_user(fname):
The path to the file to secure
"""
try:
import win32api
import win32api # type:ignore[import]
except ImportError:
return _win32_restrict_file_to_user_ctypes(fname)

import ntsecuritycon as con
import win32security
import ntsecuritycon as con # type:ignore[import]
import win32security # type:ignore[import]

# everyone, _domain, _type = win32security.LookupAccountName("", "Everyone")
admins = win32security.CreateWellKnownSid(win32security.WinBuiltinAdministratorsSid)
Expand Down Expand Up @@ -470,8 +476,8 @@ def _win32_restrict_file_to_user_ctypes(fname):
import ctypes
from ctypes import wintypes

advapi32 = ctypes.WinDLL("advapi32", use_last_error=True)
secur32 = ctypes.WinDLL("secur32", use_last_error=True)
advapi32 = ctypes.WinDLL("advapi32", use_last_error=True) # type:ignore[attr-defined]
secur32 = ctypes.WinDLL("secur32", use_last_error=True) # type:ignore[attr-defined]

NameSamCompatible = 2
WinBuiltinAdministratorsSid = 26
Expand Down Expand Up @@ -520,7 +526,7 @@ class ACL(ctypes.Structure):

def _nonzero_success(result, func, args):
if not result:
raise ctypes.WinError(ctypes.get_last_error())
raise ctypes.WinError(ctypes.get_last_error()) # type:ignore[attr-defined]
return args

secur32.GetUserNameExW.errcheck = _nonzero_success
Expand Down Expand Up @@ -627,7 +633,7 @@ def CreateWellKnownSid(WellKnownSidType):
try:
advapi32.CreateWellKnownSid(WellKnownSidType, None, pSid, ctypes.byref(cbSid))
except OSError as e:
if e.winerror != ERROR_INSUFFICIENT_BUFFER:
if e.winerror != ERROR_INSUFFICIENT_BUFFER: # type:ignore[attr-defined]
raise
pSid = (ctypes.c_char * cbSid.value)()
advapi32.CreateWellKnownSid(WellKnownSidType, None, pSid, ctypes.byref(cbSid))
Expand All @@ -640,7 +646,7 @@ def GetUserNameEx(NameFormat):
try:
secur32.GetUserNameExW(NameFormat, None, nSize)
except OSError as e:
if e.winerror != ERROR_MORE_DATA:
if e.winerror != ERROR_MORE_DATA: # type:ignore[attr-defined]
raise
if not nSize.contents.value:
return None
Expand All @@ -665,7 +671,7 @@ def LookupAccountName(lpSystemName, lpAccountName):
ctypes.byref(peUse),
)
except OSError as e:
if e.winerror != ERROR_INSUFFICIENT_BUFFER:
if e.winerror != ERROR_INSUFFICIENT_BUFFER: # type:ignore[attr-defined]
raise
Sid = ctypes.create_unicode_buffer("", cbSid.value)
pSid = ctypes.cast(ctypes.pointer(Sid), wintypes.LPVOID)
Expand All @@ -680,7 +686,7 @@ def LookupAccountName(lpSystemName, lpAccountName):
ctypes.byref(peUse),
)
if not success:
raise ctypes.WinError()
raise ctypes.WinError() # type:ignore[attr-defined]
return pSid, lpReferencedDomainName.value, peUse.value

def AddAccessAllowedAce(pAcl, dwAceRevision, AccessMask, pSid):
Expand All @@ -700,7 +706,7 @@ def GetFileSecurity(lpFileName, RequestedInformation):
ctypes.byref(nLength),
)
except OSError as e:
if e.winerror != ERROR_INSUFFICIENT_BUFFER:
if e.winerror != ERROR_INSUFFICIENT_BUFFER: # type:ignore[attr-defined]
raise
if not nLength.value:
return None
Expand Down Expand Up @@ -750,7 +756,7 @@ def MakeAbsoluteSD(pSelfRelativeSecurityDescriptor):
ctypes.byref(lpdwPrimaryGroupSize),
)
except OSError as e:
if e.winerror != ERROR_INSUFFICIENT_BUFFER:
if e.winerror != ERROR_INSUFFICIENT_BUFFER: # type:ignore[attr-defined]
raise
pAbsoluteSecurityDescriptor = (wintypes.BYTE * lpdwAbsoluteSecurityDescriptorSize.value)()
pDaclData = (wintypes.BYTE * lpdwDaclSize.value)()
Expand Down Expand Up @@ -788,7 +794,7 @@ def MakeSelfRelativeSD(pAbsoluteSecurityDescriptor):
ctypes.byref(lpdwBufferLength),
)
except OSError as e:
if e.winerror != ERROR_INSUFFICIENT_BUFFER:
if e.winerror != ERROR_INSUFFICIENT_BUFFER: # type:ignore[attr-defined]
raise
pSelfRelativeSecurityDescriptor = (wintypes.BYTE * lpdwBufferLength.value)()
advapi32.MakeSelfRelativeSD(
Expand Down Expand Up @@ -907,7 +913,7 @@ def issue_insecure_write_warning():
def format_warning(msg, *args, **kwargs):
return str(msg) + "\n"

warnings.formatwarning = format_warning
warnings.formatwarning = format_warning # type:ignore[assignment]
warnings.warn(
"WARNING: Insecure writes have been enabled via environment variable "
"'JUPYTER_ALLOW_INSECURE_WRITES'! If this is not intended, remove the "
Expand Down
Empty file added jupyter_core/py.typed
Empty file.
3 changes: 1 addition & 2 deletions jupyter_core/tests/test_command.py
Expand Up @@ -9,7 +9,6 @@

import pytest

from jupyter_core import __version__
from jupyter_core.command import list_subcommands
from jupyter_core.paths import (
jupyter_config_dir,
Expand Down Expand Up @@ -95,7 +94,7 @@ def test_paths_json():
output = get_jupyter_output(["--paths", "--json"])
data = json.loads(output)
assert sorted(data) == ["config", "data", "runtime"]
for key, path in data.items():
for _, path in data.items():
assert isinstance(path, list)


Expand Down

0 comments on commit 73eb091

Please sign in to comment.