totoro 1.0.5 → 1.0.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (105) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +6 -0
  3. data/lib/generators/totoro/templates/totoro.yml +3 -2
  4. data/lib/totoro/config.rb +8 -0
  5. data/lib/totoro/services/broadcast_service.rb +5 -1
  6. data/lib/totoro/services/enqueue_service.rb +6 -2
  7. data/lib/totoro/version.rb +1 -1
  8. data/pkg/totoro-1.0.5.gem +0 -0
  9. data/pkg/totoro-1.0.5/CODE_OF_CONDUCT.md +74 -0
  10. data/pkg/totoro-1.0.5/Dockerfile +14 -0
  11. data/pkg/totoro-1.0.5/Gemfile +8 -0
  12. data/pkg/totoro-1.0.5/Gemfile.lock +68 -0
  13. data/pkg/totoro-1.0.5/LICENSE.txt +21 -0
  14. data/pkg/totoro-1.0.5/README.md +169 -0
  15. data/pkg/totoro-1.0.5/Rakefile +8 -0
  16. data/pkg/totoro-1.0.5/bin/console +15 -0
  17. data/pkg/totoro-1.0.5/bin/setup +8 -0
  18. data/pkg/totoro-1.0.5/bin/totoro +16 -0
  19. data/pkg/totoro-1.0.5/docker-compose.yml +43 -0
  20. data/pkg/totoro-1.0.5/lib/generators/totoro/config_generator.rb +12 -0
  21. data/pkg/totoro-1.0.5/lib/generators/totoro/init_generator.rb +14 -0
  22. data/pkg/totoro-1.0.5/lib/generators/totoro/templates/create_totoro_failed_messages.rb +12 -0
  23. data/pkg/totoro-1.0.5/lib/generators/totoro/templates/initializer.rb +1 -0
  24. data/pkg/totoro-1.0.5/lib/generators/totoro/templates/totoro.yml +33 -0
  25. data/pkg/totoro-1.0.5/lib/generators/totoro/templates/update_totoro_failed_messages.rb +6 -0
  26. data/pkg/totoro-1.0.5/lib/generators/totoro/templates/worker.rb.erb +10 -0
  27. data/pkg/totoro-1.0.5/lib/generators/totoro/update_generator.rb +12 -0
  28. data/pkg/totoro-1.0.5/lib/generators/totoro/worker_generator.rb +17 -0
  29. data/pkg/totoro-1.0.5/lib/totoro.rb +21 -0
  30. data/pkg/totoro-1.0.5/lib/totoro/base_queue.rb +44 -0
  31. data/pkg/totoro-1.0.5/lib/totoro/base_worker.rb +61 -0
  32. data/pkg/totoro-1.0.5/lib/totoro/config.rb +44 -0
  33. data/pkg/totoro-1.0.5/lib/totoro/errors/connection_break_error.rb +6 -0
  34. data/pkg/totoro-1.0.5/lib/totoro/errors/need_queue_name_error.rb +5 -0
  35. data/pkg/totoro-1.0.5/lib/totoro/initializer.rb +39 -0
  36. data/pkg/totoro-1.0.5/lib/totoro/message_resender.rb +17 -0
  37. data/pkg/totoro-1.0.5/lib/totoro/models/totoro_failed_message.rb +8 -0
  38. data/pkg/totoro-1.0.5/lib/totoro/railtie.rb +15 -0
  39. data/pkg/totoro-1.0.5/lib/totoro/services/broadcast_service.rb +33 -0
  40. data/pkg/totoro-1.0.5/lib/totoro/services/enqueue_service.rb +38 -0
  41. data/pkg/totoro-1.0.5/lib/totoro/services/resend_service.rb +19 -0
  42. data/pkg/totoro-1.0.5/lib/totoro/services/subscribe_service.rb +34 -0
  43. data/pkg/totoro-1.0.5/lib/totoro/tasks/resend_message.rake +8 -0
  44. data/pkg/totoro-1.0.5/lib/totoro/utils.rb +22 -0
  45. data/pkg/totoro-1.0.5/lib/totoro/version.rb +5 -0
  46. data/pkg/totoro-1.0.5/pkg/totoro-1.0.4.gem +0 -0
  47. data/pkg/totoro-1.0.5/spec/spec_helper.rb +14 -0
  48. data/pkg/totoro-1.0.5/spec/totoro_spec.rb +9 -0
  49. data/pkg/totoro-1.0.5/test/rabbitmq_commands.txt +6 -0
  50. data/pkg/totoro-1.0.5/test/totoro_test/Gemfile +43 -0
  51. data/pkg/totoro-1.0.5/test/totoro_test/Gemfile.lock +157 -0
  52. data/pkg/totoro-1.0.5/test/totoro_test/README.md +24 -0
  53. data/pkg/totoro-1.0.5/test/totoro_test/Rakefile +6 -0
  54. data/pkg/totoro-1.0.5/test/totoro_test/app/channels/application_cable/channel.rb +4 -0
  55. data/pkg/totoro-1.0.5/test/totoro_test/app/channels/application_cable/connection.rb +4 -0
  56. data/pkg/totoro-1.0.5/test/totoro_test/app/controllers/application_controller.rb +2 -0
  57. data/pkg/totoro-1.0.5/test/totoro_test/app/jobs/application_job.rb +2 -0
  58. data/pkg/totoro-1.0.5/test/totoro_test/app/mailers/application_mailer.rb +4 -0
  59. data/pkg/totoro-1.0.5/test/totoro_test/app/models/application_record.rb +3 -0
  60. data/pkg/totoro-1.0.5/test/totoro_test/app/models/worker/example_queue.rb +10 -0
  61. data/pkg/totoro-1.0.5/test/totoro_test/app/models/worker/exchange_queue.rb +10 -0
  62. data/pkg/totoro-1.0.5/test/totoro_test/app/models/worker/shu_queue.rb +10 -0
  63. data/pkg/totoro-1.0.5/test/totoro_test/app/services/bench_mark.txt +7 -0
  64. data/pkg/totoro-1.0.5/test/totoro_test/app/services/load_test.rb +19 -0
  65. data/pkg/totoro-1.0.5/test/totoro_test/app/views/layouts/mailer.html.erb +13 -0
  66. data/pkg/totoro-1.0.5/test/totoro_test/app/views/layouts/mailer.text.erb +1 -0
  67. data/pkg/totoro-1.0.5/test/totoro_test/bin/bundle +3 -0
  68. data/pkg/totoro-1.0.5/test/totoro_test/bin/delayed_job +5 -0
  69. data/pkg/totoro-1.0.5/test/totoro_test/bin/rails +9 -0
  70. data/pkg/totoro-1.0.5/test/totoro_test/bin/rake +9 -0
  71. data/pkg/totoro-1.0.5/test/totoro_test/bin/setup +34 -0
  72. data/pkg/totoro-1.0.5/test/totoro_test/bin/spring +17 -0
  73. data/pkg/totoro-1.0.5/test/totoro_test/bin/update +29 -0
  74. data/pkg/totoro-1.0.5/test/totoro_test/config.ru +5 -0
  75. data/pkg/totoro-1.0.5/test/totoro_test/config/application.rb +34 -0
  76. data/pkg/totoro-1.0.5/test/totoro_test/config/boot.rb +3 -0
  77. data/pkg/totoro-1.0.5/test/totoro_test/config/cable.yml +10 -0
  78. data/pkg/totoro-1.0.5/test/totoro_test/config/database.yml +55 -0
  79. data/pkg/totoro-1.0.5/test/totoro_test/config/environment.rb +5 -0
  80. data/pkg/totoro-1.0.5/test/totoro_test/config/environments/development.rb +47 -0
  81. data/pkg/totoro-1.0.5/test/totoro_test/config/environments/production.rb +82 -0
  82. data/pkg/totoro-1.0.5/test/totoro_test/config/environments/test.rb +41 -0
  83. data/pkg/totoro-1.0.5/test/totoro_test/config/initializers/application_controller_renderer.rb +8 -0
  84. data/pkg/totoro-1.0.5/test/totoro_test/config/initializers/backtrace_silencers.rb +7 -0
  85. data/pkg/totoro-1.0.5/test/totoro_test/config/initializers/cors.rb +16 -0
  86. data/pkg/totoro-1.0.5/test/totoro_test/config/initializers/filter_parameter_logging.rb +4 -0
  87. data/pkg/totoro-1.0.5/test/totoro_test/config/initializers/inflections.rb +16 -0
  88. data/pkg/totoro-1.0.5/test/totoro_test/config/initializers/mime_types.rb +4 -0
  89. data/pkg/totoro-1.0.5/test/totoro_test/config/initializers/totoro.rb +1 -0
  90. data/pkg/totoro-1.0.5/test/totoro_test/config/initializers/wrap_parameters.rb +14 -0
  91. data/pkg/totoro-1.0.5/test/totoro_test/config/locales/en.yml +33 -0
  92. data/pkg/totoro-1.0.5/test/totoro_test/config/puma.rb +56 -0
  93. data/pkg/totoro-1.0.5/test/totoro_test/config/routes.rb +3 -0
  94. data/pkg/totoro-1.0.5/test/totoro_test/config/secrets.yml +32 -0
  95. data/pkg/totoro-1.0.5/test/totoro_test/config/spring.rb +6 -0
  96. data/pkg/totoro-1.0.5/test/totoro_test/config/totoro.yml +42 -0
  97. data/pkg/totoro-1.0.5/test/totoro_test/db/migrate/20181019041208_create_delayed_jobs.rb +22 -0
  98. data/pkg/totoro-1.0.5/test/totoro_test/db/migrate/20181019070846_create_totoro_failed_messages.rb +11 -0
  99. data/pkg/totoro-1.0.5/test/totoro_test/db/migrate/20181228033422_update_totoro_failed_messages.rb +5 -0
  100. data/pkg/totoro-1.0.5/test/totoro_test/db/schema.rb +42 -0
  101. data/pkg/totoro-1.0.5/test/totoro_test/db/seeds.rb +7 -0
  102. data/pkg/totoro-1.0.5/test/totoro_test/public/robots.txt +1 -0
  103. data/pkg/totoro-1.0.5/test/totoro_test/test/test_helper.rb +10 -0
  104. data/pkg/totoro-1.0.5/totoro.gemspec +29 -0
  105. metadata +99 -2
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'delayed_job_recurring'
4
+
5
+ module Totoro
6
+ class MessageResender
7
+ include Delayed::RecurringJob
8
+ run_every 10.second
9
+ queue 'totoro'
10
+ def perform
11
+ Totoro::ResendService.new.resend_all_messages
12
+ rescue StandardError => error
13
+ Rails.logger.error error.message
14
+ STDOUT.flush
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'active_record/railtie'
4
+ module Totoro
5
+ class TotoroFailedMessage < ActiveRecord::Base
6
+ end
7
+ end
8
+ # Totoro.constants.select {|c| Totoro.const_get(c).is_a? Class}
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'totoro'
4
+ require 'rails'
5
+
6
+ module Totoro
7
+ class Railtie < Rails::Railtie
8
+ railtie_name :totoro
9
+
10
+ rake_tasks do
11
+ path = File.expand_path(__dir__)
12
+ Dir.glob("#{path}/tasks/*.rake").each { |f| load f }
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Totoro
4
+ class BroadcastService
5
+ def initialize(connection, config)
6
+ @connection = connection
7
+ @config = config
8
+ end
9
+
10
+ def broadcast(exchange_id, payload)
11
+ @connection.start unless @connection.connected?
12
+ exchange = channel.fanout(@config.exchange(exchange_id))
13
+ payload = JSON.dump payload
14
+ exchange.publish(payload)
15
+ Rails.logger.debug "send message to exchange #{@config.exchange(exchange_id)}"
16
+ STDOUT.flush
17
+ channel.close
18
+ rescue Bunny::TCPConnectionFailedForAllHosts,
19
+ Bunny::NetworkErrorWrapper,
20
+ Bunny::ChannelAlreadyClosed,
21
+ Bunny::ConnectionAlreadyClosed,
22
+ AMQ::Protocol::EmptyResponseError => error
23
+ @channel.close if @channel.present?
24
+ raise(Totoro::ConnectionBreakError, "type: #{error.class}, message: #{error.message}")
25
+ end
26
+
27
+ private
28
+
29
+ def channel
30
+ @channel ||= @connection.create_channel
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Totoro
4
+ class EnqueueService
5
+ def initialize(connection, config)
6
+ @connection = connection
7
+ @config = config
8
+ end
9
+
10
+ def enqueue(id, payload)
11
+ @connection.start unless @connection.connected?
12
+ queue = channel.queue(*@config.queue(id))
13
+ payload = JSON.dump payload
14
+ exchange.publish(payload, routing_key: queue.name)
15
+ Rails.logger.debug "send message to #{queue.name}"
16
+ STDOUT.flush
17
+ channel.close
18
+ rescue Bunny::TCPConnectionFailedForAllHosts,
19
+ Bunny::NetworkErrorWrapper,
20
+ Bunny::ChannelAlreadyClosed,
21
+ Bunny::ConnectionAlreadyClosed,
22
+ AMQ::Protocol::EmptyResponseError => error
23
+ @channel.close if @channel.present?
24
+ raise(Totoro::ConnectionBreakError, "type: #{error.class}, message: #{error.message}")
25
+ end
26
+
27
+ private
28
+
29
+ def channel
30
+ @channel ||= @connection.create_channel
31
+ end
32
+
33
+ # default exchange is a direct exchange
34
+ def exchange
35
+ @exchange ||= channel.default_exchange
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Totoro
4
+ class ResendService
5
+ def resend_all_messages
6
+ Totoro::TotoroFailedMessage.find_in_batches(batch_size: 100) do |message_group|
7
+ message_group.each { |m| resend_message(m) }
8
+ end
9
+ end
10
+
11
+ private
12
+
13
+ def resend_message(failed_message)
14
+ queue_class = failed_message.class_name.constantize
15
+ queue_class.method(failed_message.group).call(failed_message.queue_id, failed_message.payload)
16
+ failed_message.destroy
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Totoro
4
+ class SubscribeService
5
+ def initialize(config)
6
+ @config = config
7
+ end
8
+
9
+ def subscribe(id)
10
+ queue = bind_queue(id)
11
+ queue.purge if @config.clean_start?(id)
12
+ queue.subscribe(manual_ack: @config.manual_ack?(id)) do |delivery_info, metadata, payload|
13
+ yield(delivery_info, metadata, payload)
14
+ ensure
15
+ channel.ack(delivery_info.delivery_tag) if @config.force_ack?(id)
16
+ end
17
+ end
18
+
19
+ def channel
20
+ @channel ||= Bunny.new(@config.connect).tap(&:start).create_channel
21
+ end
22
+
23
+ private
24
+
25
+ def bind_queue(id)
26
+ exchange_name = @config.exchange_name_for_queue(id)
27
+ if exchange_name.nil?
28
+ channel.queue(*@config.queue(id))
29
+ else
30
+ channel.queue(*@config.queue(id)).bind(exchange_name)
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ namespace :totoro do
4
+ desc 'resend failed message'
5
+ task resend_msg: :environment do
6
+ Totoro::MessageResender.schedule!
7
+ end
8
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Totoro
4
+ class Utils
5
+ def underscore_hash_keys(value)
6
+ case value
7
+ when Array
8
+ value.map { |v| underscore_hash_keys(v) }
9
+ when Hash
10
+ Hash[value.map { |k, v| [underscorize(k), underscore_hash_keys(v)] }]
11
+ else
12
+ value
13
+ end
14
+ end
15
+
16
+ private
17
+
18
+ def underscorize(hash_key)
19
+ hash_key.to_s.underscore.to_sym
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Totoro
4
+ VERSION = '1.0.5'
5
+ end
@@ -0,0 +1,14 @@
1
+ require 'bundler/setup'
2
+ require 'totoro'
3
+
4
+ RSpec.configure do |config|
5
+ # Enable flags like --only-failures and --next-failure
6
+ config.example_status_persistence_file_path = '.rspec_status'
7
+
8
+ # Disable RSpec exposing methods globally on `Module` and `main`
9
+ config.disable_monkey_patching!
10
+
11
+ config.expect_with :rspec do |c|
12
+ c.syntax = :expect
13
+ end
14
+ end
@@ -0,0 +1,9 @@
1
+ RSpec.describe Totoro do
2
+ it 'has a version number' do
3
+ expect(Totoro::VERSION).not_to be nil
4
+ end
5
+
6
+ it 'does something useful' do
7
+ expect(false).to eq(true)
8
+ end
9
+ end
@@ -0,0 +1,6 @@
1
+
2
+ rabbitmqctl set_permissions -p / hui '.*' '.*' '.*'
3
+ rabbitmqctl clear_permissions -p / hui
4
+ rabbitmqctl close_all_connections "changed_user_permissions"
5
+
6
+ Totoro::Queue.enqueue('example_queue', {shu: 123})
@@ -0,0 +1,43 @@
1
+ source 'https://rubygems.org'
2
+
3
+ git_source(:github) do |repo_name|
4
+ repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?('/')
5
+ "https://github.com/#{repo_name}.git"
6
+ end
7
+
8
+ gem 'delayed_job_active_record'
9
+ gem 'delayed_job_recurring'
10
+ gem 'totoro', path: '/totoro'
11
+ # Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
12
+ gem 'rails', '~> 5.1.6'
13
+ # Use sqlite3 as the database for Active Record
14
+ gem 'pg'
15
+ # Use Puma as the app server
16
+ gem 'puma', '~> 3.7'
17
+ # Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
18
+ # gem 'jbuilder', '~> 2.5'
19
+ # Use Redis adapter to run Action Cable in production
20
+ # gem 'redis', '~> 4.0'
21
+ # Use ActiveModel has_secure_password
22
+ # gem 'bcrypt', '~> 3.1.7'
23
+
24
+ # Use Capistrano for deployment
25
+ # gem 'capistrano-rails', group: :development
26
+
27
+ # Use Rack CORS for handling Cross-Origin Resource Sharing (CORS), making cross-origin AJAX possible
28
+ # gem 'rack-cors'
29
+
30
+ group :development, :test do
31
+ # Call 'byebug' anywhere in the code to stop execution and get a debugger console
32
+ gem 'byebug', platforms: %i[mri mingw x64_mingw]
33
+ end
34
+
35
+ group :development do
36
+ gem 'listen', '>= 3.0.5', '< 3.2'
37
+ # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
38
+ gem 'spring'
39
+ gem 'spring-watcher-listen', '~> 2.0.0'
40
+ end
41
+
42
+ # Windows does not include zoneinfo files, so bundle the tzinfo-data gem
43
+ gem 'tzinfo-data', platforms: %i[mingw mswin x64_mingw jruby]
@@ -0,0 +1,157 @@
1
+ PATH
2
+ remote: /totoro
3
+ specs:
4
+ totoro (1.0.2)
5
+ bunny (~> 2.10)
6
+ delayed_job_active_record (~> 4.1.3)
7
+ delayed_job_recurring (~> 0.3.7)
8
+
9
+ GEM
10
+ remote: https://rubygems.org/
11
+ specs:
12
+ actioncable (5.1.6.1)
13
+ actionpack (= 5.1.6.1)
14
+ nio4r (~> 2.0)
15
+ websocket-driver (~> 0.6.1)
16
+ actionmailer (5.1.6.1)
17
+ actionpack (= 5.1.6.1)
18
+ actionview (= 5.1.6.1)
19
+ activejob (= 5.1.6.1)
20
+ mail (~> 2.5, >= 2.5.4)
21
+ rails-dom-testing (~> 2.0)
22
+ actionpack (5.1.6.1)
23
+ actionview (= 5.1.6.1)
24
+ activesupport (= 5.1.6.1)
25
+ rack (~> 2.0)
26
+ rack-test (>= 0.6.3)
27
+ rails-dom-testing (~> 2.0)
28
+ rails-html-sanitizer (~> 1.0, >= 1.0.2)
29
+ actionview (5.1.6.1)
30
+ activesupport (= 5.1.6.1)
31
+ builder (~> 3.1)
32
+ erubi (~> 1.4)
33
+ rails-dom-testing (~> 2.0)
34
+ rails-html-sanitizer (~> 1.0, >= 1.0.3)
35
+ activejob (5.1.6.1)
36
+ activesupport (= 5.1.6.1)
37
+ globalid (>= 0.3.6)
38
+ activemodel (5.1.6.1)
39
+ activesupport (= 5.1.6.1)
40
+ activerecord (5.1.6.1)
41
+ activemodel (= 5.1.6.1)
42
+ activesupport (= 5.1.6.1)
43
+ arel (~> 8.0)
44
+ activesupport (5.1.6.1)
45
+ concurrent-ruby (~> 1.0, >= 1.0.2)
46
+ i18n (>= 0.7, < 2)
47
+ minitest (~> 5.1)
48
+ tzinfo (~> 1.1)
49
+ amq-protocol (2.3.0)
50
+ arel (8.0.0)
51
+ builder (3.2.3)
52
+ bunny (2.13.0)
53
+ amq-protocol (~> 2.3, >= 2.3.0)
54
+ byebug (10.0.2)
55
+ concurrent-ruby (1.1.4)
56
+ crass (1.0.4)
57
+ delayed_job (4.1.5)
58
+ activesupport (>= 3.0, < 5.3)
59
+ delayed_job_active_record (4.1.3)
60
+ activerecord (>= 3.0, < 5.3)
61
+ delayed_job (>= 3.0, < 5)
62
+ delayed_job_recurring (0.3.8)
63
+ delayed_job (>= 3.0)
64
+ delayed_job_active_record
65
+ erubi (1.8.0)
66
+ ffi (1.10.0)
67
+ globalid (0.4.1)
68
+ activesupport (>= 4.2.0)
69
+ i18n (1.5.1)
70
+ concurrent-ruby (~> 1.0)
71
+ listen (3.1.5)
72
+ rb-fsevent (~> 0.9, >= 0.9.4)
73
+ rb-inotify (~> 0.9, >= 0.9.7)
74
+ ruby_dep (~> 1.2)
75
+ loofah (2.2.3)
76
+ crass (~> 1.0.2)
77
+ nokogiri (>= 1.5.9)
78
+ mail (2.7.1)
79
+ mini_mime (>= 0.1.1)
80
+ method_source (0.9.2)
81
+ mini_mime (1.0.1)
82
+ mini_portile2 (2.4.0)
83
+ minitest (5.11.3)
84
+ nio4r (2.3.1)
85
+ nokogiri (1.10.0)
86
+ mini_portile2 (~> 2.4.0)
87
+ pg (1.1.4)
88
+ puma (3.12.0)
89
+ rack (2.0.6)
90
+ rack-test (1.1.0)
91
+ rack (>= 1.0, < 3)
92
+ rails (5.1.6.1)
93
+ actioncable (= 5.1.6.1)
94
+ actionmailer (= 5.1.6.1)
95
+ actionpack (= 5.1.6.1)
96
+ actionview (= 5.1.6.1)
97
+ activejob (= 5.1.6.1)
98
+ activemodel (= 5.1.6.1)
99
+ activerecord (= 5.1.6.1)
100
+ activesupport (= 5.1.6.1)
101
+ bundler (>= 1.3.0)
102
+ railties (= 5.1.6.1)
103
+ sprockets-rails (>= 2.0.0)
104
+ rails-dom-testing (2.0.3)
105
+ activesupport (>= 4.2.0)
106
+ nokogiri (>= 1.6)
107
+ rails-html-sanitizer (1.0.4)
108
+ loofah (~> 2.2, >= 2.2.2)
109
+ railties (5.1.6.1)
110
+ actionpack (= 5.1.6.1)
111
+ activesupport (= 5.1.6.1)
112
+ method_source
113
+ rake (>= 0.8.7)
114
+ thor (>= 0.18.1, < 2.0)
115
+ rake (12.3.2)
116
+ rb-fsevent (0.10.3)
117
+ rb-inotify (0.10.0)
118
+ ffi (~> 1.0)
119
+ ruby_dep (1.5.0)
120
+ spring (2.0.2)
121
+ activesupport (>= 4.2)
122
+ spring-watcher-listen (2.0.1)
123
+ listen (>= 2.7, < 4.0)
124
+ spring (>= 1.2, < 3.0)
125
+ sprockets (3.7.2)
126
+ concurrent-ruby (~> 1.0)
127
+ rack (> 1, < 3)
128
+ sprockets-rails (3.2.1)
129
+ actionpack (>= 4.0)
130
+ activesupport (>= 4.0)
131
+ sprockets (>= 3.0.0)
132
+ thor (0.20.3)
133
+ thread_safe (0.3.6)
134
+ tzinfo (1.2.5)
135
+ thread_safe (~> 0.1)
136
+ websocket-driver (0.6.5)
137
+ websocket-extensions (>= 0.1.0)
138
+ websocket-extensions (0.1.3)
139
+
140
+ PLATFORMS
141
+ ruby
142
+
143
+ DEPENDENCIES
144
+ byebug
145
+ delayed_job_active_record
146
+ delayed_job_recurring
147
+ listen (>= 3.0.5, < 3.2)
148
+ pg
149
+ puma (~> 3.7)
150
+ rails (~> 5.1.6)
151
+ spring
152
+ spring-watcher-listen (~> 2.0.0)
153
+ totoro!
154
+ tzinfo-data
155
+
156
+ BUNDLED WITH
157
+ 1.16.1