├── .gitignore ├── History.txt ├── MIT-LICENSE ├── Manifest.txt ├── README.rdoc ├── Rakefile ├── config └── website.yml ├── generators └── haml_scaffold │ ├── haml_scaffold_generator.rb │ └── templates │ ├── _form.html.haml.erb │ ├── _object.html.haml.erb │ ├── controller.rb.erb │ ├── functional_test.rb.erb │ ├── helper.rb.erb │ ├── helper_test.rb.erb │ ├── layout.html.haml.erb │ ├── stylesheet.sass │ ├── view_edit.html.haml.erb │ ├── view_index.html.haml.erb │ ├── view_new.html.haml.erb │ └── view_show.html.haml.erb ├── haml_scaffold.gemspec ├── init.rb ├── lib └── haml_scaffold │ └── version.rb └── samples ├── posts_controller.rb ├── posts_controller_test.rb └── views ├── _form.html.haml ├── _post.html.haml ├── edit.html.haml ├── index.html.haml ├── new.html.haml └── show.html.haml /.gitignore: -------------------------------------------------------------------------------- 1 | doc 2 | *.log 3 | .DS_Store 4 | pkg 5 | -------------------------------------------------------------------------------- /History.txt: -------------------------------------------------------------------------------- 1 | === 1.1.0 / 2009-07-30 2 | 3 | * 3 major enhancements 4 | 5 | * Upated generator code to Rails 2.3.2. 6 | * Haml Scaffold now generates layout and a SASS stylesheet. 7 | * Tests now use 'test "name" do' syntax. 8 | 9 | === 1.0.0 / 2009-02-10 10 | 11 | * 1 major enhancement 12 | 13 | * First rubyforge release. 14 | 15 | -------------------------------------------------------------------------------- /MIT-LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2008 [name of plugin creator] 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining 4 | a copy of this software and associated documentation files (the 5 | "Software"), to deal in the Software without restriction, including 6 | without limitation the rights to use, copy, modify, merge, publish, 7 | distribute, sublicense, and/or sell copies of the Software, and to 8 | permit persons to whom the Software is furnished to do so, subject to 9 | the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be 12 | included in all copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 15 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 16 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 17 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 18 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 19 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 20 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /Manifest.txt: -------------------------------------------------------------------------------- 1 | History.txt 2 | MIT-LICENSE 3 | Manifest.txt 4 | README.rdoc 5 | Rakefile 6 | generators/haml_scaffold/haml_scaffold_generator.rb 7 | generators/haml_scaffold/templates/_form.html.haml.erb 8 | generators/haml_scaffold/templates/_object.html.haml.erb 9 | generators/haml_scaffold/templates/controller.rb.erb 10 | generators/haml_scaffold/templates/functional_test.rb.erb 11 | generators/haml_scaffold/templates/helper.rb.erb 12 | generators/haml_scaffold/templates/helper_test.rb.erb 13 | generators/haml_scaffold/templates/layout.html.haml.erb 14 | generators/haml_scaffold/templates/stylesheet.sass 15 | generators/haml_scaffold/templates/view_edit.html.haml.erb 16 | generators/haml_scaffold/templates/view_index.html.haml.erb 17 | generators/haml_scaffold/templates/view_new.html.haml.erb 18 | generators/haml_scaffold/templates/view_show.html.haml.erb 19 | init.rb 20 | lib/haml_scaffold/version.rb 21 | samples/posts_controller.rb 22 | samples/posts_controller_test.rb 23 | samples/views/_form.html.haml 24 | samples/views/_post.html.haml 25 | samples/views/edit.html.haml 26 | samples/views/index.html.haml 27 | samples/views/new.html.haml 28 | samples/views/show.html.haml 29 | -------------------------------------------------------------------------------- /README.rdoc: -------------------------------------------------------------------------------- 1 | = Haml Scaffold 2 | 3 | A collection of hacks to the Rails scaffold generator, to make it output 4 | templates using Haml rather than ERB. You may like some of it, and may hate 5 | other parts. You're free to use it under the terms of the MIT license if the 6 | parts you like outweigh the parts you hate. 7 | 8 | This scaffold generator does the same thing as the default Rails scaffold 9 | generator, with a few differences. 10 | 11 | == Differences from Rails Scaffolding: 12 | 13 | * Haml not ERB. 14 | 15 | === Controller 16 | 17 | * Loads object with a before_filter to be DRYer. 18 | * "Destroy" method handles error conditions. 19 | * Actions are alphabetized for more obvious consistency. 20 | * Uses will_paginate. 21 | 22 | === Controller Test 23 | 24 | * Tests error conditions, not just the "happy path." 25 | * Has 100% code coverage with RCov. 26 | * Uses very simple mocking with mocha to limit calls to the DB. 27 | 28 | === Views 29 | 30 | * Have cleaner, more semantic XHTML that's easier to quickly replace with your own markup. 31 | * Are broken up into a couple of partials to be DRYer. 32 | * Use will_paginate. 33 | 34 | === Misc 35 | 36 | * Generates Haml layout and SASS stylesheet. 37 | 38 | == Samples 39 | 40 | {View them here}[http://github.com/norman/haml-scaffold/tree/master/samples]. 41 | 42 | == Installation 43 | 44 | Haml Scaffold is available on RubyForge as a gem: 45 | 46 | sudo gem install haml_scaffold 47 | 48 | You can also install it as a Rails plugin if you wish: 49 | 50 | ./script/plugin install git://github.com/norman/haml-scaffold.git 51 | 52 | == Dependencies 53 | 54 | The generated code will depend on: 55 | 56 | * haml[http://haml.hamptoncatlin.com/] (of course!) 57 | * will_paginate[http://github.com/mislav/will_paginate/] 58 | * mocha[http://mocha.rubyforge.org/] 59 | 60 | You'll need to add the gem dependencies to your config/environment.rb 61 | manually: 62 | 63 | config.gem "haml" 64 | config.gem "will_paginate" 65 | config.gem "mocha" 66 | 67 | Also, don't forget to Hamlize your Rails app: 68 | 69 | $ cd my_rails_app 70 | $ haml --rails . 71 | 72 | == Other stuff you might be interested in: 73 | 74 | * Haml[http://haml.hamptoncatlin.com/] 75 | * {RSpec Haml scaffold generator}[http://github.com/dfischer/rspec-haml-scaffold-generator] 76 | 77 | == Author 78 | 79 | {Norman Clarke}[mailto:norman@njclarke.com] 80 | 81 | This work is derived from code in {Ruby on Rails}[http://rubyonrails.org/] and 82 | is released under its same license, the MIT License. -------------------------------------------------------------------------------- /Rakefile: -------------------------------------------------------------------------------- 1 | require 'newgem' 2 | require File.dirname(__FILE__) + "/lib/haml_scaffold/version" 3 | $hoe = Hoe.new("haml_scaffold", HamlScaffold::Version::STRING) do |p| 4 | p.rubyforge_name = "haml-scaffold" 5 | p.author = ['Norman Clarke'] 6 | p.email = ['norman@njclarke.com'] 7 | p.summary = "Rails scaffolding with Haml rather than ERB" 8 | p.description = "Rails scaffolding with Haml rather than ERB, and various other improvements." 9 | p.url = 'http://haml-scaffold.rubyforge.org/' 10 | p.extra_deps << ['haml', '>= 2.0.6'] 11 | p.extra_deps << ['will_paginate', '>= 2.2.2'] 12 | p.extra_deps << ['mocha', '>= 0.9.0'] 13 | p.extra_dev_deps << ['newgem', ">= #{::Newgem::VERSION}"] 14 | p.remote_rdoc_dir = "/" 15 | end 16 | require 'newgem/tasks' 17 | 18 | desc 'Publish RDoc to RubyForge.' 19 | task :publish_docs => [:clean, :docs] do 20 | host = "compay@rubyforge.org" 21 | remote_dir = "/var/www/gforge-projects/haml-scaffold" 22 | local_dir = 'doc' 23 | sh %{rsync -av --delete #{local_dir}/ #{host}:#{remote_dir}} 24 | end 25 | -------------------------------------------------------------------------------- /config/website.yml: -------------------------------------------------------------------------------- 1 | host: compay@rubyforge.org 2 | remote_dir: /var/www/gforge-projects/friendly-id 3 | -------------------------------------------------------------------------------- /generators/haml_scaffold/haml_scaffold_generator.rb: -------------------------------------------------------------------------------- 1 | class HamlScaffoldGenerator < Rails::Generator::NamedBase 2 | default_options :skip_timestamps => false, :skip_migration => false 3 | 4 | attr_reader :controller_name, 5 | :controller_class_path, 6 | :controller_file_path, 7 | :controller_class_nesting, 8 | :controller_class_nesting_depth, 9 | :controller_class_name, 10 | :controller_underscore_name, 11 | :controller_singular_name, 12 | :controller_plural_name, 13 | :application_name 14 | alias_method :controller_file_name, :controller_underscore_name 15 | alias_method :controller_table_name, :controller_plural_name 16 | 17 | def initialize(runtime_args, runtime_options = {}) 18 | super 19 | 20 | if @name == @name.pluralize && !options[:force_plural] 21 | logger.warning "Plural version of the model detected, using singularized version. Override with --force-plural." 22 | @name = @name.singularize 23 | end 24 | 25 | @controller_name = @name.pluralize 26 | @application_name = File.basename(Rails.root.to_s).humanize 27 | base_name, @controller_class_path, @controller_file_path, @controller_class_nesting, @controller_class_nesting_depth = extract_modules(@controller_name) 28 | @controller_class_name_without_nesting, @controller_underscore_name, @controller_plural_name = inflect_names(base_name) 29 | @controller_singular_name = base_name.singularize 30 | if @controller_class_nesting.empty? 31 | @controller_class_name = @controller_class_name_without_nesting 32 | else 33 | @controller_class_name = "#{@controller_class_nesting}::#{@controller_class_name_without_nesting}" 34 | end 35 | end 36 | 37 | def manifest 38 | record do |m| 39 | 40 | # Check for class naming collisions. 41 | m.class_collisions(controller_class_path, "#{controller_class_name}Controller", "#{controller_class_name}Helper") 42 | m.class_collisions(class_path, "#{class_name}") 43 | 44 | # Controller, helper, views, test and stylesheets directories. 45 | m.directory(File.join('app/models', class_path)) 46 | m.directory(File.join('app/controllers', controller_class_path)) 47 | m.directory(File.join('app/helpers', controller_class_path)) 48 | m.directory(File.join('app/views', controller_class_path, controller_file_name)) 49 | m.directory(File.join('test/functional', controller_class_path)) 50 | m.directory(File.join('test/unit', class_path)) 51 | m.directory(File.join('test/unit/helpers', class_path)) 52 | 53 | for action in scaffold_views 54 | m.template("view_#{action}.html.haml.erb", File.join('app/views', controller_class_path, controller_file_name, "#{action}.html.haml")) 55 | end 56 | 57 | m.template("_form.html.haml.erb", File.join('app/views', controller_class_path, controller_file_name, "_form.html.haml")) 58 | m.template("_object.html.haml.erb", File.join('app/views', controller_class_path, controller_file_name, "_#{name}.html.haml")) 59 | m.template('controller.rb.erb', File.join('app/controllers', controller_class_path, "#{controller_file_name}_controller.rb")) 60 | m.template('functional_test.rb.erb', File.join('test/functional', controller_class_path, "#{controller_file_name}_controller_test.rb")) 61 | m.template('helper.rb.erb', File.join('app/helpers', controller_class_path, "#{controller_file_name}_helper.rb")) 62 | m.template('helper_test.rb.erb', File.join('test/unit/helpers', controller_class_path, "#{controller_file_name}_helper_test.rb")) 63 | m.directory('app/views/layouts') 64 | m.directory('public/stylesheets/sass') 65 | m.template('layout.html.haml.erb', 'app/views/layouts/application.html.haml', :collision => :skip, :assigns => {:application_name => @application_name}) 66 | m.template('stylesheet.sass', 'public/stylesheets/sass/application.sass', :collision => :skip) 67 | m.route_resources controller_file_name 68 | m.dependency 'model', [name] + @args, :collision => :skip 69 | 70 | end 71 | 72 | end 73 | 74 | protected 75 | # Override with your own usage banner. 76 | def banner 77 | "Usage: #{$0} haml_scaffold ModelName [field:type, field:type]" 78 | end 79 | 80 | def add_options!(opt) 81 | opt.separator '' 82 | opt.separator 'Options:' 83 | opt.on("--skip-timestamps", 84 | "Don't add timestamps to the migration file for this model") { |v| options[:skip_timestamps] = v } 85 | opt.on("--skip-migration", 86 | "Don't generate a migration file for this model") { |v| options[:skip_migration] = v } 87 | opt.on("--force-plural", 88 | "Forces the generation of a plural ModelName") { |v| options[:force_plural] = v } 89 | end 90 | 91 | def scaffold_views 92 | %w[ index show new edit ] 93 | end 94 | 95 | def model_name 96 | class_name.demodulize 97 | end 98 | end 99 | -------------------------------------------------------------------------------- /generators/haml_scaffold/templates/_form.html.haml.erb: -------------------------------------------------------------------------------- 1 | - form_for(<%= singular_name %>) do |f| 2 | = f.error_messages 3 | <% for attribute in attributes -%> 4 | %p 5 | = f.label :<%= attribute.name %> 6 | %br 7 | = f.<%= attribute.field_type %> :<%= attribute.name %> 8 | <% end -%> 9 | %p 10 | = f.submit "Submit" -------------------------------------------------------------------------------- /generators/haml_scaffold/templates/_object.html.haml.erb: -------------------------------------------------------------------------------- 1 | - content_tag_for :div, <%= singular_name %> do 2 | %ul 3 | <% for attribute in attributes -%> 4 | %li 5 | %strong <%= attribute.column.human_name %>: 6 | =h <%= singular_name %>.<%= attribute.name %> 7 | <% end -%> 8 | = link_to 'Show', <%= singular_name %> 9 | = link_to 'Edit', edit_<%= singular_name %>_path(<%= singular_name %>) 10 | = link_to 'Destroy', <%= singular_name %>, :confirm => 'Are you sure?', :method => :delete -------------------------------------------------------------------------------- /generators/haml_scaffold/templates/controller.rb.erb: -------------------------------------------------------------------------------- 1 | class <%= controller_class_name %>Controller < ApplicationController 2 | 3 | before_filter :find_<%= file_name %> 4 | 5 | <%= file_name.pluralize.upcase %>_PER_PAGE = 20 6 | 7 | def create 8 | @<%= file_name %> = <%= class_name %>.new(params[:<%= file_name %>]) 9 | respond_to do |format| 10 | if @<%= file_name %>.save 11 | flash[:notice] = '<%= class_name %> was successfully created.' 12 | format.html { redirect_to @<%= file_name %> } 13 | format.xml { render :xml => @<%= file_name %>, :status => :created, :location => @<%= file_name %> } 14 | else 15 | format.html { render :action => "new" } 16 | format.xml { render :xml => @<%= file_name %>.errors, :status => :unprocessable_entity } 17 | end 18 | end 19 | end 20 | 21 | def destroy 22 | respond_to do |format| 23 | if @<%= file_name %>.destroy 24 | flash[:notice] = '<%= class_name %> was successfully destroyed.' 25 | format.html { redirect_to <%= file_name.pluralize %>_path } 26 | format.xml { head :ok } 27 | else 28 | flash[:error] = '<%= class_name %> could not be destroyed.' 29 | format.html { redirect_to @<%= file_name %> } 30 | format.xml { head :unprocessable_entity } 31 | end 32 | end 33 | end 34 | 35 | def index 36 | @<%= table_name %> = <%= class_name %>.paginate(:page => params[:page], :per_page => <%= file_name.pluralize.upcase %>_PER_PAGE) 37 | respond_to do |format| 38 | format.html 39 | format.xml { render :xml => @<%= table_name %> } 40 | end 41 | end 42 | 43 | def edit 44 | end 45 | 46 | def new 47 | @<%= file_name %> = <%= class_name %>.new 48 | respond_to do |format| 49 | format.html 50 | format.xml { render :xml => @<%= file_name %> } 51 | end 52 | end 53 | 54 | def show 55 | respond_to do |format| 56 | format.html 57 | format.xml { render :xml => @<%= file_name %> } 58 | end 59 | end 60 | 61 | def update 62 | respond_to do |format| 63 | if @<%= file_name %>.update_attributes(params[:<%= file_name %>]) 64 | flash[:notice] = '<%= class_name %> was successfully updated.' 65 | format.html { redirect_to @<%= file_name %> } 66 | format.xml { head :ok } 67 | else 68 | format.html { render :action => "edit" } 69 | format.xml { render :xml => @<%= file_name %>.errors, :status => :unprocessable_entity } 70 | end 71 | end 72 | end 73 | 74 | private 75 | 76 | def find_<%= file_name %> 77 | @<%= file_name %> = <%= class_name %>.find(params[:id]) if params[:id] 78 | end 79 | 80 | end -------------------------------------------------------------------------------- /generators/haml_scaffold/templates/functional_test.rb.erb: -------------------------------------------------------------------------------- 1 | require 'test_helper' 2 | 3 | class <%= controller_class_name %>ControllerTest < ActionController::TestCase 4 | 5 | test "should create <%= singular_name %>" do 6 | <%= class_name %>.any_instance.expects(:save).returns(true) 7 | post :create, :<%= file_name %> => { } 8 | assert_response :redirect 9 | end 10 | 11 | test "should handle failure to create <%= singular_name %>" do 12 | <%= class_name %>.any_instance.expects(:save).returns(false) 13 | post :create, :<%= file_name %> => { } 14 | assert_template "new" 15 | end 16 | 17 | test "should destroy <%= singular_name %>" do 18 | <%= class_name %>.any_instance.expects(:destroy).returns(true) 19 | delete :destroy, :id => <%= table_name %>(:one).to_param 20 | assert_not_nil flash[:notice] 21 | assert_response :redirect 22 | end 23 | 24 | test "should handle failure to destroy <%= singular_name %>" do 25 | <%= class_name %>.any_instance.expects(:destroy).returns(false) 26 | delete :destroy, :id => <%= table_name %>(:one).to_param 27 | assert_not_nil flash[:error] 28 | assert_response :redirect 29 | end 30 | 31 | test "should get edit for <%= singular_name %>" do 32 | get :edit, :id => <%= table_name %>(:one).to_param 33 | assert_response :success 34 | end 35 | 36 | test "should get index for <%= plural_name %>" do 37 | get :index 38 | assert_response :success 39 | assert_not_nil assigns(:<%= table_name %>) 40 | end 41 | 42 | test "should get new for <%= singular_name %>" do 43 | get :new 44 | assert_response :success 45 | end 46 | 47 | test "should get show for <%= singular_name %>" do 48 | get :show, :id => <%= table_name %>(:one).to_param 49 | assert_response :success 50 | end 51 | 52 | test "should update <%= singular_name %>" do 53 | <%= class_name %>.any_instance.expects(:save).returns(true) 54 | put :update, :id => <%= table_name %>(:one).to_param, :<%= file_name %> => { } 55 | assert_response :redirect 56 | end 57 | 58 | test "should handle failure to update <%= singular_name %>" do 59 | <%= class_name %>.any_instance.expects(:save).returns(false) 60 | put :update, :id => <%= table_name %>(:one).to_param, :<%= file_name %> => { } 61 | assert_template "edit" 62 | end 63 | 64 | end -------------------------------------------------------------------------------- /generators/haml_scaffold/templates/helper.rb.erb: -------------------------------------------------------------------------------- 1 | module <%= controller_class_name %>Helper 2 | end 3 | -------------------------------------------------------------------------------- /generators/haml_scaffold/templates/helper_test.rb.erb: -------------------------------------------------------------------------------- 1 | require 'test_helper' 2 | 3 | class <%= controller_class_name %>HelperTest < ActionView::TestCase 4 | end 5 | -------------------------------------------------------------------------------- /generators/haml_scaffold/templates/layout.html.haml.erb: -------------------------------------------------------------------------------- 1 | !!! XML 2 | !!! 3 | %html{ :'xml:lang' => "en", :lang => "en" } 4 | %head 5 | %title= "#{controller.class.to_s}: #{controller.action_name}" 6 | %meta{ :"http-equiv" => "Content-Type", :content => "text/html; charset=utf-8" } 7 | %link{ :rel => "shortcut icon", :href => "/favicon.ico" } 8 | = stylesheet_link_tag "application", :media => "screen" 9 | = javascript_include_tag :defaults 10 | %body 11 | #wrapper 12 | #content 13 | %h1 <%= application_name %> 14 | #flash 15 | - unless flash.empty? 16 | = content_tag :div, flash[:notice], :class => "notice" if flash[:notice] 17 | = content_tag :div, flash[:warning], :class => "warning" if flash[:warning] 18 | = content_tag :div, flash[:error], :class => "error" if flash[:error] 19 | :javascript 20 | #{visual_effect :highlight, "flash"} 21 | = yield 22 | -------------------------------------------------------------------------------- /generators/haml_scaffold/templates/stylesheet.sass: -------------------------------------------------------------------------------- 1 | body 2 | :text-align center 3 | 4 | h1 5 | :border-bottom 1px #000 solid 6 | :padding-bottom 5px 7 | 8 | #wrapper 9 | :width 800px 10 | :text-align left 11 | :margin auto -------------------------------------------------------------------------------- /generators/haml_scaffold/templates/view_edit.html.haml.erb: -------------------------------------------------------------------------------- 1 | %h2 Editing <%= singular_name %> 2 | = render :partial => "form", :locals => {:<%= singular_name %> => @<%= singular_name %>} 3 | %ul 4 | %li= link_to 'Show', @<%= singular_name %> 5 | %li= link_to 'Back', <%= plural_name %>_path 6 | %li= link_to 'Destroy', @<%= singular_name %>, :confirm => 'Are you sure?', :method => :delete -------------------------------------------------------------------------------- /generators/haml_scaffold/templates/view_index.html.haml.erb: -------------------------------------------------------------------------------- 1 | %h2 Listing <%= plural_name %> 2 | - if !@<%= plural_name %>.empty? 3 | .<%= plural_name %> 4 | = render :partial => "<%= singular_name %>", :collection => @<%= plural_name %> 5 | = will_paginate(@<%= plural_name %>) 6 | - else 7 | %p There are no <%= plural_name %> to show yet. 8 | = link_to 'New <%= singular_name %>', new_<%= singular_name %>_path -------------------------------------------------------------------------------- /generators/haml_scaffold/templates/view_new.html.haml.erb: -------------------------------------------------------------------------------- 1 | %h2 New <%= singular_name %> 2 | = render :partial => "form", :locals => {:<%= singular_name %> => @<%= singular_name %>} 3 | %ul 4 | %li= link_to 'Back', <%= plural_name %>_path -------------------------------------------------------------------------------- /generators/haml_scaffold/templates/view_show.html.haml.erb: -------------------------------------------------------------------------------- 1 | %h2= "<%= class_name %> \"#{@<%= singular_name %>.to_param}\"" 2 | - content_tag_for :div, @<%= singular_name %> do 3 | %ul 4 | <% for attribute in attributes -%> 5 | %li 6 | %strong <%= attribute.column.human_name %>: 7 | =h @<%= singular_name %>.<%= attribute.name %> 8 | <% end -%> 9 | %ul 10 | %li= link_to 'Edit', edit_<%= singular_name %>_path(@<%= singular_name %>) 11 | %li= link_to 'Back', <%= plural_name %>_path -------------------------------------------------------------------------------- /haml_scaffold.gemspec: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | 3 | Gem::Specification.new do |s| 4 | s.name = %q{haml_scaffold} 5 | s.version = "1.1.0" 6 | 7 | s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version= 8 | s.authors = ["Norman Clarke"] 9 | s.date = %q{2009-07-01} 10 | s.description = %q{Rails scaffolding with Haml rather than ERB, and various other improvements.} 11 | s.email = ["norman@njclarke.com"] 12 | s.extra_rdoc_files = ["History.txt", "Manifest.txt", "README.rdoc"] 13 | s.files = ["History.txt", "MIT-LICENSE", "Manifest.txt", "README.rdoc", "Rakefile", "generators/haml_scaffold/haml_scaffold_generator.rb", "generators/haml_scaffold/templates/_form.html.haml.erb", "generators/haml_scaffold/templates/_object.html.haml.erb", "generators/haml_scaffold/templates/controller.rb.erb", "generators/haml_scaffold/templates/functional_test.rb.erb", "generators/haml_scaffold/templates/helper.rb.erb", "generators/haml_scaffold/templates/helper_test.rb.erb", "generators/haml_scaffold/templates/layout.html.haml.erb", "generators/haml_scaffold/templates/stylesheet.sass", "generators/haml_scaffold/templates/view_edit.html.haml.erb", "generators/haml_scaffold/templates/view_index.html.haml.erb", "generators/haml_scaffold/templates/view_new.html.haml.erb", "generators/haml_scaffold/templates/view_show.html.haml.erb", "init.rb", "lib/haml_scaffold/version.rb", "samples/posts_controller.rb", "samples/posts_controller_test.rb", "samples/views/_form.html.haml", "samples/views/_post.html.haml", "samples/views/edit.html.haml", "samples/views/index.html.haml", "samples/views/new.html.haml", "samples/views/show.html.haml"] 14 | s.homepage = %q{http://haml-scaffold.rubyforge.org/} 15 | s.rdoc_options = ["--main", "README.rdoc"] 16 | s.require_paths = ["lib"] 17 | s.rubyforge_project = %q{haml-scaffold} 18 | s.rubygems_version = %q{1.3.4} 19 | s.summary = %q{Rails scaffolding with Haml rather than ERB} 20 | 21 | if s.respond_to? :specification_version then 22 | current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION 23 | s.specification_version = 3 24 | 25 | if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then 26 | s.add_runtime_dependency(%q, [">= 2.0.6"]) 27 | s.add_runtime_dependency(%q, [">= 2.2.2"]) 28 | s.add_runtime_dependency(%q, [">= 0.9.0"]) 29 | s.add_development_dependency(%q, [">= 1.4.1"]) 30 | s.add_development_dependency(%q, [">= 1.8.0"]) 31 | else 32 | s.add_dependency(%q, [">= 2.0.6"]) 33 | s.add_dependency(%q, [">= 2.2.2"]) 34 | s.add_dependency(%q, [">= 0.9.0"]) 35 | s.add_dependency(%q, [">= 1.4.1"]) 36 | s.add_dependency(%q, [">= 1.8.0"]) 37 | end 38 | else 39 | s.add_dependency(%q, [">= 2.0.6"]) 40 | s.add_dependency(%q, [">= 2.2.2"]) 41 | s.add_dependency(%q, [">= 0.9.0"]) 42 | s.add_dependency(%q, [">= 1.4.1"]) 43 | s.add_dependency(%q, [">= 1.8.0"]) 44 | end 45 | end 46 | -------------------------------------------------------------------------------- /init.rb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/norman/haml-scaffold/4e5d9107758680795478532180746b8b9fb4736a/init.rb -------------------------------------------------------------------------------- /lib/haml_scaffold/version.rb: -------------------------------------------------------------------------------- 1 | module HamlScaffold 2 | class Version 3 | MAJOR = 1 4 | MINOR = 1 5 | TINY = 0 6 | STRING = "#{MAJOR}.#{MINOR}.#{TINY}" 7 | end 8 | end -------------------------------------------------------------------------------- /samples/posts_controller.rb: -------------------------------------------------------------------------------- 1 | class PostsController < ApplicationController 2 | 3 | before_filter :find_post 4 | 5 | POSTS_PER_PAGE = 20 6 | 7 | def create 8 | @post = Post.new(params[:post]) 9 | respond_to do |format| 10 | if @post.save 11 | flash[:notice] = 'Post was successfully created.' 12 | format.html { redirect_to @post } 13 | format.xml { render :xml => @post, :status => :created, :location => @post } 14 | else 15 | format.html { render :action => "new" } 16 | format.xml { render :xml => @post.errors, :status => :unprocessable_entity } 17 | end 18 | end 19 | end 20 | 21 | def destroy 22 | respond_to do |format| 23 | if @post.destroy 24 | flash[:notice] = 'Post was successfully destroyed.' 25 | format.html { redirect_to posts_path } 26 | format.xml { head :ok } 27 | else 28 | flash[:error] = 'Post could not be destroyed.' 29 | format.html { redirect_to @post } 30 | format.xml { head :unprocessable_entity } 31 | end 32 | end 33 | end 34 | 35 | def index 36 | @posts = Post.paginate(:page => params[:page], :per_page => POSTS_PER_PAGE) 37 | respond_to do |format| 38 | format.html 39 | format.xml { render :xml => @posts } 40 | end 41 | end 42 | 43 | def edit 44 | end 45 | 46 | def new 47 | @post = Post.new 48 | respond_to do |format| 49 | format.html 50 | format.xml { render :xml => @post } 51 | end 52 | end 53 | 54 | def show 55 | respond_to do |format| 56 | format.html 57 | format.xml { render :xml => @post } 58 | end 59 | end 60 | 61 | def update 62 | respond_to do |format| 63 | if @post.update_attributes(params[:post]) 64 | flash[:notice] = 'Post was successfully updated.' 65 | format.html { redirect_to @post } 66 | format.xml { head :ok } 67 | else 68 | format.html { render :action => "edit" } 69 | format.xml { render :xml => @post.errors, :status => :unprocessable_entity } 70 | end 71 | end 72 | end 73 | 74 | private 75 | 76 | def find_post 77 | @post = Post.find(params[:id]) if params[:id] 78 | end 79 | 80 | end -------------------------------------------------------------------------------- /samples/posts_controller_test.rb: -------------------------------------------------------------------------------- 1 | require 'test_helper' 2 | 3 | class PostsControllerTest < ActionController::TestCase 4 | 5 | test "should create post" do 6 | Post.any_instance.expects(:save).returns(true) 7 | post :create, :post => { } 8 | assert_response :redirect 9 | end 10 | 11 | test "should handle failure to create post" do 12 | Post.any_instance.expects(:save).returns(false) 13 | post :create, :post => { } 14 | assert_template "new" 15 | end 16 | 17 | test "should destroy post" do 18 | Post.any_instance.expects(:destroy).returns(true) 19 | delete :destroy, :id => posts(:one).to_param 20 | assert_not_nil flash[:notice] 21 | assert_response :redirect 22 | end 23 | 24 | test "should handle failure to destroy post" do 25 | Post.any_instance.expects(:destroy).returns(false) 26 | delete :destroy, :id => posts(:one).to_param 27 | assert_not_nil flash[:error] 28 | assert_response :redirect 29 | end 30 | 31 | test "should get edit for post" do 32 | get :edit, :id => posts(:one).to_param 33 | assert_response :success 34 | end 35 | 36 | test "should get index for posts" do 37 | get :index 38 | assert_response :success 39 | assert_not_nil assigns(:posts) 40 | end 41 | 42 | test "should get new for post" do 43 | get :new 44 | assert_response :success 45 | end 46 | 47 | test "should get show for post" do 48 | get :show, :id => posts(:one).to_param 49 | assert_response :success 50 | end 51 | 52 | test "should update post" do 53 | Post.any_instance.expects(:save).returns(true) 54 | put :update, :id => posts(:one).to_param, :post => { } 55 | assert_response :redirect 56 | end 57 | 58 | test "should handle failure to update post" do 59 | Post.any_instance.expects(:save).returns(false) 60 | put :update, :id => posts(:one).to_param, :post => { } 61 | assert_template "edit" 62 | end 63 | 64 | end -------------------------------------------------------------------------------- /samples/views/_form.html.haml: -------------------------------------------------------------------------------- 1 | - form_for(post) do |f| 2 | = f.error_messages 3 | %p 4 | = f.label :title 5 | %br 6 | = f.text_field :title 7 | %p 8 | = f.label :author 9 | %br 10 | = f.text_field :author 11 | %p 12 | = f.label :content 13 | %br 14 | = f.text_area :content 15 | %p 16 | = f.submit "Submit" -------------------------------------------------------------------------------- /samples/views/_post.html.haml: -------------------------------------------------------------------------------- 1 | - content_tag_for :div, post do 2 | %ul 3 | %li 4 | %strong Title: 5 | =h post.title 6 | %li 7 | %strong Author: 8 | =h post.author 9 | %li 10 | %strong Content: 11 | =h post.content 12 | = link_to 'Show', post 13 | = link_to 'Edit', edit_post_path(post) 14 | = link_to 'Destroy', post, :confirm => 'Are you sure?', :method => :delete -------------------------------------------------------------------------------- /samples/views/edit.html.haml: -------------------------------------------------------------------------------- 1 | %h2 Editing post 2 | = render :partial => "form", :locals => {:post => @post} 3 | %ul 4 | %li= link_to 'Show', @post 5 | %li= link_to 'Back', posts_path 6 | %li= link_to 'Destroy', @post, :confirm => 'Are you sure?', :method => :delete -------------------------------------------------------------------------------- /samples/views/index.html.haml: -------------------------------------------------------------------------------- 1 | %h2 Listing posts 2 | - if !@posts.empty? 3 | .posts 4 | = render :partial => "post", :collection => @posts 5 | = will_paginate(@posts) 6 | - else 7 | %p There are no posts to show yet. 8 | = link_to 'New post', new_post_path -------------------------------------------------------------------------------- /samples/views/new.html.haml: -------------------------------------------------------------------------------- 1 | %h2 New post 2 | = render :partial => "form", :locals => {:post => @post} 3 | %ul 4 | %li= link_to 'Back', posts_path -------------------------------------------------------------------------------- /samples/views/show.html.haml: -------------------------------------------------------------------------------- 1 | %h2= "Post \"#{@post.to_param}\"" 2 | - content_tag_for :div, @post do 3 | %ul 4 | %li 5 | %strong Title: 6 | =h @post.title 7 | %li 8 | %strong Author: 9 | =h @post.author 10 | %li 11 | %strong Content: 12 | =h @post.content 13 | %ul 14 | %li= link_to 'Edit', edit_post_path(@post) 15 | %li= link_to 'Back', posts_path --------------------------------------------------------------------------------