The Ring Package Manager (RingPM)

In this chapter we will learn about using the Ring Package Manager (RingPM)

RingPM is a tool for discovering, installing and updating Ring packages.

Features

The Package Manager uses Semantic Versioning to check compatibility between packages

The Package Manager comes with the next options

Usage   : ringpm [command]
Command : search  [keywords...]
Command : refresh : Update the Registry (Packages List)
Command : install [ <packagename> [from <UserName>] [branch <branchname>] ]
Command : list    [-u : check updates]
Command : run     [packagename]
Command : update  <packagename>
Command : remove  <packagename>
Command : format  : Delete All Packages
Command : new     <packagename>
Command : package : Create package in the current folder

Discovering Packages

We can discover new packages using the Search command

Using this command we can search in the RingPM Registry (Packages Index)

The RingPM Registry is a local copy of all registered packages.

ringpm search [keywords...]

Example:

ringpm search notepad

Output:

Package : ringnotepad (Ring Notepad)
Package : notepadppeditorextension (Notepad++ Editor Extension package)

To print all packages in the RingPM Registry, use the search command without keywords.

Example:

ringpm search

Updating the RingPM Registry

The RingPM Registry is a local copy of all registered packages.

We can update the local copy using the Refresh command

Example:

ringpm refresh

Output:

No updates to the Registry, Nothing to do!

Or

The Registry is updated from revision 110 (2019/01/13) to revision 112 (2019/01/15)

Installing Packages

We can install new packages using the Install command

ringpm install [ <packagename> [from <UserName>] [branch <branchname>] ]

We can type only the package name to get the package information from the RingPM Registry or we can determine the user name (GitHub) and the branch name of the github project (optional).

If the current folder is a package folder then we don’t need to write the package name.

Example (1) :

ringpm install ringnotepad

Example (2) :

ringpm install goldmagic800

Example (3) :

ringpm install gameoflife

If the package is not added to the RingPM Registry, We can install it directly from the GitHub user

Example (4) :

ringpm install firstpackage from mahmoudfayed

To run the package after installation

ringpm run firstpackage

To install a package in the current folder

Example (5) :

ringpm install

Printing List of Installed Packages

We can know the installed packages using the List command

ringpm list [-u : check updates]

Example

ringpm list

Output

(analogclock)          : The AnalogClock Package [master]         -- (1.0.0)
(androidringlibsdl)    : The AndroidRingLibSDL Package [master]   -- (1.0.0)
(androidringqt)        : The AndroidRingQt Package [master]       -- (1.0.0)
(atomeditorextension)  : The AtomEditorExtension Package [master] -- (1.0.0)
(bignumber)            : The BigNumber Package [master]           -- (1.0.0)
(calculator)           : The Calculator Package [master]          -- (1.0.0)
(cards)                : The Cards Package [master]               -- (1.0.0)
(checkers)             : The Checkers Package [master]            -- (1.0.0)
(chess)                : The Chess Package [master]               -- (1.0.0)
....

To check for new updates

ringpm list -u

Run Package

After installing a package, we can run it using the Run command.

ringpm run [packagename]

Example(1):

ringpm run ringnotepad

Example(2):

ringpm run goldmagic800

Example(3):

ringpm run gameoflife

To run a package in the current folder

Example(4):

ringpm run

Update Package

We can update a package using the Update command

ringpm update <packagename>

Example:

ringpm update ringnotepad

Remove Package

We can remove a package using the Remove command

ringpm remove <packagename>

Example:

ringpm remove ringnotepad

Deleting All Packages

We can delete all packages using the Format command

Example:

ringpm format

Creating New Package

We can create new package using the New command

ringpm new <packagename>

Example:

ringpm new myapp

This will create new folder called my myapp

The new folder will contains the next file

  • package.ring : The package description and files

  • main.ring : main program (used by the Run command)

  • lib.ring : library file for the package

File : main.ring

# The Main File

load "lib.ring"

func main

        ? "Hello, World!"

File : lib.ring

# The Library File

File : package.ring

