maiha-merb_inspector 0.2.8 → 0.2.9

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -5,7 +5,7 @@ require 'merb-core'
5
5
  require 'merb-core/tasks/merb'
6
6
 
7
7
  GEM_NAME = "merb_inspector"
8
- GEM_VERSION = "0.2.8"
8
+ GEM_VERSION = "0.2.9"
9
9
  AUTHOR = "Maiha"
10
10
  EMAIL = "maiha@wota.jp"
11
11
  HOMEPAGE = "http://github.com/maiha/merb_inspector"
@@ -20,13 +20,7 @@ class DataMapper::ResourceInspector < Merb::Inspector
20
20
  end
21
21
 
22
22
  def columns
23
- if @options[:only]
24
- klass.properties.select{|p| @options[:only].map(&:to_s).include?(p.name.to_s)}
25
- elsif @options[:except]
26
- klass.properties.reject{|p| @options[:except].map(&:to_s).include?(p.name.to_s)}
27
- else
28
- klass.properties
29
- end
23
+ @columns ||= build_columns
30
24
  end
31
25
 
32
26
  def dom_id
@@ -66,59 +60,82 @@ class DataMapper::ResourceInspector < Merb::Inspector
66
60
  rescue Merb::Router::GenerationError
67
61
  end
68
62
 
69
- def link_to_show(record = @object, label = 'Show', opts = {})
70
- link_to label, resource(record), opts
63
+ def show_link_value(record, p, opts = {})
64
+ opts[:label] ||= "Show"
65
+ link_to opts[:label], resource(record), opts
71
66
  rescue Merb::Router::GenerationError
72
67
  end
73
68
 
74
- def link_to_edit(record = @object, label = 'Edit', opts = {})
75
- link_to label, resource(record, :edit), opts
69
+ def edit_link_value(record, p, opts = {})
70
+ opts[:label] ||= "Edit"
71
+ link_to opts[:label], resource(record, :edit), opts
72
+ rescue Merb::Router::GenerationError
73
+ end
74
+
75
+ def delete_link_value(record, p, opts = {})
76
+ opts[:label] ||= "Delete"
77
+ link_to opts[:label], resource(record, :delete), opts
76
78
  rescue Merb::Router::GenerationError
77
79
  end
78
80
 
79
81
  ######################################################################
80
82
  ### form builder for DataMapper
81
83
 
82
- def column_header(p)
83
- label = p.name.to_s
84
- h(label)
85
- # link_to label, "#", :onclick=>"return false;"
84
+ def default_columns
85
+ [LinkColumn.new(self, :show), LinkColumn.new(self, :edit)]
86
86
  end
87
87
 
88
- def column_value(record, p)
89
- # first, search class prefixed method that user override
90
- method = "#{Extlib::Inflection.demodulize(record.class.name)}_#{p.name}_column"
91
- return send(method, record, p) if respond_to?(method, true)
92
-
93
- # second, search method that user override
94
- method = "#{p.name}_column"
95
- return send(method, record, p) if respond_to?(method, true)
96
-
97
- # finally, guess form from property type
98
- value = record.send(p.name)
99
- if p.type == ::DataMapper::Types::Text
100
- value.to_s.split(/\r?\n/).map{|i| h(i.to_s)}.join("<BR>")
88
+ def build_columns
89
+ if @options[:only]
90
+ cols = @options[:only].map{|name|
91
+ name = name.to_s.intern
92
+ klass.properties.find{|p| p.name == name} || name
93
+ }
94
+ elsif @options[:except]
95
+ cols = klass.properties.reject{|p| @options[:except].map(&:to_s).include?(p.name.to_s)} + default_columns
101
96
  else
102
- h(value.to_s)
97
+ cols = klass.properties + default_columns
98
+ end
99
+
100
+ cols.map do |col|
101
+ case col
102
+ when ::DataMapper::Property
103
+ DMColumn.new(self, col)
104
+ when Column
105
+ col
106
+ else
107
+ VirtualColumn.new(self, col)
108
+ end
103
109
  end
104
110
  end
105
111
 
106
- def column_form(record, p)
107
- # first, search class prefixed method that user override
108
- method = "#{Extlib::Inflection.demodulize(record.class.name)}_#{p.name}_form"
109
- return send(method, record, p) if respond_to?(method, true)
112
+ def column_label(column)
113
+ column.label
114
+ end
115
+
116
+ def column_value(record, column)
117
+ column.value(record)
118
+ rescue Column::MethodFound => e
119
+ __send__ *e.args
120
+ rescue Column::NotDefined => e
121
+ call_user_method(e.message, record, column)
122
+ end
110
123
 
111
- # second, search method that user override
112
- method = "#{p.name}_form"
113
- return send(method, record, p) if respond_to?(method, true)
124
+ def column_form(record, column)
125
+ column.form(record)
126
+ rescue Column::MethodFound => e
127
+ __send__ *e.args
128
+ rescue Column::NotDefined => e
129
+ call_user_method(e.message, record, column)
130
+ end
114
131
 
115
- # finally, guess form from property type
116
- if p.type == ::DataMapper::Types::Serial
117
- record.send p.name
118
- elsif p.type == ::DataMapper::Types::Text
119
- text_area p.name
132
+ def call_user_method(method, record, column)
133
+ method = method.to_sym
134
+ block = @options[:columns][method] rescue nil
135
+ if block
136
+ block.call(record, column)
120
137
  else
121
- text_field p.name
138
+ "[VirtualColumn] '#{method}' is not defined yet"
122
139
  end
123
140
  end
124
141
  end
@@ -0,0 +1,133 @@
1
+ module Merb
2
+ class Inspector
3
+ class Column # Abstract
4
+ class Delegate < StandardError; end
5
+ class NotDefined < Delegate; end
6
+ class MethodFound < Delegate
7
+ attr_reader :args
8
+ def initialize(*args)
9
+ @args = args
10
+ super("method delegation")
11
+ end
12
+ end
13
+
14
+ attr_accessor :context, :name
15
+
16
+ def initialize(context, name)
17
+ @context = context
18
+ @name = name.to_s.intern
19
+ end
20
+
21
+ def name
22
+ @name.to_s
23
+ end
24
+
25
+ def label(*)
26
+ name
27
+ end
28
+
29
+ def value(record)
30
+ # first, search class prefixed method that user override
31
+ evaluate(record, "#{Extlib::Inflection.demodulize(record.class.name)}_#{name}_value")
32
+
33
+ # second, search method that user override
34
+ evaluate(record, "#{name}_value")
35
+
36
+ # finally, guess form from property type
37
+ default_value(record)
38
+ end
39
+
40
+ def form(record)
41
+ # first, search class prefixed method that user override
42
+ evaluate(record, "#{Extlib::Inflection.demodulize(record.class.name)}_#{name}_form")
43
+
44
+ # second, search method that user override
45
+ evaluate(record, "#{name}_form")
46
+
47
+ # finally, guess form from property type
48
+ default_form(record)
49
+ end
50
+
51
+ private
52
+ def h(str)
53
+ context.h(str)
54
+ end
55
+
56
+ def evaluate(record, method)
57
+ raise MethodFound.new(method, record, self) if context.respond_to?(method, true)
58
+ end
59
+
60
+ def default_value(record)
61
+ raise NotImplementedError
62
+ end
63
+
64
+ def default_form(record)
65
+ raise NotImplementedError
66
+ end
67
+
68
+ def not_defined(method)
69
+ raise NotDefined, method
70
+ end
71
+ end
72
+
73
+ class DMColumn < Column
74
+ def initialize(context, property)
75
+ @context = context
76
+ @property = property
77
+ end
78
+
79
+ def name
80
+ @property.name.to_s
81
+ end
82
+
83
+ def type
84
+ @property.type
85
+ end
86
+
87
+ def default_value(record)
88
+ value = record.send(name)
89
+ if type == ::DataMapper::Types::Text
90
+ value.to_s.split(/\r?\n/).map{|i| h(i.to_s)}.join("<BR>")
91
+ else
92
+ h(value.to_s)
93
+ end
94
+ end
95
+
96
+ def default_form(record)
97
+ if type == ::DataMapper::Types::Serial
98
+ record.send name
99
+ elsif type == ::DataMapper::Types::Text
100
+ raise MethodFound.new(:text_area, name.to_sym)
101
+ else
102
+ raise MethodFound.new(:text_field, name.to_sym)
103
+ end
104
+ end
105
+ end
106
+
107
+ class VirtualColumn < Column
108
+ def default_value(record)
109
+ not_defined("#{name}_value")
110
+ end
111
+
112
+ def default_form(record)
113
+ not_defined("#{name}_form")
114
+ end
115
+ end
116
+
117
+ class LinkColumn < Column
118
+ def default_value(record)
119
+ evaluate(record, "#{name}_link_value")
120
+ not_defined("#{name}_link_value")
121
+ end
122
+
123
+ def default_form(record)
124
+ evaluate(record, "#{name}_link_form")
125
+ not_defined("#{name}_link_form")
126
+ end
127
+
128
+ def label
129
+ nil
130
+ end
131
+ end
132
+ end
133
+ end
@@ -16,7 +16,7 @@ module Merb
16
16
  options[:max_level] ||= 3
17
17
 
18
18
  # validate keys
19
- valid_keys = [:action, :level, :max_level, :only, :except]
19
+ valid_keys = [:action, :level, :max_level, :only, :except, :columns]
20
20
  unknown_keys = options.keys - valid_keys
21
21
  if !unknown_keys.blank?
22
22
  return h("[INSPECTOR ERROR] Unknown key(s): %s" % unknown_keys.inspect)
@@ -10,6 +10,7 @@ if defined?(Merb::Plugins)
10
10
 
11
11
  Merb::BootLoader.before_app_loads do
12
12
  require "merb_inspector" / "inspector"
13
+ require "merb_inspector" / "data"
13
14
  require "merb_inspector" / "builtin"
14
15
  require "merb_inspector" / "manager"
15
16
  require "merb_inspector" / "helper"
@@ -3,7 +3,7 @@
3
3
  <thead>
4
4
  <tr>
5
5
  <%- columns.each do |p| -%>
6
- <th><p><%= column_header(p) %></p></th>
6
+ <th><p><%= column_label(p) %></p></th>
7
7
  <%- end -%>
8
8
  <th></th>
9
9
  </tr>
@@ -16,17 +16,8 @@ tr_class += " #{list_row_class(record)}" if respond_to? :list_row_class
16
16
  -%>
17
17
  <tr class="record <%=tr_class%>">
18
18
  <%- columns.each do |p| -%>
19
- <td><%=h column_value(record, p) %></td>
19
+ <td><%= column_value(record, p) %></td>
20
20
  <%- end -%>
21
- <td>
22
- <table class="logical">
23
- <tr>
24
- <td><%= link_to_show(record) %></td>
25
- <td><%= link_to_edit(record) %></td>
26
- <td><%# delete_button(article, "Delete #{article.title}") %></td>
27
- </tr>
28
- </table>
29
- </td>
30
21
  </tr>
31
22
  <%- end -%>
32
23
  </tbody>
@@ -4,7 +4,7 @@
4
4
  <tbody>
5
5
  <%- columns.each do |p| -%>
6
6
  <tr>
7
- <th><%= column_header(p) %></th>
7
+ <th><%= column_label(p) %></th>
8
8
  <td><%= column_value(record, p) %></td>
9
9
  </tr>
10
10
  <%- end -%>
@@ -23,7 +23,7 @@
23
23
  <tbody>
24
24
  <%- columns.each do |p| -%>
25
25
  <tr>
26
- <th><%= column_header(p) %></th>
26
+ <th><%= column_label(p) %></th>
27
27
  <td><%= column_form(record, p) %></td>
28
28
  </tr>
29
29
  <%- end -%>
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: maiha-merb_inspector
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.8
4
+ version: 0.2.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Maiha
@@ -40,6 +40,7 @@ files:
40
40
  - lib/merb_inspector
41
41
  - lib/merb_inspector/helper.rb
42
42
  - lib/merb_inspector/builtin.rb
43
+ - lib/merb_inspector/data.rb
43
44
  - lib/merb_inspector/merbtasks.rb
44
45
  - lib/merb_inspector/manager.rb
45
46
  - lib/merb_inspector/inspector.rb