cosmos-sdk/container
Aaron Craelius 7a31a28e24
refactor(container)!: remove dependency on C graphviz (#11934)
## Description

Closes: #11925 

This replace the dependency on https://pkg.go.dev/github.com/goccy/go-graphviz which wraps the whole C Graphviz library and is causing ARM build problems in #11924 and generally probably shouldn't be used because it's a heavyweight dependency just used for debugging.

It adds:
* a custom `graphviz` package that does just what we need for `container`
* updates to graphviz rendering to make it nicer and a README with some examples
* golden tests for graphviz and log debugging
* a `StderrLogger` `DebugOption` which is now the default for `Debug`/`AutoDebug`



---

### Author Checklist

*All items are required. Please add a note to the item if the item is not applicable and
please add links to any relevant follow up issues.*

I have...

- [ ] included the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title
- [ ] added `!` to the type prefix if API or client breaking change
- [ ] targeted the correct branch (see [PR Targeting](https://github.com/cosmos/cosmos-sdk/blob/main/CONTRIBUTING.md#pr-targeting))
- [ ] provided a link to the relevant issue or specification
- [ ] followed the guidelines for [building modules](https://github.com/cosmos/cosmos-sdk/blob/main/docs/building-modules)
- [ ] included the necessary unit and integration [tests](https://github.com/cosmos/cosmos-sdk/blob/main/CONTRIBUTING.md#testing)
- [ ] added a changelog entry to `CHANGELOG.md`
- [ ] included comments for [documenting Go code](https://blog.golang.org/godoc)
- [ ] updated the relevant documentation or specification
- [ ] reviewed "Files changed" and left comments if necessary
- [ ] confirmed all CI checks have passed

### Reviewers Checklist

*All items are required. Please add a note if the item is not applicable and please add
your handle next to the items reviewed if you only reviewed selected items.*

I have...

- [ ] confirmed the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title
- [ ] confirmed `!` in the type prefix if API or client breaking change
- [ ] confirmed all author checklist items have been addressed 
- [ ] reviewed state machine logic
- [ ] reviewed API design and naming
- [ ] reviewed documentation is accurate
- [ ] reviewed tests and test coverage
- [ ] manually tested (if applicable)
2022-05-12 17:00:55 +00:00
..
internal refactor(container)!: remove dependency on C graphviz (#11934) 2022-05-12 17:00:55 +00:00
testdata refactor(container)!: remove dependency on C graphviz (#11934) 2022-05-12 17:00:55 +00:00
Makefile refactor(container)!: remove dependency on C graphviz (#11934) 2022-05-12 17:00:55 +00:00
README.md refactor(container)!: remove dependency on C graphviz (#11934) 2022-05-12 17:00:55 +00:00
build.go refactor(container)!: remove dependency on C graphviz (#11934) 2022-05-12 17:00:55 +00:00
container.go refactor(container)!: remove dependency on C graphviz (#11934) 2022-05-12 17:00:55 +00:00
container_test.go refactor(container)!: remove dependency on C graphviz (#11934) 2022-05-12 17:00:55 +00:00
debug.go refactor(container)!: remove dependency on C graphviz (#11934) 2022-05-12 17:00:55 +00:00
errors.go feat: implement low-level dependency injection container (#9666) 2021-10-04 20:36:41 +00:00
go.mod refactor(container)!: remove dependency on C graphviz (#11934) 2022-05-12 17:00:55 +00:00
go.sum refactor(container)!: remove dependency on C graphviz (#11934) 2022-05-12 17:00:55 +00:00
group.go refactor(container)!: remove dependency on C graphviz (#11934) 2022-05-12 17:00:55 +00:00
location.go feat: implement low-level dependency injection container (#9666) 2021-10-04 20:36:41 +00:00
module_dep.go refactor(container)!: remove dependency on C graphviz (#11934) 2022-05-12 17:00:55 +00:00
module_key.go fix!(container): fix issue with providing a module-scoped dependency from within a module (#11913) 2022-05-09 18:43:26 -04:00
one_per_module.go refactor(container)!: remove dependency on C graphviz (#11934) 2022-05-12 17:00:55 +00:00
option.go refactor(container)!: rename Scope -> ModuleKey (#11073) 2022-01-31 17:12:08 +00:00
provider_desc.go refactor(container)!: rename Scope -> ModuleKey (#11073) 2022-01-31 17:12:08 +00:00
provider_desc_test.go refactor(container)!: rename Scope -> ModuleKey (#11073) 2022-01-31 17:12:08 +00:00
resolver.go refactor(container)!: remove dependency on C graphviz (#11934) 2022-05-12 17:00:55 +00:00
simple.go refactor(container)!: remove dependency on C graphviz (#11934) 2022-05-12 17:00:55 +00:00
struct_args.go refactor(container)!: use build instead of run model to get dependencies (#11916) 2022-05-10 13:24:09 +00:00
supply.go refactor(container)!: remove dependency on C graphviz (#11934) 2022-05-12 17:00:55 +00:00

README.md

Cosmos SDK Dependency Injection container Module

Overview

TODO

Usage

TODO

Debugging

Issues with resolving dependencies in the container can be done with logs and Graphviz renderings of the container tree. By default, whenever there is an error, logs will be printed to stderr and a rendering of the dependency graph in Graphviz DOT format will be saved to debug_container.dot.

Here is an example Graphviz rendering of a successful build of a dependency graph: Graphviz Example

Rectangles represent functions, ovals represent types, rounded rectangles represent modules and the single hexagon represents the function which called Build. Black-colored shapes mark functions and types that were called/resolved without an error. Gray-colored nodes mark functions and types that could have been called/resolved in the container but were left unused.

Here is an example Graphviz rendering of a dependency graph build which failed: Graphviz Error Example

Graphviz DOT files can be converted into SVG's for viewing in a web browser using the dot command-line tool, ex:

> dot -Tsvg debug_container.dot > debug_container.svg

Many other tools including some IDEs support working with DOT files.