Provided by: librinci-perl_1.1.43-1_all bug

NAME

       Rinci - Language-neutral metadata for your code entities

VERSION

       version 1.1.43

SPECIFICATION VERSION

        1.1

ABSTRACT

       This document describes Rinci, a set of extensible, language-neutral metadata
       specifications for your code (functions/methods, variables, packages, classes, and so on).
       Rinci allows various helper tools, from code generator to web middleware to documentation
       generator to other protocols, to act on your code, making your life easier as a
       programmer. Rinci also allows better interoperability between programming languages. Rinci
       is geared towards dynamic scripting languages like Perl, Python, Ruby, PHP, JavaScript,
       but is not limited to those languages.

STATUS

       The 1.1 series does not guarantee full backward compatibility between revisions, so caveat
       implementor. However, major incompatibility will bump the version to 1.2 or 2.0.

TERMINOLOGIES

       The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD
       NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as
       described in RFC 2119.

       Rinci is a set of specifications of metadata for your code entities. Each different type
       of code entity, like function/method, variable, namespace, etc, has its own metadata
       specification.

       Metadata is a defhash (see DefHash). Each specification will specify what properties
       should be supported. So the Rinci::function specification will describe metadata for
       functions/methods, Rinci::package will describe metadata for namespace/package, and so on.

       Rinci defines properties pertaining to documentation (like "summary", "description",
       "examples", "links"), function argument and return value validation ("args" and "result"),
       dependencies ("deps"), standardized feature description ("features"), also a few
       conventions/protocols for doing stuffs like undo (others like callback/progress report
       will follow). Basically anything that can describe the code entity. The specification is
       extensible: you can define more properties, or more deps, or more features.

       Since defhash can contain keys that are ignored (those that start with underscore, "_"),
       extra information can be put here.

WHAT ARE THE BENEFITS OF RINCI?

       By adding Rinci metadata to your code, you can write/use tools to do various things to
       your program. Rinci is designed with code generation and function wrapping in mind. At the
       time of this writing, in Perl there exists several tools (mostly modules under Perinci
       namespace) to do the following:

       •   Perinci::Sub::Wrapper

           Wrap functions with a single generated function that can do the following: validate
           input (using information from the "args" property), validate return value (the
           "result" property), add execution time-limiting ("timeout"), add automatic retries
           ("retry"), interactive confirmation, logging, and more.

       •   Perinci::Exporter

           A replacement for Exporter or Sub::Exporter if your functions are equipped with Rinci
           metadata. Automatically provide export tags (using information in the "tags"
           property). Can automatically wrap functions using Perinci::Sub::Wrapper when
           exporting.

       •   Perinci::To::* modules

           Convert metadata to various other documents, for example Perinci::To::POD to generate
           documentation.

       •   Perinci::CmdLine

           Riap command-line client. Call local/remote functions. Automatically convert command-
           line options/arguments to function arguments. Generate help/usage message (for
           "--help"). Check dependencies (e.g. you can specify that in order to run your
           functions, you need some executables/other functions to exist, an environment variable
           being set, and so on), perform bash shell completion (using Perinci::Sub::Complete).

       •   Perinci::Access::HTTP::Server

           A PSGI application (a set of PSGI middlewares, really) to serve metadata and function
           call requests over HTTP, according to the Riap::HTTP protocol.

       •   Serabi

           An alternative for Perinci::Access::HTTP::Server for REST-style service.

       •   Perinci::Use

           Use remote packages and import their functions/variables transparently like you would
           use local Perl modules. The remote server can be any Riap-compliant service, even when
           implemented in other languages.

       •   "Perinci::Sub::Gen::*"

           Since Rinci metadata are just normal data structure, they can be easily generated. The
           Perinci::Sub::Gen::* Perl modules can generate functions as well as their metadata,
           for example to access table data (like from a regular array or from a SQL database).

       More tools will be written in the future.

