Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • master
  • dev
  • appimage
  • fix_gitlab
  • fixappveyor
  • gitlab
  • fix_ci
  • fix_dbus_error
  • fix_ci_osx
  • sakia020
  • fix_travis#1105
  • feature/backend
  • check_uniq_node_by_endpoints
  • qt5.7
  • feature/agent_architecture
  • translations
  • pyqt5.6
  • qtwebengine
  • pyinstaller
  • landscape
  • 0.1.0
  • 0.10.0
  • 0.10.1
  • 0.10.2
  • 0.11.0
  • 0.11.1
  • 0.11.2
  • 0.11.3
  • 0.11.4
  • 0.11.4.post1
  • 0.11.5
  • 0.12.0
  • 0.12.1dev1
  • 0.12.1dev2
  • 0.12.1dev3
  • 0.12.1dev4
  • 0.12.dev1
  • 0.12.dev2
  • 0.12.dev3
  • 0.12.dev4
  • 0.12.dev5
  • 0.12rc1
  • 0.2.0
  • 0.2.1
  • 0.20.0
  • 0.20.0dev1
  • 0.20.0dev10
  • 0.20.0dev12
  • 0.20.0dev13
  • 0.20.0dev14
  • 0.20.0dev15
  • 0.20.0dev16
  • 0.20.0dev2
  • 0.20.0dev3
  • 0.20.0dev3-test1
  • 0.20.0dev4
  • 0.20.0dev5
  • 0.20.0dev6
  • 0.20.0dev7
  • 0.20.0dev8
  • 0.20.0dev9
  • 0.20.1
  • 0.20.10
  • 0.20.11
  • 0.20.13
  • 0.20.2
  • 0.20.3
  • 0.20.4
  • 0.20.5
  • 0.20.6
  • 0.20.7
  • 0.20.8
  • 0.20.9
  • 0.3.0
  • 0.30.0
  • 0.30.0beta
  • 0.30.0beta1
  • 0.30.0beta2
  • 0.30.0beta3
  • 0.30.0beta4
  • 0.30.0beta5
  • 0.30.0beta6
  • 0.30.0beta7
  • 0.30.0beta8
  • 0.30.0beta9
  • 0.30.1
  • 0.30.10
  • 0.30.11
  • 0.30.12
  • 0.30.13
  • 0.30.14
  • 0.30.2
  • 0.30.3
  • 0.30.4
  • 0.30.5
  • 0.30.6
  • 0.30.7
  • 0.30.8
  • 0.30.9
  • 0.31.0
  • 0.31.0.post1
  • 0.31.1
  • 0.31.2
  • 0.31.3
  • 0.31.4
  • 0.31.5
  • 0.31.6
  • 0.32.0
  • 0.32.0-linux
  • 0.32.0RC1
  • 0.32.0RC2
  • 0.32.0RC3
  • 0.32.0RC4
  • 0.32.0RC5
  • 0.32.0RC6
  • 0.32.1
  • 0.32.10
  • 0.32.10post1
  • 0.32.2
  • 0.32.3
120 results

Target

Select target project
No results found
Select Git revision
  • dev
  • master
  • fix_gitlab
  • fixappveyor
  • gitlab
  • fix_ci
  • fix_dbus_error
  • fix_ci_osx
  • sakia020
  • fix_travis#1105
  • feature/backend
  • check_uniq_node_by_endpoints
  • qt5.7
  • feature/agent_architecture
  • translations
  • pyqt5.6
  • qtwebengine
  • pyinstaller
  • landscape
  • 0.1.0
  • 0.10.0
  • 0.10.1
  • 0.10.2
  • 0.11.0
  • 0.11.1
  • 0.11.2
  • 0.11.3
  • 0.11.4
  • 0.11.4.post1
  • 0.11.5
  • 0.12.0
  • 0.12.1dev1
  • 0.12.1dev2
  • 0.12.1dev3
  • 0.12.1dev4
  • 0.12.dev1
  • 0.12.dev2
  • 0.12.dev3
  • 0.12.dev4
  • 0.12.dev5
  • 0.12rc1
  • 0.2.0
  • 0.2.1
  • 0.20.0
  • 0.20.0dev1
  • 0.20.0dev10
  • 0.20.0dev12
  • 0.20.0dev13
  • 0.20.0dev14
  • 0.20.0dev15
  • 0.20.0dev16
  • 0.20.0dev2
  • 0.20.0dev3
  • 0.20.0dev3-test1
  • 0.20.0dev4
  • 0.20.0dev5
  • 0.20.0dev6
  • 0.20.0dev7
  • 0.20.0dev8
  • 0.20.0dev9
  • 0.20.1
  • 0.20.10
  • 0.20.11
  • 0.20.13
  • 0.20.2
  • 0.20.3
  • 0.20.4
  • 0.20.5
  • 0.20.6
  • 0.20.7
  • 0.20.8
  • 0.20.9
  • 0.3.0
  • 0.30.0
  • 0.30.0beta
  • 0.30.0beta1
  • 0.30.0beta2
  • 0.30.0beta3
  • 0.30.0beta4
  • 0.30.0beta5
  • 0.30.0beta6
  • 0.30.0beta7
  • 0.30.0beta8
  • 0.30.0beta9
  • 0.30.1
  • 0.30.10
  • 0.30.11
  • 0.30.12
  • 0.30.13
  • 0.30.14
  • 0.30.2
  • 0.30.3
  • 0.30.4
  • 0.30.5
  • 0.30.6
  • 0.30.7
  • 0.30.8
  • 0.30.9
  • 0.31.0
  • 0.31.0.post1
  • 0.31.1
  • 0.31.2
  • 0.31.3
  • 0.31.4
  • 0.31.5
  • 0.31.6
  • 0.32.0
  • 0.32.0-linux
  • 0.32.0RC1
  • 0.32.0RC2
  • 0.32.0RC3
  • 0.32.0RC4
  • 0.32.0RC5
  • 0.32.0RC6
  • 0.32.1
  • 0.32.10
  • 0.32.10post1
  • 0.32.2
  • 0.32.3
119 results
Show changes

Commits on Source 1072

972 additional commits have been omitted to prevent performance issues.
468 files
+ 48491
37143
Compare changes
  • Side-by-side
  • Inline

Files

+9 −0
Original line number Diff line number Diff line
@@ -41,8 +41,17 @@ nosetests.xml
src/sakia/gen_resources/*
src/icons_rc.py
src/i18n_rc.py
src/sakia/icons_rc.py
src/sakia/i18n_rc.py
res/i18n/qm
res/i18n/lang-*
out
.directory
temp
*_uic.py

# mypy
.mypy_cache

# pyenv
/.python-version

.gitlab-ci.yml

0 → 100644
+106 −0
Original line number Diff line number Diff line
stages:
  - format
  - tests
  - build
  - release

image: registry.duniter.org/docker/python3/sakia-builder:1.2.0

# SUB-TASKS
.push_to_github:
  tags:
    - github
  after_script:
    # remove all files in current repo
    - rm -rf ./*
    - rm -rf .git*
    # do a mirror clone in current repo
    - git clone --mirror $CI_REPOSITORY_URL .
    # do config for github push
    - git remote add github $GITHUB_URL_AND_KEY
    - git config --global user.email "contact@duniter.org"
    - git config --global user.name "Duniter"
    # remove refs about merge requests
    - bash -c "cat packed-refs | grep -v 'refs/merge-requests' > packed-refs-new; echo 'Removed merge-requests refs.'"
    - mv packed-refs-new packed-refs
    # github push
    - bash -c "git push --force --mirror github 2>&1 | grep -v duniter-gitlab; echo $?"

.changes:
  only:
    changes:
      - src/sakia/*
      - .gitlab-ci.yml
      - Makefile
      - requirements_dev.txt
      - requirements_deploy.txt
      - requirements.txt
      - setup.py
      - tests/**/*.py

# TASKS
format:
  extends:
    - .changes
  stage: format
  script:
    - pip install -r requirements_dev.txt
    - make check-format

tests:
  extends:
    - .changes
  stage: tests
  script:
    - pip install -r requirements.txt
    - pip install -r requirements_dev.txt
    - /start.sh # start xvfb
    - make tests

build:
  extends:
    - .changes
  stage: build
  script:
    - pip install -r requirements.txt
    - pip install -r requirements_deploy.txt
    - make build

release_appimage:
  extends:
    - .changes
  stage: release
  when: manual
  script:
    - pip install -r requirements.txt
    - pip install -r requirements_deploy.txt
    - make build
    - make appimage
  artifacts:
    paths:
      - ci/appimage/Sakia_x86_64.AppImage
#  only:
#    - master

release_pypi:
  extends:
    - .push_to_github
  stage: release
  when: manual
  script:
    - pip install -r requirements.txt
    - pip install -r requirements_deploy.txt
    - make build
    - make deploy PYPI_LOGIN=${PYPI_LOGIN} PYPI_PASSWORD=${PYPI_PASSWORD}
  only:
    - master

release_pypi_test:
  stage: release
  when: manual
  only: [tags, dev]
  script:
    - pip install -r requirements.txt
    - pip install -r requirements_deploy.txt
    - make build
    - make deploy_test PYPI_TEST_LOGIN=${PYPI_TEST_LOGIN} PYPI_TEST_PASSWORD=${PYPI_TEST_PASSWORD}
+6 −0
Original line number Diff line number Diff line
requirements:
    - requirements.txt
python-targets:
    - 3
ignore-paths:
  - lib
  - build
  - res
  - ci
  - doc
+23 −9
Original line number Diff line number Diff line
@@ -6,9 +6,11 @@ matrix:
      sudo: required
  exclude:
    - os: linux
  allow_failures:
    - os: osx

env:
- PYENV_PYTHON_VERSION=3.5.0
- PYENV_PYTHON_VERSION=3.5.4

before_install:
- ci/travis/before_install.sh
@@ -18,14 +20,26 @@ script:
- ci/travis/test.sh
after_success:
- ci/travis/after_success.sh
before_deploy:
- ci/travis/before_deploy.sh

deploy:
  provider: releases
  - provider: releases
    api_key:
      secure: MUdvTDBeCxO9d/EpzIhr+QYra/KxgYkXX6177SjqWCWDqw9xB3fwSUj8I9ht9DGtwVdadtveumtvLw3pbtVIR0GtIPC9pyvtNz4j6T4Ei3TSE6+StXdMK4NnInvPeTRlobGL+9sZt9MwheJwZ8YGewhBcR0F5UzVfxWeSSrxmyk=
    file:
      - sakia-${TRAVIS_OS_NAME}.zip
    skip_cleanup: true
    on:
      tags: true
      condition: ${TRAVIS_OS_NAME} = osx
  - provider: releases
    api_key:
      secure: MUdvTDBeCxO9d/EpzIhr+QYra/KxgYkXX6177SjqWCWDqw9xB3fwSUj8I9ht9DGtwVdadtveumtvLw3pbtVIR0GtIPC9pyvtNz4j6T4Ei3TSE6+StXdMK4NnInvPeTRlobGL+9sZt9MwheJwZ8YGewhBcR0F5UzVfxWeSSrxmyk=
  file: sakia-${TRAVIS_OS_NAME}.zip
    file:
      - sakia-${TRAVIS_OS_NAME}.deb
      - sakia-${TRAVIS_OS_NAME}.zip
      - sakia-${TRAVIS_TAG}-py3-none-any.whl
    skip_cleanup: true
    on:
      tags: true
      condition: ${TRAVIS_OS_NAME} = linux

CHANGELOG.md

0 → 100644
+118 −0
Original line number Diff line number Diff line
## v0.53.2 (18/01/2021)

This is the last version released by Vit.
No more new version or maintenance will be done.
Thanks to Inso for this wonderful project, and to every enthusiast users.

### Bugs
* #809 fix About Sakia available release search code and obsolete link to Github in exception
* #813 remove obsolete github references in README.md
* #815 remove unused dependency asynctest from requirements.txt
* fix "make tests" command running test scripts from AppDir in ci/appimage

## v0.53.1 (1/11/2020)
### Bugs
* #811 Fix WoT window is blank when clicking Explore until the menu "Show in WoT" is used.
  Button is removed.
* #793 Fix crash `RuntimeError: no running event loop` when running on Python 3.8
### CI/CD
* #817 Add AppImage to release with automatic compilation in CD

## v0.53.0 (25/09/2020)
### Features
* #816 Add root_servers.yml in $HOME/.config/sakia folder to configure your own root servers

## v0.52.0 (23/04/2020)
### Features
* #807 Add new "Percentage of Average" referential
* Transfer window now use current referential instead of only relative by UD
* Add current referential units on the balance display
### Bugs
* Fix referentials french translation
* Fix network "Open in browser" menu

## v0.51.1 (05/04/2020)
### Bugs
* #802 Fix "Send as source" context menu not appear in Expert Mode on normal received transactions
* Update incomplete french translation

## v0.51.0 (03/04/2020)
### Features
* #798 - Complete workflow to send transaction that we can get back after one week:
    * A selector allow to choose the lock condition of the output transaction
    * Then, the transaction with special lock condition appears with an underline in the transaction history
    * If you are the receiver, you can use the context menu action "Send as source" to send it to yourself
    before the issuer get it back
    * If you are the issuer, use the context menu action "Send as source" to send it to yourself after the delay
    * Before the delay, you can check the lock condition in the transfer window to see the date when the transaction will be unlocked
    * In Expert Mode (see Preferences), you can use any incoming transaction or dividend as source for your transfer

