We are glad you're reading this, we really appreciate the effort you're putting in. Thank you for your help in making this library awesome! ✨
The version of this library typically consists of at most four numbers (last numbers are assumed to be 0 if there are less than 4 numbers).
The semantics is marketing.breaking.feature.fix
:
fix
is increased when set of exported definitions is not modified (all changes are not visible outside).feature
is increased when set of exported definitions is strictly augmented.breaking
is increased when breaking changes are made.marketing
is increased for releases which are important from marketing perspective.
tl;dr
- Issues with labels
type:not-code
andtype:fix
can be resolved at any time. - Issues with labels
type:feature
andtype:breaking
can be resolved only after being added to a milestone. features
releases happen at most once per two weeks.breaking
releases happen at most once per five weeks.
Actual policy
We think that a custom prelude shouldn't change often.
Because of that we have a semi-formal policy describing which modifications can be done to universum
under which circumstances.
We split all issues into four semi-formally defined categories:
not-code
. Everything that doesn't modify source code (except non-Haddock comments),.cabal
files, other files considered by GHC (if they exist). Examples: fix a typo in README.md, fix something in CI configuration files, add a pull request template.fix
. Everything that doesn't fit innot-code
, but doesn't change set of exported definitions and their types or semantics. Examples: fix compatibility with a new version of a library/compiler, improve performance of some function (keeping its semantics intact). Note: despite the name, issues of this type do not necessary correspond to bug fixes.feature
. Modifications which make set of exported definitions a superset of the old set of exported definitions. I. e. all existing definitions are left intact, only something new is added. Example: add a new function, re-export a type class, add a new instance of some type class.breaking
. Basically all other changes. Examples: remove of a function, rename a type class, change arguments order of a function.
Each issue should belong to only one category. If an issue involves multiple changes of different types, it should be split into smaller issues
For each category we have a label on GitHub, these labels start with the type:
prefix.
There is also the type:unclear
label for issues which don't have a list of specific actions to be done.
Processing of an issue depends on its category. Specifically:
- A
not-code
issue can be resolved at any time. PRs can be merged whenever GitHub allows it. Minimal number of approvals is set in GitHub settings. - Rules for the
fix
issues are the same as fornot-code
with an additional rule that PRs for such issues should increase the last component in the version and this version should be uploaded to Hackage as soon as the PR is merged (also new tag and release are created). - Work on the
feature
issues is organized in milestones. Each milestone corresponds to a release which increases at least the third (feature
) version component. Scope of each milestone is discussed in issues and is set by maintainers. In some cases a special issue can be created to discuss the scope of a particular milestone. Afeature
issue is added to a milestone if such addition is approved by at least 3 people (by explicitly stating that in GH comments). At least 2 of them must be from Serokell. However, if there are 4 people (from which at least 3 are from Serokell) who disapprove this issue, it can't be added to a milestone. A newfeature
release can happen only after at least 2 weeks have passed after last release (exceptfix
releases). PR can be merged only if the correspondingfeature
issue is in the upcoming milestone. - Work on the
breaking
issues is organized in almost the same way. However, 4 approvals (at least 3 from Serokell) are necessary for inclusion into a milestone. 2 disapprovals from Serokell or 4 disapprovals in total are enough to prevent the issue from getting into a milestone. If an issue is about removal of something (x
), it should be done in two steps. The first step is to deprecatex
which happens in abreaking
release. The second step is to deletex
which happens in anotherbreaking
release after deprecatingx
. There can't be more than one breaking release in less than 5 weeks.
Note: approval of any PR implies that the person who approves it confirms that the PR corresponds to the issue mentioned there and the issue has a correct type.
If you have found any bugs or have proposals on how to make this project better, don't hesitate to create issues here in free format.
We want universum
to be suitable for as many Haskell developers as possible.
That's why we would greatly appreciate your comments in our issues and pull requests.
Please tell us whether you think that proposed modifications makes sense and are worth doing.
We love receiving pull requests from everyone. But, please, don't create a PR without a corresponding issue. It's always a good idea to express your wish to do that issue under comment section. Thus you will show that you're doing that issue, and nobody else will accidentally do it in parallel with you. Furthermore you also can discuss the best way to implement that issue! Make sure to read the Code modification policy before starting your work on any issue.
To get started with this you should first fork, then clone the repo:
git clone [email protected]:your-username/universum.git
Make your changes and consider the following check list to go through before submitting your pull request.
- Project compiles
- New/fixed features work as expected
- Old features do not break after the change
- Recommended: Commit messages are in the proper format. If the commit
addresses an issue start the first line of the commit with the issue number in
square parentheses.
- Example:
[#42] Short commit description
- Example:
If you fix bugs or add new features, please add tests.
After everything above is done, commit and push to your fork. Now you are ready to submit a pull request!
Thanks for spending time on reading this contributing guide! 💖