safety_cone 0.1.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cab14d4acefb71708d80cb908f282070cad9e383
4
- data.tar.gz: 4a74b048ef23b6a107b3b6b51569f8e43d1d57b3
3
+ metadata.gz: 50edbf10878fc56a14539cd41c4b70e879735b77
4
+ data.tar.gz: a57be06d86eb4e58aff4887ff32070e1f8541545
5
5
  SHA512:
6
- metadata.gz: 88740dc9991f8a65131ff701fe7a9e756942cd1fb883e1c7a1085bc63e47cb5d2990627d8259e904a42aae8eb85cbeb0e097e1234d9745df9e573c28d1324ad0
7
- data.tar.gz: 7484bad29aa9c4e47f0bdd701ac44988cabff87e5ed2f8cd72d6c59842e0757cc868ee8e8f2909176437178a5b5a930c59ed85bc2e344f431f7568dac3d1265d
6
+ metadata.gz: d106b281c7e3b23fd901b065aa11e7872b54e37908e72619a43d4912706bb016ea7760539982014482cf2d9297661918264941bca45ca90ecc4314438c9fb76f
7
+ data.tar.gz: 7398e5766be675c6bd19b9622731ae61cebc00211e478aaa6d9ec39156836a5a118b6b191f1e9308abc237cf0946928ce2594337bac0962607d5b4aa45fbafcc
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2017 Edwin Rozario
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 CHANGED
@@ -1,9 +1,10 @@
1
- # SafetyCone
1
+ # SafetyConeMountable
2
+ Short description and motivation.
2
3
 
3
- Safety Cone is a Rails gem that lets an application to temporarily warn/block requests to pages in case of maintenance. Safety Cone allows the application raise warnings or custom messages which can be configured from the application initializer.
4
+ ## Usage
5
+ How to use my plugin.
4
6
 
5
7
  ## Installation
6
-
7
8
  Add this line to your application's Gemfile:
8
9
 
9
10
  ```ruby
@@ -11,74 +12,17 @@ gem 'safety_cone'
11
12
  ```
12
13
 
13
14
  And then execute:
14
-
15
- $ bundle
16
-
17
- Or install it yourself as:
18
-
19
- $ gem install safety_cone
20
-
21
- ## Usage
22
-
23
- Create a safety_con.rb file in config/initializer/
24
-
15
+ ```bash
16
+ $ bundle
25
17
  ```
26
- SafetyCone.configure do |config|
27
- # disables safety_cone. By default this value is true
28
- config.enable = false
29
-
30
- # This config will block all POST requests and display this message.
31
- config.add(
32
- method: :POST,
33
- message: 'We are unable to write any data to database now.',
34
- measure: :block
35
- )
36
-
37
- # This is a controller action specific warning. But with no measures to prevent this action
38
- config.add(
39
- controller: :users,
40
- action: :new,
41
- message: 'We are unable to register any user now. Please try after sometime.'
42
- measure: :notice
43
- )
44
18
 
45
- # This is a controller action specific block. This config will let the application
46
- # to raise an alert message and block the request from hitting the controller action.
47
- config.add(
48
- controller: 'users',
49
- action: 'create',
50
- message: 'We are unable to register any user now. Please try after sometime.',
51
- measure: :block
52
- )
53
-
54
- # This is a controller action specific block with a redirect configured.
55
- config.add(
56
- controller: 'users',
57
- action: 'create',
58
- message: 'We are unable to register any user now. Please try after sometime.',
59
- measure: :block,
60
- redirect: '/page/more_info'
61
- )
62
-
63
- # For :block flash message is an alert
64
- # For :notice flash message is a notice
65
- end
19
+ Or install it yourself as:
20
+ ```bash
21
+ $ gem install safety_cone
66
22
  ```
67
23
 
68
- SafetyCone uses flash messages. So its expected that flash messages are rendered in view for all pages.
69
-
70
- <Development>
71
-
72
- <After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.>
73
-
74
- <To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).>
75
-
76
- <Contributing>
77
-
78
- <Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/safety_cone. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.>
79
-
24
+ ## Contributing
25
+ Contribution directions go here.
80
26
 
81
27
  ## License
82
-
83
- The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT)
84
-
28
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
data/Rakefile CHANGED
@@ -1,6 +1,32 @@
1
- require "bundler/gem_tasks"
2
- require "rspec/core/rake_task"
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
3
6
 
4
- RSpec::Core::RakeTask.new(:spec)
7
+ require 'rdoc/task'
5
8
 
6
- task :default => :spec
9
+ RDoc::Task.new(:rdoc) do |rdoc|
10
+ rdoc.rdoc_dir = 'rdoc'
11
+ rdoc.title = 'SafetyConeMountable'
12
+ rdoc.options << '--line-numbers'
13
+ rdoc.rdoc_files.include('README.md')
14
+ rdoc.rdoc_files.include('lib/**/*.rb')
15
+ end
16
+
17
+
18
+
19
+ APP_RAKEFILE = File.expand_path('../spec/dummy/Rakefile', __FILE__)
20
+ load 'rails/tasks/engine.rake'
21
+
22
+ load 'rails/tasks/statistics.rake'
23
+
24
+ Bundler::GemHelper.install_tasks
25
+
26
+ require 'rspec/core'
27
+ require 'rspec/core/rake_task'
28
+
29
+ desc 'Run all specs in spec directory (excluding plugin specs)'
30
+ RSpec::Core::RakeTask.new(spec: 'app:db:test:prepare')
31
+
32
+ task default: :spec
@@ -0,0 +1,2 @@
1
+ //= link_directory ../javascripts/safety_cone.js
2
+ //= link_directory ../stylesheets/safety_cone.css
@@ -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,298 @@
1
+ /*
2
+ Place all the styles related to the matching controller here.
3
+ They will automatically be included in application.css.
4
+ */
5
+
6
+ body {
7
+ margin-top: 2rem;
8
+ background-color: #e0e0e0;
9
+ }
10
+
11
+ .card {
12
+ padding: 2rem;
13
+ display: block;
14
+ position: relative;
15
+ margin: 0.5rem 0 1rem 0;
16
+ background-color: #fff;
17
+ transition: box-shadow .25s;
18
+ border-radius: 2px;
19
+ max-height: 100%;
20
+ overflow: hidden;
21
+ }
22
+
23
+ .card, .btn {
24
+ box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -2px rgba(0, 0, 0, 0.2);
25
+ }
26
+ .card:hover{
27
+ box-shadow: 0 3px 3px 0 rgba(0, 0, 0, 0.14), 0 1px 7px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -1px rgba(0, 0, 0, 0.2);
28
+ }
29
+
30
+ .chip {
31
+ width: 5rem;
32
+ text-align: center;
33
+ }
34
+
35
+ .status-notice {
36
+ background-color: #FFB74D !important;
37
+ }
38
+
39
+ .status-block {
40
+ background-color: #FF8A65 !important;
41
+ }
42
+
43
+ html {
44
+ font-family: sans-serif;
45
+ }
46
+
47
+ hr {
48
+ box-sizing: content-box;
49
+ height: 0;
50
+ }
51
+
52
+ .container {
53
+ margin: 0 auto;
54
+ max-width: 1280px;
55
+ width: 90%;
56
+ }
57
+ .row .col {
58
+ float: left;
59
+ box-sizing: border-box;
60
+ padding: 0 0.75rem;
61
+ min-height: 1px;
62
+ }
63
+ h4 {
64
+ font-size: 2.28rem;
65
+ line-height: 110%;
66
+ margin: 1.14rem 0 0.912rem 0;
67
+ text-align: center;
68
+ }
69
+
70
+ h5 {
71
+ font-size: 1.64rem;
72
+ line-height: 110%;
73
+ margin: 0.82rem 0 0.656rem 0;
74
+ text-align: center;
75
+ }
76
+
77
+ h6 {
78
+ font-size: 1rem;
79
+ line-height: 110%;
80
+ margin: 0.5rem 0 0.4rem 0;
81
+ text-align: center;
82
+ }
83
+
84
+ .chip {
85
+ display: inline-block;
86
+ height: 32px;
87
+ font-size: 13px;
88
+ font-weight: 500;
89
+ color: rgba(0, 0, 0, 0.6);
90
+ line-height: 32px;
91
+ padding: 0 12px;
92
+ border-radius: 16px;
93
+ background-color: #e4e4e4;
94
+ margin-bottom: 5px;
95
+ margin-right: 5px;
96
+ }
97
+
98
+ .btn {
99
+ font-size: 1rem;
100
+ border: none;
101
+ border-radius: 2px;
102
+ display: inline-block;
103
+ height: 36px;
104
+ line-height: 36px;
105
+ padding: 0 2rem;
106
+ text-transform: uppercase;
107
+ vertical-align: middle;
108
+ -webkit-tap-highlight-color: transparent;
109
+ text-decoration: none;
110
+ color: #fff;
111
+ background-color: #26a69a;
112
+ text-align: center;
113
+ letter-spacing: .5px;
114
+ transition: .2s ease-out;
115
+ cursor: pointer;
116
+ box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -2px rgba(0, 0, 0, 0.2);
117
+ }
118
+
119
+ .btn:hover {
120
+ background-color: #2bbbad;
121
+ box-shadow: 0 3px 3px 0 rgba(0, 0, 0, 0.14), 0 1px 7px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -1px rgba(0, 0, 0, 0.2);
122
+ }
123
+
124
+ .row .col.s3 {
125
+ width: 25%;
126
+ margin-left: auto;
127
+ left: auto;
128
+ right: auto;
129
+ }
130
+
131
+ .row .col.s6 {
132
+ width: 50%;
133
+ margin-left: auto;
134
+ left: auto;
135
+ right: auto;
136
+ }
137
+
138
+ .row .col.s12 {
139
+ width: 100%;
140
+ margin-left: auto;
141
+ left: auto;
142
+ right: auto;
143
+ }
144
+
145
+ .row .col.offset-s3 {
146
+ margin-left: 25%;
147
+ }
148
+ .row .col.offset-s4 {
149
+ margin-left: 33.33333333%;
150
+ }
151
+ .row .col.offset-s4 {
152
+ left: 33.3333333333%;
153
+ }
154
+
155
+
156
+ .grey {
157
+ background: #DCDCDC;
158
+ }
159
+ .grey:hover {
160
+ background: #BABABA;
161
+ }
162
+
163
+ input[type=text] {
164
+ background-color: transparent;
165
+ border: none;
166
+ border-bottom: 1px solid #9e9e9e;
167
+ border-radius: 0;
168
+ outline: none;
169
+ height: 3rem;
170
+ width: 100%;
171
+ font-size: 1rem;
172
+ margin: 0 0 20px 0;
173
+ padding: 0;
174
+ box-shadow: none;
175
+ box-sizing: content-box;
176
+ transition: all 0.3s;
177
+ color: white;
178
+ }
179
+ .input-field .input-label{
180
+ color: #9e9e9e;
181
+ position: absolute;
182
+ top: 0.8rem;
183
+ left: 0;
184
+ font-size: 1rem;
185
+ cursor: text;
186
+ transition: .2s ease-out;
187
+ font-weight:normal;
188
+ position:absolute;
189
+ pointer-events:none;
190
+ margin-left: 0.75rem;
191
+ }
192
+
193
+ input[type=text]:focus {
194
+ color: #888888!important;
195
+ border-bottom: 2px solid #26a69a!important;
196
+ transition: .2s ease-out;
197
+ }
198
+ input[type=text]:focus + label {
199
+ margin-top: -20px!important;
200
+ color: #26a69a!important;
201
+ display: block;
202
+ position: absolute;
203
+ top: 0.8rem;
204
+ left: 0;
205
+ margin-left: 0.7rem;
206
+ font-size: 1rem;
207
+ cursor: text;
208
+ transition: .2s ease-out;
209
+ }
210
+
211
+ .input-field {
212
+ position: relative;
213
+ margin-top: 1rem;
214
+ }
215
+
216
+ input[type="radio"]:not(:checked),
217
+ [type="radio"]:checked {
218
+ position: absolute;
219
+ left: -9999px;
220
+ opacity: 0;
221
+ }
222
+
223
+ [type="radio"]:not(:checked) + label,
224
+ [type="radio"]:checked + label {
225
+ position: relative;
226
+ padding-left: 35px;
227
+ cursor: pointer;
228
+ display: inline-block;
229
+ height: 25px;
230
+ line-height: 30px;
231
+ font-size: 1rem;
232
+ transition: .28s ease;
233
+ /* webkit (konqueror) browsers */
234
+ -webkit-user-select: none;
235
+ -moz-user-select: none;
236
+ -ms-user-select: none;
237
+ user-select: none;
238
+ }
239
+
240
+ [type="radio"] + label:before,
241
+ [type="radio"] + label:after {
242
+ content: '';
243
+ position: absolute;
244
+ left: 0;
245
+ top: 0;
246
+ margin: 4px;
247
+ width: 16px;
248
+ height: 16px;
249
+ z-index: 0;
250
+ transition: .28s ease;
251
+ }
252
+
253
+ /* Unchecked styles */
254
+ [type="radio"]:not(:checked) + label:before,
255
+ [type="radio"]:not(:checked) + label:after,
256
+ [type="radio"]:checked + label:before,
257
+ [type="radio"]:checked + label:after,
258
+ [type="radio"].with-gap:checked + label:before,
259
+ [type="radio"].with-gap:checked + label:after {
260
+ border-radius: 50%;
261
+ }
262
+
263
+ [type="radio"]:not(:checked) + label:before,
264
+ [type="radio"]:not(:checked) + label:after {
265
+ border: 2px solid #5a5a5a;
266
+ }
267
+
268
+ [type="radio"]:not(:checked) + label:after {
269
+ -webkit-transform: scale(0);
270
+ transform: scale(0);
271
+ }
272
+
273
+ /* Checked styles */
274
+ [type="radio"]:checked + label:before {
275
+ border: 2px solid transparent;
276
+ }
277
+
278
+ [type="radio"]:checked + label:after,
279
+ [type="radio"].with-gap:checked + label:before,
280
+ [type="radio"].with-gap:checked + label:after {
281
+ border: 2px solid #26a69a;
282
+ }
283
+
284
+ [type="radio"]:checked + label:after,
285
+ [type="radio"].with-gap:checked + label:after {
286
+ background-color: #26a69a;
287
+ }
288
+
289
+ [type="radio"]:checked + label:after {
290
+ -webkit-transform: scale(1.02);
291
+ transform: scale(1.02);
292
+ }
293
+
294
+ /* Focused styles */
295
+ [type="radio"].tabbed:focus + label:before {
296
+ box-shadow: 0 0 0 10px rgba(0, 0, 0, 0.1);
297
+ color: red!Important;
298
+ }
@@ -0,0 +1,5 @@
1
+ module SafetyCone
2
+ class ApplicationController < ActionController::Base
3
+ protect_from_forgery with: :exception
4
+ end
5
+ end
@@ -0,0 +1,28 @@
1
+ require_dependency "safety_cone/application_controller"
2
+
3
+ module SafetyCone
4
+ class ConesController < ApplicationController
5
+ unless Rails.env.test?
6
+ http_basic_authenticate_with name: SafetyCone.auth[:username],
7
+ password: SafetyCone.auth[:password] if (SafetyCone.auth[:username] && SafetyCone.auth[:password])
8
+ end
9
+
10
+ def index
11
+ @cones = SafetyCone.cones
12
+ end
13
+
14
+ def edit
15
+ cone = SafetyCone.cones[params[:id].to_sym]
16
+ @cone = Cone.new(params[:id], cone)
17
+ @cone.fetch
18
+ end
19
+
20
+ def update
21
+ cone = SafetyCone.cones[params[:id].to_sym]
22
+ mereged_params = cone.merge(params[:cone].symbolize_keys)
23
+ Cone.new(params[:id], mereged_params).save
24
+
25
+ redirect_to cones_path
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,4 @@
1
+ module SafetyCone
2
+ module ApplicationHelper
3
+ end
4
+ end
@@ -0,0 +1,9 @@
1
+ module SafetyCone
2
+ module ConesHelper
3
+ def status(key)
4
+ cone = Cone.new(key, {})
5
+ cone.fetch
6
+ cone.measure
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,5 @@
1
+ module SafetyCone
2
+ class ApplicationRecord < ActiveRecord::Base
3
+ self.abstract_class = true
4
+ end
5
+ end
@@ -0,0 +1,37 @@
1
+ module SafetyCone
2
+ class Cone
3
+ attr_accessor :name, :controller, :action,
4
+ :method, :message, :measure,
5
+ :key, :redis
6
+
7
+ def initialize(key, params)
8
+ @key = key
9
+ @name = params[:name]
10
+ @controller = params[:controller]
11
+ @method = params[:action]
12
+ @method = params[:method]
13
+ @message = params[:message]
14
+ @measure = params[:measure] || 'disabled'
15
+ @redis = SafetyCone.redis
16
+ end
17
+
18
+ def save
19
+ data = { message: @message, measure: @measure }.to_json
20
+ @redis.set(redis_key, data)
21
+ end
22
+
23
+ def fetch
24
+ stored_data = @redis.get(redis_key)
25
+
26
+ if stored_data
27
+ data = JSON.parse(stored_data)
28
+ @message = data['message']
29
+ @measure = data['measure']
30
+ end
31
+ end
32
+
33
+ def redis_key
34
+ "safety::cone::#{@key}"
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,20 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Safety Cone</title>
5
+ <%= stylesheet_link_tag "safety_cone/application", media: 'all' %>
6
+ </head>
7
+ <body>
8
+ <div class="container">
9
+ <div class="row">
10
+ <div class="col s1 offset-s4">
11
+ <%= image_tag('safety_cone/logo.png', size: "80x80") %>
12
+ </div>
13
+ <div class="col s4 center">
14
+ <h4>Safety Cone</h4>
15
+ </div>
16
+ </div>
17
+ <%= yield %>
18
+ </div>
19
+ </body>
20
+ </html>
@@ -0,0 +1,33 @@
1
+ <div class="row">
2
+ <div class="col s6 offset-s3">
3
+ <h6 class="center"><%= @cone.name %></h6>
4
+
5
+ <div class="card">
6
+ <%= form_for :cone, url: cone_path(@cone.key), method: :PUT do |form| %>
7
+ <div class="row ">
8
+ <div class="input-field group col s12">
9
+ <%= form.text_field :message %>
10
+ <%= form.label :message, 'Message', class: 'input-label'%>
11
+ </div>
12
+
13
+ <div class="input-field col s12">
14
+ <%= form.radio_button :measure, 'notice' %>
15
+ <%= form.label :measure_notice, 'Notice' %>
16
+
17
+ <%= form.radio_button :measure, 'block' %>
18
+ <%= form.label :measure_block, 'Block' %>
19
+
20
+ <%= form.radio_button :measure, 'disabled' %>
21
+ <%= form.label :measure_disabled, 'Disable this Cone' %>
22
+ </div>
23
+
24
+ <div class="input-field col s12">
25
+ <%= form.submit 'save', class: 'waves-effect waves-light btn' %>
26
+ <%= link_to 'cancel', cones_path, class: 'waves-effect waves-light btn grey lighten-1' %>
27
+ </div>
28
+ </div>
29
+ <% end %>
30
+ </div>
31
+
32
+ </div>
33
+ </div>
@@ -0,0 +1,24 @@
1
+ <div class="row">
2
+ <div class="col s6 offset-s3">
3
+ <hr />
4
+ <% @cones.each do |cone, options| %>
5
+
6
+ <div class="row">
7
+ <div class="col s6">
8
+ <%= options[:name] %>
9
+ </div>
10
+
11
+ <div class="col s3">
12
+ <div class="chip status-<%= status(cone) %>">
13
+ <%= status(cone) %>
14
+ </div>
15
+ </div>
16
+
17
+ <div class="col s3">
18
+ <%= link_to 'edit', edit_cone_path(cone), class: 'waves-effect waves-light btn' %>
19
+ </div>
20
+ </div>
21
+ <% end %>
22
+
23
+ </div>
24
+ </div>
File without changes
data/config/routes.rb ADDED
@@ -0,0 +1,4 @@
1
+ SafetyCone::Engine.routes.draw do
2
+ root to: 'cones#index'
3
+ resources :cones, only: [:index, :edit, :update]
4
+ end
data/lib/safety_cone.rb CHANGED
@@ -1,8 +1,7 @@
1
- require 'safety_cone/version'
1
+ require 'safety_cone/engine'
2
2
  require 'safety_cone/configuration'
3
3
  require 'safety_cone/filter'
4
4
 
5
- # SafetyCone
6
5
  module SafetyCone
7
6
  extend Configuration
8
7
  end
@@ -1,23 +1,19 @@
1
1
  module SafetyCone
2
2
  # Module for configuring safety measures
3
3
  module Configuration
4
- VALID_MEASURES = [
5
- :block, :warn,
6
- :notice, :alert
7
- ].freeze
8
-
9
4
  VALID_OPTION_KEYS = [
10
5
  :method, :controller,
11
- :action, :message,
12
- :measure, :redirect
6
+ :action, :name
13
7
  ].freeze
14
8
 
15
- attr_accessor :enabled, :cones, :options
9
+ attr_accessor :cones, :options, :redis, :auth
16
10
 
17
- # Method add a safety measure
11
+ # Method add a route or method to be managed by safety cone
18
12
  def add(options = {})
19
13
  self.options = options
20
- valid?
14
+
15
+ raise(ArgumentError, 'Mandatory param :name missing') unless options[:name]
16
+
21
17
  cones[make_key] = options
22
18
  end
23
19
 
@@ -33,29 +29,11 @@ module SafetyCone
33
29
  end
34
30
  end
35
31
 
36
- # Checks the validity of configuration params
37
- def valid?
38
- invalid_options = (options.keys - VALID_OPTION_KEYS)
39
- unless invalid_options.empty?
40
- raise ArgumentError, "Options #{invalid_options} are not valid."
41
- end
42
-
43
- unless options.key? :message
44
- raise ArgumentError, 'Option :message is mandatory.'
45
- end
46
-
47
- if options[:measure]
48
- unless VALID_MEASURES.include? options[:measure]
49
- raise(ArgumentError,
50
- "Option #{options[:measure]} is not a valid :measure")
51
- end
52
- end
53
- end
54
-
55
32
  # Configuration method for Rails initializer
56
33
  def configure
57
- self.enabled = true
58
34
  self.cones = {}
35
+ self.auth = { username: nil, password: nil}
36
+
59
37
  yield self
60
38
  end
61
39
  end
@@ -0,0 +1,16 @@
1
+ module SafetyCone
2
+ class Engine < ::Rails::Engine
3
+ isolate_namespace SafetyCone
4
+
5
+ initializer "refinery.assets.precompile" do |app|
6
+ app.config.assets.precompile += %w(safety_cone/logo.png)
7
+ end
8
+
9
+ config.generators do |g|
10
+ g.test_framework :rspec, :fixture => false
11
+ g.fixture_replacement :factory_girl, :dir => 'spec/factories'
12
+ g.assets false
13
+ g.helper false
14
+ end
15
+ end
16
+ end
@@ -11,29 +11,39 @@ module SafetyCone
11
11
  # Filter method that does the SafetyCone action
12
12
  # based on the configuration.
13
13
  def safety_cone_filter
14
- return unless SafetyCone.enabled
15
-
16
14
  if cone = fetch_cone
17
15
  flash.clear
18
- flash[notice_type(cone[:measure])] = cone[:message]
19
- redirect_to safety_redirect(cone[:redirect]) if cone[:measure] == :block
16
+ flash[notice_type(cone.measure)] = cone.message
17
+ redirect_to safety_redirect if cone.measure == 'block'
20
18
  end
21
19
  end
22
20
 
23
21
  # Fetches a configuration based on current request
24
22
  def fetch_cone
25
23
  cones = SafetyCone.cones
26
- cones[request_method] || cones[request_action]
24
+
25
+ if cone = cones[request_action]
26
+ key = request_action
27
+ elsif cone = cones[request_method]
28
+ key = request_method
29
+ else
30
+ return false
31
+ end
32
+
33
+ cone = Cone.new(key, cone)
34
+ cone.fetch
35
+
36
+ %w(notice block).include?(cone.measure) ? cone : false
27
37
  end
28
38
 
29
39
  # Method to redirect a request
30
- def safety_redirect(path)
31
- path ? path : request.env['HTTP_REFERER']
40
+ def safety_redirect
41
+ request.env['HTTP_REFERER']
32
42
  end
33
43
 
34
44
  # Returns type of notice
35
45
  def notice_type(measure)
36
- measure == :notice ? :notice : :alert
46
+ measure == 'notice' ? 'notice' : 'alert'
37
47
  end
38
48
 
39
49
  # Returns the current request action as a symbol
@@ -1,3 +1,3 @@
1
1
  module SafetyCone
2
- VERSION = '0.1.0'
2
+ VERSION = '1.0.0'
3
3
  end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :safety_cone do
3
+ # # Task goes here
4
+ # end
metadata CHANGED
@@ -1,81 +1,209 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: safety_cone
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Edwin Rozario
8
+ - Yar Htut
8
9
  autorequire:
9
- bindir: exe
10
+ bindir: bin
10
11
  cert_chain: []
11
- date: 2016-09-23 00:00:00.000000000 Z
12
+ date: 2017-05-19 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
- name: bundler
15
+ name: rails
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "<="
19
+ - !ruby/object:Gem::Version
20
+ version: 5.0.2
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "<="
26
+ - !ruby/object:Gem::Version
27
+ version: 5.0.2
28
+ - !ruby/object:Gem::Dependency
29
+ name: redis
15
30
  requirement: !ruby/object:Gem::Requirement
16
31
  requirements:
17
32
  - - "~>"
18
33
  - !ruby/object:Gem::Version
19
- version: '1.12'
20
- type: :development
34
+ version: '3.3'
35
+ - - ">="
36
+ - !ruby/object:Gem::Version
37
+ version: 3.3.3
38
+ type: :runtime
21
39
  prerelease: false
22
40
  version_requirements: !ruby/object:Gem::Requirement
23
41
  requirements:
24
42
  - - "~>"
25
43
  - !ruby/object:Gem::Version
26
- version: '1.12'
44
+ version: '3.3'
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: 3.3.3
27
48
  - !ruby/object:Gem::Dependency
28
- name: rake
49
+ name: sqlite3
29
50
  requirement: !ruby/object:Gem::Requirement
30
51
  requirements:
31
- - - "~>"
52
+ - - '='
32
53
  - !ruby/object:Gem::Version
33
- version: '10.0'
54
+ version: 1.3.13
34
55
  type: :development
35
56
  prerelease: false
36
57
  version_requirements: !ruby/object:Gem::Requirement
37
58
  requirements:
38
- - - "~>"
59
+ - - '='
60
+ - !ruby/object:Gem::Version
61
+ version: 1.3.13
62
+ - !ruby/object:Gem::Dependency
63
+ name: capybara
64
+ requirement: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '='
67
+ - !ruby/object:Gem::Version
68
+ version: 2.14.0
69
+ type: :development
70
+ prerelease: false
71
+ version_requirements: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '='
74
+ - !ruby/object:Gem::Version
75
+ version: 2.14.0
76
+ - !ruby/object:Gem::Dependency
77
+ name: factory_girl_rails
78
+ requirement: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '='
81
+ - !ruby/object:Gem::Version
82
+ version: 4.8.0
83
+ type: :development
84
+ prerelease: false
85
+ version_requirements: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '='
88
+ - !ruby/object:Gem::Version
89
+ version: 4.8.0
90
+ - !ruby/object:Gem::Dependency
91
+ name: database_cleaner
92
+ requirement: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '='
95
+ - !ruby/object:Gem::Version
96
+ version: 1.6.1
97
+ type: :development
98
+ prerelease: false
99
+ version_requirements: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '='
102
+ - !ruby/object:Gem::Version
103
+ version: 1.6.1
104
+ - !ruby/object:Gem::Dependency
105
+ name: pry
106
+ requirement: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '='
109
+ - !ruby/object:Gem::Version
110
+ version: 0.10.4
111
+ type: :development
112
+ prerelease: false
113
+ version_requirements: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - '='
116
+ - !ruby/object:Gem::Version
117
+ version: 0.10.4
118
+ - !ruby/object:Gem::Dependency
119
+ name: rspec-rails
120
+ requirement: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - '='
123
+ - !ruby/object:Gem::Version
124
+ version: 3.5.2
125
+ type: :development
126
+ prerelease: false
127
+ version_requirements: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - '='
130
+ - !ruby/object:Gem::Version
131
+ version: 3.5.2
132
+ - !ruby/object:Gem::Dependency
133
+ name: rails-controller-testing
134
+ requirement: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - '='
137
+ - !ruby/object:Gem::Version
138
+ version: 1.0.2
139
+ type: :development
140
+ prerelease: false
141
+ version_requirements: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - '='
39
144
  - !ruby/object:Gem::Version
40
- version: '10.0'
145
+ version: 1.0.2
41
146
  - !ruby/object:Gem::Dependency
42
- name: rspec
147
+ name: mock_redis
43
148
  requirement: !ruby/object:Gem::Requirement
44
149
  requirements:
45
150
  - - "~>"
46
151
  - !ruby/object:Gem::Version
47
- version: '3.0'
152
+ version: 0.17.3
48
153
  type: :development
49
154
  prerelease: false
50
155
  version_requirements: !ruby/object:Gem::Requirement
51
156
  requirements:
52
157
  - - "~>"
53
158
  - !ruby/object:Gem::Version
54
- version: '3.0'
159
+ version: 0.17.3
160
+ - !ruby/object:Gem::Dependency
161
+ name: launchy
162
+ requirement: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - '='
165
+ - !ruby/object:Gem::Version
166
+ version: 2.4.3
167
+ type: :development
168
+ prerelease: false
169
+ version_requirements: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - '='
172
+ - !ruby/object:Gem::Version
173
+ version: 2.4.3
55
174
  description: |-
56
175
  At times we would want to block certain requests.
57
- SafetyCone allows this to be configued.
176
+ SafetyCone allows this to be controller from an interface.
58
177
  email:
59
178
  - edwin@boost.co.nz
60
179
  executables: []
61
180
  extensions: []
62
181
  extra_rdoc_files: []
63
182
  files:
64
- - ".gitignore"
65
- - ".rspec"
66
- - ".travis.yml"
67
- - CODE_OF_CONDUCT.md
68
- - Gemfile
69
- - LICENSE.txt
183
+ - MIT-LICENSE
70
184
  - README.md
71
185
  - Rakefile
72
- - bin/console
73
- - bin/setup
186
+ - app/assets/config/safety_cone_manifest.js
187
+ - app/assets/images/safety_cone/logo.png
188
+ - app/assets/stylesheets/safety_cone/application.css
189
+ - app/assets/stylesheets/safety_cone/material.css
190
+ - app/controllers/safety_cone/application_controller.rb
191
+ - app/controllers/safety_cone/cones_controller.rb
192
+ - app/helpers/safety_cone/application_helper.rb
193
+ - app/helpers/safety_cone/cones_helper.rb
194
+ - app/models/safety_cone/application_record.rb
195
+ - app/models/safety_cone/cone.rb
196
+ - app/views/layouts/safety_cone/application.html.erb
197
+ - app/views/safety_cone/cones/edit.html.erb
198
+ - app/views/safety_cone/cones/index.html.erb
199
+ - config/environment.rb
200
+ - config/routes.rb
74
201
  - lib/safety_cone.rb
75
202
  - lib/safety_cone/configuration.rb
203
+ - lib/safety_cone/engine.rb
76
204
  - lib/safety_cone/filter.rb
77
205
  - lib/safety_cone/version.rb
78
- - safety_cone.gemspec
206
+ - lib/tasks/safety_cone_tasks.rake
79
207
  homepage: https://github.com/boost/safety_cone
80
208
  licenses:
81
209
  - MIT
@@ -99,5 +227,5 @@ rubyforge_project:
99
227
  rubygems_version: 2.5.1
100
228
  signing_key:
101
229
  specification_version: 4
102
- summary: Blocks or warns requests as per configuration
230
+ summary: Blocks or warns requests as cofigured by the admin
103
231
  test_files: []
