simple-maintenance-mode 0.0.2

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.
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