dormouse 0.0.1.a1
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/CHANGELOG.md +10 -0
- data/LICENSE +19 -0
- data/README.md +3 -0
- data/app/views/dormouse/layouts/dormouse.html.erb +14 -0
- data/app/views/dormouse/views/form.html.erb +12 -0
- data/app/views/dormouse/views/list.html.erb +21 -0
- data/app/views/dormouse/widgets/_belongs_to.html.erb +6 -0
- data/app/views/dormouse/widgets/_boolean.html.erb +4 -0
- data/app/views/dormouse/widgets/_date.html.erb +4 -0
- data/app/views/dormouse/widgets/_datetime.html.erb +4 -0
- data/app/views/dormouse/widgets/_decimal.html.erb +4 -0
- data/app/views/dormouse/widgets/_float.html.erb +4 -0
- data/app/views/dormouse/widgets/_integer.html.erb +4 -0
- data/app/views/dormouse/widgets/_string.html.erb +4 -0
- data/app/views/dormouse/widgets/_text.html.erb +4 -0
- data/app/views/dormouse/widgets/_time.html.erb +4 -0
- data/app/views/dormouse/widgets/_timestamp.html.erb +4 -0
- data/lib/dormouse/action_controller.rb +71 -0
- data/lib/dormouse/active_record.rb +33 -0
- data/lib/dormouse/dsl.rb +104 -0
- data/lib/dormouse/manifest.rb +103 -0
- data/lib/dormouse/property.rb +27 -0
- data/lib/dormouse/version.rb +3 -0
- data/lib/dormouse/views/base.rb +24 -0
- data/lib/dormouse/views/form.rb +33 -0
- data/lib/dormouse/views/list.rb +14 -0
- data/lib/dormouse/views.rb +7 -0
- data/lib/dormouse/widgets/base.rb +39 -0
- data/lib/dormouse/widgets/belongs_to.rb +11 -0
- data/lib/dormouse/widgets/boolean.rb +3 -0
- data/lib/dormouse/widgets/date.rb +3 -0
- data/lib/dormouse/widgets/datetime.rb +3 -0
- data/lib/dormouse/widgets/decimal.rb +3 -0
- data/lib/dormouse/widgets/float.rb +3 -0
- data/lib/dormouse/widgets/integer.rb +3 -0
- data/lib/dormouse/widgets/simple.rb +10 -0
- data/lib/dormouse/widgets/string.rb +3 -0
- data/lib/dormouse/widgets/text.rb +3 -0
- data/lib/dormouse/widgets/time.rb +3 -0
- data/lib/dormouse/widgets/timestamp.rb +3 -0
- data/lib/dormouse/widgets.rb +28 -0
- data/lib/dormouse.rb +12 -0
- metadata +107 -0
data/CHANGELOG.md
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
Copyright (c) 2010 Simon Menke
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
of this software and associated documentation files (the "Software"), to deal
|
5
|
+
in the Software without restriction, including without limitation the rights
|
6
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
|
+
copies of the Software, and to permit persons to whom the Software is
|
8
|
+
furnished to do so, subject to the following conditions:
|
9
|
+
|
10
|
+
The above copyright notice and this permission notice shall be included in
|
11
|
+
all copies or substantial portions of the Software.
|
12
|
+
|
13
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
16
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
19
|
+
THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
<% form_for @object, :url => manifest.save_object_url(@object) do |f| %>
|
2
|
+
|
3
|
+
<%= f.error_messages %>
|
4
|
+
|
5
|
+
<% @widgets.each do |widget| %>
|
6
|
+
<% next if widget.hidden %>
|
7
|
+
<%= widget.render_in_view(self, @object, :form => f) %>
|
8
|
+
<% end %>
|
9
|
+
|
10
|
+
<%= f.submit %>
|
11
|
+
|
12
|
+
<% end %>
|
@@ -0,0 +1,21 @@
|
|
1
|
+
<div id="actions">
|
2
|
+
|
3
|
+
<div class="box">
|
4
|
+
<h3>Actions</h3>
|
5
|
+
<ul>
|
6
|
+
<li><a href="<%= manifest.collection_url %>/new">New item</a></li>
|
7
|
+
</ul>
|
8
|
+
</div>
|
9
|
+
|
10
|
+
</div>
|
11
|
+
|
12
|
+
<div id="list">
|
13
|
+
<% @collection.each do |object| %>
|
14
|
+
<% div_for object do %>
|
15
|
+
<%= link_to object.__send__(manifest.primary_name_column), manifest.object_url(object)+'/edit' %>
|
16
|
+
<% if manifest.secondary_name_column %>
|
17
|
+
<span><%= object.__send__(manifest.secondary_name_column) %></span>
|
18
|
+
<% end %>
|
19
|
+
<% end %>
|
20
|
+
<% end %>
|
21
|
+
</div>
|
@@ -0,0 +1,6 @@
|
|
1
|
+
<% div_for(object, property.name, :class => property.type) do %>
|
2
|
+
<%= form.label(property.name, property.label) if property.label %>
|
3
|
+
<%= form.collection_select("#{property.name}_id",
|
4
|
+
target.resource.all,
|
5
|
+
:id, target.primary_name_column, property.options) %>
|
6
|
+
<% end %>
|
@@ -0,0 +1,71 @@
|
|
1
|
+
module Dormouse::ActionController
|
2
|
+
|
3
|
+
def self.build(manifest, map)
|
4
|
+
build_routes(manifest, map)
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.build_controller(manifest)
|
8
|
+
controller = eval("class ::#{manifest.resource}::ResourcesController < ::#{manifest.controller_superclass} ; self ; end ")
|
9
|
+
controller.extend Meta
|
10
|
+
controller.send :include, Actions
|
11
|
+
controller.manifest = manifest
|
12
|
+
controller
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.build_routes(manifest, map)
|
16
|
+
name = manifest.resource.to_s.split('::').last.tableize
|
17
|
+
controller = manifest.controller_class.to_s.sub(/Controller$/, '')
|
18
|
+
map.resources name.to_sym, :controller => controller
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
module Dormouse::ActionController::Actions
|
24
|
+
|
25
|
+
def self.included(base)
|
26
|
+
base.class_eval do
|
27
|
+
helper_method :manifest
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def index
|
32
|
+
manifest.render_list(self)
|
33
|
+
end
|
34
|
+
|
35
|
+
def new
|
36
|
+
manifest.render_form(self)
|
37
|
+
end
|
38
|
+
|
39
|
+
def edit
|
40
|
+
manifest.render_form(self)
|
41
|
+
end
|
42
|
+
|
43
|
+
def create
|
44
|
+
attrs = params[manifest.resource.to_s.split('::').last.underscore]
|
45
|
+
manifest.resource.create! attrs
|
46
|
+
redirect_to manifest.collection_url
|
47
|
+
rescue ActiveRecord::RecordInvalid => e
|
48
|
+
manifest.render_form(self, e.record)
|
49
|
+
end
|
50
|
+
|
51
|
+
def update
|
52
|
+
attrs = params[manifest.resource.to_s.split('::').last.underscore]
|
53
|
+
manifest.resource.find(params[:id]).update_attributes! attrs
|
54
|
+
redirect_to manifest.collection_url
|
55
|
+
rescue ActiveRecord::RecordInvalid => e
|
56
|
+
manifest.render_form(self, e.record)
|
57
|
+
end
|
58
|
+
|
59
|
+
private
|
60
|
+
|
61
|
+
def manifest
|
62
|
+
self.class.manifest
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
module Dormouse::ActionController::Meta
|
68
|
+
|
69
|
+
attr_accessor :manifest
|
70
|
+
|
71
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Dormouse::ActiveRecord
|
2
|
+
|
3
|
+
def self.included(base)
|
4
|
+
base.extend Meta
|
5
|
+
end
|
6
|
+
|
7
|
+
def manifest
|
8
|
+
self.class.manifest
|
9
|
+
end
|
10
|
+
|
11
|
+
end
|
12
|
+
|
13
|
+
module Dormouse::ActiveRecord::Meta
|
14
|
+
|
15
|
+
def manifest(&block)
|
16
|
+
@manifest ||= Dormouse::Manifest.new(self)
|
17
|
+
Dormouse::DSL.new(@manifest).instance_eval(&block) if block
|
18
|
+
@manifest
|
19
|
+
end
|
20
|
+
|
21
|
+
def const_missing(name)
|
22
|
+
if name == 'ResourcesController'
|
23
|
+
Dormouse::ActionController.build_controller(manifest)
|
24
|
+
else
|
25
|
+
super
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
class ActiveRecord::Base
|
32
|
+
include Dormouse::ActiveRecord
|
33
|
+
end
|
data/lib/dormouse/dsl.rb
ADDED
@@ -0,0 +1,104 @@
|
|
1
|
+
# The DSL is used by the <tt>#manifest</tt> macro in ActiveRecord::Base to set
|
2
|
+
# options on properties.
|
3
|
+
#
|
4
|
+
# class Post < ActiveRecord::Base
|
5
|
+
# validates :title, :presence => true
|
6
|
+
#
|
7
|
+
# manifest do
|
8
|
+
# order :published_on, :before => :body
|
9
|
+
# set :body, :label => false
|
10
|
+
# hide :created_at, :updated_at
|
11
|
+
# primary_name :title
|
12
|
+
# end
|
13
|
+
# end
|
14
|
+
#
|
15
|
+
class Dormouse::DSL
|
16
|
+
|
17
|
+
def initialize(manifest)
|
18
|
+
@manifest = manifest
|
19
|
+
end
|
20
|
+
|
21
|
+
# set the view style for this model. (The default style is :dormouse)
|
22
|
+
def style(name)
|
23
|
+
@manifest.style = (name || 'dormouse')
|
24
|
+
end
|
25
|
+
|
26
|
+
# set the primary name for a model. The primary name is the name shown in lists, select boxes and grids as the link to the details.
|
27
|
+
def primary_name(property)
|
28
|
+
set(property, :primary => true)
|
29
|
+
end
|
30
|
+
|
31
|
+
# set the secondary name for a model. The secondary name is the name shown in lists and grids as the tag line.
|
32
|
+
def secondary_name(property)
|
33
|
+
set(property, :secondary => true)
|
34
|
+
end
|
35
|
+
|
36
|
+
# hide one or more properties in the form.
|
37
|
+
def hide(*properties)
|
38
|
+
properties.each do |property|
|
39
|
+
set(property, :hidden => true)
|
40
|
+
end
|
41
|
+
self
|
42
|
+
end
|
43
|
+
|
44
|
+
# show one or more properties in the form.
|
45
|
+
def show(*properties)
|
46
|
+
properties.each do |property|
|
47
|
+
set(property, :hidden => false)
|
48
|
+
end
|
49
|
+
self
|
50
|
+
end
|
51
|
+
|
52
|
+
# set a custom label for a property
|
53
|
+
def label(property, label=nil)
|
54
|
+
set(property, :label => label)
|
55
|
+
end
|
56
|
+
|
57
|
+
# reorder one or more properties in the form.
|
58
|
+
def order(*properties)
|
59
|
+
options = properties.extract_options!
|
60
|
+
if options[:after]
|
61
|
+
properties = properties.reverse
|
62
|
+
end
|
63
|
+
properties.each do |property|
|
64
|
+
set(property, options.dup)
|
65
|
+
end
|
66
|
+
self
|
67
|
+
end
|
68
|
+
|
69
|
+
def set(property, options={})
|
70
|
+
property = property.to_sym
|
71
|
+
|
72
|
+
order_options = options.slice(:after, :before, :top, :bottom)
|
73
|
+
options.except!(:after, :before, :top, :bottom)
|
74
|
+
case
|
75
|
+
when hook = order_options[:after]
|
76
|
+
idx = @manifest.order.index(hook.to_sym) || (@manifest.size - 1)
|
77
|
+
@manifest.order.delete(property)
|
78
|
+
@manifest.order.insert(idx + 1, property)
|
79
|
+
when hook = order_options[:before]
|
80
|
+
idx = @manifest.order.index(hook.to_sym) || (@manifest.size - 1)
|
81
|
+
@manifest.order.delete(property)
|
82
|
+
@manifest.order.insert(idx, property)
|
83
|
+
when order_options[:top]
|
84
|
+
@manifest.order.delete(property)
|
85
|
+
@manifest.order.insert(0, property)
|
86
|
+
when order_options[:bottom]
|
87
|
+
@manifest.order.delete(property)
|
88
|
+
@manifest.order.push(property)
|
89
|
+
end
|
90
|
+
|
91
|
+
if options.key?(:primary) and options.delete(:primary)
|
92
|
+
@manifest.primary_name_column = property
|
93
|
+
end
|
94
|
+
|
95
|
+
if options.key?(:secondary) and options.delete(:secondary)
|
96
|
+
@manifest.secondary_name_column = property
|
97
|
+
end
|
98
|
+
|
99
|
+
@manifest[property].populate(options)
|
100
|
+
|
101
|
+
self
|
102
|
+
end
|
103
|
+
|
104
|
+
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
class Dormouse::Manifest
|
2
|
+
|
3
|
+
include Enumerable
|
4
|
+
|
5
|
+
def initialize(resource)
|
6
|
+
@resource = resource
|
7
|
+
@properties = {}
|
8
|
+
@order = []
|
9
|
+
|
10
|
+
generate_default_properties
|
11
|
+
end
|
12
|
+
|
13
|
+
attr_reader :resource, :order
|
14
|
+
attr_accessor :primary_name_column, :secondary_name_column
|
15
|
+
attr_accessor :collection_url, :object_url
|
16
|
+
attr_accessor :style
|
17
|
+
|
18
|
+
def mount(map)
|
19
|
+
Dormouse::ActionController.build(self, map)
|
20
|
+
end
|
21
|
+
|
22
|
+
def render_list(controller, collection=nil)
|
23
|
+
@list_view ||= Dormouse::Views::List.new(self)
|
24
|
+
@list_view.render_in_controller(controller, collection)
|
25
|
+
end
|
26
|
+
|
27
|
+
def render_form(controller, object=nil)
|
28
|
+
@form_view ||= Dormouse::Views::Form.new(self)
|
29
|
+
@form_view.render_in_controller(controller, object)
|
30
|
+
end
|
31
|
+
|
32
|
+
def [](name)
|
33
|
+
@properties[name.to_sym]
|
34
|
+
end
|
35
|
+
|
36
|
+
def each
|
37
|
+
@order.each do |name|
|
38
|
+
yield @properties[name]
|
39
|
+
end
|
40
|
+
self
|
41
|
+
end
|
42
|
+
|
43
|
+
def controller_superclass
|
44
|
+
ApplicationController
|
45
|
+
end
|
46
|
+
|
47
|
+
def controller_class
|
48
|
+
@controller_class ||= "#{resource}::ResourcesController".constantize
|
49
|
+
end
|
50
|
+
|
51
|
+
def style
|
52
|
+
@style ||= 'dormouse'
|
53
|
+
end
|
54
|
+
|
55
|
+
def primary_name_column
|
56
|
+
@primary_name_column ||= @properties[@order.first].name
|
57
|
+
end
|
58
|
+
|
59
|
+
def collection_url
|
60
|
+
@collection_url ||= "/#{@resource.to_s.gsub('::', '/').underscore.pluralize}"
|
61
|
+
end
|
62
|
+
|
63
|
+
def object_url(object=nil)
|
64
|
+
if object
|
65
|
+
self.object_url.gsub(%r{[:]([^/]+)}) do
|
66
|
+
object.__send__($1).to_s
|
67
|
+
end
|
68
|
+
else
|
69
|
+
@object_url ||= "#{collection_url}/:id"
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def save_object_url(object=nil)
|
74
|
+
if object
|
75
|
+
if object.new_record?
|
76
|
+
collection_url
|
77
|
+
else
|
78
|
+
object_url(object)
|
79
|
+
end
|
80
|
+
else
|
81
|
+
@object_url ||= "#{collection_url}/:id"
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
private
|
86
|
+
|
87
|
+
def generate_default_properties
|
88
|
+
resource.content_columns.each do |column|
|
89
|
+
property = Dormouse::Property.new(self, column)
|
90
|
+
@properties[property.name] = property
|
91
|
+
@order << property.name
|
92
|
+
end
|
93
|
+
|
94
|
+
resource.reflect_on_all_associations.each do |association|
|
95
|
+
property = Dormouse::Property.new(self, association)
|
96
|
+
@properties[property.name] = property
|
97
|
+
@order << property.name
|
98
|
+
end
|
99
|
+
rescue ActiveRecord::StatementInvalid => e
|
100
|
+
puts "#{e.message}"
|
101
|
+
end
|
102
|
+
|
103
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
class Dormouse::Property
|
2
|
+
|
3
|
+
def initialize(manifest, column_or_association)
|
4
|
+
if ActiveRecord::Reflection::MacroReflection === column_or_association
|
5
|
+
@type = column_or_association.macro
|
6
|
+
@resource = column_or_association.klass
|
7
|
+
else
|
8
|
+
@type = column_or_association.type
|
9
|
+
end
|
10
|
+
@name = column_or_association.name.to_sym
|
11
|
+
@options = {}
|
12
|
+
|
13
|
+
populate
|
14
|
+
end
|
15
|
+
|
16
|
+
attr_reader :name, :type, :options, :resource
|
17
|
+
attr_accessor :hidden
|
18
|
+
attr_accessor :label
|
19
|
+
|
20
|
+
def populate(options={})
|
21
|
+
@hidden = options.delete(:hidden) if options.key?(:hidden)
|
22
|
+
@label = options.delete(:label) if options.key?(:label)
|
23
|
+
@label = @name.to_s.humanize if @label.nil?
|
24
|
+
@options = @options.merge(options)
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
class Dormouse::Views::Base
|
2
|
+
|
3
|
+
attr_reader :manifest
|
4
|
+
|
5
|
+
def initialize(manifest)
|
6
|
+
@manifest = manifest
|
7
|
+
end
|
8
|
+
|
9
|
+
def render_in_controller(controller, *args)
|
10
|
+
@controller = controller
|
11
|
+
render(*args)
|
12
|
+
end
|
13
|
+
|
14
|
+
def render
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def controller_eval(&block)
|
21
|
+
@controller.instance_eval(&block)
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
class Dormouse::Views::Form < Dormouse::Views::Base
|
2
|
+
|
3
|
+
def render(object=nil)
|
4
|
+
manifest = self.manifest
|
5
|
+
|
6
|
+
widgets = self.widgets
|
7
|
+
|
8
|
+
object ||= begin
|
9
|
+
if id = @controller.params[:id]
|
10
|
+
manifest.resource.find(id)
|
11
|
+
else
|
12
|
+
manifest.resource.new
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
controller_eval do
|
17
|
+
@object = object
|
18
|
+
@widgets = widgets
|
19
|
+
render :template => "#{manifest.style}/views/form", :layout => "#{manifest.style}/layouts/dormouse"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def widgets
|
24
|
+
@widgets ||= begin
|
25
|
+
manifest.inject([]) do |memo, property|
|
26
|
+
widget_klass = Dormouse::Widgets[property.type]
|
27
|
+
memo << widget_klass.new(manifest, property) if widget_klass
|
28
|
+
memo
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
class Dormouse::Views::List < Dormouse::Views::Base
|
2
|
+
|
3
|
+
def render(collection=nil)
|
4
|
+
manifest = self.manifest
|
5
|
+
|
6
|
+
collection ||= manifest.resource.all
|
7
|
+
|
8
|
+
controller_eval do
|
9
|
+
@collection = collection
|
10
|
+
render :template => "#{manifest.style}/views/list", :layout => "#{manifest.style}/layouts/dormouse"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
class Dormouse::Widgets::Base
|
2
|
+
|
3
|
+
attr_reader :property
|
4
|
+
|
5
|
+
def self.property_type(name=nil)
|
6
|
+
if name
|
7
|
+
@property_type = name
|
8
|
+
Dormouse::Widgets[name] = self
|
9
|
+
else
|
10
|
+
@property_type
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def property_type
|
15
|
+
self.class.property_type
|
16
|
+
end
|
17
|
+
|
18
|
+
def initialize(manifest, property)
|
19
|
+
@manifest, @property = manifest, property
|
20
|
+
end
|
21
|
+
|
22
|
+
delegate :hidden, :options, :name, :to => :property
|
23
|
+
|
24
|
+
def render_in_view(view, object, options={})
|
25
|
+
@view = view
|
26
|
+
render(object, options)
|
27
|
+
end
|
28
|
+
|
29
|
+
def render(object, options={})
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def view_eval(&block)
|
36
|
+
@view.instance_eval(&block)
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
class Dormouse::Widgets::BelongsTo < Dormouse::Widgets::Base
|
2
|
+
|
3
|
+
property_type :belongs_to
|
4
|
+
|
5
|
+
def render(object, options={})
|
6
|
+
value = object.__send__(@property.name)
|
7
|
+
locals = options.merge( :value => value, :object => object, :property => @property, :manifest => @manifest, :target => @property.resource.manifest )
|
8
|
+
view_eval { render :partial => "#{manifest.style}/widgets/belongs_to", :locals => locals }
|
9
|
+
end
|
10
|
+
|
11
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
class Dormouse::Widgets::Simple < Dormouse::Widgets::Base
|
2
|
+
|
3
|
+
def render(object, options={})
|
4
|
+
value = object.__send__(@property.name)
|
5
|
+
locals = options.merge( :value => value, :object => object, :property => @property, :manifest => @manifest )
|
6
|
+
property_type = self.property_type
|
7
|
+
view_eval { render :partial => "#{manifest.style}/widgets/#{property_type}", :locals => locals }
|
8
|
+
end
|
9
|
+
|
10
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Dormouse::Widgets
|
2
|
+
|
3
|
+
class << self
|
4
|
+
def [](name)
|
5
|
+
@widget_types[name.to_sym]
|
6
|
+
end
|
7
|
+
|
8
|
+
def []=(name, klass)
|
9
|
+
(@widget_types ||= {})[name.to_sym] = klass
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
require 'dormouse/widgets/base'
|
14
|
+
require 'dormouse/widgets/simple'
|
15
|
+
|
16
|
+
require 'dormouse/widgets/string'
|
17
|
+
require 'dormouse/widgets/text'
|
18
|
+
require 'dormouse/widgets/date'
|
19
|
+
require 'dormouse/widgets/time'
|
20
|
+
require 'dormouse/widgets/datetime'
|
21
|
+
require 'dormouse/widgets/boolean'
|
22
|
+
require 'dormouse/widgets/integer'
|
23
|
+
require 'dormouse/widgets/float'
|
24
|
+
require 'dormouse/widgets/decimal'
|
25
|
+
require 'dormouse/widgets/timestamp'
|
26
|
+
require 'dormouse/widgets/belongs_to'
|
27
|
+
|
28
|
+
end
|
data/lib/dormouse.rb
ADDED
metadata
ADDED
@@ -0,0 +1,107 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: dormouse
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: true
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
- a1
|
10
|
+
version: 0.0.1.a1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Simon Menke
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2010-04-19 00:00:00 +02:00
|
19
|
+
default_executable:
|
20
|
+
dependencies: []
|
21
|
+
|
22
|
+
description: Build CMS's in a snap using just models.
|
23
|
+
email:
|
24
|
+
- simon.menke@gmail.com
|
25
|
+
executables: []
|
26
|
+
|
27
|
+
extensions: []
|
28
|
+
|
29
|
+
extra_rdoc_files: []
|
30
|
+
|
31
|
+
files:
|
32
|
+
- app/views/dormouse/layouts/dormouse.html.erb
|
33
|
+
- app/views/dormouse/views/form.html.erb
|
34
|
+
- app/views/dormouse/views/list.html.erb
|
35
|
+
- app/views/dormouse/widgets/_belongs_to.html.erb
|
36
|
+
- app/views/dormouse/widgets/_boolean.html.erb
|
37
|
+
- app/views/dormouse/widgets/_date.html.erb
|
38
|
+
- app/views/dormouse/widgets/_datetime.html.erb
|
39
|
+
- app/views/dormouse/widgets/_decimal.html.erb
|
40
|
+
- app/views/dormouse/widgets/_float.html.erb
|
41
|
+
- app/views/dormouse/widgets/_integer.html.erb
|
42
|
+
- app/views/dormouse/widgets/_string.html.erb
|
43
|
+
- app/views/dormouse/widgets/_text.html.erb
|
44
|
+
- app/views/dormouse/widgets/_time.html.erb
|
45
|
+
- app/views/dormouse/widgets/_timestamp.html.erb
|
46
|
+
- lib/dormouse/action_controller.rb
|
47
|
+
- lib/dormouse/active_record.rb
|
48
|
+
- lib/dormouse/dsl.rb
|
49
|
+
- lib/dormouse/manifest.rb
|
50
|
+
- lib/dormouse/property.rb
|
51
|
+
- lib/dormouse/version.rb
|
52
|
+
- lib/dormouse/views/base.rb
|
53
|
+
- lib/dormouse/views/form.rb
|
54
|
+
- lib/dormouse/views/list.rb
|
55
|
+
- lib/dormouse/views.rb
|
56
|
+
- lib/dormouse/widgets/base.rb
|
57
|
+
- lib/dormouse/widgets/belongs_to.rb
|
58
|
+
- lib/dormouse/widgets/boolean.rb
|
59
|
+
- lib/dormouse/widgets/date.rb
|
60
|
+
- lib/dormouse/widgets/datetime.rb
|
61
|
+
- lib/dormouse/widgets/decimal.rb
|
62
|
+
- lib/dormouse/widgets/float.rb
|
63
|
+
- lib/dormouse/widgets/integer.rb
|
64
|
+
- lib/dormouse/widgets/simple.rb
|
65
|
+
- lib/dormouse/widgets/string.rb
|
66
|
+
- lib/dormouse/widgets/text.rb
|
67
|
+
- lib/dormouse/widgets/time.rb
|
68
|
+
- lib/dormouse/widgets/timestamp.rb
|
69
|
+
- lib/dormouse/widgets.rb
|
70
|
+
- lib/dormouse.rb
|
71
|
+
- LICENSE
|
72
|
+
- README.md
|
73
|
+
- CHANGELOG.md
|
74
|
+
has_rdoc: true
|
75
|
+
homepage: http://github.com/fd/dormouse
|
76
|
+
licenses: []
|
77
|
+
|
78
|
+
post_install_message:
|
79
|
+
rdoc_options: []
|
80
|
+
|
81
|
+
require_paths:
|
82
|
+
- lib
|
83
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
84
|
+
requirements:
|
85
|
+
- - ">="
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
segments:
|
88
|
+
- 0
|
89
|
+
version: "0"
|
90
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
91
|
+
requirements:
|
92
|
+
- - ">="
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
segments:
|
95
|
+
- 1
|
96
|
+
- 3
|
97
|
+
- 6
|
98
|
+
version: 1.3.6
|
99
|
+
requirements: []
|
100
|
+
|
101
|
+
rubyforge_project: dormouse
|
102
|
+
rubygems_version: 1.3.6
|
103
|
+
signing_key:
|
104
|
+
specification_version: 3
|
105
|
+
summary: ActiveRecord models are so wise, we should use there wisdom instead of being stubborn and stupid.
|
106
|
+
test_files: []
|
107
|
+
|