rapidapp - yapc::na 2014
DESCRIPTION
Presentation on RapidApp web framework presented at YAPC::NA 2014TRANSCRIPT
Henry Van Styn<[email protected]>
YAPC::NA 2014Tuesday, 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::ZillaPlack
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
mixStandard MVC
(“Components” in Catalyst)
DBIC
Controller
ViewModel
Module
Application Architecture:
RapidApp adds“Modules” to the
mixEncapsulate
interface(s) w/ plumbing
ViewModel
Controller RootModule
DBIC
Controller
ViewModel
Module
Application Architecture:
Controller(s)
View(s)Model(s)
RapidApp adds“Modules” to the
mixEncapsulate
interface(s) w/ plumbing
Components live adjacent to each
other
ViewModel
Controller RootModule
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 RootModule
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)
RootModule
Module Module
ModuleModule
. . .
Application Architecture:
Only one “Root” Module
…which is a Controller
ViewModel
Controller
DBIC
Controller(s)
View(s)Model(s)
RootModule
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)
RootModule
Module Module
ModuleModule
Catalyst::Plugin::RapidApp
. . .
Application Architecture:
automatically injects and configures modules and
components…
ViewModel
Controller
DBIC
Controller(s)
View(s)Model(s)
RootModule
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)
RootModule
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)
RootModule
Module Module
ModuleModule
Catalyst::Plugin::RapidApp
Plugin Plugin Plugin
Plugin
. . .
Application Architecture:
loads and configures other plugins…
DBIC
Controller(s)
View(s)Model(s)
RootModule
Module Module
ModuleModule
Catalyst::Plugin::RapidApp
Plugin Plugin Plugin
Plugin
Plugin
. . .
. . .
More Declarativ
e
Application Architecture:
+More
Specialized
DBIC
Controller(s)
View(s)Model(s)
RootModule
Module Module
ModuleModule
Catalyst::Plugin::RapidApp
Plugin Plugin Plugin
Plugin
Plugin
. . .
. . .
More Declarativ
e
Application Architecture:
+More
Specialized
Plugin
Application Architecture:
DBIC
Controller(s)
View(s)Model(s)
RootModule
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 RapidAppExplain + bootstrap with rapidapp.pl
Run app (1):Explain navtree + tab panelShow that URLs are all RESTfulShow gridsPaging, sorting, items p/pg, query timeColumns, show/hide, reorder, auto-sizeRow page (double-click)FiltersQuick SearchRelationship columnsCSV export
Configure app (1):Show main app class, model & generated schema classesExplain grid_params & TableSpecsenable editing
Run app (2):Edit in grid, page & edit formDelete: single, multipleBatch ModifyAdd rr w/ existing, then new soa
Configure app (2):Set display_column (Soa/origin)
Run app (3):Reload tabShow 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 gridWith 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 passwordShow Sessions grid
Configure app (7):Add NavCore plugin
Run app (8):Create a saved viewOrganize NavtreeSet a default source view
Demo checklist (RA::MyDNS) - 4
Demo BlueBox checklist
Explain AngleHack + BlueBoxgit clone BlueBox repo
Run app:Show public demo (newman)Login and show admin sectionShow editing template pages
nested templates*.md templates
Show order_list pageview page sourceexplain iframe
Configure app:Show codeExplain main class cnf optsExplain Template Access class
Explain Chinook Demo (already on site)git clone RA-ChinookDemo repocheckout complex_rels branchShow HEAD commit in github
Run app:Show Album single-relsShow Artist single-rel (self_titled_album)Show MediaType multi-rel (rock_tracks)
Demo RA-ChinookDemo checklist