feature_gate 0.1.3 → 0.1.4

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
  SHA1:
3
- metadata.gz: f0406848d929e8aa0f675c4814a10c36f6663a0a
4
- data.tar.gz: 7e46b5a0e1997b71a45fb71effe93c0a4777ab68
3
+ metadata.gz: 822d2404bcfa793c80f23f9bfbb5b2496f3f0e1b
4
+ data.tar.gz: 76c0dabcb6a31476ae64d9a3c330edc8a4628d42
5
5
  SHA512:
6
- metadata.gz: c65230e8cc3f0e3fd7ab7461da9d602d6e77131c08fd233bc01d60c7a72f797bd64c1c72eb7b5babff0d8a57755a337936e23ffc85017241fc70f3b356cf3eba
7
- data.tar.gz: 8a2a00751a311f9c289511601957f049defdb5a9df44a85b543eec50af442d436c1e01ef76d6903110fb2af64a39022f13d5331d591d9a79dd787f38e79bf3f1
6
+ metadata.gz: ddfde61be9c56acd921a486dee0cad63902c7c5966da5a5215d6e6e6dcfde621a97f196ce2105af8bc0861079360f5a84e70114151ddfb399601a38cebad2544
7
+ data.tar.gz: fe68b7c4ed06b4c1344a300b7562e0ce24fc061077a05c5728de67f13d61ddd3dbd19ef124fad4aff0cb618e9d6f798027b435025029cfd948959f16ba665742
data/README.md CHANGED
@@ -20,6 +20,14 @@ Add to `config/routes.rb`
20
20
 
21
21
  mount FeatureGate::Engine, at: '/feature_gate'
22
22
 
23
+ ## Optional Configurations
24
+
25
+ Add `config/initializers/feature_gate.rb`
26
+
27
+ FeatureGate.setup do |config|
28
+ config.time_to_stale = 2.weeks # time until a gate is listed as stale, default is 1 month.
29
+ end
30
+
23
31
  ## Usage
24
32
 
25
33
  ### Gating features
@@ -70,3 +78,7 @@ To see the names of all opened gates:
70
78
  To see the names of all closed gates:
71
79
 
72
80
  FeatureGate::Manager.closed_gates
