xf 0.0.3 → 0.1.0
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 +4 -4
- data/README.md +54 -10
- data/lib/xf/identity.rb +1 -1
- data/lib/xf/public_api.rb +112 -8
- data/lib/xf/scope.rb +33 -9
- data/lib/xf/trace.rb +108 -0
- data/lib/xf/trace_key_value.rb +22 -0
- data/lib/xf/trace_value.rb +19 -0
- metadata +47 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 62d3af5779614c09634b6f1e53a0507832f1cddc051693f8ccda36fd29cf1862
|
4
|
+
data.tar.gz: 357c3a4807a9e5edb5d82c02ed06be8acd25d7e8e5e3224caeb8d67c2a4ad27d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c76a5dea28717e733bb1938000fe5efaff5ceb8178f6b46b66d86916bcc1217274cafc05cd6bca3cc0f1986b60f1f93524c18dee29748ad8deea1c74a22ebe35
|
7
|
+
data.tar.gz: 44657cd1c09fbd8e624ebcaf807dfc1c705b4434d8bc51084ff735a59b677eb7cc5785188fa7788b6d5d79f7673a3e3b75151b2334cabf765825c954dc89426c
|
data/README.md
CHANGED
@@ -2,8 +2,9 @@
|
|
2
2
|
|
3
3
|
[](http://badge.fury.io/rb/xf)
|
4
4
|
<!-- Replace <id> with Code Climate repository ID. Remove this comment afterwards. -->
|
5
|
-
[](https://codeclimate.com/github/baweaver/xf/maintainability)
|
6
|
+
[](https://codeclimate.com/github/baweaver/xf/test_coverage)
|
7
|
+
[](https://travis-ci.org/baweaver/xf)
|
7
8
|
|
8
9
|
<!-- Tocer[start]: Auto-generated, don't remove. -->
|
9
10
|
|
@@ -26,10 +27,14 @@
|
|
26
27
|
|
27
28
|
## Features
|
28
29
|
|
29
|
-
**Compose**
|
30
|
+
**Compose and Pipe**
|
30
31
|
|
31
32
|
```ruby
|
32
|
-
|
33
|
+
# Read left to right
|
34
|
+
%w(1 2 3 4).map(&Xf.pipe(:to_i, :succ))
|
35
|
+
|
36
|
+
# Read right to left
|
37
|
+
%w(1 2 3 4).map(&Xf.compose(:succ, :to_i))
|
33
38
|
```
|
34
39
|
|
35
40
|
If it looks like a Proc, or can be convinced to become one, it will work there.
|
@@ -55,9 +60,9 @@ Let's try setting a value:
|
|
55
60
|
```ruby
|
56
61
|
people = [{name: "Robert", age: 22}, {name: "Roberta", age: 22}, {name: "Foo", age: 42}, {name: "Bar", age: 18}]
|
57
62
|
|
58
|
-
|
63
|
+
age_scope = Xf.scope(:age)
|
59
64
|
|
60
|
-
older_people = people.map(&
|
65
|
+
older_people = people.map(&age_scope.set { |age| age + 1 })
|
61
66
|
# => [{:name=>"Robert", :age=>23}, {:name=>"Roberta", :age=>23}, {:name=>"Foo", :age=>43}, {:name=>"Bar", :age=>19}]
|
62
67
|
|
63
68
|
people
|
@@ -65,7 +70,7 @@ people
|
|
65
70
|
|
66
71
|
# set! will mutate, for those tough ground in issues:
|
67
72
|
|
68
|
-
older_people = people.map(&
|
73
|
+
older_people = people.map(&age_scope.set! { |age| age + 1 })
|
69
74
|
# => [{:name=>"Robert", :age=>23}, {:name=>"Roberta", :age=>23}, {:name=>"Foo", :age=>43}, {:name=>"Bar", :age=>19}]
|
70
75
|
|
71
76
|
people
|
@@ -75,20 +80,59 @@ people
|
|
75
80
|
It works much the same as `Hash#dig` in that you can pass multiple comma-seperated values as a deeper path:
|
76
81
|
|
77
82
|
```
|
78
|
-
Xf.scope(:children, 0, :name)
|
83
|
+
first_child_scope = Xf.scope(:children, 0, :name)
|
84
|
+
first_child_scope.get.call({name: 'Foo', children: [{name: 'Bar'}]})
|
79
85
|
# => "Bar"
|
80
86
|
|
81
|
-
|
87
|
+
first_child_scope.set('Baz').call({name: 'Foo', children: [{name: 'Bar'}]})
|
82
88
|
# => {:name=>"Foo", :children=>[{:name=>"Baz"}]}
|
83
89
|
```
|
84
90
|
|
85
91
|
That means array indexes work too, and on both `get` and `set` methods!
|
86
92
|
|
93
|
+
**Traces**
|
94
|
+
|
95
|
+
A Trace is a lot like a scope, except it'll keep digging until it finds a
|
96
|
+
matching value. It takes a single path instead of a set like Scope. Currently
|
97
|
+
there are three types:
|
98
|
+
|
99
|
+
* `Trace` - Match on key
|
100
|
+
* `TraceValue` - Match on value
|
101
|
+
* `TraceKeyValue` - Match on both key and value
|
102
|
+
|
103
|
+
Tracers all implement `===` for matchers, which makes them more flexible but also
|
104
|
+
a good deal slower than Scopes. Keep that in mind.
|
105
|
+
|
106
|
+
Let's take a look at a few options real quick. We'll be sampling some data from
|
107
|
+
`people.json`, which is generated from [JSON Generator](https://next.json-generator.com/).
|
108
|
+
|
109
|
+
```ruby
|
110
|
+
require 'json'
|
111
|
+
people = JSON.parse(File.read('people.json'))
|
112
|
+
|
113
|
+
first_name_trace = Xf.trace('first')
|
114
|
+
|
115
|
+
# Remember it gets _all_ matching values, resulting in a nested array. Use
|
116
|
+
# `flat_map` if you want a straight list.
|
117
|
+
people.map(&first_name_trace.get)
|
118
|
+
# => [["Erickson"], ["Pugh"], ["Mullen"], ["Jacquelyn"], ["Miller"], ["Jolene"]]
|
119
|
+
|
120
|
+
# You can even compose them if you want to. Just remember compose
|
121
|
+
people.flat_map(&Xf.compose(first_name_trace.set('Spartacus'), first_name_trace.get))
|
122
|
+
# => ["Spartacus", "Spartacus", "Spartacus", "Spartacus", "Spartacus", "Spartacus"]
|
123
|
+
```
|
124
|
+
|
125
|
+
Depending on requests, I may make a NarrowScope that only returns the first match
|
126
|
+
instead of digging the entire hash. At the moment most of my usecases involve
|
127
|
+
data that's not so kind as to give me that option.
|
128
|
+
|
87
129
|
## Screencasts
|
88
130
|
|
89
131
|
## Requirements
|
90
132
|
|
91
|
-
0. [Ruby 2.
|
133
|
+
0. [Ruby 2.3.x](https://www.ruby-lang.org)
|
134
|
+
|
135
|
+
> **Note**: For development you'll want to be using 2.5.0+ for various rake tasks and other niceties.
|
92
136
|
|
93
137
|
## Setup
|
94
138
|
|
data/lib/xf/identity.rb
CHANGED
data/lib/xf/public_api.rb
CHANGED
@@ -1,25 +1,44 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'xf/scope'
|
4
|
+
require 'xf/trace'
|
5
|
+
require 'xf/trace_value'
|
6
|
+
require 'xf/trace_key_value'
|
4
7
|
|
5
8
|
module Xf
|
6
9
|
module PublicApi
|
7
|
-
#
|
10
|
+
# Combines a list of functions, or items that respond to `to_proc`, into
|
8
11
|
# a function chain that can be called against a target.
|
9
12
|
#
|
13
|
+
# @note
|
14
|
+
# This _could_ be done with reduce, but we're trying to keep performance
|
15
|
+
# as close to vanilla as possible.
|
16
|
+
#
|
10
17
|
# @param *fns [#to_proc] List of objects coercible into Procs
|
11
18
|
#
|
12
19
|
# @return [Proc[Any] -> Any]
|
13
|
-
def
|
14
|
-
chain = fns.map(&:to_proc)
|
15
|
-
|
20
|
+
def pipe(*fns)
|
16
21
|
Proc.new { |target|
|
17
|
-
|
22
|
+
new_value = target
|
23
|
+
fns.each { |fn| new_value = fn.to_proc.call(new_value) }
|
24
|
+
new_value
|
18
25
|
}
|
19
26
|
end
|
20
27
|
|
28
|
+
alias_method :p, :pipe
|
29
|
+
|
30
|
+
# The more traditional functional Compose, where things go in the opposite
|
31
|
+
# order. Pipe is probably more intuitive to Rubyists, which is why this
|
32
|
+
# is an implementation of pipe.
|
33
|
+
#
|
34
|
+
# @see #pipe
|
35
|
+
def compose(*fns)
|
36
|
+
pipe(*fns.reverse)
|
37
|
+
end
|
38
|
+
|
21
39
|
alias_method :c, :compose
|
22
40
|
|
41
|
+
|
23
42
|
# Creates a Scope.
|
24
43
|
#
|
25
44
|
# @see Xf::Scope
|
@@ -28,13 +47,98 @@ module Xf
|
|
28
47
|
# See the README for more instructions on usage. Will likely propogate
|
29
48
|
# more examples here and into the specs later.
|
30
49
|
#
|
31
|
-
# @param *
|
50
|
+
# @param *paths [Array[Any]] Hash#dig accessible segments
|
32
51
|
#
|
33
52
|
# @return [Xf::Scope]
|
34
|
-
def scope(*
|
35
|
-
Scope.new(
|
53
|
+
def scope(*paths)
|
54
|
+
Scope.new(paths.flatten)
|
36
55
|
end
|
37
56
|
|
38
57
|
alias_method :s, :scope
|
58
|
+
|
59
|
+
# Creates a Trace.
|
60
|
+
#
|
61
|
+
# @see Xf::Trace
|
62
|
+
#
|
63
|
+
# @param trace_path [Any]
|
64
|
+
# Any hash key to dive searching for.
|
65
|
+
#
|
66
|
+
# @return [Xf::Trace]
|
67
|
+
def trace(trace_path)
|
68
|
+
Trace.new(trace_path)
|
69
|
+
end
|
70
|
+
|
71
|
+
alias_method :t, :trace
|
72
|
+
|
73
|
+
# Creates a TraceValue, which matches against a value rather than a key.
|
74
|
+
#
|
75
|
+
# @see Xf::TraceValue
|
76
|
+
#
|
77
|
+
# @param trace_path [Any]
|
78
|
+
# Any hash value to dive searching for
|
79
|
+
#
|
80
|
+
# @return [Xf::TraceValue]
|
81
|
+
def trace_value(trace_path)
|
82
|
+
TraceValue.new(trace_path)
|
83
|
+
end
|
84
|
+
|
85
|
+
alias_method :tv, :trace_value
|
86
|
+
|
87
|
+
# Creates a TraceKeyValue, which matches against a value rather than a key.
|
88
|
+
#
|
89
|
+
# @see Xf::TraceKeyValue
|
90
|
+
#
|
91
|
+
# @param trace_path [Any]
|
92
|
+
# Any hash value to dive searching for
|
93
|
+
#
|
94
|
+
# @return [Xf::TraceValue]
|
95
|
+
def trace_key_value(trace_key, trace_value)
|
96
|
+
TraceKeyValue.new(trace_key, trace_value)
|
97
|
+
end
|
98
|
+
|
99
|
+
alias_method :tkv, :trace_key_value
|
100
|
+
|
101
|
+
# Clamps a value to be within a range. Works with numbers, dates, and other
|
102
|
+
# items. More of a utility function.
|
103
|
+
#
|
104
|
+
# @param start_range [Any]
|
105
|
+
# Start of a range
|
106
|
+
#
|
107
|
+
# @param end_range [Any]
|
108
|
+
# End of a range
|
109
|
+
#
|
110
|
+
# @return [Proc[Any] -> Any]
|
111
|
+
# Proc that returns a value that's been clamped to the given range
|
112
|
+
def clamp(start_range, end_range)
|
113
|
+
Proc.new { |target|
|
114
|
+
next start_range if target < start_range
|
115
|
+
next end_range if target > end_range
|
116
|
+
|
117
|
+
target
|
118
|
+
}
|
119
|
+
end
|
120
|
+
|
121
|
+
# Counts by a function. This is entirely because I hackney this everywhere in
|
122
|
+
# pry anyways, so I want a function to do it for me already.
|
123
|
+
#
|
124
|
+
# @param targets [Array[Any]] Targets to count
|
125
|
+
# @param &fn [Proc] Function to define count key
|
126
|
+
#
|
127
|
+
# @return [Hash[Any, Integer]] Counts
|
128
|
+
def count_by(targets, &fn)
|
129
|
+
fn ||= -> v { v }
|
130
|
+
|
131
|
+
targets.each_with_object(Hash.new(0)) { |target, counts|
|
132
|
+
counts[fn[target]] += 1
|
133
|
+
}
|
134
|
+
end
|
135
|
+
|
136
|
+
# Solely meant as a tap addendum
|
137
|
+
#
|
138
|
+
# @return [Proc[Any] -> nil]
|
139
|
+
# nil from puts result
|
140
|
+
def log
|
141
|
+
Proc.new { |target| puts target }
|
142
|
+
end
|
39
143
|
end
|
40
144
|
end
|
data/lib/xf/scope.rb
CHANGED
@@ -48,32 +48,56 @@ module Xf
|
|
48
48
|
Proc.new { |hash| set_value!(hash, value, &fn) }
|
49
49
|
end
|
50
50
|
|
51
|
-
#
|
52
|
-
#
|
53
|
-
|
54
|
-
|
51
|
+
# Direct value getter, though it may be wiser to use Hash#dig here
|
52
|
+
# instead if you're concerned about speed.
|
53
|
+
#
|
54
|
+
# @param hash [Hash] Hash to get value from
|
55
|
+
#
|
56
|
+
# @return [Any]
|
57
|
+
def get_value(hash)
|
55
58
|
hash.dig(*@paths)
|
56
59
|
end
|
57
60
|
|
58
|
-
|
61
|
+
# Sets a value at the bottom of a path without mutating the original.
|
62
|
+
#
|
63
|
+
# @param hash [Hash]
|
64
|
+
# Hash to set value on
|
65
|
+
#
|
66
|
+
# @param value = nil [Any]
|
67
|
+
# Value to set
|
68
|
+
#
|
69
|
+
# @param &fn [Proc]
|
70
|
+
# If present, current value is yielded to it and the return
|
71
|
+
# value is the new set value
|
72
|
+
#
|
73
|
+
# @return [Hash]
|
74
|
+
# Clone of the original with the value set
|
75
|
+
def set_value(hash, value = nil, &fn)
|
59
76
|
set_value!(deep_clone(hash), value, &fn)
|
60
77
|
end
|
61
78
|
|
62
|
-
|
79
|
+
# Mutating form of `#set_value`
|
80
|
+
#
|
81
|
+
# @see set_value
|
82
|
+
def set_value!(hash, value = nil, &fn)
|
63
83
|
lead_in = @paths[0..-2]
|
64
84
|
target_key = @paths[-1]
|
65
85
|
|
66
|
-
|
86
|
+
new_hash = hash
|
87
|
+
lead_in.each { |s| new_hash = new_hash[s] }
|
67
88
|
|
68
89
|
new_value = block_given? ?
|
69
|
-
yield(
|
90
|
+
yield(new_hash[target_key]) :
|
70
91
|
value
|
71
92
|
|
72
|
-
|
93
|
+
new_hash[target_key] = new_value
|
73
94
|
|
74
95
|
hash
|
75
96
|
end
|
76
97
|
|
98
|
+
# Private API - Methods below here are subject to change, please don't use
|
99
|
+
# them directly.
|
100
|
+
|
77
101
|
private def deep_clone(hash)
|
78
102
|
Marshal.load(Marshal.dump(hash))
|
79
103
|
end
|
data/lib/xf/trace.rb
ADDED
@@ -0,0 +1,108 @@
|
|
1
|
+
module Xf
|
2
|
+
# A more abstract version of a Scope in which the lead key is treated as
|
3
|
+
# if it could be anywhere in a hash tree. A Trace will dive until it
|
4
|
+
# finds _all_ matching nodes.
|
5
|
+
#
|
6
|
+
# Note that this can potentially be slow, but is also very difficult to emulate
|
7
|
+
# succinctly inline in vanilla Ruby.
|
8
|
+
#
|
9
|
+
# @author baweaver
|
10
|
+
# @since 0.1.0
|
11
|
+
#
|
12
|
+
class Trace
|
13
|
+
# Creates a Scope
|
14
|
+
#
|
15
|
+
# @param trace_path [Any]
|
16
|
+
# What node to try and locate
|
17
|
+
#
|
18
|
+
# @return [Xf::Trace]
|
19
|
+
def initialize(trace_path)
|
20
|
+
@trace_path = trace_path
|
21
|
+
end
|
22
|
+
|
23
|
+
def get
|
24
|
+
Proc.new { |target| get_value(target) }
|
25
|
+
end
|
26
|
+
|
27
|
+
def get_value(hash)
|
28
|
+
retrieved_values = []
|
29
|
+
|
30
|
+
recursing_dive(hash) { |h, k, v| retrieved_values.push(v) }
|
31
|
+
|
32
|
+
retrieved_values
|
33
|
+
end
|
34
|
+
|
35
|
+
# Sets a value in a Hash
|
36
|
+
#
|
37
|
+
# @param value = nil [Any]
|
38
|
+
# Value to set at the target
|
39
|
+
#
|
40
|
+
# @param &fn [Proc]
|
41
|
+
# Block to yield target value to. Returned value will be set as the new
|
42
|
+
# value at the target.
|
43
|
+
#
|
44
|
+
# @return [Proc[Hash] -> Hash]
|
45
|
+
# New Hash with transformation applied
|
46
|
+
def set(value = nil, &fn)
|
47
|
+
Proc.new { |hash| set_value(hash, value, &fn) }
|
48
|
+
end
|
49
|
+
|
50
|
+
# Mutates a value in a Hash
|
51
|
+
#
|
52
|
+
# @see #set
|
53
|
+
#
|
54
|
+
# @note
|
55
|
+
# This method does the same thing as `#set`, except that it mutates the
|
56
|
+
# target value instead of creating a clone first.
|
57
|
+
#
|
58
|
+
def set!(value = nil, &fn)
|
59
|
+
Proc.new { |hash| set_value!(hash, value, &fn) }
|
60
|
+
end
|
61
|
+
|
62
|
+
def set_value(hash, value = nil, &fn)
|
63
|
+
set_value!(deep_clone(hash), value, &fn)
|
64
|
+
end
|
65
|
+
|
66
|
+
def set_value!(hash, value = nil, &fn)
|
67
|
+
recursing_dive(hash) { |h, k, v|
|
68
|
+
h[k] = block_given? ? yield(v) : value
|
69
|
+
}
|
70
|
+
|
71
|
+
hash
|
72
|
+
end
|
73
|
+
|
74
|
+
# Private API - Methods below here are subject to change, please don't use
|
75
|
+
# them directly.
|
76
|
+
|
77
|
+
# Match is defined as having complete access to a hash, key, and value
|
78
|
+
# to make it easier to override for other future fun tasks.
|
79
|
+
#
|
80
|
+
# In the base case of trace we only _really_ care about the key matching
|
81
|
+
# for speed reasons. If you really want power though you could rig this
|
82
|
+
# up to work with Qo to query things.
|
83
|
+
#
|
84
|
+
# @param hash [Hash] [description]
|
85
|
+
# @param key [Any] [description]
|
86
|
+
# @param value [Any] [description]
|
87
|
+
# @param matcher [#===] [description]
|
88
|
+
#
|
89
|
+
# @return [type] [description]
|
90
|
+
private def match?(hash, key, value, matcher)
|
91
|
+
matcher === key
|
92
|
+
end
|
93
|
+
|
94
|
+
private def deep_clone(hash)
|
95
|
+
Marshal.load(Marshal.dump(hash))
|
96
|
+
end
|
97
|
+
|
98
|
+
private def recursing_dive(target_hash, &fn)
|
99
|
+
target_hash.each { |k, v|
|
100
|
+
yield(target_hash, k, v) if match?(target_hash, k, v, @trace_path)
|
101
|
+
|
102
|
+
next unless target_hash[k].is_a?(Hash)
|
103
|
+
|
104
|
+
recursing_dive(target_hash[k], &fn)
|
105
|
+
}
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Xf
|
2
|
+
# Traces based on a key and a value matching. Only overrides the `match?`
|
3
|
+
# method to redefine a matched node.
|
4
|
+
#
|
5
|
+
# @author baweaver
|
6
|
+
# @since 0.1.0
|
7
|
+
#
|
8
|
+
class TraceKeyValue < Trace
|
9
|
+
def initialize(trace_key, trace_value)
|
10
|
+
@trace_key = trace_key
|
11
|
+
@trace_value = trace_value
|
12
|
+
end
|
13
|
+
|
14
|
+
# Private API - Methods below here are subject to change, please don't use
|
15
|
+
# them directly.
|
16
|
+
|
17
|
+
# @see Trace#match?
|
18
|
+
private def match?(hash, key, value, matcher)
|
19
|
+
@trace_key === key && @trace_value === value
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Xf
|
2
|
+
# Traces based on a value matching. Only overrides the `match?`
|
3
|
+
# method to redefine a matched node.
|
4
|
+
#
|
5
|
+
# @see Xf::Trace
|
6
|
+
#
|
7
|
+
# @author baweaver
|
8
|
+
# @since 0.1.0
|
9
|
+
#
|
10
|
+
class TraceValue < Trace
|
11
|
+
# Private API - Methods below here are subject to change, please don't use
|
12
|
+
# them directly.
|
13
|
+
|
14
|
+
# @see Trace#match?
|
15
|
+
private def match?(hash, key, value, matcher)
|
16
|
+
matcher === value
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
metadata
CHANGED
@@ -1,71 +1,71 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: xf
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brandon Weaver
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-04-
|
11
|
+
date: 2018-04-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: gemsmith
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '0
|
19
|
+
version: '12.0'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '0
|
26
|
+
version: '12.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: git-cop
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '2.2'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '2.2'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: bundler-audit
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '0.6'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
54
|
+
version: '0.6'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: codeclimate-test-reporter
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
61
|
+
version: '1.0'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '
|
68
|
+
version: '1.0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: guard-rspec
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -164,6 +164,34 @@ dependencies:
|
|
164
164
|
- - "~>"
|
165
165
|
- !ruby/object:Gem::Version
|
166
166
|
version: '0.54'
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: benchmark-ips
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - ">="
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '0'
|
174
|
+
type: :development
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - ">="
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: '0'
|
181
|
+
- !ruby/object:Gem::Dependency
|
182
|
+
name: qo
|
183
|
+
requirement: !ruby/object:Gem::Requirement
|
184
|
+
requirements:
|
185
|
+
- - "~>"
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
version: '0.2'
|
188
|
+
type: :development
|
189
|
+
prerelease: false
|
190
|
+
version_requirements: !ruby/object:Gem::Requirement
|
191
|
+
requirements:
|
192
|
+
- - "~>"
|
193
|
+
- !ruby/object:Gem::Version
|
194
|
+
version: '0.2'
|
167
195
|
description:
|
168
196
|
email:
|
169
197
|
- keystonelemur@gmail.com
|
@@ -179,6 +207,9 @@ files:
|
|
179
207
|
- lib/xf/identity.rb
|
180
208
|
- lib/xf/public_api.rb
|
181
209
|
- lib/xf/scope.rb
|
210
|
+
- lib/xf/trace.rb
|
211
|
+
- lib/xf/trace_key_value.rb
|
212
|
+
- lib/xf/trace_value.rb
|
182
213
|
homepage: https://www.github.com/baweaver/xf
|
183
214
|
licenses:
|
184
215
|
- MIT
|
@@ -192,9 +223,9 @@ require_paths:
|
|
192
223
|
- lib
|
193
224
|
required_ruby_version: !ruby/object:Gem::Requirement
|
194
225
|
requirements:
|
195
|
-
- - "
|
226
|
+
- - ">="
|
196
227
|
- !ruby/object:Gem::Version
|
197
|
-
version: '
|
228
|
+
version: '0'
|
198
229
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
199
230
|
requirements:
|
200
231
|
- - ">="
|