Skip to content

Latest commit

 

History

61 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🦑 Beautifhy

A Hy beautifier / code formatter / pretty-printer / linter.

Probably compatible with Hy 1.0.0 and later.

Install

$ pip install -U beautifhy

The pygments style may be modified with the environment variable HY_PYGMENTS_STYLE. This sets the name of a pygments style to use for highlighting. Defaults to lightbulb.

Usage: pretty-printer and syntax highlighter

From the command line, to pretty-print the file core.hy:

$ beautifhy core.hy

gives the output

(import toolz [first second last])

(defmacro defmethod [#* args]
  "Define a multimethod (using multimethod.multimethod).
  For example, the Hy code

  `(defmethod f [#^ int x #^ float y]
    (// x (int y)))`

  is equivalent to the following Python code:

  `@multimethod
  def f(x: int, y: float):
      return await x // int(y)`

  You can also define an asynchronous multimethod:

  `(defmethod :async f [#* args #** kwargs]
    (await some-async-function #* args #** kwargs))`
  "
  (if (= :async (first args))
    (let [f (second args) body (cut args 2 None)]
      `(defn :async [hy.I.multimethod.multimethod] ~f ~@body))
    (let [f (first args) body (cut args 1 None)]
      `(defn [hy.I.multimethod.multimethod] ~f ~@body))))

(defn slurp [fname #** kwargs]
  "Read a file and return as a string.
  kwargs can include mode, encoding and buffering, and will be passed
  to open()."
  (let [f (if (:encoding kwargs None) hy.I.codecs.open open)]
    (with [o (f fname #** kwargs)]
      (o.read))))

(defmacro rest [xs]
  "A slice of all but the first element of a sequence."
  `(cut ~xs 1 None))

To apply syntax highlighting (no pretty-printing), do

$ hylight core.hy

You can use stdin and pipe by replacing the filename with -:

$ beautifhy core.hy | hylight -

which will pretty-print core.hy and then syntax highlight the output.

To convert python code to Hy (using py2hy), autoformat, then apply syntax highlighting, do

$ pip3 install py2hy
$ python3 -m py2hy some_code.py | beautifhy - | hylight -

Usage: linter

hylint checks Hy source for syntax errors and common issues.

$ hylint myfile.hy

With --style / -s, also runs opinionated style checks (camelCase names, missing docstrings, earmuff variables):

$ hylint --style myfile.hy

With --error-only / -e, only errors are shown (suppresses warnings and info):

$ hylint --error-only myfile.hy

Reads from stdin with -:

$ cat myfile.hy | hylint -

Exit code is 1 if any errors are found, 0 otherwise. Suitable for CI.

Lint rules (always on):

  • (defn f (x) ...) — use [] for parameter lists, not ()
  • (defn f [...] (do ...)) — remove redundant do
  • (fn [...] (do ...)) — remove redundant do
  • (when cond (do ...)) — remove redundant do
  • (if cond (do ...)) — use (when cond ...)
  • (do expr) — redundant single-expression do
  • (+ x 0), (* x 1) — identity arithmetic
  • (+ x 1) → (inc x), (- x 1) → (dec x) (from hyrule)

Style rules (--style):

  • camelCase function names — use kebab-case
  • Missing docstrings on defn/defmacro
  • Trailing commas in parameter lists
  • Earmuff variables (*var*) — use UPPER_SNAKE or kebab-case

Acknowledgements

The whole library uses pygments. The autoformatter relies on polymorphic dispatch provided by multimethod.

Docs

The docstrings are not bad. Otherwise, try clicking below.

Ask DeepWiki

About

🦑 - beautifhy, a Hy code autoformatter / pretty-printer / code beautifier.

Resources

Contributing

Stars

13 stars

Watchers

3 watching

Forks

Used by

Contributors

Languages