RINCI VS ...

       Some features offered by Rinci (or Rinci tools) are undoubtedly already offered by your
       language or existing language libraries. For example, for documentation Perl already has
       POD and Python has docstrings. There are numerous libraries for argument validation in
       every language. Python has decorators that can be used to implement various features like
       argument validation and logging. Perl has subroutine attributes to stick additional
       metadata to your subroutines and variables. And so on.

       The benefits that Rinci offer include richer metadata, language neutrality, extensibility,
       and manipulability.

       Richer metadata. Rinci strives to provide enough metadata for tools to do various useful
       things. For example, the "description" and "summary" properties support translations.
       Argument specification is pretty rich, with a quite powerful and flexible schema language.

       Language neutrality. You can share metadata between languages, including documentation and
       rules for argument validation. Perl 6 allows very powerful argument validation, for
       example, but it is language-specific. With Rinci you can easily share validation rules and
       generate validators in Perl and JavaScript (and other target languages).

       Manipulability. Being a normal data structure, your Rinci metadata is easier to manipulate
       (clone, merge, modify, export, what have you) as well as access (from your language and
       others). Perl's POD documentation is not accessible from the language (but Perl 6's Pod
       and Python docstrings are, and there are certainly tools to parse POD). On the other hand,
       Python docstrings are attached in the same file with the function, while with Rinci you
       can choose to separate the metadata into another file more easily.

       Other things to consider. If you stack multiple decorators in Python, for example, it
       usually results in wrapping your Python function multiple times, which can add overhead. A
       single wrapper like Perinci::Sub::Wrapper, on the other hand, uses a single level of
       wrapping to minimize subroutine call overhead.

       Working together. There is no reason why Rinci metadata has to compete against existing
       features from language/libraries. A code generator for Rinci metadata can generate code
       that utilize those features. For example, the "timeout" property can be implemented in
       Python using decorator, if you want.  Rinci basically just provides a way for you to
       express desired properties/constraints/behaviours, separate from the implementation. A
       tool is free to implement those properties using whatever technique is appropriate.

SPECIFICATION

       Note: Examples are usually written in Perl, but this does not mean they only apply to a
       particular language.

   Terminologies
       Code entities, or just entities for short, are elements in your code that can be given
       metadata. Currently supported entities are function/method, namespace/package, and
       variable. Other entities planned to be supported: class, object, library, application.

   Specification common to all metadata
       This section describes specification common to all kinds of Rinci metadata.

       Where to put the metadata. The specification does not specify where to put metadata in: it
       might be put alongside the code, separated in another source code, encoded in YAML/JSON,
       put in database, or whatever. It is up to the tools/implementations to provide the
       mechanism. If you use Perinci in Perl, there is a great deal of flexibility, you basically
       can do all of the above, even split the metadata in several files. See its documentation
       for more details.

       Common properties. Below are properties common to all metadata:

       Property: v => FLOAT (required)

       From DefHash. Declare specification version. This property is required. It should have the
       value of 1.1. If "v" is not specified, it is assumed to be 1.0 and metadata is assumed to
       be the old, Sub::Spec 1.0.x metadata.

       Example:

        v => 1.1

       Property: entity_v => STR

       Specify entity version (like package or function version). This is version as in software
       implementation version, not to be confused with "v" which is the metadata specification
       version (1.1).

       Example:

        entity_v => 0.24

       In Perl, modules usually put version numbers in package variable called $VERSION. If not
       set, tools like Perinci::Access::Perl automatically fills this property from that
       variable, to relieve authors from manually setting this property value.

       Property: default_lang => STR

       From DefHash. Specify default language used in the text properties like "summary" and
       "description". Default is 'en_US'.

       To specify translation texts in other languages, you can use "PROPERTY.alt.lang.CODE",
       e.g.:

        summary => "Perform the foo ritual",
        "summary.alt.lang.id_ID" => "Laksanakan ritual foo",

       Property: name => STR

       From DefHash. The name of the entity. Useful when aliasing entity (and reusing the
       metadata) and wanting to find out the canonical/original entity.

       Examples:

        name => 'foo'
        name => '$var'  # only in languages where variables have prefix

       Property: summary => STR

       From DefHash. A one-line summary. It should be plain text without any markup.  Please
       limit to around 72 characters.

       Example:

        # in variable metadata for $Answer
        summary => 'The answer to the question: what is the meaning of life'

        # in function metadata foo
        summary => 'Perform the foo ritual',

       For variable metadata, it should describe what the variable contain. You do not need to
       say "Contains ..." or "A variable that ..." since that is redundant; just say directly the
       content of the variable (noun). You also do not need to say what kinds of values the
       variable should contain, like "An integer, answer to the ..." or "..., should be between
       1..100" since that should go to the "schema" property.

       For function metadata, it should describe what the function does. Suggestion: use active,
       bare infinitive verb like in the example (not "Performs ..."). Avoid preamble like "This
       function ..." or "Function to ..." since that is redundant.  Also avoid describing the
       arguments and its values like "..., accepts a single integer argument" as that should go
       to the "args" property.

       To specify translations in other language, use the summary.alt.lang.CODE.  Or change the
       "default_lang" property. Examples:

        # default language is 'en_US'
        summary => 'Perform the foo ritual',
        "summary.alt.lang.id_ID" => 'Laksanakan ritual foo',

        # change default language to id_ID, so all summaries are in Indonesian, except
        # when explicitly set otherwise
        default_lang => 'id_ID',
        summary => 'Laksanakan ritual foo',
        "summary.alt.lang.en_US" => 'Perform the foo ritual',

       Property: tags => ARRAY OF (STR OR HASH)

       From DefHash. A list of tags, useful for categorization. Can also be used by tools, e.g.
       Perinci::Exporter in Perl uses the "tags" property of the function metadata as export
       tags.

       Tag can be a simple string or a tag metadata hash.

       Example:

        # tag a function as beta
        tags => ['beta']

        # the second tag is a detailed metadata
        tags => ['beta',
                 {
                     name    => 'category:filtering',
                     summary => 'Filtering',
                     "summary.alt.lang.id_ID" => 'Penyaringan',
                 }
                ]

       Property: description => STR

       From DefHash. A longer description text. The text should be in marked up in format
       specified by "text_markup" and is suggested to be formatted to 78 columns.

       To avoid redundancy, you should mentioning things that are already expressed as
       properties, for example: return value of function (specify it in "result" property
       instead), arguments that the function accepts ("args"), examples ("examples"), function's
       features ("features") and dependencies/requirements ("deps").

       For function, description should probably contain a more detailed description of what the
       function does (steps, algorithm used, effects and other things of note).

       Example:

        {
            name => 'foo',
            summary => 'Perform the foo ritual',
            description => <<EOT,

        Foo ritual can be performed by humans or machines. This program will perform a
        machine-based ritual using [the best available
        algorithm](http://example.org/foo-with-bar-algo.html).

        Note that you still have to perform foo ritual manually from time to time, just
        to be safe.

        EOT
        }

       Like in "summary", to specify translations in other language, use the
       description.alt.lang.CODE property.

       Property: links => ARRAY OF HASHES

       List to related entities or resources. Can be used to generate a SEE ALSO and/or LINKS
       sections in documentation. Each link is a defhash with the following keys:

       •   uri => STR (required)

           URI is used as a common syntax to refer to resources. If URI scheme is not specified,
           tools can assume that it is a "riap" URI (see Riap).

       •   title => STR

           A short plaintext title for the link.

       •   description => STR

           From DefHash. A longer marked up text description for the link. Suggested to be
           formatted to 76 columns.

       •   tags => ARRAY OF (STR OR HASH)

           From DefHash. Can be used to categorize or select links. For generating SEE ALSO
           sections, use the tag 'see'.

       Example:

        # links in the Bar::foo function metadata
        links => [
            {
                url   => "http://example.org/foo-with-bar-algo.html",
                title => "Article describing foo using Bar algorithm",
            },
            {
                url   => "../Bar2/",
                title => "Another implementation of the Bar algorithm",
                tags  => ['see'],
            },
        ],

       Property: x => ANY

       From DefHash. This property is used to store extended (application-specific) attributes,
       much like the "X-" prefix in HTTP or email headers. This property can be used as an
       alternative to using underscore prefix (e.g. "_foo"). Some processing tools strip
       properties/attributes that begin with underscores, so to pass extended metadata around, it
       might be more convenient to use the "x" property.

       It is recommended that you put an application prefix.

       Example:

        "x.myapp.foo" => "some value",

       Another example:

        "x.dux.strip_newlines" => 0,

   Entity-specific specifications
       Each entity-specific specification is described on a separate subdocument.  Currently
       these specifications are defined:

       •   Rinci::function - Metadata for functions/methods

       •   Rinci::package - Metadata for namespaces/packages

       •   Rinci::variable - Metadata for variables

       •   Rinci::result - Function/method result metadata

       These specifications are planned or considered, but not yet defined:

       •   Rinci::class - Metadata for classes

       •   Rinci::object - Metadata for objects

       •   Rinci::application - Metadata for applications

       •   Rinci::library - Metadata for libraries

       •   Rinci::distribution - Metadata for software distribution

       •   Rinci::language - Metadata for programming languages

       •   Rinci::author - Metadata for software authors

       •   Rinci::project - Metadata for software projects

       •   Rinci::repository - Metadata for code repository (like git, svn)

FAQ

   What does Rinci mean?
       Rinci is taken from Indonesian word perincian or rincian, meaning: specification, detail.

   Why use Sah for data schema?
       Sah is a flexible and extensible schema language, while still not being language-specific,
       making it easy for code generator tools to generate validator code in various target
       languages (Perl, Ruby, etc).

HISTORY

       Below is the general history of the project and major changes to the specifications. For
       more detailed changes between releases, see the Changes file in the distribution.

1.1 (Jan 2012)

       To clearly separate specification from implementation, rename specification from
       "Sub::Spec" to "Rinci" (the namespace "Perinci" is now used for the Perl implementation).
       Support code entities other than functions/methods. Bump specification version from 1.0 to
       1.1 due to several incompatibilities like changed "args" and "result" properties,
       terminologies, defaults. Versioning property ("v") now required.

   1.0 (Aug 2011)
       First release version of Sub::Spec.

   0.x (Feb-Aug 2011)
       Series of Sub::Spec drafts.

   Spanel project (2009-2010)
       I started using some metadata for API functions, calling them spec and putting them in
       %spec instead of in POD, so I can list and grab all the summaries easily as a single dump
       for API catalog (instead of having to parse POD from my source code files). Later on I
       kept adding more and more stuffs to this, from argument specification, requirements, and
       so on.

SEE ALSO

   Related specifications
       DefHash

       Sah schema language, Sah

       Riap

   Related ideas/concepts
       .NET attributes, http://msdn.microsoft.com/en-us/library/z0w1kczw.aspx

       Python Decorators, http://www.python.org/dev/peps/pep-0318/ ,
       http://wiki.python.org/moin/PythonDecorators

   Other related links
       Acmeism, http://www.acmeism.org/

HOMEPAGE

       Please visit the project's homepage at <https://metacpan.org/release/Rinci>.

SOURCE

       Source repository is at <https://github.com/sharyanto/perl-Rinci>.

BUGS

       Please report any bugs or feature requests on the bugtracker website
       <https://rt.cpan.org/Public/Dist/Display.html?Name=Rinci>

       When submitting a bug or request, please include a test-file or a patch to an existing
       test-file that illustrates the bug or desired feature.

AUTHOR

       Steven Haryanto <stevenharyanto@gmail.com>

COPYRIGHT AND LICENSE

       This software is copyright (c) 2013 by Steven Haryanto.

       This is free software; you can redistribute it and/or modify it under the same terms as
       the Perl 5 programming language system itself.