tuttle 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +12 -0
  3. data/README.md +61 -4
  4. data/Rakefile +1 -16
  5. data/app/controllers/tuttle/active_job_controller.rb +51 -0
  6. data/app/controllers/tuttle/active_model_serializers_controller.rb +3 -8
  7. data/app/controllers/tuttle/application_controller.rb +3 -0
  8. data/app/controllers/tuttle/cancancan_controller.rb +8 -15
  9. data/app/controllers/tuttle/devise_controller.rb +1 -2
  10. data/app/controllers/tuttle/gems_controller.rb +4 -4
  11. data/app/controllers/tuttle/home_controller.rb +0 -1
  12. data/app/controllers/tuttle/paperclip_controller.rb +1 -2
  13. data/app/controllers/tuttle/rack_mini_profiler_controller.rb +15 -0
  14. data/app/controllers/tuttle/rails_controller.rb +45 -7
  15. data/app/controllers/tuttle/request_controller.rb +0 -4
  16. data/app/controllers/tuttle/ruby_controller.rb +6 -2
  17. data/app/helpers/tuttle/application_helper.rb +13 -8
  18. data/app/models/tuttle/configuration_registry.rb +25 -0
  19. data/app/models/tuttle/version_detector.rb +9 -0
  20. data/app/views/layouts/tuttle/application.html.erb +29 -20
  21. data/app/views/tuttle/active_job/index.html.erb +48 -0
  22. data/app/views/tuttle/active_model_serializers/index.html.erb +2 -0
  23. data/app/views/tuttle/gems/get_process_mem.html.erb +13 -13
  24. data/app/views/tuttle/gems/http_clients.html.erb +9 -10
  25. data/app/views/tuttle/gems/json.html.erb +3 -3
  26. data/app/views/tuttle/gems/other.html.erb +41 -11
  27. data/app/views/tuttle/home/index.html.erb +27 -23
  28. data/app/views/tuttle/{performance_tuning → rack_mini_profiler}/index.html.erb +6 -6
  29. data/app/views/tuttle/rails/_cache_dalli_store.html.erb +65 -0
  30. data/app/views/tuttle/rails/_cache_memory_store.html.erb +43 -0
  31. data/app/views/tuttle/rails/_cache_monitor.html.erb +63 -0
  32. data/app/views/tuttle/rails/assets.html.erb +181 -28
  33. data/app/views/tuttle/rails/cache.html.erb +92 -102
  34. data/app/views/tuttle/rails/database.html.erb +2 -2
  35. data/app/views/tuttle/rails/index.html.erb +20 -21
  36. data/app/views/tuttle/rails/routes.html.erb +88 -36
  37. data/app/views/tuttle/rails/schema_cache.html.erb +2 -1
  38. data/app/views/tuttle/ruby/index.html.erb +24 -20
  39. data/config/rails_config_base.yml +80 -0
  40. data/config/rails_config_v4.x.yml +14 -0
  41. data/config/rails_config_v5.x.yml +12 -0
  42. data/config/routes.rb +7 -1
  43. data/lib/tuttle.rb +3 -6
  44. data/lib/tuttle/engine.rb +24 -12
  45. data/lib/tuttle/instrumenter.rb +7 -7
  46. data/lib/tuttle/middleware/request_profiler.rb +165 -24
  47. data/lib/tuttle/presenters/action_dispatch/routing/route_wrapper.rb +7 -3
  48. data/lib/tuttle/presenters/rack_mini_profiler/client_settings.rb +27 -0
  49. data/lib/tuttle/ruby_prof/fast_call_stack_printer.rb +26 -53
  50. data/lib/tuttle/version.rb +1 -1
  51. metadata +18 -8
  52. data/app/controllers/tuttle/performance_tuning_controller.rb +0 -14
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 11308ee417997ed89c1e29539cc8cb0fecf125bc
4
- data.tar.gz: 624f021eb368b6bd329771ce1a2af67970622cab
3
+ metadata.gz: 49cad804b33f2b81f6a9bc6a2e6504e4cf37c962
4
+ data.tar.gz: e8e15e4dee3836b696168ad3a89b102b4f4af856
5
5
  SHA512:
6
- metadata.gz: 5b59ac504e78b6e910f5e32808dfda8b9c5908b70fcfc8057a7e488d33604634a67256ea9b514ad421c5c2b833f8e3bfb182bf3963c829eb015a8530139523c4
7
- data.tar.gz: 37577b68008df08c28a0355fc2425c4ccbf5b149e7fb126c141eb0750007b8b3d968fb60bb588a8517c7bfcbaa7d6b4b870fce0f6cdbe03457fb6f4a10ecde25
6
+ metadata.gz: a03f4de6b82666e963e1b6c1b5b4347389e8a2cd5ae00a2ece02953954a84d17fb37668adf43e88a473263cd15780e59afb8adbc66b11e2e1472f89ebb3d54a3
7
+ data.tar.gz: a8b9074ed5bbcfeae270e7b2ab875710acd826b383e76f3e2169945f23df06c20f542cad4f35821bbcfe88fb902db747110b4da6439fc40e22956365be0a3bf0
@@ -1,3 +1,15 @@
1
+ ### 0.0.6
2
+
3
+ * Features
4
+ * Easier configuration with config.enable_profiling to load profiling middleware
5
+ * Improved Asset Pipeline configuration inspector
6
+ * Improved Rails Caching configuration inspector
7
+ * Basic ActiveJob configuration inspector
8
+ * Improved Rails general configuration options from Rails Guides
9
+ * Syntax highlighting with highlight.js
10
+ * Experimental inspector for Facter
11
+ * Experimental profiler for Busted with additional DTrace inspections
12
+
1
13
  ### 0.0.5
2
14
 
3
15
  * Features
data/README.md CHANGED
@@ -2,17 +2,74 @@
2
2
 
