• Stars
    star
    136
  • Rank 259,176 (Top 6 %)
  • Language
    Python
  • License
    MIT License
  • Created over 8 years ago
  • Updated over 2 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

A lightweight YAML Parser for Python. ๐Ÿ“

poyo

A lightweight YAML Parser for Python. ๐Ÿ“

poyo does not allow deserialization of arbitrary Python objects. Supported types are str, bool, int, float, NoneType as well as dict and list values.

โš ๏ธ Please note that poyo supports only a chosen subset of the YAML format that is required to parse cookiecutter user configuration files. poyo does not have support for serializing into YAML and is not compatible with JSON.

Installation

poyo is available on PyPI for Python versions 2.7 and newer and can be installed with pip:

pip install poyo

This package does not have any additional requirements. ๐Ÿ“ฆ

Usage

poyo comes with a parse_string() function, to load utf-8 encoded string data into a Python dict.

import codecs
import logging

from poyo import parse_string, PoyoException

logging.basicConfig(level=logging.DEBUG)

with codecs.open("tests/foobar.yml", encoding="utf-8") as ymlfile:
    ymlstring = ymlfile.read()

try:
    config = parse_string(ymlstring)
except PoyoException as exc:
    logging.error(exc)
else:
    logging.debug(config)

Example

Input YAML string

---
default_context: # foobar
    greeting: ใ“ใ‚“ใซใกใฏ
    email: "[email protected]"
    docs: true

    gui: FALSE
    123: 456.789
    # comment
    # allthethings
    'some:int': 1000000
    foo: "hallo #welt" #Inline comment :)
    longtext: >
        This is a multiline string.
        It can contain all manners of characters.

        Single line breaks are ignored,
        but blank linkes cause line breaks.
    trueish: Falseeeeeee
    blog   : raphael.codes
    relative-root: /          # web app root path (default: '')
    lektor: 0.0.0.0:5000      # local build
    doc_tools:
        # docs or didn't happen
        -    mkdocs
        - 'sphinx'

        - null
    # ไปŠๆ—ฅใฏ
zZz: True
NullValue: Null

# Block
# Comment

Hello World:
    # See you at EuroPython
    null: This is madness   # yo
    gh: https://github.com/{0}.git
"Yay #python": Cool!

Output Python dict

{
    u"default_context": {
        u"greeting": u"ใ“ใ‚“ใซใกใฏ",
        u"email": u"[email protected]",
        u"docs": True,
        u"gui": False,
        u"lektor": "0.0.0.0:5000",
        u"relative-root": "/",
        123: 456.789,
        u"some:int": 1000000,
        u"foo": u"hallo #welt",
        u"longtext": (
            u"This is a multiline string. It can contain all "
            u"manners of characters.\nSingle line breaks are "
            u"ignored, but blank linkes cause line breaks.\n"
        ),
        u"trueish": u"Falseeeeeee",
        u"blog": u"raphael.codes",
        u"doc_tools": [u"mkdocs", u"sphinx", None],
    },
    u"zZz": True,
    u"NullValue": None,
    u"Hello World": {
        None: u"This is madness",
        u"gh": u"https://github.com/{0}.git",
    },
    u"Yay #python": u"Cool!",
}

Logging

poyo follows the recommendations for logging in a library, which means it does not configure logging itself. Its root logger is named poyo and the names of all its children loggers track the package/module hierarchy. poyo logs to a NullHandler and solely on DEBUG level.

If your application configures logging and allows debug messages to be shown, you will see logging when using poyo. The log messages indicate which parser method is used for a given string as the parser deseralizes the config. You can remove all logging from poyo in your application by setting the log level of the poyo logger to a value higher than DEBUG.

Disable Logging

import logging

logging.getLogger("poyo").setLevel(logging.WARNING)

Example Debug Logging Config

import logging
from poyo import parse_string

logging.basicConfig(level=logging.DEBUG)

CONFIG = """
---
default_context: # foobar
    greeting: ใ“ใ‚“ใซใกใฏ
    gui: FALSE
    doc_tools:
        # docs or didn't happen
        -    mkdocs
        - 'sphinx'
    123: 456.789
"""

parse_string(CONFIG)

Example Debug Logging Messages

