aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHakim Cassimally <hakim@mysociety.org>2014-07-15 17:14:00 +0000
committerHakim Cassimally <hakim@mysociety.org>2014-10-16 16:56:26 +0000
commitf47e9d48a2d26e92723ae96d3d65a1ba005f426f (patch)
treef456fe44e7d22b3f27cc75e5090cb5b34e5ee70a
parent06a69fa7a7e9fae205df36ddc68d131d91533792 (diff)
Open311 Role for accepting default config file
See also MooX::ConfigFromFile, but that's underdocumented and seems overengineered -- may be worth implementing if requirements become more complex however. (See also Config::Any, which is well worth doing in future, using YAML only reflects current usage in FMS though.)
-rw-r--r--perllib/Open311/Endpoint/Role/ConfigFile.pm30
-rw-r--r--t/open311/endpoint/config1.yml1
-rw-r--r--t/open311/endpoint/configfile.t23
3 files changed, 54 insertions, 0 deletions
diff --git a/perllib/Open311/Endpoint/Role/ConfigFile.pm b/perllib/Open311/Endpoint/Role/ConfigFile.pm
new file mode 100644
index 000000000..1c4b83355
--- /dev/null
+++ b/perllib/Open311/Endpoint/Role/ConfigFile.pm
@@ -0,0 +1,30 @@
+package Open311::Endpoint::Role::ConfigFile;
+use Moo::Role;
+use Path::Tiny 'path';
+use Carp 'croak';
+use YAML ();
+use Types::Standard qw( Maybe Str );
+
+has config_file => (
+ is => 'ro',
+ isa => Maybe[Str],
+);
+
+around BUILDARGS => sub {
+ my $next = shift;
+ my $class = shift;
+
+ my %args = @_;
+ if (my $config_file = $args{config_file}) {
+ my $cfg = path($config_file);
+ croak "$config_file is not a file" unless $cfg->is_file;
+
+ my $config = YAML::LoadFile($cfg) or croak "Couldn't load config from $config_file";
+ return $class->$next(%$config, %args);
+ }
+ else {
+ return $class->$next(%args);
+ }
+};
+
+1;
diff --git a/t/open311/endpoint/config1.yml b/t/open311/endpoint/config1.yml
new file mode 100644
index 000000000..c444f32c5
--- /dev/null
+++ b/t/open311/endpoint/config1.yml
@@ -0,0 +1 @@
+foo: baz
diff --git a/t/open311/endpoint/configfile.t b/t/open311/endpoint/configfile.t
new file mode 100644
index 000000000..7f41468ba
--- /dev/null
+++ b/t/open311/endpoint/configfile.t
@@ -0,0 +1,23 @@
+use strict; use warnings;
+
+BEGIN {
+ package Foo;
+ use Moo;
+ with 'Open311::Endpoint::Role::ConfigFile';
+
+ has foo => ( is => 'ro', default => 'foo' );
+}
+
+package main;
+use Test::More;
+
+is +Foo->new->foo,
+ 'foo', 'sanity';
+is +Foo->new( foo => 'bar')->foo,
+ 'bar', 'override';
+is +Foo->new( config_file => 't/open311/endpoint/config1.yml' )->foo,
+ 'baz', 'with config';
+is +Foo->new( config_file => 't/open311/endpoint/config1.yml', foo => 'qux' )->foo,
+ 'qux', 'with config, overridden';
+
+done_testing;