Merge "origin/master" into "philip/bump-test-coverage"
This commit is contained in:
commit
5ed8bd6e54
117
CONTRIBUTING_CORE.md
Normal file
117
CONTRIBUTING_CORE.md
Normal file
@ -0,0 +1,117 @@
|
|||||||
|
# CORE TEAM CONTRIBUTION GUIDE
|
||||||
|
|
||||||
|
# 1. Transparency
|
||||||
|
|
||||||
|
1.1 Use work logs for reflection of work done, aswell as telling your peers about changes that may affect their own tasks
|
||||||
|
|
||||||
|
1.2 A work log SHOULD be submitted after a "unit of work" is complete.
|
||||||
|
|
||||||
|
1.2.1 A "unit of work" should not span more than one full day's worth of work.
|
||||||
|
|
||||||
|
1.2.2 A "unit of work" should be small enough that the log entries give useful insight.
|
||||||
|
|
||||||
|
1.3 Individual logs are reviewed in weekly meetings
|
||||||
|
|
||||||
|
<!--1.4 Bullet point list of topics and one or more sub-points describing each item in short sentences, eg;
|
||||||
|
|
||||||
|
```
|
||||||
|
- Core
|
||||||
|
* fixed foo
|
||||||
|
* fixed bar
|
||||||
|
- Frontend
|
||||||
|
* connected bar to baz
|
||||||
|
|
||||||
|
```-->
|
||||||
|
|
||||||
|
1.4 Work log format is defined in []()
|
||||||
|
|
||||||
|
1.5 Link to issue/MR in bullet point where appropriate
|
||||||
|
|
||||||
|
1.6
|
||||||
|
|
||||||
|
|
||||||
|
# 2. Code hygiene
|
||||||
|
|
||||||
|
2.1 Keep function names and variable names short
|
||||||
|
|
||||||
|
2.2 Keep code files, functions and test fixtures short
|
||||||
|
|
||||||
|
2.3 The less magic the better. Recombinable and replaceable is king
|
||||||
|
|
||||||
|
2.4 Group imports by `standard`, `external`, `local`, `test` - in that order
|
||||||
|
|
||||||
|
2.5 Only auto-import when necessary, and always with a minimum of side-effects
|
||||||
|
|
||||||
|
2.6 Use custom errors. Let them bubble up
|
||||||
|
|
||||||
|
2.7 No logs in tight loops
|
||||||
|
|
||||||
|
2.8 Keep executable main routine minimal. Pass variables (do not use globals) in main business logic function
|
||||||
|
|
||||||
|
2.9 Test coverage MUST be kept higher than 90% after changes
|
||||||
|
|
||||||
|
2.10 Docstrings. Always. Always!
|
||||||
|
|
||||||
|
|
||||||
|
# 3. Versioning
|
||||||
|
|
||||||
|
3.1 Use [Semantic Versioning](https://semver.org/)
|
||||||
|
|
||||||
|
3.2 When merging code, explicit dependencies SHOULD NOT use pre-release version
|
||||||
|
|
||||||
|
|
||||||
|
# 4. Issues
|
||||||
|
|
||||||
|
4.1 Issue title should use [Convention Commit structure](https://www.conventionalcommits.org/en/v1.0.0-beta.2/)
|
||||||
|
|
||||||
|
4.2 Issues need proper problem statement
|
||||||
|
|
||||||
|
4.2.1. What is the current state
|
||||||
|
|
||||||
|
4.2.2. If current state is not behaving as expected, what was the expected state
|
||||||
|
|
||||||
|
4.2.3. What is the desired new state.
|
||||||
|
|
||||||
|
4.3 Issues need proper resolution statement
|
||||||
|
|
||||||
|
4.3.1. Bullet point list of short sentences describing practical steps to reach desired state
|
||||||
|
|
||||||
|
4.3.2. Builet point list of external resources informing the issue and resolution
|
||||||
|
|
||||||
|
4.4 Tasks needs to be appropriately labelled using GROUP labels.
|
||||||
|
|
||||||
|
|
||||||
|
# 5. Code submission
|
||||||
|
|
||||||
|
5.1 A branch and new MR is always created BEFORE THE WORK STARTS
|
||||||
|
|
||||||
|
5.2 An MR should solve ONE SINGLE PART of a problem
|
||||||
|
|
||||||
|
5.3 Every MR should have at least ONE ISSUE associated with it. Ideally issue can be closed when MR is merged
|
||||||
|
|
||||||
|
5.4 MRs should not be open for more than one week (during normal operation periods)
|
||||||
|
|
||||||
|
5.5 MR should ideally not be longer than 400 lines of changes of logic
|
||||||
|
|
||||||
|
5.6 MRs that MOVE or DELETE code should not CHANGE that same code in a single MR. Scope MOVEs and DELETEs in separate commits (or even better, separate MRs) for transparency
|
||||||
|
|
||||||
|
|
||||||
|
# 6. Code reviews
|
||||||
|
|
||||||
|
6.1 At least one peer review before merge
|
||||||
|
|
||||||
|
6.2 If MR is too long, evaluate whether this affects the quality of the review negatively. If it does, expect to be asked to split it up
|
||||||
|
|
||||||
|
6.3 Evaluate changes against associated issues' problem statement and proposed resolution steps. If there is a mismatch, either MR needs to change or issue needs to be amended accordingly
|
||||||
|
|
||||||
|
6.4 Make sure all technical debt introduced by MR is documented in issues. Add them according to criteria in section ISSUES if not
|
||||||
|
|
||||||
|
6.5 If CI is not working, reviewer MUST make sure code builds and runs
|
||||||
|
|
||||||
|
6.6 Behave!
|
||||||
|
|
||||||
|
6.6.1 Don't be a jerk
|
||||||
|
|
||||||
|
6.6.2 Don't block needlessly
|
||||||
|
|
||||||
|
6.6.3 Say please
|
@ -61,6 +61,10 @@ class BaseTask(celery.Task):
|
|||||||
return self.min_fee_limit
|
return self.min_fee_limit
|
||||||
|
|
||||||
|
|
||||||
|
def get_min_fee_limit(self, code):
|
||||||
|
return self.min_fee_limit
|
||||||
|
|
||||||
|
|
||||||
def create_session(self):
|
def create_session(self):
|
||||||
return BaseTask.session_func()
|
return BaseTask.session_func()
|
||||||
|
|
||||||
|
@ -31,7 +31,7 @@ from cic_ussd.cache import cache_data_key, cache_data, get_cached_data
|
|||||||
from cic_ussd.db.models.account import Account
|
from cic_ussd.db.models.account import Account
|
||||||
from cic_ussd.metadata import PersonMetadata
|
from cic_ussd.metadata import PersonMetadata
|
||||||
from cic_ussd.phone_number import Support
|
from cic_ussd.phone_number import Support
|
||||||
from cic_ussd.processor.util import parse_person_metadata, ussd_menu_list
|
from cic_ussd.processor.util import parse_person_metadata, ussd_menu_list, wait_for_session_data
|
||||||
from cic_ussd.session.ussd_session import save_session_data
|
from cic_ussd.session.ussd_session import save_session_data
|
||||||
from cic_ussd.state_machine.logic.language import preferred_langauge_from_selection
|
from cic_ussd.state_machine.logic.language import preferred_langauge_from_selection
|
||||||
from cic_ussd.translation import translation_for
|
from cic_ussd.translation import translation_for
|
||||||
@ -71,6 +71,7 @@ class MenuProcessor:
|
|||||||
preferred_language=preferred_language,
|
preferred_language=preferred_language,
|
||||||
available_balance=available_balance,
|
available_balance=available_balance,
|
||||||
token_symbol=token_symbol)
|
token_symbol=token_symbol)
|
||||||
|
|
||||||
adjusted_balance = json.loads(adjusted_balance)
|
adjusted_balance = json.loads(adjusted_balance)
|
||||||
|
|
||||||
tax_wei = to_wei(decimals, int(available_balance)) - int(adjusted_balance)
|
tax_wei = to_wei(decimals, int(available_balance)) - int(adjusted_balance)
|
||||||
@ -279,8 +280,7 @@ class MenuProcessor:
|
|||||||
logg.info(f'Not retrieving adjusted balance, available balance: {available_balance} is insufficient.')
|
logg.info(f'Not retrieving adjusted balance, available balance: {available_balance} is insufficient.')
|
||||||
else:
|
else:
|
||||||
timestamp = int((now - timedelta(30)).timestamp())
|
timestamp = int((now - timedelta(30)).timestamp())
|
||||||
adjusted_balance = get_adjusted_balance(to_wei(decimals, int(available_balance)), chain_str, timestamp,
|
adjusted_balance = get_adjusted_balance(to_wei(decimals, int(available_balance)), chain_str, timestamp, token_symbol)
|
||||||
token_symbol)
|
|
||||||
key = cache_data_key([self.identifier, token_symbol.encode('utf-8')], MetadataPointer.BALANCES_ADJUSTED)
|
key = cache_data_key([self.identifier, token_symbol.encode('utf-8')], MetadataPointer.BALANCES_ADJUSTED)
|
||||||
cache_data(key, json.dumps(adjusted_balance))
|
cache_data(key, json.dumps(adjusted_balance))
|
||||||
|
|
||||||
|
@ -104,7 +104,7 @@ def is_valid_guardian_addition(state_machine_data: Tuple[str, dict, Account, Ses
|
|||||||
session_data['failure_reason'] = failure_reason
|
session_data['failure_reason'] = failure_reason
|
||||||
save_session_data('cic-ussd', session, session_data, ussd_session)
|
save_session_data('cic-ussd', session, session_data, ussd_session)
|
||||||
|
|
||||||
return phone_number is not None and is_valid_account and not is_existent_guardian and not is_initiator
|
return phone_number is not None and is_valid_account and not is_existent_guardian and not is_initiator and not is_system_guardian
|
||||||
|
|
||||||
|
|
||||||
def add_pin_guardian(state_machine_data: Tuple[str, dict, Account, Session]):
|
def add_pin_guardian(state_machine_data: Tuple[str, dict, Account, Session]):
|
||||||
|
Loading…
Reference in New Issue
Block a user