3
3
  [![Build Status](https://api.travis-ci.org/dgynn/tuttle.svg?branch=develop)](https://travis-ci.org/dgynn/tuttle)
4
4
  [![Code Climate](https://codeclimate.com/github/dgynn/tuttle/badges/gpa.svg)](https://codeclimate.com/github/dgynn/tuttle)
5
+ [![Codacy Badge](https://api.codacy.com/project/badge/Grade/494ffe3bb99b4d139ca975eaeec72808)](https://www.codacy.com/app/davegynn/tuttle)
5
6
  [![Test Coverage](https://codeclimate.com/github/dgynn/tuttle/badges/coverage.svg)](https://codeclimate.com/github/dgynn/tuttle)
6
7
  [![Dependency Status](https://gemnasium.com/dgynn/tuttle.svg)](https://gemnasium.com/dgynn/tuttle)
7
8
 
8
- Tuttle is a tool for assisting Rails developers by exposing runtime configuration information for your application. It is similar to the `/rails/info/routes` and `/rails/info/properties` information pages or the `rake routes` and `rake middleware` tasks.
9
+ Tuttle is a tool that helps Rails developers peek behind the curtain to inspect runtime configuration
10
+ information for their applications. Tuttle can help with troubleshooting misconfigured
11
+ apps or just help you better understand what is going on inside the frameworks you use.
9
12
 
10
- Tuttle is very much in alpha/proof-of-concept mode. You can see it in action in a [simple demo application](http://tuttle-demo.herokuapp.com/). The [source code](https://github.com/dgynn/tuttle-demo) for that demo is also on GitHub.
13
+ #### Features
14
+
15
+ * Web dashboard mounted in your running app
16
+ * Rails general configuration including defaults
17
+ * Runtime internals of libraries and frameworks (eg ActiveRecord Query Cache)
18
+ * Application inventory of Controllers and Models
19
+ * Gems loaded
20
+ * Ruby VM runtime information (GC stats, tuning parameters)
21
+ * Optional profiling middleware for on-demand request profiling
22
+ * Memory profiling using [memory_profiler](https://github.com/SamSaffron/memory_profiler)
23
+ * CPU profiling using [ruby-prof](https://github.com/ruby-prof/ruby-prof)
24
+
25
+
26
+ Tuttle has no dependencies other than Rails but works with a number of gems if
27
+ they are loaded to provide inspections.
28
+ Gems supported include devise, paperclip, active_model_serializers, cancancan, and more.
29
+
30
+ Tuttle is still in beta/proof-of-concept mode but is safe to use in development and disabled by default in other environments.
31
+
32
+ You can see it in action in a [simple demo application](http://tuttle-demo.herokuapp.com/). The [source code](https://github.com/dgynn/tuttle-demo) for that demo is also on GitHub.
11
33
 
12
34
  ## To use...
13
35
 
14
- Add tuttle to you Gemfile
36
+ Add tuttle to your Gemfile
15
37
  ```ruby
16
- gem 'tuttle', :github => 'dgynn/tuttle', :branch => 'develop'
38
+ gem 'tuttle'
39
+
40
+ # Include optional profiling gems
41
+ gem 'memory_profiler'
42
+ gem 'ruby-prof'
43
+
17
44
  ```
18
45
  Browse to `/tuttle`
46
+
47
+ ## Configuration
48
+
49
+ Tuttle will automatically be enabled and mounted in development. To control the
50
+ configuration, you can use an initializer.
51
+
52
+ config/initializers/tuttle.rb
53
+ ```ruby
54
+ if defined?(::Tuttle::Engine)
55
+ Tuttle.setup do |config|
56
+ config.enabled = true # Defaults to true in development, false in other environments
57
+ config.automount_engine = true # Defaults to true to mount the engine at /tuttle
58
+ config.enable_profiling = true # Defaults to false
59
+ end
60
+ end
61
+ ```
62
+
63
+ **Important:** Do not enable Tuttle in production. Tuttle does not require authentication
64
+ and exposes internal application details. Sensitive data should be filtered but
65
+ it is still not something end users should be able to access.
66
+
67
+ It is also possible to use the profiling middleware without the Tuttle engine enabled.
68
+
69
+ You can directly include the profiling middleware as follows:
70
+
71
+ ```ruby
72
+ # Add memory/cpu profiler middleware at the end of the stack
73
+ require 'tuttle/middleware/request_profiler'
74
+ Rails.application.config.middleware.use Tuttle::Middleware::RequestProfiler
75
+ ```
data/Rakefile CHANGED
@@ -4,21 +4,6 @@ begin
4
4
  rescue LoadError
5
5
  puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
6
6
  end
7
- begin
8
- require 'rdoc/task'
9
- rescue LoadError
10
- require 'rdoc/rdoc'
11
- require 'rake/rdoctask'
12
- RDoc::Task = Rake::RDocTask
13
- end
14
-
15
- RDoc::Task.new(:rdoc) do |rdoc|
16
- rdoc.rdoc_dir = 'rdoc'
17
- rdoc.title = 'Tuttle'
18
- rdoc.options << '--line-numbers'
19
- rdoc.rdoc_files.include('README.md')
20
- rdoc.rdoc_files.include('lib/**/*.rb')
21
- end
22
7
 
23
8
  APP_RAKEFILE = File.expand_path('../test/dummy/Rakefile', __FILE__)
24
9
  load 'rails/tasks/engine.rake'
@@ -28,10 +13,10 @@ Bundler::GemHelper.install_tasks
28
13
  require 'rake/testtask'
29
14
 
30
15
  Rake::TestTask.new(:test) do |t|
31
- t.libs << 'lib'
32
16
  t.libs << 'test'
33
17
  t.pattern = 'test/**/*_test.rb'
34
18
  t.verbose = false
19
+ t.warning = false
35
20
  end
36
21
 
37
22
  task :default => :test
@@ -0,0 +1,51 @@
1
+ require_dependency 'tuttle/application_controller'
2
+
3
+ module Tuttle
4
+ class ActiveJobController < ApplicationController
5
+
6
+ def index
7
+ @job_classes = ActiveJob::Base.descendants # May want to not includ ApplicationJob if it exists
8
+
9
+ # TODO: could also look to see if GlobalID is available
10
+ # https://github.com/rails/globalid
11
+
12
+ # See http://api.rubyonrails.org/classes/ActiveJob/QueueAdapters.html
13
+
14
+ # TODO: detect available backend libraries
15
+ # TODO: catalog the .descendants of ActiveJob::Base
16
+ # - list the queue_name and queue_adapter per job
17
+
18
+ # == Active Job adapters
19
+ #
20
+ # Active Job has adapters for the following queueing backends:
21
+ #
22
+ # * {Backburner}[https://github.com/nesquena/backburner]
23
+ # * {Delayed Job}[https://github.com/collectiveidea/delayed_job]
24
+ # * {Qu}[https://github.com/bkeepers/qu]
25
+ # * {Que}[https://github.com/chanks/que]
26
+ # * {queue_classic}[https://github.com/QueueClassic/queue_classic]
27
+ # * {Resque 1.x}[https://github.com/resque/resque/tree/1-x-stable]
28
+ # * {Sidekiq}[http://sidekiq.org]
29
+ # * {Sneakers}[https://github.com/jondot/sneakers]
30
+ # * {Sucker Punch}[https://github.com/brandonhilkert/sucker_punch]
31
+ # * {Active Job Async Job}[http://api.rubyonrails.org/classes/ActiveJob/QueueAdapters/AsyncAdapter.html]
32
+ # * {Active Job Inline}[http://api.rubyonrails.org/classes/ActiveJob/QueueAdapters/InlineAdapter.html]
33
+ #
34
+ # === Backends Features
35
+ #
36
+ # | | Async | Queues | Delayed | Priorities | Timeout | Retries |
37
+ # |-------------------|-------|--------|------------|------------|---------|---------|
38
+ # | Backburner | Yes | Yes | Yes | Yes | Job | Global |
39
+ # | Delayed Job | Yes | Yes | Yes | Job | Global | Global |
40
+ # | Qu | Yes | Yes | No | No | No | Global |
41
+ # | Que | Yes | Yes | Yes | Job | No | Job |
42
+ # | queue_classic | Yes | Yes | Yes* | No | No | No |
43
+ # | Resque | Yes | Yes | Yes (Gem) | Queue | Global | Yes |
44
+ # | Sidekiq | Yes | Yes | Yes | Queue | No | Job |
45
+ # | Sneakers | Yes | Yes | No | Queue | Queue | No |
46
+ # | Sucker Punch | Yes | Yes | Yes | No | No | No |
47
+ # | Active Job Async | Yes | Yes | Yes | No | No | No |
48
+ # | Active Job Inline | No | Yes | N/A | N/A | N/A | N/A |
49
+ end
50
+ end
51
+ end
@@ -10,16 +10,11 @@ module Tuttle
10
10
  @serializers = ::ActiveModel::Serializer.descendants
11
11
  @serializers.sort_by!(&:name)
12
12
 
13
- @adapter_map = if ActiveModel::Serializer::Adapter.const_defined?(:ADAPTER_MAP)
14
- ActiveModel::Serializer::Adapter.const_get(:ADAPTER_MAP)
15
- else
16
- ActiveModelSerializers::Adapter.const_get(:ADAPTER_MAP)
17
- end
18
-
19
- unless defined?(ActiveModelSerializers)
13
+ if defined?(ActiveModelSerializers)
14
+ render 'index'
15
+ else
20
16
  render 'index9'
21
17
  end
22
-
23
18
  end
24
19
 
25
20
  end
@@ -1,9 +1,12 @@
1
1
  module Tuttle
2
2
  class ApplicationController < ActionController::Base
3
3
  abstract!
4
+ protect_from_forgery with: :exception
4
5
 
5
6
  before_action :check_reload_status
6
7
 
8
+ private
9
+
7
10
  def check_reload_status
8
11
  return unless Tuttle::Engine.reload_needed && !Rails.configuration.eager_load
9
12
  Tuttle::Engine.logger.warn('Eager-loading application')
@@ -9,25 +9,18 @@ module Tuttle
9
9
  end
10
10
 
11
11
  def rule_tester
12
- @models = ActiveRecord::Base.descendants
12
+ @models = ActiveRecord::Base.descendants.reject(&:abstract_class)
13
13
  @action = params[:action_name] || 'read'
14
- @subject = nil
15
-
16
- subject_class = params[:subject_class]
17
- subject_id = params[:subject_id]
18
-
19
- if !subject_class.blank? && Kernel.const_defined?(subject_class)
20
- begin
21
- subject_klass = Kernel.const_get(params[:subject_class])
22
- @subject = subject_klass.find(subject_id) unless subject_id.blank?
23
- @subject ||= subject_klass.new
24
- rescue
25
- # Could not load subject
26
- end
27
- end
14
+ @subject = find_subject(params[:subject_class], params[:subject_id])
28
15
  @cancan_user = current_user || User.new
29
16
  @ability = Ability.new(@cancan_user)
30
17
  end
31
18
 
19
+ private
20
+
21
+ def find_subject(subject_class, subject_id)
22
+ subject_klass = @models.detect { |x| x.name == subject_class } if subject_class.present?
23
+ subject_klass.find_or_initialize_by(:id => subject_id) if subject_klass
24
+ end
32
25
  end
33
26
  end
@@ -1,11 +1,10 @@
1
1
  require_dependency 'tuttle/application_controller'
2
- require 'devise/version' if defined? Devise
2
+ require 'devise/version' if defined?(Devise)
3
3
 
4
4
  module Tuttle
5
5
  class DeviseController < ApplicationController
6
6
 
7
7
  def index
8
- render(plain: "Devise not installed") and return unless defined? ::Devise
9
8
  end
10
9
 
11
10
  end
@@ -4,23 +4,23 @@ module Tuttle
4
4
  class GemsController < ApplicationController
5
5
 
6
6
  def index
7
-
8
7
  end
9
8
 
10
9
  def http_clients
11
-
12
10
  end
13
11
 
14
12
  def json
15
-
16
13
  end
17
14
 
15
+ # rubocop:disable Style/AccessorMethodName
18
16
  def get_process_mem
17
+ require 'get_process_mem'
19
18
  require 'get_process_mem/version'
19
+ @memory_self = GetProcessMem.new
20
+ @memory_parent = GetProcessMem.new(Process.ppid)
20
21
  end
21
22
 
22
23
  def other
23
-
24
24
  end
25
25
 
26
26
  end
@@ -5,7 +5,6 @@ module Tuttle
5
5
  class HomeController < ApplicationController
6
6
 
7
7
  def index
8
- @event_counts = Tuttle::Instrumenter.event_counts
9
8
  end
10
9
 
11
10
  end
@@ -1,12 +1,11 @@
1
1
  require_dependency 'tuttle/application_controller'
2
- require 'paperclip/version' if defined?(::Paperclip)
2
+ require 'paperclip/version' if defined?(Paperclip)
3
3
 
4
4
  module Tuttle
5
5
  class PaperclipController < ApplicationController
6
6
 
7
7
  def index
8
8
  # Note: in development with reloading, classes will show up in the registry multiple times
9
- render(plain: "Paperclip not installed") and return unless defined?(::Paperclip)
10
9
  @pcar = Paperclip::AttachmentRegistry.instance
11
10
  end
12
11
 
@@ -0,0 +1,15 @@
1
+ require_dependency 'tuttle/application_controller'
2
+
3
+ module Tuttle
4
+ class RackMiniProfilerController < ApplicationController
5
+
6
+ def index
7
+ return redirect_to gems_other_path unless defined?(::Rack::MiniProfiler::Config)
8
+
9
+ require_dependency 'tuttle/presenters/rack_mini_profiler/client_settings'
10
+ @mp_config = ::Rack::MiniProfiler.config
11
+ @mp_client_settings = Tuttle::Presenters::RackMiniProfiler::ClientSettings.new(request.env)
12
+ end
13
+
14
+ end
15
+ end
@@ -6,6 +6,7 @@ module Tuttle
6
6
  class RailsController < ApplicationController
7
7
 
8
8
  def index
9
+ @config_options = Tuttle::ConfigurationRegistry.data.to_a.sort_by!(&:first)
9
10
  end
10
11
 
11
12
  def controllers
@@ -34,6 +35,7 @@ module Tuttle
34
35
 
35
36
  def database
36
37
  @conn = ActiveRecord::Base.connection
38
+ @data_sources = @conn.respond_to?(:data_sources) ? @conn.data_sources : @conn.tables
37
39
  end
38
40
 
39
41
  def schema_cache
@@ -59,11 +61,12 @@ module Tuttle
59
61
  # helper_symbol = Rails.application.helpers.instance_methods.first
60
62
  # Rails.application.helpers.instance_method(helper_symbol).owner
61
63
  # Rails.application.helpers.instance_method(helper_symbol).parameters
62
- @helpers = ::ApplicationController.send(:modules_for_helpers,[:all])
64
+ @helpers = ::ApplicationController.send(:modules_for_helpers, [:all])
63
65
  end
64
66
 
65
67
  def assets
66
- @sprockets = Rails.application.assets
68
+ @sprockets_env = Rails.application.assets
69
+ @assets_config = Rails.application.config.assets
67
70
  # TODO: revisit detection of "engines" which are classified as processors, transformers, etc.
68
71
  end
69
72
 
@@ -71,6 +74,10 @@ module Tuttle
71
74
  @routes = Rails.application.routes.routes.collect do |route|
72
75
  Tuttle::Presenters::ActionDispatch::Routing::RouteWrapper.new(route)
73
76
  end
77
+ if params[:recognize_path]
78
+ @path_to_recognize = params[:recognize_path]
79
+ @recognized_paths = recognize_paths(params[:recognize_path])
80
+ end
74
81
  # TODO: include engine-mounted routes
75
82
  end
76
83
 
@@ -80,14 +87,45 @@ module Tuttle
80
87
  end
81
88
 
82
89
  def cache
90
+ @cache = Rails.cache
83
91
  # TODO: make cache instrumentation controllable - this will automatically turn in on in Rails < 4.2
84
92
  # Instrumentation is always on in Rails 4.2+
85
- if Rails::VERSION::STRING =~ /^4\.1\./ && !ActiveSupport::Cache::Store.instrument
86
- ActiveSupport::Cache::Store.instrument=true
93
+ # if Rails::VERSION::STRING =~ /^4\.1\./ && !ActiveSupport::Cache::Store.instrument
94
+ # ActiveSupport::Cache::Store.instrument = true
95
+ # end
96
+ # @cache_events = Tuttle::Instrumenter.events.select {|e| /cache_(read|write)\.active_support/ =~ e.name }
97
+ # @tuttle_cache_events = Tuttle::Instrumenter.cache_events
98
+ end
99
+
100
+ private
101
+
102
+ def recognize_paths(path)
103
+ results = {}
104
+ [:get, :post, :put, :delete, :patch].each {|method| results[method] = recognize_path(path, method: method)}
105
+ results
106
+ end
107
+
108
+ # a version that handles engines - based on https://gist.github.com/jtanium/6114632
109
+ # it's possible that multiple engines could handle a particular path. So we will
110
+ # capture each of them
111
+ def recognize_path(path, options)
112
+ recognized_paths = []
113
+ recognized_paths << Rails.application.routes.recognize_path(path, options)
114
+ rescue ActionController::RoutingError => exception
115
+ # The main app didn't recognize the path, try the engines...
116
+ Rails::Engine.subclasses.each do |engine|
117
+ engine_instance = engine.instance
118
+ engine_class = engine_instance.class
119
+ begin
120
+ recognized_path = engine_instance.routes.recognize_path(path, options)
121
+ recognized_path[:engine] = engine_class
122
+ recognized_paths << recognized_path
123
+ rescue ActionController::RoutingError
124
+ Tuttle::Engine.logger.info("Routing error recognizing path for #{path}")
125
+ end
87
126
  end
88
- @cache = Rails.cache
89
- @cache_events = Tuttle::Instrumenter.events.select {|e| /cache_(read|write)\.active_support/ =~ e.name }
90
- @tuttle_cache_events = Tuttle::Instrumenter.cache_events
127
+
128
+ recognized_paths.empty? ? [{ error: exception.message }] : recognized_paths
91
129
  end
92
130
 
93
131
  end
@@ -10,7 +10,3 @@ module Tuttle
10
10
 
11
11
  end
12
12
  end
13
-
14
-
15
-
16
-
@@ -5,15 +5,20 @@ require_dependency 'tuttle/application_controller'
5
5
  module Tuttle
6
6
  class RubyController < ApplicationController
7
7
 
8
+ ENV_FILTERS = [/.*_(URL|PASSWORD|KEY|KEY_BASE|AUTHENTICATION)$/].freeze
9
+
8
10
  def index
9
11
  # TODO: need better filter for sensitive values. this covers DB-style URLs with passwords, passwords, and keys
10
- @filtered_env = ENV.to_hash.tap{ |h| h.each{ |k,_v| h[k] = '--FILTERED--' if /.*_(URL|PASSWORD|KEY|KEY_BASE)$/ =~ k } }
12
+ env_hash = ENV.to_hash
13
+ env_hash = ActionDispatch::Http::ParameterFilter.new(ENV_FILTERS).filter(env_hash) unless params[:nofilter]
14
+ @filtered_env = env_hash.sort
11
15
  end
12
16
 
13
17
  def tuning
14
18
  @gc_enabled = (GC.disable ? false : GC.enable)
15
19
 
16
20
  # taken verbatim from the ruby 2.2 man page
21
+ # rubocop:disable Metrics/LineLength
17
22
  @gc_params = {
18
23
  'RUBY_GC_HEAP_INIT_SLOTS' => 'Initial allocation slots. Introduced in Ruby 2.1, default: 10000.',
19
24
  'RUBY_GC_HEAP_FREE_SLOTS' => 'Prepare at least this amount of slots after GC. Allocate this number slots if there are not enough slots. Introduced in Ruby 2.1, default: 4096',
@@ -30,7 +35,6 @@ module Tuttle
30
35
  end
31
36
 
32
37
  def miscellaneous
33
-
34
38
  end
35
39
 
36
40
  end