gitlab-derailed_benchmarks 1.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.github/workflows/check_changelog.yml +10 -0
- data/.gitignore +8 -0
- data/.gitlab-ci.yml +56 -0
- data/.travis.yml +18 -0
- data/Appraisals +26 -0
- data/CHANGELOG.md +105 -0
- data/Gemfile +9 -0
- data/README.md +692 -0
- data/Rakefile +29 -0
- data/bin/derailed +93 -0
- data/derailed_benchmarks.gemspec +39 -0
- data/gemfiles/.bundle/config +2 -0
- data/gemfiles/rails_5_1.gemfile +15 -0
- data/gemfiles/rails_5_2.gemfile +15 -0
- data/gemfiles/rails_6_0.gemfile +15 -0
- data/gemfiles/rails_git.gemfile +19 -0
- data/lib/derailed_benchmarks.rb +51 -0
- data/lib/derailed_benchmarks/auth_helper.rb +34 -0
- data/lib/derailed_benchmarks/auth_helpers/devise.rb +41 -0
- data/lib/derailed_benchmarks/core_ext/kernel_require.rb +88 -0
- data/lib/derailed_benchmarks/load_tasks.rb +145 -0
- data/lib/derailed_benchmarks/require_tree.rb +65 -0
- data/lib/derailed_benchmarks/stats_from_dir.rb +128 -0
- data/lib/derailed_benchmarks/stats_in_file.rb +60 -0
- data/lib/derailed_benchmarks/tasks.rb +292 -0
- data/lib/derailed_benchmarks/version.rb +5 -0
- data/test/derailed_benchmarks/core_ext/kernel_require_test.rb +33 -0
- data/test/derailed_benchmarks/require_tree_test.rb +95 -0
- data/test/derailed_benchmarks/stats_from_dir_test.rb +125 -0
- data/test/derailed_test.rb +14 -0
- data/test/fixtures/require/child_one.rb +4 -0
- data/test/fixtures/require/child_two.rb +9 -0
- data/test/fixtures/require/parent_one.rb +8 -0
- data/test/fixtures/require/raise_child.rb +6 -0
- data/test/fixtures/require/relative_child.rb +4 -0
- data/test/fixtures/require/relative_child_two.rb +4 -0
- data/test/fixtures/stats/significant/loser.bench.txt +100 -0
- data/test/fixtures/stats/significant/winner.bench.txt +100 -0
- data/test/integration/tasks_test.rb +132 -0
- data/test/rails_app/Rakefile +9 -0
- data/test/rails_app/app/assets/config/manifest.js +0 -0
- data/test/rails_app/app/assets/javascripts/authenticated.js +2 -0
- data/test/rails_app/app/assets/stylesheets/authenticated.css +4 -0
- data/test/rails_app/app/controllers/application_controller.rb +17 -0
- data/test/rails_app/app/controllers/authenticated_controller.rb +8 -0
- data/test/rails_app/app/controllers/pages_controller.rb +14 -0
- data/test/rails_app/app/helpers/application_helper.rb +4 -0
- data/test/rails_app/app/helpers/authenticated_helper.rb +4 -0
- data/test/rails_app/app/models/user.rb +13 -0
- data/test/rails_app/app/views/authenticated/index.html.erb +1 -0
- data/test/rails_app/app/views/layouts/application.html.erb +14 -0
- data/test/rails_app/app/views/pages/index.html.erb +1 -0
- data/test/rails_app/config.ru +6 -0
- data/test/rails_app/config/application.rb +52 -0
- data/test/rails_app/config/boot.rb +12 -0
- data/test/rails_app/config/database.yml +22 -0
- data/test/rails_app/config/environment.rb +11 -0
- data/test/rails_app/config/environments/development.rb +27 -0
- data/test/rails_app/config/environments/production.rb +51 -0
- data/test/rails_app/config/environments/test.rb +37 -0
- data/test/rails_app/config/initializers/backtrace_silencers.rb +9 -0
- data/test/rails_app/config/initializers/devise.rb +258 -0
- data/test/rails_app/config/initializers/inflections.rb +12 -0
- data/test/rails_app/config/initializers/mime_types.rb +7 -0
- data/test/rails_app/config/initializers/secret_token.rb +13 -0
- data/test/rails_app/config/initializers/session_store.rb +10 -0
- data/test/rails_app/config/locales/devise.en.yml +59 -0
- data/test/rails_app/config/locales/en.yml +9 -0
- data/test/rails_app/config/locales/es.yml +10 -0
- data/test/rails_app/config/routes.rb +67 -0
- data/test/rails_app/db/migrate/20141210070547_devise_create_users.rb +45 -0
- data/test/rails_app/db/schema.rb +35 -0
- data/test/rails_app/perf.rake +10 -0
- data/test/rails_app/public/404.html +26 -0
- data/test/rails_app/public/422.html +26 -0
- data/test/rails_app/public/500.html +26 -0
- data/test/rails_app/public/favicon.ico +0 -0
- data/test/rails_app/public/javascripts/application.js +2 -0
- data/test/rails_app/public/javascripts/controls.js +965 -0
- data/test/rails_app/public/javascripts/dragdrop.js +974 -0
- data/test/rails_app/public/javascripts/effects.js +1123 -0
- data/test/rails_app/public/javascripts/prototype.js +6001 -0
- data/test/rails_app/public/javascripts/rails.js +202 -0
- data/test/rails_app/public/stylesheets/.gitkeep +0 -0
- data/test/rails_app/script/rails +8 -0
- data/test/support/integration_case.rb +7 -0
- data/test/test_helper.rb +65 -0
- metadata +398 -0
    
        data/Rakefile
    ADDED
    
    | @@ -0,0 +1,29 @@ | |
