Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

TypeError: expected str, bytes or os.PathLike object, not TextIOWrapper. Why extra " -" is being added after flake8 --format default? #127

Open
edvard-munch opened this issue Aug 9, 2022 · 6 comments

Comments

@edvard-munch
Copy link

Flake8 works great when using it manually in command line. Doesn't work in Sublime. It seems like this command is wrong "cat src/app/conf/db.py | /home/edvard_munch/programming/python/education-backend-master/venv/bin/flake8 --format default -"

Ubuntu 22.04
Sublime Text Build 4126
Python 3.10.4
Venv

Console output:

SublimeLinter: linter.py:1127         flake8: Checking lint mode 'background' vs lint reason 'on_modified'.  Ok.
SublimeLinter: sublime_linter.py:345  Delay linting 'db.py' for 0.0s
SublimeLinter: linter.py:1127         flake8: Checking lint mode 'background' vs lint reason 'on_save'.  Ok.
SublimeLinter: #3 linter.py:1144      flake8: linting 'db.py'
SublimeLinter: #3 linter.py:922       flake8: wanted executable is '/home/edvard_munch/programming/python/education-backend-master/venv/bin/flake8'
SublimeLinter: #3 linter.py:1704      Running ...

  /home/edvard_munch/programming/python/education-backend-master  (working dir)
  $ cat src/app/conf/db.py | /home/edvard_munch/programming/python/education-backend-master/venv/bin/flake8 --format default  -

SublimeLinter: #3 linter.py:62        ERROR: Traceback (most recent call last):
  File "/home/edvard_munch/programming/python/education-backend-master/venv/bin/flake8", line 8, in <module>
    sys.exit(main())
  File "/home/edvard_munch/programming/python/education-backend-master/venv/lib/python3.10/site-packages/flake8/main/cli.py", line 22, in main
    app.run(argv)
  File "/home/edvard_munch/programming/python/education-backend-master/venv/lib/python3.10/site-packages/flake8/main/application.py", line 363, in run
    self._run(argv)
  File "/home/edvard_munch/programming/python/education-backend-master/venv/lib/python3.10/site-packages/flake8/main/application.py", line 351, in _run
    self.run_checks()
  File "/home/edvard_munch/programming/python/education-backend-master/venv/lib/python3.10/site-packages/flake8/main/application.py", line 264, in run_checks
    self.file_checker_manager.run()
  File "/home/edvard_munch/programming/python/education-backend-master/venv/lib/python3.10/site-packages/flake8/checker.py", line 323, in run
    self.run_serial()
  File "/home/edvard_munch/programming/python/education-backend-master/venv/lib/python3.10/site-packages/flake8/checker.py", line 307, in run_serial
    checker.run_checks()
  File "/home/edvard_munch/programming/python/education-backend-master/venv/lib/python3.10/site-packages/flake8/checker.py", line 589, in run_checks
    self.run_ast_checks()
  File "/home/edvard_munch/programming/python/education-backend-master/venv/lib/python3.10/site-packages/flake8/checker.py", line 494, in run_ast_checks
    for (line_number, offset, text, _) in runner:
  File "/home/edvard_munch/programming/python/education-backend-master/venv/lib/python3.10/site-packages/flake8_mock.py", line 43, in run
    with open(self.filename, 'r') as file_to_check:
TypeError: expected str, bytes or os.PathLike object, not TextIOWrapper

SublimeLinter: #3 linter.py:1231      flake8: output:
  -------------------
  <_io.TextIOWrapper name='<stdin>' mode='r' encoding='utf-8'>
  -------------------
SublimeLinter: #3 linter.py:1271      flake8: No matches for regex: ^.+?:(?P<line>\d+):(?P<col>\d+): (?:(?P<error>(?:F(?:40[24]|8(?:12|2[123]|31))|E(?:11[23]|90[12]|999)))|(?P<warning>\w+\d+):?) (?P<message>.*)
SublimeLinter: sublime_linter.py:593  Linting 'db.py' took 0.32s

Settings:

{
	"debug": true,

	"linters": {
        // The name of the linter you installed
        "flake8": {
            // Disables the linter. The default here is 'not set'
            "disable": false,

            // Additional arguments for the command line. Either a string
            // or an array. If set to a string, we 'shlex.split' it*.
            // E.g. '--ignore D112' or ['--config', './.config/foo.ini']
            //
            // * Note: Use proper quoting around paths esp. on Windows!
            "args": [""],

            // Path to the executable to be used. Either a string or an
            // array. E.g. ['nvm', 'exec', '8.6', 'eslint']
            "executable": "/home/edvard_munch/programming/python/education-backend-master/venv/bin/flake8",

            // A modified runtime environment for the lint job. Settings here
            // override the default, inherited ENV.
            "env": {},

            // Exclude files that match the given pattern(s).
            "excludes": [],

            // Suppress errors that match the the given pattern(s).
            // Either a 'string' or an 'array'. Each input string is handled as
            // a case-insensitive regex pattern and matched against the
            // error_type, code, and message. If it matches, the error will be
            // thrown away.
            // E.g. ["warning: ", "W3\d\d: ", "missing <!DOCTYPE> declaration"]
            "filter_errors": [],

            // Lint mode determines when the linter is run. The linter setting
            // will take precedence over the global setting.
            "lint_mode": "background",

            // Determines for which views this linter will run.
            "selector": "",

            // A list of additional style definition blocks.
            "styles": [
                {
                    // Instead of 'types' you can specify error 'codes' for
                    // a style definition block
                    "codes": [""]
                }
            ],

            // The current working dir the lint job will run in.
            "working_dir": "$folder",

            // **Only valid for PythonLinter**
            // Specify which python to use. Either a number or full path
            // to a python binary. SL will then basically use 'python -m'
            // to run the linter.
            "python": 3,

            // **Only valid for NodeLinter**
            // If true, will *not* use a globally installed binary
            "disable_if_not_dependency": false
        }
    },
	
}

