Compare commits

...

184 Commits

Author SHA1 Message Date
Graham Ollis
56599bf4f7 rm unnecessary returns 2015-03-19 13:45:03 -04:00
Graham Ollis
bba3793735 v1.55
- Mojo 6.x compat
2015-02-28 10:32:15 -05:00
Graham Ollis
ac65e8797e update changes 2015-02-28 10:31:34 -05:00
Graham Ollis
32f8daf9cd mojo 6.x compat 2015-02-28 10:31:27 -05:00
Graham Ollis
1025d74a36 v1.54
- cpantesters: do not report on older perls
2014-12-20 10:18:14 -05:00
Graham Ollis
4203effb6b update changes 2014-12-20 10:16:02 -05:00
Graham Ollis
c6276a8d78 update release tests and diagnostic 2014-12-20 10:15:34 -05:00
Graham Ollis
6dfa5560a8 do not report on older Perls 2014-12-20 10:14:21 -05:00
Graham Ollis
bca2f85fb3 update travis 2014-07-31 08:24:57 -04:00
Graham Ollis
5b364d31ac v1.53
- Mojolicious 5.0 support
2014-05-31 06:23:08 -04:00
Graham Ollis
f9bc6aa56a some house keeping 2014-05-31 06:20:50 -04:00
Graham Ollis
65e4bbf7c8 Mojolicious 5.0 support 2014-05-31 06:12:45 -04:00
Graham Ollis
5870c014c2 v1.52
- updated repository name
2014-05-08 19:27:10 -04:00
Graham Ollis
8dcb4147f7 updated repostiryo name 2014-05-08 19:25:32 -04:00
Graham Ollis
c489fbc86e update diagnostic and release tets 2014-05-08 19:25:20 -04:00
Graham Ollis
9699560925 clean up deps 2014-03-21 15:06:29 -04:00
Graham Ollis
247e2251b3 v1.51
- extended diagnostics
        - documentation tweaks
        - fix non-lite app example (GH#41, uwisser)
2014-03-21 14:59:55 -04:00
Graham Ollis
1b1e8cb63e doco 2014-03-21 14:58:55 -04:00
Graham Ollis
6598b29c2c update release tests 2014-03-21 14:58:30 -04:00
Graham Ollis
b40a0f97ee spelling 2014-03-21 14:58:16 -04:00
Graham Ollis
a1f36d716f update diagnostic 2014-03-21 14:57:50 -04:00
Graham Ollis
af07f0f983 example dev log should not be included in git or cpan 2014-03-21 14:42:55 -04:00
Ulrich Wisser
14884dd82d Fix template names in text and variable name in heading 2014-03-21 10:24:25 +01:00
Graham Ollis
f029ad393f doco 2013-09-28 12:45:16 -04:00
Graham Ollis
3ca192cd4f new diagnostic 2013-09-28 12:36:00 -04:00
Graham Ollis
e955bb151a spacing 2013-09-28 12:26:19 -04:00
Graham Ollis
02696ed4a1 migrate to newer version of [@Author::Plicease] 2013-09-10 07:53:20 -04:00
Graham Ollis
7bf464398d v1.50
- update Changes to follow spec (GH#39, Сергей Романов)
        - minor documentation fixes
2013-08-08 16:51:35 -04:00
Graham Ollis
a7a268267c fix the stopwords 2013-08-08 16:50:43 -04:00
Graham Ollis
19876306b6 tweaks 2013-08-08 16:45:01 -04:00
Graham Ollis
2b230680e5 Merge branch 'master' of github.com:plicease/mojox-renderer-tt 2013-08-08 16:37:25 -04:00
Graham Ollis
b72fb699e9 add release tests
(fix minor stuff found by release tets)
2013-08-08 16:37:09 -04:00
Graham Ollis
9667221f20 Merge pull request #39 from sergeyromanov/patch-1
Reformat change log as per CPAN::Changes::Spec
2013-08-08 13:36:23 -07:00
Sergey Romanov
a9ffb24a8f Revert dist.ini, put time and TZ back 2013-08-08 23:43:41 +04:00
Graham Ollis
f0136a4a24 forgot that mojo doesn't support 5.8 anymore 2013-08-08 15:18:25 -04:00
Sergey Romanov
003b7c431c Adjust release date format within dzil 2013-08-08 21:42:19 +04:00
Sergey Romanov
a55ae15582 Reformat change log as per CPAN::Changes::Spec 2013-08-08 21:22:02 +04:00
Graham Ollis
75d795fd6f more perl? 2013-08-08 09:22:36 -04:00
Graham Ollis
9c4e322dec v1.49
- documentation
2013-08-08 09:19:19 -04:00
Graham Ollis
48b19a5ab9 formatting fixes 2013-08-08 09:18:41 -04:00
Graham Ollis
6cd14f157a v1.48
- documentation
2013-08-08 09:13:32 -04:00
Graham Ollis
da9f15fa17 you know what? Don't really need that. 2013-08-08 09:13:07 -04:00
Graham Ollis
5267ab7538 more doco improvements 2013-08-08 09:11:04 -04:00
Graham Ollis
90e2562862 tweak example 2013-08-08 09:05:58 -04:00
Graham Ollis
e541ac92b7 include a full app example 2013-08-08 09:03:48 -04:00
Graham Ollis
6386e0620e doco 2013-08-08 08:51:56 -04:00
Graham Ollis
cfbf3e8ea3 use mojolicious' full name in abstract 2013-08-07 09:52:27 -04:00
Graham Ollis
8a367fc87d v1.47
- Template-Toolkit 2.25 compatability
2013-07-26 06:07:47 -04:00
Graham Ollis
ab7117d632 change regex to fix test 2013-07-26 05:58:36 -04:00
Graham Ollis
b2062785db Merge branch 'master' of github.com:plicease/mojox-renderer-tt 2013-07-10 07:35:13 -04:00
Graham Ollis
a30b13d6b0 doco 2013-07-10 07:35:01 -04:00
Graham Ollis
002efafefa test against perl 5.18 2013-07-06 09:28:45 -04:00
Graham Ollis
fc6b51b1c1 rm pre-dzil cruft 2013-06-25 12:00:03 -04:00
Graham Ollis
654ff61789 v1.46
- Mojolicious 4.0 compatability
2013-05-19 11:13:27 -04:00
Graham Ollis
d340a27585 travis update 2013-05-19 11:10:25 -04:00
Graham Ollis
5d3e3eaf3b mojo 4.0 compat 2013-05-19 11:07:01 -04:00
Graham Ollis
d63632735f test against 5.16 2013-05-07 20:26:06 -04:00
Graham Ollis
90f8df88a9 v1.45
- correctly support app->default->{layout} (GH#37, Fayland Lam)
2013-04-26 13:38:19 -04:00
Fayland Lam
fe963f6511 fix for defaults layout 2013-04-26 13:35:46 -04:00
Graham Ollis
9be62a9c2c v1.44
- promote development changes to production
2013-04-13 17:49:27 -04:00
Graham Ollis
7f072b88be v1.43_01
- _template_modified returns value from super class instead of 1 if true (GH#36, Fayland Lam)
2013-04-11 15:43:42 -04:00
Graham Ollis
0faf79001b fix for GH#36 2013-04-11 15:42:20 -04:00
Graham Ollis
f22529d42e v1.43
- promote development changes
2013-04-08 14:03:08 -04:00
Graham Ollis
abcd8c3293 v1.42_04
- Updated meta for new github repo location
2013-04-06 20:30:57 -04:00
Graham Ollis
7ba4f4bf5c v1.42_03
- Allow custom relative paths for cache_dir (GH#35, Jason Crowther)
2013-03-22 14:27:32 -04:00
Graham Ollis
593d9d1640 Merge pull request #35 from tophopstop/master
Bug with setting cache_dir to relative path
2013-03-22 11:23:04 -07:00
Jason Crowther
5e8ade81e4 bug fix, remove unintentional hard coded cache path. 2013-03-22 12:13:08 -04:00
Graham Ollis
70231b1bce v1.42_02
- only create COMPILE_DIR based on UID if the user doesn't specify COMPILE_DIR
2013-02-26 18:17:49 -05:00
Graham Ollis
77c6298a99 only create temp directory if it doesn't exist yet 2013-02-26 18:16:12 -05:00
Graham Ollis
01e6647cbf v1.42_01
- set COMPILE_DIR based on UID so that multiple users can use TtRenderer with default config
2013-02-24 23:13:00 -05:00
Graham Ollis
22eba8d3c5 include UID in default COMPILE_DIR 2013-02-24 23:12:05 -05:00
Graham Ollis
f68a82f774 v1.42
- fix for test on solaris
2013-02-24 22:59:45 -05:00
Graham Ollis
cb908430e5 fix it again. 2013-02-24 22:59:10 -05:00
Graham Ollis
7cd976ea79 v1.41
- Additional testing diagnostics
2013-02-23 03:06:21 -05:00
Graham Ollis
1708622c49 testing diagnostics 2013-02-23 03:05:25 -05:00
Graham Ollis
380cea8aa2 v1.40
- Added diagnostic for IO loop implementation in testing
2013-02-20 13:42:06 -05:00
Graham Ollis
9217818ad2 diagnostic for IO loop used during testing. 2013-02-20 13:41:16 -05:00
Graham Ollis
02fce2bfdd simplify 2013-01-28 11:51:38 -05:00
Graham Ollis
a7da6f3292 v1.39
- Documentation updates.
2013-01-28 09:28:26 -05:00
Graham Ollis
c736f2ed2d doco 2013-01-28 09:28:07 -05:00
Graham Ollis
7bccefd01b more descriptive test names 2013-01-28 09:20:17 -05:00
Graham Ollis
cccf6078c1 update changes 2013-01-28 09:15:13 -05:00
Graham Ollis
408cba6c35 fix but where DATA templates are not being rendered 2013-01-27 22:48:55 -05:00
Graham Ollis
c1afea55a9 add some tests for default templates.
the second one fails, this needs to be fixed soon.
2013-01-27 22:14:04 -05:00
Graham Ollis
88041ec8b0 fix cpantesters failures based on permissions 2013-01-12 09:05:35 -05:00
Graham Ollis
1fe6401667 update Changes 2013-01-09 14:19:22 -05:00
Graham Ollis
c00f8934de rm not_found, as it is no longer used. 2013-01-09 14:14:44 -05:00
Graham Ollis
d4902f8bf0 Merge pull request #34 from rkitover/master
fix reporting not found templates
2013-01-09 11:08:03 -08:00
Rafael Kitover
4225658dbc report not finding a template correctly
TtRenderer was dying with a 'not found' error when a template was not
found, instead of returning 0, which was interfering with things like
the error screen.

Use $provider->fetch to find templates and return 0 when a template is
not found.
2013-01-09 13:17:11 -05:00
Rafael Kitover
d45efa5405 failing test for not returning not found correctly 2013-01-09 13:13:53 -05:00
Graham Ollis
f3e65cedce v1.35 2012-12-30 10:33:14 -05:00
Graham Ollis
906c68db34 doco 2012-12-30 10:33:01 -05:00
Graham Ollis
c7012a1be0 doco typo 2012-12-29 10:27:32 -05:00
Graham Ollis
5e7728270f v1.34 2012-12-29 10:23:19 -05:00
Graham Ollis
7618cacaa4 fix hang in t/deep_recursion.t on *BSD 2012-12-27 14:51:34 -05:00
Graham Ollis
80340f9950 update changes 2012-12-27 13:37:31 -05:00
Graham Ollis
fb396704bf Merge branch 'master' of github.com:abh/mojox-renderer-tt 2012-12-27 13:22:20 -05:00
Graham Ollis
1d9ea654e9 use temp COMPILE_DIR to avoid test failures
where the default COMPILE_DIR already exists and is owned
by another user or not writable for some other reason by
the testing user.
2012-12-27 13:21:23 -05:00
Graham Ollis
3ec7366d6e better diagnostics
use filename and linenumber in eval for better diagnostic in test
2012-12-26 21:56:21 -05:00
Graham Ollis
a5e72c7526 rm commented code 2012-12-26 21:26:57 -05:00
Graham Ollis
6146b1f2f5 set locale "C" in tests
This ensures that the error string is what we expect it to be
2012-12-26 21:22:07 -05:00
Graham Ollis
5116c191f3 update Changes 2012-12-22 15:14:11 -05:00
Graham Ollis
5828f878d8 don't rely on English locale in test 2012-12-22 15:10:59 -05:00
Graham Ollis
f4beaf9864 use non-capturing for performance 2012-12-19 12:33:19 -05:00
Graham Ollis
ce9e1b955e load test to test loading of all .pm files 2012-12-18 11:02:18 -05:00
Graham Ollis
37ee2ee753 support multiple renderer paths 2012-12-18 11:00:47 -05:00
Graham Ollis
cdc31b07be update changes 2012-10-31 11:19:28 -04:00
Graham Ollis
57b9c39b15 specify a minumum perl version. 2012-10-11 11:18:37 -04:00
Graham Ollis
194a9219e9 fix cpanm warning. 2012-10-02 11:42:17 -04:00
Graham Ollis
5505c5d82a utf-8 for perldoc 2012-10-02 11:34:42 -04:00
Graham Ollis
daceb5876f documentation updates. 2012-10-02 11:33:07 -04:00
Graham Ollis
54d13555ef Merge branch 'master' of github.com:abh/mojox-renderer-tt 2012-08-31 08:18:19 -04:00
Graham Ollis
d6d98cc533 fix for win32 2012-08-31 08:18:01 -04:00
Graham Ollis
51af0a7893 return 0 on not found 2012-08-25 07:15:15 -04:00
ollisg
b48b4274db add test case for GH#30 2012-08-24 22:23:37 -04:00
Graham Ollis
e64ce4c484 refactor fetching templates from DATA 2012-08-24 05:47:54 -04:00
Graham Ollis
af61eff483 update email. 2012-08-23 22:27:43 -04:00
Graham Ollis
cf390c5456 update changes 2012-08-23 22:26:09 -04:00
Graham Ollis
20d795cb51 Compatibility with mojo 3.33 2012-08-23 22:20:08 -04:00
Graham Ollis
7455ae1be8 v1.23 2012-08-23 15:27:07 -04:00
Graham Ollis
870d195761 use die instead of render_exception 2012-08-23 15:26:38 -04:00
Graham Ollis
b21db5cf22 v1.22 2012-08-21 20:39:02 -04:00
Graham Ollis
24990483e5 avoid deep recursion
when using a tt template for exceptions, and there is
an exception in the template, don't go into infinite
recursion.
2012-08-21 16:30:19 -04:00
Graham Ollis
4f5d3a0951 update Changes 2012-08-21 15:47:33 -04:00
Graham Ollis
a72ec0e750 ignore cycles that are taken care of in Template::Provider#DESTROY 2012-08-21 15:44:33 -04:00
Graham Ollis
2956335d9e use Test::Memory::Cycle instead of find_cycle 2012-08-21 14:55:28 -04:00
Graham Ollis
7d1ac4eecd tt is private. 2012-08-21 14:49:58 -04:00
Graham Ollis
28ae3d62f8 return 1 on failure 2012-08-21 15:44:10 -03:00
Ask Bjørn Hansen
944fa2ecae Update Changes for v1.21 2012-06-05 16:25:52 -07:00
Ask Bjørn Hansen
3364b8a05a Remove Test::DistManifest Dist::Zilla plugin 2012-06-05 16:23:42 -07:00
Ask Bjørn Hansen
6047db4ef2 Add MYMETA.* to MANIFEST.SKIP 2012-06-05 16:21:43 -07:00
Ask Bjørn Hansen
b37a7639d3 Update dist.ini to use new names for some plugins 2012-06-05 16:12:58 -07:00
Ask Bjørn Hansen
511ee4463b Let Dist::Zilla set VERSION
Closes #17
2012-06-05 16:04:07 -07:00
Ask Bjørn Hansen
bdc9f56452 Use app->renderer->paths to find template directories
Closes #20
2012-06-05 15:53:08 -07:00
Ask Bjørn Hansen
618adbd774 "Manually" install dependencies 2012-06-05 15:19:58 -07:00
Ask Bjørn Hansen
c0b649d55f Add travis-ci configuration 2012-06-05 15:15:21 -07:00
Ask Bjørn Hansen
1e1a9ab835 Merge pull request #23 from mbethke/master
Fix error handling problem

(closes #22)
2012-06-05 15:08:42 -07:00
Matthias Bethke
96d31d45a0 Added template for render error test 2012-05-18 00:41:21 -06:00
Matthias Bethke
bbfab8db4e Checking HTTP status code for TT render error test 2012-05-18 00:40:50 -06:00
Matthias Bethke
92bb64406b Checking HTTP status code in TT render error test 2012-05-18 00:37:18 -06:00
Matthias Bethke
989ea57cf9 Fixed double TT rendering on error
If a template produced a rendering error in process() but did not produce one
when called without stash variables, the Mojo::Exception would be built
incorrectly, leading to an exception that masked the original error.
2012-05-17 14:00:17 -06:00
Ask Bjørn Hansen
b3c64c75d4 Require Mojolicious 2.51 to avoid memory leak
Closes #19
2012-02-22 08:09:40 -08:00
Ask Bjørn Hansen
a89a9a4344 Merge pull request #21 from marcusramberg/move_cache
Cache templates in tmpdir by default
2012-02-01 01:17:52 -08:00
Marcus Ramberg
78c9d24bc7 Cache templates in tmpdir by default 2012-01-25 15:11:11 +01:00
Ask Bjørn Hansen
859ec53953 Note fixes from Magnus Holm in Changes 2011-10-08 21:05:18 -07:00
Ask Bjørn Hansen
0b0acd510e Document the 'c' stash variable (RT#70866, Matthias Bethke) 2011-10-08 21:04:17 -07:00
Ask Bjørn Hansen
0527eee24a Merge pull request #18 from judofyr/cycles
Fix memory leaks
2011-09-07 09:51:25 -07:00
Magnus Holm
bd48aa5066 Fix cycles 2011-09-07 11:05:55 +02:00
Magnus Holm
77b9531fae Add test case for cycles 2011-09-07 11:04:25 +02:00
Ask Bjørn Hansen
248f13717a Mark 1.20 in Changes 2011-08-01 09:37:07 -07:00
Ask Bjørn Hansen
9f20c780b8 Add Mojolicious-Plugin-TtRenderer-* to .gitignore 2011-08-01 09:35:17 -07:00
Ask Bjørn Hansen
c7c249b51f Update distribution name 2011-08-01 09:34:46 -07:00
Cosimo Streppone
dae8329981 [GH#12] Drop MojoX::* namespace
Renamed MojoX:: namespace to Mojolicious::Plugin::TtRenderer::Engine,
so there's ::Engine, ::Helper and ::Provider.

MojoX:: is deprecated and not to be used, according to @sri.
2011-08-01 11:56:25 +02:00
Ask Bjørn Hansen
5e650027c7 Mark 1.13 in Changes 2011-06-07 17:38:43 -07:00
Ask Bjørn Hansen
698fc48b58 Compatibility with Mojolicious 1.3+ 2011-06-07 17:38:10 -07:00
Ask Bjørn Hansen
49075ebe44 v1.12 2011-02-28 00:45:24 -08:00
Htbaa
0acdb2fcde Simplified regex and added comment why backslashes are being converted 2011-02-26 19:56:17 +01:00
Htbaa
dc52fec399 Inline wrappers and includes now work on Windows
closes gh-13
2011-02-26 12:46:02 +01:00
Ask Bjørn Hansen
a896a311bb Mark 1.11 in Changes 2011-02-06 16:00:58 -08:00
Ask Bjørn Hansen
b6a0f10414 Update Changes 2011-02-06 15:59:56 -08:00
Ask Bjørn Hansen
68747b7f2f Merge remote branch 'marcusramberg/master' 2011-02-06 15:57:10 -08:00
Marcus Ramberg
323d5a9294 Change to use relative paths, add exception template for tests 2011-02-06 08:50:02 +01:00
Ask Bjørn Hansen
46715dc95e Mark 1.10 release in Changes 2011-02-05 12:25:48 -08:00
Ask Bjørn Hansen
392b97e81a Ignore .ttc files from tests 2011-02-05 12:22:44 -08:00
Ask Bjørn Hansen
a5e276f633 Update Changes 2011-02-05 12:20:42 -08:00
Ask Bjørn Hansen
fc453fe4fb Try fixing tests on Strawberry Perl (RT#65282)
(thanks Christiaan Kras)
2011-02-05 12:12:47 -08:00
Ask Bjørn Hansen
32c83d6109 Fix bugtracker URL in META.yml 2011-02-05 12:11:05 -08:00
Maxim Vuets
5e5c23d786 Make Mojolicious 'layout'/'extends' working 2011-02-05 10:02:09 -08:00
Ask Bjørn Hansen
fa30565b6b 1.0 released 2011-01-22 17:14:48 -08:00
Ask Bjørn Hansen
a0d8b522ff Update Changes 2011-01-22 17:13:27 -08:00
Ask Bjørn Hansen
388422491f Require Mojolicious 1.0+ 2011-01-22 10:47:00 -08:00
Ask Bjørn Hansen
1e7dc3044b Merge remote branch 'marcusramberg/master' 2011-01-22 10:33:09 -08:00
Marcus Ramberg
01b8f94a2b Fix inline rendering and test failures 2011-01-22 17:50:08 +01:00
Marcus Ramberg
26d555938f Fix unicode test 2011-01-22 14:42:42 +01:00
Marcus Ramberg
0d419c9ecd Support new mojolicious error template 2011-01-22 14:42:15 +01:00
Ask Bjørn Hansen
0708cfd051 Set repository and bug tracker URLs for the META.yml file 2011-01-17 10:19:11 -08:00
Ask Bjørn Hansen
3495571029 Update Changes 2010-12-27 14:53:35 -08:00
Árpád Szász
d51eea608b Fixed helper compatibility with Mojolicious 1.0 2010-12-28 00:28:50 +02:00
Marcus Ramberg
c3e8c9ff73 Tests for plugin 2010-10-10 06:02:54 +08:00
Maxim Vuets
0588884a9f Fix POD synopsis 2010-10-09 14:50:25 -07:00
spleenjack
084c79825f Replaced deprecated Mojo dependence with Mojolicious 2010-10-09 14:43:52 -07:00
Ask Bjørn Hansen
3bddf34485 'inline' argument is in stash, not in options for _render() 2010-10-05 00:38:44 -07:00
vti
201774941a Added inline template support 2010-10-05 09:02:39 +02:00
Ask Bjørn Hansen
be2d2ed0ec Add release date to Changes 2010-08-02 02:10:00 -07:00
56 changed files with 2064 additions and 490 deletions

16
.gitignore vendored
View File

@@ -1,13 +1,3 @@
blib*
Makefile
Makefile.old
Build
_build*
pm_to_blib*
*.tar.gz
.lwpcookies
MojoX-Renderer-TT-*
cover_db
*~
*.bak
.build
/Mojolicious-Plugin-TtRenderer-*
/.build
/example/myapp/log/development.log

13
.travis.yml Normal file
View File

@@ -0,0 +1,13 @@
language: perl
install:
- cpanm -n Mojolicious
- cpanm -n Template
script: HARNESS_IS_VERBOSE=1 prove -v -Ilib t
perl:
- "5.21"
- "5.20"
- "5.18"
- "5.16"
- "5.14"
- "5.12"
- "5.10"

225
Changes
View File

@@ -1,41 +1,204 @@
Revision history for MojoX-Renderer-TT
Revision history for Mojolicious::Plugin::TtRenderer
{{$NEXT}}
- Updated for newer Mojo (Viacheslav Tykhanovskyi)
- Added helpers (Viacheslav Tykhanovskyi)
- Documentation updates
0.31 September 11, 2009
- Remove deprecated 'new' method
- Update MANIFEST (oops, thanks Sebastian)
1.55 2015-02-28 10:31:58 -0500
- Mojo 6.x compat
0.30 September 9, 2009
- Revert the change of template_path stash key
- Reflect recent changes in mojo project (v0.991251) (Sebastian Knapp)
- One test with Mojolicious added (Sebastian Knapp)
1.54 2014-12-20 10:17:47 -0500
- cpantesters: do not report on older perls
0.21 July 29, 2009
- Update stash key from 'template_path' to 'template' to
1.53 2014-05-31 06:22:47 -0400
- Mojolicious 5.0 support
1.52 2014-05-08 19:26:47 -0400
- updated repository name
1.51 2014-03-21 14:59:39 -0400
- extended diagnostics
- documentation tweaks
- fix non-lite app example (GH#41, uwisser)
1.50 2013-08-08T16:51:21-0400
- update Changes to follow spec (GH#39, Сергей Романов)
- minor documentation fixes
1.49 2013-08-08T09:18:54-0400
- documentation
1.48 2013-08-08T09:13:19-0400
- documentation
1.47 2013-07-26T06:07:35-0400
- Template-Toolkit 2.25 compatability
1.46 2013-05-19
- Mojolicious 4.0 compatability
1.45 2013-04-26
- correctly support app->default->{layout} (GH#37, Fayland Lam)
1.44 2013-04-13
- promote development changes to production
1.43_01 2013-04-11
- _template_modified returns value from super class instead of 1 if true (GH#36, Fayland Lam)
1.43 2013-04-08
- promote development changes
1.42_04 2013-04-06
- Updated meta for new github repo location
1.42_03 2013-03-22
- Allow custom relative paths for cache_dir (GH#35, Jason Crowther)
1.42_02 2013-02-26
- only create COMPILE_DIR based on UID if the user doesn't specify COMPILE_DIR
1.42_01 2013-02-24
- set COMPILE_DIR based on UID so that multiple users can use TtRenderer with default config
1.42 2013-02-24
- fix for test on solaris
1.41 2013-02-23
- Additional testing diagnostics
1.40 2013-02-20
- Added diagnostic for IO loop implementation in testing
1.39 2013-01-28
- Documentation updates.
1.38 2013-01-27
- fixed but where DATA templates were not being rendered with empty renderer path
1.37 2013-01-12
- fix default_template2.t to use temp directory for COMPILE_DIR
1.36 2013-01-09
- Use $provider->fetch to find templates (GH#34)
1.35 2012-12-30
- Documentation fix
1.34 2012-12-29
- Include META.json in distribution.
1.33 2012-12-27
- Fix hang in t/deep_recursion.t on *BSD
1.32 2012-12-27
- silenced a few annoying warnings during test
- use temp directory for COMPILE_DIR in tests to avoid failures if the
default compile directory already exists and is owned by someone else.
1.31 2012-12-26
- Set locale "C" in tests that rely on it
1.30 2012-12-22
- Don't rely on English locale in the test t/tt_plugin_lite_app.t
1.29 2012-12-18
- support multiple renderer paths
1.28 2012-10-11
- specify minimum perl version
1.27 2012-10-02
- documentation fixes and updates.
1.26 2012-08-31
- Windows compatability with Cwd::abs_path
1.25 2012-08-25
- Return 0 on not found, die on error (GH#30)
1.24 2012-08-23
- Compatibility with Mojolicious 3.33+
1.23 2012-08-23
- Use die instead of render_exception (GH#29)
1.22 2012-08-21
- Compatibility with Mojolicious 3.05+ (GH#24)
- Avoid deep recursion when exception template dies (GH#25,GH26)
- Fixed test failures (GH#27,GH#28)
1.21 2012-06-05
- Fixed double TT rendering on error (Matthias Bethke (GH#21))
- Cache templates in tmpdir by default (Marcus Ramberg)
- Require Mojolicious 2.51 to avoid memory leaks (GH#19)
- Document the 'c' stash variable (RT#70866, Matthias Bethke)
- Fix memory leaks, add tests for them (GH#18, Magnus Holm)
- Use app->renderer->paths to find template directories (GH#17)
1.20 2011-08-01
- Drop use of MojoX namespace for Mojolicious::Plugin::TtRenderer::
(GH#12, Cosimo Streppone)
1.13 2011-06-07
- Compatibility with Mojolicious 1.3+
1.12 2011-02-28
- Inline wrappers and includes now work on Windows
(GH#13, Christiaan Kras)
1.11 2011-02-06
- Change to use relative paths (Marcus Ramberg)
- Add exception template for tests
1.10 2011-02-05
- Support Mojolicious 'layout'/'extends' (Maxim Vuets, Marcus
Ramberg)
- Fix Strawberry Perl tests (RT#65282, Christiaan Kras, Ask)
- Update bugtracker URL in META.yml
1.0 2011-01-22
- Require (and be compatible with) Mojolicious 1.0+
- Added inline template support (Viacheslav Tykhanovskyi & Ask)
- Fix inline rendering and test failures (Marcus Ramberg)
- Fixed helper compatibility with Mojolicious 1.0 (Árpád Szász)
- Support new mojolicious error template (Marcus)
- Fix unicode test (Marcus & Spleenjack)
- Replaced deprecated Mojo dependence with Mojolicious (spleenjack)
0.40 2010-08-02
- Updated for newer Mojo (Viacheslav Tykhanovskyi)
- Added helpers (Viacheslav Tykhanovskyi)
- Documentation updates
0.31 2009-09-11
- Remove deprecated 'new' method
- Update MANIFEST (oops, thanks Sebastian)
0.30 2009-09-09
- Revert the change of template_path stash key
- Reflect recent changes in mojo project (v0.991251) (Sebastian Knapp)
- One test with Mojolicious added (Sebastian Knapp)
0.21 2009-07-29
- Update stash key from 'template_path' to 'template' to
match mojo change (Sebastian Knapp)
0.20 December 9, 2008
- Updates to work with Mojo 0.9
- Add default INCLUDE_PATH
- Made default compile dir not Unix specific (Viacheslav
Tikhanovskii)
0.20 2008-12-09
- Updates to work with Mojo 0.9
- Add default INCLUDE_PATH
- Made default compile dir not Unix specific (Viacheslav
Tykhanovskyi)
0.10 November 12, 2008
- Update to work with named parameters in new version of Mojo
- Instead of "tx" pass the context in the "c" variable
- Rename "new" to "build"
- Add real tests (Viacheslav Tikhanovskii)
- Update to work with new error handling in Mojo
(Viacheslav Tikhanovskii)
0.10 2008-11-12
- Update to work with named parameters in new version of Mojo
- Instead of "tx" pass the context in the "c" variable
- Rename "new" to "build"
- Add real tests (Viacheslav Tykhanovskyi)
- Update to work with new error handling in Mojo
(Viacheslav Tykhanovskyi)
0.02 November 10, 2008
- Add template_options parameter
- Fix Template dependency
0.01 November 9, 2008
- First version, released on an unsuspecting world.
0.02 2008-11-10
- Add template_options parameter
- Fix Template dependency
0.01 2008-11-09
- First version, released on an unsuspecting world.

View File

@@ -1,46 +0,0 @@
# Avoid version control files.
\bRCS\b
\bCVS\b
\bSCCS\b
,v$
\B\.svn\b
\B\.git\b
\b_darcs\b
# Avoid Makemaker generated and utility files.
\bMANIFEST\.bak
\bMakefile$
\bblib/
\bMakeMaker-\d
\bpm_to_blib\.ts$
\bpm_to_blib$
\bblibdirs\.ts$ # 6.18 through 6.25 generated this
# Avoid Module::Build generated and utility files.
\bBuild$
\b_build/
# Avoid temp and backup files.
~$
\.old$
\#$
\b\.#
\.bak$
# Avoid Devel::Cover files.
\bcover_db\b
### DEFAULT MANIFEST.SKIP ENDS HERE ####
t/tmp/ctpl
\.DS_Store$
\.sw.$
(\w+-)*(\w+)-\d\.\d+(?:\.tar\.gz)?$
\.t\.log$
\.prove$
# XS shit
\.(?:bs|c|o)$

231
README.md Normal file
View File

@@ -0,0 +1,231 @@
# Mojolicious::Plugin::TtRenderer [![Build Status](https://secure.travis-ci.org/plicease/Mojolicious-Plugin-TtRenderer.png)](http://travis-ci.org/plicease/Mojolicious-Plugin-TtRenderer)
Template Renderer Plugin for Mojolicious
# SYNOPSIS
[Mojolicious::Lite](https://metacpan.org/pod/Mojolicious::Lite):
plugin 'tt_renderer';
[Mojolicious](https://metacpan.org/pod/Mojolicious)
$self->plugin('tt_renderer');
# DESCRIPTION
This plugin is a simple Template Toolkit renderer for [Mojolicious](https://metacpan.org/pod/Mojolicious).
Its defaults are usually reasonable, although for finer grain detail in
configuration you may want to use
[Mojolicious::Plugin::TtRenderer::Engine](https://metacpan.org/pod/Mojolicious::Plugin::TtRenderer::Engine) directly.
# OPTIONS
These are the options that can be passed in as arguments to this plugin.
## template\_options
Configuration hash passed into [Template](https://metacpan.org/pod/Template)'s constructor, see
[Template Toolkit's configuration summary](https://metacpan.org/pod/Template#CONFIGURATION-SUMMARY)
for details. Here is an example using the [Mojolicious::Lite](https://metacpan.org/pod/Mojolicious::Lite) form:
plugin 'tt_renderer' => {
template_options => {
PRE_CHOMP => 1,
POST_CHOMP => 1,
TRIM => 1,
},
};
Here is the same example using the full [Mojolicious](https://metacpan.org/pod/Mojolicious) app form:
package MyApp;
use Mojo::Base qw( Mojolicious );
sub startup {
my($self) = @_;
$self->plugin('tt_renderer' => {
template_options => {
PRE_CHOMP => 1,
POST_CHOMP => 1,
TRIM => 1,
},
}
...
}
These options will be used if you do not override them:
- INCLUDE\_PATH
Generated based on your application's renderer's configuration. It
will include all renderer paths, in addition to search files located
in the `__DATA__` section by the usual logic used by [Mojolicious](https://metacpan.org/pod/Mojolicious).
- COMPILE\_EXT
`.ttc`
- UNICODE
`1` (true)
- ENCODING
`utf-87`
- CACHE\_SIZE
`128`
- RELATIVE
`1` (true)
## cache\_dir
Specifies the directory in which compiled template files are
written. This:
plugin 'tt_renderer', { cache_dir => 'some/path' };
is equivalent to
plugin 'tt_renderer', { template_options { COMPILE_DIR => 'some/path' } };
except in the first example relative paths are relative to the [Mojolicious](https://metacpan.org/pod/Mojolicious)
app's home directory (`$app->home`).
# STASH
## h
Helpers are available via the `h` entry in the stash.
<a href="[% h.url_for('index') %]">go back to index</a>
## c
The current controller instance can be accessed as `c`.
I see you are requesting a document from [% c.req.headers.host %].
# EXAMPLES
[Mojolicious::Lite](https://metacpan.org/pod/Mojolicious::Lite) example:
use Mojolicious::Lite;
plugin 'tt_renderer';
get '/' => sub {
my $self = shift;
$self->render('index');
};
app->start;
__DATA__
@@ index.html.tt
[%
WRAPPER 'layouts/default.html.tt'
title = 'Welcome'
%]
<p>Welcome to the Mojolicious real-time web framework!</p>
<p>Welcome to the TtRenderer plugin!</p>
[% END %]
@@ layouts/default.html.tt
<!DOCTYPE html>
<html>
<head><title>[% title %]</title></head>
<body>[% content %]</body>
</html>
[Mojolicious](https://metacpan.org/pod/Mojolicious) example:
package MyApp;
use Mojo::Base 'Mojolicious';
sub startup {
my $self = shift;
$self->plugin('tt_renderer');
my $r = $self->routes;
$r->get('/')->to('example#welcome');
}
1;
package MyApp::Example;
use Mojo::Base 'Mojolicious::Controller';
# This action will render a template
sub welcome {
my $self = shift;
# Render template "example/welcome.html.tt" with message
$self->render(
message => 'Looks like your TtRenderer is working!');
}
1;
These are also included with the `Mojolicious::Plugin::TtRenderer`
distribution, including the support files required for the full
[Mojolicious](https://metacpan.org/pod/Mojolicious) app example.
# SEE ALSO
[Mojolicious::Plugin::TtRenderer::Engine](https://metacpan.org/pod/Mojolicious::Plugin::TtRenderer::Engine),
[Mojolicious](https://metacpan.org/pod/Mojolicious),
[Mojolicious::Guides](https://metacpan.org/pod/Mojolicious::Guides),
[http://mojolicious.org](http://mojolicious.org).
# AUTHOR
Original author: Ask Bjørn Hansen
Current maintainer: Graham Ollis <plicease@cpan.org>
Contributors:
vti
Marcus Ramberg
Matthias Bethke
Htbaa
Magnus Holm
Maxim Vuets
Rafael Kitover
giftnuss
Cosimo Streppone
Fayland Lam
Jason Crowther
spleenjack
Árpád Szász
Сергей Романов
uwisser
# COPYRIGHT AND LICENSE
This software is copyright (c) 2015 by Ask Bjørn Hansen.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.

View File

@@ -1,45 +1,68 @@
name = MojoX-Renderer-TT
author = Ask Bjørn Hansen <ask@develooper.com>
name = Mojolicious-Plugin-TtRenderer
author = Graham Ollis <plicease@cpan.org>
license = Perl_5
copyright_holder = Ask Bjørn Hansen
# copyright_year = 2009
version = 1.55
[@Author::Plicease]
release_tests = 1
travis_status = 1
installer = ModuleBuild
[Prereqs]
Mojo = 0.999926
Mojolicious = 5.81
Template = 2.18
[Prereqs / TestRequires ]
Test::More = 0
[Author::Plicease::Thanks]
current = Graham Ollis <plicease@cpan.org>
original = Ask Bjørn Hansen
contributor = vti
contributor = Marcus Ramberg
contributor = Matthias Bethke
contributor = Htbaa
contributor = Magnus Holm
contributor = Maxim Vuets
contributor = Rafael Kitover
contributor = giftnuss
contributor = Cosimo Streppone
contributor = Fayland Lam
contributor = Jason Crowther
contributor = spleenjack
contributor = Árpád Szász
contributor = Сергей Романов
contributor = uwisser
[@Git]
tag_format = release/%v
# push_to = all
[Author::Plicease::Upload]
[@Filter]
bundle = @Basic
remove = Readme
remove = Manifest
[InsertExample]
[Repository]
[MetaNoIndex]
directory = example
[RemovePrereqs]
; comes with Perl
remove = warnings
remove = strict
remove = lib
remove = utf8
remove = base
remove = Carp
remove = Cwd
remove = File::Spec
remove = Scalar::Util
remove = File::Temp
remove = FindBin
remove = IO::Handle
[Homepage]
[BumpVersionFromGit]
version_regexp = ^release/(.*)
[PkgVersion]
[CheckChangeLog]
[CompileTests]
[DistManifestTests]
[HasVersionTests]
[MetaTests]
[ReadmeFromPod]
[PodCoverageTests]
[Manifest]
[NextRelease]
format = %-7v %{MMMM d, yyyy}d
; comes with Mojolicious
remove = Mojo::Base
remove = Mojo::ByteStream
remove = Mojolicious::Plugin
remove = Mojo::IOLoop
remove = Mojolicious::Lite
remove = Test::Mojo
[Author::Plicease::InstallerPerlVersion]

8
example/README Normal file
View File

@@ -0,0 +1,8 @@
Included in this directory are two examples of how to use the Template Toolkit
Renderer.
myapp.pl - Mojolicious::Lite example
myapp/ - full Mojolicious application example
They were created as minor modifications of the applications generated
using the 'mojo generate' command.

28
example/myapp.pl Normal file
View File

@@ -0,0 +1,28 @@
use Mojolicious::Lite;
plugin 'tt_renderer';
get '/' => sub {
my $self = shift;
$self->render('index');
};
app->start;
__DATA__
@@ index.html.tt
[%
WRAPPER 'layouts/default.html.tt'
title = 'Welcome'
%]
<p>Welcome to the Mojolicious real-time web framework!</p>
<p>Welcome to the TtRenderer plugin!</p>
[% END %]
@@ layouts/default.html.tt
<!DOCTYPE html>
<html>
<head><title>[% title %]</title></head>
<body>[% content %]</body>
</html>

View File

@@ -0,0 +1,11 @@
package MyApp;
use Mojo::Base 'Mojolicious';
sub startup {
my $self = shift;
$self->plugin('tt_renderer');
my $r = $self->routes;
$r->get('/')->to('example#welcome');
}
1;

View File

@@ -0,0 +1,13 @@
package MyApp::Example;
use Mojo::Base 'Mojolicious::Controller';
# This action will render a template
sub welcome {
my $self = shift;
# Render template "example/welcome.html.tt" with message
$self->render(
message => 'Looks like your TtRenderer is working!');
}
1;

View File

@@ -0,0 +1,11 @@
<!DOCTYPE html>
<html>
<head>
<title>Welcome to the Mojolicious real-time web framework!</title>
</head>
<body>
<h2>Welcome to the Mojolicious real-time web framework!</h2>
This is the static document "public/index.html",
<a href="/">click here</a> to get back to the start.
</body>
</html>

11
example/myapp/script/my_app Executable file
View File

@@ -0,0 +1,11 @@
#!/usr/bin/env perl
use strict;
use warnings;
use FindBin;
BEGIN { unshift @INC, "$FindBin::Bin/../lib" }
# Start command line interface for application
require Mojolicious::Commands;
Mojolicious::Commands->start_app('MyApp');

9
example/myapp/t/basic.t Normal file
View File

@@ -0,0 +1,9 @@
use Mojo::Base -strict;
use Test::More;
use Test::Mojo;
my $t = Test::Mojo->new('MyApp');
$t->get_ok('/')->status_is(200)->content_like(qr/Mojolicious/i);
done_testing();

View File

@@ -0,0 +1,10 @@
[%
WRAPPER 'layouts/default.html.tt'
title = 'Welcome'
%]
<h2>[% message %]</h2>
This page was generated from the template "templates/example/welcome.html.tt"
and the layout "templates/layouts/default.html.tt",
<a href="[% url_for %]">click here</a> to reload the page or
<a href="/index.html">here</a> to move forward to a static page.
[% END %]

View File

@@ -0,0 +1,5 @@
<!DOCTYPE html>
<html>
<head><title>[% title %]</title></head>
<body>[% content %]</body>
</html>

View File

@@ -1,299 +0,0 @@
package MojoX::Renderer::TT;
use warnings;
use strict;
use base 'Mojo::Base';
use Template ();
use File::Spec ();
__PACKAGE__->attr('tt');
sub build {
my $self = shift->SUPER::new(@_);
$self->_init(@_);
return sub { $self->_render(@_) }
}
sub _init {
my $self = shift;
my %args = @_;
#$Template::Parser::DEBUG = 1;
my $app = delete $args{mojo} || delete $args{app};
my $dir = $app && $app->home->rel_dir('tmp/ctpl');
# TODO
# take and process options :-)
my %config = (
($app ? (INCLUDE_PATH => $app->home->rel_dir('templates')) : ()),
COMPILE_EXT => '.ttc',
COMPILE_DIR => ($dir || File::Spec->tmpdir),
UNICODE => 1,
ENCODING => 'utf-8',
CACHE_SIZE => 128,
RELATIVE => 1,
ABSOLUTE => 1,
%{$args{template_options} || {}},
);
$config{LOAD_TEMPLATES} =
[MojoX::Renderer::TT::Provider->new(%config, renderer => $app->renderer)]
unless $config{LOAD_TEMPLATES};
$self->tt(Template->new(\%config))
or Carp::croak "Could not initialize Template object: $Template::ERROR";
return $self;
}
sub _render {
my ($self, $renderer, $c, $output, $options) = @_;
# Template
return unless my $t = $renderer->template_name($options);
return unless my $path = $renderer->template_path($options);
my $helper = MojoX::Renderer::TT::Helper->new(ctx => $c);
my @params = ({%{$c->stash}, c => $c, h => $helper}, $output, {binmode => ':utf8'});
$self->tt->{SERVICE}->{CONTEXT}->{LOAD_TEMPLATES}->[0]->ctx($c);
my $ok = $self->tt->process($path, @params);
# Error
unless ($ok) {
my $e = $self->tt->error;
if ($e =~ m/not found/) {
$c->app->log->error(qq/Template "$t" missing or not readable./);
$c->render_not_found;
return;
}
$$output = '';
$c->app->log->error(qq/Template error in "$t": $e/);
$c->render_exception($e);
$self->tt->error('');
return 0;
}
return 1;
}
1; # End of MojoX::Renderer::TT
package
MojoX::Renderer::TT::Helper;
use strict;
use warnings;
use base 'Mojo::Base';
our $AUTOLOAD;
__PACKAGE__->attr('ctx');
sub AUTOLOAD {
my $self = shift;
my $method = $AUTOLOAD;
return if $method =~ /^[A-Z]+?$/;
return if $method =~ /^_/;
return if $method =~ /(?:\:*?)DESTROY$/;
$method = (split '::' => $method)[-1];
die qq/Unknown helper: $method/ unless $self->ctx->app->renderer->helper->{$method};
return $self->ctx->helper($method => @_);
}
1;
package
MojoX::Renderer::TT::Provider;
use strict;
use warnings;
use base 'Template::Provider';
sub new {
my $class = shift;
my %params = @_;
my $renderer = delete $params{renderer};
my $self = $class->SUPER::new(%params);
$self->renderer($renderer);
return $self;
}
sub renderer { @_ > 1 ? $_[0]->{renderer} = $_[1] : $_[0]->{renderer} }
sub ctx { @_ > 1 ? $_[0]->{ctx} = $_[1] : $_[0]->{ctx} }
sub _template_modified {1}
sub _template_content {
my $self = shift;
my ($path) = @_;
my ($t) = ($path =~ m{templates\/(.*)$});
if (-r $path) {
return $self->SUPER::_template_content(@_);
}
# Try DATA section
elsif (my $d = $self->renderer->get_inline_template($self->ctx, $t)) {
return wantarray ? ($d, '', time) : $d;
}
my $data = '';
my $error = "$path: not found";
my $mod_date = time;
return wantarray ? ($data, $error, $mod_date) : $data;
}
1;
__END__
=encoding utf-8
=head1 NAME
MojoX::Renderer::TT - Template Toolkit renderer for Mojo
=head1 SYNOPSIS
Add the handler:
sub startup {
...
# Via mojolicious plugin
$self->plugin(tt_renderer => {FILTERS => [ ... ]});
# Or manually
use MojoX::Renderer::TT;
my $tt = MojoX::Renderer::TT->build(
mojo => $self,
template_options => {
PROCESS => 'tpl/wrapper',
FILTERS => [ ... ],
UNICODE => 1,
ENCODING => 'UTF-8',
}
);
$self->renderer->add_handler( tt => $tt );
}
Template parameter are taken from C< $c->stash >.
=head1 RENDERING
The template file for C<"example/welcome"> would be C<"templates/welcome.html.tt">.
When template file is not available rendering from C<__DATA__> is attempted.
__DATA__
@@ welcome.html.tt
Welcome, [% user.name %]!
=head1 HELPERS
Helpers are exported automatically under C<h> namespace.
[% h.url_for('index') %]
=head1 METHODS
=head2 build
This method returns a handler for the Mojolicious renderer.
Supported parameters are
=over 4
=item mojo
C<build> currently uses a C<mojo> parameter pointing to the base class (Mojo).
object. When used the INCLUDE_PATH will be set to
=item template_options
A hash reference of options that are passed to Template->new().
=back
=head1 AUTHOR
Ask Bjørn Hansen, C<< <ask at develooper.com> >>
=head1 TODO
* Better support non-Mojolicious frameworks
* Move the default template cache directory?
* Better way to pass parameters to the templates? (stash)
* More sophisticated default search path?
=head1 BUGS
Please report any bugs or feature requests to C<bug-mojox-renderer-tt at rt.cpan.org>,
or through the web interface at
L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=MojoX-Renderer-TT>. I will be
notified, and then you'll automatically be notified of progress on your bug as I
make changes.
=head1 SUPPORT
You can find documentation for this module with the perldoc command.
perldoc MojoX::Renderer::TT
You can also look for information at:
=over 4
=item * git repository
L<http://git.develooper.com/?p=MojoX-Renderer-TT.git;a=summary>,
L<git://git.develooper.com/MojoX-Renderer-TT.git>
L<http://github.com/abh/mojox-renderer-tt/>
=item * RT: CPAN's request tracker
L<http://rt.cpan.org/NoAuth/Bugs.html?Dist=MojoX-Renderer-TT>
=item * CPAN Ratings
L<http://cpanratings.perl.org/d/MojoX-Renderer-TT>
=item * Search CPAN
L<http://search.cpan.org/dist/MojoX-Renderer-TT/>
=back
=head1 ACKNOWLEDGEMENTS
=head1 COPYRIGHT & LICENSE
Copyright 2008-2010 Ask Bjørn Hansen, all rights reserved.
This program is free software; you can redistribute it and/or modify it
under the same terms as Perl itself.
=cut

View File

@@ -2,58 +2,177 @@ package Mojolicious::Plugin::TtRenderer;
use strict;
use warnings;
use v5.10;
our $VERSION = '0.01';
# ABSTRACT: Template Renderer Plugin for Mojolicious
# VERSION
use base 'Mojolicious::Plugin';
use MojoX::Renderer::TT;
use Mojolicious::Plugin::TtRenderer::Engine;
sub register {
my ($self, $app, $args) = @_;
$args ||= {};
my $tt = MojoX::Renderer::TT->build(%$args, app => $app);
my $tt = Mojolicious::Plugin::TtRenderer::Engine->build(%$args, app => $app);
# Add "tt" handler
$app->renderer->add_handler(tt => $tt);
}
$Mojolicious::Plugin::TtRenderer::VERSION //= ('devel');
1;
__END__
=head1 NAME
=encoding utf-8
Mojolicious::Plugin::TtRenderer - Template Renderer Plugin
=begin stopwords
Bjørn
Szász
Árpád
=end stopwords
=head1 SYNOPSIS
# Mojolicious
$self->plugin('tt_renderer');
$self->plugin(tt_renderer => {FILTERS => [ ... ]});
L<Mojolicious::Lite>:
# Mojolicious::Lite
plugin 'tt_renderer';
plugin tt_renderer => {FILTERS => [ ... ]};
plugin 'tt_renderer';
L<Mojolicious>
$self->plugin('tt_renderer');
=head1 DESCRIPTION
L<Mojolicous::Plugin::TtRenderer> is a simple loader for L<MojoX::Renderer::TT>.
This plugin is a simple Template Toolkit renderer for L<Mojolicious>.
Its defaults are usually reasonable, although for finer grain detail in
configuration you may want to use
L<Mojolicious::Plugin::TtRenderer::Engine> directly.
=head1 METHODS
=head1 OPTIONS
L<Mojolicious::Plugin::TtRenderer> inherits all methods from
L<Mojolicious::Plugin> and implements the following new ones.
These are the options that can be passed in as arguments to this plugin.
=head2 C<register>
=head2 template_options
$plugin->register;
Configuration hash passed into L<Template>'s constructor, see
L<Template Toolkit's configuration summary|Template#CONFIGURATION-SUMMARY>
for details. Here is an example using the L<Mojolicious::Lite> form:
Register renderer in L<Mojolicious> application.
plugin 'tt_renderer' => {
template_options => {
PRE_CHOMP => 1,
POST_CHOMP => 1,
TRIM => 1,
},
};
Here is the same example using the full L<Mojolicious> app form:
package MyApp;
use Mojo::Base qw( Mojolicious );
sub startup {
my($self) = @_;
$self->plugin('tt_renderer' => {
template_options => {
PRE_CHOMP => 1,
POST_CHOMP => 1,
TRIM => 1,
},
}
...
}
These options will be used if you do not override them:
=over 4
=item INCLUDE_PATH
Generated based on your application's renderer's configuration. It
will include all renderer paths, in addition to search files located
in the C<__DATA__> section by the usual logic used by L<Mojolicious>.
=item COMPILE_EXT
C<.ttc>
=item UNICODE
C<1> (true)
=item ENCODING
C<utf-87>
=item CACHE_SIZE
C<128>
=item RELATIVE
C<1> (true)
=back
=head2 cache_dir
Specifies the directory in which compiled template files are
written. This:
plugin 'tt_renderer', { cache_dir => 'some/path' };
is equivalent to
plugin 'tt_renderer', { template_options { COMPILE_DIR => 'some/path' } };
except in the first example relative paths are relative to the L<Mojolicious>
app's home directory (C<$app-E<gt>home>).
=head1 STASH
=head2 h
Helpers are available via the C<h> entry in the stash.
<a href="[% h.url_for('index') %]">go back to index</a>
=head2 c
The current controller instance can be accessed as C<c>.
I see you are requesting a document from [% c.req.headers.host %].
=head1 EXAMPLES
L<Mojolicious::Lite> example:
# EXAMPLE: example/myapp.pl
L<Mojolicious> example:
# EXAMPLE: example/myapp/lib/MyApp.pm
# EXAMPLE: example/myapp/lib/MyApp/Example.pm
These are also included with the C<Mojolicious::Plugin::TtRenderer>
distribution, including the support files required for the full
L<Mojolicious> app example.
=head1 SEE ALSO
L<MojoX::Renderer::TT>, L<Mojolicious>, L<Mojolicious::Guides>, L<http://mojolicious.org>.
L<Mojolicious::Plugin::TtRenderer::Engine>,
L<Mojolicious>,
L<Mojolicious::Guides>,
L<http://mojolicious.org>.
=cut

View File

@@ -0,0 +1,331 @@
package Mojolicious::Plugin::TtRenderer::Engine;
use warnings;
use strict;
use v5.10;
use base 'Mojo::Base';
use Carp ();
use File::Spec ();
use Mojo::ByteStream 'b';
use Template ();
use Cwd qw/abs_path/;
use Scalar::Util 'weaken';
use POSIX ':errno_h';
# ABSTRACT: Template Toolkit renderer for Mojolicious
# VERSION
__PACKAGE__->attr('tt');
sub build {
my $self = shift->SUPER::new(@_);
weaken($self->{app});
$self->_init(@_);
sub { $self->_render(@_) }
}
sub _init {
my $self = shift;
my %args = @_;
#$Template::Parser::DEBUG = 1;
my $dir;
my $app = delete $args{mojo} || delete $args{app};
if($dir=$args{cache_dir}) {
if($app && substr($dir,0,1) ne '/') {
$dir=$app->home->rel_dir($dir);
}
}
# TODO
# take and process options :-)
my @renderer_paths = $app ? map { abs_path($_) } grep { -d $_ } @{ $app->renderer->paths } : ();
push @renderer_paths, 'templates';
my %config = (
INCLUDE_PATH => \@renderer_paths,
COMPILE_EXT => '.ttc',
UNICODE => 1,
ENCODING => 'utf-8',
CACHE_SIZE => 128,
RELATIVE => 1,
%{$args{template_options} || {}},
);
$config{COMPILE_DIR} //= $dir || do {
my $tmpdir = File::Spec->catdir(File::Spec->tmpdir, "ttr$<");
mkdir $tmpdir unless -d $tmpdir;
$tmpdir;
};
$config{LOAD_TEMPLATES} =
[Mojolicious::Plugin::TtRenderer::Provider->new(%config, renderer => $app->renderer)]
unless $config{LOAD_TEMPLATES};
$self->tt(Template->new(\%config))
or Carp::croak "Could not initialize Template object: $Template::ERROR";
$self;
}
sub _render {
my ($self, $renderer, $c, $output, $options) = @_;
# Inline
my $inline = $options->{inline};
# Template
my $t = $renderer->template_name($options);
$t = 'inline' if defined $inline;
return unless $t;
my $helper = Mojolicious::Plugin::TtRenderer::Helper->new(ctx => $c);
# Purge previous result
$$output = '';
# fixes for t/lite_app_with_default_layouts.t
unless ($c->stash->{layout}) {
$c->stash->{content} ||= $c->stash->{'mojo.content'}->{content};
}
my @params = ({%{$c->stash}, c => $c, h => $helper}, $output, {binmode => ':utf8'});
my $provider = $self->tt->{SERVICE}->{CONTEXT}->{LOAD_TEMPLATES}->[0];
$provider->options($options);
$provider->ctx($c);
my $ok = do {
if (defined $inline) {
$self->tt->process(\$inline, @params);
}
else {
my @ret = $provider->fetch($t);
if (not defined $ret[1]) {
$self->tt->process($ret[0], @params);
}
elsif (not defined $ret[0]) { # not found
return 0;
}
else { # error
return 0 if $! == ENOENT && (not ref $ret[0]); # not found when not blessed exception
die $ret[0];
}
}
};
# Error
die $self->tt->error unless $ok;
1;
}
1; # End of Mojolicious::Plugin::TtRenderer::Engine
package
Mojolicious::Plugin::TtRenderer::Helper;
use strict;
use warnings;
use base 'Mojo::Base';
our $AUTOLOAD;
__PACKAGE__->attr('ctx');
sub AUTOLOAD {
my $self = shift;
my $method = $AUTOLOAD;
return if $method =~ /^[A-Z]+?$/;
return if $method =~ /^_/;
return if $method =~ /(?:\:*?)DESTROY$/;
$method = (split '::' => $method)[-1];
die qq/Unknown helper: $method/ unless $self->ctx->app->renderer->helpers->{$method};
$self->ctx->$method(@_);
}
1;
package
Mojolicious::Plugin::TtRenderer::Provider;
use strict;
use warnings;
use base 'Template::Provider';
use Scalar::Util 'weaken';
sub new {
my $class = shift;
my %params = @_;
my $renderer = delete $params{renderer};
my $self = $class->SUPER::new(%params);
$self->renderer($renderer);
weaken($self->{renderer});
$self;
}
sub renderer { @_ > 1 ? $_[0]->{renderer} = $_[1] : $_[0]->{renderer} }
sub ctx { @_ > 1 ? $_[0]->{ctx} = $_[1] : $_[0]->{ctx} }
sub options { @_ > 1 ? $_[0]->{options} = $_[1] : $_[0]->{options} }
sub _template_modified {
my($self, $template) = @_;
$self->SUPER::_template_modified($template) || $template =~ /^templates(?:\/|\\)/;
}
sub _template_content {
my $self = shift;
my ($path) = @_;
my $options = delete $self->{options};
# Convert backslashes to forward slashes to make inline templates work on Windows
$path =~ s/\\/\//g;
my ($t) = ($path =~ m{templates\/(.*)$});
if (-r $path) {
return $self->SUPER::_template_content(@_);
}
my $data;
my $error = '';
# Try DATA section
if(defined $options) {
$data = $self->renderer->get_data_template($options);
} else {
foreach my $class (@{ $self->renderer->classes }) {
$data = Mojo::Loader::data_section($class, $t);
last if $data;
}
}
unless($data) {
$data = '';
$error = "$path: not found";
}
wantarray ? ($data, $error, time) : $data;
}
1;
__END__
=encoding utf-8
=begin stopwords
Bjørn
Szász
Árpád
=end stopwords
=head1 SYNOPSIS
Add the handler:
sub startup {
...
# Via mojolicious plugin
$self->plugin(tt_renderer => {template_options => {FILTERS => [ ... ]}});
# Or manually
use Mojolicious::Plugin::TtRenderer::Engine;
my $tt = Mojolicious::Plugin::TtRenderer::Engine->build(
mojo => $self,
template_options => {
PROCESS => 'tpl/wrapper',
FILTERS => [ ... ],
UNICODE => 1,
ENCODING => 'UTF-8',
}
);
$self->renderer->add_handler( tt => $tt );
}
Template parameter are taken from C<$c-E<gt>stash>.
=head1 DESCRIPTION
See L<Mojolicious::Plugin::TtRenderer> for details on the plugin interface to this module.
This module provides an engine for the rendering of L<Template Toolkit|Template> templates
within a Mojolicious context. Templates may be, stored on the local file system, provided
inline by the controller or included in the C<__DATA__> section. Where possible this modules
attempts to provide a TT analogue interface to the L<Perlish templates|Mojo::Template> which
come with Mojolicious.
=head1 RENDERING
The template file for C<"example/welcome"> would be C<"templates/welcome.html.tt">.
When template file is not available rendering from C<__DATA__> is attempted.
__DATA__
@@ welcome.html.tt
Welcome, [% user.name %]!
Inline template is also supported:
$self->render(inline => '[% 1 + 1 %]', handler => 'tt');
=head1 HELPERS
Helpers are exported automatically under C<h> namespace.
[% h.url_for('index') %]
=head1 METHODS
=head2 build
This method returns a handler for the Mojolicious renderer.
Supported parameters are
=over 4
=item mojo
C<build> currently uses a C<mojo> parameter pointing to the base class (Mojo).
object. When used the INCLUDE_PATH will be set to
=item template_options
A hash reference of options that are passed to Template->new(). Note that if you
specify an C<INCLUDE_PATH> through this option it will remove the DATA section
templates from your path. A better way to specify an C<INCLUDE_PATH> if you also
want to use DATA section templates it by manipulating the L<Mojolicious::Renderer>
path.
=item cache_dir
Absolute or relative dir to your app home, to cache processed versions of your
templates. Will default to a temp-dir if not set.
=back
=head1 SEE ALSO
L<Mojolicious::Plugin::TtRenderer>,
L<Mojolicious>,
L<Mojolicious::Guides>,
L<http://mojolicious.org>.
=cut

2
t/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
/tmp/
*.ttc

View File

@@ -1,9 +0,0 @@
#!perl
use Test::More tests => 1;
BEGIN {
use_ok( 'MojoX::Renderer::TT' );
}
diag( "Testing MojoX::Renderer::TT $MojoX::Renderer::TT::VERSION, Perl $], $^X" );

13
t/00_diag.pl Normal file
View File

@@ -0,0 +1,13 @@
use strict;
use warnings;
use Test::More;
use Mojo::IOLoop;
our $format;
my $loop = eval { Mojo::IOLoop->singleton };
diag $@ if $@;
diag sprintf $format, 'mojo io loop', ref eval { $loop->reactor };
diag $@ if $@;
1;

1
t/00_diag.pre.txt Normal file
View File

@@ -0,0 +1 @@
EV

91
t/00_diag.t Normal file
View File

@@ -0,0 +1,91 @@
use strict;
use warnings;
use Config;
use Test::More tests => 1;
BEGIN {
my @modules;
eval q{
require FindBin;
require File::Spec;
1;
} || die $@;
do {
my $fh;
if(open($fh, '<', File::Spec->catfile($FindBin::Bin, '00_diag.pre.txt')))
{
@modules = <$fh>;
close $fh;
chomp @modules;
}
};
eval qq{ require $_ } for @modules;
};
sub spacer ()
{
diag '';
diag '';
diag '';
}
pass 'okay';
my @modules;
do {
my $fh;
open($fh, '<', File::Spec->catfile($FindBin::Bin, '00_diag.txt'));
@modules = <$fh>;
close $fh;
chomp @modules;
};
my $max = 1;
$max = $_ > $max ? $_ : $max for map { length $_ } @modules;
our $format = "%-${max}s %s";
spacer;
my @keys = sort grep /(MOJO|PERL|\A(LC|HARNESS)_|\A(SHELL|LANG)\Z)/i, keys %ENV;
if(@keys > 0)
{
diag "$_=$ENV{$_}" for @keys;
if($ENV{PERL5LIB})
{
spacer;
diag "PERL5LIB path";
diag $_ for split $Config{path_sep}, $ENV{PERL5LIB};
}
elsif($ENV{PERLLIB})
{
spacer;
diag "PERLLIB path";
diag $_ for split $Config{path_sep}, $ENV{PERLLIB};
}
spacer;
}
diag sprintf $format, 'perl ', $^V;
require(File::Spec->catfile($FindBin::Bin, '00_diag.pl'))
if -e File::Spec->catfile($FindBin::Bin, '00_diag.pl');
foreach my $module (@modules)
{
if(eval qq{ require $module; 1 })
{
my $ver = eval qq{ \$$module\::VERSION };
$ver = 'undef' unless defined $ver;
diag sprintf $format, $module, $ver;
}
else
{
diag sprintf $format, $module, '-';
}
}
spacer;

7
t/00_diag.txt Normal file
View File

@@ -0,0 +1,7 @@
EV
Module::Build
Mojolicious
POSIX
Template
Template::Provider
Test::More

7
t/00_load.t Normal file
View File

@@ -0,0 +1,7 @@
use strict;
use warnings;
use Test::More tests => 2;
use_ok( 'Mojolicious::Plugin::TtRenderer' );
use_ok( 'Mojolicious::Plugin::TtRenderer::Engine' );

View File

@@ -0,0 +1,52 @@
use strict;
use warnings;
use Test::More tests => 9;
use Test::Mojo;
use File::Temp qw( tempdir );
use FindBin '$Bin';
use Mojolicious::Lite;
use Mojolicious::Plugin::TtRenderer::Engine ();
my $tt = Mojolicious::Plugin::TtRenderer::Engine->build(
mojo => app,
template_options => {
UNICODE => 1,
ENCODING => 'UTF-8',
#INCLUDE_PATH => "$Bin/templates",
COMPILE_DIR => tempdir( CLEANUP => 1 ),
}
);
app->renderer->add_handler(tt => $tt);
app->renderer->default_handler('tt');
get '/' => sub {
die 'foo';
};
get '/bar' => 'bar';
get '/grimlock' => 'grimlock';
my $t = Test::Mojo->new;
$t->get_ok('/')
->status_is(500)
->content_like(qr{foo});
$t->get_ok('/bar')
->status_is(200)
->content_like(qr{bar});
$t->get_ok('/grimlock')
->status_is(200)
->content_like(qr{King});
__DATA__
@@ index.html.tt
anything
@@ bar.html.tt
sometimes, the bar, he eats you...

View File

@@ -0,0 +1,53 @@
use strict;
use warnings;
use Test::More tests => 9;
use Test::Mojo;
use File::Temp qw( tempdir );
use Mojolicious::Lite;
# Tell Mojolicious we want to load the TT renderer plugin
app->plugin(
tt_renderer => {
template_options => {
# These options are specific to TT
#INCLUDE_PATH => 'templates',
COMPILE_DIR => tempdir( CLEANUP => 1 ),
COMPILE_EXT => '.ttc',
# ... anything else to be passed on to TT should go here
},
}
);
app->renderer->default_handler('tt');
get '/' => sub {
die 'foo';
};
get '/bar' => 'bar';
get '/grimlock' => 'grimlock';
my $t = Test::Mojo->new;
$t->get_ok('/')
->status_is(500)
->content_like(qr{foo});
$t->get_ok('/bar')
->status_is(200)
->content_like(qr{bar});
$t->get_ok('/grimlock')
->status_is(200)
->content_like(qr{King});
__DATA__
@@ index.html.tt
anything
@@ bar.html.tt
sometimes, the bar, he eats you...

View File

@@ -0,0 +1,40 @@
use strict;
use warnings;
use File::Temp qw( tempdir );
BEGIN { $ENV{MOJO_HOME} = tempdir( CLEANUP => 1) }
use Test::More tests => 6;
use Test::Mojo;
use Mojolicious::Lite;
plugin 'tt_renderer' => { template_options => { COMPILE_DIR => tempdir( CLEANUP => 1 ) } };
app->renderer->default_handler('tt');
get '/' => sub {
die 'foo';
};
get '/bar' => 'bar';
my $t = Test::Mojo->new;
$t->get_ok('/')
->status_is(500)
->content_like(qr{foo});
$t->app->log->on(message => sub {
my($log, $level, @lines) = @_;
diag @lines if $level eq 'error';
});
$t->get_ok('/bar')
->status_is(200)
->content_like(qr{sometimes, the bar,});
__DATA__
@@ index.html.tt
anything
@@ bar.html.tt
sometimes, the bar, he eats you...

View File

@@ -3,20 +3,23 @@
use strict;
use warnings;
BEGIN { $ENV{MOJO_MODE}='testing'; };
use utf8;
use Test::More tests => 22;
use Test::More tests => 39;
use Mojolicious::Lite;
use Mojo::ByteStream 'b';
use Test::Mojo;
use File::Temp qw( tempdir );
# Silence
app->log->level('fatal');
use_ok('MojoX::Renderer::TT');
use_ok('Mojolicious::Plugin::TtRenderer::Engine');
plugin 'tt_renderer' => {template_options => {PRE_CHOMP => 1, POST_CHOMP => 1, TRIM => 1}};
plugin 'tt_renderer' => {template_options => {PRE_CHOMP => 1, POST_CHOMP => 1, TRIM => 1, COMPILE_DIR => tempdir( CLEANUP => 1 ) }};
get '/exception' => 'error';
@@ -24,7 +27,15 @@ get '/with_include' => 'include';
get '/with_wrapper' => 'wrapper';
#get '/with_auto_wrapper' => sub { shift->render(auto_wrapper => layout => 'layout') };
get '/badinclude' => 'badinclude';
get '/badwrapper' => 'badwrapper';
get '/with_auto_wrapper' => 'auto_wrapper';
get '/inheritance_base' => 'inheritance_base';
get '/inheritance_derived' => 'inheritance_derived';
get '/unicode' => 'unicode';
@@ -34,27 +45,39 @@ get '/unknown_helper' => 'unknown_helper';
get '/on-disk' => 'foo';
get '/foo/:message' => 'index';
get '/bar/:message' => 'bar';
get '/inline' => sub { shift->render(inline => '[% 1 + 1 %]', handler => 'tt') };
my $t = Test::Mojo->new;
# Exception
$t->get_ok('/exception')->status_is(500)->content_like(qr/error/i);
$t->get_ok('/exception')->status_is(500)->content_like(qr/Exception/i);
# Normal rendering
$t->get_ok('/foo/hello')->content_is("hello");
$t->get_ok('/bar/hello')->content_is("hello");
# With include
$t->get_ok('/with_include')->content_is("HelloInclude!Hallo");
# Bad inclde
$t->get_ok('/badinclude')->status_is(500)->content_like(qr/Exception/i)->content_like(qr/bogus\.inc/);
# Bad wrapper
$t->get_ok('/badwrapper')->status_is(500)->content_like(qr/Exception/i)->content_like(qr/layouts\/bogus\.html\.tt/);
# With wrapper
$t->get_ok('/with_wrapper')->content_is("wrapped");
# With auto wrapper
#$t->get_ok('/with_auto_wrapper')->content_is("wrapped");
$t->get_ok('/with_auto_wrapper')->content_is("wrapped");
# Inheritance
$t->get_ok('/inheritance_base')->content_is("untouched");
$t->get_ok('/inheritance_derived')->content_is("edited");
# Unicode
$t->get_ok('/unicode')->content_is(b("привет")->encode('UTF-8')->to_string);
$t->get_ok('/unicode')->content_is("привет");
# Helpers
$t->get_ok('/helpers')->content_is("/helpers");
@@ -68,9 +91,12 @@ $t->get_ok('/on-disk')->content_is("4");
# Not found
$t->get_ok('/not_found')->status_is(404)->content_like(qr/not found/i);
# Inline
$t->get_ok('/inline')->status_is(200)->content_is('2');
__DATA__
@@ index.html.tt
@@ bar.html.tt
[% message %]
@@ error.html.tt
@@ -79,13 +105,17 @@ __DATA__
@@ include.inc
Hello
@@ includes/include.inc
@@ includes/sub/include.inc
Hallo
@@ include.html.tt
[%- INCLUDE 'include.inc' -%]
Include!
[% INCLUDE 'includes/include.inc' -%]
[% INCLUDE 'includes/sub/include.inc' -%]
@@ badinclude.html.tt
[%- INCLUDE 'bogus.inc' -%]
not here
@@ layouts/layout.html.tt
w[%- content -%]d
@@ -95,9 +125,27 @@ w[%- content -%]d
rappe
[%- END -%]
@@ badwrapper.html.tt
[%- WRAPPER 'layouts/bogus.html.tt' %-]
not here
[%- END -%]
@@ layouts/auto_layout.html.tt
w[%- h.content -%]d
@@ auto_wrapper.html.tt
[% CALL h.layout('auto_layout') %]
rappe
@@ inheritance_base.html.tt
[% verb = BLOCK %]untouch[% END %]
[% h.content('verb', verb) %]ed
@@ inheritance_derived.html.tt
[% CALL h.extends('inheritance_base') %]
[% verb = BLOCK %]edit[% END %]
[% h.content('verb', verb) %]
@@ unicode.html.tt
привет

View File

@@ -0,0 +1,37 @@
#!/usr/bin/env perl
use strict;
use warnings;
BEGIN { $ENV{MOJO_MODE}='testing'; };
use utf8;
use Test::More tests => 3;
use Mojolicious::Lite;
use Mojo::ByteStream 'b';
use Test::Mojo;
use File::Temp qw( tempdir );
# Silence
app->log->level('fatal');
use_ok('Mojolicious::Plugin::TtRenderer::Engine');
plugin 'tt_renderer' => {template_options => {PRE_CHOMP => 1, POST_CHOMP => 1, TRIM => 1, COMPILE_DIR => tempdir( CLEANUP => 1 ) }};
app->defaults(layout => 'wrapper');
get '/test' => 'test';
my $t = Test::Mojo->new;
$t->get_ok('/test')->content_is("WS-hello-EW");
__DATA__
@@ test.html.tt
hello
@@ layouts/wrapper.html.tt
WS-[%- content -%]-EW

31
t/multiple_paths.t Normal file
View File

@@ -0,0 +1,31 @@
#!/usr/bin/env perl
use strict;
use warnings;
BEGIN { $ENV{MOJO_MODE}='testing'; };
use utf8;
use Test::More tests => 6;
use Mojolicious::Lite;
use Test::Mojo;
use File::Temp qw( tempdir );
# Silence
app->log->level('fatal');
my @paths = map { app->home->rel_dir($_) } "templates/multiple_first", "templates/multiple_second";
app->renderer->paths([@paths]);
plugin 'TtRenderer' => {template_options => { COMPILE_DIR => tempdir( CLEANUP => 1 ) }};
get '/first' => 'first';
get '/second' => 'second';
my $t = Test::Mojo->new;
$t->get_ok('/first')->status_is(200)->content_like(qr/First/);
$t->get_ok('/second')->status_is(200)->content_like(qr/Second/);

View File

@@ -1,18 +0,0 @@
use strict;
use warnings;
use Test::More;
# Ensure a recent version of Test::Pod::Coverage
my $min_tpc = 1.08;
eval "use Test::Pod::Coverage $min_tpc";
plan skip_all => "Test::Pod::Coverage $min_tpc required for testing POD coverage"
if $@;
# Test::Pod::Coverage doesn't require a minimum Pod::Coverage version,
# but older versions don't recognize some common documentation styles
my $min_pc = 0.18;
eval "use Pod::Coverage $min_pc";
plan skip_all => "Pod::Coverage $min_pc required for testing POD coverage"
if $@;
all_pod_coverage_ok();

12
t/pod.t
View File

@@ -1,12 +0,0 @@
#!perl -T
use strict;
use warnings;
use Test::More;
# Ensure a recent version of Test::Pod
my $min_tp = 1.22;
eval "use Test::Pod $min_tp";
plan skip_all => "Test::Pod $min_tp required for testing POD" if $@;
all_pod_files_ok();

15
t/templates/Foo.pm Normal file
View File

@@ -0,0 +1,15 @@
package
Foo;
use strict;
use warnings;
1;
__DATA__
@@ include.inc
Hello
@@ includes/sub/include.inc
Hallo
@@ layouts/layout.html.tt
w[%- content -%]d

View File

@@ -0,0 +1,4 @@
foo
[% PROCESS doesnotexist.tt IF do_process %]
bar

View File

@@ -0,0 +1,8 @@
% my $s = $self->stash;
% my $e = $self->stash('exception');
% delete $s->{inner_template};
% delete $s->{exception};
% my $dump = dumper $s;
% $s->{exception} = $e;
An Exception has occured: <%= $e->message %>
at <%= $e->line->[0] %> in <%= $e->line->[1] %>

View File

@@ -0,0 +1 @@
Me Grimlock King!

View File

@@ -0,0 +1 @@
test123[% 456 %]

View File

@@ -0,0 +1 @@
First

View File

@@ -0,0 +1 @@
Second

View File

@@ -0,0 +1 @@
Second

71
t/tt_plugin_lite_app.t Normal file
View File

@@ -0,0 +1,71 @@
#!/usr/bin/env perl
# Copyright (C) 2008-2010, Sebastian Riedel.
use strict;
use warnings;
BEGIN {
unless($^O eq 'MSWin32') {
eval '# line '. __LINE__ . ' "' . __FILE__ . qq("\n). q{
use POSIX qw( setlocale LC_ALL );
setlocale(LC_ALL, 'C');
};
warn $@ if $@;
}
}
use File::Temp qw( tempdir );
use Mojo::IOLoop;
use Test::More;
# Use a clean temporary directory
BEGIN { $ENV{MOJO_TMPDIR} ||= tempdir( CLEANUP => 1) }
# Make sure sockets are working
plan skip_all => 'working sockets required for this test!'
unless Mojo::IOLoop::Server->new->generate_port;
plan tests => 6;
# Leela: OK, this has gotta stop. I'm going to remind Fry of his humanity the way only a woman can.
# Farnsworth: You're going to do his laundry?
use Mojolicious::Lite;
use Test::Mojo;
# POD renderer plugin
plugin 'tt_renderer' => {template_options => { COMPILE_DIR => tempdir( CLEANUP => 1 ) }};
# Silence
app->log->level('error');
# GET /
get '/' => 'index';
get '/blow' => sub {
shift->render(template => 'conditional-exception', do_process => 1);
};
my $t = Test::Mojo->new;
# Simple TT template
$t->get_ok('/')->status_is(200)
->content_like(qr/test123456/);
$t->get_ok('/blow')->status_is(500)->content_like(qr/file error - (templates\/)?doesnotexist\.tt: (No such file or directory|not found)/);
if(eval q{ use Devel::Cycle; 1 })
{
# ignore warnings coming from Devel::Cycle
local $SIG{__WARN__} = sub { };
Devel::Cycle::find_cycle(app, sub {
my $arg = shift;
# Template::Provider (from which M::P::T::Provider inherits) has some cycles which are freed manaully by
# its DESTROY method, so we skip reporting those cycles.
unless(scalar(scalar(grep { ref($_->[2]) eq 'Mojolicious::Plugin::TtRenderer::Provider' && $_->[1] =~ /^(HEAD|TAIL|LOOKUP)$/ } @$arg)) > 0)
{
#use YAML ();
#diag YAML::Dump([ map { [ $_->[0], $_->[1], ref($_->[2]), ref($_->[3]) ] } @$arg ]);
fail('Cycle found')
}
});
};

48
t/two_data.t Normal file
View File

@@ -0,0 +1,48 @@
#!/usr/bin/env perl
use strict;
use warnings;
BEGIN { $ENV{MOJO_MODE} = 'testing' };
use utf8;
use Test::More tests => 7;
use Mojolicious::Lite;
use Test::Mojo;
use File::Temp qw( tempdir );
use FindBin ();
use lib "$FindBin::Bin/templates";
use_ok 'Foo';
push @{app->renderer->classes}, 'Foo';
plugin 'tt_renderer' => {template_options => {PRE_CHOMP => 1, POST_CHOMP => 1, TRIM => 1, COMPILE_DIR => tempdir( CLEANUP => 1 )}};
app->log->level('fatal');
get '/with_include' => 'include';
get '/with_wrapper' => 'wrapper';
my $t = Test::Mojo->new;
# With include
$t->get_ok('/with_include')->status_is(200)->content_is("HelloInclude!Hallo");
# With wrapper
$t->get_ok('/with_wrapper')->status_is(200)->content_is("wrapped");
__DATA__
@@ wrapper.html.tt
[%- WRAPPER 'layouts/layout.html.tt' -%]
rappe
[%- END -%]
@@ include.html.tt
[%- INCLUDE 'include.inc' -%]
Include!
[%- INCLUDE 'includes/sub/include.inc' -%]

View File

@@ -0,0 +1,9 @@
use strict;
use warnings;
use Test::More tests => 1;
SKIP: {
eval q{ use Dist::Zilla::PluginBundle::Author::Plicease };
skip '[@Plicease] is not installed', 1 if $@;
ok $Dist::Zilla::PluginBundle::Author::Plicease::VERSION >= 1.45, '[@Plicease] >= 1.45';
}

27
xt/release/changes.t Normal file
View File

@@ -0,0 +1,27 @@
use strict;
use warnings;
use Test::More;
BEGIN {
plan skip_all => 'test requires Test::CPAN::Changes'
unless eval q{ use Test::CPAN::Changes; 1 };
};
use Test::CPAN::Changes;
use FindBin;
use File::Spec;
chdir(File::Spec->catdir($FindBin::Bin, File::Spec->updir, File::Spec->updir));
do {
my $old = \&Test::Builder::carp;
my $new = sub {
my($self, @messages) = @_;
return if $messages[0] =~ /^Date ".*" is not in the recommend format/;
$old->($self, @messages);
};
no warnings 'redefine';
*Test::Builder::carp = $new;
};
changes_file_ok;
done_testing;

14
xt/release/eol.t Normal file
View File

@@ -0,0 +1,14 @@
use strict;
use warnings;
use Test::More;
BEGIN {
plan skip_all => 'test requires Test::EOL'
unless eval q{ use Test::EOL; 1 };
};
use Test::EOL;
use FindBin;
use File::Spec;
chdir(File::Spec->catdir($FindBin::Bin, File::Spec->updir, File::Spec->updir));
all_perl_files_ok(grep { -e $_ } qw( bin lib t Makefile.PL ));

19
xt/release/fixme.t Normal file
View File

@@ -0,0 +1,19 @@
use strict;
use warnings;
use Test::More;
BEGIN {
plan skip_all => 'test requires Test::Fixme'
unless eval q{ use Test::Fixme 0.14; 1 };
};
use Test::Fixme 0.07;
use FindBin;
use File::Spec;
chdir(File::Spec->catdir($FindBin::Bin, File::Spec->updir, File::Spec->updir));
run_tests(
match => qr/FIXME/,
where => [ grep { -e $_ } qw( bin lib t Makefile.PL )],
warn => 1,
);

15
xt/release/no_tabs.t Normal file
View File

@@ -0,0 +1,15 @@
use strict;
use warnings;
use Test::More;
BEGIN {
plan skip_all => 'test requires Test::NoTabs'
unless eval q{ use Test::NoTabs; 1 };
};
use Test::NoTabs;
use FindBin;
use File::Spec;
chdir(File::Spec->catdir($FindBin::Bin, File::Spec->updir, File::Spec->updir));
all_perl_files_ok( grep { -e $_ } qw( bin lib t Makefile.PL ));

15
xt/release/pod.t Normal file
View File

@@ -0,0 +1,15 @@
use strict;
use warnings;
use Test::More;
BEGIN {
plan skip_all => 'test requires Test::Pod'
unless eval q{ use Test::Pod; 1 };
};
use Test::Pod;
use FindBin;
use File::Spec;
chdir(File::Spec->catdir($FindBin::Bin, File::Spec->updir, File::Spec->updir));
all_pod_files_ok( grep { -e $_ } qw( bin lib ));

72
xt/release/pod_coverage.t Normal file
View File

@@ -0,0 +1,72 @@
use strict;
use warnings;
use Test::More;
BEGIN {
plan skip_all => 'test requires Test::Pod::Coverage'
unless eval q{ use Test::Pod::Coverage; 1 };
plan skip_all => 'test requires YAML'
unless eval q{ use YAML; 1; };
};
use Test::Pod::Coverage;
use YAML qw( LoadFile );
use FindBin;
use File::Spec;
my $config_filename = File::Spec->catfile(
$FindBin::Bin, 'release.yml'
);
my $config;
$config = LoadFile($config_filename)
if -r $config_filename;
plan skip_all => 'disabled' if $config->{pod_coverage}->{skip};
chdir(File::Spec->catdir($FindBin::Bin, File::Spec->updir, File::Spec->updir));
my @private_classes;
my %private_methods;
push @{ $config->{pod_coverage}->{private} },
'Alien::.*::Install::Files#Inline';
foreach my $private (@{ $config->{pod_coverage}->{private} })
{
my($class,$method) = split /#/, $private;
if(defined $class && $class ne '')
{
my $regex = eval 'qr{^' . $class . '$}';
if(defined $method && $method ne '')
{
push @private_classes, { regex => $regex, method => $method };
}
else
{
push @private_classes, { regex => $regex, all => 1 };
}
}
elsif(defined $method && $method ne '')
{
$private_methods{$_} = 1 for split /,/, $method;
}
}
my @classes = all_modules;
plan tests => scalar @classes;
foreach my $class (@classes)
{
SKIP: {
my($is_private_class) = map { 1 } grep { $class =~ $_->{regex} && $_->{all} } @private_classes;
skip "private class: $class", 1 if $is_private_class;
my %methods = map {; $_ => 1 } map { split /,/, $_->{method} } grep { $class =~ $_->{regex} } @private_classes;
$methods{$_} = 1 for keys %private_methods;
my $also_private = eval 'qr{^' . join('|', keys %methods ) . '$}';
pod_coverage_ok $class, { also_private => [$also_private] };
};
}

View File

@@ -0,0 +1,27 @@
use strict;
use warnings;
use Test::More;
BEGIN {
plan skip_all => 'test requires Test::Pod::Spelling::CommonMistakes'
unless eval q{ use Test::Pod::Spelling::CommonMistakes; 1 };
plan skip_all => 'test requires YAML'
unless eval q{ use YAML qw( LoadFile ); 1 };
};
use Test::Pod::Spelling::CommonMistakes;
use FindBin;
use File::Spec;
my $config_filename = File::Spec->catfile(
$FindBin::Bin, 'release.yml'
);
my $config;
$config = LoadFile($config_filename)
if -r $config_filename;
plan skip_all => 'disabled' if $config->{pod_spelling_common}->{skip};
chdir(File::Spec->catdir($FindBin::Bin, File::Spec->updir, File::Spec->updir));
# FIXME test files in bin too.
all_pod_files_ok;

View File

@@ -0,0 +1,101 @@
use strict;
use warnings;
use Test::More;
BEGIN {
plan skip_all => 'test requires Test::Spelling'
unless eval q{ use Test::Spelling; 1 };
plan skip_all => 'test requires YAML'
unless eval q{ use YAML; 1; };
};
use Test::Spelling;
use YAML qw( LoadFile );
use FindBin;
use File::Spec;
my $config_filename = File::Spec->catfile(
$FindBin::Bin, 'release.yml'
);
my $config;
$config = LoadFile($config_filename)
if -r $config_filename;
plan skip_all => 'disabled' if $config->{pod_spelling_system}->{skip};
chdir(File::Spec->catdir($FindBin::Bin, File::Spec->updir, File::Spec->updir));
add_stopwords(@{ $config->{pod_spelling_system}->{stopwords} });
add_stopwords(<DATA>);
all_pod_files_spelling_ok;
__DATA__
Plicease
stdout
stderr
stdin
subref
loopback
username
os
Ollis
Mojolicious
plicease
CPAN
reinstall
TODO
filename
filenames
login
callback
callbacks
standalone
VMS
hostname
hostnames
TCP
UDP
IP
API
MSWin32
OpenBSD
FreeBSD
NetBSD
unencrypted
WebSocket
WebSockets
timestamp
timestamps
poney
BackPAN
portably
RedHat
AIX
BSD
XS
FFI
perlish
optimizations
subdirectory
RESTful
SQLite
JavaScript
dir
plugins
munge
jQuery
namespace
PDF
PDFs
usernames
DBI
pluggable
APIs
SSL
JSON
YAML
uncommented
Solaris
OpenVMS
URI
URL
CGI

36
xt/release/release.yml Normal file
View File

@@ -0,0 +1,36 @@
---
pod_spelling_system:
# list of words that are spelled correctly
# (regardless of what spell check thinks)
stopwords:
- Bethke
- Cosimo
- Crowther
- Holm
- Htbaa
- Kitover
- Magnus
- Mojo
- Ramberg
- Streppone
- Vuets
- dir
- giftnuss
- mojo
- namespace
- renderer
- spleenjack
- vti
- app's
- renderer's
- Toolkit's
- Fayland
- TT
- uwisser
pod_coverage:
# format is "Class#method" or "Class", regex allowed
# for either Class or method.
private:
- Mojolicious::Plugin::TtRenderer#register
- Mojolicious::Plugin::TtRenderer::Engine#tt

15
xt/release/strict.t Normal file
View File

@@ -0,0 +1,15 @@
use strict;
use warnings;
use Test::More;
BEGIN {
plan skip_all => 'test requires Test::Strict'
unless eval q{ use Test::Strict; 1 };
};
use Test::Strict;
use FindBin;
use File::Spec;
chdir(File::Spec->catdir($FindBin::Bin, File::Spec->updir, File::Spec->updir));
all_perl_files_ok( grep { -e $_ } qw( bin lib t Makefile.PL ));

63
xt/release/unused_vars.t Normal file
View File

@@ -0,0 +1,63 @@
use strict;
use warnings;
use Test::More;
BEGIN { plan skip_all => 'test requires Test::Vars ' unless eval q{ use Test::Vars; 1 } }
BEGIN { plan skip_all => 'test requires Path::Class' unless eval q{ use Path::Class::Dir; 1 } }
BEGIN { plan skip_all => 'test requires YAML' unless eval q{ use YAML; 1 } }
my $dir = Path::Class::Dir->new(__FILE__)->parent->parent->parent;
my $config = YAML::LoadFile($dir->file(qw( xt release release.yml )));
plan skip_all => 'disabled' unless defined $config->{unused_vars}->{skip} && !$config->{unused_vars}->{skip};
my @modules;
recurse($dir->subdir('lib'));
sub recurse
{
my $dir = shift;
foreach my $child ($dir->children)
{
if($child->is_dir)
{
recurse($child);
}
else
{
push @modules, $child if $child->basename =~ /\.pm$/;
}
}
}
plan tests => scalar @modules;
my %global = (
ignore_vars => { map { $_ => 1 } @{ $config->{unused_vars}->{global}->{ignore_vars} } },
);
if(defined $config->{unused_vars}->{global}->{ignore_if})
{
$global{ignore_if} = eval $config->{unused_vars}->{global}->{ignore_if};
die $@ if $@;
}
foreach my $file (@modules)
{
my @mod = $file->components;
shift @mod; # get rid of '.';
shift @mod; # get rid of 'lib';
$mod[-1] =~ s/\.pm$//;
my $mod = join '::', @mod;
my %local = %global;
foreach my $ignore (@{ $config->{unused_vars}->{module}->{$mod}->{ignore_vars} || []})
{
$local{ignore_vars}->{$ignore} = 1;
}
if(defined $config->{unused_vars}->{module}->{$mod}->{ignore_if})
{
$local{ignore_if} = eval $config->{unused_vars}->{module}->{$mod}->{ignore_if};
die $@ if $@;
}
vars_ok($file, %local);
}

36
xt/release/version.t Normal file
View File

@@ -0,0 +1,36 @@
use strict;
use warnings;
use Test::More;
use FindBin ();
BEGIN {
plan skip_all => "test requires Test::Version 1.001001"
unless eval q{ use Test::Version 1.001001 qw( version_all_ok ), { has_version => 1 }; 1 };
plan skip_all => "test requires Path::Class"
unless eval q{ use Path::Class qw( file dir ); 1 };
plan skip_all => 'test requires YAML'
unless eval q{ use YAML; 1; };
}
use YAML qw( LoadFile );
use FindBin;
use File::Spec;
plan skip_all => "test not built yet (run dzil test)"
unless -e dir( $FindBin::Bin)->parent->parent->file('Makefile.PL')
|| -e dir( $FindBin::Bin)->parent->parent->file('Build.PL');
my $config_filename = File::Spec->catfile(
$FindBin::Bin, 'release.yml'
);
my $config;
$config = LoadFile($config_filename)
if -r $config_filename;
if($config->{version}->{dir})
{
note "using dir " . $config->{version}->{dir}
}
version_all_ok($config->{version}->{dir} ? ($config->{version}->{dir}) : ());
done_testing;