ruby_codex 0.0.6 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2) hide show
  1. data/lib/ruby_codex.rb +54 -38
  2. metadata +1 -1
@@ -28,15 +28,15 @@ class Codex
28
28
  end
29
29
 
30
30
  key = {
31
- :type => type
31
+ :type => type,
32
+ :info => info,
33
+ :func_info => func_info
32
34
  }
33
35
 
34
36
  data_core = {
35
37
  :file => Proc.new { |node, f, p| f },
36
38
  :project => Proc.new { |node, f, p| p },
37
39
  :line => Proc.new { |node, f, p| node.loc ? node.loc.line : nil },
38
- :info => info,
39
- :func_info => func_info,
40
40
  :orig_code => Proc.new { |node, f, p| Unparser.unparse(node) rescue nil },
41
41
  }
42
42
 
@@ -49,8 +49,6 @@ class Codex
49
49
  {:code => x[:orig_code], :file => x[:file], :line => x[:line]}
50
50
  end.uniq },
51
51
  :count => Proc.new { |v| v.map { |x| x[:orig_code] }.count },
52
- :info => Proc.new { |v| v.first[:info] }, # some process may overwrite
53
- :func_info => Proc.new { |v| v.first[:func_info] }
54
52
  }
55
53
 
56
54
  @nodes[:block] = DataNode.new(
@@ -60,18 +58,17 @@ class Codex
60
58
  :func => Proc.new { |x| func_name.call(x.children.first) },
61
59
  :body => Proc.new { |x| normalize_nodes(x.children.last) },
62
60
  :arg_size => Proc.new { |x| x.children[1].children.size },
61
+ :info => Proc.new { |x| info.call(block_without_caller(x)) },
62
+ :func_info => Proc.new { |x| func_info.call(block_without_caller(x)) },
63
63
  :ret_val => Proc.new do |x|
64
64
  body = x.children.last
65
65
  ret = type.call(body) == "begin" ? body.children.last : body
66
66
  typ = type.call(ret)
67
67
  typ == "send" ? func_name.call(ret) : typ
68
68
  end,
69
- :norm_code => Proc.new { |x|
70
- normal_node(x) do |x|
71
- Unparser.unparse(x.updated(nil, x.children.map.with_index do |y,i|
72
- i == 0 ? without_caller(y) : y
73
- end)) rescue nil
74
- end }
69
+ :norm_code => Proc.new do |x|
70
+ normal_node(x) { |x| Unparser.unparse(block_without_caller(x)) rescue nil }
71
+ end
75
72
  }),
76
73
  data_core.merge({
77
74
  :args => Proc.new { |x| x.children[1].children.map{ |y| y.children[0].to_s }}
@@ -89,7 +86,7 @@ class Codex
89
86
  "We've seen #{keys[:func]} blocks returning the #{keys[:ret_val]} type #{query_count.to_s} " +
90
87
  "times, and we've seen #{keys[:func]} blocks #{blocks.to_s} times and #{keys[:ret_val]} " +
91
88
  "returned #{rets.to_s} times.",
92
- :unlikely => Proc.new { |gt=1,bt = 0,rt = 0| query_count < gt && blocks > bt && rets > rt}
89
+ :unlikely => Proc.new { |gt=1,bt = 5,rt = 5| query_count < gt && blocks > bt && rets > rt}
93
90
  }
94
91
  }
95
92
  )
@@ -100,28 +97,34 @@ class Codex
100
97
  key.merge({
101
98
  :func => Proc.new { |x| func_name.call(x) },
102
99
  :norm_code => Proc.new { |x| normal_node(x) { |x| Unparser.unparse(without_caller(x)) rescue nil } },
103
- :sig => Proc.new { |x| x.children.drop(2).map { |y| type.call(y) } }
100
+ :sig => Proc.new { |x| x.children.drop(2).map { |y| type.call(y) } },
101
+ :info => Proc.new { |x| info.call(without_caller(x)) },
102
+ :func_info => Proc.new { |x| func_info.call(without_caller(x)) }
104
103
  }),
105
104
  data_core,
106
105
  combine,
