Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .adr-dir
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
docs/adr
19 changes: 19 additions & 0 deletions docs/adr/0001-record-architecture-decisions.md
Original file line number Diff line number Diff line change
@@ -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).
32 changes: 32 additions & 0 deletions docs/adr/0002-prefer-making-backward-compatible-changes.md
Original file line number Diff line number Diff line change
@@ -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.
Original file line number Diff line number Diff line change
@@ -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.
24 changes: 24 additions & 0 deletions docs/adr/0004-use-separate-github-organization-for-new-packages.md
Original file line number Diff line number Diff line change
@@ -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.
Original file line number Diff line number Diff line change
@@ -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.
20 changes: 20 additions & 0 deletions docs/adr/0006-go-version-support.md
Original file line number Diff line number Diff line change
@@ -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.
22 changes: 22 additions & 0 deletions docs/adr/0007-drop-writing-support.md
Original file line number Diff line number Diff line change
@@ -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.
23 changes: 23 additions & 0 deletions docs/adr/0008-deprecate-the-global-viper-instance.md
Original file line number Diff line number Diff line change
@@ -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.