redispatcher 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +29 -5
- data/lib/generators/rails/dispatcher_generator.rb +24 -0
- data/lib/generators/rails/templates/dispatcher.rb +29 -0
- data/lib/redispatcher.rb +5 -23
- data/lib/redispatcher/callbacks.rb +1 -0
- data/lib/redispatcher/dispatchable_method.rb +23 -0
- data/lib/redispatcher/dispatcher.rb +8 -6
- data/lib/redispatcher/logger.rb +1 -1
- data/lib/redispatcher/railtie.rb +18 -0
- data/redispatcher.gemspec +8 -2
- metadata +10 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ac321b3304cf0535c40a2bc21d20c23b0981e574
|
4
|
+
data.tar.gz: e04b15f34501d6ed5167b8a7ba5651f68f15548f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 318f94952b648b182984ca067c673d1607bbe9404411ec046911f2936cfdb4cd6eceb67c66d0038af11e136e31ab67a076d17342a5be74331e24f15abce3299d
|
7
|
+
data.tar.gz: 1a88a9a9a5b43f80d0edd15e8ae65638d5cd596626f49d2e68763befcf63d84ebba93ebcfba6af126a6934a52ba166c6466ef20248e731d7c47d30968a1c123e
|
data/README.md
CHANGED
@@ -1,10 +1,12 @@
|
|
1
|
-
![
|
1
|
+
![Redispatcher](https://zhf.io/raw/p8IRct)
|
2
2
|
|
3
3
|
[![Gem Version](https://badge.fury.io/rb/redispatcher.svg)](http://badge.fury.io/rb/redispatcher)
|
4
4
|
[![Code Climate](https://codeclimate.com/github/rambler-digital-solutions/redispatcher/badges/gpa.svg)](https://codeclimate.com/github/rambler-digital-solutions/redispatcher)
|
5
5
|
[![Test Coverage](https://codeclimate.com/github/rambler-digital-solutions/redispatcher/badges/coverage.svg)](https://codeclimate.com/github/rambler-digital-solutions/redispatcher)
|
6
6
|
|
7
|
-
|
7
|
+
This gem provides delivery of objects from database to any structure with power of callbacks.
|
8
|
+
|
9
|
+
Supporting ORM is ActiveRecord and Sequel (through [sequel-rails](https://github.com/TalentBox/sequel-rails) gem)
|
8
10
|
|
9
11
|
## Installation
|
10
12
|
|
@@ -26,16 +28,24 @@ Or install it yourself as:
|
|
26
28
|
|
27
29
|
### Writing Dispatchers
|
28
30
|
|
29
|
-
Dispatchers inherit from `Redispatcher::Dispatcher`, live in your `app/dispatchers` directory, and are named for the model that they dispatch
|
31
|
+
Dispatchers inherit from `Redispatcher::Dispatcher`, live in your `app/dispatchers` directory, and are named for the model that they dispatch.
|
32
|
+
|
33
|
+
You can use rails generator to generate dispatcher:
|
34
|
+
|
35
|
+
```
|
36
|
+
rails g dispatcher Topic
|
37
|
+
```
|
38
|
+
|
39
|
+
This will create TopicDispatcher:
|
30
40
|
|
31
41
|
```ruby
|
32
42
|
# app/dispatchers/topic_dispatcher.rb
|
33
43
|
class TopicDispatcher < Redispatcher::Dispatcher
|
44
|
+
# ...
|
34
45
|
end
|
35
46
|
```
|
36
47
|
|
37
|
-
|
38
|
-
Do not hesitate to use dispatscher's callbacks `before_` and `after_` `initialize`, `process`, `commit`, `rollback` just like that:
|
48
|
+
Do not hesitate to use dispatscher's callbacks `before_initialize`, `after_initialize`, `before_process`, `after_process`, `before_commit`, `after_commit`, `before_rollback`, `after_rollback` just like that:
|
39
49
|
|
40
50
|
```ruby
|
41
51
|
# app/dispatchers/topic_dispatcher.rb
|
@@ -59,12 +69,22 @@ end
|
|
59
69
|
|
60
70
|
### Enable dispatcher for your model
|
61
71
|
|
72
|
+
With ActiveRecord:
|
73
|
+
|
62
74
|
```ruby
|
63
75
|
class Topic < ActiveRecord::Base
|
64
76
|
dispatchable
|
65
77
|
end
|
66
78
|
```
|
67
79
|
|
80
|
+
With Sequel:
|
81
|
+
|
82
|
+
```ruby
|
83
|
+
class Topic < Sequel::Model
|
84
|
+
dispatchable
|
85
|
+
end
|
86
|
+
```
|
87
|
+
|
68
88
|
### Dispatch!
|
69
89
|
|
70
90
|
Just call dispatch method on object you going to dispatch.
|
@@ -73,6 +93,10 @@ Just call dispatch method on object you going to dispatch.
|
|
73
93
|
dispatched_topic = Topic.first.dispatch
|
74
94
|
```
|
75
95
|
|
96
|
+
## License
|
97
|
+
|
98
|
+
Redispatcher is licensed under the MIT license. See LICENSE for full license text.
|
99
|
+
|
76
100
|
## Contributing
|
77
101
|
|
78
102
|
1. Fork it ( https://github.com/rambler-digital-solutions/redispatcher/fork )
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Rails
|
2
|
+
module Generators
|
3
|
+
class DispatcherGenerator < NamedBase
|
4
|
+
source_root File.expand_path("../templates", __FILE__)
|
5
|
+
check_class_collision suffix: "Dispatcher"
|
6
|
+
|
7
|
+
class_option :parent, type: :string, desc: "The parent class for the generated dispatcher"
|
8
|
+
|
9
|
+
def create_dispatcher_file
|
10
|
+
template 'dispatcher.rb', File.join('app/dispatchers', class_path, "#{file_name}_dispatcher.rb")
|
11
|
+
end
|
12
|
+
|
13
|
+
hook_for :test_framework
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def parent_class_name
|
18
|
+
options.fetch("parent") do
|
19
|
+
"Redispatcher::Dispatcher"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
<%- module_namespacing do -%>
|
2
|
+
<%- if parent_class_name.present? -%>
|
3
|
+
class <%= class_name %>Dispatcher < <%= parent_class_name %>
|
4
|
+
<%- else -%>
|
5
|
+
class <%= class_name %>
|
6
|
+
<%- end -%>
|
7
|
+
# Now define some callbacks, for example:
|
8
|
+
#
|
9
|
+
# after_initialize do
|
10
|
+
# @processed_object = {}
|
11
|
+
# end
|
12
|
+
#
|
13
|
+
# before_process do
|
14
|
+
# @processed_object.merge!(title: object.title, created_at: object.created_at)
|
15
|
+
# end
|
16
|
+
#
|
17
|
+
# after_commit do
|
18
|
+
# File.open('/tmp/dispatcher.json', 'w') do
|
19
|
+
# f.write(JSON.pretty_generate(processed_object))
|
20
|
+
# f.close
|
21
|
+
# end
|
22
|
+
# object.update_attributes(dispatched_at: Time.now)
|
23
|
+
# end
|
24
|
+
#
|
25
|
+
# after_rollback do
|
26
|
+
# puts 'Oh snap!'
|
27
|
+
# end
|
28
|
+
end
|
29
|
+
<% end -%>
|
data/lib/redispatcher.rb
CHANGED
@@ -5,31 +5,13 @@ require_relative 'redispatcher/dispatchable'
|
|
5
5
|
require_relative 'redispatcher/callbacks'
|
6
6
|
require_relative 'redispatcher/logger'
|
7
7
|
require_relative 'redispatcher/dispatcher'
|
8
|
+
require_relative 'redispatcher/dispatchable_method'
|
9
|
+
require_relative 'redispatcher/railtie' if defined? Rails
|
8
10
|
|
9
11
|
module Redispatcher
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
def dispatchable(options = {})
|
14
|
-
# Check options
|
15
|
-
raise Redispatcher::DispatcherError.new("Options for dispatchable must be in a hash.") unless options.is_a? Hash
|
16
|
-
options.each do |key, value|
|
17
|
-
# No options yet
|
18
|
-
unless [:dispatcher_class].include? key
|
19
|
-
raise Redispatcher::DispatcherError.new("Unknown option for dispatchable: #{key.inspect} => #{value.inspect}.")
|
20
|
-
end
|
12
|
+
def self.setup_orm(base)
|
13
|
+
base.class_eval do
|
14
|
+
extend Redispatcher::DispatchableMethod
|
21
15
|
end
|
22
|
-
|
23
|
-
include Redispatcher::Callbacks
|
24
|
-
define_dispatcher_callbacks :dispatch
|
25
|
-
|
26
|
-
include Redispatcher::Dispatchable
|
27
|
-
|
28
|
-
# Create dispatcher class accessor and set to option or default
|
29
|
-
#cattr_accessor :dispatcher_class
|
30
|
-
#self.dispatcher_class = option[:dispatcher_class]
|
31
|
-
|
32
|
-
after_commit :dispatch
|
33
16
|
end
|
34
17
|
end
|
35
|
-
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Redispatcher
|
2
|
+
module DispatchableMethod
|
3
|
+
def dispatchable(options = {})
|
4
|
+
# Check options
|
5
|
+
raise Redispatcher::DispatcherError.new("Options for dispatchable must be in a hash.") unless options.is_a? Hash
|
6
|
+
options.each do |key, value|
|
7
|
+
# No options yet
|
8
|
+
unless [:dispatcher_class].include? key
|
9
|
+
raise Redispatcher::DispatcherError.new("Unknown option for dispatchable: #{key.inspect} => #{value.inspect}.")
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
include Redispatcher::Callbacks
|
14
|
+
define_dispatcher_callbacks :dispatch
|
15
|
+
|
16
|
+
include Redispatcher::Dispatchable
|
17
|
+
|
18
|
+
# Create dispatcher class accessor and set to option or default
|
19
|
+
#cattr_accessor :dispatcher_class
|
20
|
+
#self.dispatcher_class = option[:dispatcher_class]
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -44,21 +44,23 @@ module Redispatcher
|
|
44
44
|
end
|
45
45
|
|
46
46
|
class << self
|
47
|
+
attr_accessor :instance
|
48
|
+
|
47
49
|
def dispatch(object, options={})
|
48
|
-
@
|
50
|
+
@instance = new(object, options)
|
49
51
|
|
50
52
|
begin
|
51
|
-
|
53
|
+
instance.process
|
52
54
|
rescue DispatcherSuppressedError => e
|
53
|
-
log e
|
55
|
+
instance.log e
|
54
56
|
return nil
|
55
57
|
end
|
56
58
|
|
57
59
|
begin
|
58
|
-
return
|
60
|
+
return instance.commit
|
59
61
|
rescue Exception => e
|
60
|
-
log e
|
61
|
-
|
62
|
+
instance.log e
|
63
|
+
instance.rollback
|
62
64
|
raise e
|
63
65
|
end
|
64
66
|
end
|
data/lib/redispatcher/logger.rb
CHANGED
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'rails/railtie'
|
2
|
+
|
3
|
+
module Redispatcher
|
4
|
+
class Railtie < Rails::Railtie
|
5
|
+
|
6
|
+
config.after_initialize do |app|
|
7
|
+
app.config.paths.add 'app/dispatcher', eager_load: true
|
8
|
+
end
|
9
|
+
|
10
|
+
initializer "redispatcher.setup_orm" do |app|
|
11
|
+
[:active_record, :sequel].each do |orm|
|
12
|
+
ActiveSupport.on_load orm do
|
13
|
+
Redispatcher.setup_orm self
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/redispatcher.gemspec
CHANGED
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
|
5
5
|
Gem::Specification.new do |spec|
|
6
6
|
spec.name = 'redispatcher'
|
7
|
-
spec.version = '0.0.
|
7
|
+
spec.version = '0.0.3'
|
8
8
|
spec.authors = ['Sergey Besedin']
|
9
9
|
spec.email = ['kr3ssh@gmail.com']
|
10
10
|
spec.summary = %q{Gem to dispatch ActiveRecord objects to anywhere}
|
@@ -12,23 +12,29 @@ Gem::Specification.new do |spec|
|
|
12
12
|
spec.homepage = 'https://github.com/rambler-digital-solutions/redispatcher'
|
13
13
|
spec.license = 'MIT'
|
14
14
|
|
15
|
+
spec.required_ruby_version = '>= 1.9'
|
16
|
+
|
15
17
|
spec.files = %w(
|
16
18
|
Gemfile
|
17
19
|
LICENSE.txt
|
18
20
|
README.md
|
19
21
|
Rakefile
|
22
|
+
lib/generators/rails/dispatcher_generator.rb
|
23
|
+
lib/generators/rails/templates/dispatcher.rb
|
20
24
|
lib/redispatcher.rb
|
21
25
|
lib/redispatcher/callbacks.rb
|
22
26
|
lib/redispatcher/dispatchable.rb
|
27
|
+
lib/redispatcher/dispatchable_method.rb
|
23
28
|
lib/redispatcher/dispatcher.rb
|
24
29
|
lib/redispatcher/exceptions.rb
|
25
30
|
lib/redispatcher/logger.rb
|
31
|
+
lib/redispatcher/railtie.rb
|
26
32
|
redispatcher.gemspec
|
27
33
|
)
|
28
34
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
29
35
|
spec.require_paths = ['lib']
|
30
36
|
|
31
|
-
spec.add_dependency 'rails'
|
37
|
+
spec.add_dependency 'rails', '>= 4.0'
|
32
38
|
spec.add_development_dependency 'bundler', '~> 1.7'
|
33
39
|
spec.add_development_dependency 'rake', '~> 10.0'
|
34
40
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: redispatcher
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sergey Besedin
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-04-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '0'
|
19
|
+
version: '4.0'
|
20
20
|
type: :runtime
|
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: '4.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -63,12 +63,16 @@ files:
|
|
63
63
|
- LICENSE.txt
|
64
64
|
- README.md
|
65
65
|
- Rakefile
|
66
|
+
- lib/generators/rails/dispatcher_generator.rb
|
67
|
+
- lib/generators/rails/templates/dispatcher.rb
|
66
68
|
- lib/redispatcher.rb
|
67
69
|
- lib/redispatcher/callbacks.rb
|
68
70
|
- lib/redispatcher/dispatchable.rb
|
71
|
+
- lib/redispatcher/dispatchable_method.rb
|
69
72
|
- lib/redispatcher/dispatcher.rb
|
70
73
|
- lib/redispatcher/exceptions.rb
|
71
74
|
- lib/redispatcher/logger.rb
|
75
|
+
- lib/redispatcher/railtie.rb
|
72
76
|
- redispatcher.gemspec
|
73
77
|
homepage: https://github.com/rambler-digital-solutions/redispatcher
|
74
78
|
licenses:
|
@@ -82,7 +86,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
82
86
|
requirements:
|
83
87
|
- - ">="
|
84
88
|
- !ruby/object:Gem::Version
|
85
|
-
version: '
|
89
|
+
version: '1.9'
|
86
90
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
87
91
|
requirements:
|
88
92
|
- - ">="
|
@@ -90,7 +94,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
90
94
|
version: '0'
|
91
95
|
requirements: []
|
92
96
|
rubyforge_project:
|
93
|
-
rubygems_version: 2.
|
97
|
+
rubygems_version: 2.4.5
|
94
98
|
signing_key:
|
95
99
|
specification_version: 4
|
96
100
|
summary: Gem to dispatch ActiveRecord objects to anywhere
|