sandthorn_event_filter 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 (35) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +21 -0
  3. data/.travis.yml +5 -0
  4. data/Gemfile +3 -0
  5. data/Gemfile.lock +49 -0
  6. data/LICENSE.txt +22 -0
  7. data/README.md +60 -0
  8. data/Rakefile +13 -0
  9. data/lib/sandthorn_event_filter/event.rb +38 -0
  10. data/lib/sandthorn_event_filter/filter.rb +77 -0
  11. data/lib/sandthorn_event_filter/matchers/aggregate_type_matcher.rb +15 -0
  12. data/lib/sandthorn_event_filter/matchers/attribute_changed_matcher.rb +17 -0
  13. data/lib/sandthorn_event_filter/matchers/block_matcher.rb +15 -0
  14. data/lib/sandthorn_event_filter/matchers/event_name_matcher.rb +15 -0
  15. data/lib/sandthorn_event_filter/matchers/extract.rb +51 -0
  16. data/lib/sandthorn_event_filter/matchers/identity_matcher.rb +9 -0
  17. data/lib/sandthorn_event_filter/matchers/matcher.rb +20 -0
  18. data/lib/sandthorn_event_filter/matchers/matcher_collection.rb +36 -0
  19. data/lib/sandthorn_event_filter/matchers/not_matcher.rb +10 -0
  20. data/lib/sandthorn_event_filter/matchers/sequence_number_matcher.rb +16 -0
  21. data/lib/sandthorn_event_filter/version.rb +3 -0
  22. data/lib/sandthorn_event_filter.rb +7 -0
  23. data/sandthorn_event_filter.gemspec +32 -0
  24. data/spec/data/events.rb +28 -0
  25. data/spec/event_spec.rb +38 -0
  26. data/spec/filter_spec.rb +151 -0
  27. data/spec/matchers/attribute_changed_matcher_spec.rb +48 -0
  28. data/spec/matchers/block_matcher_spec.rb +26 -0
  29. data/spec/matchers/class_matcher_spec.rb +37 -0
  30. data/spec/matchers/event_name_matcher_spec.rb +36 -0
  31. data/spec/matchers/extract_spec.rb +60 -0
  32. data/spec/matchers/matcher_collection_spec.rb +47 -0
  33. data/spec/matchers/sequence_number_matcher_spec.rb +31 -0
  34. data/spec/spec_helper.rb +17 -0
  35. metadata +200 -0