81
+
82
+ To see the names of all stale gates:
83
+
84
+ FeatureGate::Manager.stale_gates
@@ -36,3 +36,16 @@ ul {
36
36
  .gates {
37
37
  margin-bottom: 25px;
38
38
  }
39
+
40
+ th, td {
41
+ text-align: left;
42
+ padding-right: 10px;
43
+ }
44
+
45
+ th:last-child {
46
+ padding-right: 0;
47
+ }
48
+
49
+ td:last-child {
50
+ padding-right: 0;
51
+ }
@@ -6,6 +6,7 @@ module FeatureGate
6
6
  def index
7
7
  @closed_gates = FeatureGate::GatedFeature.closed
8
8
  @opened_gates = FeatureGate::GatedFeature.opened
9
+ @stale_gates = FeatureGate::GatedFeature.stale.order(:updated_at)
9
10
  end
10
11
 
11
12
  def update
@@ -0,0 +1,7 @@
1
+ module FeatureGate
2
+ class Cleaner
3
+ def self.clean(gate_name)
4
+ `grep -r #{gate_name} #{Dir.pwd}/app/views/`
5
+ end
6
+ end
7
+ end
@@ -5,6 +5,7 @@ module FeatureGate
5
5
 
6
6
  scope :opened, -> { where(gated: false) }
7
7
  scope :closed, -> { where(gated: true) }
8
+ scope :stale, -> { where('updated_at != created_at and updated_at < ?', Time.zone.now - FeatureGate.time_to_stale) }
8
9
 
9
10
  def deploy_feature!
10
11
  self.gated = false
@@ -15,5 +16,13 @@ module FeatureGate
15
16
  self.gated = true
16
17
  save!
17
18
  end
19
+
20
+ def status
21
+ if gated
22
+ 'closed'
23
+ else
24
+ 'opened'
25
+ end
26
+ end
18
27
  end
19
28
  end
@@ -22,6 +22,10 @@ module FeatureGate
22
22
  GatedFeature.closed.pluck(:name)
23
23
  end
24
24
 
25
+ def self.stale_gates
26
+ GatedFeature.stale.pluck(:name)
27
+ end
28
+
25
29
  def self.open!(name)
26
30
  gated_feature = GatedFeature.find_by_name!(name)
27
31
  gated_feature.deploy_feature!
@@ -3,33 +3,66 @@
3
3
  <section class="gates">
4
4
  <h3>Opened Gates</h3>
5
5
  <% if @opened_gates.any? %>
6
- <ul>
6
+ <table>
7
+ <tr>
8
+ <th>Gate name</th>
9
+ <th>Action</th>
10
+ </tr>
11
+
7
12
  <% @opened_gates.each do |gate| %>
8
- <li>
9
- <%= gate.name %>&nbsp;
10
- <%= link_to 'Close', gated_feature_path(gate, gated: true), method: :put, data: { confirm: "Shutting down #{gate.name}, are you sure?" } %>
11
- </li>
13
+ <tr>
14
+ <td><%= gate.name %></td>
15
+ <td><%= link_to 'Close', gated_feature_path(gate, gated: true), method: :put, data: { confirm: "Shutting down #{gate.name}, are you sure?" } %></td>
16
+ </tr>
12
17
  <% end %>
13
- </ul>
18
+ </table>
14
19
  <% else %>
15
20
  <em>No opened gates</em>
16
21
  <% end %>
17
22
  </section>
18
23
 
19
- <hr>
20
-
21
24
  <section class="gates">
22
25
  <h3>Closed Gates</h3>
23
26
  <% if @closed_gates.any? %>
24
- <ul>
27
+ <table>
28
+ <tr>
29
+ <th>Gate name</th>
30
+ <th>Action</th>
31
+ </tr>
32
+
25
33
  <% @closed_gates.each do |gate| %>
26
- <li>
27
- <%= gate.name %>
28
- <%= link_to 'Open', gated_feature_path(gate, gated: false), method: :put, data: { confirm: "Deploying #{gate.name}, are you sure?" } %>
29
- </li>
34
+ <tr>
35
+ <td><%= gate.name %></td>
36
+ <td><%= link_to 'Open', gated_feature_path(gate, gated: false), method: :put, data: { confirm: "Deploying #{gate.name}, are you sure?" } %></td>
37
+ </tr>
30
38
  <% end %>
31
- </ul>
39
+ </table>
32
40
  <% else %>
33
41
  <em>No closed gates</em>
34
42
  <% end %>
35
43
  </section>
44
+
45
+ <hr>
46
+
47
+ <section class="gates">
48
+ <h3>Stale Gates</h3>
49
+ <% if @stale_gates.any? %>
50
+ <table>
51
+ <tr>
52
+ <th>Gate name</th>
53
+ <th>Status</th>
54
+ <th>Last updated at</th>
55
+ </tr>
56
+
57
+ <% @stale_gates.each do |gate| %>
58
+ <tr>
59
+ <td><%= gate.name %></td>
60
+ <td><%= gate.status %></td>
61
+ <td><%= gate.updated_at.strftime('%F') %></td>
62
+ </tr>
63
+ <% end %>
64
+ </table>
65
+ <% else %>
66
+ <em>No stale gates</em>
67
+ <% end %>
68
+ </section>
data/bin/feature_gate ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'feature_gate'
4
+
5
+ FeatureGate::Cleaner.clean(ARGV[0])
data/feature_gate.gemspec CHANGED
@@ -13,6 +13,7 @@ Gem::Specification.new do |s|
13
13
  s.homepage = 'https://github.com/tiffling/feature_gate'
14
14
  s.license = 'MIT'
15
15
  s.require_paths = ['lib']
16
+ s.executables = ['feature_gate']
16
17
 
17
18
  s.add_dependency 'rails', '~> 4.0'
18
19
  s.add_development_dependency('sqlite3', '~> 1.3')
@@ -1,3 +1,3 @@
1
1
  module FeatureGate
2
- VERSION = '0.1.3'.freeze
2
+ VERSION = '0.1.4'.freeze
3
3
  end
data/lib/feature_gate.rb CHANGED
@@ -1,5 +1,9 @@
1
1
  module FeatureGate
2
- # Yield self on setup for nice config blocks
2
+ class << self
3
+ mattr_accessor :time_to_stale
4
+ self.time_to_stale = 1.month
5
+ end
6
+
3
7
  def self.setup
4
8
  yield self
5
9
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: feature_gate
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tiffany Huang
@@ -68,7 +68,8 @@ dependencies:
68
68
  version: '4.5'
69
69
  description: A gem to toggle feature gates on and off
70
70
  email: little.huang@gmail.com
71
- executables: []
71
+ executables:
72
+ - feature_gate
72
73
  extensions: []
73
74
  extra_rdoc_files: []
74
75
  files:
@@ -79,10 +80,12 @@ files:
79
80
  - README.md
80
81
  - app/assets/stylesheets/feature_gate/application.scss.css
81
82
  - app/controllers/feature_gate/gated_features_controller.rb
83
+ - app/models/feature_gate/cleaner.rb
82
84
  - app/models/feature_gate/gated_feature.rb
83
85
  - app/models/feature_gate/manager.rb
84
86
  - app/views/feature_gate/gated_features/index.html.erb
85
87
  - app/views/layouts/feature_gate/application.html.erb
88
+ - bin/feature_gate
86
89
  - config/routes.rb
87
90
  - feature_gate.gemspec
88
91
  - lib/feature_gate.rb