flipper-ui 0.17.1 → 0.20.0.beta1
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 +4 -4
- data/docs/ui/README.md +31 -22
- data/docs/ui/images/banner.png +0 -0
- data/docs/ui/images/description.png +0 -0
- data/docs/ui/images/feature.png +0 -0
- data/docs/ui/images/features.png +0 -0
- data/examples/ui/basic.ru +20 -0
- data/flipper-ui.gemspec +3 -4
- data/lib/flipper/ui.rb +0 -3
- data/lib/flipper/ui/action.rb +2 -1
- data/lib/flipper/ui/actions/feature.rb +5 -2
- data/lib/flipper/ui/actions/features.rb +14 -1
- data/lib/flipper/ui/actions/file.rb +1 -1
- data/lib/flipper/ui/assets/javascripts/application.coffee +5 -3
- data/lib/flipper/ui/configuration.rb +23 -10
- data/lib/flipper/ui/decorators/feature.rb +39 -13
- data/lib/flipper/ui/public/css/application.css +20 -6493
- data/lib/flipper/ui/public/js/application.js +5 -5
- data/lib/flipper/ui/util.rb +40 -0
- data/lib/flipper/ui/views/add_actor.erb +1 -1
- data/lib/flipper/ui/views/add_feature.erb +1 -1
- data/lib/flipper/ui/views/add_group.erb +1 -1
- data/lib/flipper/ui/views/feature.erb +198 -179
- data/lib/flipper/ui/views/features.erb +47 -36
- data/lib/flipper/ui/views/layout.erb +4 -14
- data/lib/flipper/version.rb +1 -1
- data/spec/flipper/ui/actions/actors_gate_spec.rb +0 -4
- data/spec/flipper/ui/actions/feature_spec.rb +14 -16
- data/spec/flipper/ui/actions/features_spec.rb +1 -5
- data/spec/flipper/ui/actions/file_spec.rb +0 -10
- data/spec/flipper/ui/actions/groups_gate_spec.rb +0 -6
- data/spec/flipper/ui/actions/percentage_of_actors_gate_spec.rb +0 -2
- data/spec/flipper/ui/actions/percentage_of_time_gate_spec.rb +0 -2
- data/spec/flipper/ui/configuration_spec.rb +58 -34
- data/spec/flipper/ui/decorators/feature_spec.rb +0 -30
- metadata +11 -127
- data/docs/ui/images/configured-ui.png +0 -0
- data/docs/ui/images/environment-banner.png +0 -0
- data/lib/flipper/ui/assets/stylesheets/.DS_Store +0 -0
- data/lib/flipper/ui/assets/stylesheets/application.scss +0 -19
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_alert.scss +0 -51
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_badge.scss +0 -47
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_breadcrumb.scss +0 -38
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_button-group.scss +0 -166
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_buttons.scss +0 -143
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_card.scss +0 -270
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_carousel.scss +0 -191
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_close.scss +0 -34
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_code.scss +0 -56
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_custom-forms.scss +0 -297
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_dropdown.scss +0 -131
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_forms.scss +0 -333
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_functions.scss +0 -86
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_grid.scss +0 -52
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_images.scss +0 -42
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_input-group.scss +0 -159
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_jumbotron.scss +0 -16
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_list-group.scss +0 -115
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_media.scss +0 -8
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_mixins.scss +0 -42
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_modal.scss +0 -168
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_nav.scss +0 -118
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_navbar.scss +0 -311
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_pagination.scss +0 -77
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_popover.scss +0 -183
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_print.scss +0 -124
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_progress.scss +0 -33
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_reboot.scss +0 -482
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_root.scss +0 -19
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_tables.scss +0 -180
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_tooltip.scss +0 -115
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_transitions.scss +0 -36
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_type.scss +0 -125
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_utilities.scss +0 -14
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_variables.scss +0 -894
- data/lib/flipper/ui/assets/stylesheets/bootstrap/bootstrap-grid.scss +0 -32
- data/lib/flipper/ui/assets/stylesheets/bootstrap/bootstrap-reboot.scss +0 -12
- data/lib/flipper/ui/assets/stylesheets/bootstrap/bootstrap.scss +0 -42
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_alert.scss +0 -13
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_background-variant.scss +0 -21
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_badge.scss +0 -12
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_border-radius.scss +0 -35
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_box-shadow.scss +0 -5
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_breakpoints.scss +0 -123
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_buttons.scss +0 -109
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_caret.scss +0 -65
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_clearfix.scss +0 -7
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_float.scss +0 -11
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_forms.scss +0 -137
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_gradients.scss +0 -45
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_grid-framework.scss +0 -67
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_grid.scss +0 -52
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_hover.scss +0 -39
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_image.scss +0 -36
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_list-group.scss +0 -21
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_lists.scss +0 -7
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_nav-divider.scss +0 -10
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_navbar-align.scss +0 -10
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_pagination.scss +0 -22
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_reset-text.scss +0 -17
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_resize.scss +0 -6
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_screen-reader.scss +0 -35
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_size.scss +0 -6
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_table-row.scss +0 -30
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss +0 -14
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_text-hide.scss +0 -9
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_text-truncate.scss +0 -8
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_transition.scss +0 -9
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_visibility.scss +0 -7
- data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_align.scss +0 -8
- data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_background.scss +0 -19
- data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_borders.scss +0 -59
- data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_clearfix.scss +0 -3
- data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_display.scss +0 -38
- data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_embed.scss +0 -52
- data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_flex.scss +0 -46
- data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_float.scss +0 -9
- data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_position.scss +0 -36
- data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_screenreaders.scss +0 -11
- data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_sizing.scss +0 -12
- data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_spacing.scss +0 -51
- data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_text.scss +0 -52
- data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_visibility.scss +0 -11
- data/lib/flipper/ui/assets/stylesheets/primer/.scss-lint.yml +0 -446
- data/lib/flipper/ui/assets/stylesheets/primer/_alerts.scss +0 -106
- data/lib/flipper/ui/assets/stylesheets/primer/_avatars.scss +0 -36
- data/lib/flipper/ui/assets/stylesheets/primer/_base.scss +0 -40
- data/lib/flipper/ui/assets/stylesheets/primer/_blankslate.scss +0 -96
- data/lib/flipper/ui/assets/stylesheets/primer/_buttons.scss +0 -404
- data/lib/flipper/ui/assets/stylesheets/primer/_counter.scss +0 -10
- data/lib/flipper/ui/assets/stylesheets/primer/_filter-list.scss +0 -68
- data/lib/flipper/ui/assets/stylesheets/primer/_flex-table.scss +0 -20
- data/lib/flipper/ui/assets/stylesheets/primer/_forms.scss +0 -756
- data/lib/flipper/ui/assets/stylesheets/primer/_layout.scss +0 -69
- data/lib/flipper/ui/assets/stylesheets/primer/_menu.scss +0 -113
- data/lib/flipper/ui/assets/stylesheets/primer/_mixins.scss +0 -53
- data/lib/flipper/ui/assets/stylesheets/primer/_normalize.scss +0 -425
- data/lib/flipper/ui/assets/stylesheets/primer/_states.scss +0 -32
- data/lib/flipper/ui/assets/stylesheets/primer/_tabnav.scss +0 -65
- data/lib/flipper/ui/assets/stylesheets/primer/_tooltips.scss +0 -255
- data/lib/flipper/ui/assets/stylesheets/primer/_truncate.scss +0 -27
- data/lib/flipper/ui/assets/stylesheets/primer/_type.scss +0 -92
- data/lib/flipper/ui/assets/stylesheets/primer/_utility.scss +0 -73
- data/lib/flipper/ui/assets/stylesheets/primer/_variables.scss +0 -34
- data/lib/flipper/ui/assets/stylesheets/primer/primer.scss +0 -39
- data/lib/flipper/ui/public/fonts/bootstrap/glyphicons-halflings-regular.eot +0 -0
- data/lib/flipper/ui/public/fonts/bootstrap/glyphicons-halflings-regular.svg +0 -288
- data/lib/flipper/ui/public/fonts/bootstrap/glyphicons-halflings-regular.ttf +0 -0
- data/lib/flipper/ui/public/fonts/bootstrap/glyphicons-halflings-regular.woff +0 -0
- data/lib/flipper/ui/public/fonts/bootstrap/glyphicons-halflings-regular.woff2 +0 -0
- data/lib/flipper/ui/public/images/remove.png +0 -0
- data/lib/flipper/ui/public/octicons/octicons.less +0 -235
- data/lib/flipper/ui/public/octicons/sprockets-octicons.scss +0 -232
|
@@ -1,51 +1,62 @@
|
|
|
1
1
|
<% if @show_blank_slate %>
|
|
2
2
|
<div class="jumbotron text-center">
|
|
3
|
-
<span class="mega-octicon octicon-plus"></span>
|
|
4
|
-
<span class="mega-octicon octicon-list-unordered"></span>
|
|
5
|
-
<span class="mega-octicon octicon-zap"></span>
|
|
6
3
|
<% if Flipper::UI.configuration.fun %>
|
|
7
4
|
<h4>But I've got a blank space baby...</h4>
|
|
8
5
|
<p>And I'll flip your features.</p>
|
|
6
|
+
<%- if Flipper::UI.configuration.feature_creation_enabled -%>
|
|
7
|
+
<p>
|
|
8
|
+
<a class="btn btn-primary btn-sm" href="<%= script_name %>/features/new">Add Feature</a>
|
|
9
|
+
</p>
|
|
10
|
+
<%- end -%>
|
|
9
11
|
<div class="embed-responsive embed-responsive-16by9">
|
|
10
12
|
<iframe class="embed-responsive-item" width="560" height="315" src="https://www.youtube.com/embed/e-ORhEE9VVg" frameborder="0" allowfullscreen></iframe>
|
|
11
13
|
</div>
|
|
12
14
|
<% else %>
|
|
13
|
-
<h4>
|
|
14
|
-
<p>
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
<h4>Getting Started</h4>
|
|
16
|
+
<p class="mb-1">You have not added any features to configure yet.</p>
|
|
17
|
+
<%- if Flipper::UI.configuration.feature_creation_enabled -%>
|
|
18
|
+
<p class="mt-2">
|
|
19
|
+
<a class="btn btn-primary btn-sm" href="<%= script_name %>/features/new">Add Feature</a>
|
|
20
|
+
</p>
|
|
21
|
+
<% else %>
|
|
22
|
+
<p>
|
|
23
|
+
Check the <a href="https://github.com/jnunemaker/flipper#examples">examples</a> to
|
|
24
|
+
learn how to add one.
|
|
25
|
+
</p>
|
|
26
|
+
<%- end -%>
|
|
18
27
|
<% end %>
|
|
19
28
|
</div>
|
|
20
29
|
<% else %>
|
|
21
30
|
<div class="card">
|
|
22
|
-
<
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
31
|
+
<div class="card-header">
|
|
32
|
+
<%- if Flipper::UI.configuration.feature_creation_enabled -%>
|
|
33
|
+
<div class="float-right">
|
|
34
|
+
<a class="btn btn-primary btn-sm" href="<%= script_name %>/features/new">Add Feature</a>
|
|
35
|
+
</div>
|
|
36
|
+
<%- end -%>
|
|
37
|
+
<h4 class="m-0">Features</h4>
|
|
38
|
+
</div>
|
|
39
|
+
<div class="card-body py-0">
|
|
40
|
+
<% @features.each do |feature| %>
|
|
41
|
+
<div class="feature row align-items-center mt-0 px-3 border-bottom">
|
|
42
|
+
<div class="col-1 col-md-auto">
|
|
43
|
+
<span class="octicon octicon-squirrel <%= feature.color_class %>" data-toggle="tooltip" title=<%= feature.state.to_s.capitalize %>></span>
|
|
44
|
+
</div>
|
|
45
|
+
<div class="col-10">
|
|
46
|
+
<a href="<%= "#{script_name}/features/#{feature.key}" %>" class="d-block px-0 py-3 btn text-left text-dark">
|
|
47
|
+
<div class="text-truncate" style="font-weight: 500"><%= feature.key %></div>
|
|
48
|
+
<% if Flipper::UI.configuration.show_feature_description_in_list? && Flipper::UI::Util.present?(feature.description) %>
|
|
49
|
+
<div class="text-muted font-weight-light" style="line-height: 1.4; white-space: initial; padding: 8px 0">
|
|
50
|
+
<%= feature.description %>
|
|
51
|
+
</div>
|
|
52
|
+
<% end %>
|
|
53
|
+
<div class="text-muted text-truncate">
|
|
54
|
+
<%== feature.gates_in_words %>
|
|
55
|
+
</div>
|
|
56
|
+
</a>
|
|
57
|
+
</div>
|
|
58
|
+
</div>
|
|
59
|
+
<% end %>
|
|
60
|
+
</div>
|
|
50
61
|
</div>
|
|
51
62
|
<% end %>
|
|
@@ -6,17 +6,12 @@
|
|
|
6
6
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
|
7
7
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
8
8
|
|
|
9
|
+
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
|
|
9
10
|
<link rel="stylesheet" href="<%= script_name %>/octicons/octicons.css">
|
|
10
11
|
<link rel="stylesheet" href="<%= script_name %>/css/application.css">
|
|
11
|
-
|
|
12
|
-
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
|
|
13
|
-
<!--[if lt IE 9]>
|
|
14
|
-
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
|
|
15
|
-
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
|
|
16
|
-
<![endif]-->
|
|
17
12
|
</head>
|
|
18
|
-
<body>
|
|
19
|
-
<div class="container">
|
|
13
|
+
<body class="py-4">
|
|
14
|
+
<div class="container mw-600">
|
|
20
15
|
<%- unless Flipper::UI.configuration.banner_text.nil? -%>
|
|
21
16
|
<div class="alert alert-<%= Flipper::UI.configuration.banner_class %> text-center font-weight-bold">
|
|
22
17
|
<%= Flipper::UI.configuration.banner_text %>
|
|
@@ -24,7 +19,7 @@
|
|
|
24
19
|
<%- end -%>
|
|
25
20
|
|
|
26
21
|
<nav aria-label="breadcrumb">
|
|
27
|
-
<ol class="breadcrumb bg-white border
|
|
22
|
+
<ol class="breadcrumb bg-white border align-items-center mb-4">
|
|
28
23
|
<% @breadcrumbs.each do |breadcrumb| %>
|
|
29
24
|
<li class="breadcrumb-item <% if breadcrumb.active? %>active<% end %>">
|
|
30
25
|
<% if breadcrumb.active? %>
|
|
@@ -34,11 +29,6 @@
|
|
|
34
29
|
<% end %>
|
|
35
30
|
</li>
|
|
36
31
|
<% end %>
|
|
37
|
-
<li class="ml-auto">
|
|
38
|
-
<%- if Flipper::UI.configuration.feature_creation_enabled -%>
|
|
39
|
-
<a class="btn btn-sm btn-light" href="<%= script_name %>/features/new">Add Feature</a>
|
|
40
|
-
<%- end -%>
|
|
41
|
-
</li>
|
|
42
32
|
</ol>
|
|
43
33
|
</nav>
|
|
44
34
|
|
data/lib/flipper/version.rb
CHANGED
|
@@ -73,23 +73,19 @@ RSpec.describe Flipper::UI::Actions::ActorsGate do
|
|
|
73
73
|
context 'empty value' do
|
|
74
74
|
let(:value) { '' }
|
|
75
75
|
|
|
76
|
-
# rubocop:disable Metrics/LineLength
|
|
77
76
|
it 'redirects back to feature' do
|
|
78
77
|
expect(last_response.status).to be(302)
|
|
79
78
|
expect(last_response.headers['Location']).to eq('/features/search/actors?error=%22%22+is+not+a+valid+actor+value.')
|
|
80
79
|
end
|
|
81
|
-
# rubocop:enable Metrics/LineLength
|
|
82
80
|
end
|
|
83
81
|
|
|
84
82
|
context 'nil value' do
|
|
85
83
|
let(:value) { nil }
|
|
86
84
|
|
|
87
|
-
# rubocop:disable Metrics/LineLength
|
|
88
85
|
it 'redirects back to feature' do
|
|
89
86
|
expect(last_response.status).to be(302)
|
|
90
87
|
expect(last_response.headers['Location']).to eq('/features/search/actors?error=%22%22+is+not+a+valid+actor+value.')
|
|
91
88
|
end
|
|
92
|
-
# rubocop:enable Metrics/LineLength
|
|
93
89
|
end
|
|
94
90
|
end
|
|
95
91
|
end
|
|
@@ -70,6 +70,15 @@ RSpec.describe Flipper::UI::Actions::Feature do
|
|
|
70
70
|
|
|
71
71
|
describe 'GET /features/:feature' do
|
|
72
72
|
before do
|
|
73
|
+
Flipper::UI.configure do |config|
|
|
74
|
+
config.descriptions_source = lambda { |_keys|
|
|
75
|
+
{
|
|
76
|
+
"stats" => "Most awesome stats",
|
|
77
|
+
"search" => "Most in-depth search",
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
end
|
|
81
|
+
|
|
73
82
|
get '/features/search'
|
|
74
83
|
end
|
|
75
84
|
|
|
@@ -81,10 +90,11 @@ RSpec.describe Flipper::UI::Actions::Feature do
|
|
|
81
90
|
expect(last_response.body).to include('search')
|
|
82
91
|
expect(last_response.body).to include('Enable')
|
|
83
92
|
expect(last_response.body).to include('Disable')
|
|
84
|
-
expect(last_response.body).to include('
|
|
85
|
-
expect(last_response.body).to include('
|
|
86
|
-
expect(last_response.body).to include('
|
|
87
|
-
expect(last_response.body).to include('
|
|
93
|
+
expect(last_response.body).to include('No actors enabled')
|
|
94
|
+
expect(last_response.body).to include('No groups enabled')
|
|
95
|
+
expect(last_response.body).to include('Enabled for 0% of time')
|
|
96
|
+
expect(last_response.body).to include('Enabled for 0% of actors')
|
|
97
|
+
expect(last_response.body).to include('Most in-depth search')
|
|
88
98
|
end
|
|
89
99
|
end
|
|
90
100
|
|
|
@@ -99,12 +109,6 @@ RSpec.describe Flipper::UI::Actions::Feature do
|
|
|
99
109
|
|
|
100
110
|
it 'renders template' do
|
|
101
111
|
expect(last_response.body).to include('search_features')
|
|
102
|
-
expect(last_response.body).to include('Enable')
|
|
103
|
-
expect(last_response.body).to include('Disable')
|
|
104
|
-
expect(last_response.body).to include('Actors')
|
|
105
|
-
expect(last_response.body).to include('Groups')
|
|
106
|
-
expect(last_response.body).to include('Percentage of Time')
|
|
107
|
-
expect(last_response.body).to include('Percentage of Actors')
|
|
108
112
|
end
|
|
109
113
|
end
|
|
110
114
|
|
|
@@ -119,12 +123,6 @@ RSpec.describe Flipper::UI::Actions::Feature do
|
|
|
119
123
|
|
|
120
124
|
it 'renders template' do
|
|
121
125
|
expect(last_response.body).to include('a/b')
|
|
122
|
-
expect(last_response.body).to include('Enable')
|
|
123
|
-
expect(last_response.body).to include('Disable')
|
|
124
|
-
expect(last_response.body).to include('Actors')
|
|
125
|
-
expect(last_response.body).to include('Groups')
|
|
126
|
-
expect(last_response.body).to include('Percentage of Time')
|
|
127
|
-
expect(last_response.body).to include('Percentage of Actors')
|
|
128
126
|
end
|
|
129
127
|
end
|
|
130
128
|
end
|
|
@@ -62,7 +62,7 @@ RSpec.describe Flipper::UI::Actions::Features do
|
|
|
62
62
|
end
|
|
63
63
|
|
|
64
64
|
it 'renders template' do
|
|
65
|
-
expect(last_response.body).to include('
|
|
65
|
+
expect(last_response.body).to include('You have not added any features to configure yet.')
|
|
66
66
|
end
|
|
67
67
|
end
|
|
68
68
|
end
|
|
@@ -111,12 +111,10 @@ RSpec.describe Flipper::UI::Actions::Features do
|
|
|
111
111
|
expect(flipper.features.map(&:key)).to eq([])
|
|
112
112
|
end
|
|
113
113
|
|
|
114
|
-
# rubocop:disable Metrics/LineLength
|
|
115
114
|
it 'redirects back to feature' do
|
|
116
115
|
expect(last_response.status).to be(302)
|
|
117
116
|
expect(last_response.headers['Location']).to eq('/features/new?error=%22%22+is+not+a+valid+feature+name.')
|
|
118
117
|
end
|
|
119
|
-
# rubocop:enable Metrics/LineLength
|
|
120
118
|
end
|
|
121
119
|
|
|
122
120
|
context 'nil feature name' do
|
|
@@ -126,12 +124,10 @@ RSpec.describe Flipper::UI::Actions::Features do
|
|
|
126
124
|
expect(flipper.features.map(&:key)).to eq([])
|
|
127
125
|
end
|
|
128
126
|
|
|
129
|
-
# rubocop:disable Metrics/LineLength
|
|
130
127
|
it 'redirects back to feature' do
|
|
131
128
|
expect(last_response.status).to be(302)
|
|
132
129
|
expect(last_response.headers['Location']).to eq('/features/new?error=%22%22+is+not+a+valid+feature+name.')
|
|
133
130
|
end
|
|
134
|
-
# rubocop:enable Metrics/LineLength
|
|
135
131
|
end
|
|
136
132
|
end
|
|
137
133
|
end
|
|
@@ -21,16 +21,6 @@ RSpec.describe Flipper::UI::Actions::File do
|
|
|
21
21
|
end
|
|
22
22
|
end
|
|
23
23
|
|
|
24
|
-
describe 'GET /fonts/bootstrap/glyphicons-halflings-regular.eot' do
|
|
25
|
-
before do
|
|
26
|
-
get '/fonts/bootstrap/glyphicons-halflings-regular.eot'
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
it 'responds with 200' do
|
|
30
|
-
expect(last_response.status).to be(200)
|
|
31
|
-
end
|
|
32
|
-
end
|
|
33
|
-
|
|
34
24
|
describe 'GET /octicons/octicons.eot' do
|
|
35
25
|
before do
|
|
36
26
|
get '/octicons/octicons.eot'
|
|
@@ -72,34 +72,28 @@ RSpec.describe Flipper::UI::Actions::GroupsGate do
|
|
|
72
72
|
context 'unknown group name' do
|
|
73
73
|
let(:group_name) { 'not_here' }
|
|
74
74
|
|
|
75
|
-
# rubocop:disable Metrics/LineLength
|
|
76
75
|
it 'redirects back to feature' do
|
|
77
76
|
expect(last_response.status).to be(302)
|
|
78
77
|
expect(last_response.headers['Location']).to eq('/features/search/groups?error=The+group+named+%22not_here%22+has+not+been+registered.')
|
|
79
78
|
end
|
|
80
|
-
# rubocop:enable Metrics/LineLength
|
|
81
79
|
end
|
|
82
80
|
|
|
83
81
|
context 'empty group name' do
|
|
84
82
|
let(:group_name) { '' }
|
|
85
83
|
|
|
86
|
-
# rubocop:disable Metrics/LineLength
|
|
87
84
|
it 'redirects back to feature' do
|
|
88
85
|
expect(last_response.status).to be(302)
|
|
89
86
|
expect(last_response.headers['Location']).to eq('/features/search/groups?error=The+group+named+%22%22+has+not+been+registered.')
|
|
90
87
|
end
|
|
91
|
-
# rubocop:enable Metrics/LineLength
|
|
92
88
|
end
|
|
93
89
|
|
|
94
90
|
context 'nil group name' do
|
|
95
91
|
let(:group_name) { nil }
|
|
96
92
|
|
|
97
|
-
# rubocop:disable Metrics/LineLength
|
|
98
93
|
it 'redirects back to feature' do
|
|
99
94
|
expect(last_response.status).to be(302)
|
|
100
95
|
expect(last_response.headers['Location']).to eq('/features/search/groups?error=The+group+named+%22%22+has+not+been+registered.')
|
|
101
96
|
end
|
|
102
|
-
# rubocop:enable Metrics/LineLength
|
|
103
97
|
end
|
|
104
98
|
end
|
|
105
99
|
end
|
|
@@ -41,12 +41,10 @@ RSpec.describe Flipper::UI::Actions::PercentageOfActorsGate do
|
|
|
41
41
|
expect(flipper[:search].percentage_of_actors_value).to be(0)
|
|
42
42
|
end
|
|
43
43
|
|
|
44
|
-
# rubocop:disable Metrics/LineLength
|
|
45
44
|
it 'redirects back to feature' do
|
|
46
45
|
expect(last_response.status).to be(302)
|
|
47
46
|
expect(last_response.headers['Location']).to eq('/features/search?error=Invalid+percentage+of+actors+value%3A+value+must+be+a+positive+number+less+than+or+equal+to+100%2C+but+was+555')
|
|
48
47
|
end
|
|
49
|
-
# rubocop:enable Metrics/LineLength
|
|
50
48
|
end
|
|
51
49
|
end
|
|
52
50
|
end
|
|
@@ -41,12 +41,10 @@ RSpec.describe Flipper::UI::Actions::PercentageOfTimeGate do
|
|
|
41
41
|
expect(flipper[:search].percentage_of_time_value).to be(0)
|
|
42
42
|
end
|
|
43
43
|
|
|
44
|
-
# rubocop:disable Metrics/LineLength
|
|
45
44
|
it 'redirects back to feature' do
|
|
46
45
|
expect(last_response.status).to be(302)
|
|
47
46
|
expect(last_response.headers['Location']).to eq('/features/search?error=Invalid+percentage+of+time+value%3A+value+must+be+a+positive+number+less+than+or+equal+to+100%2C+but+was+555')
|
|
48
47
|
end
|
|
49
|
-
# rubocop:enable Metrics/LineLength
|
|
50
48
|
end
|
|
51
49
|
end
|
|
52
50
|
end
|
|
@@ -3,43 +3,10 @@ require 'helper'
|
|
|
3
3
|
RSpec.describe Flipper::UI::Configuration do
|
|
4
4
|
let(:configuration) { described_class.new }
|
|
5
5
|
|
|
6
|
-
describe "#actors" do
|
|
7
|
-
it "has default text" do
|
|
8
|
-
expect(configuration.actors.title).to eq("Actors")
|
|
9
|
-
expect(configuration.actors.description).to eq("Enable actors using the form above.")
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
it "can be updated" do
|
|
13
|
-
configuration.actors.title = "Actors Section"
|
|
14
|
-
expect(configuration.actors.title).to eq("Actors Section")
|
|
15
|
-
end
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
describe "#groups" do
|
|
19
|
-
it "has default text" do
|
|
20
|
-
expect(configuration.groups.title).to eq("Groups")
|
|
21
|
-
expect(configuration.groups.description).to eq("Enable groups using the form above.")
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
describe "#percentage_of_actors" do
|
|
26
|
-
it "has default text" do
|
|
27
|
-
expect(configuration.percentage_of_actors.title).to eq("Percentage of Actors")
|
|
28
|
-
expect(configuration.percentage_of_actors.description).to eq("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.") # rubocop:disable Metrics/LineLength
|
|
29
|
-
end
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
describe "#percentage_of_time" do
|
|
33
|
-
it "has default text" do
|
|
34
|
-
expect(configuration.percentage_of_time.title).to eq("Percentage of Time")
|
|
35
|
-
expect(configuration.percentage_of_time.description).to eq("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.") # rubocop:disable Metrics/LineLength
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
|
|
39
6
|
describe "#delete" do
|
|
40
7
|
it "has default text" do
|
|
41
8
|
expect(configuration.delete.title).to eq("Danger Zone")
|
|
42
|
-
expect(configuration.delete.description).to eq("Deleting a feature removes it from the list of features and disables it for everyone.")
|
|
9
|
+
expect(configuration.delete.description).to eq("Deleting a feature removes it from the list of features and disables it for everyone.")
|
|
43
10
|
end
|
|
44
11
|
end
|
|
45
12
|
|
|
@@ -113,4 +80,61 @@ RSpec.describe Flipper::UI::Configuration do
|
|
|
113
80
|
expect(configuration.fun).to eq(false)
|
|
114
81
|
end
|
|
115
82
|
end
|
|
83
|
+
|
|
84
|
+
describe "#descriptions_source" do
|
|
85
|
+
it "has default value" do
|
|
86
|
+
expect(configuration.descriptions_source.call(%w[foo bar])).to eq({})
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
context "descriptions source is provided" do
|
|
90
|
+
it "can be updated" do
|
|
91
|
+
configuration.descriptions_source = lambda do |_keys|
|
|
92
|
+
YAML.load_file(FlipperRoot.join('spec/support/descriptions.yml'))
|
|
93
|
+
end
|
|
94
|
+
keys = %w[some_awesome_feature foo]
|
|
95
|
+
result = configuration.descriptions_source.call(keys)
|
|
96
|
+
expected = {
|
|
97
|
+
"some_awesome_feature" => "Awesome feature description",
|
|
98
|
+
}
|
|
99
|
+
expect(result).to eq(expected)
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
describe "#show_feature_description_in_list" do
|
|
105
|
+
it "has default value" do
|
|
106
|
+
expect(configuration.show_feature_description_in_list).to eq(false)
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
it "can be updated" do
|
|
110
|
+
configuration.show_feature_description_in_list = true
|
|
111
|
+
expect(configuration.show_feature_description_in_list).to eq(true)
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
describe "#show_feature_description_in_list?" do
|
|
116
|
+
subject { configuration.show_feature_description_in_list? }
|
|
117
|
+
|
|
118
|
+
context 'when using_descriptions? is false and show_feature_description_in_list is false' do
|
|
119
|
+
it { is_expected.to eq(false) }
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
context 'when using_descriptions? is false and show_feature_description_in_list is true' do
|
|
123
|
+
before { configuration.show_feature_description_in_list = true }
|
|
124
|
+
it { is_expected.to eq(false) }
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
context 'when using_descriptions? is true and show_feature_description_in_list is false' do
|
|
128
|
+
before { allow(configuration).to receive(:using_descriptions?).and_return(true) }
|
|
129
|
+
it { is_expected.to eq(false) }
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
context 'when using_descriptions? is true and show_feature_description_in_list is true' do
|
|
133
|
+
before do
|
|
134
|
+
allow(configuration).to receive(:using_descriptions?).and_return(true)
|
|
135
|
+
configuration.show_feature_description_in_list = true
|
|
136
|
+
end
|
|
137
|
+
it { is_expected.to eq(true) }
|
|
138
|
+
end
|
|
139
|
+
end
|
|
116
140
|
end
|