renote_dac 0.0.139

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 9be6634d317e8b325985a8d6f87fdc998cbc848b9629cb23a8956a0f70f4b9eb
4
+ data.tar.gz: 15af8af8c42a5c5119b6f2a898b7bc0f5ac772c958ab9e69533ddeebf6784173
5
+ SHA512:
6
+ metadata.gz: 4941f0a2ccb43b4e8c5f25ccda005fc5c323a2e2e412389fe0369d78d7d8bed9ea4badad915917a3d9d729568cfb3c20f619e352b818d31a323b28b65c8e3cbb
7
+ data.tar.gz: 9fcaef84e847697bffed96621296ee7792867d1c05feded653d51429d845569fe987371d5642199bb9c6b8e24c67b5cdeed8685dbc71e9494f2fd77dfd126d71
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2018 Sidney
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,80 @@
1
+ # RenoteDac
2
+ This is a set of libraries and dependencies which allow you to quickly spin up a RabbitMQ powered Email/Notification Service as part of a (S)ervice (O)riented (A)rchitechture.
3
+
4
+ ## Usage
5
+ To implement this gem it is necessary to implement the client-server RenoteDac configuration either manually or by installing the [renote_dac_client gem](https://github.com/leather-s/renote_dac)
6
+
7
+ RenoteDac is the subscriber end of a pub/sub notification service thats been extracted for use as a gem. The publisher app publish messages to a RabbitMQ exchange which then pushes the messages to a queue.
8
+
9
+ The remote Email/Notification service (consumer) uses a pool of workers to pull messages from the RabbitMQ queue and process them into the consumer service database. From there a worker will pull un-sent messages from the database and push them via the postmarks api in batches for delivery.
10
+
11
+ The postmark response is recorded on the email error column. Email records are left in database as a log.
12
+
13
+ ## Installation
14
+ Add this line to your application's Gemfile:
15
+
16
+ ```ruby
17
+ gem 'renote_dac'
18
+ ```
19
+
20
+ And then execute:
21
+ ```bash
22
+ $ bundle
23
+ ```
24
+
25
+ Or install it yourself as:
26
+ ```bash
27
+ $ gem install renote_dac
28
+ ```
29
+
30
+ to generate an initializer and database.yml file run:
31
+ ```bash
32
+ $ rails g renote_dac:install
33
+ ```
34
+
35
+ then bundle again because you have a clean newly generated Gemfile
36
+ ```bash
37
+ bundle install
38
+ ```
39
+
40
+ to copy migration into app run:
41
+ ```bash
42
+ $ rake renote_dac:install:migrations
43
+ ```
44
+
45
+ run migrations:
46
+ ```bash
47
+ rake db:create
48
+ rake db:migrate
49
+ rake db:seed
50
+ ```
51
+
52
+ ## Starting Sneakers workers
53
+
54
+ first run:
55
+ ```bash
56
+ export WORKERS=ServiceQueueWorker
57
+ ```
58
+
59
+ then run:
60
+ ```bash
61
+ rake sneakers:run
62
+ ```
63
+
64
+ ## Development
65
+
66
+ ### Deploy
67
+
68
+ run the following rake task to
69
+ * increment version
70
+ * delete old '.gem' files
71
+ * build fresh gem
72
+ * commit & push with version message
73
+
74
+ `rake app:renote_dac:deploy`
75
+
76
+ ## Contributing
77
+ Contribution directions go here.
78
+
79
+ ## License
80
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,32 @@
1
+ begin
2
+ require 'bundler/setup'
3
+ rescue LoadError
4
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
+ end
6
+
7
+ require 'rdoc/task'
8
+
9
+ RDoc::Task.new(:rdoc) do |rdoc|
10
+ rdoc.rdoc_dir = 'rdoc'
11
+ rdoc.title = 'RenoteDac'
12
+ rdoc.options << '--line-numbers'
13
+ rdoc.rdoc_files.include('README.md')
14
+ rdoc.rdoc_files.include('lib/**/*.rb')
15
+ end
16
+
17
+ APP_RAKEFILE = File.expand_path("test/dummy/Rakefile", __dir__)
18
+ load 'rails/tasks/engine.rake'
19
+
20
+ load 'rails/tasks/statistics.rake'
21
+
22
+ require 'bundler/gem_tasks'
23
+
24
+ require 'rake/testtask'
25
+
26
+ Rake::TestTask.new(:test) do |t|
27
+ t.libs << 'test'
28
+ t.pattern = 'test/**/*_test.rb'
29
+ t.verbose = false
30
+ end
31
+
32
+ task default: :test
@@ -0,0 +1,14 @@
1
+ module RenoteDac
2
+ class Api::V1::EmailsController < Api::V1Controller
3
+ prepend_view_path "#{Rails.root.join('app', 'views').to_s}"
4
+
5
+ def show
6
+ render partial: 'layouts/renote_dac/api/v1/emails/show'
7
+ end
8
+
9
+ def index
10
+ @events = {id: 1}
11
+ render partial: 'layouts/renote_dac/api/v1/emails/index'
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,4 @@
1
+ module RenoteDac
2
+ class Api::V1Controller < ApiController
3
+ end
4
+ end
@@ -0,0 +1,13 @@
1
+ module RenoteDac
2
+ class ApiController < ApplicationController
3
+ before_action :authenticate
4
+
5
+ def authenticate
6
+ raise ActiveRecord::RecordNotFound unless authenticated?
7
+ end
8
+
9
+ def authenticated?
10
+ true
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,4 @@
1
+ module RenoteDac
2
+ class ApplicationController < ActionController::API
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module RenoteDac
2
+ module ApplicationHelper
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module RenoteDac
2
+ class ApplicationJob < ActiveJob::Base
3
+ end
4
+ end
@@ -0,0 +1,5 @@
1
+ module RenoteDac
2
+ class ApplicationRecord < ActiveRecord::Base
3
+ self.abstract_class = true
4
+ end
5
+ end
@@ -0,0 +1,4 @@
1
+ module RenoteDac
2
+ class Email < ApplicationRecord
3
+ end
4
+ end
@@ -0,0 +1,16 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Renote dac</title>
5
+ <%= csrf_meta_tags %>
6
+ <%= csp_meta_tag %>
7
+
8
+ <%= stylesheet_link_tag "renote_dac/application", media: "all" %>
9
+ <%= javascript_include_tag "renote_dac/application" %>
10
+ </head>
11
+ <body>
12
+
13
+ <%= yield %>
14
+
15
+ </body>
16
+ </html>
@@ -0,0 +1,3 @@
1
+ json.events @events.each do |key, value|
2
+ json.id value
3
+ end
@@ -0,0 +1,20 @@
1
+ require 'sneakers'
2
+
3
+ class ServiceQueueWorker
4
+ include Sneakers::Worker
5
+ # This worker will connect to "[named.queue]" queue
6
+ # env is set to nil since by default the actual queue name would be
7
+ # "named.queue_development"
8
+ from_queue "#{RenoteDac.configuration.rabbitmq_queue}", env: nil
9
+
10
+ # work method receives message payload in raw format
11
+ # in our case it is JSON encoded string
12
+ # which we can pass to RecentPosts service without
13
+ # changes
14
+ def work(message)
15
+ # invoke service object to save message to database
16
+ # RenoteDac.enqueue(template, email, {})
17
+ # let queue know message was received
18
+ ack!
19
+ end
20
+ end
@@ -0,0 +1,2 @@
1
+ Sneakers.configure()
2
+ Sneakers.logger.level = Logger::INFO
data/config/routes.rb ADDED
@@ -0,0 +1,9 @@
1
+ RenoteDac::Engine.routes.draw do
2
+
3
+ namespace :api do
4
+ # version 1 API routes
5
+ namespace :v1, format: true, constraints: {format: 'json'} do
6
+ resources :emails, only: [:index, :show]
7
+ end
8
+ end
9
+ end
File without changes
@@ -0,0 +1,17 @@
1
+ class CreateRenoteDacEmails < ActiveRecord::Migration[5.2]
2
+ def change
3
+ create_table :emails do |t|
4
+ t.integer :origin_app_id, null: false
5
+ t.integer :user_id
6
+ t.integer :campaign_id
7
+ t.integer :priority
8
+ t.string :template
9
+ t.string :email
10
+ t.text :params
11
+ t.string :error
12
+ t.datetime :sent_at
13
+
14
+ t.timestamps
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,72 @@
1
+ module RenoteDac
2
+ module Generators
3
+ class InstallGenerator < Rails::Generators::Base
4
+ # RenoteDac::Generators::InstallGenerator.source_root("lib/generators/renote_dac/templates")
5
+ source_root File.expand_path("../templates", __FILE__)
6
+
7
+ desc "This generator creates a renote_dac.rb initializer file at config/initializers"
8
+ def create_initializer_file
9
+ template "initializer.rb", "config/initializers/renote_dac.rb"
10
+ end
11
+
12
+ desc "This generator creates a routes.rb file at /config"
13
+ def create_routes_file
14
+ template "routes.rb", "config/routes.rb"
15
+ end
16
+
17
+ desc "This generator creates a Gemfile at rails root"
18
+ def create_routes_file
19
+ FileUtils.remove_file(Rails.root.join('Gemfile').to_s)
20
+ template "gemfile.rb", "Gemfile"
21
+ end
22
+
23
+ def create_database_yml
24
+ database_name = Rails.application.class.parent_name.underscore.gsub("_","-")
25
+ create_file('config/database.yml',
26
+ %{default: &default
27
+ adapter: 'postgresql'
28
+ encoding: unicode
29
+ pool: <%= ENV['RAILS_MAX_THREADS'] || 5 %>
30
+ prepared_statements: false
31
+
32
+ development:
33
+ <<: *default
34
+ database: #{database_name}_dev
35
+
36
+ production:
37
+ <<: *default
38
+ }
39
+ )
40
+ end
41
+ end
42
+ end
43
+ end
44
+
45
+
46
+
47
+ class MyClass
48
+
49
+ def initialize
50
+ @first_property = nil
51
+ end
52
+
53
+ def im_a_public_method
54
+ puts 'Im public'
55
+ im_a_private_method
56
+ my_private_attribute
57
+ end
58
+
59
+ def first_property
60
+ self[:first_property]
61
+ end
62
+
63
+ def first_property=(val)
64
+ write_attribute :first_property, val
65
+ end
66
+
67
+ private
68
+
69
+ def im_a_private_method
70
+ puts 'im private'
71
+ end
72
+ end
@@ -0,0 +1,18 @@
1
+ source 'https://rubygems.org'
2
+ git_source(:github) { |repo| "https://github.com/#{repo}.git" }
3
+
4
+ ruby '2.5.0'
5
+
6
+ gem 'rails', '~> 5.2.0'
7
+ gem 'renote_dac', git: 'git@github.com:leather-s/renote_dac.git'
8
+
9
+ gem 'bootsnap', '>= 1.1.0', require: false
10
+
11
+ group :development do
12
+ gem 'annotate'
13
+ gem 'listen', '>= 3.0.5', '< 3.2'
14
+ gem 'pry-rails'
15
+ gem 'annotate'
16
+ gem 'pragmater', require: false
17
+ gem 'rails-erd', require: false
18
+ end
@@ -0,0 +1,18 @@
1
+ RenoteDac.configure do |c|
2
+ c.username = '1234567890'
3
+ c.password = '3456789012'
4
+ c.heartbeat = 2
5
+ c.exchange = 'sneakers'
6
+ c.exchange_type = :direct
7
+ c.vhost = '/'
8
+ c.rabbitmq_queue = 'queue.name.here'
9
+ c.prod_base_url = 'http://localhost:3000'
10
+ c.dev_base_url = 'http://localhost:3000'
11
+ c.postmark_api_key = 'place key here'
12
+ c.from_address = 'Your App Name <app@name.com>'
13
+
14
+ # sets RenoteDac to inherit directly from parent app ApplicationController. use '::' to get to the root controller
15
+ # defaults to '::ApplicationController'
16
+ c.base_controller = '::ApplicationController'
17
+ end
18
+
@@ -0,0 +1,3 @@
1
+ Rails.application.routes.draw do
2
+ mount RenoteDac::Engine => "/"
3
+ end
@@ -0,0 +1,21 @@
1
+ module RenoteDac
2
+
3
+ class Configuration
4
+ attr_accessor :username,:password, :heartbeat, :exchange, :exchange_type, :vhost, :rabbitmq_queue, :base_controller, :prod_base_url, :dev_base_url, :postmark_api_key, :from_address
5
+
6
+ def initialize
7
+ @username = nil
8
+ @password = nil
9
+ @heartbeat = 2
10
+ @exchange = 'sneakers'
11
+ @exchange_type = :direct
12
+ @vhost = '/'
13
+ @rabbitmq_queue = nil
14
+ @base_controller = '::ApplicationController'
15
+ @prod_base_url = nil
16
+ @dev_base_url = nil
17
+ @postmark_api_key = nil
18
+ @from_address = 'Your App Name <app@name.com>'
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,12 @@
1
+ require 'bcrypt'
2
+ require 'sneakers'
3
+ require 'postmark'
4
+ require 'jbuilder'
5
+
6
+ module RenoteDac
7
+ class Engine < ::Rails::Engine
8
+ isolate_namespace RenoteDac
9
+
10
+ Dir["../lib/generators/renote_dac/*.rb"].each {|file| require file }
11
+ end
12
+ end
@@ -0,0 +1,129 @@
1
+ module RenoteDac
2
+
3
+ module Mailer
4
+
5
+ InvalidTemplate = Class.new(StandardError)
6
+
7
+ TEMPLATES = {
8
+ reset_password: { priority: 10, template_id: 5878221 }, # url, expiration
9
+ upcoming_class: { priority: 15, template_id: 5879081 }, # event_name, event_time, event_url
10
+ order_receipt: { priority: 30, template_id: 5878761 }, # reminder_time, order_id, order_date, items[{description, amount}], total
11
+ welcome: { priority: 40, template_id: 5720622 } # reminder_time
12
+ }.freeze
13
+
14
+ BATCH_ID = 0
15
+ BATCH_TEMPLATE = 1
16
+ BATCH_EMAIL = 2
17
+ BATCH_PARAMS = 3
18
+
19
+ def self.enqueue(template, email, params = {})
20
+ meta = Mailer.get_template_meta(template)
21
+
22
+ Email.create!(
23
+ priority: meta[:priority],
24
+ template: template,
25
+ email: email,
26
+ params: params
27
+ )
28
+ end
29
+
30
+ def self.get_batch(size)
31
+ raise 'Max batch size is 500' if size > 500
32
+
33
+ Email
34
+ .where(error: nil)
35
+ .order(priority: :asc, id: :asc)
36
+ .limit(size)
37
+ .pluck(:id, :template, :email, :params)
38
+ end
39
+
40
+ def self.get_template_meta(template)
41
+ meta = TEMPLATES[template.to_sym]
42
+ raise Mailer::InvalidTemplate unless meta
43
+ meta
44
+ end
45
+
46
+ def self.base_url
47
+ if Rails.env.production?
48
+ RenoteDac.configuration.prod_base_url
49
+ else
50
+ RenoteDac.configuration.dev_base_url
51
+ end
52
+ end
53
+
54
+ class Client
55
+ def initialize
56
+ @client = Postmark::ApiClient.new(
57
+ RenoteDac.configuration.postmark_api_key,
58
+ http_read_timeout: 20,
59
+ http_open_timeout: 10,
60
+ secure: true
61
+ )
62
+ end
63
+
64
+ def process_batch(size = 100)
65
+ batch = Mailer.get_batch(size)
66
+ return 0 if batch.empty?
67
+
68
+ ids = []
69
+ messages = []
70
+
71
+ batch.each do |pending|
72
+ template = pending[BATCH_TEMPLATE]
73
+ params = pending[BATCH_PARAMS]
74
+ meta = Mailer.get_template_meta(template)
75
+
76
+ ids << pending[BATCH_ID]
77
+
78
+ messages << {
79
+ from: RenoteDac.configuration.from_address,
80
+ to: pending[BATCH_EMAIL],
81
+ template_id: meta[:template_id],
82
+ template_model: params,
83
+ tag: template
84
+ }
85
+ end
86
+
87
+ if Rails.env.production?
88
+ responses = @client.deliver_in_batches(messages)
89
+ handle_resp(ids, responses)
90
+ else
91
+ messages.each do |message|
92
+ puts "Sending message... #{message[:to]}"
93
+ end
94
+ # Dummy sending
95
+ Email.where(id: ids).update_all(error: 0)
96
+
97
+ # Live sending
98
+ #
99
+ # if you must send messages for real in development to make sure the
100
+ # templates look good, do it with care, because this uses the same
101
+ # server as in production. Don't send 5,000 emails on accident or
102
+ # Sidney will personally find you.
103
+ #
104
+ # responses = @client.deliver_in_batches(messages)
105
+ # puts responses.inspect
106
+ # handle_resp(ids, responses)
107
+ end
108
+
109
+ batch.size
110
+ end
111
+
112
+ private
113
+
114
+ def handle_resp(ids, responses)
115
+ raise 'Postmark response size mismatch' if ids.size != responses.size
116
+
117
+ # http://developer.postmarkapp.com/developer-api-overview.html#error-codes
118
+ #
119
+ # we originally were going to delete records with a '0' error code,
120
+ # but lets just keep an entire backlog of sent email
121
+ ActiveRecord::Base.transaction do
122
+ responses.each_with_index do |response, index|
123
+ Email.where(id: ids[index]).update_all(error: response[:error_code], sent_at: Time.now.utc)
124
+ end
125
+ end
126
+ end
127
+ end
128
+ end
129
+ end
@@ -0,0 +1,3 @@
1
+ module RenoteDac
2
+ VERSION = '0.0.139'
3
+ end
data/lib/renote_dac.rb ADDED
@@ -0,0 +1,14 @@
1
+ require 'renote_dac/version'
2
+ require 'renote_dac/engine'
3
+ require 'renote_dac/configuration'
4
+
5
+ module RenoteDac
6
+ class << self
7
+ attr_accessor :configuration
8
+ end
9
+
10
+ def self.configure
11
+ @configuration ||= Configuration.new
12
+ yield(configuration)
13
+ end
14
+ end
@@ -0,0 +1,20 @@
1
+ desc 'Sneakers tasks'
2
+ namespace :renote_dac do
3
+ task :deploy do
4
+ puts "Removing old .gem files"
5
+ FileUtils.rm_rf(Dir["#{RenoteDac::Engine.root}/*.gem"])
6
+
7
+ puts "Incrementing Minor Patch Version"
8
+ file = File.read(RenoteDac::Engine.root.join('lib','renote_dac','version.rb'))
9
+ version = file.match(/\d+\.\d+\.\d+/).to_s
10
+ new_version = "#{version.split(".")[(0..1)].join(".")}.#{version.split(".").last.to_i + 1}"
11
+ FileUtils.rm_rf(Dir["#{RenoteDac::Engine.root}/lib/renote_dac/version.rb"])
12
+ File.open(RenoteDac::Engine.root.join('lib', 'renote_dac', 'version.rb'), 'w') {|f| f.write("#{file.gsub(version, "#{new_version}")}") }
13
+
14
+ system "gem build renote_dac.gemspec"
15
+
16
+ system "bin/deploy 'rake app:renote_dac automatic deployment - #{version} to version #{new_version}'"
17
+ end
18
+ end
19
+
20
+ require 'sneakers/tasks'
metadata ADDED
@@ -0,0 +1,206 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: renote_dac
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.139
5
+ platform: ruby
6
+ authors:
7
+ - Sidney
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-06-29 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 5.2.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 5.2.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: bootsnap
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 1.1.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 1.1.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: pg
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: 1.0.0
48
+ - - "<"
49
+ - !ruby/object:Gem::Version
50
+ version: '2.0'
51
+ type: :runtime
52
+ prerelease: false
53
+ version_requirements: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ version: 1.0.0
58
+ - - "<"
59
+ - !ruby/object:Gem::Version
60
+ version: '2.0'
61
+ - !ruby/object:Gem::Dependency
62
+ name: puma
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '3.11'
68
+ type: :runtime
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '3.11'
75
+ - !ruby/object:Gem::Dependency
76
+ name: sqlite3
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ type: :runtime
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ - !ruby/object:Gem::Dependency
90
+ name: bcrypt
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: 3.1.7
96
+ type: :runtime
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: 3.1.7
103
+ - !ruby/object:Gem::Dependency
104
+ name: sneakers
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ type: :runtime
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ - !ruby/object:Gem::Dependency
118
+ name: postmark
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
124
+ type: :runtime
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
131
+ - !ruby/object:Gem::Dependency
132
+ name: jbuilder
133
+ requirement: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - "~>"
136
+ - !ruby/object:Gem::Version
137
+ version: '2.7'
138
+ type: :runtime
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - "~>"
143
+ - !ruby/object:Gem::Version
144
+ version: '2.7'
145
+ description: Rails engine for bundling all the configurations and depencies necessary
146
+ to run a remote mailing/notification service.
147
+ email:
148
+ - leather.s.dev@gmail.com
149
+ executables: []
150
+ extensions: []
151
+ extra_rdoc_files: []
152
+ files:
153
+ - MIT-LICENSE
154
+ - README.md
155
+ - Rakefile
156
+ - app/controllers/renote_dac/api/v1/emails_controller.rb
157
+ - app/controllers/renote_dac/api/v1_controller.rb
158
+ - app/controllers/renote_dac/api_controller.rb
159
+ - app/controllers/renote_dac/application_controller.rb
160
+ - app/helpers/renote_dac/application_helper.rb
161
+ - app/jobs/renote_dac/application_job.rb
162
+ - app/models/renote_dac/application_record.rb
163
+ - app/models/renote_dac/email.rb
164
+ - app/views/layouts/application.html.erb
165
+ - app/views/layouts/renote_dac/api/v1/emails/_index.json.jbuilder
166
+ - app/views/layouts/renote_dac/api/v1/emails/_show.json.jbuilder
167
+ - app/workers/service_queue_worker.rb
168
+ - config/initializers/sneakers.rb
169
+ - config/routes.rb
170
+ - config/settings.local.yml
171
+ - db/migrate/20180625004758_create_renote_dac_emails.rb
172
+ - lib/generators/renote_dac/install_generator.rb
173
+ - lib/generators/renote_dac/templates/gemfile.rb
174
+ - lib/generators/renote_dac/templates/initializer.rb
175
+ - lib/generators/renote_dac/templates/routes.rb
176
+ - lib/renote_dac.rb
177
+ - lib/renote_dac/configuration.rb
178
+ - lib/renote_dac/engine.rb
179
+ - lib/renote_dac/mailer.rb
180
+ - lib/renote_dac/version.rb
181
+ - lib/tasks/renote_dac_tasks.rake
182
+ homepage: https://sidneyleatherwood.com
183
+ licenses:
184
+ - MIT
185
+ metadata: {}
186
+ post_install_message:
187
+ rdoc_options: []
188
+ require_paths:
189
+ - lib
190
+ required_ruby_version: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - ">="
193
+ - !ruby/object:Gem::Version
194
+ version: '0'
195
+ required_rubygems_version: !ruby/object:Gem::Requirement
196
+ requirements:
197
+ - - ">="
198
+ - !ruby/object:Gem::Version
199
+ version: '0'
200
+ requirements: []
201
+ rubyforge_project:
202
+ rubygems_version: 2.7.3
203
+ signing_key:
204
+ specification_version: 4
205
+ summary: Remote Notifier Dependencies and Configuration
206
+ test_files: []