### Enhancement
* Add a legend for colors, italic and underlined display of transactions under transaction history
* Upgrade dependencies to duniterpy 0.57.0

### Bugs
* Fix gen_translations.py running Qt4 lrelease in Makefile
* Fix error parsing some WSP2 Head message because software version had a prefix (duniterpy fix)

### CI/CD
* Remove obsolete runner tag
* Release job only on `master`, release_test job only on `dev` or `tags`

## v0.50.5 (21/03/2020)
### Bugs
* Fix send money to pubkey with search user selected

### Tests
* Update and fix pytest suite
* Update duniter-mirage dependency version

### Enhancements
* Tx history update button set to disable until update is done
* Increase delay between network crawlings to 1 mn

### CI/CD
* Add format and tests stage in .gitlab-ci.yml

## v0.50.4 (18/03/2020)
### Code
* Fix session closed error (regression in v0.50.3)

## v0.50.3 (16/03/2020)
### Code
* Fix exception when refresh tx history
* Fix Unclosed client session error (at last !)
### CI/CD
* Fix bug with setuptools 28.8.x version in gitlab CI/CD image

## v0.50.2 (10/03/2020)
### Code
* Add system libs requirement and command line options in README.md
* Fix bad label "ok" on startup message box and enhance it
* Propose new sakia account menu at first start instead of create a new member account on the network
* Only display licence step when registering a new member account on the network
* Update french translation
### Project
* Fix release.sh using simple quote on sakia.__init__ version
* Add this changelog

## v0.50.1 (08/03/2020)
### Code
* Use asyncio.ensure_future() instead of async() which disappear from Py 3.7
* Include the license file into the wheel distributed, the license changed name
### CI/CD
* Fix sources path and allow all file extensions to trigger the CI
### Build
* Add dist check after build in Makefile
### Project
* Fix release.sh broken by black format

## [v0.50.0](https://git.duniter.org/clients/python/sakia/-/milestones/15) (07/03/2020)
### Code
* Update DuniterPy dependency to 0.56.0
* Fix all detected bugs
* Add the Sakia icon in toolbar
* Remove search direct connections
* Add update button in tx history
* Fix translation system
* Update french translation

Makefile

0 → 100644
+56 −0
Original line number Diff line number Diff line
.PHONY: docs tests check check-format mypy pylint format build deploy deploy_test
.SILENT: deploy deploy_test # do not echo commands with password

# bash required to use source command
SHELL := /bin/bash

# run tests
tests:
	python3 gen_resources.py
	python3 gen_translations.py
	pytest -q -s --disable-warnings tests ${TESTS_FILTER}

# check
check: mypy pylint check-format

# check static typing
mypy:
	python3 -m mypy src --ignore-missing-imports
	python3 -m mypy tests --ignore-missing-imports

# check code errors
pylint:
	pylint --disable=C,R0902,R0903,R0904,R0912,R0913,R0914,R0915,W0613 --enable=C0121,C0202,C0321 --jobs=0 src/sakia/
	pylint --disable=C,R0902,R0903,R0904,R0912,R0913,R0914,R0915,W0613 --enable=C0121,C0202,C0321 --jobs=0 tests/

# check format
check-format:
	black --check src
	black --check tests

# format code
format:
	black src
	black tests

