Documentation for Persistent Pineapple¶
Contents:
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