Refactoring Redmine Series

Since Redmine’s codebase was in a pretty poor shape I started a daily series to refactor it and show how I did it. This series ended up being used as the source for Refactoring Redmine (after a bunch of editing).

Get the full ebook

  1. Daily Refactor #1: Extract Method in the BulkTimeEntriesController – saving a new TimeEntry
  2. Daily Refactor #2: Move Method in the BulkTimeEntriesController – saving a new TimeEntry
  3. Daily Refactor #3: Behavior Change in the Bulk Time Entry patch
  4. Daily Refactor #4: Extract Method in the BulkTimeEntriesHelper – options generator
  5. Daily Refactor #5: Remove iteration by using Enumerable
  6. Daily Refactor #6: Move recipients method to acts_as_event
  7. Daily Refactor #7: Extract method in fetch_changesets
  8. Daily Refactor #8: Move method in the ReportsController
  9. Daily Refactor #9: Move Issue#by methods
  10. Daily Refactor #10: Pull up the #find_project method to the ApplicationController
  11. Daily Refactor #11: Extract action in ReportsController
  12. Daily Refactor #12: Extract rendering in the case statement
  13. Daily Refactor #13: Inline utility methods in ReportsController
  14. Daily Refactor #14: Extract method to before_filter in ReportsController
  15. Daily Refactor #15: Rename method in IssueStatusesController
  16. Daily Refactor #16: Rename method in RolesController
  17. Daily Refactor #17: Extract method in AuthSourceLdap
  18. Daily Refactor #18: Extract method in AuthSourceLdap
  19. Daily Refactor #19: Cleanup in AuthSourceLdap#authenticate
  20. Daily Refactor #20: Extract Method in AuthSourceLdap
  21. Daily Refactor #20.1: Bonus Extract Method in AuthSourceLdap
  22. Daily Refactor #21: Move methods in the RoutingTest
  23. Daily Refactor #22: Move method in IssuesController#bulk_edit
  24. Daily Refactor #23: Extract method in IssuesController#edit
  25. Daily Refactor #24: Extract method body in IssuesController#edit
  26. Daily Refactor #25: Extract method in IssuesController#update
  27. Daily Refactor #26: Convert Procedural Design to Objects in #issue_update
  28. Daily Refactor #27: Move Method to the Attachment Model
  29. Daily Refactor #28: Decouple flash messages from Attachment#attach_files
  30. Daily Refactor #29: Replace Temp with Query in IssuesController#issue_update
  31. Daily Refactor #30: Move Method into Issue
  32. Daily Refactor #31: Extract Method in IssuesHelper#show_detail
  33. Daily Refactor #32: Inline Method in IssuesHelper#show_detail
  34. Daily Refactor #33: Extract Method in IssuesController
  35. Daily Refactor #34: Split Methods in the controllers
  36. Daily Refactor #35: Pull up method for finding a controller’s model object
  37. Daily Refactor #36: Extract Method to the Member model
  38. Daily Refactor #37: Extract Method to Query#sortable_columns
  39. Daily Refactor #38: Extract Method in StuffToDo
  40. Daily Refactor #39: Substitute Algorithm for Checking the Settings
  41. Daily Refactor #40: Extract Method in StuffToDo#available
  42. Daily Refactor #41: Consolidate Duplicate Conditional Fragments in StuffToDo
  43. Daily Refactor #42: Consolidate Conditionals in StuffToDo#available
  44. Daily Refactor #43: Extract Method in StuffToDoController
  45. Daily Refactor #44: Extract Method in Kanban.
  46. Daily Refactor #45: Extract Method for Kanban panes – Part 1
  47. Daily Refactor #46: Extract Method for Kanban panes – Part 2
  48. Daily Refactor #47: Extract Method for Kanban panes – Part 3
  49. Daily Refactor #48: Consolidate Duplicate Conditional Fragments in Kanban
  50. Daily Refactor #49: Replace Incoming Pane’s Data Value with Object
  51. Daily Refactor #50: Remove Middle Man methods in Kanban
  52. Daily Refactor #51: Lazy Load Issues in Kanban
  53. Daily Refactor #52: Remove Middle Man Kanban#find
  54. Daily Refactor #53: Move Method to KanbanPane
  55. Daily Refactor #54: Move Method to KanbanPane
  56. Daily Refactor #55: Move Pane Configuration To KanbanPane
  57. Daily Refactor #56: Replace Accumulator with Inject
  58. Daily Refactor #57: Extract Class to CustomFieldFormat
  59. Daily Refactor #58: Move Method to Query Model
  60. Daily Refactor #59: Move Routing Tests
  61. Daily Refactor #60: Move Routing Tests – Part Two
  62. Daily Refactor #61: Extract Method in IssuesController for REST
  63. Daily Refactor #62: Extract Method in IssuesController
  64. Daily Refactor #63: Extract Method to before_filter in IssuesController
  65. Daily Refactor #64: Move Method to QueriesHelper
  66. Daily Refactor #65: Extract Gantt to a new controller
  67. Daily Refactor #66: Pull Up Method to ApplicationController
  68. Daily Refactor #67: Pull Up Method to ApplicationController
  69. Daily Refactor #68: Extract Class to New Controller
  70. Daily Refactor #69: Inline Temp in SourceNews#migrate
  71. Daily Refactor #70: Inline Temp in SourceVersion#migrate
  72. Daily Refactor #71: Extract Method in KanbansController to before_filter
  73. Daily Refactor #72: Move Method in KanbansController
  74. Daily Refactor #73: Move Method to before_filter in InvoiceController
  75. Daily Refactor #74: Extract Method in Invoice
  76. Daily Refactor #75: Inline Temp in Invoices#outstanding
  77. Daily Refactor #76: Replace Temp with Query in Invoice#fully_paid?
  78. Daily Refactor #77: Extract and Move Method in InvoiceController
  79. Daily Refactor #78: Replace Data Value in InvoiceController with Object
  80. Daily Refactor #79: Convert Controller to REST Controller
  81. Daily Refactor #80: Convert PaymentsController to REST Controller
  82. Daily Refactor #81: Move last_invoice_number to Model
  83. Redmine Refactor #82: Extract Method to shoulda Macro in AccountControllerTest
  84. Redmine Refactor #83: Self Encapsulate Field in User
  85. Redmine Refactor #84: Extract Method in IssuesController#context_menu
  86. Redmine Refactor #85: Extract Method in IssuesController#move
  87. Redmine Refactor #86: Extract Method to split IssuesController#move into two actions
  88. Redmine Refactor #87: Extract Method Body to IssuesController#perform_move
  89. Redmine Refactor #88: Extract Method from move and perform_move
  90. Redmine Refactor #89: Extract Controller: IssueMovesController
  91. Redmine Refactor #90: Pull Up Method to ApplicationController
  92. Redmine Refactor #91: Pull Up set_flash_from_bulk_issue_save to ApplicationController
  93. Redmine Refactor #92: Move Method #reply to JournalsController
  94. Redmine Refactor #93: Extract Controller from IssuesController
  95. Redmine Refactor #94: Extract PreviewsController from IssuesController
  96. Redmine Refactor #95: Extract ContextMenusController from IssuesController
  97. Redmine Refactor #96: Merge Method in IssuesController
  98. Redmine Refactor #97: Move method from IssuesController to JournalsController
  99. Redmine Refactor #98: Extract method from IssuesController#bulk_edit
  100. Redmine Refactor #99: Extract method from IssuesController#bulk_update
  101. Redmine Refactor #100: Convert Issue Routes to REST Resources
  102. Redmine Refactor #101: Extract activity from ProjectsController to a new controller
  103. Redmine Refactor #102: Move method from ProjectsController#roadmap to VersionsController#index
  104. Redmine Refactor #103: Move method from ProjectsController#list_files to FilesController#index
  105. Redmine Refactor #104: Move method from ProjectsController#add_file to FilesController#new
  106. Redmine Refactor #105: Move method from ProjectsController#save_activities to ProjectEnumerationsController#save
  107. Redmine Refactor #106: Move method from ProjectsController#reset_activities to ProjectEnumerationsController#destroy
  108. Redmine Refactor #107: Extract method #create from ProjectsController#add
  109. Redmine Refactor #108: Rename method ProjectsController#add to #new
  110. Redmine Refactor #109: Extract method ProjectsController#edit to #update
  111. Redmine Refactor #110: Convert ProjectsController’s routes to resources
  112. Redmine Refactor #111: Convert ProjectEnumerations to resource
  113. Redmine Refactor #112: Split Method in FilesController
  114. Redmine Refactor #113: Convert FilesController to resource
  115. Redmine Refactor #114: Split Method in VersionsController
  116. Redmine Refactor #115: Split Method in VersionsController
  117. Redmine Refactor #116: Convert VersionsController to resource
  118. Redmine Refactor #117: Split New Method in NewsController
  119. Redmine Refactor #118: Split Edit Method in NewsController
  120. Redmine Refactor #119: Extract Class from NewsController
  121. Redmine Refactor #120: Move Method from NewsController to CommentsController
  122. Redmine Refactor #121: Move Method from NewsController to PreviewsController
  123. Redmine Refactor #122: Convert NewsController to REST resource
  124. Redmine Refactor #123: Split #add method in UsersController to #add and #create
  125. Redmine Refactor #124: Rename Method UsersController#add
  126. Redmine Refactor #125: Split UsersController#edit into #edit and #update
  127. Redmine Refactor #126: Convert UsersController to Resource
  128. Redmine Refactor #127: Extract TimelogController#report to new TimeEntryReportsController
  129. Redmine Refactor #128: Rename method TimelogController#details to #index
  130. Redmine Refactor #129: Extract Method TimelogController#edit to TimelogController#new
  131. Redmine Refactor #130: Extract Method TimelogController#edit to TimelogController#new
  132. Redmine Refactor #131: Extract Method TimelogController#edit to TimelogController#update
  133. Redmine Refactor #132: Convert Timelogs to REST Resource
  134. Redmine Refactor #133: Extract Method in WikiController#special
  135. Redmine Refactor #134: Extract Method in WikiController#special to utility method
  136. Redmine Refactor #135: Extract Method page_index in WikiController#special
  137. Redmine Refactor #136: Extract Method date_index in WikiController#special
  138. Redmine Refactor #137: Remove Method WikiController#special
  139. Redmine Refactor #138: Unify Interfaces
  140. Redmine Refactor #139: Rename WikiController#index method to WikiController#show
  141. Redmine Refactor #140: Extract Method WikiController#edit to #update
  142. Redmine Refactor #141: Rename Method WikiController#page_index
  143. Redmine Refactor #142: Convert WikiController#destroy to use HTTP DELETE
  144. Redmine Refactor #143: Convert WikiController to use :id params
  145. Redmine Refactor #144: Convert WikiController to a REST resource
  146. Redmine API: Testing for the Authentication Key
  147. Redmine API: Testing for HTTP Basic auth refactoring
  148. Redmine API: Testing for HTTP Basic auth with an API Token
  149. Redmine API: Changing API Tests for Issues #index and #show
  150. Redmine API: Adding Key Authentication for Issues#create

Get the full ebook