active_spy 1.0.0.rc → 1.0.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
  SHA1:
3
- metadata.gz: 4cd2e2fa1963b0d3b0245286259ecada944cbf39
4
- data.tar.gz: 4b0265ce9d275414da3ae3e43da3661a5f22dfc0
3
+ metadata.gz: 63646f55b335e82ea778e8c3a4993a476be52765
4
+ data.tar.gz: 2b8997b23b8593f80261ce6bfb85bffedfce549f
5
5
  SHA512:
6
- metadata.gz: 7ee7527b4f6057a9b45a3edd0587c3fcbbc33b94f0fba7cae2ac6c4b8c3b606cf277a40b5a7d13455bb02c47f293a455599ea1c5db5a3006a658aad49e0674c5
7
- data.tar.gz: e533299e79224fb191e0464c19290204596adc873054654cbb834f8de3f1d494354276ac30ccb5bdecb0df949bcd044781273fe4715323b42d9e60107cebca35
6
+ metadata.gz: 84773196a680aff01ad330c72d87f088a47f7b715f0a007582ccf103adc650442fdb6c50ed1685e9b51aa13667d521c86f9279de82241824de5f062b38e00e3a
7
+ data.tar.gz: 9539e10b3494b00222b2b4e11c3ca45d313beb53303f17018a2540b363be12e83a5349354ae949b648dedbee9cc94cba3270594df74b7739844f21266b10b634
data/Gemfile CHANGED
@@ -2,15 +2,15 @@ source 'http://rubygems.org'
2
2
  # Add dependencies required to use your gem here.
3
3
  # Example:
4
4
  # gem "activesupport", ">= 2.3.5"
5
- gem 'activesupport', '~> 4.1.2'
6
- gem 'rest-client', '1.6.7'
5
+ gem 'activesupport', '>= 4.0.0'
6
+ gem 'rest-client', '~> 1.6.7'
7
7
  gem 'hashie'
8
8
 
9
9
  # Add dependencies to develop your gem here.
10
10
  # Include everything needed to run rake, tests, features, etc.
11
11
  group :development do
12
- gem 'activerecord', '~> 4.1.2'
13
- gem 'rails', '~> 4.1.2'
12
+ gem 'activerecord', '>= 4.0.0'
13
+ gem 'rails', '>= 4.0.0'
14
14
  gem 'rubocop', '~> 0.24.0'
15
15
  gem 'pry', '~> 0.10.0'
16
16
  gem 'rspec', '~> 3.0.0'
data/Gemfile.lock CHANGED
@@ -1,27 +1,27 @@
1
1
  GEM
2
2
  remote: http://rubygems.org/
3
3
  specs:
4
- actionmailer (4.1.2)
5
- actionpack (= 4.1.2)
6
- actionview (= 4.1.2)
4
+ actionmailer (4.1.4)
5
+ actionpack (= 4.1.4)
6
+ actionview (= 4.1.4)
7
7
  mail (~> 2.5.4)
8
- actionpack (4.1.2)
9
- actionview (= 4.1.2)
10
- activesupport (= 4.1.2)
8
+ actionpack (4.1.4)
9
+ actionview (= 4.1.4)
10
+ activesupport (= 4.1.4)
11
11
  rack (~> 1.5.2)
12
12
  rack-test (~> 0.6.2)
13
- actionview (4.1.2)
14
- activesupport (= 4.1.2)
13
+ actionview (4.1.4)
14
+ activesupport (= 4.1.4)
15
15
  builder (~> 3.1)
16
16
  erubis (~> 2.7.0)
17
- activemodel (4.1.2)
18
- activesupport (= 4.1.2)
17
+ activemodel (4.1.4)
18
+ activesupport (= 4.1.4)
19
19
  builder (~> 3.1)
20
- activerecord (4.1.2)
21
- activemodel (= 4.1.2)
22
- activesupport (= 4.1.2)
20
+ activerecord (4.1.4)
21
+ activemodel (= 4.1.4)
22
+ activesupport (= 4.1.4)
23
23
  arel (~> 5.0.0)
24
- activesupport (4.1.2)
24
+ activesupport (4.1.4)
25
25
  i18n (~> 0.6, >= 0.6.9)
26
26
  json (~> 1.7, >= 1.7.7)
27
27
  minitest (~> 5.1)
