Skip to content
Snippets Groups Projects
Commit ea92152d authored by Mads M. Pedersen's avatar Mads M. Pedersen
Browse files

added developer-guide.md

parent 2b346b0f
No related branches found
No related tags found
No related merge requests found
Pipeline #
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Strict//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>C:\mmpe\programming\python\WindEnergyToolbox\docs\.developer-guide.md.html</title>
<style type="text/css">
body {
color: #333;
font: 13px/1.4 "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif;
padding: 0;
margin: 0;
}
a {
background: transparent;
color: #4183c4;
text-decoration: none;
}
a:active,
a:hover {
outline: 0 none;
text-decoration: underline;
}
abbr[title] {
border-bottom: 1px dotted;
}
b,
strong {
font-weight: bold;
}
dfn {
font-style: italic;
}
h1 {
font-size: 2em;
margin: 0.67em 0;
}
mark {
background: #ff0;
color: #000;
}
small {
font-size: 80%;
}
sub, sup {
font-size: 75%;
line-height: 0;
position: relative;
vertical-align: baseline;
}
sup {
top: -0.5em;
}
sub {
bottom: -0.25em;
}
img {
border: 0 none;
}
svg:not(:root) {
overflow: hidden;
}
figure {
margin: 1em 40px;
}
hr {
box-sizing: content-box;
height: 0;
}
code,
kbd,
pre,
samp {
font-family: monospace,monospace;
font-size: 1em;
}
pre {
overflow: auto;
font: 12px Consolas,"Liberation Mono",Menlo,Courier,monospace;
margin-bottom: 0;
margin-top: 0;
}
.markdown-body {
padding: 30px;
font-size: 16px;
line-height: 1.6;
word-wrap: break-word;
}
.markdown-body>*:first-child {
margin-top: 0 !important;
}
.markdown-body>*:last-child {
margin-bottom: 0 !important;
}
.markdown-body .absent {
color: #c00;
}
.markdown-body .anchor {
position: absolute;
top: 0;
bottom: 0;
left: 0;
display: block;
padding-right: 6px;
padding-left: 30px;
margin-left: -30px;
}
.markdown-body .anchor:focus {
outline: none;
}
.markdown-body h1,
.markdown-body h2,
.markdown-body h3,
.markdown-body h4,
.markdown-body h5,
.markdown-body h6 {
position: relative;
margin-top: 1em;
margin-bottom: 16px;
font-weight: bold;
line-height: 1.4;
}
.markdown-body h1 .octicon-link,
.markdown-body h2 .octicon-link,
.markdown-body h3 .octicon-link,
.markdown-body h4 .octicon-link,
.markdown-body h5 .octicon-link,
.markdown-body h6 .octicon-link {
display: none;
color: #000;
vertical-align: middle;
}
.markdown-body h1:hover .anchor,
.markdown-body h2:hover .anchor,
.markdown-body h3:hover .anchor,
.markdown-body h4:hover .anchor,
.markdown-body h5:hover .anchor,
.markdown-body h6:hover .anchor {
padding-left: 8px;
margin-left: -30px;
line-height: 1;
text-decoration: none;
}
.markdown-body h1:hover .anchor .octicon-link,
.markdown-body h2:hover .anchor .octicon-link,
.markdown-body h3:hover .anchor .octicon-link,
.markdown-body h4:hover .anchor .octicon-link,
.markdown-body h5:hover .anchor .octicon-link,
.markdown-body h6:hover .anchor .octicon-link {
display: inline-block;
}
.markdown-body h1 tt,
.markdown-body h1 code,
.markdown-body h2 tt,
.markdown-body h2 code,
.markdown-body h3 tt,
.markdown-body h3 code,
.markdown-body h4 tt,
.markdown-body h4 code,
.markdown-body h5 tt,
.markdown-body h5 code,
.markdown-body h6 tt,
.markdown-body h6 code {
font-size: inherit;
}
.markdown-body h1 {
padding-bottom: 0.3em;
font-size: 2.25em;
line-height: 1.2;
border-bottom: 1px solid #eee;
}
.markdown-body h2 {
padding-bottom: 0.3em;
font-size: 1.75em;
line-height: 1.225;
border-bottom: 1px solid #eee;
}
.markdown-body h3 {
font-size: 1.5em;
line-height: 1.43;
}
.markdown-body h4 {
font-size: 1.25em;
}
.markdown-body h5 {
font-size: 1em;
}
.markdown-body h6 {
font-size: 1em;
color: #777;
}
.markdown-body p,.markdown-body blockquote,
.markdown-body ul,.markdown-body ol,
.markdown-body dl,.markdown-body table,
.markdown-body pre {
margin-top: 0;
margin-bottom: 16px;
}
.markdown-body hr {
height: 4px;
padding: 0;
margin: 16px 0;
background-color: #e7e7e7;
border: 0 none;
}
.markdown-body ul,
.markdown-body ol {
padding-left: 2em;
}
.markdown-body ul.no-list,
.markdown-body ol.no-list {
padding: 0;
list-style-type: none;
}
.markdown-body ul ul,
.markdown-body ul ol,
.markdown-body ol ol,
.markdown-body ol ul {
margin-top: 0;
margin-bottom: 0;
}
.markdown-body li>p {
margin-top: 16px;
}
.markdown-body dl {
padding: 0;
}
.markdown-body dl dt {
padding: 0;
margin-top: 16px;
font-size: 1em;
font-style: italic;
font-weight: bold;
}
.markdown-body dl dd {
padding: 0 16px;
margin-bottom: 16px;
}
.markdown-body blockquote {
padding: 0 15px;
color: #777;
border-left: 4px solid #ddd;
}
.markdown-body blockquote>:first-child {
margin-top: 0;
}
.markdown-body blockquote>:last-child {
margin-bottom: 0;
}
.markdown-body table {
display: block;
width: 100%;
overflow: auto;
word-break: normal;
word-break: keep-all;
}
.markdown-body table th {
font-weight: bold;
}
.markdown-body table th,
.markdown-body table td {
padding: 6px 13px;
border: 1px solid #ddd;
}
.markdown-body table tr {
background-color: #fff;
border-top: 1px solid #ccc;
}
.markdown-body table tr:nth-child(2n) {
background-color: #f8f8f8;
}
.markdown-body img {
max-width: 100%;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
.markdown-body span.frame {
display: block;
overflow: hidden;
}
.markdown-body span.frame>span {
display: block;
float: left;
width: auto;
padding: 7px;
margin: 13px 0 0;
overflow: hidden;
border: 1px solid #ddd;
}
.markdown-body span.frame span img {
display: block;
float: left;
}
.markdown-body span.frame span span {
display: block;
padding: 5px 0 0;
clear: both;
color: #333;
}
.markdown-body span.align-center {
display: block;
overflow: hidden;
clear: both;
}
.markdown-body span.align-center>span {
display: block;
margin: 13px auto 0;
overflow: hidden;
text-align: center;
}
.markdown-body span.align-center span img {
margin: 0 auto;
text-align: center;
}
.markdown-body span.align-right {
display: block;
overflow: hidden;
clear: both;
}
.markdown-body span.align-right>span {
display: block;
margin: 13px 0 0;
overflow: hidden;
text-align: right;
}
.markdown-body span.align-right span img {
margin: 0;
text-align: right;
}
.markdown-body span.float-left {
display: block;
float: left;
margin-right: 13px;
overflow: hidden;
}
.markdown-body span.float-left span {
margin: 13px 0 0;
}
.markdown-body span.float-right {
display: block;
float: right;
margin-left: 13px;
overflow: hidden;
}
.markdown-body span.float-right>span {
display: block;
margin: 13px auto 0;
overflow: hidden;
text-align: right;
}
.markdown-body code,.markdown-body tt {
padding: 0;
padding-top: 0.2em;
padding-bottom: 0.2em;
margin: 0;
font-size: 85%;
background-color: rgba(0,0,0,0.04);
border-radius: 3px;
}
.markdown-body code:before,
.markdown-body code:after,
.markdown-body tt:before,
.markdown-body tt:after {
letter-spacing: -0.2em;
content: "\00a0";
}
.markdown-body code br,
.markdown-body tt br {
display: none;
}
.markdown-body del code {
text-decoration: inherit;
}
.markdown-body pre>code {
padding: 0;
margin: 0;
font-size: 100%;
word-break: normal;
white-space: pre;
background: transparent;
border: 0;
}
.markdown-body .highlight {
margin-bottom: 16px;
}
.markdown-body .highlight pre,
.markdown-body pre {
padding: 16px;
overflow: auto;
font-size: 85%;
line-height: 1.45;
background-color: #f7f7f7;
border-radius: 3px;
}
.markdown-body .highlight pre {
margin-bottom: 0;
word-break: normal;
}
.markdown-body pre {
word-wrap: normal;
}
.markdown-body pre code,
.markdown-body pre tt {
display: inline;
max-width: initial;
padding: 0;
margin: 0;
overflow: initial;
line-height: inherit;
word-wrap: normal;
background-color: transparent;
border: 0;
}
.markdown-body pre code:before,
.markdown-body pre code:after,
.markdown-body pre tt:before,
.markdown-body pre tt:after {
content: normal;
}
.highlight .pl-coc,
.highlight .pl-entl,
.highlight .pl-entm,
.highlight .pl-eoa,
.highlight .pl-mai .pl-sf,
.highlight .pl-mm,
.highlight .pl-pdv,
.highlight .pl-sc,
.highlight .pl-som,
.highlight .pl-sr,
.highlight .pl-v,
.highlight .pl-vpf {
color: #0086b3;
}
.highlight .pl-eoac,
.highlight .pl-mdht,
.highlight .pl-mi1,
.highlight .pl-mri,
.highlight .pl-va,
.highlight .pl-vpu {
color: #008080;
}
.highlight .pl-c,
.highlight .pl-pdc {
color: #b4b7b4;
font-style: italic;
}
.highlight .pl-k,
.highlight .pl-ko,
.highlight .pl-kolp,
.highlight .pl-mc,
.highlight .pl-mr,
.highlight .pl-ms,
.highlight .pl-s,
.highlight .pl-sok,
.highlight .pl-st {
color: #6e5494;
}
.highlight .pl-ef,
.highlight .pl-enf,
.highlight .pl-enm,
.highlight .pl-entc,
.highlight .pl-eoi,
.highlight .pl-sf,
.highlight .pl-smc {
color: #d12089;
}
.highlight .pl-ens,
.highlight .pl-eoai,
.highlight .pl-kos,
.highlight .pl-mh .pl-pdh,
.highlight .pl-mp,
.highlight .pl-pde,
.highlight .pl-stp {
color: #458;
}
.highlight .pl-enti {
color: #d12089;
font-weight: bold;
}
.highlight .pl-cce,
.highlight .pl-enc,
.highlight .pl-kou,
.highlight .pl-mq {
color: #f93;
}
.highlight .pl-mp1 .pl-sf {
color: #458;
font-weight: bold;
}
.highlight .pl-cos,
.highlight .pl-ent,
.highlight .pl-md,
.highlight .pl-mdhf,
.highlight .pl-ml,
.highlight .pl-pdc1,
.highlight .pl-pds,
.highlight .pl-s1,
.highlight .pl-scp,
.highlight .pl-sol {
color: #df5000;
}
.highlight .pl-c1,
.highlight .pl-cn,
.highlight .pl-pse,
.highlight .pl-pse .pl-s2,
.highlight .pl-vi {
color: #a31515;
}
.highlight .pl-mb,
.highlight .pl-pdb {
color: #df5000;
font-weight: bold;
}
.highlight .pl-mi,
.highlight .pl-pdi {
color: #6e5494;
font-style: italic;
}
.highlight .pl-ms1 {
background-color: #f5f5f5;
}
.highlight .pl-mdh,
.highlight .pl-mdi {
font-weight: bold;
}
.highlight .pl-mdr {
color: #0086b3;
font-weight: bold;
}
.highlight .pl-s2 {
color: #333;
}
.highlight .pl-ii {
background-color: #df5000;
color: #fff;
}
.highlight .pl-ib {
background-color: #f93;
}
.highlight .pl-id {
background-color: #a31515;
color: #fff;
}
.highlight .pl-iu {
background-color: #b4b7b4;
}
.highlight .pl-mo {
color: #969896;
}
</style>
<script type="text/javascript">
function getDocumentScrollTop()
{
var res = document.body.scrollTop || document.documentElement.scrollTop || window.pageYOffset || 0;
// alert(res);
return res;
}
function setDocumentScrollTop(ypos)
{
window.scrollTo(0, ypos);
}
</script>
</head>
<body class="markdown-body">
<h1> <a id="developer-guide" class="anchor" href="#developer-guide" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>Developer guide</h1>
<p>Thank you for your interest in developing wetb. This guide details how to contribute to wetb in a way that is efficient for everyone.</p>
<h2> <a id="contents" class="anchor" href="#contents" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>Contents</h2>
<ul>
<li><a href="#Fork-project">Fork</a></li>
<li><a href="#Requirements">Requirements</a></li>
<li><a href="#Install-Python">Install Python</a></li>
<li><a href="#Install-dependencies">Install dependencies</a></li>
<li><a href="#Get-wetb">Get wetb</a></li>
<li> <a href="#Install-wetb">Install wetb</a> </li>
<li><a href="#Contributions">Contributions</a></li>
<li><a href="#Upload-contributions">Upload contributions</a></li>
<li><a href="#Make-and-upload-wheels">Make and upload wheels</a></li>
</ul>
<h2> <a id="fork-project" class="anchor" href="#fork-project" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>Fork project</h2>
<p>We prefer that you make your contributions in your own fork of the project, <a href="#Contributions">make your changes</a> and <a href="#Upload%20contributions">make a merge request</a>.</p>
<p>The project can be forked to your own user account via the &lt;Fork&gt; button on the <a href="https://gitlab.windenergy.dtu.dk/toolbox/WindEnergyToolbox">frontpage</a></p>
<h2> <a id="requirements" class="anchor" href="#requirements" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>Requirements</h2>
<h3> <a id="command-line" class="anchor" href="#command-line" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>Command line</h3>
<p>This guide will use the command line (aka command prompt) frequently. You can launch a Windows terminal as follows: press Start&gt; and type &quot;cmd&quot; + &lt;Enter&gt;. A link to the command prompt should be visible now.</p>
<p>In case you want an alternative, more capable windows terminal, you could consider using <a href="https://conemu.github.io/">ConEmu</a> (this is optional).</p>
<blockquote>
<p>ConEmu-Maximus5 is a Windows console emulator with tabs, which presents multiple consoles and simple GUI applications as one customizable GUI window with various features.</p>
</blockquote>
<h3> <a id="git" class="anchor" href="#git" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>Git</h3>
<ul>
<li><p>Download and install Git version control system for Windows 64-bit <a href="https://git-scm.com/download/win">here</a>. Only select the Windows Portable option if you know what you are doing or if you do not have administrative rights on your computer.</p></li>
<li><p>Git comes with a simple GUI, but there are more and different options available if you are not happy with it, see <a href="https://git-scm.com/downloads/guis">here</a>.</p></li>
<li><p>On windows we highly recommend <a href="https://tortoisegit.org/">tortoisegit</a>. It is a gui integrated into the windows explorer. </p></li>
</ul>
<h2> <a id="install-python" class="anchor" href="#install-python" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>Install Python</h2>
<p>For all platforms we recommend that you download and install the Anaconda - a professional grade, full blown scientific Python distribution. </p>
<h3> <a id="installing-anaconda-activate-root-environment" class="anchor" href="#installing-anaconda-activate-root-environment" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>Installing Anaconda, activate root environment</h3>
<ul>
<li>Download and install Anaconda (Python 3.5 version, 64 bit installer is recommended) from <a href="https://www.continuum.io/downloads">https://www.continuum.io/downloads</a> </li>
</ul>
<blockquote>
<p>Note: The Python 2.7 or Python 3.5 choice of Anaconda only affects the root environment. You can always create additional environments using other Python versions, see below.</p>
</blockquote>
<ul>
<li>Update the root Anaconda environment (type in a terminal):</li>
</ul>
<pre><code>&gt;&gt; conda update --all
</code></pre>
<ul>
<li>Activate the Anaconda root environment in a terminal as follows:</li>
</ul>
<pre><code>&gt;&gt; activate
</code></pre>
<p>and your terminal will do something like:</p>
<pre><code>C:\Users\&gt; activate
[Anaconda3] C:\Users\&gt;
</code></pre>
<p>note that the name of the environment is now a prefix before the current path.</p>
<p>use <code>deactivate</code> to deactivate the environment.</p>
<h3> <a id="optionally-create-other-independent-anaconda-environments" class="anchor" href="#optionally-create-other-independent-anaconda-environments" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>Optionally, create other independent Anaconda environments</h3>
<ul>
<li>By using environments you can manage different Python installations with different versions on your system. Creating environments is as easy as:</li>
</ul>
<pre><code>&gt;&gt; conda create -n py27 python=2.7
&gt;&gt; conda create -n py34 python=3.4
&gt;&gt; conda create -n py35 python=3.5
</code></pre>
<ul>
<li>These environments can be activated as follows:</li>
</ul>
<pre><code>&gt;&gt; activate py27
&gt;&gt; activate py34
&gt;&gt; activate py35
</code></pre>
<p>The Python distribution in use will now be located in e.g. &lt;path_to_anaconda&gt;/env/py35/</p>
<p>use <code>deactivate</code> to deactivate the environment.</p>
<h2> <a id="install-dependencies" class="anchor" href="#install-dependencies" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>Install dependencies</h2>
<p>Install the necessary Python dependencies using the conda package manager:</p>
<pre><code>&gt;&gt; conda install setuptools_scm future h5py pytables pytest nose sphinx
&gt;&gt; conda install scipy pandas matplotlib cython xlrd coverage xlwt openpyxl psutil
&gt;&gt; conda install -c https://conda.anaconda.org/conda-forge pyscaffold pytest-cov
</code></pre>
<h2> <a id="get-wetb" class="anchor" href="#get-wetb" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>Get wetb</h2>
<p>Copy the https - link on the front page of your fork of wetb</p>
<pre><code>&gt;&gt; git clone &lt;https-link&gt;
</code></pre>
<p>or via tortoise-git:</p>
<ul>
<li>Right-click in your working folder</li>
<li>&quot;Git Clone...&quot;</li>
<li>&lt;Ok&gt;</li>
</ul>
<h2> <a id="install-wetb" class="anchor" href="#install-wetb" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>Install wetb</h2>
<pre><code>&gt;&gt; cd WindEnergyToolbox
&gt;&gt; pip install -e . --no-deps
</code></pre>
<h2> <a id="contributions" class="anchor" href="#contributions" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>Contributions</h2>
<p>If you make a change in the toolbox, that others can benefit from please make a merge request.</p>
<p>If you can, please submit a merge request with the fix or improvements including tests. </p>
<p>The workflow to make a merge request is as follows:</p>
<ul>
<li>Create a feature branch, branch away from master</li>
<li>Write tests and code</li>
<li>Push the commit(s) to your fork</li>
<li>Submit a merge request (MR) to the master branch of </li>
<li>Link any relevant issues in the merge request description and leave a comment on them with a link back to the MR</li>
<li>Your tests should run as fast as possible, and if it uses test files, these files should be as small as possible.</li>
<li>Please keep the change in a single MR as small as possible. Split the functionality if you can</li>
</ul>
<h2> <a id="upload-contributions" class="anchor" href="#upload-contributions" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>Upload contributions</h2>
<p>To be written</p>
<h2> <a id="make-and-upload-wheels" class="anchor" href="#make-and-upload-wheels" aria-hidden="true"><span aria-hidden="true" class="octicon octicon-link"></span></a>Make and upload wheels</h2>
<pre><code>&gt;&gt; conda install --channel https://conda.anaconda.org/pbrod twine
</code></pre>
<ul>
<li>Make tag</li>
<li>pip install -e . --upgrade</li>
<li>python setup.py bdist_wheel -d dist</li>
<li>twine upload dist*</li>
</ul>
</body>
</html>
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment