dormouse 0.0.1.a1 → 0.0.1.a2

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.
@@ -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