tree_filter 1.0.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1e4aed6475c535ad77186d563ce4eb1aae077440
4
- data.tar.gz: b6aaf6e676e1c2fd16022e37aea6fa47a713c828
3
+ metadata.gz: 09010d265cf27cdf7d25e64aa810b3dc49e6ae65
4
+ data.tar.gz: 35ef59923c919d9ec6cbaea1d508cce9fffedd7a
5
5
  SHA512:
6
- metadata.gz: 155685535bc93a517363950614df705167ea5209f099fdca991fc6528788ff281bb1719ea5d64f14dcf1f1a19e3a27d109e7c23af1d7514350dfb0930a8a7233
7
- data.tar.gz: d79a3622fb629cdccdfb1a677accd723002b43fed72a26d460d927ce28b0a5220b480eb2d0d5163ae54b081708d891d3573ac00e390df14e56e0d6d3da4d9b88
6
+ metadata.gz: f4a10c49c5a6606ed4577fbdc498a7dd429253b0a3d1740bae0879be2842bed79ff1cf80f4c720a1b3d86a19a26bc597cd55e9941965282282760b4c837a5959
7
+ data.tar.gz: 11e5bba35645c9ed5854fbf1c3df24eb55eeda04f462da58d3b1cd9f0b03752ba5aa0f2f824cea258bdf6dde0fb2a33adce66f5467167a7532e746cd437d04a4
data/HISTORY.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # Tree Filter History
2
2
 
3
+ ## 1.0.1 - 25 March 2015
4
+
5
+ * Correctly expand Leaf nodes inside arrays and hashes.
6
+
3
7
  ## 1.0.0 - 18 March 2015
4
8
 
5
9
  * Initial release!
@@ -75,10 +75,16 @@ class TreeFilter
75
75
  class NullSlice
76
76
  def filter(x)
77
77
  case x
78
- when Leaf
79
- filter(x.left)
78
+ when Hash
79
+ x.each_with_object({}) do |(k, v), h|
80
+ h[k] = filter(v)
81
+ end
82
+ when Array
83
+ x.map {|y| filter(y) }
80
84
  when Defer
81
85
  filter(x.call)
86
+ when Leaf
87
+ filter(x.left)
82
88
  else
83
89
  x
84
90
  end
@@ -86,10 +92,6 @@ class TreeFilter
86
92
  end
87
93
 
88
94
  Slice = Struct.new(:attrs) do
89
- def inspect
90
- "<Slice #{@attrs.inspect}>"
91
- end
92
-
93
95
  def initialize(attrs = {})
94
96
  super
95
97
  @attrs = attrs
@@ -115,16 +117,7 @@ class TreeFilter
115
117
  slices.each_with_object({}) do |(attr, slice), ret|
116
118
  slice ||= NullSlice.new
117
119
 
118
- val = value[attr]
119
-
120
- filtered = case val
121
- when Array
122
- val.map {|x| slice.filter(x) }
123
- else
124
- slice.filter(val)
125
- end
126
-
127
- ret[attr] = filtered
120
+ ret[attr] = slice.filter(value[attr])
128
121
  end
129
122
  when Array
130
123
  value.map {|x| filter(x) }
@@ -1,5 +1,11 @@
1
1
  require 'json'
2
2
 
3
+ require 'simplecov'
4
+ SimpleCov.minimum_coverage 100
5
+ SimpleCov.start do
6
+ add_filter "/vendor/bundle/"
7
+ end
8
+
3
9
  require 'tree_filter'
4
10
 
5
11
  describe 'Tree filter spec:' do
@@ -7,6 +13,12 @@ describe 'Tree filter spec:' do
7
13
  TreeFilter.new(input).filter(data)
8
14
  end
9
15
 
16
+ describe 'inspecting' do
17
+ it 'is readable' do
18
+ expect(TreeFilter.new("*").inspect).to include("<TreeFilter")
19
+ end
20
+ end
21
+
10
22
  describe 'filtering a hash' do
11
23
  it 'only includes specified attributes' do
12
24
  data = {'a' => 1, 'b' => 2, 'c' => 3}
@@ -42,7 +54,7 @@ describe 'Tree filter spec:' do
42
54
  expect(filter(data, 'a')).to eq('a' => 1)
43
55
  end
44
56
 
