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.
Files changed (153) hide show
  1. checksums.yaml +4 -4
  2. data/docs/ui/README.md +31 -22
  3. data/docs/ui/images/banner.png +0 -0
  4. data/docs/ui/images/description.png +0 -0
  5. data/docs/ui/images/feature.png +0 -0
  6. data/docs/ui/images/features.png +0 -0
  7. data/examples/ui/basic.ru +20 -0
  8. data/flipper-ui.gemspec +3 -4
  9. data/lib/flipper/ui.rb +0 -3
  10. data/lib/flipper/ui/action.rb +2 -1
  11. data/lib/flipper/ui/actions/feature.rb +5 -2
  12. data/lib/flipper/ui/actions/features.rb +14 -1
  13. data/lib/flipper/ui/actions/file.rb +1 -1
  14. data/lib/flipper/ui/assets/javascripts/application.coffee +5 -3
  15. data/lib/flipper/ui/configuration.rb +23 -10
  16. data/lib/flipper/ui/decorators/feature.rb +39 -13
  17. data/lib/flipper/ui/public/css/application.css +20 -6493
  18. data/lib/flipper/ui/public/js/application.js +5 -5
  19. data/lib/flipper/ui/util.rb +40 -0
  20. data/lib/flipper/ui/views/add_actor.erb +1 -1
  21. data/lib/flipper/ui/views/add_feature.erb +1 -1
  22. data/lib/flipper/ui/views/add_group.erb +1 -1
  23. data/lib/flipper/ui/views/feature.erb +198 -179
  24. data/lib/flipper/ui/views/features.erb +47 -36
  25. data/lib/flipper/ui/views/layout.erb +4 -14
  26. data/lib/flipper/version.rb +1 -1
  27. data/spec/flipper/ui/actions/actors_gate_spec.rb +0 -4
  28. data/spec/flipper/ui/actions/feature_spec.rb +14 -16
  29. data/spec/flipper/ui/actions/features_spec.rb +1 -5
  30. data/spec/flipper/ui/actions/file_spec.rb +0 -10
  31. data/spec/flipper/ui/actions/groups_gate_spec.rb +0 -6
  32. data/spec/flipper/ui/actions/percentage_of_actors_gate_spec.rb +0 -2
  33. data/spec/flipper/ui/actions/percentage_of_time_gate_spec.rb +0 -2
  34. data/spec/flipper/ui/configuration_spec.rb +58 -34
  35. data/spec/flipper/ui/decorators/feature_spec.rb +0 -30
  36. metadata +11 -127
  37. data/docs/ui/images/configured-ui.png +0 -0
  38. data/docs/ui/images/environment-banner.png +0 -0
  39. data/lib/flipper/ui/assets/stylesheets/.DS_Store +0 -0
  40. data/lib/flipper/ui/assets/stylesheets/application.scss +0 -19
  41. data/lib/flipper/ui/assets/stylesheets/bootstrap/_alert.scss +0 -51
  42. data/lib/flipper/ui/assets/stylesheets/bootstrap/_badge.scss +0 -47
  43. data/lib/flipper/ui/assets/stylesheets/bootstrap/_breadcrumb.scss +0 -38
  44. data/lib/flipper/ui/assets/stylesheets/bootstrap/_button-group.scss +0 -166
  45. data/lib/flipper/ui/assets/stylesheets/bootstrap/_buttons.scss +0 -143
  46. data/lib/flipper/ui/assets/stylesheets/bootstrap/_card.scss +0 -270
  47. data/lib/flipper/ui/assets/stylesheets/bootstrap/_carousel.scss +0 -191
  48. data/lib/flipper/ui/assets/stylesheets/bootstrap/_close.scss +0 -34
  49. data/lib/flipper/ui/assets/stylesheets/bootstrap/_code.scss +0 -56
  50. data/lib/flipper/ui/assets/stylesheets/bootstrap/_custom-forms.scss +0 -297
  51. data/lib/flipper/ui/assets/stylesheets/bootstrap/_dropdown.scss +0 -131
  52. data/lib/flipper/ui/assets/stylesheets/bootstrap/_forms.scss +0 -333
  53. data/lib/flipper/ui/assets/stylesheets/bootstrap/_functions.scss +0 -86
  54. data/lib/flipper/ui/assets/stylesheets/bootstrap/_grid.scss +0 -52
  55. data/lib/flipper/ui/assets/stylesheets/bootstrap/_images.scss +0 -42
  56. data/lib/flipper/ui/assets/stylesheets/bootstrap/_input-group.scss +0 -159
  57. data/lib/flipper/ui/assets/stylesheets/bootstrap/_jumbotron.scss +0 -16
  58. data/lib/flipper/ui/assets/stylesheets/bootstrap/_list-group.scss +0 -115
  59. data/lib/flipper/ui/assets/stylesheets/bootstrap/_media.scss +0 -8
  60. data/lib/flipper/ui/assets/stylesheets/bootstrap/_mixins.scss +0 -42
  61. data/lib/flipper/ui/assets/stylesheets/bootstrap/_modal.scss +0 -168
  62. data/lib/flipper/ui/assets/stylesheets/bootstrap/_nav.scss +0 -118
  63. data/lib/flipper/ui/assets/stylesheets/bootstrap/_navbar.scss +0 -311
  64. data/lib/flipper/ui/assets/stylesheets/bootstrap/_pagination.scss +0 -77
  65. data/lib/flipper/ui/assets/stylesheets/bootstrap/_popover.scss +0 -183
  66. data/lib/flipper/ui/assets/stylesheets/bootstrap/_print.scss +0 -124
  67. data/lib/flipper/ui/assets/stylesheets/bootstrap/_progress.scss +0 -33
  68. data/lib/flipper/ui/assets/stylesheets/bootstrap/_reboot.scss +0 -482
  69. data/lib/flipper/ui/assets/stylesheets/bootstrap/_root.scss +0 -19
  70. data/lib/flipper/ui/assets/stylesheets/bootstrap/_tables.scss +0 -180
  71. data/lib/flipper/ui/assets/stylesheets/bootstrap/_tooltip.scss +0 -115
  72. data/lib/flipper/ui/assets/stylesheets/bootstrap/_transitions.scss +0 -36
  73. data/lib/flipper/ui/assets/stylesheets/bootstrap/_type.scss +0 -125
  74. data/lib/flipper/ui/assets/stylesheets/bootstrap/_utilities.scss +0 -14
  75. data/lib/flipper/ui/assets/stylesheets/bootstrap/_variables.scss +0 -894
  76. data/lib/flipper/ui/assets/stylesheets/bootstrap/bootstrap-grid.scss +0 -32
  77. data/lib/flipper/ui/assets/stylesheets/bootstrap/bootstrap-reboot.scss +0 -12
  78. data/lib/flipper/ui/assets/stylesheets/bootstrap/bootstrap.scss +0 -42
  79. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_alert.scss +0 -13
  80. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_background-variant.scss +0 -21
  81. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_badge.scss +0 -12
  82. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_border-radius.scss +0 -35
  83. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_box-shadow.scss +0 -5
  84. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_breakpoints.scss +0 -123
  85. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_buttons.scss +0 -109
  86. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_caret.scss +0 -65
  87. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_clearfix.scss +0 -7
  88. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_float.scss +0 -11
  89. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_forms.scss +0 -137
  90. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_gradients.scss +0 -45
  91. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_grid-framework.scss +0 -67
  92. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_grid.scss +0 -52
  93. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_hover.scss +0 -39
  94. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_image.scss +0 -36
  95. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_list-group.scss +0 -21
  96. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_lists.scss +0 -7
  97. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_nav-divider.scss +0 -10
  98. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_navbar-align.scss +0 -10
  99. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_pagination.scss +0 -22
  100. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_reset-text.scss +0 -17
  101. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_resize.scss +0 -6
  102. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_screen-reader.scss +0 -35
  103. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_size.scss +0 -6
  104. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_table-row.scss +0 -30
  105. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss +0 -14
  106. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_text-hide.scss +0 -9
  107. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_text-truncate.scss +0 -8
  108. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_transition.scss +0 -9
  109. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_visibility.scss +0 -7
  110. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_align.scss +0 -8
  111. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_background.scss +0 -19
  112. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_borders.scss +0 -59
  113. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_clearfix.scss +0 -3
  114. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_display.scss +0 -38
  115. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_embed.scss +0 -52
  116. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_flex.scss +0 -46
  117. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_float.scss +0 -9
  118. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_position.scss +0 -36
  119. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_screenreaders.scss +0 -11
  120. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_sizing.scss +0 -12
  121. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_spacing.scss +0 -51
  122. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_text.scss +0 -52
  123. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_visibility.scss +0 -11
  124. data/lib/flipper/ui/assets/stylesheets/primer/.scss-lint.yml +0 -446
  125. data/lib/flipper/ui/assets/stylesheets/primer/_alerts.scss +0 -106
  126. data/lib/flipper/ui/assets/stylesheets/primer/_avatars.scss +0 -36
  127. data/lib/flipper/ui/assets/stylesheets/primer/_base.scss +0 -40
  128. data/lib/flipper/ui/assets/stylesheets/primer/_blankslate.scss +0 -96
  129. data/lib/flipper/ui/assets/stylesheets/primer/_buttons.scss +0 -404
  130. data/lib/flipper/ui/assets/stylesheets/primer/_counter.scss +0 -10
  131. data/lib/flipper/ui/assets/stylesheets/primer/_filter-list.scss +0 -68
  132. data/lib/flipper/ui/assets/stylesheets/primer/_flex-table.scss +0 -20
  133. data/lib/flipper/ui/assets/stylesheets/primer/_forms.scss +0 -756
  134. data/lib/flipper/ui/assets/stylesheets/primer/_layout.scss +0 -69
  135. data/lib/flipper/ui/assets/stylesheets/primer/_menu.scss +0 -113
  136. data/lib/flipper/ui/assets/stylesheets/primer/_mixins.scss +0 -53
  137. data/lib/flipper/ui/assets/stylesheets/primer/_normalize.scss +0 -425
  138. data/lib/flipper/ui/assets/stylesheets/primer/_states.scss +0 -32
  139. data/lib/flipper/ui/assets/stylesheets/primer/_tabnav.scss +0 -65
  140. data/lib/flipper/ui/assets/stylesheets/primer/_tooltips.scss +0 -255
  141. data/lib/flipper/ui/assets/stylesheets/primer/_truncate.scss +0 -27
  142. data/lib/flipper/ui/assets/stylesheets/primer/_type.scss +0 -92
  143. data/lib/flipper/ui/assets/stylesheets/primer/_utility.scss +0 -73
  144. data/lib/flipper/ui/assets/stylesheets/primer/_variables.scss +0 -34
  145. data/lib/flipper/ui/assets/stylesheets/primer/primer.scss +0 -39
  146. data/lib/flipper/ui/public/fonts/bootstrap/glyphicons-halflings-regular.eot +0 -0
  147. data/lib/flipper/ui/public/fonts/bootstrap/glyphicons-halflings-regular.svg +0 -288
  148. data/lib/flipper/ui/public/fonts/bootstrap/glyphicons-halflings-regular.ttf +0 -0
  149. data/lib/flipper/ui/public/fonts/bootstrap/glyphicons-halflings-regular.woff +0 -0
  150. data/lib/flipper/ui/public/fonts/bootstrap/glyphicons-halflings-regular.woff2 +0 -0
  151. data/lib/flipper/ui/public/images/remove.png +0 -0
  152. data/lib/flipper/ui/public/octicons/octicons.less +0 -235
  153. 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>There aren't any features to configure.</h4>