@@ -48,10 +48,10 @@ GEM
48
48
  multi_json (>= 1.7.5, < 2.0)
49
49
  nokogiri (~> 1.6.0)
50
50
  oauth2
51
- hashie (3.1.0)
51
+ hashie (3.2.0)
52
52
  highline (1.6.21)
53
53
  hike (1.2.3)
54
- i18n (0.6.9)
54
+ i18n (0.6.11)
55
55
  jeweler (2.0.1)
56
56
  builder
57
57
  bundler (>= 1.0)
@@ -69,19 +69,19 @@ GEM
69
69
  method_source (0.8.2)
70
70
  mime-types (1.25.1)
71
71
  mini_portile (0.6.0)
72
- minitest (5.3.5)
72
+ minitest (5.4.0)
73
73
  multi_json (1.10.1)
74
74
  multi_xml (0.5.5)
75
75
  multipart-post (2.0.0)
76
76
  nokogiri (1.6.2.1)
77
77
  mini_portile (= 0.6.0)
78
- oauth2 (0.9.4)
78
+ oauth2 (1.0.0)
79
79
  faraday (>= 0.8, < 0.10)
80
80
  jwt (~> 1.0)
81
81
  multi_json (~> 1.3)
82
82
  multi_xml (~> 0.5)
83
83
  rack (~> 1.2)
84
- parser (2.2.0.pre.2)
84
+ parser (2.2.0.pre.3)
85
85
  ast (>= 1.1, < 3.0)
86
86
  slop (~> 3.4, >= 3.4.5)
87
87
  polyglot (0.3.5)
@@ -93,27 +93,28 @@ GEM
93
93
  rack (1.5.2)
94
94
  rack-test (0.6.2)
95
95
  rack (>= 1.0)
96
- rails (4.1.2)
97
- actionmailer (= 4.1.2)
98
- actionpack (= 4.1.2)
99
- actionview (= 4.1.2)
100
- activemodel (= 4.1.2)
101
- activerecord (= 4.1.2)
102
- activesupport (= 4.1.2)
96
+ rails (4.1.4)
97
+ actionmailer (= 4.1.4)
98
+ actionpack (= 4.1.4)
99
+ actionview (= 4.1.4)
100
+ activemodel (= 4.1.4)
101
+ activerecord (= 4.1.4)
102
+ activesupport (= 4.1.4)
103
103
  bundler (>= 1.3.0, < 2.0)
104
- railties (= 4.1.2)
104
+ railties (= 4.1.4)
105
105
  sprockets-rails (~> 2.0)
106
- railties (4.1.2)
107
- actionpack (= 4.1.2)
108
- activesupport (= 4.1.2)
106
+ railties (4.1.4)
107
+ actionpack (= 4.1.4)
108
+ activesupport (= 4.1.4)
109
109
  rake (>= 0.8.7)
110
110
  thor (>= 0.18.1, < 2.0)
111
111
  rainbow (2.0.0)
112
112
  rake (10.3.2)
113
113
  rdoc (4.1.1)
114
114
  json (~> 1.4)
115
- rest-client (1.6.7)
116
- mime-types (>= 1.16)
115
+ rest-client (1.6.8)
116
+ mime-types (~> 1.16)
117
+ rdoc (>= 2.4.2)
117
118
  rspec (3.0.0)
118
119
  rspec-core (~> 3.0.0)
119
120
  rspec-expectations (~> 3.0.0)
@@ -126,9 +127,9 @@ GEM
126
127
  rspec-mocks (3.0.2)
127
128
  rspec-support (~> 3.0.0)
128
129
  rspec-support (3.0.2)
129
- rubocop (0.24.0)
130
+ rubocop (0.24.1)
130
131
  json (>= 1.7.7, < 2)
131
- parser (>= 2.2.0.pre.2, < 3.0)
132
+ parser (>= 2.2.0.pre.3, < 3.0)
132
133
  powerpack (~> 0.0.6)
133
134
  rainbow (>= 1.99.1, < 3.0)
134
135
  ruby-progressbar (~> 1.4)
@@ -162,15 +163,15 @@ PLATFORMS
162
163
  ruby
163
164
 
164
165
  DEPENDENCIES
165
- activerecord (~> 4.1.2)
166
- activesupport (~> 4.1.2)
166
+ activerecord (>= 4.0.0)
167
+ activesupport (>= 4.0.0)
167
168
  bundler (~> 1.6.3)
168
169
  hashie
169
170
  jeweler (~> 2.0.1)
170
171
  pry (~> 0.10.0)
171
- rails (~> 4.1.2)
172
+ rails (>= 4.0.0)
172
173
  rdoc (~> 4.1.1)
173
- rest-client (= 1.6.7)
174
+ rest-client (~> 1.6.7)
174
175
  rspec (~> 3.0.0)
175
176
  rubocop (~> 0.24.0)
176
177
  simplecov
data/README.md CHANGED
@@ -46,9 +46,10 @@ Chair.new.break!
46
46
  ### Rails app
47
47
 
48
48
  First of all, run the install generator: `rails g active_spy:install`.
49
- This command will generate `config/initializers/active_spy.rb` and
50
- `config/active_spy.yml`. You must edit the YAML file to use your own app
51
- parameters.
49
+ This command will inject gem's configurations at `config/environment.rb`,
50
+ generate `config/active_spy.yml` file and mount active_spy's engine at
51
+ `config/routes.rb`. You must edit the YAML file to use your own app
52
+ parameters and optionally change the engine route.
52
53
 
53
54
  Then, create a `ProductEvent` class at `RAILS_ROOT/app/events`
54
55
 
@@ -61,36 +62,29 @@ Declare ActiveSpy's `model_realm`, `model_actor`, and `watch_model_changes`
61
62
  methods in the model that is being watched:
62
63
 
63
64
  ```ruby
64
-
65
65
  class User < ActiveRecord::Base
66
66
  belong_to :project
67
67
  belongs_to :project_group
68
68
 
69
- model_realm { :project }
70
- model_actor :get_actor
69
+ model_realm :realm
70
+ model_actor :my_actor
71
71
  watch_model_changes
72
72
 
73
- def get_actor
74
- self
75
- end
76
-
77
73
  # ActiveSpy's payload_for method override
78
74
  #
79
75
  # def payload_for(method)
80
76
  # { user: attributes }
81
77
  # end
82
-
83
- # ActiveSpy's realm method override
84
- #
85
- # def realm
86
- # return project_group if project_group.admin == self
87
- # project
88
- # end
89
78
  end
90
79
  ```
91
80
 
92
- You may override `payload_for(method)`, `realm` and `actor` for more complex
93
- use cases.
81
+ You may override `payload_for(method)` for more complex use cases. The
82
+ `model_realm :realm` will create a realm attribute accessor for you to use
83
+ wherever you want, usually inside a controller, to set the realm of the user.
84
+ The `model_actor :my_actor` will create an attribute acessdor for the actor,
85
+ but will define it using the `my_actor` and `my_actor=` methods. This allows
86
+ you to avoid your attributes, methods and relations to be overwritten. Both
87
+ realm and actor and necesary to be bent to the event runner.
94
88
 
95
89
  Now, when you can create, update or delete instances of User, a request will be
96
90
  sent to the `event_host` and `event_port` defined in the configuration YAML file.
@@ -99,7 +93,7 @@ The body will be filled with a hash like this, as json:
99
93
  ```
100
94
  {
101
95
  type: 'User', # object's class name
102
- actor: user.actor, # object's actor (who made that action)
96
+ actor: user.my_actor, # object's actor (who made that action)
103
97
  realm: user.realm, # object's realm
104
98
  action: action # the action executed in the object
105
99
  payload: {
@@ -114,18 +108,9 @@ to suit your own needs.
114
108
 
115
109
  #### Handling the request received by the event runner
116
110
 
117
- To handle the request received by the event-runner, you will need to mount
118
- the `ActiveSpy::Engine` in your `routes.rb` file:
119
-
120
- ```ruby
121
- Rails.application.routes.draw do
122
- mount ActiveSpy::Engine => 'active_spy', as: :active_spy
123
- end
124
- ```
125
-
126
- Then, you need to create a listener class, inheriting from
127
- `ActiveSpy::Rails::Listener` and named using the watched model's name
128
- plus the `Listener` postfix, like this:
111
+ To handle the request received by the event-runner, you need to create a
112
+ listener class, inheriting from `ActiveSpy::Rails::Listener` and named using the
113
+ watched model's name plus the `Listener` postfix, like this:
129
114
 
130
115
  ```ruby
