From a6fd31da3da21ce912349ea726f68dc22ba40f33 Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Sun, 24 Dec 2023 03:25:06 +0100
Subject: [PATCH 1/8] stats

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 _stats/requirements.csv          | 13 ++++++++++++
 _stats/requirements.template.csv | 13 ++++++++++++
 _stats/run.sh                    | 34 ++++++++++++++++++++++++++++++++
 3 files changed, 60 insertions(+)
 create mode 100644 _stats/requirements.csv
 create mode 100644 _stats/requirements.template.csv
 create mode 100755 _stats/run.sh

diff --git a/_stats/requirements.csv b/_stats/requirements.csv
new file mode 100644
index 00000000..69618ca0
--- /dev/null
+++ b/_stats/requirements.csv
@@ -0,0 +1,13 @@
+#  %C   command line and arguments
+#  %c   involuntary context switches
+#  %E   elapsed real time (wall clock) in [hour:]min:sec
+#  %e   elapsed real time (wall clock) in seconds
+#  %F   major page faults
+#  %M   maximum resident set size in KB
+#  %P   percent of CPU this job got
+#  %R   minor page faults
+#  %S   system (kernel) time in seconds
+#  %U   user time in seconds
+#  %w   voluntary context switches
+#  %x   exit status of command
+# %C ; %c ; %E ; %e ; %F ; %M ; %P ; %R ; %R ; %S ; %U ; %w ; %x
diff --git a/_stats/requirements.template.csv b/_stats/requirements.template.csv
new file mode 100644
index 00000000..69618ca0
--- /dev/null
+++ b/_stats/requirements.template.csv
@@ -0,0 +1,13 @@
+#  %C   command line and arguments
+#  %c   involuntary context switches
+#  %E   elapsed real time (wall clock) in [hour:]min:sec
+#  %e   elapsed real time (wall clock) in seconds
+#  %F   major page faults
+#  %M   maximum resident set size in KB
+#  %P   percent of CPU this job got
+#  %R   minor page faults
+#  %S   system (kernel) time in seconds
+#  %U   user time in seconds
+#  %w   voluntary context switches
+#  %x   exit status of command
+# %C ; %c ; %E ; %e ; %F ; %M ; %P ; %R ; %R ; %S ; %U ; %w ; %x
diff --git a/_stats/run.sh b/_stats/run.sh
new file mode 100755
index 00000000..aaa4f7a5
--- /dev/null
+++ b/_stats/run.sh
@@ -0,0 +1,34 @@
+#!/usr/bin/env bash
+set -xue
+
+TFORMAT='%C ; %c ; %E ; %e ; %F ; %M ; %P ; %R ; %R ; %S ; %U ; %w ; %x'
+SFILE='_stats/requirements.csv'
+
+
+for i in tests/_data/infiles/environment/*
+do
+  if [[ ! "$i" =~ "broken" ]]
+  then
+    /bin/time -f "$TFORMAT" -a -o "$SFILE" \
+    cyclonedx-py environment -o /dev/null --pyproject "$i"/pyproject.toml "$i"/.venv
+  fi
+done
+
+for i in tests/_data/infiles/pipenv/*
+do
+  /bin/time -f "$TFORMAT" -a -o "$SFILE" \
+  cyclonedx-py pipenv -o /dev/null --pyproject "$i"/pyproject.toml "$i"
+done
+
+for i in tests/_data/infiles/poetry/*/lock*
+do
+  /bin/time -f "$TFORMAT" -a -o "$SFILE" \
+  cyclonedx-py poetry -o /dev/null "$i"
+done
+
+for i in tests/_data/infiles/requirements/*.txt
+do
+  /bin/time -f "$TFORMAT" -a -o "$SFILE" \
+  cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml \
+    -o /dev/null "$i"
+done

From b2da54c128f63e44498171e41c2a11c69b00cce8 Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Sun, 24 Dec 2023 03:29:49 +0100
Subject: [PATCH 2/8] stats

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 _stats/requirements.csv           |  13 ---
 _stats/requirements.on-demand.csv | 142 ++++++++++++++++++++++++++++++
 2 files changed, 142 insertions(+), 13 deletions(-)
 delete mode 100644 _stats/requirements.csv
 create mode 100644 _stats/requirements.on-demand.csv

diff --git a/_stats/requirements.csv b/_stats/requirements.csv
deleted file mode 100644
index 69618ca0..00000000
--- a/_stats/requirements.csv
+++ /dev/null
@@ -1,13 +0,0 @@
-#  %C   command line and arguments
-#  %c   involuntary context switches
-#  %E   elapsed real time (wall clock) in [hour:]min:sec
-#  %e   elapsed real time (wall clock) in seconds
-#  %F   major page faults
-#  %M   maximum resident set size in KB
-#  %P   percent of CPU this job got
-#  %R   minor page faults
-#  %S   system (kernel) time in seconds
-#  %U   user time in seconds
-#  %w   voluntary context switches
-#  %x   exit status of command
-# %C ; %c ; %E ; %e ; %F ; %M ; %P ; %R ; %R ; %S ; %U ; %w ; %x
diff --git a/_stats/requirements.on-demand.csv b/_stats/requirements.on-demand.csv
new file mode 100644
index 00000000..630e44e2
--- /dev/null
+++ b/_stats/requirements.on-demand.csv
@@ -0,0 +1,142 @@
+#  %C   command line and arguments
+#  %c   involuntary context switches
+#  %E   elapsed real time (wall clock) in [hour:]min:sec
+#  %e   elapsed real time (wall clock) in seconds
+#  %F   major page faults
+#  %M   maximum resident set size in KB
+#  %P   percent of CPU this job got
+#  %R   minor page faults
+#  %S   system (kernel) time in seconds
+#  %U   user time in seconds
+#  %w   voluntary context switches
+#  %x   exit status of command
+# %C ; %c ; %E ; %e ; %F ; %M ; %P ; %R ; %R ; %S ; %U ; %w ; %x
+cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/editable-self/pyproject.toml tests/_data/infiles/environment/editable-self/.venv ; 53 ; 0:01.56 ; 1.56 ; 0 ; 35340 ; 99% ; 8274 ; 8274 ; 0.14 ; 1.41 ; 5 ; 0
+cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/local/pyproject.toml tests/_data/infiles/environment/local/.venv ; 39 ; 0:01.62 ; 1.62 ; 0 ; 35384 ; 99% ; 8072 ; 8072 ; 0.11 ; 1.50 ; 5 ; 0
+cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/no-deps/pyproject.toml tests/_data/infiles/environment/no-deps/.venv ; 30 ; 0:01.58 ; 1.58 ; 0 ; 36268 ; 99% ; 8273 ; 8273 ; 0.19 ; 1.38 ; 5 ; 0
+cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/via-pipenv/pyproject.toml tests/_data/infiles/environment/via-pipenv/.venv ; 39 ; 0:01.49 ; 1.49 ; 0 ; 36152 ; 99% ; 8298 ; 8298 ; 0.14 ; 1.35 ; 4 ; 0
+cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/via-poetry/pyproject.toml tests/_data/infiles/environment/via-poetry/.venv ; 68 ; 0:01.59 ; 1.59 ; 0 ; 36208 ; 99% ; 8292 ; 8292 ; 0.10 ; 1.48 ; 5 ; 0
+cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/with-extras/pyproject.toml tests/_data/infiles/environment/with-extras/.venv ; 58 ; 0:01.75 ; 1.75 ; 0 ; 36464 ; 99% ; 8315 ; 8315 ; 0.13 ; 1.61 ; 5 ; 0
+cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/with-urls/pyproject.toml tests/_data/infiles/environment/with-urls/.venv ; 39 ; 0:01.53 ; 1.53 ; 0 ; 35284 ; 99% ; 8064 ; 8064 ; 0.17 ; 1.35 ; 5 ; 0
+cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/category-deps/pyproject.toml tests/_data/infiles/pipenv/category-deps ; 6 ; 0:01.22 ; 1.22 ; 0 ; 34324 ; 99% ; 6676 ; 6676 ; 0.07 ; 1.14 ; 1 ; 0
+cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/default-and-dev/pyproject.toml tests/_data/infiles/pipenv/default-and-dev ; 35 ; 0:01.25 ; 1.25 ; 0 ; 34156 ; 99% ; 6673 ; 6673 ; 0.12 ; 1.12 ; 1 ; 0
+cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/editable-self/pyproject.toml tests/_data/infiles/pipenv/editable-self ; 10 ; 0:01.28 ; 1.28 ; 0 ; 34164 ; 99% ; 6675 ; 6675 ; 0.09 ; 1.18 ; 1 ; 0
+cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/local/pyproject.toml tests/_data/infiles/pipenv/local ; 42 ; 0:01.25 ; 1.25 ; 0 ; 34244 ; 99% ; 6677 ; 6677 ; 0.10 ; 1.15 ; 1 ; 0
+cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/no-deps/pyproject.toml tests/_data/infiles/pipenv/no-deps ; 65 ; 0:01.23 ; 1.23 ; 0 ; 35180 ; 99% ; 6879 ; 6879 ; 0.08 ; 1.14 ; 1 ; 0
+cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/private-packages/pyproject.toml tests/_data/infiles/pipenv/private-packages ; 22 ; 0:01.31 ; 1.31 ; 0 ; 34372 ; 99% ; 6679 ; 6679 ; 0.11 ; 1.20 ; 1 ; 0
+cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/with-extras/pyproject.toml tests/_data/infiles/pipenv/with-extras ; 25 ; 0:01.56 ; 1.56 ; 0 ; 34496 ; 99% ; 6723 ; 6723 ; 0.09 ; 1.45 ; 1 ; 0
+cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/with-urls/pyproject.toml tests/_data/infiles/pipenv/with-urls ; 11 ; 0:01.43 ; 1.43 ; 0 ; 34288 ; 99% ; 6692 ; 6692 ; 0.11 ; 1.31 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/group-deps/lock11 ; 288 ; 0:01.86 ; 1.86 ; 0 ; 34480 ; 79% ; 6718 ; 6718 ; 0.12 ; 1.36 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/group-deps/lock20 ; 507 ; 0:02.03 ; 2.03 ; 0 ; 34256 ; 73% ; 6712 ; 6712 ; 0.10 ; 1.39 ; 0 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/local/lock10 ; 57 ; 0:01.34 ; 1.34 ; 0 ; 34216 ; 99% ; 6677 ; 6677 ; 0.11 ; 1.22 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/local/lock11 ; 332 ; 0:01.42 ; 1.42 ; 0 ; 34296 ; 93% ; 6678 ; 6678 ; 0.08 ; 1.25 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/local/lock20 ; 43 ; 0:01.00 ; 1.00 ; 0 ; 34328 ; 99% ; 6682 ; 6682 ; 0.09 ; 0.90 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/main-and-dev/lock10 ; 9 ; 0:00.96 ; 0.96 ; 0 ; 34468 ; 99% ; 6706 ; 6706 ; 0.08 ; 0.88 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/main-and-dev/lock11 ; 17 ; 0:01.02 ; 1.02 ; 0 ; 34568 ; 99% ; 6712 ; 6712 ; 0.05 ; 0.97 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/main-and-dev/lock20 ; 7 ; 0:00.98 ; 0.98 ; 0 ; 34472 ; 99% ; 6706 ; 6706 ; 0.05 ; 0.93 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/no-deps/lock20 ; 16 ; 0:01.07 ; 1.07 ; 0 ; 35232 ; 99% ; 6889 ; 6889 ; 0.10 ; 0.97 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/private-packges/lock10 ; 10 ; 0:00.95 ; 0.95 ; 0 ; 34464 ; 99% ; 6684 ; 6684 ; 0.08 ; 0.86 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/private-packges/lock11 ; 26 ; 0:01.05 ; 1.05 ; 0 ; 34764 ; 99% ; 6791 ; 6791 ; 0.06 ; 0.99 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/private-packges/lock20 ; 9 ; 0:01.06 ; 1.06 ; 0 ; 34768 ; 99% ; 6788 ; 6788 ; 0.09 ; 0.97 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/regression-issue611/lock20 ; 7 ; 0:00.92 ; 0.92 ; 0 ; 34336 ; 99% ; 6673 ; 6673 ; 0.08 ; 0.83 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-extras/lock10 ; 9 ; 0:00.95 ; 0.95 ; 0 ; 34556 ; 99% ; 6701 ; 6701 ; 0.10 ; 0.84 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-extras/lock11 ; 13 ; 0:01.00 ; 1.00 ; 0 ; 34980 ; 99% ; 6832 ; 6832 ; 0.07 ; 0.92 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-extras/lock20 ; 6 ; 0:01.00 ; 1.00 ; 0 ; 35288 ; 99% ; 6888 ; 6888 ; 0.03 ; 0.96 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-urls/lock10 ; 6 ; 0:00.94 ; 0.94 ; 0 ; 34380 ; 99% ; 6693 ; 6693 ; 0.09 ; 0.85 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-urls/lock11 ; 3 ; 0:00.93 ; 0.93 ; 0 ; 34468 ; 99% ; 6691 ; 6691 ; 0.06 ; 0.87 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-urls/lock20 ; 12 ; 0:01.06 ; 1.06 ; 0 ; 34424 ; 99% ; 6690 ; 6690 ; 0.11 ; 0.94 ; 1 ; 0
+cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/frozen.txt ; 5 ; 0:01.06 ; 1.06 ; 0 ; 36356 ; 99% ; 7212 ; 7212 ; 0.07 ; 0.98 ; 1 ; 0
+cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/local.txt ; 15 ; 0:01.07 ; 1.07 ; 0 ; 36388 ; 99% ; 7219 ; 7219 ; 0.06 ; 1.00 ; 1 ; 0
+cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/nested.txt ; 22 ; 0:01.06 ; 1.06 ; 0 ; 36540 ; 99% ; 7214 ; 7214 ; 0.07 ; 0.98 ; 1 ; 0
+cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/private-packages.txt ; 9 ; 0:01.05 ; 1.05 ; 0 ; 36464 ; 100% ; 7213 ; 7213 ; 0.08 ; 0.96 ; 1 ; 0
+cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/with-comments.txt ; 5 ; 0:01.06 ; 1.06 ; 0 ; 36360 ; 99% ; 7215 ; 7215 ; 0.09 ; 0.97 ; 1 ; 0
+cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/with-extras.txt ; 5 ; 0:01.07 ; 1.07 ; 0 ; 36464 ; 99% ; 7216 ; 7216 ; 0.07 ; 0.99 ; 1 ; 0
+cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/with-hashes.txt ; 12 ; 0:01.08 ; 1.08 ; 0 ; 36296 ; 99% ; 7219 ; 7219 ; 0.09 ; 0.98 ; 1 ; 0
+cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/without-pinned-versions.txt ; 20 ; 0:01.09 ; 1.09 ; 0 ; 36380 ; 99% ; 7214 ; 7214 ; 0.06 ; 1.03 ; 1 ; 0
+cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/with-urls.txt ; 21 ; 0:01.19 ; 1.19 ; 0 ; 36452 ; 99% ; 7220 ; 7220 ; 0.10 ; 1.08 ; 1 ; 0
+cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/editable-self/pyproject.toml tests/_data/infiles/environment/editable-self/.venv ; 36 ; 0:01.59 ; 1.59 ; 0 ; 35432 ; 99% ; 8280 ; 8280 ; 0.12 ; 1.46 ; 5 ; 0
+cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/local/pyproject.toml tests/_data/infiles/environment/local/.venv ; 36 ; 0:01.49 ; 1.49 ; 0 ; 35456 ; 99% ; 8074 ; 8074 ; 0.14 ; 1.35 ; 4 ; 0
+cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/no-deps/pyproject.toml tests/_data/infiles/environment/no-deps/.venv ; 14 ; 0:01.60 ; 1.60 ; 0 ; 36180 ; 99% ; 8277 ; 8277 ; 0.13 ; 1.46 ; 7 ; 0
+cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/via-pipenv/pyproject.toml tests/_data/infiles/environment/via-pipenv/.venv ; 37 ; 0:01.53 ; 1.53 ; 0 ; 36092 ; 99% ; 8297 ; 8297 ; 0.13 ; 1.40 ; 5 ; 0
+cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/via-poetry/pyproject.toml tests/_data/infiles/environment/via-poetry/.venv ; 45 ; 0:01.58 ; 1.58 ; 0 ; 36152 ; 99% ; 8295 ; 8295 ; 0.12 ; 1.45 ; 7 ; 0
+cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/with-extras/pyproject.toml tests/_data/infiles/environment/with-extras/.venv ; 29 ; 0:01.71 ; 1.71 ; 0 ; 36296 ; 99% ; 8316 ; 8316 ; 0.15 ; 1.56 ; 5 ; 0
+cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/with-urls/pyproject.toml tests/_data/infiles/environment/with-urls/.venv ; 28 ; 0:01.61 ; 1.61 ; 0 ; 35352 ; 99% ; 8064 ; 8064 ; 0.11 ; 1.49 ; 5 ; 0
+cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/category-deps/pyproject.toml tests/_data/infiles/pipenv/category-deps ; 16 ; 0:01.26 ; 1.26 ; 0 ; 34192 ; 99% ; 6674 ; 6674 ; 0.08 ; 1.17 ; 1 ; 0
+cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/default-and-dev/pyproject.toml tests/_data/infiles/pipenv/default-and-dev ; 12 ; 0:01.18 ; 1.18 ; 0 ; 34360 ; 99% ; 6672 ; 6672 ; 0.10 ; 1.08 ; 1 ; 0
+cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/editable-self/pyproject.toml tests/_data/infiles/pipenv/editable-self ; 62 ; 0:01.24 ; 1.24 ; 0 ; 34156 ; 99% ; 6673 ; 6673 ; 0.11 ; 1.12 ; 1 ; 0
+cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/local/pyproject.toml tests/_data/infiles/pipenv/local ; 15 ; 0:01.26 ; 1.26 ; 0 ; 34360 ; 99% ; 6676 ; 6676 ; 0.10 ; 1.15 ; 1 ; 0
+cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/no-deps/pyproject.toml tests/_data/infiles/pipenv/no-deps ; 46 ; 0:01.23 ; 1.23 ; 0 ; 35208 ; 99% ; 6881 ; 6881 ; 0.11 ; 1.12 ; 1 ; 0
+cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/private-packages/pyproject.toml tests/_data/infiles/pipenv/private-packages ; 10 ; 0:01.23 ; 1.23 ; 0 ; 34360 ; 99% ; 6678 ; 6678 ; 0.11 ; 1.11 ; 1 ; 0
+cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/with-extras/pyproject.toml tests/_data/infiles/pipenv/with-extras ; 35 ; 0:01.40 ; 1.40 ; 0 ; 34440 ; 99% ; 6722 ; 6722 ; 0.12 ; 1.27 ; 1 ; 0
+cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/with-urls/pyproject.toml tests/_data/infiles/pipenv/with-urls ; 8 ; 0:01.36 ; 1.36 ; 0 ; 34488 ; 99% ; 6692 ; 6692 ; 0.07 ; 1.28 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/group-deps/lock11 ; 27 ; 0:01.41 ; 1.41 ; 0 ; 34608 ; 99% ; 6714 ; 6714 ; 0.10 ; 1.30 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/group-deps/lock20 ; 21 ; 0:01.44 ; 1.44 ; 0 ; 34500 ; 99% ; 6715 ; 6715 ; 0.10 ; 1.33 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/local/lock10 ; 46 ; 0:01.28 ; 1.28 ; 0 ; 34064 ; 99% ; 6677 ; 6677 ; 0.10 ; 1.17 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/local/lock11 ; 12 ; 0:01.30 ; 1.30 ; 0 ; 34468 ; 99% ; 6681 ; 6681 ; 0.09 ; 1.20 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/local/lock20 ; 20 ; 0:01.29 ; 1.29 ; 0 ; 34332 ; 99% ; 6678 ; 6678 ; 0.11 ; 1.17 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/main-and-dev/lock10 ; 26 ; 0:01.27 ; 1.27 ; 0 ; 34196 ; 99% ; 6706 ; 6706 ; 0.09 ; 1.18 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/main-and-dev/lock11 ; 8 ; 0:01.29 ; 1.29 ; 0 ; 34616 ; 99% ; 6715 ; 6715 ; 0.13 ; 1.15 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/main-and-dev/lock20 ; 14 ; 0:01.30 ; 1.30 ; 0 ; 34336 ; 99% ; 6709 ; 6709 ; 0.10 ; 1.19 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/no-deps/lock20 ; 18 ; 0:01.30 ; 1.30 ; 0 ; 35172 ; 99% ; 6896 ; 6896 ; 0.13 ; 1.16 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/private-packges/lock10 ; 11 ; 0:01.24 ; 1.24 ; 0 ; 34464 ; 99% ; 6682 ; 6682 ; 0.10 ; 1.13 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/private-packges/lock11 ; 9 ; 0:01.41 ; 1.41 ; 0 ; 34852 ; 99% ; 6793 ; 6793 ; 0.11 ; 1.29 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/private-packges/lock20 ; 6 ; 0:01.35 ; 1.35 ; 0 ; 34932 ; 99% ; 6788 ; 6788 ; 0.07 ; 1.28 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/regression-issue611/lock20 ; 7 ; 0:01.19 ; 1.19 ; 0 ; 34456 ; 99% ; 6675 ; 6675 ; 0.12 ; 1.06 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-extras/lock10 ; 26 ; 0:01.19 ; 1.19 ; 0 ; 34124 ; 99% ; 6704 ; 6704 ; 0.10 ; 1.08 ; 0 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-extras/lock11 ; 29 ; 0:01.29 ; 1.29 ; 0 ; 34924 ; 99% ; 6834 ; 6834 ; 0.08 ; 1.20 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-extras/lock20 ; 18 ; 0:01.36 ; 1.36 ; 0 ; 35168 ; 99% ; 6891 ; 6891 ; 0.08 ; 1.27 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-urls/lock10 ; 12 ; 0:01.42 ; 1.42 ; 0 ; 34464 ; 99% ; 6695 ; 6695 ; 0.12 ; 1.30 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-urls/lock11 ; 20 ; 0:01.28 ; 1.28 ; 0 ; 34440 ; 99% ; 6694 ; 6694 ; 0.10 ; 1.18 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-urls/lock20 ; 13 ; 0:01.27 ; 1.27 ; 0 ; 34464 ; 99% ; 6694 ; 6694 ; 0.14 ; 1.13 ; 1 ; 0
+cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/frozen.txt ; 7 ; 0:01.52 ; 1.52 ; 0 ; 36492 ; 100% ; 7217 ; 7217 ; 0.11 ; 1.41 ; 1 ; 0
+cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/local.txt ; 22 ; 0:01.48 ; 1.48 ; 0 ; 36220 ; 99% ; 7215 ; 7215 ; 0.14 ; 1.33 ; 1 ; 0
+cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/nested.txt ; 65 ; 0:01.51 ; 1.51 ; 0 ; 36304 ; 99% ; 7213 ; 7213 ; 0.11 ; 1.38 ; 0 ; 0
+cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/private-packages.txt ; 53 ; 0:01.38 ; 1.38 ; 0 ; 36324 ; 99% ; 7214 ; 7214 ; 0.12 ; 1.25 ; 1 ; 0
+cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/with-comments.txt ; 11 ; 0:01.49 ; 1.49 ; 0 ; 36476 ; 99% ; 7217 ; 7217 ; 0.09 ; 1.40 ; 1 ; 0
+cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/with-extras.txt ; 10 ; 0:01.34 ; 1.34 ; 0 ; 36420 ; 99% ; 7217 ; 7217 ; 0.11 ; 1.22 ; 1 ; 0
+cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/with-hashes.txt ; 54 ; 0:01.43 ; 1.43 ; 0 ; 36620 ; 99% ; 7220 ; 7220 ; 0.10 ; 1.32 ; 1 ; 0
+cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/without-pinned-versions.txt ; 14 ; 0:01.55 ; 1.55 ; 0 ; 36356 ; 99% ; 7213 ; 7213 ; 0.11 ; 1.43 ; 1 ; 0
+cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/with-urls.txt ; 36 ; 0:01.44 ; 1.44 ; 0 ; 36464 ; 99% ; 7217 ; 7217 ; 0.08 ; 1.35 ; 1 ; 0
+cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/editable-self/pyproject.toml tests/_data/infiles/environment/editable-self/.venv ; 70 ; 0:01.44 ; 1.44 ; 0 ; 35372 ; 99% ; 8280 ; 8280 ; 0.09 ; 1.34 ; 4 ; 0
+cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/local/pyproject.toml tests/_data/infiles/environment/local/.venv ; 45 ; 0:01.55 ; 1.55 ; 0 ; 35452 ; 99% ; 8069 ; 8069 ; 0.13 ; 1.41 ; 5 ; 0
+cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/no-deps/pyproject.toml tests/_data/infiles/environment/no-deps/.venv ; 40 ; 0:01.50 ; 1.50 ; 0 ; 35968 ; 99% ; 8276 ; 8276 ; 0.12 ; 1.38 ; 5 ; 0
+cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/via-pipenv/pyproject.toml tests/_data/infiles/environment/via-pipenv/.venv ; 41 ; 0:01.43 ; 1.43 ; 0 ; 36012 ; 99% ; 8298 ; 8298 ; 0.13 ; 1.30 ; 5 ; 0
+cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/via-poetry/pyproject.toml tests/_data/infiles/environment/via-poetry/.venv ; 24 ; 0:01.57 ; 1.57 ; 0 ; 36100 ; 99% ; 8299 ; 8299 ; 0.12 ; 1.45 ; 5 ; 0
+cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/with-extras/pyproject.toml tests/_data/infiles/environment/with-extras/.venv ; 24 ; 0:01.89 ; 1.89 ; 0 ; 36396 ; 99% ; 8312 ; 8312 ; 0.12 ; 1.76 ; 6 ; 0
+cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/with-urls/pyproject.toml tests/_data/infiles/environment/with-urls/.venv ; 12 ; 0:01.43 ; 1.43 ; 0 ; 35580 ; 99% ; 8065 ; 8065 ; 0.12 ; 1.30 ; 5 ; 0
+cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/category-deps/pyproject.toml tests/_data/infiles/pipenv/category-deps ; 58 ; 0:01.26 ; 1.26 ; 0 ; 34312 ; 99% ; 6674 ; 6674 ; 0.12 ; 1.13 ; 1 ; 0
+cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/default-and-dev/pyproject.toml tests/_data/infiles/pipenv/default-and-dev ; 64 ; 0:01.19 ; 1.19 ; 0 ; 34136 ; 99% ; 6672 ; 6672 ; 0.09 ; 1.09 ; 0 ; 0
+cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/editable-self/pyproject.toml tests/_data/infiles/pipenv/editable-self ; 56 ; 0:01.50 ; 1.50 ; 0 ; 34320 ; 99% ; 6676 ; 6676 ; 0.13 ; 1.36 ; 1 ; 0
+cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/local/pyproject.toml tests/_data/infiles/pipenv/local ; 73 ; 0:01.44 ; 1.44 ; 0 ; 34364 ; 99% ; 6677 ; 6677 ; 0.11 ; 1.32 ; 1 ; 0
+cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/no-deps/pyproject.toml tests/_data/infiles/pipenv/no-deps ; 38 ; 0:01.49 ; 1.49 ; 0 ; 35128 ; 98% ; 6881 ; 6881 ; 0.11 ; 1.36 ; 0 ; 0
+cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/private-packages/pyproject.toml tests/_data/infiles/pipenv/private-packages ; 182 ; 0:01.47 ; 1.47 ; 0 ; 34364 ; 99% ; 6679 ; 6679 ; 0.15 ; 1.30 ; 1 ; 0
+cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/with-extras/pyproject.toml tests/_data/infiles/pipenv/with-extras ; 44 ; 0:01.50 ; 1.50 ; 0 ; 34620 ; 99% ; 6720 ; 6720 ; 0.13 ; 1.36 ; 1 ; 0
+cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/with-urls/pyproject.toml tests/_data/infiles/pipenv/with-urls ; 44 ; 0:01.31 ; 1.31 ; 0 ; 34408 ; 99% ; 6695 ; 6695 ; 0.12 ; 1.18 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/group-deps/lock11 ; 16 ; 0:01.37 ; 1.37 ; 0 ; 34604 ; 99% ; 6712 ; 6712 ; 0.10 ; 1.26 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/group-deps/lock20 ; 22 ; 0:01.36 ; 1.36 ; 0 ; 34396 ; 99% ; 6713 ; 6713 ; 0.10 ; 1.25 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/local/lock10 ; 10 ; 0:01.17 ; 1.17 ; 0 ; 34204 ; 99% ; 6677 ; 6677 ; 0.09 ; 1.08 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/local/lock11 ; 10 ; 0:01.24 ; 1.24 ; 0 ; 34452 ; 99% ; 6681 ; 6681 ; 0.09 ; 1.14 ; 0 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/local/lock20 ; 6 ; 0:01.22 ; 1.22 ; 0 ; 34464 ; 100% ; 6683 ; 6683 ; 0.08 ; 1.13 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/main-and-dev/lock10 ; 12 ; 0:01.22 ; 1.22 ; 0 ; 34380 ; 99% ; 6710 ; 6710 ; 0.12 ; 1.09 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/main-and-dev/lock11 ; 21 ; 0:01.30 ; 1.30 ; 0 ; 34444 ; 99% ; 6712 ; 6712 ; 0.11 ; 1.18 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/main-and-dev/lock20 ; 11 ; 0:01.31 ; 1.31 ; 0 ; 34600 ; 99% ; 6708 ; 6708 ; 0.10 ; 1.20 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/no-deps/lock20 ; 46 ; 0:01.26 ; 1.26 ; 0 ; 35304 ; 99% ; 6895 ; 6895 ; 0.10 ; 1.15 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/private-packges/lock10 ; 40 ; 0:01.32 ; 1.32 ; 0 ; 34248 ; 99% ; 6683 ; 6683 ; 0.12 ; 1.19 ; 0 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/private-packges/lock11 ; 48 ; 0:01.58 ; 1.58 ; 0 ; 34772 ; 99% ; 6790 ; 6790 ; 0.11 ; 1.46 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/private-packges/lock20 ; 27 ; 0:01.47 ; 1.47 ; 0 ; 34628 ; 99% ; 6787 ; 6787 ; 0.10 ; 1.35 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/regression-issue611/lock20 ; 13 ; 0:01.24 ; 1.24 ; 0 ; 34460 ; 99% ; 6675 ; 6675 ; 0.11 ; 1.13 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-extras/lock10 ; 24 ; 0:01.36 ; 1.36 ; 0 ; 34216 ; 99% ; 6704 ; 6704 ; 0.10 ; 1.25 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-extras/lock11 ; 18 ; 0:01.31 ; 1.31 ; 0 ; 34864 ; 99% ; 6832 ; 6832 ; 0.11 ; 1.19 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-extras/lock20 ; 73 ; 0:01.41 ; 1.41 ; 0 ; 35300 ; 99% ; 6888 ; 6888 ; 0.12 ; 1.28 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-urls/lock10 ; 18 ; 0:01.37 ; 1.37 ; 0 ; 34492 ; 99% ; 6695 ; 6695 ; 0.10 ; 1.26 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-urls/lock11 ; 59 ; 0:01.30 ; 1.30 ; 0 ; 34476 ; 99% ; 6693 ; 6693 ; 0.09 ; 1.20 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-urls/lock20 ; 26 ; 0:01.33 ; 1.33 ; 0 ; 34328 ; 99% ; 6694 ; 6694 ; 0.11 ; 1.20 ; 1 ; 0
+cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/frozen.txt ; 23 ; 0:01.48 ; 1.48 ; 0 ; 36416 ; 98% ; 7214 ; 7214 ; 0.10 ; 1.37 ; 1 ; 0
+cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/local.txt ; 24 ; 0:01.39 ; 1.39 ; 0 ; 36212 ; 99% ; 7214 ; 7214 ; 0.11 ; 1.27 ; 1 ; 0
+cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/nested.txt ; 23 ; 0:01.30 ; 1.30 ; 0 ; 36368 ; 99% ; 7215 ; 7215 ; 0.12 ; 1.18 ; 0 ; 0
+cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/private-packages.txt ; 32 ; 0:01.44 ; 1.44 ; 0 ; 36260 ; 99% ; 7214 ; 7214 ; 0.10 ; 1.33 ; 1 ; 0
+cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/with-comments.txt ; 14 ; 0:01.47 ; 1.47 ; 0 ; 36348 ; 99% ; 7216 ; 7216 ; 0.15 ; 1.32 ; 1 ; 0
+cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/with-extras.txt ; 19 ; 0:01.31 ; 1.31 ; 0 ; 36360 ; 99% ; 7213 ; 7213 ; 0.10 ; 1.20 ; 1 ; 0
+cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/with-hashes.txt ; 43 ; 0:01.38 ; 1.38 ; 0 ; 36436 ; 99% ; 7222 ; 7222 ; 0.10 ; 1.28 ; 1 ; 0
+cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/without-pinned-versions.txt ; 28 ; 0:01.46 ; 1.46 ; 0 ; 36380 ; 99% ; 7220 ; 7220 ; 0.11 ; 1.35 ; 1 ; 0
+cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/with-urls.txt ; 38 ; 0:01.57 ; 1.57 ; 0 ; 36176 ; 99% ; 7219 ; 7219 ; 0.11 ; 1.45 ; 1 ; 0

From ba02e7035d394856604495b2d1622a8d0fa925d9 Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Sun, 24 Dec 2023 04:17:45 +0100
Subject: [PATCH 3/8] top

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 cyclonedx_py/_internal/cli.py             | 28 +++++------
 cyclonedx_py/_internal/cli_common.py      | 21 +++++++-
 cyclonedx_py/_internal/environment.py     | 58 ++++++++--------------
 cyclonedx_py/_internal/pipenv.py          | 39 ++++++---------
 cyclonedx_py/_internal/poetry.py          | 59 ++++++-----------------
 cyclonedx_py/_internal/requirements.py    | 50 +++++++------------
 cyclonedx_py/_internal/utils/packaging.py | 20 +++-----
 cyclonedx_py/_internal/utils/pep610.py    |  7 ++-
 cyclonedx_py/_internal/utils/pep621.py    | 30 +++++-------
 cyclonedx_py/_internal/utils/poetry.py    | 28 +++++------
 cyclonedx_py/_internal/utils/pyproject.py |  2 +-
 11 files changed, 133 insertions(+), 209 deletions(-)

diff --git a/cyclonedx_py/_internal/cli.py b/cyclonedx_py/_internal/cli.py
index cc774861..942e2cbc 100644
--- a/cyclonedx_py/_internal/cli.py
+++ b/cyclonedx_py/_internal/cli.py
@@ -15,23 +15,32 @@
 # SPDX-License-Identifier: Apache-2.0
 # Copyright (c) OWASP Foundation. All Rights Reserved.
 
-
 import logging
 import sys
 from argparse import ArgumentParser, FileType, RawDescriptionHelpFormatter
+from itertools import chain
 from typing import TYPE_CHECKING, Any, Dict, List, Optional, TextIO, Type
 
+from cyclonedx.model import Property
+from cyclonedx.output import make_outputter
 from cyclonedx.schema import OutputFormat, SchemaVersion
+from cyclonedx.validation import make_schemabased_validator
 
 from .. import __version__
+from . import PropertyName
 from .environment import EnvironmentBB
 from .pipenv import PipenvBB
 from .poetry import PoetryBB
 from .requirements import RequirementsBB
+from .utils.args import argparse_type4enum, choices4enum
+
+if sys.version_info >= (3, 9):
+    from argparse import BooleanOptionalAction
+else:
+    BooleanOptionalAction = None
 
 if TYPE_CHECKING:  # pragma: no cover
     from argparse import Action
-    from logging import Logger
 
     from cyclonedx.model.bom import Bom
     from cyclonedx.model.component import Component
@@ -40,16 +49,10 @@
 
     BooleanOptionalAction: Optional[Type[Action]]
 
-if sys.version_info >= (3, 9):
-    from argparse import BooleanOptionalAction
-else:
-    BooleanOptionalAction = None
-
 
 class Command:
     @classmethod
     def make_argument_parser(cls, sco: ArgumentParser, **kwargs: Any) -> ArgumentParser:
-        from .utils.args import argparse_type4enum, choices4enum
         p = ArgumentParser(
             description='Creates CycloneDX Software Bill of Materials (SBOM) from Python projects and environments.',
             formatter_class=RawDescriptionHelpFormatter,
@@ -140,7 +143,7 @@ def _clean_kwargs(cls, kwargs: Dict[str, Any]) -> Dict[str, Any]:
         return {k: kwargs[k] for k in kwargs if k not in cls.__OWN_ARGS}
 
     def __init__(self, *,
-                 logger: 'Logger',
+                 logger: logging.Logger,
                  short_purls: bool,
                  output_format: OutputFormat,
                  schema_version: SchemaVersion,
@@ -161,8 +164,6 @@ def _shorten_purls(self, bom: 'Bom') -> bool:
         if not self._short_purls:
             return False
 
-        from itertools import chain
-
         self._logger.info('Shorting purls...')
         component: 'Component'
         for component in chain(
@@ -187,7 +188,6 @@ def _validate(self, output: str) -> bool:
 
         self._logger.info('Validating result to schema: %s/%s',
                           self._schema_version.to_version(), self._output_format.name)
-        from cyclonedx.validation import make_schemabased_validator
 
         validation_error = make_schemabased_validator(
             self._output_format,
@@ -213,10 +213,6 @@ def _write(self, output: str, outfile: TextIO) -> int:
 
     def _make_output(self, bom: 'Bom') -> str:
         self._logger.info('Serializing SBOM: %s/%s', self._schema_version.to_version(), self._output_format.name)
-        from cyclonedx.model import Property
-        from cyclonedx.output import make_outputter
-
-        from . import PropertyName
 
         if self._output_reproducible:
             bom.metadata.properties.add(Property(name=PropertyName.Reproducible.value,
diff --git a/cyclonedx_py/_internal/cli_common.py b/cyclonedx_py/_internal/cli_common.py
index 69fcd56b..474f9ba9 100644
--- a/cyclonedx_py/_internal/cli_common.py
+++ b/cyclonedx_py/_internal/cli_common.py
@@ -1,5 +1,25 @@
+# This file is part of CycloneDX Python Lib
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# SPDX-License-Identifier: Apache-2.0
+# Copyright (c) OWASP Foundation. All Rights Reserved.
+
+
 from typing import TYPE_CHECKING
 
+from cyclonedx.model.component import ComponentType
+
 from .utils.args import argparse_type4enum
 
 if TYPE_CHECKING:  # pragma: no cover
@@ -17,7 +37,6 @@ def add_argument_pyproject(p: 'ArgumentParser') -> 'Action':
 
 
 def add_argument_mc_type(p: 'ArgumentParser') -> 'Action':
-    from cyclonedx.model.component import ComponentType
     choices = [ComponentType.APPLICATION,
                ComponentType.FIRMWARE,
                ComponentType.LIBRARY]
diff --git a/cyclonedx_py/_internal/environment.py b/cyclonedx_py/_internal/environment.py
index e11c35ea..135763f4 100644
--- a/cyclonedx_py/_internal/environment.py
+++ b/cyclonedx_py/_internal/environment.py
@@ -16,17 +16,32 @@
 # Copyright (c) OWASP Foundation. All Rights Reserved.
 
 
+from argparse import OPTIONAL, ArgumentParser
+from importlib.metadata import distributions
+from json import loads
+from os import getcwd, name as os_name
+from os.path import exists, isdir, join
+from subprocess import run  # nosec
+from sys import path as sys_path
+from textwrap import dedent
 from typing import TYPE_CHECKING, Any, Dict, Iterable, List, Optional, Tuple
 
-from . import BomBuilder
+from cyclonedx.model import Property
+from cyclonedx.model.component import Component, ComponentType
+from packageurl import PackageURL
+from packaging.requirements import Requirement
+
+from . import BomBuilder, PropertyName
+from .cli_common import add_argument_mc_type, add_argument_pyproject
+from .utils.cdx import licenses_fixup, make_bom
+from .utils.packaging import metadata2extrefs, metadata2licenses
+from .utils.pep610 import PackageSourceArchive, PackageSourceVcs, packagesource2extref, packagesource4dist
+from .utils.pyproject import pyproject2component, pyproject2dependencies, pyproject_load
 
 if TYPE_CHECKING:  # pragma: no cover
-    from argparse import ArgumentParser
     from logging import Logger
 
     from cyclonedx.model.bom import Bom
-    from cyclonedx.model.component import Component, ComponentType
-    from packaging.requirements import Requirement
 
     from .utils.pep610 import PackageSource
 
@@ -41,12 +56,6 @@ class EnvironmentBB(BomBuilder):
 
     @staticmethod
     def make_argument_parser(**kwargs: Any) -> 'ArgumentParser':
-        from argparse import OPTIONAL, ArgumentParser
-        from os import name as os_name
-        from textwrap import dedent
-
-        from .cli_common import add_argument_mc_type, add_argument_pyproject
-
         p = ArgumentParser(description='Build an SBOM from Python (virtual) environment',
                            **kwargs)
         if os_name == 'nt':
@@ -114,15 +123,9 @@ def __call__(self, *,  # type:ignore[override]
                  pyproject_file: Optional[str],
                  mc_type: 'ComponentType',
                  **__: Any) -> 'Bom':
-        from os import getcwd
-
-        from .utils.cdx import make_bom
-        from .utils.pyproject import pyproject2dependencies
-
         if pyproject_file is None:
             rc = None
         else:
-            from .utils.pyproject import pyproject2component, pyproject_load
             pyproject = pyproject_load(pyproject_file)
             root_c = pyproject2component(pyproject, type=mc_type)
             root_c.bom_ref.value = 'root-component'
@@ -133,7 +136,6 @@ def __call__(self, *,  # type:ignore[override]
         if python:
             path = self.__path4python(python)
         else:
-            from sys import path as sys_path
             path = sys_path.copy()
         if path[0] in ('', getcwd()):
             path.pop(0)
@@ -145,15 +147,6 @@ def __call__(self, *,  # type:ignore[override]
     def __add_components(self, bom: 'Bom',
                          rc: Optional[Tuple['Component', Iterable['Requirement']]],
                          **kwargs: Any) -> None:
-        from importlib.metadata import distributions
-
-        from cyclonedx.model.component import Component, ComponentType
-        from packaging.requirements import Requirement
-
-        from .utils.cdx import licenses_fixup
-        from .utils.packaging import metadata2extrefs, metadata2licenses
-        from .utils.pep610 import packagesource4dist
-
         all_components: 'T_AllComponents' = {}
         self._logger.debug('distribution context args: %r', kwargs)
         self._logger.info('discovering distributions...')
@@ -193,10 +186,6 @@ def __add_components(self, bom: 'Bom',
         self.__finalize_dependencies(bom, all_components)
 
     def __finalize_dependencies(self, bom: 'Bom', all_components: 'T_AllComponents') -> None:
-        from cyclonedx.model import Property
-
-        from . import PropertyName
-
         for component, requires in all_components.values():
             component_deps: List[Component] = []
             for req in requires:
@@ -217,12 +206,6 @@ def __finalize_dependencies(self, bom: 'Bom', all_components: 'T_AllComponents')
 
     def __component_add_extred_and_purl(self, component: 'Component',
                                         packagesource: Optional['PackageSource']) -> None:
-        from cyclonedx.model import Property
-        from packageurl import PackageURL
-
-        from . import PropertyName
-        from .utils.pep610 import PackageSourceArchive, PackageSourceVcs, packagesource2extref
-
         purl_qs = {}  # https://github.com/package-url/purl-spec/blob/master/PURL-SPECIFICATION.rst
         purl_subpath = None
         if packagesource is not None:
@@ -252,7 +235,6 @@ def __component_add_extred_and_purl(self, component: 'Component',
 
     @staticmethod
     def __py_interpreter(value: str) -> str:
-        from os.path import exists, isdir, join
         if not exists(value):
             raise ValueError(f'No such file or directory: {value}')
         if isdir(value):
@@ -267,8 +249,6 @@ def __py_interpreter(value: str) -> str:
         return value
 
     def __path4python(self, python: str) -> List[str]:
-        from json import loads
-        from subprocess import run  # nosec
         cmd = self.__py_interpreter(python), '-c', 'import json,sys;json.dump(sys.path,sys.stdout)'
         self._logger.debug('fetch `path` from python interpreter cmd: %r', cmd)
         res = run(cmd, capture_output=True, encoding='utf8', shell=False)  # nosec
diff --git a/cyclonedx_py/_internal/pipenv.py b/cyclonedx_py/_internal/pipenv.py
index 9f89ec56..a3be4f2b 100644
--- a/cyclonedx_py/_internal/pipenv.py
+++ b/cyclonedx_py/_internal/pipenv.py
@@ -16,17 +16,28 @@
 # Copyright (c) OWASP Foundation. All Rights Reserved.
 
 
+from argparse import OPTIONAL, ArgumentParser
+from json import loads as json_loads
+from os import getenv
+from os.path import join
+from textwrap import dedent
 from typing import TYPE_CHECKING, Any, Dict, Generator, List, Optional, Set, Tuple
 
-from . import BomBuilder
+from cyclonedx.exception.model import InvalidUriException, UnknownHashTypeException
+from cyclonedx.model import ExternalReference, ExternalReferenceType, HashType, Property, XsUri
+from cyclonedx.model.component import Component, ComponentType
+from packageurl import PackageURL
+
+from . import BomBuilder, PropertyName
+from .cli_common import add_argument_mc_type, add_argument_pyproject
+from .utils.args import arpaese_split
+from .utils.cdx import make_bom
+from .utils.pyproject import pyproject_file2component
 
 if TYPE_CHECKING:  # pragma: no cover
-    from argparse import ArgumentParser
     from logging import Logger
 
-    from cyclonedx.model import ExternalReference
     from cyclonedx.model.bom import Bom
-    from cyclonedx.model.component import Component, ComponentType
 
     NameDict = Dict[str, Any]
 
@@ -40,13 +51,6 @@ class PipenvBB(BomBuilder):
 
     @staticmethod
     def make_argument_parser(**kwargs: Any) -> 'ArgumentParser':
-        from argparse import OPTIONAL, ArgumentParser
-        from os import getenv
-        from textwrap import dedent
-
-        from .cli_common import add_argument_mc_type, add_argument_pyproject
-        from .utils.args import arpaese_split
-
         p = ArgumentParser(description=dedent("""\
                            Build an SBOM from Pipenv.
 
@@ -95,8 +99,6 @@ def __call__(self, *,  # type:ignore[override]
                  pyproject_file: Optional[str],
                  mc_type: 'ComponentType',
                  **__: Any) -> 'Bom':
-        from json import loads as json_loads
-        from os.path import join
 
         # the group-args shall mimic the ones from Pipenv, which uses (comma and/or space)-separated lists
         # values be like: 'foo bar,bazz' -> ['foo', 'bar', 'bazz']
@@ -126,7 +128,6 @@ def __call__(self, *,  # type:ignore[override]
             if pyproject_file is None:
                 rc = None
             else:
-                from .utils.pyproject import pyproject_file2component
                 rc = pyproject_file2component(pyproject_file, type=mc_type)
                 rc.bom_ref.value = 'root-component'
 
@@ -136,13 +137,6 @@ def __call__(self, *,  # type:ignore[override]
 
     def _make_bom(self, root_c: Optional['Component'],
                   locker: 'NameDict', use_groups: Set[str]) -> 'Bom':
-        from cyclonedx.model import Property
-        from cyclonedx.model.component import Component, ComponentType
-        from packageurl import PackageURL
-
-        from . import PropertyName
-        from .utils.cdx import make_bom
-
         self._logger.debug('use_groups: %r', use_groups)
 
         bom = make_bom()
@@ -226,9 +220,6 @@ def __package_vcs(self, data: 'NameDict') -> Optional[Tuple[str, str]]:
 
     def __make_extrefs(self, name: str, data: 'NameDict', source_urls: Dict[str, str]
                        ) -> Generator['ExternalReference', None, None]:
-        from cyclonedx.exception.model import InvalidUriException, UnknownHashTypeException
-        from cyclonedx.model import ExternalReference, ExternalReferenceType, HashType, XsUri
-
         hashes = (HashType.from_composite_str(package_hash)
                   for package_hash
                   in data.get('hashes', ()))
diff --git a/cyclonedx_py/_internal/poetry.py b/cyclonedx_py/_internal/poetry.py
index 1659f483..2e977eed 100644
--- a/cyclonedx_py/_internal/poetry.py
+++ b/cyclonedx_py/_internal/poetry.py
@@ -16,18 +16,30 @@
 # Copyright (c) OWASP Foundation. All Rights Reserved.
 
 
+from argparse import OPTIONAL, ArgumentParser
 from dataclasses import dataclass
+from itertools import chain
+from os.path import join
+from re import compile as re_compile
+from textwrap import dedent
 from typing import TYPE_CHECKING, Any, Dict, Generator, Iterable, List, Optional, Set, Tuple
 
-from . import BomBuilder
+from cyclonedx.exception.model import InvalidUriException, UnknownHashTypeException
+from cyclonedx.model import ExternalReference, ExternalReferenceType, HashType, Property, XsUri
+from cyclonedx.model.component import Component, ComponentScope
+from packageurl import PackageURL
+
+from . import BomBuilder, PropertyName
+from .cli_common import add_argument_mc_type
+from .utils.cdx import make_bom
+from .utils.poetry import poetry2component
+from .utils.toml import toml_loads
 
 if TYPE_CHECKING:  # pragma: no cover
-    from argparse import ArgumentParser
     from logging import Logger
 
-    from cyclonedx.model import ExternalReference
     from cyclonedx.model.bom import Bom
-    from cyclonedx.model.component import Component, ComponentType
+    from cyclonedx.model.component import ComponentType
 
     NameDict = Dict[str, Any]
 
@@ -66,11 +78,6 @@ class PoetryBB(BomBuilder):
 
     @staticmethod
     def make_argument_parser(**kwargs: Any) -> 'ArgumentParser':
-        from argparse import OPTIONAL, ArgumentParser
-        from textwrap import dedent
-
-        from .cli_common import add_argument_mc_type
-
         p = ArgumentParser(description=dedent("""\
                            Build an SBOM from Poetry project.
 
@@ -133,10 +140,6 @@ def __call__(self, *,  # type:ignore[override]
                  extras: List[str], all_extras: bool,
                  mc_type: 'ComponentType',
                  **__: Any) -> 'Bom':
-        from os.path import join
-
-        from .utils.toml import toml_loads
-
         pyproject_file = join(project_directory, 'pyproject.toml')
         lock_file = join(project_directory, 'poetry.lock')
         try:
@@ -211,15 +214,6 @@ def __call__(self, *,  # type:ignore[override]
     def _make_bom(self, project: 'NameDict', locker: 'NameDict',
                   use_groups: Set[str], use_extras: Set[str],
                   mc_type: 'ComponentType') -> 'Bom':
-        from itertools import chain
-        from re import compile as re_compile
-
-        from cyclonedx.model import Property
-
-        from . import PropertyName
-        from .utils.cdx import make_bom
-        from .utils.poetry import poetry2component
-
         self._logger.debug('use_groups: %r', use_groups)
         self._logger.debug('use_extras: %r', use_extras)
 
@@ -351,12 +345,6 @@ def _parse_lock(self, locker: 'NameDict') -> Generator[_LockEntry, None, None]:
     __PACKAGE_SRC_LOCAL = ['file', 'directory']
 
     def __make_component4lock(self, package: 'NameDict') -> 'Component':
-        from cyclonedx.model import Property
-        from cyclonedx.model.component import Component, ComponentScope
-        from packageurl import PackageURL
-
-        from . import PropertyName
-
         source = package['source']
         is_vcs = source.get('type') in self.__PACKAGE_SRC_VCS
         is_local = source.get('type') in self.__PACKAGE_SRC_LOCAL
@@ -428,9 +416,6 @@ def __extrefs4lock(self, package: 'NameDict') -> Generator['ExternalReference',
             yield from self.__extrefs4lock_vcs(package)
 
     def __extrefs4lock_legacy(self, package: 'NameDict') -> Generator['ExternalReference', None, None]:
-        from cyclonedx.exception.model import InvalidUriException, UnknownHashTypeException
-        from cyclonedx.model import ExternalReference, ExternalReferenceType, HashType, XsUri
-
         source_url = package['source'].get('url', 'https://pypi.org/simple')
         for file in package['files']:
             try:
@@ -445,9 +430,6 @@ def __extrefs4lock_legacy(self, package: 'NameDict') -> Generator['ExternalRefer
                 del error
 
     def __extrefs4lock_url(self, package: 'NameDict') -> Generator['ExternalReference', None, None]:
-        from cyclonedx.exception.model import InvalidUriException, UnknownHashTypeException
-        from cyclonedx.model import ExternalReference, ExternalReferenceType, HashType, XsUri
-
         try:
             yield ExternalReference(
                 comment='from url',
@@ -459,9 +441,6 @@ def __extrefs4lock_url(self, package: 'NameDict') -> Generator['ExternalReferenc
             self._logger.debug('skipped dist-extRef for: %r', package['name'], exc_info=error)
 
     def __extrefs4lock_file(self, package: 'NameDict') -> Generator['ExternalReference', None, None]:
-        from cyclonedx.exception.model import InvalidUriException, UnknownHashTypeException
-        from cyclonedx.model import ExternalReference, ExternalReferenceType, HashType, XsUri
-
         try:
             yield ExternalReference(
                 comment='from file',
@@ -473,9 +452,6 @@ def __extrefs4lock_file(self, package: 'NameDict') -> Generator['ExternalReferen
             self._logger.debug('skipped dist-extRef for: %r', package['name'], exc_info=error)
 
     def __extrefs4lock_directory(self, package: 'NameDict') -> Generator['ExternalReference', None, None]:
-        from cyclonedx.exception.model import InvalidUriException
-        from cyclonedx.model import ExternalReference, ExternalReferenceType, XsUri
-
         try:
             yield ExternalReference(
                 comment='from directory',
@@ -487,9 +463,6 @@ def __extrefs4lock_directory(self, package: 'NameDict') -> Generator['ExternalRe
             self._logger.debug('skipped dist-extRef for: %r', package['name'], exc_info=error)
 
     def __extrefs4lock_vcs(self, package: 'NameDict') -> Generator['ExternalReference', None, None]:
-        from cyclonedx.exception.model import InvalidUriException
-        from cyclonedx.model import ExternalReference, ExternalReferenceType, XsUri
-
         source = package['source']
         vcs_ref = source.get('resolved_reference', source.get('reference', ''))
         try:
diff --git a/cyclonedx_py/_internal/requirements.py b/cyclonedx_py/_internal/requirements.py
index 1b2c6dc9..3817a05c 100644
--- a/cyclonedx_py/_internal/requirements.py
+++ b/cyclonedx_py/_internal/requirements.py
@@ -16,18 +16,30 @@
 # Copyright (c) OWASP Foundation. All Rights Reserved.
 
 
+from argparse import OPTIONAL, ArgumentParser
+from functools import reduce
+from os import unlink
+from sys import stdin
+from textwrap import dedent
 from typing import TYPE_CHECKING, Any, Generator, List, Optional, Set
 
-from . import BomBuilder
+from cyclonedx.exception.model import InvalidUriException, UnknownHashTypeException
+from cyclonedx.model import ExternalReference, ExternalReferenceType, HashType, Property, XsUri
+from cyclonedx.model.component import Component, ComponentType
+from packageurl import PackageURL
+from pip_requirements_parser import RequirementsFile  # type:ignore[import-untyped]
+
+from . import BomBuilder, PropertyName
+from .cli_common import add_argument_mc_type, add_argument_pyproject
+from .utils.cdx import make_bom
+from .utils.io import io2file
+from .utils.pyproject import pyproject_file2component
 
 if TYPE_CHECKING:  # pragma: no cover
-    from argparse import ArgumentParser
     from logging import Logger
 
-    from cyclonedx.model import HashType
     from cyclonedx.model.bom import Bom
-    from cyclonedx.model.component import Component, ComponentType
-    from pip_requirements_parser import InstallRequirement, RequirementsFile  # type:ignore[import-untyped]
+    from pip_requirements_parser import InstallRequirement  # type:ignore[import-untyped]
 
 
 # !!! be as lazy loading as possible, as greedy as needed
@@ -38,11 +50,6 @@ class RequirementsBB(BomBuilder):
 
     @staticmethod
     def make_argument_parser(**kwargs: Any) -> 'ArgumentParser':
-        from argparse import OPTIONAL, ArgumentParser
-        from textwrap import dedent
-
-        from .cli_common import add_argument_mc_type, add_argument_pyproject
-
         p = ArgumentParser(description=dedent("""\
                            Build an SBOM from Pip requirements.
 
@@ -105,22 +112,13 @@ def __call__(self, *,  # type:ignore[override]
                  pyproject_file: Optional[str],
                  mc_type: 'ComponentType',
                  **__: Any) -> 'Bom':
-        from os import unlink
-
-        from pip_requirements_parser import RequirementsFile
-
         if pyproject_file is None:
             rc = None
         else:
-            from .utils.pyproject import pyproject_file2component
             rc = pyproject_file2component(pyproject_file, type=mc_type)
             rc.bom_ref.value = 'root-component'
 
         if requirements_file == '-':
-            from sys import stdin
-
-            from .utils.io import io2file
-
             rt = io2file(stdin.buffer)
             try:
                 rf = RequirementsFile.from_file(rt, include_nested=False)
@@ -133,8 +131,6 @@ def __call__(self, *,  # type:ignore[override]
         return self._make_bom(rc, rf)
 
     def _make_bom(self, root_c: Optional['Component'], rf: 'RequirementsFile') -> 'Bom':
-        from .utils.cdx import make_bom
-
         bom = make_bom()
         bom.metadata.component = root_c
         self._logger.debug('root-component: %r', root_c)
@@ -143,8 +139,6 @@ def _make_bom(self, root_c: Optional['Component'], rf: 'RequirementsFile') -> 'B
         return bom
 
     def _add_components(self, bom: 'Bom', rf: 'RequirementsFile') -> None:
-        from functools import reduce
-
         index_url = reduce(lambda c, i: i.options.get('index_url') or c, rf.options, self._index_url)
         extra_index_urls = self._extra_index_urls.union(*(
             i.options['extra_index_urls'] for i in rf.options if 'extra_index_urls' in i.options))
@@ -160,9 +154,6 @@ def _add_components(self, bom: 'Bom', rf: 'RequirementsFile') -> None:
             bom.components.add(component)
 
     def __hashes4req(self, req: 'InstallRequirement') -> Generator['HashType', None, None]:
-        from cyclonedx.exception.model import UnknownHashTypeException
-        from cyclonedx.model import HashType
-
         for hash in req.hash_options:
             try:
                 yield HashType.from_composite_str(hash)
@@ -172,13 +163,6 @@ def __hashes4req(self, req: 'InstallRequirement') -> Generator['HashType', None,
 
     def _make_component(self, req: 'InstallRequirement',
                         index_url: str, extra_index_urls: Set[str]) -> 'Component':
-        from cyclonedx.exception.model import InvalidUriException
-        from cyclonedx.model import ExternalReference, ExternalReferenceType, Property, XsUri
-        from cyclonedx.model.component import Component, ComponentType
-        from packageurl import PackageURL
-
-        from . import PropertyName
-
         name = req.name
         version = req.get_pinned_version or None
         hashes = list(self.__hashes4req(req))
diff --git a/cyclonedx_py/_internal/utils/packaging.py b/cyclonedx_py/_internal/utils/packaging.py
index a47496bf..c2560c1e 100644
--- a/cyclonedx_py/_internal/utils/packaging.py
+++ b/cyclonedx_py/_internal/utils/packaging.py
@@ -17,24 +17,25 @@
 
 from typing import TYPE_CHECKING, Generator, List
 
-from cyclonedx.model import ExternalReferenceType
+from cyclonedx.exception.model import InvalidUriException
+from cyclonedx.factory.license import LicenseFactory
+from cyclonedx.model import ExternalReference, ExternalReferenceType, XsUri
+
+from .cdx import url_label_to_ert
+from .pep621 import classifiers2licenses
 
 if TYPE_CHECKING:  # pragma: no cover
     import sys
 
+    from cyclonedx.model.license import License
+
     if sys.version_info >= (3, 10):
         from importlib.metadata import PackageMetadata
     else:
         from email.message import Message as PackageMetadata
 
-    from cyclonedx.model import ExternalReference
-    from cyclonedx.model.license import License
-
 
 def metadata2licenses(metadata: 'PackageMetadata') -> Generator['License', None, None]:
-    from cyclonedx.factory.license import LicenseFactory
-
-    from .pep621 import classifiers2licenses
     lfac = LicenseFactory()
     if 'Classifier' in metadata:
         # see https://packaging.python.org/en/latest/specifications/core-metadata/#classifier-multiple-use
@@ -46,11 +47,6 @@ def metadata2licenses(metadata: 'PackageMetadata') -> Generator['License', None,
 
 
 def metadata2extrefs(metadata: 'PackageMetadata') -> Generator['ExternalReference', None, None]:
-    from cyclonedx.exception.model import InvalidUriException
-    from cyclonedx.model import ExternalReference, XsUri
-
-    from .cdx import url_label_to_ert
-
     for meta_key, extref_typet in (
         # see https://packaging.python.org/en/latest/specifications/core-metadata/#home-page
         ('Home-page', ExternalReferenceType.WEBSITE),
diff --git a/cyclonedx_py/_internal/utils/pep610.py b/cyclonedx_py/_internal/utils/pep610.py
index 8e9a4ba5..3824c186 100644
--- a/cyclonedx_py/_internal/utils/pep610.py
+++ b/cyclonedx_py/_internal/utils/pep610.py
@@ -27,11 +27,12 @@
 from json import JSONDecodeError, loads as json_loads
 from typing import TYPE_CHECKING, Any, Dict, Optional
 
+from cyclonedx.exception.model import InvalidUriException, UnknownHashTypeException
+from cyclonedx.model import ExternalReference, ExternalReferenceType, HashType, XsUri
+
 if TYPE_CHECKING:
     from importlib.metadata import Distribution
 
-    from cyclonedx.model import ExternalReference
-
 
 class PackageSource(ABC):
     @abstractmethod
@@ -114,8 +115,6 @@ def packagesource4dist(dist: 'Distribution') -> Optional[PackageSource]:
 
 
 def packagesource2extref(src: PackageSource) -> Optional['ExternalReference']:
-    from cyclonedx.exception.model import InvalidUriException, UnknownHashTypeException
-    from cyclonedx.model import ExternalReference, ExternalReferenceType, HashType, XsUri
     sdir = f' (subdirectory {src.subdirectory!r})' if src.subdirectory else ''
     try:
         if isinstance(src, PackageSourceVcs):
diff --git a/cyclonedx_py/_internal/utils/pep621.py b/cyclonedx_py/_internal/utils/pep621.py
index 73744110..a449c2e4 100644
--- a/cyclonedx_py/_internal/utils/pep621.py
+++ b/cyclonedx_py/_internal/utils/pep621.py
@@ -23,18 +23,24 @@
 See https://peps.python.org/pep-0621/
 """
 
+from itertools import chain
 from typing import TYPE_CHECKING, Any, Dict, Generator, Iterable, Iterator
 
+from cyclonedx.exception.model import InvalidUriException
+from cyclonedx.factory.license import LicenseFactory
+from cyclonedx.model import ExternalReference, XsUri
+from cyclonedx.model.component import Component
+from packaging.requirements import Requirement
+
+from .cdx import licenses_fixup, url_label_to_ert
+from .license_trove_classifier import license_trove2spdx
+
 if TYPE_CHECKING:
-    from cyclonedx.factory.license import LicenseFactory
-    from cyclonedx.model import ExternalReference
-    from cyclonedx.model.component import Component, ComponentType
+    from cyclonedx.model.component import ComponentType
     from cyclonedx.model.license import License
-    from packaging.requirements import Requirement
 
 
 def classifiers2licenses(classifiers: Iterable[str], lfac: 'LicenseFactory') -> Generator['License', None, None]:
-    from .license_trove_classifier import license_trove2spdx
     yield from map(lfac.make_from_string,
                    # `lfac.make_with_id` could be a shortcut,
                    # but some SPDX ID might not (yet) be known to CDX.
@@ -59,11 +65,6 @@ def project2licenses(project: Dict[str, Any], lfac: 'LicenseFactory') -> Generat
 
 
 def project2extrefs(project: Dict[str, Any]) -> Generator['ExternalReference', None, None]:
-    from cyclonedx.exception.model import InvalidUriException
-    from cyclonedx.model import ExternalReference, XsUri
-
-    from .cdx import url_label_to_ert
-
     # see https://packaging.python.org/en/latest/specifications/pyproject-toml/#urls
     for label, url in project.get('urls', {}).items():
         try:
@@ -77,11 +78,6 @@ def project2extrefs(project: Dict[str, Any]) -> Generator['ExternalReference', N
 
 def project2component(project: Dict[str, Any], *,
                       type: 'ComponentType') -> 'Component':
-    from cyclonedx.factory.license import LicenseFactory
-    from cyclonedx.model.component import Component
-
-    from .cdx import licenses_fixup
-
     dynamic = project.get('dynamic', ())
     return Component(
         type=type,
@@ -95,10 +91,6 @@ def project2component(project: Dict[str, Any], *,
 
 
 def project2dependencies(project: Dict[str, Any]) -> Iterator['Requirement']:
-    from itertools import chain
-
-    from packaging.requirements import Requirement
-
     return (
         Requirement(dep)
         for dep in chain(
diff --git a/cyclonedx_py/_internal/utils/poetry.py b/cyclonedx_py/_internal/utils/poetry.py
index dc5c1c31..bb955f25 100644
--- a/cyclonedx_py/_internal/utils/poetry.py
+++ b/cyclonedx_py/_internal/utils/poetry.py
@@ -21,21 +21,24 @@
 See https://python-poetry.org/docs/pyproject/
 """
 
+from itertools import chain
 from typing import TYPE_CHECKING, Any, Dict, Generator, List
 
+from cyclonedx.exception.model import InvalidUriException
+from cyclonedx.factory.license import LicenseFactory
+from cyclonedx.model import ExternalReference, ExternalReferenceType, XsUri
+from cyclonedx.model.component import Component
+from packaging.requirements import Requirement
+
+from .cdx import licenses_fixup, url_label_to_ert
+from .pep621 import classifiers2licenses
+
 if TYPE_CHECKING:
-    from cyclonedx.model import ExternalReference
-    from cyclonedx.model.component import Component, ComponentType
+    from cyclonedx.model.component import ComponentType
     from cyclonedx.model.license import License
-    from packaging.requirements import Requirement
 
 
 def poetry2extrefs(poetry: Dict[str, Any]) -> Generator['ExternalReference', None, None]:
-    from cyclonedx.exception.model import InvalidUriException
-    from cyclonedx.model import ExternalReference, ExternalReferenceType, XsUri
-
-    from .cdx import url_label_to_ert
-
     for ers, ert in (
         ('homepage', ExternalReferenceType.WEBSITE),
         ('repository', ExternalReferenceType.VCS),
@@ -59,12 +62,6 @@ def poetry2extrefs(poetry: Dict[str, Any]) -> Generator['ExternalReference', Non
 
 
 def poetry2component(poetry: Dict[str, Any], *, type: 'ComponentType') -> 'Component':
-    from cyclonedx.factory.license import LicenseFactory
-    from cyclonedx.model.component import Component
-
-    from .cdx import licenses_fixup
-    from .pep621 import classifiers2licenses
-
     licenses: List['License'] = []
     lfac = LicenseFactory()
     if 'classifiers' in poetry:
@@ -85,9 +82,6 @@ def poetry2component(poetry: Dict[str, Any], *, type: 'ComponentType') -> 'Compo
 
 
 def poetry2dependencies(poetry: Dict[str, Any]) -> Generator['Requirement', None, None]:
-    from itertools import chain
-
-    from packaging.requirements import Requirement
 
     for name, spec in chain(
         poetry.get('dependencies', {}).items(),
diff --git a/cyclonedx_py/_internal/utils/pyproject.py b/cyclonedx_py/_internal/utils/pyproject.py
index 090ffe7d..f8028aac 100644
--- a/cyclonedx_py/_internal/utils/pyproject.py
+++ b/cyclonedx_py/_internal/utils/pyproject.py
@@ -6,6 +6,7 @@
 
 from .pep621 import project2component, project2dependencies
 from .poetry import poetry2component, poetry2dependencies
+from .toml import toml_loads
 
 if TYPE_CHECKING:  # pragma: no cover
     from cyclonedx.model.component import Component, ComponentType
@@ -23,7 +24,6 @@ def pyproject2component(data: Dict[str, Any], *,
 
 
 def pyproject_load(pyproject_file: str) -> Dict[str, Any]:
-    from .toml import toml_loads
     try:
         pyproject_fh = open(pyproject_file, 'rt', encoding='utf8', errors='replace')
     except OSError as err:

From 4debb94eb29bd858217c800c1b8ccd218a5b13f0 Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Sun, 24 Dec 2023 04:17:56 +0100
Subject: [PATCH 4/8] stats

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 _stats/requirements.csv | 142 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 142 insertions(+)
 create mode 100644 _stats/requirements.csv

diff --git a/_stats/requirements.csv b/_stats/requirements.csv
new file mode 100644
index 00000000..7f785e8a
--- /dev/null
+++ b/_stats/requirements.csv
@@ -0,0 +1,142 @@
+#  %C   command line and arguments
+#  %c   involuntary context switches
+#  %E   elapsed real time (wall clock) in [hour:]min:sec
+#  %e   elapsed real time (wall clock) in seconds
+#  %F   major page faults
+#  %M   maximum resident set size in KB
+#  %P   percent of CPU this job got
+#  %R   minor page faults
+#  %S   system (kernel) time in seconds
+#  %U   user time in seconds
+#  %w   voluntary context switches
+#  %x   exit status of command
+# %C ; %c ; %E ; %e ; %F ; %M ; %P ; %R ; %R ; %S ; %U ; %w ; %x
+cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/editable-self/pyproject.toml tests/_data/infiles/environment/editable-self/.venv ; 141 ; 0:01.74 ; 1.74 ; 0 ; 38480 ; 99% ; 9011 ; 9011 ; 0.16 ; 1.56 ; 5 ; 0
+cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/local/pyproject.toml tests/_data/infiles/environment/local/.venv ; 19 ; 0:01.51 ; 1.51 ; 0 ; 38500 ; 99% ; 8804 ; 8804 ; 0.15 ; 1.35 ; 5 ; 0
+cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/no-deps/pyproject.toml tests/_data/infiles/environment/no-deps/.venv ; 34 ; 0:01.63 ; 1.63 ; 0 ; 39168 ; 99% ; 9005 ; 9005 ; 0.15 ; 1.47 ; 5 ; 0
+cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/via-pipenv/pyproject.toml tests/_data/infiles/environment/via-pipenv/.venv ; 163 ; 0:01.68 ; 1.68 ; 0 ; 39092 ; 98% ; 9025 ; 9025 ; 0.12 ; 1.53 ; 4 ; 0
+cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/via-poetry/pyproject.toml tests/_data/infiles/environment/via-poetry/.venv ; 703 ; 0:01.97 ; 1.97 ; 0 ; 39160 ; 94% ; 9024 ; 9024 ; 0.14 ; 1.71 ; 7 ; 0
+cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/with-extras/pyproject.toml tests/_data/infiles/environment/with-extras/.venv ; 319 ; 0:02.39 ; 2.39 ; 0 ; 39124 ; 94% ; 9034 ; 9034 ; 0.17 ; 2.09 ; 5 ; 0
+cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/with-urls/pyproject.toml tests/_data/infiles/environment/with-urls/.venv ; 187 ; 0:01.82 ; 1.82 ; 0 ; 38552 ; 98% ; 8796 ; 8796 ; 0.13 ; 1.66 ; 8 ; 0
+cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/category-deps/pyproject.toml tests/_data/infiles/pipenv/category-deps ; 22 ; 0:01.63 ; 1.63 ; 0 ; 38400 ; 99% ; 7696 ; 7696 ; 0.14 ; 1.49 ; 1 ; 0
+cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/default-and-dev/pyproject.toml tests/_data/infiles/pipenv/default-and-dev ; 14 ; 0:01.40 ; 1.40 ; 0 ; 38508 ; 99% ; 7699 ; 7699 ; 0.13 ; 1.26 ; 1 ; 0
+cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/editable-self/pyproject.toml tests/_data/infiles/pipenv/editable-self ; 14 ; 0:01.45 ; 1.45 ; 0 ; 38460 ; 99% ; 7694 ; 7694 ; 0.09 ; 1.35 ; 1 ; 0
+cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/local/pyproject.toml tests/_data/infiles/pipenv/local ; 504 ; 0:01.86 ; 1.86 ; 0 ; 38100 ; 84% ; 7695 ; 7695 ; 0.14 ; 1.43 ; 1 ; 0
+cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/no-deps/pyproject.toml tests/_data/infiles/pipenv/no-deps ; 247 ; 0:01.78 ; 1.78 ; 0 ; 39240 ; 82% ; 7893 ; 7893 ; 0.10 ; 1.35 ; 1 ; 0
+cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/private-packages/pyproject.toml tests/_data/infiles/pipenv/private-packages ; 13 ; 0:01.12 ; 1.12 ; 0 ; 38284 ; 99% ; 7698 ; 7698 ; 0.10 ; 1.02 ; 1 ; 0
+cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/with-extras/pyproject.toml tests/_data/infiles/pipenv/with-extras ; 13 ; 0:01.32 ; 1.32 ; 0 ; 38704 ; 99% ; 7749 ; 7749 ; 0.09 ; 1.22 ; 1 ; 0
+cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/with-urls/pyproject.toml tests/_data/infiles/pipenv/with-urls ; 12 ; 0:01.18 ; 1.18 ; 0 ; 38444 ; 99% ; 7712 ; 7712 ; 0.11 ; 1.07 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/group-deps/lock11 ; 7 ; 0:01.19 ; 1.19 ; 0 ; 38280 ; 99% ; 7688 ; 7688 ; 0.09 ; 1.09 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/group-deps/lock20 ; 12 ; 0:01.16 ; 1.16 ; 0 ; 38324 ; 99% ; 7687 ; 7687 ; 0.10 ; 1.06 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/local/lock10 ; 10 ; 0:01.18 ; 1.18 ; 0 ; 38440 ; 99% ; 7680 ; 7680 ; 0.12 ; 1.06 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/local/lock11 ; 24 ; 0:01.22 ; 1.22 ; 0 ; 38200 ; 99% ; 7680 ; 7680 ; 0.10 ; 1.11 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/local/lock20 ; 7 ; 0:01.13 ; 1.13 ; 0 ; 38440 ; 99% ; 7680 ; 7680 ; 0.11 ; 1.01 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/main-and-dev/lock10 ; 15 ; 0:01.18 ; 1.18 ; 0 ; 38424 ; 99% ; 7689 ; 7689 ; 0.09 ; 1.08 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/main-and-dev/lock11 ; 12 ; 0:01.12 ; 1.12 ; 0 ; 38288 ; 100% ; 7686 ; 7686 ; 0.06 ; 1.06 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/main-and-dev/lock20 ; 16 ; 0:01.16 ; 1.16 ; 0 ; 38312 ; 99% ; 7688 ; 7688 ; 0.09 ; 1.06 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/no-deps/lock20 ; 38 ; 0:01.28 ; 1.28 ; 0 ; 39252 ; 99% ; 7897 ; 7897 ; 0.10 ; 1.17 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/private-packges/lock10 ; 59 ; 0:01.19 ; 1.19 ; 0 ; 38196 ; 99% ; 7678 ; 7678 ; 0.07 ; 1.11 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/private-packges/lock11 ; 11 ; 0:01.19 ; 1.19 ; 0 ; 38504 ; 99% ; 7715 ; 7715 ; 0.09 ; 1.10 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/private-packges/lock20 ; 21 ; 0:01.20 ; 1.20 ; 0 ; 38340 ; 99% ; 7716 ; 7716 ; 0.10 ; 1.09 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/regression-issue611/lock20 ; 12 ; 0:01.11 ; 1.11 ; 0 ; 38356 ; 99% ; 7676 ; 7676 ; 0.10 ; 1.00 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-extras/lock10 ; 10 ; 0:01.14 ; 1.14 ; 0 ; 38436 ; 99% ; 7691 ; 7691 ; 0.12 ; 1.01 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-extras/lock11 ; 9 ; 0:01.15 ; 1.15 ; 0 ; 38492 ; 99% ; 7694 ; 7694 ; 0.10 ; 1.04 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-extras/lock20 ; 18 ; 0:01.22 ; 1.22 ; 0 ; 39224 ; 99% ; 7915 ; 7915 ; 0.11 ; 1.10 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-urls/lock10 ; 16 ; 0:01.13 ; 1.13 ; 0 ; 38420 ; 99% ; 7680 ; 7680 ; 0.11 ; 1.01 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-urls/lock11 ; 23 ; 0:01.07 ; 1.07 ; 0 ; 38444 ; 99% ; 7684 ; 7684 ; 0.08 ; 0.99 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-urls/lock20 ; 8 ; 0:01.09 ; 1.09 ; 0 ; 38372 ; 99% ; 7680 ; 7680 ; 0.10 ; 0.99 ; 1 ; 0
+cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/frozen.txt ; 8 ; 0:01.13 ; 1.13 ; 0 ; 39152 ; 99% ; 7901 ; 7901 ; 0.08 ; 1.04 ; 1 ; 0
+cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/local.txt ; 26 ; 0:01.16 ; 1.16 ; 0 ; 39216 ; 99% ; 7904 ; 7904 ; 0.08 ; 1.07 ; 1 ; 0
+cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/nested.txt ; 5 ; 0:01.15 ; 1.15 ; 0 ; 39184 ; 99% ; 7901 ; 7901 ; 0.12 ; 1.02 ; 1 ; 0
+cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/private-packages.txt ; 7 ; 0:01.13 ; 1.13 ; 0 ; 39300 ; 100% ; 7898 ; 7898 ; 0.09 ; 1.04 ; 1 ; 0
+cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/with-comments.txt ; 30 ; 0:01.14 ; 1.14 ; 0 ; 39180 ; 99% ; 7897 ; 7897 ; 0.09 ; 1.05 ; 1 ; 0
+cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/with-extras.txt ; 4 ; 0:01.13 ; 1.13 ; 0 ; 39312 ; 99% ; 7898 ; 7898 ; 0.07 ; 1.06 ; 1 ; 0
+cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/with-hashes.txt ; 33 ; 0:01.17 ; 1.17 ; 0 ; 39268 ; 99% ; 7905 ; 7905 ; 0.08 ; 1.08 ; 1 ; 0
+cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/without-pinned-versions.txt ; 5 ; 0:01.16 ; 1.16 ; 0 ; 39308 ; 99% ; 7898 ; 7898 ; 0.13 ; 1.02 ; 1 ; 0
+cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/with-urls.txt ; 12 ; 0:01.15 ; 1.15 ; 0 ; 39340 ; 99% ; 7904 ; 7904 ; 0.12 ; 1.02 ; 1 ; 0
+cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/editable-self/pyproject.toml tests/_data/infiles/environment/editable-self/.venv ; 63 ; 0:01.64 ; 1.64 ; 0 ; 38192 ; 99% ; 9008 ; 9008 ; 0.17 ; 1.46 ; 5 ; 0
+cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/local/pyproject.toml tests/_data/infiles/environment/local/.venv ; 29 ; 0:01.62 ; 1.62 ; 0 ; 38300 ; 99% ; 8803 ; 8803 ; 0.14 ; 1.47 ; 4 ; 0
+cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/no-deps/pyproject.toml tests/_data/infiles/environment/no-deps/.venv ; 45 ; 0:01.72 ; 1.72 ; 0 ; 39272 ; 99% ; 9004 ; 9004 ; 0.13 ; 1.59 ; 6 ; 0
+cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/via-pipenv/pyproject.toml tests/_data/infiles/environment/via-pipenv/.venv ; 24 ; 0:01.59 ; 1.59 ; 0 ; 39052 ; 99% ; 9024 ; 9024 ; 0.14 ; 1.44 ; 5 ; 0
+cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/via-poetry/pyproject.toml tests/_data/infiles/environment/via-poetry/.venv ; 70 ; 0:01.56 ; 1.56 ; 0 ; 38972 ; 99% ; 9029 ; 9029 ; 0.12 ; 1.43 ; 6 ; 0
+cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/with-extras/pyproject.toml tests/_data/infiles/environment/with-extras/.venv ; 87 ; 0:01.83 ; 1.83 ; 0 ; 39372 ; 99% ; 9036 ; 9036 ; 0.13 ; 1.69 ; 5 ; 0
+cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/with-urls/pyproject.toml tests/_data/infiles/environment/with-urls/.venv ; 62 ; 0:01.54 ; 1.54 ; 0 ; 38296 ; 99% ; 8794 ; 8794 ; 0.13 ; 1.40 ; 6 ; 0
+cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/category-deps/pyproject.toml tests/_data/infiles/pipenv/category-deps ; 14 ; 0:01.54 ; 1.54 ; 0 ; 38352 ; 99% ; 7697 ; 7697 ; 0.10 ; 1.43 ; 1 ; 0
+cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/default-and-dev/pyproject.toml tests/_data/infiles/pipenv/default-and-dev ; 16 ; 0:01.53 ; 1.53 ; 0 ; 38500 ; 99% ; 7695 ; 7695 ; 0.12 ; 1.40 ; 1 ; 0
+cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/editable-self/pyproject.toml tests/_data/infiles/pipenv/editable-self ; 19 ; 0:01.35 ; 1.35 ; 0 ; 38320 ; 99% ; 7695 ; 7695 ; 0.13 ; 1.22 ; 0 ; 0
+cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/local/pyproject.toml tests/_data/infiles/pipenv/local ; 21 ; 0:01.46 ; 1.46 ; 0 ; 38496 ; 99% ; 7694 ; 7694 ; 0.13 ; 1.32 ; 0 ; 0
+cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/no-deps/pyproject.toml tests/_data/infiles/pipenv/no-deps ; 37 ; 0:01.50 ; 1.50 ; 0 ; 39160 ; 99% ; 7895 ; 7895 ; 0.13 ; 1.36 ; 1 ; 0
+cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/private-packages/pyproject.toml tests/_data/infiles/pipenv/private-packages ; 40 ; 0:01.48 ; 1.48 ; 0 ; 38452 ; 99% ; 7698 ; 7698 ; 0.13 ; 1.33 ; 1 ; 0
+cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/with-extras/pyproject.toml tests/_data/infiles/pipenv/with-extras ; 22 ; 0:01.74 ; 1.74 ; 0 ; 38700 ; 99% ; 7747 ; 7747 ; 0.12 ; 1.62 ; 1 ; 0
+cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/with-urls/pyproject.toml tests/_data/infiles/pipenv/with-urls ; 151 ; 0:01.69 ; 1.69 ; 0 ; 38476 ; 98% ; 7708 ; 7708 ; 0.12 ; 1.54 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/group-deps/lock11 ; 142 ; 0:01.75 ; 1.75 ; 0 ; 38264 ; 99% ; 7688 ; 7688 ; 0.09 ; 1.64 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/group-deps/lock20 ; 489 ; 0:01.90 ; 1.90 ; 0 ; 38320 ; 91% ; 7687 ; 7687 ; 0.14 ; 1.59 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/local/lock10 ; 105 ; 0:01.69 ; 1.69 ; 0 ; 38392 ; 99% ; 7680 ; 7680 ; 0.17 ; 1.51 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/local/lock11 ; 14 ; 0:01.45 ; 1.45 ; 0 ; 38284 ; 99% ; 7684 ; 7684 ; 0.13 ; 1.32 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/local/lock20 ; 31 ; 0:01.46 ; 1.46 ; 0 ; 38328 ; 99% ; 7680 ; 7680 ; 0.11 ; 1.34 ; 0 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/main-and-dev/lock10 ; 16 ; 0:01.66 ; 1.66 ; 0 ; 38376 ; 99% ; 7689 ; 7689 ; 0.16 ; 1.49 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/main-and-dev/lock11 ; 10 ; 0:01.52 ; 1.52 ; 0 ; 38480 ; 99% ; 7689 ; 7689 ; 0.14 ; 1.38 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/main-and-dev/lock20 ; 11 ; 0:01.51 ; 1.51 ; 0 ; 38416 ; 99% ; 7691 ; 7691 ; 0.13 ; 1.37 ; 0 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/no-deps/lock20 ; 17 ; 0:01.47 ; 1.47 ; 0 ; 39284 ; 99% ; 7895 ; 7895 ; 0.11 ; 1.35 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/private-packges/lock10 ; 40 ; 0:01.44 ; 1.44 ; 0 ; 38084 ; 99% ; 7683 ; 7683 ; 0.09 ; 1.33 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/private-packges/lock11 ; 8 ; 0:01.80 ; 1.80 ; 0 ; 38588 ; 99% ; 7716 ; 7716 ; 0.18 ; 1.62 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/private-packges/lock20 ; 5 ; 0:01.71 ; 1.71 ; 0 ; 38572 ; 99% ; 7714 ; 7714 ; 0.11 ; 1.59 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/regression-issue611/lock20 ; 32 ; 0:01.54 ; 1.54 ; 0 ; 38200 ; 99% ; 7675 ; 7675 ; 0.14 ; 1.39 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-extras/lock10 ; 9 ; 0:01.45 ; 1.45 ; 0 ; 38500 ; 99% ; 7691 ; 7691 ; 0.13 ; 1.30 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-extras/lock11 ; 12 ; 0:01.44 ; 1.44 ; 0 ; 38352 ; 99% ; 7696 ; 7696 ; 0.11 ; 1.32 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-extras/lock20 ; 16 ; 0:01.53 ; 1.53 ; 0 ; 39368 ; 99% ; 7916 ; 7916 ; 0.12 ; 1.40 ; 0 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-urls/lock10 ; 18 ; 0:01.34 ; 1.34 ; 0 ; 38284 ; 99% ; 7680 ; 7680 ; 0.10 ; 1.23 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-urls/lock11 ; 11 ; 0:01.40 ; 1.40 ; 0 ; 38368 ; 99% ; 7684 ; 7684 ; 0.12 ; 1.28 ; 0 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-urls/lock20 ; 28 ; 0:01.53 ; 1.53 ; 0 ; 38372 ; 99% ; 7685 ; 7685 ; 0.10 ; 1.42 ; 1 ; 0
+cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/frozen.txt ; 10 ; 0:01.48 ; 1.48 ; 0 ; 39136 ; 99% ; 7899 ; 7899 ; 0.13 ; 1.35 ; 1 ; 0
+cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/local.txt ; 12 ; 0:01.61 ; 1.61 ; 0 ; 39176 ; 99% ; 7901 ; 7901 ; 0.16 ; 1.44 ; 1 ; 0
+cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/nested.txt ; 15 ; 0:01.53 ; 1.53 ; 0 ; 39264 ; 99% ; 7900 ; 7900 ; 0.11 ; 1.41 ; 1 ; 0
+cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/private-packages.txt ; 6 ; 0:01.50 ; 1.50 ; 0 ; 39276 ; 99% ; 7895 ; 7895 ; 0.11 ; 1.38 ; 1 ; 0
+cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/with-comments.txt ; 36 ; 0:01.59 ; 1.59 ; 0 ; 39148 ; 99% ; 7900 ; 7900 ; 0.14 ; 1.45 ; 1 ; 0
+cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/with-extras.txt ; 77 ; 0:01.50 ; 1.50 ; 0 ; 39244 ; 99% ; 7899 ; 7899 ; 0.14 ; 1.35 ; 1 ; 0
+cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/with-hashes.txt ; 81 ; 0:01.60 ; 1.60 ; 0 ; 39280 ; 99% ; 7905 ; 7905 ; 0.11 ; 1.48 ; 0 ; 0
+cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/without-pinned-versions.txt ; 43 ; 0:01.49 ; 1.49 ; 0 ; 38980 ; 99% ; 7897 ; 7897 ; 0.11 ; 1.37 ; 1 ; 0
+cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/with-urls.txt ; 25 ; 0:01.43 ; 1.43 ; 0 ; 39104 ; 99% ; 7902 ; 7902 ; 0.11 ; 1.31 ; 1 ; 0
+cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/editable-self/pyproject.toml tests/_data/infiles/environment/editable-self/.venv ; 69 ; 0:01.62 ; 1.62 ; 0 ; 38180 ; 99% ; 9012 ; 9012 ; 0.13 ; 1.48 ; 5 ; 0
+cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/local/pyproject.toml tests/_data/infiles/environment/local/.venv ; 1128 ; 0:02.82 ; 2.82 ; 0 ; 38208 ; 65% ; 8802 ; 8802 ; 0.18 ; 1.65 ; 7 ; 0
+cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/no-deps/pyproject.toml tests/_data/infiles/environment/no-deps/.venv ; 510 ; 0:01.60 ; 1.60 ; 0 ; 39112 ; 93% ; 9000 ; 9000 ; 0.14 ; 1.35 ; 6 ; 0
+cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/via-pipenv/pyproject.toml tests/_data/infiles/environment/via-pipenv/.venv ; 44 ; 0:01.47 ; 1.47 ; 0 ; 39268 ; 94% ; 9025 ; 9025 ; 0.11 ; 1.27 ; 5 ; 0
+cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/via-poetry/pyproject.toml tests/_data/infiles/environment/via-poetry/.venv ; 24 ; 0:01.26 ; 1.26 ; 0 ; 39264 ; 99% ; 9024 ; 9024 ; 0.10 ; 1.15 ; 5 ; 0
+cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/with-extras/pyproject.toml tests/_data/infiles/environment/with-extras/.venv ; 45 ; 0:01.65 ; 1.65 ; 0 ; 39440 ; 99% ; 9034 ; 9034 ; 0.15 ; 1.50 ; 5 ; 0
+cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/with-urls/pyproject.toml tests/_data/infiles/environment/with-urls/.venv ; 13 ; 0:01.18 ; 1.18 ; 0 ; 38336 ; 100% ; 8793 ; 8793 ; 0.09 ; 1.08 ; 5 ; 0
+cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/category-deps/pyproject.toml tests/_data/infiles/pipenv/category-deps ; 25 ; 0:01.07 ; 1.07 ; 0 ; 38480 ; 99% ; 7698 ; 7698 ; 0.08 ; 0.98 ; 1 ; 0
+cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/default-and-dev/pyproject.toml tests/_data/infiles/pipenv/default-and-dev ; 18 ; 0:01.19 ; 1.19 ; 0 ; 38436 ; 99% ; 7696 ; 7696 ; 0.07 ; 1.12 ; 1 ; 0
+cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/editable-self/pyproject.toml tests/_data/infiles/pipenv/editable-self ; 15 ; 0:01.21 ; 1.21 ; 0 ; 38480 ; 99% ; 7695 ; 7695 ; 0.11 ; 1.10 ; 1 ; 0
+cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/local/pyproject.toml tests/_data/infiles/pipenv/local ; 40 ; 0:01.20 ; 1.20 ; 0 ; 38380 ; 99% ; 7693 ; 7693 ; 0.14 ; 1.05 ; 1 ; 0
+cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/no-deps/pyproject.toml tests/_data/infiles/pipenv/no-deps ; 34 ; 0:01.22 ; 1.22 ; 0 ; 39288 ; 99% ; 7896 ; 7896 ; 0.10 ; 1.11 ; 1 ; 0
+cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/private-packages/pyproject.toml tests/_data/infiles/pipenv/private-packages ; 8 ; 0:01.08 ; 1.08 ; 0 ; 38428 ; 99% ; 7698 ; 7698 ; 0.11 ; 0.96 ; 1 ; 0
+cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/with-extras/pyproject.toml tests/_data/infiles/pipenv/with-extras ; 14 ; 0:01.24 ; 1.24 ; 0 ; 38704 ; 99% ; 7748 ; 7748 ; 0.14 ; 1.10 ; 1 ; 0
+cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/with-urls/pyproject.toml tests/_data/infiles/pipenv/with-urls ; 26 ; 0:01.16 ; 1.16 ; 0 ; 38568 ; 99% ; 7716 ; 7716 ; 0.09 ; 1.07 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/group-deps/lock11 ; 8 ; 0:01.13 ; 1.13 ; 0 ; 38440 ; 99% ; 7687 ; 7687 ; 0.11 ; 1.01 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/group-deps/lock20 ; 10 ; 0:01.10 ; 1.10 ; 0 ; 38372 ; 99% ; 7688 ; 7688 ; 0.07 ; 1.03 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/local/lock10 ; 7 ; 0:01.07 ; 1.07 ; 0 ; 38368 ; 99% ; 7681 ; 7681 ; 0.09 ; 0.97 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/local/lock11 ; 5 ; 0:01.07 ; 1.07 ; 0 ; 38400 ; 99% ; 7680 ; 7680 ; 0.10 ; 0.97 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/local/lock20 ; 15 ; 0:01.10 ; 1.10 ; 0 ; 38420 ; 100% ; 7683 ; 7683 ; 0.08 ; 1.01 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/main-and-dev/lock10 ; 5 ; 0:01.09 ; 1.09 ; 0 ; 38376 ; 99% ; 7690 ; 7690 ; 0.07 ; 1.01 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/main-and-dev/lock11 ; 14 ; 0:01.10 ; 1.10 ; 0 ; 38372 ; 99% ; 7686 ; 7686 ; 0.07 ; 1.02 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/main-and-dev/lock20 ; 6 ; 0:01.10 ; 1.10 ; 0 ; 38224 ; 99% ; 7687 ; 7687 ; 0.07 ; 1.03 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/no-deps/lock20 ; 9 ; 0:01.13 ; 1.13 ; 0 ; 39152 ; 99% ; 7896 ; 7896 ; 0.08 ; 1.04 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/private-packges/lock10 ; 5 ; 0:01.08 ; 1.08 ; 0 ; 38224 ; 99% ; 7677 ; 7677 ; 0.08 ; 0.99 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/private-packges/lock11 ; 15 ; 0:01.18 ; 1.18 ; 0 ; 38564 ; 99% ; 7718 ; 7718 ; 0.09 ; 1.08 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/private-packges/lock20 ; 7 ; 0:01.21 ; 1.21 ; 0 ; 38372 ; 99% ; 7714 ; 7714 ; 0.12 ; 1.08 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/regression-issue611/lock20 ; 5 ; 0:01.07 ; 1.07 ; 0 ; 38420 ; 99% ; 7675 ; 7675 ; 0.10 ; 0.97 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-extras/lock10 ; 9 ; 0:01.09 ; 1.09 ; 0 ; 38380 ; 99% ; 7694 ; 7694 ; 0.11 ; 0.98 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-extras/lock11 ; 8 ; 0:01.12 ; 1.12 ; 0 ; 38436 ; 100% ; 7699 ; 7699 ; 0.08 ; 1.04 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-extras/lock20 ; 10 ; 0:01.14 ; 1.14 ; 0 ; 39424 ; 99% ; 7915 ; 7915 ; 0.10 ; 1.03 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-urls/lock10 ; 12 ; 0:01.09 ; 1.09 ; 0 ; 38328 ; 99% ; 7681 ; 7681 ; 0.10 ; 0.98 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-urls/lock11 ; 9 ; 0:01.08 ; 1.08 ; 0 ; 38324 ; 99% ; 7682 ; 7682 ; 0.07 ; 1.00 ; 1 ; 0
+cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-urls/lock20 ; 5 ; 0:01.09 ; 1.09 ; 0 ; 38372 ; 99% ; 7682 ; 7682 ; 0.06 ; 1.03 ; 1 ; 0
+cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/frozen.txt ; 9 ; 0:01.15 ; 1.15 ; 0 ; 39268 ; 99% ; 7898 ; 7898 ; 0.06 ; 1.08 ; 1 ; 0
+cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/local.txt ; 10 ; 0:01.15 ; 1.15 ; 0 ; 39104 ; 99% ; 7903 ; 7903 ; 0.07 ; 1.08 ; 1 ; 0
+cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/nested.txt ; 7 ; 0:01.14 ; 1.14 ; 0 ; 39444 ; 99% ; 7901 ; 7901 ; 0.05 ; 1.08 ; 1 ; 0
+cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/private-packages.txt ; 24 ; 0:01.14 ; 1.14 ; 0 ; 39264 ; 99% ; 7898 ; 7898 ; 0.09 ; 1.04 ; 1 ; 0
+cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/with-comments.txt ; 20 ; 0:01.18 ; 1.18 ; 0 ; 39132 ; 99% ; 7896 ; 7896 ; 0.08 ; 1.09 ; 1 ; 0
+cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/with-extras.txt ; 31 ; 0:01.32 ; 1.32 ; 0 ; 39188 ; 99% ; 7897 ; 7897 ; 0.11 ; 1.20 ; 1 ; 0
+cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/with-hashes.txt ; 15 ; 0:01.40 ; 1.40 ; 0 ; 39352 ; 99% ; 7902 ; 7902 ; 0.12 ; 1.27 ; 1 ; 0
+cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/without-pinned-versions.txt ; 38 ; 0:01.26 ; 1.26 ; 0 ; 39276 ; 99% ; 7898 ; 7898 ; 0.13 ; 1.13 ; 1 ; 0
+cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/with-urls.txt ; 6 ; 0:01.19 ; 1.19 ; 0 ; 39328 ; 99% ; 7902 ; 7902 ; 0.10 ; 1.08 ; 1 ; 0

From ed0e32bc69d4cd2afb6e074e71cf1ffe91de9a72 Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Sun, 24 Dec 2023 04:21:53 +0100
Subject: [PATCH 5/8] style

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 cyclonedx_py/_internal/cli.py          | 10 +++++-----
 cyclonedx_py/_internal/requirements.py |  2 +-
 2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/cyclonedx_py/_internal/cli.py b/cyclonedx_py/_internal/cli.py
index 942e2cbc..e9013691 100644
--- a/cyclonedx_py/_internal/cli.py
+++ b/cyclonedx_py/_internal/cli.py
@@ -34,11 +34,6 @@
 from .requirements import RequirementsBB
 from .utils.args import argparse_type4enum, choices4enum
 
-if sys.version_info >= (3, 9):
-    from argparse import BooleanOptionalAction
-else:
-    BooleanOptionalAction = None
-
 if TYPE_CHECKING:  # pragma: no cover
     from argparse import Action
 
@@ -49,6 +44,11 @@
 
     BooleanOptionalAction: Optional[Type[Action]]
 
+if sys.version_info >= (3, 9):
+    from argparse import BooleanOptionalAction
+else:
+    BooleanOptionalAction = None
+
 
 class Command:
     @classmethod
diff --git a/cyclonedx_py/_internal/requirements.py b/cyclonedx_py/_internal/requirements.py
index 3817a05c..5d0be508 100644
--- a/cyclonedx_py/_internal/requirements.py
+++ b/cyclonedx_py/_internal/requirements.py
@@ -39,7 +39,7 @@
     from logging import Logger
 
     from cyclonedx.model.bom import Bom
-    from pip_requirements_parser import InstallRequirement  # type:ignore[import-untyped]
+    from pip_requirements_parser import InstallRequirement
 
 
 # !!! be as lazy loading as possible, as greedy as needed

From 680f8853b2163eafad9fadcdec4c14281cfefc3f Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Sun, 24 Dec 2023 04:43:17 +0100
Subject: [PATCH 6/8] fix

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 cyclonedx_py/_internal/requirements.py | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/cyclonedx_py/_internal/requirements.py b/cyclonedx_py/_internal/requirements.py
index 5d0be508..79844d41 100644
--- a/cyclonedx_py/_internal/requirements.py
+++ b/cyclonedx_py/_internal/requirements.py
@@ -19,7 +19,6 @@
 from argparse import OPTIONAL, ArgumentParser
 from functools import reduce
 from os import unlink
-from sys import stdin
 from textwrap import dedent
 from typing import TYPE_CHECKING, Any, Generator, List, Optional, Set
 
@@ -119,12 +118,13 @@ def __call__(self, *,  # type:ignore[override]
             rc.bom_ref.value = 'root-component'
 
         if requirements_file == '-':
+            from sys import stdin  # late bind, to allow patching
             rt = io2file(stdin.buffer)
             try:
                 rf = RequirementsFile.from_file(rt, include_nested=False)
             finally:
                 unlink(rt)
-            del rt
+            del rt, stdin
         else:
             rf = RequirementsFile.from_file(requirements_file, include_nested=True)
 

From 256e056dee2a8dde856af8e8b10b600e59a7d933 Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Sun, 24 Dec 2023 04:59:27 +0100
Subject: [PATCH 7/8] done. stats removed

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 _stats/requirements.csv           | 142 ------------------------------
 _stats/requirements.on-demand.csv | 142 ------------------------------
 _stats/requirements.template.csv  |  13 ---
 _stats/run.sh                     |  34 -------
 4 files changed, 331 deletions(-)
 delete mode 100644 _stats/requirements.csv
 delete mode 100644 _stats/requirements.on-demand.csv
 delete mode 100644 _stats/requirements.template.csv
 delete mode 100755 _stats/run.sh

diff --git a/_stats/requirements.csv b/_stats/requirements.csv
deleted file mode 100644
index 7f785e8a..00000000
--- a/_stats/requirements.csv
+++ /dev/null
@@ -1,142 +0,0 @@
-#  %C   command line and arguments
-#  %c   involuntary context switches
-#  %E   elapsed real time (wall clock) in [hour:]min:sec
-#  %e   elapsed real time (wall clock) in seconds
-#  %F   major page faults
-#  %M   maximum resident set size in KB
-#  %P   percent of CPU this job got
-#  %R   minor page faults
-#  %S   system (kernel) time in seconds
-#  %U   user time in seconds
-#  %w   voluntary context switches
-#  %x   exit status of command
-# %C ; %c ; %E ; %e ; %F ; %M ; %P ; %R ; %R ; %S ; %U ; %w ; %x
-cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/editable-self/pyproject.toml tests/_data/infiles/environment/editable-self/.venv ; 141 ; 0:01.74 ; 1.74 ; 0 ; 38480 ; 99% ; 9011 ; 9011 ; 0.16 ; 1.56 ; 5 ; 0
-cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/local/pyproject.toml tests/_data/infiles/environment/local/.venv ; 19 ; 0:01.51 ; 1.51 ; 0 ; 38500 ; 99% ; 8804 ; 8804 ; 0.15 ; 1.35 ; 5 ; 0
-cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/no-deps/pyproject.toml tests/_data/infiles/environment/no-deps/.venv ; 34 ; 0:01.63 ; 1.63 ; 0 ; 39168 ; 99% ; 9005 ; 9005 ; 0.15 ; 1.47 ; 5 ; 0
-cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/via-pipenv/pyproject.toml tests/_data/infiles/environment/via-pipenv/.venv ; 163 ; 0:01.68 ; 1.68 ; 0 ; 39092 ; 98% ; 9025 ; 9025 ; 0.12 ; 1.53 ; 4 ; 0
-cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/via-poetry/pyproject.toml tests/_data/infiles/environment/via-poetry/.venv ; 703 ; 0:01.97 ; 1.97 ; 0 ; 39160 ; 94% ; 9024 ; 9024 ; 0.14 ; 1.71 ; 7 ; 0
-cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/with-extras/pyproject.toml tests/_data/infiles/environment/with-extras/.venv ; 319 ; 0:02.39 ; 2.39 ; 0 ; 39124 ; 94% ; 9034 ; 9034 ; 0.17 ; 2.09 ; 5 ; 0
-cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/with-urls/pyproject.toml tests/_data/infiles/environment/with-urls/.venv ; 187 ; 0:01.82 ; 1.82 ; 0 ; 38552 ; 98% ; 8796 ; 8796 ; 0.13 ; 1.66 ; 8 ; 0
-cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/category-deps/pyproject.toml tests/_data/infiles/pipenv/category-deps ; 22 ; 0:01.63 ; 1.63 ; 0 ; 38400 ; 99% ; 7696 ; 7696 ; 0.14 ; 1.49 ; 1 ; 0
-cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/default-and-dev/pyproject.toml tests/_data/infiles/pipenv/default-and-dev ; 14 ; 0:01.40 ; 1.40 ; 0 ; 38508 ; 99% ; 7699 ; 7699 ; 0.13 ; 1.26 ; 1 ; 0
-cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/editable-self/pyproject.toml tests/_data/infiles/pipenv/editable-self ; 14 ; 0:01.45 ; 1.45 ; 0 ; 38460 ; 99% ; 7694 ; 7694 ; 0.09 ; 1.35 ; 1 ; 0
-cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/local/pyproject.toml tests/_data/infiles/pipenv/local ; 504 ; 0:01.86 ; 1.86 ; 0 ; 38100 ; 84% ; 7695 ; 7695 ; 0.14 ; 1.43 ; 1 ; 0
-cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/no-deps/pyproject.toml tests/_data/infiles/pipenv/no-deps ; 247 ; 0:01.78 ; 1.78 ; 0 ; 39240 ; 82% ; 7893 ; 7893 ; 0.10 ; 1.35 ; 1 ; 0
-cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/private-packages/pyproject.toml tests/_data/infiles/pipenv/private-packages ; 13 ; 0:01.12 ; 1.12 ; 0 ; 38284 ; 99% ; 7698 ; 7698 ; 0.10 ; 1.02 ; 1 ; 0
-cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/with-extras/pyproject.toml tests/_data/infiles/pipenv/with-extras ; 13 ; 0:01.32 ; 1.32 ; 0 ; 38704 ; 99% ; 7749 ; 7749 ; 0.09 ; 1.22 ; 1 ; 0
-cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/with-urls/pyproject.toml tests/_data/infiles/pipenv/with-urls ; 12 ; 0:01.18 ; 1.18 ; 0 ; 38444 ; 99% ; 7712 ; 7712 ; 0.11 ; 1.07 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/group-deps/lock11 ; 7 ; 0:01.19 ; 1.19 ; 0 ; 38280 ; 99% ; 7688 ; 7688 ; 0.09 ; 1.09 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/group-deps/lock20 ; 12 ; 0:01.16 ; 1.16 ; 0 ; 38324 ; 99% ; 7687 ; 7687 ; 0.10 ; 1.06 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/local/lock10 ; 10 ; 0:01.18 ; 1.18 ; 0 ; 38440 ; 99% ; 7680 ; 7680 ; 0.12 ; 1.06 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/local/lock11 ; 24 ; 0:01.22 ; 1.22 ; 0 ; 38200 ; 99% ; 7680 ; 7680 ; 0.10 ; 1.11 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/local/lock20 ; 7 ; 0:01.13 ; 1.13 ; 0 ; 38440 ; 99% ; 7680 ; 7680 ; 0.11 ; 1.01 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/main-and-dev/lock10 ; 15 ; 0:01.18 ; 1.18 ; 0 ; 38424 ; 99% ; 7689 ; 7689 ; 0.09 ; 1.08 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/main-and-dev/lock11 ; 12 ; 0:01.12 ; 1.12 ; 0 ; 38288 ; 100% ; 7686 ; 7686 ; 0.06 ; 1.06 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/main-and-dev/lock20 ; 16 ; 0:01.16 ; 1.16 ; 0 ; 38312 ; 99% ; 7688 ; 7688 ; 0.09 ; 1.06 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/no-deps/lock20 ; 38 ; 0:01.28 ; 1.28 ; 0 ; 39252 ; 99% ; 7897 ; 7897 ; 0.10 ; 1.17 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/private-packges/lock10 ; 59 ; 0:01.19 ; 1.19 ; 0 ; 38196 ; 99% ; 7678 ; 7678 ; 0.07 ; 1.11 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/private-packges/lock11 ; 11 ; 0:01.19 ; 1.19 ; 0 ; 38504 ; 99% ; 7715 ; 7715 ; 0.09 ; 1.10 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/private-packges/lock20 ; 21 ; 0:01.20 ; 1.20 ; 0 ; 38340 ; 99% ; 7716 ; 7716 ; 0.10 ; 1.09 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/regression-issue611/lock20 ; 12 ; 0:01.11 ; 1.11 ; 0 ; 38356 ; 99% ; 7676 ; 7676 ; 0.10 ; 1.00 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-extras/lock10 ; 10 ; 0:01.14 ; 1.14 ; 0 ; 38436 ; 99% ; 7691 ; 7691 ; 0.12 ; 1.01 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-extras/lock11 ; 9 ; 0:01.15 ; 1.15 ; 0 ; 38492 ; 99% ; 7694 ; 7694 ; 0.10 ; 1.04 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-extras/lock20 ; 18 ; 0:01.22 ; 1.22 ; 0 ; 39224 ; 99% ; 7915 ; 7915 ; 0.11 ; 1.10 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-urls/lock10 ; 16 ; 0:01.13 ; 1.13 ; 0 ; 38420 ; 99% ; 7680 ; 7680 ; 0.11 ; 1.01 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-urls/lock11 ; 23 ; 0:01.07 ; 1.07 ; 0 ; 38444 ; 99% ; 7684 ; 7684 ; 0.08 ; 0.99 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-urls/lock20 ; 8 ; 0:01.09 ; 1.09 ; 0 ; 38372 ; 99% ; 7680 ; 7680 ; 0.10 ; 0.99 ; 1 ; 0
-cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/frozen.txt ; 8 ; 0:01.13 ; 1.13 ; 0 ; 39152 ; 99% ; 7901 ; 7901 ; 0.08 ; 1.04 ; 1 ; 0
-cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/local.txt ; 26 ; 0:01.16 ; 1.16 ; 0 ; 39216 ; 99% ; 7904 ; 7904 ; 0.08 ; 1.07 ; 1 ; 0
-cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/nested.txt ; 5 ; 0:01.15 ; 1.15 ; 0 ; 39184 ; 99% ; 7901 ; 7901 ; 0.12 ; 1.02 ; 1 ; 0
-cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/private-packages.txt ; 7 ; 0:01.13 ; 1.13 ; 0 ; 39300 ; 100% ; 7898 ; 7898 ; 0.09 ; 1.04 ; 1 ; 0
-cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/with-comments.txt ; 30 ; 0:01.14 ; 1.14 ; 0 ; 39180 ; 99% ; 7897 ; 7897 ; 0.09 ; 1.05 ; 1 ; 0
-cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/with-extras.txt ; 4 ; 0:01.13 ; 1.13 ; 0 ; 39312 ; 99% ; 7898 ; 7898 ; 0.07 ; 1.06 ; 1 ; 0
-cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/with-hashes.txt ; 33 ; 0:01.17 ; 1.17 ; 0 ; 39268 ; 99% ; 7905 ; 7905 ; 0.08 ; 1.08 ; 1 ; 0
-cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/without-pinned-versions.txt ; 5 ; 0:01.16 ; 1.16 ; 0 ; 39308 ; 99% ; 7898 ; 7898 ; 0.13 ; 1.02 ; 1 ; 0
-cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/with-urls.txt ; 12 ; 0:01.15 ; 1.15 ; 0 ; 39340 ; 99% ; 7904 ; 7904 ; 0.12 ; 1.02 ; 1 ; 0
-cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/editable-self/pyproject.toml tests/_data/infiles/environment/editable-self/.venv ; 63 ; 0:01.64 ; 1.64 ; 0 ; 38192 ; 99% ; 9008 ; 9008 ; 0.17 ; 1.46 ; 5 ; 0
-cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/local/pyproject.toml tests/_data/infiles/environment/local/.venv ; 29 ; 0:01.62 ; 1.62 ; 0 ; 38300 ; 99% ; 8803 ; 8803 ; 0.14 ; 1.47 ; 4 ; 0
-cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/no-deps/pyproject.toml tests/_data/infiles/environment/no-deps/.venv ; 45 ; 0:01.72 ; 1.72 ; 0 ; 39272 ; 99% ; 9004 ; 9004 ; 0.13 ; 1.59 ; 6 ; 0
-cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/via-pipenv/pyproject.toml tests/_data/infiles/environment/via-pipenv/.venv ; 24 ; 0:01.59 ; 1.59 ; 0 ; 39052 ; 99% ; 9024 ; 9024 ; 0.14 ; 1.44 ; 5 ; 0
-cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/via-poetry/pyproject.toml tests/_data/infiles/environment/via-poetry/.venv ; 70 ; 0:01.56 ; 1.56 ; 0 ; 38972 ; 99% ; 9029 ; 9029 ; 0.12 ; 1.43 ; 6 ; 0
-cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/with-extras/pyproject.toml tests/_data/infiles/environment/with-extras/.venv ; 87 ; 0:01.83 ; 1.83 ; 0 ; 39372 ; 99% ; 9036 ; 9036 ; 0.13 ; 1.69 ; 5 ; 0
-cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/with-urls/pyproject.toml tests/_data/infiles/environment/with-urls/.venv ; 62 ; 0:01.54 ; 1.54 ; 0 ; 38296 ; 99% ; 8794 ; 8794 ; 0.13 ; 1.40 ; 6 ; 0
-cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/category-deps/pyproject.toml tests/_data/infiles/pipenv/category-deps ; 14 ; 0:01.54 ; 1.54 ; 0 ; 38352 ; 99% ; 7697 ; 7697 ; 0.10 ; 1.43 ; 1 ; 0
-cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/default-and-dev/pyproject.toml tests/_data/infiles/pipenv/default-and-dev ; 16 ; 0:01.53 ; 1.53 ; 0 ; 38500 ; 99% ; 7695 ; 7695 ; 0.12 ; 1.40 ; 1 ; 0
-cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/editable-self/pyproject.toml tests/_data/infiles/pipenv/editable-self ; 19 ; 0:01.35 ; 1.35 ; 0 ; 38320 ; 99% ; 7695 ; 7695 ; 0.13 ; 1.22 ; 0 ; 0
-cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/local/pyproject.toml tests/_data/infiles/pipenv/local ; 21 ; 0:01.46 ; 1.46 ; 0 ; 38496 ; 99% ; 7694 ; 7694 ; 0.13 ; 1.32 ; 0 ; 0
-cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/no-deps/pyproject.toml tests/_data/infiles/pipenv/no-deps ; 37 ; 0:01.50 ; 1.50 ; 0 ; 39160 ; 99% ; 7895 ; 7895 ; 0.13 ; 1.36 ; 1 ; 0
-cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/private-packages/pyproject.toml tests/_data/infiles/pipenv/private-packages ; 40 ; 0:01.48 ; 1.48 ; 0 ; 38452 ; 99% ; 7698 ; 7698 ; 0.13 ; 1.33 ; 1 ; 0
-cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/with-extras/pyproject.toml tests/_data/infiles/pipenv/with-extras ; 22 ; 0:01.74 ; 1.74 ; 0 ; 38700 ; 99% ; 7747 ; 7747 ; 0.12 ; 1.62 ; 1 ; 0
-cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/with-urls/pyproject.toml tests/_data/infiles/pipenv/with-urls ; 151 ; 0:01.69 ; 1.69 ; 0 ; 38476 ; 98% ; 7708 ; 7708 ; 0.12 ; 1.54 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/group-deps/lock11 ; 142 ; 0:01.75 ; 1.75 ; 0 ; 38264 ; 99% ; 7688 ; 7688 ; 0.09 ; 1.64 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/group-deps/lock20 ; 489 ; 0:01.90 ; 1.90 ; 0 ; 38320 ; 91% ; 7687 ; 7687 ; 0.14 ; 1.59 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/local/lock10 ; 105 ; 0:01.69 ; 1.69 ; 0 ; 38392 ; 99% ; 7680 ; 7680 ; 0.17 ; 1.51 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/local/lock11 ; 14 ; 0:01.45 ; 1.45 ; 0 ; 38284 ; 99% ; 7684 ; 7684 ; 0.13 ; 1.32 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/local/lock20 ; 31 ; 0:01.46 ; 1.46 ; 0 ; 38328 ; 99% ; 7680 ; 7680 ; 0.11 ; 1.34 ; 0 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/main-and-dev/lock10 ; 16 ; 0:01.66 ; 1.66 ; 0 ; 38376 ; 99% ; 7689 ; 7689 ; 0.16 ; 1.49 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/main-and-dev/lock11 ; 10 ; 0:01.52 ; 1.52 ; 0 ; 38480 ; 99% ; 7689 ; 7689 ; 0.14 ; 1.38 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/main-and-dev/lock20 ; 11 ; 0:01.51 ; 1.51 ; 0 ; 38416 ; 99% ; 7691 ; 7691 ; 0.13 ; 1.37 ; 0 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/no-deps/lock20 ; 17 ; 0:01.47 ; 1.47 ; 0 ; 39284 ; 99% ; 7895 ; 7895 ; 0.11 ; 1.35 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/private-packges/lock10 ; 40 ; 0:01.44 ; 1.44 ; 0 ; 38084 ; 99% ; 7683 ; 7683 ; 0.09 ; 1.33 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/private-packges/lock11 ; 8 ; 0:01.80 ; 1.80 ; 0 ; 38588 ; 99% ; 7716 ; 7716 ; 0.18 ; 1.62 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/private-packges/lock20 ; 5 ; 0:01.71 ; 1.71 ; 0 ; 38572 ; 99% ; 7714 ; 7714 ; 0.11 ; 1.59 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/regression-issue611/lock20 ; 32 ; 0:01.54 ; 1.54 ; 0 ; 38200 ; 99% ; 7675 ; 7675 ; 0.14 ; 1.39 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-extras/lock10 ; 9 ; 0:01.45 ; 1.45 ; 0 ; 38500 ; 99% ; 7691 ; 7691 ; 0.13 ; 1.30 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-extras/lock11 ; 12 ; 0:01.44 ; 1.44 ; 0 ; 38352 ; 99% ; 7696 ; 7696 ; 0.11 ; 1.32 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-extras/lock20 ; 16 ; 0:01.53 ; 1.53 ; 0 ; 39368 ; 99% ; 7916 ; 7916 ; 0.12 ; 1.40 ; 0 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-urls/lock10 ; 18 ; 0:01.34 ; 1.34 ; 0 ; 38284 ; 99% ; 7680 ; 7680 ; 0.10 ; 1.23 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-urls/lock11 ; 11 ; 0:01.40 ; 1.40 ; 0 ; 38368 ; 99% ; 7684 ; 7684 ; 0.12 ; 1.28 ; 0 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-urls/lock20 ; 28 ; 0:01.53 ; 1.53 ; 0 ; 38372 ; 99% ; 7685 ; 7685 ; 0.10 ; 1.42 ; 1 ; 0
-cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/frozen.txt ; 10 ; 0:01.48 ; 1.48 ; 0 ; 39136 ; 99% ; 7899 ; 7899 ; 0.13 ; 1.35 ; 1 ; 0
-cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/local.txt ; 12 ; 0:01.61 ; 1.61 ; 0 ; 39176 ; 99% ; 7901 ; 7901 ; 0.16 ; 1.44 ; 1 ; 0
-cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/nested.txt ; 15 ; 0:01.53 ; 1.53 ; 0 ; 39264 ; 99% ; 7900 ; 7900 ; 0.11 ; 1.41 ; 1 ; 0
-cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/private-packages.txt ; 6 ; 0:01.50 ; 1.50 ; 0 ; 39276 ; 99% ; 7895 ; 7895 ; 0.11 ; 1.38 ; 1 ; 0
-cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/with-comments.txt ; 36 ; 0:01.59 ; 1.59 ; 0 ; 39148 ; 99% ; 7900 ; 7900 ; 0.14 ; 1.45 ; 1 ; 0
-cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/with-extras.txt ; 77 ; 0:01.50 ; 1.50 ; 0 ; 39244 ; 99% ; 7899 ; 7899 ; 0.14 ; 1.35 ; 1 ; 0
-cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/with-hashes.txt ; 81 ; 0:01.60 ; 1.60 ; 0 ; 39280 ; 99% ; 7905 ; 7905 ; 0.11 ; 1.48 ; 0 ; 0
-cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/without-pinned-versions.txt ; 43 ; 0:01.49 ; 1.49 ; 0 ; 38980 ; 99% ; 7897 ; 7897 ; 0.11 ; 1.37 ; 1 ; 0
-cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/with-urls.txt ; 25 ; 0:01.43 ; 1.43 ; 0 ; 39104 ; 99% ; 7902 ; 7902 ; 0.11 ; 1.31 ; 1 ; 0
-cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/editable-self/pyproject.toml tests/_data/infiles/environment/editable-self/.venv ; 69 ; 0:01.62 ; 1.62 ; 0 ; 38180 ; 99% ; 9012 ; 9012 ; 0.13 ; 1.48 ; 5 ; 0
-cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/local/pyproject.toml tests/_data/infiles/environment/local/.venv ; 1128 ; 0:02.82 ; 2.82 ; 0 ; 38208 ; 65% ; 8802 ; 8802 ; 0.18 ; 1.65 ; 7 ; 0
-cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/no-deps/pyproject.toml tests/_data/infiles/environment/no-deps/.venv ; 510 ; 0:01.60 ; 1.60 ; 0 ; 39112 ; 93% ; 9000 ; 9000 ; 0.14 ; 1.35 ; 6 ; 0
-cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/via-pipenv/pyproject.toml tests/_data/infiles/environment/via-pipenv/.venv ; 44 ; 0:01.47 ; 1.47 ; 0 ; 39268 ; 94% ; 9025 ; 9025 ; 0.11 ; 1.27 ; 5 ; 0
-cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/via-poetry/pyproject.toml tests/_data/infiles/environment/via-poetry/.venv ; 24 ; 0:01.26 ; 1.26 ; 0 ; 39264 ; 99% ; 9024 ; 9024 ; 0.10 ; 1.15 ; 5 ; 0
-cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/with-extras/pyproject.toml tests/_data/infiles/environment/with-extras/.venv ; 45 ; 0:01.65 ; 1.65 ; 0 ; 39440 ; 99% ; 9034 ; 9034 ; 0.15 ; 1.50 ; 5 ; 0
-cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/with-urls/pyproject.toml tests/_data/infiles/environment/with-urls/.venv ; 13 ; 0:01.18 ; 1.18 ; 0 ; 38336 ; 100% ; 8793 ; 8793 ; 0.09 ; 1.08 ; 5 ; 0
-cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/category-deps/pyproject.toml tests/_data/infiles/pipenv/category-deps ; 25 ; 0:01.07 ; 1.07 ; 0 ; 38480 ; 99% ; 7698 ; 7698 ; 0.08 ; 0.98 ; 1 ; 0
-cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/default-and-dev/pyproject.toml tests/_data/infiles/pipenv/default-and-dev ; 18 ; 0:01.19 ; 1.19 ; 0 ; 38436 ; 99% ; 7696 ; 7696 ; 0.07 ; 1.12 ; 1 ; 0
-cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/editable-self/pyproject.toml tests/_data/infiles/pipenv/editable-self ; 15 ; 0:01.21 ; 1.21 ; 0 ; 38480 ; 99% ; 7695 ; 7695 ; 0.11 ; 1.10 ; 1 ; 0
-cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/local/pyproject.toml tests/_data/infiles/pipenv/local ; 40 ; 0:01.20 ; 1.20 ; 0 ; 38380 ; 99% ; 7693 ; 7693 ; 0.14 ; 1.05 ; 1 ; 0
-cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/no-deps/pyproject.toml tests/_data/infiles/pipenv/no-deps ; 34 ; 0:01.22 ; 1.22 ; 0 ; 39288 ; 99% ; 7896 ; 7896 ; 0.10 ; 1.11 ; 1 ; 0
-cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/private-packages/pyproject.toml tests/_data/infiles/pipenv/private-packages ; 8 ; 0:01.08 ; 1.08 ; 0 ; 38428 ; 99% ; 7698 ; 7698 ; 0.11 ; 0.96 ; 1 ; 0
-cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/with-extras/pyproject.toml tests/_data/infiles/pipenv/with-extras ; 14 ; 0:01.24 ; 1.24 ; 0 ; 38704 ; 99% ; 7748 ; 7748 ; 0.14 ; 1.10 ; 1 ; 0
-cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/with-urls/pyproject.toml tests/_data/infiles/pipenv/with-urls ; 26 ; 0:01.16 ; 1.16 ; 0 ; 38568 ; 99% ; 7716 ; 7716 ; 0.09 ; 1.07 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/group-deps/lock11 ; 8 ; 0:01.13 ; 1.13 ; 0 ; 38440 ; 99% ; 7687 ; 7687 ; 0.11 ; 1.01 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/group-deps/lock20 ; 10 ; 0:01.10 ; 1.10 ; 0 ; 38372 ; 99% ; 7688 ; 7688 ; 0.07 ; 1.03 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/local/lock10 ; 7 ; 0:01.07 ; 1.07 ; 0 ; 38368 ; 99% ; 7681 ; 7681 ; 0.09 ; 0.97 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/local/lock11 ; 5 ; 0:01.07 ; 1.07 ; 0 ; 38400 ; 99% ; 7680 ; 7680 ; 0.10 ; 0.97 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/local/lock20 ; 15 ; 0:01.10 ; 1.10 ; 0 ; 38420 ; 100% ; 7683 ; 7683 ; 0.08 ; 1.01 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/main-and-dev/lock10 ; 5 ; 0:01.09 ; 1.09 ; 0 ; 38376 ; 99% ; 7690 ; 7690 ; 0.07 ; 1.01 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/main-and-dev/lock11 ; 14 ; 0:01.10 ; 1.10 ; 0 ; 38372 ; 99% ; 7686 ; 7686 ; 0.07 ; 1.02 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/main-and-dev/lock20 ; 6 ; 0:01.10 ; 1.10 ; 0 ; 38224 ; 99% ; 7687 ; 7687 ; 0.07 ; 1.03 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/no-deps/lock20 ; 9 ; 0:01.13 ; 1.13 ; 0 ; 39152 ; 99% ; 7896 ; 7896 ; 0.08 ; 1.04 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/private-packges/lock10 ; 5 ; 0:01.08 ; 1.08 ; 0 ; 38224 ; 99% ; 7677 ; 7677 ; 0.08 ; 0.99 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/private-packges/lock11 ; 15 ; 0:01.18 ; 1.18 ; 0 ; 38564 ; 99% ; 7718 ; 7718 ; 0.09 ; 1.08 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/private-packges/lock20 ; 7 ; 0:01.21 ; 1.21 ; 0 ; 38372 ; 99% ; 7714 ; 7714 ; 0.12 ; 1.08 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/regression-issue611/lock20 ; 5 ; 0:01.07 ; 1.07 ; 0 ; 38420 ; 99% ; 7675 ; 7675 ; 0.10 ; 0.97 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-extras/lock10 ; 9 ; 0:01.09 ; 1.09 ; 0 ; 38380 ; 99% ; 7694 ; 7694 ; 0.11 ; 0.98 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-extras/lock11 ; 8 ; 0:01.12 ; 1.12 ; 0 ; 38436 ; 100% ; 7699 ; 7699 ; 0.08 ; 1.04 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-extras/lock20 ; 10 ; 0:01.14 ; 1.14 ; 0 ; 39424 ; 99% ; 7915 ; 7915 ; 0.10 ; 1.03 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-urls/lock10 ; 12 ; 0:01.09 ; 1.09 ; 0 ; 38328 ; 99% ; 7681 ; 7681 ; 0.10 ; 0.98 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-urls/lock11 ; 9 ; 0:01.08 ; 1.08 ; 0 ; 38324 ; 99% ; 7682 ; 7682 ; 0.07 ; 1.00 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-urls/lock20 ; 5 ; 0:01.09 ; 1.09 ; 0 ; 38372 ; 99% ; 7682 ; 7682 ; 0.06 ; 1.03 ; 1 ; 0
-cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/frozen.txt ; 9 ; 0:01.15 ; 1.15 ; 0 ; 39268 ; 99% ; 7898 ; 7898 ; 0.06 ; 1.08 ; 1 ; 0
-cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/local.txt ; 10 ; 0:01.15 ; 1.15 ; 0 ; 39104 ; 99% ; 7903 ; 7903 ; 0.07 ; 1.08 ; 1 ; 0
-cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/nested.txt ; 7 ; 0:01.14 ; 1.14 ; 0 ; 39444 ; 99% ; 7901 ; 7901 ; 0.05 ; 1.08 ; 1 ; 0
-cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/private-packages.txt ; 24 ; 0:01.14 ; 1.14 ; 0 ; 39264 ; 99% ; 7898 ; 7898 ; 0.09 ; 1.04 ; 1 ; 0
-cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/with-comments.txt ; 20 ; 0:01.18 ; 1.18 ; 0 ; 39132 ; 99% ; 7896 ; 7896 ; 0.08 ; 1.09 ; 1 ; 0
-cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/with-extras.txt ; 31 ; 0:01.32 ; 1.32 ; 0 ; 39188 ; 99% ; 7897 ; 7897 ; 0.11 ; 1.20 ; 1 ; 0
-cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/with-hashes.txt ; 15 ; 0:01.40 ; 1.40 ; 0 ; 39352 ; 99% ; 7902 ; 7902 ; 0.12 ; 1.27 ; 1 ; 0
-cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/without-pinned-versions.txt ; 38 ; 0:01.26 ; 1.26 ; 0 ; 39276 ; 99% ; 7898 ; 7898 ; 0.13 ; 1.13 ; 1 ; 0
-cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/with-urls.txt ; 6 ; 0:01.19 ; 1.19 ; 0 ; 39328 ; 99% ; 7902 ; 7902 ; 0.10 ; 1.08 ; 1 ; 0
diff --git a/_stats/requirements.on-demand.csv b/_stats/requirements.on-demand.csv
deleted file mode 100644
index 630e44e2..00000000
--- a/_stats/requirements.on-demand.csv
+++ /dev/null
@@ -1,142 +0,0 @@
-#  %C   command line and arguments
-#  %c   involuntary context switches
-#  %E   elapsed real time (wall clock) in [hour:]min:sec
-#  %e   elapsed real time (wall clock) in seconds
-#  %F   major page faults
-#  %M   maximum resident set size in KB
-#  %P   percent of CPU this job got
-#  %R   minor page faults
-#  %S   system (kernel) time in seconds
-#  %U   user time in seconds
-#  %w   voluntary context switches
-#  %x   exit status of command
-# %C ; %c ; %E ; %e ; %F ; %M ; %P ; %R ; %R ; %S ; %U ; %w ; %x
-cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/editable-self/pyproject.toml tests/_data/infiles/environment/editable-self/.venv ; 53 ; 0:01.56 ; 1.56 ; 0 ; 35340 ; 99% ; 8274 ; 8274 ; 0.14 ; 1.41 ; 5 ; 0
-cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/local/pyproject.toml tests/_data/infiles/environment/local/.venv ; 39 ; 0:01.62 ; 1.62 ; 0 ; 35384 ; 99% ; 8072 ; 8072 ; 0.11 ; 1.50 ; 5 ; 0
-cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/no-deps/pyproject.toml tests/_data/infiles/environment/no-deps/.venv ; 30 ; 0:01.58 ; 1.58 ; 0 ; 36268 ; 99% ; 8273 ; 8273 ; 0.19 ; 1.38 ; 5 ; 0
-cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/via-pipenv/pyproject.toml tests/_data/infiles/environment/via-pipenv/.venv ; 39 ; 0:01.49 ; 1.49 ; 0 ; 36152 ; 99% ; 8298 ; 8298 ; 0.14 ; 1.35 ; 4 ; 0
-cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/via-poetry/pyproject.toml tests/_data/infiles/environment/via-poetry/.venv ; 68 ; 0:01.59 ; 1.59 ; 0 ; 36208 ; 99% ; 8292 ; 8292 ; 0.10 ; 1.48 ; 5 ; 0
-cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/with-extras/pyproject.toml tests/_data/infiles/environment/with-extras/.venv ; 58 ; 0:01.75 ; 1.75 ; 0 ; 36464 ; 99% ; 8315 ; 8315 ; 0.13 ; 1.61 ; 5 ; 0
-cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/with-urls/pyproject.toml tests/_data/infiles/environment/with-urls/.venv ; 39 ; 0:01.53 ; 1.53 ; 0 ; 35284 ; 99% ; 8064 ; 8064 ; 0.17 ; 1.35 ; 5 ; 0
-cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/category-deps/pyproject.toml tests/_data/infiles/pipenv/category-deps ; 6 ; 0:01.22 ; 1.22 ; 0 ; 34324 ; 99% ; 6676 ; 6676 ; 0.07 ; 1.14 ; 1 ; 0
-cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/default-and-dev/pyproject.toml tests/_data/infiles/pipenv/default-and-dev ; 35 ; 0:01.25 ; 1.25 ; 0 ; 34156 ; 99% ; 6673 ; 6673 ; 0.12 ; 1.12 ; 1 ; 0
-cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/editable-self/pyproject.toml tests/_data/infiles/pipenv/editable-self ; 10 ; 0:01.28 ; 1.28 ; 0 ; 34164 ; 99% ; 6675 ; 6675 ; 0.09 ; 1.18 ; 1 ; 0
-cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/local/pyproject.toml tests/_data/infiles/pipenv/local ; 42 ; 0:01.25 ; 1.25 ; 0 ; 34244 ; 99% ; 6677 ; 6677 ; 0.10 ; 1.15 ; 1 ; 0
-cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/no-deps/pyproject.toml tests/_data/infiles/pipenv/no-deps ; 65 ; 0:01.23 ; 1.23 ; 0 ; 35180 ; 99% ; 6879 ; 6879 ; 0.08 ; 1.14 ; 1 ; 0
-cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/private-packages/pyproject.toml tests/_data/infiles/pipenv/private-packages ; 22 ; 0:01.31 ; 1.31 ; 0 ; 34372 ; 99% ; 6679 ; 6679 ; 0.11 ; 1.20 ; 1 ; 0
-cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/with-extras/pyproject.toml tests/_data/infiles/pipenv/with-extras ; 25 ; 0:01.56 ; 1.56 ; 0 ; 34496 ; 99% ; 6723 ; 6723 ; 0.09 ; 1.45 ; 1 ; 0
-cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/with-urls/pyproject.toml tests/_data/infiles/pipenv/with-urls ; 11 ; 0:01.43 ; 1.43 ; 0 ; 34288 ; 99% ; 6692 ; 6692 ; 0.11 ; 1.31 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/group-deps/lock11 ; 288 ; 0:01.86 ; 1.86 ; 0 ; 34480 ; 79% ; 6718 ; 6718 ; 0.12 ; 1.36 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/group-deps/lock20 ; 507 ; 0:02.03 ; 2.03 ; 0 ; 34256 ; 73% ; 6712 ; 6712 ; 0.10 ; 1.39 ; 0 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/local/lock10 ; 57 ; 0:01.34 ; 1.34 ; 0 ; 34216 ; 99% ; 6677 ; 6677 ; 0.11 ; 1.22 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/local/lock11 ; 332 ; 0:01.42 ; 1.42 ; 0 ; 34296 ; 93% ; 6678 ; 6678 ; 0.08 ; 1.25 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/local/lock20 ; 43 ; 0:01.00 ; 1.00 ; 0 ; 34328 ; 99% ; 6682 ; 6682 ; 0.09 ; 0.90 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/main-and-dev/lock10 ; 9 ; 0:00.96 ; 0.96 ; 0 ; 34468 ; 99% ; 6706 ; 6706 ; 0.08 ; 0.88 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/main-and-dev/lock11 ; 17 ; 0:01.02 ; 1.02 ; 0 ; 34568 ; 99% ; 6712 ; 6712 ; 0.05 ; 0.97 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/main-and-dev/lock20 ; 7 ; 0:00.98 ; 0.98 ; 0 ; 34472 ; 99% ; 6706 ; 6706 ; 0.05 ; 0.93 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/no-deps/lock20 ; 16 ; 0:01.07 ; 1.07 ; 0 ; 35232 ; 99% ; 6889 ; 6889 ; 0.10 ; 0.97 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/private-packges/lock10 ; 10 ; 0:00.95 ; 0.95 ; 0 ; 34464 ; 99% ; 6684 ; 6684 ; 0.08 ; 0.86 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/private-packges/lock11 ; 26 ; 0:01.05 ; 1.05 ; 0 ; 34764 ; 99% ; 6791 ; 6791 ; 0.06 ; 0.99 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/private-packges/lock20 ; 9 ; 0:01.06 ; 1.06 ; 0 ; 34768 ; 99% ; 6788 ; 6788 ; 0.09 ; 0.97 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/regression-issue611/lock20 ; 7 ; 0:00.92 ; 0.92 ; 0 ; 34336 ; 99% ; 6673 ; 6673 ; 0.08 ; 0.83 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-extras/lock10 ; 9 ; 0:00.95 ; 0.95 ; 0 ; 34556 ; 99% ; 6701 ; 6701 ; 0.10 ; 0.84 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-extras/lock11 ; 13 ; 0:01.00 ; 1.00 ; 0 ; 34980 ; 99% ; 6832 ; 6832 ; 0.07 ; 0.92 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-extras/lock20 ; 6 ; 0:01.00 ; 1.00 ; 0 ; 35288 ; 99% ; 6888 ; 6888 ; 0.03 ; 0.96 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-urls/lock10 ; 6 ; 0:00.94 ; 0.94 ; 0 ; 34380 ; 99% ; 6693 ; 6693 ; 0.09 ; 0.85 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-urls/lock11 ; 3 ; 0:00.93 ; 0.93 ; 0 ; 34468 ; 99% ; 6691 ; 6691 ; 0.06 ; 0.87 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-urls/lock20 ; 12 ; 0:01.06 ; 1.06 ; 0 ; 34424 ; 99% ; 6690 ; 6690 ; 0.11 ; 0.94 ; 1 ; 0
-cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/frozen.txt ; 5 ; 0:01.06 ; 1.06 ; 0 ; 36356 ; 99% ; 7212 ; 7212 ; 0.07 ; 0.98 ; 1 ; 0
-cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/local.txt ; 15 ; 0:01.07 ; 1.07 ; 0 ; 36388 ; 99% ; 7219 ; 7219 ; 0.06 ; 1.00 ; 1 ; 0
-cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/nested.txt ; 22 ; 0:01.06 ; 1.06 ; 0 ; 36540 ; 99% ; 7214 ; 7214 ; 0.07 ; 0.98 ; 1 ; 0
-cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/private-packages.txt ; 9 ; 0:01.05 ; 1.05 ; 0 ; 36464 ; 100% ; 7213 ; 7213 ; 0.08 ; 0.96 ; 1 ; 0
-cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/with-comments.txt ; 5 ; 0:01.06 ; 1.06 ; 0 ; 36360 ; 99% ; 7215 ; 7215 ; 0.09 ; 0.97 ; 1 ; 0
-cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/with-extras.txt ; 5 ; 0:01.07 ; 1.07 ; 0 ; 36464 ; 99% ; 7216 ; 7216 ; 0.07 ; 0.99 ; 1 ; 0
-cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/with-hashes.txt ; 12 ; 0:01.08 ; 1.08 ; 0 ; 36296 ; 99% ; 7219 ; 7219 ; 0.09 ; 0.98 ; 1 ; 0
-cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/without-pinned-versions.txt ; 20 ; 0:01.09 ; 1.09 ; 0 ; 36380 ; 99% ; 7214 ; 7214 ; 0.06 ; 1.03 ; 1 ; 0
-cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/with-urls.txt ; 21 ; 0:01.19 ; 1.19 ; 0 ; 36452 ; 99% ; 7220 ; 7220 ; 0.10 ; 1.08 ; 1 ; 0
-cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/editable-self/pyproject.toml tests/_data/infiles/environment/editable-self/.venv ; 36 ; 0:01.59 ; 1.59 ; 0 ; 35432 ; 99% ; 8280 ; 8280 ; 0.12 ; 1.46 ; 5 ; 0
-cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/local/pyproject.toml tests/_data/infiles/environment/local/.venv ; 36 ; 0:01.49 ; 1.49 ; 0 ; 35456 ; 99% ; 8074 ; 8074 ; 0.14 ; 1.35 ; 4 ; 0
-cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/no-deps/pyproject.toml tests/_data/infiles/environment/no-deps/.venv ; 14 ; 0:01.60 ; 1.60 ; 0 ; 36180 ; 99% ; 8277 ; 8277 ; 0.13 ; 1.46 ; 7 ; 0
-cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/via-pipenv/pyproject.toml tests/_data/infiles/environment/via-pipenv/.venv ; 37 ; 0:01.53 ; 1.53 ; 0 ; 36092 ; 99% ; 8297 ; 8297 ; 0.13 ; 1.40 ; 5 ; 0
-cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/via-poetry/pyproject.toml tests/_data/infiles/environment/via-poetry/.venv ; 45 ; 0:01.58 ; 1.58 ; 0 ; 36152 ; 99% ; 8295 ; 8295 ; 0.12 ; 1.45 ; 7 ; 0
-cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/with-extras/pyproject.toml tests/_data/infiles/environment/with-extras/.venv ; 29 ; 0:01.71 ; 1.71 ; 0 ; 36296 ; 99% ; 8316 ; 8316 ; 0.15 ; 1.56 ; 5 ; 0
-cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/with-urls/pyproject.toml tests/_data/infiles/environment/with-urls/.venv ; 28 ; 0:01.61 ; 1.61 ; 0 ; 35352 ; 99% ; 8064 ; 8064 ; 0.11 ; 1.49 ; 5 ; 0
-cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/category-deps/pyproject.toml tests/_data/infiles/pipenv/category-deps ; 16 ; 0:01.26 ; 1.26 ; 0 ; 34192 ; 99% ; 6674 ; 6674 ; 0.08 ; 1.17 ; 1 ; 0
-cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/default-and-dev/pyproject.toml tests/_data/infiles/pipenv/default-and-dev ; 12 ; 0:01.18 ; 1.18 ; 0 ; 34360 ; 99% ; 6672 ; 6672 ; 0.10 ; 1.08 ; 1 ; 0
-cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/editable-self/pyproject.toml tests/_data/infiles/pipenv/editable-self ; 62 ; 0:01.24 ; 1.24 ; 0 ; 34156 ; 99% ; 6673 ; 6673 ; 0.11 ; 1.12 ; 1 ; 0
-cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/local/pyproject.toml tests/_data/infiles/pipenv/local ; 15 ; 0:01.26 ; 1.26 ; 0 ; 34360 ; 99% ; 6676 ; 6676 ; 0.10 ; 1.15 ; 1 ; 0
-cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/no-deps/pyproject.toml tests/_data/infiles/pipenv/no-deps ; 46 ; 0:01.23 ; 1.23 ; 0 ; 35208 ; 99% ; 6881 ; 6881 ; 0.11 ; 1.12 ; 1 ; 0
-cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/private-packages/pyproject.toml tests/_data/infiles/pipenv/private-packages ; 10 ; 0:01.23 ; 1.23 ; 0 ; 34360 ; 99% ; 6678 ; 6678 ; 0.11 ; 1.11 ; 1 ; 0
-cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/with-extras/pyproject.toml tests/_data/infiles/pipenv/with-extras ; 35 ; 0:01.40 ; 1.40 ; 0 ; 34440 ; 99% ; 6722 ; 6722 ; 0.12 ; 1.27 ; 1 ; 0
-cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/with-urls/pyproject.toml tests/_data/infiles/pipenv/with-urls ; 8 ; 0:01.36 ; 1.36 ; 0 ; 34488 ; 99% ; 6692 ; 6692 ; 0.07 ; 1.28 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/group-deps/lock11 ; 27 ; 0:01.41 ; 1.41 ; 0 ; 34608 ; 99% ; 6714 ; 6714 ; 0.10 ; 1.30 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/group-deps/lock20 ; 21 ; 0:01.44 ; 1.44 ; 0 ; 34500 ; 99% ; 6715 ; 6715 ; 0.10 ; 1.33 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/local/lock10 ; 46 ; 0:01.28 ; 1.28 ; 0 ; 34064 ; 99% ; 6677 ; 6677 ; 0.10 ; 1.17 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/local/lock11 ; 12 ; 0:01.30 ; 1.30 ; 0 ; 34468 ; 99% ; 6681 ; 6681 ; 0.09 ; 1.20 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/local/lock20 ; 20 ; 0:01.29 ; 1.29 ; 0 ; 34332 ; 99% ; 6678 ; 6678 ; 0.11 ; 1.17 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/main-and-dev/lock10 ; 26 ; 0:01.27 ; 1.27 ; 0 ; 34196 ; 99% ; 6706 ; 6706 ; 0.09 ; 1.18 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/main-and-dev/lock11 ; 8 ; 0:01.29 ; 1.29 ; 0 ; 34616 ; 99% ; 6715 ; 6715 ; 0.13 ; 1.15 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/main-and-dev/lock20 ; 14 ; 0:01.30 ; 1.30 ; 0 ; 34336 ; 99% ; 6709 ; 6709 ; 0.10 ; 1.19 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/no-deps/lock20 ; 18 ; 0:01.30 ; 1.30 ; 0 ; 35172 ; 99% ; 6896 ; 6896 ; 0.13 ; 1.16 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/private-packges/lock10 ; 11 ; 0:01.24 ; 1.24 ; 0 ; 34464 ; 99% ; 6682 ; 6682 ; 0.10 ; 1.13 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/private-packges/lock11 ; 9 ; 0:01.41 ; 1.41 ; 0 ; 34852 ; 99% ; 6793 ; 6793 ; 0.11 ; 1.29 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/private-packges/lock20 ; 6 ; 0:01.35 ; 1.35 ; 0 ; 34932 ; 99% ; 6788 ; 6788 ; 0.07 ; 1.28 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/regression-issue611/lock20 ; 7 ; 0:01.19 ; 1.19 ; 0 ; 34456 ; 99% ; 6675 ; 6675 ; 0.12 ; 1.06 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-extras/lock10 ; 26 ; 0:01.19 ; 1.19 ; 0 ; 34124 ; 99% ; 6704 ; 6704 ; 0.10 ; 1.08 ; 0 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-extras/lock11 ; 29 ; 0:01.29 ; 1.29 ; 0 ; 34924 ; 99% ; 6834 ; 6834 ; 0.08 ; 1.20 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-extras/lock20 ; 18 ; 0:01.36 ; 1.36 ; 0 ; 35168 ; 99% ; 6891 ; 6891 ; 0.08 ; 1.27 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-urls/lock10 ; 12 ; 0:01.42 ; 1.42 ; 0 ; 34464 ; 99% ; 6695 ; 6695 ; 0.12 ; 1.30 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-urls/lock11 ; 20 ; 0:01.28 ; 1.28 ; 0 ; 34440 ; 99% ; 6694 ; 6694 ; 0.10 ; 1.18 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-urls/lock20 ; 13 ; 0:01.27 ; 1.27 ; 0 ; 34464 ; 99% ; 6694 ; 6694 ; 0.14 ; 1.13 ; 1 ; 0
-cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/frozen.txt ; 7 ; 0:01.52 ; 1.52 ; 0 ; 36492 ; 100% ; 7217 ; 7217 ; 0.11 ; 1.41 ; 1 ; 0
-cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/local.txt ; 22 ; 0:01.48 ; 1.48 ; 0 ; 36220 ; 99% ; 7215 ; 7215 ; 0.14 ; 1.33 ; 1 ; 0
-cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/nested.txt ; 65 ; 0:01.51 ; 1.51 ; 0 ; 36304 ; 99% ; 7213 ; 7213 ; 0.11 ; 1.38 ; 0 ; 0
-cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/private-packages.txt ; 53 ; 0:01.38 ; 1.38 ; 0 ; 36324 ; 99% ; 7214 ; 7214 ; 0.12 ; 1.25 ; 1 ; 0
-cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/with-comments.txt ; 11 ; 0:01.49 ; 1.49 ; 0 ; 36476 ; 99% ; 7217 ; 7217 ; 0.09 ; 1.40 ; 1 ; 0
-cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/with-extras.txt ; 10 ; 0:01.34 ; 1.34 ; 0 ; 36420 ; 99% ; 7217 ; 7217 ; 0.11 ; 1.22 ; 1 ; 0
-cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/with-hashes.txt ; 54 ; 0:01.43 ; 1.43 ; 0 ; 36620 ; 99% ; 7220 ; 7220 ; 0.10 ; 1.32 ; 1 ; 0
-cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/without-pinned-versions.txt ; 14 ; 0:01.55 ; 1.55 ; 0 ; 36356 ; 99% ; 7213 ; 7213 ; 0.11 ; 1.43 ; 1 ; 0
-cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/with-urls.txt ; 36 ; 0:01.44 ; 1.44 ; 0 ; 36464 ; 99% ; 7217 ; 7217 ; 0.08 ; 1.35 ; 1 ; 0
-cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/editable-self/pyproject.toml tests/_data/infiles/environment/editable-self/.venv ; 70 ; 0:01.44 ; 1.44 ; 0 ; 35372 ; 99% ; 8280 ; 8280 ; 0.09 ; 1.34 ; 4 ; 0
-cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/local/pyproject.toml tests/_data/infiles/environment/local/.venv ; 45 ; 0:01.55 ; 1.55 ; 0 ; 35452 ; 99% ; 8069 ; 8069 ; 0.13 ; 1.41 ; 5 ; 0
-cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/no-deps/pyproject.toml tests/_data/infiles/environment/no-deps/.venv ; 40 ; 0:01.50 ; 1.50 ; 0 ; 35968 ; 99% ; 8276 ; 8276 ; 0.12 ; 1.38 ; 5 ; 0
-cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/via-pipenv/pyproject.toml tests/_data/infiles/environment/via-pipenv/.venv ; 41 ; 0:01.43 ; 1.43 ; 0 ; 36012 ; 99% ; 8298 ; 8298 ; 0.13 ; 1.30 ; 5 ; 0
-cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/via-poetry/pyproject.toml tests/_data/infiles/environment/via-poetry/.venv ; 24 ; 0:01.57 ; 1.57 ; 0 ; 36100 ; 99% ; 8299 ; 8299 ; 0.12 ; 1.45 ; 5 ; 0
-cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/with-extras/pyproject.toml tests/_data/infiles/environment/with-extras/.venv ; 24 ; 0:01.89 ; 1.89 ; 0 ; 36396 ; 99% ; 8312 ; 8312 ; 0.12 ; 1.76 ; 6 ; 0
-cyclonedx-py environment -o /dev/null --pyproject tests/_data/infiles/environment/with-urls/pyproject.toml tests/_data/infiles/environment/with-urls/.venv ; 12 ; 0:01.43 ; 1.43 ; 0 ; 35580 ; 99% ; 8065 ; 8065 ; 0.12 ; 1.30 ; 5 ; 0
-cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/category-deps/pyproject.toml tests/_data/infiles/pipenv/category-deps ; 58 ; 0:01.26 ; 1.26 ; 0 ; 34312 ; 99% ; 6674 ; 6674 ; 0.12 ; 1.13 ; 1 ; 0
-cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/default-and-dev/pyproject.toml tests/_data/infiles/pipenv/default-and-dev ; 64 ; 0:01.19 ; 1.19 ; 0 ; 34136 ; 99% ; 6672 ; 6672 ; 0.09 ; 1.09 ; 0 ; 0
-cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/editable-self/pyproject.toml tests/_data/infiles/pipenv/editable-self ; 56 ; 0:01.50 ; 1.50 ; 0 ; 34320 ; 99% ; 6676 ; 6676 ; 0.13 ; 1.36 ; 1 ; 0
-cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/local/pyproject.toml tests/_data/infiles/pipenv/local ; 73 ; 0:01.44 ; 1.44 ; 0 ; 34364 ; 99% ; 6677 ; 6677 ; 0.11 ; 1.32 ; 1 ; 0
-cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/no-deps/pyproject.toml tests/_data/infiles/pipenv/no-deps ; 38 ; 0:01.49 ; 1.49 ; 0 ; 35128 ; 98% ; 6881 ; 6881 ; 0.11 ; 1.36 ; 0 ; 0
-cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/private-packages/pyproject.toml tests/_data/infiles/pipenv/private-packages ; 182 ; 0:01.47 ; 1.47 ; 0 ; 34364 ; 99% ; 6679 ; 6679 ; 0.15 ; 1.30 ; 1 ; 0
-cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/with-extras/pyproject.toml tests/_data/infiles/pipenv/with-extras ; 44 ; 0:01.50 ; 1.50 ; 0 ; 34620 ; 99% ; 6720 ; 6720 ; 0.13 ; 1.36 ; 1 ; 0
-cyclonedx-py pipenv -o /dev/null --pyproject tests/_data/infiles/pipenv/with-urls/pyproject.toml tests/_data/infiles/pipenv/with-urls ; 44 ; 0:01.31 ; 1.31 ; 0 ; 34408 ; 99% ; 6695 ; 6695 ; 0.12 ; 1.18 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/group-deps/lock11 ; 16 ; 0:01.37 ; 1.37 ; 0 ; 34604 ; 99% ; 6712 ; 6712 ; 0.10 ; 1.26 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/group-deps/lock20 ; 22 ; 0:01.36 ; 1.36 ; 0 ; 34396 ; 99% ; 6713 ; 6713 ; 0.10 ; 1.25 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/local/lock10 ; 10 ; 0:01.17 ; 1.17 ; 0 ; 34204 ; 99% ; 6677 ; 6677 ; 0.09 ; 1.08 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/local/lock11 ; 10 ; 0:01.24 ; 1.24 ; 0 ; 34452 ; 99% ; 6681 ; 6681 ; 0.09 ; 1.14 ; 0 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/local/lock20 ; 6 ; 0:01.22 ; 1.22 ; 0 ; 34464 ; 100% ; 6683 ; 6683 ; 0.08 ; 1.13 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/main-and-dev/lock10 ; 12 ; 0:01.22 ; 1.22 ; 0 ; 34380 ; 99% ; 6710 ; 6710 ; 0.12 ; 1.09 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/main-and-dev/lock11 ; 21 ; 0:01.30 ; 1.30 ; 0 ; 34444 ; 99% ; 6712 ; 6712 ; 0.11 ; 1.18 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/main-and-dev/lock20 ; 11 ; 0:01.31 ; 1.31 ; 0 ; 34600 ; 99% ; 6708 ; 6708 ; 0.10 ; 1.20 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/no-deps/lock20 ; 46 ; 0:01.26 ; 1.26 ; 0 ; 35304 ; 99% ; 6895 ; 6895 ; 0.10 ; 1.15 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/private-packges/lock10 ; 40 ; 0:01.32 ; 1.32 ; 0 ; 34248 ; 99% ; 6683 ; 6683 ; 0.12 ; 1.19 ; 0 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/private-packges/lock11 ; 48 ; 0:01.58 ; 1.58 ; 0 ; 34772 ; 99% ; 6790 ; 6790 ; 0.11 ; 1.46 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/private-packges/lock20 ; 27 ; 0:01.47 ; 1.47 ; 0 ; 34628 ; 99% ; 6787 ; 6787 ; 0.10 ; 1.35 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/regression-issue611/lock20 ; 13 ; 0:01.24 ; 1.24 ; 0 ; 34460 ; 99% ; 6675 ; 6675 ; 0.11 ; 1.13 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-extras/lock10 ; 24 ; 0:01.36 ; 1.36 ; 0 ; 34216 ; 99% ; 6704 ; 6704 ; 0.10 ; 1.25 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-extras/lock11 ; 18 ; 0:01.31 ; 1.31 ; 0 ; 34864 ; 99% ; 6832 ; 6832 ; 0.11 ; 1.19 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-extras/lock20 ; 73 ; 0:01.41 ; 1.41 ; 0 ; 35300 ; 99% ; 6888 ; 6888 ; 0.12 ; 1.28 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-urls/lock10 ; 18 ; 0:01.37 ; 1.37 ; 0 ; 34492 ; 99% ; 6695 ; 6695 ; 0.10 ; 1.26 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-urls/lock11 ; 59 ; 0:01.30 ; 1.30 ; 0 ; 34476 ; 99% ; 6693 ; 6693 ; 0.09 ; 1.20 ; 1 ; 0
-cyclonedx-py poetry -o /dev/null tests/_data/infiles/poetry/with-urls/lock20 ; 26 ; 0:01.33 ; 1.33 ; 0 ; 34328 ; 99% ; 6694 ; 6694 ; 0.11 ; 1.20 ; 1 ; 0
-cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/frozen.txt ; 23 ; 0:01.48 ; 1.48 ; 0 ; 36416 ; 98% ; 7214 ; 7214 ; 0.10 ; 1.37 ; 1 ; 0
-cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/local.txt ; 24 ; 0:01.39 ; 1.39 ; 0 ; 36212 ; 99% ; 7214 ; 7214 ; 0.11 ; 1.27 ; 1 ; 0
-cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/nested.txt ; 23 ; 0:01.30 ; 1.30 ; 0 ; 36368 ; 99% ; 7215 ; 7215 ; 0.12 ; 1.18 ; 0 ; 0
-cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/private-packages.txt ; 32 ; 0:01.44 ; 1.44 ; 0 ; 36260 ; 99% ; 7214 ; 7214 ; 0.10 ; 1.33 ; 1 ; 0
-cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/with-comments.txt ; 14 ; 0:01.47 ; 1.47 ; 0 ; 36348 ; 99% ; 7216 ; 7216 ; 0.15 ; 1.32 ; 1 ; 0
-cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/with-extras.txt ; 19 ; 0:01.31 ; 1.31 ; 0 ; 36360 ; 99% ; 7213 ; 7213 ; 0.10 ; 1.20 ; 1 ; 0
-cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/with-hashes.txt ; 43 ; 0:01.38 ; 1.38 ; 0 ; 36436 ; 99% ; 7222 ; 7222 ; 0.10 ; 1.28 ; 1 ; 0
-cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/without-pinned-versions.txt ; 28 ; 0:01.46 ; 1.46 ; 0 ; 36380 ; 99% ; 7220 ; 7220 ; 0.11 ; 1.35 ; 1 ; 0
-cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml -o /dev/null tests/_data/infiles/requirements/with-urls.txt ; 38 ; 0:01.57 ; 1.57 ; 0 ; 36176 ; 99% ; 7219 ; 7219 ; 0.11 ; 1.45 ; 1 ; 0
diff --git a/_stats/requirements.template.csv b/_stats/requirements.template.csv
deleted file mode 100644
index 69618ca0..00000000
--- a/_stats/requirements.template.csv
+++ /dev/null
@@ -1,13 +0,0 @@
-#  %C   command line and arguments
-#  %c   involuntary context switches
-#  %E   elapsed real time (wall clock) in [hour:]min:sec
-#  %e   elapsed real time (wall clock) in seconds
-#  %F   major page faults
-#  %M   maximum resident set size in KB
-#  %P   percent of CPU this job got
-#  %R   minor page faults
-#  %S   system (kernel) time in seconds
-#  %U   user time in seconds
-#  %w   voluntary context switches
-#  %x   exit status of command
-# %C ; %c ; %E ; %e ; %F ; %M ; %P ; %R ; %R ; %S ; %U ; %w ; %x
diff --git a/_stats/run.sh b/_stats/run.sh
deleted file mode 100755
index aaa4f7a5..00000000
--- a/_stats/run.sh
+++ /dev/null
@@ -1,34 +0,0 @@
-#!/usr/bin/env bash
-set -xue
-
-TFORMAT='%C ; %c ; %E ; %e ; %F ; %M ; %P ; %R ; %R ; %S ; %U ; %w ; %x'
-SFILE='_stats/requirements.csv'
-
-
-for i in tests/_data/infiles/environment/*
-do
-  if [[ ! "$i" =~ "broken" ]]
-  then
-    /bin/time -f "$TFORMAT" -a -o "$SFILE" \
-    cyclonedx-py environment -o /dev/null --pyproject "$i"/pyproject.toml "$i"/.venv
-  fi
-done
-
-for i in tests/_data/infiles/pipenv/*
-do
-  /bin/time -f "$TFORMAT" -a -o "$SFILE" \
-  cyclonedx-py pipenv -o /dev/null --pyproject "$i"/pyproject.toml "$i"
-done
-
-for i in tests/_data/infiles/poetry/*/lock*
-do
-  /bin/time -f "$TFORMAT" -a -o "$SFILE" \
-  cyclonedx-py poetry -o /dev/null "$i"
-done
-
-for i in tests/_data/infiles/requirements/*.txt
-do
-  /bin/time -f "$TFORMAT" -a -o "$SFILE" \
-  cyclonedx-py requirements --pyproject tests/_data/infiles/requirements/pyproject.toml \
-    -o /dev/null "$i"
-done

From 69fc92958f00c84076de2c9c1fd17690d62136bb Mon Sep 17 00:00:00 2001
From: Jan Kowalleck <jan.kowalleck@gmail.com>
Date: Sun, 24 Dec 2023 05:02:53 +0100
Subject: [PATCH 8/8] docs

Signed-off-by: Jan Kowalleck <jan.kowalleck@gmail.com>
---
 cyclonedx_py/_internal/environment.py  | 4 ----
 cyclonedx_py/_internal/pipenv.py       | 4 ----
 cyclonedx_py/_internal/poetry.py       | 4 ----
 cyclonedx_py/_internal/requirements.py | 4 ----
 4 files changed, 16 deletions(-)

diff --git a/cyclonedx_py/_internal/environment.py b/cyclonedx_py/_internal/environment.py
index 135763f4..d2a95d56 100644
--- a/cyclonedx_py/_internal/environment.py
+++ b/cyclonedx_py/_internal/environment.py
@@ -48,10 +48,6 @@
     T_AllComponents = Dict[str, Tuple['Component', Iterable[Requirement]]]
 
 
-# !!! be as lazy loading as possible, as greedy as needed
-# TODO: measure with `/bin/time -v` for max resident size and see if this changes when global imports are used
-
-
 class EnvironmentBB(BomBuilder):
 
     @staticmethod
diff --git a/cyclonedx_py/_internal/pipenv.py b/cyclonedx_py/_internal/pipenv.py
index a3be4f2b..14e917af 100644
--- a/cyclonedx_py/_internal/pipenv.py
+++ b/cyclonedx_py/_internal/pipenv.py
@@ -42,10 +42,6 @@
     NameDict = Dict[str, Any]
 
 
-# !!! be as lazy loading as possible, as greedy as needed
-# TODO: measure with `/bin/time -v` for max resident size and see if this changes when global imports are used
-
-
 class PipenvBB(BomBuilder):
     __LOCKFILE_META = '_meta'
 
diff --git a/cyclonedx_py/_internal/poetry.py b/cyclonedx_py/_internal/poetry.py
index 2e977eed..64e820ca 100644
--- a/cyclonedx_py/_internal/poetry.py
+++ b/cyclonedx_py/_internal/poetry.py
@@ -44,10 +44,6 @@
     NameDict = Dict[str, Any]
 
 
-# !!! be as lazy loading as possible, as greedy as needed
-# TODO: measure with `/bin/time -v` for max resident size and see if this changes when global imports are used
-
-
 @dataclass
 class _LockEntry:
     name: str
diff --git a/cyclonedx_py/_internal/requirements.py b/cyclonedx_py/_internal/requirements.py
index 79844d41..9e61c42e 100644
--- a/cyclonedx_py/_internal/requirements.py
+++ b/cyclonedx_py/_internal/requirements.py
@@ -41,10 +41,6 @@
     from pip_requirements_parser import InstallRequirement
 
 
-# !!! be as lazy loading as possible, as greedy as needed
-# TODO: measure with `/bin/time -v` for max resident size and see if this changes when global imports are used
-
-
 class RequirementsBB(BomBuilder):
 
     @staticmethod