aPackageInfo = [
        :name = "The myapp Package",
        :description = "Our myapp package using the Ring programming language",
        :folder = "myapp",
        :developer = "",
        :email = "",
        :license = "MIT License",
        :version = "1.0.0",
        :ringversion = "1.10",
        :versions =     [
                [
                        :version = "1.0.0",
                        :branch = "master"
                ]
        ],
        :libs =         [
                [
                        :name = "",
                        :version = "",
                        :providerusername = ""
                ]
        ],
        :files =        [
                "lib.ring",
                "main.ring"
        ],
        :ringfolderfiles =      [

        ],
        :windowsfiles =         [

        ],
        :linuxfiles =   [

        ],
        :ubuntufiles =  [

        ],
        :fedorafiles =  [

        ],
        :macosfiles =   [

        ],
        :windowsringfolderfiles =       [

        ],
        :linuxringfolderfiles =         [

        ],
        :ubunturingfolderfiles =        [

        ],
        :fedoraringfolderfiles =        [

        ],
        :macosringfolderfiles =         [

        ],
        :run = "ring main.ring",
        :windowsrun = "",
        :linuxrun = "",
        :macosrun = "",
        :ubunturun = "",
        :fedorarun = "",
        :setup = "",
        :windowssetup = "",
        :linuxsetup = "",
        :macossetup = "",
        :ubuntusetup = "",
        :fedorasetup = "",
        :remove = "",
        :windowsremove = "",
        :linuxremove = "",
        :macosremove = "",
        :ubunturemove = "",
        :fedoraremove = ""
]

The Package Description File

The package description file contains the package information defined in the list aPackageInfo

Attribute

Description

Name

Package Name

Description

Package Description

Folder

The Folder Name (Will be created in ring/ringpm/packages)

Developer

The Package Developer Name

Email

The Package Developer Email

License

The Package License

Version

The Current Version of the Package (Latest Release)

RingVersion

The Required Ring Language Version (Minimum Version)

Versions

List of different versions provided by different branches in the GitHub project

Libs

List of dependencies (Defined by name, version & GitHub user name)

Files

