flipper-ui 0.17.2 → 0.18.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (147) hide show
  1. checksums.yaml +4 -4
  2. data/docs/ui/README.md +15 -5
  3. data/examples/ui/basic.ru +19 -0
  4. data/flipper-ui.gemspec +1 -2
  5. data/lib/flipper/ui.rb +0 -3
  6. data/lib/flipper/ui/action.rb +2 -1
  7. data/lib/flipper/ui/actions/feature.rb +5 -2
  8. data/lib/flipper/ui/actions/features.rb +1 -0
  9. data/lib/flipper/ui/actions/file.rb +1 -1
  10. data/lib/flipper/ui/assets/javascripts/application.coffee +5 -3
  11. data/lib/flipper/ui/configuration.rb +14 -10
  12. data/lib/flipper/ui/decorators/feature.rb +39 -13
  13. data/lib/flipper/ui/public/css/application.css +20 -6493
  14. data/lib/flipper/ui/public/js/application.js +5 -5
  15. data/lib/flipper/ui/util.rb +40 -0
  16. data/lib/flipper/ui/views/add_actor.erb +1 -1
  17. data/lib/flipper/ui/views/add_feature.erb +1 -1
  18. data/lib/flipper/ui/views/add_group.erb +1 -1
  19. data/lib/flipper/ui/views/feature.erb +198 -179
  20. data/lib/flipper/ui/views/features.erb +42 -36
  21. data/lib/flipper/ui/views/layout.erb +4 -14
  22. data/lib/flipper/version.rb +1 -1
  23. data/spec/flipper/ui/actions/actors_gate_spec.rb +0 -4
  24. data/spec/flipper/ui/actions/feature_spec.rb +14 -16
  25. data/spec/flipper/ui/actions/features_spec.rb +1 -5
  26. data/spec/flipper/ui/actions/file_spec.rb +0 -10
  27. data/spec/flipper/ui/actions/groups_gate_spec.rb +0 -6
  28. data/spec/flipper/ui/actions/percentage_of_actors_gate_spec.rb +0 -2
  29. data/spec/flipper/ui/actions/percentage_of_time_gate_spec.rb +0 -2
  30. data/spec/flipper/ui/configuration_spec.rb +21 -34
  31. data/spec/flipper/ui/decorators/feature_spec.rb +0 -30
  32. metadata +5 -121
  33. data/lib/flipper/ui/assets/stylesheets/.DS_Store +0 -0
  34. data/lib/flipper/ui/assets/stylesheets/application.scss +0 -19
  35. data/lib/flipper/ui/assets/stylesheets/bootstrap/_alert.scss +0 -51
  36. data/lib/flipper/ui/assets/stylesheets/bootstrap/_badge.scss +0 -47
  37. data/lib/flipper/ui/assets/stylesheets/bootstrap/_breadcrumb.scss +0 -38
  38. data/lib/flipper/ui/assets/stylesheets/bootstrap/_button-group.scss +0 -166
  39. data/lib/flipper/ui/assets/stylesheets/bootstrap/_buttons.scss +0 -143
  40. data/lib/flipper/ui/assets/stylesheets/bootstrap/_card.scss +0 -270
  41. data/lib/flipper/ui/assets/stylesheets/bootstrap/_carousel.scss +0 -191
  42. data/lib/flipper/ui/assets/stylesheets/bootstrap/_close.scss +0 -34
  43. data/lib/flipper/ui/assets/stylesheets/bootstrap/_code.scss +0 -56
  44. data/lib/flipper/ui/assets/stylesheets/bootstrap/_custom-forms.scss +0 -297
  45. data/lib/flipper/ui/assets/stylesheets/bootstrap/_dropdown.scss +0 -131
  46. data/lib/flipper/ui/assets/stylesheets/bootstrap/_forms.scss +0 -333
  47. data/lib/flipper/ui/assets/stylesheets/bootstrap/_functions.scss +0 -86
  48. data/lib/flipper/ui/assets/stylesheets/bootstrap/_grid.scss +0 -52
  49. data/lib/flipper/ui/assets/stylesheets/bootstrap/_images.scss +0 -42
  50. data/lib/flipper/ui/assets/stylesheets/bootstrap/_input-group.scss +0 -159
  51. data/lib/flipper/ui/assets/stylesheets/bootstrap/_jumbotron.scss +0 -16
  52. data/lib/flipper/ui/assets/stylesheets/bootstrap/_list-group.scss +0 -115
  53. data/lib/flipper/ui/assets/stylesheets/bootstrap/_media.scss +0 -8
  54. data/lib/flipper/ui/assets/stylesheets/bootstrap/_mixins.scss +0 -42
  55. data/lib/flipper/ui/assets/stylesheets/bootstrap/_modal.scss +0 -168
  56. data/lib/flipper/ui/assets/stylesheets/bootstrap/_nav.scss +0 -118
  57. data/lib/flipper/ui/assets/stylesheets/bootstrap/_navbar.scss +0 -311
  58. data/lib/flipper/ui/assets/stylesheets/bootstrap/_pagination.scss +0 -77
  59. data/lib/flipper/ui/assets/stylesheets/bootstrap/_popover.scss +0 -183
  60. data/lib/flipper/ui/assets/stylesheets/bootstrap/_print.scss +0 -124
  61. data/lib/flipper/ui/assets/stylesheets/bootstrap/_progress.scss +0 -33
  62. data/lib/flipper/ui/assets/stylesheets/bootstrap/_reboot.scss +0 -482
  63. data/lib/flipper/ui/assets/stylesheets/bootstrap/_root.scss +0 -19
  64. data/lib/flipper/ui/assets/stylesheets/bootstrap/_tables.scss +0 -180
  65. data/lib/flipper/ui/assets/stylesheets/bootstrap/_tooltip.scss +0 -115
  66. data/lib/flipper/ui/assets/stylesheets/bootstrap/_transitions.scss +0 -36
  67. data/lib/flipper/ui/assets/stylesheets/bootstrap/_type.scss +0 -125
  68. data/lib/flipper/ui/assets/stylesheets/bootstrap/_utilities.scss +0 -14
  69. data/lib/flipper/ui/assets/stylesheets/bootstrap/_variables.scss +0 -894
  70. data/lib/flipper/ui/assets/stylesheets/bootstrap/bootstrap-grid.scss +0 -32
  71. data/lib/flipper/ui/assets/stylesheets/bootstrap/bootstrap-reboot.scss +0 -12
  72. data/lib/flipper/ui/assets/stylesheets/bootstrap/bootstrap.scss +0 -42
  73. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_alert.scss +0 -13
  74. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_background-variant.scss +0 -21
  75. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_badge.scss +0 -12
  76. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_border-radius.scss +0 -35
  77. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_box-shadow.scss +0 -5
  78. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_breakpoints.scss +0 -123
  79. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_buttons.scss +0 -109
  80. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_caret.scss +0 -65
  81. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_clearfix.scss +0 -7
  82. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_float.scss +0 -11
  83. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_forms.scss +0 -137
  84. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_gradients.scss +0 -45
  85. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_grid-framework.scss +0 -67
  86. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_grid.scss +0 -52
  87. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_hover.scss +0 -39
  88. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_image.scss +0 -36
  89. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_list-group.scss +0 -21
  90. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_lists.scss +0 -7
  91. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_nav-divider.scss +0 -10
  92. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_navbar-align.scss +0 -10
  93. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_pagination.scss +0 -22
  94. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_reset-text.scss +0 -17
  95. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_resize.scss +0 -6
  96. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_screen-reader.scss +0 -35
  97. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_size.scss +0 -6
  98. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_table-row.scss +0 -30
  99. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss +0 -14
  100. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_text-hide.scss +0 -9
  101. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_text-truncate.scss +0 -8
  102. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_transition.scss +0 -9
  103. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_visibility.scss +0 -7
  104. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_align.scss +0 -8
  105. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_background.scss +0 -19
  106. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_borders.scss +0 -59
  107. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_clearfix.scss +0 -3
  108. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_display.scss +0 -38
  109. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_embed.scss +0 -52
  110. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_flex.scss +0 -46
  111. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_float.scss +0 -9
  112. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_position.scss +0 -36
  113. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_screenreaders.scss +0 -11
  114. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_sizing.scss +0 -12
  115. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_spacing.scss +0 -51
  116. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_text.scss +0 -52
  117. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_visibility.scss +0 -11
  118. data/lib/flipper/ui/assets/stylesheets/primer/.scss-lint.yml +0 -446
  119. data/lib/flipper/ui/assets/stylesheets/primer/_alerts.scss +0 -106
  120. data/lib/flipper/ui/assets/stylesheets/primer/_avatars.scss +0 -36
  121. data/lib/flipper/ui/assets/stylesheets/primer/_base.scss +0 -40
  122. data/lib/flipper/ui/assets/stylesheets/primer/_blankslate.scss +0 -96
  123. data/lib/flipper/ui/assets/stylesheets/primer/_buttons.scss +0 -404
  124. data/lib/flipper/ui/assets/stylesheets/primer/_counter.scss +0 -10
  125. data/lib/flipper/ui/assets/stylesheets/primer/_filter-list.scss +0 -68
  126. data/lib/flipper/ui/assets/stylesheets/primer/_flex-table.scss +0 -20
  127. data/lib/flipper/ui/assets/stylesheets/primer/_forms.scss +0 -756
  128. data/lib/flipper/ui/assets/stylesheets/primer/_layout.scss +0 -69
  129. data/lib/flipper/ui/assets/stylesheets/primer/_menu.scss +0 -113
  130. data/lib/flipper/ui/assets/stylesheets/primer/_mixins.scss +0 -53
  131. data/lib/flipper/ui/assets/stylesheets/primer/_normalize.scss +0 -425
  132. data/lib/flipper/ui/assets/stylesheets/primer/_states.scss +0 -32
  133. data/lib/flipper/ui/assets/stylesheets/primer/_tabnav.scss +0 -65
  134. data/lib/flipper/ui/assets/stylesheets/primer/_tooltips.scss +0 -255
  135. data/lib/flipper/ui/assets/stylesheets/primer/_truncate.scss +0 -27
  136. data/lib/flipper/ui/assets/stylesheets/primer/_type.scss +0 -92
  137. data/lib/flipper/ui/assets/stylesheets/primer/_utility.scss +0 -73
  138. data/lib/flipper/ui/assets/stylesheets/primer/_variables.scss +0 -34
  139. data/lib/flipper/ui/assets/stylesheets/primer/primer.scss +0 -39
  140. data/lib/flipper/ui/public/fonts/bootstrap/glyphicons-halflings-regular.eot +0 -0
  141. data/lib/flipper/ui/public/fonts/bootstrap/glyphicons-halflings-regular.svg +0 -288
  142. data/lib/flipper/ui/public/fonts/bootstrap/glyphicons-halflings-regular.ttf +0 -0
  143. data/lib/flipper/ui/public/fonts/bootstrap/glyphicons-halflings-regular.woff +0 -0
  144. data/lib/flipper/ui/public/fonts/bootstrap/glyphicons-halflings-regular.woff2 +0 -0
  145. data/lib/flipper/ui/public/images/remove.png +0 -0
  146. data/lib/flipper/ui/public/octicons/octicons.less +0 -235
  147. data/lib/flipper/ui/public/octicons/sprockets-octicons.scss +0 -232
@@ -1,51 +1,57 @@
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 %>" data-toggle="tooltip" title=<%= feature.state.to_s.capitalize %>></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"><%= feature.key %></div>
48
+ <div class="text-muted text-truncate">
49
+ <%== feature.gates_in_words %>
50
+ </div>
51
+ </a>
52
+ </div>
53
+ </div>
54
+ <% end %>
55
+ </div>
50
56
  </div>
51
57
  <% 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.2'.freeze
2
+ VERSION = '0.18.0'.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 Layout/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 Layout/LineLength
82
80
  end
83
81
 
84
82
  context 'nil value' do
85
83
  let(:value) { nil }
86
84
 
87
- # rubocop:disable Layout/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 Layout/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 Layout/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 Layout/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 Layout/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 Layout/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 Layout/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 Layout/LineLength
81
79
  end
82
80
 
83
81
  context 'empty group name' do
84
82
  let(:group_name) { '' }
85
83
 
86
- # rubocop:disable Layout/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 Layout/LineLength
92
88
  end
93
89
 
94
90
  context 'nil group name' do
95
91
  let(:group_name) { nil }
96
92
 
97
- # rubocop:disable Layout/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 Layout/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 Layout/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 Layout/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 Layout/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 Layout/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 Layout/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 Layout/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 Layout/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,24 @@ 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
116
103
  end
@@ -22,36 +22,6 @@ RSpec.describe Flipper::UI::Decorators::Feature do
22
22
  end
23
23
  end
24
24
 
25
- describe '#as_json' do
26
- before do
27
- @result = subject.as_json
28
- end
29
-
30
- it 'returns Hash' do
31
- expect(@result).to be_instance_of(Hash)
32
- end
33
-
34
- it 'includes id' do
35
- expect(@result['id']).to eq('some_awesome_feature')
36
- end
37
-
38
- it 'includes pretty name' do
39
- expect(@result['name']).to eq('Some Awesome Feature')
40
- end
41
-
42
- it 'includes state' do
43
- expect(@result['state']).to eq('off')
44
- end
45
-
46
- it 'includes gates' do
47
- gates = subject.gates.map do |gate|
48
- value = subject.gate_values[gate.key]
49
- Flipper::UI::Decorators::Gate.new(gate, value).as_json
50
- end
51
- expect(@result['gates']).to eq(gates)
52
- end
53
- end
54
-
55
25
  describe '#<=>' do
56
26
  let(:on) do
57
27
  flipper.enable(:on_a)
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.17.2
4
+ version: 0.18.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: 2020-01-04 00:00:00.000000000 Z
11
+ date: 2020-06-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -56,14 +56,14 @@ dependencies:
56
56
  requirements:
