measure_method 0.1.0
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/lib/measure_method.rb +53 -0
- data/lib/measure_method/logger.rb +23 -0
- data/lib/measure_method/metrics.rb +49 -0
- metadata +47 -0
    
        checksums.yaml
    ADDED
    
    | @@ -0,0 +1,7 @@ | |
| 1 | 
            +
            ---
         | 
| 2 | 
            +
            SHA1:
         | 
| 3 | 
            +
              metadata.gz: 0994c6dc85f1dfe4653e442975d1f75b48cb6566
         | 
| 4 | 
            +
              data.tar.gz: 0e94fc45032add7147267d87e92dbc1e7da99904
         | 
| 5 | 
            +
            SHA512:
         | 
| 6 | 
            +
              metadata.gz: 003eb4eae20dcb6edebbe7302bfc8f191c5296db3aabee7daf7466cb0a0a0e4adf94eb030541ae63629b829b71385799709a884e5fccfe7ecf66e872368c519e
         | 
| 7 | 
            +
              data.tar.gz: 19d60a34fc9a0e26e97c67848f93ce2c9e6a91e379d0b41837fe4979d5db2f3b43011fd7ee281303c7fd4d167562d1b28052361c4bfa68488bf82378111c78bd
         | 
| @@ -0,0 +1,53 @@ | |
| 1 | 
            +
            require 'measure_method/logger'
         | 
| 2 | 
            +
            require 'measure_method/metrics'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            module MeasureMethod
         | 
| 5 | 
            +
              def self.included(base)
         | 
| 6 | 
            +
                base.extend ClassMethods
         | 
| 7 | 
            +
              end
         | 
| 8 | 
            +
             | 
| 9 | 
            +
              module Measurement
         | 
| 10 | 
            +
                def self.class_name(obj)
         | 
| 11 | 
            +
                  obj.kind_of?(Class) ? obj.name : obj.class.name
         | 
| 12 | 
            +
                end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                def self.name(obj, method)
         | 
| 15 | 
            +
                  Metrics.metricfy("#{class_name(obj)}.#{method}")
         | 
| 16 | 
            +
                end
         | 
| 17 | 
            +
              end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
              module ClassMethods
         | 
| 20 | 
            +
                def measure_methods(*args)
         | 
| 21 | 
            +
                  @measured_methods ||= []
         | 
| 22 | 
            +
                  @methods_to_measure ||= []
         | 
| 23 | 
            +
                  @methods_to_measure += args.map(&:to_sym)
         | 
| 24 | 
            +
                end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                def method_added(name)
         | 
| 27 | 
            +
                  define_measure_method(name, self)
         | 
| 28 | 
            +
                end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                def singleton_method_added(name)
         | 
| 31 | 
            +
                  define_measure_method(name, self.singleton_class)
         | 
| 32 | 
            +
                end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                def define_measure_method(name, obj)
         | 
| 35 | 
            +
                  return if @adding_measurers
         | 
| 36 | 
            +
                  return if @measured_methods.include?(name)
         | 
| 37 | 
            +
                  @adding_measurers = true
         | 
| 38 | 
            +
                  if @methods_to_measure.include? name.to_sym
         | 
| 39 | 
            +
                    unmeasured_name = "unmeasured_#{name}"
         | 
| 40 | 
            +
                    obj.send(:alias_method, unmeasured_name, name)
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                    obj.send(:define_method, name) do |*args, &block|
         | 
| 43 | 
            +
                      Metrics.measure_block(
         | 
| 44 | 
            +
                        name: Measurement.name(self, name)
         | 
| 45 | 
            +
                      ) {send unmeasured_name, *args, &block}
         | 
| 46 | 
            +
                    end
         | 
| 47 | 
            +
             | 
| 48 | 
            +
                    @measured_methods << name
         | 
| 49 | 
            +
                  end
         | 
| 50 | 
            +
                  @adding_measurers = nil
         | 
| 51 | 
            +
                end
         | 
| 52 | 
            +
              end
         | 
| 53 | 
            +
            end
         | 
| @@ -0,0 +1,23 @@ | |
| 1 | 
            +
            module MeasureMethod
         | 
| 2 | 
            +
              module Logger
         | 
| 3 | 
            +
                extend self
         | 
| 4 | 
            +
             | 
| 5 | 
            +
                def log(data)
         | 
| 6 | 
            +
                  puts(stringify(data))
         | 
| 7 | 
            +
                end
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                def stringify(data)
         | 
| 10 | 
            +
                  data.map do |k,v|
         | 
| 11 | 
            +
                    if v.to_s =~ /[^0-9A-Z._-]/i
         | 
| 12 | 
            +
                      [k, '=', '"', v, '"'].join
         | 
| 13 | 
            +
                    else
         | 
| 14 | 
            +
                      "#{k}=#{v}"
         | 
| 15 | 
            +
                    end
         | 
| 16 | 
            +
                  end.join(' ')
         | 
| 17 | 
            +
                end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                def puts(str)
         | 
| 20 | 
            +
                  $stdout.puts(str)
         | 
| 21 | 
            +
                end
         | 
| 22 | 
            +
              end
         | 
| 23 | 
            +
            end
         | 
| @@ -0,0 +1,49 @@ | |
| 1 | 
            +
            module MeasureMethod
         | 
| 2 | 
            +
              module Metrics
         | 
