NAME

Vote::Count::ReadBallots

VERSION 2.01

SYNOPSIS

use Vote::Count::ReadBallots;

my $data1 = read_ballots('t/data/data1.txt');

Description

Reads a file containing vote data. Retruns a HashRef of a Vote::Count BallotSet.

All public methods are exported.

BallotSet Data Structure

ballots   {
    CHOCOLATE:MINTCHIP:VANILLA {
        count   1,
        votevalue   1, # needed for STV support
        votes   [
            [0] "CHOCOLATE",
            [1] "MINTCHIP",
            [2] "VANILLA"
        ]
    },
},
choices   {
    CHOCOLATE    1,
    MINTCHIP     1,
    VANILLA      1
},
votescast        1,
comment   "# Optional Comment",
options   {
  rcv   1
}

Data File Format

# This is a comment, optional.
:CHOICES:VANILLA:CHOCOLATE:STRAWBERRY:MINTCHIP:CARAMEL:RUMRAISIN
5:VANILLA:CHOCOLATE:STRAWBERRY
RUMRAISIN

CHOICES must be defined before any vote lines. or an error will be thrown. CHOICES must only be defined once. These two rules are to protect against errors in manually prepared files.

A data line may begin with a number or a choice. When there is no number the line is counted as being a single ballot. The number represents the number of ballots identical to that one; this notation will both dramatically shrink the data files and improve performance.

read_ballots

Reads a data file in the standard Vote::Count format and returns a BallotSet.

write_ballots

write_ballots( $BallotSet, $newfile);

Write out a ballotset. Useful for creating a compressed version of a raw file.

Range Ballots

Range Ballots are supported in both JSON and YAML format. The read method doesn't perform validation like read_ballots does.

Range Ballot Format in JSON

{
  "choices": [
    "TWEEDLEDEE",
    "TWEEDLEDUM",
    "HUMPTYDUMPTY"
  ],
  "ballots": [
    {
      "votes": {
        "TWEEDLEDEE": 1,
        "TWEEDLEDUM": 1,
        "HUMPTYDUMPTY": 3
      },
      "count": 3
    }
  ],
  "depth": 3
}

read_range_ballots

Requires a parameter of a JSON or YAML file. The second parameter may be either 'json' or 'yaml', defaulting to 'json'.

my $BestFastFood = read_range_ballots('t/data/fastfood.range.json');
my $BestFastFood = read_range_ballots('t/data/fastfood.range.yml', 'yaml');

write_range_ballots

Takes three parameters, a BallotSet, a file location, and a value of 'json' or 'yaml'. The first two parameters are required, the third defaults to 'json'.

write_range_ballots( $BestFastFood, '/tmp/fast.json', 'json' );

BUG TRACKER

https://github.com/brainbuz/Vote-Count/issues

AUTHOR

John Karr (BRAINBUZ) brainbuz@cpan.org

CONTRIBUTORS

Copyright 2019-2021 by John Karr (BRAINBUZ) brainbuz@cpan.org.

LICENSE

This module is released under the GNU Public License Version 3. See license file for details. For more information on this license visit http://fsf.org.

SUPPORT

This software is provided as is, per the terms of the GNU Public License. Professional support and customisation services are available from the author.