57
57
  - - "~>"
58
58
  - !ruby/object:Gem::Version
59
- version: 0.17.2
59
+ version: 0.18.0
60
60
  type: :runtime
61
61
  prerelease: false
62
62
  version_requirements: !ruby/object:Gem::Requirement
63
63
  requirements:
64
64
  - - "~>"
65
65
  - !ruby/object:Gem::Version
66
- version: 0.17.2
66
+ version: 0.18.0
67
67
  - !ruby/object:Gem::Dependency
68
68
  name: erubi
69
69
  requirement: !ruby/object:Gem::Requirement
@@ -84,8 +84,7 @@ dependencies:
84
84
  - - "<"
85
85
  - !ruby/object:Gem::Version
86
86
  version: 2.0.0
87
- description: Rack middleware that provides a fully featured web interface for the
88
- flipper gem.
87
+ description:
89
88
  email:
90
89
  - nunemaker@gmail.com
91
90
  executables: []
@@ -114,113 +113,6 @@ files:
114
113
  - lib/flipper/ui/actions/percentage_of_actors_gate.rb
115
114
  - lib/flipper/ui/actions/percentage_of_time_gate.rb
116
115
  - lib/flipper/ui/assets/javascripts/application.coffee
117
- - lib/flipper/ui/assets/stylesheets/.DS_Store
118
- - lib/flipper/ui/assets/stylesheets/application.scss
119
- - lib/flipper/ui/assets/stylesheets/bootstrap/_alert.scss
120
- - lib/flipper/ui/assets/stylesheets/bootstrap/_badge.scss
121
- - lib/flipper/ui/assets/stylesheets/bootstrap/_breadcrumb.scss
122
- - lib/flipper/ui/assets/stylesheets/bootstrap/_button-group.scss
123
- - lib/flipper/ui/assets/stylesheets/bootstrap/_buttons.scss
124
- - lib/flipper/ui/assets/stylesheets/bootstrap/_card.scss
125
- - lib/flipper/ui/assets/stylesheets/bootstrap/_carousel.scss
126
- - lib/flipper/ui/assets/stylesheets/bootstrap/_close.scss
127
- - lib/flipper/ui/assets/stylesheets/bootstrap/_code.scss
128
- - lib/flipper/ui/assets/stylesheets/bootstrap/_custom-forms.scss
129
- - lib/flipper/ui/assets/stylesheets/bootstrap/_dropdown.scss
130
- - lib/flipper/ui/assets/stylesheets/bootstrap/_forms.scss
131
- - lib/flipper/ui/assets/stylesheets/bootstrap/_functions.scss
132
- - lib/flipper/ui/assets/stylesheets/bootstrap/_grid.scss
133
- - lib/flipper/ui/assets/stylesheets/bootstrap/_images.scss
134
- - lib/flipper/ui/assets/stylesheets/bootstrap/_input-group.scss
135
- - lib/flipper/ui/assets/stylesheets/bootstrap/_jumbotron.scss
136
- - lib/flipper/ui/assets/stylesheets/bootstrap/_list-group.scss
137
- - lib/flipper/ui/assets/stylesheets/bootstrap/_media.scss
138
- - lib/flipper/ui/assets/stylesheets/bootstrap/_mixins.scss
139
- - lib/flipper/ui/assets/stylesheets/bootstrap/_modal.scss
140
- - lib/flipper/ui/assets/stylesheets/bootstrap/_nav.scss
141
- - lib/flipper/ui/assets/stylesheets/bootstrap/_navbar.scss
142
- - lib/flipper/ui/assets/stylesheets/bootstrap/_pagination.scss
143
- - lib/flipper/ui/assets/stylesheets/bootstrap/_popover.scss
144
- - lib/flipper/ui/assets/stylesheets/bootstrap/_print.scss
145
- - lib/flipper/ui/assets/stylesheets/bootstrap/_progress.scss
146
- - lib/flipper/ui/assets/stylesheets/bootstrap/_reboot.scss
147
- - lib/flipper/ui/assets/stylesheets/bootstrap/_root.scss
148
- - lib/flipper/ui/assets/stylesheets/bootstrap/_tables.scss
149
- - lib/flipper/ui/assets/stylesheets/bootstrap/_tooltip.scss
150
- - lib/flipper/ui/assets/stylesheets/bootstrap/_transitions.scss
151
- - lib/flipper/ui/assets/stylesheets/bootstrap/_type.scss
152
- - lib/flipper/ui/assets/stylesheets/bootstrap/_utilities.scss
153
- - lib/flipper/ui/assets/stylesheets/bootstrap/_variables.scss
154
- - lib/flipper/ui/assets/stylesheets/bootstrap/bootstrap-grid.scss
155
- - lib/flipper/ui/assets/stylesheets/bootstrap/bootstrap-reboot.scss
156
- - lib/flipper/ui/assets/stylesheets/bootstrap/bootstrap.scss
157
- - lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_alert.scss
158
- - lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_background-variant.scss
159
- - lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_badge.scss
160
- - lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_border-radius.scss
161
- - lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_box-shadow.scss
162
- - lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_breakpoints.scss
163
- - lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_buttons.scss
164
- - lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_caret.scss
165
- - lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_clearfix.scss
166
- - lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_float.scss
167
- - lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_forms.scss
168
- - lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_gradients.scss
169
- - lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_grid-framework.scss
170
- - lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_grid.scss
171
- - lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_hover.scss
172
- - lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_image.scss
173
- - lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_list-group.scss
174
- - lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_lists.scss
175
- - lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_nav-divider.scss
176
- - lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_navbar-align.scss
177
- - lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_pagination.scss
178
- - lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_reset-text.scss
179
- - lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_resize.scss
180
- - lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_screen-reader.scss
181
- - lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_size.scss
182
- - lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_table-row.scss
183
- - lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss
184
- - lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_text-hide.scss
185
- - lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_text-truncate.scss
186
- - lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_transition.scss
187
- - lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_visibility.scss
188
- - lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_align.scss
189
- - lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_background.scss
190
- - lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_borders.scss
191
- - lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_clearfix.scss
192
- - lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_display.scss
193
- - lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_embed.scss
194
- - lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_flex.scss
195
- - lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_float.scss
196
- - lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_position.scss
197
- - lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_screenreaders.scss
198
- - lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_sizing.scss
199
- - lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_spacing.scss
200
- - lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_text.scss
201
- - lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_visibility.scss
202
- - lib/flipper/ui/assets/stylesheets/primer/.scss-lint.yml
203
- - lib/flipper/ui/assets/stylesheets/primer/_alerts.scss
204
- - lib/flipper/ui/assets/stylesheets/primer/_avatars.scss
205
- - lib/flipper/ui/assets/stylesheets/primer/_base.scss
206
- - lib/flipper/ui/assets/stylesheets/primer/_blankslate.scss
207
- - lib/flipper/ui/assets/stylesheets/primer/_buttons.scss
208
- - lib/flipper/ui/assets/stylesheets/primer/_counter.scss
209
- - lib/flipper/ui/assets/stylesheets/primer/_filter-list.scss
210
- - lib/flipper/ui/assets/stylesheets/primer/_flex-table.scss
211
- - lib/flipper/ui/assets/stylesheets/primer/_forms.scss
212
- - lib/flipper/ui/assets/stylesheets/primer/_layout.scss
213
- - lib/flipper/ui/assets/stylesheets/primer/_menu.scss
214
- - lib/flipper/ui/assets/stylesheets/primer/_mixins.scss
215
- - lib/flipper/ui/assets/stylesheets/primer/_normalize.scss
216
- - lib/flipper/ui/assets/stylesheets/primer/_states.scss
217
- - lib/flipper/ui/assets/stylesheets/primer/_tabnav.scss
218
- - lib/flipper/ui/assets/stylesheets/primer/_tooltips.scss
219
- - lib/flipper/ui/assets/stylesheets/primer/_truncate.scss
220
- - lib/flipper/ui/assets/stylesheets/primer/_type.scss
221
- - lib/flipper/ui/assets/stylesheets/primer/_utility.scss
222
- - lib/flipper/ui/assets/stylesheets/primer/_variables.scss
223
- - lib/flipper/ui/assets/stylesheets/primer/primer.scss
224
116
  - lib/flipper/ui/configuration.rb
