easy_form_for 0.0.1.alpha

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.
@@ -0,0 +1,5 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
5
+ .DS_Store
data/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in easy_form_for.gemspec
4
+ gemspec
5
+ gem 'rspec-rails'
6
+ gem 'rails'
7
+ gem 'sqlite3'
data/README ADDED
@@ -0,0 +1,58 @@
1
+ TODO:
2
+ - Create real README
3
+ - Create Docs
4
+ - Refactor
5
+ - Refactor
6
+ - Refactor
7
+ - yield block in multiple places from block (possible?)
8
+ - put tests in this project (right now they are at https://github.com/bookis/easy_form_for_specs)
9
+
10
+ Working on a rails form generator. As easy as:
11
+
12
+ <%= easy_form_for(@user) %>
13
+
14
+ or as advanced as:
15
+
16
+ <%= easy_form_for(@user,
17
+ :only => [:name, (:username if @user.username.blank?), :email, :birthday, :city, :state_id, :zipcode, :country_id, :bio, :diet_id, :me_gender, :you_gender],
18
+ :field_options => {
19
+ :email => {:type => "email", :autocapitalize => "off"},
20
+ :submit => {:disable_with => "Saving&hellip;".html_safe, :class => "button white full"},
21
+ :birthday => {
22
+ :order => [:month, :day, :year],
23
+ :start_year => 12.years.ago.year,
24
+ :end_year => 60.years.ago.year,
25
+ :include_blank => true},
26
+ :me_gender => {:label => "My Gender"},
27
+ :you_gender => {:label => "Desired Gender"}
28
+ }) do |f| %>
29
+
30
+ <%= f.label :label_id, "My Straightedginess" %>
31
+ <table id="my-label">
32
+ <% Label.all.each do |label| %>
33
+ <tr>
34
+ <td><%= f.radio_button :label_id, label.id, :checked => @user.label == label %></td>
35
+ <th><%= f.label "label_id_#{label.id}", label.name.titleize %></th>
36
+ </tr>
37
+ <% end %>
38
+ </table>
39
+
40
+ <%= f.label :your_labels_attributes, "Desired Straightedginess" %>
41
+ <table id="desired-labels">
42
+ <% Label.all.each_with_index do |label, index| %>
43
+ <%= f.fields_for "your_labels_attributes[#{index}]", :child_index => index do |ff| %>
44
+ <tr>
45
+ <% if @user.desired_labels.include? label %>
46
+ <%# HACK remove find from view, do it in the controller %>
47
+ <%= ff.hidden_field :id, :value => @user.your_labels.where(:label_id => label.id).first.id, :style => "display:none" %>
48
+ <td><%= ff.check_box :_destroy, { :checked => true }, 0, 1 %></td>
49
+ <th><%= ff.label :_destroy, label.name.titleize %></th>
50
+ <% else %>
51
+ <td><%= ff.check_box :label_id, {}, label.id %></td>
52
+ <th><%= ff.label :label_id, label.name.titleize %></th>
53
+ <% end %>
54
+ </th>
55
+ <% end %>
56
+ <% end %>
57
+ </table>
58
+ <% end %>
@@ -0,0 +1,5 @@
1
+ require "bundler/gem_tasks"
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+ task default: :spec
@@ -0,0 +1,22 @@
1
+ # SQLite version 3.x
2
+ # gem install sqlite3
3
+ development:
4
+ adapter: sqlite3
5
+ database: db/development.sqlite3
6
+ pool: 5
7
+ timeout: 5000
8
+
9
+ # Warning: The database defined as "test" will be erased and
10
+ # re-generated from your development database when you run "rake".
11
+ # Do not set this db to the same as development or production.
12
+ test:
13
+ adapter: sqlite3
14
+ database: db/test.sqlite3
15
+ pool: 5
16
+ timeout: 5000
17
+
18
+ production:
19
+ adapter: sqlite3
20
+ database: db/production.sqlite3
21
+ pool: 5
22
+ timeout: 5000
@@ -0,0 +1,23 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "easy_form_for/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "easy_form_for"
7
+ s.version = EasyFormFor::VERSION
8
+ s.authors = ["Bookis Smuin"]
9
+ s.email = ["vegan.bookis@gmail.com"]
10
+ s.homepage = "https://github.com/bookis/Easy-Form-For"
11
+ s.summary = %q{Easy Rails form generation}
12
+ s.description = %q{Just use easy_form_for(MyModel) to generate a form for an object}
13
+
14
+ s.rubyforge_project = "easy_form_for"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+
21
+ s.add_development_dependency "rspec"
22
+ s.add_development_dependency "supermodel"
23
+ end
@@ -0,0 +1,3 @@
1
+ require "easy_form_for/version"
2
+ require 'easy_form_for/view_helpers'
3
+ require 'easy_form_for/railtie' if defined? Rails
@@ -0,0 +1,8 @@
1
+ require 'easy_form_for/view_helpers'
2
+ module EasyFormFor
3
+ class Railtie < Rails::Railtie
4
+ initializer "easy_form_for.view_helpers" do
5
+ ActionView::Base.send :include, ViewHelpers
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,3 @@
1
+ module EasyFormFor
2
+ VERSION = "0.0.1.alpha"
3
+ end
@@ -0,0 +1,107 @@
1
+ module EasyFormFor
2
+ module ViewHelpers
3
+
4
+ attr_accessor :keys, :object
5
+ EXCLUDE_KEYS = %w(created_at updated_at id)
6
+
7
+ def easy_form_for(object, options={}, &block)
8
+ @object = object
9
+ @options = options
10
+ set_keys
11
+ generate_form(&block).html_safe
12
+ end
13
+
14
+ private
15
+
16
+ def generate_form(&block)
17
+ form_class = @options[:classes][:form] if @options[:classes]
18
+ form_options = {:html => {:class => form_class}} if form_class ||= {:html => {}}
19
+ form_options[:html].merge! @options[:field_options][:form] if @options[:field_options] && @options[:field_options][:form]
20
+ form_for(@object, form_options) do |f|
21
+ @keys.each_with_index do |key, i|
22
+ concat(yield f) if block_given? && @options[:yield_block] && @options[:yield_block][:before] && (@options[:yield_block][:before] == key.to_sym || (@options[:yield_block][:before] == :start && i == 0))
23
+ field_type(f, key)
24
+ concat(yield f) if block_given? && @options[:yield_block] && @options[:yield_block][:after] && (@options[:yield_block][:after] == key.to_sym || (@options[:yield_block][:after] == :end && i + 1 >= @keys.size))
25
+ end
26
+ concat(yield f) if block_given? && @options[:yield_block].blank?
27
+ submit_options = @options[:field_options][:submit] if @options[:field_options] && @options[:field_options][:submit]
28
+ concat f.submit(:submit, submit_options ||= {})
29
+ end
30
+ end
31
+
32
+ def field_type(f, key, args={})
33
+ if key.match /_id/
34
+ type = "select"
35
+ class_name = key.split(/_id/).first
36
+ attribute = @options[:associations][class_name.to_sym] ||= 'name' if @options[:associations] && @options[:associations][class_name.to_sym]
37
+ selects = options_for_select(Kernel.const_get(class_name.camelcase).order("#{attribute || 'name'} asc").map{|k| word = k.send(attribute || 'name'); [word.first.upcase == word.first ? word : word.titleize, k.id]})
38
+ args[:class] = @options[:classes][:fields] if @options[:classes] && @options[:classes][:fields]
39
+ if @options[:field_options] && @options[:field_options][key.to_sym]
40
+ if @options[:field_options][key.to_sym][:class]
41
+ args[:class] += " #{@options[:field_options][key.to_sym][:class]}"
42
+ @options[:field_options][key.to_sym].delete(:class)
43
+ end
44
+ args.merge!(@options[:field_options][key.to_sym])
45
+ end
46
+ concat f.label(key.to_sym, class_name.to_s.capitalize)
47
+ concat f.send(type, key.to_sym, selects, {}, args)
48
+ else
49
+ type = case object.class.columns_hash[key].type
50
+ when :string then 'text_field'
51
+ when :text then 'text_area'
52
+ when :date then 'date_select'
53
+ when :boolean then 'check_box'
54
+ when :integer then "text_field"
55
+ else
56
+ 'text_field'
57
+ end
58
+ args[:class] = @options[:classes][:fields] if @options[:classes] && @options[:classes][:fields]
59
+ if @options[:field_options] && @options[:field_options][key.to_sym]
60
+ if @options[:field_options][key.to_sym][:class]
61
+ args[:class] += " #{@options[:field_options][key.to_sym][:class]}"
62
+ @options[:field_options][key.to_sym].delete(:class)
63
+ end
64
+ args.merge!(@options[:field_options][key.to_sym])
65
+ end
66
+ if args[:hidden] == true
67
+ type = 'hidden_field'
68
+ args.delete(:hidden)
69
+ end
70
+ label_text = args[:label]
71
+ concat f.label(key.to_sym, label_text)
72
+ concat f.send(type, key.to_sym, args)
73
+ end
74
+
75
+ end
76
+
77
+ def set_keys
78
+ @keys = sort_by(@options.has_key?(:only) ? only_keys : except_keys)
79
+ end
80
+
81
+
82
+ def sort_by(keys)
83
+ return keys if @options[:sort_by].nil?
84
+ if @options[:sort_by].instance_of? Array
85
+ @options[:sort_by].reverse.each { |key| keys.unshift(keys.delete(key.to_s)) }
86
+ keys
87
+ else
88
+ case @options[:sort_by]
89
+ when :alphabetical then keys.sort
90
+ when :type then keys.sort_by { |key| @object.class.columns_hash[key].type.to_s }.reverse
91
+ else
92
+ keys.sort
93
+ end
94
+ end
95
+ end
96
+
97
+ def only_keys
98
+ [@options[:only]].flatten.compact.map { |key| key.to_s }
99
+ end
100
+
101
+ def except_keys
102
+ excluded_keys = (EXCLUDE_KEYS + [@options[:except]]).flatten.compact.map{|k| k.to_s}
103
+ attrs = @object.attributes.keys.delete_if { |key| excluded_keys.include? key.to_s }
104
+ end
105
+
106
+ end
107
+ end
@@ -0,0 +1,28 @@
1
+ require 'spec_helper'
2
+
3
+ class Country < SuperModel::Base
4
+ attributes :name, :abbreviation
5
+ end
6
+ class Blog < SuperModel::Base
7
+ attributes :name, :tagline, :theme, :body, :country_id, :published, :published_at
8
+ end
9
+
10
+ describe EasyFormFor do
11
+
12
+ before(:each) do
13
+ Country.create(:name => "new zealand", :abbreviation => "NZ")
14
+ end
15
+
16
+ describe "except" do
17
+ before(:each) do
18
+ @result = EasyFormFor::ViewHelpers.new.easy_form_for(Blog.new(:name => "test"), :except => :tagline, :sort_by => [:theme]) do |f|
19
+ f.label :temp_field
20
+ f.text_field :temp_field
21
+ end
22
+ end
23
+
24
+ it "should have a name" do
25
+ @result.should include 'id="blog_name"'
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,22 @@
1
+ require 'easy_form_for'
2
+ require 'supermodel'
3
+ require 'active_model'
4
+ require 'action_controller'
5
+ require 'action_view'
6
+ require 'action_view/template'
7
+ include ActionView::Helpers
8
+
9
+ module EasyFormFor
10
+ class ViewHelpers
11
+
12
+ def blog_path(*args)
13
+ "/blogs"
14
+ end
15
+ def output_buffer=(*args)
16
+ ""
17
+ end
18
+ def output_buffer(*args)
19
+ ""
20
+ end
21
+ end
22
+ end
metadata ADDED
@@ -0,0 +1,88 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: easy_form_for
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: 6
5
+ version: 0.0.1.alpha
6
+ platform: ruby
7
+ authors:
8
+ - Bookis Smuin
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2011-12-31 00:00:00 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: rspec
17
+ prerelease: false
18
+ requirement: &id001 !ruby/object:Gem::Requirement
19
+ none: false
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "0"
24
+ type: :development
25
+ version_requirements: *id001
26
+ - !ruby/object:Gem::Dependency
27
+ name: supermodel
28
+ prerelease: false
29
+ requirement: &id002 !ruby/object:Gem::Requirement
30
+ none: false
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: "0"
35
+ type: :development
36
+ version_requirements: *id002
37
+ description: Just use easy_form_for(MyModel) to generate a form for an object
38
+ email:
39
+ - vegan.bookis@gmail.com
40
+ executables: []
41
+
42
+ extensions: []
43
+
44
+ extra_rdoc_files: []
45
+
46
+ files:
47
+ - .gitignore
48
+ - Gemfile
49
+ - README
50
+ - Rakefile
51
+ - config/database.yml
52
+ - easy_form_for.gemspec
53
+ - lib/easy_form_for.rb
54
+ - lib/easy_form_for/railtie.rb
55
+ - lib/easy_form_for/version.rb
56
+ - lib/easy_form_for/view_helpers.rb
57
+ - spec/easy_form_for_spec.rb
58
+ - spec/spec_helper.rb
59
+ homepage: https://github.com/bookis/Easy-Form-For
60
+ licenses: []
61
+
62
+ post_install_message:
63
+ rdoc_options: []
64
+
65
+ require_paths:
66
+ - lib
67
+ required_ruby_version: !ruby/object:Gem::Requirement
68
+ none: false
69
+ requirements:
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ version: "0"
73
+ required_rubygems_version: !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ">"
77
+ - !ruby/object:Gem::Version
78
+ version: 1.3.1
79
+ requirements: []
80
+
81
+ rubyforge_project: easy_form_for
82
+ rubygems_version: 1.8.11
83
+ signing_key:
84
+ specification_version: 3
85
+ summary: Easy Rails form generation
86
+ test_files:
87
+ - spec/easy_form_for_spec.rb
88
+ - spec/spec_helper.rb