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
  • Docker-debian9
  • Docker
  • dev
  • fixappveyor
  • gitlab
  • master
  • 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
Show changes
229 files
+ 22442
26183
Compare changes
  • Side-by-side
  • Inline

Files

+7 −1
Original line number Diff line number Diff line
@@ -49,3 +49,9 @@ out
.directory
temp
*_uic.py

# mypy
.mypy_cache

# pyenv
/.python-version
+79 −47
Original line number Diff line number Diff line
stages:
  - github-sync
  - prepare
  - format
  - tests
  - build
  - test
  - release

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

image: registry.duniter.org/docker/python3/duniterpy-builder:0.0.5

push_to_github:
  stage: github-sync
  variables:
    GIT_STRATEGY: none
# SUB-TASKS
.push_to_github:
  tags:
    - github
  script:
  after_script:
    # remove all files in current repo
    - rm -rf ./*
    - rm -rf .git
    - 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"
    # Job would fail if we don't remove refs about pull requests
    - bash -c "cat packed-refs | grep -v 'refs/pull' > packed-refs-new; echo 'Removed pull refs.'"
    # 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 $?"

.pyenv: &pyenv
  tags:
    - redshift-docker-python
  before_script:
    - export PYENV_ROOT="$HOME/.pyenv"
    - export PATH="$PYENV_ROOT/bin:$PATH"
    - eval "$(pyenv init -)"
    - pyenv shell $PYENV_PYTHON_VERSION
.changes:
  only:
    changes:
      - src/sakia/*
      - .gitlab-ci.yml
      - Makefile
      - requirements_dev.txt
      - requirements_deploy.txt
      - requirements.txt
      - setup.py
      - tests/**/*.py

.qt5: &qt5
  tags:
    - redshift-docker-python
  before_script:
    - export PATH=/opt/qt/5.9/5.9/gcc_64/bin:$PATH
# 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: &build
  <<: *pyenv
build:
  extends:
    - .changes
  stage: build
  script:
    - pip install -r requirements.txt
    - python gen_resources.py
    - python gen_translations.py --lrelease
    - python setup.py sdist bdist_wheel
    - py.test
test:
  <<: *pyenv
  stage: test
    - 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 coveralls
    - pip install -r requirements.txt
    - python gen_resources.py
    - python gen_translations.py --lrelease
    - py.test --cov=sakia tests/
    - pip install -r requirements_deploy.txt
    - make build
    - make deploy PYPI_LOGIN=${PYPI_LOGIN} PYPI_PASSWORD=${PYPI_PASSWORD}
  only:
    - master

releases:
  <<: *pyenv
