Compare commits

...

4 Commits
master ... adr

Author SHA1 Message Date
Mark Sagi-Kazar 99e9188c7c
docs: propose deprecating the global Viper instance
Signed-off-by: Mark Sagi-Kazar <mark.sagikazar@gmail.com>
2021-09-23 10:07:37 +02:00
Mark Sagi-Kazar c943b3ef27
docs: propose dropping file writing support
Signed-off-by: Mark Sagi-Kazar <mark.sagikazar@gmail.com>
2021-09-22 23:10:51 +02:00
Mark Sagi-Kazar a0f1caa4ed
docs: document a decision about Go version support
Signed-off-by: Mark Sagi-Kazar <mark.sagikazar@gmail.com>
2021-09-16 09:04:54 +02:00
Mark Sagi-Kazar d2e3a7e5c2
docs: document some architectural decisions
Signed-off-by: Mark Sagi-Kazar <mark.sagikazar@gmail.com>
2021-07-20 23:54:12 +02:00
9 changed files with 197 additions and 0 deletions

1
.adr-dir Normal file
View File

@ -0,0 +1 @@
docs/adr

View File

@ -0,0 +1,19 @@
# 1. Record architecture decisions
Date: 2021-07-20
## Status
Proposed
## Context
We need to record the architectural decisions made on this project.
## Decision
We will use Architecture Decision Records, as [described by Michael Nygard](http://thinkrelevance.com/blog/2011/11/15/documenting-architecture-decisions).
## Consequences
See Michael Nygard's article, linked above. For a lightweight ADR toolset, see Nat Pryce's [adr-tools](https://github.com/npryce/adr-tools).

View File

@ -0,0 +1,32 @@
# 2. Prefer making backward compatible changes
Date: 2021-07-20
## Status
Proposed
Referenced by [3. Extract components with heavy dependencies from the core](0003-extract-components-with-heavy-dependencies-from-the-core.md)
Referenced by [4. Use separate GitHub organization for new packages](0004-use-separate-github-organization-for-new-packages.md)
Referenced by [7. Drop writing support](0007-drop-writing-support.md)
## Context
Architecturally speaking Viper became a giant over the years: it hides a lot of complexity behind a simple interface.
That simple interface, however, is what makes Viper extremely popular.
## Decision
In order to keep the library useful to people, we should prefer making backward compatible changes to Viper, even between major releases.
This is not a hard rule forbiding breaking changes though: when it makes sense, breaking changes are allowed,
but keeping things backward compatible is a priority.
## Consequences
Although major versions allow breaking changes, a major release is no reason to break things that already work for a lot of people,
even if it might not be the best possible solution.
Instead of breaking things, introducing new interfaces should be the default way of fixing architectural problems,
leaving old interfaces intact.

View File

@ -0,0 +1,26 @@
# 3. Extract components with heavy dependencies from the core
Date: 2021-07-20
## Status
Proposed
References [2. Prefer making backward compatible changes](0002-prefer-making-backward-compatible-changes.md)
Referenced by [4. Use separate GitHub organization for new packages](0004-use-separate-github-organization-for-new-packages.md)
## Context
Viper (v1) currently imports a bunch of external dependencies (for encoding/decoding, remote stores, etc)
that make the library itself quite a heavy dependency.
## Decision
Move components with external dependencies out of the core to separate packages.
## Consequences
Viper 1 will have to continue importing all of these packages to maintain backwards compatibility.
Viper 2 (and future versions) on the other hand can break backwards compatibility and require users to import the required packages.

View File

@ -0,0 +1,24 @@
# 4. Use separate GitHub organization for new packages
Date: 2021-07-20
## Status
Proposed
References [2. Prefer making backward compatible changes](0002-prefer-making-backward-compatible-changes.md)
References [3. Extract components with heavy dependencies from the core](0003-extract-components-with-heavy-dependencies-from-the-core.md)
## Context
The core Viper package is under a personal GitHub account which makes collaborative development a bit difficult.
## Decision
Create new Go modules in the [go-viper](https://github.com/go-viper) organization.
Keep the core library under [Steve's personal account](https://github.com/spf13/viper) for backward compatibility purposes.
## Consequences
It'll be easier to create new modules and to add new functionality to Viper without having to add new dependencies to the core library.

View File

@ -0,0 +1,30 @@
# 5. Deprecate setters in favor of functional options during initialization
Date: 2021-07-20
## Status
Proposed
Referenced by [8. Deprecate the global Viper instance](0008-deprecate-the-global-viper-instance.md)
## Context
The Viper struct currently acts as a facade for reading, writing and watching configuration for changes.
Some of the configuration parameters can be changed runtime using setters which often lead to issues
with concurrent activities.
## Decision
Deprecate setters in favor of using functional options for configuring Viper when it's initialized.
Drop setters in Viper 2.
## Consequences
Since Viper's interface is usually invoked from a lot of places,
moving configuration to the place where it is initialized makes using Viper safer
(ie. someone can't just randomly call `Set` when they are only supposed to call `Get*`).
This change will also clarify what roles Viper can be used in and
makes the separation of internal components easier based on these roles.

View File

@ -0,0 +1,20 @@
# 6. Go version support
Date: 2021-09-16
## Status
Proposed
## Context
From time to time new features are released in the Go language.
Relying on those features means dropping support for older Go versions.
## Decision
Follow the [Go release policy](https://golang.org/doc/devel/release#policy) and support the last two major versions of Go.
## Consequences
Support for older Go versions will happen every 6 months according to the Go release cycle.

View File

@ -0,0 +1,22 @@
# 7. Drop writing support
Date: 2021-09-22
## Status
Proposed
References [2. Prefer making backward compatible changes](0002-prefer-making-backward-compatible-changes.md)
## Context
The number one source of issues for Viper comes from the fact that it supports both reading and writing.
It causes concurrency issues and has lots of inconsistencies.
## Decision
Drop file writing support from Viper in v2.
## Consequences
This is going to be a major breaking change in the library, but it will make maintenance significantly easier.

View File

@ -0,0 +1,23 @@
# 8. Deprecate the global Viper instance
Date: 2021-09-23
## Status
Proposed
References [5. Deprecate setters in favor of functional options during initialization](0005-deprecate-setters-in-favor-of-functional-options-during-initialization.md)
## Context
With the deprecation of setters in favor of functional options, it becomes almost impossible to get away with instantiating Viper.
In addition to that, people should be discouraged from accessing a global Viper instance.
## Decision
Deprecate the global Viper instance and the global access functions.
## Consequences
People will still be able to create a global instance of their own,
but instantiating a custom Viper instance will become the primary solution for using Viper.