| 1 | 
            +
            # encoding: UTF-8
         | 
| 2 | 
            +
            # frozen_string_literal: true
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            require 'rubygems'
         | 
| 5 | 
            +
            require 'bundler'
         | 
| 6 | 
            +
            require "bundler/gem_tasks"
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            begin
         | 
| 9 | 
            +
              Bundler.setup(:default, :development, :test)
         | 
| 10 | 
            +
            rescue Bundler::BundlerError => e
         | 
| 11 | 
            +
              $stderr.puts e.message
         | 
| 12 | 
            +
              $stderr.puts "Run `bundle install` to install missing gems"
         | 
| 13 | 
            +
              exit e.status_code
         | 
| 14 | 
            +
            end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
            require 'rake'
         | 
| 17 | 
            +
             | 
| 18 | 
            +
            require 'rake/testtask'
         | 
| 19 | 
            +
             | 
| 20 | 
            +
            Rake::TestTask.new(:test) do |t|
         | 
| 21 | 
            +
              t.libs << 'lib'
         | 
| 22 | 
            +
              t.libs << 'test'
         | 
| 23 | 
            +
              t.pattern = 'test/**/*_test.rb'
         | 
| 24 | 
            +
              t.verbose = false
         | 
| 25 | 
            +
            end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
            task default: :test
         | 
| 28 | 
            +
             | 
| 29 | 
            +
             | 
    
        data/bin/derailed
    ADDED
    
    | @@ -0,0 +1,93 @@ | |
| 1 | 
            +
            #!/usr/bin/env ruby
         | 
| 2 | 
            +
            # frozen_string_literal: true
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            unless File.respond_to? :realpath
         | 
| 5 | 
            +
              class File #:nodoc:
         | 
| 6 | 
            +
                def self.realpath path
         | 
| 7 | 
            +
                  return realpath(File.readlink(path)) if symlink?(path)
         | 
| 8 | 
            +
                  path
         | 
| 9 | 
            +
                end
         | 
| 10 | 
            +
              end
         | 
| 11 | 
            +
            end
         | 
| 12 | 
            +
            lib = File.expand_path(File.dirname(File.realpath(__FILE__)) + '/../lib')
         | 
| 13 | 
            +
            $: << lib
         | 
| 14 | 
            +
             | 
| 15 | 
            +
             | 
| 16 | 
            +
            require File.join(lib, 'derailed_benchmarks.rb')
         | 
| 17 | 
            +
             | 
| 18 | 
            +
            Bundler.setup
         | 
| 19 | 
            +
             | 
| 20 | 
            +
            require 'thor'
         | 
| 21 | 
            +
             | 
| 22 | 
            +
            class DerailedBenchmarkCLI < Thor
         | 
| 23 | 
            +
             | 
| 24 | 
            +
              desc "exec", "executes given derailed benchmark"
         | 
| 25 | 
            +
              def exec(task = nil)
         | 
