Skip to main content

Default template for PDM package

Project description

Code Writer Latest Version Build Status

A Python 3 library with convenience functions for generating code in any language.

Based on the code generation backend in Stone that's used to generate code in many languages: C#, Java, Python, Ruby, Rust, Typescript, and more.

Why?

You know all of the pains with code generation (coding, build process, maintenance), but have decided you have no other choice. This library makes generating code a little bit more manageable.

Alternatives

If your code generation needs are simple, consider using a template language such as Jinja2.

Install

pip3 install code-writer

Usage

Basics

You'll need to import CodeWriter:

from code_writer import CodeWriter

Examples

You probably want to write the output of render() to a file, but for illustrative purposes we'll print them.

Hello, world.

cw = CodeWriter()
cw.emit('hello,')
with cw.indent():
    cw.emit('world.')
print(cw.render())

Output:

hello,
    world.

Python if statement

cw = CodeWriter()
cw.emit('if True:')
with cw.indent():
    cw.emit('print("hello, world.")')
print(cw.render())

Output:

if True:
    print("hello, world.")

Rust if statement

Use block() to create an indented block enclosed by curly braces.

cw = CodeWriter()
with cw.block(before='if true', delim=('{', '}')):
    cw.emit('println!("hello, world.");')
print(cw.render())

Output:

if true {
    println!("hello, world.");
}

You can also set a default delimiter:

cw = CodeWriter(default_delim=('{', '}'))

Tabs

cw = CodeWriter(use_tabs=True)

Indent two spaces

cw = CodeWriter(default_dent=2)

Generate lists

cw = CodeWriter()
cw.emit_list([], ('[', ']'), before='let li1 = ', after=';')
cw.emit_list(['1'], ('[', ']'), before='let li2 = ', after=';')
cw.emit_list(['1', '2', '3'], ('[', ']'), before='let li3 = ', after=';')
cw.emit_list(['1', '2', '3'], ('[', ']'), before='let li4 = ', after=';', compact=True)
print(cw.render())

Output:

let li1 = [];
let li2 = [1];
let li3 = [
    1,
    2,
    3,
];
let li4 = [1,
           2,
           3];

Generate wrapped text

This is useful for documentation.

# Artificially set col width low to show wrapped text
cw = CodeWriter(default_width=25)
cw.emit('/**')
cw.emit_wrapped_text(
    '@param param1 an explanation of what this argument does.',
    prefix=' * ',
    indent_after_first=True,
)
cw.emit('*/')
print(cw.render())

Output:

/**
 * @param param1 an
 *     explanation of
 *     what this argument
 *     does.
*/

Emit a preamble or header

preamble = """\
This
is
a
preamble.
"""
cw = CodeWriter()
cw.emit_raw(preamble)
print(cw.render())

Output:

This
is
a
preamble.

Trim trailing newlines

Sometimes you'll want a newline after every iteration of logic, but not for the last iteration.

cw = CodeWriter()
with cw.block(before='if true', delim=('{', '}')):
    for i in range(3):
        cw.emit('println!("{}");'.format(i))
        cw.emit()
print(cw.render())

Output:

if true {
    println!("0");

    println!("1");

    println!("2");

}

The gap after the last println!() is undesirable. To fix, do this:

cw = CodeWriter()
with cw.block(before='if true', delim=('{', '}')):
    for i in range(3):
        cw.emit('println!("{}");'.format(i))
        cw.emit()
    cw.trim_last_line_if_empty()
print(cw.render())

Output:

if true {
    println!("0");

    println!("1");

    println!("2");
}

Naming conventions

Depending on your target language, you may need to output names that are PascalCase, camelCase, underscore_delimited, or dash-delimited.

from code_writer import fmt_camel, fmt_dashes, fmt_pascal, fmt_underscores
# The input name can be a mix of formatting. These helpers will aggressively
# split the word and re-assemble as desired.
text = 'a-B-HiHo-merryOh_yes_no_XYZ'
assert fmt_camel(text) == 'aBHiHoMerryOhYesNoXyz'
assert fmt_dashes(text) == 'a-b-hi-ho-merry-oh-yes-no-xyz'
assert fmt_pascal(text) == 'ABHiHoMerryOhYesNoXyz'
assert fmt_underscores(text) == 'a_b_hi_ho_merry_oh_yes_no_xyz'

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

code-writer-1.2.0.tar.gz (9.1 kB view details)

Uploaded Source

Built Distribution

code_writer-1.2.0-py3-none-any.whl (8.7 kB view details)

Uploaded Python 3

File details

Details for the file code-writer-1.2.0.tar.gz.

File metadata

  • Download URL: code-writer-1.2.0.tar.gz
  • Upload date:
  • Size: 9.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: pdm/2.12.1 CPython/3.10.6

File hashes

Hashes for code-writer-1.2.0.tar.gz
Algorithm Hash digest
SHA256 f37b95e154f459e47e624b26d5f79c5d931b0939c379ce36d7ba73361c1eeb1e
MD5 a5a223298488044b643df062c272d4ec
BLAKE2b-256 d135ffa7e6b7ae17fd04936435d46e5d79aa560927732f7bf495fbc03f7fa29b

See more details on using hashes here.

File details

Details for the file code_writer-1.2.0-py3-none-any.whl.

File metadata

  • Download URL: code_writer-1.2.0-py3-none-any.whl
  • Upload date:
  • Size: 8.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: pdm/2.12.1 CPython/3.10.6

File hashes

Hashes for code_writer-1.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 1e412d5196017c942d24c75bb3f448eb6ff5890ded5a5b6376fbb64452d70727
MD5 9034083e75846264d01bb8596b1a3bc7
BLAKE2b-256 62832052e8278b93c3d92a95a9c4b38cc10a9240510359f745b99fcac2831a5e

See more details on using hashes here.

Supported by

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