flipper-ui 0.7.5 → 0.8.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
  SHA1:
3
- metadata.gz: fe2cc2f1662ed0329d08964ed342e26a96939c0f
4
- data.tar.gz: 99574660cdbf06e70e1e5a4f6ad46775dfb39002
3
+ metadata.gz: c9ad8f99301748583192db920f873597dc0d3ac3
4
+ data.tar.gz: d41e140edc11650a62521e840db6476042404110
5
5
  SHA512:
6
- metadata.gz: f6c5a3c6f42668e7992d3fb22ace5d2eb9fefd3e736ea727f3488de1a6c0cfb63c0f3fbcfe0d406f7db18da56078a6161eb32caca704de2931701ecbfde96220
7
- data.tar.gz: fad63e6135fa1d5f4bf3a93f4917a99959a9a2d1aafd7f14842efefc49fe85564494b5e19f061371f8952717ecaa94e2b0ade381fe44bf224838f329f4e95343
6
+ metadata.gz: 2df9f15278dce52132dd77fa494f963a7fa2e000f5d43b1797de2498d6e95a66e4e27e7ccda3a8fff06c95f8e3a992326d312f8d4f0588ef50fbd7b3848d8a6e
7
+ data.tar.gz: 81eb62be1129995195ef6621b0dc9c3059dfbede4fc2035789c8825bcb30b9c2f65799b39abe311037f83fa51657cc3919597d2a0de82d15770a1b144c3f9077
data/lib/flipper/ui.rb CHANGED
@@ -21,8 +21,15 @@ module Flipper
21
21
  # says "App" which points to this href. The href can be a path (ie: "/")
22
22
  # or full url ("https://app.example.com/").
23
23
  attr_accessor :application_breadcrumb_href
24
+
25
+ # Public: Is feature creation allowed from the UI? Defaults to true. If
26
+ # set to false, users of the UI cannot create features. All feature
27
+ # creation will need to be done through the conigured flipper instance.
28
+ attr_accessor :feature_creation_enabled
24
29
  end
25
30
 
31
+ self.feature_creation_enabled = true
32
+
26
33
  def self.root
27
34
  @root ||= Pathname(__FILE__).dirname.expand_path.join('ui')
28
35
  end
@@ -8,6 +8,16 @@ module Flipper
8
8
  route %r{features/new/?\Z}
9
9
 
10
10
  def get
11
+ unless Flipper::UI.feature_creation_enabled
12
+ status 403
13
+
14
+ breadcrumb "Home", "/"
15
+ breadcrumb "Features", "/features"
16
+ breadcrumb "Noooooope"
17
+
18
+ halt view_response(:feature_creation_disabled)
19
+ end
20
+
11
21
  breadcrumb "Home", "/"
12
22
  breadcrumb "Features", "/features"
13
23
  breadcrumb "Add"
@@ -24,6 +24,16 @@ module Flipper
24
24
  end
25
25
 
26
26
  def post
27
+ unless Flipper::UI.feature_creation_enabled
28
+ status 403
29
+
30
+ breadcrumb "Home", "/"
31
+ breadcrumb "Features", "/features"
32
+ breadcrumb "Noooooope"
33
+
34
+ halt view_response(:feature_creation_disabled)
35
+ end
36
+
27
37
  value = params["value"]
28
38
 
29
39
  if Util.blank?(value)
