Embed presentation
Download to read offline
Henry Van Styn <vanstyn@cpan.org> YAPC::NA 2014 Tuesday, 24 June - 11:00AM www.rapidapp.info irc.perl.org - #rapidapp
Agenda • What is RapidApp - overview & rationale • How it works - basic architecture & APIs • Live Demos & Examples... • Questions feedback from audience & IRC: join #rapidapp on irc.perl.org
RapidApp is... • An extension to the Catalyst stack • Aims to speed development with easy access to common interface paradigms • Preserves native APIs and environments • Flexible, uber-modular design • Multiple declarative configuration layers • Wide-range of application personalities...
Features... • Automatic, model-driven Ajax interfaces (ExtJS) • Maps DBIx::Class methods to web front-ends (CRUD+) • RESTful URL navigation schemes • Powerful built-in templating and CMS • Automatic asset management (css, js, icons, etc) • (and other gooey-goodness)
Why another web framework?
Interfaces.
implicit interfaces ...the CRUD-based interfaces which are already implied by the schema * all you should have to do to ask for them (declarative) *
"Give me an interface to add rows to Foo" • Should auto-generate a robust, fully working form • with fields for each of Foo’s columns • according to each column type... • datetime? - date selector • varchar? - text box • etc. • Column non-nullable? - required field • Foreign key? - selection dialog for the remote source (e.g. dropdown) • and so on
"Give me an interface to add rows to Foo" ...and, don’t be stupid: • yes - handle client-side validation • yes - scroll long content in a manner that is not moronic • yes - display exceptions to the client • etc. • no - do not truncate column names... • no - do not drown the children in the tub... (or any other horrible thing I haven’t thought of but obviously don’t want) Be on-demand - automatically change with the schema... • column dropped? - field ceases to exist • made nullable? - field no longer required And obviously... • Handle all the plumbing to tie cleanly into the backend • Just work.
"Give me an interface to add rows to Foo" And one more thing: Do predict & provide high-level choices & options... ...and allow me to customize, extend & build upon the base... ...but don’t limit me. Do not hinder me in any way from doing things differently.
All I’m really sayin’ ... give me everything for free with no trade-offs Is that really so much to ask??
We already take powerful, declarative APIs for granted in our perl-side code. (how I learned I wanted them)
Perl has spoiled me ...and showed what great APIs can & should do
Catalyst Moose DBIx::Class Devel::NYTProf IO::All Type::Tiny Moo Try::Tiny DateTime Dist::Zilla Plack Path::Class Web::Simple Authen::Passphrase Test::More Template::Toolkit DBI Dancer
makes programming feel like ...
Until... ...it was time to write the front-side code
Y U NO USE MY CSS CLASS?!
But, to be fair ... proficiency bias... and it usually wasn’t the fault of CSS, Firefox ... (it was IE’s fault)
I don’t want to know CSS. I want to write models and business logic. (and still feel entitled to robust web interfaces)
Controller ViewModel Application Architecture: Standard MVC ("Components" in Catalyst)
DBIC Controller ViewModel Application Architecture: Standard MVC ("Components" in Catalyst)
DBIC Controller ViewModel Module Application Architecture: RapidApp adds "Modules" to the mix Standard MVC ("Components" in Catalyst)
DBIC Controller ViewModel Module Application Architecture: RapidApp adds "Modules" to the mix Encapsulate interface(s) w/ plumbing
ViewModel Controller Root Module DBIC Controller ViewModel Module Application Architecture: Controller(s) View(s)Model(s) RapidApp adds "Modules" to the mix Encapsulate interface(s) w/ plumbing Components live adjacent to each other
ViewModel Controller Root Module DBIC Controller ViewModel Module Application Architecture: Controller(s) View(s)Model(s) Components live adjacent to each other Modules live in a hierarchy
ViewModel Controller Root Module DBIC Controller(s) View(s)Model(s) Module Module Module ModuleModule ... Application Architecture: Components live adjacent to each other Modules live in a hierarchy
ViewModel Controller DBIC Controller(s) View(s)Model(s) Root Module Module Module ModuleModule ... Application Architecture: Only one "Root" Module ...which is a Controller
ViewModel Controller DBIC Controller(s) View(s)Model(s) Root Module Module Module ModuleModule Catalyst::Plugin::RapidApp ... Application Architecture: RapidApp extends Catalyst via the standard plugin API
Excitement for learning another DSL...
ViewModel Controller DBIC Controller(s) View(s)Model(s) Root Module Module Module ModuleModule Catalyst::Plugin::RapidApp ... Application Architecture: automatically injects and configures modules and components...
ViewModel Controller DBIC Controller(s) View(s)Model(s) Root Module Module Module ModuleModule Catalyst::Plugin::RapidApp Plugin Plugin Plugin ... Application Architecture: automatically injects and configures modules and components...
ViewModel Controller DBIC Controller(s) View(s)Model(s) Root Module Module Module ModuleModule Catalyst::Plugin::RapidApp Plugin Plugin Plugin ... Application Architecture: loads and configures other plugins...
ViewModel Controller DBIC Controller(s) View(s)Model(s) Root Module Module Module ModuleModule Catalyst::Plugin::RapidApp Plugin Plugin Plugin Plugin ... Application Architecture: loads and configures other plugins...
DBIC Controller(s) View(s)Model(s) Root Module Module Module ModuleModule Catalyst::Plugin::RapidApp Plugin Plugin Plugin Plugin Plugin ... ... More Declarative Application Architecture: + More Specialized
DBIC Controller(s) View(s)Model(s) Root Module Module Module ModuleModule Catalyst::Plugin::RapidApp Plugin Plugin Plugin Plugin Plugin ... ... More Declarative Application Architecture: + More Specialized
Plugin Application Architecture: DBIC Controller(s) View(s)Model(s) Root Module Module Module ModuleModule Catalyst::Plugin::RapidApp Plugin Plugin Plugin Plugin ... Controller Module
Ok... so, show us some code!
Example - MyDNS • Lightweight authoritative DNS server • C daemon serves records directly from MySQL • Very simple schema (only 2 tables) • Generally recognizable data (for those familiar with DNS)
Our task: • Create a web-based admin app to manage MyDNS
MyDNS Schema
MyDNS Schema
(demo)
Demo checklist (RA::MyDNS) - 1 cpanm RapidApp Explain + bootstrap with rapidapp.pl Run app (1): Explain navtree + tab panel Show that URLs are all RESTful Show grids Paging, sorting, items p/pg, query time Columns, show/hide, reorder, auto-size Row page (double-click) Filters Quick Search Relationship columns CSV export Configure app (1): Show main app class, model & generated schema classes Explain grid_params & TableSpecs enable editing Run app (2): Edit in grid, page & edit form Delete: single, multiple Batch Modify Add rr w/ existing, then new soa Configure app (2): Set display_column (Soa/origin) Run app (3): Reload tab Show zone rel w/ edit Demo checklist (RA::MyDNS) - 2
Demo checklist (RA::MyDNS) - 3 Configure app (3): Create ‘Type’ ResultSource::View Run app (4): Show new Type grid With its rrs relationship Configure app (4): Add AuthCore plugin Run app (5): Login and out and in... Show login via direct URL Configure app (5): Add CoreSchemaAdmin plugin Run app (6): Change a password Show Sessions grid Configure app (7): Add NavCore plugin Run app (8): Create a saved view Organize Navtree Set a default source view Demo checklist (RA::MyDNS) - 4
Demo BlueBox checklist Explain AngleHack + BlueBox git clone BlueBox repo Run app: Show public demo (newman) Login and show admin section Show editing template pages nested templates *.md templates Show order_list page view page source explain iframe Configure app: Show code Explain main class cnf opts Explain Template Access class Explain Chinook Demo (already on site) git clone RA-ChinookDemo repo checkout complex_rels branch Show HEAD commit in github Run app: Show Album single-rels Show Artist single-rel (self_titled_album) Show MediaType multi-rel (rock_tracks) Demo RA-ChinookDemo checklist
Questions? Henry Van Styn <vanstyn@cpan.org> www.rapidapp.info irc.perl.org - #rapidapp