fsck 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ ### 0.0.3
2
+
3
+ * better caching, better performance
4
+
1
5
  ### 0.0.2
2
6
 
3
7
  * fluff at end of method with punctuation bug fix
data/README.md CHANGED
@@ -6,6 +6,7 @@ Fsck allows you to express your feelings while you're developing. It does this b
6
6
  gem install fsck
7
7
 
8
8
  ## Examples
9
+
9
10
  Fsck allows you to have a sense of closure during your everyday development life. Here's some examples:
10
11
 
11
12
  *A difficult problem causing you frustration? Tell it how you feel.*
@@ -20,7 +21,9 @@ Fsck allows you to have a sense of closure during your everyday development life
20
21
  (1..10).awesome_inject_is_awesome(&:+)
21
22
 
22
23
  ## Usage
23
- **Spot Usage**
24
+
25
+ ### Spot Usage
26
+
24
27
  Fsck comes as a module that you can include wherever you want.
25
28
 
26
29
  require "fsck"
@@ -36,18 +39,33 @@ Fsck comes as a module that you can include wherever you want.
36
39
  my_object = MyClass.new
37
40
  my_object.calling_my_awesome_method # => 42
38
41
 
39
- **Deep Usage**
42
+ ### Deep Usage
43
+
40
44
  Fsck also provides a way to use its functionality on every object in ruby.
41
45
 
42
46
  require "fsck/deep"
43
47
 
44
48
  42.gimme_succ # => 43
45
49
  ary = Array.new_array_please # => []
50
+
51
+ ## Fsck: How does it work?
52
+
53
+ Fsck achieves its functionality by greatly abusing `method_missing`. Each time a fscked method is called, every method defined on the object is examined. The method with the longest name is assumed to be the *intended* method.
54
+
55
+ The examination process splits the word of each method name, building a regex that allows for any number of other words to be inserted wherever. If you aren't careful with the words you choose, you may unintentionally call another method.
56
+
57
+ # you may expect this to call #each, but it will instead call #each_value
58
+ my_hash.what_i_need_is_each_set_of_key_plus_value { |k,v| puts k }
46
59
 
47
60
  ## Origin
61
+
48
62
  Fsck is named after the use of the Unix file system utility, specifically as it is applied to [profanity](http://en.wikipedia.org/wiki/Fsck#Use_as_profanity).
49
63
 
50
64
  **NOTE:** This gem has nothing to do with the Unix file system utility
51
65
 
66
+ ## Disclaimer
67
+
68
+ Your application will take a more than trivial performance hit if you use this gem. The benchmark I ran on Fixnum (bench.rb) shows that using a fscked method is roughly 20 times slower. This only tests the performance of repeated fscked method calls (which should be most common use). If you're dynamically building a fscked method call based on some variable, you can expect much worse performance. Use at your own risk.
69
+
52
70
  ## License
53
71
  MIT License. Copyright 2011 Chris Thorn.
data/bench.rb ADDED
@@ -0,0 +1,21 @@
1
+ $:.unshift File.join(File.dirname(__FILE__), "lib")
2
+
3
+ require "benchmark"
4
+ require "fsck/deep"
5
+
6
+ N = 1_000
7
+
8
+ Benchmark.bm(10) do |r|
9
+ r.report("vanilla") { N.times { 42.succ } }
10
+ r.report("fscked") { N.times { 42.gimme_succ_please } }
11
+ end
12
+
13
+ # v0.0.3
14
+ # user system total real
15
+ # vanilla 0.000000 0.000000 0.000000 ( 0.000246)
16
+ # fscked 0.010000 0.000000 0.010000 ( 0.005068)
17
+
18
+ # results on my machine (v0.0.2)
19
+ # user system total real
20
+ # vanilla 0.000000 0.000000 0.000000 ( 0.000130)
21
+ # fscked 2.960000 0.090000 3.050000 ( 3.053142)
data/lib/fsck/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Fsck
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
data/lib/fsck.rb CHANGED
@@ -1,5 +1,9 @@
1
1
  module Fsck
2
2
  def method_missing(sym, *args, &block)
3
+ @_fsck_method_name_cache ||= {}
4
+
5
+ return send(@_fsck_method_name_cache[sym], *args, &block) if @_fsck_method_name_cache[sym]
6
+
3
7
  fscked_method = sym.to_s
4
8
 
5
9
  if punctuation = fscked_method[/[!?=]$/]
@@ -7,23 +11,20 @@ module Fsck
7
11
  end
8
12
 
9
13
  matches = methods.select do |m|
10
- fscked_method =~ /^#{__fsck_cache__(m)}#{punctuation}$/
14
+ fscked_method =~ /^#{__fsck_method_regex_str__(m)}#{punctuation}$/
11
15
  end
12
16
 
13
17
  if matches.empty?
14
18
  super
15
19
  else
16
- send(matches.sort_by(&:length).last, *args, &block)
20
+ @_fsck_method_name_cache[sym] = matches.sort_by(&:length).last
21
+ send(@_fsck_method_name_cache[sym], *args, &block)
17
22
  end
18
23
  end
19
24
 
20
25
  private
21
- def __fsck_cache__(method)
22
- @_fsck_method_name_cache ||= {}
23
-
24
- return @_fsck_method_name_cache[method] if @_fsck_method_name_cache[method]
25
-
26
+ def __fsck_method_regex_str__(method)
26
27
  words = method.to_s.delete("!?=").split("_").map { |w| Regexp.escape(w) }
27
- @_fsck_method_name_cache[method] = "(\\w*_)?#{words.join('\w*_\w*')}(_\\w*)?"
28
+ "(\\w*_)?#{words.join('\w*_\w*')}(_\\w*)?"
28
29
  end
29
30
  end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 0
8
- - 2
9
- version: 0.0.2
8
+ - 3
9
+ version: 0.0.3
10
10
  platform: ruby
11
11
  authors:
12
12
  - Chris Thorn
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2011-01-05 00:00:00 -09:00
17
+ date: 2011-01-06 00:00:00 -09:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -47,6 +47,7 @@ files:
47
47
  - Gemfile.lock
48
48
  - README.md
49
49
  - Rakefile
50
+ - bench.rb
50
51
  - fsck.gemspec
51
52
  - lib/fsck.rb
52
53
  - lib/fsck/deep.rb