# build a wheel package in build folder and put it in dist folder
build:
	if [ -d "./build" ]; then rm -r build/*; fi
	if [ -d "./dist" ]; then rm -r dist/*; fi
	python3 gen_resources.py
	python3 gen_translations.py
	python3 setup.py sdist bdist_wheel
	twine check dist/*

appimage:
	cd ci/appimage && wget -qc https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage && chmod u+x linuxdeploy-x86_64.AppImage
	cd ci/appimage && wget -qc https://github.com/niess/linuxdeploy-plugin-python/releases/download/continuous/linuxdeploy-plugin-python-x86_64.AppImage && chmod u+x linuxdeploy-plugin-python-x86_64.AppImage
	cd ci/appimage && source config.env && ./build.sh

# upload on PyPi repository
deploy:
	twine upload dist/* --username ${PYPI_LOGIN} --password ${PYPI_PASSWORD}

# upload on PyPi test repository
deploy_test:
	twine upload dist/* --username ${PYPI_TEST_LOGIN} --password ${PYPI_TEST_PASSWORD} --repository-url https://test.pypi.org/legacy/
+129 −33
Original line number Diff line number Diff line
<!-- Landscape | [![Code Health](https://landscape.io/github/ucoin-io/sakia/dev/landscape.svg?style=flat)](https://landscape.io/github/ucoin-io/sakia/dev) -->
![sakia logo](https://git.duniter.org/clients/python/sakia/-/raw/master/sakia.png)

![sakia logo](https://raw.github.com/ucoin-io/sakia/master/sakia.png)
This project is not maintained anymore since 18/01/2021.
No more new version or maintenance will be done.

Sakia [![Coverage Status](https://coveralls.io/repos/ucoin-io/sakia/badge.svg?branch=dev)](https://coveralls.io/r/ucoin-io/sakia) [![Build Status](https://travis-ci.org/ucoin-io/sakia.svg?branch=travis)](https://travis-ci.org/ucoin-io/sakia) [![Build status](https://ci.appveyor.com/api/projects/status/nd7idaoi6s2fpsqy/branch/dev)](https://ci.appveyor.com/project/Insoleet/sakia/branch/dev) [![Translation status](http://weblate.ucoin.io/widgets/sakia/-/svg-badge.svg)](http://weblate.ucoin.io/engage/sakia/?utm_source=widget)
========
Vit thanks Inso for this wonderful project, and every enthusiast users.

Python3 and PyQt5 Client for [uCoin](http://www.ucoin.io) project.
# Sakia
 [![coverage report](https://git.duniter.org/clients/python/sakia/badges/gitlab/coverage.svg)](https://git.duniter.org/clients/python/sakia/commits/gitlab)
 [![pipeline status](https://git.duniter.org/clients/python/sakia/badges/gitlab/pipeline.svg)](https://git.duniter.org/clients/python/sakia/commits/gitlab)
 [![Build Status](https://travis-ci.org/duniter/sakia.svg?branch=travis)](https://travis-ci.org/duniter/sakia)
 [![Build status](https://ci.appveyor.com/api/projects/status/pvl18xon8pvu2c8w/branch/dev?svg=true)](https://ci.appveyor.com/project/Insoleet/sakia-bee4m/branch/dev)

Python3 and PyQt5 Client for [duniter](http://www.duniter.org) project.

## Goal features
  * Ucoin account management via wallets and communities
  * Multi-currency
  * Multi-community
  * Multi-wallets
  * Contacts management
  * User-friendly money transfer
  * Community membership management

## Current state
### Done (master branch)
### Features
  * Accounts management
  * Communities viewing
  * Money Transfer
  * cx_freeze deployment
  * Wallets management
  * Contacts management
  * Joining a community, publishing keys
@@ -30,26 +24,128 @@ Python3 and PyQt5 Client for [uCoin](http://www.ucoin.io) project.

### Dependencies
  * Dependencies :
   * [python3](https://www.python.org/downloads/)
   * [cx_freeze for python 3](http://cx-freeze.sourceforge.net/)
   * [pyqt5](http://www.riverbankcomputing.co.uk/software/pyqt/download5)
   * Qt5
   * [python 3.6+](https://www.python.org/downloads/)
   * [libsodium](http://doc.libsodium.org/installation/README.html)
  * Python libraries dependencies :
   * __ucoinpy__

  * General tips : use pyenv to build sakia, as described in the [wiki](https://github.com/ucoin-io/sakia/wiki/Cutecoin-install-for-developpers)
General tips : use [pyenv](https://github.com/pyenv/pyenv) to build sakia, as described in the [documentation](https://git.duniter.org/clients/python/sakia/-/blob/master/doc/install_for_developers.md)

Building Python with pyenv requires libraries of `openssl` and `sqlite3`. On Ubuntu, install it using the following commands : 


### Build scripts
  * Run __python3 gen_resources.py__ in sakia folder
  * Run __python3 gen_translations.py__ in sakia folder
  * Run __python3 setup.py build__ in sakia folder
  * The executable is generated in "build" folder, named "sakia"
    apt-get update
    apt-get install libssl-dev
    apt-get install libsqlite3-dev


### Install with pip
  * Run `pip install sakia`
  * start "sakia" :)
 
### Download latest release
  * Go to [current release](https://github.com/ucoin-io/sakia/releases)
  * Download corresponding package to your operating system
  * Unzip and start "sakia" :)
  * Join our beta community by contacting us on [uCoin forum](http://forum.ucoin.io/)
  * Go to [current release](https://git.duniter.org/clients/python/sakia/-/releases)
  * Download AppImage for linux x86_64. Run it !
  * Join our developer community by contacting us on [duniter forum](http://forum.duniter.org/)

## Command line options

`-d` to display log to debug

`--currency g1-test` to connect to the g1-test currency network.

## Development
* When writing docstrings, use the reStructuredText format recommended by [PEP 0287](https://www.python.org/dev/peps/pep-0287/#docstring-significant-features)
* Use make commands to check the code and the format it correct.

The development tools require Python 3.6.x or higher.

* Install a supported Python version with [pyenv](https://github.com/pyenv/pyenv)

        curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash

* Create a virtualenv in the project folder:
    
        python -m venv .venv

* Install dependencies

        pip install -r requirements.txt

* Run Sakia from the source code

        PYTHONPATH="`pwd`/src/." python src/sakia/main.py

* Before submiting a merge requests, please check the static typing and tests.

* Install dev dependencies

        pip install -r requirements_dev.txt


* Check static typing with [mypy](http://mypy-lang.org/)

        make check

* Run all unit tests (pytest module) with:

        make tests

> **Warning:** *do not run tests with sakia installed in your dev environment, because pytest will use the installed Sakia.*

* Run only some unit tests by passing a special ENV variable:

        make tests TESTS_FILTER=tests/functional/test_transfer_dialog.py::test_transfer

## Packaging and deploy
### PyPi
In the development pyenv environment, install the tools to build and deploy

    pip install --upgrade -r requirements_deploy.txt

Change and commit and tag the new version number (semantic version number)
    
    ./release.sh 0.x.y

Build the PyPi package in the `dist` folder
    
    make build

Deploy the package to PyPi test repository (prefix the command with a space in order for the shell not to save in its history system the command containing the password)

    [SPACE]make deploy_test PYPI_TEST_LOGIN=xxxx PYPI_TEST_PASSWORD=xxxx

Install the package from PyPi test repository

    pip install --index-url https://test.pypi.org/simple/ --extra-index-url https://pypi.python.org/simple/ sakia


Deploy the package on the PyPi repository (prefix the command with a space in order for the shell not to save in its history system the command containing the password)

    [SPACE]make deploy PYPI_LOGIN=xxxx PYPI_PASSWORD=xxxx


### Wheel Build scripts

    make build

Or manually:

  * Install __wheel__ with `pip install wheel`
  * Run `python3 gen_resources.py` in sakia folder
  * Run `python3 gen_translations.py` in sakia folder
  * To build the wheel : Run `python3 setup.py bdist_wheel` in sakia folder
  
### AppImage

    make appimage

The make command will do a wheel build, then create the AppImage file `ci/appimage/Sakia_x86_64.AppImage`

### Pyinstaller Build scripts (not maintained)
  * Install __pyinstaller__ with `pip install pyinstaller`
  * Run `python3 gen_resources.py` in sakia folder
  * Run `python3 gen_translations.py` in sakia folder
  * To build the binaries : Run `pyinstall sakia.spec`

## License
This software is distributed under [GNU GPLv3](https://raw.github.com/ucoin-io/sakia/dev/LICENSE).
This software is distributed under [GNU GPLv3](https://www.gnu.org/licenses/gpl-3.0.html).
+16 −12
Original line number Diff line number Diff line
@@ -11,7 +11,7 @@ environment:
      PYTHON_ARCH: "64"
      CONDA_PY: "35"
      CONDA_NPY: "18"
      QTDIR: "C:\\Qt\\5.6\\msvc2015_64"
      QTDIR: "C:\\Qt\\5.9\\msvc2015_64"
      platform: x64

    - PYTHON: "C:\\Python35_32"
@@ -19,7 +19,7 @@ environment:
      PYTHON_ARCH: "32"
      CONDA_PY: "35"
      CONDA_NPY: "18"
      QTDIR: "C:\\Qt\\5.6\\msvc2015"
      QTDIR: "C:\\Qt\\5.9\\msvc2015"
      platform: x86

install:
@@ -29,17 +29,12 @@ install:

  #- dir /b /s /ad c:\Qt\5.6
  - "SET PATH=%PYTHON%;%PYTHON%\\Scripts;%PATH%"
  # Add qt to path
  - "SET PATH=%QTDIR%\\bin;%QTDIR%\\lib;%PATH%"
  - "SET QT_PLUGIN_PATH=%QTDIR%\\plugins"
  #- "SET QT_PLUGIN_PATH=%QTDIR%\\plugins"
  - echo %PATH%
  - choco install -y vcredist2015
  #- choco install -y vcredist2015
  - "%CMD_IN_ENV% conda config --set always_yes yes --set changeps1 no"
  - "%CMD_IN_ENV% conda config --add channels inso/channel/sakia"
  - "%CMD_IN_ENV% conda create -q -n test-environment python=%PYTHON_VERSION% pyqt5=5.6 libsodium=1.0.3"

cache:
  - C:\Qt\5.6\5.6
  - "%CMD_IN_ENV% conda create -q -n test-environment python=%PYTHON_VERSION% libsodium=1.0.3 setuptools=19.2"

build_script:
  - ".\\ci\\appveyor\\build.cmd"
@@ -48,9 +43,19 @@ build_script:
  - ".\\ci\\appveyor\\tests.cmd"
  - echo %errorlevel%

  - powershell .\\ci\\appveyor\\download_vcredist.ps1 -target %cd%\\ci\\appveyor

  # Windows Installer
  - choco install -y InnoSetup
  - set PATH="C:\Program Files (x86)\Inno Setup 5";%PATH%
  - iscc %cd%\ci\appveyor\sakia.iss /DROOT_PATH=%cd%
  - move %cd%\sakia.exe %cd%\sakia-%APPVEYOR_REPO_TAG_NAME%-win%PYTHON_ARCH%.exe

artifacts:
  - path: dist
    name: sakia-win$(PYTHON_ARCH)
  - path: sakia*.exe
    name: sakia-exe
# upload to releases
deploy:
  tag: $(APPVEYOR_REPO_TAG_NAME)
@@ -58,9 +63,8 @@ deploy:
  provider: GitHub
  auth_token:
    secure: wbzlh6nx1zY1J1avlB0C3hKGm1abFNHBdM60u/U09i5Nam//D6kazvnv5ZBKdR89
  artifact: sakia-win$(PYTHON_ARCH)
  artifact: /sakia-/
  draft: true
  prerelease: true
  on:
    appveyor_repo_tag: true

ci/appimage/build.sh

0 → 100755
+6 −0
Original line number Diff line number Diff line
#!/bin/bash
#./linuxdeploy-x86_64.AppImage --appdir AppDir -i sakia.png -d sakia.desktop --plugin python --output appimage --custom-apprun sakia.sh
# workaround to run inside a docker container
./linuxdeploy-x86_64.AppImage --appimage-extract
mv squashfs-root linuxdeploy-x86_64.AppDir
./linuxdeploy-x86_64.AppDir/AppRun --appdir AppDir  -i sakia.png -d sakia.desktop --plugin python --output appimage --custom-apprun sakia.sh

ci/appimage/config.env

0 → 100644
+9 −0
Original line number Diff line number Diff line
version=0.53.2

# linuxdeploy python plugin
export PYTHON_SOURCE=https://www.python.org/ftp/python/3.6.10/Python-3.6.10.tgz
export PIP_REQUIREMENTS=$(pwd)/../../dist/sakia-${version}-py3-none-any.whl

# linuxdeploy appimage plugin
export OUTPUT=Sakia_x86_64.AppImage
+17 −0
Original line number Diff line number Diff line
[Desktop Entry]
Version=1.0
Name=Sakia
Name[fr]=Sakia
Comment=Duniter Ğ1 Libre Currency Client
Comment[fr]=Client pour la Monnaie Libre Duniter Ğ1
GenericName=Sakia client
GenericName[fr]=Client Sakia
Exec=sakia
Terminal=false
Type=Application
Icon=sakia
Categories=Utility;
StartupNotify=true
GenericName[fr_FR]=Client Sakia
Comment[fr_FR]=Client pour la Monnaie Libre Duniter Ğ1
MimeType=x-scheme-handler/duniter;

ci/appimage/sakia.sh

0 → 100755
+9 −0
Original line number Diff line number Diff line
#!/bin/bash

# Export APPRUN if running from an extracted image
self="$(readlink -f -- $0)"
here="${self%/*}"
APPDIR="${APPDIR:-${here}}"

# Call the entry point
${APPDIR}/usr/bin/python3.6 -s ${APPDIR}/usr/python/lib/python3.6/site-packages/sakia/main.py "$@"
+3 −0
Original line number Diff line number Diff line
@ECHO OFF

rd /s /q %APPDATA%\sakia
 No newline at end of file
Original line number Diff line number Diff line
@@ -5,22 +5,24 @@ call activate test-environment
echo "%PATH%"
echo "%QT_PLUGIN_PATH%"
python -V
call pyuic5 --version

pyrcc5 -version

lrelease -version

call pyuic5 --version
pyrcc5 -version

pip install -r requirements.txt
pip install pyinstaller
pip install pyinstaller==3.2
pip install six
pip install packaging

python gen_resources.py
if %errorlevel% neq 0 exit /b 1s

python gen_translations.py
call .\\ci\\appveyor\\gen_translations.cmd
if %errorlevel% neq 0 exit /b 1

SET PATH=c:\\python35_64\\envs\\test-environment\\lib\\site-packages\\PyQt5\\Qt\\bin;%PATH%

pyinstaller sakia.spec
if %errorlevel% neq 0 exit /b 1
+6 −0
Original line number Diff line number Diff line
Param([String]$target)

Write-Host "Downloading vcredist to $target"
(New-Object Net.WebClient).DownloadFile('https://download.microsoft.com/download/A/4/D/A4D9F1D3-6449-49EB-9A6E-902F61D8D14B/vcredist_x86.exe', "$target\vcredist_x86.exe")
(New-Object Net.WebClient).DownloadFile('https://download.microsoft.com/download/A/4/D/A4D9F1D3-6449-49EB-9A6E-902F61D8D14B/vcredist_x64.exe', "$target\vcredist_x64.exe")
+12 −0
Original line number Diff line number Diff line
@ECHO ON

SET PREVPATH=%PATH%
SET PATH=%QTDIR%\\bin;%QTDIR%\\lib;%PATH%

lrelease -version

python gen_translations.py
if %errorlevel% neq 0 exit /b 1

SET PATH=%PREVPATH%

ci/appveyor/sakia.iss

0 → 100644
+107 −0
Original line number Diff line number Diff line
#define MyAppName "Sakia"
#define MyAppPublisher "Sakia team"
#define MyAppURL "http://sakia-wallet.org"
#define MyAppExeName "sakia.exe"

#if !Defined(ROOT_PATH)
#define ROOT_PATH "."
#endif

#define MyAppSrc ROOT_PATH
#define MyAppExe ROOT_PATH + "\dist\sakia\" + MyAppExeName
#pragma message MyAppSrc

#if !FileExists(MyAppExe)
#error "Unable to find MyAppExe"
#endif

#define MyAppVerStr "0.53.2"

[Setup]
AppName={#MyAppName}
AppVersion={#MyAppVerStr}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\{#MyAppName}
DisableDirPage=yes
DefaultGroupName={#MyAppName}
DisableProgramGroupPage=yes
OutputDir={#ROOT_PATH}
OutputBaseFilename={#MyAppName}
Compression=lzma
SolidCompression=yes
UninstallDisplayIcon={app}\{#MyAppExeName}

[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"
Name: "french"; MessagesFile: "compiler:Languages\French.isl"

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

[Files]
Source: "{#MyAppSrc}\dist\sakia\*"; DestDir: "{app}\"; Flags: ignoreversion recursesubdirs
Source: "{#MyAppSrc}\sakia.ico"; DestDir: "{app}\"; Flags: ignoreversion recursesubdirs
Source: "{#MyAppSrc}\sakia.png"; DestDir: "{app}\"; Flags: ignoreversion recursesubdirs
Source: "{#MyAppSrc}\LICENSE"; DestDir: "{app}\"; Flags: ignoreversion recursesubdirs
Source: "{#MyAppSrc}\ci\appveyor\after_install.cmd"; DestDir: "{app}\"; Flags: ignoreversion
Source: "{#MyAppSrc}\ci\appveyor\vcredist_x86.exe"; DestDir: "{tmp}\"; Flags: ignoreversion deleteafterinstall
Source: "{#MyAppSrc}\ci\appveyor\vcredist_x64.exe"; DestDir: "{tmp}\"; Flags: ignoreversion deleteafterinstall

[Icons]
Name: "{group}\{#MyAppName}"; IconFilename: "{app}\sakia.ico"; Filename: "{app}\{#MyAppExeName}"
Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}"
Name: "{commondesktop}\{#MyAppName}"; IconFilename: "{app}\sakia.ico"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon

[Run]
#define VCmsg "Installing Microsoft Visual C++ Redistributable...."

[Run]
Filename: "{tmp}\vcredist_x86.exe"; StatusMsg: "{#VCmsg}"; Check: not IsWin64 and not VCinstalled
Filename: "{tmp}\vcredist_x64.exe"; StatusMsg: "{#VCmsg}"; Check: IsWin64 and not VCinstalled
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent
Filename: "{app}\after_install.cmd"; Description: "Delete ALL existing data"; Flags: postinstall nowait skipifsilent unchecked

[Code]
function VCinstalled: Boolean;
 // By Michael Weiner <mailto:spam@cogit.net>
 // Function for Inno Setup Compiler
 // 13 November 2015
 // Returns True if Microsoft Visual C++ Redistributable is installed, otherwise False.
 // The programmer may set the year of redistributable to find; see below.
 var
  names: TArrayOfString;
  i: Integer;
  dName, key, year: String;
 begin
  // Year of redistributable to find; leave null to find installation for any year.
  year := '';
  Result := False;
  key := 'Software\Microsoft\Windows\CurrentVersion\Uninstall';
  // Get an array of all of the uninstall subkey names.
  if RegGetSubkeyNames(HKEY_LOCAL_MACHINE, key, names) then
   // Uninstall subkey names were found.
   begin
    i := 0
    while ((i < GetArrayLength(names)) and (Result = False)) do
     // The loop will end as soon as one instance of a Visual C++ redistributable is found.
     begin
      // For each uninstall subkey, look for a DisplayName value.
      // If not found, then the subkey name will be used instead.
      if not RegQueryStringValue(HKEY_LOCAL_MACHINE, key + '\' + names[i], 'DisplayName', dName) then
       dName := names[i];
      // See if the value contains both of the strings below.
      Result := (Pos(Trim('Visual C++ ' + year),dName) * Pos('Redistributable',dName) <> 0)
      i := i + 1;
     end;
   end;
 end;

[Setup]
; NOTE: The value of AppId uniquely identifies this application.
; Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppId={{2F4DA7A9-B15B-06FC-474C-A470394CAEAA}
LicenseFile="{#MyAppSrc}\LICENSE"
Original line number Diff line number Diff line
@@ -4,6 +4,7 @@ call activate test-environment

echo "%PATH%"
echo "%QT_PLUGIN_PATH%"

python -V
call pyuic5 --version

@@ -11,8 +12,7 @@ pyrcc5 -version

lrelease -version

echo "%CWD%"

python setup.py test
echo "%cd%"
py.test tests/

if %errorlevel% neq 0 exit /b 1
 No newline at end of file
Original line number Diff line number Diff line
#!/usr/bin/env bash

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

cd $HOME/build/ucoin-io/sakia
pyenv activate sakia-env
cd $HOME/build/duniter/sakia
pyenv shell $PYENV_PYTHON_VERSION

coverage -rm
coveralls
 No newline at end of file
Original line number Diff line number Diff line
@@ -2,8 +2,19 @@

if [ $TRAVIS_OS_NAME == "osx" ]
then
    zip -r sakia-${TRAVIS_OS_NAME}.zip dist/
    zip -r sakia-${TRAVIS_OS_NAME}.zip dist/sakia.app/
elif [ $TRAVIS_OS_NAME == "linux" ]
then
    zip -r sakia-${TRAVIS_OS_NAME}.zip dist/
    zip -r sakia-${TRAVIS_OS_NAME}.zip dist/sakia/

    # Debian package
    chmod 755 ci/travis/debian/DEBIAN/post*
    chmod 755 ci/travis/debian/DEBIAN/pre*
    mkdir -p ci/travis/debian/opt/sakia

    cp sakia.png ci/travis/debian/opt/sakia/
    cp sakia-${TRAVIS_OS_NAME}.zip ci/travis/debian/opt/sakia/sakia.zip
    cp -r res/linux/usr ci/travis/debian
    fakeroot dpkg-deb --build ci/travis/debian
    mv ci/travis/debian.deb sakia-${TRAVIS_OS_NAME}.deb
fi
Original line number Diff line number Diff line
@@ -11,12 +11,11 @@ fi

if [ $TRAVIS_OS_NAME == "osx" ]
then
    brew tap homebrew/versions
    brew update
    brew install libsodium
    ## Ensure your brew QT version is up to date. (brew install qt -> qt 4.8)
    brew install qt55
    brew link --force qt55
    brew install qt5
    brew list qt5
    brew install pyenv-virtualenv
elif [ $TRAVIS_OS_NAME == "linux" ]
then
@@ -24,79 +23,39 @@ then
    sudo apt-get install -qq -y libxcb1 libxcb1-dev libx11-xcb1 libx11-xcb-dev libxcb-keysyms1 libxcb-keysyms1-dev libxcb-image0 \
            libxcb-image0-dev libxcb-shm0 libxcb-shm0-dev libxcb-icccm4 libxcb-icccm4-dev \
            libxcb-xfixes0-dev libxrender-dev libxcb-shape0-dev libxcb-randr0-dev libxcb-render-util0 \
            libxcb-render-util0-dev libxcb-glx0-dev libgl1-mesa-dri libegl1-mesa libpcre3-dev \
            curl libdbus-1-dev libdbus-glib-1-dev autoconf automake libtool libgstreamer-plugins-base0.10-0
            libxcb-render-util0-dev libxcb-glx0-dev libgl1-mesa-dri libegl1-mesa libpcre3 libgles2-mesa-dev \
            freeglut3-dev libfreetype6-dev xorg-dev xserver-xorg-input-void xserver-xorg-video-dummy xpra libosmesa6-dev \
            curl libdbus-1-dev libdbus-glib-1-dev autoconf automake libtool libgstreamer-plugins-base0.10-0 dunst fakeroot \
            dbus-x11
    wget https://download.qt.io/official_releases/qt/5.9/5.9.4/qt-opensource-linux-x64-5.9.4.run
    chmod +x qt-opensource-linux-x64-5.9.4.run
    ./qt-opensource-linux-x64-5.9.4.run -v --script $HOME/build/duniter/sakia/ci/travis/qt-installer-noninteractive.qs

    wget http://archive.ubuntu.com/ubuntu/pool/universe/libs/libsodium/libsodium18_1.0.13-1_amd64.deb
    sudo dpkg -i libsodium18_1.0.13-1_amd64.deb
    rm -r ~/.pyenv
    git clone https://github.com/pyenv/pyenv.git ~/.pyenv
    echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
    echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
    export PYENV_ROOT="$HOME/.pyenv"
    export PATH="$PYENV_ROOT/bin:$PATH"
    ldconfig -p
    #export $(dbus-launch)

    wget https://download.qt.io/official_releases/qt/5.5/5.5.1/qt-opensource-linux-x64-5.5.1.run
    chmod +x qt-opensource-linux-x64-5.5.1.run
    ./qt-opensource-linux-x64-5.5.1.run --script $HOME/build/ucoin-io/sakia/ci/travis/qt-installer-noninteractive.qs

    wget http://archive.ubuntu.com/ubuntu/pool/universe/libs/libsodium/libsodium13_1.0.1-1_amd64.deb
    sudo dpkg -i libsodium13_1.0.1-1_amd64.deb
    curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash
fi

eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

pyenv activate sakia-env
if [ $? -ne 0 ]
then
    echo "Sakia env cache cleared, rebuilding it..."
pyenv update
pyenv install --list
if [ $TRAVIS_OS_NAME == "osx" ]
then
    env PYTHON_CONFIGURE_OPTS="--enable-framework" pyenv install $PYENV_PYTHON_VERSION
elif [ $TRAVIS_OS_NAME == "linux" ]
then
        PYTHON_CONFIGURE_OPTS="--enable-shared" pyenv install $PYENV_PYTHON_VERSION
    PYTHON_CONFIGURE_OPTS="--enable-shared" pyenv install --force $PYENV_PYTHON_VERSION
fi

pyenv shell $PYENV_PYTHON_VERSION
    pyenv virtualenv sakia-env

cd $HOME

    wget http://sourceforge.net/projects/pyqt/files/sip/sip-4.17/sip-4.17.tar.gz
    tar xzf sip-4.17.tar.gz
    cd sip-4.17/
    pyenv activate sakia-env
    python configure.py
    make && make install
    pyenv rehash

    cd $HOME

    wget http://sourceforge.net/projects/pyqt/files/PyQt5/PyQt-5.5.1/PyQt-gpl-5.5.1.tar.gz
    tar xzf PyQt-gpl-5.5.1.tar.gz
    cd PyQt-gpl-5.5.1/
    pyenv activate sakia-env
    if [ $TRAVIS_OS_NAME == "osx" ]
    then
        python configure.py --confirm-license \
            --enable QtCore \
            --enable QtWidgets \
            --enable QtGui \
            --enable QtSvg \
            --enable QtWebChannel \
            --enable QtWebEngineWidgets \
            --enable QtNetwork \
            --enable QtPrintSupport \
            --enable QtTest
    elif [ $TRAVIS_OS_NAME == "linux" ]
    then
        python configure.py --qmake "/tmp/qt/5.5/5.5/gcc_64/bin/qmake" --confirm-license  \
            --enable QtCore \
            --enable QtWidgets \
            --enable QtGui \
            --enable QtSvg \
            --enable QtWebChannel \
            --enable QtWebEngineWidgets \
            --enable QtNetwork \
            --enable QtPrintSupport \
            --enable QtTest
    fi

    make -j 2 && make install
    pyenv rehash

fi
Original line number Diff line number Diff line
#!/usr/bin/env bash

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

cd $HOME/build/ucoin-io/sakia
cd $HOME/build/duniter/sakia


pyenv activate sakia-env
pyenv shell $PYENV_PYTHON_VERSION
pip install --upgrade pip
pyenv rehash
pip install coveralls
pip install pyinstaller
pip install pytest-cov
pip install pyinstaller==3.3.1
pip install wheel
pip install -r requirements.txt
if [ $TRAVIS_OS_NAME == "linux" ]
then
    pip install -U git+https://github.com/posborne/dbus-python.git
    pip install notify2

    export PATH=/tmp/qt/5.5/5.5/gcc_64/bin:$PATH
    export PATH=/tmp/qt/5.8/5.8/gcc_64/bin:$PATH
fi
if [ $TRAVIS_OS_NAME == "osx" ]
then
    brew link --force qt5
    export PATH=/Users/travis/.pyenv/versions/$PYENV_PYTHON_VERSION/Python.framework/Versions/3.5/bin:$PATH
fi

echo $PATH
python gen_resources.py
python gen_translations.py --lrelease

@@ -25,9 +35,11 @@ if [ $TRAVIS_OS_NAME == "osx" ]
then
    pyinstaller sakia.spec
    cp -rv dist/sakia/* dist/sakia.app/Contents/MacOS
    cp -v res/osx/Info.plist dist/sakia.app/Contents/
    rm -rfv dist/sakia
elif [ $TRAVIS_OS_NAME == "linux" ]
then
    pyinstaller sakia.spec
    rm -f dist/sakia/libdrm.so.2
    python setup.py bdist_wheel
fi
+8 −0
Original line number Diff line number Diff line
Package: sakia
Version: 0.53.2
Section: misc
Priority: optional
Architecture: all
Installed-Size: 122000
Maintainer: inso <insomniak.fr@gmail.com>
Description: Sakia Wallet
+9 −0
Original line number Diff line number Diff line
#!/bin/bash

SAKIA_ROOT=/opt/sakia

unzip -d $SAKIA_ROOT/ $SAKIA_ROOT/sakia.zip
mv $SAKIA_ROOT/dist/sakia/* $SAKIA_ROOT/
rm $SAKIA_ROOT/sakia.zip

ln -s /opt/sakia/sakia.bin /usr/bin/sakia
+4 −0
Original line number Diff line number Diff line
#!/bin/bash

rm /usr/bin/sakia
rm -Rf /opt/sakia
Original line number Diff line number Diff line
@@ -8,7 +8,7 @@ function Controller() {
}

Controller.prototype.WelcomePageCallback = function() {
    gui.clickButton(buttons.NextButton);
    gui.clickButton(buttons.NextButton, 3000);
}

Controller.prototype.CredentialsPageCallback = function() {
@@ -21,14 +21,14 @@ Controller.prototype.IntroductionPageCallback = function() {

Controller.prototype.TargetDirectoryPageCallback = function()
{
    gui.currentPageWidget().TargetDirectoryLineEdit.setText("/tmp/qt/5.5");
    gui.currentPageWidget().TargetDirectoryLineEdit.setText("/tmp/qt/5.8");
    gui.clickButton(buttons.NextButton);
}

Controller.prototype.ComponentSelectionPageCallback = function() {
    //var widget = gui.currentPageWidget();
    var widget = gui.currentPageWidget();

    //widget.selectAll();
    widget.selectAll();

    gui.clickButton(buttons.NextButton);
}
Original line number Diff line number Diff line
#!/usr/bin/env bash

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

if [ $TRAVIS_OS_NAME == "linux" ]
then
    export XVFBARGS="-screen 0 1280x1024x24"
    export DISPLAY=:99.0
    sh -e /etc/init.d/xvfb restart
    sh -e /etc/init.d/xvfb start
    sleep 3
fi

cd $HOME/build/ucoin-io/sakia
pyenv activate sakia-env
coverage run --source=sakia.core,sakia.gui,sakia.models setup.py test
if [ $TRAVIS_OS_NAME == "osx" ]
then
    brew link --force qt5
    export PATH=/Users/travis/.pyenv/versions/$PYENV_PYTHON_VERSION/Python.framework/Versions/3.5/bin:$PATH
fi

cd $HOME/build/duniter/sakia
pyenv shell $PYENV_PYTHON_VERSION
if [ $TRAVIS_OS_NAME == "linux" ]
then
    py.test --cov=sakia tests/
else
    py.test -s
fi

+174 −0
Original line number Diff line number Diff line
# Install Sakia for developpers
### Windows install

 * Download and install [vcredist2015](https://www.microsoft.com/fr-FR/download/details.aspx?id=48145)
 * Download and install [Miniconda](http://conda.pydata.org/miniconda.html).
 * Download and install [Git](https://git-scm.com/) and add the binaries path to your `PATH` variable
 * Download and install [Qt 5.6](http://download.qt.io/development_releases/qt/5.6/) for your architecture (msvc2015_64 for 64 bits, msvc2015 for 32 bits)
 * Open Conda console then : `conda update --yes conda`
 * Restart Conda console then : 

```
conda config --add channels inso/channel/sakia
conda create -n sakia-env python=3.5 pyqt5 libsodium=1.0.3
activate sakia-env
pip install -r requirements.txt
pip install pyinstaller
```
 * To run sakia, you have to export the following variable in your conda console : 

```
SET PYTHONPATH=[Path to sakia dir]\\src;%PYTHONPATH%
```

 * Then : 
```batch
python gen_resources.py 
python gen_translations.py
python src/sakia/main.py
```

### Linux & Macos (Pyenv install)
#### Linux System dependencies
##### Fedora
    sudo dnf install libsodium qt5-qtsvg python3-qt5 qt5-qttools \
    qt5-qttools-devel python3-qt5-devel qtchooser openssl-devel zfstream-devel \
    readline-devel sqlite-devel gcc-c++ \
    qt5-qtbase-devel qt5-qtsvg-devel

    sudo ln -s /usr/bin/lrelease-qt5 /usr/bin/lrelease

##### Ubuntu 14.04+ install

    sudo apt-get install curl qt5-qmake qtbase5-dev qttools5-dev-tools libqt5svg5-dev libdbus-1-dev libdbus-glib-1-dev autoconf automake libtool

64 bits:

      wget http://archive.ubuntu.com/ubuntu/pool/universe/libs/libsodium/libsodium13_1.0.1-1_amd64.deb
      sudo dpkg -i libsodium13_1.0.1-1_amd64.deb

32 bits:

     wget http://archive.ubuntu.com/ubuntu/pool/universe/libs/libsodium/libsodium13_1.0.1-1_i386.deb
     sudo dpkg -i libsodium13_1.0.1-1_i386.deb

##### Install pyenv on your home:

* Linux : 
```bash
curl -L https://raw.githubusercontent.com/pyenv/pyenv-installer/master/bin/pyenv-installer | bash
```

Add in `~/.bash_profile`, in `~/.bashrc` on Fedora:
```bash
export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv virtualenv-init -)"
eval "$(pyenv init -)"
export PYENV_ROOT="$HOME/.pyenv"
```
Restart your terminal.


#### MacOS system dependencies

Install the following brew packages : 
```bash
brew install wget
brew install libsodium
## Ensure your brew QT version is up to date. (brew install qt -> qt 4.8)
brew install qt5
brew link --force qt5
## Install pyenv
brew install pyenv
brew install pyenv-virtualenv
```

After installation, you'll need to add :  
```bash
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
```
to your profile (as stated in the caveats displayed by Homebrew — to display them again, use brew info pyenv). You only need to add that to your profile once.

If you are running El Capitan (MacOS 10.10), you'll need to run `xcode-select --install`

#### Pyenv environment 

##### Build python 3.5.4

Building python 3.5.4 requires libraries of `openssl` and `sqlite3`. On Ubuntu, install it using the following commands : 

```
apt-get update
apt-get install libssl-dev
apt-get install libsqlite3-dev
```

Restart your shell then prepare your virtualenv: 

On GNU/Linux: `PYTHON_CONFIGURE_OPTS="--enable-shared" pyenv install 3.5.4`  
On MacOS: `env PYTHON_CONFIGURE_OPTS="--enable-framework" pyenv install 3.5.4`

Run:
```bash
pyenv shell 3.5.4
pyenv virtualenv sakia-env
```

#### Build Sakia: 

##### Download Sakia

    git clone https://github.com/duniter/sakia

##### Go to dev branch
```bash
cd sakia && git checkout dev
```

##### Configure your PYTHONPATH environment variable
```bash
export PYTHONPATH=${PYTHONPATH}:/YOUR_SAKIA_INSTALL_PATH/src
```

On Linux, you'll need buildable python-dbus and notify2 :  
```bash
pyenv local sakia-env
pip install PyQt5
pip install -U git+https://github.com/posborne/dbus-python.git
pip install notify2
```

To build sakia dependencies, go in sakia directory then : 
```bash
pip install -r requirements.txt --upgrade
pip install pyinstaller
pyenv rehash
```

##### Run Sakia ressources generator

    python gen_resources.py 

##### Run Sakia translations generator

    python gen_translations.py

##### Build Sakia as a binary
```sh
pyinstaller sakia.spec
```

##### Run Sakia build
```sh
./dist/sakia/sakia
```

##### Run Sakia from sources

    cd src && python sakia/main.py


#### Tips
You could find cache repositories on Unix at `~/.conf/sakia` and on Windows at `%APPDATA%\sakia`.
+67 −0
Original line number Diff line number Diff line
# Install Sakia dev on Fedora

## Install Sakia
### Clone respository
```bash
mkdir -p ~/projects
git clone -b dev git@gihub.com:/duniter/sakia.git ~/projects/sakia_dev
cd ~/projects/sakia_dev
```

### Install pip dependencies
```bash
pip3 install --upgrade pip --user
pip3 install -r requirements.txt --user
```

### Fix Qt link
```bash
sudo ln -s /usr/bin/lrelease-qt5 /usr/bin/lrelease
```

### Script to launch Sakia
```bash
echo "#!/bin/bash

if [ $1 == "dev" ]; then
        python3 $HOME/projects/gen_resources.py
        python3 $HOME/projects/gen_translations.py
        python3 $HOME/projects/src/sakia/main.py -d
fi
if [ $1 == "stable" ]; then
        ./sakia_stable/dist/sakia/sakia -d
fi" >> $HOME/run_sakia.sh
```

## Python path
### Bash
```bash
echo "# Sakia
export PYTHONPATH=$HOME/projects/sakia_dev/src" >> ~/.bashrc
```

### Fish
```bash
echo "# Sakia
set -x PYTHONPATH "$HOME/projects/sakia_dev/src" >> ~/.config/fish/config.fish
```

## Install dependencies
```bash
sudo dnf install -y python3-qt5 python3-jsonschema qt5-qttools-devel python3-qt5-devel libsodium
```

## Launch Sakia
```bash
./run_sakia.sh dev
```

## Upgrade DuniterPy
```bash
sudo pip3 install --upgrade duniterpy
```

## Dependency to build
```bash
sudo pip3 install pyinstaller
```
+88 −0
Original line number Diff line number Diff line
# Developing a plugin for sakia

## Prepare dev environment

Follow the doc file [Install for developers](https://github.com/duniter/sakia/blob/dev/doc/install_for_developers.md).
You can use the same pyenv environment to develop your plugin.

## Plugin structure

The plugin source code should follow the structure below :

```
/
   [plugin_pkg_name]/
      images/                # The directory containing images used in the widget
         images.qrc          # The qt resources .qrc file describing available images
         [image1.png]        # The list of images
         [image2.png]
      __init__.py            # The __init__ file of the plugin
      [script_1.py]          # Some scripts imported in the __init__ file
      [script_2.py]
      [ui_file.ui]           # ui files designed using QtDesigner
```

The `__init__.py` file must set the following global constants :

```python
PLUGIN_NAME = "Title of the plugin"
PLUGIN_DESCRIPTION = "Description of the plugin"
PLUGIN_VERSION = "0.1"
```

The function below must be present in the `__init__.py` file to initialize the plugin on Sakia startup :

```python

def plugin_exec(app, main_window):
    """
    :param sakia.app.Application app:
    :param sakia.gui.main_window.controller.MainWindowController main_window:
    """
    # Place your init code here
    pass
```

## Building your plugin

To build the plugin, you need :

### To generate resources (images, qrc, ...)

Generating resources uses [pyrcc5](http://pyqt.sourceforge.net/Docs/PyQt5/resources.html).
Generating designer ui files uses [pyuic5](http://pyqt.sourceforge.net/Docs/PyQt5/designer.html).

To help you generate your resources, you should copy the `gen_resources.py` file from sakia sources and configure the
 variable `gen_resources`. Replace `'src'` by the name of your plugin package.

### To import your resources in your code

The generation of the resources builds the following python files :

 - `filename.ui` -> `filename_uic.py`
 - `filename.qrc` -> `filename_rc.py`

The `filename_uic.py` file should be imported in the file using the designed widget. See the
[dialog of the example plugin](https://github.com/Insoleet/sakia-plugin-example/blob/master/plugin_example/main_dialog.py)

The `filename_rc.py` file should be imported in the `__init__.py` file, on the last line. See the
[\__init__.py of the example plugin](https://github.com/Insoleet/sakia-plugin-example/blob/master/plugin_example/__init__.py#L28)

### To generate your plugin

To generate your plugin, you must zip everything (generated resources) in a zip file respecting the structure below :

```
[plugin_name].zip\
    [plugin_name]\
        __init__.py
        [generated files...]
```

The [setup.py](https://github.com/Insoleet/sakia-plugin-example/blob/master/setup.py) file from the
example plugin is available to help you generate correctly the plugin.

### To test your plugin

To test your plugin, you need to run sakia with the parameter `--withplugin [path to zip file]`. The plugin will
be loaded automatically on startup but won't be installed to user profile directory.
 No newline at end of file

doc/uml/api.pu

deleted100644 → 0
+0 −21
Original line number Diff line number Diff line
@startuml

package api {
	package api.bma {
		class BMADataAccess {
			{static} _cache
			{static} _request(req : Request, network)
			{static} _post(req : Request, network)
			{static} _broadcast(req : Request, network)
		}
		BMADataAccess ..> api.bma.API
	}
	package api.es {
			class ESDataAccess {
			}
			ESDataAccess ..> api.es.API
	}

}

@enduml
 No newline at end of file

doc/uml/backend.pu

0 → 100644
+51 −0
Original line number Diff line number Diff line
@startuml

!include data.pu
!include processors.pu
!include services.pu

ProfileService "1" --> "1" UserParameters
ProfileService "*" --> "1" UserParametersRepo

AccountService "1" --> "1" Key
AccountService "*" --> "1" KeyRepo


TransactionsService "1" --> "*" Transaction
TransactionsService "*" --> "1" TransactionProcessor
TransactionProcessor "1" --> "1" TransactionRepo

RegistryService "1" --> "*" Identity
RegistryService "1" --> "*" Certification
RegistryService "*" --> "1" IdentitiesProcessor
IdentitiesProcessor "1" --> "1" IdentitiesRepo
RegistryService "*" --> "1" CertificationProcessor
CertificationProcessor "1" --> "1" CertificationRepo

NetworkService "1" --> "*" Node
NetworkService "*" --> "1" NodesProcessor
NodesProcessor "1" --> "1" NodesRepo

BlockchainService "1" --> "1" Blockchain
BlockchainService "1" --> "1" Community
BlockchainService "*" --> "1" BlockchainProcessor
BlockchainProcessor "1" --> "1" BlockchainRepo
BlockchainService "*" --> "1" CommunityProcessor
CommunityProcessor "1" --> "1" CommunityRepo

package Connectors {
    class BMAConnector << (S,cyan) >>  {
        get()
        post()
        broadcast()
    }
}

AccountService --> BMAConnector
BlockchainProcessor --> BMAConnector
CommunityProcessor --> BMAConnector
TransactionProcessor --> BMAConnector
IdentitiesProcessor --> BMAConnector
CertificationProcessor --> BMAConnector

@enduml
 No newline at end of file

doc/uml/core-classes.pu

deleted100644 → 0
+0 −101
Original line number Diff line number Diff line
@startuml

package core {
	class App {
	-- Signals --
	current_account_changed(str : account_name)
	data_changed()
	-- Slots --
	-- Properties --
	current_account
	accounts
	-- Methods --
	}
	App --* Account : accounts

	class Account {
	-- Signals --
	wallets_changed(int : nb_wallets)
	community_added(int : index)
	community_removed(int : index)
	data_changed()
	-- Slots --
	-- Properties --
	communities
	wallets
	-- Methods --
	}
	Account "1" --* "*" Wallet
	Account "1" --* "*" Community

	class Wallet {
		-- Signals --
	money_received(Transfer)
	money_sent(Transfer)
	name_changed(str : new_name
	data_changed()
	-- Slots --
	-- Properties --
	transfers
	-- Methods --
	}
	Wallet "1" --* "*" Transfer

	class Transfer {
	-- Signals --
	state_changed(int : new_state)
	-- Slots --
	-- Properties --
	-- Methods --
	}

	class Community {
	-- Signals --
	members_changed()
	data_changed()
	-- Slots --
	-- Properties --
	network
	-- Methods --

	}
	App --> Identity
	class Identity {
		{static} _identities
		{static} load(data : dict)
		{static} lookup(search : str)
	}

}


package net {
	class Network {
	-- Signals --
	node_found(int : index)
	node_removed(int : index)
	block_found(int : block_number)
	-- Slots --
	-- Properties --
	nodes
	root_nodes
	-- Methods --
	}
	Community "1" --* "1" Network
	Network "1" --* "*" Node

	class Node {
	-- Signals --
	changed()
	-- Slots --
	-- Properties --
	endpoints
	pubkey
	uid
	block
	state
	-- Methods --
	}

}
@enduml
 No newline at end of file

doc/uml/cutecoin.pu

deleted100644 → 0
+0 −36
Original line number Diff line number Diff line
@startuml

!include core-classes.pu
!include gui-classes.pu
!include models-classes.pu
!include api.pu

MainWindow "1" --> "1" App

CertificationDialog --> Community
TransferDialog --> Community

CurrencyTab "1" --> "1" Community

CommunityTab -right-> IdentitiesFilterProxyModel
NetworkTab -right-> NetworkFilterProxyModel
WalletTab -right-> WalletsFilterProxyModel

WalletsFilterProxyModel -up-> Wallet
NetworkFilterProxyModel -up-> Network
TxHistoryFilterProxyModel -up-> Transfer

ConfigureAccountDialog --> CommunitiesListModel
ConfigureCommunityDialog --> RootNodesTableModel

ConfigureAccountDialog --> Account
ConfigureCommunityDialog --> Community

Account ..> BMADataAccess
Community ..> BMADataAccess
Wallet ..> BMADataAccess
Transfer ..> BMADataAccess
Identity ..> BMADataAccess
BMADataAccess .left.> Network

@enduml
 No newline at end of file

doc/uml/data.pu

0 → 100644
+180 −0
Original line number Diff line number Diff line
@startuml


class Identity << (D,orchid) >> {
    currency: str (FK)
    uid: str
    pubkey: str (PK)
    blockstamp: BlockUID
    timestamp: int
    signature: str
    written_on: BlockUID
    revoked_on: BlockUID
    member: bool
    membership_buid: BlockUID
    membership_timestamp: int
    membership_type: str
    membership_written_on: BlockUID
}

class Certification << (D,orchid) >> {
    currency: str (PK)
    certifier: str (PK)
    certified: str (PK)
    blockstamp: BlockUID (PK)
    timestamp: int
    signature: str
    written_on: BlockUID
}

class Transaction  << (D,orchid) >> {
    currency: str (FK)
    blockstamp: str
    locktime: int
    issuer: str
    recipient: str
    amount: int
    comment: str
    sha_hash: str (PK)
}

class Community  << (D,orchid) >> {
    profile: str (FK)
    pubkey: str (FK)
    currency: str (PK)
    c: float
    dt: int
    ud0: int
    sig_period: int
    sig_stock: int
    sig_window: int
    sig_validity: int
    sig_qty: int
    xpercent: float
    ms_validity: int
    step_max: int
    median_time_blocks: int
    avg_gen_time: int
    dt_diff_eval: int
    blocks_rot: int
    percent_rot: float
}

class Blockchain  << (D,orchid) >> {
    currency: str (PK)
    current_buid: BlockUID
    nb_members: int
    current_mass: int
    median_time: int
    last_ud: int
    last_ud_base: int
    previous_mass: int
}

class Node  << (D,orchid) >> {
    currency: str (FK)
    endpoints: str
    uid: str
    pubkey: str (PK)
    current_buid: BlockUID
    previous_buid: BlockUID
    state: int
    software: str
    version: str
    merkle_nodes: dict
}

class Key  << (D,orchid) >> {
    pubkey: str (PK)
    salt: str
}

class UserParameters  << (D,orchid) >> {
    profile: str (PK)
    lang: str
    ref: 0
    expert_mode: bool,
    digits_after_comma: int
    maximized: bool
    notifications: bool
    enable_proxy: bool
    proxy_type: int
    proxy_address: str
    proxy_port: 8080: int
    international_system_of_units: bool
    auto_refresh: bool
    forgetfulness: bool
}

class UserParametersRepo << (R,orange) >> {
    Create()
    Update()
    Save()
    Drop()
}


class KeyRepo << (R,orange) >>  {
    Create()
    Update()
    Save()
    Drop()
}


class NodesRepo << (R,orange) >>   {
    Create()
    Update()
    Save()
    Drop()
}

class BlockchainRepo << (R,orange) >>  {
    Create()
    Update()
    Save()
    Drop()
}
class CommunityRepo << (R,orange) >>  {
    Commit()
    Update()
    Save()
    Drop()
}
class TransactionRepo << (R,orange) >>  {
    Commit()
    Update()
    Save()
    Drop()
}
class CertificationRepo  << (R,orange) >> {
    Commit()
    Update()
    Save()
    Drop()
}
class IdentitiesRepo  << (R,orange) >>  {
    Commit()
    Update()
    Save()
    Drop()
}

IdentitiesRepo "1" --* "*" Identity

CertificationRepo "1" --* "*" Certification

TransactionRepo "1" --* "*" Transaction

CommunityRepo "1" --* "*" Community

BlockchainRepo "1" --* "*" Blockchain

NodesRepo "1" --* "*" Node

KeyRepo "1" --* "*" Key

UserParametersRepo "1" --* "*" UserParameters


@enduml
 No newline at end of file

doc/uml/gui-classes.pu

deleted100644 → 0
+0 −58
Original line number Diff line number Diff line
@startuml


package gui {
		class MainWindow {
		}
		MainWindow "1" --* "*" CurrencyTab

		class CurrencyTab {
		}
		CurrencyTab "1" --* "1" CommunityTab
		CurrencyTab "1" --* "1" WalletTab
		CurrencyTab "1" --* "1" InformationsTab
		CurrencyTab "1" --* "1" TransactionsTab

		class CommunityTab {
		}

		CommunityTab "1" --* "1" IdentitiesTab
		CommunityTab "1" --* "1" WotTab

		class WalletTab {
		}

		class InformationsTab {
		}

		class TransactionsTab {
		}

		class NetworkTab {
		}

		CurrencyTab "1" --* "1" NetworkTab

		class IdentitiesTab {
		}

		class WotTab {
		}
		package dialogs {
		class CertificationDialog
		class TransferDialog
		class ContactDialog
		class ConfigureAccountDialog
		class ConfigureCommunityDialog
		}

	MainWindow --> CertificationDialog
	MainWindow --> TransferDialog
	MainWindow --> ContactDialog
	MainWindow --> ConfigureAccountDialog
	ConfigureAccountDialog --> ConfigureCommunityDialog

		class Wot
		WotTab --> Wot
}
@enduml
 No newline at end of file

doc/uml/models-classes.pu

deleted100644 → 0
+0 −39
Original line number Diff line number Diff line
@startuml

package models {
	class WalletsFilterProxyModel {
	}

	WalletsFilterProxyModel --> WalletsTableModel : source

	class WalletsTableModel {
	}

	class IdentitiesFilterProxyModel {
	}
	IdentitiesFilterProxyModel --> IdentitiesTableModel : source

	class IdentitiesTableModel {
	}

	class NetworkFilterProxyModel {
	}
	NetworkFilterProxyModel --> NetworkTableModel : source

	class NetworkTableModel {
	}

	class TxHistoryFilterProxyModel {
	}
	TxHistoryFilterProxyModel --> TxHistoryTableModel : source
	class TxHistoryTableModel {
	}

	class CommunitiesListModel {
	}

	class RootNodesTableModel {
	}
}

@enduml
 No newline at end of file
Original line number Diff line number Diff line
@@ -3,11 +3,11 @@
Network -->o Node : Connect to node_received()
Network -> Node : Starts network discovery
activate Node
Node -> ucoinpy : HTTP GET peering/peers?leaves=true
Node -> duniterpy : HTTP GET peering/peers?leaves=true
alt "root" hash changed
loop "for all leaves changed"
activate Node
Node -> ucoinpy : HTTP GET peering/peers/leaf=leaf_hash
Node -> duniterpy : HTTP GET peering/peers/leaf=leaf_hash
end
end
Network <-- Node : node_received()

doc/uml/processors.pu

0 → 100644
+21 −0
Original line number Diff line number Diff line
@startuml


class IdentitiesProcessor  << (P,lightgreen) >> {
    find_identities()
    find_certifiers_of()
    find_certified_by()
}

class CertificationProcessor  << (P,lightgreen) >> {
}
class TransactionProcessor  << (P,lightgreen) >> {
}
class CommunityProcessor  << (P,lightgreen) >> {
}
class BlockchainProcessor  << (P,lightgreen) >> {
}
class NodesProcessor  << (P,lightgreen) >> {
}

@enduml
 No newline at end of file
Original line number Diff line number Diff line
@@ -8,7 +8,7 @@ ref over BmaAccess
    (new block mined
    since last caching)
end ref
BmaAccess -> ucoinpy : HTTP GET
BmaAccess -> duniterpy : HTTP GET
alt Rollback
BmaAccess -> BmaAccess : Find last block number rollbacked
ref over BmaAccess

doc/uml/services.pu

0 → 100644
+36 −0
Original line number Diff line number Diff line
@startuml



class ProfileService << (S,cyan) >>  {
    add_connection()
    remove_connection()
}

class AccountService << (S,cyan) >>  {
    send_transaction()
    send_certification()
    send_membership()
    send_identity()
    send_revokation()
}

class TransactionsService << (S,cyan) >>  {
    handle_new_block()
    refresh_transactions()
    rollback_transactions()
}

class RegistryService << (S,cyan) >> {
    handle_new_block()
}

class NetworkService << (S,cyan) >>  {
    discover_network()
}

class BlockchainService  << (S,cyan) >>  {
    receive_block()
}

@enduml
 No newline at end of file
+10 −5
Original line number Diff line number Diff line
@@ -2,9 +2,10 @@
# -*- coding: utf-8 -*-
import sys, os, multiprocessing, subprocess


root_path = os.path.abspath(os.path.join(os.path.dirname(__file__)))
resources = os.path.abspath(os.path.join(os.path.dirname(__file__), 'res'))
gen_ui = os.path.abspath(os.path.join(os.path.dirname(__file__), 'src', 'sakia', 'gen_resources'))
gen_resources = os.path.abspath(os.path.join(os.path.dirname(__file__), 'src'))
gen_resources = os.path.abspath(os.path.join(os.path.dirname(__file__), 'src/sakia'))

def convert_ui(args, **kwargs):
    subprocess.call(args, **kwargs)
@@ -12,15 +13,19 @@ def convert_ui(args, **kwargs):
def build_resources():
    try:
        to_process = []
        for root, dirs, files in os.walk(resources):
        for root, dirs, files in os.walk(root_path):
            for f in files:
                if f.endswith('.ui'):
                    source = os.path.join(root, f)
                    dest = os.path.join(gen_ui, os.path.splitext(os.path.basename(source))[0]+'_uic.py')
                    dest = os.path.join(root, os.path.splitext(os.path.basename(source))[0]+'_uic.py')

                    exe = 'pyuic5'
                elif f.endswith('.qrc'):
                    source = os.path.join(root, f)
                    dest = os.path.join(gen_resources, os.path.splitext(os.path.basename(source))[0]+'_rc.py')
                    filename = os.path.splitext(os.path.basename(source))[0]
                    # we remove "sakia." from the rc filename
                    # its only named like this so that imports are corrects in uic files
                    dest = os.path.join(gen_resources, filename.replace('sakia.', '')+'_rc.py')
                    exe = 'pyrcc5'
                else:
                    continue
Original line number Diff line number Diff line
import sys, os, multiprocessing, subprocess, time, shutil

gen_resources = os.path.abspath(os.path.join(os.path.dirname(__file__), 'src'))
gen_resources = os.path.abspath(os.path.join(os.path.dirname(__file__), 'src/sakia'))
ts = os.path.abspath(os.path.join(os.path.dirname(__file__), 'res', 'i18n', 'ts'))
qm = os.path.abspath(os.path.join(os.path.dirname(__file__), 'res', 'i18n', 'qm'))
if not os.path.exists(qm):
@@ -64,4 +64,9 @@ def build_resources():


prepare_qm()
# add Qt standardButtons qm file
# This file must be copied from Qt libs in the res/i18n/qm folder of the project
qtbase_filename = "qtbase_fr.qm"
if os.path.exists(os.path.join(qm, qtbase_filename)):
    qm_shortnames.append(qtbase_filename)
build_resources()
Original line number Diff line number Diff line
@@ -10,17 +10,17 @@

hiddenimports = ['sip', 'PyQt5.QtCore']

from PyInstaller.utils.hooks import qt5_plugins_binaries
from PyInstaller.utils.hooks import qt_plugins_binaries
from PyInstaller.compat import is_linux


binaries = []
binaries.extend(qt5_plugins_binaries('accessible'))
binaries.extend(qt5_plugins_binaries('iconengines'))
binaries.extend(qt5_plugins_binaries('imageformats'))
binaries.extend(qt5_plugins_binaries('inputmethods'))
binaries.extend(qt5_plugins_binaries('graphicssystems'))
binaries.extend(qt5_plugins_binaries('platforms'))
binaries.extend(qt_plugins_binaries('accessible', namespace='PyQt5'))
binaries.extend(qt_plugins_binaries('iconengines', namespace='PyQt5'))
binaries.extend(qt_plugins_binaries('imageformats', namespace='PyQt5'))
binaries.extend(qt_plugins_binaries('inputmethods', namespace='PyQt5'))
binaries.extend(qt_plugins_binaries('graphicssystems', namespace='PyQt5'))
binaries.extend(qt_plugins_binaries('platforms', namespace='PyQt5'))

if is_linux:
    binaries.extend(qt5_plugins_binaries('platformthemes'))
    binaries.extend(qt_plugins_binaries('platformthemes', namespace='PyQt5'))

release.sh

0 → 100755
+18 −0
Original line number Diff line number Diff line
#!/bin/bash

#__version_info__ = ('0', '20', '0dev6')
current=`grep -P "__version_info__ = \(\"\d+\", \"\d+\", \"\d+(\w*)\"\)" src/sakia/__init__.py | grep -oP "\"\d+\", \"\d+\", \"\d+(\w*)\""`
echo "Current version: $current"

if [[ $1 =~ ^[0-9]+.[0-9]+.[0-9]+[0-9A-Za-z]*$ ]]; then
  IFS='.' read -r -a array <<< "$1"
  sed -i "s/__version_info__\ = ($current)/__version_info__ = (\"${array[0]}\", \"${array[1]}\", \"${array[2]}\")/g" src/sakia/__init__.py
  sed -i "s/#define MyAppVerStr .*/#define MyAppVerStr \"$1\"/g" ci/appveyor/sakia.iss
  sed -i "s/Version: .*/Version: $1/g" ci/travis/debian/DEBIAN/control
  sed -i "s/Version=.*/Version=$1/g" res/linux/usr/share/applications/sakia.desktop
  sed -i "s/version=.*/version=$1/g" ci/appimage/config.env
  git commit src/sakia/__init__.py ci/appveyor/sakia.iss ci/travis/debian/DEBIAN/control res/linux/usr/share/applications/sakia.desktop ci/appimage/config.env -m "$1"
  git tag "$1" -a -m "$1"
