rabbit_feed 0.3.1
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/.gitignore +11 -0
- data/.rspec +3 -0
- data/Brewfile +4 -0
- data/DEVELOPING.md +140 -0
- data/Gemfile +15 -0
- data/Gemfile.lock +121 -0
- data/LICENSE.txt +9 -0
- data/README.md +304 -0
- data/Rakefile +30 -0
- data/bin/bundle +3 -0
- data/bin/rabbit_feed +11 -0
- data/example/non_rails_app/.rspec +1 -0
- data/example/non_rails_app/Gemfile +7 -0
- data/example/non_rails_app/Gemfile.lock +56 -0
- data/example/non_rails_app/Rakefile +5 -0
- data/example/non_rails_app/bin/benchmark +63 -0
- data/example/non_rails_app/bin/bundle +3 -0
- data/example/non_rails_app/config/rabbit_feed.yml +8 -0
- data/example/non_rails_app/lib/non_rails_app.rb +32 -0
- data/example/non_rails_app/lib/non_rails_app/event_handler.rb +10 -0
- data/example/non_rails_app/log/.keep +0 -0
- data/example/non_rails_app/spec/lib/non_rails_app/event_handler_spec.rb +14 -0
- data/example/non_rails_app/spec/lib/non_rails_app/event_routing_spec.rb +14 -0
- data/example/non_rails_app/spec/spec_helper.rb +31 -0
- data/example/non_rails_app/tmp/pids/.keep +0 -0
- data/example/rails_app/.gitignore +17 -0
- data/example/rails_app/.node-version +1 -0
- data/example/rails_app/.rspec +1 -0
- data/example/rails_app/Gemfile +36 -0
- data/example/rails_app/Gemfile.lock +173 -0
- data/example/rails_app/README.rdoc +28 -0
- data/example/rails_app/Rakefile +6 -0
- data/example/rails_app/app/assets/images/.keep +0 -0
- data/example/rails_app/app/assets/javascripts/application.js +16 -0
- data/example/rails_app/app/assets/javascripts/beavers.js.coffee +3 -0
- data/example/rails_app/app/assets/stylesheets/application.css +15 -0
- data/example/rails_app/app/assets/stylesheets/beavers.css.scss +3 -0
- data/example/rails_app/app/assets/stylesheets/scaffolds.css.scss +69 -0
- data/example/rails_app/app/controllers/application_controller.rb +5 -0
- data/example/rails_app/app/controllers/beavers_controller.rb +81 -0
- data/example/rails_app/app/controllers/concerns/.keep +0 -0
- data/example/rails_app/app/helpers/application_helper.rb +2 -0
- data/example/rails_app/app/helpers/beavers_helper.rb +2 -0
- data/example/rails_app/app/mailers/.keep +0 -0
- data/example/rails_app/app/models/.keep +0 -0
- data/example/rails_app/app/models/beaver.rb +2 -0
- data/example/rails_app/app/models/concerns/.keep +0 -0
- data/example/rails_app/app/views/beavers/_form.html.erb +21 -0
- data/example/rails_app/app/views/beavers/edit.html.erb +6 -0
- data/example/rails_app/app/views/beavers/index.html.erb +25 -0
- data/example/rails_app/app/views/beavers/index.json.jbuilder +4 -0
- data/example/rails_app/app/views/beavers/new.html.erb +5 -0
- data/example/rails_app/app/views/beavers/show.html.erb +9 -0
- data/example/rails_app/app/views/beavers/show.json.jbuilder +1 -0
- data/example/rails_app/app/views/layouts/application.html.erb +14 -0
- data/example/rails_app/bin/bundle +3 -0
- data/example/rails_app/bin/rails +4 -0
- data/example/rails_app/bin/rake +4 -0
- data/example/rails_app/config.ru +4 -0
- data/example/rails_app/config/application.rb +25 -0
- data/example/rails_app/config/boot.rb +4 -0
- data/example/rails_app/config/database.yml +22 -0
- data/example/rails_app/config/environment.rb +5 -0
- data/example/rails_app/config/environments/development.rb +83 -0
- data/example/rails_app/config/environments/test.rb +39 -0
- data/example/rails_app/config/initializers/backtrace_silencers.rb +7 -0
- data/example/rails_app/config/initializers/cookies_serializer.rb +3 -0
- data/example/rails_app/config/initializers/filter_parameter_logging.rb +4 -0
- data/example/rails_app/config/initializers/inflections.rb +16 -0
- data/example/rails_app/config/initializers/mime_types.rb +4 -0
- data/example/rails_app/config/initializers/rabbit_feed.rb +43 -0
- data/example/rails_app/config/initializers/session_store.rb +3 -0
- data/example/rails_app/config/initializers/wrap_parameters.rb +14 -0
- data/example/rails_app/config/locales/en.yml +23 -0
- data/example/rails_app/config/rabbit_feed.yml +8 -0
- data/example/rails_app/config/routes.rb +58 -0
- data/example/rails_app/config/secrets.yml +18 -0
- data/example/rails_app/config/unicorn.rb +4 -0
- data/example/rails_app/db/migrate/20140424102400_create_beavers.rb +9 -0
- data/example/rails_app/db/schema.rb +22 -0
- data/example/rails_app/db/seeds.rb +7 -0
- data/example/rails_app/lib/assets/.keep +0 -0
- data/example/rails_app/lib/event_handler.rb +7 -0
- data/example/rails_app/lib/tasks/.keep +0 -0
- data/example/rails_app/log/.keep +0 -0
- data/example/rails_app/public/404.html +67 -0
- data/example/rails_app/public/422.html +67 -0
- data/example/rails_app/public/500.html +66 -0
- data/example/rails_app/public/favicon.ico +0 -0
- data/example/rails_app/public/robots.txt +5 -0
- data/example/rails_app/spec/controllers/beavers_controller_spec.rb +32 -0
- data/example/rails_app/spec/event_routing_spec.rb +15 -0
- data/example/rails_app/spec/spec_helper.rb +51 -0
- data/example/rails_app/test/controllers/.keep +0 -0
- data/example/rails_app/test/controllers/beavers_controller_test.rb +49 -0
- data/example/rails_app/test/fixtures/.keep +0 -0
- data/example/rails_app/test/fixtures/beavers.yml +7 -0
- data/example/rails_app/test/helpers/.keep +0 -0
- data/example/rails_app/test/helpers/beavers_helper_test.rb +4 -0
- data/example/rails_app/test/integration/.keep +0 -0
- data/example/rails_app/test/mailers/.keep +0 -0
- data/example/rails_app/test/models/.keep +0 -0
- data/example/rails_app/test/models/beaver_test.rb +7 -0
- data/example/rails_app/test/test_helper.rb +13 -0
- data/example/rails_app/tmp/pids/.keep +0 -0
- data/example/rails_app/vendor/assets/javascripts/.keep +0 -0
- data/example/rails_app/vendor/assets/stylesheets/.keep +0 -0
- data/lib/dsl.rb +9 -0
- data/lib/rabbit_feed.rb +41 -0
- data/lib/rabbit_feed/client.rb +181 -0
- data/lib/rabbit_feed/configuration.rb +50 -0
- data/lib/rabbit_feed/connection_concern.rb +95 -0
- data/lib/rabbit_feed/consumer.rb +14 -0
- data/lib/rabbit_feed/consumer_connection.rb +108 -0
- data/lib/rabbit_feed/event.rb +43 -0
- data/lib/rabbit_feed/event_definitions.rb +98 -0
- data/lib/rabbit_feed/event_routing.rb +90 -0
- data/lib/rabbit_feed/producer.rb +47 -0
- data/lib/rabbit_feed/producer_connection.rb +65 -0
- data/lib/rabbit_feed/testing_support/rspec_matchers/publish_event.rb +90 -0
- data/lib/rabbit_feed/testing_support/testing_helpers.rb +16 -0
- data/lib/rabbit_feed/version.rb +3 -0
- data/logo.png +0 -0
- data/rabbit_feed.gemspec +35 -0
- data/run_benchmark +35 -0
- data/run_example +62 -0
- data/run_recovery_test +26 -0
- data/spec/features/connectivity.feature +13 -0
- data/spec/features/step_definitions/connectivity_steps.rb +96 -0
- data/spec/fixtures/configuration.yml +14 -0
- data/spec/lib/rabbit_feed/client_spec.rb +116 -0
- data/spec/lib/rabbit_feed/configuration_spec.rb +121 -0
- data/spec/lib/rabbit_feed/connection_concern_spec.rb +116 -0
- data/spec/lib/rabbit_feed/consumer_connection_spec.rb +85 -0
- data/spec/lib/rabbit_feed/event_definitions_spec.rb +139 -0
- data/spec/lib/rabbit_feed/event_routing_spec.rb +121 -0
- data/spec/lib/rabbit_feed/event_spec.rb +33 -0
- data/spec/lib/rabbit_feed/producer_connection_spec.rb +72 -0
- data/spec/lib/rabbit_feed/producer_spec.rb +57 -0
- data/spec/lib/rabbit_feed/testing_support/rspec_matchers/publish_event_spec.rb +60 -0
- data/spec/lib/rabbit_feed/testing_support/testing_helper_spec.rb +34 -0
- data/spec/spec_helper.rb +58 -0
- data/spec/support/shared_examples_for_connections.rb +40 -0
- metadata +305 -0
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<title>The change you wanted was rejected (422)</title>
|
|
5
|
+
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
6
|
+
<style>
|
|
7
|
+
body {
|
|
8
|
+
background-color: #EFEFEF;
|
|
9
|
+
color: #2E2F30;
|
|
10
|
+
text-align: center;
|
|
11
|
+
font-family: arial, sans-serif;
|
|
12
|
+
margin: 0;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
div.dialog {
|
|
16
|
+
width: 95%;
|
|
17
|
+
max-width: 33em;
|
|
18
|
+
margin: 4em auto 0;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
div.dialog > div {
|
|
22
|
+
border: 1px solid #CCC;
|
|
23
|
+
border-right-color: #999;
|
|
24
|
+
border-left-color: #999;
|
|
25
|
+
border-bottom-color: #BBB;
|
|
26
|
+
border-top: #B00100 solid 4px;
|
|
27
|
+
border-top-left-radius: 9px;
|
|
28
|
+
border-top-right-radius: 9px;
|
|
29
|
+
background-color: white;
|
|
30
|
+
padding: 7px 12% 0;
|
|
31
|
+
box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
h1 {
|
|
35
|
+
font-size: 100%;
|
|
36
|
+
color: #730E15;
|
|
37
|
+
line-height: 1.5em;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
div.dialog > p {
|
|
41
|
+
margin: 0 0 1em;
|
|
42
|
+
padding: 1em;
|
|
43
|
+
background-color: #F7F7F7;
|
|
44
|
+
border: 1px solid #CCC;
|
|
45
|
+
border-right-color: #999;
|
|
46
|
+
border-left-color: #999;
|
|
47
|
+
border-bottom-color: #999;
|
|
48
|
+
border-bottom-left-radius: 4px;
|
|
49
|
+
border-bottom-right-radius: 4px;
|
|
50
|
+
border-top-color: #DADADA;
|
|
51
|
+
color: #666;
|
|
52
|
+
box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
|
|
53
|
+
}
|
|
54
|
+
</style>
|
|
55
|
+
</head>
|
|
56
|
+
|
|
57
|
+
<body>
|
|
58
|
+
<!-- This file lives in public/422.html -->
|
|
59
|
+
<div class="dialog">
|
|
60
|
+
<div>
|
|
61
|
+
<h1>The change you wanted was rejected.</h1>
|
|
62
|
+
<p>Maybe you tried to change something you didn't have access to.</p>
|
|
63
|
+
</div>
|
|
64
|
+
<p>If you are the application owner check the logs for more information.</p>
|
|
65
|
+
</div>
|
|
66
|
+
</body>
|
|
67
|
+
</html>
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<title>We're sorry, but something went wrong (500)</title>
|
|
5
|
+
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
6
|
+
<style>
|
|
7
|
+
body {
|
|
8
|
+
background-color: #EFEFEF;
|
|
9
|
+
color: #2E2F30;
|
|
10
|
+
text-align: center;
|
|
11
|
+
font-family: arial, sans-serif;
|
|
12
|
+
margin: 0;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
div.dialog {
|
|
16
|
+
width: 95%;
|
|
17
|
+
max-width: 33em;
|
|
18
|
+
margin: 4em auto 0;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
div.dialog > div {
|
|
22
|
+
border: 1px solid #CCC;
|
|
23
|
+
border-right-color: #999;
|
|
24
|
+
border-left-color: #999;
|
|
25
|
+
border-bottom-color: #BBB;
|
|
26
|
+
border-top: #B00100 solid 4px;
|
|
27
|
+
border-top-left-radius: 9px;
|
|
28
|
+
border-top-right-radius: 9px;
|
|
29
|
+
background-color: white;
|
|
30
|
+
padding: 7px 12% 0;
|
|
31
|
+
box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
h1 {
|
|
35
|
+
font-size: 100%;
|
|
36
|
+
color: #730E15;
|
|
37
|
+
line-height: 1.5em;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
div.dialog > p {
|
|
41
|
+
margin: 0 0 1em;
|
|
42
|
+
padding: 1em;
|
|
43
|
+
background-color: #F7F7F7;
|
|
44
|
+
border: 1px solid #CCC;
|
|
45
|
+
border-right-color: #999;
|
|
46
|
+
border-left-color: #999;
|
|
47
|
+
border-bottom-color: #999;
|
|
48
|
+
border-bottom-left-radius: 4px;
|
|
49
|
+
border-bottom-right-radius: 4px;
|
|
50
|
+
border-top-color: #DADADA;
|
|
51
|
+
color: #666;
|
|
52
|
+
box-shadow: 0 3px 8px rgba(50, 50, 50, 0.17);
|
|
53
|
+
}
|
|
54
|
+
</style>
|
|
55
|
+
</head>
|
|
56
|
+
|
|
57
|
+
<body>
|
|
58
|
+
<!-- This file lives in public/500.html -->
|
|
59
|
+
<div class="dialog">
|
|
60
|
+
<div>
|
|
61
|
+
<h1>We're sorry, but something went wrong.</h1>
|
|
62
|
+
</div>
|
|
63
|
+
<p>If you are the application owner check the logs for more information.</p>
|
|
64
|
+
</div>
|
|
65
|
+
</body>
|
|
66
|
+
</html>
|
|
File without changes
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe BeaversController do
|
|
4
|
+
|
|
5
|
+
describe 'POST create' do
|
|
6
|
+
it 'publishes a create event' do
|
|
7
|
+
expect{
|
|
8
|
+
post :create, beaver: { name: 'beaver' }
|
|
9
|
+
}.to publish_event('user_creates_beaver', { 'beaver_name' => 'beaver' })
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
context 'for an existing beaver' do
|
|
14
|
+
let(:beaver) { Beaver.create name: 'beaver' }
|
|
15
|
+
|
|
16
|
+
describe 'PUT update' do
|
|
17
|
+
it 'publishes an update event' do
|
|
18
|
+
expect{
|
|
19
|
+
put :update, id: beaver.id, beaver: { name: 'beaver_updated' }
|
|
20
|
+
}.to publish_event('user_updates_beaver', { 'beaver_name' => 'beaver_updated' })
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
describe 'DELETE destroy' do
|
|
25
|
+
it 'publishes an delete event' do
|
|
26
|
+
expect{
|
|
27
|
+
delete :destroy, id: beaver.id
|
|
28
|
+
}.to publish_event('user_deletes_beaver', { 'beaver_name' => 'beaver' })
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
require_relative 'spec_helper'
|
|
2
|
+
require_relative '../config/initializers/rabbit_feed'
|
|
3
|
+
|
|
4
|
+
module RailsApp
|
|
5
|
+
describe 'Event Routing' do
|
|
6
|
+
|
|
7
|
+
include RabbitFeed::TestingSupport::TestingHelpers
|
|
8
|
+
|
|
9
|
+
let(:event) { {'application' => 'non_rails_app', 'name' => 'application_acknowledges_event'} }
|
|
10
|
+
it 'routes events correctly' do
|
|
11
|
+
expect(::EventHandler).to receive(:handle_event)
|
|
12
|
+
rabbit_feed_consumer.consume_event(event)
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# This file is copied to spec/ when you run 'rails generate rspec:install'
|
|
2
|
+
ENV["RAILS_ENV"] ||= 'test'
|
|
3
|
+
require File.expand_path("../../config/environment", __FILE__)
|
|
4
|
+
require 'rspec/rails'
|
|
5
|
+
|
|
6
|
+
# Requires supporting ruby files with custom matchers and macros, etc, in
|
|
7
|
+
# spec/support/ and its subdirectories. Files matching `spec/**/*_spec.rb` are
|
|
8
|
+
# run as spec files by default. This means that files in spec/support that end
|
|
9
|
+
# in _spec.rb will both be required and run as specs, causing the specs to be
|
|
10
|
+
# run twice. It is recommended that you do not name files matching this glob to
|
|
11
|
+
# end with _spec.rb. You can configure this pattern with with the --pattern
|
|
12
|
+
# option on the command line or in ~/.rspec, .rspec or `.rspec-local`.
|
|
13
|
+
Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }
|
|
14
|
+
|
|
15
|
+
# Checks for pending migrations before tests are run.
|
|
16
|
+
# If you are not using ActiveRecord, you can remove this line.
|
|
17
|
+
ActiveRecord::Migration.check_pending! if defined?(ActiveRecord::Migration)
|
|
18
|
+
|
|
19
|
+
RSpec.configure do |config|
|
|
20
|
+
# ## Mock Framework
|
|
21
|
+
#
|
|
22
|
+
# If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
|
|
23
|
+
#
|
|
24
|
+
# config.mock_with :mocha
|
|
25
|
+
# config.mock_with :flexmock
|
|
26
|
+
# config.mock_with :rr
|
|
27
|
+
|
|
28
|
+
# Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
|
|
29
|
+
config.fixture_path = "#{::Rails.root}/spec/fixtures"
|
|
30
|
+
|
|
31
|
+
# If you're not using ActiveRecord, or you'd prefer not to run each of your
|
|
32
|
+
# examples within a transaction, remove the following line or assign false
|
|
33
|
+
# instead of true.
|
|
34
|
+
config.use_transactional_fixtures = true
|
|
35
|
+
|
|
36
|
+
# Run specs in random order to surface order dependencies. If you find an
|
|
37
|
+
# order dependency and want to debug it, you can fix the order by providing
|
|
38
|
+
# the seed, which is printed after each run.
|
|
39
|
+
# --seed 1234
|
|
40
|
+
config.order = "random"
|
|
41
|
+
|
|
42
|
+
config.mock_with :rspec do |c|
|
|
43
|
+
c.syntax = [:should, :expect]
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
config.before :each do
|
|
47
|
+
RabbitFeed::Producer.stub!
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
config.include(RabbitFeed::TestingSupport::RSpecMatchers)
|
|
51
|
+
end
|
|
File without changes
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class BeaversControllerTest < ActionController::TestCase
|
|
4
|
+
setup do
|
|
5
|
+
@beaver = beavers(:one)
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
test "should get index" do
|
|
9
|
+
get :index
|
|
10
|
+
assert_response :success
|
|
11
|
+
assert_not_nil assigns(:beavers)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
test "should get new" do
|
|
15
|
+
get :new
|
|
16
|
+
assert_response :success
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
test "should create beaver" do
|
|
20
|
+
assert_difference('Beaver.count') do
|
|
21
|
+
post :create, beaver: { name: @beaver.name }
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
assert_redirected_to beaver_path(assigns(:beaver))
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
test "should show beaver" do
|
|
28
|
+
get :show, id: @beaver
|
|
29
|
+
assert_response :success
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
test "should get edit" do
|
|
33
|
+
get :edit, id: @beaver
|
|
34
|
+
assert_response :success
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
test "should update beaver" do
|
|
38
|
+
patch :update, id: @beaver, beaver: { name: @beaver.name }
|
|
39
|
+
assert_redirected_to beaver_path(assigns(:beaver))
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
test "should destroy beaver" do
|
|
43
|
+
assert_difference('Beaver.count', -1) do
|
|
44
|
+
delete :destroy, id: @beaver
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
assert_redirected_to beavers_path
|
|
48
|
+
end
|
|
49
|
+
end
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
ENV['RAILS_ENV'] ||= 'test'
|
|
2
|
+
require File.expand_path('../../config/environment', __FILE__)
|
|
3
|
+
require 'rails/test_help'
|
|
4
|
+
|
|
5
|
+
class ActiveSupport::TestCase
|
|
6
|
+
# Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
|
|
7
|
+
#
|
|
8
|
+
# Note: You'll currently still have to declare fixtures explicitly in integration tests
|
|
9
|
+
# -- they do not yet inherit this setting
|
|
10
|
+
fixtures :all
|
|
11
|
+
|
|
12
|
+
# Add more helper methods to be used by all tests here...
|
|
13
|
+
end
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
data/lib/dsl.rb
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
def EventRouting &block
|
|
2
|
+
RabbitFeed::Consumer.event_routing ||= RabbitFeed::EventRouting.new
|
|
3
|
+
RabbitFeed::Consumer.event_routing.instance_eval &block
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
def EventDefinitions &block
|
|
7
|
+
RabbitFeed::Producer.event_definitions ||= RabbitFeed::EventDefinitions.new
|
|
8
|
+
RabbitFeed::Producer.event_definitions.instance_eval &block
|
|
9
|
+
end
|
data/lib/rabbit_feed.rb
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
require 'active_support/all'
|
|
2
|
+
require 'active_model'
|
|
3
|
+
require 'avro'
|
|
4
|
+
require 'bunny'
|
|
5
|
+
require 'connection_pool'
|
|
6
|
+
require 'yaml'
|
|
7
|
+
require 'dsl'
|
|
8
|
+
require 'rabbit_feed/version'
|
|
9
|
+
require 'rabbit_feed/client'
|
|
10
|
+
require 'rabbit_feed/configuration'
|
|
11
|
+
require 'rabbit_feed/connection_concern'
|
|
12
|
+
require 'rabbit_feed/event'
|
|
13
|
+
require 'rabbit_feed/consumer_connection'
|
|
14
|
+
require 'rabbit_feed/consumer'
|
|
15
|
+
require 'rabbit_feed/event_routing'
|
|
16
|
+
require 'rabbit_feed/producer_connection'
|
|
17
|
+
require 'rabbit_feed/producer'
|
|
18
|
+
require 'rabbit_feed/event_definitions'
|
|
19
|
+
require 'rabbit_feed/testing_support/rspec_matchers/publish_event'
|
|
20
|
+
require 'rabbit_feed/testing_support/testing_helpers'
|
|
21
|
+
|
|
22
|
+
module RabbitFeed
|
|
23
|
+
extend self
|
|
24
|
+
class Error < StandardError; end
|
|
25
|
+
class ConfigurationError < Error; end
|
|
26
|
+
class RoutingError < Error; end
|
|
27
|
+
class ReturnedMessageError < Error; end
|
|
28
|
+
|
|
29
|
+
attr_accessor :log, :environment, :configuration_file_path
|
|
30
|
+
|
|
31
|
+
def configuration
|
|
32
|
+
raise ConfigurationError.new 'rabbit feed log is not set' unless log.present?
|
|
33
|
+
@configuration ||= (Configuration.load RabbitFeed.configuration_file_path, RabbitFeed.environment)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def exception_notify exception
|
|
37
|
+
if defined? Airbrake
|
|
38
|
+
(Airbrake.notify_or_ignore exception) if Airbrake.configuration.public?
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
require 'optparse'
|
|
2
|
+
require 'pidfile'
|
|
3
|
+
|
|
4
|
+
module RabbitFeed
|
|
5
|
+
class Client
|
|
6
|
+
include ActiveModel::Validations
|
|
7
|
+
|
|
8
|
+
DEFAULTS = {
|
|
9
|
+
payload: 'test',
|
|
10
|
+
require_path: '.',
|
|
11
|
+
config_file: 'config/rabbit_feed.yml',
|
|
12
|
+
logfile: 'log/rabbit_feed.log',
|
|
13
|
+
pidfile: 'tmp/pids/rabbit_feed.pid',
|
|
14
|
+
}
|
|
15
|
+
DEFAULTS.freeze
|
|
16
|
+
|
|
17
|
+
attr_reader :command, :options
|
|
18
|
+
validates_presence_of :command, :options
|
|
19
|
+
validates :command, inclusion: { in: %w(consume produce), message: "%{value} is not a valid command" }
|
|
20
|
+
validate :log_file_path_exists
|
|
21
|
+
validate :config_file_exists
|
|
22
|
+
validate :require_path_valid
|
|
23
|
+
validate :pidfile_path_exists, if: :daemonize?
|
|
24
|
+
validate :environment_specified
|
|
25
|
+
|
|
26
|
+
def initialize arguments=ARGV
|
|
27
|
+
@command = arguments[0]
|
|
28
|
+
@options = parse_options arguments
|
|
29
|
+
validate!
|
|
30
|
+
|
|
31
|
+
set_logging
|
|
32
|
+
set_configuration
|
|
33
|
+
load_dependancies
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def run
|
|
37
|
+
send(command)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
private
|
|
41
|
+
|
|
42
|
+
def validate!
|
|
43
|
+
raise Error.new errors.messages if invalid?
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def log_file_path_exists
|
|
47
|
+
errors.add(:options, "log file path not found: '#{options[:logfile]}', specify this using the --logfile option") unless Dir.exists?(File.dirname(options[:logfile]))
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def config_file_exists
|
|
51
|
+
errors.add(:options, "configuration file not found: '#{options[:config_file]}', specify this using the --config option") unless File.exists?(options[:config_file])
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def require_path_valid
|
|
55
|
+
if require_rails? && !File.exist?("#{options[:require_path]}/config/application.rb")
|
|
56
|
+
errors.add(:options, 'point rabbit_feed to a Rails 3/4 application or a Ruby file to load your worker classes with --require')
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def pidfile_path_exists
|
|
61
|
+
errors.add(:options, "pid file path not found: '#{options[:pidfile]}', specify this using the --pidfile option") unless Dir.exists?(File.dirname(options[:pidfile]))
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def environment_specified
|
|
65
|
+
errors.add(:options, '--environment not specified') unless environment.present?
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def consume
|
|
69
|
+
daemonize if daemonize?
|
|
70
|
+
RabbitFeed::Consumer.run
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def produce
|
|
74
|
+
RabbitFeed::Producer.publish_event options[:name], options[:payload]
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def set_logging
|
|
78
|
+
RabbitFeed.log = Logger.new(options[:logfile])
|
|
79
|
+
RabbitFeed.log.level = verbose? ? Logger::DEBUG : Logger::INFO
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def set_configuration
|
|
83
|
+
RabbitFeed.environment = environment
|
|
84
|
+
RabbitFeed.configuration_file_path = options[:config_file]
|
|
85
|
+
ENV['RACK_ENV'] = ENV['RAILS_ENV'] = RabbitFeed.environment
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def load_dependancies
|
|
89
|
+
if require_rails?
|
|
90
|
+
require 'rails'
|
|
91
|
+
require File.expand_path("#{options[:require_path]}/config/environment.rb")
|
|
92
|
+
::Rails.application.eager_load!
|
|
93
|
+
else
|
|
94
|
+
require options[:require_path]
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def daemonize
|
|
99
|
+
Process.daemon(true, true)
|
|
100
|
+
pid_path = File.split options[:pidfile]
|
|
101
|
+
PidFile.new(piddir: pid_path[0], pidfile: pid_path[1])
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def environment
|
|
105
|
+
if options[:environment].present?
|
|
106
|
+
options[:environment]
|
|
107
|
+
else
|
|
108
|
+
ENV['RACK_ENV'] || ENV['RAILS_ENV']
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def daemonize?
|
|
113
|
+
options[:daemon]
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def verbose?
|
|
117
|
+
options[:verbose]
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def require_rails?
|
|
121
|
+
File.directory?(options[:require_path])
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def parse_options argv
|
|
125
|
+
opts = {}
|
|
126
|
+
|
|
127
|
+
parser = OptionParser.new do |o|
|
|
128
|
+
|
|
129
|
+
o.on '-m', '--payload VAL', 'Payload of event to produce' do |arg|
|
|
130
|
+
opts[:payload] = arg
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
o.on '-n', '--name VAL', 'Name of event to produce' do |arg|
|
|
134
|
+
opts[:name] = arg
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
o.on '-d', '--daemon', 'Daemonize process' do |arg|
|
|
138
|
+
opts[:daemon] = arg
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
o.on '-e', '--environment ENV', 'Application environment' do |arg|
|
|
142
|
+
opts[:environment] = arg
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
o.on '-r', '--require [PATH|DIR]', 'Location of Rails application with workers or file to require' do |arg|
|
|
146
|
+
opts[:require_path] = arg
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
o.on '-v', '--verbose', 'Print more verbose output' do |arg|
|
|
150
|
+
opts[:verbose] = arg
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
o.on '-C', '--config PATH', 'Path to YAML config file' do |arg|
|
|
154
|
+
opts[:config_file] = arg
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
o.on '-L', '--logfile PATH', 'Path to writable logfile' do |arg|
|
|
158
|
+
opts[:logfile] = arg
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
o.on '-P', '--pidfile PATH', 'Path to pidfile' do |arg|
|
|
162
|
+
opts[:pidfile] = arg
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
o.on '-V', '--version', 'Print version and exit' do |arg|
|
|
166
|
+
puts "RabbitFeed #{RabbitFeed::VERSION}"
|
|
167
|
+
exit 0
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
parser.banner = 'rabbit_feed action [options]'
|
|
172
|
+
parser.on_tail '-h', '--help', 'Show help' do
|
|
173
|
+
puts parser
|
|
174
|
+
exit 1
|
|
175
|
+
end
|
|
176
|
+
parser.parse! argv
|
|
177
|
+
DEFAULTS.merge opts
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
end
|
|
181
|
+
end
|