release_pypi_test:
  stage: release
  when: manual
  only: [tags, dev]
  script:
    - pip install -r requirements.txt
    - pip install wheel
    - pip install twine
    - python setup.py sdist bdist_wheel
    - twine upload dist/* --username duniter --password $PYPI_PASSWORD
    - pip install -r requirements_deploy.txt
    - make build
    - make deploy_test PYPI_TEST_LOGIN=${PYPI_TEST_LOGIN} PYPI_TEST_PASSWORD=${PYPI_TEST_PASSWORD}

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/
+126 −36
Original line number Diff line number Diff line
<!-- Landscape | [![Code Health](https://landscape.io/github/duniter/sakia/dev/landscape.svg?style=flat)](https://landscape.io/github/duniter/sakia/dev) -->
![sakia logo](https://git.duniter.org/clients/python/sakia/-/raw/master/sakia.png)

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

Vit thanks Inso for this wonderful project, and every enthusiast users.

# Sakia
[![Coverage Status](https://coveralls.io/repos/duniter/sakia/badge.svg?branch=dev)](https://coveralls.io/r/duniter/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)
 [![Translation status](http://weblate.duniter.org/widgets/sakia/-/svg-badge.svg)](http://weblate.duniter.org/engage/sakia/?utm_source=widget)
 [![Code Issues](https://www.quantifiedcode.com/api/v1/project/3fff212226eb4027a586bc32e32d909b/badge.svg)](https://www.quantifiedcode.com/app/project/3fff212226eb4027a586bc32e32d909b)

========

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


## Goal features
  * duniter 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
@@ -36,26 +24,128 @@ Python3 and PyQt5 Client for [duniter](http://www.duniter.org) 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 :
   * __duniterpy__

  * General tips : use pyenv to build sakia, as described in the [wiki](https://github.com/duniter/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/duniter/sakia/releases)
  * Download corresponding package to your operating system
  * Unzip and start "sakia" :)
  * Join our beta community by contacting us on [duniter forum](http://forum.duniter.org/)
  * 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/duniter/sakia/dev/LICENSE).
This software is distributed under [GNU GPLv3](https://www.gnu.org/licenses/gpl-3.0.html).
+1 −4
Original line number Diff line number Diff line
@@ -29,9 +29,7 @@ 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
  - "%CMD_IN_ENV% conda config --set always_yes yes --set changeps1 no"
@@ -70,4 +68,3 @@ deploy:
  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 "$@"
Original line number Diff line number Diff line
@@ -19,8 +19,10 @@ 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
+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%
Original line number Diff line number Diff line
@@ -15,7 +15,7 @@
#error "Unable to find MyAppExe"
#endif

#define MyAppVerStr "0.32.10post1"
#define MyAppVerStr "0.53.2"

[Setup]
AppName={#MyAppName}
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

Original line number Diff line number Diff line
@@ -29,7 +29,7 @@ then
            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 --script $HOME/build/duniter/sakia/ci/travis/qt-installer-noninteractive.qs
    ./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
Original line number Diff line number Diff line
Package: sakia
Version: 0.32.10post1
Version: 0.53.2
Section: misc
Priority: optional
Architecture: all
Original line number Diff line number Diff line
@@ -26,9 +26,9 @@ Controller.prototype.TargetDirectoryPageCallback = function()
}

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
@@ -10,8 +10,8 @@ cd ~/projects/sakia_dev

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

### Fix Qt link
@@ -21,32 +21,29 @@ sudo ln -s /usr/bin/lrelease-qt5 /usr/bin/lrelease

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

if [ $1 == "dev" ]; then
        cd sakia_dev
        git pull
        python3 gen_resources.py
        python3 gen_translations.py
        python3 src/sakia/main.py -d
        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" >> run_sakia.sh
fi" >> $HOME/run_sakia.sh
```

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

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

## Install dependencies
@@ -68,9 +65,3 @@ sudo pip3 install --upgrade duniterpy
```bash
sudo pip3 install pyinstaller
```

### Previous dependencies no more needed
```bash
#qtchooser qt5-qtbase-devel qt5-qtsvg-devel openssl-devel \
#zfstream-devel readline-devel sqlite-devel gcc-c++ qt5-qtsvg
```
Original line number Diff line number Diff line
@@ -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()
+4 −3
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*)\'"`
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/__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
  git commit src/sakia/__init__.py ci/appveyor/sakia.iss ci/travis/debian/DEBIAN/control res/linux/usr/share/applications/sakia.desktop -m "$1"
  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"
+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
+1353 −3467

File changed.

Preview size limit exceeded, changes collapsed.

+1290 −2474

File changed.

Preview size limit exceeded, changes collapsed.

+1289 −2696

File changed.

Preview size limit exceeded, changes collapsed.

+1529 −3476

File changed.

Preview size limit exceeded, changes collapsed.

+1216 −2640

File changed.

Preview size limit exceeded, changes collapsed.

+1225 −2304

File changed.

Preview size limit exceeded, changes collapsed.

+1229 −2559

File changed.

Preview size limit exceeded, changes collapsed.

+1245 −1515

File changed.

Preview size limit exceeded, changes collapsed.

+1 −1
Original line number Diff line number Diff line
@@ -81,7 +81,7 @@ else:
              debug=True,
              strip=False,
              upx=True,
              console=True,
              console=False,
              icon='sakia.ico')


+15 −2
Original line number Diff line number Diff line
from setuptools import setup, find_packages
import os
import re
import subprocess
import sys
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), 'src')))
import sakia
@@ -26,11 +27,22 @@ def which(program):

    return None



path = os.path.abspath(os.path.join(os.path.dirname(__file__)))

subprocess.call(
    "python {0}/gen_resources.py".format(path), shell=True
)
subprocess.call(
    "python {0}/gen_translations.py".format(path), shell=True
)

EDITABLE_REQUIREMENT = re.compile(r'^-e (?P<link>(?P<vcs>git|svn|hg|bzr).+#egg=(?P<package>.+)-(?P<version>\d(?:\.\d)*))$')

install_requires = []
dependency_links = []
data_files = [('sakia', ['src/sakia/root_servers.yml', 'src/sakia/g1_licence.html'])]
data_files = [('sakia', ['src/sakia/root_servers.yml', 'src/sakia/g1_license.html'])]

for requirement in (l.strip() for l in open('requirements.txt')):
    match = EDITABLE_REQUIREMENT.match(requirement)
@@ -61,6 +73,7 @@ setup(
    description="A [duniter](https://github.com/duniter/duniter) Python client",

    long_description=open('README.md').read(),
    long_description_content_type="text/markdown",

    # Active la prise en compte du fichier MANIFEST.in
    include_package_data=True,
Original line number Diff line number Diff line
__version_info__ = ('0', '32', '10post1')
__version__ = '.'.join(__version_info__)
__version_info__ = ("0", "53", "2")
__version__ = ".".join(__version_info__)
+190 −73
Original line number Diff line number Diff line
import os
import shutil

import attr
import datetime
import logging
import socket

import yaml

import sakia.i18n_rc
import async_timeout
import aiohttp
from PyQt5.QtCore import QObject, pyqtSignal, QTranslator, QCoreApplication, QLocale, Qt
from PyQt5.QtCore import (
    QObject,
    pyqtSignal,
    QTranslator,
    QCoreApplication,
    QLocale,
    Qt,
    QFile,
)
from . import __version__
from .options import SakiaOptions
from sakia.constants import GITLAB_RELEASES_API_URL, GITLAB_RELEASES_PAGE_URL
from sakia.options import SakiaOptions
from sakia.data.connectors import BmaConnector
from sakia.services import NetworkService, BlockchainService, IdentitiesService, \
    SourcesServices, TransactionsService, DocumentsService
from sakia.services import (
    NetworkService,
    BlockchainService,
    IdentitiesService,
    SourcesServices,
    TransactionsService,
    DocumentsService,
)
from sakia.data.repositories import SakiaDatabase
from sakia.data.entities import Transaction, Connection, Identity, Dividend
from sakia.data.processors import BlockchainProcessor, NodesProcessor, IdentitiesProcessor, \
    CertificationsProcessor, SourcesProcessor, TransactionsProcessor, ConnectionsProcessor, DividendsProcessor
from sakia.data.processors import (
    BlockchainProcessor,
    NodesProcessor,
    IdentitiesProcessor,
    CertificationsProcessor,
    SourcesProcessor,
    TransactionsProcessor,
    ConnectionsProcessor,
    DividendsProcessor,
)
from sakia.data.files import AppDataFile, UserParametersFile, PluginsDirectory
from sakia.decorators import asyncify
from sakia.money import *
@@ -61,10 +90,11 @@ class Application(QObject):
    loop = attr.ib()
    options = attr.ib()
    app_data = attr.ib()
    parameters = attr.ib()
    db = attr.ib()
    currency = attr.ib()
    plugins_dir = attr.ib()
    root_servers = attr.ib(default=None)
    parameters = attr.ib(default=None)
    db = attr.ib(default=None)
    currency = attr.ib(default=None)
    plugins_dir = attr.ib(default=None)
    network_service = attr.ib(default=None)
    blockchain_service = attr.ib(default=None)
    identities_service = attr.ib(default=None)
@@ -72,9 +102,10 @@ class Application(QObject):
    transactions_service = attr.ib(default=None)
    documents_service = attr.ib(default=None)
    current_ref = attr.ib(default=Quantitative)
    _logger = attr.ib(default=attr.Factory(lambda:logging.getLogger('sakia')))
    _logger = attr.ib(default=attr.Factory(lambda: logging.getLogger("sakia")))
    available_version = attr.ib(init=False)
    _translator = attr.ib(init=False)
    _qt_translator = attr.ib(init=False)

    def __attrs_post_init__(self):
        super().__init__()
@@ -86,21 +117,56 @@ class Application(QObject):
        qapp.setAttribute(Qt.AA_EnableHighDpiScaling, True)
        options = SakiaOptions.from_arguments(argv)
        app_data = AppDataFile.in_config_path(options.config_path).load_or_init()
        app = cls(qapp, loop, options, app_data, None, None, options.currency, None)
        app = cls(
            qapp, loop, options, app_data, None, None, None, options.currency, None
        )
        app.load_root_servers()
        # app.set_proxy()
        app.load_profile(options.profile)
        app.documents_service = DocumentsService.instanciate(app)
        app.switch_language()
        return app

    def load_root_servers(self):
        """
        Load root servers config

        :return:
        """
        filename = "root_servers.yml"
        root_servers_default_path = os.path.join(os.path.dirname(__file__), filename)
        root_servers_config_path = os.path.join(self.options.config_path, filename)
        self._logger.debug(
            "Check root servers config file: {}...".format(root_servers_config_path)
        )
        if not os.path.exists(root_servers_config_path):
            self._logger.debug(
                "Create root servers config file: {}".format(root_servers_config_path)
            )
            shutil.copy(root_servers_default_path, root_servers_config_path)

        self._logger.debug(
            "Load root servers config file: {}".format(root_servers_config_path)
        )
        with open(
            root_servers_config_path,
            "r",
            encoding="utf-8",
        ) as stream:
            self.root_servers = yaml.load(stream, Loader=yaml.FullLoader)

    def load_profile(self, profile_name):
        """
        Initialize databases depending on profile loaded
        :param profile_name:
        :return:
        """
        self.plugins_dir = PluginsDirectory.in_config_path(self.options.config_path, profile_name).load_or_init(self.options.with_plugin)
        self.parameters = UserParametersFile.in_config_path(self.options.config_path, profile_name).load_or_init(profile_name)
        self.plugins_dir = PluginsDirectory.in_config_path(
            self.options.config_path, profile_name
        ).load_or_init(self.options.with_plugin)
        self.parameters = UserParametersFile.in_config_path(
            self.options.config_path, profile_name
        ).load_or_init(profile_name)
        self.db = SakiaDatabase.load_or_init(self.options, profile_name)

        self.instanciate_services()
@@ -109,52 +175,87 @@ class Application(QObject):
        nodes_processor = NodesProcessor(self.db.nodes_repo)
        bma_connector = BmaConnector(nodes_processor, self.parameters)
        connections_processor = ConnectionsProcessor(self.db.connections_repo)
        identities_processor = IdentitiesProcessor(self.db.identities_repo, self.db.certifications_repo, self.db.blockchains_repo, bma_connector)
        certs_processor = CertificationsProcessor(self.db.certifications_repo, self.db.identities_repo, bma_connector)
        identities_processor = IdentitiesProcessor(
            self.db.identities_repo,
            self.db.certifications_repo,
            self.db.blockchains_repo,
            bma_connector,
        )
        certs_processor = CertificationsProcessor(
            self.db.certifications_repo, self.db.identities_repo, bma_connector
        )
        blockchain_processor = BlockchainProcessor.instanciate(self)
        sources_processor = SourcesProcessor.instanciate(self)
        transactions_processor = TransactionsProcessor.instanciate(self)
        dividends_processor = DividendsProcessor.instanciate(self)
        nodes_processor.initialize_root_nodes(self.currency)
        nodes_processor.initialize_root_nodes(self.currency, self.root_servers)
        self.db.commit()

        self.documents_service = DocumentsService.instanciate(self)
        self.identities_service = IdentitiesService(self.currency, connections_processor,
        self.identities_service = IdentitiesService(
            self.currency,
            connections_processor,
            identities_processor,
                                                    certs_processor, blockchain_processor,
                                                    bma_connector)
            certs_processor,
            blockchain_processor,
            bma_connector,
        )

        self.transactions_service = TransactionsService(self.currency, transactions_processor,
        self.transactions_service = TransactionsService(
            self.currency,
            transactions_processor,
            dividends_processor,
                                                                   identities_processor, connections_processor,
                                                                   bma_connector)
            identities_processor,
            connections_processor,
            bma_connector,
        )

        self.sources_service = SourcesServices(self.currency, sources_processor,
                                               connections_processor, transactions_processor,
                                               blockchain_processor, bma_connector)
        self.sources_service = SourcesServices(
            self.currency,
            sources_processor,
            connections_processor,
            transactions_processor,
            blockchain_processor,
            bma_connector,
        )

        self.blockchain_service = BlockchainService(self, self.currency, blockchain_processor, connections_processor,
        self.blockchain_service = BlockchainService(
            self,
            self.currency,
            blockchain_processor,
            connections_processor,
            bma_connector,
            self.identities_service,
            self.transactions_service,
                                                    self.sources_service)
            self.sources_service,
        )

        self.network_service = NetworkService.load(self, self.currency, nodes_processor,
        self.network_service = NetworkService.load(
            self,
            self.currency,
            nodes_processor,
            self.blockchain_service,
                                                    self.identities_service)
            self.identities_service,
        )

    async def remove_connection(self, connection):
        connections_processor = ConnectionsProcessor.instanciate(self)
        connections_processor.remove_connections(connection)

        CertificationsProcessor.instanciate(self).cleanup_connection(connection, connections_processor.pubkeys())
        CertificationsProcessor.instanciate(self).cleanup_connection(
            connection, connections_processor.pubkeys()
        )
        IdentitiesProcessor.instanciate(self).cleanup_connection(connection)

        SourcesProcessor.instanciate(self).drop_all_of(currency=connection.currency, pubkey=connection.pubkey)
        SourcesProcessor.instanciate(self).drop_all_of(
            currency=connection.currency, pubkey=connection.pubkey
        )

        DividendsProcessor.instanciate(self).cleanup_connection(connection)

        TransactionsProcessor.instanciate(self).cleanup_connection(connection, connections_processor.pubkeys())
        TransactionsProcessor.instanciate(self).cleanup_connection(
            connection, connections_processor.pubkeys()
        )

        self.db.commit()
        self.connection_removed.emit(connection)
@@ -171,13 +272,26 @@ class Application(QObject):
        self._translator = QTranslator(self.qapp)
        if locale == "en":
            QCoreApplication.installTranslator(self._translator)
        elif self._translator.load(":/i18n/{0}".format(locale)):
        else:
            # load chosen language
            filepath = ":/i18n/{0}".format(locale)
            if not QFile.exists(filepath):
                self._logger.debug("File not found: {0}".format(filepath))
            self._translator.load(filepath)
            if QCoreApplication.installTranslator(self._translator):
                self._logger.debug("Loaded i18n/{0}".format(locale))
                self._logger.debug("Loaded {0}".format(filepath))
            else:
                self._logger.debug("Couldn't load translation")
                self._logger.debug("Couldn't load {0}".format(filepath))
            # load standardButtons Qt translation
            filepath = ":/i18n/qtbase_{0}".format(locale)
            if not QFile.exists(filepath):
                self._logger.debug("File not found: {0}".format(filepath))
            self._qt_translator = QTranslator(self.qapp)
            self._qt_translator.load(filepath)
            if QCoreApplication.installTranslator(self._qt_translator):
                self._logger.debug("Loaded {0}".format(filepath))
            else:
            self._logger.debug("Couldn't load i18n/{0}".format(locale))
                self._logger.debug("Couldn't load {0}".format(filepath))

    def start_coroutines(self):
        self.network_service.start_coroutines()
@@ -195,33 +309,36 @@ class Application(QObject):
        try:
            async with aiohttp.ClientSession() as session:
                async with async_timeout.timeout(10):
                    response = await session.get("https://api.github.com/repos/duniter/sakia/releases",
                                                 proxy=self.parameters.proxy())
                    response = await session.get(
                        GITLAB_RELEASES_API_URL,
                        proxy=self.parameters.proxy(),
                    )
                    if response.status == 200:
                        releases = await response.json()
                        latest = None
                        for r in releases:
                            if not latest:
                                latest = r
                            else:
                                latest_date = datetime.datetime.strptime(latest['published_at'], "%Y-%m-%dT%H:%M:%SZ")
                                date = datetime.datetime.strptime(r['published_at'], "%Y-%m-%dT%H:%M:%SZ")
                                if latest_date < date:
                                    latest = r
                        latest_version = latest["tag_name"]
                        version = (__version__ == latest_version,

                        if len(releases) > 0:
                            release = releases[0]
                            latest_version = release["tag_name"]
                            version = (
                                __version__ == latest_version,
                                latest_version,
                                   latest["html_url"])
                                GITLAB_RELEASES_PAGE_URL,
                            )
                            logging.debug("Found version: {0}".format(latest_version))
                            logging.debug("Current version: {0}".format(__version__))
                            self.available_version = version
        except (aiohttp.ClientError, aiohttp.ServerDisconnectedError, asyncio.TimeoutError, socket.gaierror) as e:
            self._logger.debug("Could not connect to github : {0}".format(str(e)))
        except (
            aiohttp.ClientError,
            aiohttp.ServerDisconnectedError,
            asyncio.TimeoutError,
            socket.gaierror,
        ) as e:
            self._logger.debug("Could not connect to gitlab: {0}".format(str(e)))

    def save_parameters(self, parameters):
        self.parameters = UserParametersFile\
            .in_config_path(self.options.config_path, parameters.profile_name)\
            .save(parameters)
        self.parameters = UserParametersFile.in_config_path(
            self.options.config_path, parameters.profile_name
        ).save(parameters)

    def change_referential(self, index):
        self.current_ref = Referentials[index]
Original line number Diff line number Diff line
import os
import yaml

MAX_CONFIRMATIONS = 6

with open(os.path.join(os.path.dirname(__file__), "root_servers.yml"), 'r') as stream:
    ROOT_SERVERS = yaml.load(stream)
with open(
    os.path.join(os.path.dirname(__file__), "g1_license.html"), "r", encoding="utf-8"
) as stream:
    G1_LICENSE = stream.read()

with open(os.path.join(os.path.dirname(__file__), "g1_licence.html"), 'r') as stream:
    G1_LICENCE = stream.read()
GITLAB_RELEASES_PAGE_URL = "https://git.duniter.org/clients/python/sakia/-/releases"
GITLAB_RELEASES_API_URL = (
    "https://git.duniter.org/api/v4/projects/clients%2Fpython%2Fsakia/releases"
)
GITLAB_NEW_ISSUE_PAGE_URL = "https://git.duniter.org/clients/python/sakia/-/issues/new"
Original line number Diff line number Diff line
@@ -4,10 +4,10 @@ from duniterpy.documents import block_uid, BlockUID

@attr.s(hash=True)
class Certification:
    currency = attr.ib(convert=str)
    certifier = attr.ib(convert=str)
    certified = attr.ib(convert=str)
    block = attr.ib(convert=int)
    timestamp = attr.ib(convert=int, cmp=False)
    signature = attr.ib(convert=str, cmp=False, hash=False)
    written_on = attr.ib(convert=int, default=-1, cmp=False, hash=False)
    currency = attr.ib(converter=str)
    certifier = attr.ib(converter=str)
    certified = attr.ib(converter=str)
    block = attr.ib(converter=int)
    timestamp = attr.ib(converter=int, cmp=False)
    signature = attr.ib(converter=str, cmp=False, hash=False)
    written_on = attr.ib(converter=int, default=-1, cmp=False, hash=False)
Original line number Diff line number Diff line
@@ -7,5 +7,3 @@ from .sources import SourcesProcessor
from .transactions import TransactionsProcessor
from .dividends import DividendsProcessor
from .contacts import ContactsProcessor

File changed.

Preview size limit exceeded, changes collapsed.

src/sakia/g1_licence.html

deleted100644 → 0
+0 −60

File deleted.

Preview size limit exceeded, changes collapsed.

File changed.

Preview size limit exceeded, changes collapsed.

+94 −40

File changed.

Preview size limit exceeded, changes collapsed.

File changed.

Preview size limit exceeded, changes collapsed.

+182 −103

File changed.

Preview size limit exceeded, changes collapsed.

File changed.

Preview size limit exceeded, changes collapsed.

ubuntu_packages.sh

0 → 100755
+4 −0

File added.

Preview size limit exceeded, changes collapsed.

update_licence.sh

deleted100755 → 0
+0 −7

File deleted.

Preview size limit exceeded, changes collapsed.

update_license.sh

0 → 100755
+7 −0

File added.

Preview size limit exceeded, changes collapsed.

+1 −1

File changed.

Preview size limit exceeded, changes collapsed.