tb_core 1.4.7 → 1.5.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
 - data/README.md +2 -2
 - data/app/assets/javascripts/admin/core/application.js +3 -1
 - data/app/assets/javascripts/admin/core/editor.js +9 -71
 - data/app/controllers/admin/password_resets_controller.rb +1 -0
 - data/app/controllers/admin/users_controller.rb +2 -2
 - data/app/controllers/concerns/tb_core/error_handling.rb +1 -0
 - data/app/controllers/concerns/tb_core/redirection.rb +1 -0
 - data/app/controllers/concerns/tb_core/user_authentication.rb +5 -0
 - data/app/helpers/forgot_password_mailer_helper.rb +1 -0
 - data/app/helpers/tb_core/application_helper.rb +17 -0
 - data/app/models/concerns/tb_core/user_model.rb +42 -5
 - data/app/models/spud_role.rb +2 -7
 - data/app/views/layouts/admin/application.html.erb +2 -1
 - data/lib/generators/spud/module_generator.rb +3 -3
 - data/lib/generators/spud/setup_generator.rb +1 -1
 - data/lib/tb_core/belongs_to_app.rb +1 -0
 - data/lib/tb_core/engine.rb +2 -0
 - data/lib/tb_core/form_builder.rb +1 -1
 - data/lib/tb_core/regex.rb +12 -0
 - data/lib/tb_core/test_helper.rb +24 -22
 - data/lib/tb_core/version.rb +1 -1
 - data/spec/controllers/admin/application_controller_spec.rb +2 -2
 - data/spec/controllers/admin/dashboard_controller_spec.rb +1 -1
 - data/spec/controllers/admin/password_reset_controller_spec.rb +2 -2
 - data/spec/controllers/admin/settings_controller_spec.rb +1 -1
 - data/spec/controllers/admin/setup_controller_spec.rb +1 -1
 - data/spec/controllers/admin/user_sessions_controller_spec.rb +1 -1
 - data/spec/controllers/admin/users_controller_spec.rb +3 -3
 - data/spec/dummy/app/assets/config/manifest.js +3 -0
 - data/spec/dummy/config/application.rb +1 -46
 - data/spec/dummy/config/initializers/secret_token.rb +0 -1
 - data/spec/factories/spud_admin_permission_factories.rb +1 -1
 - data/spec/factories/spud_user_factories.rb +2 -2
 - metadata +54 -10
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 7be83cc72ea702d72548da1c9bf4d25eb632e154169ef241e11bfa845d842a3f
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 191e53b35d46f8f5b91acef66b14015cfb69fc6dd6cd57ae68db1ac9d8e6540e
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 3eb99e7178bd58e87539f5ffec183614fccd1a1aa801a7c531d962d0a4a8408228736007b62172f04bd344f402bbed45c7771b768eb1278b14218fa9a3d46b4a
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 04016da2d6563e8857c02c924b08878ecf238da9f63a871dd991498fc6f4765792a16c965b2053eb4add1ab75a71287af73d01475b52afa4596655ac2f8ee0d6
         
     | 
    
        data/README.md
    CHANGED
    
    | 
         @@ -1,4 +1,4 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            [](https://circleci.com/bb/moser-inc/tb_core)
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            Twice Baked Core
         
     | 
| 
       4 
4 
     | 
    
         
             
            ================
         
     | 
| 
         @@ -105,7 +105,7 @@ Create a file in your app at `app/views/admin/users/_form_additions.html.erb`. 
     | 
|
| 
       105 
105 
     | 
    
         
             
                  <%= f.label :avatar, :class=>"control-label"%>
         
     | 
| 
       106 
106 
     | 
    
         
             
                  <div class="controls">
         
     | 
| 
       107 
107 
     | 
    
         
             
                    <%= f.file_field :avatar %>
         
     | 
| 
       108 
     | 
    
         
            -
                  </div> 
     | 
| 
      
 108 
     | 
    
         
            +
                  </div>
         
     | 
| 
       109 
109 
     | 
    
         
             
                </div>
         
     | 
| 
       110 
110 
     | 
    
         | 
| 
       111 
111 
     | 
    
         
             
            ### Adding fields to the user show action
         
     | 
| 
         @@ -12,7 +12,9 @@ window.spud = { admin: window.tb }; 
     | 
|
| 
       12 
12 
     | 
    
         | 
| 
       13 
13 
     | 
    
         
             
            document.addEventListener('DOMContentLoaded', function() {
         
     | 
| 
       14 
14 
     | 
    
         | 
| 
       15 
     | 
    
         
            -
               
     | 
| 
      
 15 
     | 
    
         
            +
              if (typeof tinymce != "undefined") {
         
     | 
| 
      
 16 
     | 
    
         
            +
                tb.editor.init();
         
     | 
| 
      
 17 
     | 
    
         
            +
              }
         
     | 
| 
       16 
18 
     | 
    
         | 
| 
       17 
19 
     | 
    
         
             
              $("#modal_window .modal-footer .form-submit").bind('click', function() {
         
     | 
| 
       18 
20 
     | 
    
         
             
                $("#modal_window .modal-body form").submit();
         
     | 
| 
         @@ -14,62 +14,28 @@ tb.editor = {}; 
     | 
|
| 
       14 
14 
     | 
    
         
             
                'undo', 'redo', '|',
         
     | 
| 
       15 
15 
     | 
    
         
             
                'bold','italic','underline','strikethrough','|',
         
     | 
| 
       16 
16 
     | 
    
         
             
                'formatselect','|',
         
     | 
| 
       17 
     | 
    
         
            -
                'cut','copy','paste', ' 
     | 
| 
      
 17 
     | 
    
         
            +
                'cut','copy','paste', '|',
         
     | 
| 
       18 
18 
     | 
    
         
             
                'bullist','numlist','outdent','indent','|',
         
     | 
| 
       19 
19 
     | 
    
         
             
                'link','unlink','image', '|', 'code', '|'
         
     | 
| 
       20 
20 
     | 
    
         
             
              ];
         
     | 
| 
       21 
21 
     | 
    
         | 
| 
       22 
     | 
    
         
            -
              var validElements = "@[id|class|style|title|dir<ltr?rtl|lang|xml::lang|onclick|ondblclick|" +
         
     | 
| 
       23 
     | 
    
         
            -
                "onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|" +
         
     | 
| 
       24 
     | 
    
         
            -
                "onkeydown|onkeyup],a[rel|rev|charset|hreflang|tabindex|accesskey|type|" +
         
     | 
| 
       25 
     | 
    
         
            -
                "name|href|target|title|class|onfocus|onblur],strong/b,em/i,strike,u," +
         
     | 
| 
       26 
     | 
    
         
            -
                "#p,-ol[type|compact],-ul[type|compact],-li,br,img[longdesc|usemap|" +
         
     | 
| 
       27 
     | 
    
         
            -
                "src|border|alt=|title|hspace|vspace|width|height|align|hidpi_src],-sub,-sup," +
         
     | 
| 
       28 
     | 
    
         
            -
                "-blockquote,-table[border=0|cellspacing|cellpadding|width|frame|rules|" +
         
     | 
| 
       29 
     | 
    
         
            -
                "height|align|summary|bgcolor|background|bordercolor],-tr[rowspan|width|" +
         
     | 
| 
       30 
     | 
    
         
            -
                "height|align|valign|bgcolor|background|bordercolor],tbody,thead,tfoot," +
         
     | 
| 
       31 
     | 
    
         
            -
                "#td[colspan|rowspan|width|height|align|valign|bgcolor|background|bordercolor" +
         
     | 
| 
       32 
     | 
    
         
            -
                "|scope],#th[colspan|rowspan|width|height|align|valign|scope],caption,-div," +
         
     | 
| 
       33 
     | 
    
         
            -
                "-span,-code,-pre,address,-h1,-h2,-h3,-h4,-h5,-h6,hr[size|noshade],-font[face" +
         
     | 
| 
       34 
     | 
    
         
            -
                "|size|color],dd,dl,dt,cite,abbr,acronym,del[datetime|cite],ins[datetime|cite]," +
         
     | 
| 
       35 
     | 
    
         
            -
                "object[classid|width|height|codebase|*],param[name|value|_value],embed[type|width" +
         
     | 
| 
       36 
     | 
    
         
            -
                "|height|src|*],script[src|type],map[name],area[shape|coords|href|alt|target],bdo," +
         
     | 
| 
       37 
     | 
    
         
            -
                "button,col[align|char|charoff|span|valign|width],colgroup[align|char|charoff|span|" +
         
     | 
| 
       38 
     | 
    
         
            -
                "valign|width],dfn,fieldset,form[action|accept|accept-charset|enctype|method]," +
         
     | 
| 
       39 
     | 
    
         
            -
                "input[accept|alt|checked|disabled|maxlength|name|readonly|size|src|type|value]," +
         
     | 
| 
       40 
     | 
    
         
            -
                "kbd,label[for],legend,noscript,optgroup[label|disabled],option[disabled|label|selected|value]," +
         
     | 
| 
       41 
     | 
    
         
            -
                "q[cite],samp,select[disabled|multiple|name|size],small," +
         
     | 
| 
       42 
     | 
    
         
            -
                "textarea[cols|rows|disabled|name|readonly],tt,var,big";
         
     | 
| 
       43 
     | 
    
         
            -
             
     | 
| 
       44 
22 
     | 
    
         
             
              var extendedValidElements = [
         
     | 
| 
       45 
23 
     | 
    
         
             
                "iframe[src|width|height|name|align|frameborder|allowfullscreen]"
         
     | 
| 
       46 
24 
     | 
    
         
             
              ];
         
     | 
| 
       47 
25 
     | 
    
         | 
| 
       48 
26 
     | 
    
         
             
              editor.init = function(options) {
         
     | 
| 
       49 
27 
     | 
    
         
             
                editor.unload();
         
     | 
| 
       50 
     | 
    
         
            -
                editor.checkAndCallTinyMce(options);
         
     | 
| 
       51 
     | 
    
         
            -
              };
         
     | 
| 
       52 
28 
     | 
    
         | 
| 
       53 
     | 
    
         
            -
             
     | 
| 
       54 
     | 
    
         
            -
                var theme = options.theme || 'modern';
         
     | 
| 
       55 
     | 
    
         
            -
                var height = options.height || 400;
         
     | 
| 
       56 
     | 
    
         
            -
                var width = options.width || $(element).width();
         
     | 
| 
       57 
     | 
    
         
            -
                var buttons = options.buttons || registeredButtons;
         
     | 
| 
       58 
     | 
    
         
            -
                var plugins = options.plugins || registeredPlugins;
         
     | 
| 
      
 29 
     | 
    
         
            +
                options = options || { selector: 'textarea.tinymce' };
         
     | 
| 
       59 
30 
     | 
    
         | 
| 
       60 
     | 
    
         
            -
                 
     | 
| 
       61 
     | 
    
         
            -
                   
     | 
| 
       62 
     | 
    
         
            -
                   
     | 
| 
      
 31 
     | 
    
         
            +
                tinymce.init({
         
     | 
| 
      
 32 
     | 
    
         
            +
                  selector: options.selector,
         
     | 
| 
      
 33 
     | 
    
         
            +
                  height: 400,
         
     | 
| 
       63 
34 
     | 
    
         
             
                  menubar: false,
         
     | 
| 
       64 
     | 
    
         
            -
                   
     | 
| 
       65 
     | 
    
         
            -
                   
     | 
| 
       66 
     | 
    
         
            -
                   
     | 
| 
       67 
     | 
    
         
            -
             
     | 
| 
       68 
     | 
    
         
            -
                  media_strict: false,
         
     | 
| 
       69 
     | 
    
         
            -
                  extended_valid_elements: extendedValidElements.join(","),
         
     | 
| 
       70 
     | 
    
         
            -
                  width: width,
         
     | 
| 
       71 
     | 
    
         
            -
                  height: height
         
     | 
| 
       72 
     | 
    
         
            -
                });
         
     | 
| 
      
 35 
     | 
    
         
            +
                  toolbar: registeredButtons.join(' '),
         
     | 
| 
      
 36 
     | 
    
         
            +
                  plugins: registeredPlugins.join(' '),
         
     | 
| 
      
 37 
     | 
    
         
            +
                  extended_valid_elements: extendedValidElements.join(",")
         
     | 
| 
      
 38 
     | 
    
         
            +
                })
         
     | 
| 
       73 
39 
     | 
    
         
             
              };
         
     | 
| 
       74 
40 
     | 
    
         | 
| 
       75 
41 
     | 
    
         
             
              editor.unload = function() {
         
     | 
| 
         @@ -111,32 +77,4 @@ tb.editor = {}; 
     | 
|
| 
       111 
77 
     | 
    
         
             
                }
         
     | 
| 
       112 
78 
     | 
    
         
             
              };
         
     | 
| 
       113 
79 
     | 
    
         | 
| 
       114 
     | 
    
         
            -
              var loadScript = null;
         
     | 
| 
       115 
     | 
    
         
            -
             
     | 
| 
       116 
     | 
    
         
            -
              editor.checkAndCallTinyMce = function(options){
         
     | 
| 
       117 
     | 
    
         
            -
                options = options || {};
         
     | 
| 
       118 
     | 
    
         
            -
                var selector = options.selector || 'textarea.tinymce';
         
     | 
| 
       119 
     | 
    
         
            -
                var $elements = $(selector);
         
     | 
| 
       120 
     | 
    
         
            -
             
     | 
| 
       121 
     | 
    
         
            -
                if($elements.length === 0){
         
     | 
| 
       122 
     | 
    
         
            -
                  return;
         
     | 
| 
       123 
     | 
    
         
            -
                }
         
     | 
| 
       124 
     | 
    
         
            -
             
     | 
| 
       125 
     | 
    
         
            -
                if(loadScript === null){
         
     | 
| 
       126 
     | 
    
         
            -
                  loadScript = $.when(
         
     | 
| 
       127 
     | 
    
         
            -
                    $.ajax({url: '//cdn.tinymce.com/4.3/tinymce.min.js', dataType: 'script', cache: true}),
         
     | 
| 
       128 
     | 
    
         
            -
                    $.ajax({url: '//cdn.tinymce.com/4.3/jquery.tinymce.min.js', dataType: 'script', cache: true})
         
     | 
| 
       129 
     | 
    
         
            -
                  ).done(function(){
         
     | 
| 
       130 
     | 
    
         
            -
                    $('body').trigger("tb:tinymce-loaded");
         
     | 
| 
       131 
     | 
    
         
            -
                    editor.tinymce.loaded = true;
         
     | 
| 
       132 
     | 
    
         
            -
                  });
         
     | 
| 
       133 
     | 
    
         
            -
                }
         
     | 
| 
       134 
     | 
    
         
            -
             
     | 
| 
       135 
     | 
    
         
            -
                loadScript.done(function(){
         
     | 
| 
       136 
     | 
    
         
            -
                  $elements.each(function(){
         
     | 
| 
       137 
     | 
    
         
            -
                    editor.initMCEWithOptions(this, options);
         
     | 
| 
       138 
     | 
    
         
            -
                  });
         
     | 
| 
       139 
     | 
    
         
            -
                });
         
     | 
| 
       140 
     | 
    
         
            -
              };
         
     | 
| 
       141 
     | 
    
         
            -
             
     | 
| 
       142 
80 
     | 
    
         
             
            })();
         
     | 
| 
         @@ -43,6 +43,7 @@ private 
     | 
|
| 
       43 
43 
     | 
    
         
             
              def load_user_using_perishable_token
         
     | 
| 
       44 
44 
     | 
    
         
             
                @user = SpudUser.find_using_perishable_token(params[:id])
         
     | 
| 
       45 
45 
     | 
    
         
             
                return if @user
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
       46 
47 
     | 
    
         
             
                flash[:notice] = "We're sorry, but we could not locate your account. " +
         
     | 
| 
       47 
48 
     | 
    
         
             
                'If you are having issues try copying and pasting the URL ' +
         
     | 
| 
       48 
49 
     | 
    
         
             
                'from your email into your browser or restarting the ' +
         
     | 
| 
         @@ -8,8 +8,8 @@ class Admin::UsersController < Admin::ApplicationController 
     | 
|
| 
       8 
8 
     | 
    
         
             
              respond_to :html, :csv
         
     | 
| 
       9 
9 
     | 
    
         | 
| 
       10 
10 
     | 
    
         
             
              sortable_by :email, :current_login_at,
         
     | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
      
 11 
     | 
    
         
            +
                name: [:last_name, :first_name],
         
     | 
| 
      
 12 
     | 
    
         
            +
                default: :email
         
     | 
| 
       13 
13 
     | 
    
         | 
| 
       14 
14 
     | 
    
         
             
              def index
         
     | 
| 
       15 
15 
     | 
    
         
             
                @spud_users = SpudUser.order(sortable_query).paginate(page: params[:page], per_page: 15)
         
     | 
| 
         @@ -10,27 +10,32 @@ module TbCore 
     | 
|
| 
       10 
10 
     | 
    
         | 
| 
       11 
11 
     | 
    
         
             
                def current_user_session
         
     | 
| 
       12 
12 
     | 
    
         
             
                  return @current_user_session if defined?(@current_user_session)
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
       13 
14 
     | 
    
         
             
                  @current_user_session = SpudUserSession.find
         
     | 
| 
       14 
15 
     | 
    
         
             
                end
         
     | 
| 
       15 
16 
     | 
    
         | 
| 
       16 
17 
     | 
    
         
             
                def current_user
         
     | 
| 
       17 
18 
     | 
    
         
             
                  return @current_user if defined?(@current_user)
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
       18 
20 
     | 
    
         
             
                  @current_user = current_user_session&.spud_user
         
     | 
| 
       19 
21 
     | 
    
         
             
                end
         
     | 
| 
       20 
22 
     | 
    
         | 
| 
       21 
23 
     | 
    
         
             
                def current_user_id
         
     | 
| 
       22 
24 
     | 
    
         
             
                  return 0 unless @current_user
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
       23 
26 
     | 
    
         
             
                  @current_user.id
         
     | 
| 
       24 
27 
     | 
    
         
             
                end
         
     | 
| 
       25 
28 
     | 
    
         | 
| 
       26 
29 
     | 
    
         
             
                def require_user
         
     | 
| 
       27 
30 
     | 
    
         
             
                  raise UnauthorizedError.new unless current_user
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
       28 
32 
     | 
    
         
             
                  true
         
     | 
| 
       29 
33 
     | 
    
         
             
                end
         
     | 
| 
       30 
34 
     | 
    
         | 
| 
       31 
35 
     | 
    
         
             
                def require_admin_user
         
     | 
| 
       32 
36 
     | 
    
         
             
                  raise UnauthorizedError.new unless current_user
         
     | 
| 
       33 
37 
     | 
    
         
             
                  raise AccessDeniedError.new unless current_user.admin_rights?
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
       34 
39 
     | 
    
         
             
                  true
         
     | 
| 
       35 
40 
     | 
    
         
             
                end
         
     | 
| 
       36 
41 
     | 
    
         | 
| 
         @@ -1,6 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            module ForgotPasswordMailerHelper
         
     | 
| 
       2 
2 
     | 
    
         
             
              def perishable_token_link_expiration_time_text(user)
         
     | 
| 
       3 
3 
     | 
    
         
             
                return if user.class.perishable_token_valid_for.blank?
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
       4 
5 
     | 
    
         
             
                expiration_time = user.updated_at + user.class.perishable_token_valid_for
         
     | 
| 
       5 
6 
     | 
    
         | 
| 
       6 
7 
     | 
    
         
             
                "This link will expire in #{distance_of_time_in_words(Time.current, expiration_time)}."
         
     | 
| 
         @@ -13,6 +13,21 @@ module TbCore::ApplicationHelper 
     | 
|
| 
       13 
13 
     | 
    
         
             
                return form_for(record, options, &block)
         
     | 
| 
       14 
14 
     | 
    
         
             
              end
         
     | 
| 
       15 
15 
     | 
    
         | 
| 
      
 16 
     | 
    
         
            +
              def tb_form_with(record, **options, &block)
         
     | 
| 
      
 17 
     | 
    
         
            +
                options[:builder] = TbCore::FormBuilder
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                options[:html] ||= {}
         
     | 
| 
      
 20 
     | 
    
         
            +
                if options[:html][:class]
         
     | 
| 
      
 21 
     | 
    
         
            +
                  options[:html][:class] += ' form-horizontal'
         
     | 
| 
      
 22 
     | 
    
         
            +
                else
         
     | 
| 
      
 23 
     | 
    
         
            +
                  options[:html][:class] = 'form-horizontal'
         
     | 
| 
      
 24 
     | 
    
         
            +
                end
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
                options[:model] = record
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
                return form_with(options, &block)
         
     | 
| 
      
 29 
     | 
    
         
            +
              end
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
       16 
31 
     | 
    
         
             
              def tb_form_errors(record, *fields_to_display)
         
     | 
| 
       17 
32 
     | 
    
         
             
                if record.errors.any?
         
     | 
| 
       18 
33 
     | 
    
         
             
                  content_tag :div, class: 'form-errors test' do
         
     | 
| 
         @@ -56,6 +71,7 @@ module TbCore::ApplicationHelper 
     | 
|
| 
       56 
71 
     | 
    
         
             
                end
         
     | 
| 
       57 
72 
     | 
    
         
             
              end
         
     | 
| 
       58 
73 
     | 
    
         | 
| 
      
 74 
     | 
    
         
            +
              # rubocop:disable Rails/HelperInstanceVariable
         
     | 
| 
       59 
75 
     | 
    
         
             
              def tb_page_title
         
     | 
| 
       60 
76 
     | 
    
         
             
                if content_for?(:title)
         
     | 
| 
       61 
77 
     | 
    
         
             
                  title = content_for(:title) + ' | ' + TbCore.site_name
         
     | 
| 
         @@ -66,6 +82,7 @@ module TbCore::ApplicationHelper 
     | 
|
| 
       66 
82 
     | 
    
         
             
                end
         
     | 
| 
       67 
83 
     | 
    
         
             
                return content_tag :title, title
         
     | 
| 
       68 
84 
     | 
    
         
             
              end
         
     | 
| 
      
 85 
     | 
    
         
            +
              # rubocop:enable Rails/HelperInstanceVariable
         
     | 
| 
       69 
86 
     | 
    
         | 
| 
       70 
87 
     | 
    
         
             
              def current_site_name
         
     | 
| 
       71 
88 
     | 
    
         
             
                return TbCore.config.site_name
         
     | 
| 
         @@ -2,26 +2,27 @@ module TbCore 
     | 
|
| 
       2 
2 
     | 
    
         
             
              module UserModel
         
     | 
| 
       3 
3 
     | 
    
         
             
                extend ActiveSupport::Concern
         
     | 
| 
       4 
4 
     | 
    
         | 
| 
      
 5 
     | 
    
         
            +
                # rubocop:disable Metrics/BlockLength
         
     | 
| 
       5 
6 
     | 
    
         
             
                included do
         
     | 
| 
       6 
7 
     | 
    
         
             
                  self.table_name = 'spud_users'
         
     | 
| 
       7 
8 
     | 
    
         | 
| 
       8 
9 
     | 
    
         
             
                  acts_as_authentic do |c|
         
     | 
| 
       9 
     | 
    
         
            -
                    c.transition_from_crypto_providers = Authlogic::CryptoProviders::Sha512
         
     | 
| 
       10 
10 
     | 
    
         
             
                    c.crypto_provider = Authlogic::CryptoProviders::SCrypt
         
     | 
| 
       11 
11 
     | 
    
         
             
                    c.logged_in_timeout = 24.hours
         
     | 
| 
       12 
12 
     | 
    
         
             
                    c.login_field = :email if TbCore.config.use_email_as_login
         
     | 
| 
       13 
     | 
    
         
            -
                     
     | 
| 
       14 
     | 
    
         
            -
                      c.merge_validates_length_of_password_field_options(minimum: TbCore.config.user_password_length)
         
     | 
| 
       15 
     | 
    
         
            -
                    end
         
     | 
| 
      
 13 
     | 
    
         
            +
                    c.require_password_confirmation = true
         
     | 
| 
       16 
14 
     | 
    
         
             
                  end
         
     | 
| 
       17 
15 
     | 
    
         | 
| 
      
 16 
     | 
    
         
            +
                  attr_accessor :password_confirmation
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
       18 
18 
     | 
    
         
             
                  belongs_to :role,
         
     | 
| 
       19 
     | 
    
         
            -
                    class_name: SpudRole 
     | 
| 
      
 19 
     | 
    
         
            +
                    class_name: 'SpudRole', foreign_key: :spud_role_id, optional: true
         
     | 
| 
       20 
20 
     | 
    
         
             
                  has_many :spud_user_settings,
         
     | 
| 
       21 
21 
     | 
    
         
             
                    dependent: :destroy, foreign_key: :spud_user_id
         
     | 
| 
       22 
22 
     | 
    
         | 
| 
       23 
23 
     | 
    
         
             
                  validates :first_name, :last_name, presence: true
         
     | 
| 
       24 
24 
     | 
    
         
             
                  before_validation :set_login_to_email, if: -> { TbCore.config.use_email_as_login }
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
       25 
26 
     | 
    
         
             
                  before_update :unset_requires_password_change
         
     | 
| 
       26 
27 
     | 
    
         | 
| 
       27 
28 
     | 
    
         
             
                  scope :admins, lambda {
         
     | 
| 
         @@ -29,7 +30,37 @@ module TbCore 
     | 
|
| 
       29 
30 
     | 
    
         
             
                  }
         
     | 
| 
       30 
31 
     | 
    
         | 
| 
       31 
32 
     | 
    
         
             
                  scope :ordered, -> { order('last_name asc, first_name asc, email asc') }
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
                  # These used to be built in to Authlogic
         
     | 
