dormouse 0.0.1.a1 → 0.0.1.a2

Sign up to get free protection for your applications and to get access to all the features.
@@ -4,6 +4,8 @@ Features:
4
4
 
5
5
  - added basic list generation.
6
6
  - added basic form generation.
7
+ - added basic menu infrastructure.
8
+ - added initial support for nested resources.
7
9
 
8
10
  Bugfixes:
9
11
 
@@ -4,11 +4,18 @@
4
4
  <title>Dormouse</title>
5
5
  <%= stylesheet_link_tag :all %>
6
6
  <%= javascript_include_tag :defaults %>
7
- <%#= csrf_meta_tag %>
8
7
  </head>
9
8
  <body>
10
9
 
11
- <%= yield %>
10
+ <ul id="menu">
11
+ <% Dormouse.menu.each do |item| %>
12
+ <li><%= link_to item.name, item.url %></li>
13
+ <% end %>
14
+ </ul>
15
+
16
+ <div id="content">
17
+ <%= yield %>
18
+ </div>
12
19
 
13
20
  </body>
14
21
  </html>
@@ -1,3 +1,9 @@
1
+ <ul id="tabs">
2
+ <% @tabs.each do |tab| %>
3
+ <li><%= link_to tab.name, tab.url_for_object(@object) %></li>
4
+ <% end %>
5
+ </ul>
6
+
1
7
  <% form_for @object, :url => manifest.save_object_url(@object) do |f| %>
2
8
 
3
9
  <%= f.error_messages %>
@@ -3,7 +3,7 @@
3
3
  <div class="box">
4
4
  <h3>Actions</h3>
5
5
  <ul>
6
- <li><a href="<%= manifest.collection_url %>/new">New item</a></li>
6
+ <li class="create"><a href="<%= request.path %>/new">New item</a></li>
7
7
  </ul>
8
8
  </div>
9
9
 
@@ -5,6 +5,10 @@ module Dormouse
5
5
  require 'dormouse/manifest'
6
6
  require 'dormouse/property'
7
7
  require 'dormouse/dsl'
8
+ require 'dormouse/menu'
9
+ require 'dormouse/tab'
10
+ require 'dormouse/widgets'
11
+ require 'dormouse/views'
8
12
 
9
13
  require 'dormouse/active_record'
10
14
  require 'dormouse/action_controller'
@@ -15,7 +15,32 @@ module Dormouse::ActionController
15
15
  def self.build_routes(manifest, map)
16
16
  name = manifest.resource.to_s.split('::').last.tableize
17
17
  controller = manifest.controller_class.to_s.sub(/Controller$/, '')
18
- map.resources name.to_sym, :controller => controller
18
+
19
+ map.resources name.to_sym, :controller => controller do |subresource|
20
+ manifest.each do |property|
21
+
22
+ next unless property.resource
23
+ build_sub_routes(manifest, property, property.resource.manifest, subresource)
24
+
25
+ end
26
+ end
27
+ end
28
+
29
+ def self.build_sub_routes(parent, property, manifest, map)
30
+ return unless property.type == :has_many and !property.options[:inline]
31
+ controller = manifest.controller_class
32
+ controller.potential_parents[property.name.to_sym] = parent
33
+ controller = controller.to_s.sub(/Controller$/, '')
34
+
35
+ options = { :controller => controller, :only => [:index, :new] }
36
+ map.resources property.name.to_sym, options do |map|
37
+ manifest.each do |property|
38
+
39
+ next unless property.resource
40
+ build_sub_routes(manifest, property, property.resource.manifest, map)
41
+
42
+ end
43
+ end
19
44
  end
20
45
 
21
46
  end
@@ -25,17 +50,24 @@ module Dormouse::ActionController::Actions
25
50
  def self.included(base)
26
51
  base.class_eval do
27
52
  helper_method :manifest
53
+ before_filter :lookup_parent, :only => [:index, :new]
28
54
  end
29
55
  end
30
56
 
31
57
  def index
32
- manifest.render_list(self)
58
+ collection = (@parent ? @parent.__send__(@parent_association).all : nil)
59
+ manifest.render_list(self, collection)
33
60
  end
34
61
 
35
- def new
62
+ def show
36
63
  manifest.render_form(self)
37
64
  end
38
65
 
66
+ def new
67
+ object = (@parent ? @parent.__send__(@parent_association).build : nil)
68
+ manifest.render_form(self, object)
69
+ end
70
+
39
71
  def edit