else
  echo "Wrong version format"
fi
+3 −0
Original line number Diff line number Diff line
setuptools>=46.0.0
wheel
twine
 No newline at end of file

requirements_dev.txt

0 → 100644
+7 −0
Original line number Diff line number Diff line
black==20.8b1
duniter-mirage>=0.1.50
mypy==0.770
pylint==2.4.4
pytest
pytest-asyncio
md-to-html
 No newline at end of file

res/i18n/ts/cs.ts

0 → 100644
+2294 −0

File added.

Preview size limit exceeded, changes collapsed.

res/i18n/ts/de.ts

0 → 100644
+2294 −0

File added.

Preview size limit exceeded, changes collapsed.

res/i18n/ts/de_DE.ts

deleted100644 → 0
+0 −2631

File deleted.

Preview size limit exceeded, changes collapsed.

res/i18n/ts/es.ts

0 → 100644
+2294 −0

File added.

Preview size limit exceeded, changes collapsed.

res/i18n/ts/es_ES.ts

deleted100644 → 0
+0 −2833

File deleted.

Preview size limit exceeded, changes collapsed.

res/i18n/ts/fr.ts

0 → 100644
+2461 −0

File added.

Preview size limit exceeded, changes collapsed.

res/i18n/ts/fr_FR.ts