131
116
  class UserListener < ActiveSpy::Rails::Listener
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.0.rc
1
+ 1.0.0
data/active_spy.gemspec CHANGED
@@ -2,16 +2,16 @@
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
3
  # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
- # stub: active_spy 1.0.0.rc ruby lib
5
+ # stub: active_spy 1.0.0 ruby lib
6
6
 
7
7
  Gem::Specification.new do |s|
8
8
  s.name = "active_spy"
9
- s.version = "1.0.0.rc"
9
+ s.version = "1.0.0"
10
10
 
11
- s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
11
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
12
12
  s.require_paths = ["lib"]
13
13
  s.authors = ["Douglas Camata"]
14
- s.date = "2014-07-10"
14
+ s.date = "2014-07-16"
15
15
  s.description = " Watch for a method call in any class and run before/after callbacks.\n You can even watch your Rails models for events (like create, update,\n destroy), send these events to a event-runner instance and it redirect these\n events to other apps that are subscrived for them. This gem also provides\n classes that you can use to process the received events too.\n"
16
16
  s.email = "d.camata@gmail.com"
17
17
  s.extra_rdoc_files = [
@@ -27,8 +27,8 @@ Gem::Specification.new do |s|
27
27
  "Rakefile",
28
28
  "VERSION",
29
29
  "active_spy.gemspec",
30
- "app/controllers/active_event/notifications_controller.rb",
31
- "config/initializers/active_event_configuration_loader.rb",
30
+ "app/controllers/active_spy/notifications_controller.rb",
31
+ "config/initializers/active_spy_configuration_loader.rb",
32
32
  "config/routes.rb",
33
33
  "lib/active_spy.rb",
34
34
  "lib/active_spy/base.rb",
@@ -41,9 +41,9 @@ Gem::Specification.new do |s|
41
41
  "lib/active_spy/rails/spy.rb",
42
42
  "lib/active_spy/spy/spy.rb",
43
43
  "lib/active_spy/spy/spy_list.rb",
44
- "lib/rails/generators/active_event/install/install_generator.rb",
45
- "lib/rails/generators/active_event/install/templates/active_event.yml",
46
- "lib/rails/generators/active_event/install/templates/initializer.rb"
44
+ "lib/rails/generators/active_spy/install/install_generator.rb",
45
+ "lib/rails/generators/active_spy/install/templates/active_spy.yml",
46
+ "lib/rails/generators/active_spy/install/templates/initializer.rb"
47
47
  ]
48
48
  s.homepage = "http://github.com/edools/active_spy"
49
49
  s.licenses = ["MIT"]
@@ -54,11 +54,11 @@ Gem::Specification.new do |s|
54
54
  s.specification_version = 4
55
55
 
56
56
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
57
- s.add_runtime_dependency(%q<activesupport>, ["~> 4.1.2"])
58
- s.add_runtime_dependency(%q<rest-client>, ["= 1.6.7"])
57
+ s.add_runtime_dependency(%q<activesupport>, [">= 4.0.0"])
58
+ s.add_runtime_dependency(%q<rest-client>, ["~> 1.6.7"])
59
59
  s.add_runtime_dependency(%q<hashie>, [">= 0"])
60
- s.add_development_dependency(%q<activerecord>, ["~> 4.1.2"])
61
- s.add_development_dependency(%q<rails>, ["~> 4.1.2"])
60
+ s.add_development_dependency(%q<activerecord>, [">= 4.0.0"])
61
+ s.add_development_dependency(%q<rails>, [">= 4.0.0"])
62
62
  s.add_development_dependency(%q<rubocop>, ["~> 0.24.0"])
63
63
  s.add_development_dependency(%q<pry>, ["~> 0.10.0"])
64
64
  s.add_development_dependency(%q<rspec>, ["~> 3.0.0"])
@@ -68,11 +68,11 @@ Gem::Specification.new do |s|
68
68
  s.add_development_dependency(%q<jeweler>, ["~> 2.0.1"])
69
69
  s.add_development_dependency(%q<simplecov>, [">= 0"])
70
70
  else
71
- s.add_dependency(%q<activesupport>, ["~> 4.1.2"])
72
- s.add_dependency(%q<rest-client>, ["= 1.6.7"])
71
+ s.add_dependency(%q<activesupport>, [">= 4.0.0"])
72
+ s.add_dependency(%q<rest-client>, ["~> 1.6.7"])
73
73
  s.add_dependency(%q<hashie>, [">= 0"])
74
- s.add_dependency(%q<activerecord>, ["~> 4.1.2"])
75
- s.add_dependency(%q<rails>, ["~> 4.1.2"])
74
+ s.add_dependency(%q<activerecord>, [">= 4.0.0"])
75
+ s.add_dependency(%q<rails>, [">= 4.0.0"])
76
76
  s.add_dependency(%q<rubocop>, ["~> 0.24.0"])
77
77
  s.add_dependency(%q<pry>, ["~> 0.10.0"])
78
78
  s.add_dependency(%q<rspec>, ["~> 3.0.0"])
@@ -83,11 +83,11 @@ Gem::Specification.new do |s|
83
83
  s.add_dependency(%q<simplecov>, [">= 0"])
84
84
  end
85
85
  else
86
- s.add_dependency(%q<activesupport>, ["~> 4.1.2"])
87
- s.add_dependency(%q<rest-client>, ["= 1.6.7"])
86
+ s.add_dependency(%q<activesupport>, [">= 4.0.0"])
87
+ s.add_dependency(%q<rest-client>, ["~> 1.6.7"])
88
88
  s.add_dependency(%q<hashie>, [">= 0"])
89
- s.add_dependency(%q<activerecord>, ["~> 4.1.2"])
90
- s.add_dependency(%q<rails>, ["~> 4.1.2"])
89
+ s.add_dependency(%q<activerecord>, [">= 4.0.0"])
90
+ s.add_dependency(%q<rails>, [">= 4.0.0"])
91
91
  s.add_dependency(%q<rubocop>, ["~> 0.24.0"])
92
92
  s.add_dependency(%q<pry>, ["~> 0.10.0"])
93
93
  s.add_dependency(%q<rspec>, ["~> 3.0.0"])
@@ -0,0 +1,21 @@
1
+ module ActiveSpy
2
+ class NotificationsController < ActionController::Base
3
+ def handle
4
+ request.format = 'application/json'
5
+ hooks = ActiveSpy::Rails::HookList.hooks
6
+ result = nil
7
+ hooks.each do |hook|
8
+ if hook['post_class'].downcase == params['class']
9
+ listener = "#{hook['post_class']}Listener".constantize
10
+ result = listener.new.handle(params['event'])
11
+ if result.errors.present?
12
+ render json: result.errors
13
+ else
14
+ render json: result
15
+ end and return
16
+ end
17
+ end
18
+ render nothing: true, status: :not_found
19
+ end
20
+ end
21
+ end
@@ -1,8 +1,13 @@
1
1
  require 'hashie'
2
2
 
3
3
  yml_path = Rails.root.join('config', 'active_spy.yml')
4
- all_settings = YAML.load_file(yml_path)
5
- env_settings = Hashie::Mash.new(all_settings[Rails.env])
4
+ if File.exists?(yml_path)
5
+ all_settings = YAML.load_file(yml_path)
6
+ env_settings = Hashie::Mash.new(all_settings[Rails.env])
7
+ else
8
+ # TODO: Add a warning here
9
+ env_settings = {}
10
+ end
6
11
 
7
12
  ActiveSpy.configure do |config|
8
13
  config.name env_settings['name']
@@ -10,20 +10,15 @@ module ActiveSpy
10
10
  class Base
11
11
  def initialize(object)
12
12
  @object = object
13
+ inject_is_new_method(@object)
14
+ @object.is_new = true if @object.new_record?
13
15
  end
14
16
 
15
17
  # Overriding to avoid sending the object to server 2 times (in both
16
18
  # before and after callabcks).
17
19
  #
18
20
  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?
21
+ method.include?('after_')
27
22
  end
28
23
 
29
24
  # Inject an attribute in the +object+, called +is_new?+ and a setter
@@ -48,7 +43,7 @@ module ActiveSpy
48
43
  host = ActiveSpy::Configuration.event_host
49
44
  port = ActiveSpy::Configuration.event_port
50
45
 
51
- RestClient.post "#{host}:#{port}/",
46
+ RestClient.post "#{host}:#{port}/events",
52
47
  event: get_request_params(method)
53
48
  remove_is_new_method(@object)
54
49
  end
@@ -60,8 +55,8 @@ module ActiveSpy
60
55
  action = get_action(real_method)
61
56
  {
62
57
  type: @object.class.name,
63
- actor: @object.actor,
64
- realm: @object.realm,
58
+ actor: @object.instance_variable_get('@actor'),
59
+ realm: @object.instance_variable_get('@realm'),
65
60
  payload: @object.payload_for(action),
66
61
  action: action
67
62
  }
@@ -6,6 +6,10 @@ module ActiveSpy
6
6
  class HookList
7
7
  include Singleton
8
8
 
9
+ # Simple attribute reader for hooks
10
+ #
11
+ attr_reader :hooks
12
+
9
13
  # Initialize an empty hook list
10
14
  #
11
15
  def initialize
@@ -39,6 +43,7 @@ module ActiveSpy
39
43
  # them already exists, they will be excluded and readded.
40
44
  #
41
45
  def register
46
+ @hooks = @hooks.map(&:to_hook).flatten
42
47
  old_hooks = get_old_hooks
43
48
  hooks_to_delete = get_hooks_to_delete(old_hooks)
44
49
  hooks_to_add = get_hooks_to_add(old_hooks)
@@ -49,7 +54,6 @@ module ActiveSpy
49
54
  # Get the old hooks list for this service from the event-runner
50
55
  #
51
56
  def get_old_hooks
52
-
53
57
  JSON.load(RestClient.get(@base_service_url))['hooks']
54
58
  end
55
59
 
@@ -102,11 +106,11 @@ module ActiveSpy
102
106
  #
103
107
  def add_hooks(hooks_to_add)
104
108
  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
- }
109
+ RestClient.post "#{@base_service_url}/hooks",
110
+ 'hook'=> {
111
+ 'class'=> hook['class'],
112
+ 'post_path' => ActiveSpy::Engine.routes.url_helpers.notifications_path(hook['post_class'].downcase),
113
+ }
110
114
  end
111
115
  end
112
116
  end
@@ -18,23 +18,47 @@ module ActiveSpy
18
18
  # later registration of them within the event runner.
19
19
  #
20
20
  def self.inherited(child)
21
- if child.name.include? 'Listener'
22
- ActiveSpy::Rails::HookList << {
23
- 'class' => child.name.split('Listener')[0]
24
- }
21
+ ActiveSpy::Rails::HookList << child
22
+ end
23
+
24
+ # Set the external class of the model that we are listening to.
25
+ #
26
+ def self.external_class(klass)
27
+ @@external_classes = [klass]
28
+ end
29
+
30
+ # Set the external classes which we are listening to.
31
+ #
32
+ def self.external_classes(*classes)
33
+ @@external_classes = classes
34
+ end
35
+
36
+ # Convert the listener class into one or more hook hashes
37
+ #
38
+ def self.to_hook
39
+ hooks = []
40
+ hook_classes.each do |hook_class|
41
+ hooks << { 'class' => hook_class, 'post_class'=> name.split('Listener')[0] }
25
42
  end
43
+ hooks
44
+ end
45
+
46
+ # Get the classes that we are listegnig to.
47
+ #
48
+ def self.hook_classes
49
+ return @@external_classes if defined? @@external_classes
50
+ [name.split('Listener')[0]]
26
51
  end
27
52
 
28
53
  # Handle a request with +params+ and sync the database according to
29
54
  # them.
30
55
  #
31
56
  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
-
57
+ object_type = params.delete('type')
58
+ callback = params.delete('action')
59
+ payload_content = params.delete('payload')[object_type.downcase]
60
+ actor = params.delete('actor')
61
+ realm = params.delete('realm')
38
62
  sync_database(callback, object_type, payload_content, actor, realm)
39
63
  end
40
64
 
@@ -51,7 +75,9 @@ module ActiveSpy
51
75
  #
52
76
  def create(object_type, payload, _actor, _realm)
53
77
  klass = get_object_class(object_type)
54
- klass.new.update_attributes(payload)
78
+ object = klass.new
79
+ object.update_attributes(payload)
80
+ object
55
81
  end
56
82
 
57
83
  # Logic to handle object's update. You can override this, as you wish,
@@ -59,8 +85,10 @@ module ActiveSpy
59
85
  #
60
86
  def update(object_type, payload, _actor, _realm)
61
87
  klass = get_object_class(object_type)
62
- guid = payload.delete(:guid)
63
- klass.find_by(guid: guid).update_attributes(payload)
88
+ guid = payload['guid']
89
+ object = klass.find_by(guid: guid)
90
+ object.update_attributes(payload)
91
+ object
64
92
  end
65
93
 
66
94
  # Destroy a record from our database. You can override this, as you wish,
@@ -68,8 +96,10 @@ module ActiveSpy
68
96
  #
69
97
  def destroy(klass, payload, _actor, _realm)
70
98
  klass = get_object_class(klass)
71
- guid = payload.delete(:guid)
72
- klass.find_by(guid: guid).destroy!
99
+ guid = payload.delete('guid')
100
+ object = klass.find_by(guid: guid)
101
+ object.destroy!
102
+ object
73
103
  end
74
104
 
75
105
  # Gets the object class. First, it'll look the {MODEL_HANDLER} hash and
@@ -10,8 +10,4 @@ class Railtie < Rails::Railtie
10
10
  include ActiveSpy::Rails::Spy
11
11
  end
12
12
  end
13
-
14
- config.after_initialize do
15
- Rails.application.eager_load!
16
- end
17
13
  end
@@ -19,21 +19,33 @@ module ActiveSpy
19
19
  module ClassMethods
20
20
  # Class method to define the realm of the model.
21
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
22
+ def model_realm(realm_name = nil)
23
+ dynamically_define_method_or_call_block(:realm, realm_name)
28
24
  end
29
25
 
30
26
  # Class method to define the actor of the model.
31
27
  #
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
28
+ def model_actor(actor_name = nil)
29
+ dynamically_define_method_or_call_block(:actor, actor_name)
30
+ end
31
+
32
+ # Defines a method called +method_name+ that will call a method called
33
+ # +method_value+ if a symbol is provided. If a block is provided
34
+ # instead, it will be returned.
35
+ #
36
+ def dynamically_define_method_or_call_block(abstract_name, method_name)
37
+ if method_name
38
+ if abstract_name == method_name
39
+ attr_accessor method_name
40
+ else
41
+ define_method method_name do
42
+ send(:instance_variable_get, "@#{abstract_name}")
43
+ end
44
+
45
+ define_method "#{method_name}=" do |new_value|
46
+ send(:instance_variable_set, "@#{abstract_name}", new_value)
47
+ end
48
+ end
37
49
  end
38
50
  end
39
51
 
@@ -52,9 +52,9 @@ module ActiveSpy
52
52
  ActiveSupport::Inflector.constantize(klass).class_eval do
53
53
 
54
54
  old_method = instance_method(method)
55
- define_method method do
55
+ define_method method do |*args, &block|
56
56
  send(:invoke_callback, method, :before)
57
- result = old_method.bind(self).call
57
+ result = old_method.bind(self).call(*args, &block)
58
58
  send(:invoke_callback, method, :after)
59
59
  result
60
60
  end
data/lib/active_spy.rb CHANGED
@@ -32,7 +32,7 @@ module ActiveSpy
32
32
  @@base_url = "#{host}:#{port}/services"
33
33
 
34
34
  return if self.service_registered?
35
- RestClient.post @@base_url, service: ActiveSpy::Configuration.settings
35
+ RestClient.post(@@base_url, service: ActiveSpy::Configuration.settings)
36
36
  end
37
37
 
38
38
  # @!method self.service_registered?
@@ -41,8 +41,13 @@ module ActiveSpy
41
41
  #
42
42
  def self.service_registered?
43
43
  name = ActiveSpy::Configuration.name
44
- r = RestClient.get "#{@@base_url}/#{name.downcase.gsub(' ', '-').strip}"
45
- r.code == 200
44
+ begin
45
+ r = RestClient.get "#{@@base_url}/#{name.downcase.gsub(' ', '-').strip}"
46
+ rescue RestClient::ResourceNotFound
47
+ return false
48
+ else
49
+ return true
50
+ end
46
51
  end
47
52
  end
48
53
  end
@@ -0,0 +1,41 @@
1
+ # encoding: utf-8
2
+
3
+ module ActiveSpy
4
+ # Module that holds the rails generators
5
+ #
6
+ module Generators
7
+ # The generator that installs the gem
8
+ #
9
+ class InstallGenerator < ::Rails::Generators::Base
10
+ desc 'Creates an active_spy gem configuration file at config/active_spy.yml, and inject configurations at config/environment.rb'
11
+
12
+ # The source for templates
13
+ #
14
+ def self.source_root
15
+ @@_active_spy_source_root ||= File.expand_path("../templates", __FILE__)
16
+ end
17
+
18
+ # Creates a config file based in the +active_spy.yml+ file.
19
+ #
20
+ def create_config_file
21
+ template 'active_spy.yml', File.join('config', 'active_spy.yml')
22
+ end
23
+
24
+ # Injects the {ActiveSpy} initialization in the environment.
25
+ #
26
+ def inject_config_into_environment
27
+ content = File.read(File.join(@@_active_spy_source_root, 'initializer.rb'))
28
+
29
+ File.open("config/environment.rb", "a+") do |f|
30
+ f << content unless f.read.include?(content)
31
+ end
32
+ end
33
+
34
+ # Mount {ActiveSpy::Engine} in the route file.
35
+ #
36
+ def mount_engine
37
+ route "mount ActiveSpy::Engine => 'active_spy', as: :active_spy"
38
+ end
39
+ end
40
+ end
41
+ end
@@ -1,3 +1,4 @@
1
+ Rails.application.eager_load!
1
2
  ActiveSpy::SpyList.activate
2
3
 
3
4
  if Rails.env.production?
metadata CHANGED
@@ -1,41 +1,41 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_spy
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.rc
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Douglas Camata
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-10 00:00:00.000000000 Z
11
+ date: 2014-07-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 4.1.2
19
+ version: 4.0.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: 4.1.2
26
+ version: 4.0.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rest-client
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '='
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
33
  version: 1.6.7
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '='
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: 1.6.7
41
41
  - !ruby/object:Gem::Dependency
@@ -56,30 +56,30 @@ dependencies:
56
56
  name: activerecord
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "~>"
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: 4.1.2
61
+ version: 4.0.0
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - "~>"
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
- version: 4.1.2
68
+ version: 4.0.0
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rails
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - "~>"
73
+ - - ">="
74
74
  - !ruby/object:Gem::Version
75
- version: 4.1.2
75
+ version: 4.0.0
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: 4.1.2
82
+ version: 4.0.0
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: rubocop
85
85
  requirement: !ruby/object:Gem::Requirement
@@ -213,8 +213,8 @@ files:
213
213
  - Rakefile
214
214
  - VERSION
215
215
  - active_spy.gemspec
216
- - app/controllers/active_event/notifications_controller.rb
217
- - config/initializers/active_event_configuration_loader.rb
216
+ - app/controllers/active_spy/notifications_controller.rb
217
+ - config/initializers/active_spy_configuration_loader.rb
218
218
  - config/routes.rb
219
219
  - lib/active_spy.rb
220
220
  - lib/active_spy/base.rb
@@ -227,9 +227,9 @@ files:
227
227
  - lib/active_spy/rails/spy.rb
228
228
  - lib/active_spy/spy/spy.rb
229
229
  - lib/active_spy/spy/spy_list.rb
230
- - lib/rails/generators/active_event/install/install_generator.rb
231
- - lib/rails/generators/active_event/install/templates/active_event.yml
232
- - lib/rails/generators/active_event/install/templates/initializer.rb
230
+ - lib/rails/generators/active_spy/install/install_generator.rb
231
+ - lib/rails/generators/active_spy/install/templates/active_spy.yml
232
+ - lib/rails/generators/active_spy/install/templates/initializer.rb
233
233
  homepage: http://github.com/edools/active_spy
234
234
  licenses:
235
235
  - MIT
@@ -245,9 +245,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
245
245
  version: '0'
246
246
  required_rubygems_version: !ruby/object:Gem::Requirement
247
247
  requirements:
248
- - - ">"
248
+ - - ">="
249
249
  - !ruby/object:Gem::Version
250
- version: 1.3.1
250
+ version: '0'
251
251
  requirements: []
252
252
  rubyforge_project:
253
253
  rubygems_version: 2.2.2
@@ -1,6 +0,0 @@
1
- module ActiveSpy
2
- class NotificationsController < ActionController::Base
3
- def handle
4
- end
5
- end
6
- end
@@ -1,21 +0,0 @@
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