active_spy 1.0.0.rc
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.
- checksums.yaml +7 -0
- data/.document +5 -0
- data/Gemfile +22 -0
- data/Gemfile.lock +177 -0
- data/LICENSE.txt +20 -0
- data/README.md +172 -0
- data/Rakefile +56 -0
- data/VERSION +1 -0
- data/active_spy.gemspec +101 -0
- data/app/controllers/active_event/notifications_controller.rb +6 -0
- data/config/initializers/active_event_configuration_loader.rb +14 -0
- data/config/routes.rb +3 -0
- data/lib/active_spy/base.rb +9 -0
- data/lib/active_spy/configuration.rb +71 -0
- data/lib/active_spy/rails/base.rb +90 -0
- data/lib/active_spy/rails/engine.rb +7 -0
- data/lib/active_spy/rails/hook_list.rb +114 -0
- data/lib/active_spy/rails/listener.rb +87 -0
- data/lib/active_spy/rails/railtie.rb +17 -0
- data/lib/active_spy/rails/spy.rb +60 -0
- data/lib/active_spy/spy/spy.rb +42 -0
- data/lib/active_spy/spy/spy_list.rb +64 -0
- data/lib/active_spy.rb +48 -0
- data/lib/rails/generators/active_event/install/install_generator.rb +21 -0
- data/lib/rails/generators/active_event/install/templates/active_event.yml +20 -0
- data/lib/rails/generators/active_event/install/templates/initializer.rb +7 -0
- metadata +258 -0
@@ -0,0 +1,90 @@
|
|
1
|
+
require 'rest-client'
|
2
|
+
require 'singleton'
|
3
|
+
|
4
|
+
module ActiveSpy
|
5
|
+
# Module to hold Rails specific classes and helpers.
|
6
|
+
#
|
7
|
+
module Rails
|
8
|
+
# Default template for callbacks handlers.
|
9
|
+
#
|
10
|
+
class Base
|
11
|
+
def initialize(object)
|
12
|
+
@object = object
|
13
|
+
end
|
14
|
+
|
15
|
+
# Overriding to avoid sending the object to server 2 times (in both
|
16
|
+
# before and after callabcks).
|
17
|
+
#
|
18
|
+
def respond_to?(method)
|
19
|
+
method.include?('after_') || method == 'before_save'
|
20
|
+
end
|
21
|
+
|
22
|
+
# Set a flag in the object to tell us wether it's a new record or not.
|
23
|
+
#
|
24
|
+
def before_save
|
25
|
+
inject_is_new_method(@object)
|
26
|
+
@object.is_new = true if @object.new_record?
|
27
|
+
end
|
28
|
+
|
29
|
+
# Inject an attribute in the +object+, called +is_new?+ and a setter
|
30
|
+
# for it.
|
31
|
+
#
|
32
|
+
def inject_is_new_method(object)
|
33
|
+
object.instance_eval do
|
34
|
+
def is_new=(value)
|
35
|
+
@is_new = value
|
36
|
+
end
|
37
|
+
|
38
|
+
def is_new?
|
39
|
+
@is_new
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
# Overriding to always send the object to the server, even though the
|
45
|
+
# after callback is not explicitly defined.
|
46
|
+
#
|
47
|
+
def method_missing(method, *_args, &_block)
|
48
|
+
host = ActiveSpy::Configuration.event_host
|
49
|
+
port = ActiveSpy::Configuration.event_port
|
50
|
+
|
51
|
+
RestClient.post "#{host}:#{port}/",
|
52
|
+
event: get_request_params(method)
|
53
|
+
remove_is_new_method(@object)
|
54
|
+
end
|
55
|
+
|
56
|
+
# Get the event request params for a given +method+.
|
57
|
+
#
|
58
|
+
def get_request_params(method)
|
59
|
+
real_method = method.to_s.split('_').last
|
60
|
+
action = get_action(real_method)
|
61
|
+
{
|
62
|
+
type: @object.class.name,
|
63
|
+
actor: @object.actor,
|
64
|
+
realm: @object.realm,
|
65
|
+
payload: @object.payload_for(action),
|
66
|
+
action: action
|
67
|
+
}
|
68
|
+
end
|
69
|
+
|
70
|
+
# Remove a previously added +is_new+ attribute from a given object.
|
71
|
+
#
|
72
|
+
def remove_is_new_method(object)
|
73
|
+
object.instance_eval do
|
74
|
+
undef :is_new=
|
75
|
+
undef :is_new?
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
# Returns the correct action for the method called in the model.
|
80
|
+
#
|
81
|
+
def get_action(real_method)
|
82
|
+
if real_method == 'save'
|
83
|
+
return 'create' if @object.is_new?
|
84
|
+
return 'update'
|
85
|
+
end
|
86
|
+
'destroy'
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
@@ -0,0 +1,114 @@
|
|
1
|
+
module ActiveSpy
|
2
|
+
module Rails
|
3
|
+
# Class used to hold all the events hook's paths and later sync
|
4
|
+
# them with an event runner instance.
|
5
|
+
#
|
6
|
+
class HookList
|
7
|
+
include Singleton
|
8
|
+
|
9
|
+
# Initialize an empty hook list
|
10
|
+
#
|
11
|
+
def initialize
|
12
|
+
host = ActiveSpy::Configuration.event_host
|
13
|
+
port = ActiveSpy::Configuration.event_port
|
14
|
+
name = ActiveSpy::Configuration.name.downcase.gsub(' ', '-').strip
|
15
|
+
@base_service_url = "#{host}:#{port}/services/#{name}"
|
16
|
+
@hooks = []
|
17
|
+
end
|
18
|
+
|
19
|
+
# Proxy all methods called in the {ActiveSpy::Hook} to
|
20
|
+
# {ActiveSpy::Hook} instance. Just a syntax sugar.
|
21
|
+
#
|
22
|
+
def self.method_missing(method, *args, &block)
|
23
|
+
instance.send(method, *args, &block)
|
24
|
+
end
|
25
|
+
|
26
|
+
# Clear the hook list.
|
27
|
+
#
|
28
|
+
def clear
|
29
|
+
@hooks = []
|
30
|
+
end
|
31
|
+
|
32
|
+
# forward {<<} method to the hook list.
|
33
|
+
#
|
34
|
+
def <<(other)
|
35
|
+
@hooks << other
|
36
|
+
end
|
37
|
+
|
38
|
+
# Register in event runner all the hooks defined in the list. If some of
|
39
|
+
# them already exists, they will be excluded and readded.
|
40
|
+
#
|
41
|
+
def register
|
42
|
+
old_hooks = get_old_hooks
|
43
|
+
hooks_to_delete = get_hooks_to_delete(old_hooks)
|
44
|
+
hooks_to_add = get_hooks_to_add(old_hooks)
|
45
|
+
delete_hooks(hooks_to_delete) if hooks_to_delete.any?
|
46
|
+
add_hooks(hooks_to_add) unless hooks_to_add.empty?
|
47
|
+
end
|
48
|
+
|
49
|
+
# Get the old hooks list for this service from the event-runner
|
50
|
+
#
|
51
|
+
def get_old_hooks
|
52
|
+
|
53
|
+
JSON.load(RestClient.get(@base_service_url))['hooks']
|
54
|
+
end
|
55
|
+
|
56
|
+
# Select from old hooks those that should be deleted from event runner.
|
57
|
+
#
|
58
|
+
def get_hooks_to_delete(old_hooks)
|
59
|
+
hooks_to_delete = []
|
60
|
+
old_hooks.each do |old_hook|
|
61
|
+
found = false
|
62
|
+
@hooks.each do |hook|
|
63
|
+
if hook['class'] == old_hook['class'] && old_hook['active']
|
64
|
+
found = true
|
65
|
+
break
|
66
|
+
end
|
67
|
+
end
|
68
|
+
next if found
|
69
|
+
hooks_to_delete << old_hook
|
70
|
+
end
|
71
|
+
hooks_to_delete
|
72
|
+
end
|
73
|
+
|
74
|
+
# Select from the hooks defined in the app those that should be created
|
75
|
+
# in the event runner.
|
76
|
+
#
|
77
|
+
def get_hooks_to_add(old_hooks)
|
78
|
+
hooks_to_add = []
|
79
|
+
@hooks.each do |hook|
|
80
|
+
found = false
|
81
|
+
old_hooks.each do |old_hook|
|
82
|
+
if hook['class'] == old_hook['class'] && old_hook['active']
|
83
|
+
found = true
|
84
|
+
break
|
85
|
+
end
|
86
|
+
end
|
87
|
+
next if found
|
88
|
+
hooks_to_add << hook
|
89
|
+
end
|
90
|
+
hooks_to_add
|
91
|
+
end
|
92
|
+
|
93
|
+
# Properly delete the +hooks_to_delete+ in the event runner.
|
94
|
+
#
|
95
|
+
def delete_hooks(hooks_to_delete)
|
96
|
+
hooks_to_delete.each do |hook|
|
97
|
+
RestClient.delete "#{@base_service_url}/hooks/#{hook['id']}"
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
# # Properly creates the +hooks_to_add+ in the event runner..
|
102
|
+
#
|
103
|
+
def add_hooks(hooks_to_add)
|
104
|
+
hooks_to_add.each do |hook|
|
105
|
+
RestClient.post "#{@base_service_url}/hooks", {
|
106
|
+
'class'=> hook['class'],
|
107
|
+
'postPath' => ActiveSpy::Engine.routes.url_helpers.notifications_path(hook['class'].downcase),
|
108
|
+
'active' => true
|
109
|
+
}
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require 'rest-client'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
module ActiveSpy
|
5
|
+
module Rails
|
6
|
+
# Base class used to process the events received.
|
7
|
+
#
|
8
|
+
class Listener
|
9
|
+
include ActiveSupport::Inflector
|
10
|
+
|
11
|
+
|
12
|
+
# Constant to hold the model translations. The key is the incoming
|
13
|
+
# +ref_type+ and the value is the matching model class.
|
14
|
+
#
|
15
|
+
MODEL_HANDLER = {}
|
16
|
+
|
17
|
+
# Store the event handler hook in the {ActiveSpy::Rails::HookList} for
|
18
|
+
# later registration of them within the event runner.
|
19
|
+
#
|
20
|
+
def self.inherited(child)
|
21
|
+
if child.name.include? 'Listener'
|
22
|
+
ActiveSpy::Rails::HookList << {
|
23
|
+
'class' => child.name.split('Listener')[0]
|
24
|
+
}
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# Handle a request with +params+ and sync the database according to
|
29
|
+
# them.
|
30
|
+
#
|
31
|
+
def handle(params)
|
32
|
+
object_type = params.delete(:type)
|
33
|
+
callback = params[:payload].delete(:action)
|
34
|
+
payload_content = params.delete(:payload)[object_type.downcase.to_sym]
|
35
|
+
actor = params.delete(:actor)
|
36
|
+
realm = params.delete(:realm)
|
37
|
+
|
38
|
+
sync_database(callback, object_type, payload_content, actor, realm)
|
39
|
+
end
|
40
|
+
|
41
|
+
# Calls the proper method to sync the database. It will manipulate
|
42
|
+
# objects of the class +object_type+, with the attributes sent in the
|
43
|
+
# +payload+, triggered by the callback +callback+.
|
44
|
+
#
|
45
|
+
def sync_database(callback, object_type, payload, actor, realm)
|
46
|
+
send(callback, object_type, payload, actor, realm)
|
47
|
+
end
|
48
|
+
|
49
|
+
# Logic to handle object's creation. You can override this, as you wish,
|
50
|
+
# to suit your own needs
|
51
|
+
#
|
52
|
+
def create(object_type, payload, _actor, _realm)
|
53
|
+
klass = get_object_class(object_type)
|
54
|
+
klass.new.update_attributes(payload)
|
55
|
+
end
|
56
|
+
|
57
|
+
# Logic to handle object's update. You can override this, as you wish,
|
58
|
+
# to suit your own needs
|
59
|
+
#
|
60
|
+
def update(object_type, payload, _actor, _realm)
|
61
|
+
klass = get_object_class(object_type)
|
62
|
+
guid = payload.delete(:guid)
|
63
|
+
klass.find_by(guid: guid).update_attributes(payload)
|
64
|
+
end
|
65
|
+
|
66
|
+
# Destroy a record from our database. You can override this, as you wish,
|
67
|
+
# to suit your own needs
|
68
|
+
#
|
69
|
+
def destroy(klass, payload, _actor, _realm)
|
70
|
+
klass = get_object_class(klass)
|
71
|
+
guid = payload.delete(:guid)
|
72
|
+
klass.find_by(guid: guid).destroy!
|
73
|
+
end
|
74
|
+
|
75
|
+
# Gets the object class. First, it'll look the {MODEL_HANDLER} hash and
|
76
|
+
# see if there is any translation for a given +object_type+. If it does
|
77
|
+
# not have a translation, this method will try to +constantize+ the
|
78
|
+
# +object_type+.
|
79
|
+
#
|
80
|
+
def get_object_class(object_type)
|
81
|
+
translated_object_type = MODEL_HANDLER[object_type]
|
82
|
+
return constantize(translated_object_type) if translated_object_type
|
83
|
+
constantize(object_type)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'rails'
|
2
|
+
|
3
|
+
# Railtie class to automatically include {ActiveSpy::Spy} in all
|
4
|
+
# +ActiveRecord::Base+
|
5
|
+
#
|
6
|
+
class Railtie < Rails::Railtie
|
7
|
+
initializer 'active_spy.spies' do
|
8
|
+
ActiveSupport.on_load(:active_record) do
|
9
|
+
include ActiveSpy::Spy
|
10
|
+
include ActiveSpy::Rails::Spy
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
config.after_initialize do
|
15
|
+
Rails.application.eager_load!
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'active_support'
|
2
|
+
|
3
|
+
module ActiveSpy
|
4
|
+
# Module used to hold Rails specific logic.
|
5
|
+
#
|
6
|
+
module Rails
|
7
|
+
# Module that defines methods used to spy on some class methods.
|
8
|
+
#
|
9
|
+
module Spy
|
10
|
+
# Default snippet to extends the class with
|
11
|
+
# {ActiveSpy::Spy::ClassMethods} when {ActiveSpy::Spy} is included in
|
12
|
+
# it.
|
13
|
+
#
|
14
|
+
def self.included(base)
|
15
|
+
base.extend ClassMethods
|
16
|
+
end
|
17
|
+
# Class methods to be defined in classes that includes {ActiveSpy::Spy}
|
18
|
+
#
|
19
|
+
module ClassMethods
|
20
|
+
# Class method to define the realm of the model.
|
21
|
+
#
|
22
|
+
def model_realm(realm_name = nil, &block)
|
23
|
+
realm = -> { send(realm_name) } if realm_name
|
24
|
+
realm = block if block_given?
|
25
|
+
define_method :realm do
|
26
|
+
realm.call
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
# Class method to define the actor of the model.
|
31
|
+
#
|
32
|
+
def model_actor(actor_name = nil, &block)
|
33
|
+
actor = -> { send(actor_name) } if actor_name
|
34
|
+
actor = block if block_given?
|
35
|
+
define_method :actor do
|
36
|
+
actor.call
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
# Helper to use on Rails app and watch for model creation, update and
|
41
|
+
# destruction.
|
42
|
+
#
|
43
|
+
def watch_model_changes
|
44
|
+
watch_method :save, :destroy
|
45
|
+
inject_payload_for_method
|
46
|
+
end
|
47
|
+
|
48
|
+
# Helper to inject the method +payload_for(method)+ in the model
|
49
|
+
# with the default behavior: all attributes are sent in all
|
50
|
+
# actions.
|
51
|
+
#
|
52
|
+
def inject_payload_for_method
|
53
|
+
define_method :payload_for do |_method|
|
54
|
+
{ self.class.name.downcase.to_sym => attributes }
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'active_support'
|
2
|
+
|
3
|
+
module ActiveSpy
|
4
|
+
# Module that defines methods used to spy on some class methods
|
5
|
+
#
|
6
|
+
module Spy
|
7
|
+
# Default snippet to extends the class with {ActiveSpy::Spy::ClassMethods}
|
8
|
+
# when {ActiveSpy::Spy} is included in it.
|
9
|
+
#
|
10
|
+
def self.included(base)
|
11
|
+
base.extend ClassMethods
|
12
|
+
end
|
13
|
+
|
14
|
+
# Invokes the callback method on the invoker class. The +callback_type+
|
15
|
+
# param tells wether it will be called +:after+ or +before+.
|
16
|
+
#
|
17
|
+
def invoke_callback(method, callback_type)
|
18
|
+
callback_invoker = callback_invoker_class.new(self)
|
19
|
+
callback = "#{callback_type}_#{method}"
|
20
|
+
return unless callback_invoker.respond_to?(callback)
|
21
|
+
callback_invoker.send(callback)
|
22
|
+
end
|
23
|
+
|
24
|
+
# Gets the invoker class based on the class' name
|
25
|
+
#
|
26
|
+
def callback_invoker_class
|
27
|
+
ActiveSupport::Inflector.constantize "#{self.class.name}Events"
|
28
|
+
end
|
29
|
+
|
30
|
+
# Class methods to be defined in classes that includes {ActiveSpy::Spy}
|
31
|
+
#
|
32
|
+
module ClassMethods
|
33
|
+
# Set watchers for the +method+
|
34
|
+
#
|
35
|
+
def watch_method(*methods)
|
36
|
+
methods.each do |method|
|
37
|
+
ActiveSpy::SpyList << { 'class' => name, 'method' => method }
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'active_support'
|
2
|
+
require 'singleton'
|
3
|
+
|
4
|
+
module ActiveSpy
|
5
|
+
# Singleton used to hold the spies and lazely active these spies by patching
|
6
|
+
# the methods in the specified classes.
|
7
|
+
#
|
8
|
+
class SpyList
|
9
|
+
include Singleton
|
10
|
+
|
11
|
+
# Just to initiliaze the spy list.
|
12
|
+
#
|
13
|
+
def initialize
|
14
|
+
@spies = []
|
15
|
+
end
|
16
|
+
|
17
|
+
attr_reader :spies
|
18
|
+
|
19
|
+
# Proxy all methods called in the {ActiveSpy::SpyList} to
|
20
|
+
# {ActiveSpy::SpyList} instance. Just a syntax sugar.
|
21
|
+
#
|
22
|
+
def self.method_missing(method, *args, &block)
|
23
|
+
instance.send(method, *args, &block)
|
24
|
+
end
|
25
|
+
|
26
|
+
# Active all the spies defined in the spy list by patching the methods
|
27
|
+
# in their classes.
|
28
|
+
#
|
29
|
+
def activate
|
30
|
+
@spies.each do |spy|
|
31
|
+
spied_class = spy['class']
|
32
|
+
spied_method = spy['method']
|
33
|
+
|
34
|
+
patch(spied_class, spied_method)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# forward {<<} method to the spy list.
|
39
|
+
#
|
40
|
+
def <<(other)
|
41
|
+
@spies << other
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
# This method patches the +method+ in the class +klass+ to invoke the
|
47
|
+
# callbacks defined in the respective class, that should be named using
|
48
|
+
# appending 'Events' to the class' name, and inherites from
|
49
|
+
# {ActiveSpy::Base}.
|
50
|
+
#
|
51
|
+
def patch(klass, method)
|
52
|
+
ActiveSupport::Inflector.constantize(klass).class_eval do
|
53
|
+
|
54
|
+
old_method = instance_method(method)
|
55
|
+
define_method method do
|
56
|
+
send(:invoke_callback, method, :before)
|
57
|
+
result = old_method.bind(self).call
|
58
|
+
send(:invoke_callback, method, :after)
|
59
|
+
result
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
data/lib/active_spy.rb
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'active_spy/configuration'
|
2
|
+
require 'active_spy/base'
|
3
|
+
require 'active_spy/spy/spy'
|
4
|
+
require 'active_spy/spy/spy_list'
|
5
|
+
require 'active_spy/rails/base' if defined?(Rails)
|
6
|
+
require 'active_spy/rails/spy' if defined?(Rails)
|
7
|
+
require 'active_spy/rails/railtie' if defined?(Rails)
|
8
|
+
require 'active_spy/rails/engine' if defined?(Rails)
|
9
|
+
require 'active_spy/rails/engine' if defined?(Rails)
|
10
|
+
require 'active_spy/rails/hook_list' if defined?(Rails)
|
11
|
+
require 'active_spy/rails/listener'
|
12
|
+
|
13
|
+
# Base module for the gem
|
14
|
+
#
|
15
|
+
module ActiveSpy
|
16
|
+
if defined?(Rails)
|
17
|
+
# @!method self.configure
|
18
|
+
# Class method to set the service's name, host and port.
|
19
|
+
#
|
20
|
+
def self.configure
|
21
|
+
Configuration.instance_eval do
|
22
|
+
yield(self)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
# @!method self.register_service
|
27
|
+
# Class method to register the service in an event-runner instance.
|
28
|
+
#
|
29
|
+
def self.register_service
|
30
|
+
host = ActiveSpy::Configuration.event_host
|
31
|
+
port = ActiveSpy::Configuration.event_port
|
32
|
+
@@base_url = "#{host}:#{port}/services"
|
33
|
+
|
34
|
+
return if self.service_registered?
|
35
|
+
RestClient.post @@base_url, service: ActiveSpy::Configuration.settings
|
36
|
+
end
|
37
|
+
|
38
|
+
# @!method self.service_registered?
|
39
|
+
# Check if the service was already registetered in the configured event
|
40
|
+
# runner instance.
|
41
|
+
#
|
42
|
+
def self.service_registered?
|
43
|
+
name = ActiveSpy::Configuration.name
|
44
|
+
r = RestClient.get "#{@@base_url}/#{name.downcase.gsub(' ', '-').strip}"
|
45
|
+
r.code == 200
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module ActiveSpy
|
4
|
+
module Generators
|
5
|
+
class InstallGenerator < ::Rails::Generators::Base
|
6
|
+
desc 'Creates an active_spy gem configuration file at config/active_spy.yml, and an initializer at config/initializers/active_spy.rb'
|
7
|
+
|
8
|
+
def self.source_root
|
9
|
+
@_active_spy_source_root ||= File.expand_path("../templates", __FILE__)
|
10
|
+
end
|
11
|
+
|
12
|
+
def create_config_file
|
13
|
+
template 'active_spy.yml', File.join('config', 'active_spy.yml')
|
14
|
+
end
|
15
|
+
|
16
|
+
def create_initializer_file
|
17
|
+
template 'initializer.rb', File.join('config', 'initializers', 'active_spy.rb')
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
test:
|
2
|
+
name: dummy
|
3
|
+
host: http://dummy.com
|
4
|
+
port: 80
|
5
|
+
event_host: http://event-runner.com
|
6
|
+
event_port: 443
|
7
|
+
|
8
|
+
development:
|
9
|
+
name: dummy
|
10
|
+
host: http://dummy.com
|
11
|
+
port: 80
|
12
|
+
event_host: http://event-runner.com
|
13
|
+
event_port: 443
|
14
|
+
|
15
|
+
production:
|
16
|
+
name: dummy
|
17
|
+
host: http://dummy.com
|
18
|
+
port: 80
|
19
|
+
event_host: http://event-runner.com
|
20
|
+
event_port: 443
|