+sub print_key_differences
+{
+ # Hack around Test::Differences wanting a Test::* module loaded
+ $INC{"Test.pm"} = 1;
+ sub Test::ok { print shift }
+
+ # Diff the tree
+ eq_or_diff([ sort keys %$from_parsed ], [ sort keys %$to_parsed ]);
+}
+
+sub untranslated_keys
+{
+ my ($from_parsed, $to_parsed) = @_;
+ sort grep { not exists $to_parsed->{$_} or $from_parsed->{$_} eq $to_parsed->{$_} } keys %$from_parsed;
+}
+
+sub prune_untranslated_with_blacklist
+{
+ my ($language, @keys) = @_;
+ my %keys;
+ @keys{@keys} = ();
+
+ my $end_yaml = Load(join '', <DATA>);
+ my $untranslated_values = $end_yaml->{untranslated_values};
+ my $default = $untranslated_values->{default};
+ my $this_language = $untranslated_values->{$language} || {};
+
+ my %bw_list = (%$default, %$this_language);
+
+ while (my ($key, $blacklisted) = each %bw_list)
+ {
+ # FIXME: Does syck actually support true/false booleans in yaml?
+ delete $keys{$key} if $blacklisted eq 'true'
+ }
+
+ sort keys %keys;
+}
+