14
- <p>
15
- Check the <a href="https://github.com/jnunemaker/flipper#examples">examples</a> to
16
- learn how to add one.
17
- </p>
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
- <h4 class="card-header">Features</h4>
23
- <table class="table">
24
- <thead>
25
- <tr class="d-flex">
26
- <th class="col-1">
27
- <span class="octicon octicon-squirrel"></span>
28
- </th>
29
- <th class="col">Feature</th>
30
- <th class="col">Enabled Gates</th>
31
- </tr>
32
- </thead>
33
- <tbody>
34
- <% @features.each do |feature| %>
35
- <tr class="d-flex">
36
- <td class="col-1">
37
- <span class="octicon octicon-squirrel <%= feature.color_class %>"></span>
38
- </td>
39
- <td class="col">
40
- <a href="<%= "#{script_name}/features/#{feature.key}" %>">
41
- <%= feature.key %></a>
42
- </td>
43
- <td class="col">
44
- <%= feature.pretty_enabled_gate_names %>
45
- </td>
46
- </tr>
47
- <% end %>
48
- </tbody>
49
- </table>
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 border-light align-items-center">
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
 
@@ -1,3 +1,3 @@
1
1
  module Flipper
2
- VERSION = '0.17.1'.freeze
2
+ VERSION = '0.20.0.beta1'.freeze
3
3
  end
@@ -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('Actors')
85
- expect(last_response.body).to include('Groups')
86
- expect(last_response.body).to include('Percentage of Time')
87
- expect(last_response.body).to include('Percentage of Actors')
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('There aren\'t any features to configure.')
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.") # rubocop:disable Metrics/LineLength
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