@@ -52,3 +52,7 @@ body {
52
52
  .feature-enabled-gates {
53
53
  width:380px;
54
54
  }
55
+
56
+ p.help {
57
+ color: #999;
58
+ }
@@ -2601,3 +2601,6 @@ a.list-group-item-danger {
2601
2601
 
2602
2602
  .feature-enabled-gates {
2603
2603
  width: 380px; }
2604
+
2605
+ p.help {
2606
+ color: #999; }
@@ -11,8 +11,13 @@
11
11
  <div class="panel-body">
12
12
  <form action="<%= script_name %>/features" method="post">
13
13
  <%== csrf_input_tag %>
14
- <input type="text" name="value" placeholder="ie: admins, orgs_next, etc.">
14
+ <input type="text" name="value" size="30" placeholder="ie: search, new_pricing, etc.">
15
15
  <input type="submit" value="Add Feature" class="btn">
16
16
  </form>
17
+ <p class="help">
18
+ Recommended naming conventions: lower case, <a href="https://en.wikipedia.org/wiki/Snake_case">snake case</a>, underscores over dashes.
19
+ <strong>Good</strong>: foo_bar, foo.
20
+ <strong>Bad</strong>: FooBar, Foo Bar, foo bar, foo-bar.
21
+ </p>
17
22
  </div>
18
23
  </div>
@@ -56,6 +56,7 @@
56
56
  <input type="text" name="value" <% if @feature.percentage_of_actors_value > 0 %>value="<%= @feature.percentage_of_actors_value %>"<% end %> placeholder="custom (ie: 26, 32, etc.)" class="input-mini">
57
57
  <input type="submit" name="action" value="Enable" class="btn btn-sm">
58
58
  </form>
59
+ <p class="help"><small>Percentage of actors functions independently of percentage of time. If you enable 50% of Actors and 25% of Time then the feature will always be enabled for 50% of users and occasionally enabled 25% of the time for everyone.</small></p>
59
60
  </div>
60
61
  </div>
61
62
  </div>
@@ -81,6 +82,8 @@
81
82
  <input type="text" name="value" <% if @feature.percentage_of_time_value > 0 %>value="<%= @feature.percentage_of_time_value %>"<% end %> placeholder="custom (ie: 26, 32, etc.)" class="input-mini">
82
83
  <input type="submit" name="action" value="Enable" class="btn btn-sm">
83
84
  </form>
85
+
86
+ <p class="help"><small>Percentage of time functions independently of percentage of actors. If you enable 50% of Actors and 25% of Time then the feature will always be enabled for 50% of users and occasionally enabled 25% of the time for everyone.</small></p>
84
87
  </div>
85
88
  </div>
86
89
  </div>
@@ -0,0 +1,3 @@
1
+ <div class="flash flash-error">
2
+ Feature creation is disabled. To enable, you'll need to set <code>Flipper::UI.feature_creation_enabled = true</code> wherever flipper is running from.
3
+ </div>
@@ -17,7 +17,9 @@
17
17
  </head>
18
18
  <body>
19
19
  <div class="container header">
20
- <a class="btn btn-sm right" href="<%= script_name %>/features/new">Add Feature</a>
20
+ <%- if Flipper::UI.feature_creation_enabled -%>
21
+ <a class="btn btn-sm right" href="<%= script_name %>/features/new">Add Feature</a>
22
+ <%- end -%>
21
23
 
22
24
  <ol class="breadcrumb">
23
25
  <% @breadcrumbs.each do |breadcrumb| %>
@@ -1,3 +1,3 @@
1
1
  module Flipper
2
- VERSION = "0.7.5"
2
+ VERSION = "0.8.0"
3
3
  end
@@ -1,11 +1,17 @@
1
1
  require 'helper'
2
2
 
3
3
  RSpec.describe Flipper::UI::Actions::AddFeature do
4
- describe "GET /features/new" do
4
+ describe "GET /features/new with feature_creation_enabled set to true" do
5
5
  before do
6
+ @original_feature_creation_enabled = Flipper::UI.feature_creation_enabled
7
+ Flipper::UI.feature_creation_enabled = true
6
8
  get "/features/new"
7
9
  end
8
10
 
11
+ after do
12
+ Flipper::UI.feature_creation_enabled = @original_feature_creation_enabled
13
+ end
14
+
9
15
  it "responds with success" do
10
16
  expect(last_response.status).to be(200)
11
17
  end
@@ -14,4 +20,24 @@ RSpec.describe Flipper::UI::Actions::AddFeature do
14
20
  expect(last_response.body).to include('<form action="/features" method="post">')
15
21
  end
16
22
  end
23
+
24
+ describe "GET /features/new with feature_creation_enabled set to false" do
25
+ before do
26
+ @original_feature_creation_enabled = Flipper::UI.feature_creation_enabled
27
+ Flipper::UI.feature_creation_enabled = false
28
+ get "/features/new"
29
+ end
30
+
31
+ after do
32
+ Flipper::UI.feature_creation_enabled = @original_feature_creation_enabled
33
+ end
34
+
35
+ it "returns 403" do
36
+ expect(last_response.status).to be(403)
37
+ end
38
+
39
+ it "renders feature creation disabled template" do
40
+ expect(last_response.body).to include("Feature creation is disabled.")
41
+ end
42
+ end
17
43
  end
@@ -18,13 +18,19 @@ RSpec.describe Flipper::UI::Actions::Features do
18
18
  end
19
19
  end
20
20
 
21
- describe "POST /features" do
21
+ describe "POST /features with feature_creation_enabled set to true" do
22
22
  before do
23
+ @original_feature_creation_enabled = Flipper::UI.feature_creation_enabled
24
+ Flipper::UI.feature_creation_enabled = true
23
25
  post "/features",
24
26
  {"value" => "notifications_next", "authenticity_token" => "a"},
25
27
  "rack.session" => {"_csrf_token" => "a"}
26
28
  end
27
29
 
30
+ after do
31
+ Flipper::UI.feature_creation_enabled = @original_feature_creation_enabled
32
+ end
33
+
28
34
  it "adds feature" do
29
35
  expect(flipper.features.map(&:key)).to include("notifications_next")
30
36
  end
@@ -34,4 +40,30 @@ RSpec.describe Flipper::UI::Actions::Features do
34
40
  expect(last_response.headers["Location"]).to eq("/features/notifications_next")
35
41
  end
36
42
  end
43
+
44
+ describe "POST /features with feature_creation_enabled set to false" do
45
+ before do
46
+ @original_feature_creation_enabled = Flipper::UI.feature_creation_enabled
47
+ Flipper::UI.feature_creation_enabled = false
48
+ post "/features",
49
+ {"value" => "notifications_next", "authenticity_token" => "a"},
50
+ "rack.session" => {"_csrf_token" => "a"}
51
+ end
52
+
53
+ after do
54
+ Flipper::UI.feature_creation_enabled = @original_feature_creation_enabled
55
+ end
56
+
57
+ it "does not add feature" do
58
+ expect(flipper.features.map(&:key)).to_not include("notifications_next")
59
+ end
60
+
61
+ it "returns 403" do
62
+ expect(last_response.status).to be(403)
63
+ end
64
+
65
+ it "renders feature creation disabled template" do
66
+ expect(last_response.body).to include("Feature creation is disabled.")
67
+ end
68
+ end
37
69
  end
@@ -93,4 +93,41 @@ RSpec.describe Flipper::UI do
93
93
  expect(last_response.body).to include('<a href="https://myapp.com/">App</a>')
94
94
  end
95
95
  end
96
+
97
+ it "should set feature_creation_enabled to true by default" do
98
+ expect(Flipper::UI.feature_creation_enabled).to be(true)
99
+ end
100
+
101
+ context "with feature_creation_enabled set to true" do
102
+ before do
103
+ @original_feature_creation_enabled = Flipper::UI.feature_creation_enabled
104
+ Flipper::UI.feature_creation_enabled = true
105
+ end
106
+
107
+ it 'has the add_feature button' do
108
+ get '/features'
109
+ expect(last_response.body).to include('Add Feature')
110
+ end
111
+
112
+ after do
113
+ Flipper::UI.feature_creation_enabled = @original_feature_creation_enabled
114
+ end
115
+ end
116
+
117
+ context "with feature_creation_enabled set to false" do
118
+ before do
119
+ @original_feature_creation_enabled = Flipper::UI.feature_creation_enabled
120
+ Flipper::UI.feature_creation_enabled = false
121
+ end
122
+
123
+ it 'does not have the add_feature button' do
124
+ get '/features'
125
+ expect(last_response.body).to_not include('Add Feature')
126
+ end
127
+
128
+ after do
129
+ Flipper::UI.feature_creation_enabled = @original_feature_creation_enabled
130
+ end
131
+ end
132
+
96
133
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: flipper-ui
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.5
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Nunemaker
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-02-25 00:00:00.000000000 Z
11
+ date: 2016-06-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -50,14 +50,14 @@ dependencies:
50
50
  requirements:
51
51
  - - "~>"
52
52
  - !ruby/object:Gem::Version
53
- version: 0.7.5
53
+ version: 0.8.0
54
54
  type: :runtime
55
55
  prerelease: false
56
56
  version_requirements: !ruby/object:Gem::Requirement
57
57
  requirements:
58
58
  - - "~>"
59
59
  - !ruby/object:Gem::Version
60
- version: 0.7.5
60
+ version: 0.8.0
61
61
  - !ruby/object:Gem::Dependency
62
62
  name: erubis
63
63
  requirement: !ruby/object:Gem::Requirement
@@ -245,6 +245,7 @@ files:
245
245
  - lib/flipper/ui/views/add_feature.erb
246
246
  - lib/flipper/ui/views/add_group.erb
247
247
  - lib/flipper/ui/views/feature.erb
248
+ - lib/flipper/ui/views/feature_creation_disabled.erb
248
249
  - lib/flipper/ui/views/features.erb
249
250
  - lib/flipper/ui/views/layout.erb
250
251
  - lib/flipper/version.rb