deleted100644 → 0
+0 −3212

File deleted.

Preview size limit exceeded, changes collapsed.

res/i18n/ts/it.ts

0 → 100644
+2294 −0

File added.

Preview size limit exceeded, changes collapsed.

res/i18n/ts/it_IT.ts

deleted100644 → 0
+0 −2831

File deleted.

Preview size limit exceeded, changes collapsed.

res/i18n/ts/pl.ts

0 → 100644
+2294 −0

File added.

Preview size limit exceeded, changes collapsed.

res/i18n/ts/pl_PL.ts

deleted100644 → 0
+0 −2683

File deleted.

Preview size limit exceeded, changes collapsed.

res/i18n/ts/pt.ts

0 → 100644
+2294 −0

File added.

Preview size limit exceeded, changes collapsed.

res/i18n/ts/pt_BR.ts

deleted100644 → 0
+0 −2790

File deleted.

Preview size limit exceeded, changes collapsed.

Original line number Diff line number Diff line
@@ -42,3 +42,4 @@ noun_269793_cc.svg : by TMD
noun_188924_cc.svg : by anbileru adaleru
noun_188905_cc.svg : by anbileru adaleru
noun_188906_cc.svg : by anbileru adaleru
noun_169247_cc.svg : by anbileru adaleru
 No newline at end of file
