Skip to content

Commit 49106b0

Browse files
authored
Return ignore_hidden functionality (#573)
Will be deprecated in the next major release.
1 parent 8beb96f commit 49106b0

3 files changed

Lines changed: 56 additions & 2 deletions

File tree

mkdocs_simple_plugin/plugin.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ class SimplePlugin(BasePlugin):
148148
('ignore_hidden', config_options.Deprecated(
149149
moved_to=None,
150150
message="Common ignore files have been added to 'ignore' instead",
151-
removed=True)),
151+
removed=False)),
152152
#
153153
# ### merge_docs_dir
154154
#

mkdocs_simple_plugin/simple.py

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import fnmatch
33
import os
44
import pathlib
5+
import stat
56

67
from shutil import copy2 as copy
78
from dataclasses import dataclass
@@ -29,6 +30,7 @@ def __init__(
2930
folders: list,
3031
include: list,
3132
ignore: list,
33+
ignore_hidden: bool,
3234
ignore_paths: list,
3335
semiliterate: list,
3436
**kwargs):
@@ -39,6 +41,7 @@ def __init__(
3941
folders (list): Glob of folders to search for files
4042
include (list): Glob of filenames to copy directly to output
4143
ignore (list): Glob of paths to exclude
44+
ignore_hidden (bool): Whether to ignore hidden files for processing
4245
ignore_paths (list): Absolute filepaths to exclude
4346
semiliterate (list): Settings for processing file content in
4447
Semiliterate
@@ -48,6 +51,8 @@ def __init__(
4851
self.folders = set(folders)
4952
self.doc_glob = set(include)
5053
self.ignore_glob = set(ignore)
54+
self.ignore_hidden = ignore_hidden # to be deprecated
55+
self.hidden_prefix = set([".", "__"]) # to be deprecated
5156
self.ignore_paths = set(ignore_paths)
5257
self.semiliterate = []
5358
for item in semiliterate:
@@ -118,14 +123,37 @@ def match_pattern(name, pattern):
118123

119124
def should_extract_file(self, name: str):
120125
"""Check if file should be extracted."""
126+
def has_hidden_attribute(filepath):
127+
"""Returns true if hidden attribute is set."""
128+
try:
129+
return bool(os.stat(filepath).st_file_attributes &
130+
stat.FILE_ATTRIBUTE_HIDDEN)
131+
except (AttributeError, AssertionError):
132+
return False
133+
134+
def has_hidden_prefix(filepath):
135+
"""Returns true if the file starts with a hidden prefix."""
136+
parts = filepath.split(os.path.sep)
137+
138+
def hidden_prefix(name):
139+
if name == ".":
140+
return False
141+
return any(name.startswith(pattern)
142+
for pattern in self.hidden_prefix)
143+
return any(hidden_prefix(part) for part in parts)
121144
# Check if file is text based
122145
try:
123146
with open(name, 'r', encoding='utf-8') as f:
124147
_ = f.read()
125-
return True
126148
except UnicodeDecodeError:
127149
return False
128150

151+
# Check if file is hidden and should ignore
152+
if self.ignore_hidden:
153+
is_hidden = has_hidden_prefix(name) or has_hidden_attribute(name)
154+
return not is_hidden
155+
return True
156+
129157
def merge_docs(self, from_dir, dirty=False):
130158
"""Merge docs directory"""
131159
if not os.path.exists(from_dir):

tests/test_simple.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
#!/usr/bin/env python
22
"""Test mkdocs_simple_plugin.simple"""
33
import unittest
4+
from unittest.mock import patch
5+
import stat
46
import os
57

68
from pyfakefs.fake_filesystem_unittest import TestCase
@@ -18,6 +20,7 @@ def setUp(self) -> None:
1820
"folders": ["*"],
1921
"ignore": [],
2022
"include": ["*.md"],
23+
"ignore_hidden": True,
2124
"ignore_paths": [],
2225
"semiliterate": {}
2326
}
@@ -36,6 +39,29 @@ def test_should_extract_file(self):
3639
# Test text file
3740
self.assertTrue(simple_test.should_extract_file("example.md"))
3841

42+
@patch("os.stat")
43+
def test_ignore_hidden(self, os_stat):
44+
"""Test should_extract_file for correctness."""
45+
simple_test = simple.Simple(**self.default_settings)
46+
# Check ignore_hidden
47+
simple_test.ignore_hidden = True
48+
os_stat.return_value.st_file_attributes = 0
49+
self.fs.create_file("test.md", contents="Hello_word")
50+
self.assertTrue(simple_test.should_extract_file('test.md'))
51+
self.fs.create_file("folder/test.md", contents="Hello_word")
52+
self.assertTrue(simple_test.should_extract_file('./folder/test.md'))
53+
self.fs.create_file("__pycache__")
54+
self.assertFalse(simple_test.should_extract_file('__pycache__'))
55+
self.fs.create_file(".mkdocsignore")
56+
self.assertFalse(simple_test.should_extract_file('.mkdocsignore'))
57+
self.fs.create_file(".git/objects/34/49807110bdc8")
58+
self.assertFalse(simple_test.should_extract_file(
59+
".git/objects/34/49807110bdc8"))
60+
# Check hidden file attribute
61+
self.fs.create_file("/test/file")
62+
os_stat.return_value.st_file_attributes = stat.FILE_ATTRIBUTE_HIDDEN
63+
self.assertFalse(simple_test.should_extract_file('/test/file'))
64+
3965
def test_ignored_default(self):
4066
"""Test ignored files."""
4167
simple_test = simple.Simple(**self.default_settings)

0 commit comments

Comments
 (0)