admin_assistant 1.0.0 → 1.0.1
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.
- data/.gitignore +16 -0
- data/Rakefile +34 -6
- data/VERSION +1 -0
- data/admin_assistant.gemspec +440 -0
- data/doc/img/blog_posts-index.png +0 -0
- data/install.rb +25 -4
- data/lib/admin_assistant/active_record_column.rb +133 -45
- data/lib/admin_assistant/association_target.rb +16 -3
- data/lib/admin_assistant/belongs_to_column.rb +18 -10
- data/lib/admin_assistant/builder.rb +67 -30
- data/lib/admin_assistant/column.rb +153 -71
- data/lib/admin_assistant/date_time_range_end_point_selector.rb +340 -0
- data/lib/admin_assistant/default_search_column.rb +3 -7
- data/lib/admin_assistant/form_view.rb +114 -10
- data/lib/admin_assistant/has_many_column.rb +56 -0
- data/lib/admin_assistant/index.rb +220 -83
- data/lib/admin_assistant/polymorphic_belongs_to_column.rb +1 -1
- data/lib/admin_assistant/request/base.rb +196 -67
- data/lib/admin_assistant/request/create.rb +55 -7
- data/lib/admin_assistant/request/edit.rb +1 -2
- data/lib/admin_assistant/request/index.rb +16 -9
- data/lib/admin_assistant/request/new.rb +19 -7
- data/lib/admin_assistant/request/update.rb +28 -13
- data/lib/admin_assistant/search.rb +17 -2
- data/lib/admin_assistant/virtual_column.rb +15 -7
- data/lib/admin_assistant.rb +101 -81
- data/lib/javascripts/admin_assistant.js +1 -1
- data/lib/stylesheets/activescaffold.css +6 -1
- data/lib/stylesheets/default.css +17 -0
- data/lib/views/form.html.erb +7 -3
- data/lib/views/index.html.erb +13 -8
- data/lib/views/multi_form.html.erb +71 -0
- data/lib/views/show.html.erb +4 -4
- data/test_rails_app/README +256 -0
- data/test_rails_app/Rakefile +13 -0
- data/test_rails_app/app/controllers/admin/appointments2_controller.rb +15 -0
- data/test_rails_app/app/controllers/admin/appointments_controller.rb +11 -0
- data/test_rails_app/app/controllers/admin/blog_posts2_controller.rb +138 -0
- data/test_rails_app/app/controllers/admin/blog_posts3_controller.rb +76 -0
- data/test_rails_app/app/controllers/admin/blog_posts4_controller.rb +21 -0
- data/test_rails_app/app/controllers/admin/blog_posts5_controller.rb +27 -0
- data/test_rails_app/app/controllers/admin/blog_posts6_controller.rb +10 -0
- data/test_rails_app/app/controllers/admin/blog_posts_controller.rb +8 -0
- data/test_rails_app/app/controllers/admin/blog_posts_custom_new_and_edit_controller.rb +15 -0
- data/test_rails_app/app/controllers/admin/blog_posts_read_only_controller.rb +19 -0
- data/test_rails_app/app/controllers/admin/bookmarks_controller.rb +11 -0
- data/test_rails_app/app/controllers/admin/comments2_controller.rb +14 -0
- data/test_rails_app/app/controllers/admin/comments_controller.rb +12 -0
- data/test_rails_app/app/controllers/admin/file_column_images2_controller.rb +10 -0
- data/test_rails_app/app/controllers/admin/file_column_images_controller.rb +6 -0
- data/test_rails_app/app/controllers/admin/images2_controller.rb +11 -0
- data/test_rails_app/app/controllers/admin/images_controller.rb +6 -0
- data/test_rails_app/app/controllers/admin/misconfigured1_controller.rb +7 -0
- data/test_rails_app/app/controllers/admin/not_migrated_yets_controller.rb +9 -0
- data/test_rails_app/app/controllers/admin/product_categories2_controller.rb +7 -0
- data/test_rails_app/app/controllers/admin/product_categories_controller.rb +5 -0
- data/test_rails_app/app/controllers/admin/products2_controller.rb +15 -0
- data/test_rails_app/app/controllers/admin/products_controller.rb +31 -0
- data/test_rails_app/app/controllers/admin/television_airings_controller.rb +5 -0
- data/test_rails_app/app/controllers/admin/television_time_slots_controller.rb +5 -0
- data/test_rails_app/app/controllers/admin/users2_controller.rb +10 -0
- data/test_rails_app/app/controllers/admin/users_controller.rb +63 -0
- data/test_rails_app/app/controllers/application.rb +16 -0
- data/test_rails_app/app/controllers/application_controller.rb +16 -0
- data/test_rails_app/app/controllers/blog_posts_controller.rb +5 -0
- data/test_rails_app/app/helpers/admin/appointments2_helper.rb +2 -0
- data/test_rails_app/app/helpers/admin/appointments_helper.rb +2 -0
- data/test_rails_app/app/helpers/admin/blog_posts2_helper.rb +27 -0
- data/test_rails_app/app/helpers/admin/blog_posts3_helper.rb +2 -0
- data/test_rails_app/app/helpers/admin/blog_posts4_helper.rb +2 -0
- data/test_rails_app/app/helpers/admin/blog_posts6_helper.rb +16 -0
- data/test_rails_app/app/helpers/admin/blog_posts_custom_new_and_edit_helper.rb +29 -0
- data/test_rails_app/app/helpers/admin/blog_posts_helper.rb +2 -0
- data/test_rails_app/app/helpers/admin/blog_posts_read_only_helper.rb +2 -0
- data/test_rails_app/app/helpers/admin/bookmarks_helper.rb +2 -0
- data/test_rails_app/app/helpers/admin/comments2_helper.rb +2 -0
- data/test_rails_app/app/helpers/admin/comments_helper.rb +2 -0
- data/test_rails_app/app/helpers/admin/file_column_images2_helper.rb +2 -0
- data/test_rails_app/app/helpers/admin/file_column_images_helper.rb +2 -0
- data/test_rails_app/app/helpers/admin/images2_helper.rb +8 -0
- data/test_rails_app/app/helpers/admin/images_helper.rb +2 -0
- data/test_rails_app/app/helpers/admin/misconfigured1_helper.rb +2 -0
- data/test_rails_app/app/helpers/admin/not_migrated_yets_helper.rb +2 -0
- data/test_rails_app/app/helpers/admin/product_categories2_helper.rb +2 -0
- data/test_rails_app/app/helpers/admin/product_categories_helper.rb +2 -0
- data/test_rails_app/app/helpers/admin/products2_helper.rb +3 -0
- data/test_rails_app/app/helpers/admin/products_helper.rb +6 -0
- data/test_rails_app/app/helpers/admin/television_airings_helper.rb +2 -0
- data/test_rails_app/app/helpers/admin/television_time_slots_helper.rb +2 -0
- data/test_rails_app/app/helpers/admin/users2_helper.rb +2 -0
- data/test_rails_app/app/helpers/admin/users_helper.rb +25 -0
- data/test_rails_app/app/helpers/application_helper.rb +3 -0
- data/test_rails_app/app/helpers/blog_posts_helper.rb +2 -0
- data/test_rails_app/app/models/appointment.rb +5 -0
- data/test_rails_app/app/models/blog_post.rb +14 -0
- data/test_rails_app/app/models/blog_post_tag.rb +6 -0
- data/test_rails_app/app/models/bookmark.rb +6 -0
- data/test_rails_app/app/models/comment.rb +4 -0
- data/test_rails_app/app/models/file_column_image.rb +3 -0
- data/test_rails_app/app/models/image.rb +3 -0
- data/test_rails_app/app/models/not_migrated_yet.rb +2 -0
- data/test_rails_app/app/models/product.rb +7 -0
- data/test_rails_app/app/models/product_category.rb +9 -0
- data/test_rails_app/app/models/tag.rb +4 -0
- data/test_rails_app/app/models/television_airing.rb +3 -0
- data/test_rails_app/app/models/television_time_slot.rb +11 -0
- data/test_rails_app/app/models/user.rb +14 -0
- data/test_rails_app/app/views/admin/appointments/_subject_input.html.erb +2 -0
- data/test_rails_app/app/views/admin/appointments2/_time_input.html.erb +31 -0
- data/test_rails_app/app/views/admin/blog_posts2/_after_form.html.erb +5 -0
- data/test_rails_app/app/views/admin/blog_posts2/_after_index.html.erb +1 -0
- data/test_rails_app/app/views/admin/blog_posts2/_after_tags_input.html.erb +16 -0
- data/test_rails_app/app/views/admin/blog_posts2/_before_index.html.erb +2 -0
- data/test_rails_app/app/views/admin/blog_posts5/_after_index_header.html.erb +8 -0
- data/test_rails_app/app/views/admin/blog_posts_read_only/_body_for_show.html.erb +1 -0
- data/test_rails_app/app/views/admin/products/_name_input.html.erb +2 -0
- data/test_rails_app/app/views/admin/products/_percent_off_input.html.erb +2 -0
- data/test_rails_app/app/views/admin/products/_price_input.html.erb +10 -0
- data/test_rails_app/app/views/blog_posts/show.html.erb +13 -0
- data/test_rails_app/app/views/layouts/admin.html.erb +31 -0
- data/test_rails_app/config/boot.rb +109 -0
- data/test_rails_app/config/database.yml +28 -0
- data/test_rails_app/config/environment.rb +78 -0
- data/test_rails_app/config/environments/development.rb +17 -0
- data/test_rails_app/config/environments/production.rb +24 -0
- data/test_rails_app/config/environments/test.rb +24 -0
- data/test_rails_app/config/initializers/inflections.rb +10 -0
- data/test_rails_app/config/initializers/mime_types.rb +5 -0
- data/test_rails_app/config/initializers/new_rails_defaults.rb +17 -0
- data/test_rails_app/config/locales/en.yml +5 -0
- data/test_rails_app/config/routes.rb +43 -0
- data/test_rails_app/db/migrate/20090213215514_create_blog_posts.rb +12 -0
- data/test_rails_app/db/migrate/20090217225542_add_body_to_blog_posts.rb +9 -0
- data/test_rails_app/db/migrate/20090221220917_create_tags.rb +13 -0
- data/test_rails_app/db/migrate/20090221220947_create_blog_post_tags.rb +14 -0
- data/test_rails_app/db/migrate/20090222162204_add_textile_to_blog_posts.rb +9 -0
- data/test_rails_app/db/migrate/20090222163231_add_published_at_to_blog_posts.rb +9 -0
- data/test_rails_app/db/migrate/20090301191722_create_images.rb +16 -0
- data/test_rails_app/db/migrate/20090305165345_create_accounts.rb +14 -0
- data/test_rails_app/db/migrate/20090307225027_rename_accounts_to_users.rb +9 -0
- data/test_rails_app/db/migrate/20090307225750_add_user_id_to_blog_posts.rb +9 -0
- data/test_rails_app/db/migrate/20090309185114_change_blog_posts_textile.rb +9 -0
- data/test_rails_app/db/migrate/20090309193635_create_products.rb +14 -0
- data/test_rails_app/db/migrate/20090309203056_create_comments.rb +15 -0
- data/test_rails_app/db/migrate/20090323005947_create_file_column_images.rb +12 -0
- data/test_rails_app/db/migrate/20090326160049_add_birthday_to_users.rb +9 -0
- data/test_rails_app/db/migrate/20090326223606_add_state_to_users.rb +9 -0
- data/test_rails_app/db/migrate/20090503134004_add_file_column_image_to_products.rb +9 -0
- data/test_rails_app/db/migrate/20090617173651_create_bookmarks.rb +15 -0
- data/test_rails_app/db/migrate/20090624165355_add_tags_string_to_blog_post.rb +9 -0
- data/test_rails_app/db/migrate/20090625144313_add_avatar_fields_to_user.rb +11 -0
- data/test_rails_app/db/migrate/20090629202956_add_merged_into_to_blog_posts.rb +9 -0
- data/test_rails_app/db/migrate/20090701171857_add_force_textile_to_users.rb +9 -0
- data/test_rails_app/db/migrate/20090704163647_add_deleted_at_to_products.rb +9 -0
- data/test_rails_app/db/migrate/20090704173800_add_sale_fields_to_products.rb +13 -0
- data/test_rails_app/db/migrate/20090714024501_create_product_categories.rb +15 -0
- data/test_rails_app/db/migrate/20090819162835_add_admin_level_to_users.rb +9 -0
- data/test_rails_app/db/migrate/20091115134559_add_first_and_last_names_to_users.rb +11 -0
- data/test_rails_app/db/migrate/20091221011256_add_position_to_product_categories.rb +9 -0
- data/test_rails_app/db/migrate/20091222160814_create_appointments.rb +14 -0
- data/test_rails_app/db/migrate/20091227224547_add_user_id_to_appointments.rb +9 -0
- data/test_rails_app/db/migrate/20100214213359_create_television_time_slots.rb +13 -0
- data/test_rails_app/db/migrate/20100214213451_create_television_airings.rb +15 -0
- data/test_rails_app/doc/README_FOR_APP +5 -0
- data/test_rails_app/lib/tasks/rspec.rake +163 -0
- data/test_rails_app/public/404.html +30 -0
- data/test_rails_app/public/422.html +30 -0
- data/test_rails_app/public/500.html +33 -0
- data/test_rails_app/public/dispatch.cgi +10 -0
- data/test_rails_app/public/dispatch.fcgi +24 -0
- data/test_rails_app/public/dispatch.rb +10 -0
- data/test_rails_app/public/favicon.ico +0 -0
- data/test_rails_app/public/images/rails.png +0 -0
- data/test_rails_app/public/index.html +274 -0
- data/test_rails_app/public/javascripts/application.js +2 -0
- data/test_rails_app/public/javascripts/controls.js +963 -0
- data/test_rails_app/public/javascripts/dragdrop.js +973 -0
- data/test_rails_app/public/javascripts/effects.js +1128 -0
- data/test_rails_app/public/javascripts/prototype.js +4320 -0
- data/test_rails_app/public/robots.txt +5 -0
- data/test_rails_app/public/stylesheets/admin.css +3 -0
- data/test_rails_app/public/stylesheets/scaffold.css +54 -0
- data/test_rails_app/script/about +4 -0
- data/test_rails_app/script/autospec +5 -0
- data/test_rails_app/script/console +3 -0
- data/test_rails_app/script/dbconsole +3 -0
- data/test_rails_app/script/destroy +3 -0
- data/test_rails_app/script/generate +3 -0
- data/test_rails_app/script/performance/benchmarker +3 -0
- data/test_rails_app/script/performance/profiler +3 -0
- data/test_rails_app/script/performance/request +3 -0
- data/test_rails_app/script/plugin +3 -0
- data/test_rails_app/script/populate_tables.rb +49 -0
- data/test_rails_app/script/process/inspector +3 -0
- data/test_rails_app/script/process/reaper +3 -0
- data/test_rails_app/script/process/spawner +3 -0
- data/test_rails_app/script/runner +3 -0
- data/test_rails_app/script/server +3 -0
- data/test_rails_app/script/spec +5 -0
- data/test_rails_app/script/spec_server +125 -0
- data/test_rails_app/spec/controllers/admin/appointments2_controller_spec.rb +88 -0
- data/test_rails_app/spec/controllers/admin/appointments_controller_spec.rb +419 -0
- data/test_rails_app/spec/controllers/admin/blog_posts2_controller_spec.rb +1021 -0
- data/test_rails_app/spec/controllers/admin/blog_posts3_controller_spec.rb +532 -0
- data/test_rails_app/spec/controllers/admin/blog_posts4_controller_spec.rb +231 -0
- data/test_rails_app/spec/controllers/admin/blog_posts5_controller_spec.rb +77 -0
- data/test_rails_app/spec/controllers/admin/blog_posts6_controller_spec.rb +49 -0
- data/test_rails_app/spec/controllers/admin/blog_posts_controller_spec.rb +987 -0
- data/test_rails_app/spec/controllers/admin/blog_posts_custom_new_and_edit_controller_spec.rb +99 -0
- data/test_rails_app/spec/controllers/admin/blog_posts_read_only_controller_spec.rb +94 -0
- data/test_rails_app/spec/controllers/admin/bookmarks_controller_spec.rb +505 -0
- data/test_rails_app/spec/controllers/admin/comments2_controller_spec.rb +70 -0
- data/test_rails_app/spec/controllers/admin/comments_controller_spec.rb +82 -0
- data/test_rails_app/spec/controllers/admin/file_column_images2_controller_spec.rb +25 -0
- data/test_rails_app/spec/controllers/admin/file_column_images_controller_spec.rb +82 -0
- data/test_rails_app/spec/controllers/admin/images2_controller_spec.rb +44 -0
- data/test_rails_app/spec/controllers/admin/images_controller_spec.rb +97 -0
- data/test_rails_app/spec/controllers/admin/misconfigured1_controller_spec.rb +21 -0
- data/test_rails_app/spec/controllers/admin/not_migrated_yets_controller_spec.rb +10 -0
- data/test_rails_app/spec/controllers/admin/product_categories2_controller_spec.rb +215 -0
- data/test_rails_app/spec/controllers/admin/product_categories_controller_spec.rb +19 -0
- data/test_rails_app/spec/controllers/admin/products2_controller_spec.rb +203 -0
- data/test_rails_app/spec/controllers/admin/products_controller_spec.rb +255 -0
- data/test_rails_app/spec/controllers/admin/television_airings_controller_spec.rb +32 -0
- data/test_rails_app/spec/controllers/admin/television_time_slots_controller_spec.rb +10 -0
- data/test_rails_app/spec/controllers/admin/users2_controller_spec.rb +65 -0
- data/test_rails_app/spec/controllers/admin/users_controller_spec.rb +344 -0
- data/test_rails_app/spec/controllers/blog_posts_controller_spec.rb +13 -0
- data/test_rails_app/spec/data/ruby_throated.jpg +0 -0
- data/test_rails_app/spec/data/tweenbot.jpg +0 -0
- data/test_rails_app/spec/fixtures/appointments.yml +9 -0
- data/test_rails_app/spec/fixtures/blog_post_tags.yml +9 -0
- data/test_rails_app/spec/fixtures/blog_posts.yml +7 -0
- data/test_rails_app/spec/fixtures/bookmarks.yml +11 -0
- data/test_rails_app/spec/fixtures/comments.yml +11 -0
- data/test_rails_app/spec/fixtures/file_column_images.yml +7 -0
- data/test_rails_app/spec/fixtures/images.yml +7 -0
- data/test_rails_app/spec/fixtures/not_migrated_yets.yml +7 -0
- data/test_rails_app/spec/fixtures/product_categories.yml +7 -0
- data/test_rails_app/spec/fixtures/products.yml +9 -0
- data/test_rails_app/spec/fixtures/tags.yml +7 -0
- data/test_rails_app/spec/fixtures/television_airings.yml +11 -0
- data/test_rails_app/spec/fixtures/television_time_slots.yml +7 -0
- data/test_rails_app/spec/fixtures/users.yml +9 -0
- data/test_rails_app/spec/helpers/admin/appointments2_helper_spec.rb +11 -0
- data/test_rails_app/spec/helpers/admin/appointments_helper_spec.rb +11 -0
- data/test_rails_app/spec/helpers/admin/blog_posts2_helper_spec.rb +11 -0
- data/test_rails_app/spec/helpers/admin/blog_posts3_helper_spec.rb +11 -0
- data/test_rails_app/spec/helpers/admin/blog_posts4_helper_spec.rb +11 -0
- data/test_rails_app/spec/helpers/admin/blog_posts_custom_new_and_edit_helper_spec.rb +11 -0
- data/test_rails_app/spec/helpers/admin/blog_posts_helper_spec.rb +11 -0
- data/test_rails_app/spec/helpers/admin/blog_posts_read_only_helper_spec.rb +11 -0
- data/test_rails_app/spec/helpers/admin/bookmarks_helper_spec.rb +11 -0
- data/test_rails_app/spec/helpers/admin/comments2_helper_spec.rb +11 -0
- data/test_rails_app/spec/helpers/admin/comments_helper_spec.rb +11 -0
- data/test_rails_app/spec/helpers/admin/file_column_images2_helper_spec.rb +11 -0
- data/test_rails_app/spec/helpers/admin/file_column_images_helper_spec.rb +11 -0
- data/test_rails_app/spec/helpers/admin/images2_helper_spec.rb +11 -0
- data/test_rails_app/spec/helpers/admin/images_helper_spec.rb +11 -0
- data/test_rails_app/spec/helpers/admin/misconfigured1_helper_spec.rb +11 -0
- data/test_rails_app/spec/helpers/admin/not_migrated_yets_helper_spec.rb +11 -0
- data/test_rails_app/spec/helpers/admin/product_categories2_helper_spec.rb +11 -0
- data/test_rails_app/spec/helpers/admin/product_categories_helper_spec.rb +11 -0
- data/test_rails_app/spec/helpers/admin/products2_helper_spec.rb +11 -0
- data/test_rails_app/spec/helpers/admin/products_helper_spec.rb +11 -0
- data/test_rails_app/spec/helpers/admin/television_airings_helper_spec.rb +11 -0
- data/test_rails_app/spec/helpers/admin/television_time_slots_helper_spec.rb +11 -0
- data/test_rails_app/spec/helpers/admin/users2_helper_spec.rb +11 -0
- data/test_rails_app/spec/helpers/admin/users_helper_spec.rb +11 -0
- data/test_rails_app/spec/helpers/blog_posts_helper_spec.rb +11 -0
- data/test_rails_app/spec/models/appointment_spec.rb +16 -0
- data/test_rails_app/spec/models/blog_post_spec.rb +13 -0
- data/test_rails_app/spec/models/blog_post_tag_spec.rb +14 -0
- data/test_rails_app/spec/models/bookmark_spec.rb +15 -0
- data/test_rails_app/spec/models/comment_spec.rb +15 -0
- data/test_rails_app/spec/models/file_column_image_spec.rb +12 -0
- data/test_rails_app/spec/models/image_spec.rb +12 -0
- data/test_rails_app/spec/models/not_migrated_yet_spec.rb +15 -0
- data/test_rails_app/spec/models/product_category_spec.rb +15 -0
- data/test_rails_app/spec/models/product_spec.rb +14 -0
- data/test_rails_app/spec/models/tag_spec.rb +13 -0
- data/test_rails_app/spec/models/television_airing_spec.rb +15 -0
- data/test_rails_app/spec/models/television_time_slot_spec.rb +13 -0
- data/test_rails_app/spec/models/user_spec.rb +14 -0
- data/test_rails_app/spec/rcov.opts +2 -0
- data/test_rails_app/spec/spec.opts +4 -0
- data/test_rails_app/spec/spec_helper.rb +88 -0
- data/test_rails_app/spec/spec_or_test_helper.rb +49 -0
- data/test_rails_app/test/fixtures/file_column_images.yml +7 -0
- data/test_rails_app/test/integration/admin_blog_posts2_integration_test.rb +16 -0
- data/test_rails_app/test/integration/admin_blog_posts5_integration_test.rb +19 -0
- data/test_rails_app/test/integration/admin_blog_posts_integration_test.rb +25 -0
- data/test_rails_app/test/test_helper.rb +28 -0
- data/test_rails_app/vendor/plugins/file_column/CHANGELOG +69 -0
- data/test_rails_app/vendor/plugins/file_column/README +54 -0
- data/test_rails_app/vendor/plugins/file_column/Rakefile +36 -0
- data/test_rails_app/vendor/plugins/file_column/TODO +6 -0
- data/test_rails_app/vendor/plugins/file_column/init.rb +13 -0
- data/test_rails_app/vendor/plugins/file_column/lib/file_column.rb +723 -0
- data/test_rails_app/vendor/plugins/file_column/lib/file_column_helper.rb +150 -0
- data/test_rails_app/vendor/plugins/file_column/lib/file_compat.rb +28 -0
- data/test_rails_app/vendor/plugins/file_column/lib/magick_file_column.rb +260 -0
- data/test_rails_app/vendor/plugins/file_column/lib/rails_file_column.rb +19 -0
- data/test_rails_app/vendor/plugins/file_column/lib/test_case.rb +124 -0
- data/test_rails_app/vendor/plugins/file_column/lib/validations.rb +112 -0
- data/test_rails_app/vendor/plugins/file_column/test/abstract_unit.rb +63 -0
- data/test_rails_app/vendor/plugins/file_column/test/connection.rb +17 -0
- data/test_rails_app/vendor/plugins/file_column/test/file_column_helper_test.rb +97 -0
- data/test_rails_app/vendor/plugins/file_column/test/file_column_test.rb +650 -0
- data/test_rails_app/vendor/plugins/file_column/test/fixtures/entry.rb +32 -0
- data/test_rails_app/vendor/plugins/file_column/test/fixtures/invalid-image.jpg +1 -0
- data/test_rails_app/vendor/plugins/file_column/test/fixtures/kerb.jpg +0 -0
- data/test_rails_app/vendor/plugins/file_column/test/fixtures/mysql.sql +25 -0
- data/test_rails_app/vendor/plugins/file_column/test/fixtures/schema.rb +10 -0
- data/test_rails_app/vendor/plugins/file_column/test/fixtures/skanthak.png +0 -0
- data/test_rails_app/vendor/plugins/file_column/test/magick_test.rb +380 -0
- data/test_rails_app/vendor/plugins/file_column/test/magick_view_only_test.rb +21 -0
- data/vendor/ar_query/ar_query.gemspec +16 -0
- data/website/_layouts/api.html +39 -0
- data/website/_layouts/default.html +34 -0
- data/website/api/core.markdown +106 -0
- data/website/api/destroy.markdown +25 -0
- data/website/api/form.markdown +291 -0
- data/website/api/idx.markdown +286 -0
- data/website/api/index.markdown +147 -0
- data/website/api/search.markdown +108 -0
- data/website/api/show.markdown +22 -0
- data/website/community.markdown +27 -0
- data/website/css/lightbox.css +29 -0
- data/website/css/main.css +70 -0
- data/website/design_principles.markdown +50 -0
- data/website/getting_started.markdown +10 -0
- data/website/img/blog_posts-index.png +0 -0
- data/website/img/blog_posts-search.png +0 -0
- data/website/img/lightbox/bullet.gif +0 -0
- data/website/img/lightbox/close.gif +0 -0
- data/website/img/lightbox/closelabel.gif +0 -0
- data/website/img/lightbox/donate-button.gif +0 -0
- data/website/img/lightbox/download-icon.gif +0 -0
- data/website/img/lightbox/image-1.jpg +0 -0
- data/website/img/lightbox/loading.gif +0 -0
- data/website/img/lightbox/nextlabel.gif +0 -0
- data/website/img/lightbox/prevlabel.gif +0 -0
- data/website/img/lightbox/thumb-1.jpg +0 -0
- data/website/img/screen1-thumb.png +0 -0
- data/website/img/screen1.png +0 -0
- data/website/img/screen10-thumb.png +0 -0
- data/website/img/screen10.png +0 -0
- data/website/img/screen11-thumb.png +0 -0
- data/website/img/screen11.png +0 -0
- data/website/img/screen2-thumb.png +0 -0
- data/website/img/screen2.png +0 -0
- data/website/img/screen3-thumb.png +0 -0
- data/website/img/screen3.png +0 -0
- data/website/img/screen4-thumb.png +0 -0
- data/website/img/screen4.png +0 -0
- data/website/img/screen5-thumb.png +0 -0
- data/website/img/screen5.png +0 -0
- data/website/img/screen6-thumb.png +0 -0
- data/website/img/screen6.png +0 -0
- data/website/img/screen7-thumb.png +0 -0
- data/website/img/screen7.png +0 -0
- data/website/img/screen8-thumb.png +0 -0
- data/website/img/screen8.png +0 -0
- data/website/img/screen9-thumb.png +0 -0
- data/website/img/screen9.png +0 -0
- data/website/img/user-form.png +0 -0
- data/website/index.markdown +35 -0
- data/website/js/builder.js +136 -0
- data/website/js/effects.js +1122 -0
- data/website/js/lightbox.js +497 -0
- data/website/js/prototype.js +4221 -0
- data/website/js/scriptaculous.js +58 -0
- data/website/quick_start.markdown +44 -0
- data/website/screenshots.markdown +27 -0
- data/website/tutorial.markdown +56 -0
- metadata +391 -23
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
-- MySQL dump 9.11
|
|
2
|
+
--
|
|
3
|
+
-- Host: localhost Database: file_column_test
|
|
4
|
+
-- ------------------------------------------------------
|
|
5
|
+
-- Server version 4.0.24
|
|
6
|
+
|
|
7
|
+
--
|
|
8
|
+
-- Table structure for table `entries`
|
|
9
|
+
--
|
|
10
|
+
|
|
11
|
+
DROP TABLE IF EXISTS entries;
|
|
12
|
+
CREATE TABLE entries (
|
|
13
|
+
id int(11) NOT NULL auto_increment,
|
|
14
|
+
image varchar(200) default NULL,
|
|
15
|
+
file varchar(200) NOT NULL,
|
|
16
|
+
PRIMARY KEY (id)
|
|
17
|
+
) TYPE=MyISAM;
|
|
18
|
+
|
|
19
|
+
DROP TABLE IF EXISTS movies;
|
|
20
|
+
CREATE TABLE movies (
|
|
21
|
+
id int(11) NOT NULL auto_increment,
|
|
22
|
+
movie varchar(200) default NULL,
|
|
23
|
+
PRIMARY KEY (id)
|
|
24
|
+
) TYPE=MyISAM;
|
|
25
|
+
|
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/abstract_unit'
|
|
2
|
+
require 'RMagick'
|
|
3
|
+
require File.dirname(__FILE__) + '/fixtures/entry'
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class AbstractRMagickTest < Test::Unit::TestCase
|
|
7
|
+
def teardown
|
|
8
|
+
FileUtils.rm_rf File.dirname(__FILE__)+"/public/entry/"
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def test_truth
|
|
12
|
+
assert true
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
private
|
|
16
|
+
|
|
17
|
+
def read_image(path)
|
|
18
|
+
Magick::Image::read(path).first
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def assert_max_image_size(img, s)
|
|
22
|
+
assert img.columns <= s, "img has #{img.columns} columns, expected: #{s}"
|
|
23
|
+
assert img.rows <= s, "img has #{img.rows} rows, expected: #{s}"
|
|
24
|
+
assert_equal s, [img.columns, img.rows].max
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
class RMagickSimpleTest < AbstractRMagickTest
|
|
29
|
+
def setup
|
|
30
|
+
Entry.file_column :image, :magick => { :geometry => "100x100" }
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def test_simple_resize_without_save
|
|
34
|
+
e = Entry.new
|
|
35
|
+
e.image = upload(f("kerb.jpg"))
|
|
36
|
+
|
|
37
|
+
img = read_image(e.image)
|
|
38
|
+
assert_max_image_size img, 100
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def test_simple_resize_with_save
|
|
42
|
+
e = Entry.new
|
|
43
|
+
e.image = upload(f("kerb.jpg"))
|
|
44
|
+
assert e.save
|
|
45
|
+
e.reload
|
|
46
|
+
|
|
47
|
+
img = read_image(e.image)
|
|
48
|
+
assert_max_image_size img, 100
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def test_resize_on_saved_image
|
|
52
|
+
Entry.file_column :image, :magick => { :geometry => "100x100" }
|
|
53
|
+
|
|
54
|
+
e = Entry.new
|
|
55
|
+
e.image = upload(f("skanthak.png"))
|
|
56
|
+
assert e.save
|
|
57
|
+
e.reload
|
|
58
|
+
old_path = e.image
|
|
59
|
+
|
|
60
|
+
e.image = upload(f("kerb.jpg"))
|
|
61
|
+
assert e.save
|
|
62
|
+
assert "kerb.jpg", File.basename(e.image)
|
|
63
|
+
assert !File.exists?(old_path), "old image '#{old_path}' still exists"
|
|
64
|
+
|
|
65
|
+
img = read_image(e.image)
|
|
66
|
+
assert_max_image_size img, 100
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def test_invalid_image
|
|
70
|
+
e = Entry.new
|
|
71
|
+
assert_nothing_raised { e.image = upload(f("invalid-image.jpg")) }
|
|
72
|
+
assert !e.valid?
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def test_serializable
|
|
76
|
+
e = Entry.new
|
|
77
|
+
e.image = upload(f("skanthak.png"))
|
|
78
|
+
assert_nothing_raised {
|
|
79
|
+
flash = Marshal.dump(e)
|
|
80
|
+
e = Marshal.load(flash)
|
|
81
|
+
}
|
|
82
|
+
assert File.exists?(e.image)
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def test_imagemagick_still_usable
|
|
86
|
+
e = Entry.new
|
|
87
|
+
assert_nothing_raised {
|
|
88
|
+
img = e.load_image_with_rmagick(file_path("skanthak.png"))
|
|
89
|
+
assert img.kind_of?(Magick::Image)
|
|
90
|
+
}
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
class RMagickRequiresImageTest < AbstractRMagickTest
|
|
95
|
+
def setup
|
|
96
|
+
Entry.file_column :image, :magick => {
|
|
97
|
+
:size => "100x100>",
|
|
98
|
+
:image_required => false,
|
|
99
|
+
:versions => {
|
|
100
|
+
:thumb => "80x80>",
|
|
101
|
+
:large => {:size => "200x200>", :lazy => true}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def test_image_required_with_image
|
|
107
|
+
e = Entry.new(:image => upload(f("skanthak.png")))
|
|
108
|
+
assert_max_image_size read_image(e.image), 100
|
|
109
|
+
assert e.valid?
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def test_image_required_with_invalid_image
|
|
113
|
+
e = Entry.new(:image => upload(f("invalid-image.jpg")))
|
|
114
|
+
assert e.valid?, "did not ignore invalid image"
|
|
115
|
+
assert FileUtils.identical?(e.image, f("invalid-image.jpg")), "uploaded file has not been left alone"
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def test_versions_with_invalid_image
|
|
119
|
+
e = Entry.new(:image => upload(f("invalid-image.jpg")))
|
|
120
|
+
assert e.valid?
|
|
121
|
+
|
|
122
|
+
image_state = e.send(:image_state)
|
|
123
|
+
assert_nil image_state.create_magick_version_if_needed(:thumb)
|
|
124
|
+
assert_nil image_state.create_magick_version_if_needed(:large)
|
|
125
|
+
assert_nil image_state.create_magick_version_if_needed("300x300>")
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
class RMagickCustomAttributesTest < AbstractRMagickTest
|
|
130
|
+
def assert_image_property(img, property, value, text = nil)
|
|
131
|
+
assert File.exists?(img), "the image does not exist"
|
|
132
|
+
assert_equal value, read_image(img).send(property), text
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
def test_simple_attributes
|
|
136
|
+
Entry.file_column :image, :magick => { :attributes => { :quality => 20 } }
|
|
137
|
+
e = Entry.new("image" => upload(f("kerb.jpg")))
|
|
138
|
+
assert_image_property e.image, :quality, 20, "the quality was not set"
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
def test_version_attributes
|
|
142
|
+
Entry.file_column :image, :magick => {
|
|
143
|
+
:versions => {
|
|
144
|
+
:thumb => { :attributes => { :quality => 20 } }
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
e = Entry.new("image" => upload(f("kerb.jpg")))
|
|
148
|
+
assert_image_property e.image("thumb"), :quality, 20, "the quality was not set"
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
def test_lazy_attributes
|
|
152
|
+
Entry.file_column :image, :magick => {
|
|
153
|
+
:versions => {
|
|
154
|
+
:thumb => { :attributes => { :quality => 20 }, :lazy => true }
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
e = Entry.new("image" => upload(f("kerb.jpg")))
|
|
158
|
+
e.send(:image_state).create_magick_version_if_needed(:thumb)
|
|
159
|
+
assert_image_property e.image("thumb"), :quality, 20, "the quality was not set"
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
class RMagickVersionsTest < AbstractRMagickTest
|
|
164
|
+
def setup
|
|
165
|
+
Entry.file_column :image, :magick => {:geometry => "200x200",
|
|
166
|
+
:versions => {
|
|
167
|
+
:thumb => "50x50",
|
|
168
|
+
:medium => {:geometry => "100x100", :name => "100_100"},
|
|
169
|
+
:large => {:geometry => "150x150", :lazy => true}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
def test_should_create_thumb
|
|
176
|
+
e = Entry.new("image" => upload(f("skanthak.png")))
|
|
177
|
+
|
|
178
|
+
assert File.exists?(e.image("thumb")), "thumb-nail not created"
|
|
179
|
+
|
|
180
|
+
assert_max_image_size read_image(e.image("thumb")), 50
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
def test_version_name_can_be_different_from_key
|
|
184
|
+
e = Entry.new("image" => upload(f("skanthak.png")))
|
|
185
|
+
|
|
186
|
+
assert File.exists?(e.image("100_100"))
|
|
187
|
+
assert !File.exists?(e.image("medium"))
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
def test_should_not_create_lazy_versions
|
|
191
|
+
e = Entry.new("image" => upload(f("skanthak.png")))
|
|
192
|
+
assert !File.exists?(e.image("large")), "lazy versions should not be created unless needed"
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
def test_should_create_lazy_version_on_demand
|
|
196
|
+
e = Entry.new("image" => upload(f("skanthak.png")))
|
|
197
|
+
|
|
198
|
+
e.send(:image_state).create_magick_version_if_needed(:large)
|
|
199
|
+
|
|
200
|
+
assert File.exists?(e.image("large")), "lazy version should be created on demand"
|
|
201
|
+
|
|
202
|
+
assert_max_image_size read_image(e.image("large")), 150
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
def test_generated_name_should_not_change
|
|
206
|
+
e = Entry.new("image" => upload(f("skanthak.png")))
|
|
207
|
+
|
|
208
|
+
name1 = e.send(:image_state).create_magick_version_if_needed("50x50")
|
|
209
|
+
name2 = e.send(:image_state).create_magick_version_if_needed("50x50")
|
|
210
|
+
name3 = e.send(:image_state).create_magick_version_if_needed(:geometry => "50x50")
|
|
211
|
+
assert_equal name1, name2, "hash value has changed"
|
|
212
|
+
assert_equal name1, name3, "hash value has changed"
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
def test_should_create_version_with_string
|
|
216
|
+
e = Entry.new("image" => upload(f("skanthak.png")))
|
|
217
|
+
|
|
218
|
+
name = e.send(:image_state).create_magick_version_if_needed("32x32")
|
|
219
|
+
|
|
220
|
+
assert File.exists?(e.image(name))
|
|
221
|
+
|
|
222
|
+
assert_max_image_size read_image(e.image(name)), 32
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
def test_should_create_safe_auto_id
|
|
226
|
+
e = Entry.new("image" => upload(f("skanthak.png")))
|
|
227
|
+
|
|
228
|
+
name = e.send(:image_state).create_magick_version_if_needed("32x32")
|
|
229
|
+
|
|
230
|
+
assert_match /^[a-zA-Z0-9]+$/, name
|
|
231
|
+
end
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
class RMagickCroppingTest < AbstractRMagickTest
|
|
235
|
+
def setup
|
|
236
|
+
Entry.file_column :image, :magick => {:geometry => "200x200",
|
|
237
|
+
:versions => {
|
|
238
|
+
:thumb => {:crop => "1:1", :geometry => "50x50"}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
def test_should_crop_image_on_upload
|
|
244
|
+
e = Entry.new("image" => upload(f("skanthak.png")))
|
|
245
|
+
|
|
246
|
+
img = read_image(e.image("thumb"))
|
|
247
|
+
|
|
248
|
+
assert_equal 50, img.rows
|
|
249
|
+
assert_equal 50, img.columns
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
end
|
|
253
|
+
|
|
254
|
+
class UrlForImageColumnTest < AbstractRMagickTest
|
|
255
|
+
include FileColumnHelper
|
|
256
|
+
|
|
257
|
+
def setup
|
|
258
|
+
Entry.file_column :image, :magick => {
|
|
259
|
+
:versions => {:thumb => "50x50"}
|
|
260
|
+
}
|
|
261
|
+
@request = RequestMock.new
|
|
262
|
+
end
|
|
263
|
+
|
|
264
|
+
def test_should_use_version_on_symbol_option
|
|
265
|
+
e = Entry.new(:image => upload(f("skanthak.png")))
|
|
266
|
+
|
|
267
|
+
url = url_for_image_column(e, "image", :thumb)
|
|
268
|
+
assert_match %r{^/entry/image/tmp/.+/thumb/skanthak.png$}, url
|
|
269
|
+
end
|
|
270
|
+
|
|
271
|
+
def test_should_use_string_as_size
|
|
272
|
+
e = Entry.new(:image => upload(f("skanthak.png")))
|
|
273
|
+
|
|
274
|
+
url = url_for_image_column(e, "image", "50x50")
|
|
275
|
+
|
|
276
|
+
assert_match %r{^/entry/image/tmp/.+/.+/skanthak.png$}, url
|
|
277
|
+
|
|
278
|
+
url =~ /\/([^\/]+)\/skanthak.png$/
|
|
279
|
+
dirname = $1
|
|
280
|
+
|
|
281
|
+
assert_max_image_size read_image(e.image(dirname)), 50
|
|
282
|
+
end
|
|
283
|
+
|
|
284
|
+
def test_should_accept_version_hash
|
|
285
|
+
e = Entry.new(:image => upload(f("skanthak.png")))
|
|
286
|
+
|
|
287
|
+
url = url_for_image_column(e, "image", :size => "50x50", :crop => "1:1", :name => "small")
|
|
288
|
+
|
|
289
|
+
assert_match %r{^/entry/image/tmp/.+/small/skanthak.png$}, url
|
|
290
|
+
|
|
291
|
+
img = read_image(e.image("small"))
|
|
292
|
+
assert_equal 50, img.rows
|
|
293
|
+
assert_equal 50, img.columns
|
|
294
|
+
end
|
|
295
|
+
end
|
|
296
|
+
|
|
297
|
+
class RMagickPermissionsTest < AbstractRMagickTest
|
|
298
|
+
def setup
|
|
299
|
+
Entry.file_column :image, :magick => {:geometry => "200x200",
|
|
300
|
+
:versions => {
|
|
301
|
+
:thumb => {:crop => "1:1", :geometry => "50x50"}
|
|
302
|
+
}
|
|
303
|
+
}, :permissions => 0616
|
|
304
|
+
end
|
|
305
|
+
|
|
306
|
+
def check_permissions(e)
|
|
307
|
+
assert_equal 0616, (File.stat(e.image).mode & 0777)
|
|
308
|
+
assert_equal 0616, (File.stat(e.image("thumb")).mode & 0777)
|
|
309
|
+
end
|
|
310
|
+
|
|
311
|
+
def test_permissions_with_rmagick
|
|
312
|
+
e = Entry.new(:image => upload(f("skanthak.png")))
|
|
313
|
+
|
|
314
|
+
check_permissions e
|
|
315
|
+
|
|
316
|
+
assert e.save
|
|
317
|
+
|
|
318
|
+
check_permissions e
|
|
319
|
+
end
|
|
320
|
+
end
|
|
321
|
+
|
|
322
|
+
class Entry
|
|
323
|
+
def transform_grey(img)
|
|
324
|
+
img.quantize(256, Magick::GRAYColorspace)
|
|
325
|
+
end
|
|
326
|
+
end
|
|
327
|
+
|
|
328
|
+
class RMagickTransformationTest < AbstractRMagickTest
|
|
329
|
+
def assert_transformed(image)
|
|
330
|
+
assert File.exists?(image), "the image does not exist"
|
|
331
|
+
assert 256 > read_image(image).number_colors, "the number of colors was not changed"
|
|
332
|
+
end
|
|
333
|
+
|
|
334
|
+
def test_simple_transformation
|
|
335
|
+
Entry.file_column :image, :magick => { :transformation => Proc.new { |image| image.quantize(256, Magick::GRAYColorspace) } }
|
|
336
|
+
e = Entry.new("image" => upload(f("skanthak.png")))
|
|
337
|
+
assert_transformed(e.image)
|
|
338
|
+
end
|
|
339
|
+
|
|
340
|
+
def test_simple_version_transformation
|
|
341
|
+
Entry.file_column :image, :magick => {
|
|
342
|
+
:versions => { :thumb => Proc.new { |image| image.quantize(256, Magick::GRAYColorspace) } }
|
|
343
|
+
}
|
|
344
|
+
e = Entry.new("image" => upload(f("skanthak.png")))
|
|
345
|
+
assert_transformed(e.image("thumb"))
|
|
346
|
+
end
|
|
347
|
+
|
|
348
|
+
def test_complex_version_transformation
|
|
349
|
+
Entry.file_column :image, :magick => {
|
|
350
|
+
:versions => {
|
|
351
|
+
:thumb => { :transformation => Proc.new { |image| image.quantize(256, Magick::GRAYColorspace) } }
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
e = Entry.new("image" => upload(f("skanthak.png")))
|
|
355
|
+
assert_transformed(e.image("thumb"))
|
|
356
|
+
end
|
|
357
|
+
|
|
358
|
+
def test_lazy_transformation
|
|
359
|
+
Entry.file_column :image, :magick => {
|
|
360
|
+
:versions => {
|
|
361
|
+
:thumb => { :transformation => Proc.new { |image| image.quantize(256, Magick::GRAYColorspace) }, :lazy => true }
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
e = Entry.new("image" => upload(f("skanthak.png")))
|
|
365
|
+
e.send(:image_state).create_magick_version_if_needed(:thumb)
|
|
366
|
+
assert_transformed(e.image("thumb"))
|
|
367
|
+
end
|
|
368
|
+
|
|
369
|
+
def test_simple_callback_transformation
|
|
370
|
+
Entry.file_column :image, :magick => :transform_grey
|
|
371
|
+
e = Entry.new(:image => upload(f("skanthak.png")))
|
|
372
|
+
assert_transformed(e.image)
|
|
373
|
+
end
|
|
374
|
+
|
|
375
|
+
def test_complex_callback_transformation
|
|
376
|
+
Entry.file_column :image, :magick => { :transformation => :transform_grey }
|
|
377
|
+
e = Entry.new(:image => upload(f("skanthak.png")))
|
|
378
|
+
assert_transformed(e.image)
|
|
379
|
+
end
|
|
380
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/abstract_unit'
|
|
2
|
+
require File.dirname(__FILE__) + '/fixtures/entry'
|
|
3
|
+
|
|
4
|
+
class RMagickViewOnlyTest < Test::Unit::TestCase
|
|
5
|
+
include FileColumnHelper
|
|
6
|
+
|
|
7
|
+
def setup
|
|
8
|
+
Entry.file_column :image
|
|
9
|
+
@request = RequestMock.new
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def teardown
|
|
13
|
+
FileUtils.rm_rf File.dirname(__FILE__)+"/public/entry/"
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def test_url_for_image_column_without_model_versions
|
|
17
|
+
e = Entry.new(:image => upload(f("skanthak.png")))
|
|
18
|
+
|
|
19
|
+
assert_nothing_raised { url_for_image_column e, "image", "50x50" }
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
require 'rake'
|
|
2
|
+
|
|
3
|
+
Gem::Specification.new do |s|
|
|
4
|
+
s.name = 'ar_query'
|
|
5
|
+
s.version = '0.0.1'
|
|
6
|
+
s.date = '2009-02-19'
|
|
7
|
+
s.author = 'Francis Hwang'
|
|
8
|
+
s.description = 'A utility class for building options for ActiveRecord.find.'
|
|
9
|
+
s.summary = 'A utility class for building options for ActiveRecord.find.'
|
|
10
|
+
s.email = 'sera@fhwang.net'
|
|
11
|
+
s.homepage = 'http://github.com/fhwang/ar_query'
|
|
12
|
+
s.files = FileList[
|
|
13
|
+
'lib/*.rb', 'MIT-LICENSE', 'README', '*.rb', 'spec/*.rb',
|
|
14
|
+
'tasks/*.rake'
|
|
15
|
+
].to_a
|
|
16
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
2
|
+
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
3
|
+
<head>
|
|
4
|
+
<title>admin_assistant: API{% if page.title != '' %}: {{ page.title }}{% endif% %}</title>
|
|
5
|
+
<link rel="stylesheet" href="../css/main.css" type="text/css" media="screen">
|
|
6
|
+
</head>
|
|
7
|
+
|
|
8
|
+
<body>
|
|
9
|
+
<div id="page_header">
|
|
10
|
+
<h1><a href="../">admin_assistant</a></h1>
|
|
11
|
+
<div class="nav">
|
|
12
|
+
<a href="../screenshots.html">Screenshots</a> |
|
|
13
|
+
<a href="../quick_start.html">Quick start</a> |
|
|
14
|
+
<a href="../tutorial.html">Tutorial</a> |
|
|
15
|
+
<a href="../api/">API reference</a> |
|
|
16
|
+
<a href="../community.html">Community</a> |
|
|
17
|
+
<a href="../design_principles.html">Design principles</a> |
|
|
18
|
+
<a href="http://groups.google.com/group/admin_assistant">Mailing list</a> |
|
|
19
|
+
<a href="http://github.com/fhwang/admin_assistant">Github page</a>
|
|
20
|
+
</div>
|
|
21
|
+
</div>
|
|
22
|
+
<div id="body">
|
|
23
|
+
<h2>
|
|
24
|
+
<a href="../api/">API</a>
|
|
25
|
+
{% if page.title != '' %}: {{page.title}}{% endif %}
|
|
26
|
+
</h2>
|
|
27
|
+
<div class="subnav">
|
|
28
|
+
<a href="../api/core.html">Core</a> |
|
|
29
|
+
<a href="../api/destroy.html">Destroy</a> |
|
|
30
|
+
<a href="../api/form.html">Form</a> |
|
|
31
|
+
<a href="../api/idx.html">Index</a> |
|
|
32
|
+
<a href="../api/search.html">Search</a> |
|
|
33
|
+
<a href="../api/show.html">Show</a>
|
|
34
|
+
</div>
|
|
35
|
+
|
|
36
|
+
{{ content }}
|
|
37
|
+
</div>
|
|
38
|
+
</body>
|
|
39
|
+
</html>
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
2
|
+
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
3
|
+
<head>
|
|
4
|
+
<title>admin_assistant{% if page.title %}: {{ page.title }}{% endif% %}</title>
|
|
5
|
+
<link rel="stylesheet" href="./css/main.css" type="text/css" media="screen">
|
|
6
|
+
|
|
7
|
+
<script type="text/javascript" src="./js/prototype.js"></script>
|
|
8
|
+
<script type="text/javascript" src="./js/scriptaculous.js?load=effects,builder"></script>
|
|
9
|
+
<script type="text/javascript" src="./js/lightbox.js"></script>
|
|
10
|
+
<link rel="stylesheet" href="./css/lightbox.css" type="text/css" media="screen" />
|
|
11
|
+
</head>
|
|
12
|
+
|
|
13
|
+
<body>
|
|
14
|
+
<div id="page_header">
|
|
15
|
+
<h1><a href="./">admin_assistant</a></h1>
|
|
16
|
+
<div class="nav">
|
|
17
|
+
<a href="./screenshots.html">Screenshots</a> |
|
|
18
|
+
<a href="./quick_start.html">Quick start</a> |
|
|
19
|
+
<a href="./tutorial.html">Tutorial</a> |
|
|
20
|
+
<a href="./api/">API reference</a> |
|
|
21
|
+
<a href="./community.html">Community</a> |
|
|
22
|
+
<a href="./design_principles.html">Design principles</a> |
|
|
23
|
+
<a href="http://groups.google.com/group/admin_assistant">Mailing list</a> |
|
|
24
|
+
<a href="http://github.com/fhwang/admin_assistant">Github page</a>
|
|
25
|
+
</div>
|
|
26
|
+
</div>
|
|
27
|
+
<div id="body">
|
|
28
|
+
{% if page.title != '' %}
|
|
29
|
+
<h2>{{ page.title }}</h2>
|
|
30
|
+
{% endif %}
|
|
31
|
+
{{ content }}
|
|
32
|
+
</div>
|
|
33
|
+
</body>
|
|
34
|
+
</html>
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
---
|
|
2
|
+
layout: api
|
|
3
|
+
title: Core
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
### Includes
|
|
7
|
+
|
|
8
|
+
admin\_assistant comes with its own Javascript and CSS. Call `admin_assistant_includes` in your admin layout to use them:
|
|
9
|
+
|
|
10
|
+
<html>
|
|
11
|
+
<head>
|
|
12
|
+
<%= admin_assistant_includes %>
|
|
13
|
+
</head>
|
|
14
|
+
...
|
|
15
|
+
</html>
|
|
16
|
+
|
|
17
|
+
You also have the option of making admin\_assistant look very similar to activescaffold CSS-wise, which might come in handy if you're in the process of transition from one to the other:
|
|
18
|
+
|
|
19
|
+
<%= admin_assistant_includes :theme => 'activescaffold' %>
|
|
20
|
+
|
|
21
|
+
Submissions of other themes are welcome.
|
|
22
|
+
|
|
23
|
+
### Configuring the core builder object
|
|
24
|
+
|
|
25
|
+
<a name="builder_actions"></a>
|
|
26
|
+
#### actions
|
|
27
|
+
|
|
28
|
+
admin\_assistant uses the old-fashioned seven Rails actions: index, show, new/create, edit/update, and destroy. By default, you get all of them except destroy. To add destroy, you can simply append it to the `actions` method:
|
|
29
|
+
|
|
30
|
+
admin_assistant_for User do |aa|
|
|
31
|
+
aa.actions << :destroy
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
You can also send `actions` a list of actions and it will only allow those:
|
|
35
|
+
|
|
36
|
+
# I only want to create or index images, not edit, show or destroy
|
|
37
|
+
admin_assistant_for Image do |aa|
|
|
38
|
+
aa.actions :create, :index
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
### model\_class\_name
|
|
42
|
+
|
|
43
|
+
Use this to override what the model is named in the interface, in links like "New blog post" or "50 blog posts found". The string passed in should be lowercase.
|
|
44
|
+
|
|
45
|
+
aa.model_class_name = 'post'
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
### Column config options
|
|
49
|
+
|
|
50
|
+
#### boolean\_labels
|
|
51
|
+
|
|
52
|
+
aa[:textile].boolean_labels = %w(Yes No)
|
|
53
|
+
|
|
54
|
+
For a boolean fields, will change how the values get displayed, instead of simply "true" and "false".
|
|
55
|
+
|
|
56
|
+
#### label
|
|
57
|
+
|
|
58
|
+
aa[:user].label = 'Author'
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
Overrides the default label for that column in index, search, and form views.
|
|
62
|
+
|
|
63
|
+
#### polymorphic\_types
|
|
64
|
+
|
|
65
|
+
aa[:bookmarkable].polymorphic_types = [BlogPost, Comment, Product, User]
|
|
66
|
+
|
|
67
|
+
If a column is a polymorphic association, admin\_assistant will offer specific widgets for searching and editing this column. With `polymorphic_types` you can tell it what possible types the association can be set to.
|
|
68
|
+
|
|
69
|
+
#### strftime\_format
|
|
70
|
+
|
|
71
|
+
aa[:published_at].strftime_format = "%b %d, %Y %H:%M:%S"
|
|
72
|
+
|
|
73
|
+
If the column is a date or time, this will use the given strftime format for displaying the column in index and shows views.
|
|
74
|
+
|
|
75
|
+
### Helper methods
|
|
76
|
+
|
|
77
|
+
#### \[column\]\_value
|
|
78
|
+
|
|
79
|
+
Determines what value is passed to form inputs, index views, etc, for the individual column. This is most useful for a virtual column.
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
### Model methods
|
|
84
|
+
|
|
85
|
+
#### name\_for\_admin\_assistant
|
|
86
|
+
|
|
87
|
+
When dealing with associations, admin\_assistant needs a convenient way to display a given record. By default, it will look for a method with the name `name`, `title`, `login`, or `username`. If you'd like to provide custom functionality across all admin\_assistant controllers, define the method `name_for_admin_assistant` on the model.
|
|
88
|
+
|
|
89
|
+
For example, let's say you have a ProductCategory class with a field `category_name`. With the code below, any time a product category is referred to through an association, admin\_assistant will display the `category_name`, in index views, form selects, etc.
|
|
90
|
+
|
|
91
|
+
class ProductCategory < ActiveRecord::Base
|
|
92
|
+
def name_for_admin_assistant
|
|
93
|
+
self.category_name
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
#### sort\_value\_for\_admin\_assistant
|
|
98
|
+
|
|
99
|
+
When showing associated records, admin\_assistant will sort by the method `sort_value_for_admin_assistant` if it's defined on the model. This comes in handy if you want to specify sorting on form drop-downs for belongs-to associations.
|
|
100
|
+
|
|
101
|
+
class Appointment < ActiveRecord::Base
|
|
102
|
+
def sort_value_for_admin_assistant
|
|
103
|
+
self.time
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
---
|
|
2
|
+
layout: api
|
|
3
|
+
title: Destroy
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Note that the `destroy` action is turned off by default. To turn it on, use the core [actions](./core.html#builder_actions) method.
|
|
7
|
+
|
|
8
|
+
By default, `destroy` simply retrieves the model instance, and calls `ActiveRecord::Base#destroy`. If you'd like to define your own custom deletion semantics, you can set a block that will be called instead of the model's built-in `destroy` method:
|
|
9
|
+
|
|
10
|
+
admin_assistant_for Product do |a|
|
|
11
|
+
a.actions << :destroy
|
|
12
|
+
a.destroy do |product|
|
|
13
|
+
product.update_attribute :deleted, true
|
|
14
|
+
product.notify_admins_of_deletion
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
You may also find plugins such as [as\_paranoid] or [acts\_as\_paranoid] useful here. If you're using a plugin such as that, which changes the behavior of `ActiveRecord::Base#destroy`, it means that you will probably not need to customize admin\_assistant in this way.
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
[acts_as_paranoid]: http://ar-paranoid.rubyforge.org/
|
|
24
|
+
[as_paranoid]: http://github.com/semanticart/is_paranoid/tree/master
|
|
25
|
+
|