not_found_catcher 0.1.0

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.
Files changed (31) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +39 -0
  4. data/Rakefile +26 -0
  5. data/app/assets/config/not_found_catcher_manifest.js +2 -0
  6. data/app/assets/javascripts/not_found_catcher/application.js +14 -0
  7. data/app/assets/stylesheets/not_found_catcher/application.css +15 -0
  8. data/app/controllers/not_found_catcher/application_controller.rb +5 -0
  9. data/app/controllers/not_found_catcher/exceptions_controller.rb +10 -0
  10. data/app/controllers/not_found_catcher/roles_controller.rb +49 -0
  11. data/app/helpers/not_found_catcher/application_helper.rb +4 -0
  12. data/app/jobs/not_found_catcher/application_job.rb +4 -0
  13. data/app/lib/not_found_catcher/not_found_route_exception.rb +12 -0
  14. data/app/lib/not_found_catcher/request_parser.rb +56 -0
  15. data/app/lib/not_found_catcher/request_store.rb +77 -0
  16. data/app/mailers/not_found_catcher/application_mailer.rb +6 -0
  17. data/app/middleware/not_found_catcher/middleware.rb +46 -0
  18. data/app/models/not_found_catcher/application_record.rb +5 -0
  19. data/app/models/not_found_catcher/role.rb +32 -0
  20. data/app/views/layouts/not_found_catcher/application.html.erb +14 -0
  21. data/app/views/not_found_catcher/roles/edit.html.erb +9 -0
  22. data/app/views/not_found_catcher/roles/index.html.erb +24 -0
  23. data/config/routes.rb +13 -0
  24. data/lib/generators/not_found_catcher/USAGE +8 -0
  25. data/lib/generators/not_found_catcher/not_found_catcher_generator.rb +13 -0
  26. data/lib/generators/not_found_catcher/templates/not_found_catcher.rb.erb +33 -0
  27. data/lib/not_found_catcher/engine.rb +17 -0
  28. data/lib/not_found_catcher/version.rb +3 -0
  29. data/lib/not_found_catcher.rb +64 -0
  30. data/lib/tasks/not_found_catcher_tasks.rake +4 -0
  31. metadata +121 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 7991ac97bef725470d70a77ad378e7cbf4f24eeb
4
+ data.tar.gz: '0051002885918d4274ce36a530edea8dc18e0466'
5
+ SHA512:
6
+ metadata.gz: 0f9e687d926cbcfcb0895b1f363cc7b501076a552aafe4cf18707e935e39c732874b88ff94f47b4997c7a451093075db508b858f312f2ef4e034a2462a3a1fa5
7
+ data.tar.gz: be2aeb383e882a90b850193da0eea12ee5e51e8b70ac7151c17c5c4bd0a709cbcc71ab05dfdc9e91c48697117e5a4d3dcb596776b268ac7c594a8b17f80ff7f2
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2018 Marino Bonetti
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,39 @@
1
+ # NotFoundCatcher
2
+ Short description and motivation.
3
+
4
+ ## Usage
5
+ How to use my plugin.
6
+
7
+ ## Installation
8
+ Add this line to your application's Gemfile:
9
+
10
+ ```ruby
11
+ gem 'not_found_catcher'
12
+ ```
13
+
14
+ And then execute:
15
+ ```bash
16
+ $ bundle
17
+ ```
18
+
19
+ Installazione dell'inizializzatore
20
+ ```bash
21
+ bin/rails g not_found_catcher install
22
+ ```
23
+
24
+ ## Usage
25
+ After installing go to /not_found_catcher and you will see the administration panel, it's a simple
26
+ wrapper around the yml file with the configurations.
27
+ If an error occur of not_found inside the applicaion, the yml file will be populated.
28
+ You can define simple redirects matching exat the value, or you can use regexp to catch more errors and
29
+ redirect these to logic redirects:
30
+
31
+ /category/(.*) => http://example.com?category=$1
32
+
33
+
34
+
35
+ ## Contributing
36
+ Contribution directions go here.
37
+
38
+ ## License
39
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,26 @@
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 = 'NotFoundCatcher'
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("../spec/dummy/Rakefile", __FILE__)
18
+ load 'rails/tasks/engine.rake'
19
+
20
+
21
+ load 'rails/tasks/statistics.rake'
22
+
23
+
24
+
25
+ require 'bundler/gem_tasks'
26
+
@@ -0,0 +1,2 @@
1
+ //= link_directory ../javascripts/not_found_catcher .js
2
+ //= link_directory ../stylesheets/not_found_catcher .css
@@ -0,0 +1,14 @@
1
+ // This is a manifest file that'll be compiled into application.js, which will include all the files
2
+ // listed below.
3
+ //
4
+ // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
5
+ // or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path.
6
+ //
7
+ // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
8
+ // compiled file. JavaScript code in this file should be added after the last require_* statement.
9
+ //
10
+ // Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
11
+ // about supported directives.
12
+ //
13
+ //= require_tree .
14
+ //= require rails-ujs
@@ -0,0 +1,15 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ *
5
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
+ * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
7
+ *
8
+ * You're free to add application-wide styles to this file and they'll appear at the bottom of the
9
+ * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
10
+ * files in this directory. Styles in this file should be added after the last require_* statement.
11
+ * It is generally better to create a new file per style scope.
12
+ *
13
+ *= require_tree .
14
+ *= require_self
15
+ */
@@ -0,0 +1,5 @@
1
+ module NotFoundCatcher
2
+ class ApplicationController < NotFoundCatcher.base_admin_controller.constantize
3
+ protect_from_forgery with: :exception
4
+ end
5
+ end
@@ -0,0 +1,10 @@
1
+ require 'yaml'
2
+ module NotFoundCatcher
3
+ class ExceptionsController < NotFoundCatcher.base_catcher_controller.constantize
4
+
5
+ def show
6
+ raise NotFoundRouteException.new(request)
7
+ end
8
+
9
+ end
10
+ end
@@ -0,0 +1,49 @@
1
+ module NotFoundCatcher
2
+ class RolesController < NotFoundCatcher::ApplicationController
3
+
4
+ before_action :load_object, only: [:edit, :update, :destroy]
5
+
6
+ def index
7
+ @store = NotFoundCatcher.request_store
8
+ end
9
+
10
+ def edit
11
+ end
12
+
13
+ def update
14
+ @obj.assign_attributes(params.require(:role).permit(:role, :method, :redirect))
15
+
16
+
17
+ respond_to do |f|
18
+
19
+ if @obj.valid?
20
+
21
+ @obj.save
22
+ f.html {redirect_to root_path}
23
+ else
24
+ render :edit
25
+ end
26
+
27
+ end
28
+
29
+ end
30
+
31
+ def destroy
32
+ respond_to do |f|
33
+
34
+ if @obj.destroy
35
+ f.html {redirect_to root_path}
36
+ else
37
+ render :edit
38
+ end
39
+
40
+ end
41
+ end
42
+
43
+ private
44
+ def load_object
45
+ @obj = NotFoundCatcher.request_store.find(params[:id]).model
46
+ end
47
+
48
+ end
49
+ end
@@ -0,0 +1,4 @@
1
+ module NotFoundCatcher
2
+ module ApplicationHelper
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module NotFoundCatcher
2
+ class ApplicationJob < ActiveJob::Base
3
+ end
4
+ end
@@ -0,0 +1,12 @@
1
+ module NotFoundCatcher
2
+ class NotFoundRouteException < StandardError
3
+
4
+ attr_accessor :request
5
+
6
+ def initialize(request)
7
+ @request = request
8
+ super("Not Found Routes #{request.fullpath}")
9
+ end
10
+
11
+ end
12
+ end
@@ -0,0 +1,56 @@
1
+ module NotFoundCatcher
2
+ class RequestParser < Struct.new(:role, :method, :redirect)
3
+
4
+
5
+ def considered?
6
+ !redirect.blank?
7
+ end
8
+
9
+ def build_redirect(request)
10
+
11
+ request.fullpath.gsub(Regexp.new(self.role),self.redirect.gsub(/\$([0-9]+)/,'$$$1').gsub('$$$','\\'))
12
+
13
+ end
14
+
15
+ ##
16
+ # Return the relative model for this record
17
+ def model
18
+
19
+ r = Role.new(
20
+ role: self.role,
21
+ http_method: self.method,
22
+ redirect: self.redirect
23
+ )
24
+ r.request_parser = self
25
+ r
26
+
27
+ end
28
+
29
+
30
+ ##
31
+ # Cerca se stesso all'interno dello store e si salva
32
+ def save
33
+ store = NotFoundCatcher.request_store.store
34
+ store.transaction do
35
+
36
+ store[self.role] = self
37
+
38
+ end
39
+
40
+
41
+ end
42
+
43
+ def id
44
+ Digest::MD5.hexdigest(self.role)
45
+ end
46
+
47
+ def destroy
48
+ store = NotFoundCatcher.request_store.store
49
+ store.transaction do
50
+ store.delete(self.role)
51
+ end
52
+ end
53
+
54
+
55
+ end
56
+ end
@@ -0,0 +1,77 @@
1
+ require 'yaml/store'
2
+ class NotFoundCatcher::RequestStore
3
+
4
+ attr_accessor :path
5
+
6
+ def initialize(path)
7
+ self.path = path
8
+ end
9
+
10
+
11
+ def parse(request)
12
+
13
+ key = get_first_match(request.fullpath)
14
+
15
+ store.transaction do
16
+
17
+ if key
18
+ req = store[key]
19
+ else
20
+ req = store[request.fullpath] = NotFoundCatcher::RequestParser.new(request.fullpath, request.request_method, nil)
21
+ end
22
+
23
+ yield req
24
+
25
+ end
26
+
27
+
28
+ end
29
+
30
+ ##
31
+ # Restituisce la prima chiave matchata
32
+ def get_first_match(path)
33
+
34
+ store.transaction(true) do
35
+
36
+ store.roots.each do |k|
37
+
38
+ if path.match(k)
39
+ return k
40
+ end
41
+
42
+ end
43
+ end
44
+ false
45
+ end
46
+
47
+ def each
48
+
49
+ store.transaction(true) do
50
+
51
+ store.roots.each do |k|
52
+
53
+ yield store[k]
54
+
55
+ end
56
+
57
+ end
58
+
59
+ end
60
+
61
+ def find(key)
62
+ rule = nil
63
+ store.transaction(true) do
64
+ store.roots.each do |k|
65
+ rule = store[k] if store[k].id == key
66
+ end
67
+ end
68
+ rule
69
+ end
70
+
71
+ ##
72
+ # Store yaml
73
+ def store
74
+ @_store ||= YAML::Store.new self.path
75
+ end
76
+
77
+ end
@@ -0,0 +1,6 @@
1
+ module NotFoundCatcher
2
+ class ApplicationMailer < ActionMailer::Base
3
+ default from: 'from@example.com'
4
+ layout 'mailer'
5
+ end
6
+ end
@@ -0,0 +1,46 @@
1
+ module NotFoundCatcher
2
+ class Middleware
3
+
4
+ def initialize(app)
5
+ @app = app
6
+ end
7
+
8
+ def exceptions_to_catch
9
+ @_exceptions_to_catch ||= NotFoundCatcher.exceptions_to_catch.collect {|v| v.is_a?(String) ? v.constantize : v}
10
+ end
11
+
12
+ def redirect_to(location, content_type: 'text/html', status: 301)
13
+ [status, {'Location' => location, 'Content-Type' => content_type}, ['Moved Permanently']]
14
+ end
15
+
16
+ def call(env)
17
+ begin
18
+ ris = @app.call(env)
19
+ rescue *exceptions_to_catch
20
+
21
+ begin
22
+ rs = NotFoundCatcher.request_store
23
+ request = ActionDispatch::Request.new(env)
24
+
25
+ rs.parse(request) do |req|
26
+
27
+ if req.considered?
28
+ redirect_path = req.build_redirect(request)
29
+ Rails.logger.info {"[NOT_FOUND_CATCHER] Catch #{request.fullpath} -> #{redirect_path}"}
30
+ ris = redirect_to redirect_path
31
+ else
32
+ Rails.logger.info {"[NOT_FOUND_CATCHER] Catch non gestito:#{request.fullpath}"}
33
+ ris = redirect_to NotFoundCatcher.if_not_considered_path.call(request), status: 302
34
+ end
35
+
36
+ end
37
+ rescue Exception => e
38
+ Rails.logger.info {"[NOT_FOUND_CATCHER] Problemi - #{e.message} - #{e.backtrace.join("\n")}"}
39
+ end
40
+
41
+ end
42
+ ris
43
+ end
44
+
45
+ end
46
+ end
@@ -0,0 +1,5 @@
1
+ module NotFoundCatcher
2
+ class ApplicationRecord < ActiveRecord::Base
3
+ self.abstract_class = true
4
+ end
5
+ end
@@ -0,0 +1,32 @@
1
+ module NotFoundCatcher
2
+ class Role < ActiveType::Object
3
+
4
+ attr_accessor :request_parser
5
+
6
+ attribute :role, :string
7
+ attribute :http_method, :string
8
+ attribute :redirect, :string
9
+
10
+
11
+ def persisted?
12
+ true
13
+ end
14
+
15
+ def id
16
+ self.request_parser.id
17
+ end
18
+
19
+ def save
20
+
21
+ request_parser.role = self.role
22
+ request_parser.method = self.http_method
23
+ request_parser.redirect = self.redirect
24
+
25
+ request_parser.save
26
+
27
+ end
28
+
29
+ delegate :destroy,to: :request_parser
30
+
31
+ end
32
+ end
@@ -0,0 +1,14 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Not found catcher</title>
5
+ <%= stylesheet_link_tag "not_found_catcher/application", media: "all" %>
6
+ <%= javascript_include_tag "not_found_catcher/application" %>
7
+ <%= csrf_meta_tags %>
8
+ </head>
9
+ <body>
10
+
11
+ <%= yield %>
12
+
13
+ </body>
14
+ </html>
@@ -0,0 +1,9 @@
1
+ <%= form_for @obj do |f| %>
2
+
3
+ <%= f.text_field :role %>
4
+ <%= f.text_field :http_method %>
5
+ <%= f.text_field :redirect %>
6
+
7
+ <%= f.submit %>
8
+
9
+ <% end %>
@@ -0,0 +1,24 @@
1
+ <table border="1">
2
+ <tr>
3
+ <th>Rule</th>
4
+ <th>Method</th>
5
+ <th>Redirect</th>
6
+ <th></th>
7
+ </tr>
8
+
9
+
10
+ <% @store.each do |row| %>
11
+
12
+ <tr>
13
+ <td><%= row.role %></td>
14
+ <td><%= row.method %></td>
15
+ <td><%= row.redirect %></td>
16
+ <td>
17
+ <%= link_to 'edit', edit_role_path(row.id) %>
18
+ <%= link_to 'destroy', role_path(row.id), method: :delete, data: {confirm: "Are you sure?"} %>
19
+ </td>
20
+ </tr>
21
+
22
+ <% end %>
23
+
24
+ </table>
data/config/routes.rb ADDED
@@ -0,0 +1,13 @@
1
+ NotFoundCatcher::Engine.routes.draw do
2
+
3
+ resources :roles, only: [:index, :edit, :update, :destroy]
4
+
5
+ root to: 'roles#index'
6
+
7
+ end
8
+
9
+ ##
10
+ # Appendo una rotta finale per matchare tutto quello sbagliato
11
+ Rails.application.routes.append do
12
+ match '*path', controller: 'not_found_catcher/exceptions', action: :show, via: [:get, :post, :put, :delete]
13
+ end
@@ -0,0 +1,8 @@
1
+ Description:
2
+ Execute the installation
3
+
4
+ Example:
5
+ rails generate not_found_catcher install
6
+
7
+ This will create:
8
+ config/initializer/not_found_catcher.rb
@@ -0,0 +1,13 @@
1
+ class NotFoundCatcherGenerator < Rails::Generators::NamedBase
2
+ source_root File.expand_path('../templates', __FILE__)
3
+
4
+ def create_initializer
5
+ copy_file 'not_found_catcher.rb.erb', 'config/initializers/not_found_catcher.rb'
6
+ end
7
+
8
+ def install_routes
9
+ route 'mount NotFoundCatcher::Engine => "/not_found_catcher"'
10
+ end
11
+
12
+
13
+ end
@@ -0,0 +1,33 @@
1
+ NotFoundCatcher.setup do |c|
2
+
3
+ # Posizione del file yml per salvare lo stato dei redirects
4
+ # c.request_db= -> {Rails.root.join('config', 'page_not_found.yml')}
5
+
6
+ # Redirect nel caso non abbiamo nessun match o regola di redirect nel DB
7
+ # c.if_not_considered_path = ->(env){ Rails.application.routes.url_helpers.root_path }
8
+
9
+ ##
10
+ # Se siamo in sviluppo e questa configurazione è a true, tutte le richieste non saranno locali
11
+ # altrimenti seguono lo standard della configurazione dell'applicativo
12
+ # c.dev_mode=false
13
+
14
+
15
+ ##
16
+ # Controller da cui derivare il lato amministrativo dell'engine
17
+ #c.base_admin_controller = "ActionController::Base"
18
+
19
+
20
+ ##
21
+ # Controller da cui derivare il lato catch_all delle chiamate
22
+ # c.base_catcher_controller = "ActionController::Base"
23
+
24
+
25
+ ##
26
+ # Catcher attivo o meno, utile per quando si è in sviluppo
27
+ c.enabled = Rails.env.production?
28
+
29
+ ##
30
+ # Elenco degli errori da ascoltare
31
+ # c.exceptions_to_catch << Exception # to catch all
32
+
33
+ end
@@ -0,0 +1,17 @@
1
+ module NotFoundCatcher
2
+ class Engine < ::Rails::Engine
3
+ isolate_namespace NotFoundCatcher
4
+
5
+ require 'active_type'
6
+
7
+ # initializer 'not_found_catcher.set_error_catcher', before: "better_errors.configure_rails_initialization" do |app|
8
+ # app.config.exceptions_app = ->(env) {NotFoundCatcher::ExceptionsController.action(:show).call(env)}
9
+ # app.config.consider_all_requests_local = !NotFoundCatcher.dev_mode if Rails.env.development?
10
+ # end
11
+
12
+ initializer 'not_found_catcher.set_error_catcher_middleware' do |app|
13
+ app.config.middleware.use NotFoundCatcher::Middleware
14
+ end
15
+
16
+ end
17
+ end
@@ -0,0 +1,3 @@
1
+ module NotFoundCatcher
2
+ VERSION = '0.1.0'
3
+ end
@@ -0,0 +1,64 @@
1
+ require "not_found_catcher/engine"
2
+ module NotFoundCatcher
3
+ extend ActiveSupport::Autoload
4
+
5
+ autoload :RequestStore
6
+ autoload :RequestParser
7
+
8
+ ##
9
+ # Posizione del file yml in cui registrare tutte le richieste andate male
10
+ # e le possibili risoluzioni
11
+ mattr_accessor :request_db
12
+ @@request_db = -> {Rails.root.join('config', 'page_not_found.yml')}
13
+
14
+
15
+ def self.request_store
16
+ @_req_st ||= (
17
+ path = NotFoundCatcher.request_db.()
18
+ FileUtils.touch path unless File.exists?(path)
19
+
20
+ RequestStore.new(path)
21
+ )
22
+ end
23
+
24
+ ##
25
+ # Controller da cui derivare il lato amministrativo dell'engine
26
+ mattr_accessor :base_admin_controller
27
+ @@base_admin_controller = "ActionController::Base"
28
+
29
+
30
+ ##
31
+ # Controller da cui derivare il lato catch_all delle chiamate
32
+ mattr_accessor :base_catcher_controller
33
+ @@base_catcher_controller = "ActionController::Base"
34
+
35
+
36
+ ##
37
+ # Se siamo in sviluppo e questa configurazione è a true, tutte le richieste non saranno locali
38
+ # altrimenti seguono lo standard della configurazione dell'applicativo
39
+ mattr_accessor :dev_mode
40
+ @@dev_mode = false
41
+
42
+ # Redirect nel caso non abbiamo nessun match o regola di redirect nel DB
43
+ mattr_accessor :if_not_considered_path
44
+ @@if_not_considered_path = ->(env) {Rails.application.routes.url_helpers.root_path}
45
+
46
+
47
+ ##
48
+ # Elenco degli errori da ascoltare
49
+ mattr_accessor :exceptions_to_catch
50
+ @@exceptions_to_catch = ['NotFoundCatcher::NotFoundRouteException']
51
+
52
+ ##
53
+ # Catcher attivo o meno, utile per quando si è in sviluppo
54
+ mattr_accessor :enabled
55
+ @@enabled = true
56
+
57
+ # Default way to setup TikalCore. Run "rails generate tikal_core_install" to create
58
+ # a fresh initializer with all configuration values.
59
+ def self.setup
60
+ yield self
61
+ end
62
+
63
+
64
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :not_found_catcher do
3
+ # # Task goes here
4
+ # end
metadata ADDED
@@ -0,0 +1,121 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: not_found_catcher
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Marino Bonetti
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-03-04 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.1'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '6'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">"
28
+ - !ruby/object:Gem::Version
29
+ version: '5.1'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '6'
33
+ - !ruby/object:Gem::Dependency
34
+ name: active_type
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ type: :runtime
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ - !ruby/object:Gem::Dependency
48
+ name: sqlite3
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ description: 'Mountable Engine to catch not_found_errors and to administrate redirects '
62
+ email:
63
+ - marinobonetti@gmail.com
64
+ executables: []
65
+ extensions: []
66
+ extra_rdoc_files: []
67
+ files:
68
+ - MIT-LICENSE
69
+ - README.md
70
+ - Rakefile
71
+ - app/assets/config/not_found_catcher_manifest.js
72
+ - app/assets/javascripts/not_found_catcher/application.js
73
+ - app/assets/stylesheets/not_found_catcher/application.css
74
+ - app/controllers/not_found_catcher/application_controller.rb
75
+ - app/controllers/not_found_catcher/exceptions_controller.rb
76
+ - app/controllers/not_found_catcher/roles_controller.rb
77
+ - app/helpers/not_found_catcher/application_helper.rb
78
+ - app/jobs/not_found_catcher/application_job.rb
79
+ - app/lib/not_found_catcher/not_found_route_exception.rb
80
+ - app/lib/not_found_catcher/request_parser.rb
81
+ - app/lib/not_found_catcher/request_store.rb
82
+ - app/mailers/not_found_catcher/application_mailer.rb
83
+ - app/middleware/not_found_catcher/middleware.rb
84
+ - app/models/not_found_catcher/application_record.rb
85
+ - app/models/not_found_catcher/role.rb
86
+ - app/views/layouts/not_found_catcher/application.html.erb
87
+ - app/views/not_found_catcher/roles/edit.html.erb
88
+ - app/views/not_found_catcher/roles/index.html.erb
89
+ - config/routes.rb
90
+ - lib/generators/not_found_catcher/USAGE
91
+ - lib/generators/not_found_catcher/not_found_catcher_generator.rb
92
+ - lib/generators/not_found_catcher/templates/not_found_catcher.rb.erb
93
+ - lib/not_found_catcher.rb
94
+ - lib/not_found_catcher/engine.rb
95
+ - lib/not_found_catcher/version.rb
96
+ - lib/tasks/not_found_catcher_tasks.rake
97
+ homepage: http://gitbuh.com/oniram88/NotFoundCatcher
98
+ licenses:
99
+ - MIT
100
+ metadata: {}
101
+ post_install_message:
102
+ rdoc_options: []
103
+ require_paths:
104
+ - lib
105
+ required_ruby_version: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ required_rubygems_version: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - ">="
113
+ - !ruby/object:Gem::Version
114
+ version: '0'
115
+ requirements: []
116
+ rubyforge_project:
117
+ rubygems_version: 2.5.2
118
+ signing_key:
119
+ specification_version: 4
120
+ summary: Mountable Engine to catch not_found_errors and to administrate redirects
121
+ test_files: []