Upgrade to Pro — share decks privately, control downloads, hide ads and more …

The Even Darker Art of Rails Engines

The Even Darker Art of Rails Engines

Given at RailsConf 2009

lazyatom

May 05, 2009
Tweet

More Decks by lazyatom

Other Decks in Programming

Transcript

  1. The
    Even-Darker Art
    of
    Rails Engines

    View full-size slide

  2. github.com/lazyatom/engines

    View full-size slide

  3. November 2005

    View full-size slide

  4. it’s distracting!

    View full-size slide

  5. reuse is overrated!

    View full-size slide

  6. Evil! Evil!
    Evil!
    Evil!
    Evil!
    Evil!
    Evil!
    Evil! Shit!

    View full-size slide

  7. appable_plugins

    View full-size slide

  8. merb slices?

    View full-size slide

  9. !"#$%&!"#$'#(%&$#)&!"#$%&*$+,#-.!)
    !"#$%&'()
    $$*%&'()$++,$-'%!.%&'()./0#'12%)/'0
    "0!
    3$405/0"6$%1"$7-(5/06$8/)9$%0$%77:$!/1";)'1<=
    !"#$"05/0">
    $$9%6.%77.!/1";)'1<>
    "0!
    3$?")(106$)1("$/#$)9"$"05/0"$69/76$8/)9$%$1'()/05$#/-"
    !"#$1'()"!>
    $$@/-"="A/6)>B1'()/05.#/-"C
    "0!
    !"#$D/"8.7%)9
    $$@/-"=E'/0B!/1";)'1"0!

    View full-size slide

  10. app/controllers/
    models/
    helpers/
    views/
    metal/

    View full-size slide

  11. *$+,#-&"**&23-'!3$$(!&*$+,#-523-'!3$$(!.!)
    ;-%66$H-(5/0I'0)1'--"1/0/1**$#2"'#3-43-'!3$$(!
    $$!"#$/0!"A
    $$$$1"0!"1$J)"A)$,K$LM"--'F$H-(5/0NL
    $$"0!
    "0!

    View full-size slide

  12. 9"-7"1$J%--
    won’t load from your plugin

    View full-size slide

  13. Ticket #1905

    View full-size slide

  14. config/routes.rb

    View full-size slide

  15. O;)/'0I'0)1'--"1JJ?'()/05JJ?'()"6=!1%8$!'$+2%7+
    $$2%7=;'00";)$G:7%)9GF$J;'0)1'--"1$,K$L7-(5/0LF$
    $$$$$$$$$$$$$$$$$$$$$$$J%;)/'0$,K$L/0!"AL
    "0!
    *$+,#-&23-6#,&!3+'(%.!)

    View full-size slide

  16. top precedence

    View full-size slide

  17. O;)/'0I'0)1'--"1JJ?'()/05JJ?'()"6=!1%8$!'$+2%7+
    $$2%7=;'00";)$G:7%)9GF$J;'0)1'--"1$,K$L7-(5/0LF$
    $$$$$$$$$$$$$$$$$$$$$$$J%;)/'0$,K$L/0!"AL
    "0!
    O;)/'0I'0)1'--"1JJ?'()/05JJ?'()"6=!1%8$!'$+2%7+
    $$3$===$')9"1$1'()"6$===
    $$2%7=;'00";)$G:7%)9GF$J;'0)1'--"1$,K$L%77LF$
    $$$$$$$$$$$$$$$$$$$$$$$J%;)/'0$,K$L/0!"AL
    $$3$===$')9"1$1'()"6$===
    "0!
    in your plugin:
    in your app:

    View full-size slide

  18. O;)/'0I'0)1'--"1JJ?'()/05JJ?'()"6=!1%8$!'$+2%7+
    $$2%7=;'00";)$G:7%)9GF$J;'0)1'--"1$,K$L7-(5/0LF$
    $$$$$$$$$$$$$$$$$$$$$$$J%;)/'0$,K$L/0!"AL
    "0!
    O;)/'0I'0)1'--"1JJ?'()/05JJ?'()"6=!1%8$!'$+2%7+
    $$3$===$')9"1$1'()"6$===
    $$2%7=;'00";)$G:7%)9GF$J;'0)1'--"1$,K$L%77LF$
    $$$$$$$$$$$$$$$$$$$$$$$J%;)/'0$,K$L/0!"AL
    $$3$===$')9"1$1'()"6$===
    "0!
    in your plugin:
    in your app:

    View full-size slide

  19. Ticket #2592
    (also Ticket #329)

    View full-size slide

  20. 785*$+,#-&$#)&785*$+,#-.!)
    2'!(-"$P$$!"#$6"-#=%!!.1'()"6B7"*C
    $$$$2%7=;'00";)$L:6)(##LF$J;'0)1'--"1$,K$L)9/056L
    $$"0!
    "0!
    O;)/'0I'0)1'--"1JJ?'()/05JJ?'()"6=!1%8$!'$+2%7+
    $$3$<'(1$%77$1'()"6===
    $$P$$3$");===
    "0!

    View full-size slide

  21. what’s missing?

    View full-size slide

  22. public assets

    View full-size slide

  23. 83+!5*$+,#--%'"$$.!)
    2<./2%5"6$,$H%)90%2"=0"8B@/-"=!/10%2"[email protected]$S$
    $$$$$$$$$$$$$$L%66")6:/2%5"6L
    )%15")$,$?%/-6=1'')$S$L7(&-/;:/2%5"6:2<.7-(5/0L
    @/-"T)/-6=2U!/1.7B)%15")C
    2<./2%5"6=;9/-!1"0="%;9$!'$+"+$
    $$$$@/-"T)/-6=;7.1B"F$)%15")$S$"=&%6"0%2"C$
    "0!

    View full-size slide

  24. 83+!5*$+,#--%'"$$.!)
    2<./2%5"6$,$H%)90%2"=0"8B@/-"=!/10%2"[email protected]$S$
    $$$$$$$$$$$$$$L%66")6:/2%5"6L
    )%15")$,$?%/-6=1'')$S$L7(&-/;:/2%5"6:2<.7-(5/0L
    )%15")=2%U".6<2-/0UB2<./2%5"6C$(0-"66$)%15")="A/6)>

    View full-size slide

  25. !&:2/51%)":
    $$VWWXWYWYYVYVZ[.%-79%=1&
    version
    20090101121234
    20090102142345
    2008123123456
    VWWXWYWVY[VZ[\.&")%=1&
    7-(5/0:!&:2/51%)":
    $$VWW]YVZYZ[\^.5%22%=1&

    View full-size slide

  26. version
    20090101121234
    20090102142345
    2008123123456
    1%U"$!&J1'--&%;U
    P/51%)'1=1'--&%;U
    P/51%)'13;(11"0).D"16/'0
    P/51%)'132/51%)"!=-%6)
    P/51%)'1=5").%--.D"16/'06
    BL_4R4I`$D"16/'0$@?aP$
    $
    $
    $$6;9"2%.2/51%)/'06LC
    =2%7BbJ)'./C=6'1)

    View full-size slide

  27. it gets worse

    View full-size slide

  28. !&:2/51%)":
    $$WWY.%-79%=1&
    version
    001
    002
    WWV.&")%=1&
    7-(5/0:!&:2/51%)":
    $$WWY.5%22%=1&

    View full-size slide

  29. http://www.flickr.com/photos/bk2204/475332962/

    View full-size slide

  30. single timeline

    View full-size slide

  31. app migration 1
    app migration 2
    plugin migration 1
    app migration 3
    plugin migra
    install
    upgrade
    You
    Me

    View full-size slide

  32. app migration 1
    app migration 2
    plugin migration 1
    app migration 3
    plugin migration 2
    You

    View full-size slide

  33. WW[.!"-)%=1&
    !&:2/51%)":
    $$WWY.%-79%=1&
    WWV.&")%=1&
    7-(5/0:!&:2/51%)":
    $$WWY.5%22%=1&
    WWZ.7-(5/0.)'.WWY=1&

    View full-size slide

  34. WW[.!"-)%=1&
    !&:2/51%)":
    $$WWY.%-79%=1&
    WWV.&")%=1&
    7-(5/0:!&:2/51%)":
    $$WWY.5%22%=1&
    WWZ.7-(5/0.)'.WWY=1&
    Copy &
    Retimestamp?
    Reference?
    Symlink?

    View full-size slide

  35. Ticket #2058
    interblah.net/plugin-migrations

    View full-size slide

  36. my recommendation?
    (for the moment, at least)

    View full-size slide

  37. write a generator
    c$6;1/7):5"0"1%)"$%;)6.%6.#(.2/51%)/'06
    $$$$
    $$$"A/6)6$$!&:2/51%)"
    $$$;1"%)"$$!&:2/51%)":VWWXW\W\YYYZZd.&-%9=1&
    c$===
    (within your plugin)

    View full-size slide

  38. overriding functionality

    View full-size slide

  39. views just work

    View full-size slide

  40. straight override

    View full-size slide

  41. playing nice with the
    class cache

    View full-size slide

  42. 1/23*8/36/1**$#2"'#3-43-'!3$$(!/
    9"%/)((-/!(73:(;/6!37/'9(/73;+$(/
    '!((/)+'/#%/%'#$$/"2'#:(<<
    <
    <
    <
    <
    <
    <
    !

    View full-size slide

  43. O;)/D"_(77'1)JJe"7"0!"0;/"6=-'%!.'0;".7%)96

    View full-size slide

  44. ApplicationController
    AppController PluginController

    View full-size slide

  45. ApplicationController
    PluginController

    View full-size slide

  46. 23-6#,&(-:#!3-7(-'.!)
    ?%/-6JJQ0/)/%-/f"1=1(0$!'$+;'0#/5+
    $$3$");===
    $$;'0#/5=1"-'%!.7-(5/06$,$)1("
    $$
    "0!

    View full-size slide

  47. 83+!5*$+,#-&"**&23-'!3$$(!%&,33;523-'!3$$(!.!)
    ;-%66$g''!I'0)1'--"1$h$===
    $$(0-'%!%&-"
    $$
    $$3$");$===
    "0!

    View full-size slide

  48. init.rb woes

    View full-size slide

  49. ;'0#/5=)'.71"7%1"$!'
    $$
    "0!
    785*$+,#--#'.!)
    $$_'2"O77I-%66="A)"0!BP

    View full-size slide

  50. ApplicationController
    PluginController
    AppController

    View full-size slide

  51. ApplicationController
    PluginController
    Their Code
    Your Code

    View full-size slide

  52. test in your own rails
    environment?

    View full-size slide

  53. plugin_test_helper

    View full-size slide

  54. I care about testing
    my chunk

    View full-size slide

  55. You care about testing
    your whole app

    View full-size slide

  56. empower the
    developer

    View full-size slide

  57. avoiding fail

    View full-size slide

  58. ;%6"$;'!"=;'06(2"1
    $$89"0$;'!"=%()9'1
    $$$$1"(6"=2'6)-<$,j$:"##";)/D":
    $$89"0$1%0!B!"D"-'7"1C
    $$$$1"(6"=)1/;U/"1.&().7'66/&-"B)1("C
    $$"-6"
    $$$$1"(6"='D"11%)"!N
    "0!

    View full-size slide

  59. consume wisely

    View full-size slide

  60. Serving Size 14 kloc
    Nutrition Facts
    Amount Per Serving 1 bad engine
    Calories 10,666
    Long Methods 1578g 34%
    God Objects 326g 7%
    Stress 320mg 119%
    Total Fat 2674g 98%
    Hairloss 45g 45.8%
    % Daily Value*
    Technical Debt 13g 87%
    Untested Code 1578mg 34%
    Hidden Bugs 326mg 7%
    Benefit 1mg 0.1%

    View full-size slide

  61. you will not be able to
    write some engines.

    View full-size slide

  62. you will not be able to
    use some engines.

    View full-size slide

  63. extract
    specific functionality

    View full-size slide

  64. establish some
    clear integration points

    View full-size slide

  65. you are customer #1

    View full-size slide

  66. READ the CODE

    View full-size slide