| 26 | 
            +
                setup_bundler!
         | 
| 27 | 
            +
                require 'derailed_benchmarks'
         | 
| 28 | 
            +
                require 'rake'
         | 
| 29 | 
            +
                Rake::TaskManager.record_task_metadata = true
         | 
| 30 | 
            +
                require 'derailed_benchmarks/tasks'
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                perf_rakefile = File.expand_path(".", "perf.rake")
         | 
| 33 | 
            +
                load perf_rakefile if File.exist?(perf_rakefile)
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                if task.nil? || task == "--help"
         | 
| 36 | 
            +
                  Rake.application.tasks.map do |task, n|
         | 
| 37 | 
            +
                    next unless task.comment
         | 
| 38 | 
            +
                    puts "  $ derailed exec #{task.name}  # #{task.comment}"
         | 
| 39 | 
            +
                  end
         | 
| 40 | 
            +
                else
         | 
| 41 | 
            +
                  task = "perf:#{task}" unless Rake::Task.task_defined?(task)
         | 
| 42 | 
            +
                  Rake::Task[task].invoke
         | 
| 43 | 
            +
                end
         | 
| 44 | 
            +
              end
         | 
| 45 | 
            +
             | 
| 46 | 
            +
              desc "bundle:objects", "measures objects created by gems"
         | 
| 47 | 
            +
              define_method(:"bundle:objects") do |env = "production"|
         | 
| 48 | 
            +
                setup_bundler!
         | 
| 49 | 
            +
                env = [:default] + env.split(",")
         | 
| 50 | 
            +
                puts "Measuring objects created by gems in groups #{ env.inspect }"
         | 
| 51 | 
            +
                require 'memory_profiler'
         | 
| 52 | 
            +
                report = MemoryProfiler.report do
         | 
| 53 | 
            +
                  Bundler.require(*env)
         | 
| 54 | 
            +
                end
         | 
| 55 | 
            +
                report.pretty_print
         | 
| 56 | 
            +
              end
         | 
| 57 | 
            +
             | 
| 58 | 
            +
              map :"bundler:objects" => :"bundle:objects"
         | 
| 59 | 
            +
             | 
| 60 | 
            +
              desc "bundle:mem", "measures memory used by gems at boot time"
         | 
| 61 | 
            +
              define_method(:"bundle:mem") do |env = "production"|
         | 
| 62 | 
            +
                env = [:default] + env.split(",")
         | 
| 63 | 
            +
                require 'get_process_mem'
         | 
| 64 | 
            +
                mem    = GetProcessMem.new
         | 
| 65 | 
            +
                require 'derailed_benchmarks/core_ext/kernel_require'
         | 
| 66 | 
            +
                before = mem.mb
         | 
| 67 | 
            +
                setup_bundler!
         | 
| 68 | 
            +
                Bundler.require(*env)
         | 
| 69 | 
            +
                after  = mem.mb
         | 
| 70 | 
            +
                TOP_REQUIRE.print_sorted_children
         | 
| 71 | 
            +
              end
         | 
| 72 | 
            +
              map :"bundler:mem" => :"bundle:mem"
         | 
| 73 | 
            +
             | 
| 74 | 
            +
              private
         | 
| 75 | 
            +
                def setup_bundler!
         | 
| 76 | 
            +
                  ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
         | 
| 77 | 
            +
                  require 'bundler/setup'
         | 
| 78 | 
            +
             | 
| 79 | 
            +
                  begin
         | 
| 80 | 
            +
                    if ENV["DERAILED_SKIP_ACTIVE_RECORD"]
         | 
| 81 | 
            +
                      require "action_controller/railtie"
         | 
| 82 | 
            +
                      require "action_mailer/railtie"
         | 
| 83 | 
            +
                      require "sprockets/railtie"
         | 
| 84 | 
            +
                      require "rails/test_unit/railtie"
         | 
| 85 | 
            +
                    else
         | 
| 86 | 
            +
                      require 'rails/all'
         | 
| 87 | 
            +
                    end
         | 
| 88 | 
            +
                  rescue LoadError
         | 
| 89 | 
            +
                  end
         | 
| 90 | 
            +
                end
         | 
| 91 | 
            +
            end
         | 
| 92 | 
            +
             | 
| 93 | 
            +
            DerailedBenchmarkCLI.start(ARGV)
         | 
