|
56 | 56 |
|
57 | 57 | ## v9.0.0 (2025-02-26) |
58 | 58 |
|
59 | | -### Features |
60 | | - |
61 | | -- 9.0.1 ([#777](https://github.com/CycloneDX/cyclonedx-python-lib/pull/777), |
62 | | - [`e6f91fa`](https://github.com/CycloneDX/cyclonedx-python-lib/commit/e6f91fa98cbb02cda62fd0bc5b1f1b9bf19902ee)) |
63 | | - |
| 59 | +### BREAKING Changes |
| 60 | + |
| 61 | +* Fix: `model.vulnerability.VulnerabilityReference`'s properties are all mandatory ([#790](https://github.com/CycloneDX/cyclonedx-python-lib/issues/790) via |
| 62 | + [#792](https://github.com/CycloneDX/cyclonedx-python-lib/pull/792)) |
| 63 | +* Refactor: Rename `spdx.is_compund_expression` -> `spdx.is_expression` |
| 64 | + ([#779](https://github.com/CycloneDX/cyclonedx-python-lib/pull/779)) |
| 65 | +* Behavior: `BomRef` affects comparison/hashing ([#754](https://github.com/CycloneDX/cyclonedx-python-lib/pull/754) & |
| 66 | + [#780](https://github.com/CycloneDX/cyclonedx-python-lib/pull/780)) |
| 67 | + This is only a breaking change if you relied on ordering of elements. |
| 68 | +* Behavior: streamline comparison/hashing functions ([#755](https://github.com/CycloneDX/cyclonedx-python-lib/pull/755)) This is only a breaking |
| 69 | + change if you relied on ordering of elements. |
| 70 | +* Dependency: bump dependency `py-serializable >=2 <3`, was `>=1.1.1 <2` ([#775](https://github.com/CycloneDX/cyclonedx-python-lib/pull/775)) This is |
| 71 | + only a breaking change if you have other packages depend on that specific version. |
64 | 72 |
|
65 | 73 | ## v8.9.0 (2025-02-25) |
66 | 74 |
|
|
218 | 226 | - V8.0.0 ([#665](https://github.com/CycloneDX/cyclonedx-python-lib/pull/665), |
219 | 227 | [`002f966`](https://github.com/CycloneDX/cyclonedx-python-lib/commit/002f96630ce8fc6f1766ee6cc92a16b35a821c69)) |
220 | 228 |
|
| 229 | +### BREAKING Changes |
| 230 | + |
| 231 | +* Removed `cyclonedx.mode.ThisTool`, utilize `cyclonedx.builder.this.this_tool()` instead. * Moved |
| 232 | + `cyclonedx.model.Tool` to `cyclonedx.model.tool.Tool`. |
| 233 | +* Property `cyclonedx.mode.bom.BomMetaData.tools` is of type `cyclonedx.model.tool.ToolRepository` now, was |
| 234 | + `SortedSet[cyclonedx.model.Tool]`. The getter will act accordingly; the setter might act in a |
| 235 | + backwards-compatible way. |
| 236 | +* Property `cyclonedx.mode.vulnerability.Vulnerability.tools` is of type `cyclonedx.model.tool.ToolRepository` now, was `SortedSet[cyclonedx.model.Tool]`. The getter will |
| 237 | + act accordingly; the setter might act in a backwards-compatible way. |
| 238 | +* Constructor `cyclonedx.model.license.LicenseExpression()` accepts optional argument `acknowledgement` only as |
| 239 | + key-word argument, no longer as positional argument. |
| 240 | + |
| 241 | +### Changes |
| 242 | + |
| 243 | +* Constructor of `cyclonedx.model.bom.BomMetaData` also accepts an instance of |
| 244 | + `cyclonedx.model.tool.ToolRepository` for argument `tools`. * Constructor of |
| 245 | + `cyclonedx.model.bom.BomMetaData` no longer adds this very library as a tool. Downstream users |
| 246 | + SHOULD add it manually, like |
| 247 | + `my-bom.metadata.tools.components.add(cyclonedx.builder.this.this_component())`. |
| 248 | + |
| 249 | +### Fixes |
| 250 | + |
| 251 | +* Deserialization of CycloneDX that do not include tools in the metadata are no longer unexpectedly |
| 252 | + modified/altered. |
| 253 | + |
| 254 | +### Added |
| 255 | + |
| 256 | +Enabled Metadata Tools representation and serialization in accordance with CycloneDX 1.5 |
| 257 | + |
| 258 | +* New class `cyclonedx.model.tool.ToolRepository`. * New function |
| 259 | + `cyclonedx.builder.this.this_component()` -- representation of this very python library as a |
| 260 | + `Component`. * New function `cyclonedx.builder.this.this_tool()` -- representation of this very |
| 261 | + python library as a `Tool`. * New function `cyclonedx.model.tool.Tool.from_component()`. |
| 262 | + |
| 263 | +### Dependencies |
| 264 | + |
| 265 | +* Raised runtime dependency `py-serializable>=1.1.1,<2`, was `>=1.1.0,<2`. |
221 | 266 |
|
222 | 267 | ## v7.6.2 (2024-10-07) |
223 | 268 |
|
|
373 | 418 | - Support for CycloneDX v1.6 |
374 | 419 | ([`8bbdf46`](https://github.com/CycloneDX/cyclonedx-python-lib/commit/8bbdf461434ab66673a496a8305c2878bf5c88da)) |
375 | 420 |
|
| 421 | +* added draft v1.6 schemas and boilerplate for v1.6 |
| 422 | +* re-generated test snapshots for v1.6 |
| 423 | +* note `bom.metadata.manufacture` as deprecated |
| 424 | +* work on `bom.metadata` for v1.6 |
| 425 | +* Deprecated `.component.author`. Added `.component.authors` and `.component.manufacturer` |
| 426 | +* work to add `.component.omniborid` - but tests deserialisation tests fail due to schema |
| 427 | + differences (`.component.author` not in 1.6) |
| 428 | +* work to get deserialization tests passing |
| 429 | + |
376 | 430 |
|
377 | 431 | ## v6.4.4 (2024-03-18) |
378 | 432 |
|
|
500 | 554 | - V6.0.0 ([#492](https://github.com/CycloneDX/cyclonedx-python-lib/pull/492), |
501 | 555 | [`74865f8`](https://github.com/CycloneDX/cyclonedx-python-lib/commit/74865f8e498c9723c2ce3556ceecb6a3cfc4c490)) |
502 | 556 |
|
| 557 | +### Breaking Changes |
| 558 | + |
| 559 | +* Removed symbols that were already marked as deprecated (via [#493]) |
| 560 | +* Removed symbols in `parser.*` ([#489] via [#495]) |
| 561 | +* Removed `output.LATEST_SUPPORTED_SCHEMA_VERSION` ([#491] via [#494]) |
| 562 | +* Serialization of unsupported enum values might downgrade/migrate/omit them ([#490] via |
| 563 | + [#496]) Handling might raise warnings if a data loss occurred due to omitting. The result is a |
| 564 | + guaranteed valid XML/JSON, since no (enum-)invalid values are rendered. |
| 565 | +* Serialization of any `model.component.Component` with unsupported `type` raises |
| 566 | + `exception.serialization.SerializationOfUnsupportedComponentTypeException` ([#490] via [#496]) * |
| 567 | + Object `model.bom_ref.BomRef`'s property `value` defaults to `Null`, was arbitrary `UUID` ([#504] |
| 568 | + via [#505]) This change does not affect serialization. All `bom-ref`s are guaranteed to have |
| 569 | + unique values on rendering. |
| 570 | +* Removed helpers from public API ([#503] via [#506]) |
| 571 | + |
| 572 | +### Added |
| 573 | + |
| 574 | +* Basic support for CycloneDX 1.5 ([#404] via [#488]) * No data models were enhanced nor added, yet. |
| 575 | + Pull requests to add functionality are welcome. * Existing enumerable got new cases, to reflect |
| 576 | + features of CycloneDX 1.5 ([#404] via [#488]) * Outputters were enabled to render CycloneDX 1.5 |
| 577 | + ([#404] via [#488]) |
| 578 | + |
| 579 | +### Tests |
| 580 | + |
| 581 | +* Created (regression/unit/integration/functional) tests for CycloneDX 1.5 ([#404] via [#488]) * |
| 582 | + Created (regression/functional) tests for Enums' handling and completeness ([#490] via [#496]) |
| 583 | + |
| 584 | +### Misc |
| 585 | + |
| 586 | +* Bumped dependency `py-serializable@^0.16`, was `@^0.15` (via [#496]) |
| 587 | + |
| 588 | +### API Changes — the details for migration |
| 589 | + |
| 590 | +* Added new sub-package `exception.serialization` (via [#496]) |
| 591 | +* Removed class |
| 592 | + `models.ComparableTuple` ([#503] via [#506]) |
| 593 | +* Enum `model.ExternalReferenceType` got new cases, |
| 594 | + to reflect features for CycloneDX 1.5 ([#404] via [#488]) |
| 595 | +* Removed function `models.get_now_utc` |
| 596 | + ([#503] via [#506]) * Removed function `models.sha1sum` ([#503] via [#506]) |
| 597 | +* Enum |
| 598 | + `model.component.ComponentType` got new cases, to reflect features for CycloneDX 1.5 ([#404] via |
| 599 | + [#488]) |
| 600 | +* Removed `model.component.Component.__init__()`'s deprecated optional kwarg `namespace` |
| 601 | + (via [#493]) Use kwarg `group` instead. |
| 602 | +* Removed `model.component.Component.__init__()`'s |
| 603 | + deprecated optional kwarg `license_str` (via [#493]) Use kwarg `licenses` instead. |
| 604 | +* Removed |
| 605 | + deprecated method `model.component.Component.get_namespace()` (via [#493]) |
| 606 | +* Removed class |
| 607 | + `models.dependency.DependencyDependencies` ([#503] via [#506]) |
| 608 | +* Removed |
| 609 | + `model.vulnerability.Vulnerability.__init__()`'s deprecated optional kwarg `source_name` (via |
| 610 | + [#493]) Use kwarg `source` instead. |
| 611 | +* Removed `model.vulnerability.Vulnerability.__init__()`'s |
| 612 | + deprecated optional kwarg `source_url` (via [#493]) Use kwarg `source` instead. |
| 613 | +* Removed |
| 614 | + `model.vulnerability.Vulnerability.__init__()`'s deprecated optional kwarg `recommendations` (via |
| 615 | + [#493]) Use kwarg `recommendation` instead. |
| 616 | +* Removed |
| 617 | + `model.vulnerability.VulnerabilityRating.__init__()`'s deprecated optional kwarg `score_base` (via |
| 618 | + [#493]) Use kwarg `score` instead. |
| 619 | +* Enum `model.vulnerability.VulnerabilityScoreSource` got new |
| 620 | + cases, to reflect features for CycloneDX 1.5 ([#404] via [#488]) |
| 621 | +* Removed |
| 622 | + `output.LATEST_SUPPORTED_SCHEMA_VERSION` ([#491] via [#494]) |
| 623 | +* Removed deprecated function |
| 624 | + `output.get_instance()` (via [#493]) Use function `output.make_outputter()` instead. * Added new |
| 625 | + class `output.json.JsonV1Dot5`, to reflect CycloneDX 1.5 ([#404] via [#488]) |
| 626 | +* Added new item to |
| 627 | + dict `output.json.BY_SCHEMA_VERSION`, to reflect CycloneDX 1.5 ([#404] via [#488]) |
| 628 | +* Added new |
| 629 | + class `output.xml.XmlV1Dot5`, to reflect CycloneDX 1.5 ([#404] via [#488]) |
| 630 | +* Added new item to |
| 631 | + dict `output.xml.BY_SCHEMA_VERSION`, to reflect CycloneDX 1.5 ([#404] via [#488]) |
| 632 | +* Removed class |
| 633 | + `parser.ParserWarning` ([#489] via [#495]) |
| 634 | +* Removed class `parser.BaseParser` ([#489] via [#495]) |
| 635 | +* Enum `schema.SchemaVersion` got new case `V1_5`, to reflect CycloneDX 1.5 ([#404] via [#488]) |
| 636 | + |
| 637 | +[#404]: https://github.com/CycloneDX/cyclonedx-python-lib/issues/404 |
| 638 | +[#488]: https://github.com/CycloneDX/cyclonedx-python-lib/pull/488 |
| 639 | +[#489]: https://github.com/CycloneDX/cyclonedx-python-lib/issues/489 |
| 640 | +[#490]: https://github.com/CycloneDX/cyclonedx-python-lib/issues/490 |
| 641 | +[#491]: https://github.com/CycloneDX/cyclonedx-python-lib/issues/491 |
| 642 | +[#493]: https://github.com/CycloneDX/cyclonedx-python-lib/pull/493 |
| 643 | +[#494]: https://github.com/CycloneDX/cyclonedx-python-lib/pull/494 |
| 644 | +[#495]: https://github.com/CycloneDX/cyclonedx-python-lib/pull/495 |
| 645 | +[#496]: https://github.com/CycloneDX/cyclonedx-python-lib/pull/496 |
| 646 | +[#503]: https://github.com/CycloneDX/cyclonedx-python-lib/issues/503 |
| 647 | +[#504]: https://github.com/CycloneDX/cyclonedx-python-lib/issues/504 |
| 648 | +[#505]: https://github.com/CycloneDX/cyclonedx-python-lib/pull/505 |
| 649 | +[#506]: https://github.com/CycloneDX/cyclonedx-python-lib/pull/506 |
503 | 650 |
|
504 | 651 | ## v5.2.0 (2023-12-02) |
505 | 652 |
|
|
556 | 703 | - V5.0.0 ([#440](https://github.com/CycloneDX/cyclonedx-python-lib/pull/440), |
557 | 704 | [`26b151c`](https://github.com/CycloneDX/cyclonedx-python-lib/commit/26b151cba7d7d484f23ee7888444f09ad6d016b1)) |
558 | 705 |
|
| 706 | +### BREAKING CHANGES |
| 707 | +* Dropped support for python<3.8 ([#436] via [#441]; enable |
| 708 | + [#433]) |
| 709 | +* Reworked license related models, collections, and factories ([#365] via [#466]) |
| 710 | +* Behavior * Method `model.bom.Bom.validate()` will throw |
| 711 | + `exception.LicenseExpressionAlongWithOthersException`, if detecting invalid license constellation |
| 712 | + ([#453] via [#452]) |
| 713 | +* Fixed tuple comparison when unequal lengths (via [#461]) |
| 714 | +* API * Enum |
| 715 | + `schema.SchemaVersion` is no longer string-like ([#442] via [#447]) |
| 716 | +* Enum `schema.OutputVersion` |
| 717 | + is no longer string-like ([#442] via [#447]) |
| 718 | +* Abstract class `output.BaseOutput` requires |
| 719 | + implementation of new method `output_format` ([#446] via [#447]) |
| 720 | +* Abstract method |
| 721 | + `output.BaseOutput.output_as_string()` got new optional parameter `indent` ([#437] via [#458]) * |
| 722 | + Abstract method `output.BaseOutput.output_as_string()` accepts arbitrary kwargs (via [#458], |
| 723 | + [#462]) |
| 724 | +* Removed class `factory.license.LicenseChoiceFactory` (via [#466]) The old functionality |
| 725 | + was integrated into `factory.license.LicenseFactory`. |
| 726 | +* Method |
| 727 | + `factory.license.LicenseFactory.make_from_string()`'s parameter `name_or_spdx` was renamed to |
| 728 | + `value` (via [#466]) |
| 729 | +* Method `factory.license.LicenseFactory.make_from_string()`'s return value |
| 730 | + can also be a `LicenseExpression` ([#365] via [#466]) The behavior imitates the old |
| 731 | + `factory.license.LicenseChoiceFactory.make_from_string()` |
| 732 | +* Renamed class `module.License` to |
| 733 | + `module.license.DisjunctliveLicense` ([#365] via [#466]) |
| 734 | +* Removed class `module.LicenseChoice` |
| 735 | + ([#365] via [#466]) Use dedicated classes `module.license.DisjunctliveLicense` and |
| 736 | + `module.license.LicenseExpression` instead |
| 737 | +* All occurrences of `models.LicenseChoice` were |
| 738 | + replaced by `models.licenses.License` ([#365] via [#466]) |
| 739 | +* All occurrences of |
| 740 | + `SortedSet[LicenseChoice]` were specialized to `models.license.LicenseRepository` ([#365] via |
| 741 | + [#466]) |
| 742 | + |
| 743 | +### Fixed |
| 744 | +* Serialization of multy-licenses ([#365] via [#466]) * Detect unused |
| 745 | + "dependent" components in `model.bom.validate()` (via [#464]) |
| 746 | + |
| 747 | +### Changed |
| 748 | +* Updated latest supported list of supported SPDX license identifiers (via |
| 749 | + [#433]) |
| 750 | +* Shipped schema files are moved to a protected space (via [#433]) |
| 751 | + These files were never |
| 752 | + intended for public use. |
| 753 | +* XML output uses a default namespace, which makes results smaller. |
| 754 | + ([#438] via [#458]) |
| 755 | + |
| 756 | +### Added |
| 757 | +* Support for Python 3.12 (via [#460]) |
| 758 | +* JSON- & XML-Validators ([#432], |
| 759 | + [#446] via [#433], [#448]) |
| 760 | + The functionality might require additional dependencies, that can be |
| 761 | + installed with the extra "validation". See the docs in section "Installation" for details. * JSON |
| 762 | + & XML can be generated in a more human-friendly form ([#437], [#438] via [#458]) |
| 763 | +* Type hints, |
| 764 | + typings & overloads for better integration downstream (via [#463]) * API * New function |
| 765 | + `output.make_outputter()` (via [#469]) This replaces the deprecated function |
| 766 | + `output.get_instance()`. |
| 767 | +* New sub-package `validation` ([#432], [#446] via [#433], [#448], |
| 768 | + [#469], [#468], [#469]) |
| 769 | +* New class `exception.MissingOptionalDependencyException` ([#432] via |
| 770 | + [#433]) * New class `exception.LicenseExpressionAlongWithOthersException` ([#453] via [#452]) * |
| 771 | + New dictionaries `output.{json,xml}.BY_SCHEMA_VERSION` ([#446] via [#447]) * Existing |
| 772 | + implementations of class `output.BaseOutput` now have a new method `output_format` ([#446] via |
| 773 | + [#447]) |
| 774 | +* Existing implementations of method `output.BaseOutput.output_as_string()` got new |
| 775 | + optional parameter `indent` ([#437] via [#458]) |
| 776 | +* Existing implementations of method |
| 777 | + `output.BaseOutput.output_to_file()` got new optional parameter `indent` ([#437] via [#458]) * New |
| 778 | + method `factory.license.LicenseFactory.make_with_expression()` (via [#466]) |
| 779 | +* New class |
| 780 | + `model.license.DisjunctiveLicense` ([#365] via [#466]) |
| 781 | +* New class |
| 782 | + `model.license.LicenseExpression` ([#365] via [#466]) |
| 783 | +* New class |
| 784 | + `model.license.LicenseRepository` ([#365] via [#466]) |
| 785 | +* New class |
| 786 | + `serialization.LicenseRepositoryHelper` ([#365] via [#466]) |
| 787 | + |
| 788 | +### Deprecated |
| 789 | +* Function `output.get_instance()` might be removed, use |
| 790 | + `output.make_outputter()` instead (via [#469]) |
| 791 | + |
| 792 | +### Tests |
| 793 | +* Added validation tests with official CycloneDX schema test data ([#432] via |
| 794 | + [#433]) |
| 795 | +* Use proper snapshots, instead of pseudo comparison ([#437] via [#464]) |
| 796 | +* Added |
| 797 | + regression test for bug [#365] (via [#466], [#467]) |
| 798 | + |
| 799 | +### Misc |
| 800 | +* Dependencies: bumped `py-serializable@^0.15.0`, was `@^0.11.1` (via [#458], |
| 801 | + [#463], [#464], [#466]) |
| 802 | +* Style: streamlined quotes and strings (via [#472]) |
| 803 | +* Chore: bumped |
| 804 | + internal dev- and QA-tools ([#436] via [#441], [#472]) |
| 805 | +* Chore: added more QA tools to prevent |
| 806 | + common security issues (via [#473]) |
| 807 | + |
| 808 | +[#432]: https://github.com/CycloneDX/cyclonedx-python-lib/issues/432 |
| 809 | +[#433]: https://github.com/CycloneDX/cyclonedx-python-lib/pull/433 |
| 810 | +[#436]: https://github.com/CycloneDX/cyclonedx-python-lib/issues/436 |
| 811 | +[#437]: https://github.com/CycloneDX/cyclonedx-python-lib/issues/437 |
| 812 | +[#365]: https://github.com/CycloneDX/cyclonedx-python-lib/issues/365 |
| 813 | +[#438]: https://github.com/CycloneDX/cyclonedx-python-lib/issues/438 |
| 814 | +[#440]: https://github.com/CycloneDX/cyclonedx-python-lib/pull/440 |
| 815 | +[#441]: https://github.com/CycloneDX/cyclonedx-python-lib/pull/441 |
| 816 | +[#442]: https://github.com/CycloneDX/cyclonedx-python-lib/issues/442 |
| 817 | +[#446]: https://github.com/CycloneDX/cyclonedx-python-lib/issues/446 |
| 818 | +[#447]: https://github.com/CycloneDX/cyclonedx-python-lib/pull/447 |
| 819 | +[#448]: https://github.com/CycloneDX/cyclonedx-python-lib/pull/448 |
| 820 | +[#452]: https://github.com/CycloneDX/cyclonedx-python-lib/pull/452 |
| 821 | +[#453]: https://github.com/CycloneDX/cyclonedx-python-lib/issues/453 |
| 822 | +[#458]: https://github.com/CycloneDX/cyclonedx-python-lib/pull/458 |
| 823 | +[#460]: https://github.com/CycloneDX/cyclonedx-python-lib/pull/460 |
| 824 | +[#461]: https://github.com/CycloneDX/cyclonedx-python-lib/pull/461 |
| 825 | +[#462]: https://github.com/CycloneDX/cyclonedx-python-lib/pull/462 |
| 826 | +[#463]: https://github.com/CycloneDX/cyclonedx-python-lib/pull/463 |
| 827 | +[#464]: https://github.com/CycloneDX/cyclonedx-python-lib/pull/464 |
| 828 | +[#466]: https://github.com/CycloneDX/cyclonedx-python-lib/pull/466 |
| 829 | +[#467]: https://github.com/CycloneDX/cyclonedx-python-lib/pull/467 |
| 830 | +[#468]: https://github.com/CycloneDX/cyclonedx-python-lib/pull/468 |
| 831 | +[#469]: https://github.com/CycloneDX/cyclonedx-python-lib/pull/469 |
| 832 | +[#472]: https://github.com/CycloneDX/cyclonedx-python-lib/pull/472 |
| 833 | +[#473]: https://github.com/CycloneDX/cyclonedx-python-lib/pull/473 |
559 | 834 |
|
560 | 835 | ## v4.2.3 (2023-10-16) |
561 | 836 |
|
|
886 | 1161 |
|
887 | 1162 | ## v2.0.0 (2022-02-21) |
888 | 1163 |
|
| 1164 | +### BREAKING Changes |
| 1165 | +- BREAKING CHANGE: Adopt PEP-3102 |
| 1166 | +- BREAKING CHANGE: Optional Lists are now non-optional Sets |
| 1167 | +- BREAKING CHANGE: Remove concept of DEFAULT schema version - replaced with LATEST schema version |
| 1168 | +- BREAKING CHANGE: Added `BomRef` data type |
| 1169 | + |
889 | 1170 | ### Bug Fixes |
890 | 1171 |
|
891 | 1172 | - `component.bom_ref` is not Optional in our model implementation (in the schema it is) - we |
|
0 commit comments