nakajima-semi-formal 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,14 @@
1
+ class Module
2
+ def delegate(*methods)
3
+ options = methods.pop
4
+ raise ArgumentError, "Delegation needs a target." unless options.is_a?(Hash) && to = options[:to]
5
+
6
+ methods.each do |method|
7
+ module_eval(<<-EOS, "(__DELEGATION__)", 1)
8
+ def #{method}(*args, &block)
9
+ #{to}.__send__(#{method.inspect}, *args, &block)
10
+ end
11
+ EOS
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,6 @@
1
+ class Object
2
+ def tap
3
+ yield self
4
+ self
5
+ end
6
+ end
@@ -0,0 +1,34 @@
1
+ module SemiFormal
2
+ class Builder
3
+ attr_reader :instance
4
+
5
+ def initialize(instance)
6
+ @instance = instance
7
+ end
8
+
9
+ def to_html
10
+ Nokogiri::HTML::Builder.new {
11
+ form(form_attributes) {
12
+ method_overrider(self)
13
+ inputs.each { |i| i.call(self) }
14
+ input(:type => "submit") { text "Save!" }
15
+ }
16
+ }.doc.to_html
17
+ end
18
+
19
+ def method_overrider(doc)
20
+ return if instance.new_record?
21
+ doc.input(:type => "hidden", :name => "_method", :value => "put")
22
+ end
23
+
24
+ def inputs
25
+ @inputs ||= @instance.class.content_columns.map do |column|
26
+ Input.new(@instance, column.name)
27
+ end
28
+ end
29
+
30
+ def form_attributes
31
+ @form_attributes ||= Form.new(self).attributes
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,28 @@
1
+ module SemiFormal
2
+ class Form
3
+ attr_reader :builder
4
+
5
+ delegate :instance, :to => :builder
6
+
7
+ def initialize(builder)
8
+ @builder = builder
9
+ end
10
+
11
+ def attributes
12
+ {
13
+ :method => method,
14
+ :action => action
15
+ }
16
+ end
17
+
18
+ def method
19
+ 'post'
20
+ end
21
+
22
+ def action
23
+ path = "/#{instance.class.model_name.plural}"
24
+ path += "/#{instance.to_param}" unless instance.new_record?
25
+ path
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,19 @@
1
+ module SemiFormal
2
+ class Input
3
+ attr_reader :instance, :name
4
+
5
+ def initialize(instance, name)
6
+ @instance, @name = instance, name
7
+ end
8
+
9
+ def call(builder)
10
+ builder.input(:name => attr_name, :type => "text", :value => instance.send(name))
11
+ end
12
+
13
+ private
14
+
15
+ def attr_name
16
+ instance.class.model_name.singular + "[#{name}]"
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,18 @@
1
+ $LOAD_PATH << File.dirname(__FILE__)
2
+
3
+ require 'rubygems'
4
+ require 'nokogiri'
5
+ require 'activerecord'
6
+
7
+ require 'core_ext/object'
8
+ require 'core_ext/module'
9
+
10
+ require 'semi_formal/form'
11
+ require 'semi_formal/input'
12
+ require 'semi_formal/builder'
13
+
14
+ module SemiFormal
15
+ def form_for(record)
16
+ Builder.new(record).to_html
17
+ end
18
+ end
metadata ADDED
@@ -0,0 +1,77 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: nakajima-semi-formal
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Pat Nakajima
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-01-22 00:00:00 -08:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: nokogiri
17
+ version_requirement:
18
+ version_requirements: !ruby/object:Gem::Requirement
19
+ requirements:
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: "0"
23
+ version:
24
+ - !ruby/object:Gem::Dependency
25
+ name: activerecord
26
+ version_requirement:
27
+ version_requirements: !ruby/object:Gem::Requirement
28
+ requirements:
29
+ - - ">="
30
+ - !ruby/object:Gem::Version
31
+ version: "0"
32
+ version:
33
+ description:
34
+ email: patnakajima@gmail.com
35
+ executables: []
36
+
37
+ extensions: []
38
+
39
+ extra_rdoc_files: []
40
+
41
+ files:
42
+ - lib/core_ext
43
+ - lib/core_ext/module.rb
44
+ - lib/core_ext/object.rb
45
+ - lib/semi_formal
46
+ - lib/semi_formal/builder.rb
47
+ - lib/semi_formal/form.rb
48
+ - lib/semi_formal/input.rb
49
+ - lib/semi_formal.rb
50
+ has_rdoc: false
51
+ homepage:
52
+ post_install_message:
53
+ rdoc_options: []
54
+
55
+ require_paths:
56
+ - lib
57
+ required_ruby_version: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: "0"
62
+ version:
63
+ required_rubygems_version: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: "0"
68
+ version:
69
+ requirements: []
70
+
71
+ rubyforge_project:
72
+ rubygems_version: 1.2.0
73
+ signing_key:
74
+ specification_version: 2
75
+ summary: Forms when you need 'em
76
+ test_files: []
77
+