45
- it 'filters defered evaluations' do
57
+ it 'filters deferred evaluations' do
46
58
  data = {
47
59
  'a' => TreeFilter::Defer.new(->{{'b' => 1, 'c' => 2}}),
48
60
  }
@@ -50,6 +62,42 @@ describe 'Tree filter spec:' do
50
62
  expect(filter(data, 'a[b]')).to eq('a' => {'b' => 1})
51
63
  end
52
64
 
65
+ it 'expands leafs in defers' do
66
+ data = {
67
+ 'a' => TreeFilter::Defer.new(->{
68
+ TreeFilter::Leaf.new('/a', {'b' => 1, 'c' => 2})
69
+ }),
70
+ }
71
+
72
+ expect(filter(data, 'a[b]')).to eq('a' => {'b' => 1})
73
+ expect(filter(data, 'a')).to eq('a' => '/a')
74
+ expect(filter(data, '*')).to eq('a' => '/a')
75
+ end
76
+
77
+ it 'expands leafs in deferred arrays' do
78
+ data = {
79
+ 'a' => TreeFilter::Defer.new(->{[
80
+ TreeFilter::Leaf.new('/a', {'b' => 1, 'c' => 2})
81
+ ]}),
82
+ }
83
+
84
+ expect(filter(data, 'a[b]')).to eq('a' => [{'b' => 1}])
85
+ expect(filter(data, 'a')).to eq('a' => ['/a'])
86
+ expect(filter(data, '*')).to eq('a' => ['/a'])
87
+ end
88
+
89
+ it 'expands leafs in deferred hashes' do
90
+ data = {
91
+ 'a' => TreeFilter::Defer.new(->{{
92
+ 'b' => TreeFilter::Leaf.new('/b', {'c' => 2})
93
+ }}),
94
+ }
95
+
96
+ expect(filter(data, 'a[b[*]]')).to eq('a' => {'b' => {'c' => 2}})
97
+ expect(filter(data, 'a')).to eq('a' => {'b' => '/b'})
98
+ expect(filter(data, 'a[*]')).to eq('a' => {'b' => '/b'})
99
+ end
100
+
53
101
  it 'allows cyclic references with defer' do
54
102
  data = {
55
103
  'a' => TreeFilter::Leaf.new(1, TreeFilter::Defer.new(->{ data }))
@@ -72,6 +120,28 @@ describe 'Tree filter spec:' do
72
120
  expect(filter(data, 'a[id]')).to eq('a' => {'id' => 'a'})
73
121
  end
74
122
 
123
+ it 'allows leaf alternation in an array' do
124
+ data = {'a' => [TreeFilter::Leaf.new('/a', 'id' => 'a', 'name' => 'b')]}
125
+
126
+ expect(filter(data, 'a')).to eq('a' => ['/a'])
127
+ expect(filter(data, 'a[id]')).to eq('a' => [{'id' => 'a'}])
128
+ end
129
+
130
+ it 'allows leaf alternation in a hash' do
131
+ data = {'a' => {
132
+ 'b' => TreeFilter::Leaf.new('/b', 'id' => 'b', 'name' => 'b')
133
+ }}
134
+
135
+ expect(filter(data, 'a')).to eq('a' => {'b' => '/b'})
136
+ expect(filter(data, 'a[b]')).to eq('a' => {'b' => '/b'})
137
+ expect(filter(data, 'a[*]')).to eq('a' => {'b' => '/b'})
138
+ expect(filter(data, 'a[b[id]]')).to eq('a' => {'b' => {'id' => 'b'}})
139
+ expect(filter(data, 'a[b[*]]')).to eq('a' => {'b' => {
140
+ 'id' => 'b',
141
+ 'name' => 'b'
142
+ }})
143
+ end
144
+
75
145
  it 'allows recursive leaf alternation' do
76
146
  data = {'a' => TreeFilter::Leaf.new('',
77
147
  'b' => TreeFilter::Leaf.new('/b', 'f')
@@ -22,6 +22,6 @@ Gem::Specification.new do |gem|
22
22
  gem.name = "tree_filter"
23
23
  gem.require_paths = ["lib"]
24
24
  gem.license = "Apache 2.0"
25
- gem.version = '1.0.0'
25
+ gem.version = '1.0.1'
26
26
  gem.has_rdoc = false
27
27
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tree_filter
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Xavier Shay
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-19 00:00:00.000000000 Z
11
+ date: 2015-03-26 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Filter arbitrary data trees with a concise query language.
14
14
  email: