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

RapidApp - YAPC::NA 2014

Editor's Notes

  • #2 Going to talk about the open-source, RapidApp web framework Which has been an in-house platform that we’ve been developing internally for 5 years. Just started open-sourcing within the past year. which is an extension to Catalyst that focuses on building database-driven apps faster than ever.
  • #3 Once we get to the demos will go “off-script” and will dive into features and code partially based on audience feedback This slideshow will be uploaded to slideshare with link on yapcna.org after the end of the talk. There will also be links to all the code we’ll cover (including code we’ll write live during the talk) want to get to the demos & actual code quickly, … but first we need some context to set the stage
  • #5 It does… DBIC: this is one of the primary, original core features,… and we’ll be exploring it quite a bit in this talk… …but is still just a piece of a larger puzzle RapidApp also does…
  • #6 What problems does RapidApp solve?
  • #7 Still require entirely too much effort Not so much about custom specialty interfaces & designs - the highly visible ones you/designer want and plan to write … there are plenty of existing designer tools custom is custom… All the other, general interfaces… That you need but don’t want to write… And the interfaces that you just do without because you don’t have time to write them
  • #8 Just the idea that the basic rules and info needed for interfaces are already defined in the table schema… should be able to have access to them without a lot of effort Here is one, specific example: (NEXT) ->
  • #9 Where Foo is an existing model object, like a DBIC source
  • #10 Database won’t let you insert a string into an integer column … … so the form shouldn’t either Stay tied to schema…
  • #11 just as important as what a framework gives is what it takes away Don’t presume to know all the use-cases in advance
  • #13 Particularly in the tools coming out of the modern Perl movement, like Moose
  • #15 it feels great to program when you have awesome tools and libraries at your disposal it’s why i love Perl
  • #17 it’s how good APIs should make you feel …how Perl usually makes me feel
  • #19 Its like going from casting lightning bolts from your fingertips like a jedi master… … to scrubbing the bathroom floor with a toothbrush
  • #20 and CSS and I get along a lot better these days… CSS and JavaScript are robust, well-designed & impressive But that’s not the point…
  • #21 NEXT: Let’s see how RapidApp is built to accomplish this
  • #22 RapidApp is still Catalyst, so we still have the same Models, Views and Controllers…
  • #23 …with DBIC-based database backends connected through the Model API… Also standard
  • #25 Think of as specialized “Fat controller” Contains within it its own MVC-type structures
  • #30 Uses standard plugin API… Loading Plugin::RapidApp is what makes a Catalyst application become a RapidApp application… NEXT: Excitement for learning another DSL…
  • #45 These are the general items I plan to cover in the RA::MyDNS live demo…
  • #46 These are the general items I plan to cover in the RA::MyDNS live demo…
  • #47 These are the general items I plan to cover in the BlueBox live demo…