Philos Programmatistis

KeePassPQ

TL;DR A KeePassXC client for the pinephone.

What is KeePassPQ?

KeePassPQ is a Python and QML based application to open KeePass (v4) databases on mobile devices. It mainly targets the KDE Plasma Mobile environment (primarily pinephones) and uses the pykeepass library.

Status

This is an early prototype and can only open KeePass databases and copy credentials to the clipboard. No editing or saving is implemented.

Configstacker

TL;DR A library to load multiple configurations to stack and override values.

What is configstacker?

Configstacker is a python library with the goal to simplify configuration handling. You can read configurations from different sources (e.g. files, environment variables and others) and load single or merge multiple sources at will. The resulting configuration object can be used like a dictionary or with dot-notation. If you need additional flexibility configstacker also allows you to specify converters for values or merging strategies for keys that occur multiple times throughout different sources. If this is still not sufficient enough configstacker makes it very easy for you to add additional source handlers.

Single Source Usage Example

from configstacker import YAMLFile

config = YAMLFile('/path/to/my/config.yml')

# Dot-notation access
assert config.a_key is True

# Mixed dictionary and dot-notation access
assert config['subsection'].nested_key == 100

# Dictionary-like interface
assert config.keys() == ['a_key', 'subsection']

# Dictionary dumping on any level
assert config.dump() == {'a_key': True, 'subsection': {'nested_key': 100}}
assert config.subsection.dump() == {'nested_key': 100}

# New value assignment
config.new_value = 10.0
assert config.new_value == 10.0

Multiple Sources Usage Example

import configstacker as cs

# The resulting configuration object behaves
# the same as a single source one.
config = cs.StackedConfig(
    # The order of sources defines their search priority with the
    # last element having the highest.
    cs.Environment(prefix='MYAPP'),
    cs.YAMLFile('/path/to/my/config.yml')
)

# Higher priority values shadow lower priority values.
assert config.a_key is False

# Lower prioritized values which are not shadowed stay accessible.
assert config['subsection'].nested_key == 100

# New values will be added to the source that has the highest
# priority and is writable.
config.other_new_value = True
assert config.other_new_value is True

# In this case the new item was added to the last element in the
# source list.
assert config.source_list[-1].other_new_value