Skip to main content

A small ninjar build script generator framework.

Project description

Ninjar

A small ninjar build script generator framework.

import ninjar
from typing import List, Dict


class SimpleStage(ninjar.ninja.Stage):
    def __init__(self, ninja: ninjar.NinjaGenerator, name: str) -> None:
        super().__init__(ninja, name)

        self._add_option('example')
        self._add_option('command')

    def inherit(self) -> "SimpleStage":
        """
        inherit this object
        """
        new_obj = SimpleStage(self.ninja, self.name)
        new_obj.cmd = self.cmd .copy()
        return new_obj

    def input_type(self) -> List[str]:
        """
        input: `any`
        """
        return [':any']

    def generate_rule(self) -> None:
        """
        Generate the ninja rule statement
        """
        cmd_str = self._get_command()
        self.ninja.add_rule(self.name, cmd_str, 'CC: $in', '$in.d')

    def generate_build(self, input: List[str]) -> str:
        """
        Generate the ninja build statement and return the output file
        """
        # dot't forget need check the len(input) in your project
        inp_file = input[0]
        out_file = f'build/{inp_file}.out'

        self.ninja.add_build(self.name, out_file, input)

        return out_file


@ninjar.action(default=True)
def ninja(opts: Dict[str, str], args: Dict[str, str]):
    """
    Generate the build.ninja file
    """
    # At least one action, called ninja is required.
    # The `action` is a function,
    # `py build.py -t action_name` will execute the action `action_name`

    # This action is the default one
    # `py build.py` will execute this action

    with ninjar.NinjaGenerator() as ninja:
        # let's create a stage
        stage_1 = SimpleStage(ninja, 'simple')

        # the unit stage will return the input
        stage_unit = ninjar.UnitStage(ninja, 'unit')

        # input files, now it's `*.py`
        inp_file = ninjar.select('./*.py')

        # and then, apply the `stage_1` to `inp_file`
        # assume the `*.py` -> [['build.py']]
        # see the `generate_build` method in the `SimpleStage`
        # so the result, the `mid_file`, = [['build.py.out']]
        #
        # inp_file([['build.py']]) -- stage_1 --> build.py.out
        #
        mid_file = inp_file.apply(stage_1)

        # `apply` method can apply more than one stage for the same inputs
        twice_files = mid_file.apply(stage_1, stage_unit)

        # the result is [['build.py.out.out'], ['build.py.out']]
        #
        # mid_file([['build.py.out']]) +- stage_1    --> build.py.out.out
        #                              +- stage_unit --> build.py.out
        #
        # the unit stage return the first input file and do nothing.
        # let's fold the output
        fold_file = twice_files.fold()

        # now the result is [['build.py.out', 'build.py.out']]
        result = fold_file.collect_files()

        # we can use `colorful_print` to print a colorful output
        ninjar.colorful_print(ninjar.Color.Cyan, f'result = `{result}`')

        # let's generate `build.ninja`
        # build.py -- stage_1 --> build.py.out +- stage_1 --> build.py.out.out
        #                                      +- unit    --> build.py.out
        #
        ninja.add_defaults(result)


@ninjar.action()
def not_default(opts: Dict[str, str], args: Dict[str, str]):
    """
    This is not a default action, run it `py build.py -t not_default`
    """
    print('hello, action `not_default`')


@ninjar.action(['ninja'])
def deps_other(opts: Dict[str, str], args: Dict[str, str]):
    """
    An action dependent on `ninja`, run it `py build.py -t deps_other`
    """
    print('hello, action `deps_other`')


if __name__ == '__main__':
    # try the following commands

    # run the default actions
    # py build.py

    # run specific actions
    # py build.py -t not_default
    # py build.py -t deps_other

    # run the build script
    ninjar.BuildScript(__import__(__name__)).run()

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

ninjar-1.0.0.tar.gz (14.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ninjar-1.0.0-py3-none-any.whl (17.5 kB view details)

Uploaded Python 3

File details

Details for the file ninjar-1.0.0.tar.gz.

File metadata

  • Download URL: ninjar-1.0.0.tar.gz
  • Upload date:
  • Size: 14.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.12.0

File hashes

Hashes for ninjar-1.0.0.tar.gz
Algorithm Hash digest
SHA256 4d92acbe2320eb3fc2dfff7ff61a2645e17baaf74aa0ce6884ea86782112efef
MD5 5f5f9ec6c292ff11ce21c30b8a7d5e8a
BLAKE2b-256 033efaf7b1e840eeac8101a61586e6ac196eb52955c1cad6239d4d04e0afd09c

See more details on using hashes here.

File details

Details for the file ninjar-1.0.0-py3-none-any.whl.

File metadata

  • Download URL: ninjar-1.0.0-py3-none-any.whl
  • Upload date:
  • Size: 17.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.12.0

File hashes

Hashes for ninjar-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 0bf69abed068393a249c1cbcc73689bece7bf6c75527e2db5135834daca31a2d
MD5 4afb65c14021b6634c29f8ff15087654
BLAKE2b-256 455aff3bbee22b574b3084cccfefad31fc89f0359e5375a582105ae37caecf02

See more details on using hashes here.

Supported by

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