I've noticed the line cmd = ('flake8', '--format', 'default', '${args}', '-'). Didn't dig deep enough to know why '-' is needed here. When I've tried to remove '-', thinking it will make sublime linter construct the command without extra '-' being added. No, it's not not that simple. Though it looks like the flake8 command is ok in this case.

SublimeLinter: linter.py:1127         flake8: Checking lint mode 'background' vs lint reason 'on_modified'.  Ok.
SublimeLinter: sublime_linter.py:345  Delay linting 'db.py' for 0.0s
SublimeLinter: linter.py:1127         flake8: Checking lint mode 'background' vs lint reason 'on_save'.  Ok.
SublimeLinter: #17 linter.py:1144     flake8: linting 'db.py'
SublimeLinter: #17 linter.py:922      flake8: wanted executable is '/home/edvard_munch/programming/python/education-backend-master/venv/bin/flake8'
SublimeLinter: #17 linter.py:1704     Running ...

  /home/edvard_munch/programming/python/education-backend-master  (working dir)
  $ cat src/app/conf/db.py | /home/edvard_munch/programming/python/education-backend-master/venv/bin/flake8 --format default 

SublimeLinter: #17 linter.py:1231     flake8: output:
  :0:1: E902 FileNotFoundError: [Errno 2] No such file or directory: ''
SublimeLinter: #17 linter.py:1271     flake8: No matches for regex: ^.+?:(?P<line>\d+):(?P<col>\d+): (?:(?P<error>(?:F(?:40[24]|8(?:12|2[123]|31))|E(?:11[23]|90[12]|999)))|(?P<warning>\w+\d+):?) (?P<message>.*)
SublimeLinter: sublime_linter.py:593  Linting 'db.py' took 0.29s
@kaste
Copy link
Contributor

kaste commented Aug 9, 2022

The - indicates that flake8 should read from stdin.

The last line that throws shows flake8_mock.pyas the culprit. Probably remove that flake8 plugin. Which flake8 do you use here?

@edvard-munch
Copy link
Author

edvard-munch commented Aug 9, 2022

@kaste There is A LOT of flake8 plugins involved. I've just installed all of the requirements from this project - https://github.com/tough-dev-school/education-backend/blob/master/dev-requirements.txt

I'll try to delete the flake8 mock. Not sure if this is a right decision in the long term. If this plugin is in project's requirements it probably should be used.

@edvard-munch
Copy link
Author

With flake8 mock uninstalled the error is now in flake8 pytest

SublimeLinter: linter.py:1127         flake8: Checking lint mode 'background' vs lint reason 'on_modified'.  Ok.
SublimeLinter: sublime_linter.py:345  Delay linting 'linter.py' for 0.0s
SublimeLinter: linter.py:1127         flake8: Checking lint mode 'background' vs lint reason 'on_save'.  Ok.
SublimeLinter: #31 linter.py:1144     flake8: linting 'linter.py'
SublimeLinter: #31 linter.py:922      flake8: wanted executable is '/home/edvard_munch/programming/python/education-backend-master/venv/bin/flake8'
SublimeLinter: #31 linter.py:1704     Running ...

  /home/edvard_munch/.config/sublime-text  (working dir)
  $ cat Packages/SublimeLinter-flake8/linter.py | /home/edvard_munch/programming/python/education-backend-master/venv/bin/flake8 --format default  -