| 
      
 35 
     | 
    
         
            +
                  # See: https://github.com/binarylogic/authlogic/blob/5986e1bd056ccecc519d9f49cc83a0ba757668b4/doc/use_normal_rails_validation.md
         
     | 
| 
      
 36 
     | 
    
         
            +
                  validates :email,
         
     | 
| 
      
 37 
     | 
    
         
            +
                    format: {
         
     | 
| 
      
 38 
     | 
    
         
            +
                      with: ::TbCore::Regex::EMAIL,
         
     | 
| 
      
 39 
     | 
    
         
            +
                      message: proc {
         
     | 
| 
      
 40 
     | 
    
         
            +
                        ::Authlogic::I18n.t(
         
     | 
| 
      
 41 
     | 
    
         
            +
                          'error_messages.email_invalid',
         
     | 
| 
      
 42 
     | 
    
         
            +
                          default: 'should look like an email address.'
         
     | 
| 
      
 43 
     | 
    
         
            +
                        )
         
     | 
| 
      
 44 
     | 
    
         
            +
                      }
         
     | 
| 
      
 45 
     | 
    
         
            +
                    },
         
     | 
| 
      
 46 
     | 
    
         
            +
                    length: { maximum: 100 },
         
     | 
| 
      
 47 
     | 
    
         
            +
                    uniqueness: {
         
     | 
| 
      
 48 
     | 
    
         
            +
                      case_sensitive: false,
         
     | 
| 
      
 49 
     | 
    
         
            +
                      if: :will_save_change_to_email?
         
     | 
| 
      
 50 
     | 
    
         
            +
                    }
         
     | 
| 
      
 51 
     | 
    
         
            +
                  validates :password,
         
     | 
| 
      
 52 
     | 
    
         
            +
                    confirmation: { if: :require_password? },
         
     | 
| 
      
 53 
     | 
    
         
            +
                    length: {
         
     | 
| 
      
 54 
     | 
    
         
            +
                      minimum: 8,
         
     | 
| 
      
 55 
     | 
    
         
            +
                      if: :require_password?
         
     | 
| 
      
 56 
     | 
    
         
            +
                    }
         
     | 
| 
      
 57 
     | 
    
         
            +
                  validates :password_confirmation,
         
     | 
| 
      
 58 
     | 
    
         
            +
                    length: {
         
     | 
| 
      
 59 
     | 
    
         
            +
                      minimum: 8,
         
     | 
| 
      
 60 
     | 
    
         
            +
                      if: :require_password?
         
     | 
| 
      
 61 
     | 
    
         
            +
                    }
         
     | 
| 
       32 
62 
     | 
    
         
             
                end
         
     | 
| 
      
 63 
     | 
    
         
            +
                # rubocop:enable Metrics/BlockLength
         
     | 
| 
       33 
64 
     | 
    
         | 
| 
       34 
65 
     | 
    
         
             
                module ClassMethods
         
     | 
| 
       35 
66 
     | 
    
         | 
| 
         @@ -69,6 +100,7 @@ module TbCore 
     | 
|
| 
       69 
100 
     | 
    
         | 
| 
       70 
101 
     | 
    
         
             
                def full_name
         
     | 
| 
       71 
102 
     | 
    
         
             
                  return login if first_name.blank? && last_name.blank?
         
     | 
| 
      
 103 
     | 
    
         
            +
             
     | 
| 
       72 
104 
     | 
    
         
             
                  [first_name, last_name].reject(&:blank?).join(' ')
         
     | 
| 
       73 
105 
     | 
    
         
             
                end
         
     | 
| 
       74 
106 
     | 
    
         | 
| 
         @@ -79,12 +111,14 @@ module TbCore 
     | 
|
| 
       79 
111 
     | 
    
         
             
                # Returns true if user can view at least one dashboard app
         
     | 
| 
       80 
112 
     | 
    
         
             
                def admin_rights?
         
     | 
| 
       81 
113 
     | 
    
         
             
                  return true if super_admin
         
     | 
| 
      
 114 
     | 
    
         
            +
             
     | 
| 
       82 
115 
     | 
    
         
             
                  TbCore.admin_applications.find { |app| can_view_app?(app) }.present?
         
     | 
| 
       83 
116 
     | 
    
         
             
                end
         
     | 
| 
       84 
117 
     | 
    
         | 
| 
       85 
118 
     | 
    
         
             
                # Returns true if the user can view a spud app based on it's key
         
     | 
| 
       86 
119 
     | 
    
         
             
                def can_view_app?(admin_application)
         
     | 
| 
       87 
120 
     | 
    
         
             
                  return true if super_admin?
         
     | 
| 
      
 121 
     | 
    
         
            +
             
     | 
| 
       88 
122 
     | 
    
         
             
                  key = admin_application[:key]
         
     | 
| 
       89 
123 
     | 
    
         
             
                  permissions.find { |p| p.apps.include?(key) }.present?
         
     | 
| 
       90 
124 
     | 
    
         
             
                end
         
     | 
| 
         @@ -95,6 +129,7 @@ module TbCore 
     | 
|
| 
       95 
129 
     | 
    
         
             
                # * if multiple tags are supplied, return true if ALL tags match
         
     | 
| 
       96 
130 
     | 
    
         
             
                def permission?(*tags)
         
     | 
| 
       97 
131 
     | 
    
         
             
                  return true if super_admin?
         
     | 
| 
      
 132 
     | 
    
         
            +
             
     | 
| 
       98 
133 
     | 
    
         
             
                  my_tags = permissions.collect(&:tag)
         
     | 
| 
       99 
134 
     | 
    
         
             
                  tags.find { |tag| !my_tags.include?(tag) }.blank?
         
     | 
| 
       100 
135 
     | 
    
         
             
                end
         
     | 
| 
         @@ -105,12 +140,14 @@ module TbCore 
     | 
|
| 
       105 
140 
     | 
    
         
             
                # * if multiple tags are supplied, return true if ANY tag matches
         
     | 
| 
       106 
141 
     | 
    
         
             
                def any_permission?(*tags)
         
     | 
| 
       107 
142 
     | 
    
         
             
                  return true if super_admin?
         
     | 
| 
      
 143 
     | 
    
         
            +
             
     | 
| 
       108 
144 
     | 
    
         
             
                  permissions.find { |p| tags.include?(p.tag) }.present?
         
     | 
| 
       109 
145 
     | 
    
         
             
                end
         
     | 
| 
       110 
146 
     | 
    
         | 
| 
       111 
147 
     | 
    
         
             
                # Return a list of SpudPermission objects for the user's SpudRole
         
     | 
| 
       112 
148 
     | 
    
         
             
                def permissions
         
     | 
| 
       113 
149 
     | 
    
         
             
                  return [] if role.blank?
         
     | 
| 
      
 150 
     | 
    
         
            +
             
     | 
| 
       114 
151 
     | 
    
         
             
                  role.permissions
         
     | 
| 
       115 
152 
     | 
    
         
             
                end
         
     | 
| 
       116 
153 
     | 
    
         | 
    
        data/app/models/spud_role.rb
    CHANGED
    
    | 
         @@ -14,14 +14,9 @@ class SpudRole < ActiveRecord::Base 
     | 
|
| 
       14 
14 
     | 
    
         
             
              end
         
     | 
| 
       15 
15 
     | 
    
         | 
| 
       16 
16 
     | 
    
         
             
              def permission_tags=(tags)
         
     | 
| 
       17 
     | 
    
         
            -
                self.spud_role_permissions. 
     | 
| 
       18 
     | 
    
         
            -
                   
     | 
| 
       19 
     | 
    
         
            -
                    role_permission.destroy()
         
     | 
| 
       20 
     | 
    
         
            -
                  else
         
     | 
| 
       21 
     | 
    
         
            -
                    tags.delete(role_permission.permission.tag)
         
     | 
| 
       22 
     | 
    
         
            -
                  end
         
     | 
| 
      
 17 
     | 
    
         
            +
                self.spud_role_permissions = tags.map do |tag|
         
     | 
| 
      
 18 
     | 
    
         
            +
                  SpudRolePermission.new(spud_permission_tag: tag)
         
     | 
| 
       23 
19 
     | 
    
         
             
                end
         
     | 
| 
       24 
     | 
    
         
            -
                self.spud_role_permissions += tags.collect{ |tag| SpudRolePermission.new(spud_permission_tag: tag) }
         
     | 
| 
       25 
20 
     | 
    
         
             
              end
         
     | 
| 
       26 
21 
     | 
    
         | 
| 
       27 
22 
     | 
    
         
             
              def permission_tags
         
     | 
| 
         @@ -2,6 +2,7 @@ 
     | 
|
| 
       2 
2 
     | 
    
         
             
            <html lang="en">
         
     | 
