activeadmin-magicfields 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +50 -0
- data/Gemfile +42 -0
- data/Guardfile +8 -0
- data/LICENSE.txt +20 -0
- data/README.md +160 -0
- data/Rakefile +33 -0
- data/activeadmin-magicfields.gemspec +23 -0
- data/app/assets/javascripts/activeadmin-magicfields.js.coffee +101 -0
- data/app/assets/stylesheets/activeadmin-magicfields.css.scss +53 -0
- data/lib/activeadmin-magicfields.rb +18 -0
- data/lib/activeadmin-magicfields/engine.rb +12 -0
- data/lib/activeadmin-magicfields/form_builder.rb +175 -0
- data/lib/activeadmin-magicfields/paperclip.rb +2 -0
- data/lib/activeadmin-magicfields/version.rb +3 -0
- data/lib/app/admin/part.rb +29 -0
- data/lib/app/admin/part_object.rb +26 -0
- data/lib/app/models/field/checkbox.rb +12 -0
- data/lib/app/models/field/image.rb +35 -0
- data/lib/app/models/field/repeater.rb +19 -0
- data/lib/app/models/field/text.rb +14 -0
- data/lib/app/models/field/textarea.rb +14 -0
- data/lib/app/models/field_template.rb +5 -0
- data/lib/app/models/part.rb +6 -0
- data/lib/app/models/part_object.rb +11 -0
- data/lib/app/models/part_object_field.rb +13 -0
- data/lib/app/models/repeater_part_object.rb +6 -0
- data/lib/app/views/admin/field_inputs/_checkbox.html.erb +1 -0
- data/lib/app/views/admin/field_inputs/_image.html.erb +4 -0
- data/lib/app/views/admin/field_inputs/_product.html.erb +1 -0
- data/lib/app/views/admin/field_inputs/_repeater.html.erb +3 -0
- data/lib/app/views/admin/field_inputs/_site_page.html.erb +1 -0
- data/lib/app/views/admin/field_inputs/_text.html.erb +1 -0
- data/lib/app/views/admin/field_inputs/_textarea.html.erb +8 -0
- data/lib/app/views/admin/part_objects/_part_object.html.erb +53 -0
- data/lib/app/views/admin/parts/_part.html.erb +11 -0
- data/lib/app/views/admin/parts/_part_old.arb +32 -0
- data/lib/generators/activeadmin-magicfields/install/install_generator.rb +33 -0
- data/lib/generators/activeadmin-magicfields/install/templates/create_field_checkbox.rb +10 -0
- data/lib/generators/activeadmin-magicfields/install/templates/create_field_image.rb +10 -0
- data/lib/generators/activeadmin-magicfields/install/templates/create_field_repeater.rb +9 -0
- data/lib/generators/activeadmin-magicfields/install/templates/create_field_templates.rb +14 -0
- data/lib/generators/activeadmin-magicfields/install/templates/create_field_text.rb +10 -0
- data/lib/generators/activeadmin-magicfields/install/templates/create_field_textarea.rb +12 -0
- data/lib/generators/activeadmin-magicfields/install/templates/create_part_object_fields.rb +10 -0
- data/lib/generators/activeadmin-magicfields/install/templates/create_part_objects.rb +13 -0
- data/lib/generators/activeadmin-magicfields/install/templates/create_parts.rb +9 -0
- data/lib/generators/activeadmin-magicfields/install/templates/create_repeater_part_objects.rb +10 -0
- data/spec/rails_helper.rb +154 -0
- data/spec/spec_helper.rb +17 -0
- data/spec/support/deferred_garbage_collection.rb +19 -0
- data/spec/support/detect_rails_version.rb +26 -0
- data/spec/support/integration_example_group.rb +31 -0
- data/spec/support/jslint.yml +80 -0
- data/spec/support/rails_template.rb +104 -0
- data/spec/support/rails_template_with_data.rb +59 -0
- data/spec/support/templates/cucumber.rb +24 -0
- data/spec/support/templates/cucumber_with_reloading.rb +5 -0
- data/spec/support/templates/en.yml +8 -0
- data/spec/support/templates/policies/active_admin/comment_policy.rb +9 -0
- data/spec/support/templates/policies/active_admin/page_policy.rb +18 -0
- data/spec/support/templates/policies/application_policy.rb +45 -0
- data/spec/support/templates/policies/category_policy.rb +7 -0
- data/spec/support/templates/policies/post_policy.rb +15 -0
- data/spec/support/templates/policies/store_policy.rb +11 -0
- data/spec/support/templates/policies/user_policy.rb +11 -0
- data/spec/support/templates/post_decorator.rb +11 -0
- data/spec/unit/form_builder_spec.rb +121 -0
- data/tasks/test.rake +83 -0
- metadata +175 -0
| @@ -0,0 +1,11 @@ | |
| 1 | 
            +
            class PartObject < ActiveRecord::Base
         | 
| 2 | 
            +
              
         | 
| 3 | 
            +
              has_many :part_object_fields, class_name: "PartObjectField", foreign_key: "part_object_id", dependent: :destroy
         | 
| 4 | 
            +
              # belongs_to :base_model, inverse_of: :part_objects, foreign_key: "base_model_id"
         | 
| 5 | 
            +
              belongs_to :part
         | 
| 6 | 
            +
              
         | 
| 7 | 
            +
              accepts_nested_attributes_for :part_object_fields, allow_destroy: true
         | 
| 8 | 
            +
             | 
| 9 | 
            +
              scope :by_position, -> { order('position ASC') }
         | 
| 10 | 
            +
              
         | 
| 11 | 
            +
            end
         | 
| @@ -0,0 +1,13 @@ | |
| 1 | 
            +
            class PartObjectField < ActiveRecord::Base
         | 
| 2 | 
            +
             | 
| 3 | 
            +
              belongs_to :part_object, class_name: "PartObject", foreign_key: "part_object_id"
         | 
| 4 | 
            +
              belongs_to :fieldable, polymorphic: true, dependent: :destroy
         | 
| 5 | 
            +
             | 
| 6 | 
            +
              validates :fieldable, presence: true
         | 
| 7 | 
            +
              accepts_nested_attributes_for :fieldable, allow_destroy: true
         | 
| 8 | 
            +
             | 
| 9 | 
            +
              def build_fieldable(attributes, options = {})
         | 
| 10 | 
            +
                self.fieldable = fieldable_type.constantize.new(attributes, options)
         | 
| 11 | 
            +
              end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            end
         | 
| @@ -0,0 +1,6 @@ | |
| 1 | 
            +
            class RepeaterPartObject < ActiveRecord::Base
         | 
| 2 | 
            +
              belongs_to :part_object, dependent: :destroy 
         | 
| 3 | 
            +
              belongs_to :field_repeater, class_name: "Field::Repeater", inverse_of: "repeater_part_objects", foreign_key: "field_repeater_id"
         | 
| 4 | 
            +
             | 
| 5 | 
            +
              accepts_nested_attributes_for :part_object, allow_destroy: true
         | 
| 6 | 
            +
            end
         | 
| @@ -0,0 +1 @@ | |
| 1 | 
            +
            <%= builder.input field_template.field_type, label: field_template.title, input_html: {name: form_prefix + builder.object_name.sub('part[', '[') + "[#{field_template.field_type}]" } %>
         | 
| @@ -0,0 +1,4 @@ | |
| 1 | 
            +
            <%= builder.input :image, as: :file, label: field_template.title, required: field_template.is_required, :hint => ( (builder.object.new_record? || builder.object.image_file_name.nil?) ? content_tag(:span, "No previous image") : ("current image:<br/>").html_safe + image_tag(builder.object.image.url(:thumb)) ), input_html: {value: builder.object.image_file_name, name: form_prefix + builder.object_name.sub('part[', '[') + "[#{field_template.field_type}]" } %>
         | 
| 2 | 
            +
            <% if ( !builder.object.new_record? and !builder.object.image_file_name.nil? and !field_template.is_required ) %>
         | 
| 3 | 
            +
              <%= builder.input :delete_image, as: :boolean, label: "Delete Image", input_html: {name: form_prefix + builder.object_name.sub('part[', '[') + "[delete_image]" } %>
         | 
| 4 | 
            +
            <% end %>
         | 
| @@ -0,0 +1 @@ | |
| 1 | 
            +
            <%= builder.input :product_id, as: :select, multiselect: false, collection: Spree::Product.all, label: field_template.title, required: field_template.is_required, input_html: {name: form_prefix + builder.object_name.sub('part[', '[') + "[product_id]" } %>
         | 
| @@ -0,0 +1,3 @@ | |
| 1 | 
            +
            <%= semantic_fields_for "", builder.object, builder: ActiveadminMagicfields::FormBuilder do |r| %>
         | 
| 2 | 
            +
              <% r.sections_has_many :parts, collection: Part.includes(:field_templates).all, part_objects: r.object.part_objects, sortable: :position, form_prefix: form_prefix + builder.object_name.sub('part[', '[') %>
         | 
| 3 | 
            +
            <% end %>
         | 
| @@ -0,0 +1 @@ | |
| 1 | 
            +
            <%= builder.input :site_page_id, as: :select, multiselect: false, collection: SitePage.all, label: field_template.title, required: field_template.is_required, input_html: {name: form_prefix + builder.object_name.sub('part[', '[') + "[site_page_id]" } %>
         | 
| @@ -0,0 +1 @@ | |
| 1 | 
            +
            <%= builder.input field_template.field_type, label: field_template.title, required: field_template.is_required, input_html: {name: form_prefix + builder.object_name.sub('part[', '[') + "[#{field_template.field_type}]" } %>
         | 
| @@ -0,0 +1,8 @@ | |
| 1 | 
            +
            <%= builder.input field_template.field_type, label: field_template.title, required: field_template.is_required, input_html: {name: form_prefix + builder.object_name.sub('part[', '[') + "[#{field_template.field_type}]" } %>
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            <%# To make the textarea a Wysiwyg field, add to your gemfile
         | 
| 4 | 
            +
                  gem 'activeadmin-dragonfly', github: 'stefanoverna/activeadmin-dragonfly'
         | 
| 5 | 
            +
                  gem 'activeadmin-wysihtml5', github: 'silvaire/activeadmin-wysihtml5'
         | 
| 6 | 
            +
                and replace the above line by the commented one below 
         | 
| 7 | 
            +
            %>
         | 
| 8 | 
            +
            <%#= builder.input field_template.field_type, as: :wysihtml5, label: field_template.title, required: field_template.is_required, input_html: {name: form_prefix + builder.object_name.sub('part[', '[') + "[#{field_template.field_type}]" } %>
         | 
| @@ -0,0 +1,53 @@ | |
| 1 | 
            +
            <% if !part_object.new_record? or request.xhr?.blank? %>
         | 
| 2 | 
            +
              <fieldset class="jsonb">
         | 
| 3 | 
            +
            <% end %>
         | 
| 4 | 
            +
             | 
| 5 | 
            +
             | 
| 6 | 
            +
            <%= semantic_fields_for part, namespace: 'part_form' do |r| %>
         | 
| 7 | 
            +
              <%= r.semantic_fields_for "part_objects_attributes", part_object, index: (part_object.id || DateTime.now.strftime('%Q')) do |f| %>
         | 
| 8 | 
            +
                <h3 class="section-title"><%= part.name %></h3>
         | 
| 9 | 
            +
                <%= f.input :position, as: :hidden, input_html: {value: (part_object.position || 9999), name: form_prefix + f.object_name.sub('part[', '[') + "[#{f.index}][position]" } %>
         | 
| 10 | 
            +
                <%= f.input :part_id, as: :hidden, input_html: {value: part.id, name: form_prefix + f.object_name.sub('part[', '[') + "[#{f.index}][part_id]" } %>
         | 
| 11 | 
            +
                <% if part_object.part_object_fields.blank? %>
         | 
| 12 | 
            +
                  <% part.field_templates.by_position.each_with_index do |field_template, ix| %>
         | 
| 13 | 
            +
                    <%= f.semantic_fields_for "part_object_fields_attributes", part_object.part_object_fields.build, index: ix do |part_object_field| %>
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                      <% field_object = Field.const_get(field_template.field_type.classify).new %>
         | 
| 16 | 
            +
                      <%= part_object_field.input :fieldable_type, as: :hidden, input_html: {value: "Field::" + field_template.field_type.classify, name: form_prefix + part_object_field.object_name.sub('part[', '[') + "[#{ix}][fieldable_type]"} %>
         | 
| 17 | 
            +
                      <%= part_object_field.semantic_fields_for  "fieldable_attributes", field_object do |field| %>
         | 
| 18 | 
            +
                        <%= f.inputs do %>
         | 
| 19 | 
            +
                          <%= render partial: "admin/field_inputs/#{field_template.field_type}", locals: {builder: field, form_prefix: form_prefix, field_template: field_template} %>
         | 
| 20 | 
            +
                          <%= field.input :field_template_id, as: :hidden, input_html: {value: field_template.id, name: form_prefix + field.object_name.sub('part[', '[') + "[field_template_id]"} %>
         | 
| 21 | 
            +
                        <% end %>
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                      <% end %>
         | 
| 24 | 
            +
                    <% end %>
         | 
| 25 | 
            +
                  <% end %>
         | 
| 26 | 
            +
                <% else %>
         | 
| 27 | 
            +
                  <%= f.input :id, as: :hidden, input_html: {value: part_object.id, name: form_prefix + f.object_name.sub('part[', '[') + "[#{f.index}][id]" } %>
         | 
| 28 | 
            +
                  <%= f.input :_destroy, as: :boolean, input_html: {name: form_prefix + f.object_name.sub('part[', '[') + "[#{f.index}][_destroy]" }, :wrapper_html => { :class => "destroy-section" } %>
         | 
| 29 | 
            +
                  <% part_object.part_object_fields.each_with_index do |part_object_field, ix| %>
         | 
| 30 | 
            +
                    <%= f.semantic_fields_for "part_object_fields_attributes", part_object_field, index: ix do |pof| %>
         | 
| 31 | 
            +
                      <%= pof.input :id, as: :hidden, input_html: {name: form_prefix + pof.object_name.sub('part[', '[') + "[#{ix}][id]", value: pof.object.id } %>
         | 
| 32 | 
            +
                      <%= pof.input :fieldable_type, as: :hidden, input_html: {name: form_prefix + pof.object_name.sub('part[', '[') + "[#{ix}][fieldable_type]", value: pof.object.fieldable_type } %>
         | 
| 33 | 
            +
                      <%= pof.semantic_fields_for "fieldable_attributes", part_object_field.fieldable do |fieldable| %>
         | 
| 34 | 
            +
                        <%= f.inputs do %>
         | 
| 35 | 
            +
                          <%= fieldable.input :id, as: :hidden, input_html: {name: form_prefix + fieldable.object_name.sub('part[', '[') + "[id]", value: fieldable.object.id } %>
         | 
| 36 | 
            +
                          <%= render partial: "admin/field_inputs/#{fieldable.object.field_template.field_type}", locals: {builder:fieldable, form_prefix: form_prefix, field_template:fieldable.object.field_template} %>
         | 
| 37 | 
            +
                          <%= fieldable.input :field_template_id, as: :hidden, input_html: {value: fieldable.object.field_template_id, name: form_prefix + fieldable.object_name.sub('part[', '[') + "[field_template_id]"} %>
         | 
| 38 | 
            +
                        <% end %>
         | 
| 39 | 
            +
                      <% end %>
         | 
| 40 | 
            +
                    <% end %>
         | 
| 41 | 
            +
                  <% end %>
         | 
| 42 | 
            +
                <% end %>
         | 
| 43 | 
            +
              <% end %>
         | 
| 44 | 
            +
            <% end %>
         | 
| 45 | 
            +
             | 
| 46 | 
            +
             | 
| 47 | 
            +
            <ol>
         | 
| 48 | 
            +
              <li class="handle"><span class="icon icon_move_vertical"><svg x="0px" y="0px" width="100%" height="100%" viewBox="0 0 12 32" enable-background="new 0 0 12 32" xml:space="preserve"><g id=""></g><g id="move_x5F_vertical_x5F_12x32"> <g> <polygon fill="#5E6469" points="8,20 8,26 12,26 6,32 0,26 4,26 4,20 "></polygon> <polygon fill="#5E6469" points="4,12 4,6 0,6 6,0 12,6 8,6 8,12 "></polygon> </g></g></svg></span></li>
         | 
| 49 | 
            +
            </ol>
         | 
| 50 | 
            +
             | 
| 51 | 
            +
            <% if !part_object.new_record? or request.xhr?.blank?  %>
         | 
| 52 | 
            +
              </fieldset>
         | 
| 53 | 
            +
            <% end %>
         | 
| @@ -0,0 +1,11 @@ | |
| 1 | 
            +
            <%# Define the Part Object %>
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            <% part_object = resource.part_objects.build %>
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            <%# Build the fields %>
         | 
| 6 | 
            +
              <%#= semantic_fields_for resource, namespace: 'new_part_form' do |r| %>
         | 
| 7 | 
            +
            <%= render partial: "admin/part_objects/part_object", locals: {part_object: part_object, part: resource, form_prefix: params[:form_name]} %> 
         | 
| 8 | 
            +
              <%# end %>
         | 
| 9 | 
            +
             | 
| 10 | 
            +
             | 
| 11 | 
            +
              <a class="button section_has_many_remove" href="#">Remove</a>
         | 
| @@ -0,0 +1,32 @@ | |
| 1 | 
            +
            # Define the Part Object
         | 
| 2 | 
            +
            part_objects = resource.part_objects.build
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            # parents_array = params[:form_name].split("[").map{|n| n.chomp(']')}
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            # raise
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            # Build the form
         | 
| 9 | 
            +
            active_admin_form_for part, url: "to_be_stripped" do |f| 
         | 
| 10 | 
            +
              f.semantic_fields_for :part_objects do |part_object|
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                part_object.input :part_id, as: :hidden, input_html: {value: part.id}
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                resource.field_templates.each_with_index do |field_template, ix|
         | 
| 15 | 
            +
                  part_object.semantic_fields_for "part_object_fields_attributes[#{ix}]", part_objects.part_object_fields.build do |part_object_field|
         | 
| 16 | 
            +
             | 
| 17 | 
            +
             | 
| 18 | 
            +
                    field_object = Field.const_get(field_template.field_type.classify).new
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                    part_object_field.semantic_fields_for  "fieldable_attributes", field_object do |field|
         | 
| 21 | 
            +
                      part_object.inputs do
         | 
| 22 | 
            +
                        field.input field_template.field_type, label: field_template.title, required: field_template.is_required
         | 
| 23 | 
            +
                        field.input :fieldable_type, as: :hidden, input_html: {value: field_template.field_type.classify}
         | 
| 24 | 
            +
                        field.input :title, as: :hidden, input_html: {value: field_template.title}
         | 
| 25 | 
            +
                      end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                    end
         | 
| 28 | 
            +
                  end
         | 
| 29 | 
            +
                end
         | 
| 30 | 
            +
              end
         | 
| 31 | 
            +
            end
         | 
| 32 | 
            +
             | 
| @@ -0,0 +1,33 @@ | |
| 1 | 
            +
            require 'rails/generators/migration'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module ActiveadminMagicfields
         | 
| 4 | 
            +
              module Generators
         | 
| 5 | 
            +
                class InstallGenerator < ::Rails::Generators::Base
         | 
| 6 | 
            +
                  include Rails::Generators::Migration
         | 
| 7 | 
            +
                  source_root File.expand_path('../templates', __FILE__)
         | 
| 8 | 
            +
                  desc "add the migrations"
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                  def self.next_migration_number(path)
         | 
| 11 | 
            +
                    unless @prev_migration_nr
         | 
| 12 | 
            +
                      @prev_migration_nr = Time.now.utc.strftime("%Y%m%d%H%M%S").to_i
         | 
| 13 | 
            +
                    else
         | 
| 14 | 
            +
                      @prev_migration_nr += 1
         | 
| 15 | 
            +
                    end
         | 
| 16 | 
            +
                    @prev_migration_nr.to_s
         | 
| 17 | 
            +
                  end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                  def copy_migrations
         | 
| 20 | 
            +
                    migration_template "create_parts.rb", "db/migrate/create_parts.rb"
         | 
| 21 | 
            +
                    migration_template "create_part_objects.rb", "db/migrate/create_part_objects.rb"
         | 
| 22 | 
            +
                    migration_template "create_part_object_fields.rb", "db/migrate/create_part_object_fields.rb"
         | 
| 23 | 
            +
                    migration_template "create_field_templates.rb", "db/migrate/create_field_templates.rb"
         | 
| 24 | 
            +
                    migration_template "create_field_text.rb", "db/migrate/create_field_text.rb"
         | 
| 25 | 
            +
                    migration_template "create_field_image.rb", "db/migrate/create_field_image.rb"
         | 
| 26 | 
            +
                    migration_template "create_field_textarea.rb", "db/migrate/create_field_textarea.rb"
         | 
| 27 | 
            +
                    migration_template "create_field_checkbox.rb", "db/migrate/create_field_checkbox.rb"
         | 
| 28 | 
            +
                    migration_template "create_field_repeater.rb", "db/migrate/create_field_repeater.rb"
         | 
| 29 | 
            +
                    migration_template "create_repeater_part_objects.rb", "db/migrate/create_repeater_part_objects.rb"
         | 
| 30 | 
            +
                  end
         | 
| 31 | 
            +
                end
         | 
| 32 | 
            +
              end
         | 
| 33 | 
            +
            end
         | 
| @@ -0,0 +1,14 @@ | |
| 1 | 
            +
            class CreateFieldTemplates < ActiveRecord::Migration
         | 
| 2 | 
            +
              def change
         | 
| 3 | 
            +
                create_table :field_templates do |t|
         | 
| 4 | 
            +
                  t.string :title
         | 
| 5 | 
            +
                  t.boolean :is_required
         | 
| 6 | 
            +
                  t.string :field_type
         | 
| 7 | 
            +
                  t.references :part, index: true
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                  t.integer :position
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                  t.timestamps
         | 
| 12 | 
            +
                end
         | 
| 13 | 
            +
              end
         | 
| 14 | 
            +
            end
         | 
| @@ -0,0 +1,154 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module ActiveAdminIntegrationSpecHelper
         | 
| 4 | 
            +
              extend self
         | 
| 5 | 
            +
             | 
| 6 | 
            +
              def load_defaults!
         | 
| 7 | 
            +
                ActiveAdmin.unload!
         | 
| 8 | 
            +
                ActiveAdmin.load!
         | 
| 9 | 
            +
                ActiveAdmin.register(Article)
         | 
| 10 | 
            +
                ActiveAdmin.register(Image)
         | 
| 11 | 
            +
                ActiveAdmin.register(Text)
         | 
| 12 | 
            +
                # reload_menus!
         | 
| 13 | 
            +
              end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            #   def reload_menus!
         | 
| 16 | 
            +
            #     ActiveAdmin.application.namespaces.values.each{|n| n.reset_menu! }
         | 
| 17 | 
            +
            #   end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
              # Sometimes we need to reload the routes within
         | 
| 20 | 
            +
              # the application to test them out
         | 
| 21 | 
            +
              def reload_routes!
         | 
| 22 | 
            +
                Rails.application.reload_routes!
         | 
| 23 | 
            +
              end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
              # Helper method to load resources and ensure that Active Admin is
         | 
| 26 | 
            +
              # setup with the new configurations.
         | 
| 27 | 
            +
              #
         | 
| 28 | 
            +
              # Eg:
         | 
| 29 | 
            +
              #   load_resources do
         | 
| 30 | 
            +
              #     ActiveAdmin.regiser(Post)
         | 
| 31 | 
            +
              #   end
         | 
| 32 | 
            +
              #
         | 
| 33 | 
            +
              def load_resources
         | 
| 34 | 
            +
                ActiveAdmin.unload!
         | 
| 35 | 
            +
                yield
         | 
| 36 | 
            +
                reload_menus!
         | 
| 37 | 
            +
                reload_routes!
         | 
| 38 | 
            +
              end
         | 
| 39 | 
            +
             | 
| 40 | 
            +
              # Sets up a describe block where you can render controller
         | 
| 41 | 
            +
              # actions. Uses the Admin::PostsController as the subject
         | 
| 42 | 
            +
              # for the describe block
         | 
| 43 | 
            +
              def describe_with_render(*args, &block)
         | 
| 44 | 
            +
                describe *args do
         | 
| 45 | 
            +
                  include RSpec::Rails::ControllerExampleGroup
         | 
| 46 | 
            +
                  render_views
         | 
| 47 | 
            +
                  # metadata[:behaviour][:describes] = ActiveAdmin.namespaces[:admin].resources['Post'].controller
         | 
| 48 | 
            +
                  module_eval &block
         | 
| 49 | 
            +
                end
         | 
| 50 | 
            +
              end
         | 
| 51 | 
            +
             | 
| 52 | 
            +
              def arbre(assigns = {}, helpers = mock_action_view, &block)
         | 
| 53 | 
            +
                Arbre::Context.new(assigns, helpers, &block)
         | 
| 54 | 
            +
              end
         | 
| 55 | 
            +
             | 
| 56 | 
            +
              def render_arbre_component(assigns = {}, helpers = mock_action_view, &block)
         | 
| 57 | 
            +
                arbre(assigns, helpers, &block).children.first
         | 
| 58 | 
            +
              end
         | 
| 59 | 
            +
             | 
| 60 | 
            +
              # Setup a describe block which uses capybara and rails integration
         | 
| 61 | 
            +
              # test methods.
         | 
| 62 | 
            +
              def describe_with_capybara(*args, &block)
         | 
| 63 | 
            +
                describe *args do
         | 
| 64 | 
            +
                  include RSpec::Rails::IntegrationExampleGroup
         | 
| 65 | 
            +
                  module_eval &block
         | 
| 66 | 
            +
                end
         | 
| 67 | 
            +
              end
         | 
| 68 | 
            +
             | 
| 69 | 
            +
              # Returns a fake action view instance to use with our renderers
         | 
| 70 | 
            +
              def mock_action_view(assigns = {})
         | 
| 71 | 
            +
                controller = ActionView::TestCase::TestController.new
         | 
| 72 | 
            +
                ActionView::Base.send :include, ActionView::Helpers
         | 
| 73 | 
            +
                ActionView::Base.send :include, ActiveAdmin::ViewHelpers
         | 
| 74 | 
            +
                ActionView::Base.send :include, Rails.application.routes.url_helpers
         | 
| 75 | 
            +
                ActionView::Base.new(ActionController::Base.view_paths, assigns, controller)
         | 
| 76 | 
            +
              end
         | 
| 77 | 
            +
              alias_method :action_view, :mock_action_view
         | 
| 78 | 
            +
             | 
| 79 | 
            +
              # A mock resource to register
         | 
| 80 | 
            +
              class MockResource
         | 
| 81 | 
            +
              end
         | 
| 82 | 
            +
             | 
| 83 | 
            +
              def with_translation(translation)
         | 
| 84 | 
            +
                I18n.backend.store_translations :en, translation
         | 
| 85 | 
            +
                yield
         | 
| 86 | 
            +
              ensure
         | 
| 87 | 
            +
                I18n.backend.reload!
         | 
| 88 | 
            +
              end
         | 
| 89 | 
            +
             | 
| 90 | 
            +
            end
         | 
| 91 | 
            +
             | 
| 92 | 
            +
            ENV['RAILS_ENV'] = 'test'
         | 
| 93 | 
            +
            ENV['RAILS_ROOT'] = File.expand_path("../rails/rails-#{ENV['RAILS']}", __FILE__)
         | 
| 94 | 
            +
             | 
| 95 | 
            +
            # Create the test app if it doesn't exists
         | 
| 96 | 
            +
            unless File.exists?(ENV['RAILS_ROOT'])
         | 
| 97 | 
            +
              system 'rake setup'
         | 
| 98 | 
            +
            end
         | 
| 99 | 
            +
             | 
| 100 | 
            +
            require 'rails'
         | 
| 101 | 
            +
            require 'active_record'
         | 
| 102 | 
            +
            require 'active_admin'
         | 
| 103 | 
            +
            # require 'devise'
         | 
| 104 | 
            +
            ActiveAdmin.application.load_paths = [ENV['RAILS_ROOT'] + "/app/admin"]
         | 
| 105 | 
            +
             | 
| 106 | 
            +
            require ENV['RAILS_ROOT'] + '/config/environment'
         | 
| 107 | 
            +
             | 
| 108 | 
            +
            require 'rspec/rails'
         | 
| 109 | 
            +
             | 
| 110 | 
            +
            # Setup Some Admin stuff for us to play with
         | 
| 111 | 
            +
            include ActiveAdminIntegrationSpecHelper
         | 
| 112 | 
            +
            load_defaults!
         | 
| 113 | 
            +
            reload_routes!
         | 
| 114 | 
            +
             | 
| 115 | 
            +
            # Disabling authentication in specs so that we don't have to worry about
         | 
| 116 | 
            +
            # it allover the place
         | 
| 117 | 
            +
            ActiveAdmin.application.authentication_method = false
         | 
| 118 | 
            +
            ActiveAdmin.application.current_user_method = false
         | 
| 119 | 
            +
             | 
| 120 | 
            +
            # Don't add asset cache timestamps. Makes it easy to integration
         | 
| 121 | 
            +
            # test for the presence of an asset file
         | 
| 122 | 
            +
            ENV["RAILS_ASSET_ID"] = ''
         | 
| 123 | 
            +
             | 
| 124 | 
            +
            RSpec.configure do |config|
         | 
| 125 | 
            +
              config.use_transactional_fixtures = true
         | 
| 126 | 
            +
              config.use_instantiated_fixtures = false
         | 
| 127 | 
            +
              # config.include Devise::TestHelpers, type: :controller
         | 
| 128 | 
            +
              config.render_views = false
         | 
| 129 | 
            +
              config.filter_run focus: true
         | 
| 130 | 
            +
              config.filter_run_excluding skip: true
         | 
| 131 | 
            +
              config.run_all_when_everything_filtered = true
         | 
| 132 | 
            +
            end
         | 
| 133 | 
            +
             | 
| 134 | 
            +
            # All RSpec configuration needs to happen before any examples
         | 
| 135 | 
            +
            # or else it whines.
         | 
| 136 | 
            +
            require 'integration_example_group'
         | 
| 137 | 
            +
            RSpec.configure do |c|
         | 
| 138 | 
            +
              c.include RSpec::Rails::IntegrationExampleGroup, file_path: /\bspec\/requests\//
         | 
| 139 | 
            +
              # c.include Devise::TestHelpers, type: :controller
         | 
| 140 | 
            +
            end
         | 
| 141 | 
            +
             | 
| 142 | 
            +
            # improve the performance of the specs suite by not logging anything
         | 
| 143 | 
            +
            # see http://blog.plataformatec.com.br/2011/12/three-tips-to-improve-the-performance-of-your-test-suite/
         | 
| 144 | 
            +
            Rails.logger.level = 4
         | 
| 145 | 
            +
             | 
| 146 | 
            +
             | 
| 147 | 
            +
            # Improves performance by forcing the garbage collector to run less often.
         | 
| 148 | 
            +
            unless ENV['DEFER_GC'] == '0' || ENV['DEFER_GC'] == 'false'
         | 
| 149 | 
            +
              require 'support/deferred_garbage_collection'
         | 
| 150 | 
            +
              RSpec.configure do |config|
         | 
| 151 | 
            +
                config.before(:all) { DeferredGarbageCollection.start }
         | 
| 152 | 
            +
                config.after(:all)  { DeferredGarbageCollection.reconsider }
         | 
| 153 | 
            +
              end
         | 
| 154 | 
            +
            end
         |