jace 0.0.3 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.circleci/config.yml +38 -13
- data/Dockerfile +2 -2
- data/README.md +38 -5
- data/config/yardstick.yml +10 -3
- data/jace.gemspec +12 -12
- data/lib/jace/dispatcher.rb +17 -1
- data/lib/jace/executer.rb +39 -1
- data/lib/jace/registry.rb +78 -0
- data/lib/jace/version.rb +1 -1
- data/lib/jace.rb +2 -1
- data/spec/integration/readme/jace/registry_spec.rb +30 -0
- data/spec/integration/yard/jace/registry_spec.rb +46 -0
- data/spec/lib/jace/dispatcher_spec.rb +31 -0
- data/spec/lib/jace/executer_spec.rb +34 -0
- data/spec/lib/jace/registry_spec.rb +246 -0
- data/spec/support/models/context.rb +5 -0
- data/spec/support/models/person.rb +5 -1
- data/spec/support/models/some_context.rb +15 -0
- metadata +33 -29
- data/scripts/build.sh +0 -47
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ba76568b768021abe49c12d16b285e9f9ac0d3d631074a1aa8e8d1619d8d397f
|
4
|
+
data.tar.gz: 17a86c3dbe926f9e2fd111eb6c67190421c8d455ffc35c1e9c8b4dab40c80070
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f156ad1797a018d5c3d16c114156c1613a21315b6707c398471702d90dc7d692a89cf53b14b66631ed33d80a28557eca9e123413339497cff6b8d441f0a9b9d7
|
7
|
+
data.tar.gz: f16a65b15e85ce825edbe8c105ee2a8bb1575831be2e83faa83d8decf64f2bd11fffea311841c4b82420ce551a208819c3ee231ac0dc32567cfdbbdfc4a8e315
|
data/.circleci/config.yml
CHANGED
@@ -1,13 +1,28 @@
|
|
1
1
|
version: 2
|
2
2
|
workflows:
|
3
3
|
version: 2
|
4
|
-
test:
|
4
|
+
test-and-build:
|
5
5
|
jobs:
|
6
|
-
-
|
6
|
+
- test:
|
7
|
+
filters:
|
8
|
+
tags:
|
9
|
+
only: /.*/
|
10
|
+
- checks:
|
11
|
+
filters:
|
12
|
+
tags:
|
13
|
+
only: /.*/
|
14
|
+
- build-and-release:
|
15
|
+
requires: [test, checks]
|
16
|
+
filters:
|
17
|
+
tags:
|
18
|
+
only: /\d+\.\d+\.\d+/
|
19
|
+
branches:
|
20
|
+
only:
|
21
|
+
- master
|
7
22
|
jobs:
|
8
23
|
test:
|
9
24
|
docker:
|
10
|
-
- image: darthjee/
|
25
|
+
- image: darthjee/circleci_ruby_270:1.1.0
|
11
26
|
environment:
|
12
27
|
PROJECT: jace
|
13
28
|
steps:
|
@@ -21,12 +36,22 @@ jobs:
|
|
21
36
|
- run:
|
22
37
|
name: RSpec
|
23
38
|
command: bundle exec rspec
|
24
|
-
- run:
|
25
|
-
name: Rubocop
|
26
|
-
command: rubocop
|
27
39
|
- run:
|
28
40
|
name: Coverage Test Report
|
29
41
|
command: cc-test-reporter after-build --exit-code $?
|
42
|
+
checks:
|
43
|
+
docker:
|
44
|
+
- image: darthjee/circleci_ruby_270:1.1.0
|
45
|
+
environment:
|
46
|
+
PROJECT: jace
|
47
|
+
steps:
|
48
|
+
- checkout
|
49
|
+
- run:
|
50
|
+
name: Bundle Install
|
51
|
+
command: bundle install
|
52
|
+
- run:
|
53
|
+
name: Rubocop
|
54
|
+
command: rubocop
|
30
55
|
- run:
|
31
56
|
name: Yardstick coverage check
|
32
57
|
command: bundle exec rake verify_measurements
|
@@ -41,20 +66,20 @@ jobs:
|
|
41
66
|
command: check_specs
|
42
67
|
build-and-release:
|
43
68
|
docker:
|
44
|
-
- image: darthjee/
|
69
|
+
- image: darthjee/circleci_ruby_270:1.1.0
|
45
70
|
environment:
|
46
71
|
PROJECT: jace
|
47
72
|
steps:
|
48
73
|
- checkout
|
49
74
|
- run:
|
50
|
-
name:
|
51
|
-
command:
|
75
|
+
name: Bundle Install
|
76
|
+
command: bundle install
|
52
77
|
- run:
|
53
|
-
name:
|
54
|
-
command:
|
78
|
+
name: Signin
|
79
|
+
command: build_gem.sh signin
|
55
80
|
- run:
|
56
81
|
name: Build Gem
|
57
|
-
command:
|
82
|
+
command: build_gem.sh build
|
58
83
|
- run:
|
59
84
|
name: Push Gem
|
60
|
-
command:
|
85
|
+
command: build_gem.sh push
|
data/Dockerfile
CHANGED
data/README.md
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
Jace
|
2
|
+
====
|
3
3
|
[![Code Climate](https://codeclimate.com/github/darthjee/jace/badges/gpa.svg)](https://codeclimate.com/github/darthjee/jace)
|
4
4
|
[![Test Coverage](https://codeclimate.com/github/darthjee/jace/badges/coverage.svg)](https://codeclimate.com/github/darthjee/jace/coverage)
|
5
5
|
[![Issue Count](https://codeclimate.com/github/darthjee/jace/badges/issue_count.svg)](https://codeclimate.com/github/darthjee/jace)
|
@@ -11,23 +11,56 @@ Sinclair
|
|
11
11
|
|
12
12
|
Yard Documentation
|
13
13
|
-------------------
|
14
|
-
[https://www.rubydoc.info/gems/jace/0.0
|
14
|
+
[https://www.rubydoc.info/gems/jace/0.1.0](https://www.rubydoc.info/gems/jace/0.1.0)
|
15
|
+
|
16
|
+
Jace is designed to have a semi event driven development
|
17
|
+
|
18
|
+
Using `Jace::Registry`, event handlers can be registered to events, and when an event
|
19
|
+
is triggered, the block that triggers it is given to Jace, which will triger, around it,
|
20
|
+
the +before+ and +after+ handlers
|
15
21
|
|
16
22
|
Installation
|
17
23
|
---------------
|
18
24
|
|
19
25
|
- Install it
|
20
26
|
|
21
|
-
```
|
27
|
+
```bash
|
22
28
|
gem install jace
|
23
29
|
```
|
24
30
|
|
25
31
|
- Or add Sinclair to your `Gemfile` and `bundle install`:
|
26
32
|
|
27
|
-
```
|
33
|
+
```bash
|
28
34
|
gem 'jace'
|
29
35
|
```
|
30
36
|
|
31
37
|
```bash
|
32
38
|
bundle install jace
|
33
39
|
```
|
40
|
+
|
41
|
+
Using
|
42
|
+
-----
|
43
|
+
|
44
|
+
Initialize a registry, register event handlers nad trigger events
|
45
|
+
|
46
|
+
```ruby
|
47
|
+
class SomeContext
|
48
|
+
def do_something(instant)
|
49
|
+
puts "doing something #{instant}"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
registry = described_class.new
|
54
|
+
context = SomeContext.new
|
55
|
+
|
56
|
+
registry.register(:the_event) { do_something(:after) }
|
57
|
+
registry.register(:the_event, :before) { do_something(:before) }
|
58
|
+
|
59
|
+
registry.trigger(:the_event, context) do
|
60
|
+
context.do_something(:middle)
|
61
|
+
end
|
62
|
+
|
63
|
+
# puts 'doing something before',
|
64
|
+
# puts 'doing something middle',
|
65
|
+
# puts 'doing something after'
|
66
|
+
```
|
data/config/yardstick.yml
CHANGED
@@ -15,13 +15,20 @@ rules:
|
|
15
15
|
exclude: []
|
16
16
|
ExampleTag:
|
17
17
|
enabled: true
|
18
|
-
exclude:
|
18
|
+
exclude:
|
19
|
+
- Jace::Registry#registry
|
20
|
+
- Jace::Registry#events
|
19
21
|
ReturnTag:
|
20
22
|
enabled: true
|
21
|
-
exclude:
|
23
|
+
exclude:
|
24
|
+
- Jace::Executer#before
|
25
|
+
- Jace::Executer#after
|
22
26
|
Summary::Presence:
|
23
27
|
enabled: true
|
24
|
-
exclude:
|
28
|
+
exclude:
|
29
|
+
- Jace::Dispatcher#initialize
|
30
|
+
- Jace::Executer#initialize
|
31
|
+
- Jace::Registry#initialize
|
25
32
|
Summary::Length:
|
26
33
|
enabled: true
|
27
34
|
exclude: []
|
data/jace.gemspec
CHANGED
@@ -19,20 +19,20 @@ Gem::Specification.new do |gem|
|
|
19
19
|
gem.test_files = gem.files.grep(%r{^(test|gem|features)/})
|
20
20
|
gem.require_paths = ['lib']
|
21
21
|
|
22
|
-
gem.add_development_dependency 'bundler', '
|
23
|
-
gem.add_development_dependency 'pry', '0.
|
24
|
-
gem.add_development_dependency 'pry-nav', '0.
|
22
|
+
gem.add_development_dependency 'bundler', '2.3.20'
|
23
|
+
gem.add_development_dependency 'pry', '0.14.1'
|
24
|
+
gem.add_development_dependency 'pry-nav', '1.0.0'
|
25
25
|
gem.add_development_dependency 'rake', '13.0.1'
|
26
|
-
gem.add_development_dependency 'reek', '
|
27
|
-
gem.add_development_dependency 'rspec', '3.
|
28
|
-
gem.add_development_dependency 'rspec-core', '3.
|
29
|
-
gem.add_development_dependency 'rspec-expectations', '3.
|
30
|
-
gem.add_development_dependency 'rspec-mocks', '3.
|
31
|
-
gem.add_development_dependency 'rspec-support', '3.
|
26
|
+
gem.add_development_dependency 'reek', '6.0.3'
|
27
|
+
gem.add_development_dependency 'rspec', '3.11.0'
|
28
|
+
gem.add_development_dependency 'rspec-core', '3.11.0'
|
29
|
+
gem.add_development_dependency 'rspec-expectations', '3.11.0'
|
30
|
+
gem.add_development_dependency 'rspec-mocks', '3.11.1'
|
31
|
+
gem.add_development_dependency 'rspec-support', '3.11.0'
|
32
32
|
gem.add_development_dependency 'rubocop', '0.80.1'
|
33
33
|
gem.add_development_dependency 'rubocop-rspec', '1.38.1'
|
34
|
-
gem.add_development_dependency 'rubycritic', '4.
|
35
|
-
gem.add_development_dependency 'simplecov', '0.
|
36
|
-
gem.add_development_dependency 'yard', '0.9.
|
34
|
+
gem.add_development_dependency 'rubycritic', '4.7.0'
|
35
|
+
gem.add_development_dependency 'simplecov', '0.21.2'
|
36
|
+
gem.add_development_dependency 'yard', '0.9.27'
|
37
37
|
gem.add_development_dependency 'yardstick', '0.9.9'
|
38
38
|
end
|
data/lib/jace/dispatcher.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Jace
|
4
|
-
# @api
|
4
|
+
# @api private
|
5
5
|
# @author Darthjee
|
6
6
|
#
|
7
7
|
# Class responsible for dispatching the call of events
|
@@ -34,5 +34,21 @@ module Jace
|
|
34
34
|
private
|
35
35
|
|
36
36
|
attr_reader :before, :after
|
37
|
+
|
38
|
+
# @method before
|
39
|
+
# @private
|
40
|
+
# @api private
|
41
|
+
#
|
42
|
+
# Contains a list of event handlers to be called before
|
43
|
+
#
|
44
|
+
# @return [Array<Object>] list of handlers
|
45
|
+
|
46
|
+
# @method after
|
47
|
+
# @private
|
48
|
+
# @api private
|
49
|
+
#
|
50
|
+
# Contains a list of event handlers to be called after
|
51
|
+
#
|
52
|
+
# @return [Array<Object>] list of handlers
|
37
53
|
end
|
38
54
|
end
|
data/lib/jace/executer.rb
CHANGED
@@ -31,7 +31,7 @@ module Jace
|
|
31
31
|
# @return (see .call)
|
32
32
|
def call
|
33
33
|
execute_actions(before)
|
34
|
-
result = block.call
|
34
|
+
result = block.call if block
|
35
35
|
execute_actions(after)
|
36
36
|
|
37
37
|
result
|
@@ -51,6 +51,44 @@ module Jace
|
|
51
51
|
|
52
52
|
attr_reader :before, :after, :context, :block
|
53
53
|
|
54
|
+
# @method before
|
55
|
+
# @private
|
56
|
+
# @api private
|
57
|
+
#
|
58
|
+
# Contains a list of event handlers to be called before
|
59
|
+
#
|
60
|
+
# @return (see Jace::Dispatcher#before)
|
61
|
+
|
62
|
+
# @method after
|
63
|
+
# @private
|
64
|
+
# @api private
|
65
|
+
#
|
66
|
+
# Contains a list of event handlers to be called after
|
67
|
+
#
|
68
|
+
# @return (see Jace::Dispatcher#after)
|
69
|
+
|
70
|
+
# @method context
|
71
|
+
# @private
|
72
|
+
# @api private
|
73
|
+
#
|
74
|
+
# context where the events handlers will be executed
|
75
|
+
#
|
76
|
+
# all the method calls inside the event handler will be evaluated
|
77
|
+
# from within the context
|
78
|
+
#
|
79
|
+
# @return [Object]
|
80
|
+
|
81
|
+
# @method block
|
82
|
+
# @private
|
83
|
+
# @api private
|
84
|
+
#
|
85
|
+
# block to be executed representing the event
|
86
|
+
#
|
87
|
+
# the block is executed after the +before+ handlers
|
88
|
+
# and before the +after+ handlers
|
89
|
+
#
|
90
|
+
# @return [Proc]
|
91
|
+
|
54
92
|
# @private
|
55
93
|
#
|
56
94
|
# Perform actions from list
|
@@ -0,0 +1,78 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Jace
|
4
|
+
# @api public
|
5
|
+
# @author Darthjee
|
6
|
+
#
|
7
|
+
# Class responsible for registering handlers to events
|
8
|
+
class Registry
|
9
|
+
# Event & Handlers registry
|
10
|
+
#
|
11
|
+
# @return [Hash] map of all events and the registered handlers
|
12
|
+
def registry
|
13
|
+
@registry ||= {}
|
14
|
+
end
|
15
|
+
|
16
|
+
# Registered events
|
17
|
+
#
|
18
|
+
# @return [Array<Symbol>]
|
19
|
+
def events
|
20
|
+
registry.keys
|
21
|
+
end
|
22
|
+
|
23
|
+
# Register a handler to an event
|
24
|
+
#
|
25
|
+
# @param event [Symbol,String] event name
|
26
|
+
# @param instant [Symbol] intant where the handler will be ran (before or
|
27
|
+
# after)
|
28
|
+
# @param block [Proc] block to be executed when the event is called
|
29
|
+
#
|
30
|
+
# @return [Array<Proc>]
|
31
|
+
#
|
32
|
+
# @example registering an event
|
33
|
+
# registry = described_class.new
|
34
|
+
#
|
35
|
+
# registry.register(:the_event) do
|
36
|
+
# do_something_after
|
37
|
+
# end
|
38
|
+
#
|
39
|
+
# registry.register(:the_event, :before) do
|
40
|
+
# do_something_before
|
41
|
+
# end
|
42
|
+
def register(event, instant = :after, &block)
|
43
|
+
registry[event.to_sym] ||= {}
|
44
|
+
registry[event.to_sym][instant] ||= []
|
45
|
+
registry[event.to_sym][instant] << block
|
46
|
+
end
|
47
|
+
|
48
|
+
# Triggers an event
|
49
|
+
# @param event [Symbol,String] event to be triggered
|
50
|
+
# @param context [Object] context where the events will be ran
|
51
|
+
#
|
52
|
+
# @return [Object] the result of the block call
|
53
|
+
#
|
54
|
+
# @example triggering an event
|
55
|
+
# class SomeContext
|
56
|
+
# def do_something(instant)
|
57
|
+
# puts "doing something #{instant}"
|
58
|
+
# end
|
59
|
+
# end
|
60
|
+
#
|
61
|
+
# registry = described_class.new
|
62
|
+
# context = SomeContext.new
|
63
|
+
#
|
64
|
+
# registry.register(:the_event) { do_something(:after) }
|
65
|
+
# registry.register(:the_event, :before) { do_something(:before) }
|
66
|
+
#
|
67
|
+
# registry.trigger(:the_event, context) do
|
68
|
+
# context.do_something(:middle)
|
69
|
+
# end
|
70
|
+
#
|
71
|
+
# # puts 'doing something before',
|
72
|
+
# # puts 'doing something middle',
|
73
|
+
# # puts 'doing something after'
|
74
|
+
def trigger(event, context, &block)
|
75
|
+
Dispatcher.new(registry[event.to_sym] || {}).dispatch(context, &block)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
data/lib/jace/version.rb
CHANGED
data/lib/jace.rb
CHANGED
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Jace::Registry do
|
6
|
+
describe 'yard' do
|
7
|
+
subject(:registry) { described_class.new }
|
8
|
+
|
9
|
+
let(:context) { SomeContext.new }
|
10
|
+
let(:expected_texts) do
|
11
|
+
[
|
12
|
+
'doing something before',
|
13
|
+
'doing something middle',
|
14
|
+
'doing something after'
|
15
|
+
]
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'runs the event handlers' do
|
19
|
+
registry.register(:the_event) { do_something(:after) }
|
20
|
+
registry.register(:the_event, :before) { do_something(:before) }
|
21
|
+
|
22
|
+
registry.trigger(:the_event, context) do
|
23
|
+
context.do_something(:middle)
|
24
|
+
end
|
25
|
+
|
26
|
+
expect(context.text)
|
27
|
+
.to eq(expected_texts)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Jace::Registry do
|
6
|
+
describe 'yard' do
|
7
|
+
subject(:registry) { described_class.new }
|
8
|
+
|
9
|
+
describe '#register' do
|
10
|
+
it 'register a new handler for an event' do
|
11
|
+
registry.register(:the_event) do
|
12
|
+
do_something_after
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'register a new handler for before an event' do
|
17
|
+
registry.register(:the_event, :before) do
|
18
|
+
do_something_before
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe '#trigger' do
|
24
|
+
let(:context) { SomeContext.new }
|
25
|
+
let(:expected_texts) do
|
26
|
+
[
|
27
|
+
'doing something before',
|
28
|
+
'doing something middle',
|
29
|
+
'doing something after'
|
30
|
+
]
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'runs the event handlers' do
|
34
|
+
registry.register(:the_event) { do_something(:after) }
|
35
|
+
registry.register(:the_event, :before) { do_something(:before) }
|
36
|
+
|
37
|
+
registry.trigger(:the_event, context) do
|
38
|
+
context.do_something(:middle)
|
39
|
+
end
|
40
|
+
|
41
|
+
expect(context.text)
|
42
|
+
.to eq(expected_texts)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -153,5 +153,36 @@ describe Jace::Dispatcher do
|
|
153
153
|
end
|
154
154
|
end
|
155
155
|
end
|
156
|
+
|
157
|
+
context 'when no block is provided' do
|
158
|
+
let(:result) do
|
159
|
+
dispatcher.dispatch(person)
|
160
|
+
end
|
161
|
+
|
162
|
+
it do
|
163
|
+
expect(result).to be_nil
|
164
|
+
end
|
165
|
+
|
166
|
+
context 'when handlers are given' do
|
167
|
+
let(:before) { :init_age }
|
168
|
+
let(:after) { :init_height }
|
169
|
+
|
170
|
+
it do
|
171
|
+
expect(result).to be_nil
|
172
|
+
end
|
173
|
+
|
174
|
+
it 'calls before handler' do
|
175
|
+
expect { result }
|
176
|
+
.to change(person, :age)
|
177
|
+
.to(1)
|
178
|
+
end
|
179
|
+
|
180
|
+
it 'calls after handler' do
|
181
|
+
expect { result }
|
182
|
+
.to change(person, :height)
|
183
|
+
.to(178)
|
184
|
+
end
|
185
|
+
end
|
186
|
+
end
|
156
187
|
end
|
157
188
|
end
|
@@ -140,5 +140,39 @@ describe Jace::Executer do
|
|
140
140
|
end
|
141
141
|
end
|
142
142
|
end
|
143
|
+
|
144
|
+
context 'when no block is provided' do
|
145
|
+
let(:result) do
|
146
|
+
described_class.call(context: person)
|
147
|
+
end
|
148
|
+
|
149
|
+
it do
|
150
|
+
expect(result).to be_nil
|
151
|
+
end
|
152
|
+
|
153
|
+
context 'when handlers are given' do
|
154
|
+
let(:result) do
|
155
|
+
described_class.call(
|
156
|
+
before: :init_age, after: :init_height, context: person
|
157
|
+
)
|
158
|
+
end
|
159
|
+
|
160
|
+
it do
|
161
|
+
expect(result).to be_nil
|
162
|
+
end
|
163
|
+
|
164
|
+
it 'calls before handler' do
|
165
|
+
expect { result }
|
166
|
+
.to change(person, :age)
|
167
|
+
.to(1)
|
168
|
+
end
|
169
|
+
|
170
|
+
it 'calls after handler' do
|
171
|
+
expect { result }
|
172
|
+
.to change(person, :height)
|
173
|
+
.to(178)
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
143
177
|
end
|
144
178
|
end
|
@@ -0,0 +1,246 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Jace::Registry do
|
6
|
+
subject(:registry) { described_class.new }
|
7
|
+
|
8
|
+
describe '#register' do
|
9
|
+
let(:event_name) { :event_name }
|
10
|
+
let(:expected_registry) do
|
11
|
+
{ event_name: { after: [Proc] } }
|
12
|
+
end
|
13
|
+
|
14
|
+
context 'when event is a symbol' do
|
15
|
+
it 'adds even to events registry' do
|
16
|
+
expect { registry.register(event_name) {} }
|
17
|
+
.to change(registry, :registry)
|
18
|
+
.to(expected_registry)
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'adds event to event list' do
|
22
|
+
expect { registry.register(event_name) {} }
|
23
|
+
.to change(registry, :events)
|
24
|
+
.by([:event_name])
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
context 'when event is a string' do
|
29
|
+
let(:event_name) { 'event_name' }
|
30
|
+
let(:expected_registry) do
|
31
|
+
{ event_name: { after: [Proc] } }
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'adds even to events registry' do
|
35
|
+
expect { registry.register(event_name) {} }
|
36
|
+
.to change(registry, :registry)
|
37
|
+
.to(expected_registry)
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'adds event to event list' do
|
41
|
+
expect { registry.register(event_name) {} }
|
42
|
+
.to change(registry, :events)
|
43
|
+
.by([:event_name])
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
context 'when the event was already registerd' do
|
48
|
+
let(:expected_registry) do
|
49
|
+
{ event_name: { after: [Proc, Proc] } }
|
50
|
+
end
|
51
|
+
|
52
|
+
before { registry.register(event_name) {} }
|
53
|
+
|
54
|
+
it 'adds even a callback to the event registry' do
|
55
|
+
expect { registry.register(event_name) {} }
|
56
|
+
.to change(registry, :registry)
|
57
|
+
.to(expected_registry)
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'adds event to event list' do
|
61
|
+
expect { registry.register(event_name) {} }
|
62
|
+
.not_to(change(registry, :events))
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
context 'when another event was already registerd' do
|
67
|
+
let(:expected_registry) do
|
68
|
+
{
|
69
|
+
event_name: { after: [Proc] },
|
70
|
+
other_event_name: { after: [Proc] }
|
71
|
+
}
|
72
|
+
end
|
73
|
+
|
74
|
+
before { registry.register(:other_event_name) {} }
|
75
|
+
|
76
|
+
it 'adds even a callback to the event registry' do
|
77
|
+
expect { registry.register(event_name) {} }
|
78
|
+
.to change(registry, :registry)
|
79
|
+
.to(expected_registry)
|
80
|
+
end
|
81
|
+
|
82
|
+
it 'adds event to event list' do
|
83
|
+
expect { registry.register(event_name) {} }
|
84
|
+
.to change(registry, :events)
|
85
|
+
.by([:event_name])
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
context 'when registering for another instant' do
|
90
|
+
let(:expected_registry) do
|
91
|
+
{
|
92
|
+
event_name: { before: [Proc] }
|
93
|
+
}
|
94
|
+
end
|
95
|
+
|
96
|
+
it 'adds even a callback to the event registry' do
|
97
|
+
expect { registry.register(event_name, :before) {} }
|
98
|
+
.to change(registry, :registry)
|
99
|
+
.to(expected_registry)
|
100
|
+
end
|
101
|
+
|
102
|
+
it 'adds event to event list' do
|
103
|
+
expect { registry.register(event_name) {} }
|
104
|
+
.to change(registry, :events)
|
105
|
+
.by([:event_name])
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
context 'when registering for another instant of an exiosting event' do
|
110
|
+
let(:expected_registry) do
|
111
|
+
{
|
112
|
+
event_name: { before: [Proc], after: [Proc] }
|
113
|
+
}
|
114
|
+
end
|
115
|
+
|
116
|
+
before { registry.register(event_name, :after) {} }
|
117
|
+
|
118
|
+
it 'adds even a callback to the event registry' do
|
119
|
+
expect { registry.register(event_name, :before) {} }
|
120
|
+
.to change(registry, :registry)
|
121
|
+
.to(expected_registry)
|
122
|
+
end
|
123
|
+
|
124
|
+
it 'does not add event to event list' do
|
125
|
+
expect { registry.register(event_name) {} }
|
126
|
+
.not_to(change(registry, :events))
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
describe '#trigger' do
|
132
|
+
let(:event_name) { :event_name }
|
133
|
+
let(:context) { instance_double(Context) }
|
134
|
+
|
135
|
+
context 'when an event handler has been registered' do
|
136
|
+
before do
|
137
|
+
allow(context).to receive(:method_call)
|
138
|
+
allow(context).to receive(:other_method)
|
139
|
+
registry.register(event_name) { method_call }
|
140
|
+
end
|
141
|
+
|
142
|
+
it 'execute the event handler' do
|
143
|
+
registry.trigger(event_name, context) {}
|
144
|
+
expect(context).to have_received(:method_call)
|
145
|
+
end
|
146
|
+
|
147
|
+
it 'execute the block' do
|
148
|
+
registry.trigger(event_name, context) { context.other_method }
|
149
|
+
expect(context).to have_received(:other_method)
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
context 'when many event handlers have been registered' do
|
154
|
+
before do
|
155
|
+
allow(context).to receive(:method_call)
|
156
|
+
allow(context).to receive(:another_method_call)
|
157
|
+
allow(context).to receive(:other_method)
|
158
|
+
|
159
|
+
registry.register(event_name) { method_call }
|
160
|
+
registry.register(event_name) { another_method_call }
|
161
|
+
end
|
162
|
+
|
163
|
+
it 'execute the event handler' do
|
164
|
+
registry.trigger(event_name, context) {}
|
165
|
+
expect(context).to have_received(:method_call)
|
166
|
+
end
|
167
|
+
|
168
|
+
it 'execute the other event handler' do
|
169
|
+
registry.trigger(event_name, context) {}
|
170
|
+
expect(context).to have_received(:another_method_call)
|
171
|
+
end
|
172
|
+
|
173
|
+
it 'execute the block' do
|
174
|
+
registry.trigger(event_name, context) { context.other_method }
|
175
|
+
expect(context).to have_received(:other_method).once
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
context 'when another event handler has been registered' do
|
180
|
+
before do
|
181
|
+
allow(context).to receive(:method_call)
|
182
|
+
allow(context).to receive(:other_method)
|
183
|
+
registry.register(:other_event) { method_call }
|
184
|
+
end
|
185
|
+
|
186
|
+
it 'does not execute the event handler' do
|
187
|
+
registry.trigger(event_name, context) {}
|
188
|
+
expect(context).not_to have_received(:method_call)
|
189
|
+
end
|
190
|
+
|
191
|
+
it 'execute the block' do
|
192
|
+
registry.trigger(event_name, context) { context.other_method }
|
193
|
+
expect(context).to have_received(:other_method)
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
context 'when an event handler has not been registered' do
|
198
|
+
before do
|
199
|
+
allow(context).to receive(:other_method)
|
200
|
+
end
|
201
|
+
|
202
|
+
it 'execute the block' do
|
203
|
+
registry.trigger(event_name, context) { context.other_method }
|
204
|
+
expect(context).to have_received(:other_method)
|
205
|
+
end
|
206
|
+
end
|
207
|
+
|
208
|
+
context 'when no block is given' do
|
209
|
+
before do
|
210
|
+
allow(context).to receive(:method_call)
|
211
|
+
|
212
|
+
registry.register(event_name) { method_call }
|
213
|
+
end
|
214
|
+
|
215
|
+
it 'execute the event handler' do
|
216
|
+
registry.trigger(event_name, context)
|
217
|
+
|
218
|
+
expect(context).to have_received(:method_call)
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
222
|
+
describe 'order execution' do
|
223
|
+
let(:context) { SomeContext.new }
|
224
|
+
let(:expected_texts) do
|
225
|
+
[
|
226
|
+
'doing something before',
|
227
|
+
'doing something middle',
|
228
|
+
'doing something after'
|
229
|
+
]
|
230
|
+
end
|
231
|
+
|
232
|
+
before do
|
233
|
+
registry.register(:the_event) { do_something(:after) }
|
234
|
+
registry.register(:the_event, :before) { do_something(:before) }
|
235
|
+
end
|
236
|
+
|
237
|
+
it 'runs the event handlers in order' do
|
238
|
+
registry.trigger(:the_event, context) do
|
239
|
+
context.do_something(:middle)
|
240
|
+
end
|
241
|
+
|
242
|
+
expect(context.text).to eq(expected_texts)
|
243
|
+
end
|
244
|
+
end
|
245
|
+
end
|
246
|
+
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
class Person
|
4
|
-
attr_accessor :age
|
4
|
+
attr_accessor :age, :height
|
5
5
|
|
6
6
|
def brothers
|
7
7
|
@brothers ||= 0
|
@@ -9,6 +9,10 @@ class Person
|
|
9
9
|
|
10
10
|
private
|
11
11
|
|
12
|
+
def init_height
|
13
|
+
@height = 178
|
14
|
+
end
|
15
|
+
|
12
16
|
def init_age
|
13
17
|
@age ||= 1
|
14
18
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jace
|
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
|
- DarthJee
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-08-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -16,42 +16,42 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - '='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 2.3.20
|
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:
|
26
|
+
version: 2.3.20
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: pry
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - '='
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 0.
|
33
|
+
version: 0.14.1
|
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: 0.
|
40
|
+
version: 0.14.1
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: pry-nav
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - '='
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 0.
|
47
|
+
version: 1.0.0
|
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: 0.
|
54
|
+
version: 1.0.0
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rake
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -72,84 +72,84 @@ dependencies:
|
|
72
72
|
requirements:
|
73
73
|
- - '='
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version:
|
75
|
+
version: 6.0.3
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - '='
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version:
|
82
|
+
version: 6.0.3
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: rspec
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
87
|
- - '='
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: 3.
|
89
|
+
version: 3.11.0
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - '='
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: 3.
|
96
|
+
version: 3.11.0
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: rspec-core
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
101
|
- - '='
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version: 3.
|
103
|
+
version: 3.11.0
|
104
104
|
type: :development
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
108
|
- - '='
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version: 3.
|
110
|
+
version: 3.11.0
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
name: rspec-expectations
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
114
114
|
requirements:
|
115
115
|
- - '='
|
116
116
|
- !ruby/object:Gem::Version
|
117
|
-
version: 3.
|
117
|
+
version: 3.11.0
|
118
118
|
type: :development
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
122
|
- - '='
|
123
123
|
- !ruby/object:Gem::Version
|
124
|
-
version: 3.
|
124
|
+
version: 3.11.0
|
125
125
|
- !ruby/object:Gem::Dependency
|
126
126
|
name: rspec-mocks
|
127
127
|
requirement: !ruby/object:Gem::Requirement
|
128
128
|
requirements:
|
129
129
|
- - '='
|
130
130
|
- !ruby/object:Gem::Version
|
131
|
-
version: 3.
|
131
|
+
version: 3.11.1
|
132
132
|
type: :development
|
133
133
|
prerelease: false
|
134
134
|
version_requirements: !ruby/object:Gem::Requirement
|
135
135
|
requirements:
|
136
136
|
- - '='
|
137
137
|
- !ruby/object:Gem::Version
|
138
|
-
version: 3.
|
138
|
+
version: 3.11.1
|
139
139
|
- !ruby/object:Gem::Dependency
|
140
140
|
name: rspec-support
|
141
141
|
requirement: !ruby/object:Gem::Requirement
|
142
142
|
requirements:
|
143
143
|
- - '='
|
144
144
|
- !ruby/object:Gem::Version
|
145
|
-
version: 3.
|
145
|
+
version: 3.11.0
|
146
146
|
type: :development
|
147
147
|
prerelease: false
|
148
148
|
version_requirements: !ruby/object:Gem::Requirement
|
149
149
|
requirements:
|
150
150
|
- - '='
|
151
151
|
- !ruby/object:Gem::Version
|
152
|
-
version: 3.
|
152
|
+
version: 3.11.0
|
153
153
|
- !ruby/object:Gem::Dependency
|
154
154
|
name: rubocop
|
155
155
|
requirement: !ruby/object:Gem::Requirement
|
@@ -184,42 +184,42 @@ dependencies:
|
|
184
184
|
requirements:
|
185
185
|
- - '='
|
186
186
|
- !ruby/object:Gem::Version
|
187
|
-
version: 4.
|
187
|
+
version: 4.7.0
|
188
188
|
type: :development
|
189
189
|
prerelease: false
|
190
190
|
version_requirements: !ruby/object:Gem::Requirement
|
191
191
|
requirements:
|
192
192
|
- - '='
|
193
193
|
- !ruby/object:Gem::Version
|
194
|
-
version: 4.
|
194
|
+
version: 4.7.0
|
195
195
|
- !ruby/object:Gem::Dependency
|
196
196
|
name: simplecov
|
197
197
|
requirement: !ruby/object:Gem::Requirement
|
198
198
|
requirements:
|
199
199
|
- - '='
|
200
200
|
- !ruby/object:Gem::Version
|
201
|
-
version: 0.
|
201
|
+
version: 0.21.2
|
202
202
|
type: :development
|
203
203
|
prerelease: false
|
204
204
|
version_requirements: !ruby/object:Gem::Requirement
|
205
205
|
requirements:
|
206
206
|
- - '='
|
207
207
|
- !ruby/object:Gem::Version
|
208
|
-
version: 0.
|
208
|
+
version: 0.21.2
|
209
209
|
- !ruby/object:Gem::Dependency
|
210
210
|
name: yard
|
211
211
|
requirement: !ruby/object:Gem::Requirement
|
212
212
|
requirements:
|
213
213
|
- - '='
|
214
214
|
- !ruby/object:Gem::Version
|
215
|
-
version: 0.9.
|
215
|
+
version: 0.9.27
|
216
216
|
type: :development
|
217
217
|
prerelease: false
|
218
218
|
version_requirements: !ruby/object:Gem::Requirement
|
219
219
|
requirements:
|
220
220
|
- - '='
|
221
221
|
- !ruby/object:Gem::Version
|
222
|
-
version: 0.9.
|
222
|
+
version: 0.9.27
|
223
223
|
- !ruby/object:Gem::Dependency
|
224
224
|
name: yardstick
|
225
225
|
requirement: !ruby/object:Gem::Requirement
|
@@ -261,15 +261,20 @@ files:
|
|
261
261
|
- lib/jace.rb
|
262
262
|
- lib/jace/dispatcher.rb
|
263
263
|
- lib/jace/executer.rb
|
264
|
+
- lib/jace/registry.rb
|
264
265
|
- lib/jace/version.rb
|
265
|
-
- scripts/build.sh
|
266
266
|
- spec/integration/readme/.keep
|
267
|
+
- spec/integration/readme/jace/registry_spec.rb
|
267
268
|
- spec/integration/yard/.keep
|
269
|
+
- spec/integration/yard/jace/registry_spec.rb
|
268
270
|
- spec/lib/jace/dispatcher_spec.rb
|
269
271
|
- spec/lib/jace/executer_spec.rb
|
272
|
+
- spec/lib/jace/registry_spec.rb
|
270
273
|
- spec/spec_helper.rb
|
271
274
|
- spec/support/models/.keep
|
275
|
+
- spec/support/models/context.rb
|
272
276
|
- spec/support/models/person.rb
|
277
|
+
- spec/support/models/some_context.rb
|
273
278
|
- spec/support/shared_examples/.keep
|
274
279
|
homepage: https://github.com/darthjee/jace
|
275
280
|
licenses: []
|
@@ -289,8 +294,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
289
294
|
- !ruby/object:Gem::Version
|
290
295
|
version: '0'
|
291
296
|
requirements: []
|
292
|
-
|
293
|
-
rubygems_version: 2.7.6
|
297
|
+
rubygems_version: 3.3.20
|
294
298
|
signing_key:
|
295
299
|
specification_version: 4
|
296
300
|
summary: Gem focused on events for meta-programing
|
data/scripts/build.sh
DELETED
@@ -1,47 +0,0 @@
|
|
1
|
-
#!/bin/bash
|
2
|
-
|
3
|
-
function version() {
|
4
|
-
echo $(cat lib/$PROJECT/version.rb | grep VERSION | sed -e "s/.*'\\(.*\\)'.*/\\1/g")
|
5
|
-
}
|
6
|
-
|
7
|
-
function isTagged() {
|
8
|
-
VERSION=$(version)
|
9
|
-
TAG=$(git tag | tail -n 1)
|
10
|
-
|
11
|
-
if [ $VERSION = $TAG ]; then
|
12
|
-
return 0
|
13
|
-
else
|
14
|
-
return 1
|
15
|
-
fi
|
16
|
-
}
|
17
|
-
|
18
|
-
ACTION=$1
|
19
|
-
|
20
|
-
case $ACTION in
|
21
|
-
"signin")
|
22
|
-
mkdir ~/.gem
|
23
|
-
echo "---" > ~/.gem/credentials
|
24
|
-
echo ":rubygems_api_key: $RUBY_GEMS_API_KEY" >> ~/.gem/credentials
|
25
|
-
chmod 600 ~/.gem/credentials
|
26
|
-
;;
|
27
|
-
"build")
|
28
|
-
if $(isTagged); then
|
29
|
-
rake build
|
30
|
-
else
|
31
|
-
echo version did not change
|
32
|
-
fi
|
33
|
-
;;
|
34
|
-
"push")
|
35
|
-
if $(isTagged); then
|
36
|
-
VERSION=$(version)
|
37
|
-
gem push "pkg/$PROJECT-$VERSION.gem"
|
38
|
-
else
|
39
|
-
echo version did not change
|
40
|
-
fi
|
41
|
-
;;
|
42
|
-
*)
|
43
|
-
echo Usage:
|
44
|
-
echo "$0 build # builds gem"
|
45
|
-
echo "$0 push # pushes gem"
|
46
|
-
;;
|
47
|
-
esac
|