107
106
  Proc.new { |db,keys,values|
108
- query = db.where(keys).first
109
- query_count = query.nil? ? 0 : query.count
110
- func = db.where(:type => keys[:type], :func => keys[:func]).sort(:count => -1).limit(1).first
111
- alt_text =
112
- if func
113
- alt_count = func.count
114
- "and the most common alternative #{func.norm_code} has appeared #{alt_count.to_s} times."
115
- else
116
- alt_count = 0
117
- "and we've seen no known alternative."
118
- end
119
- { :keys => keys,
120
- :message =>
121
- "Function call #{keys[:norm_code]} has appeared #{query_count.to_s} times, " +
122
- alt_text,
123
- :unlikely => Proc.new { |t=10| alt_count > t * (query_count + 1)}
124
- }
107
+ if keys[:norm_code] != nil # Hack for binary operators that disappear
108
+ query = db.where(keys).first
109
+ query_count = query.nil? ? 0 : query.count
110
+ func = db.where(:type => keys[:type], :func => keys[:func]).sort(:count => -1).limit(1).first
111
+ alt_text =
112
+ if func
113
+ alt_count = func.count
114
+ "and the most common alternative #{func.norm_code} has appeared #{alt_count.to_s} times."
115
+ else
116
+ alt_count = 0
117
+ "and we've seen no known alternative."
118
+ end
119
+ { :keys => keys,
120
+ :message =>
121
+ "Function call #{keys[:norm_code]} has appeared #{query_count.to_s} times, " +
122
+ alt_text,
123
+ :unlikely => Proc.new { |t=10| alt_count > t * (query_count + 1)}
124
+ }
125
+ else
126
+ { :message => "Never Seen", :unlikely => Proc.new { false } }
127
+ end
125
128
  }
126
129
  )
127
130
 
@@ -131,12 +134,11 @@ class Codex
131
134
  key.merge({
132
135
  :type => Proc.new { "func_chain" },
133
136
  :f1 => Proc.new { |x| func_name.call(x) },
134
- :f2 => Proc.new { |x| func_name.call(x.children.first) }
135
- }),
136
- data_core.merge({
137
+ :f2 => Proc.new { |x| func_name.call(x.children.first) },
137
138
  :info => Proc.new { 0 },
138
139
  :func_info => Proc.new { 0 }
139
140
  }),
141
+ data_core,
140
142
  combine,
141
143
  Proc.new do |db,keys,data|
142
144
  query = db.where(keys).first
@@ -171,19 +173,20 @@ class Codex
171
173
  key.merge({
172
174
  :type => Proc.new { "ident" },
173
175
  :ident => Proc.new { |x| x.children.first.to_s },
174
- }),
175
- data_core.merge({
176
- :ident_type => Proc.new { |x| type.call(x.children[1]) rescue nil },
177
176
  :info => Proc.new { 0 },
178
177
  :func_info => Proc.new { 0 }
179
178
  }),
179
+ data_core.merge({
180
+ :ident_type => Proc.new { |x| type.call(x.children[1]) rescue nil }
181
+ }),
180
182
  combine.merge({
181
183
  :ident_types => Proc.new { |v| v.group_by { |y| y[:ident_type] }.map_hash { |x| x.size } }
182
184
  }),
183
185
  Proc.new { |db, keys, data|
186
+ primatives = ["str","int","float","array","hash"]
184
187
  query = db.where(keys).first
185
- if query
186
- types = query.ident_types.select { |k,v| ["str","int","float","array","hash"].include? k }
188
+ if query && primatives.include?(keys[:ident_type])
189
+ types = query.ident_types.select { |k,v| primatives.include? k }
187
190
  types.default = 0
188
191
  best = types.select { |k,v| k != data[:ident_type] }.sort_by{ |k,v| v*-1 }.first
189
192
  best_str = best ? "#{best[1].to_s} times as #{best[0].to_s}" : "never as anything else."
@@ -228,11 +231,24 @@ class Codex
228
231
  unlikely
229
232
  end
230
233
 
234
+ def tree_walk(ast, &block)
235
+ if ast.is_a?(AST::Node)
236
+ yield ast if block
237
+ ast.children.each { |node| tree_walk(node, &block) }
238
+ end
239
+ end
240
+
231
241
  def without_caller(node)
232
242
  node.updated(nil, node.children.map.with_index do |x,i|
233
243
  i == 0 ? nil : x
234
244
  end)
235
245
  end
246
+
247
+ def block_without_caller(node)
248
+ node.updated(nil, node.children.map.with_index do |y,i|
249
+ i == 0 ? without_caller(y) : y
250
+ end)
251
+ end
236
252
 
237
253
  def normal_node(node)
238
254
  norm = ASTNormalizer.new
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby_codex
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.7
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors: