design summit - rails 4 migration - aaron patterson
DESCRIPTION
ManageIQ currently runs on Ruby on Rails 3. Aaron "tenderlove" Patterson presents his effort to migrate to RoR 4, which entails some changes in the code to take advantage of the latest advances in RoR. For more on ManageIQ, see http://manageiq.org/TRANSCRIPT
![Page 1: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/1.jpg)
( °͡ ʖ͜ °͡) .oO(Hi)
![Page 2: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/2.jpg)
Aaron Patterson
![Page 3: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/3.jpg)
![Page 4: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/4.jpg)
![Page 5: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/5.jpg)
![Page 6: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/6.jpg)
Ruby Core Rails Core
![Page 7: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/7.jpg)
Enterprise Software
![Page 8: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/8.jpg)
Twitter: tenderlove
GitHub: tenderlove
Instagram: tenderlove
Yo: tenderlove
![Page 9: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/9.jpg)
![Page 12: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/12.jpg)
Tender Parents
![Page 13: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/13.jpg)
OMG
INTERNET
POINTS
![Page 14: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/14.jpg)
Revert Commits Count Too!
![Page 15: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/15.jpg)
More mistakes == more points!!!!
![Page 16: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/16.jpg)
Short Stack Engineer
![Page 17: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/17.jpg)
![Page 18: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/18.jpg)
![Page 19: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/19.jpg)
Gorbachev Puff Puff Thunderhorse
![Page 20: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/20.jpg)
SEA-TAC Airport YouTube
![Page 21: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/21.jpg)
![Page 22: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/22.jpg)
I am new!
![Page 23: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/23.jpg)
LostPassport
![Page 24: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/24.jpg)
Very 😴
![Page 25: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/25.jpg)
I am new!
![Page 26: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/26.jpg)
Upgrading to Rails 4.x
![Page 27: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/27.jpg)
Upgrading to Edge Rails
![Page 28: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/28.jpg)
Rails Release Timeline
![Page 29: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/29.jpg)
4.2 is Very Soon™
![Page 30: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/30.jpg)
Next is 5.0
![Page 31: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/31.jpg)
Upgrading Rails
![Page 32: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/32.jpg)
Why?
![Page 33: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/33.jpg)
Performance
![Page 34: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/34.jpg)
Memory Reduction
![Page 35: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/35.jpg)
Cost
![Page 36: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/36.jpg)
How?
![Page 37: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/37.jpg)
Push upstream
![Page 38: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/38.jpg)
Move to gems
![Page 39: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/39.jpg)
Change implementation
![Page 40: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/40.jpg)
Issues Today
![Page 41: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/41.jpg)
Rails Fork
![Page 42: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/42.jpg)
Rails Monkey Patches
![Page 43: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/43.jpg)
Monkey Patches
![Page 44: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/44.jpg)
Rails Fork
![Page 45: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/45.jpg)
Active Record Object Allocation Time
![Page 46: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/46.jpg)
ms = Benchmark.ms do records = rows.map { |model| # … }.uniq end
logger.debug(' %s Inst Including Associations (%.1fms - %drows)' % [join_base.active_record.name || 'SQL', ms, records.length])
![Page 47: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/47.jpg)
We can’t upstream this :-(
![Page 48: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/48.jpg)
ActiveSupport Notifications
![Page 49: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/49.jpg)
ActiveSupport::Notifications.instrument( "some.key", payload ) do records = rows.map { |model| # ... }.uniq end
![Page 50: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/50.jpg)
ActiveSupport::Notifications.subscribe('some.key' ) do |value| # same logger statement end
![Page 51: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/51.jpg)
Truncate table
![Page 52: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/52.jpg)
# Executes the truncate statement. def truncate(table_name, name = nil) execute("TRUNCATE TABLE #{quote_table_name(table_name)}", name) end
![Page 53: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/53.jpg)
Pushed up stream
![Page 54: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/54.jpg)
Added a monkey patch to backport
![Page 55: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/55.jpg)
64 bit primary keys
![Page 56: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/56.jpg)
In PG: "integer" == 32bit
![Page 57: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/57.jpg)
In PG: "bigint" == 64bit
![Page 58: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/58.jpg)
Default is 32bit
![Page 59: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/59.jpg)
Why?
![Page 60: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/60.jpg)
¯\_(ツ)_/¯
![Page 61: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/61.jpg)
Schema.rb
create_table "accounts" do |t| t.string "name" t.integer "acctid" end
No PK
declared
Means32bit
![Page 62: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/62.jpg)
We can upstream this
![Page 63: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/63.jpg)
Determine backwards compat scheme
![Page 64: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/64.jpg)
Default PK sequences
![Page 65: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/65.jpg)
+ return if options[:id] == false + return unless self.respond_to?(:set_pk_sequence!) + + value = ActiveRecord::Base.rails_sequence_start + set_pk_sequence!(table_name, value) unless value == 0
![Page 66: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/66.jpg)
We can’t upstream this
![Page 67: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/67.jpg)
Extract and "super"
![Page 68: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/68.jpg)
Add "extension" points.
![Page 69: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/69.jpg)
Auto-reconnect
![Page 70: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/70.jpg)
Supposedly fixed?
![Page 71: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/71.jpg)
+ def self.did_retry_db_connection(connection,count) + logger.info "CONNECTION RETRY: #{connection.class.name} retry ##{count}." if logger + end
![Page 72: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/72.jpg)
Push Up Better Exceptions
![Page 73: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/73.jpg)
Connection Extensions
![Page 74: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/74.jpg)
Database Statistics
![Page 75: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/75.jpg)
Create a new gem: activerecord-pg-stats
![Page 76: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/76.jpg)
Virtual Columns
![Page 77: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/77.jpg)
Declaration
virtual_column :name, :type => :string
![Page 78: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/78.jpg)
2 Responsibilities
![Page 79: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/79.jpg)
Declare a "column type" for reporting
![Page 80: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/80.jpg)
Declare associations used by the method
![Page 81: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/81.jpg)
Separate these concerns
![Page 82: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/82.jpg)
Extract reporting
![Page 83: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/83.jpg)
Push up relation declaration.
![Page 84: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/84.jpg)
RJS
![Page 85: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/85.jpg)
Land the Angular patch!!!!
![Page 86: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/86.jpg)
jquery-rjs
![Page 87: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/87.jpg)
prototype-rails
![Page 88: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/88.jpg)
Monkey Patches
![Page 89: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/89.jpg)
First Glance
![Page 90: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/90.jpg)
Churn
![Page 91: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/91.jpg)
"How often is stuff changing?"
![Page 92: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/92.jpg)
git log --all -M -C --name-only --format='format:' "$@" | sort | grep -v '^$' | uniq -c | sort -n | awk 'BEGIN {print "count\tfile"} {print $1 "\t" $2}'
![Page 93: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/93.jpg)
445 vmdb/app/models/miq_server.rb 498 vmdb/app/models/miq_provision_workflow.rb 508 vmdb/app/models/miq_provision.rb 590 vmdb/app/models/miq_report.rb 720 vmdb/app/controllers/report_controller.rb 777 vmdb/app/models/vm.rb 802 vmdb/app/models/host.rb 825 vmdb/app/helpers/application_helper.rb 1186 vmdb/app/controllers/application.rb
![Page 94: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/94.jpg)
Cyclomatic Complexity
![Page 95: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/95.jpg)
Quantify Code Complexity
![Page 96: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/96.jpg)
flog
![Page 97: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/97.jpg)
1965.9: vmdb/db/migrate/20100302205959_collapsed_initial_migration.rb:7 1131.5: vmdb/app/controllers/ops_controller/settings/common.rb:621 1024.9: vmdb/app/controllers/application_controller/filter.rb:137 951.9: vmdb/app/controllers/application_controller/performance.rb:220 862.9: vmdb/spec/models/ems_refresh/refreshers/vc_refresher_spec.rb:27 842.8: vmdb/app/controllers/ops_controller/settings/common.rb:881 824.5: vmdb/spec/models/ems_refresh/refreshers/rhevm_refresher_3_1_spec.rb:230 791.5: vmdb/app/helpers/application_helper.rb:648
![Page 98: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/98.jpg)
application_helper $$$$$$
![Page 99: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/99.jpg)
Static Analysis
![Page 100: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/100.jpg)
Find unused methods
![Page 101: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/101.jpg)
Ripper
![Page 102: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/102.jpg)
require 'ripper'
class MyParser < Ripper def on_def name, _, _ # do something end end
parser = MyParser.new "some code" parser.parse
![Page 103: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/103.jpg)
class MyParser < Ripper attr_reader :methods, :calls
def initialize code, file, line super @methods = [] @calls = [] end
def on_def name, *rest @methods << name end alias :on_command :on_def
def on_defs target, dot, name, *args @methods << name end
def on_call target, dot, name @calls << name end
def on_fcall name @calls << name end alias :on_symbol :on_fcall alias :on_vcall :on_fcall end
![Page 104: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/104.jpg)
Find.find(ARGV[0]) do |file| next if File.directory? file ext = file[/(?<=\.)\w+$/] next unless ext case ext when 'rb' parser = MyParser.new(File.read(file), file, 1) parser.parse when 'erb' parser = MyParser.new ERB.new(File.read(file)).src, file, 1 parser.parse end end
![Page 105: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/105.jpg)
Dynamic Dispatch
superclass.send("virtual_#{m}")
![Page 106: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/106.jpg)
Static Analysis + Ruby = 😰
![Page 107: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/107.jpg)
Probably also why Brakeman isn’t perfect
![Page 108: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/108.jpg)
This Summit is GREAT!
![Page 109: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/109.jpg)
Communication
![Page 110: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/110.jpg)
Browser
WebServer
Memcached
![Page 111: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/111.jpg)
![Page 112: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/112.jpg)
Every 500msBrowser
WebServer
Memcached
![Page 113: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/113.jpg)
Every 500msBrowser
WebServer
Memcached
![Page 114: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/114.jpg)
Cache Size
![Page 115: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/115.jpg)
Code Complexity
![Page 116: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/116.jpg)
Bugs
![Page 117: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/117.jpg)
Server Load
![Page 118: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/118.jpg)
Every 500msBrowser
WebServer
Memcached
![Page 119: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/119.jpg)
Always Question Assumptions
![Page 120: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/120.jpg)
Ask Why
![Page 121: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/121.jpg)
Business Requirements aren’t set in stone.
![Page 122: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/122.jpg)
Thanks Everyone!
![Page 123: Design Summit - Rails 4 Migration - Aaron Patterson](https://reader034.vdocuments.us/reader034/viewer/2022052622/55941a371a28abf02b8b45b9/html5/thumbnails/123.jpg)
Questions?