Documentation for Persistent Pineapple

Contents:

travis ci build state

rtd state

Introduction

Persistent Pineapple provides a simple interface to save settings for applications or other modules. The settings file is in the JSON format for simplicty. A slightly modified JSON format is used to allow for comments and other creature features. Please read the _json.py file for more details.

Documentation

Documentation is hosted on persistetpineapple.readthedocs.org

Install

Download the tarball and install with pip install <package>.

Usage

See the unit tests for more in-depth examples. Here are the basics:

Example code

settings = PersistentPineapple('/etc/myapp.json')
print settings.program_name
if settings.debug:
    print "we're in debug mode"
settings.debug = False

Example settings file (/etc/myapp.json)

{
    // App settings ///////////////////////////////////////////////////////////

    // Name of the program
    "program_name": "myapp",

    // HTTP POST listener port
    "port": 8009,

    // Debugging stuff
    "debug": true,

    // Logging settings
    "console_log_level": "INFO",
}

Auto Generated API Documentation

Contents:

persistent_pineapple

Persistent Pineapple provides a simple interface to save settings for applications or other modules. The settings file is in the JSON format for simplicty. A slightly modified JSON format is used to allow for comments and other creature features. Please read the _json.py file for more details.

Example settings file::
Example code:
>>> settings = PersistentPineapple('/etc/myapp.json')
>>> print settings.program_name
myapp
>>> if settings.debug:
...     print "we're in debug mode"
we're in debug mode
>>> settings.debug = False
class persistent_pineapple.PersistentPineapple(path, woc=True, lofc=True)

An interface to the project settings.

get(key)

Return item defined by key from settings file. If lofc was set, the contents of the settings file will be reloaded if the file has been modified since last read.

reload()

Reload the settings file

save(path=None)

Save the settings back to the file

set(key, value)

Set/overwrite the currently read item. If woc was set, the settings file will be overwritten with the new settings.

persistent_pineapple._json

This module contains a wrapper for Python’s built-in json module to make it easier to use.

class persistent_pineapple._json.CommentedJSON

This object is used to _approximately_ keep the comments in the stored text file. The order and format of the original file is not kept. The data is translated to Python native objects. In the case of a dictionary, key order is not guaranteed. This object does not attempt to re-order the output.

Known Issues

  • Line comments not immediately preceding a setting are ignored
  • /*  */ style comments are discarded
  • Block comments not associated with a setting are ignored, with the exception of a comment at the top of the file (called the _header_)
  • Settings with the same name will collide
  • Guaranteed not to work well with complex JSON

TODO

Find/write a proper lexer

load(string=None, path=None, force_ascii=True)

Loads JSON data from either a string or a file. The _template_ of the file will be used during as_string() and store().

Parameters:
  • string (basestring) – The string to parse
  • path (basestring) – The path of the file to parse
  • force_ascii (bool) – For lazy people who refuse to use unicode; the data returned is guaranteed to be ascii.
Returns:

JSON encoded data

store(data, path, cls=<class 'persistent_pineapple._json.MyEncoder'>)

Write the data to a JSON formatted file while attempting to keep comments.

class persistent_pineapple._json.JSON

This object is used to load JSON data from a string or file. It will remove any comment-only lines, and try to give some indication of why JSON failed to load (e.g. trailing comma).

JSON reads much like Python; [] is for a list of items, {} is for a dictionary.

Some important notes:

  • single-quotes (B{‘}) are invalid; always use double-quotes (B{“})
  • A Python B{None} is represented by a JSON B{null}
  • A list cannot end with a trailing comma (a comma after the last item in the list)

Comments:

  • JSON does not supports comments. This functionality was added to this class to make life easier.

We support the following types of comments

  • A line consisting of 0 or more whitespace characters followed by //
  • Text ending a line with 1 or more whitespace characters followed by //
  • All text in between /* and */

Examples

1
2
3
4
5
// this line is ignored
{"key": 5} // the rest of the line is ignored
{"key": 5 /*,"key2": 6*/}  // key2 and the remainder is ignored
{"key": 5}// INVALID!  At least 1 whitespace character
          // before // for hanging comments
load(string=None, path=None, force_ascii=True)

Loads JSON data from either a string or a file.

store(data, path, cls=<class 'persistent_pineapple._json.MyEncoder'>)

Write the data to a JSON formatted file.

class persistent_pineapple._json.JSONComment(_type, line_number, comment, setting=None)

A simple object to contain information about a comment found in a JSON file/string.

class persistent_pineapple._json.MyEncoder(skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, sort_keys=False, indent=None, separators=None, encoding='utf-8', default=None)

Simple decoder that returns the dict of an object.

persistent_pineapple._json.container_to_ascii(item)

Converts all items from unicode to ascii, where needed. This is a recursive function. You may pass in any container or object, however, only basic types will be converted: scalars, lists, and dictionaries. Everything else will be ignored.

Examples::
>>> print(container_to_ascii(int(4)))
4
>>> print(container_to_ascii(['test', u'test']))
['test', 'test']
>>> print(container_to_ascii({u'one': u'test', u'two': 2, u'three':
... {'test': 2}, 4: [1, 2, 3, u'four']}))
{'one': 'test', 4: [1, 2, 3, 'four'], 'three': {'test': 2}, 'two': 2}
>>>
persistent_pineapple._json.encode(data, cls=<class 'persistent_pineapple._json.MyEncoder'>)

encode the provided data in JSON format

tests

tests.json_checks

tests.test_comment

tests.sanity_checks

Indices and tables