40
72
  manifest.render_form(self)
41
73
  end
@@ -54,6 +86,15 @@ module Dormouse::ActionController::Actions
54
86
  redirect_to manifest.collection_url
55
87
  rescue ActiveRecord::RecordInvalid => e
56
88
  manifest.render_form(self, e.record)
89
+ rescue ActiveRecord::RecordNotFound => e
90
+ redirect_to manifest.collection_url
91
+ end
92
+
93
+ def destroy
94
+ manifest.resource.find(params[:id]).destroy
95
+ redirect_to manifest.collection_url
96
+ rescue ActiveRecord::RecordNotFound => e
97
+ redirect_to manifest.collection_url
57
98
  end
58
99
 
59
100
  private
@@ -62,10 +103,27 @@ private
62
103
  self.class.manifest
63
104
  end
64
105
 
106
+ def lookup_parent
107
+ self.class.potential_parents.each do |association, manifest|
108
+ param = manifest.resource.to_s.split('::').last.underscore + '_id'
109
+ if params[param]
110
+ @parent_manifest = manifest
111
+ @parent = manifest.resource.find(params[param])
112
+ @parent_association = association
113
+ break
114
+ end
115
+ end
116
+ end
117
+
65
118
  end
66
119
 
67
120
  module Dormouse::ActionController::Meta
68
121
 
69
122
  attr_accessor :manifest
123
+ attr_reader :potential_parents
124
+
125
+ def potential_parents
126
+ @potential_parents ||= {}
127
+ end
70
128
 
71
129
  end
@@ -23,6 +23,10 @@ class Dormouse::DSL
23
23
  @manifest.style = (name || 'dormouse')
24
24
  end
25
25
 
26
+ def menu(name, options={})
27
+ Dormouse::menu.register(name, @manifest, options)
28
+ end
29
+
26
30
  # 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
31
  def primary_name(property)
28
32
  set(property, :primary => true)
@@ -82,6 +82,10 @@ class Dormouse::Manifest
82
82
  end
83
83
  end
84
84
 
85
+ def inspect
86
+ "#<#{self}: #{@resource}>"
87
+ end
88
+
85
89
  private
86
90
 
87
91
  def generate_default_properties
@@ -0,0 +1,75 @@
1
+ class Dormouse::Menu
2
+
3
+ include Enumerable
4
+
5
+ def initialize
6
+ @items = {}
7
+ @order = []
8
+ end
9
+
10
+ def each
11
+ @order.each do |name|
12
+ yield @items[name]
13
+ end
14
+ end
15
+
16
+ def register(name, manifest, options={})
17
+ name = name.to_s
18
+
19
+ @order.push name unless @order.include?(name)
20
+ @items[name] = Dormouse::Menu::Item.new(name, manifest, options)
21
+
22
+ order!
23
+
24
+ self
25
+ end
26
+
27
+ private
28
+
29
+ def order!
30
+ @items.each do |name, item|
31
+ @order.delete(name)
32
+
33
+ case
34
+ when hook = item.order_options[:before]
35
+ idx = @order.index(hook.to_s) || @order.size
36
+ @order.insert(idx, name)
37
+ when hook = item.order_options[:after]
38
+ idx = @order.index(hook.to_s) || @order.size
39
+ @order.insert(idx, name)
40
+ when item.order_options[:top]
41
+ @order.unshift(name)
42
+ when item.order_options[:bottom]
43
+ @order.push(name)
44
+ else
45
+ @order.push(name)
46
+ end
47
+ end
48
+ end
49
+
50
+ end
51
+
52
+ class Dormouse::Menu::Item
53
+
54
+ def initialize(name, manifest, options={})
55
+ @name, @manifest, @options = name, manifest, options
56
+
57
+ @order_options = @options.slice(:before, :after, :top, :bottom)
58
+ @options.except!(:before, :after, :top, :bottom)
59
+ end
60
+
61
+ attr_reader :name, :manifest, :options, :order_options, :url
62
+
63
+ def url
64
+ @manifest.collection_url
65
+ end
66
+
67
+ end
68
+
69
+ module Dormouse
70
+
71
+ def self.menu
72
+ @menu ||= Dormouse::Menu.new
73
+ end
74
+
75
+ end
@@ -0,0 +1,18 @@
1
+ class Dormouse::Tab
2
+
3
+ def initialize(manifest, property)
4
+ @manifest, @property = manifest, property
5
+ end
6
+
7
+ attr_reader :manifest, :property
8
+
9
+ def name
10
+ @name ||= @property.resource.to_s.humanize.pluralize
11
+ end
12
+
13
+ def url_for_object(object)
14
+ @suffix ||= @property.resource.to_s.split('::').last.tableize
15
+ "#{manifest.object_url(object)}/#{@suffix}"
16
+ end
17
+
18
+ end
@@ -1,3 +1,3 @@
1
1
  module Dormouse
