From: Charles McGarvey Date: Sun, 30 Jan 2022 03:55:37 +0000 (-0700) Subject: Version 0.010 X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fhomebank2ledger;a=commitdiff_plain;h=refs%2Fheads%2Fdist;hp=b980f9a0c4ed7902a2c57657d5971c13333f13ca Version 0.010 --- diff --git a/Changes b/Changes index 60a9c79..e02e730 100644 --- a/Changes +++ b/Changes @@ -1,5 +1,17 @@ Revision history for App-HomeBank2Ledger. +0.010 2022-01-29 20:55:19-07:00 America/Denver + * Set code from the transaction info if transaction type is check. + * Fix formatter error for symbols that have special characters. + +0.009 2022-01-15 16:40:58-07:00 America/Denver + * Use posting dates for internal transfers where the transactions have + different dates. + +0.008 2020-05-02 13:06:06-06:00 MST7MDT + * Add file_version method to File::HomeBank. + * Fix matching internal transfers for files generated by HomeBank 5.4. + 0.007 2019-12-29 14:27:52-07:00 MST7MDT * Fix problem when formatting non-fraction amounts. diff --git a/MANIFEST b/MANIFEST index 69e0884..d01c7ee 100644 --- a/MANIFEST +++ b/MANIFEST @@ -1,4 +1,4 @@ -# This file was automatically generated by Dist::Zilla::Plugin::Manifest v6.012. +# This file was automatically generated by Dist::Zilla::Plugin::Manifest v6.024. Changes LICENSE MANIFEST @@ -18,6 +18,7 @@ t/00-compile.t t/00-report-prereqs.dd t/00-report-prereqs.t xt/author/critic.t +xt/author/distmeta.t xt/author/eol.t xt/author/minimum-version.t xt/author/no-tabs.t @@ -27,4 +28,3 @@ xt/author/pod-syntax.t xt/author/portability.t xt/release/consistent-version.t xt/release/cpan-changes.t -xt/release/distmeta.t diff --git a/META.json b/META.json index 2fb245e..45bf08d 100644 --- a/META.json +++ b/META.json @@ -4,7 +4,7 @@ "Charles McGarvey " ], "dynamic_config" : 0, - "generated_by" : "Dist::Zilla version 6.012, CPAN::Meta::Converter version 2.150010", + "generated_by" : "Dist::Zilla version 6.024, CPAN::Meta::Converter version 2.150010", "license" : [ "mit" ], @@ -85,31 +85,31 @@ "provides" : { "App::HomeBank2Ledger" : { "file" : "lib/App/HomeBank2Ledger.pm", - "version" : "0.007" + "version" : "0.010" }, "App::HomeBank2Ledger::Formatter" : { "file" : "lib/App/HomeBank2Ledger/Formatter.pm", - "version" : "0.007" + "version" : "0.010" }, "App::HomeBank2Ledger::Formatter::Beancount" : { "file" : "lib/App/HomeBank2Ledger/Formatter/Beancount.pm", - "version" : "0.007" + "version" : "0.010" }, "App::HomeBank2Ledger::Formatter::Ledger" : { "file" : "lib/App/HomeBank2Ledger/Formatter/Ledger.pm", - "version" : "0.007" + "version" : "0.010" }, "App::HomeBank2Ledger::Ledger" : { "file" : "lib/App/HomeBank2Ledger/Ledger.pm", - "version" : "0.007" + "version" : "0.010" }, "App::HomeBank2Ledger::Util" : { "file" : "lib/App/HomeBank2Ledger/Util.pm", - "version" : "0.007" + "version" : "0.010" }, "File::HomeBank" : { "file" : "lib/File/HomeBank.pm", - "version" : "0.007" + "version" : "0.010" } }, "release_status" : "stable", @@ -124,9 +124,10 @@ "web" : "https://github.com/chazmcgarvey/homebank2ledger" } }, - "version" : "0.007", + "version" : "0.010", "x_authority" : "cpan:CCM", "x_generated_by_perl" : "v5.28.0", - "x_serialization_backend" : "Cpanel::JSON::XS version 4.15" + "x_serialization_backend" : "Cpanel::JSON::XS version 4.25", + "x_spdx_expression" : "MIT" } diff --git a/META.yml b/META.yml index 516d8b0..e85798d 100644 --- a/META.yml +++ b/META.yml @@ -11,7 +11,7 @@ build_requires: configure_requires: ExtUtils::MakeMaker: '0' dynamic_config: 0 -generated_by: 'Dist::Zilla version 6.012, CPAN::Meta::Converter version 2.150010' +generated_by: 'Dist::Zilla version 6.024, CPAN::Meta::Converter version 2.150010' license: mit meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html @@ -27,25 +27,25 @@ no_index: provides: App::HomeBank2Ledger: file: lib/App/HomeBank2Ledger.pm - version: '0.007' + version: '0.010' App::HomeBank2Ledger::Formatter: file: lib/App/HomeBank2Ledger/Formatter.pm - version: '0.007' + version: '0.010' App::HomeBank2Ledger::Formatter::Beancount: file: lib/App/HomeBank2Ledger/Formatter/Beancount.pm - version: '0.007' + version: '0.010' App::HomeBank2Ledger::Formatter::Ledger: file: lib/App/HomeBank2Ledger/Formatter/Ledger.pm - version: '0.007' + version: '0.010' App::HomeBank2Ledger::Ledger: file: lib/App/HomeBank2Ledger/Ledger.pm - version: '0.007' + version: '0.010' App::HomeBank2Ledger::Util: file: lib/App/HomeBank2Ledger/Util.pm - version: '0.007' + version: '0.010' File::HomeBank: file: lib/File/HomeBank.pm - version: '0.007' + version: '0.010' requires: Carp: '0' Exporter: '0' @@ -65,7 +65,8 @@ resources: bugtracker: https://github.com/chazmcgarvey/homebank2ledger/issues homepage: https://github.com/chazmcgarvey/homebank2ledger repository: https://github.com/chazmcgarvey/homebank2ledger.git -version: '0.007' +version: '0.010' x_authority: cpan:CCM x_generated_by_perl: v5.28.0 x_serialization_backend: 'YAML::Tiny version 1.73' +x_spdx_expression: MIT diff --git a/Makefile.PL b/Makefile.PL index 086544d..aaf72b9 100644 --- a/Makefile.PL +++ b/Makefile.PL @@ -1,4 +1,4 @@ -# This file was automatically generated by Dist::Zilla::Plugin::MakeMaker v6.012. +# This file was automatically generated by Dist::Zilla::Plugin::MakeMaker v6.024. use strict; use warnings; @@ -41,7 +41,7 @@ my %WriteMakefileArgs = ( "IPC::Open3" => 0, "Test::More" => 0 }, - "VERSION" => "0.007", + "VERSION" => "0.010", "test" => { "TESTS" => "t/*.t" } diff --git a/README b/README index 4e1f4cf..97794a6 100644 --- a/README +++ b/README @@ -4,7 +4,7 @@ NAME VERSION - version 0.007 + version 0.010 SYNOPSIS @@ -19,8 +19,8 @@ DESCRIPTION homebank2ledger converts HomeBank files to a format usable by Ledger . It can also - convert directly to the similar Beancount - format. + convert directly to the similar Beancount + format. This software is EXPERIMENTAL, in early development. Its interface may change without notice. diff --git a/bin/homebank2ledger b/bin/homebank2ledger index ee909bb..4da092a 100644 --- a/bin/homebank2ledger +++ b/bin/homebank2ledger @@ -10,7 +10,7 @@ use strict; use App::HomeBank2Ledger; -our $VERSION = '0.007'; # VERSION +our $VERSION = '0.010'; # VERSION App::HomeBank2Ledger->main(@ARGV); @@ -26,7 +26,7 @@ homebank2ledger - A tool to convert HomeBank files to Ledger format =head1 VERSION -version 0.007 +version 0.010 =head1 SYNOPSIS @@ -41,7 +41,7 @@ version 0.007 F converts L files to a format usable by L. It can also convert directly to the similar -L format. +L format. This software is B, in early development. Its interface may change without notice. diff --git a/lib/App/HomeBank2Ledger.pm b/lib/App/HomeBank2Ledger.pm index 57e32cb..3a6e62f 100644 --- a/lib/App/HomeBank2Ledger.pm +++ b/lib/App/HomeBank2Ledger.pm @@ -11,7 +11,7 @@ use File::HomeBank; use Getopt::Long 2.38 qw(GetOptionsFromArray); use Pod::Usage; -our $VERSION = '0.007'; # VERSION +our $VERSION = '0.010'; # VERSION my %ACCOUNT_TYPES = ( # map HomeBank account types to Ledger accounts bank => 'Assets:Bank', @@ -261,14 +261,17 @@ sub convert_homebank_to_ledger { my $account = $homebank->find_account_by_key($transaction->{account}); my $amount = $transaction->{amount}; my $status = $STATUS_SYMBOLS{$transaction->{status} || ''} || ''; - my $paymode = $transaction->{paymode} || ''; # internaltransfer my $memo = $transaction->{wording} || ''; my $payee = $homebank->find_payee_by_key($transaction->{payee}); my $tags = _split_tags($transaction->{tags}); + my $date = $transaction->{date}; + my $code = $transaction->{paymode} =~ /^(?:check|epayment)$/ ? $transaction->{info} + : undef; my @postings; push @postings, { + date => $date, account => $account->{ledger_name}, amount => $amount, commodity => $commodities{$account->{currency}}, @@ -278,7 +281,7 @@ sub convert_homebank_to_ledger { tags => $tags, }; - if ($paymode eq 'internaltransfer') { + if ($transaction->{dst_account}) { # is an internal transfer my $paired_transaction = $homebank->find_transaction_transfer_pair($transaction); my $dst_account = $homebank->find_account_by_key($transaction->{dst_account}); @@ -295,9 +298,11 @@ sub convert_homebank_to_ledger { $seen{$transaction->{transfer_key}}++ if $transaction->{transfer_key}; $seen{$paired_transaction->{transfer_key}}++ if $paired_transaction->{transfer_key}; + my $paired_date = $paired_transaction && $paired_transaction->{date}; my $paired_payee = $homebank->find_payee_by_key($paired_transaction->{payee}); push @postings, { + date => $paired_date, account => $dst_account->{ledger_name}, amount => $paired_transaction->{amount} || -$transaction->{amount}, commodity => $commodities{$dst_account->{currency}}, @@ -331,7 +336,7 @@ sub convert_homebank_to_ledger { }; } } - else { # with or without category + else { # normal transaction with or without category my $amount = -$transaction->{amount}; my $category = $homebank->find_category_by_key($transaction->{category}); my $other_account = $category ? $category->{ledger_name} @@ -357,8 +362,9 @@ sub convert_homebank_to_ledger { } $ledger->add_transactions({ - date => $transaction->{date}, + date => $date, payee => $payee->{name}, + code => $code, memo => $memo, postings => \@postings, }); @@ -446,7 +452,7 @@ App::HomeBank2Ledger - A tool to convert HomeBank files to Ledger format =head1 VERSION -version 0.007 +version 0.010 =head1 SYNOPSIS diff --git a/lib/App/HomeBank2Ledger/Formatter.pm b/lib/App/HomeBank2Ledger/Formatter.pm index 53148a1..fc6b0e5 100644 --- a/lib/App/HomeBank2Ledger/Formatter.pm +++ b/lib/App/HomeBank2Ledger/Formatter.pm @@ -9,7 +9,7 @@ use Module::Load; use Module::Pluggable search_path => [__PACKAGE__], sub_name => 'available_formatters'; -our $VERSION = '0.007'; # VERSION +our $VERSION = '0.010'; # VERSION sub _croak { require Carp; Carp::croak(@_) } @@ -59,7 +59,7 @@ App::HomeBank2Ledger::Formatter - Abstract class for formatting a ledger =head1 VERSION -version 0.007 +version 0.010 =head1 SYNOPSIS diff --git a/lib/App/HomeBank2Ledger/Formatter/Beancount.pm b/lib/App/HomeBank2Ledger/Formatter/Beancount.pm index 85810b0..48b48b9 100644 --- a/lib/App/HomeBank2Ledger/Formatter/Beancount.pm +++ b/lib/App/HomeBank2Ledger/Formatter/Beancount.pm @@ -11,7 +11,7 @@ use Scalar::Util qw(looks_like_number); use parent 'App::HomeBank2Ledger::Formatter'; -our $VERSION = '0.007'; # VERSION +our $VERSION = '0.010'; # VERSION my %STATUS_SYMBOLS = ( cleared => '*', @@ -117,7 +117,7 @@ sub _format_transaction { my $date = $transaction->{date}; my $status = $transaction->{status}; my $payee = $transaction->{payee} || ''; - my $memo = $transaction->{memo} || ''; + my $memo = $transaction->{note} // $transaction->{memo} // ''; my @postings = @{$transaction->{postings}}; my @out; @@ -165,9 +165,10 @@ sub _format_transaction { push @line, ' '; if (defined $posting->{amount}) { push @line, $self->_format_amount($posting->{amount}, $posting->{commodity}); - my $lot_price = $posting->{lot_price}; - my $lot_date = $posting->{lot_date}; - my $lot_ref = $posting->{lot_ref}; + my $lot = $posting->{lot} || {}; + my $lot_price = $lot->{price} // $posting->{lot_price}; + my $lot_date = $lot->{date} // $posting->{lot_date}; + my $lot_ref = $lot->{ref} // $posting->{lot_ref}; if ($lot_price || $lot_date || $lot_ref) { push @line, ' {', join(', ', @@ -301,11 +302,11 @@ App::HomeBank2Ledger::Formatter::Beancount - Beancount formatter =head1 VERSION -version 0.007 +version 0.010 =head1 DESCRIPTION -This is a formatter for L. +This is a formatter for L. =head1 METHODS diff --git a/lib/App/HomeBank2Ledger/Formatter/Ledger.pm b/lib/App/HomeBank2Ledger/Formatter/Ledger.pm index 6171fae..1588bc0 100644 --- a/lib/App/HomeBank2Ledger/Formatter/Ledger.pm +++ b/lib/App/HomeBank2Ledger/Formatter/Ledger.pm @@ -10,12 +10,13 @@ use App::HomeBank2Ledger::Util qw(commify rtrim); use parent 'App::HomeBank2Ledger::Formatter'; -our $VERSION = '0.007'; # VERSION +our $VERSION = '0.010'; # VERSION my %STATUS_SYMBOLS = ( cleared => '*', pending => '!', ); +my $SYMBOL = qr![^\s\d.,;:?\!\-+*/^&|=\<\>\[\]\(\)\{\}\@]+!; sub _croak { require Carp; Carp::croak(@_) } @@ -131,16 +132,18 @@ sub _format_transaction { my $account_width = $self->account_width; - my $date = $transaction->{date}; - my $status = $transaction->{status}; - my $payee = $self->_format_string($transaction->{payee} || ''); - my $memo = $self->_format_string($transaction->{memo} || ''); - my @postings = @{$transaction->{postings}}; + my $date = $transaction->{date} or _croak 'Transaction date is required'; + my $aux_date = $transaction->{aux_date} || $transaction->{effective_date} || ''; + my $status = $transaction->{status} // ''; + my $code = $transaction->{code}; + my $payee = $self->_format_string($transaction->{payee}); + my $note = $self->_format_string($transaction->{note} // $transaction->{memo}); + my @postings = @{$transaction->{postings} || _croak 'At least one transaction posting is required'}; my @out; # figure out the Ledger transaction status - my $status_symbol = $STATUS_SYMBOLS{$status || ''}; + my $status_symbol = $STATUS_SYMBOLS{$status}; if (!$status_symbol) { my %posting_statuses = map { ($_->{status} || '') => 1 } @postings; if (keys(%posting_statuses) == 1) { @@ -149,17 +152,28 @@ sub _format_transaction { } } - $payee =~ s/(?: )|\t;/ ;/g; # don't turn into a memo + $aux_date = '' if $date eq $aux_date; + $code =~ s/[\(\)]+// if defined $code; + $payee =~ s/(?: )|\t;/ ;/g if defined $payee; # don't turn into a note - push @out, sprintf('%s%s%s%s', $date, - $status_symbol && " ${status_symbol}", - $payee && " $payee", - $memo && " ; $memo", + my $has_code = defined $code && $code ne ''; + my $has_payee = defined $payee && $payee ne ''; + my $has_note = defined $note && $note ne ''; + + push @out, join('', $date, + $aux_date && "=${aux_date}", + $status_symbol && " ${status_symbol}", + $has_code && " (${code})", + $has_payee && " ${payee}", + $has_note && $has_payee && " ; ${note}", ); + if ($has_note && !$has_payee) { + push @out, " ; ${note}"; + } my $metadata = $transaction->{metadata} || {}; for my $key (sort keys %$metadata) { - my $value = $self->_format_string($metadata->{$key}); + my $value = $self->_format_string($metadata->{$key}) ; push @out, " ; ${key}: ${value}"; } @@ -176,15 +190,21 @@ sub _format_transaction { push @line, ' '; if (defined $posting->{amount}) { push @line, $self->_format_amount($posting->{amount}, $posting->{commodity}); - if (my $price = $posting->{lot_price}) { - my $is_fixed = $posting->{lot_fixed}; + my $lot = $posting->{lot} || {}; + if (my $lot_price = $lot->{price} // $posting->{lot_price}) { + my $is_fixed = $lot_price->{fixed} // $posting->{lot_fixed}; my $fixed_symbol = $is_fixed ? '=' : ''; push @line, " {${fixed_symbol}", - $self->_format_amount($price->{amount}, $price->{commodity}), + $self->_format_amount($lot_price->{amount}, $lot_price->{commodity}), '}'; } - if (my $lot_date = $posting->{lot_date}) { - push @line, " [$posting->{lot_date}]"; + if (my $lot_date = $lot->{date} // $posting->{lot_date}) { + push @line, " [${lot_date}]"; + } + if (my $lot_note = $self->_format_string($lot->{note} // $posting->{lot_note} // '')) { + $lot_note =~ s/[\(\)]+//; # cleanup + $lot_note =~ s/^\@+//; + push @line, " (${lot_note})" if $lot_note; } if (my $cost = $posting->{total_cost} // $posting->{cost}) { my $is_total = defined $posting->{total_cost}; @@ -193,9 +213,22 @@ sub _format_transaction { $self->_format_amount($cost->{amount}, $cost->{commodity}); } } - if (my $note = $posting->{note}) { - $note = $self->_format_string($note); - push @line, " ; $note" if $note ne $memo; + my $posting_date = $posting->{date} || ''; + my $posting_aux_date = $posting->{aux_date} || ''; + my $posting_note = $self->_format_string($posting->{note} // $posting->{memo} // ''); + $posting_date = '' if $posting_date eq $date; + $posting_aux_date = '' if $posting_aux_date eq $aux_date; + $posting_note = '' if $has_note && $posting_note eq $note; + my $has_posting_note = defined $posting_note && $posting_note ne ''; + if ($posting_date || $posting_aux_date || $has_posting_note) { + if ($posting_date || $posting_aux_date) { + $posting_note = sprintf('[%s%s]%s', + $posting_date, + $posting_aux_date && "=${posting_aux_date}", + $has_posting_note && " ${posting_note}", + ); + } + push @line, " ; ${posting_note}"; } push @out, join('', @line); @@ -206,9 +239,8 @@ sub _format_transaction { push @out, " ; ${key}: ${value}"; } - if (my $posting_payee = $posting->{payee}) { - $posting_payee = $self->_format_string($posting_payee); - push @out, " ; Payee: $posting_payee" if $posting_payee ne $payee; + if (my $posting_payee = $self->_format_string($posting->{payee} // '')) { + push @out, " ; Payee: $posting_payee" if !$has_payee || $posting_payee ne $payee; } if (my @tags = @{$posting->{tags} || []}) { @@ -223,7 +255,7 @@ sub _format_transaction { sub _format_string { my $self = shift; - my $str = shift; + my $str = shift // return; $str =~ s/\v//g; return $str; } @@ -235,6 +267,13 @@ sub _quote_string { return "\"$str\""; } +sub _format_symbol { + my $self = shift; + my $str = shift; + return $self->_quote_string($str) if $str !~ /^${SYMBOL}$/; + return $str; +} + sub _format_amount { my $self = shift; my $amount = shift; @@ -249,9 +288,7 @@ sub _format_amount { $num .= $commodity->{dchar} . $fraction; } - my $symbol = $commodity->{symbol}; - $symbol = $self->_quote_string($symbol) if $symbol =~ /[0-9\s]/; - + my $symbol = $self->_format_symbol($commodity->{symbol}); $num = $commodity->{syprf} ? "$symbol $num" : "$num $symbol"; return $num; @@ -271,7 +308,7 @@ App::HomeBank2Ledger::Formatter::Ledger - Ledger formatter =head1 VERSION -version 0.007 +version 0.010 =head1 DESCRIPTION diff --git a/lib/App/HomeBank2Ledger/Ledger.pm b/lib/App/HomeBank2Ledger/Ledger.pm index 190a376..69af8a6 100644 --- a/lib/App/HomeBank2Ledger/Ledger.pm +++ b/lib/App/HomeBank2Ledger/Ledger.pm @@ -5,7 +5,7 @@ package App::HomeBank2Ledger::Ledger; use warnings; use strict; -our $VERSION = '0.007'; # VERSION +our $VERSION = '0.010'; # VERSION sub new { @@ -63,7 +63,7 @@ App::HomeBank2Ledger::Ledger - Ledger data representation =head1 VERSION -version 0.007 +version 0.010 =head1 SYNOPSIS @@ -94,7 +94,7 @@ accounts. Examples: =item * -"Liabilities:Credit Card:CapitalOne" +"Liabilities:Credit Card:Capital One" =back @@ -123,9 +123,11 @@ This is a hashref like this: { date => '2019-06-12', # required - payee => 'Malcolm Reynolds', # required + aux_date => '2019-06-13', # optional status => 'cleared', # optional; can be "cleared" or "pending" - memo => 'Medical supplies', # optional + code => '1234', # optional + payee => 'Malcolm Reynolds', # required + note => 'Medical supplies', # optional postings => [ # required { account => 'Some Account', # required @@ -141,9 +143,20 @@ This is a hashref like this: frac => 2, }, payee => 'Somebody', # optional - memo => 'Whatever', # optional + note => 'Whatever', # optional status => 'pending', # optional; can be "cleared" or "pending" tags => [qw(niska train-job)], + lot => { # optional + date => '2019-01-28', + price => { + amount => '15.00', + commodity => { ... }, + }, + }, + cost => { # optional + amount => '10.00', + commodity => { ... }, + }, }, ... ], diff --git a/lib/App/HomeBank2Ledger/Util.pm b/lib/App/HomeBank2Ledger/Util.pm index 7096899..274ecfb 100644 --- a/lib/App/HomeBank2Ledger/Util.pm +++ b/lib/App/HomeBank2Ledger/Util.pm @@ -6,7 +6,7 @@ use strict; use Exporter qw(import); -our $VERSION = '0.007'; # VERSION +our $VERSION = '0.010'; # VERSION our @EXPORT_OK = qw(commify rtrim); @@ -42,7 +42,7 @@ App::HomeBank2Ledger::Util - Miscellaneous utility functions =head1 VERSION -version 0.007 +version 0.010 =head1 FUNCTIONS diff --git a/lib/File/HomeBank.pm b/lib/File/HomeBank.pm index 0e1c2bd..c89d13a 100644 --- a/lib/File/HomeBank.pm +++ b/lib/File/HomeBank.pm @@ -12,7 +12,7 @@ use Time::Piece; use XML::Entities; use XML::Parser::Lite; -our $VERSION = '0.007'; # VERSION +our $VERSION = '0.010'; # VERSION our @EXPORT_OK = qw(parse_string parse_file); @@ -119,6 +119,11 @@ sub file { } +sub file_version { + shift->{homebank}{version}; +} + + sub title { shift->{properties}{title}; } @@ -245,7 +250,7 @@ sub find_transaction_transfer_pair { my $self = shift; my $transaction = shift; - return if $transaction->{paymode} ne 'internaltransfer'; + return if !$transaction->{dst_account}; my $transfer_key = $transaction->{transfer_key}; @@ -265,7 +270,7 @@ sub find_transaction_transfer_pair { my @candidates; for my $t (@{$self->transactions}) { - next if $t->{paymode} ne 'internaltransfer'; + next if !$t->{dst_account}; next if $t->{account} != $transaction->{dst_account}; next if $t->{dst_account} != $transaction->{account}; next if $t->{amount} != -$transaction->{amount}; @@ -280,9 +285,9 @@ sub find_transaction_transfer_pair { # sort the candidates so we can pick the nearest one by date my @ordered_candidates = - map { $_->[1] } + map { $_->[1] } sort { $a->[0] <=> $b->[0] } - map { [abs($transaction_day - _ymd_to_julian($_->{date})), $_] } @candidates; + map { [abs($transaction_day - _ymd_to_julian($_->{date})), $_] } @candidates; if (my $winner = $ordered_candidates[0]) { my $key1 = $transfer_key || '[no key]'; @@ -356,6 +361,7 @@ sub parse_file { sub parse_string { my $str = shift or die _usage(q{parse_string($str)}); + my %homebank; my %properties; my @accounts; my @payees; @@ -375,7 +381,11 @@ sub parse_string { $attr{$key} = _decode_xml_entities($attr{$key}); } - if ($node eq 'properties') { + if ($node eq 'homebank') { + $attr{version} = delete $attr{v} if $attr{v}; + %homebank = %attr; + } + elsif ($node eq 'properties') { $attr{currency} = delete $attr{curr} if $attr{curr}; %properties = %attr; } @@ -441,6 +451,7 @@ sub parse_string { $xml_parser->parse($str); return { + homebank => \%homebank, properties => \%properties, accounts => \@accounts, payees => \@payees, @@ -491,7 +502,7 @@ File::HomeBank - Parse HomeBank files =head1 VERSION -version 0.007 +version 0.010 =head1 SYNOPSIS @@ -528,6 +539,12 @@ Get the filepath (if parsed from a file). Construct a L. +=head2 file_version + + $version = $homebank->file_version; + +Get the file format version. + =head2 title $title = $homebank->title; @@ -568,7 +585,7 @@ Get an arrayref of transactions. $account = $homebank->find_account_by_key($key); -Find a account with the given key. +Find an account with the given key. =head2 find_currency_by_key diff --git a/t/00-report-prereqs.t b/t/00-report-prereqs.t index c72183a..c3a94ca 100644 --- a/t/00-report-prereqs.t +++ b/t/00-report-prereqs.t @@ -3,7 +3,7 @@ use strict; use warnings; -# This test was generated by Dist::Zilla::Plugin::Test::ReportPrereqs 0.027 +# This test was generated by Dist::Zilla::Plugin::Test::ReportPrereqs 0.028 use Test::More tests => 1; @@ -188,6 +188,6 @@ if ( @dep_errors ) { ); } -pass; +pass('Reported prereqs'); # vim: ts=4 sts=4 sw=4 et: diff --git a/xt/release/distmeta.t b/xt/author/distmeta.t similarity index 100% rename from xt/release/distmeta.t rename to xt/author/distmeta.t diff --git a/xt/author/eol.t b/xt/author/eol.t index 4aadb99..56e263b 100644 --- a/xt/author/eol.t +++ b/xt/author/eol.t @@ -19,6 +19,7 @@ my @files = ( 't/00-report-prereqs.dd', 't/00-report-prereqs.t', 'xt/author/critic.t', + 'xt/author/distmeta.t', 'xt/author/eol.t', 'xt/author/minimum-version.t', 'xt/author/no-tabs.t', @@ -27,8 +28,7 @@ my @files = ( 'xt/author/pod-syntax.t', 'xt/author/portability.t', 'xt/release/consistent-version.t', - 'xt/release/cpan-changes.t', - 'xt/release/distmeta.t' + 'xt/release/cpan-changes.t' ); eol_unix_ok($_, { trailing_whitespace => 1 }) foreach @files; diff --git a/xt/author/no-tabs.t b/xt/author/no-tabs.t index 591a0dc..d875ae9 100644 --- a/xt/author/no-tabs.t +++ b/xt/author/no-tabs.t @@ -19,6 +19,7 @@ my @files = ( 't/00-report-prereqs.dd', 't/00-report-prereqs.t', 'xt/author/critic.t', + 'xt/author/distmeta.t', 'xt/author/eol.t', 'xt/author/minimum-version.t', 'xt/author/no-tabs.t', @@ -27,8 +28,7 @@ my @files = ( 'xt/author/pod-syntax.t', 'xt/author/portability.t', 'xt/release/consistent-version.t', - 'xt/release/cpan-changes.t', - 'xt/release/distmeta.t' + 'xt/release/cpan-changes.t' ); notabs_ok($_) foreach @files;