simple-maintenance-mode 0.0.2

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: 30305a8b24e502f3a5cd27850b4b502d404956938048ce83fbe032e870a141f6
4
+ data.tar.gz: 7f3d7fbb8a872454dfacb16ee610d7984a6f98bbc8a782831074030579365040
5
+ SHA512:
6
+ metadata.gz: 9961fcd7fc9b4d1526c2fa2b5c8df9bb4f443d70d2ea0ffeacd49b7b8b372e77acaac5e349ec37dfe53055e434afec9987eab8dfddba2b1e019168c62fae639d
7
+ data.tar.gz: 047e7d7f832eac94d81bc2bb6b49e193d4c3747f750330c797f69a9c0f2d7281abef7a0837e0ef05f99898212abbfc4550f24b82aab3b27c9c0f8cd66cd0425a
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/CHANGELOG.md ADDED
@@ -0,0 +1,7 @@
1
+ 0.0.2 introducing 'simple' name prefix for the gem
2
+
3
+ 0.0.1 initial maintenance mode implementation
4
+ - maintenance check filter
5
+ - app config model
6
+ - maintenance page
7
+ - installation generator
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in maintenance_mode.gemspec
4
+ gemspec
data/README.md ADDED
@@ -0,0 +1,53 @@
1
+ # Simple Maintenance Mode
2
+
3
+ A simple maintenance mode gem for rails apps. If you need a mode/page for
4
+ maintenance purposes, this is a gem for you. It provides a simple maintenance
5
+ page, filter for your controllers and a fairly simple logic for
6
+ activation/deactivation.
7
+
8
+ When activated, users will be redirected (maintenance_mode_check filter) to a
9
+ static maintenance mode page (**/maintenance** route). The maintenance mode settings
10
+ will be stored in a app settings model. Additionally each user will get a cookie
11
+ when the mode is active and a redirection to the maintenance page will happen.
12
+
13
+ To activate the maintenance mode simply run the rails console and do this:
14
+ **SimpleMaintenanceMode::Model::AppSettings.maintenance_mode = true**
15
+
16
+ As a rails app administrator, you will be always able to access the page by using
17
+ the **maintenance_mode_override=1** GET parameter.
18
+
19
+
20
+ ## Installation
21
+
22
+ Add this line to your application's Gemfile:
23
+
24
+ gem 'simple-maintenance-mode'
25
+
26
+ And then execute:
27
+
28
+ $ bundle
29
+ $ rails g simple_maintenance_mode:install
30
+
31
+ Or install it yourself as:
32
+
33
+ $ gem install simple-maintenance-mode
34
+
35
+ ## Usage
36
+
37
+ Put this in your Application Controller
38
+ ````
39
+ class ApplicationController < ActionController::Base
40
+ include SimpleMaintenanceMode::Filter
41
+ before_action :check_maintenance_mode
42
+ end
43
+ ````
44
+
45
+ You can get/set the maintenance mode with the following method
46
+ ````
47
+ # get current maintenance mode
48
+ SimpleMaintenanceMode::Model::AppSettings.maintenance_mode
49
+ # will return true|false
50
+
51
+ # set maintenance mode
52
+ SimpleMaintenanceMode::Model::AppSettings.maintenance_mode = true|false
53
+ ````
data/Rakefile ADDED
@@ -0,0 +1,4 @@
1
+ require "bundler/gem_tasks"
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
@@ -0,0 +1,22 @@
1
+ Description:
2
+ Install simple maintenance mode for your applications.
3
+ The installation will copy migrations and pages into your migrations/public
4
+ rails app folder.
5
+
6
+ What you have to do:
7
+ - Put the check_maintenance_mode filter in your application_controller.rb
8
+ - Integrate a maintenance mode checkbox in your rails app application for
9
+ convenience.
10
+
11
+ Final notes:
12
+ You will be able to access the website with the get parameter
13
+ maintenance_mode_override=1 even if the maintenance mode is active. This is
14
+ an option for administrators, who want to test the side before turning off
15
+ the maintenance mode.
16
+
17
+ Example:
18
+ rails generate simple_maintenance_mode:install
19
+
20
+ This will create following files in your rails app:
21
+ - db/migrations/..._create_app_config.rb
22
+ - public/maintenance.html
@@ -0,0 +1,13 @@
1
+ module SimpleMaintenanceMode
2
+ module Generators
3
+ class InstallGenerator < ::Rails::Generators::Base
4
+ source_root File.expand_path("../templates", __FILE__)
5
+
6
+ def copy_migration
7
+ timestamp = Time.now.strftime('%Y%m%d%H%M%S')
8
+ template("create_app_settings.rb", "db/migrate/#{timestamp}_create_app_settings.rb")
9
+ template("maintenance.html", "public/maintenance.html")
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,9 @@
1
+ class CreateAppSettings < ActiveRecord::Migration
2
+ def change
3
+ create_table :app_settings do |t|
4
+ t.boolean :maintenance_mode, :default => false
5
+ t.text :meta
6
+ t.timestamps
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,152 @@
1
+ <!DOCTYPE html>
2
+ <html class="alfred">
3
+ <head>
4
+ <title>Maintenance</title>
5
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
6
+ <meta name="viewport" content="width=device-width; initial-scale=1.0;"/>
7
+
8
+ <style>
9
+ /*default*/
10
+ body, html {background:#f2f2f2; font-family: arial, sans-serif; font-size:18px; margin:0; padding:0;}
11
+ .wrapper {text-align:center; margin:70px auto 0 auto; color:#999; width:50%;}
12
+ .link a+a {margin-left:5px;}
13
+ .btn {background:#aaa; border:solid 1px #fff; color:#fff; display:inline-block; font-size:14px; text-decoration:none; margin-top:5px; padding:8px 12px; border-radius:4px;}
14
+ .btn:hover {background:#999; box-shadow:0 10px 10px rgba(0, 0, 0, 0.2);}
15
+ .bg {
16
+ padding:10px 0;
17
+ background: -moz-linear-gradient(left, #f2f2f2 0%, #f9f9f9 50%, #f2f2f2 100%);
18
+ background: -webkit-linear-gradient(left, #f2f2f2 0%, #f9f9f9 50%, #f2f2f2 100%);
19
+ background: -ms-linear-gradient(left, #f2f2f2 0%, #f9f9f9 50%, #f2f2f2 100%);
20
+ background: linear-gradient(left, #f2f2f2 0%, #f9f9f9 50%, #f2f2f2 100%);
21
+ }
22
+ h1 {color:#e5e5e5; font-size:90px; font-weight:bold; text-shadow: 0 -1px 0px rgba(0, 0, 0, 0.2), 0 1px 1px rgba(255, 255, 255, 0.8); margin:50px 0 0 0; padding:0;}
23
+ p {padding:10px 0; margin:0; letter-spacing:1px; line-height:25px;}
24
+ strong {white-space: nowrap;}
25
+ hr {background:none; box-shadow:none; border:none; border-top:solid 1px #ddd; border-bottom:solid 1px #fff; margin:0; padding:0;}
26
+
27
+ /*for alfred*/
28
+ html.alfred, .alfred body {background:#E3E0D8;}
29
+ .alfred .wrapper {color:#777;}
30
+ .alfred h1 {color:#cfccc5;}
31
+ .alfred hr {background:none; box-shadow:none; border:none; border-top:solid 1px #ccc; border-bottom:solid 1px #fff; margin:0; padding:0;}
32
+ .alfred .btn {background:#E79800;}
33
+ .alfred .bg {
34
+ padding:10px 0;
35
+ background: -moz-linear-gradient(left, #E3E0D8 0%, #ece9e1 50%, #E3E0D8 100%);
36
+ background: -webkit-linear-gradient(left, #E3E0D8 0%, #ece9e1 50%, #E3E0D8 100%);
37
+ background: -ms-linear-gradient(left, #E3E0D8 0%, #ece9e1 50%, #E3E0D8 100%);
38
+ background: linear-gradient(left, #E3E0D8 0%, #ece9e1 50%, #E3E0D8 100%);
39
+ }
40
+
41
+ @-webkit-keyframes fadeInDown {
42
+ 0% {
43
+ opacity: 0;
44
+ -webkit-transform: translateY(-30px);
45
+ }
46
+
47
+ 100% {
48
+ opacity: 1;
49
+ -webkit-transform: translateY(0);
50
+ }
51
+ }
52
+
53
+ @-moz-keyframes fadeInDown {
54
+ 0% {
55
+ opacity: 0;
56
+ -moz-transform: translateY(-30px);
57
+ }
58
+
59
+ 100% {
60
+ opacity: 1;
61
+ -moz-transform: translateY(0);
62
+ }
63
+ }
64
+
65
+ @-ms-keyframes fadeInDown {
66
+ 0% {
67
+ opacity: 0;
68
+ -ms-transform: translateY(-30px);
69
+ }
70
+
71
+ 100% {
72
+ opacity: 1;
73
+ -ms-transform: translateY(0);
74
+ }
75
+ }
76
+
77
+ @-o-keyframes fadeInDown {
78
+ 0% {
79
+ opacity: 0;
80
+ -ms-transform: translateY(-30px);
81
+ }
82
+
83
+ 100% {
84
+ opacity: 1;
85
+ -ms-transform: translateY(0);
86
+ }
87
+ }
88
+
89
+ @keyframes fadeInDown {
90
+ 0% {
91
+ opacity: 0;
92
+ transform: translateY(-30px);
93
+ }
94
+
95
+ 100% {
96
+ opacity: 1;
97
+ transform: translateY(0);
98
+ }
99
+ }
100
+
101
+ .animation{
102
+ -webkit-transition: all 0.1s linear;
103
+ -o-transition: all 0.1s linear;
104
+ -moz-transition: all 0.1s linear;
105
+ -ms-transition: all 0.1s linear;
106
+ -kthtml-transition: all 0.1s linear;
107
+ transition: all 0.1s linear;
108
+ transition-delay:0.0s;
109
+ }
110
+ .animated {
111
+ -webkit-animation: 1s ease;
112
+ -moz-animation: 1s ease;
113
+ -ms-animation: 1s ease;
114
+ -o-animation: 1s ease;
115
+ animation: 1s ease;
116
+ }
117
+ .fadeInDown {
118
+ -webkit-animation-name: fadeInDown;
119
+ -moz-animation-name: fadeInDown;
120
+ -ms-animation-name: fadeInDown;
121
+ -o-animation-name: fadeInDown;
122
+ animation-name: fadeInDown;
123
+ }
124
+ @media (max-width: 800px) {
125
+ h1 {font-size:40px;}
126
+ }
127
+
128
+ </style>
129
+
130
+ </head>
131
+
132
+ <body class="animated fadeInDown">
133
+
134
+ <div class="wrapper">
135
+ <h1>Maintenance</h1>
136
+ <hr />
137
+ <div class="bg">
138
+ <p>
139
+ The website is currently in maintenance.
140
+ </p>
141
+ <p>
142
+ Sorry for the inconvenience.
143
+ </p>
144
+ <p class="link">
145
+ <a href="your-website-url" title="website title" class="animation btn">Your Website URL</a>
146
+ </p>
147
+ </div>
148
+ <hr />
149
+ </div>
150
+
151
+ </body>
152
+ </html>
@@ -0,0 +1,26 @@
1
+ module SimpleMaintenanceMode
2
+ module Filter
3
+
4
+ def check_maintenance_mode(override = false)
5
+ maintenance_mode_override = override
6
+ if params[:maintenance_mode_override].present?
7
+ maintenance_mode_override = true
8
+ cookies[:maintenance_mode_override] = true
9
+ end
10
+ if cookies[:maintenance_mode_override].present?
11
+ maintenance_mode_override = true
12
+ end
13
+
14
+ if app_settings.maintenance_mode.present? && !maintenance_mode_override
15
+ redirect_to '/maintenance'
16
+ end
17
+ if app_settings.maintenance_mode.blank?
18
+ cookies.delete(:maintenance_mode_override) # cleanup unused cookie
19
+ end
20
+ end
21
+
22
+ def app_settings
23
+ @app_settings ||= SimpleMaintenanceMode::Model::AppSettings.instance
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,28 @@
1
+ require 'active_record'
2
+ require 'acts_as_singleton'
3
+
4
+ module SimpleMaintenanceMode
5
+ module Model
6
+ class AppSettings < ActiveRecord::Base
7
+
8
+ acts_as_singleton
9
+
10
+ def self.maintenance_mode=(active=false)
11
+ app_settings = SimpleMaintenanceMode::Model::AppSettings.instance
12
+ app_settings.maintenance_mode = active
13
+ app_settings.save
14
+ end
15
+
16
+ def self.maintenance_mode
17
+ SimpleMaintenanceMode::Model::AppSettings.instance.maintenance_mode
18
+ end
19
+
20
+ def as_json
21
+ {
22
+ maintenance_mode: self.maintenance_mode
23
+ }
24
+ end
25
+
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,3 @@
1
+ module SimpleMaintenanceMode
2
+ VERSION = "0.0.2"
3
+ end
@@ -0,0 +1,6 @@
1
+ require 'simple-maintenance-mode/version'
2
+ require 'simple-maintenance-mode/model/app_settings'
3
+ require 'simple-maintenance-mode/filter'
4
+
5
+ module SimpleMaintenanceMode
6
+ end
@@ -0,0 +1,29 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'simple-maintenance-mode/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "simple-maintenance-mode"
8
+ spec.version = SimpleMaintenanceMode::VERSION
9
+ spec.authors = ["Adam Musial-Bright"]
10
+ spec.summary = %q{Simple maintenance mode for production rails apps.}
11
+ spec.description = %q{Use simple model and before filter to activate the maintenance mode.}
12
+ spec.homepage = "https://github.com/musial-bright/simple-maintenance-mode"
13
+ spec.license = "MIT"
14
+
15
+ spec.files = `git ls-files -z`.split("\x0")
16
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
+ spec.require_paths = ["lib"]
19
+
20
+ spec.add_dependency 'activesupport'
21
+ spec.add_dependency 'activemodel'
22
+ spec.add_dependency 'activerecord'
23
+ spec.add_dependency 'acts_as_singleton'
24
+
25
+ spec.add_development_dependency "bundler"
26
+ spec.add_development_dependency "rake"
27
+ spec.add_development_dependency 'rspec'
28
+ spec.add_development_dependency 'sqlite3'
29
+ end
@@ -0,0 +1,73 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'SimpleMaintenanceMode::Filter' do
4
+
5
+ let(:app_settings) do
6
+ double(SimpleMaintenanceMode::Model::AppSettings)
7
+ end
8
+
9
+ let(:generic_controller) do
10
+ class GenericController
11
+ include SimpleMaintenanceMode::Filter
12
+
13
+ attr_accessor :cookies, :params
14
+
15
+ def initialize
16
+ @cookies = Hash.new
17
+ @params = Hash.new
18
+ end
19
+
20
+ def redirect_to
21
+ end
22
+ end
23
+ gc = GenericController.new
24
+ gc.stub(:app_settings).and_return(app_settings)
25
+ gc
26
+ end
27
+
28
+ def maintenace_mode_activated
29
+ app_settings.stub(maintenance_mode: true)
30
+ end
31
+
32
+ def maintenace_mode_deactivated
33
+ app_settings.stub(maintenance_mode: false)
34
+ end
35
+
36
+ describe 'with deactivated maintenance mode' do
37
+ before :each do
38
+ maintenace_mode_deactivated
39
+ end
40
+ it 'should not redirect' do
41
+ generic_controller.should_not_receive(:redirect_to)
42
+ generic_controller.check_maintenance_mode
43
+ end
44
+ end
45
+
46
+ describe 'with activated maintenance mode' do
47
+ before :each do
48
+ maintenace_mode_activated
49
+ end
50
+
51
+ it 'should redirect' do
52
+ generic_controller.should_receive(:redirect_to)
53
+ generic_controller.check_maintenance_mode
54
+ end
55
+
56
+ describe 'overridden check with method attribute' do
57
+ it 'should not redirect' do
58
+ generic_controller.should_not_receive(:redirect_to)
59
+ generic_controller.check_maintenance_mode(true)
60
+ end
61
+ end
62
+
63
+ describe 'overridden check with get params' do
64
+ it 'should not redirect' do
65
+ generic_controller.should_not_receive(:redirect_to)
66
+ generic_controller.params[:maintenance_mode_override] = true
67
+ generic_controller.check_maintenance_mode
68
+ generic_controller.cookies[:maintenance_mode_override].should be_present
69
+ end
70
+ end
71
+ end
72
+
73
+ end
@@ -0,0 +1 @@
1
+ require 'simple-maintenance-mode'
metadata ADDED
@@ -0,0 +1,172 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: simple-maintenance-mode
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - Adam Musial-Bright
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2023-02-28 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: activemodel
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: activerecord
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: acts_as_singleton
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: bundler
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rake
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rspec
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '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: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ description: Use simple model and before filter to activate the maintenance mode.
126
+ email:
127
+ executables: []
128
+ extensions: []
129
+ extra_rdoc_files: []
130
+ files:
131
+ - ".gitignore"
132
+ - CHANGELOG.md
133
+ - Gemfile
134
+ - README.md
135
+ - Rakefile
136
+ - lib/generators/simple_maintenance_mode/install/USAGE
137
+ - lib/generators/simple_maintenance_mode/install/install_generator.rb
138
+ - lib/generators/simple_maintenance_mode/install/templates/create_app_settings.rb
139
+ - lib/generators/simple_maintenance_mode/install/templates/maintenance.html
140
+ - lib/simple-maintenance-mode.rb
141
+ - lib/simple-maintenance-mode/filter.rb
142
+ - lib/simple-maintenance-mode/model/app_settings.rb
143
+ - lib/simple-maintenance-mode/version.rb
144
+ - simple-maintenance-mode.gemspec
145
+ - spec/filter_spec.rb
146
+ - spec/spec_helper.rb
147
+ homepage: https://github.com/musial-bright/simple-maintenance-mode
148
+ licenses:
149
+ - MIT
150
+ metadata: {}
151
+ post_install_message:
152
+ rdoc_options: []
153
+ require_paths:
154
+ - lib
155
+ required_ruby_version: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ required_rubygems_version: !ruby/object:Gem::Requirement
161
+ requirements:
162
+ - - ">="
163
+ - !ruby/object:Gem::Version
164
+ version: '0'
165
+ requirements: []
166
+ rubygems_version: 3.1.6
167
+ signing_key:
168
+ specification_version: 4
169
+ summary: Simple maintenance mode for production rails apps.
170
+ test_files:
171
+ - spec/filter_spec.rb
172
+ - spec/spec_helper.rb