Creating a new Pack
====================================
Prerequisites
------------------------------------
You'll need to have `Python 3.8 `_ and `poetry `_
to develop Royalnet Packs.
Creating the repository
------------------------------------
To create a new pack, create a new repository based on the `Royalnet Pack template `_
and clone it to your workspace.
After cloning the template, run ``poetry install`` to install the dependencies for the pack, creating the ``poetry.lock`` file.
pyproject.toml
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The ``pyproject.toml`` file contains information about your Python project that will be read by ``poetry`` while building
the pack and publishing it to PyPI.
Choose a name for your Pack and set it in the ``tool.property.name`` field: ::
[tool.poetry]
# TODO: Insert here your Pack name!
name = "pastapack"
# ...
Follow the instructions in the other ``# TODO`` comments to finish editing the file.
examplepack
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The ``examplepack`` folder contains the source code of your pack, and should be renamed to the name you set in the ``pyproject.toml`` file.
It should contain a ``version.py`` file and six folders: ::
examplepack
├── commands
├── events
├── stars
├── tables
├── types
├── utils
└── version.py
version.py
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The ``version.py`` file contains the version number of your pack.
If you changed the ``version`` field in the ``pyproject.toml`` file, change the value of ``semantic`` in ``version.py`` to the same value.
Remember to use `semantic versioning `_! ::
semantic = "1.0.0"
The commands folder
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The commands folder should contain all commands that your Pack will add to the Royalnet instances it is installed in.
To learn how to create a new :class:`~commands.Command`, read the :doc:`command` page.
The events folder
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The events folder should contain all events (remote procedure calls) that your Pack will add to the Royalnet instances it is installed in.
To learn how to create a new :class:`~commands.Event`, read the :doc:`event` page.
The stars folder
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The stars folder should contain all stars (webserver routes) that your Pack will add to the Royalnet instances it is installed in.
To learn how to create a new :class:`~constellation.PageStar`, read the :doc:`star` page.
The tables folder
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The tables folder should contain all Alchemy tables (SQLAlchemy-compatible SQL tables) that your Pack will add to the Royalnet instances it is installed in.
To learn how to create a new table, read the :doc:`table` page.
The utils folder
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The utils folder should contain the utility functions and classes that your Pack uses.
Its contents are imported **before** the commands, events and stars but **after** the tables, so **you can't import them** in the files contained in the ``tables`` folder, or you will create a `circular import `_!
Files in this folder are **forbidden from importing modules** from the ``commands``, ``events`` and ``stars`` folders, as that will create a circular import too.
The types folder
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The types folder should contain the enums and custom types that are used in your tables.
Please note that the contents of this folder are imported **before** everything else in the pack.
Its contents **can be imported anywhere** in the Pack, including the ``tables`` folder, without creating a circular import.
However, its files are **forbidden from importing anything else** from the rest of the pack!
Adding new dependencies to the Pack
------------------------------------
As the Pack is actually a Python package, you can use ``poetry`` (or ``pip``) to add new dependencies!
Use ``poetry add packagename`` to add and install a new dependency from the PyPI.
Publishing the pack
------------------------------------
To publish your Pack on the PyPI, run ``poetry build``, then ``poetry publish``.
Poetry will build your Pack and upload it to the PyPI for you.