putter 0.4.1 → 0.5.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 72890e1762d7aad4835c7be72838d2409ecfd101
4
- data.tar.gz: 0e24d52624633980ca47e6f1a2830e037d016a99
3
+ metadata.gz: 7e5d9857773568b7246fa5399bdbdfad54bfbd96
4
+ data.tar.gz: be5caaf99f8666322b70cde787ecffac3477cad6
5
5
  SHA512:
6
- metadata.gz: a575a07d97f70930a795fdfea66d6c14d4ee27a41eee406206fdde067e71f847576e04065702f2ef4611cc6d52b019c4cf32fccaf2fe18628346895de8c44be0
7
- data.tar.gz: bf1e697ce25b56fd736742b3a15303547249e355c804326a04951c3f36331505b066bbdda01a0097fd01ef248687a16a48ed73c24f272c9def9d2da78a57d865
6
+ metadata.gz: 8dd17629db6f833c3146b0ae63219fb5479b2025474fad5ee12218a21a019a6a762e7b878144dc9ddc1106feb8b461524291b3cca74301d46f93cd655d513dd2
7
+ data.tar.gz: d60e579a5c7ef5d5926afca2941937fd9eb3d2f15babe8e3ecdf399a1d342b74cd8e4eef7d8158ceb7a9678c6cf63f5aac5bef9523700b96d37f3a0bc4e77740
data/CHANGELOG.md CHANGED
@@ -1,4 +1,8 @@
1
1
  # CHANGELOG
2
+ ### 0.5.0 - 2016-11-10
3
+ - Add methods blacklist to the configuration options
4
+ - Ensures that local method options override anything in the blacklist
5
+
2
6
  ### 0.4.1 - 2016-10-16
3
7
  - By default, Putter will not run in production mode in Rails, this can be allow via configuration
4
8
  - By default, Putter will ignore methods from ActiveRecord::Base if it is present
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- putter (0.4.1)
4
+ putter (0.5.0)
5
5
  colorize (~> 0)
6
6
 
7
7
  GEM
data/README.md CHANGED
@@ -60,8 +60,11 @@ Putter Debugging: Object instance ./putter/README.md:57 -- Method: :hello, Args:
60
60
  ```ruby
61
61
  Putter.follow(
62
62
  object_to_follow,
63
- label: "My object", # Optional - Label to use after "Putter Debugging: My object". Will be "ClassName" for classes or "ClassName instance" for instances
64
- methods: ["my_method"], # Optional - If array is empty, then all methods will be watched. Otherwise, this is an array of methods to print debugging input for
63
+ label: "My object", # Optional - Label to use after "Putter Debugging: My object".
64
+ # Will be "ClassName" for classes or "ClassName instance" for instances
65
+ methods: ["my_method"], # Optional - If array is empty, then all methods will be watched.
66
+ # Otherwise, this is an array of methods to print debugging input for. This will override
67
+ # any settings in the configuration blacklist
65
68
  )
66
69
  ```
67
70
 
@@ -102,7 +105,9 @@ Putter Debugging: MyObject instance 1 ./putter/README.md:97 -- Method: :hello_in
102
105
  Putter.watch(
103
106
  ClassToWatch,
104
107
  label: "My class", # Optional - Label to use after "Putter Debugging: My class". Will be "ClassName" for classes or "ClassName instance #" for instances
105
- methods: ["my_method"], # Optional - If array is empty, then all methods will be watched. Otherwise, this is an array of methods to print debugging input for
108
+ methods: ["my_method"], # Optional - If array is empty, then all methods will be watched.
109
+ # Otherwise, this is an array of methods to print debugging input for. This will override
110
+ # any settings in the configuration blacklist
106
111
  )
