dougp-wildcard 0.0.1

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.
Files changed (5) hide show
  1. data/License +21 -0
  2. data/README +40 -0
  3. data/lib/wildcard.rb +38 -0
  4. data/test/wildcard_test.rb +43 -0
  5. metadata +57 -0
data/License ADDED
@@ -0,0 +1,21 @@
1
+ Copyright (c) 2009 Doug Peterson
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
+
data/README ADDED
@@ -0,0 +1,40 @@
1
+ To use simply
2
+
3
+ require "WildCard"
4
+ include WildCard
5
+
6
+
7
+ This does the heavy lifting for fancy method_missing calls so you write things like this
8
+
9
+ def say_X_Doug(phrase)
10
+ "Doug says #{phrase}"
11
+ end
12
+
13
+ say_hello_Doug => "Doug says hello"
14
+ say_bye_Doug => "Doug says bye"
15
+
16
+ you can have multiple wildcards
17
+
18
+ def the_X_stole_my_X(animal,possession)
19
+ "The #{animal} stole my fracking #{possession}"
20
+ end
21
+
22
+ the_dog_stole_my_laptop => "The dog stole my fracking laptop"
23
+
24
+ you can have regular params as well
25
+
26
+ def math_X_plus_X_equals(a,b,sum)
27
+ a.to_i + b.to_i == sum
28
+ end
29
+
30
+ math_2_plus_3_equals(5) => true
31
+ math_2_plus_2_equals(5) => false
32
+
33
+ if you do anything like this
34
+ def i_want_X_and_X
35
+ "you are spoiled"
36
+ end
37
+ dont do this
38
+ i_want_and_and_and => "bad things"
39
+
40
+ Have fun and please only use this in logical places
@@ -0,0 +1,38 @@
1
+ module WildCard
2
+ #when the module is included overrides the class method of method missing so you can do MyClass.method type calls
3
+ def WildCard.included(mod)
4
+ def mod.method_missing(method_id, *arguments)
5
+ results=WildCard.wildcard(methods,method_id,*arguments)
6
+ if results then return send(results[0],*results[1]) end
7
+ super
8
+ end
9
+ end
10
+
11
+ def method_missing(method_id , *arguments)
12
+ results=WildCard.wildcard(methods,method_id,*arguments)
13
+ if results then return send(results[0],*results[1]) end
14
+ super
15
+ end
16
+ def self.wildcard methods, method_id, *arguments
17
+ letter="[A-Za-z0-9_]+"
18
+ wildcards=methods.map{|x| x.to_s}.select{|x| x.index('X')}.map{|x| {:name=>x,:parts=>x.split('X')}}
19
+ my_method=wildcards.detect{|x|
20
+ method_id.to_s.match(Regexp.new("^#{x[:parts].join(letter)}#{if x[:name][-1..-1]=='X' then letter end}$"))
21
+ }
22
+ if my_method then
23
+ output=WildCard.remove_strings(method_id.to_s,my_method[:parts]) + arguments
24
+ return [my_method[:name].to_sym, output]
25
+ else
26
+ return nil
27
+ end
28
+ end
29
+ #recursive function that removes instances in to_remove from string and returns an array of the leftovers
30
+ def self.remove_strings(string, to_remove)
31
+ if to_remove.size==0 then
32
+ return (if string=="" then [] else [string] end)
33
+ else
34
+ count=string=~Regexp.new(to_remove.first)
35
+ return (if count==0 then [] else [string[0..(count-1)]] end) + remove_strings(string[(count+to_remove.first.size)..-1],to_remove[1..-1])
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,43 @@
1
+ require 'test/unit'
2
+
3
+ class WildCardTest < Test::Unit::TestCase
4
+ def test_setup #just makes sure that the method is defined
5
+ assert( TestBase.new.the_X_stole_my_X("rat", "cheese") == "The rat stole my fucking cheese")
6
+ end
7
+ def test_x_at_end
8
+ assert( TestBase.new.the_rat_stole_my_cheese == "The rat stole my fucking cheese")
9
+ assert( TestBase.new.the_big_rat_stole_my_small_cheese == "The big_rat stole my fucking small_cheese")
10
+ end
11
+ def test_confusing
12
+ assert( TestBase.new.i_want_cat_and_dog_and_rat_and_mouse_for_xmas == "cat,dog,rat,mouse")
13
+ assert( TestBase.new.i_want_cat_and_cat_and_cat_and_cat_for_xmas == "cat,cat,cat,cat")
14
+ end
15
+ def test_too_many_params
16
+ assert( TestBase.new.math_4_plus_3_equals 7)
17
+ end
18
+ def test_class_methods
19
+ assert( TestBase.helloDoug=="Doug")
20
+ end
21
+
22
+ end
23
+ class TestBase
24
+ require "../lib/wildcard"
25
+ include WildCard
26
+ def the_X_stole_my_X(animal,something)
27
+ "The #{animal} stole my fucking #{something}"
28
+ end
29
+ def hello_X_how_are_you(name)
30
+ "goodbye #{name}"
31
+ end
32
+ def i_want_X_and_X_and_X_and_X_for_xmas(one,two,three,four)
33
+ "#{one},#{two},#{three},#{four}"
34
+ end
35
+ def math_X_plus_X_equals(a,b,sum)
36
+ a.to_i + b.to_i == sum
37
+ end
38
+ def self.helloX(name)
39
+ name
40
+ end
41
+ end
42
+
43
+
metadata ADDED
@@ -0,0 +1,57 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dougp-wildcard
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Doug Peterson
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-05-16 00:00:00 -07:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description:
17
+ email: dougp757
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files: []
23
+
24
+ files:
25
+ - License
26
+ - README
27
+ - lib/wildcard.rb
28
+ - test/wildcard_test.rb
29
+ has_rdoc: false
30
+ homepage: http://github.com/dougp/wildcard
31
+ licenses:
32
+ post_install_message:
33
+ rdoc_options: []
34
+
35
+ require_paths:
36
+ - lib
37
+ required_ruby_version: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: "0"
42
+ version:
43
+ required_rubygems_version: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: "0"
48
+ version:
49
+ requirements: []
50
+
51
+ rubyforge_project:
52
+ rubygems_version: 1.3.5
53
+ signing_key:
54
+ specification_version: 2
55
+ summary: Easy readable method missing
56
+ test_files: []
57
+