tolaria 1.0.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d6bbe4f07c4384a212775e975ce8eb3ebdc9bac7
4
- data.tar.gz: 7c73d1de0b10a9e9b66245132190eea2c1671287
3
+ metadata.gz: c447de7756733e7206984d95df7b1cc2745b65a8
4
+ data.tar.gz: 9cafe04bae67cf2248f4a90c5c19e0f684739095
5
5
  SHA512:
6
- metadata.gz: ef6b210ab9493676b17282ba7f9f15ee1bd072e6f679cda2cfde50fdc7464cc1109ff97d51c7d3486428359869bd1387847cccfa817e9bfed089d093c2fcb6a0
7
- data.tar.gz: 17f7e9f64856fcd583071c69da4e5ad02ea6ad411758e06bb69c175b49b0a0f580b0fd81c9f9b8198491879f7196a945677aa4da5bab022525d88104dc773e29
6
+ metadata.gz: 7cfa153900abd851aea97fc0d79dfb012a35218f448c690a098d495bdf5bdbc4fe26499e16bd27b9a7578e75e07f3a1613ac0ba71447bbcfe2b8ef77f04e877d
7
+ data.tar.gz: 8c6ca85bfd80d7544dfb3b5d3623147c6a29c0e161963823f2392c42f7f82060ee62a76bca94f214d84f86ba591095e2d9815a532b8e5ed9b53d134a384e87f6
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.2.2
4
+ script: "rake test"
data/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  ## Tolaria
2
2
 
