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 Slide

  2. @lazyatom

    View Slide

  3. github.com/lazyatom/engines

    View Slide

  4. Rails 2.3

    View Slide

  5. history

    View Slide

  6. November 2005

    View Slide

  7. it’s distracting!

    View Slide

  8. reuse is overrated!

    View Slide

  9. Evil! Evil!
    Evil!
    Evil!
    Evil!
    Evil!
    Evil!
    Evil! Shit!

    View Slide

  10. eek!

    View Slide

  11. appable_plugins

    View Slide

  12. desert

    View Slide

  13. merb slices?

    View Slide

  14. View Slide

  15. engines

    View Slide

  16. !"#$%&!"#$'#(%&$#)&!"#$%&*$+,#-.!)
    !"#$%&'()
    $$*%&'()$++,$-'%!.%&'()./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 Slide

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

    View Slide

  18. *$+,#-&"**&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 Slide

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

    View Slide

  20. Ticket #1905

    View Slide

  21. config/routes.rb

    View Slide

  22. 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 Slide

  23. top precedence

    View Slide

  24. 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 Slide

  25. 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 Slide

  26. Ticket #2592
    (also Ticket #329)

    View Slide

  27. 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 Slide

  28. what’s missing?

    View Slide

  29. public assets

    View Slide

  30. copy

    View Slide

  31. file clash

    View Slide

  32. 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 Slide

  33. 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 Slide

  34. migrations

    View Slide

  35. simple DSL

    View Slide

  36. rollback

    View Slide

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

    View Slide

  38. 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 Slide

  39. it gets worse

    View Slide

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

    View Slide

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

    View Slide

  42. single timeline

    View Slide

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

    View Slide

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

    View Slide

  45. 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 Slide

  46. 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 Slide

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

    View Slide

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

    View Slide

  49. 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 Slide

  50. techniques

    View Slide

  51. overriding functionality

    View Slide

  52. views just work

    View Slide

  53. controllers

    View Slide

  54. straight override

    View Slide

  55. View Slide

  56. View Slide

  57. module

    View Slide

  58. View Slide

  59. View Slide

  60. View Slide

  61. namespaced

    View Slide

  62. View Slide

  63. View Slide

  64. View Slide

  65. playing nice with the
    class cache

    View Slide

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

    View Slide

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

    View Slide

  68. ApplicationController
    AppController PluginController

    View Slide

  69. ApplicationController
    PluginController

    View Slide

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

    View Slide

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

    View Slide

  72. init.rb woes

    View Slide

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

    View Slide

  74. testing

    View Slide

  75. ApplicationController
    PluginController
    AppController

    View Slide

  76. ApplicationController
    PluginController
    Their Code
    Your Code

    View Slide

  77. View Slide

  78. !
    "
    #
    $

    View Slide

  79. View Slide

  80. unit test?

    View Slide

  81. test in your own rails
    environment?

    View Slide

  82. plugin_test_helper

    View Slide

  83. I care about testing
    my chunk

    View Slide

  84. You care about testing
    your whole app

    View Slide

  85. empower the
    developer

    View Slide

  86. avoiding fail

    View Slide

  87. ;%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 Slide

  88. consume wisely

    View Slide

  89. 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 Slide

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

    View Slide

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

    View Slide

  92. extract
    specific functionality

    View Slide

  93. establish some
    clear integration points

    View Slide

  94. you are customer #1

    View Slide

  95. READ the CODE

    View Slide

  96. View Slide