Hash-Merge-Extra-0.06/0000755000175000017500000000000013222704362013465 5ustar mixasmixasHash-Merge-Extra-0.06/lib/0000755000175000017500000000000013222704362014233 5ustar mixasmixasHash-Merge-Extra-0.06/lib/Hash/0000755000175000017500000000000013222704362015116 5ustar mixasmixasHash-Merge-Extra-0.06/lib/Hash/Merge/0000755000175000017500000000000013222704362016155 5ustar mixasmixasHash-Merge-Extra-0.06/lib/Hash/Merge/Extra.pm0000644000175000017500000001255613222703521017603 0ustar mixasmixaspackage Hash::Merge::Extra; use strict; use warnings FATAL => 'all'; use Hash::Merge qw(_merge_hashes); our $VERSION = '0.06'; # Don't forget to change in pod below use constant L_ADDITIVE => { 'SCALAR' => { 'SCALAR' => sub { defined $_[0] ? $_[0] : $_[1] }, 'ARRAY' => sub { defined $_[0] ? $_[0] : $_[1] }, 'HASH' => sub { defined $_[0] ? $_[0] : $_[1] }, }, 'ARRAY' => { 'SCALAR' => sub { $_[0] }, 'ARRAY' => sub { [ @{$_[0]}, @{$_[1]} ] }, 'HASH' => sub { $_[0] }, }, 'HASH' => { 'SCALAR' => sub { $_[0] }, 'ARRAY' => sub { $_[0] }, 'HASH' => sub { _merge_hashes(@_) }, }, }; use constant R_ADDITIVE => { 'SCALAR' => { 'SCALAR' => sub { defined $_[1] ? $_[1] : $_[0] }, 'ARRAY' => sub { $_[1] }, 'HASH' => sub { $_[1] }, }, 'ARRAY' => { 'SCALAR' => sub { defined $_[1] ? $_[1] : $_[0] }, 'ARRAY' => sub { [ @{$_[1]}, @{$_[0]} ] }, 'HASH' => sub { $_[1] }, }, 'HASH' => { 'SCALAR' => sub { defined $_[1] ? $_[1] : $_[0] }, 'ARRAY' => sub { $_[1] }, 'HASH' => sub { _merge_hashes(@_) }, }, }; use constant L_OVERRIDE => { 'SCALAR' => { 'SCALAR' => sub { $_[0] }, 'ARRAY' => sub { $_[0] }, 'HASH' => sub { $_[0] }, }, 'ARRAY' => { 'SCALAR' => sub { $_[0] }, 'ARRAY' => sub { $_[0] }, 'HASH' => sub { $_[0] }, }, 'HASH' => { 'SCALAR' => sub { $_[0] }, 'ARRAY' => sub { $_[0] }, 'HASH' => sub { _merge_hashes(@_) }, }, }; use constant R_OVERRIDE => { 'SCALAR' => { 'SCALAR' => sub { $_[1] }, 'ARRAY' => sub { $_[1] }, 'HASH' => sub { $_[1] }, }, 'ARRAY' => { 'SCALAR' => sub { $_[1] }, 'ARRAY' => sub { $_[1] }, 'HASH' => sub { $_[1] }, }, 'HASH' => { 'SCALAR' => sub { $_[1] }, 'ARRAY' => sub { $_[1] }, 'HASH' => sub { _merge_hashes(@_) }, }, }; use constant L_REPLACE => { 'SCALAR' => { 'SCALAR' => sub { $_[0] }, 'ARRAY' => sub { $_[0] }, 'HASH' => sub { $_[0] }, }, 'ARRAY' => { 'SCALAR' => sub { $_[0] }, 'ARRAY' => sub { $_[0] }, 'HASH' => sub { $_[0] }, }, 'HASH' => { 'SCALAR' => sub { $_[0] }, 'ARRAY' => sub { $_[0] }, 'HASH' => sub { $_[0] }, }, }; use constant R_REPLACE => { 'SCALAR' => { 'SCALAR' => sub { $_[1] }, 'ARRAY' => sub { $_[1] }, 'HASH' => sub { $_[1] }, }, 'ARRAY' => { 'SCALAR' => sub { $_[1] }, 'ARRAY' => sub { $_[1] }, 'HASH' => sub { $_[1] }, }, 'HASH' => { 'SCALAR' => sub { $_[1] }, 'ARRAY' => sub { $_[1] }, 'HASH' => sub { $_[1] }, }, }; my %INDEX = ( L_ADDITIVE => L_ADDITIVE, L_OVERRIDE => L_OVERRIDE, L_REPLACE => L_REPLACE, R_ADDITIVE => R_ADDITIVE, R_OVERRIDE => R_OVERRIDE, R_REPLACE => R_REPLACE, ); sub import { shift; # throw off package name for (@_ ? @_ : keys %INDEX) { unless (exists $INDEX{$_}) { require Carp; Carp::croak "Unable to register $_ (no such behavior)"; } Hash::Merge::specify_behavior($INDEX{$_}, $_); } } 1; __END__ =head1 NAME Hash::Merge::Extra - Collection of extra behaviors for L =begin html Travis CI Coverage Status CPAN version =end html =head1 VERSION Version 0.06 =head1 SYNOPSIS use Hash::Merge qw(merge); use Hash::Merge::Extra; Hash::Merge::set_behavior('R_OVERRIDE'); $result = merge($left, $right); =head1 EXPORT Nothing is exported. All behaviors registered in L if used as use Hash::Merge::Extra; Nothing registered if passed empty list: use Hash::Merge::Extra qw(); Only specified behaviors registered if list defined: use Hash::Merge::Extra qw(L_OVERRIDE R_REPLACE); =head1 BEHAVIORS =over 4 =item B, B Hashes merged, arrays joined, undefined scalars overrided. Left and right precedence. =item B, B Hashes merged, arrays and scalars overrided. Left and right precedence. =item B, B Nothing merged. One thing simply replaced by another. Left and right precedence. =back =head1 AUTHOR Michael Samoglyadov, C<< >> =head1 BUGS Please report any bugs or feature requests to L =head1 SEE ALSO L =head1 LICENSE AND COPYRIGHT Copyright 2017,2018 Michael Samoglyadov. This program is free software; you can redistribute it and/or modify it under the terms of either: the GNU General Public License as published by the Free Software Foundation; or the Artistic License. See L for more information. =cut Hash-Merge-Extra-0.06/META.yml0000644000175000017500000000117113222704362014736 0ustar mixasmixas--- abstract: 'Collection of extra behaviors for L' author: - 'Michael Samoglyadov ' build_requires: Test::More: 0 configure_requires: ExtUtils::MakeMaker: 0 dynamic_config: 1 generated_by: 'ExtUtils::MakeMaker version 6.66, CPAN::Meta::Converter version 2.133380' license: perl meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html version: 1.4 name: Hash-Merge-Extra no_index: directory: - t - inc requires: Hash::Merge: 0 parent: 0 perl: 5.006 strict: 0 warnings: 0 resources: repository: https://github.com/mr-mixas/Hash-Merge-Extra.pm version: 0.06 Hash-Merge-Extra-0.06/Makefile.PL0000644000175000017500000000170613134354432015444 0ustar mixasmixasuse 5.006; use strict; use warnings FATAL => 'all'; use ExtUtils::MakeMaker; WriteMakefile( NAME => 'Hash::Merge::Extra', AUTHOR => 'Michael Samoglyadov ', VERSION_FROM => 'lib/Hash/Merge/Extra.pm', ABSTRACT_FROM => 'lib/Hash/Merge/Extra.pm', LICENSE => 'Perl_5', PL_FILES => {}, MIN_PERL_VERSION => 5.006, CONFIGURE_REQUIRES => { 'ExtUtils::MakeMaker' => 0, }, BUILD_REQUIRES => { 'Test::More' => 0, }, META_MERGE => { resources => { repository => 'https://github.com/mr-mixas/Hash-Merge-Extra.pm', }, }, PREREQ_PM => { 'parent' => 0, 'strict' => 0, 'warnings' => 0, 'Hash::Merge' => 0, }, dist => { COMPRESS => 'gzip -9f', SUFFIX => 'gz', }, clean => { FILES => 'Hash-Merge-Extra-* cover_db' }, ); Hash-Merge-Extra-0.06/Changes0000644000175000017500000000102713222704255014761 0ustar mixasmixasRevision history for Hash-Merge-Extra 0.06 2018-01-02 - {L,R}_MERGE_PATCH removed (impossible to remove hash items using Hash::Merge) - dist corrected 0.05 2017-12-15 - {L,R}_JSON_MERGE_PATCH behaviors renamed to {L,R}_MERGE_PATCH 0.04 2017-11-25 - L_JSON_MERGE_PATCH and R_JSON_MERGE_PATCH behaviors added (rfc7386) 0.03 2017-08-14 - docs improved 0.02 2017-08-04 - L_ADDITIVE and R_ADDITIVE behaviors added 0.01 2017-07-22 - Initial release. Hash-Merge-Extra-0.06/META.json0000644000175000017500000000215713222704362015113 0ustar mixasmixas{ "abstract" : "Collection of extra behaviors for L", "author" : [ "Michael Samoglyadov " ], "dynamic_config" : 1, "generated_by" : "ExtUtils::MakeMaker version 6.66, CPAN::Meta::Converter version 2.133380", "license" : [ "perl_5" ], "meta-spec" : { "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", "version" : "2" }, "name" : "Hash-Merge-Extra", "no_index" : { "directory" : [ "t", "inc" ] }, "prereqs" : { "build" : { "requires" : { "Test::More" : "0" } }, "configure" : { "requires" : { "ExtUtils::MakeMaker" : "0" } }, "runtime" : { "requires" : { "Hash::Merge" : "0", "parent" : "0", "perl" : "5.006", "strict" : "0", "warnings" : "0" } } }, "release_status" : "stable", "resources" : { "repository" : { "url" : "https://github.com/mr-mixas/Hash-Merge-Extra.pm" } }, "version" : "0.06" } Hash-Merge-Extra-0.06/MANIFEST0000644000175000017500000000057113222704362014621 0ustar mixasmixasChanges lib/Hash/Merge/Extra.pm Makefile.PL MANIFEST README t/00-load.t t/L_ADDITIVE.t t/L_OVERRIDE.t t/L_REPLACE.t t/R_ADDITIVE.t t/R_OVERRIDE.t t/R_REPLACE.t t/import.t t/manifest.t t/pod-coverage.t t/pod.t META.yml Module YAML meta-data (added by MakeMaker) META.json Module JSON meta-data (added by MakeMaker) Hash-Merge-Extra-0.06/t/0000755000175000017500000000000013222704362013730 5ustar mixasmixasHash-Merge-Extra-0.06/t/import.t0000644000175000017500000000036413215022037015424 0ustar mixasmixas#!perl -T use strict; use warnings FATAL => 'all'; use Test::More tests => 1; eval "use Hash::Merge::Extra qw(NOT_EXISTS)"; like( $@, qr/^Unable to register NOT_EXISTS \(no such behavior\) /, "Must croak for absent behaviors" ); Hash-Merge-Extra-0.06/t/manifest.t0000644000175000017500000000050713215022037015717 0ustar mixasmixas#!perl -T use 5.006; use strict; use warnings FATAL => 'all'; use Test::More; unless ( $ENV{RELEASE_TESTING} ) { plan( skip_all => "Author tests not required for installation" ); } my $min_tcm = 0.9; eval "use Test::CheckManifest $min_tcm"; plan skip_all => "Test::CheckManifest $min_tcm required" if $@; ok_manifest(); Hash-Merge-Extra-0.06/t/pod.t0000644000175000017500000000040113215022037014664 0ustar mixasmixas#!perl -T use 5.006; use strict; use warnings FATAL => 'all'; use Test::More; # Ensure a recent version of Test::Pod my $min_tp = 1.22; eval "use Test::Pod $min_tp"; plan skip_all => "Test::Pod $min_tp required for testing POD" if $@; all_pod_files_ok(); Hash-Merge-Extra-0.06/t/R_REPLACE.t0000644000175000017500000000272513215022037015451 0ustar mixasmixas#!perl -T use strict; use warnings FATAL => 'all'; use Test::More; use Hash::Merge qw(merge); use Hash::Merge::Extra; ok( Hash::Merge::set_behavior('R_REPLACE') ) || BAIL_OUT('Failed to set behavior'); my ($got, @tests); @tests = ( { one => 'alpha', two => 'beta', out => 'beta', msg => "scalar vs scalar", }, { one => 'alpha', two => [], out => [], msg => "scalar vs array", }, { one => 'alpha', two => {}, out => {}, msg => "scalar vs hash", }, { one => [0, 1], two => 'beta', out => 'beta', msg => "array vs scalar", }, { one => [0, 1], two => [1, 2], out => [1, 2], msg => "array vs array", }, { one => [0, 1], two => {a => 0, b => 1}, out => {a => 0, b => 1}, msg => "array vs hash", }, { one => {a => 0, b => 1}, two => 'beta', out => 'beta', msg => "hash vs scalar", }, { one => {a => 0, b => 1}, two => [1, 2], out => [1, 2], msg => "hash vs array", }, { one => {a => 0, b => 1}, two => {a => 9, c => 2}, out => {a => 9, c => 2}, msg => "hash vs hash", }, ); for (@tests) { $got = merge($_->{one}, $_->{two}); is_deeply($got, $_->{out}, $_->{msg}) || diag explain $got; } done_testing(@tests + 1); Hash-Merge-Extra-0.06/t/L_REPLACE.t0000644000175000017500000000275213215022037015443 0ustar mixasmixas#!perl -T use strict; use warnings FATAL => 'all'; use Test::More; use Hash::Merge qw(merge); use Hash::Merge::Extra; ok( Hash::Merge::set_behavior('L_REPLACE') ) || BAIL_OUT('Failed to set behavior'); my ($got, @tests); @tests = ( { one => 'alpha', two => 'beta', out => 'alpha', msg => "scalar vs scalar", }, { one => 'alpha', two => [], out => 'alpha', msg => "scalar vs array", }, { one => 'alpha', two => {}, out => 'alpha', msg => "scalar vs hash", }, { one => [0, 1], two => 'beta', out => [0, 1], msg => "array vs scalar", }, { one => [0, 1], two => [1, 2], out => [0, 1], msg => "array vs array", }, { one => [0, 1], two => {a => 0, b => 1}, out => [0, 1], msg => "array vs hash", }, { one => {a => 0, b => 1}, two => 'beta', out => {a => 0, b => 1}, msg => "hash vs scalar", }, { one => {a => 0, b => 1}, two => [1, 2], out => {a => 0, b => 1}, msg => "hash vs array", }, { one => {a => 0, b => 1}, two => {a => 9, c => 2}, out => {a => 0, b => 1}, msg => "hash vs hash", }, ); for (@tests) { $got = merge($_->{one}, $_->{two}); is_deeply($got, $_->{out}, $_->{msg}) || diag explain $got; } done_testing(@tests + 1); Hash-Merge-Extra-0.06/t/L_ADDITIVE.t0000644000175000017500000000347713215022037015566 0ustar mixasmixas#!perl -T use strict; use warnings FATAL => 'all'; use Test::More; use Hash::Merge qw(merge); use Hash::Merge::Extra; ok( Hash::Merge::set_behavior('L_ADDITIVE') ) || BAIL_OUT('Failed to set behavior'); my ($got, @tests); @tests = ( { one => undef, two => 'beta', out => 'beta', msg => "undef vs scalar", }, { one => undef, two => [], out => [], msg => "undef vs array", }, { one => undef, two => {}, out => {}, msg => "undef vs hash", }, { one => 'alpha', two => 'beta', out => 'alpha', msg => "scalar vs scalar", }, { one => 'alpha', two => [], out => 'alpha', msg => "scalar vs array", }, { one => 'alpha', two => {}, out => 'alpha', msg => "scalar vs hash", }, { one => [0, 1], two => 'beta', out => [0, 1], msg => "array vs scalar", }, { one => [0, 1], two => [1, 2], out => [0, 1, 1, 2], msg => "array vs array", }, { one => [0, 1], two => {a => 0, b => 1}, out => [0, 1], msg => "array vs hash", }, { one => {a => 0, b => 1}, two => 'beta', out => {a => 0, b => 1}, msg => "hash vs scalar", }, { one => {a => 0, b => 1}, two => [1, 2], out => {a => 0, b => 1}, msg => "hash vs array", }, { one => {a => 0, b => 1}, two => {a => 9, c => 2}, out => {a => 0, b => 1, c => 2}, msg => "hash vs hash", }, ); for (@tests) { $got = merge($_->{one}, $_->{two}); is_deeply($got, $_->{out}, $_->{msg}) || diag explain $got; } done_testing(@tests + 1); Hash-Merge-Extra-0.06/t/R_OVERRIDE.t0000644000175000017500000000273613215022037015617 0ustar mixasmixas#!perl -T use strict; use warnings FATAL => 'all'; use Test::More; use Hash::Merge qw(merge); use Hash::Merge::Extra; ok( Hash::Merge::set_behavior('R_OVERRIDE') ) || BAIL_OUT('Failed to set behavior'); my ($got, @tests); @tests = ( { one => 'alpha', two => 'beta', out => 'beta', msg => "scalar vs scalar", }, { one => 'alpha', two => [], out => [], msg => "scalar vs array", }, { one => 'alpha', two => {}, out => {}, msg => "scalar vs hash", }, { one => [0, 1], two => 'beta', out => 'beta', msg => "array vs scalar", }, { one => [0, 1], two => [1, 2], out => [1, 2], msg => "array vs array", }, { one => [0, 1], two => {a => 0, b => 1}, out => {a => 0, b => 1}, msg => "array vs hash", }, { one => {a => 0, b => 1}, two => 'beta', out => 'beta', msg => "hash vs scalar", }, { one => {a => 0, b => 1}, two => [1, 2], out => [1, 2], msg => "hash vs array", }, { one => {a => 0, b => 1}, two => {a => 9, c => 2}, out => {a => 9, b => 1, c => 2}, msg => "hash vs hash", }, ); for (@tests) { $got = merge($_->{one}, $_->{two}); is_deeply($got, $_->{out}, $_->{msg}) || diag explain $got; } done_testing(@tests + 1); Hash-Merge-Extra-0.06/t/pod-coverage.t0000644000175000017500000000111313215022037016456 0ustar mixasmixas#!perl -T use 5.006; use strict; use warnings FATAL => 'all'; use Test::More; # Ensure a recent version of Test::Pod::Coverage my $min_tpc = 1.08; eval "use Test::Pod::Coverage $min_tpc"; plan skip_all => "Test::Pod::Coverage $min_tpc required for testing POD coverage" if $@; # Test::Pod::Coverage doesn't require a minimum Pod::Coverage version, # but older versions don't recognize some common documentation styles my $min_pc = 0.18; eval "use Pod::Coverage $min_pc"; plan skip_all => "Pod::Coverage $min_pc required for testing POD coverage" if $@; all_pod_coverage_ok(); Hash-Merge-Extra-0.06/t/R_ADDITIVE.t0000644000175000017500000000345413215022037015567 0ustar mixasmixas#!perl -T use strict; use warnings FATAL => 'all'; use Test::More; use Hash::Merge qw(merge); use Hash::Merge::Extra; ok( Hash::Merge::set_behavior('R_ADDITIVE') ) || BAIL_OUT('Failed to set behavior'); my ($got, @tests); @tests = ( { one => 'alpha', two => undef, out => 'alpha', msg => "scalar vs undef", }, { one => 'alpha', two => 'beta', out => 'beta', msg => "scalar vs scalar", }, { one => 'alpha', two => [], out => [], msg => "scalar vs array", }, { one => 'alpha', two => {}, out => {}, msg => "scalar vs hash", }, { one => [], two => undef, out => [], msg => "array vs undef", }, { one => [0, 1], two => 'beta', out => 'beta', msg => "array vs scalar", }, { one => [0, 1], two => [1, 2], out => [1, 2, 0, 1], msg => "array vs array", }, { one => [0, 1], two => {a => 0, b => 1}, out => {a => 0, b => 1}, msg => "array vs hash", }, { one => {}, two => undef, out => {}, msg => "hash vs undef", }, { one => {a => 0, b => 1}, two => 'beta', out => 'beta', msg => "hash vs scalar", }, { one => {a => 0, b => 1}, two => [1, 2], out => [1, 2], msg => "hash vs array", }, { one => {a => 0, b => 1}, two => {a => 9, c => 2}, out => {a => 9, b => 1, c => 2}, msg => "hash vs hash", }, ); for (@tests) { $got = merge($_->{one}, $_->{two}); is_deeply($got, $_->{out}, $_->{msg}) || diag explain $got; } done_testing(@tests + 1); Hash-Merge-Extra-0.06/t/L_OVERRIDE.t0000644000175000017500000000276313215022037015611 0ustar mixasmixas#!perl -T use strict; use warnings FATAL => 'all'; use Test::More; use Hash::Merge qw(merge); use Hash::Merge::Extra; ok( Hash::Merge::set_behavior('L_OVERRIDE') ) || BAIL_OUT('Failed to set behavior'); my ($got, @tests); @tests = ( { one => 'alpha', two => 'beta', out => 'alpha', msg => "scalar vs scalar", }, { one => 'alpha', two => [], out => 'alpha', msg => "scalar vs array", }, { one => 'alpha', two => {}, out => 'alpha', msg => "scalar vs hash", }, { one => [0, 1], two => 'beta', out => [0, 1], msg => "array vs scalar", }, { one => [0, 1], two => [1, 2], out => [0, 1], msg => "array vs array", }, { one => [0, 1], two => {a => 0, b => 1}, out => [0, 1], msg => "array vs hash", }, { one => {a => 0, b => 1}, two => 'beta', out => {a => 0, b => 1}, msg => "hash vs scalar", }, { one => {a => 0, b => 1}, two => [1, 2], out => {a => 0, b => 1}, msg => "hash vs array", }, { one => {a => 0, b => 1}, two => {a => 9, c => 2}, out => {a => 0, b => 1, c => 2}, msg => "hash vs hash", }, ); for (@tests) { $got = merge($_->{one}, $_->{two}); is_deeply($got, $_->{out}, $_->{msg}) || diag explain $got; } done_testing(@tests + 1); Hash-Merge-Extra-0.06/t/00-load.t0000644000175000017500000000037013215022037015243 0ustar mixasmixas#!perl -T use 5.006; use strict; use warnings FATAL => 'all'; use Test::More; plan tests => 1; BEGIN { use_ok( 'Hash::Merge::Extra' ) || print "Bail out!\n"; } diag( "Testing Hash::Merge::Extra $Hash::Merge::Extra::VERSION, Perl $], $^X" ); Hash-Merge-Extra-0.06/README0000644000175000017500000000207713222703502014346 0ustar mixasmixasHash-Merge-Extra Hash::Merge::Extra - Collection of extra behaviors for Hash::Merge INSTALLATION To install this module, run the following commands: perl Makefile.PL make make test make install SUPPORT AND DOCUMENTATION After installing, you can find documentation for this module with the perldoc command. perldoc Hash::Merge::Extra You can also look for information at: RT, CPAN's request tracker (report bugs here) http://rt.cpan.org/NoAuth/Bugs.html?Dist=Hash-Merge-Extra AnnoCPAN, Annotated CPAN documentation http://annocpan.org/dist/Hash-Merge-Extra CPAN Ratings http://cpanratings.perl.org/d/Hash-Merge-Extra Search CPAN http://search.cpan.org/dist/Hash-Merge-Extra/ LICENSE AND COPYRIGHT Copyright (C) 2017,2018 Michael Samoglyadov This program is free software; you can redistribute it and/or modify it under the terms of either: the GNU General Public License as published by the Free Software Foundation; or the Artistic License. See L for more information.