| 3 | 
            +
                def self.out=(o)
         | 
| 4 | 
            +
                  @out = o
         | 
| 5 | 
            +
                end
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                def self.out
         | 
| 8 | 
            +
                  @out || Logger
         | 
| 9 | 
            +
                end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                def self.sample(name:, val:, data: {})
         | 
| 12 | 
            +
                  met_log("sample", name, val, data)
         | 
| 13 | 
            +
                end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                def self.count(name:, val: 1, data: {})
         | 
| 16 | 
            +
                  met_log("count", name, val, data)
         | 
| 17 | 
            +
                end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                def self.measure(name:, val: nil, data: {}, &block)
         | 
| 20 | 
            +
                  return measure_block(name: name, data: data, &block) if block
         | 
| 21 | 
            +
                  met_log("measure", name, val, data)
         | 
| 22 | 
            +
                end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                def self.metricfy(name)
         | 
| 25 | 
            +
                  name.
         | 
| 26 | 
            +
                    gsub('::', '.').
         | 
| 27 | 
            +
                    gsub(' ', '.').
         | 
| 28 | 
            +
                    gsub(/(\/)/, '.').
         | 
| 29 | 
            +
                    gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
         | 
| 30 | 
            +
                    gsub(/([a-z\d])([A-Z])/,'\1_\2').
         | 
| 31 | 
            +
                    gsub(/_/,"-").
         | 
| 32 | 
            +
                    downcase
         | 
| 33 | 
            +
                end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                def self.met_log(type, name, val, data)
         | 
| 36 | 
            +
                  data["#{type}##{name}"] = val
         | 
| 37 | 
            +
                  out.log(data)
         | 
| 38 | 
            +
                end
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                def self.measure_block(name:, data: {}, &block)
         | 
| 41 | 
            +
                  out.log(data.merge({starting: name}))
         | 
| 42 | 
            +
                  start = Time.now
         | 
| 43 | 
            +
                  result = yield
         | 
| 44 | 
            +
                  elapsed = (Time.now.to_f - start.to_f) * 1000
         | 
| 45 | 
            +
                  measure(name: name, val: elapsed.round.to_s+"ms", data: data)
         | 
| 46 | 
            +
                  result
         | 
| 47 | 
            +
                end
         | 
| 48 | 
            +
              end
         | 
| 49 | 
            +
            end
         | 
    
        metadata
    ADDED
    
    | @@ -0,0 +1,47 @@ | |
| 1 | 
            +
            --- !ruby/object:Gem::Specification
         | 
| 2 | 
            +
            name: measure_method
         | 
| 3 | 
            +
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            +
              version: 0.1.0
         | 
| 5 | 
            +
            platform: ruby
         | 
| 6 | 
            +
            authors:
         | 
| 7 | 
            +
            - Eric Rykwalder
         | 
| 8 | 
            +
            - Ryan R. Smith
         | 
| 9 | 
            +
            autorequire: 
         | 
| 10 | 
            +
            bindir: bin
         | 
| 11 | 
            +
            cert_chain: []
         | 
| 12 | 
            +
            date: 2014-10-17 00:00:00.000000000 Z
         | 
| 13 | 
            +
            dependencies: []
         | 
| 14 | 
            +
            description: Measure ruby methods and report their metrics
         | 
| 15 | 
            +
            email: eric@chain.com
         | 
| 16 | 
            +
            executables: []
         | 
| 17 | 
            +
            extensions: []
         | 
| 18 | 
            +
            extra_rdoc_files: []
         | 
| 19 | 
            +
            files:
         | 
| 20 | 
            +
            - lib/measure_method.rb
         | 
| 21 | 
            +
            - lib/measure_method/logger.rb
         | 
| 22 | 
            +
            - lib/measure_method/metrics.rb
         | 
| 23 | 
            +
            homepage: http://github.com/chain-engineering/measure_method
         | 
| 24 | 
            +
            licenses:
         | 
| 25 | 
            +
            - MIT
         | 
| 26 | 
            +
            metadata: {}
         | 
| 27 | 
            +
            post_install_message: 
         | 
| 28 | 
            +
            rdoc_options: []
         | 
| 29 | 
            +
            require_paths:
         | 
| 30 | 
            +
            - lib
         | 
| 31 | 
            +
            required_ruby_version: !ruby/object:Gem::Requirement
         | 
| 32 | 
            +
              requirements:
         | 
| 33 | 
            +
              - - ">="
         | 
| 34 | 
            +
                - !ruby/object:Gem::Version
         | 
| 35 | 
            +
                  version: '0'
         | 
| 36 | 
            +
            required_rubygems_version: !ruby/object:Gem::Requirement
         | 
| 37 | 
            +
              requirements:
         | 
| 38 | 
            +
              - - ">="
         | 
| 39 | 
            +
                - !ruby/object:Gem::Version
         | 
| 40 | 
            +
                  version: '0'
         | 
| 41 | 
            +
            requirements: []
         | 
| 42 | 
            +
            rubyforge_project: 
         | 
| 43 | 
            +
            rubygems_version: 2.2.2
         | 
| 44 | 
            +
            signing_key: 
         | 
| 45 | 
            +
            specification_version: 4
         | 
| 46 | 
            +
            summary: Measure ruby methods and report their metrics
         | 
| 47 | 
            +
            test_files: []
         |