| @@ -0,0 +1,39 @@ | |
| 1 | 
            +
            # -*- encoding: utf-8 -*-
         | 
| 2 | 
            +
            # frozen_string_literal: true
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            lib = File.expand_path('../lib', __FILE__)
         | 
| 5 | 
            +
            $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
         | 
| 6 | 
            +
            require 'derailed_benchmarks/version'
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            Gem::Specification.new do |gem|
         | 
| 9 | 
            +
              gem.name          = "gitlab-derailed_benchmarks"
         | 
| 10 | 
            +
              gem.version       = DerailedBenchmarks::VERSION
         | 
| 11 | 
            +
              gem.authors       = ["Richard Schneeman"]
         | 
| 12 | 
            +
              gem.email         = ["richard.schneeman+rubygems@gmail.com"]
         | 
| 13 | 
            +
              gem.description   = %q{ Go faster, off the Rails }
         | 
| 14 | 
            +
              gem.summary       = %q{ Benchmarks designed to performance test your ENTIRE site }
         | 
| 15 | 
            +
              gem.homepage      = "https://github.com/schneems/derailed_benchmarks"
         | 
| 16 | 
            +
              gem.license       = "MIT"
         | 
| 17 | 
            +
             | 
| 18 | 
            +
              gem.files         = `git ls-files`.split($/)
         | 
| 19 | 
            +
              gem.executables   = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
         | 
| 20 | 
            +
              gem.test_files    = gem.files.grep(%r{^(test|spec|features)/})
         | 
| 21 | 
            +
              gem.require_paths = ["lib"]
         | 
| 22 | 
            +
             | 
| 23 | 
            +
              gem.required_ruby_version = ">= 2.1.0"
         | 
| 24 | 
            +
             | 
| 25 | 
            +
              gem.add_dependency "heapy",           "~> 0"
         | 
| 26 | 
            +
              gem.add_dependency "memory_profiler", "~> 0"
         | 
| 27 | 
            +
              gem.add_dependency "get_process_mem", "~> 0"
         | 
| 28 | 
            +
              gem.add_dependency "benchmark-ips",   "~> 2"
         | 
| 29 | 
            +
              gem.add_dependency "rack",            ">= 1"
         | 
| 30 | 
            +
              gem.add_dependency "rake",            "> 10", "< 14"
         | 
| 31 | 
            +
              gem.add_dependency "thor",            ">= 0.19", "< 2"
         | 
| 32 | 
            +
              gem.add_dependency "ruby-statistics", ">= 2.1"
         | 
| 33 | 
            +
             | 
| 34 | 
            +
              gem.add_development_dependency "capybara",  "~> 2"
         | 
| 35 | 
            +
              gem.add_development_dependency "m"
         | 
| 36 | 
            +
              gem.add_development_dependency "rails",     "> 3", "<= 7"
         | 
| 37 | 
            +
              gem.add_development_dependency "devise",    "> 3", "< 6"
         | 
| 38 | 
            +
              gem.add_development_dependency "appraisal", "2.2.0"
         | 
| 39 | 
            +
            end
         | 
| @@ -0,0 +1,15 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            # This file was generated by Appraisal
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            source "https://rubygems.org"
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            gem "rails", "~> 5.1.0"
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            group :development, :test do
         | 
| 10 | 
            +
              gem "sqlite3", platform: [:ruby, :mswin, :mingw]
         | 
| 11 | 
            +
              gem "activerecord-jdbcsqlite3-adapter", "~> 1.3.13", platform: :jruby
         | 
| 12 | 
            +
              gem "test-unit", "~> 3.0"
         | 
| 13 | 
            +
            end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            gemspec path: "../"
         | 
| @@ -0,0 +1,15 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            # This file was generated by Appraisal
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            source "https://rubygems.org"
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            gem "rails", "~> 5.2.0"
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            group :development, :test do
         | 
| 10 | 
            +
              gem "sqlite3", platform: [:ruby, :mswin, :mingw]
         | 
| 11 | 
            +
              gem "activerecord-jdbcsqlite3-adapter", "~> 1.3.13", platform: :jruby
         | 
| 12 | 
            +
              gem "test-unit", "~> 3.0"
         | 
| 13 | 
            +
            end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            gemspec path: "../"
         | 
| @@ -0,0 +1,15 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            # This file was generated by Appraisal
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            source "https://rubygems.org"
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            gem "rails", "6.0.0"
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            group :development, :test do
         | 
