Skip to main content

Hammurabi is an extensible CLI tool responsible for enforcing user-defined rules on a git repository.

Project description

PyPi Package Build Status Documentation Status Maintainability Test Coverage Black Formatted CII Best Practices

Mass changes made easy.

Hammurabi is an extensible CLI tool responsible for enforcing user-defined rules on a git repository.

Features

Hammurabi integrates well with both git and Github to make sure that the execution happens on a separate branch and the committed changes are pushed to the target repository. After pushing to the target repository, a pull request will be opened.

Hammurabi supports several operations (Rules) by default. These Rules can do

  • file and directory operations like copy, move, create or delete

  • manipulation of attributes like ownership or access permissions change

  • file and directory manipulations

  • piped rule execution (output of a rule is the input of the next rule)

  • children rule execution (output of a rule is the input of the upcoming rules)

  • working with plain text and ini files

Upcoming file format support:

  • yaml

  • toml

  • json

  • hocon

Installation

Hammurabi can be installed by running pip install hammurabi and it requires Python 3.7.0+ to run. This is the preferred method to install Hammurabi, as it will always install the most recent stable release. If you don’t have pip installed, this Python installation guide can guide you through the process.

Configuration

For configuration instructions, please visit the documentation site.

Command line options

hammurabi [OPTIONS] COMMAND [ARGS]...

Hammurabi is an extensible CLI tool responsible for enforcing user-defined
rules on a git repository.

Find more information at: https://hammurabi.readthedocs.io/latest/

Options:
-c, --config PATH               Set the configuration file.  [default:
                                pyproject.toml]
--target PATH                   Set target path. If target is a git repo,
                                commits will be created.
--repository TEXT               Set the remote repository. Required format:
                                owner/repository
--github-token TEXT             Set github access token
--log-level [DEBUG|INFO|WARNING|ERROR]
                                Set logging level.
--help                          Show this message and exit.

Commands:
describe  Show details of a specific resource or group of resources.
enforce   Execute all registered Law.
get       Show a specific resource or group of resources.
version   Print Hammurabi version.

Usage examples

In every case, make sure that you clone the target repository prior using Hammurabi. It will not clone the target repository.

Enforce registered laws

$ hammurabi enforce
[INFO]  2020-14-07 16:31 - Checkout branch "hammurabi"
[INFO]  2020-14-07 16:31 - Executing law "L001"
[INFO]  2020-14-07 16:31 - Running task for "configure file exists"
[INFO]  2020-14-07 16:31 - Rule "configure file exists" finished successfully
[INFO]  2020-14-07 16:31 - Running task for "Minimum clang version is set"
[INFO]  2020-14-07 16:31 - Rule "Minimum clang version is set" finished successfully
[INFO]  2020-14-07 16:31 - Running task for "Minimum icc version is set"
[INFO]  2020-14-07 16:31 - Rule "Minimum icc version is set" finished successfully
[INFO]  2020-14-07 16:31 - Running task for "Minimum lessc version is set"
[INFO]  2020-14-07 16:31 - Rule "Minimum lessc version is set" finished successfully
[INFO]  2020-14-07 16:31 - Running task for "Maximum lessc version is set"
[INFO]  2020-14-07 16:31 - Rule "Maximum lessc version is set" finished successfully
[INFO]  2020-14-07 16:31 - Pushing changes
[INFO]  2020-14-07 16:35 - Checking for opened pull request
[INFO]  2020-14-07 16:35 - Opening pull request

Listing available laws

$ hammurabi get laws
- Gunicorn config set up properly

Get info about a law by its name

$ hammurabi get law "Gunicorn config set up properly"
Gunicorn config set up properly

Change the gunicorn configuration based on our learnings
described at: https://google.com/?q=gunicorn.

If the gunicorn configuration does not exist, create a
new one configuration file.

Get all registered (root) rules

$ hammurabi get rules
- Rule 1
- Rule 5

Get a rule by its name

$ hammurabi get rule "Rule 1"
Rule 1

Ensure that a file exists. If the file does not exists,
this :class:`hammurabi.rules.base.Rule` will create it.

Due to the file is already created by :func:`pre_task_hook`
there is no need to do anything just return the input parameter.

Describe a law by its name

$ hammurabi describe law "Gunicorn config set up properly"
Gunicorn config set up properly

Change the gunicorn configuration based on our learnings
described at: http://docs.gunicorn.org/en/latest/configure.html.

If the gunicorn configuration does not exist, create a
new one configuration file.

Rules:
--> Rule 1
--> Rule 2
--> Rule 3
--> Rule 4
--> Rule 5

