Skip to main content

Application settings

Project description

Savor what you feel and what you see / Things that may not seem important now / But may be tomorrow

–Chuck Schuldiner

Nostalgic

A drop-in configuration module to save and restore end-user and application settings.

  • No meta-files needed
  • Use only the Python standard library
  • Handle syncing of UI elements

Install

pip install nostalgic

Getting Started

A Configuration is a collection of Settings.

  • Use a dot to get the Setting value (like an attribute)
  • Settings can have a default initial value
  • write() Settings to disk and read() them back in.
# basic usage
import os   # needed only for demonstration
import sys  # needed only for demonstration
import nostalgic


if __name__ == '__main__':
    # create configuration in current directory
    cfg = nostalgic.Configuration("sample_config")

    # declare a setting 'foo' with initial value
    cfg.add_setting("foo", default="bar")

    print(cfg.foo)  # "bar"

    # change the value
    cfg.foo = "baz"

    try:
        # second run
        cfg.read()
        print("Config just read")
        print(cfg.foo)  # "baz"
        os.remove(cfg.config_file)
        if not os.path.exists(cfg.config_file):
            print("Removed config file")
    except FileNotFoundError:
        # first run, no config yet
        cfg.write()
        print("Wrote config")
        sys.exit()
$ python3 "/home/ahab/Projects/nostalgic/scratch/sample1.py"
bar
Wrote config

$ python3 "/home/ahab/Projects/nostalgic/scratch/sample1.py"
bar
Config just read
baz
Removed config file

Coordinate a configuration across your code base

Optional setter and getter functions handle updating other parts of your code.

# demonstrate getting on write() and setting on read()
import os   # needed only for demonstration
import sys  # needed only for demonstration
import nostalgic


class SettingsUI:

    def __init__(self):
        self.some_ui_thing_the_end_user_uses = 0


class Main:

    def __init__(self):
        self.cfg = nostalgic.Configuration("sample_config")
        self.settings_ui = SettingsUI()

        self.cfg.add_setting(
            "ui_related_thing",
            setter=self.custom_setter,  # called on read()
            getter=self.custom_getter)  # called on write()

    def custom_setter(self, value):
        print(f"Setting some_ui_thing_the_end_user_uses")
        self.settings_ui.some_ui_thing_the_end_user_uses = value

    def custom_getter(self):
        print(f"Getting some_ui_thing_the_end_user_uses")
        return self.settings_ui.some_ui_thing_the_end_user_uses


if __name__ == '__main__':
    main = Main()

    print(f"some_ui_thing_the_end_user_uses: "
          f"{main.settings_ui.some_ui_thing_the_end_user_uses}")  # 0, the initial value

    try:
        # second run
        main.cfg.read()
        print("Config just read")
        print(f"some_ui_thing_the_end_user_uses: "
              f"{main.settings_ui.some_ui_thing_the_end_user_uses}")
        os.remove(main.cfg.config_file)
        if not os.path.exists(main.cfg.config_file):
            print("Removed config file")
    except FileNotFoundError:
        # first run, no config yet

        # user changed the UI thing
        main.settings_ui.some_ui_thing_the_end_user_uses = 42
        main.cfg.write()
        print("Wrote config")
        sys.exit()

The first run gets the end-user value before writing:

$ python3 "/home/ahab/Projects/nostalgic/scratch/sample2.py"
some_ui_thing_the_end_user_uses: 0
Getting some_ui_thing_the_end_user_uses
Wrote config

The second run sets the end-user's previous value:

$ python3 "/home/ahab/Projects/nostalgic/scratch/sample2.py"
some_ui_thing_the_end_user_uses: 0
Setting some_ui_thing_the_end_user_uses
Config just read
some_ui_thing_the_end_user_uses: 42
Removed config file

Notes

  • Shadowing bound methods with Settings of the same name is possible, although not recommended.

Development

Install as "editable" using pip:

~$ cd Projects/nostalgic
~/Projects/nostalgic$ python3 -m venv venv
~/Projects/nostalgic$ source venv/bin/activate
(venv) ~/Projects/nostalgic$ pip install -e .

Testing

Run tests using:

(venv) ~/Projects/nostalgic$ python3 tests/test_nostalgic.py

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

nostalgic-1.0.1.tar.gz (7.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

nostalgic-1.0.1-py3-none-any.whl (5.6 kB view details)

Uploaded Python 3

File details

Details for the file nostalgic-1.0.1.tar.gz.

File metadata

  • Download URL: nostalgic-1.0.1.tar.gz
  • Upload date:
  • Size: 7.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.0 CPython/3.9.9

File hashes

Hashes for nostalgic-1.0.1.tar.gz
Algorithm Hash digest
SHA256 f14209691dc43ab602d2e2b6e51081fa77afb6617829fe2e4ccc77dd8d309e01
MD5 d95a26f2beebe9d6afaf915547f12e64
BLAKE2b-256 f93d8a35fc1125498aaed49e813df3a5f31a55c1cfd75a30642c106fc487d74e

See more details on using hashes here.

File details

Details for the file nostalgic-1.0.1-py3-none-any.whl.

File metadata

  • Download URL: nostalgic-1.0.1-py3-none-any.whl
  • Upload date:
  • Size: 5.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.0 CPython/3.9.9

File hashes

Hashes for nostalgic-1.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 4aef2fd53140e54469be5511376ba05bac26f44f8131931c6f2f472f3f43def0
MD5 d069bf1b193e42f4425315da8b4fee6f
BLAKE2b-256 843222e5e986f478c0a678e37d67bb8ac584bec8f25363bca6056b9cf946044d

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page