2
- VERSION = '0.0.1.a1'
2
+ VERSION = '0.0.1.a2'
3
3
  end
@@ -4,6 +4,7 @@ class Dormouse::Views::Form < Dormouse::Views::Base
4
4
  manifest = self.manifest
5
5
 
6
6
  widgets = self.widgets
7
+ tabs = self.tabs
7
8
 
8
9
  object ||= begin
9
10
  if id = @controller.params[:id]
@@ -16,6 +17,7 @@ class Dormouse::Views::Form < Dormouse::Views::Base
16
17
  controller_eval do
17
18
  @object = object
18
19
  @widgets = widgets
20
+ @tabs = tabs
19
21
  render :template => "#{manifest.style}/views/form", :layout => "#{manifest.style}/layouts/dormouse"
20
22
  end
21
23
  end
@@ -30,4 +32,17 @@ class Dormouse::Views::Form < Dormouse::Views::Base
30
32
  end
31
33
  end
32
34
 
35
+ def tabs
36
+ @tabs ||= begin
37
+ manifest.inject([]) do |memo, property|
38
+
39
+ if property.type == :has_many and !property.options[:inline]
40
+ memo << Dormouse::Tab.new(manifest, property)
41
+ end
42
+
43
+ memo
44
+ end
45
+ end
46
+ end
47
+
33
48
  end
@@ -2,7 +2,7 @@ module Dormouse::Widgets
2
2
 
3
3
  class << self
4
4
  def [](name)
5
- @widget_types[name.to_sym]
5
+ (@widget_types ||= {})[name.to_sym]
6
6
  end
7
7
 
8
8
  def []=(name, klass)
@@ -23,6 +23,8 @@ module Dormouse::Widgets
23
23
  require 'dormouse/widgets/float'
24
24
  require 'dormouse/widgets/decimal'
25
25
  require 'dormouse/widgets/timestamp'
26
+
27
+ require 'dormouse/widgets/has_many'
26
28
  require 'dormouse/widgets/belongs_to'
27
29
 
28
30
  end
@@ -0,0 +1,13 @@
1
+ class Dormouse::Widgets::HasMany < Dormouse::Widgets::Base
2
+
3
+ property_type :has_many
4
+
5
+ def render(object, options={})
6
+ return unless @property.options[:inline]
7
+
8
+ value = object.__send__(@property.name)
9
+ locals = options.merge( :value => value, :object => object, :property => @property, :manifest => @manifest, :target => @property.resource.manifest )
10
+ view_eval { render :partial => "#{manifest.style}/widgets/has_many", :locals => locals }
11
+ end
12
+
13
+ end
metadata CHANGED
@@ -6,8 +6,8 @@ version: !ruby/object:Gem::Version
6
6
  - 0
7
7
  - 0
8
8
  - 1
9
- - a1
10
- version: 0.0.1.a1
9
+ - a2
10
+ version: 0.0.1.a2
11
11
  platform: ruby
12
12
  authors:
13
13
  - Simon Menke
@@ -47,7 +47,9 @@ files:
47
47
  - lib/dormouse/active_record.rb
48
48
  - lib/dormouse/dsl.rb
49
49
  - lib/dormouse/manifest.rb
50
+ - lib/dormouse/menu.rb
50
51
  - lib/dormouse/property.rb
52
+ - lib/dormouse/tab.rb
51
53
  - lib/dormouse/version.rb
52
54
  - lib/dormouse/views/base.rb
53
55
  - lib/dormouse/views/form.rb
@@ -60,6 +62,7 @@ files:
60
62
  - lib/dormouse/widgets/datetime.rb
61
63
  - lib/dormouse/widgets/decimal.rb
62
64
  - lib/dormouse/widgets/float.rb
65
+ - lib/dormouse/widgets/has_many.rb
63
66
  - lib/dormouse/widgets/integer.rb
64
67
  - lib/dormouse/widgets/simple.rb
65
68
  - lib/dormouse/widgets/string.rb