225
117
  - lib/flipper/ui/configuration/option.rb
226
118
  - lib/flipper/ui/decorators/feature.rb
@@ -228,24 +120,16 @@ files:
228
120
  - lib/flipper/ui/error.rb
229
121
  - lib/flipper/ui/middleware.rb
230
122
  - lib/flipper/ui/public/css/application.css
231
- - lib/flipper/ui/public/fonts/bootstrap/glyphicons-halflings-regular.eot
232
- - lib/flipper/ui/public/fonts/bootstrap/glyphicons-halflings-regular.svg
233
- - lib/flipper/ui/public/fonts/bootstrap/glyphicons-halflings-regular.ttf
234
- - lib/flipper/ui/public/fonts/bootstrap/glyphicons-halflings-regular.woff
235
- - lib/flipper/ui/public/fonts/bootstrap/glyphicons-halflings-regular.woff2
236
123
  - lib/flipper/ui/public/images/logo.png
237
- - lib/flipper/ui/public/images/remove.png
238
124
  - lib/flipper/ui/public/js/application.js
239
125
  - lib/flipper/ui/public/octicons/LICENSE.txt
240
126
  - lib/flipper/ui/public/octicons/README.md
241
127
  - lib/flipper/ui/public/octicons/octicons-local.ttf
242
128
  - lib/flipper/ui/public/octicons/octicons.css
243
129
  - lib/flipper/ui/public/octicons/octicons.eot
244
- - lib/flipper/ui/public/octicons/octicons.less
245
130
  - lib/flipper/ui/public/octicons/octicons.svg
246
131
  - lib/flipper/ui/public/octicons/octicons.ttf
247
132
  - lib/flipper/ui/public/octicons/octicons.woff
248
- - lib/flipper/ui/public/octicons/sprockets-octicons.scss
249
133
  - lib/flipper/ui/util.rb
250
134
  - lib/flipper/ui/views/add_actor.erb
251
135
  - lib/flipper/ui/views/add_feature.erb