in reply to Dancer2: Create a configuration for testing

G'day mikkoi,

[Disclaimer: I'm not a Dancer2 user; in fact, I needed to install it for the tests below. I just used available documentation for the code I wrote.]

Dancer2::Core::Role::ConfigReader has:

"... provides a setting() method which is supposed to be used by externals to read/write config entries."

Running this (quick-and-dirty) script:

#!/usr/bin/env perl use strict; use warnings; use Dancer2; get '/hello' => sub { return 'Hello, world!'; }; get '/my_stuff' => sub { my $my_stuff = setting('my_stuff') || {}; my $x = $my_stuff->{X} || 'not set'; my $y = $my_stuff->{Y} || 'not set'; return "X[$x] Y[$y]"; }; get '/my_new_stuff' => sub { setting('my_stuff' => {X => 'newX', Y => 'newY'}); return 'New stuff configured.'; }; dance;

I was able to do:

$ curl http://localhost:3000/hello Hello, world! $ curl http://localhost:3000/my_stuff X[not set] Y[not set] $ curl http://localhost:3000/my_new_stuff New stuff configured. $ curl http://localhost:3000/my_stuff X[newX] Y[newY]

That seems to be the type of thing you're trying to do. Apologies in advance if I'm barking up the wrong tree.

— Ken

Replies are listed 'Best First'.
Re^2: Dancer2: Create a configuration for testing
by 1nickt (Canon) on Jan 06, 2021 at 13:26 UTC

    Nice demo Ken! Dancer is cool, isn't it?

    I think that the set keyword in the Dancer DSL is intended to be the user-called function that wraps the Role method. I updated your example to use

    set 'my_stuff' => {X => 'newX', Y => 'newY'};
    ... which is how I code my own D2 apps, as shown in the main doc, and it worked the same.

    Hope this helps!


    The way forward always starts with a minimal test.

      ++ Thanks for the generous feedback.

      As I indicated, that was my first Dancer2 code; although, I do have some minimal experience with Dancer, so it wasn't completely foreign to me. I appreciate the heads-up re set vs. setting.

      I did an additional test, using config and set (instead of the two setting() calls) and adding an actual config file.

      Code change:

      get '/my_stuff' => sub { my $my_stuff = config->{my_stuff} || {}; my $x = $my_stuff->{X} || 'not set'; my $y = $my_stuff->{Y} || 'not set'; return "X[$x] Y[$y]"; }; get '/my_new_stuff' => sub { set my_stuff => {X => 'newX', Y => 'newY'}; return 'New stuff configured.'; };

      New config file (in the same directory as the code):

      $ cat config.yml my_stuff: { X: 'oldX' }

      Test:

      $ curl http://localhost:3000/my_stuff X[oldX] Y[not set] $ curl http://localhost:3000/my_new_stuff New stuff configured. $ curl http://localhost:3000/my_stuff X[newX] Y[newY]

      I suspect that's a bit closer to what the OP wants: we'll have to wait and see.

      — Ken