reloading python 3.3 plugin SublimeLinter-flake8.linter
SublimeLinter: sublime_linter.py:345  Delay linting 'linter.py' for 0.0s
SublimeLinter: sublime_linter.py:345  Delay linting 'linter.py' for 0.0s
SublimeLinter: sublime_linter.py:345  Delay linting 'db.py' for 0.0s
SublimeLinter: linter.py:648          flake8 linter reloaded
SublimeLinter: linter.py:1111         flake8: Unknown reason 'relint_views' is okay.
SublimeLinter: linter.py:1111         flake8: Unknown reason 'relint_views' is okay.
SublimeLinter: linter.py:1111         flake8: Unknown reason 'relint_views' is okay.
SublimeLinter: sublime_linter.py:396  Friendly terminate: <pid 19488>
SublimeLinter: sublime_linter.py:593  Linting 'linter.py' took 0.11s
SublimeLinter: #33 linter.py:1144     flake8: linting 'linter.py'
SublimeLinter: #32 linter.py:1144     flake8: linting 'linter.py'
SublimeLinter: #33 linter.py:922      flake8: wanted executable is '/home/edvard_munch/programming/python/education-backend-master/venv/bin/flake8'
SublimeLinter: #32 linter.py:922      flake8: wanted executable is '/home/edvard_munch/programming/python/education-backend-master/venv/bin/flake8'
SublimeLinter: #34 linter.py:1144     flake8: linting 'db.py'
SublimeLinter: #34 linter.py:922      flake8: wanted executable is '/home/edvard_munch/programming/python/education-backend-master/venv/bin/flake8'
SublimeLinter: #32 linter.py:1704     Running ...

  /home/edvard_munch/.config/sublime-text  (working dir)
  $ cat Packages/SublimeLinter-flake8/linter.py | /home/edvard_munch/programming/python/education-backend-master/venv/bin/flake8 --format default  -

SublimeLinter: #33 linter.py:1704     Running ...

  /home/edvard_munch/.config/sublime-text  (working dir)
  $ cat Packages/SublimeLinter/lint/linter.py | /home/edvard_munch/programming/python/education-backend-master/venv/bin/flake8 --format default  -

SublimeLinter: #34 linter.py:1704     Running ...

  /home/edvard_munch/programming/python/education-backend-master  (working dir)
  $ cat src/app/conf/db.py | /home/edvard_munch/programming/python/education-backend-master/venv/bin/flake8 --format default  -

SublimeLinter: #32 linter.py:62       ERROR: Traceback (most recent call last):
  File "/home/edvard_munch/programming/python/education-backend-master/venv/bin/flake8", line 8, in <module>
    sys.exit(main())
  File "/home/edvard_munch/programming/python/education-backend-master/venv/lib/python3.10/site-packages/flake8/main/cli.py", line 22, in main
    app.run(argv)
  File "/home/edvard_munch/programming/python/education-backend-master/venv/lib/python3.10/site-packages/flake8/main/application.py", line 363, in run
    self._run(argv)
  File "/home/edvard_munch/programming/python/education-backend-master/venv/lib/python3.10/site-packages/flake8/main/application.py", line 351, in _run
    self.run_checks()
  File "/home/edvard_munch/programming/python/education-backend-master/venv/lib/python3.10/site-packages/flake8/main/application.py", line 264, in run_checks
    self.file_checker_manager.run()
  File "/home/edvard_munch/programming/python/education-backend-master/venv/lib/python3.10/site-packages/flake8/checker.py", line 323, in run
    self.run_serial()
  File "/home/edvard_munch/programming/python/education-backend-master/venv/lib/python3.10/site-packages/flake8/checker.py", line 307, in run_serial
    checker.run_checks()
  File "/home/edvard_munch/programming/python/education-backend-master/venv/lib/python3.10/site-packages/flake8/checker.py", line 589, in run_checks
    self.run_ast_checks()
  File "/home/edvard_munch/programming/python/education-backend-master/venv/lib/python3.10/site-packages/flake8/checker.py", line 494, in run_ast_checks
    for (line_number, offset, text, _) in runner:
  File "/home/edvard_munch/programming/python/education-backend-master/venv/lib/python3.10/site-packages/flake8_pytest.py", line 30, in run
    noqa = _get_noqa_lines(self.filename)
  File "/home/edvard_munch/programming/python/education-backend-master/venv/lib/python3.10/site-packages/flake8_pytest.py", line 51, in _get_noqa_lines
    tokens = tokenize.generate_tokens(lambda L=iter(code): next(L))
ValueError: I/O operation on closed file.

SublimeLinter: #32 linter.py:1225     flake8: no output
SublimeLinter: sublime_linter.py:593  Linting 'linter.py' took 0.49s

@kaste
Copy link
Contributor

kaste commented Aug 9, 2022

Very unfortunate. These plugins and dependencies are pretty outdated as it seems. They don't support stdin input which is a normal feature of flake8 we require here as otherwise we can't run while you're typing in the editor. Actually your teachers should update the educational project; they pin flake8 to 3.x although we're on 5.x already and imo all plugins to flake8 should be selected so they support all common core feature of flake8.

Unfortunately it is not pluggable here to run on stdin or only on save where we could use the normal file names as on the CLI. The safer, defensive approach from our side would be to support that and maybe automatically switch operation modes here. (Actually #106 would do this if you switch the lint_mode to on_save as well.)

Honestly, it is not clear why an educational, beginner project should need that many dependencies IMO. dependencies need to get managed which just adds more work to the teachers.

@kaste
Copy link
Contributor

kaste commented Aug 9, 2022

TLDR; we require from flake8 more feature than we need as a bare minimum. they ("you" or your teachers) pin to flake8 plugins not fully supporting the flake8 standard feature set.

@edvard-munch
Copy link
Author

@kaste oh, thanks. It's not really an educational project. Name is kinda misleading. It's a project for an educational web-site where you can buy courses etc.

It's started working perfectly, when I deleted flake8-pytest

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Development

No branches or pull requests

2 participants