DEBUG:poyo.parser:parse_blankline <- \n
DEBUG:poyo.parser:parse_blankline -> IGNORED
DEBUG:poyo.parser:parse_dashes <- ---\n
DEBUG:poyo.parser:parse_dashes -> IGNORED
DEBUG:poyo.parser:parse_section <- default_context: # foobar\n
DEBUG:poyo.parser:parse_str <- default_context
DEBUG:poyo.parser:parse_str -> default_context
DEBUG:poyo.parser:parse_section -> <Section name: default_context>
DEBUG:poyo.parser:parse_simple <-     greeting: \u3053\u3093\u306b\u3061\u306f\n
DEBUG:poyo.parser:parse_str <- greeting
DEBUG:poyo.parser:parse_str -> greeting
DEBUG:poyo.parser:parse_str <- \u3053\u3093\u306b\u3061\u306f
DEBUG:poyo.parser:parse_str -> \u3053\u3093\u306b\u3061\u306f
DEBUG:poyo.parser:parse_simple -> <Simple name: greeting, value: \u3053\u3093\u306b\u3061\u306f>
DEBUG:poyo.parser:parse_simple <-     gui: FALSE\n
DEBUG:poyo.parser:parse_str <- gui
DEBUG:poyo.parser:parse_str -> gui
DEBUG:poyo.parser:parse_false <- FALSE
DEBUG:poyo.parser:parse_false -> False
DEBUG:poyo.parser:parse_simple -> <Simple name: gui, value: False>
DEBUG:poyo.parser:parse_list <-     doc_tools:\n        # docs or didn't happen\n        -    mkdocs\n        - 'sphinx'\n
DEBUG:poyo.parser:parse_str <- mkdocs
DEBUG:poyo.parser:parse_str -> mkdocs
DEBUG:poyo.parser:parse_str <- 'sphinx'
DEBUG:poyo.parser:parse_str -> sphinx
DEBUG:poyo.parser:parse_str <- doc_tools
DEBUG:poyo.parser:parse_str -> doc_tools
DEBUG:poyo.parser:parse_list -> <Simple name: doc_tools, value: ['mkdocs', 'sphinx']>
DEBUG:poyo.parser:parse_simple <-     123: 456.789\n
DEBUG:poyo.parser:parse_int <- 123
DEBUG:poyo.parser:parse_int -> 123
DEBUG:poyo.parser:parse_float <- 456.789
DEBUG:poyo.parser:parse_float -> 456.789
DEBUG:poyo.parser:parse_simple -> <Simple name: 123, value: 456.789>
DEBUG:poyo.parser:parse_simple <-     docs: true\n
DEBUG:poyo.parser:parse_str <- docs
DEBUG:poyo.parser:parse_str -> docs
DEBUG:poyo.parser:parse_true <- true
DEBUG:poyo.parser:parse_true -> True
DEBUG:poyo.parser:parse_simple -> <Simple name: docs, value: True>

About this project

We created this project to work around installation issues with a cookiecutter version that depended on existing YAML parsers for Python. For more information please check out this GitHub issue.

Community

Would you like to contribute to poyo? You're awesome! ๐Ÿ˜ƒ

Please check out the good first issue label for tasks, that are good candidates for your first contribution to poyo. Your contributions are greatly appreciated! Every little bit helps and credit will always be given.

Everyone interacting in the poyo project's codebases, issue trackers, chat rooms, and mailing lists is expected to follow the PyPI Code of Conduct.

Join the poyo community! ๐ŸŒ๐ŸŒ๐ŸŒŽ

License

Distributed under the terms of the MIT license, poyo is free and open source software.

More Repositories

1

pytest-tricks

๐Ÿ˜ Tips and Tricks for the Python Testing Tool
Python
191
star
2

pytest-cookies

The pytest plugin for your Cookiecutter templates. ๐Ÿช
Python
160
star
3

turtle

Emojis for Go ๐Ÿ˜„๐Ÿข๐Ÿš€
Go
152
star
4

jinja2-time

๐Ÿ“† Jinja2 Extension for Dates and Times
Python
67
star
5

labels

CLI app for managing GitHub labels for Python 3.6 and newer. ๐Ÿ“
Python
66
star
6

cookiedozer

๐Ÿ“ฑ Cookiecutter for i18n Kivy Apps
Python
49
star
7

pytest-emoji

A pytest plugin that adds emojis to your test result report ๐Ÿ˜
Python
47
star
8

pytest-md

Plugin for generating Markdown reports for pytest results ๐Ÿ“
Python
34
star
9

cookiecutter-kivy

๐ŸŽฎ Minimal Cookiecutter for Python Kivy Apps
Python
31
star
10

python-composition

Code for my talk at the Python Pizza micro conference. ๐Ÿง€๐Ÿ…๐Ÿง„๐Ÿฅฆ
Python
24
star
11

pytest-snail

Plugin for adding a marker to slow running tests. ๐ŸŒ
Python
15
star
12

earth

Example Python project for my talk: Customizing your pytest test suite ๐ŸŒ
Python
14
star
13

pytest-covfefe

๐Ÿ‘ I have the best code! Everyone says so.
Python
12
star
14

go-repr

String representations for Go values. ๐Ÿ’ฌ
Go
12
star
15

cibopath

๐Ÿ” Search Cookiecutters on GitHub
Python
9
star
16

amelia

Create GitHub gists from your CLI ๐Ÿ“„
Go
8
star
17

go-librariesio

๐Ÿ“˜ API client for libraries.io written in Go
Go
6
star
18

tapioca-toggl

๐Ÿ•“ A Python Wrapper for Toggl API v8
Python
5
star
19

dotfiles

My configuration files for git, zsh, bash, vscode etc. ๐ŸฆŠ
Shell
3
star
20

python-super

Code examples for teaching Python's super. ๐Ÿฆธโ€โ™€๏ธ
3
star
21

kivy-gallery

Gallery like app for presenting various media-types such as images or walkarounds with the kivy framework.
Python
3
star
22

install-firefox

๐Ÿ’ป Shell script to install Firefox and Geckodriver
Shell
2
star
23

floof

Golang CLI App to Create GitHub Gists
Go
1
star
24

awesome-talks

๐Ÿ“บ A curated list of awesome conference talks
1
star
25

hackebrot

All about Raphael ๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป
1
star
26

sfallhands

๐Ÿฃ Code examples for my pytest talk
Python
1
star
27

pytest-regression-tests

Run pytest release candidates against repos
1
star
28

dockerfiles

๐Ÿ‹ Dockerfiles for development and testing
Shell
1
star
29

python-type-hints

๐Ÿ’ป Example code for Python's type hints.
Python
1
star