| 10 | 
            +
              gem "sqlite3", platform: [:ruby, :mswin, :mingw]
         | 
| 11 | 
            +
              gem "activerecord-jdbcsqlite3-adapter", "~> 1.3.13", platform: :jruby
         | 
| 12 | 
            +
              gem "test-unit", "~> 3.0"
         | 
| 13 | 
            +
            end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            gemspec path: "../"
         | 
| @@ -0,0 +1,19 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            # $ BUNDLE_GEMFILE="$(pwd)/gemfiles/rails_git.gemfile" bundle exec m test/integration/tasks_test.rb:30
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            source "https://rubygems.org"
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            gem "rails", github: "rails/rails", ref: "3054e1d584e7eca110c69a1f8423f2e0866abbf9"
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            gem 'devise', github: "plataformatec/devise"
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            group :development, :test do
         | 
| 12 | 
            +
              gem "sqlite3", platform: [:ruby, :mswin, :mingw]
         | 
| 13 | 
            +
              gem "activerecord-jdbcsqlite3-adapter", "~> 1.3.13", platform: :jruby
         | 
| 14 | 
            +
              gem "test-unit", "~> 3.0"
         | 
| 15 | 
            +
            end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
            gemspec path: "../"
         | 
| 18 | 
            +
             | 
| 19 | 
            +
            ENV['USING_RAILS_GIT'] = "1"
         | 
| @@ -0,0 +1,51 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require 'time'
         | 
| 4 | 
            +
            require 'bundler'
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            require 'get_process_mem'
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            module DerailedBenchmarks
         | 
| 9 | 
            +
              def self.gem_is_bundled?(name)
         | 
| 10 | 
            +
                specs = ::Bundler.locked_gems.specs.each_with_object({}) {|spec, hash| hash[spec.name] = spec }
         | 
| 11 | 
            +
                specs[name]
         | 
| 12 | 
            +
              end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
              class << self
         | 
| 15 | 
            +
                attr_accessor :auth
         | 
| 16 | 
            +
              end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
              def self.rails_path_on_disk
         | 
| 19 | 
            +
                require 'rails/version'
         | 
| 20 | 
            +
                rails_version_file = Rails.method(:version).source_location[0]
         | 
| 21 | 
            +
                path = Pathname.new(rails_version_file).expand_path.parent.parent
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                while path != Pathname.new("/")
         | 
| 24 | 
            +
                  basename = path.expand_path.basename.to_s
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                  break if basename.start_with?("rails") && basename != "railties"
         | 
| 27 | 
            +
                  path = path.parent
         | 
| 28 | 
            +
                end
         | 
| 29 | 
            +
                raise "Could not find rails folder on a folder in #{rails_version_file}"  if path == Pathname.new("/")
         | 
| 30 | 
            +
                path.expand_path
         | 
| 31 | 
            +
              end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
              def self.add_auth(app)
         | 
| 34 | 
            +
                if use_auth = ENV['USE_AUTH']
         | 
| 35 | 
            +
                  puts "Auth: #{use_auth}"
         | 
| 36 | 
            +
                  auth.add_app(app)
         | 
| 37 | 
            +
                else
         | 
| 38 | 
            +
                  app
         | 
| 39 | 
            +
                end
         | 
| 40 | 
            +
              end
         | 
| 41 | 
            +
            end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
            require 'derailed_benchmarks/require_tree'
         | 
| 44 | 
            +
            require 'derailed_benchmarks/auth_helper'
         | 
| 45 | 
            +
             | 
| 46 | 
            +
            require 'derailed_benchmarks/stats_in_file'
         | 
| 47 | 
            +
            require 'derailed_benchmarks/stats_from_dir'
         | 
| 48 | 
            +
             | 
| 49 | 
            +
            if DerailedBenchmarks.gem_is_bundled?("devise")
         | 
| 50 | 
            +
              DerailedBenchmarks.auth = DerailedBenchmarks::AuthHelpers::Devise.new
         | 
| 51 | 
            +
            end
         | 
| @@ -0,0 +1,34 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require 'securerandom'
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            module DerailedBenchmarks
         | 
| 6 | 
            +
              # Base helper class. Can be used to authenticate different strategies
         | 
| 7 | 
            +
              # The root app will be wrapped by an authentication action
         | 