data/.gitignore DELETED
@@ -1,9 +0,0 @@
1
- /.bundle/
2
- /.yardoc
3
- /Gemfile.lock
4
- /_yardoc/
5
- /coverage/
6
- /doc/
7
- /pkg/
8
- /spec/reports/
9
- /tmp/
data/.rspec DELETED
@@ -1,2 +0,0 @@
1
- --format documentation
2
- --color
data/.travis.yml DELETED
@@ -1,5 +0,0 @@
1
- sudo: false
2
- language: ruby
3
- rvm:
4
- - 2.3.0
5
- before_install: gem install bundler -v 1.12.5
data/CODE_OF_CONDUCT.md DELETED
@@ -1,49 +0,0 @@
1
- # Contributor Code of Conduct
2
-
3
- As contributors and maintainers of this project, and in the interest of
4
- fostering an open and welcoming community, we pledge to respect all people who
5
- contribute through reporting issues, posting feature requests, updating
6
- documentation, submitting pull requests or patches, and other activities.
7
-
8
- We are committed to making participation in this project a harassment-free
9
- experience for everyone, regardless of level of experience, gender, gender
10
- identity and expression, sexual orientation, disability, personal appearance,
11
- body size, race, ethnicity, age, religion, or nationality.
12
-
13
- Examples of unacceptable behavior by participants include:
14
-
15
- * The use of sexualized language or imagery
16
- * Personal attacks
17
- * Trolling or insulting/derogatory comments
18
- * Public or private harassment
19
- * Publishing other's private information, such as physical or electronic
20
- addresses, without explicit permission
21
- * Other unethical or unprofessional conduct
22
-
23
- Project maintainers have the right and responsibility to remove, edit, or
24
- reject comments, commits, code, wiki edits, issues, and other contributions
25
- that are not aligned to this Code of Conduct, or to ban temporarily or
26
- permanently any contributor for other behaviors that they deem inappropriate,
27
- threatening, offensive, or harmful.
28
-
29
- By adopting this Code of Conduct, project maintainers commit themselves to
30
- fairly and consistently applying these principles to every aspect of managing
31
- this project. Project maintainers who do not follow or enforce the Code of
32
- Conduct may be permanently removed from the project team.
33
-
34
- This code of conduct applies both within project spaces and in public spaces
35
- when an individual is representing the project or its community.
36
-
37
- Instances of abusive, harassing, or otherwise unacceptable behavior may be
38
- reported by contacting a project maintainer at edwin@boost.co.nz. All
39
- complaints will be reviewed and investigated and will result in a response that
40
- is deemed necessary and appropriate to the circumstances. Maintainers are
41
- obligated to maintain confidentiality with regard to the reporter of an
42
- incident.
43
-
44
- This Code of Conduct is adapted from the [Contributor Covenant][homepage],
45
- version 1.3.0, available at
46
- [http://contributor-covenant.org/version/1/3/0/][version]
47
-
48
- [homepage]: http://contributor-covenant.org
49
- [version]: http://contributor-covenant.org/version/1/3/0/
data/Gemfile DELETED
@@ -1,4 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in safety_cone.gemspec
4
- gemspec
data/LICENSE.txt DELETED
@@ -1,21 +0,0 @@
1
- The MIT License (MIT)
2
-
3
- Copyright (c) 2016 Edwin Rozario
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in
13
- all copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
- THE SOFTWARE.
data/bin/console DELETED
@@ -1,14 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require "bundler/setup"
4
- require "safety_cone"
5
-
6
- # You can add fixtures and/or initialization code here to make experimenting
7
- # with your gem easier. You can also use a different console, if you like.
8
-
9
- # (If you use this, don't forget to add pry to your Gemfile!)
10
- # require "pry"
11
- # Pry.start
12
-
13
- require "irb"
14
- IRB.start
data/bin/setup DELETED
@@ -1,8 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
- IFS=$'\n\t'
4
- set -vx
5
-
6
- bundle install
7
-
8
- # Do any other automated setup that you need to do here
data/safety_cone.gemspec DELETED
@@ -1,26 +0,0 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
3
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'safety_cone/version'
5
-
6
- Gem::Specification.new do |spec|
7
- spec.name = 'safety_cone'
8
- spec.version = SafetyCone::VERSION
9
- spec.authors = ['Edwin Rozario']
10
- spec.email = ['edwin@boost.co.nz']
11
-
12
- spec.summary = 'Blocks or warns requests as per configuration'
13
- spec.description = 'At times we would want to block certain requests.
14
- SafetyCone allows this to be configued.'
15
- spec.homepage = 'https://github.com/boost/safety_cone'
16
- spec.license = 'MIT'
17
-
18
- spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
19
- spec.bindir = 'exe'
20
- spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
21
- spec.require_paths = ['lib']
22
-
23
- spec.add_development_dependency 'bundler', '~> 1.12'
24
- spec.add_development_dependency 'rake', '~> 10.0'
25
- spec.add_development_dependency 'rspec', '~> 3.0'
26
- end