NAME

Changes::Release - Release object class

SYNOPSIS

use Changes::Release;
my $rel = Changes::Release->new(
    # A Changes object
    container => $changes_object,
    datetime => '2022-11-17T08:12:42+0900',
    datetime_formatter => sub
    {
        my $dt = shift( @_ ) || DateTime->now;
        require DateTime::Format::Strptime;
        my $fmt = DateTime::Format::Strptime->new(
            pattern => '%FT%T%z',
            locale => 'en_GB',
        );
        $dt->set_formatter( $fmt );
        $dt->set_time_zone( 'Asia/Tokyo' );
        return( $dt );
    },
    format => '%FT%T%z',
    line => 12,
    note => 'Initial release',
    spacer => "\t",
    time_zone => 'Asia/Tokyo',
    version => 'v0.1.0',
) || die( Changes::Release->error, "\n" );
my $change = $rel->add_change( $change_object );
# or
my $change = $rel->add_change( text => 'Some comments' );
my $group = $rel->add_group( $group_object );
# or
my $group = $rel->add_group( name => 'Some group' );
my $change = $rel->delete_change( $change_object );
my $group = $rel->delete_group( $group_object );
say $rel->as_string;

VERSION

v0.2.2

DESCRIPTION

This class implements a Changes file release line. Such information usually comprise of a version number, a release datetime and an optional note

Each release section can contain group and changes that are all stored and accessible in "changes"

If an error occurred, it returns an error

The result of this method is cached so that the second time it is called, the cache is used unless there has been any change.

METHODS

add_change

Provided with a Changes::Change object, or an hash or hash reference of options passed to the constructor of Changes::Change, and this will add the change object to the list of elements for this release object.

It returns the Changes::Change object, or an error if an error occurred.

add_group

Provided with a Changes::Group object, or an hash or hash reference of options passed to the constructor of Changes::Group, and this will add the change object to the list of elements.

It returns the Changes::Group object, or an error if an error occurred.

as_string

Returns a string object representing the release. It does so by calling as_string on each element stored in "elements". Those elements can be Changes::Group and Changes::Change objects.

If an error occurred, it returns an error

The result of this method is cached so that the second time it is called, the cache is used unless there has been any change.

changes

Read only. This returns an array object containing all the change objects within this release object.

container

Sets or gets the container object for this release object. A container is the object representing the Changes file: a Changes object.

Note that if you instantiate a release object directly, this value will obviously be undef. This value is set by Changes upon parsing the Changes file.

datetime

Sets or gets the release datetime information. This uses "_parse_datetime" in Module::Generic to parse the string, so please check that documentation for supported formats.

However, most format are supported including ISO8601 format and W3CDTF format (e.g. 2022-07-17T12:10:03+09:00)

Note that if you use a relative datetime format such as -2D for 2 days ago, the datetime format will be set to a unix timestamp, and in that case you need to also specify the format option with the desired datetime format.

You can alternatively directly set a DateTime object.

It returns a DateTime object whose date formatter object is set to the same format as provided. This ensures that any stringification of the DateTime object reverts back to the string as found in the Changes file or as provided by the user.

datetime_formatter

Sets or gets a code reference callback to be used when formatting the release datetime. This allows you to use alternative formatter and greater control over the formatting of the release datetime.

This code is called with a DateTime object, and it must return a DateTime object. Any other value will be discarded and it will fallback on setting up a DateTime with current date and time using UTC as time zone and $DEFAULT_DATETIME_FORMAT as default datetime format.

The code executed may die if needed and any exception will be caught and a warning will be issued if warnings are enabled for Changes.

defaults

Sets or gets an hash of default values for the Changes::Change object when it is instantiated by the new_change method.

Default is undef, which means no default value is set.

my $ch = Changes->new(
    file => '/some/where/Changes',
    defaults => {
        # For Changes::Change
        spacer1 => "\t",
        spacer2 => ' ',
        marker => '-',
        max_width => 72,
        wrapper => $code_reference,
        # For Changes::Group
        group_spacer => "\t",
        group_type => 'bracket', # [Some group]
    }
);

delete_change

This takes a list of change to remove and returns an array object of those changes thus removed.

A change provided can only be a Changes::Change object.

If an error occurred, this will return an error

delete_group

This takes a list of group to remove and returns an array object of those groups thus removed.

A group provided can either be a Changes::Group object, or a group name as a string.

If an error occurred, this will return an error

elements

Sets or gets an array object of all the elements within this release object. Those elements can be Changes::Group, Changes::Change and Changes::NewLine objects.

format

Sets or gets a DateTime format to be used with DateTime::Format::Strptime. See "STRPTIME PATTERN TOKENS" in DateTime::Format::Strptime for details on possible patterns.

You can also specify an alternative formatter with "datetime_formatter"

If you specify the special value default, it will use default value set in the global variable $DEFAULT_DATETIME_FORMAT, which is %FT%T%z (for example: 2022-12-08T20:13:09+0900)

It returns a scalar object

groups

Read only. This returns an array object containing all the group objects within this release object.

line

Sets or gets an integer representing the line number where this release line was found in the original Changes file. If this object was instantiated separately, then obviously this value will be undef

new_change

Instantiates and returns a new Changes::Change, passing its constructor any argument provided.

my $change = $rel->new_change( text => 'Some change' ) ||
    die( $rel->error );

new_group

Instantiates and returns a new Changes::Group, passing its constructor any argument provided.

my $change = $rel->new_group( name => 'Some group' ) ||
    die( $rel->error );

new_line

Returns a new Changes::NewLine object, passing it any parameters provided.

If an error occurred, it returns an error object

new_version

Returns a new Changes::Version object, passing it any parameters provided.

If an error occurred, it returns an error object

nl

Sets or gets the new line character, which defaults to \n

It returns a number object

note

Sets or gets an optional note that is set after the release datetime.

It returns a scalar object

raw

Sets or gets the raw line as found in the Changes file for this release. If nothing is change, and a raw version exists, then it is returned instead of computing the formatting of the line.

It returns a scalar object

remove_change

This is an alias for "delete_change"

remove_group

This is an alias for "delete_group"

set_default_format

Sets the default DateTime format pattern used by DateTime::Format::Strptime. This default value used is $DEFAULT_DATETIME_FORMAT, which, by default is: %FT%T%z, i.e. something that would look like 2022-12-06T20:13:09+0900

spacer

Sets or gets the space that can be found between the version information and the datetime. Normally this would be just one space, but since it can be other space, this is used to capture it and ensure the result is identical to what was parsed.

This defaults to a single space if it is not set.

It returns a scalar object

time_zone

Sets or gets a time zone to use for the release date. A valid time zone can either be an olson time zone string such as Asia/Tokyo, or an DateTime::TimeZone object.

It returns a DateTime::TimeZone object upon success, or an error if an error occurred.

version

Sets or gets the version information for this release. This returns a version object. If you prefer to use a different class, such as Perl::Version, then you can set the global variable $VERSION_CLASS accordingly.

It returns a version object, or an object of whatever class you have set with $VERSION_CLASS

changes

Sets or gets the array object containing all the object representing the changes for that release. Those changes can be Changes::Group, Changes::Change or Changes::Line

AUTHOR

Jacques Deguest <jack@deguest.jp>

SEE ALSO

Changes, Changes::Group, Changes::Change, Changes::Version, Changes::NewLine

COPYRIGHT & LICENSE

Copyright(c) 2022 DEGUEST Pte. Ltd.

All rights reserved

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