| 
       3 
3 
     | 
    
         
             
            <head>
         
     | 
| 
       4 
4 
     | 
    
         
             
              <title><%= TbCore.config.site_name %> Admin</title>
         
     | 
| 
      
 5 
     | 
    
         
            +
              <%= tinymce_assets unless ENV['TB_SKIP_TINYMCE'] %>
         
     | 
| 
       5 
6 
     | 
    
         
             
              <%= stylesheet_link_tag *TbCore.config.admin_stylesheets %>
         
     | 
| 
       6 
7 
     | 
    
         
             
              <%= javascript_include_tag *TbCore.config.admin_javascripts %>
         
     | 
| 
       7 
8 
     | 
    
         
             
              <%= csrf_meta_tags %>
         
     | 
| 
         @@ -49,7 +50,7 @@ 
     | 
|
| 
       49 
50 
     | 
    
         
             
                    <h3 class="modal-title"></h3>
         
     | 
| 
       50 
51 
     | 
    
         
             
                  </div>
         
     | 
| 
       51 
52 
     | 
    
         
             
                  <div class="modal-body">
         
     | 
| 
       52 
     | 
    
         
            -
                    <p 
     | 
| 
      
 53 
     | 
    
         
            +
                    <p>...</p>
         
     | 
| 
       53 
54 
     | 
    
         
             
                  </div>
         
     | 
| 
       54 
55 
     | 
    
         
             
                  <div class="modal-footer modal-footer-default">
         
     | 
| 
       55 
56 
     | 
    
         
             
                    <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
         
     | 
| 
         @@ -79,7 +79,7 @@ class Spud::ModuleGenerator < ::Rails::Generators::Base 
     | 
|
| 
       79 
79 
     | 
    
         
             
                      resources :#{module_name_formatted}
         
     | 
| 
       80 
80 
     | 
    
         
             
                    end
         
     | 
| 
       81 
81 
     | 
    
         
             
                    resources :#{module_name_formatted}, :only => [:index, :show]
         
     | 
| 
       82 
     | 
    
         
            -
            RUBY
         
     | 
| 
      
 82 
     | 
    
         
            +
                RUBY
         
     | 
| 
       83 
83 
     | 
    
         
             
              end
         
     | 
| 
       84 
84 
     | 
    
         | 
| 
       85 
85 
     | 
    
         
             
              def create_specs
         
     | 
| 
         @@ -136,7 +136,7 @@ RUBY 
     | 
|
| 
       136 
136 
     | 
    
         
             
                inject_into_file "app/models/#{module_name.singularize.underscore}.rb", after: "ApplicationRecord\n" do <<-RUBY
         
     | 
| 
       137 
