jace 0.0.1 → 0.1.0

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
  SHA256:
3
- metadata.gz: 358835f18e54f117ab1043133ddf2374a5da2cc96ff7ce9c67032adad17abdeb
4
- data.tar.gz: ba47115126440c6f78833e3c32444c08bd603eef3dacb74523475a96f1a10f6c
3
+ metadata.gz: ba76568b768021abe49c12d16b285e9f9ac0d3d631074a1aa8e8d1619d8d397f
4
+ data.tar.gz: 17a86c3dbe926f9e2fd111eb6c67190421c8d455ffc35c1e9c8b4dab40c80070
5
5
  SHA512:
6
- metadata.gz: 3f1dedd86ee3e4a1171b6f09b95874bf70e5e2761d989b4d6f72fd916164977994f271ea311ea82858a0e7544c19874683de5c8311b606d50cc58e69fbb8a08a
7
- data.tar.gz: 98b468f58c0a46d3c7c1b73df95eb64c856c00f0ed314c5935828ac9024223d328bf0f572620c6921ffc88ee4d8f8f9a3513791e3d2f52804385a9716da1daf0
6
+ metadata.gz: f156ad1797a018d5c3d16c114156c1613a21315b6707c398471702d90dc7d692a89cf53b14b66631ed33d80a28557eca9e123413339497cff6b8d441f0a9b9d7
7
+ data.tar.gz: f16a65b15e85ce825edbe8c105ee2a8bb1575831be2e83faa83d8decf64f2bd11fffea311841c4b82420ce551a208819c3ee231ac0dc32567cfdbbdfc4a8e315
data/.circleci/config.yml CHANGED
@@ -1,8 +1,28 @@
1
1
  version: 2
2
+ workflows:
3
+ version: 2
4
+ test-and-build:
5
+ jobs:
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
2
22
  jobs:
3
- build:
23
+ test:
4
24
  docker:
5
- - image: darthjee/circleci_ruby_gems:0.5.0
25
+ - image: darthjee/circleci_ruby_270:1.1.0
6
26
  environment:
7
27
  PROJECT: jace
8
28
  steps:
@@ -16,12 +36,22 @@ jobs:
16
36
  - run:
17
37
  name: RSpec
18
38
  command: bundle exec rspec
19
- - run:
20
- name: Rubocop
21
- command: rubocop
22
39
  - run:
23
40
  name: Coverage Test Report
24
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
25
55
  - run:
26
56
  name: Yardstick coverage check
27
57
  command: bundle exec rake verify_measurements
@@ -34,3 +64,22 @@ jobs:
34
64
  - run:
35
65
  name: Check unit tests
36
66
  command: check_specs
67
+ build-and-release:
68
+ docker:
69
+ - image: darthjee/circleci_ruby_270:1.1.0
70
+ environment:
71
+ PROJECT: jace
72
+ steps:
73
+ - checkout
74
+ - run:
75
+ name: Bundle Install
76
+ command: bundle install
77
+ - run:
78
+ name: Signin
79
+ command: build_gem.sh signin
80
+ - run:
81
+ name: Build Gem
82
+ command: build_gem.sh build
83
+ - run:
84
+ name: Push Gem
85
+ command: build_gem.sh push
data/.rubocop.yml CHANGED
@@ -36,6 +36,15 @@ RSpec/NestedGroups:
36
36
  Exclude:
37
37
  - 'spec/integration/yard/**/*.rb'
38
38
 
39
+ RSpec/InstanceVariable:
40
+ Exclude:
41
+ - 'spec/lib/jace/executer_spec.rb'
42
+ - 'spec/lib/jace/dispatcher_spec.rb'
43
+
44
+ Naming/MemoizedInstanceVariableName:
45
+ Exclude:
46
+ - 'spec/support/models/person.rb'
47
+
39
48
  Style/HashEachMethods:
40
49
  Enabled: true
41
50
 
data/Dockerfile CHANGED
@@ -1,6 +1,6 @@
1
- FROM darthjee/scripts:0.1.7 as scripts
1
+ FROM darthjee/scripts:0.3.1 as scripts
2
2
 
3
- FROM darthjee/ruby_gems:0.5.2 as base
3
+ FROM darthjee/ruby_270:1.1.0 as base
4
4
 
5
5
  COPY --chown=app:app ./ /home/app/app/
6
6
 
data/README.md CHANGED
@@ -1,5 +1,5 @@
1
- Sinclair
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.1](https://www.rubydoc.info/gems/jace/0.0.1)
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
- ```ruby
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
- ```ruby
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
+ ```
@@ -1 +1,3 @@
1
- ignore: []
1
+ ignore:
2
+ - lib/jace/version.rb
3
+ - lib/jace.rb
data/config/yardstick.yml CHANGED
@@ -1,4 +1,4 @@
1
- threshold: 100
1
+ threshold: 84.6
2
2
  require_exact_threshold: false
3
3
  rules:
4
4
  ApiTag::Presence:
@@ -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
@@ -10,7 +10,7 @@ Gem::Specification.new do |gem|
10
10
  gem.authors = ['DarthJee']
11
11
  gem.email = ['darthjee@gmail.com']
12
12
  gem.homepage = 'https://github.com/darthjee/jace'
13
- gem.description = ''
13
+ gem.description = 'Gem focused on events for meta-programing'
14
14
  gem.summary = gem.description
15
15
  gem.required_ruby_version = '>= 2.5.0'
16
16
 
@@ -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', '1.16.1'
23
- gem.add_development_dependency 'pry', '0.12.2'
24
- gem.add_development_dependency 'pry-nav', '0.3.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', '5.6.0'
27
- gem.add_development_dependency 'rspec', '3.9.0'
28
- gem.add_development_dependency 'rspec-core', '3.9.1'
29
- gem.add_development_dependency 'rspec-expectations', '3.9.1'
30
- gem.add_development_dependency 'rspec-mocks', '3.9.1'
31
- gem.add_development_dependency 'rspec-support', '3.9.2'
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.4.1'
35
- gem.add_development_dependency 'simplecov', '0.17.1'
36
- gem.add_development_dependency 'yard', '0.9.24'
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/jace.jpg ADDED
Binary file
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Jace
4
+ # @api private
5
+ # @author Darthjee
6
+ #
7
+ # Class responsible for dispatching the call of events
8
+ class Dispatcher
9
+ # @param before [Symbol,Proc,Array] all the methods / proc
10
+ # to be executed before block call
11
+ # @param after [Symbol,Proc,Array] all the methods / proc
12
+ # to be executed after block call
13
+ def initialize(before: [], after: [])
14
+ @before = [before].flatten.compact
15
+ @after = [after].flatten.compact
16
+ end
17
+
18
+ # Dispatch the event call on a context
19
+ #
20
+ # @param context [Object] Object where the procs / methods
21
+ # will be called on
22
+ # @block [Proc] bloc to be performed between befores and afters
23
+ #
24
+ # @return [Object] result of block call
25
+ def dispatch(context, &block)
26
+ Executer.call(
27
+ before: before,
28
+ after: after,
29
+ context: context,
30
+ &block
31
+ )
32
+ end
33
+
34
+ private
35
+
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
53
+ end
54
+ end
@@ -0,0 +1,126 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Jace
4
+ # @api private
5
+ # @author Dartjee
6
+ #
7
+ # Class responsible for executing a given block and triggering event
8
+ #
9
+ # The event trigger has phase before and after so all methods
10
+ # are called before block execution and after, before returning the result
11
+ class Executer
12
+ # Calls the execution
13
+ #
14
+ # @param before [Symbol,Proc,Array] all the methods / proc
15
+ # to be executed before block call
16
+ # @param after [Symbol,Proc,Array] all the methods / proc
17
+ # to be executed after block call
18
+ # @param context [Object] Object where the procs / methods
19
+ # will be called on
20
+ # @block [Proc] bloc to be performed between befores and afters
21
+ #
22
+ # @return [Object] result of block call
23
+ def self.call(before: [], after: [], context:, &block)
24
+ new(before, after, context, &block).call
25
+ end
26
+
27
+ # calls the execution
28
+ #
29
+ # @see .call
30
+ #
31
+ # @return (see .call)
32
+ def call
33
+ execute_actions(before)
34
+ result = block.call if block
35
+ execute_actions(after)
36
+
37
+ result
38
+ end
39
+
40
+ private
41
+
42
+ # @private
43
+ #
44
+ # @param (see .call)
45
+ def initialize(before, after, context, &block)
46
+ @before = [before].flatten.compact
47
+ @after = [after].flatten.compact
48
+ @context = context
49
+ @block = block
50
+ end
51
+
52
+ attr_reader :before, :after, :context, :block
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
+
92
+ # @private
93
+ #
94
+ # Perform actions from list
95
+ #
96
+ # @list [Array<Symbol,Proc>] methods and procs to
97
+ # be executed
98
+ #
99
+ # Execute each proc and call method in the list
100
+ # within the given context
101
+ #
102
+ # @return [Array<Proc>]
103
+ def execute_actions(list)
104
+ actions(list).each do |action|
105
+ context.instance_eval(&action)
106
+ end
107
+ end
108
+
109
+ # @private
110
+ #
111
+ # Transforms the input object into a Proc
112
+ #
113
+ # @param list [Symbol,Proc] method or proc to be transformed
114
+ #
115
+ # @return [Proc]
116
+ def actions(list)
117
+ list.map do |entry|
118
+ if entry.is_a?(Proc)
119
+ proc(&entry)
120
+ else
121
+ proc { send(entry) }
122
+ end
123
+ end
124
+ end
125
+ end
126
+ end
@@ -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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class Jace
4
- VERSION = '0.0.1'
3
+ module Jace
4
+ VERSION = '0.1.0'
5
5
  end
data/lib/jace.rb CHANGED
@@ -2,6 +2,9 @@
2
2
 
3
3
  # @api public
4
4
  # @author darthjee
5
- class Jace
6
- autoload :VERSION, 'jace/version'
5
+ module Jace
6
+ autoload :VERSION, 'jace/version'
7
+ autoload :Dispatcher, 'jace/dispatcher'
8
+ autoload :Executer, 'jace/executer'
9
+ autoload :Registry, 'jace/registry'
7
10
  end
@@ -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