method_pattern 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +13 -8
- data/lib/method_pattern.rb +14 -10
- data/lib/method_pattern/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ad178a56d4c759b0776f91601fde1f40eff08221
|
4
|
+
data.tar.gz: 9d6117c475302d52b9047edcd87efa69db7b27e4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b3ce4ef3f75239681c4939961a8c6d0102a8f20d7a3579a1a88fbbe0be9951092981a1997b4d0b9f7b4ac6b7f7fe651ca6d2e90cde6afcff2ccfb8a3827fbeca
|
7
|
+
data.tar.gz: b151bc6df67519d9e88af1dc24726e825d5243a2ed1b097895613e662501b6d2d26262b40488820aa55fe07f311f221667075e2991009018663b09c65cebf135
|
data/README.md
CHANGED
@@ -57,14 +57,19 @@ This example will handle 0 and 1 as special cases and all other integers are fun
|
|
57
57
|
|
58
58
|
Notice that we could pass in a class or even a range for our pattern. There are several things we can use:
|
59
59
|
|
60
|
-
- Strings: `with('hello') { ... }`
|
61
|
-
- Numbers: `with(15) { ... }`
|
62
|
-
- Symbol: `with(:foo) { ... }`
|
63
|
-
- Class: `with(Integer) { ... }`
|
64
|
-
- Regex: `with(/foo/) { ... }`
|
65
|
-
- Range: `with(0...10) { ... }`
|
66
|
-
|
67
|
-
|
60
|
+
- Strings: `with('hello') { |str| ... }` matches an exact string
|
61
|
+
- Numbers: `with(15) { |num| ... }` matches an exact number
|
62
|
+
- Symbol: `with(:foo) { |sym| ... }` matches a particular symbol
|
63
|
+
- Class: `with(Integer) { |num| ... }` matches any instance of the given class
|
64
|
+
- Regex: `with(/foo/) { |str| ... }` matches any string that matches the regex
|
65
|
+
- Range: `with(0...10) { |num| ... }` matches any value covered by the range
|
66
|
+
- Proc/lambda: `with(-> n { n > 3 }) { |n| ... }` matches if the proc returns a truthy value
|
67
|
+
|
68
|
+
Note that the method arguments are passed to the block. This lets the block become the method body.
|
69
|
+
|
70
|
+
### It's not just for single arguments
|
71
|
+
|
72
|
+
You can pass multiple patterns to `with` and it will match them in order:
|
68
73
|
|
69
74
|
```ruby
|
70
75
|
defn :baz do
|
data/lib/method_pattern.rb
CHANGED
@@ -6,7 +6,7 @@ module MethodPattern
|
|
6
6
|
fn.instance_exec(&definition)
|
7
7
|
|
8
8
|
define_method name do |*args, &block|
|
9
|
-
instance_exec(*args, &fn.match(
|
9
|
+
instance_exec(*args, &fn.match(args))
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
@@ -21,12 +21,12 @@ module MethodPattern
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def with *patterns, &block
|
24
|
-
@patterns << Pattern.new(
|
24
|
+
@patterns << Pattern.new(patterns, block)
|
25
25
|
end
|
26
26
|
|
27
|
-
def match
|
27
|
+
def match args
|
28
28
|
@patterns.each do |pattern|
|
29
|
-
if pattern.match?
|
29
|
+
if pattern.match? args
|
30
30
|
return pattern.block
|
31
31
|
end
|
32
32
|
end
|
@@ -37,15 +37,17 @@ module MethodPattern
|
|
37
37
|
class Pattern
|
38
38
|
attr_reader :accepted, :block
|
39
39
|
|
40
|
-
def initialize
|
40
|
+
def initialize accepted, block
|
41
41
|
@accepted = accepted
|
42
42
|
@block = block
|
43
43
|
end
|
44
44
|
|
45
|
-
def match?
|
46
|
-
@accepted.each_with_index
|
47
|
-
|
45
|
+
def match? args
|
46
|
+
@accepted.each_with_index do |pattern, index|
|
47
|
+
return false unless match_arg?(pattern, args[index])
|
48
48
|
end
|
49
|
+
|
50
|
+
true
|
49
51
|
end
|
50
52
|
|
51
53
|
def match_arg? pattern, arg
|
@@ -53,9 +55,11 @@ module MethodPattern
|
|
53
55
|
when Hash
|
54
56
|
return false unless arg.is_a? Hash
|
55
57
|
|
56
|
-
pattern.
|
57
|
-
|
58
|
+
pattern.each do |key, value|
|
59
|
+
return false unless arg.key?(key) && match_arg?(value, arg[key])
|
58
60
|
end
|
61
|
+
|
62
|
+
true
|
59
63
|
else
|
60
64
|
pattern === arg
|
61
65
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: method_pattern
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jamie Gaskins
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-03-
|
11
|
+
date: 2018-03-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|