circuit_switch 0.4.1 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4359ba3c58190ee7f16780a8475a9fe81051823faeaddf5b220d342ab9e9c294
4
- data.tar.gz: ad985994dc31cb34e4090b9b45ebad4067e30b1b91d0419389867091d596ca37
3
+ metadata.gz: e5700c391d205790305cce8ed4d213f694deeaa8883d10d6b8e48a47de7d8f7e
4
+ data.tar.gz: acee1e59d6da803a085f399c39ef72099dc3d70a49f270fcb1dd1d0c49c1cf40
5
5
  SHA512:
6
- metadata.gz: 2517c69a923bb7739e6a5c0409b949b41ec624e5915c9fef7fae7e9e16be267983357f4e6c106702382c4157e81e9dae443159de70723bb66fe62247928096ad
7
- data.tar.gz: 815d01eb8cc81480558f3eca996158f0174b59bab6a97985399ef0184b3890dd39d283df213ca014f2855939a2253e55918ad9790b51ed7ffcb14ce2891c290d
6
+ metadata.gz: a7cfad2c3e41054235f8546f68d01945c387b196b0f1bb11290eb4f3a61da6477c422f347aee3ac87645fe6d841c585052a8cbe1ec3c835a97d683509ea77933
7
+ data.tar.gz: 92a77c9ae39c41ba59fb4cfd021b359169cbbc0d0b604ab00a258cad7fcd7fae0348b0bd9d9ac51b7e199fb33d8b17f39314a030cd6e70b89fa300e57a818162
data/CHANGELOG.md CHANGED
@@ -1,3 +1,16 @@
1
+ ## 0.5.0
2
+
3
+ ### New features
4
+
5
+ * GUI has been released!
6
+ If you are on Rails, add the following to your `config/routes.rb` and access `/circuit_switch`.
7
+
8
+ ```ruby
9
+ Rails.application.routes.draw do
10
+ mount CircuitSwitch::Engine => 'circuit_switch'
11
+ end
12
+ ```
13
+
1
14
  ## 0.4.1
2
15
 
3
16
  * Fix bug `if` `stop_report_if_reach_limit` options don't receive `false`.
data/README.md CHANGED
@@ -180,7 +180,27 @@ By default, due_date is 10 days after today. To modify, set `due_date` to initia
180
180
 
181
181
  ## GUI to manage switches
182
182
 
183
- Under development :)
183
+ ![GUI](circuit_switch.png)
184
+
185
+ GUI is now only for Rails.
186
+ Add the following to your `config/routes.rb` and access `/circuit_switch`.
187
+
188
+ ```ruby
189
+ Rails.application.routes.draw do
190
+ mount CircuitSwitch::Engine => 'circuit_switch'
191
+ end
192
+ ```
193
+
194
+ ### Authentication
195
+
196
+ In production, you may need access protection.
197
+ With Devise, code goes like:
198
+
199
+ ```ruby
200
+ authenticate :user, lambda { |user| user.admin? } do
201
+ mount CircuitSwitch::Engine => 'circuit_switch'
202
+ end
203
+ ```
184
204
 
185
205
  ## Contributing
186
206
 
@@ -0,0 +1,5 @@
1
+ module CircuitSwitch
2
+ class ApplicationController < ActionController::Base
3
+ protect_from_forgery with: :exception
4
+ end
5
+ end
@@ -0,0 +1,40 @@
1
+ require_dependency 'circuit_switch/application_controller'
2
+
3
+ module CircuitSwitch
4
+ class CircuitSwitchController < ::CircuitSwitch::ApplicationController
5
+ def index
6
+ @circuit_switches = ::CircuitSwitch::CircuitSwitch.all.order(order_by)
7
+ end
8
+
9
+ def edit
10
+ @circuit_switch = ::CircuitSwitch::CircuitSwitch.find(params[:id])
11
+ end
12
+
13
+ def update
14
+ @circuit_switch = ::CircuitSwitch::CircuitSwitch.find(params[:id])
15
+ if @circuit_switch.update circuit_switch_params
16
+ flash[:success] = "Switch for `#{@circuit_switch.key}` is successfully updated."
17
+ redirect_to circuit_switch_index_path
18
+ else
19
+ render :edit
20
+ end
21
+ end
22
+
23
+ def destroy
24
+ @circuit_switch = ::CircuitSwitch::CircuitSwitch.find(params[:id])
25
+ @circuit_switch.destroy!
26
+ flash[:success] = "Switch for `#{@circuit_switch.key}` is successfully destroyed."
27
+ redirect_to circuit_switch_index_path
28
+ end
29
+
30
+ private
31
+
32
+ def order_by
33
+ params[:order_by].in?(%w[id due_date]) ? params[:order_by] : 'id'
34
+ end
35
+
36
+ def circuit_switch_params
37
+ params.require(:circuit_switch).permit(:key, :caller, :run_count, :run_limit_count, :run_is_terminated, :report_count, :report_limit_count, :report_is_terminated, :due_date)
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,129 @@
1
+ <h1 class="p-3 fw-light">Edit switch</h1>
2
+
3
+ <div class="container">
4
+ <% if @circuit_switch.errors.any? %>
5
+ <div class="alert alert-danger">
6
+ <ul class="mb-0">
7
+ <% @circuit_switch.errors.full_messages.each do |message| %>
8
+ <li><%= message %></li>
9
+ <% end %>
10
+ </ul>
11
+ </div>
12
+ <% end %>
13
+
14
+ <%= form_with(model: @circuit_switch, local: true) do |form| %>
15
+ <div class="fw-light">
16
+ <div class="py-1 row">
17
+ <div class="col-10 mt-auto">
18
+ id: <%= @circuit_switch.id %>
19
+ <span class="px-4 text-muted">
20
+ created_at: <%= @circuit_switch.created_at %> /
21
+ updated_at: <%= @circuit_switch.updated_at %>
22
+ </span>
23
+ </div>
24
+ <div class="col-2 text-end">
25
+ <%= link_to 'Back', circuit_switch_index_path, class: 'btn btn-outline-dark' %>
26
+ </div>
27
+ </div>
28
+
29
+ <div class="py-1">
30
+ <div class="py-1">
31
+ <%= form.label :key, 'key:', class: 'form-label' %>
32
+ <%= form.text_area :key, class: 'form-control font-monospace' %>
33
+ </div>
34
+ <div class="py-1">
35
+ <%= form.label :caller, 'caller:', class: 'form-label' %>
36
+ <%= form.text_area :caller, class: 'form-control font-monospace' %>
37
+ </div>
38
+ </div>
39
+
40
+ <div class="py-1">
41
+ <div class="py-2 row">
42
+ <%= form.label :run_is_terminated, 'run_mode:', class: 'col-sm-2 col-form-label' %>
43
+ <div class="col-sm-2">
44
+ <%= form.select :run_is_terminated, { open: false, closed: true }, { selected: @circuit_switch.run_is_terminated }, { class: ['form-select', (@circuit_switch.run_is_terminated ? 'alert-dark' : 'alert-primary')] } %>
45
+ </div>
46
+ </div>
47
+ <div class="py-2 row">
48
+ <div class="col-sm-2">
49
+ <%= form.label :run_count, 'run_count:', class: 'col-form-label' %>
50
+ <i class="fas fa-info-circle text-black-50 align-baseline px-1" data-bs-toggle="tooltip" data-bs-placement="top" title="Increment only when run_mode is open"></i>
51
+ </div>
52
+ <div class="col-sm-2">
53
+ <%= form.text_field :run_count, class: 'form-control' %>
54
+ </div>
55
+ </div>
56
+ <div class="py-2 row">
57
+ <div class="col-sm-2">
58
+ <%= form.label :run_limit_count, 'run_limit_count:', class: 'col-form-label' %>
59
+ <i class="fas fa-info-circle text-black-50 align-baseline px-1" data-bs-toggle="tooltip" data-bs-placement="top" title="Reference only when call with `close_if_reach_limit` true"></i>
60
+ </div>
61
+ <div class="col-sm-2">
62
+ <%= form.text_field :run_limit_count, class: 'form-control' %>
63
+ </div>
64
+ </div>
65
+ <div class="py-2 row">
66
+ <%= form.label :report_is_terminated, 'report_mode:', class: 'col-sm-2 col-sm-2 col-form-label' %>
67
+ <div class="col-sm-2">
68
+ <%= form.select :report_is_terminated, { reporting: false, terminated: true }, { selected: @circuit_switch.report_is_terminated }, { class: ['form-select', (@circuit_switch.report_is_terminated ? 'alert-dark' : 'alert-primary')] } %>
69
+ </div>
70
+ </div>
71
+ <div class="py-2 row">
72
+ <div class="col-sm-2">
73
+ <%= form.label :report_count, 'report_count:', class: 'col-form-label' %>
74
+ <i class="fas fa-info-circle text-black-50 align-baseline px-1" data-bs-toggle="tooltip" data-bs-placement="top" title="Increment only when report_mode is reporting"></i>
75
+ </div>
76
+ <div class="col-sm-2">
77
+ <%= form.text_field :report_count, class: 'form-control' %>
78
+ </div>
79
+ </div>
80
+ <div class="py-2 row">
81
+ <div class="col-sm-2">
82
+ <%= form.label :report_limit_count, 'report_limit_count:', class: 'col-form-label' %>
83
+ <i class="fas fa-info-circle text-black-50 align-baseline px-1" data-bs-toggle="tooltip" data-bs-placement="top" title="Reference only when call with `stop_report_if_reach_limit` true"></i>
84
+ </div>
85
+ <div class="col-sm-2">
86
+ <%= form.text_field :report_limit_count, class: 'form-control' %>
87
+ </div>
88
+ </div>
89
+ </div>
90
+
91
+ <div class="py-1">
92
+ <div class="py-2 row">
93
+ <div class="col-sm-2">
94
+ <%= form.label :due_date, 'due_date:', class: 'col-form-label' %>
95
+ <i class="fas fa-info-circle text-black-50 align-baseline px-1" data-bs-toggle="tooltip" data-bs-placement="top" title="Date to remove switch"></i>
96
+ </div>
97
+ <div class="col-sm-2">
98
+ <%= form.text_field :due_date, class: 'form-control' %>
99
+ </div>
100
+ </div>
101
+ </div>
102
+
103
+ <div class="py-2">
104
+ <%= form.submit 'update', class: 'btn btn-dark' %>
105
+ </div>
106
+ </div>
107
+ <% end %>
108
+
109
+ <%= button_to 'delete', circuit_switch_path(@circuit_switch), method: :delete, class: 'btn btn-danger btn-destroy' %>
110
+ </div>
111
+
112
+ <script>
113
+ $('select').on('change', function() {
114
+ style = $(this).val() == 'true' ? 'alert-dark' : 'alert-primary'
115
+ $(this).removeClass('alert-primary alert-dark')
116
+ $(this).addClass(style)
117
+ })
118
+
119
+ $('.btn-destroy').on('click', function (event) {
120
+ if (!window.confirm('Are you sure to destroy?')) {
121
+ event.preventDefault()
122
+ }
123
+ })
124
+
125
+ tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'))
126
+ tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) {
127
+ return new bootstrap.Tooltip(tooltipTriggerEl)
128
+ })
129
+ </script>
@@ -0,0 +1,83 @@
1
+ <h1 class="p-3 fw-light">
2
+ circuit_switch <i class="fas fa-xs fa-toggle-on text-warning"></i>
3
+ </h1>
4
+
5
+ <div class="container">
6
+ <% if flash[:success].present? %>
7
+ <div class="alert alert-info"><%= flash[:success] %></div>
8
+ <% end %>
9
+
10
+ <div class="dropdown py-2 text-end">
11
+ <a class="btn btn-sm btn-outline-secondary dropdown-toggle" href="#" role="button" id="dropdownMenuLink" data-bs-toggle="dropdown" aria-expanded="false">
12
+ <%= params[:order_by] == 'due_date' ? 'due date ordered' : 'id ordered' %>
13
+ </a>
14
+
15
+ <ul class="dropdown-menu" aria-labelledby="dropdownMenuLink">
16
+ <li><%= link_to 'id ordered', circuit_switch_index_path(order_by: :id), class: 'dropdown-item' %></li>
17
+ <li><%= link_to 'due date ordered', circuit_switch_index_path(order_by: :due_date), class: 'dropdown-item' %></li>
18
+ </ul>
19
+ </div>
20
+
21
+ <table class="table table-striped table-hover striped-primary table-bordered border fw-light">
22
+ <thead class="table-dark border border-dark">
23
+ <tr>
24
+ <th scope="col" class="px-3 py-4 fw-light text-center">id</th>
25
+ <th scope="col" class="px-3 py-4 fw-light">key</th>
26
+ <th scope="col" class="px-3 py-4 fw-light">caller</th>
27
+ <th scope="col" class="px-1 py-4 fw-light">due_date</th>
28
+ <th scope="col" class="px-3 py-4 fw-light text-center">run</th>
29
+ <th scope="col" class="px-3 py-4 fw-light text-center">report</th>
30
+ <th scope="col" class="px-3 py-4 fw-light text-center">show/edit</th>
31
+ <th scope="col" class="px-3 py-4 fw-light text-center">destroy</th>
32
+ </tr>
33
+ </thead>
34
+
35
+ <tbody>
36
+ <% @circuit_switches.each do |circuit_switch| %>
37
+ <tr>
38
+ <td class="text-center align-middle"><%= circuit_switch.id %></td>
39
+ <td class="text-break small font-monospace"><%= circuit_switch.key %></td>
40
+ <td class="text-break small font-monospace"><%= circuit_switch.caller %></td>
41
+ <td class="text-nowrap"><%= circuit_switch.due_date %></td>
42
+ <td class="text-center align-middle">
43
+ <% if circuit_switch.run_is_terminated %>
44
+ <i class="fas fa-lg fa-ban text-muted" data-bs-toggle="tooltip" data-bs-placement="top" title="closed mode"></i>
45
+ <% else %>
46
+ <i class="fas fa-lg fa-walking " data-bs-toggle="tooltip" data-bs-placement="top" title="opened mode"></i>
47
+ <% end %>
48
+ </td>
49
+ <td class="text-center align-middle">
50
+ <% if circuit_switch.report_is_terminated %>
51
+ <i class="fas fa-lg fa-ban text-muted" data-bs-toggle="tooltip" data-bs-placement="top" title="terminated mode"></i>
52
+ <% else %>
53
+ <i class="fas fa-lg fa-bullhorn " data-bs-toggle="tooltip" data-bs-placement="top" title="reporting mode"></i>
54
+ <% end %>
55
+ </td>
56
+ <td class="text-center align-middle py-3">
57
+ <%= button_to edit_circuit_switch_path(circuit_switch), method: :get, class: 'btn btn-outline-dark' do %>
58
+ <i class="fas fa-edit"></i>
59
+ <% end %>
60
+ </td>
61
+ <td class="text-center align-middle py-3">
62
+ <%= button_to circuit_switch_path(circuit_switch), method: :delete, class: 'btn btn-danger btn-destroy' do %>
63
+ <i class="fas fa-broom"></i>
64
+ <% end %>
65
+ </td>
66
+ </tr>
67
+ <% end %>
68
+ </tbody>
69
+ </table>
70
+ </div>
71
+
72
+ <script>
73
+ $('.btn-destroy').on('click', function (event) {
74
+ if (!window.confirm('Are you sure to destroy?')) {
75
+ event.preventDefault()
76
+ }
77
+ })
78
+
79
+ tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'))
80
+ tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) {
81
+ return new bootstrap.Tooltip(tooltipTriggerEl)
82
+ })
83
+ </script>
@@ -0,0 +1,16 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset='utf-8'>
5
+ <title>circuit_switch</title>
6
+ <%= csrf_meta_tags %>
7
+ <%= csp_meta_tag %>
8
+ <%= javascript_include_tag 'https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/js/bootstrap.bundle.min.js', integrity: 'sha384-ygbV9kiqUc6oa4msXn9868pTtWMgiQaeYH7/t7LECLbyPA2x65Kgf80OJFdroafW', crossorigin: 'anonymous' %>
9
+ <%= javascript_include_tag 'https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js' %>
10
+ <%= javascript_include_tag 'https://kit.fontawesome.com/3e20336786.js', crossorigin: 'anonymous' %>
11
+ <%= stylesheet_link_tag 'https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css', media: 'all', integrity: 'sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1', crossorigin: 'anonymous' %>
12
+ </head>
13
+ <body>
14
+ <%= yield %>
15
+ </body>
16
+ </html>
Binary file
data/config/routes.rb ADDED
@@ -0,0 +1,4 @@
1
+ CircuitSwitch::Engine.routes.draw do
2
+ resources 'circuit_switch', only: [:index, :edit, :update, :destroy], controller: 'circuit_switch'
3
+ root to: 'circuit_switch#index'
4
+ end
@@ -0,0 +1,9 @@
1
+ module CircuitSwitch
2
+ def self.table_name_prefix
3
+ ''
4
+ end
5
+
6
+ class Engine < ::Rails::Engine
7
+ isolate_namespace ::CircuitSwitch
8
+ end
9
+ end
@@ -1,3 +1,3 @@
1
1
  module CircuitSwitch
