Sparrow6 is an automation framework enables scripting and tasks automation in efficient manner.
# _____ __
# / ____| / /
# | (___ _ __ __ _ _ __ _ __ ___ __ __ / /_
# \___ \ | '_ \ / _` | | '__| | '__| / _ \ \ \ /\ / / | '_ \
# ____) | | |_) | | (_| | | | | | | (_) | \ V V / | (_) |
# |_____/ | .__/ \__,_| |_| |_| \___/ \_/\_/ \___/
# | |
# |_|
Install
zef install Sparrow6
First task
nano task.pl6
#!perl6
say 'Hello World'
Run task:
perl6 -MSparrow6::DSL -e task-run
:
14:47:32 10/29/2019 [C:\Users\melezhik\projects\Sparrow6Intro] Hello World
Configuring task
Just create a file named config.yaml
and place it in the root directory:
nano config.yaml
birds:
- sparrow
- crow
- tomtit
To access configuration file inside task call config()
function:
nano task.pl6
#!perl6
say "Hello World";
for config()<birds><> -> $b {
say $b
}
perl6 -MSparrow6::DSL -e task-run
14:51:56 10/29/2019 [C:\Users\melezhik\projects\Sparrow6Intro] Hello World
14:51:56 10/29/2019 [C:\Users\melezhik\projects\Sparrow6Intro] sparrow
14:51:56 10/29/2019 [C:\Users\melezhik\projects\Sparrow6Intro] crow
14:51:56 10/29/2019 [C:\Users\melezhik\projects\Sparrow6Intro] tomtit
To override tasks parameters use Sparrow6 Rakudo API:
nano run.pl6
#!perl6
task-run ".", %(
birds => ( 'wren', 'owl', 'eagle' )
)
perl6 -MSparrow6::DSL run.pl6
:
14:56:43 10/29/2019 [.] Hello World
14:56:43 10/29/2019 [.] wren
14:56:43 10/29/2019 [.] owl
14:56:43 10/29/2019 [.] eagle
Multi language support
Do you know, that Sparrow6 allows you to create tasks not only on Raku? Choose the one you like:
- Perl
- Bash
- Python
- Ruby
- Powershell
Sparrow6 is a language friendly framework. Why? Sometime I find it's more efficient to create tasks in the language more suitable to the problem being solved.
There is more then one language to do it - TIMTOLTDI.
As an example let's rewrite our task in Powershell, it will work just fine.
nano task.ps1
Write-Host "Hello Powershell"
foreach ( $b in config birds ) {
Write-Host $b
}
perl6 -MSparrow6::DSL run.pl6
:
15:19:59 10/29/2019 [.] Hello Powershell
15:19:59 10/29/2019 [.] wren
15:19:59 10/29/2019 [.] owl
15:19:59 10/29/2019 [.] eagle
TDD
Sparrow6 enables embedded test facilities so one can "inject" tests right into scripts.
Let's ensure that our script is friendly and greets every time:
nano task.check
regexp: Hello \s+ \S
perl6 -MSparrow6::DSL run.pl6
:
15:23:29 10/29/2019 [.] Hello Powershell
15:23:29 10/29/2019 [.] wren
15:23:29 10/29/2019 [.] owl
15:23:29 10/29/2019 [.] eagle
[task check] stdout match <Hello \s+ \S> True
Task Check DSL allows many other things to do to verify and parse arbitrary text output.
You don't need a dedicated testing framework, to test your scripts. Batteries are included!
Task - functions
Sparrow6 tasks could act as functions returning values one can handle in high-level Raku scenarios.
Let's say we want to return one random bird from the input list. Update original code of task.pl6
:
#!perl6
say "Hello World";
for config()<birds><> -> $b {
say $b
}
update_state %( random-bird => config()<birds>.pick )
And handle the value inside Raku high-level scenario run.pl6
:
#!perl6
my %state = task-run ".", %(
birds => ( 'wren', 'owl', 'eagle' )
);
say %state.perl;
And now run it:
perl6 -MSparrow6::DSL run.pl6
:
18:03:16 10/29/2019 [.] Hello World
18:03:16 10/29/2019 [.] wren
18:03:16 10/29/2019 [.] owl
18:03:16 10/29/2019 [.] eagle
[task check] stdout match <Hello \s+ \S> True
{:random-bird("eagle")}
Today we have a rain of eagles, huh?
Packaging and distribution
Once you're happy enough with your task and think it could be reusable by others, it's dead easy to wrap it in Sparrow6 package and distribute as a Sparrow6 plugin. Just add a couple of files.
Documentation
It's should Readme.md
documentation file in markdown format.
nano Readme.md
# Birds
Prints birds' names.
# Install
s6 --install birds.
# Install
s6 --install birds
Sparrow6 meta file
Create a file called sparrow.json
to define plugin meta data:
nano sparrow.json
{
"name": "birds",
"description": "Prints birds names",
"version": "0.1.0"
}
To upload plugin run s6
Sparrow6 cli.
s6 --upload
:
15:33:41 10/29/2019 [repository] upload plugin
15:33:41 10/29/2019 [repository] upload birds@0.1.0
Now someone else could enjoy reading beautiful birds' names:
s6 --index-update
:
15:36:15 10/29/2019 [repository] update local index
15:36:15 10/29/2019 [repository] index updated from file://C:\Users\melezhik/repo/api/v1/index
s6 --install birds
:
15:37:49 10/29/2019 [repository] install plugin birds
Either through cli:
s6 --plg-run birds
:
15:38:44 10/29/2019 [task-cli] run plg birds
15:38:44 10/29/2019 [task-cli] run thing birds
15:38:45 10/29/2019 [birds] Hello Powershell
15:38:45 10/29/2019 [birds] sparrow
15:38:45 10/29/2019 [birds] crow
15:38:45 10/29/2019 [birds] tomtit
[task check] stdout match <Hello \s+ \S> True
Or by Raku API
tom --edit birds
#!perl6
task-run "print birds names", "birds", %(
birds => (
'GreenSparrow',
'BlackSparrow',
'YellowSparrow'
)
)
tom birds
:
15:43:38 10/29/2019 [repository] index updated from file://C:\Users\melezhik/repo/api/v1/index
15:43:39 10/29/2019 [print birds names] Hello Powershell
15:43:39 10/29/2019 [print birds names] GreenSparrow
15:43:39 10/29/2019 [print birds names] BlackSparrow
15:43:39 10/29/2019 [print birds names] YellowSparrow
[task check] stdout match <Hello \s+ \S> True
Conclusion
This was informal introduction into Sparrow6 - Raku automation framework.
Thank you for reading. Follow Sparrow6 to know more. I hope you'll find Sparrow6 a useful tool and start using it, as I do in my daily @work.