diff --git a/docgen.sh b/docgen.sh
index 6966b89a..e515fb40 100755
--- a/docgen.sh
+++ b/docgen.sh
@@ -17,6 +17,7 @@ pydocmd simple jc.parsers.csv+ > ../docs/parsers/csv.md
pydocmd simple jc.parsers.date+ > ../docs/parsers/date.md
pydocmd simple jc.parsers.df+ > ../docs/parsers/df.md
pydocmd simple jc.parsers.dig+ > ../docs/parsers/dig.md
+pydocmd simple jc.parsers.dir+ > ../docs/parsers/dir.md
pydocmd simple jc.parsers.dmidecode+ > ../docs/parsers/dmidecode.md
pydocmd simple jc.parsers.dpkg_l+ > ../docs/parsers/dpkg_l.md
pydocmd simple jc.parsers.du+ > ../docs/parsers/du.md
diff --git a/docs/parsers/dir.md b/docs/parsers/dir.md
new file mode 100644
index 00000000..c84b3334
--- /dev/null
+++ b/docs/parsers/dir.md
@@ -0,0 +1,290 @@
+
+# jc.parsers.dir
+jc - JSON CLI output utility `dir` command output parser
+
+Options supported:
+- `/T timefield`
+- `/O sortorder`
+- `/C, /-C`
+
+Usage (cli):
+
+ $ dir | jc --dir -p -m
+
+ or
+
+ $ jc -p -m dir
+
+Usage (module):
+
+ import jc.parsers.dir
+ result = jc.parsers.dir.parse(dir_command_output)
+
+Compatibility:
+
+ 'win32'
+
+Examples:
+
+ $ dir | jc --dir -p -m
+ {
+ "C:\Program Files\Internet Explorer": [
+ {
+ "date": "03/24/2021",
+ "time": "03:15 PM",
+ "dir": true,
+ "size": null,
+ "filename": "."
+ },
+ {
+ "date": "03/24/2021",
+ "time": "03:15 PM",
+ "dir": true,
+ "size": null,
+ "filename": ".."
+ },
+ {
+ "date": "12/07/2019",
+ "time": "02:49 AM",
+ "dir": true,
+ "size": null,
+ "filename": "en-US"
+ },
+ {
+ "date": "12/07/2019",
+ "time": "02:09 AM",
+ "dir": false,
+ "size": 54784,
+ "filename": "ExtExport.exe"
+ },
+ {
+ "date": "03/24/2021",
+ "time": "03:15 PM",
+ "dir": false,
+ "size": 0,
+ "filename": "file name.txt"
+ },
+ {
+ "date": "12/07/2019",
+ "time": "02:09 AM",
+ "dir": false,
+ "size": 54784,
+ "filename": "hmmapi.dll"
+ },
+ {
+ "date": "12/07/2019",
+ "time": "02:09 AM",
+ "dir": false,
+ "size": 515072,
+ "filename": "iediagcmd.exe"
+ },
+ {
+ "date": "12/07/2019",
+ "time": "02:09 AM",
+ "dir": false,
+ "size": 504832,
+ "filename": "ieinstal.exe"
+ },
+ {
+ "date": "12/07/2019",
+ "time": "02:09 AM",
+ "dir": false,
+ "size": 224768,
+ "filename": "ielowutil.exe"
+ },
+ {
+ "date": "12/07/2019",
+ "time": "02:09 AM",
+ "dir": false,
+ "size": 421888,
+ "filename": "IEShims.dll"
+ },
+ {
+ "date": "12/06/2019",
+ "time": "02:47 PM",
+ "dir": false,
+ "size": 819136,
+ "filename": "iexplore.exe"
+ },
+ {
+ "date": "12/07/2019",
+ "time": "02:14 AM",
+ "dir": true,
+ "size": null,
+ "filename": "images"
+ },
+ {
+ "date": "12/07/2019",
+ "time": "02:14 AM",
+ "dir": true,
+ "size": null,
+ "filename": "SIGNUP"
+ },
+ {
+ "date": "12/07/2019",
+ "time": "02:09 AM",
+ "dir": false,
+ "size": 48536,
+ "filename": "sqmapi.dll"
+ }
+ ]
+ }
+
+
+ $ dir | jc --dir -p -m -r
+ {
+ "C:\Program Files\Internet Explorer": [
+ {
+ "date": "03/24/2021",
+ "time": "03:15 PM",
+ "dir": true,
+ "size": null,
+ "filename": "."
+ },
+ {
+ "date": "03/24/2021",
+ "time": "03:15 PM",
+ "dir": true,
+ "size": null,
+ "filename": ".."
+ },
+ {
+ "date": "12/07/2019",
+ "time": "02:49 AM",
+ "dir": true,
+ "size": null,
+ "filename": "en-US"
+ },
+ {
+ "date": "12/07/2019",
+ "time": "02:09 AM",
+ "dir": false,
+ "size": "54,784",
+ "filename": "ExtExport.exe"
+ },
+ {
+ "date": "03/24/2021",
+ "time": "03:15 PM",
+ "dir": false,
+ "size": "0",
+ "filename": "file name.txt"
+ },
+ {
+ "date": "12/07/2019",
+ "time": "02:09 AM",
+ "dir": false,
+ "size": "54,784",
+ "filename": "hmmapi.dll"
+ },
+ {
+ "date": "12/07/2019",
+ "time": "02:09 AM",
+ "dir": false,
+ "size": "515,072",
+ "filename": "iediagcmd.exe"
+ },
+ {
+ "date": "12/07/2019",
+ "time": "02:09 AM",
+ "dir": false,
+ "size": "504,832",
+ "filename": "ieinstal.exe"
+ },
+ {
+ "date": "12/07/2019",
+ "time": "02:09 AM",
+ "dir": false,
+ "size": "224,768",
+ "filename": "ielowutil.exe"
+ },
+ {
+ "date": "12/07/2019",
+ "time": "02:09 AM",
+ "dir": false,
+ "size": "421,888",
+ "filename": "IEShims.dll"
+ },
+ {
+ "date": "12/06/2019",
+ "time": "02:47 PM",
+ "dir": false,
+ "size": "819,136",
+ "filename": "iexplore.exe"
+ },
+ {
+ "date": "12/07/2019",
+ "time": "02:14 AM",
+ "dir": true,
+ "size": null,
+ "filename": "images"
+ },
+ {
+ "date": "12/07/2019",
+ "time": "02:14 AM",
+ "dir": true,
+ "size": null,
+ "filename": "SIGNUP"
+ },
+ {
+ "date": "12/07/2019",
+ "time": "02:09 AM",
+ "dir": false,
+ "size": "48,536",
+ "filename": "sqmapi.dll"
+ }
+ ]
+ }
+
+
+
+## info
+```python
+info()
+```
+
+
+## process
+```python
+process(proc_data)
+```
+
+Final processing to conform to the schema.
+
+Parameters:
+
+ proc_data: (Dictionary of Lists) raw structured data to process
+
+Returns:
+
+ List of Dictionaries. Structured data with the following schema:
+ {"parent_dir":
+ [
+ {
+ "date": string,
+ "time": string,
+ "dir": string,
+ "size": integer,
+ "filename: string
+ }
+ ]
+ }
+
+
+## parse
+```python
+parse(data, raw=False, quiet=False)
+```
+
+Main text parsing function
+
+Parameters:
+
+ data: (string) text data to parse
+ raw: (boolean) output preprocessed JSON if True
+ quiet: (boolean) suppress warning messages if True
+
+Returns:
+
+ List of Dictionaries. Raw or processed structured data.
+
+
diff --git a/jc/cli.py b/jc/cli.py
index d66572b9..3e267bcc 100644
--- a/jc/cli.py
+++ b/jc/cli.py
@@ -50,6 +50,7 @@ parsers = [
'date',
'df',
'dig',
+ 'dir',
'dmidecode',
'dpkg-l',
'du',
diff --git a/jc/parsers/dir.py b/jc/parsers/dir.py
new file mode 100644
index 00000000..bd42622e
--- /dev/null
+++ b/jc/parsers/dir.py
@@ -0,0 +1,342 @@
+"""jc - JSON CLI output utility `dir` command output parser
+
+Options supported:
+- `/T timefield`
+- `/O sortorder`
+- `/C, /-C`
+- `/S`
+
+Usage (cli):
+
+ $ dir | jc --dir -p -m
+
+ or
+
+ $ jc -p -m dir
+
+Usage (module):
+
+ import jc.parsers.dir
+ result = jc.parsers.dir.parse(dir_command_output)
+
+Compatibility:
+
+ 'win32'
+
+Examples:
+
+ $ dir | jc --dir -p -m
+ {
+ "C:\\Program Files\\Internet Explorer": [
+ {
+ "date": "03/24/2021",
+ "time": "03:15 PM",
+ "dir": true,
+ "size": null,
+ "filename": "."
+ },
+ {
+ "date": "03/24/2021",
+ "time": "03:15 PM",
+ "dir": true,
+ "size": null,
+ "filename": ".."
+ },
+ {
+ "date": "12/07/2019",
+ "time": "02:49 AM",
+ "dir": true,
+ "size": null,
+ "filename": "en-US"
+ },
+ {
+ "date": "12/07/2019",
+ "time": "02:09 AM",
+ "dir": false,
+ "size": 54784,
+ "filename": "ExtExport.exe"
+ },
+ {
+ "date": "03/24/2021",
+ "time": "03:15 PM",
+ "dir": false,
+ "size": 0,
+ "filename": "file name.txt"
+ },
+ {
+ "date": "12/07/2019",
+ "time": "02:09 AM",
+ "dir": false,
+ "size": 54784,
+ "filename": "hmmapi.dll"
+ },
+ {
+ "date": "12/07/2019",
+ "time": "02:09 AM",
+ "dir": false,
+ "size": 515072,
+ "filename": "iediagcmd.exe"
+ },
+ {
+ "date": "12/07/2019",
+ "time": "02:09 AM",
+ "dir": false,
+ "size": 504832,
+ "filename": "ieinstal.exe"
+ },
+ {
+ "date": "12/07/2019",
+ "time": "02:09 AM",
+ "dir": false,
+ "size": 224768,
+ "filename": "ielowutil.exe"
+ },
+ {
+ "date": "12/07/2019",
+ "time": "02:09 AM",
+ "dir": false,
+ "size": 421888,
+ "filename": "IEShims.dll"
+ },
+ {
+ "date": "12/06/2019",
+ "time": "02:47 PM",
+ "dir": false,
+ "size": 819136,
+ "filename": "iexplore.exe"
+ },
+ {
+ "date": "12/07/2019",
+ "time": "02:14 AM",
+ "dir": true,
+ "size": null,
+ "filename": "images"
+ },
+ {
+ "date": "12/07/2019",
+ "time": "02:14 AM",
+ "dir": true,
+ "size": null,
+ "filename": "SIGNUP"
+ },
+ {
+ "date": "12/07/2019",
+ "time": "02:09 AM",
+ "dir": false,
+ "size": 48536,
+ "filename": "sqmapi.dll"
+ }
+ ]
+ }
+
+
+ $ dir | jc --dir -p -m -r
+ {
+ "C:\\Program Files\\Internet Explorer": [
+ {
+ "date": "03/24/2021",
+ "time": "03:15 PM",
+ "dir": true,
+ "size": null,
+ "filename": "."
+ },
+ {
+ "date": "03/24/2021",
+ "time": "03:15 PM",
+ "dir": true,
+ "size": null,
+ "filename": ".."
+ },
+ {
+ "date": "12/07/2019",
+ "time": "02:49 AM",
+ "dir": true,
+ "size": null,
+ "filename": "en-US"
+ },
+ {
+ "date": "12/07/2019",
+ "time": "02:09 AM",
+ "dir": false,
+ "size": "54,784",
+ "filename": "ExtExport.exe"
+ },
+ {
+ "date": "03/24/2021",
+ "time": "03:15 PM",
+ "dir": false,
+ "size": "0",
+ "filename": "file name.txt"
+ },
+ {
+ "date": "12/07/2019",
+ "time": "02:09 AM",
+ "dir": false,
+ "size": "54,784",
+ "filename": "hmmapi.dll"
+ },
+ {
+ "date": "12/07/2019",
+ "time": "02:09 AM",
+ "dir": false,
+ "size": "515,072",
+ "filename": "iediagcmd.exe"
+ },
+ {
+ "date": "12/07/2019",
+ "time": "02:09 AM",
+ "dir": false,
+ "size": "504,832",
+ "filename": "ieinstal.exe"
+ },
+ {
+ "date": "12/07/2019",
+ "time": "02:09 AM",
+ "dir": false,
+ "size": "224,768",
+ "filename": "ielowutil.exe"
+ },
+ {
+ "date": "12/07/2019",
+ "time": "02:09 AM",
+ "dir": false,
+ "size": "421,888",
+ "filename": "IEShims.dll"
+ },
+ {
+ "date": "12/06/2019",
+ "time": "02:47 PM",
+ "dir": false,
+ "size": "819,136",
+ "filename": "iexplore.exe"
+ },
+ {
+ "date": "12/07/2019",
+ "time": "02:14 AM",
+ "dir": true,
+ "size": null,
+ "filename": "images"
+ },
+ {
+ "date": "12/07/2019",
+ "time": "02:14 AM",
+ "dir": true,
+ "size": null,
+ "filename": "SIGNUP"
+ },
+ {
+ "date": "12/07/2019",
+ "time": "02:09 AM",
+ "dir": false,
+ "size": "48,536",
+ "filename": "sqmapi.dll"
+ }
+ ]
+ }
+
+"""
+import re
+import jc.utils
+
+
+class info():
+ version = '1.0'
+ description = 'dir command parser'
+ author = 'Rasheed Elsaleh'
+ author_email = 'rasheed@rebelliondefense.com'
+
+ # compatible options: win32
+ compatible = ['win32']
+ magic_commands = ['dir']
+
+
+__version__ = info.version
+
+
+def process(proc_data):
+ """
+ Final processing to conform to the schema.
+
+ Parameters:
+
+ proc_data: (Dictionary of Lists) raw structured data to process
+
+ Returns:
+
+ List of Dictionaries. Structured data with the following schema:
+ {"parent_dir":
+ [
+ {
+ "date": string,
+ "time": string,
+ "dir": string,
+ "size": integer,
+ "filename: string
+ }
+ ]
+ }
+ """
+
+ for _, dir_list in proc_data.items():
+ for entry in dir_list:
+ int_list = ["size"]
+ for key in int_list:
+ if entry.get(key):
+ try:
+ key_int = int(entry[key].replace(",", ""))
+ except ValueError:
+ entry[key] = None
+ else:
+ entry[key] = key_int
+ return proc_data
+
+
+def parse(data, raw=False, quiet=False):
+ """
+ Main text parsing function
+
+ Parameters:
+
+ data: (string) text data to parse
+ raw: (boolean) output preprocessed JSON if True
+ quiet: (boolean) suppress warning messages if True
+
+ Returns:
+
+ List of Dictionaries. Raw or processed structured data.
+
+ """
+ if not quiet:
+ jc.utils.compatibility(__name__, info.compatible)
+
+ raw_output = {}
+
+ if jc.utils.has_data(data):
+
+ for line in data.splitlines():
+ if line.startswith(" Directory of"):
+ parent_dir = line.lstrip(" Directory of ")
+ continue
+ # skip lines that don't start with a date
+ if not re.match(r'^\d{2}/\d{2}/\d{4}', line):
+ continue
+
+ raw_output.setdefault(parent_dir, [])
+ output_line = {}
+ parsed_line = line.split()
+ output_line["date"] = parsed_line[0]
+ output_line["time"] = " ".join(parsed_line[1:3])
+ output_line.setdefault("dir", False)
+ output_line.setdefault("size", None)
+ if parsed_line[3] == "
":
+ output_line["dir"] = True
+ else:
+ output_line["size"] = parsed_line[3]
+
+ output_line["filename"] = " ".join(parsed_line[4:])
+ raw_output[parent_dir].append(output_line)
+
+ if raw:
+ return raw_output
+ else:
+ return process(raw_output)
diff --git a/tests/fixtures/windows-10/dir-C.json b/tests/fixtures/windows-10/dir-C.json
new file mode 100644
index 00000000..082d217a
--- /dev/null
+++ b/tests/fixtures/windows-10/dir-C.json
@@ -0,0 +1 @@
+{"C:\\Program Files\\Internet Explorer": [{"date": "03/24/2021", "time": "03:15 PM", "dir": true, "size": null, "filename": "."}, {"date": "03/24/2021", "time": "03:15 PM", "dir": true, "size": null, "filename": ".."}, {"date": "12/07/2019", "time": "02:49 AM", "dir": true, "size": null, "filename": "en-US"}, {"date": "12/07/2019", "time": "02:09 AM", "dir": false, "size": 54784, "filename": "ExtExport.exe"}, {"date": "03/24/2021", "time": "03:15 PM", "dir": false, "size": 0, "filename": "file name.txt"}, {"date": "12/07/2019", "time": "02:09 AM", "dir": false, "size": 54784, "filename": "hmmapi.dll"}, {"date": "12/07/2019", "time": "02:09 AM", "dir": false, "size": 515072, "filename": "iediagcmd.exe"}, {"date": "12/07/2019", "time": "02:09 AM", "dir": false, "size": 504832, "filename": "ieinstal.exe"}, {"date": "12/07/2019", "time": "02:09 AM", "dir": false, "size": 224768, "filename": "ielowutil.exe"}, {"date": "12/07/2019", "time": "02:09 AM", "dir": false, "size": 421888, "filename": "IEShims.dll"}, {"date": "12/06/2019", "time": "02:47 PM", "dir": false, "size": 819136, "filename": "iexplore.exe"}, {"date": "12/07/2019", "time": "02:14 AM", "dir": true, "size": null, "filename": "images"}, {"date": "12/07/2019", "time": "02:14 AM", "dir": true, "size": null, "filename": "SIGNUP"}, {"date": "12/07/2019", "time": "02:09 AM", "dir": false, "size": 48536, "filename": "sqmapi.dll"}]}
\ No newline at end of file
diff --git a/tests/fixtures/windows-10/dir-C.out b/tests/fixtures/windows-10/dir-C.out
new file mode 100644
index 00000000..42bc4e19
--- /dev/null
+++ b/tests/fixtures/windows-10/dir-C.out
@@ -0,0 +1,21 @@
+ Volume in drive C has no label.
+ Volume Serial Number is 246B-3B5A
+
+ Directory of C:\Program Files\Internet Explorer
+
+03/24/2021 03:15 PM .
+03/24/2021 03:15 PM ..
+12/07/2019 02:49 AM en-US
+12/07/2019 02:09 AM 54784 ExtExport.exe
+03/24/2021 03:15 PM 0 file name.txt
+12/07/2019 02:09 AM 54784 hmmapi.dll
+12/07/2019 02:09 AM 515072 iediagcmd.exe
+12/07/2019 02:09 AM 504832 ieinstal.exe
+12/07/2019 02:09 AM 224768 ielowutil.exe
+12/07/2019 02:09 AM 421888 IEShims.dll
+12/06/2019 02:47 PM 819136 iexplore.exe
+12/07/2019 02:14 AM images
+12/07/2019 02:14 AM SIGNUP
+12/07/2019 02:09 AM 48536 sqmapi.dll
+ 9 File(s) 2643800 bytes
+ 5 Dir(s) 36206153728 bytes free
diff --git a/tests/fixtures/windows-10/dir-ODTC.json b/tests/fixtures/windows-10/dir-ODTC.json
new file mode 100644
index 00000000..7a561b64
--- /dev/null
+++ b/tests/fixtures/windows-10/dir-ODTC.json
@@ -0,0 +1 @@
+{"C:\\Program Files\\Internet Explorer": [{"date": "12/07/2019", "time": "02:09 AM", "dir": false, "size": 54784, "filename": "hmmapi.dll"}, {"date": "12/07/2019", "time": "02:09 AM", "dir": false, "size": 224768, "filename": "ielowutil.exe"}, {"date": "12/07/2019", "time": "02:09 AM", "dir": false, "size": 54784, "filename": "ExtExport.exe"}, {"date": "12/07/2019", "time": "02:09 AM", "dir": false, "size": 515072, "filename": "iediagcmd.exe"}, {"date": "12/07/2019", "time": "02:09 AM", "dir": false, "size": 421888, "filename": "IEShims.dll"}, {"date": "12/07/2019", "time": "02:09 AM", "dir": false, "size": 504832, "filename": "ieinstal.exe"}, {"date": "12/07/2019", "time": "02:09 AM", "dir": false, "size": 48536, "filename": "sqmapi.dll"}, {"date": "12/07/2019", "time": "02:14 AM", "dir": true, "size": null, "filename": "images"}, {"date": "12/07/2019", "time": "02:14 AM", "dir": true, "size": null, "filename": ".."}, {"date": "12/07/2019", "time": "02:14 AM", "dir": true, "size": null, "filename": "SIGNUP"}, {"date": "12/07/2019", "time": "02:14 AM", "dir": true, "size": null, "filename": "."}, {"date": "12/07/2019", "time": "02:49 AM", "dir": true, "size": null, "filename": "en-US"}, {"date": "12/07/2019", "time": "02:49 AM", "dir": false, "size": 819136, "filename": "iexplore.exe"}, {"date": "03/24/2021", "time": "03:15 PM", "dir": false, "size": 0, "filename": "file name.txt"}]}
\ No newline at end of file
diff --git a/tests/fixtures/windows-10/dir-ODTC.out b/tests/fixtures/windows-10/dir-ODTC.out
new file mode 100644
index 00000000..431dd8f4
--- /dev/null
+++ b/tests/fixtures/windows-10/dir-ODTC.out
@@ -0,0 +1,21 @@
+ Volume in drive C has no label.
+ Volume Serial Number is 246B-3B5A
+
+ Directory of C:\Program Files\Internet Explorer
+
+12/07/2019 02:09 AM 54,784 hmmapi.dll
+12/07/2019 02:09 AM 224,768 ielowutil.exe
+12/07/2019 02:09 AM 54,784 ExtExport.exe
+12/07/2019 02:09 AM 515,072 iediagcmd.exe
+12/07/2019 02:09 AM 421,888 IEShims.dll
+12/07/2019 02:09 AM 504,832 ieinstal.exe
+12/07/2019 02:09 AM 48,536 sqmapi.dll
+12/07/2019 02:14 AM images
+12/07/2019 02:14 AM ..
+12/07/2019 02:14 AM SIGNUP
+12/07/2019 02:14 AM .
+12/07/2019 02:49 AM en-US
+12/07/2019 02:49 AM 819,136 iexplore.exe
+03/24/2021 03:15 PM 0 file name.txt
+ 9 File(s) 2,643,800 bytes
+ 5 Dir(s) 35,231,817,728 bytes free
diff --git a/tests/fixtures/windows-10/dir-S.json b/tests/fixtures/windows-10/dir-S.json
new file mode 100644
index 00000000..d17d89f7
--- /dev/null
+++ b/tests/fixtures/windows-10/dir-S.json
@@ -0,0 +1 @@
+{"C:\\Program Files\\Internet Explorer": [{"date": "03/24/2021", "time": "03:15 PM", "dir": true, "size": null, "filename": "."}, {"date": "03/24/2021", "time": "03:15 PM", "dir": true, "size": null, "filename": ".."}, {"date": "12/07/2019", "time": "02:49 AM", "dir": true, "size": null, "filename": "en-US"}, {"date": "12/07/2019", "time": "02:09 AM", "dir": false, "size": 54784, "filename": "ExtExport.exe"}, {"date": "03/24/2021", "time": "03:15 PM", "dir": false, "size": 0, "filename": "file name.txt"}, {"date": "12/07/2019", "time": "02:09 AM", "dir": false, "size": 54784, "filename": "hmmapi.dll"}, {"date": "12/07/2019", "time": "02:09 AM", "dir": false, "size": 515072, "filename": "iediagcmd.exe"}, {"date": "12/07/2019", "time": "02:09 AM", "dir": false, "size": 504832, "filename": "ieinstal.exe"}, {"date": "12/07/2019", "time": "02:09 AM", "dir": false, "size": 224768, "filename": "ielowutil.exe"}, {"date": "12/07/2019", "time": "02:09 AM", "dir": false, "size": 421888, "filename": "IEShims.dll"}, {"date": "12/06/2019", "time": "02:47 PM", "dir": false, "size": 819136, "filename": "iexplore.exe"}, {"date": "12/07/2019", "time": "02:14 AM", "dir": true, "size": null, "filename": "images"}, {"date": "12/07/2019", "time": "02:14 AM", "dir": true, "size": null, "filename": "SIGNUP"}, {"date": "12/07/2019", "time": "02:09 AM", "dir": false, "size": 48536, "filename": "sqmapi.dll"}], "C:\\Program Files\\Internet Explorer\\en-US": [{"date": "12/07/2019", "time": "02:49 AM", "dir": true, "size": null, "filename": "."}, {"date": "12/07/2019", "time": "02:49 AM", "dir": true, "size": null, "filename": ".."}, {"date": "12/07/2019", "time": "02:48 AM", "dir": false, "size": 2560, "filename": "hmmapi.dll.mui"}, {"date": "12/07/2019", "time": "02:48 AM", "dir": false, "size": 2560, "filename": "ieinstal.exe.mui"}, {"date": "12/07/2019", "time": "02:48 AM", "dir": false, "size": 5632, "filename": "iexplore.exe.mui"}], "C:\\Program Files\\Internet Explorer\\images": [{"date": "12/07/2019", "time": "02:14 AM", "dir": true, "size": null, "filename": "."}, {"date": "12/07/2019", "time": "02:14 AM", "dir": true, "size": null, "filename": ".."}, {"date": "12/07/2019", "time": "02:09 AM", "dir": false, "size": 5430, "filename": "bing.ico"}], "C:\\Program Files\\Internet Explorer\\SIGNUP": [{"date": "12/07/2019", "time": "02:14 AM", "dir": true, "size": null, "filename": "."}, {"date": "12/07/2019", "time": "02:14 AM", "dir": true, "size": null, "filename": ".."}, {"date": "12/07/2019", "time": "02:12 AM", "dir": false, "size": 452, "filename": "install.ins"}]}
\ No newline at end of file
diff --git a/tests/fixtures/windows-10/dir-S.out b/tests/fixtures/windows-10/dir-S.out
new file mode 100644
index 00000000..3a09b5a7
--- /dev/null
+++ b/tests/fixtures/windows-10/dir-S.out
@@ -0,0 +1,47 @@
+ Volume in drive C has no label.
+ Volume Serial Number is 246B-3B5A
+
+ Directory of C:\Program Files\Internet Explorer
+
+03/24/2021 03:15 PM .
+03/24/2021 03:15 PM ..
+12/07/2019 02:49 AM en-US
+12/07/2019 02:09 AM 54,784 ExtExport.exe
+03/24/2021 03:15 PM 0 file name.txt
+12/07/2019 02:09 AM 54,784 hmmapi.dll
+12/07/2019 02:09 AM 515,072 iediagcmd.exe
+12/07/2019 02:09 AM 504,832 ieinstal.exe
+12/07/2019 02:09 AM 224,768 ielowutil.exe
+12/07/2019 02:09 AM 421,888 IEShims.dll
+12/06/2019 02:47 PM 819,136 iexplore.exe
+12/07/2019 02:14 AM images
+12/07/2019 02:14 AM SIGNUP
+12/07/2019 02:09 AM 48,536 sqmapi.dll
+ 9 File(s) 2,643,800 bytes
+
+ Directory of C:\Program Files\Internet Explorer\en-US
+
+12/07/2019 02:49 AM .
+12/07/2019 02:49 AM ..
+12/07/2019 02:48 AM 2,560 hmmapi.dll.mui
+12/07/2019 02:48 AM 2,560 ieinstal.exe.mui
+12/07/2019 02:48 AM 5,632 iexplore.exe.mui
+ 3 File(s) 10,752 bytes
+
+ Directory of C:\Program Files\Internet Explorer\images
+
+12/07/2019 02:14 AM .
+12/07/2019 02:14 AM ..
+12/07/2019 02:09 AM 5,430 bing.ico
+ 1 File(s) 5,430 bytes
+
+ Directory of C:\Program Files\Internet Explorer\SIGNUP
+
+12/07/2019 02:14 AM .
+12/07/2019 02:14 AM ..
+12/07/2019 02:12 AM 452 install.ins
+ 1 File(s) 452 bytes
+
+ Total Files Listed:
+ 14 File(s) 2,660,434 bytes
+ 11 Dir(s) 33,300,922,368 bytes free
diff --git a/tests/fixtures/windows-10/dir-dirs.json b/tests/fixtures/windows-10/dir-dirs.json
new file mode 100644
index 00000000..766d7551
--- /dev/null
+++ b/tests/fixtures/windows-10/dir-dirs.json
@@ -0,0 +1 @@
+{"C:\\Users\\Yoda\\Desktop\\jc\\docs": [{"date": "03/25/2021", "time": "02:36 PM", "dir": true, "size": null, "filename": "."}, {"date": "03/25/2021", "time": "02:36 PM", "dir": true, "size": null, "filename": ".."}, {"date": "03/25/2021", "time": "02:38 PM", "dir": true, "size": null, "filename": "parsers"}, {"date": "03/25/2021", "time": "02:36 PM", "dir": false, "size": 2713, "filename": "readme.md"}, {"date": "03/25/2021", "time": "02:36 PM", "dir": false, "size": 1338, "filename": "utils.md"}], "C:\\Users\\Yoda\\Desktop\\jc\\man": [{"date": "03/25/2021", "time": "02:36 PM", "dir": true, "size": null, "filename": "."}, {"date": "03/25/2021", "time": "02:36 PM", "dir": true, "size": null, "filename": ".."}, {"date": "03/25/2021", "time": "02:36 PM", "dir": false, "size": 4300, "filename": "jc.1"}]}
\ No newline at end of file
diff --git a/tests/fixtures/windows-10/dir-dirs.out b/tests/fixtures/windows-10/dir-dirs.out
new file mode 100644
index 00000000..70eac229
--- /dev/null
+++ b/tests/fixtures/windows-10/dir-dirs.out
@@ -0,0 +1,19 @@
+ Volume in drive C has no label.
+ Volume Serial Number is 246B-3B5A
+
+ Directory of C:\Users\Yoda\Desktop\jc\docs
+
+03/25/2021 02:36 PM .
+03/25/2021 02:36 PM ..
+03/25/2021 02:38 PM parsers
+03/25/2021 02:36 PM 2,713 readme.md
+03/25/2021 02:36 PM 1,338 utils.md
+ 2 File(s) 4,051 bytes
+
+ Directory of C:\Users\Yoda\Desktop\jc\man
+
+03/25/2021 02:36 PM .
+03/25/2021 02:36 PM ..
+03/25/2021 02:36 PM 4,300 jc.1
+ 1 File(s) 4,300 bytes
+ 2 Dir(s) 33,349,226,496 bytes free
diff --git a/tests/fixtures/windows-10/dir-files.json b/tests/fixtures/windows-10/dir-files.json
new file mode 100644
index 00000000..ced49261
--- /dev/null
+++ b/tests/fixtures/windows-10/dir-files.json
@@ -0,0 +1 @@
+{"C:\\Users\\Yoda\\Desktop\\jc": [{"date": "03/25/2021", "time": "02:38 PM", "dir": false, "size": 4253, "filename": "docgen.sh"}, {"date": "03/25/2021", "time": "02:36 PM", "dir": false, "size": 1088, "filename": "LICENSE.md"}, {"date": "03/25/2021", "time": "02:36 PM", "dir": false, "size": 27063, "filename": "README.md"}]}
\ No newline at end of file
diff --git a/tests/fixtures/windows-10/dir-files.out b/tests/fixtures/windows-10/dir-files.out
new file mode 100644
index 00000000..bd2fb796
--- /dev/null
+++ b/tests/fixtures/windows-10/dir-files.out
@@ -0,0 +1,16 @@
+ Volume in drive C has no label.
+ Volume Serial Number is 246B-3B5A
+
+ Directory of C:\Users\Yoda\Desktop\jc
+
+03/25/2021 02:38 PM 4,253 docgen.sh
+
+ Directory of C:\Users\Yoda\Desktop\jc
+
+03/25/2021 02:36 PM 1,088 LICENSE.md
+
+ Directory of C:\Users\Yoda\Desktop\jc
+
+03/25/2021 02:36 PM 27,063 README.md
+ 3 File(s) 32,404 bytes
+ 0 Dir(s) 33,349,652,480 bytes free
diff --git a/tests/fixtures/windows-10/dir-mix.json b/tests/fixtures/windows-10/dir-mix.json
new file mode 100644
index 00000000..c09c5e33
--- /dev/null
+++ b/tests/fixtures/windows-10/dir-mix.json
@@ -0,0 +1 @@
+{"C:\\Users\\Yoda\\Desktop\\jc": [{"date": "03/25/2021", "time": "02:38 PM", "dir": false, "size": 4253, "filename": "docgen.sh"}, {"date": "03/25/2021", "time": "02:38 PM", "dir": false, "size": 58995, "filename": "EXAMPLES.md"}], "C:\\Users\\Yoda\\Desktop\\jc\\docs": [{"date": "03/25/2021", "time": "02:36 PM", "dir": true, "size": null, "filename": "."}, {"date": "03/25/2021", "time": "02:36 PM", "dir": true, "size": null, "filename": ".."}, {"date": "03/25/2021", "time": "02:38 PM", "dir": true, "size": null, "filename": "parsers"}, {"date": "03/25/2021", "time": "02:36 PM", "dir": false, "size": 2713, "filename": "readme.md"}, {"date": "03/25/2021", "time": "02:36 PM", "dir": false, "size": 1338, "filename": "utils.md"}]}
\ No newline at end of file
diff --git a/tests/fixtures/windows-10/dir-mix.out b/tests/fixtures/windows-10/dir-mix.out
new file mode 100644
index 00000000..7302114e
--- /dev/null
+++ b/tests/fixtures/windows-10/dir-mix.out
@@ -0,0 +1,22 @@
+ Volume in drive C has no label.
+ Volume Serial Number is 246B-3B5A
+
+ Directory of C:\Users\Yoda\Desktop\jc
+
+03/25/2021 02:38 PM 4,253 docgen.sh
+ 1 File(s) 4,253 bytes
+
+ Directory of C:\Users\Yoda\Desktop\jc\docs
+
+03/25/2021 02:36 PM .
+03/25/2021 02:36 PM ..
+03/25/2021 02:38 PM parsers
+03/25/2021 02:36 PM 2,713 readme.md
+03/25/2021 02:36 PM 1,338 utils.md
+ 2 File(s) 4,051 bytes
+
+ Directory of C:\Users\Yoda\Desktop\jc
+
+03/25/2021 02:38 PM 58,995 EXAMPLES.md
+ 1 File(s) 58,995 bytes
+ 0 Dir(s) 34,115,264,512 bytes free
diff --git a/tests/fixtures/windows-10/dir-raw.json b/tests/fixtures/windows-10/dir-raw.json
new file mode 100644
index 00000000..4d6cd85d
--- /dev/null
+++ b/tests/fixtures/windows-10/dir-raw.json
@@ -0,0 +1 @@
+{"C:\\Program Files\\Internet Explorer": [{"date": "03/24/2021", "time": "03:15 PM", "dir": true, "size": null, "filename": "."}, {"date": "03/24/2021", "time": "03:15 PM", "dir": true, "size": null, "filename": ".."}, {"date": "12/07/2019", "time": "02:49 AM", "dir": true, "size": null, "filename": "en-US"}, {"date": "12/07/2019", "time": "02:09 AM", "dir": false, "size": "54,784", "filename": "ExtExport.exe"}, {"date": "03/24/2021", "time": "03:15 PM", "dir": false, "size": "0", "filename": "file name.txt"}, {"date": "12/07/2019", "time": "02:09 AM", "dir": false, "size": "54,784", "filename": "hmmapi.dll"}, {"date": "12/07/2019", "time": "02:09 AM", "dir": false, "size": "515,072", "filename": "iediagcmd.exe"}, {"date": "12/07/2019", "time": "02:09 AM", "dir": false, "size": "504,832", "filename": "ieinstal.exe"}, {"date": "12/07/2019", "time": "02:09 AM", "dir": false, "size": "224,768", "filename": "ielowutil.exe"}, {"date": "12/07/2019", "time": "02:09 AM", "dir": false, "size": "421,888", "filename": "IEShims.dll"}, {"date": "12/06/2019", "time": "02:47 PM", "dir": false, "size": "819,136", "filename": "iexplore.exe"}, {"date": "12/07/2019", "time": "02:14 AM", "dir": true, "size": null, "filename": "images"}, {"date": "12/07/2019", "time": "02:14 AM", "dir": true, "size": null, "filename": "SIGNUP"}, {"date": "12/07/2019", "time": "02:09 AM", "dir": false, "size": "48,536", "filename": "sqmapi.dll"}]}
\ No newline at end of file
diff --git a/tests/fixtures/windows-10/dir.json b/tests/fixtures/windows-10/dir.json
new file mode 100644
index 00000000..082d217a
--- /dev/null
+++ b/tests/fixtures/windows-10/dir.json
@@ -0,0 +1 @@
+{"C:\\Program Files\\Internet Explorer": [{"date": "03/24/2021", "time": "03:15 PM", "dir": true, "size": null, "filename": "."}, {"date": "03/24/2021", "time": "03:15 PM", "dir": true, "size": null, "filename": ".."}, {"date": "12/07/2019", "time": "02:49 AM", "dir": true, "size": null, "filename": "en-US"}, {"date": "12/07/2019", "time": "02:09 AM", "dir": false, "size": 54784, "filename": "ExtExport.exe"}, {"date": "03/24/2021", "time": "03:15 PM", "dir": false, "size": 0, "filename": "file name.txt"}, {"date": "12/07/2019", "time": "02:09 AM", "dir": false, "size": 54784, "filename": "hmmapi.dll"}, {"date": "12/07/2019", "time": "02:09 AM", "dir": false, "size": 515072, "filename": "iediagcmd.exe"}, {"date": "12/07/2019", "time": "02:09 AM", "dir": false, "size": 504832, "filename": "ieinstal.exe"}, {"date": "12/07/2019", "time": "02:09 AM", "dir": false, "size": 224768, "filename": "ielowutil.exe"}, {"date": "12/07/2019", "time": "02:09 AM", "dir": false, "size": 421888, "filename": "IEShims.dll"}, {"date": "12/06/2019", "time": "02:47 PM", "dir": false, "size": 819136, "filename": "iexplore.exe"}, {"date": "12/07/2019", "time": "02:14 AM", "dir": true, "size": null, "filename": "images"}, {"date": "12/07/2019", "time": "02:14 AM", "dir": true, "size": null, "filename": "SIGNUP"}, {"date": "12/07/2019", "time": "02:09 AM", "dir": false, "size": 48536, "filename": "sqmapi.dll"}]}
\ No newline at end of file
diff --git a/tests/fixtures/windows-10/dir.out b/tests/fixtures/windows-10/dir.out
new file mode 100644
index 00000000..6da83337
--- /dev/null
+++ b/tests/fixtures/windows-10/dir.out
@@ -0,0 +1,21 @@
+ Volume in drive C has no label.
+ Volume Serial Number is 246B-3B5A
+
+ Directory of C:\Program Files\Internet Explorer
+
+03/24/2021 03:15 PM .
+03/24/2021 03:15 PM ..
+12/07/2019 02:49 AM en-US
+12/07/2019 02:09 AM 54,784 ExtExport.exe
+03/24/2021 03:15 PM 0 file name.txt
+12/07/2019 02:09 AM 54,784 hmmapi.dll
+12/07/2019 02:09 AM 515,072 iediagcmd.exe
+12/07/2019 02:09 AM 504,832 ieinstal.exe
+12/07/2019 02:09 AM 224,768 ielowutil.exe
+12/07/2019 02:09 AM 421,888 IEShims.dll
+12/06/2019 02:47 PM 819,136 iexplore.exe
+12/07/2019 02:14 AM images
+12/07/2019 02:14 AM SIGNUP
+12/07/2019 02:09 AM 48,536 sqmapi.dll
+ 9 File(s) 2,643,800 bytes
+ 5 Dir(s) 36,207,603,712 bytes free
diff --git a/tests/test_dir.py b/tests/test_dir.py
new file mode 100644
index 00000000..197496ca
--- /dev/null
+++ b/tests/test_dir.py
@@ -0,0 +1,108 @@
+import os
+import json
+import unittest
+import jc.parsers.dir
+
+THIS_DIR = os.path.dirname(os.path.abspath(__file__))
+
+
+class MyTests(unittest.TestCase):
+
+ def setUp(self):
+ with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/windows-10/dir.out'),
+ 'r', encoding='utf-8') as f:
+ self.windows_10_dir = f.read()
+
+ with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/windows-10/dir.json'),
+ 'r', encoding='utf-8') as f:
+ self.windows_10_dir_json = json.loads(f.read())
+
+ with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/windows-10/dir-raw.json'),
+ 'r', encoding='utf-8') as f:
+ self.windows_10_dir_raw_json = json.loads(f.read())
+
+ with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/windows-10/dir-ODTC.out'),
+ 'r', encoding='utf-8') as f:
+ self.windows_10_dir_ODTC = f.read()
+
+ with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/windows-10/dir-ODTC.json'),
+ 'r', encoding='utf-8') as f:
+ self.windows_10_dir_ODTC_json = json.loads(f.read())
+
+ with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/windows-10/dir-C.out'),
+ 'r', encoding='utf-8') as f:
+ self.windows_10_dir_C = f.read()
+
+ with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/windows-10/dir-mix.out'),
+ 'r', encoding='utf-8') as f:
+ self.windows_10_dir_mix = f.read()
+
+ with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/windows-10/dir-mix.json'),
+ 'r', encoding='utf-8') as f:
+ self.windows_10_dir_mix_json = json.loads(f.read())
+
+ with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/windows-10/dir-files.out'),
+ 'r', encoding='utf-8') as f:
+ self.windows_10_dir_files= f.read()
+
+ with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/windows-10/dir-files.json'),
+ 'r', encoding='utf-8') as f:
+ self.windows_10_dir_files_json = json.loads(f.read())
+
+ with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/windows-10/dir-dirs.out'),
+ 'r', encoding='utf-8') as f:
+ self.windows_10_dir_dirs= f.read()
+
+ with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/windows-10/dir-dirs.json'),
+ 'r', encoding='utf-8') as f:
+ self.windows_10_dir_dirs_json = json.loads(f.read())
+
+ with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/windows-10/dir-S.out'),
+ 'r', encoding='utf-8') as f:
+ self.windows_10_dir_S= f.read()
+
+ with open(os.path.join(THIS_DIR, os.pardir, 'tests/fixtures/windows-10/dir-S.json'),
+ 'r', encoding='utf-8') as f:
+ self.windows_10_dir_S_json = json.loads(f.read())
+
+ def test_dir_error(self):
+ self.assertEqual(jc.parsers.dir.parse("Access is denied.", quiet=True), {})
+
+ def test_dir_empty(self):
+ self.assertEqual(jc.parsers.dir.parse("", quiet=True), {})
+
+ def test_dir_windows_10(self):
+ self.assertEqual(jc.parsers.dir.parse(self.windows_10_dir, quiet=True),
+ self.windows_10_dir_json)
+
+ def test_dir_windows_10_raw(self):
+ self.assertEqual(jc.parsers.dir.parse(self.windows_10_dir, raw=True, quiet=True),
+ self.windows_10_dir_raw_json)
+
+ def test_dir_windows_10_ODTC(self):
+ self.assertEqual(jc.parsers.dir.parse(self.windows_10_dir_ODTC, quiet=True),
+ self.windows_10_dir_ODTC_json)
+
+ def test_dir_windows_10_C(self):
+ self.assertEqual(jc.parsers.dir.parse(self.windows_10_dir_C, quiet=True),
+ self.windows_10_dir_json)
+
+ def test_dir_windows_10_mix(self):
+ self.assertEqual(jc.parsers.dir.parse(self.windows_10_dir_mix, quiet=True),
+ self.windows_10_dir_mix_json)
+
+ def test_dir_windows_10_files(self):
+ self.assertEqual(jc.parsers.dir.parse(self.windows_10_dir_files, quiet=True),
+ self.windows_10_dir_files_json)
+
+ def test_dir_windows_10_dirs(self):
+ self.assertEqual(jc.parsers.dir.parse(self.windows_10_dir_dirs, quiet=True),
+ self.windows_10_dir_dirs_json)
+
+ def test_dir_windows_10_S(self):
+ self.assertEqual(jc.parsers.dir.parse(self.windows_10_dir_S, quiet=True),
+ self.windows_10_dir_S_json)
+
+
+if __name__ == '__main__':
+ unittest.main()