Describe a rule by its name

$ hammurabi describe rule "Rule 1"
Rule 1

Ensure that a file exists. If the file does not exists,
this :class:`hammurabi.rules.base.Rule` will create it.

Due to the file is already created by :func:`pre_task_hook`
there is no need to do anything just return the input parameter.

Chain:
--> Rule 1
--> Rule 2
--> Rule 3
--> Rule 4

Getting the execution order of laws and rules

$ hammurabi get order
- Gunicorn config set up properly
--> Rule 1
--> Rule 2
--> Rule 3
--> Rule 4
--> Rule 5

Custom Rules

Although the project aims to support as many general operations as it can, the need for adding custom rules may arise.

To extend Hammurabi with custom rules, you will need to inherit a class from Rule and define its abstract methods.

The following example will show you how to create and use a custom rule. For more reference please check how the existing rules are implemented.

# custom.py
import shutil
import logging
from hammurabi.mixins import GitMixin
from hammurabi.rules.base import Rule


class CustomOwnerChanged(Rule, GitMixin):
    """
    Change the ownership of a file or directory to <original user>:admin.
    """

    def __init__(self, name: str, path: Optional[Path] = None, **kwargs):
        super().__init__(name, path, **kwargs)

    def post_task_hook(self):
        self.git_add(self.param)

    def task(self) -> Path:
        # Since ``Rule`` is setting its 2nd parameter to ``self.param``,
        # we can use ``self.param`` to access the target file's path.
        logging.debug('Changing group of "%s" to admin', str(self.param))
        shutil.chown(self.param, group="admin")
        return self.param

Contributing

Hurray, You reached this section, which means you are ready to contribute.

Please read our contibuting guideline. This guideline will walk you through how can you successfully contribute to Hammurabi.

Installation

For development you will need poetry. After poetry installed, simply run poetry install. This command will both create the virtualenv and install development dependencies for you.

Useful make Commands

Command

Description

help

Print available make commands

clean

Remove all artifacts

clean-build

Remove build artifacts

clean-mypy

Remove mypy artifacts

clean-pyc

Remove Python artifacts

clean-test

Remove test artifacts

doc

Genereate Sphinx documentation

format

Run several formatters

lint

Run several linters after format

test

Run all tests with coverage

test-unit

Run unit tests with coverage

test-integration

Run integration tests with coverage

Why Hammurabi?

Hammurabi was the sixth king in the Babylonian dynasty, which ruled in central Mesopotamia from c. 1894 to 1595 B.C.

The Code of Hammurabi was one of the earliest and most complete written legal codes and was proclaimed by the Babylonian king Hammurabi, who reigned from 1792 to 1750 B.C. Hammurabi expanded the city-state of Babylon along the Euphrates River to unite all of southern Mesopotamia. The Hammurabi code of laws, a collection of 282 rules, established standards for commercial interactions and set fines and punishments to meet the requirements of justice. Hammurabi’s Code was carved onto a massive, finger-shaped black stone stele (pillar) that was looted by invaders and finally rediscovered in 1901.

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

hammurabi-0.1.1.tar.gz (28.5 kB view details)

Uploaded Source

Built Distribution

hammurabi-0.1.1-py3-none-any.whl (32.6 kB view details)

Uploaded Python 3

File details

Details for the file hammurabi-0.1.1.tar.gz.

File metadata

  • Download URL: hammurabi-0.1.1.tar.gz
  • Upload date:
  • Size: 28.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.0.5 CPython/3.8.0 Linux/4.15.0-1028-gcp

File hashes

Hashes for hammurabi-0.1.1.tar.gz
Algorithm Hash digest
SHA256 ad2af68c34df65556e2dc3f8f44f4ce1fcf2924562d54fa3e7b2399745c54435
MD5 b3b9066d58874419aa078b0c7f2c13e6
BLAKE2b-256 99320b9547ffc644d2fe557bdf9c71728df27ab11153689e1dd48dd91fd34cf1

See more details on using hashes here.

File details

Details for the file hammurabi-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: hammurabi-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 32.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.0.5 CPython/3.8.0 Linux/4.15.0-1028-gcp

File hashes

Hashes for hammurabi-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 a718f3e2fd9c9829d04b1649a0cc1a0ea82791b170897ac2b6a2e5d1465741e7
MD5 ae3ff2573dad3574f10e825f6e7ab996
BLAKE2b-256 ea735c6c7f3456d6b2b3f1b5e6afda89155e0b679d71cc83333ca83da394038e

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