Releases: spdx/tools-python
Releases · spdx/tools-python
v0.8.3
What's Changed
- [issue-771] fix license expression error handling in tag-value parser by @armintaenzertng in #772
- spdx3: software_purpose: add REQUIREMENT type by @stanislaw in #787
- [issue-798] fix tag-value parser: parse Tool or Organization as annotator by @meretp in #799
- [issue-773] shorten output of FileNotFoundError when called via the CLI by @armintaenzertng in #777
- [issue-774] fix tag-value output when related_spdx_element_id is "NONE" or "NOASSERTION" by @armintaenzertng in #778
- [issue-775] catch decoding errors while parsing using the cli tool by @armintaenzertng in #779
- [issue-806] replace Licensing() with spdx_licensing by @armintaenzertng in #814
- spdx3: element_writer: switch from tab characters to two spaces by @stanislaw in #785
- [issue-788] fix tag-value parser to allow NONE and NOASSERTION for pa… by @meretp in #816
- update changelog for 0.8.3 release by @armintaenzertng in #824
New Contributors
- @stanislaw made their first contribution in #787
Full Changelog: v0.8.2...v0.8.3
v0.8.2
What's Changed
- add
encoding
parameter for parsing files by @chrisdecker1201 in #756 - [issue-754] output FilesAnalyzed boolean in lowercase in tag-value by @armintaenzertng in #757
- [issue-753] only allow lowercase values for FilesAnalyzed in tag-value by @armintaenzertng in #758
- fix(validation): also allow URLs in download locations by @maxhbr in #763
- implement recommended UTF-8 encoding for reading and writing SPDX files by @chrisdecker1201 in #759
- fix(validation): fix error generation in expression validator by @maxhbr in #765
- add documentation on the code architecture by @armintaenzertng in #752
- Handle timezone-aware datetime objects when writing SPDX. by @licquia in #768
- update changelog for 0.8.2 release by @armintaenzertng in #769
Full Changelog: v0.8.1...v0.8.2
v0.8.1
What's Changed
- add SPDX tech mailing list link to README by @armintaenzertng in #737
- make relationship parsing to be more efficient through precomputation by @lumjjb in #743
- expand url regex to allow for userinfo by @bdehamer in #746
- only instantiate
get_spdx_licensing()
once in the project by @armintaenzertng in #749 - [issue-744] implement validation of external license references by @armintaenzertng in #750
- update changelog for 0.8.1 by @armintaenzertng in #751
New Contributors
Full Changelog: v0.8.0...v0.8.1
v0.8.0
What's Changed
- [fix] remove leftover legacy files. Add
NOASSERTION
as possible value… by @armintaenzertng in #370 - [Issue 305] add new json parser by @meretp in #366
- [issue-389] allow NONE and NOASSERTION in related_spdx_element_id by @armintaenzertng in #390
- [format] delete unused imports by @meretp in #393
- [issue-381] Add tag-value writer by @armintaenzertng in #396
- convert related_spdx_element_id to str in tv writer by @armintaenzertng in #399
- [issue-388] Update CLI tools for the new parsers/writers by @armintaenzertng in #401
- [issue-397] make fixtures valid and replace valid_defaults.py by @armintaenzertng in #409
- [issue-403] change spdx version handling during validation by @armintaenzertng in #404
- [issue-267] Add GitHub Actions workflow by @armintaenzertng in #410
- GitHub Actions fix by @armintaenzertng in #414
- Minor parsing/writing fixes by @armintaenzertng in #412
- Introduce src-layout by @meretp in #416
- add dummy config.yml to pass pipeline by @meretp in #418
- [issue-397] use fixtures in writer tests by @meretp in #417
- [issue-420] fix order of mocks to match input arguments by @meretp in #421
- [issue-392] make usage of license_concluded consistent by @meretp in #422
- [issue-400] ignore duplicated relationships while parsing by @meretp in #423
- also use the src-layout for tests by @meretp in #419
- move typing to common module to prepare for the prototype of spdx 3.0 by @meretp in #430
- Validate ExternalPackageRef by @armintaenzertng in #439
- [issue-443] change file name validation logic by @armintaenzertng in #445
- [issue-442] change CLI to read version from document by @armintaenzertng in #446
- [issue-10] use license_expression library for LicenseExpression by @armintaenzertng in #447
- [issue-457] add "no #" requirement to validation messages by @armintaenzertng in #458
- [issue-407] add rdf writer by @meretp in #448
- [issue-378] implement invalidation of duplicated SPDX Ids by @armintaenzertng in #459
- [issue-376] add tests for spdx_id_validators by @armintaenzertng in #460
- [issue-386] Finish Package validation by @armintaenzertng in #461
- [issue-375] test "document describes at least one element" by @armintaenzertng in #462
- [issue-466] bug fix and add test by @meretp in #467
- [issue-407] write comments for relationships by @meretp in #470
- fix helper method by @meretp in #484
- Clean up examples by @meretp in #482
- [issue-407] add document namespace to unknown types in external packa… by @meretp in #474
- Issue 456 add rdf parser by @meretp in #469
- SPDX-2.2 validation by @armintaenzertng in #490
- [issue-374] implement license expression validation by @armintaenzertng in #493
- [issue-391] update readme to reflect the new usage after refactoring by @armintaenzertng in #495
- [issue-441] replace print() with logging by @armintaenzertng in #494
- [fix] use correct value for LicenseListVersion by @meretp in #501
- fix creation info writer test by @meretp in #510
- Issue 382 tag value parser by @meretp in #502
- [issue-228] make type hints in code readable for downstream packages by @meretp in #515
- [fix] move "py.typed" to package root directory by @meretp in #516
- Fix tag value writer by @meretp in #517
- [issue-518] rename file_type to file_types by @armintaenzertng in #519
- Issue 503 allow list with noassertion by @meretp in #505
- fix the version of typeguard by @armintaenzertng in #524
- Change error messages related to ISO 8601 by @jspeed-meyers in #530
- Enable dependabot version checking by @goneall in #526
- Added convenience function to extract SPDX elements by their Id by @HarshvMahawar in #531
- [issue-402] add validation option to tag-value writer by @meretp in #536
- Add python 3.11 to GitHub Action by @meretp in #537
- Cherrypick old commits and delete unused files by @armintaenzertng in #538
- small changes to tag-value lexer/parser by @armintaenzertng in #534
- update README for when the refactor branch is merged to main by @armintaenzertng in #539
- [issue-487] add tests for the
document_utils.py
module by @armintaenzertng in #533 - Merged the refactoring branch into main by @maxhbr in #541
- [issue-532] Add linter action by @meretp in #544
- Fix code style by @meretp in #546
- [issue-511] replace license text with SPDX license identifier by @armintaenzertng in #548
- [issue-547] fix rdf parser by @meretp in #549
- update the readme to point at the correct branch for v0.7 by @armintaenzertng in #551
- shorten line lengths in README by @armintaenzertng in #552
- add missing license identifiers by @armintaenzertng in #557
- [issue-561] fix rdf parser by @meretp in #563
- [issue-564] add constant for "SPDXRef-DOCUMENT" by @meretp in #565
- [issue-558] add visualization feature by @meretp in #562
- [issue-394] add tests for tag_value writer by @meretp in #567
- [issue-570] change fixture dates by @armintaenzertng in #571
- [issue-558] add test for optional feature to GitHub Action by @meretp in #568
- [issue-402] change
write_document()
towrite_document_to_file()
by @armintaenzertng in #576 - [issue-573] unify
parse_from_file
tests for all formats by @armintaenzertng in #574 - [issue-540] change DESCRIBES validation by @armintaenzertng in #577
- Remove
documentDescribes
andhasFiles
from json output by @armintaenzertng in #579 - [issue-580] RDF: don't output relationship comment if there is none by @armintaenzertng in #581
- [issue_583] fix type hint by @meretp in #584
- [issue-375] add validation test for SPDX Lite by @armintaenzertng in #587
- [issue-586] fix CLI by @meretp in #588
- [issue_589] fix json parser: process fields that can be "NOASSERTION"… by @meretp in #590
- [issue_508] add methods to remove duplicated items from list properties by @meretp in #591
- [issue-593] add imports to README example by @armintaenzertng in #594
- [issue_592] add top-level package by @meretp in #595
- [issue-593] expose model classes in model package init by @armintaenzertng in #597
- [issue-593] add spdx2_document_from_scratch example by @armintaenzertng in #598
- make flake8 ignore all init.py by @armintaenzertng in #599
- make example files valid by @meretp in #607
- Issue 611 fix xml parser by @meretp in #612
- [issue-511] add license header by @meretp...
v0.8.0rc3
What's Changed
- remove unused CircleCI workflow and directory by @armintaenzertng in #729
- make "Package CONTAINS Package" valid even when
files_analyzed == False
by @armintaenzertng in #733 - set
validate=True
as default value in the rdf writer by @armintaenzertng in #734
Full Changelog: v0.8.0rc2...v0.8.0rc3
v0.8.0rc2
What's Changed
- Generate API docs with pdoc by @fholger in #710
- [issue-713] add link to API doc in the README by @armintaenzertng in #725
- [issue-721] update Actor regex and parsing by @armintaenzertng in #724
- [issue-722] add
calculate_package_verification_code()
by @armintaenzertng in #723 - SPDX3: rename ProfileIdentifier to ProfileIdentifierType by @fholger in #727
- change return type of calculate_package_verification_code() to PackageVerificationCode by @armintaenzertng in #728
Full Changelog: v0.8.0rc1...v0.8.0rc2
v0.8.0rc1
What's Changed
- [fix] remove leftover legacy files. Add
NOASSERTION
as possible value… by @armintaenzertng in #370 - [Issue 305] add new json parser by @meretp in #366
- [issue-389] allow NONE and NOASSERTION in related_spdx_element_id by @armintaenzertng in #390
- [format] delete unused imports by @meretp in #393
- [issue-381] Add tag-value writer by @armintaenzertng in #396
- convert related_spdx_element_id to str in tv writer by @armintaenzertng in #399
- [issue-388] Update CLI tools for the new parsers/writers by @armintaenzertng in #401
- [issue-397] make fixtures valid and replace valid_defaults.py by @armintaenzertng in #409
- [issue-403] change spdx version handling during validation by @armintaenzertng in #404
- [issue-267] Add GitHub Actions workflow by @armintaenzertng in #410
- GitHub Actions fix by @armintaenzertng in #414
- Minor parsing/writing fixes by @armintaenzertng in #412
- Introduce src-layout by @meretp in #416
- add dummy config.yml to pass pipeline by @meretp in #418
- [issue-397] use fixtures in writer tests by @meretp in #417
- [issue-420] fix order of mocks to match input arguments by @meretp in #421
- [issue-392] make usage of license_concluded consistent by @meretp in #422
- [issue-400] ignore duplicated relationships while parsing by @meretp in #423
- also use the src-layout for tests by @meretp in #419
- move typing to common module to prepare for the prototype of spdx 3.0 by @meretp in #430
- Validate ExternalPackageRef by @armintaenzertng in #439
- [issue-443] change file name validation logic by @armintaenzertng in #445
- [issue-442] change CLI to read version from document by @armintaenzertng in #446
- [issue-10] use license_expression library for LicenseExpression by @armintaenzertng in #447
- [issue-457] add "no #" requirement to validation messages by @armintaenzertng in #458
- [issue-407] add rdf writer by @meretp in #448
- [issue-378] implement invalidation of duplicated SPDX Ids by @armintaenzertng in #459
- [issue-376] add tests for spdx_id_validators by @armintaenzertng in #460
- [issue-386] Finish Package validation by @armintaenzertng in #461
- [issue-375] test "document describes at least one element" by @armintaenzertng in #462
- [issue-466] bug fix and add test by @meretp in #467
- [issue-407] write comments for relationships by @meretp in #470
- fix helper method by @meretp in #484
- Clean up examples by @meretp in #482
- [issue-407] add document namespace to unknown types in external packa… by @meretp in #474
- Issue 456 add rdf parser by @meretp in #469
- SPDX-2.2 validation by @armintaenzertng in #490
- [issue-374] implement license expression validation by @armintaenzertng in #493
- [issue-391] update readme to reflect the new usage after refactoring by @armintaenzertng in #495
- [issue-441] replace print() with logging by @armintaenzertng in #494
- [fix] use correct value for LicenseListVersion by @meretp in #501
- fix creation info writer test by @meretp in #510
- Issue 382 tag value parser by @meretp in #502
- [issue-228] make type hints in code readable for downstream packages by @meretp in #515
- [fix] move "py.typed" to package root directory by @meretp in #516
- Fix tag value writer by @meretp in #517
- [issue-518] rename file_type to file_types by @armintaenzertng in #519
- Issue 503 allow list with noassertion by @meretp in #505
- fix the version of typeguard by @armintaenzertng in #524
- Change error messages related to ISO 8601 by @jspeed-meyers in #530
- Enable dependabot version checking by @goneall in #526
- Added convenience function to extract SPDX elements by their Id by @HarshvMahawar in #531
- [issue-402] add validation option to tag-value writer by @meretp in #536
- Add python 3.11 to GitHub Action by @meretp in #537
- Cherrypick old commits and delete unused files by @armintaenzertng in #538
- small changes to tag-value lexer/parser by @armintaenzertng in #534
- update README for when the refactor branch is merged to main by @armintaenzertng in #539
- [issue-487] add tests for the
document_utils.py
module by @armintaenzertng in #533 - Merged the refactoring branch into main by @maxhbr in #541
- [issue-532] Add linter action by @meretp in #544
- Fix code style by @meretp in #546
- [issue-511] replace license text with SPDX license identifier by @armintaenzertng in #548
- [issue-547] fix rdf parser by @meretp in #549
- update the readme to point at the correct branch for v0.7 by @armintaenzertng in #551
- shorten line lengths in README by @armintaenzertng in #552
- add missing license identifiers by @armintaenzertng in #557
- [issue-561] fix rdf parser by @meretp in #563
- [issue-564] add constant for "SPDXRef-DOCUMENT" by @meretp in #565
- [issue-558] add visualization feature by @meretp in #562
- [issue-394] add tests for tag_value writer by @meretp in #567
- [issue-570] change fixture dates by @armintaenzertng in #571
- [issue-558] add test for optional feature to GitHub Action by @meretp in #568
- [issue-402] change
write_document()
towrite_document_to_file()
by @armintaenzertng in #576 - [issue-573] unify
parse_from_file
tests for all formats by @armintaenzertng in #574 - [issue-540] change DESCRIBES validation by @armintaenzertng in #577
- Remove
documentDescribes
andhasFiles
from json output by @armintaenzertng in #579 - [issue-580] RDF: don't output relationship comment if there is none by @armintaenzertng in #581
- [issue_583] fix type hint by @meretp in #584
- [issue-375] add validation test for SPDX Lite by @armintaenzertng in #587
- [issue-586] fix CLI by @meretp in #588
- [issue_589] fix json parser: process fields that can be "NOASSERTION"… by @meretp in #590
- [issue_508] add methods to remove duplicated items from list properties by @meretp in #591
- [issue-593] add imports to README example by @armintaenzertng in #594
- [issue_592] add top-level package by @meretp in #595
- [issue-593] expose model classes in model package init by @armintaenzertng in #597
- [issue-593] add spdx2_document_from_scratch example by @armintaenzertng in #598
- make flake8 ignore all init.py by @armintaenzertng in #599
- make example files valid by @meretp in #607
- Issue 611 fix xml parser by @meretp in #612
- [issue-511] add license header by @meretp...
v0.8.0a3
What's Changed
- [fix] remove leftover legacy files. Add
NOASSERTION
as possible value… by @armintaenzertng in #370 - [Issue 305] add new json parser by @meretp in #366
- [issue-389] allow NONE and NOASSERTION in related_spdx_element_id by @armintaenzertng in #390
- [format] delete unused imports by @meretp in #393
- [issue-381] Add tag-value writer by @armintaenzertng in #396
- convert related_spdx_element_id to str in tv writer by @armintaenzertng in #399
- [issue-388] Update CLI tools for the new parsers/writers by @armintaenzertng in #401
- [issue-397] make fixtures valid and replace valid_defaults.py by @armintaenzertng in #409
- [issue-403] change spdx version handling during validation by @armintaenzertng in #404
- [issue-267] Add GitHub Actions workflow by @armintaenzertng in #410
- GitHub Actions fix by @armintaenzertng in #414
- Minor parsing/writing fixes by @armintaenzertng in #412
- Introduce src-layout by @meretp in #416
- add dummy config.yml to pass pipeline by @meretp in #418
- [issue-397] use fixtures in writer tests by @meretp in #417
- [issue-420] fix order of mocks to match input arguments by @meretp in #421
- [issue-392] make usage of license_concluded consistent by @meretp in #422
- [issue-400] ignore duplicated relationships while parsing by @meretp in #423
- also use the src-layout for tests by @meretp in #419
- move typing to common module to prepare for the prototype of spdx 3.0 by @meretp in #430
- Validate ExternalPackageRef by @armintaenzertng in #439
- [issue-443] change file name validation logic by @armintaenzertng in #445
- [issue-442] change CLI to read version from document by @armintaenzertng in #446
- [issue-10] use license_expression library for LicenseExpression by @armintaenzertng in #447
- [issue-457] add "no #" requirement to validation messages by @armintaenzertng in #458
- [issue-407] add rdf writer by @meretp in #448
- [issue-378] implement invalidation of duplicated SPDX Ids by @armintaenzertng in #459
- [issue-376] add tests for spdx_id_validators by @armintaenzertng in #460
- [issue-386] Finish Package validation by @armintaenzertng in #461
- [issue-375] test "document describes at least one element" by @armintaenzertng in #462
- [issue-466] bug fix and add test by @meretp in #467
- [issue-407] write comments for relationships by @meretp in #470
- fix helper method by @meretp in #484
- Clean up examples by @meretp in #482
- [issue-407] add document namespace to unknown types in external packa… by @meretp in #474
- Issue 456 add rdf parser by @meretp in #469
- SPDX-2.2 validation by @armintaenzertng in #490
- [issue-374] implement license expression validation by @armintaenzertng in #493
- [issue-391] update readme to reflect the new usage after refactoring by @armintaenzertng in #495
- [issue-441] replace print() with logging by @armintaenzertng in #494
- [fix] use correct value for LicenseListVersion by @meretp in #501
- fix creation info writer test by @meretp in #510
- Issue 382 tag value parser by @meretp in #502
- [issue-228] make type hints in code readable for downstream packages by @meretp in #515
- [fix] move "py.typed" to package root directory by @meretp in #516
- Fix tag value writer by @meretp in #517
- [issue-518] rename file_type to file_types by @armintaenzertng in #519
- Issue 503 allow list with noassertion by @meretp in #505
- fix the version of typeguard by @armintaenzertng in #524
- Change error messages related to ISO 8601 by @jspeed-meyers in #530
- Enable dependabot version checking by @goneall in #526
- Added convenience function to extract SPDX elements by their Id by @HarshvMahawar in #531
- [issue-402] add validation option to tag-value writer by @meretp in #536
- Add python 3.11 to GitHub Action by @meretp in #537
- Cherrypick old commits and delete unused files by @armintaenzertng in #538
- small changes to tag-value lexer/parser by @armintaenzertng in #534
- update README for when the refactor branch is merged to main by @armintaenzertng in #539
- [issue-487] add tests for the
document_utils.py
module by @armintaenzertng in #533 - Merged the refactoring branch into main by @maxhbr in #541
- [issue-532] Add linter action by @meretp in #544
- Fix code style by @meretp in #546
- [issue-511] replace license text with SPDX license identifier by @armintaenzertng in #548
- [issue-547] fix rdf parser by @meretp in #549
- update the readme to point at the correct branch for v0.7 by @armintaenzertng in #551
- shorten line lengths in README by @armintaenzertng in #552
- add missing license identifiers by @armintaenzertng in #557
- [issue-561] fix rdf parser by @meretp in #563
- [issue-564] add constant for "SPDXRef-DOCUMENT" by @meretp in #565
- [issue-558] add visualization feature by @meretp in #562
- [issue-394] add tests for tag_value writer by @meretp in #567
- [issue-570] change fixture dates by @armintaenzertng in #571
- [issue-558] add test for optional feature to GitHub Action by @meretp in #568
- [issue-402] change
write_document()
towrite_document_to_file()
by @armintaenzertng in #576 - [issue-573] unify
parse_from_file
tests for all formats by @armintaenzertng in #574 - [issue-540] change DESCRIBES validation by @armintaenzertng in #577
- Remove
documentDescribes
andhasFiles
from json output by @armintaenzertng in #579 - [issue-580] RDF: don't output relationship comment if there is none by @armintaenzertng in #581
- [issue_583] fix type hint by @meretp in #584
- [issue-375] add validation test for SPDX Lite by @armintaenzertng in #587
- [issue-586] fix CLI by @meretp in #588
- [issue_589] fix json parser: process fields that can be "NOASSERTION"… by @meretp in #590
- [issue_508] add methods to remove duplicated items from list properties by @meretp in #591
- [issue-593] add imports to README example by @armintaenzertng in #594
- [issue_592] add top-level package by @meretp in #595
- [issue-593] expose model classes in model package init by @armintaenzertng in #597
- [issue-593] add spdx2_document_from_scratch example by @armintaenzertng in #598
- make flake8 ignore all init.py by @armintaenzertng in #599
- make example files valid by @meretp in #607
- Issue 611 fix xml parser by @meretp in #612
- [issue-511] add license header by @meretp...
v0.7.1
New features and changes
- added GitHub Actions workflow
- added requirements.txt
- added uritools for URI validation
- Python >= 3.7 is now required
- json/yaml/xml: added support for empty arrays for hasFiles and licenseInfoFromFiles
- rdf: fixed writing of multiple packages
- tag-value: enhanced parsing of snippet ranges to not mix it up with package version
- tag-value: fixed parsing of whitespaces
- tag-value: duplicates in LicenseInfoInFile are now removed during writing
- account for supplier and originator to be NOASSERTION
- checksum validation now requires lowercase values
- during writing of a file, the encoding can be set (default is utf-8)
- license list updated to version 3.20
New Contributors
- @chrisdecker1201 made their first contribution in #471
- @vargenau made their first contribution in #492
Full Changelog: v0.7.0...v0.7.1
Release 0.7.0: Support SPDX 2.3 (and other fixes)
New features and changes
- Dropped Python 2 support. Python >= 3.6 is now required.
- Added
pyspdxtools_convertor
andpyspdxtools_parser
CLI scripts. See the readme for usage instructions. - Updated the tools to support SPDX versions up to 2.3 and to conform with the specification. Apart from many bugfixes
and new properties, some of the more significant changes include:- Support for multiple packages per document
- Support for multiple checksums for packages and files
- Support for files outside a package
- Removed example documents from production code. Added additional up-to-date examples to test files.
- Introduced pytest as the preferred test framework.
- Improved error message handling and display.
- Extended the contribution guidelines.
- Improved tag/value output structure.
- Added .editorconfig and pyproject.toml.
- Improved handling of JSON-specific properties
documentDescribes
andhasFiles
. - Added new LicenseListVersion tag.
- Fixed annotation handling for the JSON and Tag/Value formats.
- Free form text values in Tag/Value no longer require
<text>
tags if they don't span multiple lines.
Limitations
- Validation was updated to follow the 2.3 specification. Since there is currently no support for
version-specific handling, some details may be handled incorrectly for documents using lower
versions. The changes are mostly restricted to properties becoming optional and new property values becoming
available, and should be of limited impact. See https://spdx.github.io/spdx-spec/v2.3/diffs-from-previous-editions/
for a list of changes between the versions. - RDF support for 2.3 is not completed, see #295
Breaking changes
There are some breaking changes compared to the 0.6.1 release. Some classes were renamed, some were moved, and files are now saved at document-level instead of package-level. See https://github.com/spdx/tools-python/wiki/How-to-migrate-from-0.6.1-to-0.7.0 for a migration guide.
Contributors
This release was made possible by the following contributors. Thank you very much!
- Meret Behrens @meretp
- Philippe Ombredanne @pombredanne
- Pierre Tardy @tardyp
- Nicolaus Weidner @nicoweidner
- Jeff Licquia @licquia
- Armin Tänzer @armintaenzertng
- Alberto Pianon @alpianon
- Rodney Richardson @RodneyRichardson
- Lon Hohberger @lhh
- Nathan Voss @njv299
- Gary O'Neall @goneall
- Jeffrey Otterson @jotterson
- KOLANICH @KOLANICH
- Yash Varshney @Yash-Varshney
- HARDIK @HARDIK-TSH1392
- Jose Quaresma @quaresmajose
- Santiago Torres @SantiagoTorres
- Shubham Kumar Jha @ShubhamKJha
- Steven Kalt @SKalt
- Cole Helbling @cole-h
- Daniel Holth @dholth
- John Vandenberg @jayvdb
- Kate Stewart @kestewart
- Alexios Zavras @zvr
- Maximilian Huber @maxhbr
- Kyle Altendorf @altendky
- alpianon @alpianon
- kbermude @kbermude
- mzfr @mzfr