Original line number Diff line number Diff line
@@ -16,7 +16,7 @@
   version="1.1"
   inkscape:version="0.91 r13725"
   sodipodi:docname="logo.svg"
   inkscape:export-filename="/home/inso/code/ucoin/sakia/logo.png"
   inkscape:export-filename="/home/inso/code/duniter/sakia/logo.png"
   inkscape:export-xdpi="90"
   inkscape:export-ydpi="90">
  <metadata
+68 −0
Original line number Diff line number Diff line
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
   version="1.1"
   x="0px"
   y="0px"
   viewBox="0 0 100 125"
   enable-background="new 0 0 100 100"
   xml:space="preserve"
   id="svg26"
   sodipodi:docname="noun_10271_cc.svg"
   inkscape:version="0.92.2 5c3e80d, 2017-08-06"><metadata
     id="metadata32"><rdf:RDF><cc:Work
         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
     id="defs30" /><sodipodi:namedview
     pagecolor="#ffffff"
     bordercolor="#666666"
     borderopacity="1"
     objecttolerance="10"
     gridtolerance="10"
     guidetolerance="10"
     inkscape:pageopacity="0"
     inkscape:pageshadow="2"
     inkscape:window-width="1920"
     inkscape:window-height="1021"
     id="namedview28"
     showgrid="false"
     inkscape:zoom="1.888"
     inkscape:cx="-8.7923729"
     inkscape:cy="62.5"
     inkscape:window-x="0"
     inkscape:window-y="0"
     inkscape:window-maximized="1"
     inkscape:current-layer="svg26" /><g
     id="g20"><path
       d="M40.052,26.288c-3.801,0-7.054-2.288-8.413-5.288h-1.093H26v4.264v9.535c0,2.23,0.79,3.746,1.566,5.849l4.307,9.441   C32.264,51.139,33.604,52,34.771,52h10.562c1.164,0,2.427-0.861,2.815-1.912l4.337-9.437C53.262,38.549,54,37.029,54,34.799v-9.535   V21h-4.442h-1.093C47.104,24,43.851,26.288,40.052,26.288z"
       id="path2" /><rect
       x="41"
       width="2"
       height="2"
       id="rect4" /><rect
       x="45"
       width="2"
       height="2"
       id="rect6" /><polygon
       points="50,4 47,4 47,12 45,12 45,18 52,18 52,0 50,0 50,2.105  "
       id="polygon8" /><path
       d="M45,4H35v6h2v13.329c0,0,0.942,1.062,3.064,1.062S43,23.329,43,23.329V10h2V4z"
       id="path10" /><polygon
       points="28,18 35,18 35,12 33,12 33,4 30,4 30,2.105 30,0 28,0  "
       id="polygon12" /><rect
       x="37"
       width="2"
       height="2"
       id="rect14" /><rect
       x="33"
       width="2"
       height="2"
       id="rect16" /><path
       d="M60,99.667c-12.683,0-23-9.421-23-21V56h6v22.667c0,8.271,7.626,15,17,15s17-7.626,17-17V54c0-12.682,10.317-23,23-23v6   c-9.374,0-17,7.626-17,17v22.667C83,89.35,72.683,99.667,60,99.667z"
       id="path18" /></g></svg>
 No newline at end of file
