1
0
mirror of https://github.com/kellyjonbrazil/jc.git synced 2025-06-21 00:19:42 +02:00

revised zipinfo.py nested version

This commit is contained in:
Matt J
2021-12-20 21:53:34 -08:00
parent bc520fcbcd
commit 9c1eaa9389
2 changed files with 68 additions and 61 deletions

View File

@ -21,60 +21,56 @@ Usage (module):
Schema: Schema:
{ {
"archive": [ "archive": string,
"size": integer,
"size_unit": string,
"number_entries": integer,
"number_files": integer,
"bytes_uncompressed": integer,
"bytes_compressed": integer,
"percent_compressed": float,
"files": [
{ {
"name": string, "flags": string,
"size": integer, "zipversion": string,
"size_unit": string, "zipunder": string
"number_entries": integer, "filesize": integer,
"number_files": integer, "type": string,
"bytes_uncompressed": integer, "method": string,
"bytes_compressed": integer, "date": string,
"contents": [ "time": string,
{ "filename": string
"flags": string,
"zipversion": float,
"zipunder": string
"size": integer,
"type": string,
"method": string,
"date": string,
"time": string,
"filename": string
}
]
} }
] ]
} }
Examples: Examples:
$ zipinfo log4j-core-2.16.0.jar | jc --zipinfo -p $ zipinfo log4j-core-2.16.0.jar | jc --zipinfo -p
{ [
"archive": [ {
{ "archive": "log4j-core-2.16.0.jar",
"name": "log4j-core-2.16.0.jar", "size": 1789565,
"size": "1789565", "size_unit": "bytes",
"size_unit": "bytes,", "number_entries": 1218,
"number_entries": "1218", "number_files": 1218,
"number_files": "1218", "bytes_uncompressed": 3974141,
"bytes_uncompressed": "3974141", "bytes_compressed": 1515455,
"bytes_compressed": "1515455", "percent_compressed": 61.9,
"contents": [ "files": [
{ {
"flags": "-rw-r--r--", "flags": "-rw-r--r--",
"zipversion": "2.0", "zipversion": "2.0",
"zipunder": "unx", "zipunder": "unx",
"size": "19810", "filesize": 19810,
"type": "bl", "type": "bl",
"method": "defN", "method": "defN",
"date": "21-Dec-12", "date": "21-Dec-12",
"time": "23:35", "time": "23:35",
"filename": "META-INF/MANIFEST.MF" "filename": "META-INF/MANIFEST.MF"
}, },
... ...
""" """
import jc.utils import jc.utils
import jc.parsers.universal import jc.parsers.universal
@ -108,6 +104,18 @@ def _process(proc_data):
List of Dictionaries. Structured data to conform to the schema. List of Dictionaries. Structured data to conform to the schema.
""" """
for entry in proc_data:
int_list = ['bytes_compressed', 'bytes_uncompressed', 'number_entries', 'number_files', 'size']
for key in entry:
if key in int_list:
entry[key] = jc.utils.convert_to_int(entry[key])
if key in "files":
for d in entry[key]:
for key in d:
if key in "filesize":
d[key] = jc.utils.convert_to_int(d[key])
return proc_data return proc_data
@ -138,38 +146,37 @@ def parse(data, raw=False, quiet=False):
archive_info = [] archive_info = []
# 1st line # 1st line
# Archive: log4j-core-2.16.0.jar
line = datalist.pop(0) line = datalist.pop(0)
parsed_line = line.split() _, archive = line.split()
name = parsed_line[1]
# 2nd line # 2nd line
# Zip file size: 1789565 bytes, number of entries: 1218
line = datalist.pop(0) line = datalist.pop(0)
parsed_line = line.split() _, _, _, size, size_unit, _, _, _, number_entries = line.split()
size = parsed_line[3] size_unit = size_unit.rstrip(',')
size_unit = parsed_line[4]
number_entries = parsed_line[-1]
# last line # last line
# 1218 files, 3974141 bytes uncompressed, 1515455 bytes compressed: 61.9%
line = datalist.pop(-1) line = datalist.pop(-1)
parsed_line = line.split() number_files, _, bytes_uncompressed, _, _, bytes_compressed, _, _, percent_compressed = line.split()
number_files = parsed_line[0] percent_compressed = float(percent_compressed.rstrip("%"))
bytes_uncompressed = parsed_line[2]
bytes_compressed = parsed_line[5]
# Add header row for parsing # Add header row for parsing
datalist[:0] = ['flags zipversion zipunder size type method date time filename'] datalist[:0] = ['flags zipversion zipunder filesize type method date time filename']
contents_list = jc.parsers.universal.simple_table_parse(datalist) file_list = jc.parsers.universal.simple_table_parse(datalist)
archive_info.append({'name': name, archive_info.append({'archive': archive,
'size': size, 'size': size,
'size_unit': size_unit, 'size_unit': size_unit,
'number_entries': number_entries, 'number_entries': number_entries,
'number_files': number_files, 'number_files': number_files,
'bytes_uncompressed': bytes_uncompressed, 'bytes_uncompressed': bytes_uncompressed,
'bytes_compressed': bytes_compressed, 'bytes_compressed': bytes_compressed,
'contents': contents_list}) 'percent_compressed': percent_compressed,
'files': file_list})
raw_output['archive'] = archive_info raw_output = archive_info
return raw_output if raw else _process(raw_output) return raw_output if raw else _process(raw_output)

File diff suppressed because one or more lines are too long