137 
     | 
    
         
             
              scope :ordered, -> { order(#{sort_field}: :desc) }
         
     | 
| 
       138 
138 
     | 
    
         
             
              scope :search, ->(term) { where('#{search_field} LIKE ?', "%\#{term}%") }
         
     | 
| 
       139 
     | 
    
         
            -
            RUBY
         
     | 
| 
      
 139 
     | 
    
         
            +
                RUBY
         
     | 
| 
       140 
140 
     | 
    
         
             
                end
         
     | 
| 
       141 
141 
     | 
    
         
             
              end
         
     | 
| 
       142 
142 
     | 
    
         | 
| 
         @@ -156,7 +156,7 @@ RUBY 
     | 
|
| 
       156 
156 
     | 
    
         | 
| 
       157 
157 
     | 
    
         
             
              validates #{string_attrs_as_symbols}, :length => {:maximum => 255}
         
     | 
| 
       158 
158 
     | 
    
         | 
| 
       159 
     | 
    
         
            -
             
     | 
| 
      
 159 
     | 
    
         
            +
                  RUBY
         
     | 
| 
       160 
160 
     | 
    
         
             
                  end
         
     | 
| 
       161 
161 
     | 
    
         
             
                end
         
     | 
| 
       162 
162 
     | 
    
         
             
              end
         
     | 
| 
         @@ -38,6 +38,7 @@ module TbCore 
     | 
|
| 
       38 
38 
     | 
    
         
             
                  elsif !current_user.can_view_app?(@page_application)
         
     | 
| 
       39 
39 
     | 
    
         
             
                    raise AccessDeniedError.new(item: 'module', template: '/layouts/admin/error_page')
         
     | 
| 
       40 
40 
     | 
    
         
             
                  end
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
       41 
42 
     | 
    
         
             
                  @page_thumbnail = @page_application[:thumbnail]
         
     | 
| 
       42 
43 
     | 
    
         
             
                  @page_name = determine_page_name(page_title || @page_application[:name], action_name)
         
     | 
| 
       43 
44 
     | 
    
         
             
                end
         
     | 
    
        data/lib/tb_core/engine.rb
    CHANGED
    
    | 
         @@ -7,6 +7,7 @@ require 'will_paginate-bootstrap' 
     | 
|
| 
       7 
7 
     | 
    
         
             
            require 'breadcrumbs_on_rails'
         
     | 
| 
       8 
8 
     | 
    
         
             
            require 'rails-ujs'
         
     | 
| 
       9 
9 
     | 
    
         
             
            require 'sortable_by'
         
     | 
| 
      
 10 
     | 
    
         
            +
            require 'tinymce-rails'
         
     | 
| 
       10 
11 
     | 
    
         | 
| 
       11 
12 
     | 
    
         
             
            module Spud
         
     | 
| 
       12 
13 
     | 
    
         
             
            end
         
     | 
| 
         @@ -15,6 +16,7 @@ module TbCore 
     | 
|
| 
       15 
16 
     | 
    
         
             
              class Engine < ::Rails::Engine
         
     | 
| 
       16 
17 
     | 
    
         
             
                require "#{root}/lib/tb_core/errors"
         
     | 
| 
       17 
18 
     | 
    
         
             
                require "#{root}/lib/tb_core/form_builder"
         
     | 
| 
      
 19 
     | 
    
         
            +
                require "#{root}/lib/tb_core/regex"
         
     | 
| 
       18 
20 
     | 
    
         
             
                require "#{root}/lib/tb_core/searchable"
         
     | 
| 
       19 
21 
     | 
    
         
             
                require "#{root}/lib/tb_core/spud_core"
         
     | 
| 
       20 
22 
     | 
    
         | 
    
        data/lib/tb_core/form_builder.rb
    CHANGED
    
    | 
         @@ -219,7 +219,7 @@ class TbCore::FormBuilder < ActionView::Helpers::FormBuilder 
     | 
|
| 
       219 
219 
     | 
    
         
             
              # Builds a file field group
         
     | 
| 
       220 
220 
     | 
    
         
             
              #
         
     | 
| 
       221 
221 
     | 
    
         
             
              def tb_file_field(attribute, options={})
         
     | 
| 
       222 
     | 
    
         
            -
                tb_input_field(attribute) do
         
     | 
| 
      
 222 
     | 
    
         
            +
                tb_input_field(attribute, nil, options) do
         
     | 
| 
       223 
223 
     | 
    
         
             
                  file_field(attribute)
         
     | 
| 
       224 
224 
     | 
    
         
             
                end
         
     | 
| 
       225 
225 
     | 
    
         
             
              end
         
     | 
    
        data/lib/tb_core/test_helper.rb
    CHANGED
    
    | 
         @@ -1,29 +1,31 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            require 'authlogic/test_case'
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
     | 
    
         
            -
            module TbCore 
     | 
| 
       4 
     | 
    
         
            -
               
     | 
| 
      
 3 
     | 
    
         
            +
            module TbCore
         
     | 
| 
      
 4 
     | 
    
         
            +
              module TestHelper
         
     | 
| 
      
 5 
     | 
    
         
            +
                include Authlogic::TestCase
         
     | 
| 
       5 
6 
     | 
    
         | 
| 
       6 
     | 
    
         
            -
             
     | 
| 
       7 
     | 
    
         
            -
             
     | 
| 
       8 
     | 
    
         
            -
             
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
             
     | 
| 
       15 
     | 
    
         
            -
             
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
      
 7 
     | 
    
         
            +
                # Use this helper in controller specs to establish a login session
         
     | 
| 
      
 8 
     | 
    
         
            +
                # - admin: Set to true to create a super_admin
         
     | 
| 
      
 9 
     | 
    
         
            +
                # - permissions: One or more permissions you want to assign to the user (a role will be auto generated)
         
     | 
| 
      
 10 
     | 
    
         
            +
                #
         
     | 
| 
      
 11 
     | 
    
         
            +
                def activate_session(admin: false, permissions: nil)
         
     | 
| 
      
 12 
     | 
    
         
            +
                  activate_authlogic()
         
     | 
| 
      
 13 
     | 
    
         
            +
                  if permissions
         
     | 
| 
      
 14 
     | 
    
         
            +
                    permissions = [permissions] unless permissions.is_a?(Array)
         
     | 
| 
      
 15 
     | 
    
         
            +
                    role = SpudRole.create(name: 'New Role', permission_tags: permissions)
         
     | 
| 
      
 16 
     | 
    
         
            +
                  else
         
     | 
| 
      
 17 
     | 
    
         
            +
                    role = nil
         
     | 
| 
      
 18 
     | 
    
         
            +
                  end
         
     | 
| 
      
 19 
     | 
    
         
            +
                  @user = FactoryBot.create(:spud_user, super_admin: admin, role: role)
         
     | 
| 
      
 20 
     | 
    
         
            +
                  SpudUserSession.create(@user)
         
     | 
| 
      
 21 
     | 
    
         
            +
                  return @user
         
     | 
| 
       17 
22 
     | 
    
         
             
                end
         
     | 
| 
       18 
     | 
    
         
            -
                @user = FactoryBot.create(:spud_user, super_admin: admin, role: role)
         
     | 
| 
       19 
     | 
    
         
            -
                SpudUserSession.create(@user)
         
     | 
| 
       20 
     | 
    
         
            -
                return @user
         
     | 
| 
       21 
     | 
    
         
            -
              end
         
     | 
| 
       22 
23 
     | 
    
         | 
| 
       23 
     | 
    
         
            -
             
     | 
| 
       24 
     | 
    
         
            -
             
     | 
| 
       25 
     | 
    
         
            -
             
     | 
| 
       26 
     | 
    
         
            -
             
     | 
| 
      
 24 
     | 
    
         
            +
                # Returns the current user
         
     | 
| 
      
 25 
     | 
    
         
            +
                #
         
     | 
| 
      
 26 
     | 
    
         
            +
                def current_user
         
     | 
| 
      
 27 
     | 
    
         
            +
                  return @user
         
     | 
| 
      
 28 
     | 
    
         
            +
                end
         
     | 
| 
       27 
29 
     | 
    
         
             
              end
         
     | 
| 
       28 
30 
     | 
    
         
             
            end
         
     | 
| 
       29 
31 
     | 
    
         | 
| 
         @@ -31,7 +33,7 @@ end 
     | 
|
| 
       31 
33 
     | 
    
         
             
            #
         
     | 
| 
       32 
34 
     | 
    
         
             
            if defined?(RSpec)
         
     | 
| 
       33 
35 
     | 
    
         
             
              RSpec.configure do |config|
         
     | 
| 
       34 
     | 
    
         
            -
                config.include TbCore:: 
     | 
| 
      
 36 
     | 
    
         
            +
                config.include TbCore::TestHelper
         
     | 
| 
       35 
37 
     | 
    
         
             
              end
         
     | 
| 
       36 
38 
     | 
    
         
             
            end
         
     | 
| 
       37 
39 
     | 
    
         | 
    
        data/lib/tb_core/version.rb
    CHANGED
    
    
| 
         @@ -19,7 +19,7 @@ RSpec.describe Admin::ApplicationController, type: :controller do 
     | 
|
| 
       19 
19 
     | 
    
         
             
                it 'should respond successfully if the current user is a super admin' do
         
     | 
| 
       20 
20 
     | 
    
         
             
                  @user.update(super_admin: true)
         
     | 
| 
       21 
21 
     | 
    
         
             
                  get :index
         
     | 
| 
       22 
     | 
    
         
            -
                  expect(response).to  
     | 
| 
      
 22 
     | 
    
         
            +
                  expect(response).to be_successful
         
     | 
| 
       23 
23 
     | 
    
         
             
                end
         
     | 
| 
       24 
24 
     | 
    
         | 
| 
       25 
25 
     | 
    
         
             
                it 'should respond successfully if the current user has admin permissions' do
         
     | 
| 
         @@ -28,7 +28,7 @@ RSpec.describe Admin::ApplicationController, type: :controller do 
     | 
|
| 
       28 
28 
     | 
    
         
             
                  @user.role = @role
         
     | 
| 
       29 
29 
     | 
    
         
             
                  @user.save
         
     | 
| 
       30 
30 
     | 
    
         
             
                  get :index
         
     | 
| 
       31 
     | 
    
         
            -
                  expect(response).to  
     | 
| 
      
 31 
     | 
    
         
            +
                  expect(response).to be_successful
         
     | 
| 
       32 
32 
     | 
    
         
             
                end
         
     | 
| 
       33 
33 
     | 
    
         | 
| 
       34 
34 
     | 
    
         
             
                it 'should redirect to the login if the current user is not logged in' do
         
     | 
| 
         @@ -69,7 +69,7 @@ RSpec.describe Admin::DashboardController, type: :controller do 
     | 
|
| 
       69 
69 
     | 
    
         
             
                it 'should contain data array in reponse' do
         
     | 
| 
       70 
70 
     | 
    
         
             
                  get :badges
         
     | 
| 
       71 
71 
     | 
    
         
             
                  json = JSON.parse(response.body)
         
     | 
| 
       72 
     | 
    
         
            -
                  expect(response. 
     | 
| 
      
 72 
     | 
    
         
            +
                  expect(response.media_type).to eq('application/json')
         
     | 
| 
       73 
73 
     | 
    
         
             
                  expect(json).to have_key('data')
         
     | 
| 
       74 
74 
     | 
    
         
             
                end
         
     | 
| 
       75 
75 
     | 
    
         | 
| 
         @@ -8,7 +8,7 @@ describe Admin::PasswordResetsController, type: :controller do 
     | 
|
| 
       8 
8 
     | 
    
         
             
                describe 'index' do
         
     | 
| 
       9 
9 
     | 
    
         
             
                  it 'should return success' do
         
     | 
| 
       10 
10 
     | 
    
         
             
                    get :index
         
     | 
| 
       11 
     | 
    
         
            -
                    expect(response).to  
     | 
| 
      
 11 
     | 
    
         
            +
                    expect(response).to be_successful
         
     | 
| 
       12 
12 
     | 
    
         
             
                  end
         
     | 
| 
       13 
13 
     | 
    
         
             
                end
         
     | 
| 
       14 
14 
     | 
    
         | 
| 
         @@ -17,7 +17,7 @@ describe Admin::PasswordResetsController, type: :controller do 
     | 
|
| 
       17 
17 
     | 
    
         
             
                    it 'should render the edit form' do
         
     | 
| 
       18 
18 
     | 
    
         
             
                      allow(SpudUser).to receive(:find_using_perishable_token).and_return(user)
         
     | 
| 
       19 
19 
     | 
    
         
             
                      get :show, params: { id: 1 }
         
     | 
| 
       20 
     | 
    
         
            -
                      expect(response).to  
     | 
| 
      
 20 
     | 
    
         
            +
                      expect(response).to be_successful
         
     | 
| 
       21 
21 
     | 
    
         
             
                    end
         
     | 
| 
       22 
22 
     | 
    
         
             
                  end
         
     | 
| 
       23 
23 
     | 
    
         | 
| 
         @@ -39,7 +39,7 @@ describe Admin::UsersController, type: :controller do 
     | 
|
| 
       39 
39 
     | 
    
         
             
                  SpudUserSession.create(u)
         
     | 
| 
       40 
40 
     | 
    
         
             
                  get :index
         
     | 
| 
       41 
41 
     | 
    
         | 
| 
       42 
     | 
    
         
            -
                  expect(response).to  
     | 
| 
      
 42 
     | 
    
         
            +
                  expect(response).to be_successful
         
     | 
| 
       43 
43 
     | 
    
         
             
                end
         
     | 
| 
       44 
44 
     | 
    
         | 
| 
       45 
45 
     | 
    
         
             
                it 'should not allow access to users without a role,
         
     | 
| 
         @@ -82,14 +82,14 @@ describe Admin::UsersController, type: :controller do 
     | 
|
| 
       82 
82 
     | 
    
         
             
                it 'should respond successfully' do
         
     | 
| 
       83 
83 
     | 
    
         
             
                  user = FactoryBot.create(:spud_user)
         
     | 
| 
       84 
84 
     | 
    
         
             
                  get :show, params: { id: user.id }
         
     | 
| 
       85 
     | 
    
         
            -
                  expect(response).to  
     | 
| 
      
 85 
     | 
    
         
            +
                  expect(response).to be_successful
         
     | 
| 
       86 
86 
     | 
    
         
             
                end
         
     | 
| 
       87 
87 
     | 
    
         
             
              end
         
     | 
| 
       88 
88 
     | 
    
         | 
| 
       89 
89 
     | 
    
         
             
              describe 'new' do
         
     | 
| 
       90 
90 
     | 
    
         
             
                it 'should render the form' do
         
     | 
| 
       91 
91 
     | 
    
         
             
                  get :new, format: :html
         
     | 
| 
       92 
     | 
    
         
            -
                  expect(response).to  
     | 
| 
      
 92 
     | 
    
         
            +
                  expect(response).to be_successful
         
     | 
| 
       93 
93 
     | 
    
         
             
                end
         
     | 
| 
       94 
94 
     | 
    
         
             
              end
         
     | 
| 
       95 
95 
     | 
    
         | 
| 
         @@ -12,51 +12,6 @@ module Dummy 
     | 
|
| 
       12 
12 
     | 
    
         
             
                  config.from_address = 'no-reply@dummy.com'
         
     | 
| 
       13 
13 
     | 
    
         
             
                end
         
     | 
| 
       14 
14 
     | 
    
         | 
| 
       15 
     | 
    
         
            -
                 
     | 
| 
       16 
     | 
    
         
            -
                # Application configuration should go into files in config/initializers
         
     | 
| 
       17 
     | 
    
         
            -
                # -- all .rb files in that directory are automatically loaded.
         
     | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
       19 
     | 
    
         
            -
                # Custom directories with classes and modules you want to be autoloadable.
         
     | 
| 
       20 
     | 
    
         
            -
                # config.autoload_paths += %W(#{config.root}/extras)
         
     | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
       22 
     | 
    
         
            -
                # Only load the plugins named here, in the order given (default is alphabetical).
         
     | 
| 
       23 
     | 
    
         
            -
                # :all can be used as a placeholder for all plugins not explicitly named.
         
     | 
| 
       24 
     | 
    
         
            -
                # config.plugins = [ :exception_notification, :ssl_requirement, :all ]
         
     | 
| 
       25 
     | 
    
         
            -
             
     | 
| 
       26 
     | 
    
         
            -
                # Activate observers that should always be running.
         
     | 
| 
       27 
     | 
    
         
            -
                # config.active_record.observers = :cacher, :garbage_collector, :forum_observer
         
     | 
| 
       28 
     | 
    
         
            -
             
     | 
| 
       29 
     | 
    
         
            -
                # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
         
     | 
| 
       30 
     | 
    
         
            -
                # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
         
     | 
| 
       31 
     | 
    
         
            -
                # config.time_zone = 'Central Time (US & Canada)'
         
     | 
| 
       32 
     | 
    
         
            -
             
     | 
| 
       33 
     | 
    
         
            -
                # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
         
     | 
| 
       34 
     | 
    
         
            -
                # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
         
     | 
| 
       35 
     | 
    
         
            -
                # config.i18n.default_locale = :de
         
     | 
| 
       36 
     | 
    
         
            -
                config.i18n.enforce_available_locales = true
         
     | 
| 
       37 
     | 
    
         
            -
             
     | 
| 
       38 
     | 
    
         
            -
                # Configure the default encoding used in templates for Ruby 1.9.
         
     | 
| 
       39 
     | 
    
         
            -
                config.encoding = 'utf-8'
         
     | 
| 
       40 
     | 
    
         
            -
             
     | 
| 
       41 
     | 
    
         
            -
                # Configure sensitive parameters which will be filtered from the log file.
         
     | 
| 
       42 
     | 
    
         
            -
                config.filter_parameters += [:password]
         
     | 
| 
       43 
     | 
    
         
            -
             
     | 
| 
       44 
     | 
    
         
            -
                # Use SQL instead of Active Record's schema dumper when creating the database.
         
     | 
| 
       45 
     | 
    
         
            -
                # This is necessary if your schema can't be completely dumped by the schema dumper,
         
     | 
| 
       46 
     | 
    
         
            -
                # like if you have constraints or database-specific column types
         
     | 
| 
       47 
     | 
    
         
            -
                # config.active_record.schema_format = :sql
         
     | 
| 
       48 
     | 
    
         
            -
             
     | 
| 
       49 
     | 
    
         
            -
                # Enforce whitelist mode for mass assignment.
         
     | 
| 
       50 
     | 
    
         
            -
                # This will create an empty whitelist of attributes available for mass-assignment for all models
         
     | 
| 
       51 
     | 
    
         
            -
                # in your app. As such, your models will need to explicitly whitelist or blacklist accessible
         
     | 
| 
       52 
     | 
    
         
            -
                # parameters by using an attr_accessible or attr_protected declaration.
         
     | 
| 
       53 
     | 
    
         
            -
                # config.active_record.whitelist_attributes = true
         
     | 
| 
       54 
     | 
    
         
            -
             
     | 
| 
       55 
     | 
    
         
            -
                # Enable the asset pipeline
         
     | 
| 
       56 
     | 
    
         
            -
                # config.assets.enabled = true
         
     | 
| 
       57 
     | 
    
         
            -
             
     | 
| 
       58 
     | 
    
         
            -
                # Version of your assets, change this if you want to expire all your assets
         
     | 
| 
       59 
     | 
    
         
            -
                # config.assets.version = '1.0'
         
     | 
| 
       60 
     | 
    
         
            -
             
     | 
| 
      
 15 
     | 
    
         
            +
                config.load_defaults '6.0'
         
     | 
| 
       61 
16 
     | 
    
         
             
              end
         
     | 
| 
       62 
17 
     | 
    
         
             
            end
         
     | 
| 
         @@ -4,5 +4,4 @@ 
     | 
|
| 
       4 
4 
     | 
    
         
             
            # If you change this key, all old signed cookies will become invalid!
         
     | 
| 
       5 
5 
     | 
    
         
             
            # Make sure the secret is at least 30 characters and all random,
         
     | 
| 
       6 
6 
     | 
    
         
             
            # no regular words or you'll be exposed to dictionary attacks.
         
     | 
| 
       7 
     | 
    
         
            -
            Dummy::Application.config.secret_token = 'f89bbe176924c011473e15af21c4e8b72c3fd12f887f26014c24ea32e1e3d2bf0250a671a30232047d5c5431e67c7361aca07b10d847405b99fce4543589e117'
         
     | 
| 
       8 
7 
     | 
    
         
             
            Dummy::Application.config.secret_key_base = 'b43711419c807b9c9efe9365dd79f87ebe31e9f72e1aa6744c1ecac68aace664c0a3a4f791d92bd2fa324fce1d6d09701a54b88453f131b7c460eeb9c530bd72'
         
     | 
| 
         @@ -24,8 +24,8 @@ FactoryBot.define do 
     | 
|
| 
       24 
24 
     | 
    
         
             
                last_name { FactoryBot.generate(:last_name) }
         
     | 
| 
       25 
25 
     | 
    
         
             
                login { FactoryBot.generate(:login) }
         
     | 
| 
       26 
26 
     | 
    
         
             
                email { FactoryBot.generate(:email) }
         
     | 
| 
       27 
     | 
    
         
            -
                password 'password'
         
     | 
| 
       28 
     | 
    
         
            -
                password_confirmation 'password'
         
     | 
| 
      
 27 
     | 
    
         
            +
                password { 'password' }
         
     | 
| 
      
 28 
     | 
    
         
            +
                password_confirmation { 'password' }
         
     | 
| 
       29 
29 
     | 
    
         
             
                single_access_token { FactoryBot.generate(:single_access_token) }
         
     | 
| 
       30 
30 
     | 
    
         
             
              end
         
     | 
| 
       31 
31 
     | 
    
         
             
            end
         
     | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,14 +1,14 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: tb_core
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 1. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 1.5.3
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Greg Woods
         
     | 
| 
       8 
     | 
    
         
            -
            autorequire: 
     | 
| 
      
 8 
     | 
    
         
            +
            autorequire:
         
     | 
| 
       9 
9 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       10 
10 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       11 
     | 
    
         
            -
            date:  
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2021-01-11 00:00:00.000000000 Z
         
     | 
| 
       12 
12 
     | 
    
         
             
            dependencies:
         
     | 
| 
       13 
13 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       14 
14 
     | 
    
         
             
              name: authlogic
         
     | 
| 
         @@ -16,14 +16,14 @@ dependencies: 
     | 
|
| 
       16 
16 
     | 
    
         
             
                requirements:
         
     | 
| 
       17 
17 
     | 
    
         
             
                - - ">="
         
     | 
| 
       18 
18 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       19 
     | 
    
         
            -
                    version:  
     | 
| 
      
 19 
     | 
    
         
            +
                    version: '5.0'
         
     | 
| 
       20 
20 
     | 
    
         
             
              type: :runtime
         
     | 
| 
       21 
21 
     | 
    
         
             
              prerelease: false
         
     | 
| 
       22 
22 
     | 
    
         
             
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
       23 
23 
     | 
    
         
             
                requirements:
         
     | 
| 
       24 
24 
     | 
    
         
             
                - - ">="
         
     | 
| 
       25 
25 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       26 
     | 
    
         
            -
                    version:  
     | 
| 
      
 26 
     | 
    
         
            +
                    version: '5.0'
         
     | 
| 
       27 
27 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       28 
28 
     | 
    
         
             
              name: bootstrap-sass
         
     | 
| 
       29 
29 
     | 
    
         
             
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
         @@ -150,6 +150,20 @@ dependencies: 
     | 
|
| 
       150 
150 
     | 
    
         
             
                - - ">="
         
     | 
| 
       151 
151 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       152 
152 
     | 
    
         
             
                    version: '0'
         
     | 
| 
      
 153 
     | 
    
         
            +
            - !ruby/object:Gem::Dependency
         
     | 
| 
      
 154 
     | 
    
         
            +
              name: tinymce-rails
         
     | 
| 
      
 155 
     | 
    
         
            +
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
      
 156 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 157 
     | 
    
         
            +
                - - ">="
         
     | 
| 
      
 158 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 159 
     | 
    
         
            +
                    version: '0'
         
     | 
| 
      
 160 
     | 
    
         
            +
              type: :runtime
         
     | 
| 
      
 161 
     | 
    
         
            +
              prerelease: false
         
     | 
| 
      
 162 
     | 
    
         
            +
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
      
 163 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 164 
     | 
    
         
            +
                - - ">="
         
     | 
| 
      
 165 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 166 
     | 
    
         
            +
                    version: '0'
         
     | 
| 
       153 
167 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       154 
168 
     | 
    
         
             
              name: will_paginate
         
     | 
| 
       155 
169 
     | 
    
         
             
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
         @@ -236,6 +250,20 @@ dependencies: 
     | 
|
| 
       236 
250 
     | 
    
         
             
                    version: '0'
         
     | 
| 
       237 
251 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       238 
252 
     | 
    
         
             
              name: rspec-rails
         
     | 
| 
      
 253 
     | 
    
         
            +
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
      
 254 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 255 
     | 
    
         
            +
                - - ">="
         
     | 
| 
      
 256 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 257 
     | 
    
         
            +
                    version: 4.0.0.beta2
         
     | 
| 
      
 258 
     | 
    
         
            +
              type: :development
         
     | 
| 
      
 259 
     | 
    
         
            +
              prerelease: false
         
     | 
| 
      
 260 
     | 
    
         
            +
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
      
 261 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 262 
     | 
    
         
            +
                - - ">="
         
     | 
| 
      
 263 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 264 
     | 
    
         
            +
                    version: 4.0.0.beta2
         
     | 
| 
      
 265 
     | 
    
         
            +
            - !ruby/object:Gem::Dependency
         
     | 
| 
      
 266 
     | 
    
         
            +
              name: rubocop
         
     | 
| 
       239 
267 
     | 
    
         
             
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
       240 
268 
     | 
    
         
             
                requirements:
         
     | 
| 
       241 
269 
     | 
    
         
             
                - - ">="
         
     | 
| 
         @@ -249,7 +277,21 @@ dependencies: 
     | 
|
| 
       249 
277 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       250 
278 
     | 
    
         
             
                    version: '0'
         
     | 
| 
       251 
279 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       252 
     | 
    
         
            -
              name: rubocop
         
     | 
| 
      
 280 
     | 
    
         
            +
              name: rubocop-performance
         
     | 
| 
      
 281 
     | 
    
         
            +
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
      
 282 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 283 
     | 
    
         
            +
                - - ">="
         
     | 
| 
      
 284 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 285 
     | 
    
         
            +
                    version: '0'
         
     | 
| 
      
 286 
     | 
    
         
            +
              type: :development
         
     | 
| 
      
 287 
     | 
    
         
            +
              prerelease: false
         
     | 
| 
      
 288 
     | 
    
         
            +
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
      
 289 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 290 
     | 
    
         
            +
                - - ">="
         
     | 
| 
      
 291 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 292 
     | 
    
         
            +
                    version: '0'
         
     | 
| 
      
 293 
     | 
    
         
            +
            - !ruby/object:Gem::Dependency
         
     | 
| 
      
 294 
     | 
    
         
            +
              name: rubocop-rails
         
     | 
| 
       253 
295 
     | 
    
         
             
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
       254 
296 
     | 
    
         
             
                requirements:
         
     | 
| 
       255 
297 
     | 
    
         
             
                - - ">="
         
     | 
| 
         @@ -420,6 +462,7 @@ files: 
     | 
|
| 
       420 
462 
     | 
    
         
             
            - lib/tb_core/engine.rb
         
     | 
| 
       421 
463 
     | 
    
         
             
            - lib/tb_core/errors.rb
         
     | 
| 
       422 
464 
     | 
    
         
             
            - lib/tb_core/form_builder.rb
         
     | 
| 
      
 465 
     | 
    
         
            +
            - lib/tb_core/regex.rb
         
     | 
| 
       423 
466 
     | 
    
         
             
            - lib/tb_core/responder.rb
         
     | 
| 
       424 
467 
     | 
    
         
             
            - lib/tb_core/searchable.rb
         
     | 
| 
       425 
468 
     | 
    
         
             
            - lib/tb_core/spud_core.rb
         
     | 
| 
         @@ -436,6 +479,7 @@ files: 
     | 
|
| 
       436 
479 
     | 
    
         
             
            - spec/controllers/tb_core/application_controller_spec.rb
         
     | 
| 
       437 
480 
     | 
    
         
             
            - spec/dummy/README.rdoc
         
     | 
| 
       438 
481 
     | 
    
         
             
            - spec/dummy/Rakefile
         
     | 
| 
      
 482 
     | 
    
         
            +
            - spec/dummy/app/assets/config/manifest.js
         
     | 
| 
       439 
483 
     | 
    
         
             
            - spec/dummy/app/assets/javascripts/admin/application.js
         
     | 
| 
       440 
484 
     | 
    
         
             
            - spec/dummy/app/assets/javascripts/application.js
         
     | 
| 
       441 
485 
     | 
    
         
             
            - spec/dummy/app/assets/stylesheets/admin/application.scss
         
     | 
| 
         @@ -482,7 +526,7 @@ files: 
     | 
|
| 
       482 
526 
     | 
    
         
             
            homepage: http://bitbucket.org/moser-inc/tb_core
         
     | 
| 
       483 
527 
     | 
    
         
             
            licenses: []
         
     | 
| 
       484 
528 
     | 
    
         
             
            metadata: {}
         
     | 
| 
       485 
     | 
    
         
            -
            post_install_message: 
     | 
| 
      
 529 
     | 
    
         
            +
            post_install_message:
         
     | 
| 
       486 
530 
     | 
    
         
             
            rdoc_options: []
         
     | 
| 
       487 
531 
     | 
    
         
             
            require_paths:
         
     | 
| 
       488 
532 
     | 
    
         
             
            - lib
         
     | 
| 
         @@ -497,15 +541,15 @@ required_rubygems_version: !ruby/object:Gem::Requirement 
     | 
|
| 
       497 
541 
     | 
    
         
             
                - !ruby/object:Gem::Version
         
     | 
| 
       498 
542 
     | 
    
         
             
                  version: '0'
         
     | 
| 
       499 
543 
     | 
    
         
             
            requirements: []
         
     | 
| 
       500 
     | 
    
         
            -
             
     | 
| 
       501 
     | 
    
         
            -
             
     | 
| 
       502 
     | 
    
         
            -
            signing_key: 
         
     | 
| 
      
 544 
     | 
    
         
            +
            rubygems_version: 3.0.3
         
     | 
| 
      
 545 
     | 
    
         
            +
            signing_key:
         
     | 
| 
       503 
546 
     | 
    
         
             
            specification_version: 4
         
     | 
| 
       504 
547 
     | 
    
         
             
            summary: Twice Baked Core Engine
         
     | 
| 
       505 
548 
     | 
    
         
             
            test_files:
         
     | 
| 
       506 
549 
     | 
    
         
             
            - spec/spec_helper.rb
         
     | 
| 
       507 
550 
     | 
    
         
             
            - spec/dummy/app/controllers/application_controller.rb
         
     | 
| 
       508 
551 
     | 
    
         
             
            - spec/dummy/app/views/layouts/application.html.erb
         
     | 
| 
      
 552 
     | 
    
         
            +
            - spec/dummy/app/assets/config/manifest.js
         
     | 
| 
       509 
553 
     | 
    
         
             
            - spec/dummy/app/assets/javascripts/admin/application.js
         
     | 
| 
       510 
554 
     | 
    
         
             
            - spec/dummy/app/assets/javascripts/application.js
         
     | 
| 
       511 
555 
     | 
    
         
             
            - spec/dummy/app/assets/stylesheets/application.scss
         
     |