@@ -0,0 +1,151 @@
1
+ require 'spec_helper'
2
+
3
+ module SandthornEventFilter
4
+ describe Filter do
5
+ let(:fake_events) { [:event, :other_event] }
6
+ let(:filter) { Filter.new(fake_events) }
7
+
8
+ describe "basic methods" do
9
+ it "should respond to basic methods" do
10
+ methods = [:each, :first, :last, :length, :empty?, :reject, :[]]
11
+ methods.each do |method|
12
+ expect(filter).to respond_to(method)
13
+ end
14
+ end
15
+ end
16
+
17
+ describe ".initialize" do
18
+
19
+ it "is possible to create an empty filter" do
20
+ expect { Filter.new }.to_not raise_error
21
+ end
22
+
23
+ it "exposes the original events" do
24
+ expect(filter.original_events).to eq(fake_events)
25
+ end
26
+
27
+ it "has a filter chain" do
28
+ expect(filter.matchers).to_not be_nil
29
+ end
30
+ end
31
+
32
+ describe ".events" do
33
+ context "when there are no matchers" do
34
+ it "should return the original events" do
35
+ expect(filter.events).to eq(fake_events)
36
+ end
37
+ end
38
+
39
+ context "when there is a filter" do
40
+ let(:events) { [{ aggregate_type: "Foo" }, { aggregate_type: "Bar" }] }
41
+ it "should return the filtered result" do
42
+ filter = Filter.new(events).extract(types: "Foo")
43
+ filtered_events = filter.events
44
+ expect(filtered_events.length).to eq(1)
45
+ expect(filtered_events).to include(events.first)
46
+ end
47
+ end
48
+ end
49
+
50
+ describe ".apply" do
51
+ let(:events) { [{ aggregate_type: "Foo" }, { aggregate_type: "Bar" }] }
52
+ it "should return the filtered result" do
53
+ filter = Filter.new.extract(types: "Foo")
54
+ filtered_events = filter.apply(events)
55
+ expect(filtered_events.length).to eq(1)
56
+ expect(filtered_events).to include(events.first)
57
+ end
58
+ end
59
+
60
+ describe "chaining" do
61
+ let(:events) { [{aggregate_type: "Foo"}, {aggregate_type: "Bar"}] }
62
+ context "when chaining filters" do
63
+ it "should leave the original filter untouched" do
64
+ filter = Filter.new(events)
65
+ other_filter = filter.extract(types: "Foo")
66
+ expect(filter.events).to eq(events)
67
+ end
68
+
69
+ describe "the new filter" do
70
+ it "should be a new filter instance" do
71
+ filter = Filter.new(events)
72
+ other_filter = filter.extract(types: "Foo")
73
+ expect(other_filter).to_not equal(filter)
74
+ end
75
+
76
+ it "should have the same original events" do
77
+ filter = Filter.new(events)
78
+ other_filter = filter.extract(types: "Foo")
79
+ expect(other_filter.original_events).to eq(filter.original_events)
80
+ end
81
+ end
82
+ end
83
+ end
84
+
85
+ describe ".select and .reject" do
86
+ let(:events) { [{aggregate_type: "Foo"}, {aggregate_type: "Bar"}] }
87
+ it "should return a new filter" do
88
+ filter = Filter.new(events)
89
+ reject = filter.select { |e| e[:aggregate_type] == "Foo" }
90
+ select = filter.reject { |e| e[:aggregate_type] == "Bar" }
91
+ expect(reject).to be_kind_of Filter
92
+ expect(select).to be_kind_of Filter
93
+ expect(select.events).to eq([events.first])
94
+ expect(reject.events).to eq([events.first])
95
+ end
96
+ end
97
+
98
+ end
99
+
100
+ describe 'tests on actual data' do
101
+ let(:events) { SandthornEventFilter::Fixtures::EVENTS }
102
+
103
+ context 'when extracting `new` events' do
104
+ it "should return matching events" do
105
+ new_events_filter = Filter.new(events).extract(events: "new")
106
+ expect(new_events_filter.length).to eq(2)
107
+ event = Event.wrap(new_events_filter.first)
108
+ expect(event.name).to eq("new")
109
+ end
110
+ end
111
+
112
+ context 'when removing `new` events' do
113
+ it "should return matching events" do
114
+ filter = Filter.new(events).remove(events: 'new')
115
+ filtered = filter.events
116
+ expect(filtered.length).to eq(18)
117
+ end
118
+ end
119
+
120
+ context 'when extracting events for an aggregate type' do
121
+ it "should return only matching events" do
122
+ filter = Filter.new(events).extract(types: 'SandthornTest')
123
+ filtered = filter.events
124
+ expect(filtered.length).to eq(1)
125
+ expect(Event.wrap(filtered.first).aggregate_type).to eq("SandthornTest")
126
+ end
127
+ end
128
+
129
+ context 'when removing events for an aggregate type' do
130
+ it "should return matching events" do
131
+ filter = Filter.new(events).remove(types: 'SandthornTest')
132
+ filtered = filter.events
133
+ expect(filtered.length).to eq(19)
134
+ expect(filtered).to all( have_aggregate_type 'SandthornProduct' )
135
+ end
136
+ end
137
+
138
+ context "when extracting events with a changed attribute" do
139
+ it "should return matching events" do
140
+ filter = Filter.new(events).extract(changed_attributes: "name")
141
+ filtered = filter.events
142
+ expect(filtered.length).to eq(11)
143
+ filtered.each do |event|
144
+ expect(Event.wrap(event).attribute_deltas.any? {|delta| delta[:attribute_name] == "name" }).to be_truthy
145
+ end
146
+ end
147
+ end
148
+
149
+ end
150
+
151
+ end
@@ -0,0 +1,48 @@
1
+ require 'spec_helper'
2
+
3
+ module SandthornEventFilter
4
+ module Matchers
5
+ describe AttributeChangedMatcher do
6
+ let(:event) do
7
+ {
8
+ aggregate_id:"555dc484-5727-44b1-a8da-0f85014d7204",
9
+ aggregate_type: "ProductAggregates::Store",
10
+ aggregate_version: 1,
11
+ timestamp: Time.parse("2014-08-05 16:00:40.107738"),
12
+ sequence_number: 3,
13
+ event_name: "new",
14
+ event_args: {
15
+ attribute_deltas: [
16
+ {
17
+ attribute_name: "name",
18
+ new_value: nil,
19
+ old_value: nil
20
+ },
21
+ {
22
+ attribute_name: "description",
23
+ new_value: nil,
24
+ old_value: nil
25
+ }
26
+ ]
27
+ }
28
+ }
29
+ end
30
+
31
+ describe ".match?" do
32
+ context "when given a changed attributes" do
33
+ it "should return true" do
34
+ matcher = AttributeChangedMatcher.new("name")
35
+ expect(matcher.match?(event)).to be_truthy
36
+ end
37
+ end
38
+
39
+ context "when given a non-changed attribute" do
40
+ it "should return false" do
41
+ matcher = AttributeChangedMatcher.new("foo")
42
+ expect(matcher.match?(event)).to be_falsey
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+
3
+ module SandthornEventFilter
4
+ module Matchers
5
+ describe BlockMatcher do
6
+ context "when the given block evaluates to true" do
7
+ it "should match" do
8
+ matcher = BlockMatcher.new do |event|
9
+ true
10
+ end
11
+ expect(matcher.match?({})).to be_truthy
12
+ end
13
+ end
14
+
15
+ context "when the given block evaluates to false" do
16
+ it "shouldn't match" do
17
+ matcher = BlockMatcher.new do |event|
18
+ false
19
+ end
20
+ expect(matcher.match?({})).to be_falsey
21
+ end
22
+ end
23
+
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,37 @@
1
+ require 'spec_helper'
2
+
3
+ module SandthornEventFilter
4
+ module Matchers
5
+ describe AggregateTypeMatcher do
6
+ let(:foo_event) { { aggregate_type: "Foo"} }
7
+ let(:bar_event) { { aggregate_type: "Bar"} }
8
+
9
+ describe ".match?" do
10
+ context "when given one class" do
11
+ context "and given an event of that class" do
12
+ it "should return true" do
13
+ filter = AggregateTypeMatcher.new("Foo")
14
+ expect(filter.match?(foo_event)).to be_truthy
15
+ end
16
+ end
17
+
18
+ context "when given a non-matching event" do
19
+ it "should return false" do
20
+ filter = AggregateTypeMatcher.new("Foo")
21
+ expect(filter.match?(bar_event)).to be_falsey
22
+ end
23
+ end
24
+ end
25
+
26
+ context "when given multiple types" do
27
+ it "should return true if event matches any of the input types" do
28
+ filter = AggregateTypeMatcher.new(["Bar", "Foo"])
29
+ expect(filter.match?(foo_event)).to be_truthy
30
+ expect(filter.match?(bar_event)).to be_truthy
31
+ end
32
+ end
33
+ end
34
+
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ module SandthornEventFilter
4
+ module Matchers
5
+ describe EventNameMatcher do
6
+ let(:foo_event) { { event_name: "Foo"} }
7
+ let(:bar_event) { { event_name: "Bar"} }
8
+
9
+ describe ".match?" do
10
+ context "when given one event name" do
11
+ context "and given an event of that name" do
12
+ it "should return true" do
13
+ filter = EventNameMatcher.new("Foo")
14
+ expect(filter.match?(foo_event)).to be_truthy
15
+ end
16
+ end
17
+
18
+ context "when given a non-matching event" do
19
+ it "should return false" do
20
+ filter = EventNameMatcher.new("Foo")
21
+ expect(filter.match?(bar_event)).to be_falsey
22
+ end
23
+ end
24
+ end
25
+
26
+ context "when given multiple event names" do
27
+ it "should return true if event matches any of the input event names" do
28
+ filter = EventNameMatcher.new(["Bar", "Foo"])
29
+ expect(filter.match?(foo_event)).to be_truthy
30
+ expect(filter.match?(bar_event)).to be_truthy
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,60 @@
1
+ require 'spec_helper'
2
+
3
+ module SandthornEventFilter
4
+ module Matchers
5
+ describe Extract do
6
+ let(:foo_event) { { aggregate_type: "Foo", event_name: "foo" } }
7
+ let(:bar_event) { { aggregate_type: "Bar", event_name: "bar" } }
8
+
9
+ context "when given only class matchers" do
10
+ let(:foo_extractor) { Extract.new(types: "Foo") }
11
+
12
+
13
+ context "when given a matching event" do
14
+ it "should match" do
15
+ expect(foo_extractor.match?(foo_event)).to be_truthy
16
+ end
17
+ end
18
+
19
+ context "when given a non-matching event" do
20
+ it "shouldn't match" do
21
+ expect(foo_extractor.match?(bar_event)).to be_falsey
22
+ end
23
+ end
24
+ end
25
+
26
+ context "when given event_name matchers" do
27
+ let(:foo_extractor) { Extract.new(events: "foo") }
28
+
29
+ context "when given a matching event" do
30
+ it "should match" do
31
+ expect(foo_extractor.match?(foo_event)).to be_truthy
32
+ end
33
+ end
34
+
35
+ context "when given a non-matching event" do
36
+ it "should not match" do
37
+ expect(foo_extractor.match?(bar_event)).to be_falsey
38
+ end
39
+ end
40
+ end
41
+
42
+ context "when given combinations of matchers" do
43
+ let(:combo) { Extract.new(types: "Foo", events: "foo") }
44
+ context "when given an event that matches all of the criteria" do
45
+ it "should match" do
46
+ expect(combo.match?(foo_event)).to be_truthy
47
+ end
48
+ end
49
+
50
+ context "when given a partially matching event" do
51
+ it "should not match" do
52
+ event = { event_name: "foo", aggregate_type: "Baz" }
53
+ expect(combo.match?(event)).to be_falsey
54
+ end
55
+ end
56
+ end
57
+
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,47 @@
1
+ require 'spec_helper'
2
+
3
+ module SandthornEventFilter
4
+ module Matchers
5
+ describe MatcherCollection do
6
+
7
+ let(:events) { [:one, :two, :three] }
8
+ let(:chain) { SandthornEventFilter::Matchers::MatcherCollection.new }
9
+
10
+ describe ".add" do
11
+
12
+ let(:filter) { Object.new }
13
+
14
+ it 'returns a new chain' do
15
+ new_chain = chain.add(filter)
16
+ expect(new_chain).to be_kind_of MatcherCollection
17
+ expect(new_chain).to_not equal(chain)
18
+ end
19
+ it 'adds a filter to the chain' do
20
+ new_chain = chain.add(filter)
21
+ expect(new_chain.matchers).to include(filter)
22
+ end
23
+ end
24
+
25
+ describe ".apply" do
26
+ context "when there are no matchers in the chain" do
27
+ it "should return the original events" do
28
+ expect(chain.matchers).to be_empty
29
+ expect(chain.apply(events)).to eq(events)
30
+ end
31
+ end
32
+
33
+ context "when there are matchers" do
34
+ it "should call match? on the matchers for each event" do
35
+ filters = [IdentityMatcher.new, IdentityMatcher.new]
36
+ new_chain = chain.add(filters)
37
+ filters.each do |filter|
38
+ expect(filter).to receive(:match?).exactly(3).times.and_call_original
39
+ end
40
+ new_chain.apply(events)
41
+ end
42
+ end
43
+ end
44
+
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+
3
+ module SandthornEventFilter
4
+ module Matchers
5
+ describe SequenceNumberMatcher do
6
+ let(:event) do
7
+ {
8
+ sequence_number: 1
9
+ }
10
+ end
11
+
12
+ context "when the event has a larger sequence number" do
13
+ it "should match" do
14
+ sequence_number = event[:sequence_number]
15
+ matcher = SequenceNumberMatcher.new(sequence_number - 1)
16
+ expect(matcher.match?(event)).to be_truthy
17
+ end
18
+ end
19
+
20
+ context "when the event has the same or lower sequence number" do
21
+ it "should not match" do
22
+ sequence_number = event[:sequence_number]
23
+ exact_matcher = SequenceNumberMatcher.new(sequence_number)
24
+ larger_matcher = SequenceNumberMatcher.new(sequence_number + 1)
25
+ expect(exact_matcher.match?(event)).to be_falsey
26
+ expect(larger_matcher.match?(event)).to be_falsey
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,17 @@
1
+ require 'sandthorn_event_filter'
2
+ require './spec/data/events'
3
+
4
+
5
+ RSpec.configure do |config|
6
+ end
7
+ RSpec::Matchers.define :have_name do |expected|
8
+ match do |actual|
9
+ actual[:event_name] == expected
10
+ end
11
+ end
12
+
13
+ RSpec::Matchers.define :have_aggregate_type do |expected|
14
+ match do |actual|
15
+ actual[:aggregate_type] == expected
16
+ end
17
+ end
metadata ADDED
@@ -0,0 +1,200 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sandthorn_event_filter
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Jesper Josefsson
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-08-27 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: pry
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rspec
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: gem-release
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: autotest-standalone
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: dotenv
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: bundler
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.6'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1.6'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rake
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: hamster
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ description:
126
+ email:
127
+ - jesper.josefsson@gmail.com
128
+ executables: []
129
+ extensions: []
130
+ extra_rdoc_files: []
131
+ files:
132
+ - ".gitignore"
133
+ - ".travis.yml"
134
+ - Gemfile
135
+ - Gemfile.lock
136
+ - LICENSE.txt
137
+ - README.md
138
+ - Rakefile
139
+ - lib/sandthorn_event_filter.rb
140
+ - lib/sandthorn_event_filter/event.rb
141
+ - lib/sandthorn_event_filter/filter.rb
142
+ - lib/sandthorn_event_filter/matchers/aggregate_type_matcher.rb
143
+ - lib/sandthorn_event_filter/matchers/attribute_changed_matcher.rb
144
+ - lib/sandthorn_event_filter/matchers/block_matcher.rb
145
+ - lib/sandthorn_event_filter/matchers/event_name_matcher.rb
146
+ - lib/sandthorn_event_filter/matchers/extract.rb
147
+ - lib/sandthorn_event_filter/matchers/identity_matcher.rb
148
+ - lib/sandthorn_event_filter/matchers/matcher.rb
149
+ - lib/sandthorn_event_filter/matchers/matcher_collection.rb
150
+ - lib/sandthorn_event_filter/matchers/not_matcher.rb
151
+ - lib/sandthorn_event_filter/matchers/sequence_number_matcher.rb
152
+ - lib/sandthorn_event_filter/version.rb
153
+ - sandthorn_event_filter.gemspec
154
+ - spec/data/events.rb
155
+ - spec/event_spec.rb
156
+ - spec/filter_spec.rb
157
+ - spec/matchers/attribute_changed_matcher_spec.rb
158
+ - spec/matchers/block_matcher_spec.rb
159
+ - spec/matchers/class_matcher_spec.rb
160
+ - spec/matchers/event_name_matcher_spec.rb
161
+ - spec/matchers/extract_spec.rb
162
+ - spec/matchers/matcher_collection_spec.rb
163
+ - spec/matchers/sequence_number_matcher_spec.rb
164
+ - spec/spec_helper.rb
165
+ homepage: https://github.com/Sandthorn
166
+ licenses:
167
+ - MIT
168
+ metadata: {}
169
+ post_install_message:
170
+ rdoc_options: []
171
+ require_paths:
172
+ - lib
173
+ required_ruby_version: !ruby/object:Gem::Requirement
174
+ requirements:
175
+ - - ">="
176
+ - !ruby/object:Gem::Version
177
+ version: '0'
178
+ required_rubygems_version: !ruby/object:Gem::Requirement
179
+ requirements:
180
+ - - ">="
181
+ - !ruby/object:Gem::Version
182
+ version: '0'
183
+ requirements: []
184
+ rubyforge_project:
185
+ rubygems_version: 2.2.2
186
+ signing_key:
187
+ specification_version: 4
188
+ summary: Composable filters for Sandthorn Events
189
+ test_files:
190
+ - spec/data/events.rb
191
+ - spec/event_spec.rb
192
+ - spec/filter_spec.rb
193
+ - spec/matchers/attribute_changed_matcher_spec.rb
194
+ - spec/matchers/block_matcher_spec.rb
195
+ - spec/matchers/class_matcher_spec.rb
196
+ - spec/matchers/event_name_matcher_spec.rb
197
+ - spec/matchers/extract_spec.rb
198
+ - spec/matchers/matcher_collection_spec.rb
199
+ - spec/matchers/sequence_number_matcher_spec.rb
200
+ - spec/spec_helper.rb