qo 0.2.0 → 0.2.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.
- checksums.yaml +5 -5
- data/.yardopts +3 -0
- data/README.md +35 -2
- data/Rakefile +65 -13
- data/docs/Qo.html +165 -0
- data/docs/Qo/Exceptions.html +160 -0
- data/docs/Qo/Exceptions/MultipleMatchersProvided.html +257 -0
- data/docs/Qo/Exceptions/NoMatchersProvided.html +257 -0
- data/docs/Qo/Exceptions/NotAllGuardMatchersProvided.html +260 -0
- data/docs/Qo/Helpers.html +382 -0
- data/docs/Qo/Matchers.html +169 -0
- data/docs/Qo/Matchers/ArrayMatcher.html +459 -0
- data/docs/Qo/Matchers/BaseMatcher.html +493 -0
- data/docs/Qo/Matchers/GuardBlockMatcher.html +471 -0
- data/docs/Qo/Matchers/HashMatcher.html +445 -0
- data/docs/Qo/Matchers/PatternMatch.html +551 -0
- data/docs/Qo/PublicApi.html +867 -0
- data/docs/_index.html +258 -0
- data/docs/class_list.html +51 -0
- data/docs/css/common.css +1 -0
- data/docs/css/full_list.css +58 -0
- data/docs/css/style.css +499 -0
- data/docs/file.README.html +701 -0
- data/docs/file_list.html +56 -0
- data/docs/frames.html +17 -0
- data/docs/img/qo_logo.png +0 -0
- data/docs/index.html +701 -0
- data/docs/js/app.js +248 -0
- data/docs/js/full_list.js +216 -0
- data/docs/js/jquery.js +4 -0
- data/docs/method_list.html +227 -0
- data/docs/top-level-namespace.html +110 -0
- data/img/whoa_lemur.png +0 -0
- data/lib/qo/exceptions.rb +8 -4
- data/lib/qo/matchers/array_matcher.rb +34 -12
- data/lib/qo/matchers/base_matcher.rb +26 -11
- data/lib/qo/matchers/guard_block_matcher.rb +17 -3
- data/lib/qo/matchers/hash_matcher.rb +32 -23
- data/lib/qo/matchers/pattern_match.rb +2 -1
- data/lib/qo/public_api.rb +6 -5
- data/lib/qo/version.rb +1 -1
- data/performance_report.txt +73 -24
- data/qo.gemspec +2 -0
- metadata +61 -3
@@ -1,4 +1,16 @@
|
|
1
1
|
module Qo
|
2
|
+
# A Qo Matcher is a class that acts like a Proc. It takes in a set of match
|
3
|
+
# values or key value pairs and a target value to evaluate against, and returns
|
4
|
+
# the status of that match.
|
5
|
+
#
|
6
|
+
# It is possible to override this behavior via `to_proc` overloading and
|
7
|
+
# utilization of `super` as noted in `GuardBlockMatcher`.
|
8
|
+
#
|
9
|
+
# @see Qo::Matchers::GuardBlockMatcher
|
10
|
+
#
|
11
|
+
# @author baweaver
|
12
|
+
# @since 0.2.0
|
13
|
+
#
|
2
14
|
module Matchers
|
3
15
|
# Base instance of matcher which is meant to take in either Array style or
|
4
16
|
# Keyword style arguments to run a match against various datatypes.
|
@@ -6,7 +18,8 @@ module Qo
|
|
6
18
|
# Will delegate responsibilities to either Array or Hash style matchers if
|
7
19
|
# invoked directly.
|
8
20
|
#
|
9
|
-
# @author
|
21
|
+
# @author baweaver
|
22
|
+
# @since 0.2.0
|
10
23
|
#
|
11
24
|
class BaseMatcher
|
12
25
|
def initialize(type, *array_matchers, **keyword_matchers)
|
@@ -19,7 +32,7 @@ module Qo
|
|
19
32
|
#
|
20
33
|
# data.select(&Qo[...])
|
21
34
|
#
|
22
|
-
# @return [Proc]
|
35
|
+
# @return [Proc[Any]]
|
23
36
|
def to_proc
|
24
37
|
@array_matchers.empty? ?
|
25
38
|
Qo::Matchers::HashMatcher.new(@type, **@keyword_matchers).to_proc :
|
@@ -31,7 +44,7 @@ module Qo
|
|
31
44
|
#
|
32
45
|
# @param target [Any] Object to match against
|
33
46
|
#
|
34
|
-
# @return [
|
47
|
+
# @return [Boolean] Result of the match
|
35
48
|
def call(target)
|
36
49
|
self.to_proc.call(target)
|
37
50
|
end
|
@@ -39,12 +52,13 @@ module Qo
|
|
39
52
|
alias_method :===, :call
|
40
53
|
alias_method :[], :call
|
41
54
|
|
42
|
-
#
|
55
|
+
# Runs the relevant match method against the given collection with the
|
56
|
+
# given matcher function.
|
43
57
|
#
|
44
58
|
# @param collection [Enumerable] Any collection that can be enumerated over
|
45
|
-
# @param fn [Proc]
|
59
|
+
# @param fn [Proc] Function to match with
|
46
60
|
#
|
47
|
-
# @return [
|
61
|
+
# @return [Boolean] Result of the match
|
48
62
|
private def match_with(collection, &fn)
|
49
63
|
return collection.any?(&fn) if @type == 'or'
|
50
64
|
return collection.none?(&fn) if @type == 'not'
|
@@ -68,8 +82,9 @@ module Qo
|
|
68
82
|
# typical left bias of `===` can be confusing reading down a page, so
|
69
83
|
# more of a clarity thing than anything. Also makes for nicer stack traces.
|
70
84
|
#
|
71
|
-
# @param target
|
72
|
-
#
|
85
|
+
# @param target [Any]
|
86
|
+
# Target to match against
|
87
|
+
# @param matcher [#===]
|
73
88
|
# Anything that responds to ===, preferably in a unique and entertaining way.
|
74
89
|
#
|
75
90
|
# @return [Boolean]
|
@@ -81,7 +96,7 @@ module Qo
|
|
81
96
|
# obscure errors when running against non-matching types.
|
82
97
|
#
|
83
98
|
# @param target [Any] Object to send to
|
84
|
-
# @param matcher [
|
99
|
+
# @param matcher [#to_sym] Anything that can be coerced into a method name
|
85
100
|
#
|
86
101
|
# @return [Any] Response of sending to the method, or false if failed
|
87
102
|
private def method_send(target, matcher)
|
@@ -92,8 +107,8 @@ module Qo
|
|
92
107
|
|
93
108
|
# Predicate variant of `method_send` with the same guard concerns
|
94
109
|
#
|
95
|
-
# @param target [Any]
|
96
|
-
# @param matcher [
|
110
|
+
# @param target [Any] Object to send to
|
111
|
+
# @param matcher [#to_sym] Anything that can be coerced into a method name
|
97
112
|
#
|
98
113
|
# @return [Boolean] Success status of predicate
|
99
114
|
private def method_matches?(target, matcher)
|
@@ -6,7 +6,21 @@ module Qo
|
|
6
6
|
# It returns tuples of (status, result) in order to prevent masking of
|
7
7
|
# legitimate falsy or nil values returned.
|
8
8
|
#
|
9
|
-
#
|
9
|
+
# Guard Block Matchers are best used with a PatternMatch, and chances are
|
10
|
+
# you're going to want to read that documentation first.
|
11
|
+
#
|
12
|
+
# @example
|
13
|
+
# Qo::Matchers::GuardBlockMatcher == Qo.matcher == Qo.m
|
14
|
+
#
|
15
|
+
# guard_matcher = Qo.m(Integer) { |v| v * 2 }
|
16
|
+
# guard_matcher.call(1) # => [true, 2]
|
17
|
+
# guard_matcher.call(:x) # => [false, false]
|
18
|
+
#
|
19
|
+
# @see Qo::Matchers::PatternMatch
|
20
|
+
# Pattern Match using GuardBlockMatchers
|
21
|
+
#
|
22
|
+
# @author baweaver
|
23
|
+
# @since 0.1.5
|
10
24
|
#
|
11
25
|
class GuardBlockMatcher < BaseMatcher
|
12
26
|
# Identity function that returns its argument directly
|
@@ -25,8 +39,8 @@ module Qo
|
|
25
39
|
# and potentially call through to the associated block if a base
|
26
40
|
# matcher would have passed
|
27
41
|
#
|
28
|
-
# @return [Proc]
|
29
|
-
#
|
42
|
+
# @return [Proc[Any] - (Bool, Any)]
|
43
|
+
# (status, result) tuple
|
30
44
|
def to_proc
|
31
45
|
Proc.new { |target|
|
32
46
|
super[target] ? [true, @fn.call(target)] : NON_MATCH
|
@@ -6,37 +6,46 @@ module Qo
|
|
6
6
|
# In the case of a Hash matching against a Hash, it will compare the intersection
|
7
7
|
# of keys and match the values against eachother.
|
8
8
|
#
|
9
|
+
# ```ruby
|
10
|
+
# Qo[name: /Foo/, age: 30..50].call({name: 'Foo', age: 42})
|
11
|
+
# # => true
|
12
|
+
# ```
|
13
|
+
#
|
9
14
|
# In the case of a Hash matching against an Object, it will treat the keys as
|
10
15
|
# method property invocations to be matched against the provided values.
|
11
16
|
#
|
17
|
+
# # ```ruby
|
18
|
+
# Qo[name: /Foo/, age: 30..50].call(Person.new('Foo', 42))
|
19
|
+
# # => true
|
20
|
+
# ```
|
21
|
+
#
|
12
22
|
# All variants present in the BaseMatcher are present here, including 'and',
|
13
23
|
# 'not', and 'or'.
|
14
24
|
#
|
15
|
-
# @author
|
25
|
+
# @author baweaver
|
26
|
+
# @since 0.2.0
|
16
27
|
#
|
17
28
|
class HashMatcher < BaseMatcher
|
18
|
-
#
|
29
|
+
# Wrapper around call to allow for invocation in an Enumerable function,
|
30
|
+
# such as:
|
19
31
|
#
|
20
|
-
#
|
21
|
-
#
|
22
|
-
#
|
32
|
+
# ```ruby
|
33
|
+
# people.select(&Qo[name: /Foo/, age: 20..40])
|
34
|
+
# ```
|
23
35
|
#
|
24
36
|
# @return [Proc[Any]]
|
25
|
-
#
|
26
|
-
# Object -> Bool # Boolean public send
|
37
|
+
# Proc awaiting a target to match against
|
27
38
|
def to_proc
|
28
39
|
Proc.new { |target| self.call(target) }
|
29
40
|
end
|
30
41
|
|
31
42
|
# Used to match against a matcher made from Keyword Arguments (a Hash)
|
32
43
|
#
|
33
|
-
# @param matchers [Hash[Any,
|
44
|
+
# @param matchers [Hash[Any, #===]]
|
34
45
|
# Any key mapping to any value that responds to `===`. Notedly more
|
35
46
|
# satisfying when `===` does something fun.
|
36
47
|
#
|
37
|
-
# @return [
|
38
|
-
# Hash -> Bool # Value matching against similar keys, will attempt to coerce to_s because JSON
|
39
|
-
# Object -> Bool # Uses keys as methods with public send to `===` match against the value
|
48
|
+
# @return [Boolean] Result of the match
|
40
49
|
def call(target)
|
41
50
|
return true if @keyword_matchers == target
|
42
51
|
|
@@ -49,9 +58,9 @@ module Qo
|
|
49
58
|
|
50
59
|
# Checks if a hash value matches a given matcher
|
51
60
|
#
|
52
|
-
# @param target [Any]
|
53
|
-
# @param match_key [Symbol]
|
54
|
-
# @param matcher [
|
61
|
+
# @param target [Any] Target of the match
|
62
|
+
# @param match_key [Symbol] Key of the hash to reference
|
63
|
+
# @param matcher [#===] Any matcher responding to ===
|
55
64
|
#
|
56
65
|
# @return [Boolean] Match status
|
57
66
|
private def match_hash_value?(target, match_key, matcher)
|
@@ -66,9 +75,9 @@ module Qo
|
|
66
75
|
|
67
76
|
# Checks if an object property matches a given matcher
|
68
77
|
#
|
69
|
-
# @param target [Any]
|
70
|
-
# @param match_property [Symbol]
|
71
|
-
# @param matcher [
|
78
|
+
# @param target [Any] Target of the match
|
79
|
+
# @param match_property [Symbol] Property of the object to reference
|
80
|
+
# @param matcher [#===] Any matcher responding to ===
|
72
81
|
#
|
73
82
|
# @return [Boolean] Match status
|
74
83
|
private def match_object_value?(target, match_property, matcher)
|
@@ -81,9 +90,9 @@ module Qo
|
|
81
90
|
# Double wraps case match in order to ensure that we try against both Symbol
|
82
91
|
# and String variants of the keys, as this is a very common mixup in Ruby.
|
83
92
|
#
|
84
|
-
# @param target [Hash]
|
85
|
-
# @param match_key [Symbol]
|
86
|
-
# @param matcher [
|
93
|
+
# @param target [Hash] Target of the match
|
94
|
+
# @param match_key [Symbol] Key to match against
|
95
|
+
# @param matcher [#===] Matcher
|
87
96
|
#
|
88
97
|
# @return [Boolean]
|
89
98
|
private def hash_case_match?(target, match_key, matcher)
|
@@ -108,9 +117,9 @@ module Qo
|
|
108
117
|
# Attempts to run a case match against a method call derived from a hash
|
109
118
|
# key, and checks the result.
|
110
119
|
#
|
111
|
-
# @param target [Hash]
|
112
|
-
# @param match_property [Symbol]
|
113
|
-
# @param matcher [
|
120
|
+
# @param target [Hash] Target of the match
|
121
|
+
# @param match_property [Symbol] Method to call
|
122
|
+
# @param matcher [#===] Matcher
|
114
123
|
#
|
115
124
|
# @return [Boolean]
|
116
125
|
private def hash_method_case_match?(target, match_property, matcher)
|
data/lib/qo/public_api.rb
CHANGED
@@ -5,7 +5,8 @@ module Qo
|
|
5
5
|
# externally facing methods renamed or moved under pain of a look of profound
|
6
6
|
# disappointment from the creator.
|
7
7
|
#
|
8
|
-
# @author
|
8
|
+
# @author baweaver
|
9
|
+
# @since 0.2.0
|
9
10
|
#
|
10
11
|
module PublicApi
|
11
12
|
include Qo::Exceptions
|
@@ -20,7 +21,7 @@ module Qo
|
|
20
21
|
# @return [Proc[Any]]
|
21
22
|
# Any -> Bool # Given a target, will return if it "matches"
|
22
23
|
def and(*array_matchers, **keyword_matchers)
|
23
|
-
create_matcher('and',
|
24
|
+
create_matcher('and', array_matchers, keyword_matchers)
|
24
25
|
end
|
25
26
|
|
26
27
|
# The magic that lets you use `Qo[...]` instead of `Qo.and(...)`. Use wisely
|
@@ -36,7 +37,7 @@ module Qo
|
|
36
37
|
# @return [Proc[Any]]
|
37
38
|
# Any -> Bool # Given a target, will return if it "matches"
|
38
39
|
def or(*array_matchers, **keyword_matchers)
|
39
|
-
create_matcher('or',
|
40
|
+
create_matcher('or', array_matchers, keyword_matchers)
|
40
41
|
end
|
41
42
|
|
42
43
|
# Creates a `not` type query matcher. No conditions in this type of matcher
|
@@ -49,7 +50,7 @@ module Qo
|
|
49
50
|
# @return [Proc[Any]]
|
50
51
|
# Any -> Bool # Given a target, will return if it "matches"
|
51
52
|
def not(*array_matchers, **keyword_matchers)
|
52
|
-
create_matcher('not',
|
53
|
+
create_matcher('not', array_matchers, keyword_matchers)
|
53
54
|
end
|
54
55
|
|
55
56
|
# Creates a Guard Block matcher.
|
@@ -105,7 +106,7 @@ module Qo
|
|
105
106
|
# @raises Qo::Exceptions::MultipleMatchersProvided
|
106
107
|
#
|
107
108
|
# @return [Qo::Matcher]
|
108
|
-
private def create_matcher(type,
|
109
|
+
private def create_matcher(type, array_matchers, keyword_matchers)
|
109
110
|
array_empty, hash_empty = array_matchers.empty?, keyword_matchers.empty?
|
110
111
|
|
111
112
|
raise Qo::NoMatchersProvided if array_empty && hash_empty
|
data/lib/qo/version.rb
CHANGED
data/performance_report.txt
CHANGED
@@ -1,60 +1,109 @@
|
|
1
|
+
Running on Qo v0.2.0 at commit ba999659acb51beec215fab4240a34298794a5bf
|
1
2
|
|
2
3
|
Array * Array - Literal
|
3
4
|
=======================
|
4
5
|
|
6
|
+
Vanilla result: true
|
7
|
+
Qo.and result: true
|
8
|
+
|
5
9
|
Warming up --------------------------------------
|
6
|
-
Vanilla
|
7
|
-
Qo.and
|
10
|
+
Vanilla 278.882k i/100ms
|
11
|
+
Qo.and 83.044k i/100ms
|
8
12
|
Calculating -------------------------------------
|
9
|
-
Vanilla
|
10
|
-
Qo.and
|
13
|
+
Vanilla 8.950M (± 1.7%) i/s - 44.900M in 5.018406s
|
14
|
+
Qo.and 1.062M (± 1.2%) i/s - 5.315M in 5.003728s
|
11
15
|
|
12
16
|
Comparison:
|
13
|
-
Vanilla:
|
14
|
-
Qo.and:
|
17
|
+
Vanilla: 8949563.3 i/s
|
18
|
+
Qo.and: 1062331.4 i/s - 8.42x slower
|
15
19
|
|
16
20
|
|
17
21
|
Array * Array - Index pattern match
|
18
22
|
===================================
|
19
23
|
|
24
|
+
Vanilla result: true
|
25
|
+
Qo.and result: true
|
26
|
+
|
20
27
|
Warming up --------------------------------------
|
21
|
-
Vanilla
|
22
|
-
Qo.and
|
28
|
+
Vanilla 49.757k i/100ms
|
29
|
+
Qo.and 22.362k i/100ms
|
23
30
|
Calculating -------------------------------------
|
24
|
-
Vanilla
|
25
|
-
Qo.and
|
31
|
+
Vanilla 562.718k (± 4.0%) i/s - 2.836M in 5.048960s
|
32
|
+
Qo.and 238.217k (± 1.7%) i/s - 1.208M in 5.070540s
|
26
33
|
|
27
34
|
Comparison:
|
28
|
-
Vanilla:
|
29
|
-
Qo.and:
|
35
|
+
Vanilla: 562718.0 i/s
|
36
|
+
Qo.and: 238216.8 i/s - 2.36x slower
|
30
37
|
|
31
38
|
|
32
39
|
Array * Object - Predicate match
|
33
40
|
================================
|
34
41
|
|
42
|
+
Vanilla result: false
|
43
|
+
Qo.and result: false
|
44
|
+
|
35
45
|
Warming up --------------------------------------
|
36
|
-
Vanilla
|
37
|
-
Qo.and
|
46
|
+
Vanilla 145.056k i/100ms
|
47
|
+
Qo.and 27.888k i/100ms
|
38
48
|
Calculating -------------------------------------
|
39
|
-
Vanilla 2.
|
40
|
-
Qo.and
|
49
|
+
Vanilla 2.204M (± 4.4%) i/s - 11.024M in 5.011429s
|
50
|
+
Qo.and 323.232k (± 2.4%) i/s - 1.618M in 5.007142s
|
41
51
|
|
42
52
|
Comparison:
|
43
|
-
Vanilla:
|
44
|
-
Qo.and:
|
53
|
+
Vanilla: 2204056.6 i/s
|
54
|
+
Qo.and: 323232.5 i/s - 6.82x slower
|
45
55
|
|
46
56
|
|
47
57
|
Array * Array - Select index pattern match
|
48
58
|
==========================================
|
49
59
|
|
60
|
+
Vanilla result: [["Robert", 22], ["Roberta", 22]]
|
61
|
+
Qo.and result: [["Robert", 22], ["Roberta", 22]]
|
62
|
+
|
63
|
+
Warming up --------------------------------------
|
64
|
+
Vanilla 14.343k i/100ms
|
65
|
+
Qo.and 7.454k i/100ms
|
66
|
+
Calculating -------------------------------------
|
67
|
+
Vanilla 149.518k (± 2.9%) i/s - 760.179k in 5.088601s
|
68
|
+
Qo.and 77.519k (± 2.8%) i/s - 387.608k in 5.004058s
|
69
|
+
|
70
|
+
Comparison:
|
71
|
+
Vanilla: 149517.6 i/s
|
72
|
+
Qo.and: 77519.5 i/s - 1.93x slower
|
73
|
+
|
74
|
+
|
75
|
+
Hash * Hash - Hash intersection
|
76
|
+
===============================
|
77
|
+
|
78
|
+
Vanilla result: [{:name=>"Robert", :age=>22}, {:name=>"Roberta", :age=>22}]
|
79
|
+
Qo.and result: [{:name=>"Robert", :age=>22}, {:name=>"Roberta", :age=>22}]
|
80
|
+
|
81
|
+
Warming up --------------------------------------
|
82
|
+
Vanilla 36.214k i/100ms
|
83
|
+
Qo.and 5.050k i/100ms
|
84
|
+
Calculating -------------------------------------
|
85
|
+
Vanilla 411.041k (± 2.3%) i/s - 2.064M in 5.024556s
|
86
|
+
Qo.and 50.029k (± 5.0%) i/s - 252.500k in 5.060014s
|
87
|
+
|
88
|
+
Comparison:
|
89
|
+
Vanilla: 411041.4 i/s
|
90
|
+
Qo.and: 50028.6 i/s - 8.22x slower
|
91
|
+
|
92
|
+
|
93
|
+
Hash * Object - Property match
|
94
|
+
==============================
|
95
|
+
|
96
|
+
Vanilla result: [#<struct Person name="Robert", age=22>, #<struct Person name="Roberta", age=22>]
|
97
|
+
Qo.and result: [#<struct Person name="Robert", age=22>, #<struct Person name="Roberta", age=22>]
|
98
|
+
|
50
99
|
Warming up --------------------------------------
|
51
|
-
Vanilla
|
52
|
-
Qo.and
|
100
|
+
Vanilla 36.167k i/100ms
|
101
|
+
Qo.and 5.263k i/100ms
|
53
102
|
Calculating -------------------------------------
|
54
|
-
Vanilla
|
55
|
-
Qo.and
|
103
|
+
Vanilla 411.057k (± 3.4%) i/s - 2.062M in 5.021612s
|
104
|
+
Qo.and 52.776k (± 4.0%) i/s - 268.413k in 5.094233s
|
56
105
|
|
57
106
|
Comparison:
|
58
|
-
|
59
|
-
|
107
|
+
Vanilla: 411057.2 i/s
|
108
|
+
Qo.and: 52775.9 i/s - 7.79x slower
|
60
109
|
|
data/qo.gemspec
CHANGED
@@ -26,4 +26,6 @@ Gem::Specification.new do |spec|
|
|
26
26
|
spec.add_development_dependency "guard"
|
27
27
|
spec.add_development_dependency "guard-rspec"
|
28
28
|
spec.add_development_dependency "benchmark-ips"
|
29
|
+
spec.add_development_dependency "yard"
|
30
|
+
spec.add_development_dependency "redcarpet"
|
29
31
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: qo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brandon Weaver
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-04-
|
11
|
+
date: 2018-04-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -94,6 +94,34 @@ dependencies:
|
|
94
94
|
- - ">="
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: yard
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: redcarpet
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
97
125
|
description:
|
98
126
|
email:
|
99
127
|
- keystonelemur@gmail.com
|
@@ -105,6 +133,7 @@ files:
|
|
105
133
|
- ".pryrc"
|
106
134
|
- ".rspec"
|
107
135
|
- ".travis.yml"
|
136
|
+
- ".yardopts"
|
108
137
|
- CODE_OF_CONDUCT.md
|
109
138
|
- Gemfile
|
110
139
|
- Guardfile
|
@@ -114,8 +143,37 @@ files:
|
|
114
143
|
- bin/console
|
115
144
|
- bin/setup
|
116
145
|
- docs/.gitkeep
|
146
|
+
- docs/Qo.html
|
147
|
+
- docs/Qo/Exceptions.html
|
148
|
+
- docs/Qo/Exceptions/MultipleMatchersProvided.html
|
149
|
+
- docs/Qo/Exceptions/NoMatchersProvided.html
|
150
|
+
- docs/Qo/Exceptions/NotAllGuardMatchersProvided.html
|
151
|
+
- docs/Qo/Helpers.html
|
152
|
+
- docs/Qo/Matchers.html
|
153
|
+
- docs/Qo/Matchers/ArrayMatcher.html
|
154
|
+
- docs/Qo/Matchers/BaseMatcher.html
|
155
|
+
- docs/Qo/Matchers/GuardBlockMatcher.html
|
156
|
+
- docs/Qo/Matchers/HashMatcher.html
|
157
|
+
- docs/Qo/Matchers/PatternMatch.html
|
158
|
+
- docs/Qo/PublicApi.html
|
117
159
|
- docs/_config.yml
|
160
|
+
- docs/_index.html
|
161
|
+
- docs/class_list.html
|
162
|
+
- docs/css/common.css
|
163
|
+
- docs/css/full_list.css
|
164
|
+
- docs/css/style.css
|
165
|
+
- docs/file.README.html
|
166
|
+
- docs/file_list.html
|
167
|
+
- docs/frames.html
|
168
|
+
- docs/img/qo_logo.png
|
169
|
+
- docs/index.html
|
170
|
+
- docs/js/app.js
|
171
|
+
- docs/js/full_list.js
|
172
|
+
- docs/js/jquery.js
|
173
|
+
- docs/method_list.html
|
174
|
+
- docs/top-level-namespace.html
|
118
175
|
- img/qo_logo.png
|
176
|
+
- img/whoa_lemur.png
|
119
177
|
- lib/qo.rb
|
120
178
|
- lib/qo/exceptions.rb
|
121
179
|
- lib/qo/helpers.rb
|
@@ -148,7 +206,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
148
206
|
version: '0'
|
149
207
|
requirements: []
|
150
208
|
rubyforge_project:
|
151
|
-
rubygems_version: 2.6
|
209
|
+
rubygems_version: 2.7.6
|
152
210
|
signing_key:
|
153
211
|
specification_version: 4
|
154
212
|
summary: Qo is a querying library for Ruby pattern matching
|