+99 −0
Original line number Diff line number Diff line
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
   viewBox="0 0 100 125"
   version="1.1"
   x="0px"
   y="0px"
   id="svg2"
   inkscape:version="0.91 r13725"
   sodipodi:docname="noun_169247_cc.svg">
  <metadata
     id="metadata32">
    <rdf:RDF>
      <cc:Work
         rdf:about="">
        <dc:format>image/svg+xml</dc:format>
        <dc:type
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
      </cc:Work>
    </rdf:RDF>
  </metadata>
  <defs
     id="defs30" />
  <sodipodi:namedview
     pagecolor="#ffffff"
     bordercolor="#666666"
     borderopacity="1"
     objecttolerance="10"
     gridtolerance="10"
     guidetolerance="10"
     inkscape:pageopacity="0"
     inkscape:pageshadow="2"
     inkscape:window-width="1366"
     inkscape:window-height="711"
     id="namedview28"
     showgrid="false"
     inkscape:zoom="1.888"
     inkscape:cx="-17.33691"
     inkscape:cy="62.398508"
     inkscape:window-x="0"
     inkscape:window-y="0"
     inkscape:window-maximized="1"
     inkscape:current-layer="svg2" />
  <g
     transform="matrix(1.2399278,0,0,1.2399278,-8.0778253,-1180.1732)"
     id="g4">
    <path
       d="m 13.35023,958.55845 c 0,27.33333 0,54.66665 0,82.00005 l 40.73828,0 c -0.45628,-0.642 -0.88502,-1.3036 -1.26172,-2 l -37.47656,0 0,-78.00005 58,0 0,49.79495 c 0.67929,0.1242 1.34726,0.2792 2,0.4726 l 0,-52.26755 z"
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.435;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
       id="path6"
       inkscape:connector-curvature="0" />
    <path
       d="m 28.5121,1006.3699 c 0,0.666 0,1.332 0,1.9981 l 31.67774,0 0,-1.9981 z"
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.435;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
       id="path8"
       inkscape:connector-curvature="0" />
    <path
       d="m 28.51234,1014.1815 c 0,0.666 0,1.332 0,1.998 l 27.23242,0 c 0.6729,-0.7192 1.39538,-1.3878 2.16992,-1.998 z"
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.435;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
       id="path10"
       inkscape:connector-curvature="0" />
    <path
       d="m 38.3246,987.88853 0,0.2168 0,6.02734 12.05274,0 0,-6.24414 -1.9961,0 0,4.24609 -8.06054,0 0,-4.24609 -1.9961,0 z"
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.435;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
       id="path12"
       inkscape:connector-curvature="0" />
    <path
       d="m 44.34999,981.55259 c -1.92949,0 -3.51171,1.58223 -3.51171,3.51172 0,1.92949 1.58235,3.51172 3.51171,3.51172 1.92937,0 3.51368,-1.58223 3.51368,-3.51172 0,-1.92949 -1.58418,-3.51172 -3.51368,-3.51172 z m 0,1.99609 c 0.85126,0 1.51563,0.66438 1.51563,1.51563 0,0.85124 -0.66415,1.51562 -1.51563,1.51562 -0.85147,0 -1.51562,-0.66438 -1.51562,-1.51562 0,-0.85125 0.66437,-1.51563 1.51562,-1.51563 z"
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.435;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
       id="path14"
       inkscape:connector-curvature="0" />
    <path
       d="m 44.34999,975.12681 c -7.01092,0 -12.71484,5.70392 -12.71484,12.71484 0,7.01094 5.70392,12.71485 12.71484,12.71485 7.01094,0 12.7168,-5.70391 12.7168,-12.71485 0,-7.01092 -5.70587,-12.71484 -12.7168,-12.71484 z m 0,1.99609 c 5.93161,0 10.71875,4.78716 10.71875,10.71875 0,5.93162 -4.78714,10.71875 -10.71875,10.71875 -5.9316,0 -10.71679,-4.78713 -10.71679,-10.71875 0,-5.93159 4.78519,-10.71875 10.71679,-10.71875 z"
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.435;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
       id="path16"
       inkscape:connector-curvature="0" />
    <path
       d="m 28.51234,1021.992 c 0,0.6661 0,1.3321 0,1.9981 l 22.77343,0 c 0.19808,-0.6813 0.4245,-1.3498 0.69336,-1.9981 z"
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.435;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
       id="path18"
       inkscape:connector-curvature="0" />
    <path
       d="m 44.35083,975.34329 c -6.89303,0 -12.49769,5.60466 -12.49769,12.49768 0,6.89304 5.60466,12.49763 12.49769,12.49763 6.89304,0 12.4977,-5.60459 12.4977,-12.49763 0,-6.89302 -5.60467,-12.49768 -12.4977,-12.49768 z m 0,1.5622 c 6.04875,0 10.93548,4.88674 10.93548,10.93548 0,6.04876 -4.88673,10.93548 -10.93548,10.93548 -6.04875,0 -10.93548,-4.88672 -10.93548,-10.93548 0,-6.04874 4.88673,-10.93548 10.93548,-10.93548 z"
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.435;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
       id="path20"
       inkscape:connector-curvature="0" />
    <path
       style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:3.00000024;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
       d="m 69.86267,1012.5937 a 16.785713,16.785713 0 0 0 -16.78516,16.7871 16.785713,16.785713 0 0 0 16.78516,16.7851 16.785713,16.785713 0 0 0 16.7871,-16.7851 16.785713,16.785713 0 0 0 -16.7871,-16.7871 z m -4.59571,10.7754 4.59571,4.5957 4.5957,-4.5957 1.41406,1.414 -4.5957,4.5957 4.5957,4.5977 -1.41406,1.414 -4.5957,-4.5957 -4.59571,4.5957 -1.41406,-1.414 4.5957,-4.5977 -4.5957,-4.5957 1.41406,-1.414 z"
       id="path22"
       inkscape:connector-curvature="0" />
  </g>
</svg>
+72 −0
Original line number Diff line number Diff line
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:xlink="http://www.w3.org/1999/xlink"
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
   version="1.1"
   preserveAspectRatio="none"
   x="0px"
   y="0px"
   viewBox="0 0 100 125"
   id="svg2"
   inkscape:version="0.91 r13725"
   sodipodi:docname="noun_424413_cc.svg">
  <metadata
     id="metadata19">
    <rdf:RDF>
      <cc:Work
         rdf:about="">
        <dc:format>image/svg+xml</dc:format>
        <dc:type
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
      </cc:Work>
    </rdf:RDF>
  </metadata>
  <sodipodi:namedview
     pagecolor="#ffffff"
     bordercolor="#666666"
     borderopacity="1"
     objecttolerance="10"
     gridtolerance="10"
     guidetolerance="10"
     inkscape:pageopacity="0"
     inkscape:pageshadow="2"
     inkscape:window-width="1366"
     inkscape:window-height="711"
     id="namedview17"
     showgrid="false"
     inkscape:zoom="1.888"
     inkscape:cx="50"
     inkscape:cy="62.5"
     inkscape:window-x="0"
     inkscape:window-y="0"
     inkscape:window-maximized="1"
     inkscape:current-layer="svg2" />
  <defs
     id="defs4">
    <g
       id="a">
      <path
         fill="#000000"
         stroke="none"
         d=" M 85.35 83.9 L 85.35 52.7 Q 85.35 41.05 73.7 41.05 L 27.4 41.05 Q 27.4 40.9 27.4 40.7 L 27.4 26 Q 27.4 18.75 32.5 13.6 L 32.55 13.55 Q 37.7 8.45 45 8.45 L 55.1 8.45 Q 62.4 8.45 67.55 13.6 70.75 16.75 72 20.8 72.25 21.6 73 22 73.7 22.35 74.5 22.1 75.3 21.85 75.7 21.15 76.05 20.4 75.8 19.6 74.25 14.65 70.4 10.75 64.1 4.45 55.1 4.45 L 45 4.45 Q 36.05 4.45 29.7 10.75 23.4 17.1 23.4 26 L 23.4 40.7 Q 23.4 41 23.5 41.25 14.7 42.6 14.7 52.7 L 14.7 83.9 Q 14.7 95.55 26.35 95.55 L 73.7 95.55 Q 85.35 95.55 85.35 83.9 M 44 62.2 Q 44.1 62.1 44.25 62 46.6 59.65 50 59.65 53.45 59.65 55.9 62.1 58.3 64.6 58.3 67.95 58.3 71.35 55.95 73.65 55.75 73.8 55.7 73.95 53.35 76.25 50 76.25 46.6 76.25 44.1 73.85 41.7 71.5 41.7 67.95 41.7 64.6 44 62.2 Z"
         id="path7" />
    </g>
  </defs>
  <g
     transform="matrix(1.2828975,0,0,1.2828975,-12.340796,-1.2588939)"
     id="g9">
    <use
       xlink:href="#a"
       id="use11"
       x="0"
       y="0"
       width="100%"
       height="100%" />
  </g>
</svg>
+72 −0
Original line number Diff line number Diff line
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:xlink="http://www.w3.org/1999/xlink"
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
   version="1.1"
   preserveAspectRatio="none"
   x="0px"
   y="0px"
   viewBox="0 0 100 125"
   id="svg2"
   inkscape:version="0.91 r13725"
   sodipodi:docname="noun_424414_cc.svg">
  <metadata
     id="metadata19">
    <rdf:RDF>
      <cc:Work
         rdf:about="">
        <dc:format>image/svg+xml</dc:format>
        <dc:type
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
      </cc:Work>
    </rdf:RDF>
  </metadata>
  <sodipodi:namedview
     pagecolor="#ffffff"
     bordercolor="#666666"
     borderopacity="1"
     objecttolerance="10"
     gridtolerance="10"
     guidetolerance="10"
     inkscape:pageopacity="0"
     inkscape:pageshadow="2"
     inkscape:window-width="1366"
     inkscape:window-height="711"
     id="namedview17"
     showgrid="false"
     inkscape:zoom="1.888"
     inkscape:cx="-30.243644"
     inkscape:cy="62.5"
     inkscape:window-x="0"
     inkscape:window-y="0"
     inkscape:window-maximized="1"
     inkscape:current-layer="svg2" />
  <defs
     id="defs4">
    <g
       id="a">
      <path
         fill="#000000"
         stroke="none"
         d=" M 85.35 83.9 L 85.35 52.7 Q 85.35 42.6 76.65 41.25 76.7 41 76.7 40.7 L 76.7 26 Q 76.7 17.05 70.4 10.75 64.1 4.45 55.1 4.45 L 45 4.45 Q 36.05 4.45 29.7 10.75 23.4 17.1 23.4 26 L 23.4 40.7 Q 23.4 41 23.5 41.25 14.7 42.6 14.7 52.7 L 14.7 83.9 Q 14.7 95.55 26.35 95.55 L 73.7 95.55 Q 85.35 95.55 85.35 83.9 M 45 8.45 L 55.1 8.45 Q 62.4 8.45 67.55 13.6 72.7 18.75 72.7 26 L 72.7 40.7 Q 72.7 40.9 72.75 41.05 L 27.4 41.05 Q 27.4 40.9 27.4 40.7 L 27.4 26 Q 27.4 18.75 32.5 13.6 L 32.55 13.55 Q 37.7 8.45 45 8.45 M 44 62.2 Q 44.1 62.1 44.25 62 46.6 59.65 50 59.65 53.45 59.65 55.9 62.1 58.3 64.6 58.3 67.95 58.3 71.35 55.95 73.65 55.75 73.8 55.7 73.95 53.35 76.25 50 76.25 46.6 76.25 44.1 73.85 41.7 71.5 41.7 67.95 41.7 64.6 44 62.2 Z"
         id="path7" />
    </g>
  </defs>
  <g
     transform="matrix(1.316099,0,0,1.316099,-14.299197,-3.4066404)"
     id="g9">
    <use
       xlink:href="#a"
       id="use11"
       x="0"
       y="0"
       width="100%"
       height="100%" />
  </g>