| 8 | 
            +
              class AuthHelper
         | 
| 9 | 
            +
                attr_reader   :app
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                # Put any coded needed to set up or initialize your authentication module here
         | 
| 12 | 
            +
                def setup
         | 
| 13 | 
            +
                  raise "Must subclass"
         | 
| 14 | 
            +
                end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                # Gets called for every request. Place all auth logic here.
         | 
| 17 | 
            +
                # Return value is expected to be an valid Rack response array.
         | 
| 18 | 
            +
                # If you do not manually `app.call(env)` here, the client app
         | 
| 19 | 
            +
                # will never be called.
         | 
| 20 | 
            +
                def call(env)
         | 
| 21 | 
            +
                  raise "Must subclass"
         | 
| 22 | 
            +
                end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                # Returns self and sets the target app
         | 
| 25 | 
            +
                def add_app(app)
         | 
| 26 | 
            +
                  raise "App is required argument" unless app
         | 
| 27 | 
            +
                  @app = app
         | 
| 28 | 
            +
                  setup
         | 
| 29 | 
            +
                  self
         | 
| 30 | 
            +
                end
         | 
| 31 | 
            +
              end
         | 
| 32 | 
            +
            end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
            require 'derailed_benchmarks/auth_helpers/devise'
         | 
| @@ -0,0 +1,41 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module DerailedBenchmarks
         | 
| 4 | 
            +
              class AuthHelpers
         | 
| 5 | 
            +
                # Devise helper for authenticating requests
         | 
| 6 | 
            +
                # Setup adds necessarry test methods, user provides a sample user.
         | 
| 7 | 
            +
                # The authenticate method is called on every request when authentication is enabled
         | 
| 8 | 
            +
                class Devise < AuthHelper
         | 
| 9 | 
            +
                  attr_writer :user
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                  # Include devise test helpers and turn on test mode
         | 
| 12 | 
            +
                  # We need to do this on the class level
         | 
| 13 | 
            +
                  def setup
         | 
| 14 | 
            +
                    # self.class.instance_eval do
         | 
| 15 | 
            +
                      require 'devise'
         | 
| 16 | 
            +
                      require 'warden'
         | 
| 17 | 
            +
                      extend ::Warden::Test::Helpers
         | 
| 18 | 
            +
                      extend ::Devise::TestHelpers
         | 
| 19 | 
            +
                      Warden.test_mode!
         | 
| 20 | 
            +
                    # end
         | 
| 21 | 
            +
                  end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                  def user
         | 
| 24 | 
            +
                    if @user
         | 
| 25 | 
            +
                      @user = @user.call if @user.is_a?(Proc)
         | 
| 26 | 
            +
                      @user
         | 
| 27 | 
            +
                    else
         | 
| 28 | 
            +
                      password = SecureRandom.hex
         | 
| 29 | 
            +
                      @user = User.first_or_create!(email: "#{SecureRandom.hex}@example.com", password: password, password_confirmation: password)
         | 
| 30 | 
            +
                    end
         | 
| 31 | 
            +
                  end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                  # Logs the user in, then call the parent app
         | 
| 34 | 
            +
                  def call(env)
         | 
| 35 | 
            +
                    login_as(user)
         | 
| 36 | 
            +
                    app.call(env)
         | 
| 37 | 
            +
                  end
         | 
| 38 | 
            +
                end
         | 
| 39 | 
            +
              end
         | 
| 40 | 
            +
            end
         | 
| 41 | 
            +
             | 
| @@ -0,0 +1,88 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require 'get_process_mem'
         | 
| 4 | 
            +
            require 'derailed_benchmarks/require_tree'
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            ENV['CUT_OFF'] ||= "0.3"
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            # This file contains classes and monkey patches to measure the amount of memory
         | 
| 9 | 
            +
            # useage requiring an individual file adds.
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            # Monkey patch kernel to ensure that all `require` calls call the same
         | 
| 12 | 
            +
            # method
         | 
| 13 | 
            +
            module Kernel
         | 
| 14 | 
            +
              REQUIRE_STACK = []
         | 
| 15 | 
            +
             | 
| 16 | 
            +
              module_function
         | 
| 17 | 
            +
             | 
| 18 | 
            +
              alias_method :original_require, :require
         | 
| 19 | 
            +
              alias_method :original_require_relative, :require_relative
         | 