List of files (will be installed in ring/ringpm/packages/[Folder]

RingFolderFiles

List of files (will be installed in ring folder)

WindowsFiles

Like (Files) but for Microsoft Windows Only

LinuxFiles

Like (Files) but for Linux Only

MacOSFiles

Like (Files) but for macOS Only

UbuntuFiles

Like (Files) but for Ubuntu Only

FedoraFiles

Like (Files) but for Fedora Only

WindowsRingFolderFiles

Like (RingFolderFiles) but for Microsoft Windows Only

LinuxRingFolderFiles

Like (RingFolderFiles) but for Linux Only

MacOSRingFolderFiles

Like (RingFolderFiles) but for macOS Only

UbuntuRingFolderFiles

Like (RingFolderFiles) but for Ubuntu Only

FedoraRingFolderFiles

Like (RingFolderFiles) but for Fedora Only

Run

System Command (Command prompt or Terminal) to run the package

WindowsRun

Like (Run) but for Microsoft Windows Only

LinuxRun

Like (Run) but for Linux Only

MacOSRun

Like (Run) but for macOS Only

UbuntuRun

Like (Run) but for Ubuntu Only

FedoraRun

Like (Run) but for Fedora Only

Setup

System Command (Command prompt or Terminal) after downloading the package files

WindowsSetup

Like (Setup) but for Microsoft Windows Only

LinuxSetup

Like (Setup) but for Linux Only

MacOSSetup

Like (Setup) but for macOS Only

UbuntuSetup

Like (Setup) but for Ubuntu Only

FedoraSetup

Like (Setup) but for Fedora Only

Remove

System Command (Command prompt or Terminal) before removing the package files

WindowsRemove

Like (Remove) but for Microsoft Windows Only

LinuxRemove

Like (Remove) but for Linux Only

MacOSRemove

Like (Remove) but for macOS Only

UbuntuRemove

Like (Remove) but for Ubuntu Only

FedoraRemove

Like (Remove) but for Fedora Only

Create Package in the Current Folder

To create a package for an application that already exists, go to the application folder then type

ringpm package

This will create the package definition file (package.ring) and will add all of the application files to the package definition.

Each RingPM package contains the package definition file (package.ring)

The package definition file is a list that describe the package information and files.

Example :

The package definition file for the Ring Notepad package

aPackageInfo = [
        :name = "The RingNotepad Package",
        :description = "Our RingNotepad package using the Ring programming language",
        :folder = "ringnotepad",
        :developer = "Mahmoud Fayed",
        :email = "msfclipper@yahoo.com",
        :license = "MIT License",
        :version = "1.0.0",
        :ringversion = "1.10",
        :versions =     [
                [
                        :version = "1.0.0",
                        :branch = "master"
                ]
        ],
        :libs =         [
                [
                        :name = "stdlib",
                        :version = "1.0",
                        :providerusername = ""
                ],
                [
                        :name = "ringqt",
                        :version = "1.0",
                        :providerusername = ""
                ],
                [
                        :name = "findinfiles",
                        :version = "1.0",
                        :providerusername = ""
                ],
                [
                        :name = "formdesigner",
                        :version = "1.0",
                        :providerusername = ""
                ],
                [
                        :name = "libdepwin_apache",
                        :version = "1.0",
                        :providerusername = ""
                ]
        ],
        :files =        [
                "main.ring",
                "README.md"
        ],
        :ringfolderfiles =      [
                "applications/rnote/batch/killwebserver.bat",
                "applications/rnote/batch/run.bat",
                "applications/rnote/batch/run2.bat",
                "applications/rnote/image/back.jpg",
                "applications/rnote/image/back2.jpg",
                "applications/rnote/image/close.png",
                "applications/rnote/image/colors.png",
                "applications/rnote/image/copy.png",
                "applications/rnote/image/cut.png",
                "applications/rnote/image/debug.png",
                "applications/rnote/image/font.png",
                "applications/rnote/image/formdesigner.png",
                "applications/rnote/image/new.png",
                "applications/rnote/image/notepad.png",
                "applications/rnote/image/open.png",
                "applications/rnote/image/paste.png",
                "applications/rnote/image/print.png",
                "applications/rnote/image/project.png",
                "applications/rnote/image/richtext.png",
                "applications/rnote/image/run.png",
                "applications/rnote/image/rungui.png",
                "applications/rnote/image/save.png",
                "applications/rnote/image/saveas.png",
                "applications/rnote/image/search.png",
                "applications/rnote/image/source.png",
                "applications/rnote/image/undo.png",
                "applications/rnote/image/web.png",
                "applications/rnote/README.md",
                "applications/rnote/rnote.ring",
                "applications/rnote/rnoteactivefile.ring",
                "applications/rnote/rnoteactivefolder.ring",
                "applications/rnote/rnoteautocomplete.ring",
                "applications/rnote/rnotebase.ring",
                "applications/rnote/rnotecontroller.ring",
                "applications/rnote/rnotedistribute.ring",
                "applications/rnote/rnoteeditmenu.ring",
                "applications/rnote/rnoteeditorevents.ring",
                "applications/rnote/rnotefilemenu.ring",
                "applications/rnote/rnotefiles.ring",
                "applications/rnote/rnotefilestabs.ring",
                "applications/rnote/rnotefind.ring",
                "applications/rnote/rnotefindinfiles.ring",
                "applications/rnote/rnoteformdesigner.ring",
                "applications/rnote/rnotegoto.ring",
                "applications/rnote/rnotehelp.ring",
                "applications/rnote/rnotelists.ring",
                "applications/rnote/rnotemainfiletoolbar.ring",
                "applications/rnote/rnotemainwindow.ring",
                "applications/rnote/rnotemode.ring",
                "applications/rnote/rnoteoutputwindow.ring",
                "applications/rnote/rnoteprogrammenu.ring",
                "applications/rnote/rnoterun.ring",
                "applications/rnote/rnotesettings.ring",
                "applications/rnote/rnotestyle.ring",
                "applications/rnote/rnotetabwidth.ring",
                "applications/rnote/rnotetools.ring",
                "applications/rnote/rnotetreeviewevents.ring",
                "applications/rnote/rnoteviewmenu.ring",
                "applications/rnote/rnotewebbrowser.ring"
        ],
        :run = "ring main.ring"
]

The RingPM Registry File

The RingPM Registry is a local copy of all registered packages.

aPackagesRegistry = [
        [ :name = "ringpresentation",
          :description = "Powerpoint presentation for the Ring programming language",
          :ProviderUserName = "ringpackages"
        ]
        # ...
]

Each package is defined using a list that determine

  • Package Name

  • Package Description

  • Provider User Name (GitHub User Name)

We can register new packages by updating the registry file then sending a Pull Request

URL : https://github.com/ring-lang/ring/blob/master/tools/ringpm/registry/registry.ring