harbinger 0.0.1.pre → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +3 -0
- data/.hound.yml +818 -0
- data/.travis.yml +20 -0
- data/Gemfile +23 -3
- data/README.md +8 -27
- data/Rakefile +47 -1
- data/app/controllers/harbinger/messages_controller.rb +24 -0
- data/app/models/harbinger/database_channel_message.rb +51 -0
- data/app/models/harbinger/database_channel_message_element.rb +19 -0
- data/app/views/harbinger/messages/index.html.erb +43 -0
- data/app/views/harbinger/messages/show.html.erb +24 -0
- data/config/routes.rb +3 -0
- data/db/migrate/20140310185338_create_harbinger_database_channel_message.rb +11 -0
- data/db/migrate/20140310185339_create_harbinger_database_channel_message_elements.rb +14 -0
- data/gemfiles/rails4.1.gemfile +12 -0
- data/gemfiles/rails4.gemfile +13 -0
- data/harbinger.gemspec +22 -7
- data/lib/generators/harbinger/install/install_generator.rb +23 -0
- data/lib/generators/harbinger/install/templates/harbinger_initializer.rb.erb +6 -0
- data/lib/harbinger.rb +100 -1
- data/lib/harbinger/channels.rb +25 -0
- data/lib/harbinger/channels/database_channel.rb +15 -0
- data/lib/harbinger/channels/logger_channel.rb +31 -0
- data/lib/harbinger/channels/null_channel.rb +7 -0
- data/lib/harbinger/configuration.rb +58 -0
- data/lib/harbinger/engine.rb +8 -1
- data/lib/harbinger/exceptions.rb +4 -0
- data/lib/harbinger/message.rb +20 -0
- data/lib/harbinger/reporters.rb +34 -0
- data/lib/harbinger/reporters/exception_reporter.rb +26 -0
- data/lib/harbinger/reporters/null_reporter.rb +14 -0
- data/lib/harbinger/reporters/request_reporter.rb +20 -0
- data/lib/harbinger/reporters/user_reporter.rb +20 -0
- data/lib/harbinger/version.rb +1 -1
- data/run_each_spec_in_isolation +9 -0
- data/script/fast_specs +20 -0
- data/spec/controllers/harbinger/messages_controller_spec.rb +26 -0
- data/spec/features/end_to_end_exception_handling_spec.rb +39 -0
- data/spec/lib/harbinger/channels/database_channel_spec.rb +18 -0
- data/spec/lib/harbinger/channels/logger_channel_spec.rb +21 -0
- data/spec/lib/harbinger/channels/null_channel_spec.rb +8 -0
- data/spec/lib/harbinger/channels_spec.rb +40 -0
- data/spec/lib/harbinger/configuration_spec.rb +53 -0
- data/spec/lib/harbinger/message_spec.rb +15 -0
- data/spec/lib/harbinger/reporters/exception_reporter_spec.rb +24 -0
- data/spec/lib/harbinger/reporters/null_reporter_spec.rb +21 -0
- data/spec/lib/harbinger/reporters/request_reporter_spec.rb +23 -0
- data/spec/lib/harbinger/reporters/user_reporter_spec.rb +17 -0
- data/spec/lib/harbinger/reporters_spec.rb +46 -0
- data/spec/lib/harbinger_spec.rb +60 -0
- data/spec/models/harbinger/database_channel_message_element_spec.rb +16 -0
- data/spec/models/harbinger/database_channel_message_spec.rb +68 -0
- data/spec/routing/harbinger/messages_routing_spec.rb +16 -0
- data/spec/spec_active_record_helper.rb +41 -0
- data/spec/spec_fast_helper.rb +70 -0
- data/spec/spec_slow_helper.rb +57 -0
- data/spec/spec_view_helper.rb +38 -0
- data/spec/test_app_templates/lib/generators/test_app_generator.rb +13 -0
- data/spec/views/harbinger/messages/index.html.erb_spec.rb +31 -0
- data/spec/views/harbinger/messages/show.html.erb_spec.rb +36 -0
- metadata +205 -20
- data/MIT-LICENSE +0 -20
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'spec_active_record_helper'
|
2
|
+
require 'harbinger/database_channel_message'
|
3
|
+
require 'harbinger/message'
|
4
|
+
|
5
|
+
module Harbinger
|
6
|
+
describe DatabaseChannelMessage do
|
7
|
+
subject { described_class.new }
|
8
|
+
let(:message) do
|
9
|
+
Message.new do |message|
|
10
|
+
message.append('exception', 'name', 'hello')
|
11
|
+
message.append('exception', 'name', 'world')
|
12
|
+
message.append('user', 'name', 'tim')
|
13
|
+
message.append('user', 'id', '123')
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'should have many elements' do
|
18
|
+
subject.save!
|
19
|
+
expect(subject.elements).to be_a_kind_of(ActiveRecord::Associations::CollectionProxy)
|
20
|
+
end
|
21
|
+
|
22
|
+
context '.ordered' do
|
23
|
+
it 'should evaluate to sql' do
|
24
|
+
expect(described_class.ordered.to_sql).to be_a(String)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
context '.search_state' do
|
29
|
+
it 'should evaluate to sql' do
|
30
|
+
expect(described_class.search_state('new').to_sql).to be_a(String)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
context '.search_text' do
|
35
|
+
it 'should evaluate to sql' do
|
36
|
+
expect(described_class.search_text('my-text').to_sql).to be_a(String)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
context '.search' do
|
41
|
+
it 'handles a query parameter' do
|
42
|
+
expect(described_class.search(q: 'Hello', state: 'new').to_sql).to be_a(String)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
context '.store_message' do
|
47
|
+
it 'creates a new instance' do
|
48
|
+
expect { described_class.store_message(message) }.
|
49
|
+
to change { described_class.count }.
|
50
|
+
by(1)
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'creates elements' do
|
54
|
+
storage = described_class.new
|
55
|
+
expect { described_class.store_message(message, storage) }.
|
56
|
+
to change { storage.elements.count }.
|
57
|
+
by(3)
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'assigns :contexts' do
|
61
|
+
storage = described_class.new
|
62
|
+
expect { described_class.store_message(message, storage) }.
|
63
|
+
to change { storage.attributes.values_at('contexts', 'state') }.
|
64
|
+
from([nil, nil]).to(['exception,user', 'new'])
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'spec_slow_helper'
|
2
|
+
|
3
|
+
module Harbinger
|
4
|
+
describe 'routes for Messages', type: :routing do
|
5
|
+
routes { Harbinger::Engine.routes }
|
6
|
+
|
7
|
+
it 'generates a resourceful URL for :index' do
|
8
|
+
expect(messages_path).to eq('/harbinger/messages')
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'generates a resourceful URL for :show' do
|
12
|
+
expect(message_path('1')).to eq('/harbinger/messages/1')
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# This helper provides at least a x2 speed increase over the 'spec_slow_helper'.
|
2
|
+
#
|
3
|
+
# To validate this assumption, find a spec for an ActiveRecord object, and run
|
4
|
+
# with `rspec -r spec/spec_active_record_helper.rb ./path/to/spec.rb`
|
5
|
+
#
|
6
|
+
# Example:
|
7
|
+
# $ time rspec -r spec/spec_active_record_helper.rb spec/features/new_user_input_to_in_memory_spec.rb
|
8
|
+
#
|
9
|
+
# real 0m1.576s
|
10
|
+
# user 0m1.093s
|
11
|
+
# sys 0m0.295s
|
12
|
+
#
|
13
|
+
# Compared to `rspec -r spec/spec_slow_helper.rb ./path/to/spec.rb`
|
14
|
+
#
|
15
|
+
# Example:
|
16
|
+
# $ time rspec -r spec/spec_slow_helper.rb spec/features/new_user_input_to_in_memory_spec.rb
|
17
|
+
#
|
18
|
+
# real 0m3.546s
|
19
|
+
# user 0m2.417s
|
20
|
+
# sys 0m0.702s
|
21
|
+
require 'active_record'
|
22
|
+
require 'spec_fast_helper'
|
23
|
+
|
24
|
+
if !defined?(Rails)
|
25
|
+
# Sometimes this will be invoked when Rails is defined. In that case the relative
|
26
|
+
# path is ../internal. When Rails is not defined the relative path is different.
|
27
|
+
# By providing an absolute path, I avoid either of those silly things.
|
28
|
+
database = File.expand_path('../internal/db/development.sqlite3', __FILE__)
|
29
|
+
|
30
|
+
connection_info = { adapter: 'sqlite3', database: database, pool: 5, timeout: 5000 }
|
31
|
+
ActiveRecord::Base.establish_connection(connection_info)
|
32
|
+
end
|
33
|
+
|
34
|
+
RSpec.configure do |config|
|
35
|
+
config.around do |example|
|
36
|
+
ActiveRecord::Base.transaction do
|
37
|
+
example.run
|
38
|
+
fail ActiveRecord::Rollback
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
# This helper provides at least a ~x3 speed increase over the 'spec_slow_helper'.
|
2
|
+
#
|
3
|
+
# The idea being that some tests have very few dependencies.
|
4
|
+
#
|
5
|
+
# Example:
|
6
|
+
# $ time rspec -r spec/spec_fast_helper.rb spec/lib/hydramata-work_spec.rb
|
7
|
+
#
|
8
|
+
# real 0m1.188s
|
9
|
+
# user 0m0.979s
|
10
|
+
# sys 0m0.204s
|
11
|
+
#
|
12
|
+
# Compared to `rspec -r spec/spec_slow_helper.rb ./path/to/spec.rb`
|
13
|
+
#
|
14
|
+
# Example:
|
15
|
+
# $ time rspec -r spec/spec_slow_helper.rb spec/lib/hydramata-work_spec.rb
|
16
|
+
#
|
17
|
+
# real 0m3.491s
|
18
|
+
# user 0m2.800s
|
19
|
+
# sys 0m0.667s
|
20
|
+
|
21
|
+
require 'rspec/given'
|
22
|
+
unless defined?(Rails)
|
23
|
+
Dir[File.expand_path("../../app/*", __FILE__)].each do |dir|
|
24
|
+
$LOAD_PATH << dir
|
25
|
+
end
|
26
|
+
$LOAD_PATH << File.expand_path("../../lib", __FILE__)
|
27
|
+
|
28
|
+
unless defined?(require_dependency)
|
29
|
+
def require_dependency(*files)
|
30
|
+
require *files
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
class AttributeBucket
|
36
|
+
def initialize(attributes = {})
|
37
|
+
attributes.each do |key, value|
|
38
|
+
send("#{key}=", value) if respond_to?("#{key}=")
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
class Request < AttributeBucket
|
44
|
+
attr_accessor :path, :params, :user_agent
|
45
|
+
end
|
46
|
+
|
47
|
+
unless defined?(User)
|
48
|
+
class User < AttributeBucket
|
49
|
+
attr_accessor :username
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
shared_examples 'a harbinger reporter' do
|
54
|
+
Given(:reporter) { described_class.new(double) }
|
55
|
+
context 'interface' do
|
56
|
+
Then { expect(reporter).to respond_to(:accept) }
|
57
|
+
And { expect(reporter.method(:accept).arity).to eq(1) }
|
58
|
+
end
|
59
|
+
context 'is fault tolerant' do
|
60
|
+
Given(:message) { double(append: false) }
|
61
|
+
When { reporter.accept(message) }
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
|
66
|
+
shared_examples "a harbinger channel" do
|
67
|
+
Given(:channel) { described_class }
|
68
|
+
Then { expect(channel).to respond_to(:deliver) }
|
69
|
+
And { expect(channel.method(:deliver).arity).to eq(-2) }
|
70
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# Why is this a spec_slow_helper instead of spec_helper
|
2
|
+
# Because it is extremely slow to load all of the following dependencies:
|
3
|
+
#
|
4
|
+
# * SimpleCov
|
5
|
+
# * EngineCart (and therefore the underlying internal Rails application)
|
6
|
+
# * Rails
|
7
|
+
#
|
8
|
+
# But overtime the slowness grows. See the sibling helpers: ./spec/*_helper.rb
|
9
|
+
# (i.e. spec_active_record_helper.rb, spec_fast_helper.rb, spec_view_helper.rb)
|
10
|
+
ENV['RAILS_ENV'] ||= 'test'
|
11
|
+
if ENV['COV'] || ENV['COVERAGE']
|
12
|
+
require 'simplecov'
|
13
|
+
SimpleCov.start 'rails'
|
14
|
+
SimpleCov.command_name 'spec'
|
15
|
+
end
|
16
|
+
|
17
|
+
if ENV['TRAVIS']
|
18
|
+
require 'coveralls'
|
19
|
+
Coveralls.wear!('rails')
|
20
|
+
end
|
21
|
+
|
22
|
+
require 'engine_cart'
|
23
|
+
require File.expand_path('../internal/config/environment.rb', __FILE__)
|
24
|
+
|
25
|
+
EngineCart.load_application!
|
26
|
+
|
27
|
+
require 'rspec/rails'
|
28
|
+
require 'rspec-html-matchers'
|
29
|
+
require 'database_cleaner'
|
30
|
+
|
31
|
+
# This file was generated by the `rspec --init` command. Conventionally, all
|
32
|
+
# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
|
33
|
+
# Require this file using `require 'spec_helper'` to ensure that it is only
|
34
|
+
# loaded once.
|
35
|
+
#
|
36
|
+
# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
|
37
|
+
RSpec.configure do |config|
|
38
|
+
config.run_all_when_everything_filtered = true
|
39
|
+
config.filter_run :focus
|
40
|
+
config.raise_errors_for_deprecations!
|
41
|
+
# Run specs in random order to surface order dependencies. If you find an
|
42
|
+
# order dependency and want to debug it, you can fix the order by providing
|
43
|
+
# the seed, which is printed after each run.
|
44
|
+
# --seed 1234
|
45
|
+
config.order = 'random'
|
46
|
+
|
47
|
+
config.before(:suite) do
|
48
|
+
DatabaseCleaner.strategy = :transaction
|
49
|
+
DatabaseCleaner.clean_with(:truncation)
|
50
|
+
end
|
51
|
+
|
52
|
+
config.around(:each) do |example|
|
53
|
+
DatabaseCleaner.cleaning do
|
54
|
+
example.run
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# I'm deliberately not including this, as I was hoping to keep the views tested
|
2
|
+
# in extreme isolation.
|
3
|
+
|
4
|
+
# Example:
|
5
|
+
# $ time rspec -r spec/spec_view_helper.rb spec/views/hydramata/works/fieldsets/_edit.html.erb_spec.rb
|
6
|
+
#
|
7
|
+
# real 0m1.228s
|
8
|
+
# user 0m1.003s
|
9
|
+
# sys 0m0.205s
|
10
|
+
#
|
11
|
+
# Compared to `rspec -r spec/spec_slow_helper.rb ./path/to/spec.rb`
|
12
|
+
#
|
13
|
+
# Example:
|
14
|
+
# $ time rspec -r spec/spec_view_helper.rb spec/views/hydramata/works/fieldsets/_edit.html.erb_spec.rb
|
15
|
+
#
|
16
|
+
# real 0m3.417s
|
17
|
+
# user 0m2.720s
|
18
|
+
# sys 0m0.679s
|
19
|
+
|
20
|
+
require 'active_support'
|
21
|
+
require 'action_view'
|
22
|
+
require 'action_controller'
|
23
|
+
|
24
|
+
require 'active_support/core_ext/hash/reverse_merge'
|
25
|
+
|
26
|
+
require 'rspec/core'
|
27
|
+
require 'rails/version'
|
28
|
+
require 'rspec/rails/extensions'
|
29
|
+
require 'rspec/rails/view_rendering'
|
30
|
+
require 'rspec/rails/adapters'
|
31
|
+
require 'rspec/rails/matchers'
|
32
|
+
require 'rspec/rails/fixture_support'
|
33
|
+
require 'rspec/rails/example'
|
34
|
+
require 'rspec/rails/configuration'
|
35
|
+
|
36
|
+
require 'rspec-html-matchers'
|
37
|
+
|
38
|
+
ActionController::Base.prepend_view_path(File.expand_path('../../app/views', __FILE__))
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'rails/generators'
|
2
|
+
|
3
|
+
class TestAppGenerator < Rails::Generators::Base
|
4
|
+
source_root "./spec/test_app_templates"
|
5
|
+
|
6
|
+
# if you need to generate any additional configuration
|
7
|
+
# into the test app, this generator will be run immediately
|
8
|
+
# after setting up the application
|
9
|
+
|
10
|
+
def install_engine
|
11
|
+
generate 'harbinger:install'
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'spec_view_helper'
|
2
|
+
|
3
|
+
# As of 3.0.x :type tags are no longer inferred.
|
4
|
+
# This means, without the `type: :view` tag, the render method does not exist
|
5
|
+
# in the example context
|
6
|
+
describe 'harbinger/messages/index.html.erb', type: :view do
|
7
|
+
let(:created_at) { Time.now }
|
8
|
+
let(:message) do
|
9
|
+
double(
|
10
|
+
'Message',
|
11
|
+
contexts: ['Hello','World'],
|
12
|
+
state: 'new',
|
13
|
+
created_at: created_at
|
14
|
+
)
|
15
|
+
end
|
16
|
+
let(:harbinger) { double("Engine", message_path: true, messages_path: '/messages/') }
|
17
|
+
it 'renders the object and fieldsets' do
|
18
|
+
expect(harbinger).to receive(:message_path).with(message.to_param).and_return("/messages/#{message.to_param}")
|
19
|
+
render template: "harbinger/messages/index.html.erb", locals: { messages: [message], harbinger: harbinger }
|
20
|
+
expect(rendered).to have_tag('.search-form') do
|
21
|
+
with_tag('input.q.search-query', with: { type: 'search', name: 'q' } )
|
22
|
+
end
|
23
|
+
|
24
|
+
expect(rendered).to have_tag('.message') do
|
25
|
+
with_tag(".detail.message-created-at-detail a time", text: created_at.to_s)
|
26
|
+
with_tag('.detail.message-contexts-detail', text: 'Hello')
|
27
|
+
with_tag('.detail.message-contexts-detail', text: 'World')
|
28
|
+
with_tag('.detail.message-state-detail', text: 'new')
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'spec_view_helper'
|
2
|
+
|
3
|
+
# As of 3.0.x :type tags are no longer inferred.
|
4
|
+
# This means, without the `type: :view` tag, the render method does not exist
|
5
|
+
# in the example context
|
6
|
+
describe 'harbinger/messages/show.html.erb', type: :view do
|
7
|
+
let(:created_at) { Time.now }
|
8
|
+
let(:netid_element) { double('Element', key: 'netid', value: 'jfriesen') }
|
9
|
+
let(:request_referrer_element) { double('Element', key: 'request_referrer', value: 'from somewhere') }
|
10
|
+
let(:message) do
|
11
|
+
double(
|
12
|
+
'Message',
|
13
|
+
contexts: ['Hello','World'],
|
14
|
+
state: 'new',
|
15
|
+
created_at: created_at,
|
16
|
+
elements: [netid_element, request_referrer_element]
|
17
|
+
)
|
18
|
+
end
|
19
|
+
it 'renders the object and fieldsets' do
|
20
|
+
render template: 'harbinger/messages/show',
|
21
|
+
locals: { message: message }
|
22
|
+
expect(rendered).to have_tag('article.message') do
|
23
|
+
with_tag('.term.message-contexts-term')
|
24
|
+
with_tag('.detail.message-contexts-detail', text: 'Hello')
|
25
|
+
with_tag('.detail.message-contexts-detail', text: 'World')
|
26
|
+
with_tag('.term.message-state-term')
|
27
|
+
with_tag('.detail.message-state-detail', text: 'new')
|
28
|
+
with_tag('.term.message-created-at-term')
|
29
|
+
with_tag('.detail.message-created-at-detail time', text: created_at.to_s)
|
30
|
+
with_tag('.term.netid-term', text: netid_element.key)
|
31
|
+
with_tag('.detail.netid-detail', text: netid_element.value)
|
32
|
+
with_tag('.term.request-referrer-term', text: request_referrer_element.key)
|
33
|
+
with_tag('.detail.request-referrer-detail', text: request_referrer_element.value)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
metadata
CHANGED
@@ -1,71 +1,232 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: harbinger
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeremy Friesen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-08-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - ~>
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '1.5'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - ~>
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.5'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '10.3'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
41
|
-
|
40
|
+
version: '10.3'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec-given
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '3.5'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.5'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec-rails
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '3.0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '3.0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rspec-html-matchers
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0.6'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0.6'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: engine_cart
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0.3'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0.3'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rails
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '4.0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '4.0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: sqlite3
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '1.3'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '1.3'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: database_cleaner
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '1.3'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "~>"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '1.3'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: capybara
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - "~>"
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '2.4'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - "~>"
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '2.4'
|
153
|
+
description: A Rails engine for arbitrary message creation and delivery.
|
42
154
|
email:
|
43
155
|
- jeremy.n.friesen@gmail.com
|
44
|
-
executables:
|
45
|
-
- rails
|
156
|
+
executables: []
|
46
157
|
extensions: []
|
47
158
|
extra_rdoc_files: []
|
48
159
|
files:
|
49
|
-
- .gitignore
|
160
|
+
- ".gitignore"
|
161
|
+
- ".hound.yml"
|
162
|
+
- ".travis.yml"
|
50
163
|
- Gemfile
|
51
164
|
- LICENSE
|
52
|
-
- MIT-LICENSE
|
53
165
|
- README.md
|
54
166
|
- Rakefile
|
55
167
|
- app/assets/images/harbinger/.keep
|
56
168
|
- app/assets/javascripts/harbinger/application.js
|
57
169
|
- app/assets/stylesheets/harbinger/application.css
|
58
170
|
- app/controllers/harbinger/application_controller.rb
|
171
|
+
- app/controllers/harbinger/messages_controller.rb
|
59
172
|
- app/helpers/harbinger/application_helper.rb
|
173
|
+
- app/models/harbinger/database_channel_message.rb
|
174
|
+
- app/models/harbinger/database_channel_message_element.rb
|
175
|
+
- app/views/harbinger/messages/index.html.erb
|
176
|
+
- app/views/harbinger/messages/show.html.erb
|
60
177
|
- app/views/layouts/harbinger/application.html.erb
|
61
178
|
- bin/rails
|
62
179
|
- config/routes.rb
|
180
|
+
- db/migrate/20140310185338_create_harbinger_database_channel_message.rb
|
181
|
+
- db/migrate/20140310185339_create_harbinger_database_channel_message_elements.rb
|
182
|
+
- gemfiles/rails4.1.gemfile
|
183
|
+
- gemfiles/rails4.gemfile
|
63
184
|
- harbinger.gemspec
|
185
|
+
- lib/generators/harbinger/install/install_generator.rb
|
186
|
+
- lib/generators/harbinger/install/templates/harbinger_initializer.rb.erb
|
64
187
|
- lib/harbinger.rb
|
188
|
+
- lib/harbinger/channels.rb
|
189
|
+
- lib/harbinger/channels/database_channel.rb
|
190
|
+
- lib/harbinger/channels/logger_channel.rb
|
191
|
+
- lib/harbinger/channels/null_channel.rb
|
192
|
+
- lib/harbinger/configuration.rb
|
65
193
|
- lib/harbinger/engine.rb
|
194
|
+
- lib/harbinger/exceptions.rb
|
195
|
+
- lib/harbinger/message.rb
|
196
|
+
- lib/harbinger/reporters.rb
|
197
|
+
- lib/harbinger/reporters/exception_reporter.rb
|
198
|
+
- lib/harbinger/reporters/null_reporter.rb
|
199
|
+
- lib/harbinger/reporters/request_reporter.rb
|
200
|
+
- lib/harbinger/reporters/user_reporter.rb
|
66
201
|
- lib/harbinger/version.rb
|
67
202
|
- lib/tasks/harbinger_tasks.rake
|
68
|
-
|
203
|
+
- run_each_spec_in_isolation
|
204
|
+
- script/fast_specs
|
205
|
+
- spec/controllers/harbinger/messages_controller_spec.rb
|
206
|
+
- spec/features/end_to_end_exception_handling_spec.rb
|
207
|
+
- spec/lib/harbinger/channels/database_channel_spec.rb
|
208
|
+
- spec/lib/harbinger/channels/logger_channel_spec.rb
|
209
|
+
- spec/lib/harbinger/channels/null_channel_spec.rb
|
210
|
+
- spec/lib/harbinger/channels_spec.rb
|
211
|
+
- spec/lib/harbinger/configuration_spec.rb
|
212
|
+
- spec/lib/harbinger/message_spec.rb
|
213
|
+
- spec/lib/harbinger/reporters/exception_reporter_spec.rb
|
214
|
+
- spec/lib/harbinger/reporters/null_reporter_spec.rb
|
215
|
+
- spec/lib/harbinger/reporters/request_reporter_spec.rb
|
216
|
+
- spec/lib/harbinger/reporters/user_reporter_spec.rb
|
217
|
+
- spec/lib/harbinger/reporters_spec.rb
|
218
|
+
- spec/lib/harbinger_spec.rb
|
219
|
+
- spec/models/harbinger/database_channel_message_element_spec.rb
|
220
|
+
- spec/models/harbinger/database_channel_message_spec.rb
|
221
|
+
- spec/routing/harbinger/messages_routing_spec.rb
|
222
|
+
- spec/spec_active_record_helper.rb
|
223
|
+
- spec/spec_fast_helper.rb
|
224
|
+
- spec/spec_slow_helper.rb
|
225
|
+
- spec/spec_view_helper.rb
|
226
|
+
- spec/test_app_templates/lib/generators/test_app_generator.rb
|
227
|
+
- spec/views/harbinger/messages/index.html.erb_spec.rb
|
228
|
+
- spec/views/harbinger/messages/show.html.erb_spec.rb
|
229
|
+
homepage: https://github.com/ndlib/harbinger
|
69
230
|
licenses:
|
70
231
|
- Apache2
|
71
232
|
metadata: {}
|
@@ -75,18 +236,42 @@ require_paths:
|
|
75
236
|
- lib
|
76
237
|
required_ruby_version: !ruby/object:Gem::Requirement
|
77
238
|
requirements:
|
78
|
-
- -
|
239
|
+
- - ">="
|
79
240
|
- !ruby/object:Gem::Version
|
80
241
|
version: '0'
|
81
242
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
82
243
|
requirements:
|
83
|
-
- -
|
244
|
+
- - ">="
|
84
245
|
- !ruby/object:Gem::Version
|
85
|
-
version:
|
246
|
+
version: '0'
|
86
247
|
requirements: []
|
87
248
|
rubyforge_project:
|
88
|
-
rubygems_version: 2.
|
249
|
+
rubygems_version: 2.2.2
|
89
250
|
signing_key:
|
90
251
|
specification_version: 4
|
91
|
-
summary:
|
92
|
-
test_files:
|
252
|
+
summary: A Rails engine for arbitrary message creation and delivery.
|
253
|
+
test_files:
|
254
|
+
- spec/controllers/harbinger/messages_controller_spec.rb
|
255
|
+
- spec/features/end_to_end_exception_handling_spec.rb
|
256
|
+
- spec/lib/harbinger/channels/database_channel_spec.rb
|
257
|
+
- spec/lib/harbinger/channels/logger_channel_spec.rb
|
258
|
+
- spec/lib/harbinger/channels/null_channel_spec.rb
|
259
|
+
- spec/lib/harbinger/channels_spec.rb
|
260
|
+
- spec/lib/harbinger/configuration_spec.rb
|
261
|
+
- spec/lib/harbinger/message_spec.rb
|
262
|
+
- spec/lib/harbinger/reporters/exception_reporter_spec.rb
|
263
|
+
- spec/lib/harbinger/reporters/null_reporter_spec.rb
|
264
|
+
- spec/lib/harbinger/reporters/request_reporter_spec.rb
|
265
|
+
- spec/lib/harbinger/reporters/user_reporter_spec.rb
|
266
|
+
- spec/lib/harbinger/reporters_spec.rb
|
267
|
+
- spec/lib/harbinger_spec.rb
|
268
|
+
- spec/models/harbinger/database_channel_message_element_spec.rb
|
269
|
+
- spec/models/harbinger/database_channel_message_spec.rb
|
270
|
+
- spec/routing/harbinger/messages_routing_spec.rb
|
271
|
+
- spec/spec_active_record_helper.rb
|
272
|
+
- spec/spec_fast_helper.rb
|
273
|
+
- spec/spec_slow_helper.rb
|
274
|
+
- spec/spec_view_helper.rb
|
275
|
+
- spec/test_app_templates/lib/generators/test_app_generator.rb
|
276
|
+
- spec/views/harbinger/messages/index.html.erb_spec.rb
|
277
|
+
- spec/views/harbinger/messages/show.html.erb_spec.rb
|