Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

wtf-tools

Package Overview
Dependencies
Maintainers
1
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

wtf-tools

  • 1.0.4
  • Rubygems
  • Socket score

Version published
Maintainers
1
Created
Source

wtf-tools

Some tools for debugging and profiling Ruby on Rails projects. Included:

  • data dumper
  • code timing tool
  • method tracker - a kind of middle ground between simple timing and full profiling
  • SQL tracker - detect where exactly given SQL query originated from

User is responsible for requiring gems necessary for rendering output. For example, when :yaml option is used with WTF?, we expect that YAML is already loaded. Library requirements for specific options are documented below.

Usage examples

Data dumping

WTF? my_var                                   # basic
WTF? my_var, other_var, { some: data }, :pp   # more data, option: pretty-print
WTF? :label, records, :bare, :time            # multiple options given
data.wtf(:time).some_method                   # inline call

Supported options

Prefix
  (default)  WTF (my_file_name/method_name:227): 
  :np        no default prefix
  :nl        new line before the record
  :time      with timestamp: [2014-10-28 12:33:11 +0200]

Formatting
  (default)  simple Ruby inspect
  :pp        pretty-print, require 'pp'
  :yaml      YAML format,  require 'yaml'
  :json      JSON format,  require 'json'
  :csv       CSV format,   require 'csv'
  :text      simple Ruby to_s
  :line      modifier, each object in separate line
  :bare      modifier, ActiveRecord with just id attributes: #<MyClass id: 1234>
  :name      like :line, but with names taken from source file

Output control
  :puts      to STDOUT (default)
  :file      to a separate file in configured location
  :error     raise the string containing data as exception

Code timing

class MyClass
  def run_something
    WTF.time {
      # your code
    }
  end
end

Output:

WTF (my_class/run_something:3): 0.001

Method tracking

class MyClass
  def run_something
    WTF.track(self)
    # lots of code
    WTF.track_finish
  end
end

Additionally, extra classes/modules can be given:

WTF.track(self, OtherClass, Helpers)

This will create a CSV file in configured location, containing profiling info. Profiling happens only in the methods of the calling class, and any other given class.

How it works: every method in MyClass and OtherClass is overridden, adding resource measuring code. All calls to those methods from the code between track and track_finish are measured (time and memory). Sum amounts are written as CSV file, sorted by total time used.

Example output:

class,method,count,time,heap_mb
,top,0,0.948,0.0
Overview,some_helper,16408,0.351,0.0
Overview,my_records,28,0.172,0.0
Overview,load_data,1,0.166,0.0 
...

Warning: tracking method calls adds time overhead (somewhere from 10% to 3x, depending on number of times the methods were called).


SQL tracking

class MyClass
  def run_something
    WTF.sql %q{SELECT * FROM `my_records` WHERE `attribute`='value' AND `etc`}
    WTF.sql /^UPDATE `my_records` SET .*?`some_values`=/, size: 10
    # lots of code
  end
end

This will add a WTF?-style dump in the default location, containing stacktrace where given SQL statement was generated. SQL must match exactly as strings.


Configuration

Configure WTF before using the above-mentioned facilities. Rails initializers directory is a good place to put it. Subkeys of output must be lambdas taking one string argument. They are merged into default output options.

WTF.options = {
  files:   "#{Rails.root}/log/wtf",
  output: {
    default: ->(data) { Rails.logger.info(data) },
    redis:   ->(data) { Redis.new.rpush(:wtf, data) },
  }
}

require 'yaml' # to use :yaml option, etc

Requirement: Ruby 2.0, because the technique used involves module prepend-ing, which is not available in Ruby 1.9.


License

This is released under the MIT License.

Sponsors

This gem is sponsored and used by SameSystem

SameSystem

FAQs

Package last updated on 01 Jul 2016

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc