Thanks for that explanation. I don't need it now, I was only curious about a particular use-case, just in case I have a similar one. I know TAP and I also know pragmas syntactically, but never had a real world use-case for it.
Thanks and regards, Steffen "Nathan (Nat) Goodman" <ngood...@systemsbiology.org> writes: > The pragma is 'stop_testing'. > > The test script that deals with the issue is t/babel.000.reqs.t. Near the > top, the scripts says > print "TAP version 13\n"; > > The script then checks that certain essential modules can be loaded - > Class::AutoDB, DBI, DBD::mysql. For reasons I don't understand, despite > being listed in the 'build_requires' section of Build.PL, Build tries to do > the build even when these prerequisites are not met. > > Finally the script tries to connect to MySQL and do the necessary > manipulations. > > If any of the checks fail, the script constructs a detailed diagnostic > message and prints it by saying > diag($diag); > Then it prints the pragma: > print "pragma +stop_testing\n"; > > The TAP parser processes the pragma and makes this information available to > the harness. The code that handles the pragma is in my customized version of > run_tap_harness in t/Build.pm. The main part of run_tap_harness is a loop > that runs each test script. At the end of each iteration, ie, after running > each test script, the code says > my @parsers=$agg->parsers; > my $parser=$parsers[$#parsers]; > my @pragmas=$parser->pragmas; > last if grep /stop_testing/i,@pragmas; > > This reaches into the TAP aggregator (the aggregator collects results from > compound tests - not relevant here) to get the list of parsers that were > created to parse the test results - here there will only be one, but I wrote > the code for the general case. Then it grabs the last parser and gets the > list of pragmas processed by the parser - again there will only be one, but I > wrote the code for the general case. If one of the pragmas was stop_testing, > it breaks out of the loop and the test suite comes to a halt. > > This is not the only way one could solve the problem. Instead of using the > pragma mechanism (some might say 'mis-using' since stop_testing is really a > directive not a pragma in the proper sense), one could invent a new kind of > TAP message and create a TAP parser subclass to process the message. The > TAP design envisions this sort of customization and it wouldn't be too hard. > I chose to go the pragma route because it was a bit simpler for my limited > purpose. > > What are you trying to do? Are you looking for a way to check that MySQL is > available, or are you thinking about using the pragma mechanism for something > else? > > Best, > Nat > > On Aug 9, 2013, at 5:01 AM, Steffen Schwigon wrote: > >> Hi! >> >> And what particular pragma did you invent, when is it generated, how >> does it influence the TAP parsing with the particular "MySQL >> unavailable" isse? >> >> Thanks. >> >> Kind regards, >> Steffen >> >> "Nathan (Nat) Goodman" <ngood...@systemsbiology.org> writes: >>> Hi Steffen >>> >>> TAP as you probably know is a line-oriented protocol whose main purpose it >>> to let test scripts communicate pass/fail results to a test harness. >>> Functions like 'ok' or 'pass' or 'fail' in Test::More print lines that tell >>> the harness whether a test passed or failed. >>> >>> The main TAP site is http://testanything.org/. The TAP specification is at >>> http://podwiki.hexten.net/TAP/TAP.html?page=TAP >>> >>> I learned about TAP pragmas by reading the TAP CPAN documentation and code, >>> esp. TAP::Parser , >>> http://search.cpan.org/~ovid/Test-Harness-3.28/lib/TAP/Parser.pm#pragmas >>> >>> To make it work you have to tell the TAP harness that you're using TAP >>> version 13, whose specification is at >>> http://podwiki.hexten.net/TAP/TAP13.html?page=TAP13 >>> >>> You do this from a test script by printing this line >>> TAP version 13 >>> >>> The format of a pragma is pragma +/-<whatever>, eg, >>> pragma +strict >>> >>> The + or - is mandatory! >>> >>> To process a non-standard pragma, you have to customize some aspect of the >>> test harness. I did this by creating a subclass of Module::Build which I >>> needed for other purposes anyway. The subclass is in the Data::Babel 1.12 >>> distribution, file t/Build.pm. You also have to tell the main Build driver >>> to use the subclass. This is in Build.PL; the relevant few lines of code >>> are near the top >>> >>> use lib qw(t); >>> use t::Build; # my Module::Build subclass >>> my $class='t::Build'; >>> >>> followed a few lines later by >>> >>> my $builder = $class->new >>> .... >>> >>> I hope this helps. Feel free to ask for further clarification as >>> necessary. I'm glad to help. >>> >>> Best, >>> Nat >>> >>> On Aug 6, 2013, at 3:51 AM, Steffen Schwigon wrote: >>> >>>> "Nathan (Nat) Goodman" <ngood...@systemsbiology.org> writes: >>>>> 3) What I ended up doing with Data::Babel (and will do with >>>>> Class:AutoDB soon) is to move the check for MySQL into a test script >>>>> that runs first. If the script detects that MySQL is unavailable, it >>>>> reports this to the test driver using the pragma capability of TAP >>>>> version 13, and a slightly customized version of >>>>> Build::run_tap_harness (included in my distribution) breaks out of the >>>>> test suite when it sees this pragma, reporting PASS as the outcome. >>>> >>>> Can you please elaborate more on the details of your pragma solution. >>>> >>>> I never saw a TAP pragma in real world[1] and would love to understand >>>> it - without reading into your code, sorry for that laziness... :-) >>>> >>>> Kind regards, >>>> Steffen >>>> >>>> Footnotes: >>>> [1] except that I support highlighting it in Emacs TAP mode >>>> -- >>>> Steffen Schwigon <s...@renormalist.net> >>> >> >> -- >> Steffen Schwigon <s...@renormalist.net> > -- Steffen Schwigon <s...@renormalist.net>