Home | History | Annotate | Download | only in dateutil
      1 # Contributing
      2 
      3 This document outlines the ways to contribute to `python-dateutil`. This is a fairly small, low-traffic project, so most of the contribution norms (coding style, acceptance criteria) have been developed ad hoc and this document will not be exhaustive. If you are interested in contributing code or documentation, please take a moment to at least review the license section to understand how your code will be licensed.
      4 
      5 ## Types of contribution
      6 
      7 ### Bug reports
      8 Bug reports are an important type of contribution - it's important to get feedback about how the library is failing, and there's no better way to do that than to hear about real-life failure cases. A good bug report will include:
      9 
     10 1. A minimal, reproducible example - a small, self-contained script that can reproduce the behavior is the best way to get your bug fixed. For more information and tips on how to structure these, read [StackOverflow's guide to creating a minimal, complete, verified example](https://stackoverflow.com/help/mcve).
     11 
     12 2. The platform and versions of everything involved, at a minimum please include operating system, `python` version and `dateutil` version. Instructions on getting your versions:
     13     - `dateutil`: `python -c 'import dateutil; print(dateutil.__version__)'`
     14     - `Python`: `python --version`
     15 
     16 3. A description of the problem - what *is* happening and what *should* happen.
     17 
     18 While pull requests fixing bugs are accepted, they are *not* required - the bug report in itself is a great contribution.
     19 
     20 ### Feature requests
     21 
     22 If you would like to see a new feature in `dateutil`, it is probably best to start an issue for discussion rather than taking the time to implement a feature which may or may not be appropriate for `dateutil`'s API. For minor features (ones where you don't have to put a lot of effort into the PR), a pull request is fine but still not necessary.
     23 
     24 ### Pull requests
     25 
     26 If you would like to fix something in `dateutil` -  improvements to documentation, bug fixes, feature implementations, fixes to the build system, etc - pull requests are welcome! Where possible, try to keep your coding to [PEP 8 style](https://www.python.org/dev/peps/pep-0008/), with the minor modification that the existing `dateutil` class naming style does not use the CapWords convention, or where the existing style does not follow PEP 8.
     27 
     28 The most important thing to include in your pull request are *tests* - please write one or more tests to cover the behavior you intend your patch to improve. Ideally, tests would use only the public interface - try to get 100% difference coverage using only supported behavior of the API.
     29 
     30 #### Changelog
     31 To keep users abreast of the changes to the module and to give proper credit, `dateutil` maintains a changelog, which is managed by [towncrier](https://github.com/hawkowl/towncrier). To add a changelog entry, make a new file called `<issue_no>.<type>.rst`, where `<issue_no>` is the number of the PR you've just made (it's easiest to add the changelog *after* you've created the PR so you'll have this number), and `<type>` is one of the following types:
     32 
     33 - `feature`: A new feature, (e.g. a new function, method, attribute, etc)
     34 - `bugfix`: A fix to a bug
     35 - `doc`: A change to the documentation
     36 - `deprecation`: Used if deprecating a feature or dropping support for a Python version.
     37 - `misc`: A change that has no interesting effect for end users, such as fixes to the test suite or CI.
     38 
     39 PRs that include a feature or bugfix *and* a deprecation should create a separate entry for the deprecation.
     40 
     41 
     42 
     43 > {description of changes}. Reported by @{reporter} (gh issue #{issue\_no}). Fixed by @{patch submitter} (gh pr #{pr\_no})
     44 
     45 An example changelog entry might be:
     46 
     47 **581.bugfix.rst**
     48 ```
     49 Fixed issue where the tz.tzstr constructor would erroneously succeed if passed
     50 an invalid value for tzstr. Reported by @pganssle (gh issue #259). Fixed by
     51 @pablogsal (gh pr #581)
     52 ```
     53 
     54 For bugs reported and fixed by the same person use "Reported and fixed by @{patch submitter}". It is not necessary to create a github issue just for the purpose of mentioning it in the changelog, if the PR *is* the report, mentioning the PR is enough.
     55 
     56 ## License
     57 
     58 Starting December 1, 2017, all contributions will be assumed to be released under a dual license - the [Apache 2.0 License](https://www.apache.org/licenses/LICENSE-2.0) and the [3-Clause BSD License](https://opensource.org/licenses/BSD-3-Clause) unless otherwise specified in the pull request.
     59 
     60 All contributions before December 1, 2017 except those explicitly relicensed, are only under the 3-clause BSD license.
     61 
     62 ## Building and releasing
     63 
     64 When you get the source, it does not contain the internal zoneinfo
     65 database. To get (and update) the database, run the updatezinfo.py script. Make sure
     66 that the zic command is in your path, and that you have network connectivity
     67 to get the latest timezone information from IANA, or from [our mirror of the
     68 IANA database](https://dateutil.github.io/tzdata/).
     69 
     70 ## Development Setup
     71 
     72 Install the the dependencies for running the test suite using `pip` or `conda`.
     73 
     74 ### pip
     75 
     76 Run the following commands to create a [virtual environment](https://virtualenv.pypa.io) with all dependencies installed:
     77 
     78     python -m virtualenv .venv       # Create virtual environment in .venv directory
     79     . .venv/bin/activate             # Activate the virtual environment
     80     pip install -r requirements.txt  # Install the dependencies
     81 
     82 ### conda
     83 
     84 Run the following commands to create a [conda environment](https://conda.io) with all dependencies installed:
     85 
     86     conda create -n dateutil                # Create a conda environment
     87     # conda create -n dateutil python=3.6   # or specify a version
     88     source activate dateutil                # Activate the conda environment
     89     pip install -r requirements.txt         # Install the dependencies
     90 
     91 ## Testing
     92 
     93 dateutil has a comprehensive test suite, which can be run simply by running
     94 `python -m pytest` in the project root. Note that if you don't have the internal
     95 zoneinfo database, some tests will fail. Apart from that, all tests should pass.
     96 
     97 To easily test dateutil against all supported Python versions, you can use
     98 [tox](https://tox.readthedocs.io/en/latest/).
     99 
    100 All GitHub pull requests are automatically tested using travis and appveyor.
    101