</svg>
Original line number Diff line number Diff line
<RCC>
  <qresource prefix="icons">
    <file alias="loader">loader.gif</file>
    <file alias="guest_icon">noun_178537_cc.svg</file>
    <file alias="menu_icon">noun_100552_cc.svg</file>
    <file alias="leave_icon">noun_155520_cc.svg</file>
@@ -13,7 +14,7 @@
    <file alias="home_icon">iconmonstr-home-icon.svg</file>
    <file alias="add_account_icon">noun_7440_cc.svg</file>
    <file alias="sakia_logo">logo.svg</file>
    <file alias="ucoin_info_icon">noun_76373_cc.svg</file>
    <file alias="duniter_info_icon">noun_76373_cc.svg</file>
    <file alias="import_icon">noun_62479_cc.svg</file>
    <file alias="network_icon">noun_21549_cc.svg</file>
    <file alias="member_icon">iconmonstr-user-icon.svg</file>
@@ -27,7 +28,7 @@
    <file alias="currency_icon">noun_43022_cc.svg</file>
    <file alias="settings_display_icon">noun_38960_cc.svg</file>
    <file alias="settings_app_icon">noun_42425_cc.svg</file>
    <file alias="settings_network_icon">noun_62146_cc.svg</file>
    <file alias="settings_network_icon">noun_10271_cc.svg</file>
    <file alias="explorer_icon">noun_101791_cc.svg</file>
    <file alias="connected">noun_269788_cc.svg</file>
    <file alias="weak_connect">noun_269792_cc.svg</file>
@@ -42,5 +43,8 @@
    <file alias="dividend">noun_188924_cc.svg</file>
    <file alias="received">noun_188906_cc.svg</file>
    <file alias="sent">noun_188905_cc.svg</file>
    <file alias="lock_open">noun_424413_cc.svg</file>
    <file alias="lock_closed">noun_424414_cc.svg</file>
    <file alias="revokation">noun_169247_cc.svg</file>
  </qresource>
</RCC>
Original line number Diff line number Diff line
[Desktop Entry]
Version=0.53.2
Name=Sakia
Comment=Duniter Qt Client
Exec=sakia
Icon=/opt/sakia/sakia.png
Terminal=false
Type=Application
Categories=Utility;Application;
MimeType=x-scheme-handler/duniter

res/osx/Info.plist

0 → 100644
+30 −0
Original line number Diff line number Diff line
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict><key>CFBundleIdentifier</key>
<string>sakia</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleName</key>
<string>sakia</string>
<key>CFBundleExecutable</key>
<string>MacOS/sakia.bin</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleIconFile</key>
<string>sakia.ico</string>
<key>NSHighResolutionCapable</key>
<string>True</string>
<key>CFBundleDisplayName</key>
<string>sakia</string>
<key>CFBundleShortVersionString</key>
<string>0.0.0</string>
<key>LSBackgroundOnly</key>
<string>False</string>
<key>LSEnvironment</key>
<dict>
<key>LC_ALL</key>
<string>UTF-8</string>
</dict>
</dict>
</plist>

res/ui/account_cfg.ui

deleted100644 → 0
+0 −482

File deleted.

Preview size limit exceeded, changes collapsed.

res/ui/certifications_tab.ui

deleted100644 → 0
+0 −165
Original line number Diff line number Diff line
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>certificationsTabWidget</class>
 <widget class="QWidget" name="certificationsTabWidget">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>481</width>
    <height>456</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Form</string>
  </property>
  <layout class="QVBoxLayout" name="verticalLayout">
   <item>
    <widget class="QGroupBox" name="groupbox_balance">
     <property name="title">
      <string>Certifications</string>
     </property>
     <layout class="QVBoxLayout" name="verticalLayout_4">
      <item>
       <widget class="QLabel" name="label_resume">
        <property name="font">
         <font>
          <pointsize>22</pointsize>
          <weight>75</weight>
          <bold>true</bold>
         </font>
        </property>
        <property name="text">
         <string>loading...</string>
        </property>
        <property name="alignment">
         <set>Qt::AlignHCenter|Qt::AlignTop</set>
        </property>
       </widget>
      </item>
     </layout>
    </widget>
   </item>
   <item>
    <layout class="QVBoxLayout" name="verticalLayout_3">
     <item>
      <layout class="QHBoxLayout" name="horizontalLayout_2">
       <property name="topMargin">
        <number>5</number>
       </property>
       <item>
        <widget class="QDateTimeEdit" name="date_from">
         <property name="displayFormat">
          <string>dd/MM/yyyy</string>
         </property>
         <property name="calendarPopup">
          <bool>true</bool>
         </property>
        </widget>
       </item>
       <item>
        <widget class="QDateTimeEdit" name="date_to">
         <property name="displayFormat">
          <string>dd/MM/yyyy</string>
         </property>
         <property name="calendarPopup">
          <bool>true</bool>
         </property>
        </widget>
       </item>
      </layout>
     </item>
     <item>
      <widget class="QProgressBar" name="progressbar">
       <property name="maximum">
        <number>0</number>
       </property>
       <property name="value">
        <number>-1</number>
       </property>
      </widget>
     </item>
     <item>
      <widget class="QTableView" name="table_history">
       <property name="contextMenuPolicy">
        <enum>Qt::CustomContextMenu</enum>
       </property>
       <property name="alternatingRowColors">
        <bool>true</bool>
       </property>
       <property name="showGrid">
        <bool>true</bool>
       </property>
       <attribute name="horizontalHeaderShowSortIndicator" stdset="0">
        <bool>true</bool>
       </attribute>
       <attribute name="horizontalHeaderStretchLastSection">
        <bool>true</bool>
       </attribute>
       <attribute name="verticalHeaderVisible">
        <bool>false</bool>
       </attribute>
      </widget>
     </item>
    </layout>
   </item>
  </layout>
 </widget>
 <resources>
  <include location="../icons/icons.qrc"/>
 </resources>
 <connections>
  <connection>
   <sender>table_history</sender>
   <signal>customContextMenuRequested(QPoint)</signal>
   <receiver>certificationsTabWidget</receiver>
   <slot>history_context_menu()</slot>
   <hints>
    <hint type="sourcelabel">
     <x>273</x>
     <y>183</y>
    </hint>
    <hint type="destinationlabel">
     <x>830</x>
     <y>802</y>
    </hint>
   </hints>
  </connection>
  <connection>
   <sender>date_from</sender>
   <signal>dateChanged(QDate)</signal>
   <receiver>certificationsTabWidget</receiver>
   <slot>dates_changed()</slot>
   <hints>
    <hint type="sourcelabel">
     <x>102</x>
     <y>28</y>
    </hint>
    <hint type="destinationlabel">
     <x>199</x>
     <y>149</y>
    </hint>
   </hints>
  </connection>
  <connection>
   <sender>date_to</sender>
   <signal>dateChanged(QDate)</signal>
   <receiver>certificationsTabWidget</receiver>
   <slot>dates_changed()</slot>
   <hints>
    <hint type="sourcelabel">
     <x>297</x>
     <y>28</y>
    </hint>
    <hint type="destinationlabel">
     <x>199</x>
     <y>149</y>
    </hint>
   </hints>
  </connection>
 </connections>
 <slots>
  <slot>history_context_menu()</slot>
  <slot>dates_changed()</slot>
 </slots>
</ui>

res/ui/community_cfg.ui

deleted100644 → 0
+0 −330

File deleted.

Preview size limit exceeded, changes collapsed.

res/ui/community_view.ui

deleted100644 → 0
+0 −145

File deleted.

Preview size limit exceeded, changes collapsed.

res/ui/contact.ui

deleted100644 → 0
+0 −128

File deleted.

Preview size limit exceeded, changes collapsed.

res/ui/create_wallet.ui

deleted100644 → 0
+0 −169

File deleted.

Preview size limit exceeded, changes collapsed.

res/ui/currency_tab.ui

deleted100644 → 0
+0 −52

File deleted.

Preview size limit exceeded, changes collapsed.

res/ui/explorer_tab.ui

deleted100644 → 0
+0 −95

File deleted.

Preview size limit exceeded, changes collapsed.

res/ui/homescreen.ui

deleted100644 → 0
+0 −197

File deleted.

Preview size limit exceeded, changes collapsed.

res/ui/import_account.ui

deleted100644 → 0
+0 −135

File deleted.

Preview size limit exceeded, changes collapsed.

res/ui/password_asker.ui

deleted100644 → 0
+0 −85

File deleted.

Preview size limit exceeded, changes collapsed.

res/ui/transactions_tab.ui

deleted100644 → 0
+0 −123

File deleted.

Preview size limit exceeded, changes collapsed.

res/ui/transfer.ui

deleted100644 → 0
+0 −312

File deleted.

Preview size limit exceeded, changes collapsed.

res/ui/wallets_tab.ui

deleted100644 → 0
+0 −129

File deleted.

Preview size limit exceeded, changes collapsed.

+49 −19

File changed.

Preview size limit exceeded, changes collapsed.

sakia.svg

0 → 100644
+227 −0

File added.

Preview size limit exceeded, changes collapsed.

+101 −15

File changed.

Preview size limit exceeded, changes collapsed.

File changed.

Preview size limit exceeded, changes collapsed.

src/sakia/app.py

0 → 100644
+348 −0

File added.

Preview size limit exceeded, changes collapsed.

src/sakia/constants.py

0 → 100644
+14 −0

File added.

Preview size limit exceeded, changes collapsed.

src/sakia/core/__init__.py

deleted100644 → 0
+0 −4

File deleted.

Preview size limit exceeded, changes collapsed.

src/sakia/core/account.py

deleted100644 → 0
+0 −608

File deleted.

Preview size limit exceeded, changes collapsed.

src/sakia/core/app.py

deleted100644 → 0
+0 −550

File deleted.

Preview size limit exceeded, changes collapsed.

src/sakia/core/community.py

deleted100644 → 0
+0 −333

File deleted.

Preview size limit exceeded, changes collapsed.

src/sakia/core/config.py

deleted100644 → 0
+0 −54

File deleted.

Preview size limit exceeded, changes collapsed.

src/sakia/core/net/node.py

deleted100644 → 0
+0 −641

File deleted.

Preview size limit exceeded, changes collapsed.

src/sakia/core/transfer.py

deleted100644 → 0
+0 −371

File deleted.

Preview size limit exceeded, changes collapsed.

src/sakia/core/txhistory.py

deleted100644 → 0
+0 −413

File deleted.

Preview size limit exceeded, changes collapsed.

src/sakia/core/wallet.py

deleted100644 → 0
+0 −389

File deleted.

Preview size limit exceeded, changes collapsed.

src/sakia/errors.py

0 → 100644
+67 −0

File added.

Preview size limit exceeded, changes collapsed.

src/sakia/gui/contact.py

deleted100644 → 0
+0 −95

File deleted.

Preview size limit exceeded, changes collapsed.

src/sakia/gui/homescreen.py

deleted100644 → 0
+0 −101

File deleted.

Preview size limit exceeded, changes collapsed.

src/sakia/gui/mainwindow.py

deleted100644 → 0
+0 −449

File deleted.

Preview size limit exceeded, changes collapsed.

src/sakia/gui/member.py

deleted100644 → 0
+0 −155

File deleted.

Preview size limit exceeded, changes collapsed.

src/sakia/gui/transfer.py

deleted100644 → 0
+0 −226

File deleted.

Preview size limit exceeded, changes collapsed.

src/sakia/helpers.py

0 → 100644
+59 −0

File added.

Preview size limit exceeded, changes collapsed.

+174 −32

File changed.

Preview size limit exceeded, changes collapsed.

src/sakia/models/network.py

deleted100644 → 0
+0 −242

File deleted.

Preview size limit exceeded, changes collapsed.

src/sakia/models/wallets.py

deleted100644 → 0
+0 −147

File deleted.

Preview size limit exceeded, changes collapsed.

src/sakia/options.py

0 → 100644
+120 −0

File added.

Preview size limit exceeded, changes collapsed.

tests/__init__.py

0 → 100644
+0 −0
Original line number Diff line number Diff line

tests/conftest.py

0 → 100644
+368 −0

File added.

Preview size limit exceeded, changes collapsed.

tests/helpers.py

0 → 100644
+27 −0

File added.

Preview size limit exceeded, changes collapsed.

ubuntu_packages.sh

0 → 100755
+4 −0

File added.

Preview size limit exceeded, changes collapsed.

update_license.sh

0 → 100755
+7 −0

File added.

Preview size limit exceeded, changes collapsed.

+2 −1

File changed.

Preview size limit exceeded, changes collapsed.