107
112
  ```
108
113
 
@@ -116,6 +121,7 @@ Putter.configure do |config|
116
121
  # method, args string, and result respectively. This block will be used after each method
117
122
  # is called, it must contain puts or logger calls, to print or any other method callbacks
118
123
  # that are helpful.
124
+
119
125
  # Defaults to Putter::PrintStrategy::Default
120
126
  config.print_strategy = Proc.new do |data|
121
127
  puts "#{data.line} - Label: #{data.label}, Method: #{data.method}, Args: #{data.args}, Result: #{data.result}"
@@ -123,17 +129,26 @@ Putter.configure do |config|
123
129
 
124
130
  # "ignore_methods_from" takes an array of class names and will ignore both class and instance methods
125
131
  # from those classes when adding methods to the proxy and adding debug output
132
+
126
133
  # Defaults to [Object] or [Object, ActiveRecord::Based] if defined
127
134
  config.ignore_methods_from = [Object, ActiveRecord::Base]
128
135
 
129
136
  # "methods_whitelist" takes an array of methods and will always proxy and debug those methods
130
137
  # regardless of whether or not the class is ignored and regardless of what methods are passed
131
138
  # in when running "Putter.follow" or "Putter.watch"
139
+
132
140
  # Defaults to []
133
141
  config.methods_whitelist = [:to_s]
134
142
 
143
+ # "methods_blacklist" takes an array of methods and will never proxy. If this is combined
144
+ # with the `methods_whitelist` then it will raise a `MethodConflictError`.
145
+
146
+ # Defaults to []
147
+ config.methods_blacklist = [:to_s]
148
+
135
149
  # "allow_production" takes a boolean and determines whether or not Putter will run if
136
150
  # `Rails.env == "production"`
151
+
137
152
  # Defaults to false
138
153
  config.allow_production = false
139
154
  end
@@ -1,7 +1,7 @@
1
1
  module Putter
2
2
  class Configuration
3
- attr_accessor :print_strategy, :allow_production
4
- attr_writer :ignore_methods_from, :methods_whitelist
3
+ attr_accessor :allow_production, :methods_whitelist, :methods_blacklist, :print_strategy
4
+ attr_writer :ignore_methods_from
5
5
 
6
6
  def initialize
7
7
  @ignore_methods_from = [Object]
@@ -9,17 +9,28 @@ module Putter
9
9
  @print_strategy = PrintStrategy::Default
10
10
  @allow_production = false
11
11
  @methods_whitelist = []
12
+ @methods_blacklist = []
12
13
  end
13
14
 
14
15
  def ignore_methods_from
15
- _convert_to_array(@ignore_methods_from)
16
+ convert_to_array(@ignore_methods_from)
16
17
  end
17
18
 
18
- def methods_whitelist
19
- _convert_to_array(@methods_whitelist)
19
+ def methods_whitelist=(methods)
20
+ raise ::Putter::MethodConflictError unless (@methods_blacklist & methods).empty?
21
+
22
+ @methods_whitelist = methods
20
23
  end
21
24
 
22
- def _convert_to_array(val)
25
+ def methods_blacklist=(methods)
26
+ raise ::Putter::MethodConflictError unless (@methods_whitelist & methods).empty?
27
+
28
+ @methods_blacklist = methods
29
+ end
30
+
31
+ private
32
+
33
+ def convert_to_array(val)
23
34
  if val.nil?
24
35
  []
25
36
  elsif !val.is_a?(Array)
data/lib/putter/errors.rb CHANGED
@@ -4,4 +4,10 @@ module Errors
4
4
  super
5
5
  end
6
6
  end
7
+
8
+ class MethodConflictError < StandardError
9
+ def initialize(msg="Methods cannot be white and blacklisted")
10
+ super
11
+ end
12
+ end
7
13
  end
@@ -30,7 +30,7 @@ module Putter
30
30
  def add_method(method)
31
31
  proxy_method_data = ProxyMethodData.new(label: @data.label, method: method)
32
32
 
33
- add_putter_instance_method_to_proxy(@proxy, proxy_method_data)
33
+ add_putter_method_to_proxy(@proxy, proxy_method_data)
34
34
  end
35
35
  end
36
36
  end
@@ -5,18 +5,21 @@ module Putter
5
5
  def initialize(object, proxy, options)
6
6
  @proxy = proxy
7
7
  @proxied_methods = options[:methods] || []
8
- _set_label(options[:label], object)
8
+ set_label(options[:label], object)
9
9
  end
10
10
 
11
11
  def add_method?(method)
12
12
  return false if @proxy.instance_methods.include?(method)
13
- return true if _is_whitelisted_method?(method)
14
- return false if _is_ignored_method?(method)
15
- return true if @proxied_methods.empty?
16
13
  return true if @proxied_methods.include?(method)
14
+ return true if is_whitelisted_method?(method)
15
+ return false if is_blacklisted_method?(method)
16
+ return false if is_ignored_method?(method)
17
+ return true if @proxied_methods.empty?
17
18
  end
18
19
 
19
- def _set_label(label, object)
20
+ private
21
+
22
+ def set_label(label, object)
20
23
  if !label.nil?
21
24
  @label = label
22
25
  elsif object.class == Class
@@ -26,11 +29,15 @@ module Putter
26
29
  end
27
30
  end
28
31
 
29
- def _is_whitelisted_method?(method)
32
+ def is_whitelisted_method?(method)
30
33
  ::Putter.configuration.methods_whitelist.map(&:to_sym).include?(method.to_sym)
31
34
  end
32
35
 
33
- def _is_ignored_method?(method)
36
+ def is_blacklisted_method?(method)
37
+ ::Putter.configuration.methods_blacklist.map(&:to_sym).include?(method.to_sym)
38
+ end
39
+
40
+ def is_ignored_method?(method)
34
41
  ::Putter.configuration.ignore_methods_from.each do |klass|
35
42
  return true if klass.methods.include?(method.to_sym)
36
43
  return true if klass.instance_methods.include?(method.to_sym)
@@ -1,17 +1,7 @@
1
1
  module Putter
2
2
  module MethodCreator
3
- def add_putter_instance_method_to_proxy(proxy, data)
4
- add_putter_method_to_proxy(proxy, data, :instance_exec)
5
- end
6
-
7
- def add_putter_class_method_to_proxy(proxy, data)
8
- add_putter_method_to_proxy(proxy, data, :module_exec)
9
- end
10
-
11
- private
12
-
13
- def add_putter_method_to_proxy(proxy, data, eval_method)
14
- proxy.send(eval_method, data) do |data|
3
+ def add_putter_method_to_proxy(proxy, data)
4
+ proxy.send(:instance_exec, data) do |data|
15
5
  define_method(data.method) do |*proxy_args, &blk|
16
6
  line = caller.find {|call| call.match(data.stack_trace_ignore_regex)}
17
7
  data.line = line.split(::Dir.pwd)[1]
@@ -1,3 +1,3 @@
1
1
  module Putter
2
- VERSION = "0.4.1"
2
+ VERSION = "0.5.0"
3
3
  end
@@ -31,7 +31,7 @@ module Putter
31
31
 
32
32
  Putter::Watcher.methods_for(klass).each do |method|
33
33
  data = ProxyMethodData.new(label: Putter::Watcher.label_for(klass), method: method)
34
- add_putter_class_method_to_proxy(proxy, data)
34
+ add_putter_method_to_proxy(proxy, data)
35
35
  end
36
36
 
37
37
  proxy
@@ -3,11 +3,11 @@ module Putter
3
3
  attr_accessor :label, :proxy_methods
4
4
 
5
5
  def initialize(options, klass)
6
- @label = _set_label(options[:label], klass)
7
- @proxy_methods = _set_methods(options[:methods], klass.singleton_class)
6
+ @label = set_label(options[:label], klass)
7
+ @proxy_methods = set_methods(options[:methods], klass.singleton_class)
8
8
  end
9
9
 
10
- def _set_label(label, klass)
10
+ def set_label(label, klass)
11
11
  if !label.nil? && label != ""
12
12
  label
13
13
  else
@@ -15,9 +15,9 @@ module Putter
15
15
  end
16
16
  end
17
17
 
18
- def _set_methods(methods, singleton_klass)
18
+ def set_methods(methods, singleton_klass)
19
19
  if methods.nil?
20
- _methods_to_proxy(singleton_klass)
20
+ methods_to_proxy(singleton_klass)
21
21
  elsif !methods.is_a?(Array)
22
22
  [methods]
23
23
  else
@@ -25,14 +25,16 @@ module Putter
25
25
  end
26
26
  end
27
27
 
28
- def _methods_to_proxy(singleton_klass)
29
- ignored_methods = []
28
+ def methods_to_proxy(singleton_klass)
29
+ ignored_methods = Putter.configuration.methods_blacklist.map(&:to_sym)
30
30
 
31
31
  Putter.configuration.ignore_methods_from.each do |klass|
32
32
  ignored_methods += klass.methods
33
33
  end
34
34
 
35
- singleton_klass.instance_methods - ignored_methods + Putter.configuration.methods_whitelist.map(&:to_sym) + [:new]
35
+ whitelist = Putter.configuration.methods_whitelist.map(&:to_sym) + [:new]
36
+
37
+ singleton_klass.instance_methods - ignored_methods + whitelist
36
38
  end
37
39
  end
38
40
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: putter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - John DeWyze
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-10-17 00:00:00.000000000 Z
11
+ date: 2016-11-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: colorize