flipper-ui 0.17.2 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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