aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/python/scipy/py2/HACKING.rst.txt
diff options
context:
space:
mode:
authorrobot-piglet <robot-piglet@yandex-team.com>2024-05-15 18:20:46 +0300
committerrobot-piglet <robot-piglet@yandex-team.com>2024-05-15 18:29:20 +0300
commit95043960ea8ba262f5b0bc21f57f1a0ec2958cca (patch)
treed51e961867d88e6eea684ce89523eadb43190799 /contrib/python/scipy/py2/HACKING.rst.txt
parentbb793583d8882d549c2ff79010b300c33bc0c8eb (diff)
downloadydb-95043960ea8ba262f5b0bc21f57f1a0ec2958cca.tar.gz
Intermediate changes
Diffstat (limited to 'contrib/python/scipy/py2/HACKING.rst.txt')
-rw-r--r--contrib/python/scipy/py2/HACKING.rst.txt528
1 files changed, 528 insertions, 0 deletions
diff --git a/contrib/python/scipy/py2/HACKING.rst.txt b/contrib/python/scipy/py2/HACKING.rst.txt
new file mode 100644
index 0000000000..9dcee793ba
--- /dev/null
+++ b/contrib/python/scipy/py2/HACKING.rst.txt
@@ -0,0 +1,528 @@
+=====================
+Contributing to SciPy
+=====================
+
+This document aims to give an overview of how to contribute to SciPy. It
+tries to answer commonly asked questions, and provide some insight into how the
+community process works in practice. Readers who are familiar with the SciPy
+community and are experienced Python coders may want to jump straight to the
+`git workflow`_ documentation.
+
+There are a lot of ways you can contribute:
+
+- Contributing new code
+- Fixing bugs and other maintenance work
+- Improving the documentation
+- Reviewing open pull requests
+- Triaging issues
+- Working on the `scipy.org`_ website
+- Answering questions and participating on the scipy-dev and scipy-user
+ `mailing lists`_.
+
+Contributing new code
+=====================
+
+If you have been working with the scientific Python toolstack for a while, you
+probably have some code lying around of which you think "this could be useful
+for others too". Perhaps it's a good idea then to contribute it to SciPy or
+another open source project. The first question to ask is then, where does
+this code belong? That question is hard to answer here, so we start with a
+more specific one: *what code is suitable for putting into SciPy?*
+Almost all of the new code added to scipy has in common that it's potentially
+useful in multiple scientific domains and it fits in the scope of existing
+scipy submodules. In principle new submodules can be added too, but this is
+far less common. For code that is specific to a single application, there may
+be an existing project that can use the code. Some scikits (`scikit-learn`_,
+`scikit-image`_, `statsmodels`_, etc.) are good examples here; they have a
+narrower focus and because of that more domain-specific code than SciPy.
+
+Now if you have code that you would like to see included in SciPy, how do you
+go about it? After checking that your code can be distributed in SciPy under a
+compatible license (see FAQ for details), the first step is to discuss on the
+scipy-dev mailing list. All new features, as well as changes to existing code,
+are discussed and decided on there. You can, and probably should, already
+start this discussion before your code is finished.
+
+Assuming the outcome of the discussion on the mailing list is positive and you
+have a function or piece of code that does what you need it to do, what next?
+Before code is added to SciPy, it at least has to have good documentation, unit
+tests and correct code style.
+
+1. Unit tests
+ In principle you should aim to create unit tests that exercise all the code
+ that you are adding. This gives some degree of confidence that your code
+ runs correctly, also on Python versions and hardware or OSes that you don't
+ have available yourself. An extensive description of how to write unit
+ tests is given in the NumPy `testing guidelines`_.
+
+2. Documentation
+ Clear and complete documentation is essential in order for users to be able
+ to find and understand the code. Documentation for individual functions
+ and classes -- which includes at least a basic description, type and
+ meaning of all parameters and returns values, and usage examples in
+ `doctest`_ format -- is put in docstrings. Those docstrings can be read
+ within the interpreter, and are compiled into a reference guide in html and
+ pdf format. Higher-level documentation for key (areas of) functionality is
+ provided in tutorial format and/or in module docstrings. A guide on how to
+ write documentation is given in `how to document`_.
+
+3. Code style
+ Uniformity of style in which code is written is important to others trying
+ to understand the code. SciPy follows the standard Python guidelines for
+ code style, `PEP8`_. In order to check that your code conforms to PEP8,
+ you can use the `pep8 package`_ style checker. Most IDEs and text editors
+ have settings that can help you follow PEP8, for example by translating
+ tabs by four spaces. Using `pyflakes`_ to check your code is also a good
+ idea.
+
+At the end of this document a checklist is given that may help to check if your
+code fulfills all requirements for inclusion in SciPy.
+
+Another question you may have is: *where exactly do I put my code*? To answer
+this, it is useful to understand how the SciPy public API (application
+programming interface) is defined. For most modules the API is two levels
+deep, which means your new function should appear as
+``scipy.submodule.my_new_func``. ``my_new_func`` can be put in an existing or
+new file under ``/scipy/<submodule>/``, its name is added to the ``__all__``
+list in that file (which lists all public functions in the file), and those
+public functions are then imported in ``/scipy/<submodule>/__init__.py``. Any
+private functions/classes should have a leading underscore (``_``) in their
+name. A more detailed description of what the public API of SciPy is, is given
+in `SciPy API`_.
+
+Once you think your code is ready for inclusion in SciPy, you can send a pull
+request (PR) on Github. We won't go into the details of how to work with git
+here, this is described well in the `git workflow`_ section of the NumPy
+documentation and on the `Github help pages`_. When you send the PR for a new
+feature, be sure to also mention this on the scipy-dev mailing list. This can
+prompt interested people to help review your PR. Assuming that you already got
+positive feedback before on the general idea of your code/feature, the purpose
+of the code review is to ensure that the code is correct, efficient and meets
+the requirements outlined above. In many cases the code review happens
+relatively quickly, but it's possible that it stalls. If you have addressed
+all feedback already given, it's perfectly fine to ask on the mailing list
+again for review (after a reasonable amount of time, say a couple of weeks, has
+passed). Once the review is completed, the PR is merged into the "master"
+branch of SciPy.
+
+The above describes the requirements and process for adding code to SciPy. It
+doesn't yet answer the question though how decisions are made exactly. The
+basic answer is: decisions are made by consensus, by everyone who chooses to
+participate in the discussion on the mailing list. This includes developers,
+other users and yourself. Aiming for consensus in the discussion is important
+-- SciPy is a project by and for the scientific Python community. In those
+rare cases that agreement cannot be reached, the maintainers of the module
+in question can decide the issue.
+
+
+Contributing by helping maintain existing code
+==============================================
+
+The previous section talked specifically about adding new functionality to
+SciPy. A large part of that discussion also applies to maintenance of existing
+code. Maintenance means fixing bugs, improving code quality, documenting
+existing functionality better, adding missing unit tests, keeping
+build scripts up-to-date, etc. The SciPy `issue list`_ contains all
+reported bugs, build/documentation issues, etc. Fixing issues
+helps improve the overall quality of SciPy, and is also a good way
+of getting familiar with the project. You may also want to fix a bug because
+you ran into it and need the function in question to work correctly.
+
+The discussion on code style and unit testing above applies equally to bug
+fixes. It is usually best to start by writing a unit test that shows the
+problem, i.e. it should pass but doesn't. Once you have that, you can fix the
+code so that the test does pass. That should be enough to send a PR for this
+issue. Unlike when adding new code, discussing this on the mailing list may
+not be necessary - if the old behavior of the code is clearly incorrect, no one
+will object to having it fixed. It may be necessary to add some warning or
+deprecation message for the changed behavior. This should be part of the
+review process.
+
+.. note::
+
+ Pull requests that *only* change code style, e.g. fixing some PEP8 issues in
+ a file, are discouraged. Such PRs are often not worth cluttering the git
+ annotate history, and take reviewer time that may be better spent in other ways.
+ Code style cleanups of code that is touched as part of a functional change
+ are fine however.
+
+
+Reviewing pull requests
+=======================
+
+Reviewing open pull requests (PRs) is very welcome, and a valuable way to help
+increase the speed at which the project moves forward. If you have specific
+knowledge/experience in a particular area (say "optimization algorithms" or
+"special functions") then reviewing PRs in that area is especially valuable -
+sometimes PRs with technical code have to wait for a long time to get merged
+due to a shortage of appropriate reviewers.
+
+We encourage everyone to get involved in the review process; it's also a
+great way to get familiar with the code base. Reviewers should ask
+themselves some or all of the following questions:
+
+- Was this change adequately discussed (relevant for new features and changes
+ in existing behavior)?
+- Is the feature scientifically sound? Algorithms may be known to work based on
+ literature; otherwise, closer look at correctness is valuable.
+- Is the intended behavior clear under all conditions (e.g. unexpected inputs
+ like empty arrays or nan/inf values)?
+- Does the code meet the quality, test and documentation expectation outline
+ under `Contributing new code`_?
+
+If we do not know you yet, consider introducing yourself.
+
+
+Other ways to contribute
+========================
+
+There are many ways to contribute other than contributing code.
+
+Triaging issues (investigating bug reports for validity and possible actions to
+take) is also a useful activity. SciPy has many hundreds of open issues;
+closing invalid ones and correctly labeling valid ones (ideally with some first
+thoughts in a comment) allows prioritizing maintenance work and finding related
+issues easily when working on an existing function or submodule.
+
+Participating in discussions on the scipy-user and scipy-dev `mailing lists`_ is
+a contribution in itself. Everyone who writes to those lists with a problem or
+an idea would like to get responses, and writing such responses makes the
+project and community function better and appear more welcoming.
+
+The `scipy.org`_ website contains a lot of information on both SciPy the
+project and SciPy the community, and it can always use a new pair of hands.
+The sources for the website live in their own separate repo:
+https://github.com/scipy/scipy.org
+
+
+Recommended development setup
+=============================
+
+Since Scipy contains parts written in C, C++, and Fortran that need to be
+compiled before use, make sure you have the necessary compilers and Python
+development headers installed. Having compiled code also means that importing
+Scipy from the development sources needs some additional steps, which are
+explained below.
+
+First fork a copy of the main Scipy repository in Github onto your own
+account and then create your local repository via::
+
+ $ git clone git@github.com:YOURUSERNAME/scipy.git scipy
+ $ cd scipy
+ $ git remote add upstream git://github.com/scipy/scipy.git
+
+To build the development version of Scipy and run tests, spawn
+interactive shells with the Python import paths properly set up etc.,
+do one of::
+
+ $ python runtests.py -v
+ $ python runtests.py -v -s optimize
+ $ python runtests.py -v -t scipy.special.tests.test_basic::test_xlogy
+ $ python runtests.py --ipython
+ $ python runtests.py --python somescript.py
+ $ python runtests.py --bench
+
+This builds Scipy first, so the first time it may take some time. If
+you specify ``-n``, the tests are run against the version of Scipy (if
+any) found on current PYTHONPATH. *Note: if you run into a build issue,
+more detailed build documentation can be found in :doc:`building/index` and at
+https://github.com/scipy/scipy/tree/master/doc/source/building*
+
+Using ``runtests.py`` is the recommended approach to running tests.
+There are also a number of alternatives to it, for example in-place
+build or installing to a virtualenv. See the FAQ below for details.
+
+Some of the tests in Scipy are very slow and need to be separately
+enabled. See the FAQ below for details.
+
+
+SciPy structure
+===============
+
+All SciPy modules should follow the following conventions. In the
+following, a *SciPy module* is defined as a Python package, say
+``yyy``, that is located in the scipy/ directory.
+
+* Ideally, each SciPy module should be as self-contained as possible.
+ That is, it should have minimal dependencies on other packages or
+ modules. Even dependencies on other SciPy modules should be kept to
+ a minimum. A dependency on NumPy is of course assumed.
+
+* Directory ``yyy/`` contains:
+
+ - A file ``setup.py`` that defines
+ ``configuration(parent_package='',top_path=None)`` function
+ for `numpy.distutils`.
+
+ - A directory ``tests/`` that contains files ``test_<name>.py``
+ corresponding to modules ``yyy/<name>{.py,.so,/}``.
+
+* Private modules should be prefixed with an underscore ``_``,
+ for instance ``yyy/_somemodule.py``.
+
+* User-visible functions should have good documentation following
+ the Numpy documentation style, see `how to document`_
+
+* The ``__init__.py`` of the module should contain the main reference
+ documentation in its docstring. This is connected to the Sphinx
+ documentation under ``doc/`` via Sphinx's automodule directive.
+
+ The reference documentation should first give a categorized list of
+ the contents of the module using ``autosummary::`` directives, and
+ after that explain points essential for understanding the use of the
+ module.
+
+ Tutorial-style documentation with extensive examples should be
+ separate, and put under ``doc/source/tutorial/``
+
+See the existing Scipy submodules for guidance.
+
+For further details on Numpy distutils, see:
+
+ https://github.com/numpy/numpy/blob/master/doc/DISTUTILS.rst.txt
+
+
+Useful links, FAQ, checklist
+============================
+
+Checklist before submitting a PR
+--------------------------------
+
+ - Are there unit tests with good code coverage?
+ - Do all public function have docstrings including examples?
+ - Is the code style correct (PEP8, pyflakes)
+ - Is the commit message `formatted correctly`_?
+ - Is the new functionality tagged with ``.. versionadded:: X.Y.Z`` (with
+ X.Y.Z the version number of the next release - can be found in setup.py)?
+ - Is the new functionality mentioned in the release notes of the next
+ release?
+ - Is the new functionality added to the reference guide?
+ - In case of larger additions, is there a tutorial or more extensive
+ module-level description?
+ - In case compiled code is added, is it integrated correctly via setup.py
+ - If you are a first-time contributor, did you add yourself to THANKS.txt?
+ Please note that this is perfectly normal and desirable - the aim is to
+ give every single contributor credit, and if you don't add yourself it's
+ simply extra work for the reviewer (or worse, the reviewer may forget).
+ - Did you check that the code can be distributed under a BSD license?
+
+
+Useful SciPy documents
+----------------------
+
+ - The `how to document`_ guidelines
+ - NumPy/SciPy `testing guidelines`_
+ - `SciPy API`_
+ - The `SciPy Roadmap`_
+ - NumPy/SciPy `git workflow`_
+ - How to submit a good `bug report`_
+
+
+FAQ
+---
+
+*I based my code on existing Matlab/R/... code I found online, is this OK?*
+
+It depends. SciPy is distributed under a BSD license, so if the code that you
+based your code on is also BSD licensed or has a BSD-compatible license (e.g.
+MIT, PSF) then it's OK. Code which is GPL or Apache licensed, has no
+clear license, requires citation or is free for academic use only can't be
+included in SciPy. Therefore if you copied existing code with such a license
+or made a direct translation to Python of it, your code can't be included.
+If you're unsure, please ask on the scipy-dev mailing list.
+
+*Why is SciPy under the BSD license and not, say, the GPL?*
+
+Like Python, SciPy uses a "permissive" open source license, which allows
+proprietary re-use. While this allows companies to use and modify the software
+without giving anything back, it is felt that the larger user base results in
+more contributions overall, and companies often publish their modifications
+anyway, without being required to. See John Hunter's `BSD pitch`_.
+
+
+*How do I set up a development version of SciPy in parallel to a released
+version that I use to do my job/research?*
+
+One simple way to achieve this is to install the released version in
+site-packages, by using a binary installer or pip for example, and set
+up the development version in a virtualenv. First install
+`virtualenv`_ (optionally use `virtualenvwrapper`_), then create your
+virtualenv (named scipy-dev here) with::
+
+ $ virtualenv scipy-dev
+
+Now, whenever you want to switch to the virtual environment, you can use the
+command ``source scipy-dev/bin/activate``, and ``deactivate`` to exit from the
+virtual environment and back to your previous shell. With scipy-dev
+activated, install first Scipy's dependencies::
+
+ $ pip install Numpy pytest Cython
+
+After that, you can install a development version of Scipy, for example via::
+
+ $ python setup.py install
+
+The installation goes to the virtual environment.
+
+
+*How do I set up an in-place build for development*
+
+For development, you can set up an in-place build so that changes made to
+``.py`` files have effect without rebuild. First, run::
+
+ $ python setup.py build_ext -i
+
+Then you need to point your PYTHONPATH environment variable to this directory.
+Some IDEs (`Spyder`_ for example) have utilities to manage PYTHONPATH. On Linux
+and OSX, you can run the command::
+
+ $ export PYTHONPATH=$PWD
+
+and on Windows
+
+ $ set PYTHONPATH=/path/to/scipy
+
+Now editing a Python source file in SciPy allows you to immediately
+test and use your changes (in ``.py`` files), by simply restarting the
+interpreter.
+
+
+*Are there any video examples for installing from source, setting up a
+development environment, etc...?*
+
+Currently, there are two video demonstrations for Anaconda Python on macOS:
+
+`Anaconda SciPy Dev Part I (macOS)`_ is a four-minute
+overview of installing Anaconda, building SciPy from source, and testing
+changes made to SciPy from the `Spyder`_ IDE.
+
+`Anaconda SciPy Dev Part II (macOS)`_ shows how to use
+a virtual environment to easily switch between the "pre-built version" of SciPy
+installed with Anaconda and your "source-built version" of SciPy created
+according to Part I.
+
+
+*Are there any video examples of the basic development workflow?*
+
+`SciPy Development Workflow`_ is a five-minute example of fixing a bug and
+submitting a pull request. While it's intended as a followup to
+`Anaconda SciPy Dev Part I (macOS)`_ and `Anaconda SciPy Dev Part II (macOS)`_,
+the process is similar for other development setups.
+
+
+*Can I use a programming language other than Python to speed up my code?*
+
+Yes. The languages used in SciPy are Python, Cython, C, C++ and Fortran. All
+of these have their pros and cons. If Python really doesn't offer enough
+performance, one of those languages can be used. Important concerns when
+using compiled languages are maintainability and portability. For
+maintainability, Cython is clearly preferred over C/C++/Fortran. Cython and C
+are more portable than C++/Fortran. A lot of the existing C and Fortran code
+in SciPy is older, battle-tested code that was only wrapped in (but not
+specifically written for) Python/SciPy. Therefore the basic advice is: use
+Cython. If there's specific reasons why C/C++/Fortran should be preferred,
+please discuss those reasons first.
+
+
+*How do I debug code written in C/C++/Fortran inside Scipy?*
+
+The easiest way to do this is to first write a Python script that
+invokes the C code whose execution you want to debug. For instance
+``mytest.py``::
+
+ from scipy.special import hyp2f1
+ print(hyp2f1(5.0, 1.0, -1.8, 0.95))
+
+Now, you can run::
+
+ gdb --args python runtests.py -g --python mytest.py
+
+If you didn't compile with debug symbols enabled before, remove the
+``build`` directory first. While in the debugger::
+
+ (gdb) break cephes_hyp2f1
+ (gdb) run
+
+The execution will now stop at the corresponding C function and you
+can step through it as usual. Instead of plain ``gdb`` you can of
+course use your favourite alternative debugger; run it on the
+``python`` binary with arguments ``runtests.py -g --python mytest.py``.
+
+
+*How do I enable additional tests in Scipy?*
+
+Some of the tests in Scipy's test suite are very slow and not enabled
+by default. You can run the full suite via::
+
+ $ python runtests.py -g -m full
+
+This invokes the test suite ``import scipy; scipy.test("full")``,
+enabling also slow tests.
+
+There is an additional level of very slow tests (several minutes),
+which are disabled also in this case. They can be enabled by setting
+the environment variable ``SCIPY_XSLOW=1`` before running the test
+suite.
+
+
+.. _scikit-learn: http://scikit-learn.org
+
+.. _scikit-image: http://scikit-image.org/
+
+.. _statsmodels: https://www.statsmodels.org/
+
+.. _testing guidelines: https://github.com/numpy/numpy/blob/master/doc/TESTS.rst.txt
+
+.. _formatted correctly: https://docs.scipy.org/doc/numpy/dev/gitwash/development_workflow.html#writing-the-commit-message
+
+.. _how to document: https://github.com/numpy/numpy/blob/master/doc/HOWTO_DOCUMENT.rst.txt
+
+.. _bug report: https://scipy.org/bug-report.html
+
+.. _PEP8: https://www.python.org/dev/peps/pep-0008/
+
+.. _pep8 package: https://pypi.python.org/pypi/pep8
+
+.. _pyflakes: https://pypi.python.org/pypi/pyflakes
+
+.. _SciPy API: https://docs.scipy.org/doc/scipy/reference/api.html
+
+.. _SciPy Roadmap: https://scipy.github.io/devdocs/roadmap.html
+
+.. _git workflow: https://docs.scipy.org/doc/numpy/dev/gitwash/
+
+.. _Github help pages: https://help.github.com/articles/set-up-git/
+
+.. _issue list: https://github.com/scipy/scipy/issues
+
+.. _Github: https://github.com/scipy/scipy
+
+.. _scipy.org: https://scipy.org/
+
+.. _scipy.github.com: https://scipy.github.com/
+
+.. _scipy.org-new: https://github.com/scipy/scipy.org-new
+
+.. _documentation wiki: https://docs.scipy.org/scipy/Front%20Page/
+
+.. _SciPy Central: https://web.archive.org/web/20170520065729/http://central.scipy.org/
+
+.. _doctest: https://pymotw.com/3/doctest/
+
+.. _virtualenv: https://virtualenv.pypa.io/
+
+.. _virtualenvwrapper: https://bitbucket.org/dhellmann/virtualenvwrapper/
+
+.. _bsd pitch: http://nipy.sourceforge.net/nipy/stable/faq/johns_bsd_pitch.html
+
+.. _Pytest: https://pytest.org/
+
+.. _mailing lists: https://www.scipy.org/scipylib/mailing-lists.html
+
+.. _Spyder: https://www.spyder-ide.org/
+
+.. _Anaconda SciPy Dev Part I (macOS): https://youtu.be/1rPOSNd0ULI
+
+.. _Anaconda SciPy Dev Part II (macOS): https://youtu.be/Faz29u5xIZc
+
+.. _SciPy Development Workflow: https://youtu.be/HgU01gJbzMY