2
- VERSION = '0.4.1'
2
+ VERSION = '0.5.0'
3
3
  end
@@ -1,6 +1,7 @@
1
1
  require_relative 'circuit_switch/configuration'
2
2
  require_relative 'circuit_switch/builder'
3
3
  require_relative 'circuit_switch/orm/active_record/circuit_switch'
4
+ require_relative 'circuit_switch/engine' if defined?(Rails)
4
5
  require_relative 'circuit_switch/railtie' if defined?(Rails::Railtie)
5
6
  require_relative 'circuit_switch/version'
6
7
  require_relative 'circuit_switch/workers/due_date_notifier'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: circuit_switch
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - makicamel
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-11-10 00:00:00.000000000 Z
11
+ date: 2021-11-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activejob
@@ -124,13 +124,21 @@ files:
124
124
  - LICENSE.txt
125
125
  - README.md
126
126
  - Rakefile
127
+ - app/controllers/circuit_switch/application_controller.rb
128
+ - app/controllers/circuit_switch/circuit_switch_controller.rb
129
+ - app/views/circuit_switch/circuit_switch/edit.html.erb
130
+ - app/views/circuit_switch/circuit_switch/index.html.erb
131
+ - app/views/layouts/circuit_switch/application.html.erb
127
132
  - bin/console
128
133
  - bin/setup
129
134
  - circuit_switch.gemspec
135
+ - circuit_switch.png
136
+ - config/routes.rb
130
137
  - lib/circuit_switch.rb
131
138
  - lib/circuit_switch/builder.rb
132
139
  - lib/circuit_switch/configuration.rb
133
140
  - lib/circuit_switch/core.rb
141
+ - lib/circuit_switch/engine.rb
134
142
  - lib/circuit_switch/notification.rb
135
143
  - lib/circuit_switch/orm/active_record/circuit_switch.rb
136
144
  - lib/circuit_switch/railtie.rb