| 20 | 
            +
             | 
| 21 | 
            +
              def require(file)
         | 
| 22 | 
            +
                measure_memory_impact(file) do |file|
         | 
| 23 | 
            +
                  # "source_annotation_extractor" is deprecated in Rails 6
         | 
| 24 | 
            +
                  # # if we don't skip the library it leads to a crash
         | 
| 25 | 
            +
                  # next if file == "rails/source_annotation_extractor" && Rails.version >= '6.0'
         | 
| 26 | 
            +
                  original_require(file)
         | 
| 27 | 
            +
                end
         | 
| 28 | 
            +
              end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
              def require_relative(file)
         | 
| 31 | 
            +
                if Pathname.new(file).absolute?
         | 
| 32 | 
            +
                  require file
         | 
| 33 | 
            +
                else
         | 
| 34 | 
            +
                  require File.expand_path("../#{file}", caller_locations(1, 1)[0].absolute_path)
         | 
| 35 | 
            +
                end
         | 
| 36 | 
            +
              end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
              private
         | 
| 39 | 
            +
             | 
| 40 | 
            +
              # The core extension we use to measure require time of all requires
         | 
| 41 | 
            +
              # When a file is required we create a tree node with its file name.
         | 
| 42 | 
            +
              # We then push it onto a stack, this is because requiring a file can
         | 
| 43 | 
            +
              # require other files before it is finished.
         | 
| 44 | 
            +
              #
         | 
| 45 | 
            +
              # When a child file is required, a tree node is created and the child file
         | 
| 46 | 
            +
              # is pushed onto the parents tree. We then repeat the process as child
         | 
| 47 | 
            +
              # files may require additional files.
         | 
| 48 | 
            +
              #
         | 
| 49 | 
            +
              # When a require returns we remove it from the require stack so we don't
         | 
| 50 | 
            +
              # accidentally push additional children nodes to it. We then store the
         | 
| 51 | 
            +
              # memory cost of the require in the tree node.
         | 
| 52 | 
            +
              def measure_memory_impact(file, &block)
         | 
| 53 | 
            +
                mem    = GetProcessMem.new
         | 
| 54 | 
            +
                node   = DerailedBenchmarks::RequireTree.new(file)
         | 
| 55 | 
            +
             | 
| 56 | 
            +
                parent = REQUIRE_STACK.last
         | 
| 57 | 
            +
                parent << node
         | 
| 58 | 
            +
                REQUIRE_STACK.push(node)
         | 
| 59 | 
            +
                begin
         | 
| 60 | 
            +
                  before = mem.mb
         | 
| 61 | 
            +
                  block.call file
         | 
| 62 | 
            +
                ensure
         | 
| 63 | 
            +
                  REQUIRE_STACK.pop # node
         | 
| 64 | 
            +
                  after = mem.mb
         | 
| 65 | 
            +
                end
         | 
| 66 | 
            +
                node.cost = after - before
         | 
| 67 | 
            +
              end
         | 
| 68 | 
            +
            end
         | 
| 69 | 
            +
             | 
| 70 | 
            +
            # Top level node that will store all require information for the entire app
         | 
| 71 | 
            +
            TOP_REQUIRE = DerailedBenchmarks::RequireTree.new("TOP")
         | 
| 72 | 
            +
            REQUIRE_STACK.push(TOP_REQUIRE)
         | 
| 73 | 
            +
             | 
| 74 | 
            +
            class Object
         | 
| 75 | 
            +
              private
         | 
| 76 | 
            +
             | 
| 77 | 
            +
              def require(path)
         | 
| 78 | 
            +
                Kernel.require(path)
         | 
| 79 | 
            +
              end
         | 
| 80 | 
            +
            end
         | 
| 81 | 
            +
             | 
| 82 | 
            +
            # Don't forget to assign a cost to the top level
         | 
| 83 | 
            +
            cost_before_requiring_anything = GetProcessMem.new.mb
         | 
| 84 | 
            +
            TOP_REQUIRE.cost = cost_before_requiring_anything
         | 
| 85 | 
            +
            def TOP_REQUIRE.print_sorted_children(*args)
         | 
| 86 | 
            +
              self.cost = GetProcessMem.new.mb - self.cost
         | 
| 87 | 
            +
              super
         | 
| 88 | 
            +
            end
         |