safety_cone 1.1.0 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +24 -4
- data/Rakefile +0 -2
- data/app/assets/stylesheets/safety_cone/material.css +99 -100
- data/app/controllers/safety_cone/application_controller.rb +5 -0
- data/app/controllers/safety_cone/cones_controller.rb +2 -23
- data/app/controllers/safety_cone/features_controller.rb +15 -0
- data/app/controllers/safety_cone/paths_controller.rb +19 -0
- data/app/helpers/safety_cone/cones_helper.rb +7 -1
- data/app/models/safety_cone/{cone.rb → path.rb} +1 -1
- data/app/views/layouts/safety_cone/application.html.erb +6 -9
- data/app/views/safety_cone/cones/index.html.erb +33 -22
- data/app/views/safety_cone/paths/edit.html.erb +30 -0
- data/config/routes.rb +5 -2
- data/lib/safety_cone.rb +1 -1
- data/lib/safety_cone/configuration.rb +9 -5
- data/lib/safety_cone/engine.rb +3 -3
- data/lib/safety_cone/filter.rb +30 -30
- data/lib/safety_cone/version.rb +1 -1
- data/lib/safety_cone/view_helpers.rb +29 -0
- metadata +12 -9
- data/app/views/safety_cone/cones/edit.html.erb +0 -33
- data/config/environment.rb +0 -0
- data/lib/safety_cone/view_helper.rb +0 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2101ef8045b6a171f2bf74adf69ed729b6b7c3d4
|
4
|
+
data.tar.gz: 2c4021a527d67509b7a5d43ac7ceac34183ec3de
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7894f42411f05db74d1089afa3fd57197fb82f68bbb007396828218f16e845aeec58aa6206f137d25eab754bc307bf55266ba97d16f6f689344563b30c42382c
|
7
|
+
data.tar.gz: ca2c5ee05fde598914b861afa0913ccd9e6a92b76197863d8bbffaf2da4e89168cbefccfef0a1ea3425735ffafe620eb59a3a7296017bd5d43be62f56a5558e7
|
data/README.md
CHANGED
@@ -41,13 +41,22 @@ SafetyCone.configure do |config|
|
|
41
41
|
method: 'POST',
|
42
42
|
name: 'All POST requests'
|
43
43
|
)
|
44
|
+
|
45
|
+
# Feature flipper
|
46
|
+
config.add(
|
47
|
+
feature: :record_search,
|
48
|
+
name: 'Search'
|
49
|
+
)
|
50
|
+
|
51
|
+
# This config will provide a view helper record_search?
|
52
|
+
# Which can be used in the view to display a div or not
|
44
53
|
end
|
45
54
|
```
|
46
55
|
|
47
56
|
In routes add
|
48
57
|
|
49
58
|
```
|
50
|
-
mount SafetyCone::Engine, :
|
59
|
+
mount SafetyCone::Engine, :as => '/safety_cone'
|
51
60
|
```
|
52
61
|
|
53
62
|
In ApplicationController
|
@@ -71,7 +80,14 @@ In View
|
|
71
80
|
|
72
81
|
<% if safetycone_alert %>
|
73
82
|
<div class="alert"><%= safetycone_alert %></div>
|
74
|
-
<% end %>
|
83
|
+
<% end %>
|
84
|
+
|
85
|
+
<!-- Feature Flipper -->
|
86
|
+
<% if record_search? %>
|
87
|
+
<div>Search Records</div>
|
88
|
+
<% else %>
|
89
|
+
<div>Search Records</div>
|
90
|
+
<% end %>
|
75
91
|
</div>
|
76
92
|
```
|
77
93
|
|
@@ -93,7 +109,7 @@ SafetyCone.configure do |config|
|
|
93
109
|
type: :block
|
94
110
|
)
|
95
111
|
|
96
|
-
# This is a controller action specific warning. But with no
|
112
|
+
# This is a controller action specific warning. But with no types to prevent this action
|
97
113
|
config.add(
|
98
114
|
controller: :users,
|
99
115
|
action: :new,
|
@@ -126,7 +142,11 @@ end
|
|
126
142
|
|
127
143
|
|
128
144
|
## Contributing
|
129
|
-
|
145
|
+
1. Fork it
|
146
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
147
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
148
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
149
|
+
5. Create new Pull Request
|
130
150
|
|
131
151
|
## License
|
132
152
|
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
data/Rakefile
CHANGED
@@ -3,11 +3,58 @@
|
|
3
3
|
They will automatically be included in application.css.
|
4
4
|
*/
|
5
5
|
|
6
|
+
html {
|
7
|
+
font-family: sans-serif;
|
8
|
+
}
|
9
|
+
|
6
10
|
body {
|
7
|
-
margin-top: 2rem;
|
8
11
|
background-color: #e0e0e0;
|
9
12
|
}
|
10
13
|
|
14
|
+
.wrapper {
|
15
|
+
display: grid;
|
16
|
+
justify-content: center;
|
17
|
+
}
|
18
|
+
|
19
|
+
.header {
|
20
|
+
display: grid;
|
21
|
+
width: 60rem;
|
22
|
+
grid-template-columns: 1fr 10fr 1fr;
|
23
|
+
border-bottom: 1px solid #aaaaaa;
|
24
|
+
margin-bottom: 2rem;
|
25
|
+
}
|
26
|
+
|
27
|
+
.header .logo {
|
28
|
+
margin-top: 1rem;
|
29
|
+
justify-self: center;
|
30
|
+
}
|
31
|
+
|
32
|
+
.grid {
|
33
|
+
display: grid;
|
34
|
+
width: 60rem;
|
35
|
+
grid-template-columns: 2fr 1fr 1fr;
|
36
|
+
grid-gap: 1rem;
|
37
|
+
margin-bottom: 2rem;
|
38
|
+
}
|
39
|
+
|
40
|
+
|
41
|
+
.bottom-grid {
|
42
|
+
display: grid;
|
43
|
+
width: 60rem;
|
44
|
+
grid-template-columns: 2fr 1fr 1fr;
|
45
|
+
grid-gap: 1rem;
|
46
|
+
margin-bottom: 2rem;
|
47
|
+
}
|
48
|
+
|
49
|
+
.col {
|
50
|
+
grid-column: 1/4;
|
51
|
+
grid-row: 1/4;
|
52
|
+
}
|
53
|
+
|
54
|
+
.form {
|
55
|
+
display: grid;
|
56
|
+
}
|
57
|
+
|
11
58
|
.card {
|
12
59
|
padding: 2rem;
|
13
60
|
display: block;
|
@@ -23,7 +70,7 @@ body {
|
|
23
70
|
.card, .btn {
|
24
71
|
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
72
|
}
|
26
|
-
.card:hover{
|
73
|
+
.card:hover {
|
27
74
|
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
75
|
}
|
29
76
|
|
@@ -40,45 +87,16 @@ body {
|
|
40
87
|
background-color: #FF8A65 !important;
|
41
88
|
}
|
42
89
|
|
43
|
-
|
44
|
-
font-
|
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;
|
90
|
+
h3 {
|
91
|
+
font-size: 1.86rem;
|
92
|
+
margin-left: 2rem;
|
75
93
|
}
|
76
94
|
|
77
95
|
h6 {
|
78
96
|
font-size: 1rem;
|
79
97
|
line-height: 110%;
|
80
98
|
margin: 0.5rem 0 0.4rem 0;
|
81
|
-
|
99
|
+
text-align: center;
|
82
100
|
}
|
83
101
|
|
84
102
|
.chip {
|
@@ -116,46 +134,22 @@ h6 {
|
|
116
134
|
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
135
|
}
|
118
136
|
|
119
|
-
.btn
|
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 {
|
137
|
+
.btn.expand {
|
139
138
|
width: 100%;
|
140
|
-
margin-left: auto;
|
141
|
-
left: auto;
|
142
|
-
right: auto;
|
143
139
|
}
|
144
140
|
|
145
|
-
.
|
146
|
-
|
147
|
-
}
|
148
|
-
.row .col.offset-s4 {
|
149
|
-
margin-left: 33.33333333%;
|
141
|
+
.btn.back {
|
142
|
+
align-self: center;
|
150
143
|
}
|
151
|
-
.row .col.offset-s4 {
|
152
|
-
left: 33.3333333333%;
|
153
|
-
}
|
154
|
-
|
155
144
|
|
156
145
|
.grey {
|
157
146
|
background: #DCDCDC;
|
158
147
|
}
|
148
|
+
|
149
|
+
.dark-grey {
|
150
|
+
background: #AAAAAA;
|
151
|
+
}
|
152
|
+
|
159
153
|
.grey:hover {
|
160
154
|
background: #BABABA;
|
161
155
|
}
|
@@ -176,6 +170,7 @@ input[type=text] {
|
|
176
170
|
transition: all 0.3s;
|
177
171
|
color: white;
|
178
172
|
}
|
173
|
+
|
179
174
|
.input-field .input-label{
|
180
175
|
color: #9e9e9e;
|
181
176
|
position: absolute;
|
@@ -195,6 +190,7 @@ input[type=text]:focus {
|
|
195
190
|
border-bottom: 2px solid #26a69a!important;
|
196
191
|
transition: .2s ease-out;
|
197
192
|
}
|
193
|
+
|
198
194
|
input[type=text]:focus + label {
|
199
195
|
margin-top: -20px!important;
|
200
196
|
color: #26a69a!important;
|
@@ -215,23 +211,22 @@ input[type=text]:focus + label {
|
|
215
211
|
|
216
212
|
input[type="radio"]:not(:checked),
|
217
213
|
[type="radio"]:checked {
|
218
|
-
position: absolute;
|
219
|
-
left: -9999px;
|
220
|
-
opacity: 0;
|
214
|
+
position: absolute;
|
215
|
+
left: -9999px;
|
216
|
+
opacity: 0;
|
221
217
|
}
|
222
218
|
|
223
219
|
[type="radio"]:not(:checked) + label,
|
224
220
|
[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
|
-
|
234
|
-
-webkit-user-select: none;
|
221
|
+
position: relative;
|
222
|
+
padding-left: 35px;
|
223
|
+
cursor: pointer;
|
224
|
+
display: inline-block;
|
225
|
+
height: 25px;
|
226
|
+
line-height: 30px;
|
227
|
+
font-size: 1rem;
|
228
|
+
transition: .28s ease;
|
229
|
+
-webkit-user-select: none;
|
235
230
|
-moz-user-select: none;
|
236
231
|
-ms-user-select: none;
|
237
232
|
user-select: none;
|
@@ -239,15 +234,15 @@ transition: .28s ease;
|
|
239
234
|
|
240
235
|
[type="radio"] + label:before,
|
241
236
|
[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;
|
237
|
+
content: '';
|
238
|
+
position: absolute;
|
239
|
+
left: 0;
|
240
|
+
top: 0;
|
241
|
+
margin: 4px;
|
242
|
+
width: 16px;
|
243
|
+
height: 16px;
|
244
|
+
z-index: 0;
|
245
|
+
transition: .28s ease;
|
251
246
|
}
|
252
247
|
|
253
248
|
/* Unchecked styles */
|
@@ -257,42 +252,46 @@ transition: .28s ease;
|
|
257
252
|
[type="radio"]:checked + label:after,
|
258
253
|
[type="radio"].with-gap:checked + label:before,
|
259
254
|
[type="radio"].with-gap:checked + label:after {
|
260
|
-
border-radius: 50%;
|
255
|
+
border-radius: 50%;
|
261
256
|
}
|
262
257
|
|
263
258
|
[type="radio"]:not(:checked) + label:before,
|
264
259
|
[type="radio"]:not(:checked) + label:after {
|
265
|
-
border: 2px solid #5a5a5a;
|
260
|
+
border: 2px solid #5a5a5a;
|
266
261
|
}
|
267
262
|
|
268
263
|
[type="radio"]:not(:checked) + label:after {
|
269
|
-
-webkit-transform: scale(0);
|
270
|
-
|
264
|
+
-webkit-transform: scale(0);
|
265
|
+
transform: scale(0);
|
271
266
|
}
|
272
267
|
|
273
268
|
/* Checked styles */
|
274
269
|
[type="radio"]:checked + label:before {
|
275
|
-
border: 2px solid transparent;
|
270
|
+
border: 2px solid transparent;
|
276
271
|
}
|
277
272
|
|
278
273
|
[type="radio"]:checked + label:after,
|
279
274
|
[type="radio"].with-gap:checked + label:before,
|
280
275
|
[type="radio"].with-gap:checked + label:after {
|
281
|
-
border: 2px solid #26a69a;
|
276
|
+
border: 2px solid #26a69a;
|
282
277
|
}
|
283
278
|
|
284
279
|
[type="radio"]:checked + label:after,
|
285
280
|
[type="radio"].with-gap:checked + label:after {
|
286
|
-
background-color: #26a69a;
|
281
|
+
background-color: #26a69a;
|
287
282
|
}
|
288
283
|
|
289
284
|
[type="radio"]:checked + label:after {
|
290
|
-
-webkit-transform: scale(1.02);
|
291
|
-
|
285
|
+
-webkit-transform: scale(1.02);
|
286
|
+
transform: scale(1.02);
|
292
287
|
}
|
293
288
|
|
294
289
|
/* Focused styles */
|
295
290
|
[type="radio"].tabbed:focus + label:before {
|
296
|
-
box-shadow: 0 0 0 10px rgba(0, 0, 0, 0.1);
|
297
|
-
color: red!Important;
|
291
|
+
box-shadow: 0 0 0 10px rgba(0, 0, 0, 0.1);
|
292
|
+
color: red!Important;
|
293
|
+
}
|
294
|
+
|
295
|
+
.red {
|
296
|
+
background-color: #D52618 !important;
|
298
297
|
}
|
@@ -1,5 +1,10 @@
|
|
1
1
|
module SafetyCone
|
2
2
|
class ApplicationController < ActionController::Base
|
3
3
|
protect_from_forgery with: :exception
|
4
|
+
|
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
|
4
9
|
end
|
5
10
|
end
|
@@ -1,28 +1,7 @@
|
|
1
|
-
require_dependency
|
1
|
+
require_dependency 'safety_cone/application_controller'
|
2
2
|
|
3
3
|
module SafetyCone
|
4
4
|
class ConesController < ApplicationController
|
5
|
-
|
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
|
5
|
+
def index; end
|
27
6
|
end
|
28
7
|
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require_dependency 'safety_cone/application_controller'
|
2
|
+
|
3
|
+
module SafetyCone
|
4
|
+
class FeaturesController < ApplicationController
|
5
|
+
def update
|
6
|
+
feature = SafetyCone.features[params[:id].to_i]
|
7
|
+
|
8
|
+
redis = SafetyCone.redis
|
9
|
+
redis_key = "safety::cone::#{feature[:feature]}"
|
10
|
+
redis.set(redis_key, params[:state])
|
11
|
+
|
12
|
+
redirect_to cones_path
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require_dependency 'safety_cone/application_controller'
|
2
|
+
|
3
|
+
module SafetyCone
|
4
|
+
class PathsController < ApplicationController
|
5
|
+
def edit
|
6
|
+
path = SafetyCone.paths[params[:id].to_sym]
|
7
|
+
@path = Path.new(params[:id], path)
|
8
|
+
@path.fetch
|
9
|
+
end
|
10
|
+
|
11
|
+
def update
|
12
|
+
path = SafetyCone.paths[params[:id].to_sym]
|
13
|
+
mereged_params = path.merge(params[:path].symbolize_keys)
|
14
|
+
Path.new(params[:id], mereged_params).save
|
15
|
+
|
16
|
+
redirect_to cones_path
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -2,17 +2,14 @@
|
|
2
2
|
<html>
|
3
3
|
<head>
|
4
4
|
<title>Safety Cone</title>
|
5
|
-
<%= stylesheet_link_tag
|
5
|
+
<%= stylesheet_link_tag 'safety_cone/application', media: 'all' %>
|
6
6
|
</head>
|
7
7
|
<body>
|
8
|
-
<div class=
|
9
|
-
<div class=
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
<div class="col s4 center">
|
14
|
-
<h4>Safety Cone</h4>
|
15
|
-
</div>
|
8
|
+
<div class='wrapper'>
|
9
|
+
<div class='header'>
|
10
|
+
<%= image_tag('safety_cone/logo.png', size: '60x60', class: 'logo') %>
|
11
|
+
<h3>Safety Cone</h3>
|
12
|
+
<%= link_to 'home', '/', class: 'btn back dark-grey' %>
|
16
13
|
</div>
|
17
14
|
<%= yield %>
|
18
15
|
</div>
|
@@ -1,24 +1,35 @@
|
|
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
1
|
|
23
|
-
|
2
|
+
<!-- Paths list -->
|
3
|
+
<h4>Requests</h4>
|
4
|
+
<div class='grid'>
|
5
|
+
<% SafetyCone.paths.each do |cone, options| %>
|
6
|
+
<%= options[:name] %>
|
7
|
+
|
8
|
+
<span class="chip status-<%= status(cone) %>">
|
9
|
+
<%= status(cone) %>
|
10
|
+
</span>
|
11
|
+
|
12
|
+
<%= link_to 'edit', edit_path_path(cone), class: 'waves-effect waves-light btn' %>
|
13
|
+
<% end %>
|
14
|
+
</div>
|
15
|
+
|
16
|
+
<!-- Features list -->
|
17
|
+
<h4>Features</h4>
|
18
|
+
<div class='grid'>
|
19
|
+
<% SafetyCone.features.each_with_index do |feature, index| %>
|
20
|
+
<%= feature[:name] %>
|
21
|
+
|
22
|
+
<% if feature_status(feature[:feature]) %>
|
23
|
+
|
24
|
+
<div class="chip status">on</div>
|
25
|
+
|
26
|
+
<%= button_to 'Block', feature_path(index, params: { state: 0 }),
|
27
|
+
method: :patch, class: 'waves-effect waves-light btn expand red'%>
|
28
|
+
<% else %>
|
29
|
+
<div class="chip status-block">off</div>
|
30
|
+
|
31
|
+
<%= button_to 'Unblock', feature_path(index, params: { state: 1 }),
|
32
|
+
method: :patch, class: 'waves-effect waves-light btn expand'%>
|
33
|
+
<% end %>
|
34
|
+
<%end%>
|
24
35
|
</div>
|
@@ -0,0 +1,30 @@
|
|
1
|
+
<div class='grid'>
|
2
|
+
<div class='card col'>
|
3
|
+
<h6 class="center"><%= @path.name %></h6>
|
4
|
+
<%= form_for :path, url: path_path(@path.key), method: :PUT do |form| %>
|
5
|
+
<div class='form'>
|
6
|
+
<div class='input-field'>
|
7
|
+
<%= form.text_field :message %>
|
8
|
+
<%= form.label :message, 'Message', class: 'input-label'%>
|
9
|
+
</div>
|
10
|
+
|
11
|
+
<div class='input-field'>
|
12
|
+
<%= form.radio_button :type, 'notice' %>
|
13
|
+
<%= form.label :type_notice, 'Notice' %>
|
14
|
+
|
15
|
+
<%= form.radio_button :type, 'block' %>
|
16
|
+
<%= form.label :type_block, 'Block' %>
|
17
|
+
|
18
|
+
<%= form.radio_button :type, 'disabled' %>
|
19
|
+
<%= form.label :type_disabled, 'Disable this Cone' %>
|
20
|
+
</div>
|
21
|
+
|
22
|
+
<div class='input-field'>
|
23
|
+
<%= form.submit 'save', class: 'waves-effect waves-light btn' %>
|
24
|
+
<%= link_to 'cancel', cones_path, class: 'waves-effect waves-light btn grey lighten-1' %>
|
25
|
+
</div>
|
26
|
+
</div>
|
27
|
+
<% end %>
|
28
|
+
</div>
|
29
|
+
</div>
|
30
|
+
|
data/config/routes.rb
CHANGED
data/lib/safety_cone.rb
CHANGED
@@ -1,9 +1,7 @@
|
|
1
1
|
module SafetyCone
|
2
2
|
# Module for configuring safety measures
|
3
3
|
module Configuration
|
4
|
-
|
5
|
-
|
6
|
-
attr_accessor :cones, :options, :redis, :auth
|
4
|
+
attr_accessor :options, :redis, :auth, :paths, :features
|
7
5
|
|
8
6
|
# Method add a route or method to be managed by safety cone
|
9
7
|
def add(options = {})
|
@@ -11,7 +9,12 @@ module SafetyCone
|
|
11
9
|
|
12
10
|
raise(ArgumentError, 'Mandatory param :name missing') unless options[:name]
|
13
11
|
|
14
|
-
|
12
|
+
if options[:feature]
|
13
|
+
features << options
|
14
|
+
SafetyCone::ViewHelpers.add_method(options[:feature])
|
15
|
+
else
|
16
|
+
paths[make_key] = options
|
17
|
+
end
|
15
18
|
end
|
16
19
|
|
17
20
|
# Method to generate a key from the options
|
@@ -28,7 +31,8 @@ module SafetyCone
|
|
28
31
|
|
29
32
|
# Configuration method for Rails initializer
|
30
33
|
def configure
|
31
|
-
self.
|
34
|
+
self.paths = {}
|
35
|
+
self.features = []
|
32
36
|
self.auth = { username: nil, password: nil }
|
33
37
|
|
34
38
|
yield self
|
data/lib/safety_cone/engine.rb
CHANGED
@@ -2,13 +2,13 @@ module SafetyCone
|
|
2
2
|
class Engine < ::Rails::Engine
|
3
3
|
isolate_namespace SafetyCone
|
4
4
|
|
5
|
-
initializer
|
5
|
+
initializer 'refinery.assets.precompile' do |app|
|
6
6
|
app.config.assets.precompile += %w(safety_cone/logo.png)
|
7
7
|
end
|
8
8
|
|
9
9
|
config.generators do |g|
|
10
|
-
g.test_framework :rspec, :
|
11
|
-
g.fixture_replacement :factory_girl, :
|
10
|
+
g.test_framework :rspec, fixture: false
|
11
|
+
g.fixture_replacement :factory_girl, dir: 'spec/factories'
|
12
12
|
g.assets false
|
13
13
|
g.helper false
|
14
14
|
end
|
data/lib/safety_cone/filter.rb
CHANGED
@@ -24,42 +24,42 @@ module SafetyCone
|
|
24
24
|
|
25
25
|
private
|
26
26
|
|
27
|
-
|
28
|
-
|
29
|
-
|
27
|
+
# Fetches a configuration based on current request
|
28
|
+
def fetch_cone
|
29
|
+
paths = SafetyCone.paths
|
30
30
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
31
|
+
if path = paths[request_action]
|
32
|
+
key = request_action
|
33
|
+
elsif cone = paths[request_method]
|
34
|
+
key = request_method
|
35
|
+
else
|
36
|
+
return false
|
37
|
+
end
|
38
38
|
|
39
|
-
|
40
|
-
|
39
|
+
path = Path.new(key, path)
|
40
|
+
path.fetch
|
41
41
|
|
42
|
-
|
43
|
-
|
42
|
+
%w[notice block].include?(path.type) ? path : false
|
43
|
+
end
|
44
44
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
45
|
+
# Method to redirect a request
|
46
|
+
def safety_redirect
|
47
|
+
request.env['HTTP_REFERER'] || root_path
|
48
|
+
end
|
49
49
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
50
|
+
# Returns type of notice
|
51
|
+
def notice_type(type)
|
52
|
+
type == 'notice' ? 'notice' : 'alert'
|
53
|
+
end
|
54
54
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
55
|
+
# Returns the current request action as a symbol
|
56
|
+
def request_method
|
57
|
+
request.method.to_sym
|
58
|
+
end
|
59
59
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
60
|
+
# Returns the current controller_action as a symbol
|
61
|
+
def request_action
|
62
|
+
"#{controller_name}_#{action_name}".to_sym
|
63
|
+
end
|
64
64
|
end
|
65
65
|
end
|
data/lib/safety_cone/version.rb
CHANGED
@@ -0,0 +1,29 @@
|
|
1
|
+
module SafetyCone
|
2
|
+
# Module for Filtering requests and raise notices
|
3
|
+
# and take measures
|
4
|
+
module ViewHelpers
|
5
|
+
def safetycone_notice
|
6
|
+
flash[:safetycone_notice]
|
7
|
+
end
|
8
|
+
|
9
|
+
def safetycone_alert
|
10
|
+
flash[:safetycone_alert]
|
11
|
+
end
|
12
|
+
|
13
|
+
def feature?(name)
|
14
|
+
redis = SafetyCone.redis
|
15
|
+
redis_key = "safety::cone::#{name}"
|
16
|
+
value = redis.get(redis_key)
|
17
|
+
|
18
|
+
return true unless value
|
19
|
+
|
20
|
+
value == '1'
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.add_method(name)
|
24
|
+
define_method("#{name}?") { feature?(name) }
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
ActionView::Base.send :include, SafetyCone::ViewHelpers
|
metadata
CHANGED
@@ -1,15 +1,16 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: safety_cone
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
+
- Boost
|
7
8
|
- Edwin Rozario
|
8
|
-
-
|
9
|
+
- yhtut
|
9
10
|
autorequire:
|
10
11
|
bindir: bin
|
11
12
|
cert_chain: []
|
12
|
-
date: 2017-
|
13
|
+
date: 2017-11-16 00:00:00.000000000 Z
|
13
14
|
dependencies:
|
14
15
|
- !ruby/object:Gem::Dependency
|
15
16
|
name: rails
|
@@ -173,9 +174,10 @@ dependencies:
|
|
173
174
|
version: 2.4.3
|
174
175
|
description: |-
|
175
176
|
At times we would want to block certain requests.
|
176
|
-
SafetyCone allows this to be
|
177
|
+
SafetyCone allows this to be controlled from an interface.
|
178
|
+
It also provides a feature flipper for the views.
|
177
179
|
email:
|
178
|
-
-
|
180
|
+
- info@boost.co.nz
|
179
181
|
executables: []
|
180
182
|
extensions: []
|
181
183
|
extra_rdoc_files: []
|
@@ -189,21 +191,22 @@ files:
|
|
189
191
|
- app/assets/stylesheets/safety_cone/material.css
|
190
192
|
- app/controllers/safety_cone/application_controller.rb
|
191
193
|
- app/controllers/safety_cone/cones_controller.rb
|
194
|
+
- app/controllers/safety_cone/features_controller.rb
|
195
|
+
- app/controllers/safety_cone/paths_controller.rb
|
192
196
|
- app/helpers/safety_cone/application_helper.rb
|
193
197
|
- app/helpers/safety_cone/cones_helper.rb
|
194
198
|
- app/models/safety_cone/application_record.rb
|
195
|
-
- app/models/safety_cone/
|
199
|
+
- app/models/safety_cone/path.rb
|
196
200
|
- app/views/layouts/safety_cone/application.html.erb
|
197
|
-
- app/views/safety_cone/cones/edit.html.erb
|
198
201
|
- app/views/safety_cone/cones/index.html.erb
|
199
|
-
-
|
202
|
+
- app/views/safety_cone/paths/edit.html.erb
|
200
203
|
- config/routes.rb
|
201
204
|
- lib/safety_cone.rb
|
202
205
|
- lib/safety_cone/configuration.rb
|
203
206
|
- lib/safety_cone/engine.rb
|
204
207
|
- lib/safety_cone/filter.rb
|
205
208
|
- lib/safety_cone/version.rb
|
206
|
-
- lib/safety_cone/
|
209
|
+
- lib/safety_cone/view_helpers.rb
|
207
210
|
homepage: https://github.com/boost/safety_cone
|
208
211
|
licenses:
|
209
212
|
- MIT
|
@@ -1,33 +0,0 @@
|
|
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 :type, 'notice' %>
|
15
|
-
<%= form.label :type_notice, 'Notice' %>
|
16
|
-
|
17
|
-
<%= form.radio_button :type, 'block' %>
|
18
|
-
<%= form.label :type_block, 'Block' %>
|
19
|
-
|
20
|
-
<%= form.radio_button :type, 'disabled' %>
|
21
|
-
<%= form.label :type_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>
|
data/config/environment.rb
DELETED
File without changes
|
@@ -1,15 +0,0 @@
|
|
1
|
-
module SafetyCone
|
2
|
-
# Module for Filtering requests and raise notices
|
3
|
-
# and take measures
|
4
|
-
module Helper
|
5
|
-
def safetycone_notice
|
6
|
-
flash[:safetycone_notice]
|
7
|
-
end
|
8
|
-
|
9
|
-
def safetycone_alert
|
10
|
-
flash[:safetycone_alert]
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
ActionView::Base.send :include, SafetyCone::Helper
|