3
+ [![Build Status](https://travis-ci.org/Threespot/tolaria.svg?branch=master)](https://travis-ci.org/Threespot/tolaria)
4
+
3
5
  Tolaria is a [content management system](https://en.wikipedia.org/wiki/Content_management_system) (CMS) framework for [Ruby on Rails](https://en.wikipedia.org/wiki/Ruby_on_Rails). It greatly speeds up the necessary—but repetitive—task of creating useful admin panels, forms, and model workflows for site authors.
4
6
 
5
7
  [![](https://cloud.githubusercontent.com/assets/769083/8262095/ccb2b68e-169d-11e5-9378-0d098eb22c22.png)](https://cloud.githubusercontent.com/assets/769083/7573791/56eda172-f7f6-11e4-8df7-36015cf5cf85.png)
@@ -99,7 +101,7 @@ You can configure Tolaria's passcode paranoia in the initializer you installed a
99
101
 
100
102
  ### Managing a Model
101
103
 
102
- Inside your ActiveRecord definition for your model, call `manage_with_tolaria`, passing configuration in the `using` Hash. [Refer to the documentation for all of the options](#FIXME).
104
+ Inside your ActiveRecord definition for your model, call `manage_with_tolaria`, passing configuration in the `using` Hash. [Refer to the documentation for all of the options](http://www.rubydoc.info/gems/tolaria/ActiveRecord%2FBase.manage_with_tolaria).
103
105
 
104
106
  The icon system uses [Font Awesome][fa], and you'll need to pass one of [the icon names][fa] for the `icon` key.
105
107
 
@@ -128,7 +130,7 @@ By default, Tolaria will build a simple index screen for each model. You'll like
128
130
 
129
131
  If your model was `BlogPost`, you'll need to create a file in your project at: `app/views/admin/blog_posts/_index.html.erb`.
130
132
 
131
- See the [TableHelper documentation](#FIXME) for more information.
133
+ See the [TableHelper documentation](http://www.rubydoc.info/gems/tolaria/Admin/TableHelper) for more information.
132
134
 
133
135
  ```erb
134
136
  <% # app/views/admin/blog_posts/_index.html.erb %>
@@ -161,7 +163,7 @@ Tolaria provides a very basic show/inspect screen for models. You'll want to pro
161
163
 
162
164
  If your model was `BlogPost`, you'll need to create a file in your project at: `app/views/admin/blog_posts/_show.html.erb`.
163
165
 
164
- See the [TableHelper documentation](#FIXME) for more information.
166
+ See the [TableHelper documentation](http://www.rubydoc.info/gems/tolaria/Admin/TableHelper) for more information.
165
167
 
166
168
  ```erb
167
169
  <% # app/views/admin/blog_posts/_show.html.erb %>
@@ -274,11 +276,11 @@ If your model was `BlogPost`, you'll need to create a file in your project at `
274
276
 
275
277
  ### Provided Form Fields
276
278
 
277
- You can use all of the Rails-provided fields on your forms, but Tolaria also comes with a set of advanced, JavaScript-backed fields. Make sure to [review the documentation for the form builder](#FIXME) to get all the details.
279
+ You can use all of the Rails-provided fields on your forms, but Tolaria also comes with a set of advanced, JavaScript-backed fields. Make sure to [review the documentation for the form builder](http://www.rubydoc.info/gems/tolaria/Admin/FormBuilder) to get all the details.
278
280
 
279
281
  #### Markdown Composer
280
282
 
281
- The [`markdown_composer` helper](#FIXME) will generate a very fancy Markdown editor, which includes text snippet tools and a fullscreen mode with live previewing.
283
+ The [`markdown_composer` helper](http://www.rubydoc.info/gems/tolaria/Tolaria%2FFormBuildable%3Amarkdown_composer) will generate a very fancy Markdown editor, which includes text snippet tools and a fullscreen mode with live previewing.
282
284
 
283
285
  **Important:** You cannot use this field properly if you do not set up `Tolaria.config.markdown_renderer`. Without it, the live preview will only use `simple_format`!
284
286
 
@@ -292,7 +294,7 @@ The [`markdown_composer` helper](#FIXME) will generate a very fancy Markdown edi
292
294
 
293
295
  #### Searchable Select
294
296
 
295
- The [`searchable_select` helper](#FIXME) displays a [Chosen select field](http://harvesthq.github.io/chosen/) that authors can filter by typing.
297
+ The [`searchable_select` helper](http://www.rubydoc.info/gems/tolaria/Tolaria%2FFormBuildable%3Asearchable_select) displays a [Chosen select field](http://harvesthq.github.io/chosen/) that authors can filter by typing.
296
298
 
297
299
  ```
298
300
  <%= f.label :title, "Topics" %>
@@ -304,7 +306,7 @@ The [`searchable_select` helper](#FIXME) displays a [Chosen select field](http:/
304
306
 
305
307
  #### Image Association Select
306
308
 
307
- The [`image_association_select` helper](#FIXME) displays a `searchable_select` that provides an instant preview of the currently selected model as an image.
309
+ The [`image_association_select` helper](http://www.rubydoc.info/gems/tolaria/Tolaria%2FFormBuildable%3Aimage_association_select) displays a `searchable_select` that provides an instant preview of the currently selected model as an image.
308
310
 
309
311
  ```erb
310
312
  <%= f.label :featured_image_id, "Featured Image" %>
@@ -316,7 +318,7 @@ The [`image_association_select` helper](#FIXME) displays a `searchable_select` t
316
318
 
317
319
  #### Timestamp Field
318
320
 
319
- The [`timestamp_field` helper](#FIXME) displays a text field that validates a provided timestamp and recovers to a template if blanked.
321
+ The [`timestamp_field` helper](http://www.rubydoc.info/gems/tolaria/Tolaria%2FFormBuildable%3Atimestamp_field) displays a text field that validates a provided timestamp and recovers to a template if blanked.
320
322
 
321
323
  ```erb
322
324
  <%= f.label :published_at, "Publishing Date" %>
@@ -328,7 +330,7 @@ The [`timestamp_field` helper](#FIXME) displays a text field that validates a pr
328
330
 
329
331
  #### Slug Field
330
332
 
331
- The [`slug_field` helper](#FIXME) allows you to show the parameterized value of a field in a given pattern preview.
333
+ The [`slug_field` helper](http://www.rubydoc.info/gems/tolaria/Tolaria%2FFormBuildable%3Aslug_field) allows you to show the parameterized value of a field in a given pattern preview.
332
334
 
333
335
  ```erb
334
336
  <%= f.label :title %>
@@ -340,7 +342,7 @@ The [`slug_field` helper](#FIXME) allows you to show the parameterized value of
340
342
 
341
343
  #### Swatch Field
342
344
 
343
- The [`swatch_field` helper](#FIXME) validates and displays a given hexadecimal color.
345
+ The [`swatch_field` helper](http://www.rubydoc.info/gems/tolaria/Tolaria%2FFormBuildable%3Aswatch_field) validates and displays a given hexadecimal color.
344
346
 
345
347
  ```erb
346
348
  <%= f.label :color %>
@@ -352,7 +354,7 @@ The [`swatch_field` helper](#FIXME) validates and displays a given hexadecimal c
352
354
 
353
355
  #### Image Field
354
356
 
355
- The [`image_field` helper](#FIXME) displays a button that makes uploading an image a little more pleasant than a regular `file_field`.
357
+ The [`image_field` helper](http://www.rubydoc.info/gems/tolaria/Tolaria%2FFormBuildable%3Aimage_field) displays a button that makes uploading an image a little more pleasant than a regular `file_field`.
356
358
 
357
359
  ```erb
358
360
  <%= f.label :portrait %>
@@ -364,7 +366,7 @@ The [`image_field` helper](#FIXME) displays a button that makes uploading an ima
364
366
 
365
367
  #### Attachment Field
366
368
 
367
- The [`attachment_field` helper](#FIXME) displays a button that makes uploading an arbirary file a little more pleasant than a regular `file_field`.
369
+ The [`attachment_field` helper](http://www.rubydoc.info/gems/tolaria/Tolaria%2FFormBuildable%3Aattachment_field) displays a button that makes uploading an arbirary file a little more pleasant than a regular `file_field`.
368
370
 
369
371
  ```erb
370
372
  <%= f.label :portrait %>
@@ -392,7 +394,7 @@ If you need to run two or more `select` controls together (like for `date_select
392
394
 
393
395
  #### Hints
394
396
 
395
- [Inline help](#FIXME) is useful for reminding administrators about what should be provided for each field. Use `f.hint` to present a hint for a field.
397
+ [Inline help](http://www.rubydoc.info/gems/tolaria/Tolaria%2FFormBuildable%3Ahint) is useful for reminding administrators about what should be provided for each field. Use `f.hint` to present a hint for a field.
396
398
 
397
399
  ![hint](https://cloud.githubusercontent.com/assets/769083/7888576/8d20f8a6-0607-11e5-80ea-2c8f66ad7449.png)
398
400
 
@@ -489,7 +491,7 @@ If you want to add additional Sass or JavaScript to the admin system, you can cr
489
491
 
490
492
  Tolaria comes with a test suite and a demo server that the test suite exercises.
491
493
 
492
- To run tests, first clone the repo:
494
+ To run tests, first clone the repo or your fork of it:
493
495
 
494
496
  ```shell
495
497
  $ git clone -o github git@github.com:threespot/tolaria.git
@@ -530,6 +532,7 @@ Our work stands on the shoulders of giants, and we're very thankful to the many
530
532
  - [The jQuery Foundation](https://jquery.org)
531
533
  - [Jeremy Ashkenas](https://twitter.com/jashkenas)
532
534
  - [The Harvest Team](https://www.getharvest.com/about/meet-the-team)
535
+ - [Font Awesome and Dave Gandy](http://fontawesome.io/icons/)
533
536
 
534
537
  ### About Threespot
535
538
 
@@ -1,5 +1,7 @@
1
1
  .has-many {
2
2
 
3
+ margin: 0 0 16px;
4
+
3
5
  h3 {
4
6
  @include clearfix;
5
7
  display: block;
@@ -33,7 +33,7 @@ class Tolaria::ResourceController < Tolaria::TolariaController
33
33
 
34
34
  if @resource.save
35
35
  flash[:success] = "#{random_blingword} You created the #{@managed_class.model_name.human} “#{display_name}”."
36
- return redirect_to url_for([:admin, @managed_class.klass])
36
+ return redirect_to form_completion_redirect_path(@managed_class, @resource)
37
37
  else
38
38
  log_validation_errors!
39
39
  flash.now[:error] = "Your changes couldn’t be saved. Please correct the following errors:"
@@ -55,7 +55,7 @@ class Tolaria::ResourceController < Tolaria::TolariaController
55
55
 
56
56
  if @resource.save
57
57
  flash[:success] = "#{random_blingword} You updated the #{@managed_class.model_name.human.downcase} “#{display_name}”."
58
- return redirect_to url_for([:admin, @managed_class.klass])
58
+ return redirect_to form_completion_redirect_path(@managed_class, @resource)
59
59
  else
60
60
  log_validation_errors!
61
61
  flash.now[:error] = "Your changes couldn’t be saved. Please correct the following errors:"
@@ -73,11 +73,11 @@ class Tolaria::ResourceController < Tolaria::TolariaController
73
73
  @resource.destroy
74
74
  rescue ActiveRecord::DeleteRestrictionError => e
75
75
  flash[:restricted] = "You cannot delete “#{display_name}” because other items are using it."
76
- return redirect_to url_for([:admin, @managed_class.klass])
76
+ return redirect_to form_completion_redirect_path(@managed_class, @resource)
77
77
  end
78
78
 
79
79
  flash[:destructive] = "You deleted the #{@managed_class.model_name.human.downcase} “#{display_name}”."
80
- return redirect_to url_for([:admin, @managed_class.klass])
80
+ return redirect_to form_completion_redirect_path(@managed_class)
81
81
 
82
82
  end
83
83
 
@@ -89,6 +89,20 @@ class Tolaria::ResourceController < Tolaria::TolariaController
89
89
  ["Done!", "Okay!", "Success!"].sample
90
90
  end
91
91
 
92
+ # Returns a path we should redirect to when the form is completed successfully.
93
+ # Handles route forbidding cases.
94
+ def form_completion_redirect_path(managed_class, resource = nil)
95
+ if managed_class.allows? :index
96
+ url_for([:admin, managed_class.klass])
97
+ elsif managed_class.allows?(:show) && resource.present?
98
+ url_for(action:"show", id:resource.id)
99
+ elsif managed_class.allows?(:edit) && resource.present?
100
+ url_for(action:"edit", id:resource.id)
101
+ else
102
+ Tolaria.config.defaut_redirect
103
+ end
104
+ end
105
+
92
106
  # Load the Tolaria managed class for this controller
93
107
  def load_managed_class!
94
108
  @managed_class ||= Tolaria.managed_classes.find do |managed_class|
@@ -1,7 +1,7 @@
1
1
  module Admin::TableHelper
2
2
 
3
3
  # Returns a `<table class="index-table">` tag with the appropriate wrapper
4
- # and the given +content+ or block content inside it.
4
+ # and the given `content` or block content inside it.
5
5
  def index_table(content = nil, &block)
6
6
  content_tag :div, class:"index-table-wrap" do
7
7
  content_tag :table, class:"index-table" do
@@ -10,7 +10,7 @@ module Admin::TableHelper
10
10
  end
11
11
  end
12
12
 
13
- # Returns a `<table class="show-table">` tag with the given +content+
13
+ # Returns a `<table class="show-table">` tag with the given `content`
14
14
  # or block content inside it.
15
15
  def show_table(content = nil, &block)
16
16
  content_tag :table, class:"show-table" do
@@ -29,20 +29,19 @@ module Admin::TableHelper
29
29
  end
30
30
 
31
31
  # Returns a `<tr>` with two `<td>`s suitable for use in a `table.show-table`.
32
- # The given +label+ is placed inside the first `<td>`, while the +value+
32
+ # The given `label` is placed inside the first `<td>`, while the `value`
33
33
  # is placed in the second `<td>`. Options are forwarded to `content_tag`
34
34
  # for the *second* `<td>`.
35
35
  #
36
- # If +label+ is a symbol, it is assumed to be a method on a variable named
36
+ # If `label` is a symbol, it is assumed to be a method on a variable named
37
37
  # `@resource` in the current template, and the `<tr>` is constructed
38
38
  # automatically for you by converting the symbol to a human-readable label
39
- # and calling the named method on @resource to get the +value+.
39
+ # and calling the named method on @resource to get the `value`.
40
40
  #
41
- # ==== Signatures
41
+ # #### Signatures
42
42
  #
43
43
  # # Set the values yourself, and a class on the second `<td>`
44
44
  # show_tr "Slug", resource.slug, class:"monospace"
45
- #
46
45
  # # Attempt to auto-fill the row based on a method name
47
46
  # show_tr :slug
48
47
  def show_tr(label, value = nil, options = nil)
@@ -70,22 +69,20 @@ module Admin::TableHelper
70
69
  end
71
70
 
72
71
  # Returns a `<th>` tag, suitable for use inside a `table.index-table`.
73
- # +field_or_label+ may be any string, or a symbol naming a model column.
74
- # +sort+ may be `true`, `false`, or a symbol. See the signtures below.
72
+ # `field_or_label` may be any string, or a symbol naming a model column.
73
+ # `sort` may be `true`, `false`, or a symbol. See the signtures below.
75
74
  #
76
75
  # If the column is sortable, the `<th>` will contain a Ransack sort link
77
76
  # that allows the end-user to organize the table by that column.
78
77
  #
79
- # ==== Signatures
80
- #
81
- # # Create a header that sorts a named column
82
- # index_th(:title, sort:true)
83
- #
84
- # # Create a header that sorts a column, with custom label
85
- # index_th("Strange Title", sort: :title)
78
+ # #### Signatures
86
79
  #
87
- # # Create a header that can't be sorted
88
- # index_th("Strange Title", sort:false)
80
+ # # Create a header that sorts a named column
81
+ # index_th(:title, sort:true)
82
+ # # Create a header that sorts a column, with custom label
83
+ # index_th("Strange Title", sort: :title)
84
+ # # Create a header that can't be sorted
85
+ # index_th("Strange Title", sort:false)
89
86
  def index_th(field_or_label, sort:true)
90
87
 
91
88
  case field_or_label
@@ -110,9 +107,9 @@ module Admin::TableHelper
110
107
  end
111
108
 
112
109
  # Returns a `<td>` tag, suitable for use inside a `table.index-table`.
113
- # If +method_or_content+ is a symbol, it will call that method on the
114
- # given +resource+ to obtain the content of the `<td>`. Otherwise
115
- # it expects +method_or_content+ or a passed block to provide suitable string.
110
+ # If `method_or_content` is a symbol, it will call that method on the
111
+ # given `resource` to obtain the content of the `<td>`. Otherwise
112
+ # it expects `method_or_content` or a passed block to provide suitable string.
116
113
  #
117
114
  # #### Special Options
118
115
  #
@@ -139,8 +136,16 @@ module Admin::TableHelper
139
136
  image = image_tag(image, size:"18x18", alt:"")
140
137
  end
141
138
 
139
+ if @managed_class.allows? :edit
140
+ link = url_for(action:"edit", id:resource.id)
141
+ elsif @managed_class.allows? :show
142
+ link = url_for(action:"show", id:resource.id)
143
+ else
144
+ link = "#" # Guh, painted ourseves into a corner here
145
+ end
146
+
142
147
  return content_tag(:td, options) do
143
- link_to("#{image}#{content}".html_safe, url_for(action:"edit", id:resource.id))
148
+ link_to("#{image}#{content}".html_safe, link)
144
149
  end
145
150
 
146
151
  end
@@ -151,7 +156,7 @@ module Admin::TableHelper
151
156
  end
152
157
 
153
158
  # Returns a `<td>` tag, suitable for use inside a `table.index-table`.
154
- # The tag contains buttons to edit, inspect, and delete the given +resource+.
159
+ # The tag contains buttons to edit, inspect, and delete the given `resource`.
155
160
  def actions_td(resource)
156
161
 
157
162
  links = []
@@ -17,7 +17,8 @@ module Admin::ViewHelper
17
17
  end
18
18
  end
19
19
 
20
- # Returns an `<i>` tag that displays a Font Awesome icon
20
+ # Returns an `<i>` tag that displays the Font Awesome icon for the given `icon`.
21
+ # Names much match those from [the Font Awesome site](http://fontawesome.io/icons/).
21
22
  def fontawesome_icon(icon = "", options = {})
22
23
  icon = icon.to_s.parameterize.tr("_", "-")
23
24
  content_tag :i, nil, options.reverse_merge({
@@ -32,7 +33,7 @@ module Admin::ViewHelper
32
33
  return "https://secure.gravatar.com/avatar/#{digest}?d=retro&s=36"
33
34
  end
34
35
 
35
- # Returns true if a partial is available at "admin/#{template_path}"
36
+ # Returns true if a partial is available at `"admin/#{template_path}"`
36
37
  def admin_template_exists?(template_path)
37
38
  lookup_context.template_exists?("admin/#{template_path}", [], true)
38
39
  end
@@ -57,9 +58,9 @@ module Admin::ViewHelper
57
58
  return %{Are you sure you want to delete the #{resource.model_name.human.downcase} “#{Tolaria.display_name(resource)}”? This action is not reversible.}
58
59
  end
59
60
 
60
- # Returns a `<span>` tag that displays the given +label+ as a pill
61
+ # Returns a `<span>` tag that displays the given `label` as a pill
61
62
  # status badge. You can change the color of the pill by providing a
62
- # six-digit hexadecimal +color+, or passing one of the predefined
63
+ # six-digit hexadecimal `color` string, or passing one of the predefined
63
64
  # color names: `:green`, `:red`, `:blue`, `:black`, `:grey`.
64
65
  def pill(label, color: :black)
65
66
 
@@ -37,8 +37,8 @@ class Administrator < ActiveRecord::Base
37
37
  # and passcode inside the time window
38
38
  # -----------------------------------------------------------------------------
39
39
 
40
- # Initialize +passcode+, +passcode_expires_at+,
41
- # +auth_token+, and +account_unlocks_at+ for a new admin.
40
+ # Initialize `passcode`, `passcode_expires_at`,
41
+ # `auth_token`, and `account_unlocks_at` for a new admin.
42
42
  # To prevent passcode system fields from being null,
43
43
  # we fill them with an immediately expired passcode.
44
44
  def initialize_authentication!
@@ -66,7 +66,7 @@ class Administrator < ActiveRecord::Base
66
66
  return plaintext_passcode
67
67
  end
68
68
 
69
- # Attempt to authenticate the account with the given plaintext +passcode+.
69
+ # Attempt to authenticate the account with the given plaintext `passcode`.
70
70
  # Returns true if the passcode was valid, false otherwise.
71
71
  def authenticate!(passcode)
72
72
 
@@ -1,6 +1,8 @@
1
- <%= link_to url_for([:admin, @managed_class.klass]), class:"button" do %>
2
- <%= fontawesome_icon :close %>
3
- Cancel
1
+ <% if @managed_class.allows? :index %>
2
+ <%= link_to url_for([:admin, @managed_class.klass]), class:"button" do %>
3
+ <%= fontawesome_icon :close %>
4
+ Cancel
5
+ <% end %>
4
6
  <% end %>
5
7
 
6
8
  <%= button_tag type:"submit", name:nil, class:"button -primary" do %>
@@ -11,7 +11,11 @@
11
11
  <h1>
12
12
  <span class="crumb">
13
13
  <%= fontawesome_icon @managed_class.icon %>
14
- <%= link_to @managed_class.model_name.human.pluralize.titleize, url_for(action:"index", controller:@managed_class.plural) %>
14
+ <% if @managed_class.allows? :index %>
15
+ <%= link_to @managed_class.model_name.human.pluralize.titleize, url_for(action:"index", controller:@managed_class.plural) %>
16
+ <% else %>
17
+ <%= @managed_class.model_name.human.pluralize.titleize %>
18
+ <% end %>
15
19
  </span>
16
20
  <%= content_for :title %>
17
21
  </h1>
@@ -6,7 +6,11 @@
6
6
  <h1>
7
7
  <span class="crumb">
8
8
  <%= fontawesome_icon @managed_class.icon %>
9
- <%= link_to @managed_class.model_name.human.pluralize.titleize, url_for(action:"index", controller:@managed_class.plural) %>
9
+ <% if @managed_class.allows? :index %>
10
+ <%= link_to @managed_class.model_name.human.pluralize.titleize, url_for(action:"index", controller:@managed_class.plural) %>
11
+ <% else %>
12
+ <%= @managed_class.model_name.human.pluralize.titleize %>
13
+ <% end %>
10
14
  </span>
11
15
  <%= content_for :title %>
12
16
  </h1>
@@ -21,7 +21,7 @@ require "tolaria/manage"
21
21
  require "tolaria/active_record"
22
22
  require "tolaria/help_links"
23
23
  require "tolaria/routes"
24
- require "tolaria/introspection"
24
+ require "tolaria/display_name"
25
25
  require "tolaria/categories"
26
26
  require "tolaria/markdown"
27
27
  require "tolaria/form_buildable"
@@ -1,12 +1,12 @@
1
1
  # Adds a new DSL method to ActiveRecord model definition, allowing the
2
2
  # developer to configure a model to manage with Tolaria.
3
3
  # The developer passes a hash of configuration options which are
4
- # forwarded as keyword arguments to Tolaria.manage
4
+ # forwarded as keyword arguments to `Tolaria.manage`.
5
5
 
6
6
  class ActiveRecord::Base
7
7
 
8
8
  # Register a model with Tolaria and allow administrators to manage it
9
- # in the admin interface. Accepts one named parameter, +using+
9
+ # in the admin interface. Accepts one named parameter, `using`
10
10
  # which should be a Hash of options below.
11
11
  #
12
12
  # #### Options
@@ -18,8 +18,7 @@ class ActiveRecord::Base
18
18
  # Items with lower priority are sorted first.
19
19
  # The default is 10.
20
20
  # - `:icon` - The Font Awesome icon to use for this model.
21
- # Should be one of the names on the Font Awesome site at
22
- # http://fortawesome.github.io/Font-Awesome/icons/
21
+ # Should be one of the names on [the Font Awesome site](http://fortawesome.github.io/Font-Awesome/icons/)
23
22
  # The default is `"file-o"`.
24
23
  # - `:permitted_params` - A array of parameter names to pass to
25
24
  # `params.permit()` for this model/form.
@@ -37,6 +36,22 @@ class ActiveRecord::Base
37
36
  # Tolaria will pass this array as the `only:` option to the router.
38
37
  # The default includes all CRUD actions:
39
38
  # `[:index, :show, :new, :create, :edit, :update, :destroy]`
39
+ #
40
+ # #### Example
41
+ #
42
+ # class BlogPost < ActiveRecord::Base
43
+ # manage_with_tolaria using: {
44
+ # icon: "file-o",
45
+ # category: "Settings",
46
+ # priority: 5,
47
+ # permit_params: [
48
+ # :title,
49
+ # :body,
50
+ # :author_id,
51
+ # ]
52
+ # }
53
+ # end
54
+
40
55
  def self.manage_with_tolaria(using:{})
41
56
  @tolaria_management_options = using
42
57
  if Tolaria.safe_management
@@ -7,8 +7,8 @@ module Tolaria
7
7
  (self.config.menu_categories + self.managed_classes.collect(&:category)).uniq
8
8
  end
9
9
 
10
- # Returns all of the managed classes for the given +category+,
11
- # sorted by their priority
10
+ # Returns all of the managed classes for the given `category`,
11
+ # sorted by their priority.
12
12
  def self.classes_for_category(category)
13
13
  classes = Tolaria.managed_classes.select do |managed_class|
14
14
  managed_class.category == category
@@ -1,20 +1,35 @@
1
1
  module Tolaria
2
2
 
3
- # Tolaria’s config is a class so that an exception is raised
4
- # if you try to configure a key that doesn't exist. See default_config.rb
3
+ # Tolaria’s configuration is a class so that an exception is raised
4
+ # if you try to configure a key that doesn't exist.
5
+ # Refer to the comments in the initializer that Tolaria generated for
6
+ # you when you ran `rails generate tolaria:install`.
5
7
  class Configuration
8
+ # The cost factor for bcrypt
6
9
  attr_accessor :bcrypt_cost
10
+ # The name of the company using this admin interface
7
11
  attr_accessor :company_name
12
+ # The default redirect path when administrators log in or no better path exists
8
13
  attr_accessor :default_redirect
14
+ # An array of method names Tolaria uses to attempt to convert a model to a string
9
15
  attr_accessor :display_name_methods
16
+ # The `From` header for emails Tolaria sends
10
17
  attr_accessor :from_address
18
+ # An array of hashes for configuring Help Links
11
19
  attr_accessor :help_links
20
+ # The number of seconds that an administrator is locked out when they hit the rate-limit
12
21
  attr_accessor :lockout_duration
22
+ # The number of times an administrator can flunk their passcode challenge or request a token before Tolaria disables their account.
13
23
  attr_accessor :lockout_threshold
24
+ # A string that names a Markdown renderer for Tolaria to use.
14
25
  attr_accessor :markdown_renderer
26
+ # An array of configured menu category labels
15
27
  attr_accessor :menu_categories
28
+ # The default page size Tolaria uses when paginating
16
29
  attr_accessor :page_size
30
+ # The number of seconds that a generated passcode is valid
17
31
  attr_accessor :passcode_lifespan
32
+ # The default array of permitted params (internal use only)
18
33
  attr_accessor :permitted_params
19
34
  end
20
35
 
@@ -28,10 +43,9 @@ module Tolaria
28
43
 
29
44
  # Configure Tolaria, block-style. Use something similar to:
30
45
  #
31
- # Tolaria.configure do |config|
46
+ # Tolaria.configure do |config|
32
47
  # # Assign to config properties here
33
- # end
34
- #
48
+ # end
35
49
  def self.configure(&block)
36
50
  yield @configuration ||= Tolaria::Configuration.new
37
51
  end
@@ -1,51 +1,28 @@
1
+ # This file initializes Tolaria's default configuration, which the developer
2
+ # is expected to override.
3
+ #
4
+ # Please see lib/generators/tolaria/install/templates/tolaria_initializer.rb
5
+ # and config.rb for details.
6
+
1
7
  Tolaria.configure do |config|
2
8
 
3
- # The name of the company or group using this admin interface.
4
- # Used in system navigation and HTML page titles.
5
9
  config.company_name = "Company Name"
10
+ config.from_address = "Rails <tolaria@example.org>"
6
11
 
7
- # Redirect the users to this route by default when logging in.
8
12
  config.default_redirect = :admin_administrators
9
13
 
10
- # Tolaria sends authentication emails. Set the value of the From header here.
11
- config.from_address = "Rails <tolaria@example.org>"
12
-
13
- # You can assign models to a category group them on the nav menu.
14
- # Add/modify categories by changing the array below.
15
- # Categories first in the array will be first on the menu.
16
14
  config.menu_categories = ["Settings"]
17
15
 
18
- # The cost factor for bcrypt.
19
- # It is VERY DANGEROUS to set this below 10 for production.
20
- # Use 1 in test mode to speed up your test suite.
21
16
  config.bcrypt_cost = Rails.env.test?? 1 : 13
22
-
23
- # The length of time that emailed passcodes should be valid.
24
- # It is STRONGLY RECOMMENDED that you keep this under 30 minutes.
25
17
  config.passcode_lifespan = 10.minutes
26
-
27
- # The number of times an administrator can flunk their passcode
28
- # challenge or request a token before Tolaria disables their account.
29
18
  config.lockout_threshold = 10
30
-
31
- # The length of time that an administrator’s account is disabled
32
- # after they trip the lockout threshold.
33
19
  config.lockout_duration = 1.hour
34
20
 
35
- # An array of hashes used to construct HelpLinks
36
21
  config.help_links = []
37
22
 
38
- # Tolaria does not come bundled with a Markdown processing strategy.
39
- # You must provide a string that names a Ruby constant that can process Markdown.
40
- # The constant must respond to render(document), returning a string of HTML.
41
- # For example: if you provide "MyMarkDownRenderer", Tolaria will
42
- # call MyMarkdownRenderer.render(document).
43
23
  config.markdown_renderer = nil
24
+ config.page_size = 15
44
25
 
45
- # Tolaria attempts to convert models to a pretty “display”
46
- # string for presenting in forms and listings.
47
- # The methods below are tried in order on models until one responds.
48
- # Must be an array of symbols.
49
26
  config.display_name_methods = %i[
50
27
  admin_name
51
28
  display_name
@@ -59,11 +36,6 @@ Tolaria.configure do |config|
59
36
  id
60
37
  ]
61
38
 
62
- # The number of items on each page when paginating models.
63
- config.page_size = 15
64
-
65
- # Default permitted_params for all forms.
66
- # End-developers probably shouldn’t change this.
67
39
  config.permitted_params = %i[
68
40
  _method
69
41
  authenticity_token
@@ -1,7 +1,7 @@
1
1
  module Tolaria
2
2
 
3
3
  # Using this method, you can attempt to get a pretty “display”
4
- # string for presenting the passed +resource+ as a label.
4
+ # string for presenting the passed `resource` as a label.
5
5
  def self.display_name(resource)
6
6
  Tolaria.config.display_name_methods.each do |method_name|
7
7
  if resource.respond_to?(method_name)
@@ -2,7 +2,7 @@ module Tolaria
2
2
  module FormBuildable
3
3
 
4
4
  # Returns a `p.hint` used to explain a nearby form field containing
5
- # the given +hint_text+.
5
+ # the given `hint_text`.
6
6
  def hint(hint_text)
7
7
  content_tag(:p, content_tag(:span, hint_text.chomp), class:"hint")
8
8
  end
@@ -29,7 +29,7 @@ module Tolaria
29
29
 
30
30
  # Creates a `searchable_select` that also shows a dynamic image preview of the selected record.
31
31
  # Useful for previewing images or avatars chosen by name.
32
- # +preview_url_method+ should be a method name to call on the associated model instance
32
+ # `preview_url_method` should be a method name to call on the associated model instance
33
33
  # that returns a fully-qualified URL to the image preview.
34
34
  def image_association_select(method, collection, value_method, text_method, preview_url_method, options = {})
35
35
  render(partial:"admin/shared/forms/image_association_select", locals: {
@@ -44,7 +44,7 @@ module Tolaria
44
44
  })
45
45
  end
46
46
 
47
- # Renders a Markdown composer element for editing +method+,
47
+ # Renders a Markdown composer element for editing `method`,
48
48
  # with fullscreen previewing and some text assistance tools.
49
49
  # Requires that you set `Tolaria.config.markdown_renderer`.
50
50
  # Options are forwarded to `text_area`.
@@ -57,7 +57,7 @@ module Tolaria
57
57
  end
58
58
 
59
59
  # Returns a file upload field with a more pleasant interface than browser
60
- # file inputs. Changes messaging if the +method+ already exists.
60
+ # file inputs. Changes messaging if the `method` already exists.
61
61
  # Options are forwarded to the hidden `file_field`.
62
62
  def attachment_field(method, options = {})
63
63
  render(partial:"admin/shared/forms/attachment_field", locals: {
@@ -68,7 +68,7 @@ module Tolaria
68
68
  end
69
69
 
70
70
  # Returns an image upload field with a more pleasant interface than browser
71
- # file inputs. Changes messaging if the +method+ already exists.
71
+ # file inputs. Changes messaging if the `method` already exists.
72
72
  #
73
73
  # #### Special Options
74
74
  #
@@ -147,10 +147,10 @@ module Tolaria
147
147
  # You must use `f.has_many_header` inside the block to create headers.
148
148
  #
149
149
  # If you need to pass an ordered collection or otherwise not allow automatically
150
- # determining the association objects from the +association+ symbol you can
151
- # pass the collection manually as +association_objects+.
150
+ # determining the association objects from the `association` symbol you can
151
+ # pass the collection manually as `association_objects`.
152
152
  #
153
- # If +allow_create+ is `false` then the button to append a new model
153
+ # If `allow_create` is `false` then the button to append a new model
154
154
  # instance will be disabled. The default is `true`.
155
155
  def has_many(association, association_objects = nil, allow_create:true, &block)
156
156
 
@@ -180,7 +180,7 @@ module Tolaria
180
180
  end
181
181
 
182
182
  # Creates a header suitable for use inside `has_many` for separating
183
- # form elements. If +allow_destroy+ is `true`, controls will be exposed that allow
183
+ # form elements. If `allow_destroy` is `true`, controls will be exposed that allow
184
184
  # removing nested instances of the model. The default is `false` to match Rails’.
185
185
  def has_many_header(allow_destroy:false)
186
186
  render(partial:"admin/shared/forms/has_many_header", locals: {
@@ -2,6 +2,9 @@ module Tolaria
2
2
 
3
3
  @help_links = []
4
4
 
5
+ # Reads `Tolaria.config.help_links` and constructs an internal array
6
+ # of HelpLink objects with the given options.
7
+ # Call `Tolaria.help_links` to receive the results.
5
8
  def self.initialize_help_links!
6
9
  @help_links = []
7
10
  self.config.help_links.each do |hashy|
@@ -9,10 +12,12 @@ module Tolaria
9
12
  end
10
13
  end
11
14
 
15
+ # Returns all of Tolaria's configured Help Links.
12
16
  def self.help_links
13
17
  @help_links ||= []
14
18
  end
15
19
 
20
+ # Class representing a configured Tolaria help link.
16
21
  class HelpLink
17
22
 
18
23
  # The title of the link
@@ -25,11 +30,11 @@ module Tolaria
25
30
  attr_reader :link_to
26
31
 
27
32
  # Create a new HelpLink with the passed settings.
28
- # You must provide +title+, the title of the link.
33
+ # You must provide `title`, the title of the link.
29
34
  # To configure automatic rendering of a Markdown file, provide
30
- # a string +slug+ and the path to a +markdown_file+.
35
+ # a string `slug` and the path to a `markdown_file`.
31
36
  # A route to view the file will be constructed for you at `/admin/help/:slug`.
32
- # To link to an arbirary path or URI, provide it as +link_to+.
37
+ # To link to an arbitrary path or URI, provide it as `link_to`.
33
38
  def initialize(title:, slug:nil, markdown_file:nil, link_to:nil)
34
39
  @title = title.to_s.freeze
35
40
  @slug = slug.to_s.freeze
@@ -38,22 +43,22 @@ module Tolaria
38
43
  validate!
39
44
  end
40
45
 
41
- # True if this HelpLink is a link to an arbirary path
46
+ # True if this HelpLink is a link to an arbitrary path.
42
47
  def link_type?
43
48
  link_to.present?
44
49
  end
45
50
 
46
- # True if this HelpLink is a Markdown file
51
+ # True if this HelpLink is a Markdown file.
47
52
  def markdown_type?
48
53
  markdown_file.present?
49
54
  end
50
55
 
51
- # Quack like an ActiveRecord::Base model
56
+ # Quack like an ActiveRecord::Base model, returns slug.
52
57
  def to_param
53
58
  slug
54
59
  end
55
60
 
56
- # Raises RuntimeError if this HelpLink is incorrectly configured
61
+ # Raises RuntimeError if this HelpLink is incorrectly configured.
57
62
  def validate!
58
63
 
59
64
  if title.blank?
@@ -9,7 +9,7 @@ module Tolaria
9
9
  @safe_mangagment
10
10
  end
11
11
 
12
- # Set the value of Tolaria.safe_management. +bool+ should be truthy.
12
+ # Set the value of Tolaria.safe_management. `bool` should be truthy.
13
13
  # Don't call this method directly.
14
14
  def self.safe_management=(bool)
15
15
  @safe_mangagment = !!bool
@@ -47,7 +47,7 @@ module Tolaria
47
47
 
48
48
  end
49
49
 
50
- # Discard a managed class instance for the given ActiveRecord::Base
50
+ # Discard a managed class instance for the given ActiveRecord::Base class
51
51
  def self.discard_managed_class(klass)
52
52
  @managed_classes.delete_if do |managed_class|
53
53
  klass.to_s == managed_class.klass.to_s
@@ -1,7 +1,6 @@
1
- # This class wraps an ActiveRecord::Base descendant
2
- # and stores information that Tolaria needs to track about it
3
-
4
1
  module Tolaria
2
+
3
+ # Wraps an ActiveRecord::Base descendant and stores information that Tolaria needs to track about it
5
4
  class ManagedClass
6
5
 
7
6
  # The ActiveRecord::Base model we’re managing
@@ -13,7 +12,7 @@ module Tolaria
13
12
  # Items are sorted with lowest priority first in the menu
14
13
  attr_accessor :priority
15
14
 
16
- # The FontAwesome icon to use for this resource
15
+ # The Font Awesome icon to use for this resource
17
16
  attr_accessor :icon
18
17
 
19
18
  # An array of options to pass to `params.permit` for this model
@@ -29,7 +28,7 @@ module Tolaria
29
28
  attr_accessor :controller_name
30
29
 
31
30
  # An array of the route actions allowed on this resource.
32
- # Tolaria will pass this array as the `only:` option to the router
31
+ # Tolaria will pass this array as the `:only` option to the router
33
32
  attr_accessor :allowed_actions
34
33
 
35
34
  # A stored symbol for the `params.permit` key for this resource
@@ -87,4 +86,5 @@ module Tolaria
87
86
  delegate :plural, to: :model_name
88
87
 
89
88
  end
89
+
90
90
  end
@@ -1,13 +1,13 @@
1
1
  module Tolaria
2
2
 
3
- # A class to contain a workflow for rendering Markdown.
4
- # If no renderer has been configured, defer to simple_format.
3
+ # Contains a workflow for rendering Markdown.
4
+ # If no renderer has been configured, defers to `simple_format`.
5
5
  class MarkdownRendererProxy
6
6
 
7
7
  include ::ActionView::Helpers::TextHelper
8
8
 
9
9
  # Calls the configured Markdown renderer, if none exists
10
- # then uses simple_format to return more than nothing.
10
+ # then uses `simple_format` to return more than nothing.
11
11
  def render(document)
12
12
  if Tolaria.config.markdown_renderer.nil?
13
13
  return simple_format(document)
@@ -2,12 +2,13 @@ module Tolaria
2
2
  module RandomTokens
3
3
 
4
4
  # Returns a 32-character random, alphanumeric string suitable for stronger
5
- # tokens use like cookies and API keys
5
+ # token use like with cookies and API keys.
6
6
  def self.auth_token
7
7
  SecureRandom.base64(32).delete("+/=")[0..31]
8
8
  end
9
9
 
10
- # Returns a six-digit numeric code suitable for use as a one-time passphrase
10
+ # Returns a six-digit numeric code suitable for use as a one-time passphrase.
11
+ # Leading zeroes are possible, encompassing `000000`-`999999`.
11
12
  def self.passcode
12
13
  "%06d" % SecureRandom.random_number(1_000_000)
13
14
  end
@@ -4,7 +4,7 @@ module Tolaria
4
4
  # to force Rails to autoload/reload all model files.
5
5
  def self.reload!
6
6
 
7
- # Re/Initalize HelpLinks
7
+ # Re/Initialize HelpLinks
8
8
  self.initialize_help_links!
9
9
 
10
10
  # Manage the models included with the engine
@@ -2,7 +2,7 @@ module Tolaria
2
2
 
3
3
  # Returns Tolaria’s version number
4
4
  def self.version
5
- Gem::Version.new("1.0.0")
5
+ Gem::Version.new("1.0.1")
6
6
  end
7
7
 
8
8
  module VERSION
@@ -0,0 +1,105 @@
1
+ require "test_helper"
2
+
3
+ class CreateCardsMigration < ActiveRecord::Migration
4
+ def change
5
+ create_table :cards, force:true do |t|
6
+ t.timestamps null:false
7
+ t.string :title
8
+ end
9
+ end
10
+ end
11
+
12
+ class ForbiddenRoutesTest < ActionDispatch::IntegrationTest
13
+
14
+ def setup
15
+ ActiveRecord::Migration.verbose = false
16
+ CreateCardsMigration.new.exec_migration(ActiveRecord::Base.connection, :up)
17
+ end
18
+
19
+ def teardown
20
+ CreateCardsMigration.new.exec_migration(ActiveRecord::Base.connection, :down)
21
+ ActiveRecord::Migration.verbose = true
22
+ end
23
+
24
+ test "handles classes with only the index action" do
25
+
26
+ class ::Card < ActiveRecord::Base
27
+ manage_with_tolaria using:{
28
+ allowed_actions: [:index]
29
+ }
30
+ end
31
+
32
+ # Re-draw the routes and reload Tolaria
33
+ Rails.application.routes.draw do
34
+ Tolaria.draw_routes(self)
35
+ end
36
+
37
+ sign_in_dummy_administrator!
38
+ visit admin_cards_path
39
+ assert page.has_content?("Cards")
40
+ refute page.has_content?("Create Card")
41
+
42
+ # Unseat the Card class so that it doesn't leak out of this test
43
+ assert Tolaria.discard_managed_class(Card), "should discard class"
44
+ Object.send(:remove_const, :Card)
45
+
46
+ end
47
+
48
+ test "handles classes with only the show action" do
49
+
50
+ class ::Card < ActiveRecord::Base
51
+ manage_with_tolaria using:{
52
+ allowed_actions: [:show]
53
+ }
54
+ end
55
+
56
+ # Re-draw the routes and reload Tolaria
57
+ Rails.application.routes.draw do
58
+ Tolaria.draw_routes(self)
59
+ end
60
+
61
+ Card.create(title:"Urza")
62
+
63
+ sign_in_dummy_administrator!
64
+ visit admin_card_path(Card.first.id)
65
+ assert page.has_content?("Urza")
66
+ refute page.has_content?("Delete")
67
+
68
+ # Unseat the Card class so that it doesn't leak out of this test
69
+ assert Tolaria.discard_managed_class(Card), "should discard class"
70
+ Object.send(:remove_const, :Card)
71
+
72
+ end
73
+
74
+ test "handles avoiding the index" do
75
+
76
+ class ::Card < ActiveRecord::Base
77
+ manage_with_tolaria using:{
78
+ allowed_actions: [:show, :update, :edit, :destroy, :create, :new]
79
+ }
80
+ end
81
+
82
+ # Re-draw the routes and reload Tolaria
83
+ Rails.application.routes.draw do
84
+ Tolaria.draw_routes(self)
85
+ end
86
+
87
+ Card.create(title:"Urza")
88
+
89
+ sign_in_dummy_administrator!
90
+ visit admin_card_path(Card.first.id)
91
+ assert page.has_content?("Urza")
92
+ assert page.has_content?("Delete")
93
+ assert page.has_content?("Edit")
94
+
95
+ assert_raises ActionView::Template::Error do
96
+ visit new_admin_card_path
97
+ end
98
+
99
+ # Unseat the Card class so that it doesn't leak out of this test
100
+ assert Tolaria.discard_managed_class(Card), "should discard class"
101
+ Object.send(:remove_const, :Card)
102
+
103
+ end
104
+
105
+ end
@@ -27,7 +27,7 @@ Gem::Specification.new do |s|
27
27
 
28
28
  s.add_development_dependency "capybara", "~> 2.4"
29
29
  s.add_development_dependency "minitest", "~> 5.7"
30
- s.add_development_dependency "rdoc", "~> 4"
30
+ s.add_development_dependency "yard", "~> 0.6"
31
31
  s.add_development_dependency "redcarpet", "~> 3"
32
32
  s.add_development_dependency "sqlite3", "~> 1.3"
33
33
  s.add_development_dependency "timecop", "~> 0.7"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tolaria
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Corey Csuhta
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-06-19 00:00:00.000000000 Z
12
+ date: 2015-06-24 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bcrypt
@@ -124,19 +124,19 @@ dependencies:
124
124
  - !ruby/object:Gem::Version
125
125
  version: '5.7'
126
126
  - !ruby/object:Gem::Dependency
127
- name: rdoc
127
+ name: yard
128
128
  requirement: !ruby/object:Gem::Requirement
129
129
  requirements:
130
130
  - - "~>"
131
131
  - !ruby/object:Gem::Version
132
- version: '4'
132
+ version: '0.6'
133
133
  type: :development
134
134
  prerelease: false
135
135
  version_requirements: !ruby/object:Gem::Requirement
136
136
  requirements:
137
137
  - - "~>"
138
138
  - !ruby/object:Gem::Version
139
- version: '4'
139
+ version: '0.6'
140
140
  - !ruby/object:Gem::Dependency
141
141
  name: redcarpet
142
142
  requirement: !ruby/object:Gem::Requirement
@@ -189,6 +189,7 @@ extensions: []
189
189
  extra_rdoc_files: []
190
190
  files:
191
191
  - ".gitignore"
192
+ - ".travis.yml"
192
193
  - ".yardopts"
193
194
  - CNAME
194
195
  - CONTRIBUTING.md
@@ -327,10 +328,10 @@ files:
327
328
  - lib/tolaria/categories.rb
328
329
  - lib/tolaria/config.rb
329
330
  - lib/tolaria/default_config.rb
331
+ - lib/tolaria/display_name.rb
330
332
  - lib/tolaria/engine.rb
331
333
  - lib/tolaria/form_buildable.rb
332
334
  - lib/tolaria/help_links.rb
333
- - lib/tolaria/introspection.rb
334
335
  - lib/tolaria/manage.rb
335
336
  - lib/tolaria/managed_class.rb
336
337
  - lib/tolaria/markdown.rb
@@ -394,6 +395,7 @@ files:
394
395
  - test/demo/public/422.html
395
396
  - test/demo/public/500.html
396
397
  - test/demo/public/favicon.ico
398
+ - test/integration/forbidden_routes_test.rb
397
399
  - test/integration/help_link_test.rb
398
400
  - test/integration/interface_test.rb
399
401
  - test/integration/router_test.rb
@@ -486,6 +488,7 @@ test_files:
486
488
  - test/demo/public/422.html
487
489
  - test/demo/public/500.html
488
490
  - test/demo/public/favicon.ico
491
+ - test/integration/forbidden_routes_test.rb
489
492
  - test/integration/help_link_test.rb
490
493
  - test/integration/interface_test.rb
491
494
  - test/integration/router_test.rb