Skip to content

Latest commit

 

History

History
155 lines (117 loc) · 6.48 KB

dev.md

File metadata and controls

155 lines (117 loc) · 6.48 KB

Contributing to the YunoHost core

You wish to add a new feature in the YunoHost core, but don't know how to proceed? This guide takes you through the various steps of the development and contribution process.

If you're looking for stuff to implement or fix, the bug-tracker is here !

Come say hi to us in the dev chatroom ! If you don't have an XMPP client, you can join using the widget at the bottom right of this page.

Setting up a development environment

  • Use ynh-dev (see the README) to setup a development environment - locally in a virtual machine, or on a VPS. This will setup a working YunoHost instance, using directly the git repositories (with symlinks). That way, you will be able to edit files, test your changes in real time, commit stuff and push/pull directly from your development environment.

  • Implement and test your feature. Depending on what you want to develop, you will want to :

    • Python/CLI core : work in /vagrant/yunohost/
    • Web administration interface : work in /vagrant/yunohost-admin/
    • You can also work on the other projects on which YunoHost is built (SSOwat, moulinette) in similar ways

Working on the YunoHost Python/CLI core

  • Work in /vagrant/yunohost/.

  • Run /vagrant/ynh-dev use-git yunohost.

  • The actionsmap file (data/actionsmap/yunohost.yml) defines the various categories, actions and arguments of the yunohost CLI. Define how you want users to use your feature, and add/edit the corresponding categories, actions and arguments. For example in yunohost domain add some.domain.tld, the category is domain, the action is add, and some.domain.tld is an argument.

  • Moulinette will automatically map commands in the actionsmap to python functions (and their arguments) located in src/yunohost/. For example, typing yunohost domain add some.domain.tld will call the function domain_add(domainName) in domain.py, with the argument domainName equal to "some.domain.tld".

Helpers / coding style
  • To handle exceptions, you should raise some MoulinetteError()

  • To help with internationalizing the messages, use m18n.n('some-message-id') and put your string in locales/en.json. You can also put arguments and use them in the string with {{some-argument:s}}. Don't edit other locales files, this will be done using weblate !

  • YunoHost tries to follow the pep8 coding style. Tools exist to automatically check conformity.

  • Name of "private" functions should start with a _

Don't forget
  • (Might not be necessary anymore) Each time you edit the actionsmap, you should force the refresh of the cache with rm /var/cache/moulinette/actionsmap/yunohost.pkl

Working on the YunoHost web administration interface

  • Work in /vagrant/yunohost-admin/src/.

  • Run /vagrant/ynh-dev use-git yunohost-admin. It launches gulp, such as each time you modify sources, it recompiles the code and you can use it by refreshing (Ctrl+F5) your web administration. To stop the command, just do Ctrl+C.

  • The web interface uses the API to interact with YunoHost. The API commands/requests are also defined via the actionsmap. For instance, accessing the page https://domain.tld/yunohost/api/users corresponds to a GET /users requests on the YunoHost API. It is mapped to the function user_list(). Accessing the URL should display the json returned by this function. 'GET' requests are typically meant to ask information to the server. 'POST' requests are meant to ask the server to edit/change some information, or to execute some actions.

  • js/yunohost/controllers contains the javascript parts, and define which requests to make to the API when loading a specific page of the interface, and how to process the data to generate the page, using templates.

  • views contains the various templates for the pages of the interface. In the template, data coming from the javascript part can be used with the syntax {{some-variable}}, which will be replaced when building/accessing the page. It is also possible to have conditions using the handlebars.js syntax : {{#if some-variable}}<p>Some conditional HTML code here !</p>{{/if}}

  • For internationalized strings, use y18n.t('some-string-code') in the javascript, or {{t 'some-string-code'}} in the HTML template, and put your string in locales/en.json. Don't edit other locales files, this will be done using weblate !

Don't forget
  • Each time you edit the actionsmap, you should restart the yunohost-api : service yunohost-api restart (You'll need to retype your admin password in the web interface)

  • You might need to force-clear the cache of your browser sometimes to refresh the javascript and/or html (so each time you edit something in js or views).

Your feature is ready and you want it to be integrated in YunoHost

  • Fork the relevant repo on Github, and commit stuff to a new branch. We recommend to name the branch with the following convention :

    • For an enhancement or new feature : enh-REDMINETICKET-name-of-feature
    • For a bugfix fix-REDMINETICKET-description-of-fix
    • REDMINETICKET is optional and is the id of a corresponding ticket on RedMine.
  • Once you're ready, open a Pull Request (PR) on Github. Please include [fix] or [enh] at the beginning of the title of your PR.

  • After reviewing, testing and validation by other contributors, your branch should be merged in testing (?) !

<script type="text/javascript" src="/jappix/javascripts/mini.min.js"></script> <script type="text/javascript"> // Jappix mini chat $(".actions").css('opacity', 0); jQuery.ajaxSetup({cache: false}); var ADS_ENABLE = 'off'; var JAPPIX_STATIC = '/jappix/'; var HOST_BOSH = 'https://im.yunohost.org/http-bind/'; var ANONYMOUS = 'on'; JappixMini.launch({ connection: { domain: "anonymous.yunohost.org", }, application: { network: { autoconnect: false, }, interface: { showpane: false, animate: false, }, groupchat: { open: ['[email protected]'], suggest: ['[email protected]'] } }, }); </script>