ruby_mvc 0.0.0

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.
Files changed (42) hide show
  1. data/LICENSE +19 -0
  2. data/README.md +69 -0
  3. data/lib/ruby_mvc.rb +33 -0
  4. data/lib/ruby_mvc/application.rb +53 -0
  5. data/lib/ruby_mvc/controllers/app_controller.rb +93 -0
  6. data/lib/ruby_mvc/controllers/rails_controller.rb +71 -0
  7. data/lib/ruby_mvc/models.rb +28 -0
  8. data/lib/ruby_mvc/models/array_table_model.rb +59 -0
  9. data/lib/ruby_mvc/models/keyed_array_table_model.rb +83 -0
  10. data/lib/ruby_mvc/models/table_model.rb +42 -0
  11. data/lib/ruby_mvc/module.rb +35 -0
  12. data/lib/ruby_mvc/renderers.rb +26 -0
  13. data/lib/ruby_mvc/renderers/html4_table_model_renderer.rb +100 -0
  14. data/lib/ruby_mvc/toolkit.rb +31 -0
  15. data/lib/ruby_mvc/toolkit/app.rb +32 -0
  16. data/lib/ruby_mvc/toolkit/dialog.rb +31 -0
  17. data/lib/ruby_mvc/toolkit/frame.rb +34 -0
  18. data/lib/ruby_mvc/toolkit/notification.rb +202 -0
  19. data/lib/ruby_mvc/toolkit/peers/wxruby.rb +31 -0
  20. data/lib/ruby_mvc/toolkit/peers/wxruby/app.rb +44 -0
  21. data/lib/ruby_mvc/toolkit/peers/wxruby/box_layout.rb +48 -0
  22. data/lib/ruby_mvc/toolkit/peers/wxruby/common.rb +72 -0
  23. data/lib/ruby_mvc/toolkit/peers/wxruby/frame.rb +49 -0
  24. data/lib/ruby_mvc/toolkit/peers/wxruby/web_view.rb +87 -0
  25. data/lib/ruby_mvc/toolkit/web_view.rb +60 -0
  26. data/lib/ruby_mvc/toolkit/widget.rb +108 -0
  27. data/lib/ruby_mvc/views.rb +85 -0
  28. data/lib/ruby_mvc/views/ar_model_editor.rb +84 -0
  29. data/lib/ruby_mvc/views/ar_type_editor.rb +65 -0
  30. data/lib/ruby_mvc/views/ar_type_list.rb +45 -0
  31. data/lib/ruby_mvc/views/table_view.rb +96 -0
  32. data/lib/ruby_mvc/views/web_view.rb +65 -0
  33. data/lib/ruby_mvc/wx.rb +26 -0
  34. data/ruby_mvc.gemspec +37 -0
  35. data/sample/frame.rb +28 -0
  36. data/sample/mvc.rb +29 -0
  37. data/sample/test.html +118 -0
  38. data/sample/web_view.rb +34 -0
  39. data/test/unit/models/test_array_table_model.rb +56 -0
  40. data/test/unit/models/test_keyed_array_table_model.rb +54 -0
  41. data/test/unit/test_array_table_model.rb +38 -0
  42. metadata +107 -0
@@ -0,0 +1,85 @@
1
+ #--
2
+ ######################################################################
3
+ #
4
+ # Copyright 2011 Andrew S. Townley
5
+ #
6
+ # Permission to use, copy, modify, and disribute this software for
7
+ # any purpose with or without fee is hereby granted, provided that
8
+ # the above copyright notices and this permission notice appear in
9
+ # all copies.
10
+ #
11
+ # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL
12
+ # WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
13
+ # WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
14
+ # AUTHORS BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT OR
15
+ # CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
16
+ # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
17
+ # NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
18
+ # CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19
+ #
20
+ # File: views.rb
21
+ # Created: Sat 19 Nov 2011 11:28:08 GMT
22
+ #
23
+ #####################################################################
24
+ #++
25
+
26
+ module RubyMVC
27
+ module Views
28
+
29
+ class View
30
+ def self.widget_def(targ = nil)
31
+ if targ == nil
32
+ @widget_def
33
+ else
34
+ if (x = targ.widget_def).nil?
35
+ if targ != RubyMVC::Views::View
36
+ self.widget_def(targ.superclass)
37
+ end
38
+ else
39
+ x
40
+ end
41
+ end
42
+ end
43
+
44
+ def self.create_widget(klass)
45
+ w = self.widget_def(klass)
46
+ args = w[:args]
47
+ block = w[:block]
48
+ args[0].new(*args[1..-1], &block)
49
+ end
50
+
51
+ class << self
52
+ # This method is used to define the primary widget
53
+ # class through which this view may be added to other
54
+ # widgets.
55
+
56
+ def widget(*args, &block)
57
+ puts "Set widget for #{self}: #{args.inspect}"
58
+ @widget_def = { :args => args, :block => block }
59
+ end
60
+ end
61
+
62
+ def peer
63
+ @widget.peer
64
+ end
65
+
66
+ attr_accessor :controller, :widget
67
+ def initialize(*args)
68
+ @widget = View.create_widget(self.class)
69
+ if(options = args.last).is_a? Hash
70
+ self.controller = options[:controller]
71
+ end
72
+ end
73
+
74
+ def method_missing(m, *a, &b)
75
+ @widget.send(m, *a, &b)
76
+ end
77
+ end
78
+ end
79
+ end
80
+
81
+ #require 'ruby_mvc/views/table_view'
82
+ #require 'ruby_mvc/views/ar_model_editor'
83
+ #require 'ruby_mvc/views/ar_type_list'
84
+ #require 'ruby_mvc/views/ar_type_editor'
85
+ require 'ruby_mvc/views/web_view'
@@ -0,0 +1,84 @@
1
+ #--
2
+ ######################################################################
3
+ #
4
+ # Copyright 2011 Andrew S. Townley
5
+ #
6
+ # Permission to use, copy, modify, and disribute this software for
7
+ # any purpose with or without fee is hereby granted, provided that
8
+ # the above copyright notices and this permission notice appear in
9
+ # all copies.
10
+ #
11
+ # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL
12
+ # WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
13
+ # WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
14
+ # AUTHORS BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT OR
15
+ # CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
16
+ # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
17
+ # NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
18
+ # CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19
+ #
20
+ # File: ar_model_editor.rb
21
+ # Created: Sat 19 Nov 2011 11:26:37 GMT
22
+ #
23
+ #####################################################################
24
+ #++
25
+
26
+ module RubyMVC
27
+ module Views
28
+
29
+ # This class is responsible for building a form for the
30
+ # given ActiveRecord model
31
+
32
+ class ActiveRecordModelEditor < View
33
+ DEFAULTS = { :label_width => 0.3 }.freeze
34
+
35
+ def initialize(model, options = {}, &block)
36
+ super(options, &block)
37
+ load(model, options, &block)
38
+ end
39
+
40
+ # This method is used to load the view with the
41
+ # information in the AR model.
42
+
43
+ def load(model, options = {}, &block)
44
+ lwidth = options[:label_width] || DEFAULTS[:label_width]
45
+
46
+ stack :width => "100%" do
47
+ flow :width => "100%" do
48
+ model.attributes.keys.sort.each do |key|
49
+ # FIXME: I can't believe that you have to do this
50
+ # this way with AR. I'm surely missing
51
+ # something...
52
+ m = "#{key}=".to_sym
53
+ value = model.attributes[key]
54
+ flow :width => lwidth, :margin_top => 2 do
55
+ para key, :weight => 'bold', :align => "right"
56
+ end
57
+ flow :width => 1 - lwidth do
58
+ edit_line model.attributes[key] do |e|
59
+ model.send(m, e.text)
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+
66
+ @model = model
67
+ @options = options
68
+ end
69
+
70
+ def save
71
+ @model.save!
72
+ end
73
+
74
+ def create
75
+ if @model
76
+ load(@model.class.new, options)
77
+ else
78
+ alert("No template model.\nUse the #load method instead.")
79
+ end
80
+ end
81
+ end
82
+
83
+ end
84
+ end
@@ -0,0 +1,65 @@
1
+ #--
2
+ ######################################################################
3
+ #
4
+ # Copyright 2011 Andrew S. Townley
5
+ #
6
+ # Permission to use, copy, modify, and disribute this software for
7
+ # any purpose with or without fee is hereby granted, provided that
8
+ # the above copyright notices and this permission notice appear in
9
+ # all copies.
10
+ #
11
+ # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL
12
+ # WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
13
+ # WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
14
+ # AUTHORS BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT OR
15
+ # CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
16
+ # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
17
+ # NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
18
+ # CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19
+ #
20
+ # File: ar_type_editor.rb
21
+ # Created: Mon 21 Nov 2011 18:00:49 GMT
22
+ #
23
+ #####################################################################
24
+ #++
25
+
26
+ module RubyMVC
27
+ module Views
28
+
29
+ class ActiveRecordTypeEditor < View
30
+ include RubyMVC::LinkDispatcher
31
+
32
+ def initialize(type, options = {}, &block)
33
+ ctrl = options[:controller] = options[:controller] || self
34
+ super(options, &block)
35
+ @type = type
36
+ @list = active_record_type_list type
37
+ para link("New...") {
38
+ ctrl.link_activated(self, "/create_instance")
39
+ }
40
+ end
41
+
42
+ def create_instance(sender, link)
43
+ debug("create instance of type #{@type}")
44
+ obj = @type.new
45
+ window do
46
+ stack do
47
+ obj.description = "Some text"
48
+ editor = active_record_model_editor obj
49
+ flow :margin_left => 0, :left => "-25%" do
50
+ button "Cancel", :align => "right" do
51
+ close
52
+ end
53
+ button "Save", :align => "right" do
54
+ editor.save
55
+ close
56
+ end
57
+ debug("created buttons")
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+
64
+ end
65
+ end
@@ -0,0 +1,45 @@
1
+ #--
2
+ ######################################################################
3
+ #
4
+ # Copyright 2011 Andrew S. Townley
5
+ #
6
+ # Permission to use, copy, modify, and disribute this software for
7
+ # any purpose with or without fee is hereby granted, provided that
8
+ # the above copyright notices and this permission notice appear in
9
+ # all copies.
10
+ #
11
+ # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL
12
+ # WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
13
+ # WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
14
+ # AUTHORS BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT OR
15
+ # CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
16
+ # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
17
+ # NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
18
+ # CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19
+ #
20
+ # File: ar_type_list.rb
21
+ # Created: Mon 21 Nov 2011 15:57:27 GMT
22
+ #
23
+ #####################################################################
24
+ #++
25
+
26
+ module RubyMVC
27
+ module Views
28
+
29
+ class ActiveRecordTypeList < TableView
30
+ def load(model, options = {}, &block)
31
+ @entity_type = model
32
+ super(model.find(options[:query] || :all), options, &block)
33
+ end
34
+
35
+ def columns(model, options)
36
+ cols = []
37
+ @entity_type.attribute_names.each do |key|
38
+ cols << { :key => key, :label => key.capitalize }
39
+ end
40
+ cols
41
+ end
42
+ end
43
+
44
+ end
45
+ end
@@ -0,0 +1,96 @@
1
+ #--
2
+ ######################################################################
3
+ #
4
+ # Copyright 2011 Andrew S. Townley
5
+ #
6
+ # Permission to use, copy, modify, and disribute this software for
7
+ # any purpose with or without fee is hereby granted, provided that
8
+ # the above copyright notices and this permission notice appear in
9
+ # all copies.
10
+ #
11
+ # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL
12
+ # WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
13
+ # WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
14
+ # AUTHORS BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT OR
15
+ # CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
16
+ # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
17
+ # NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
18
+ # CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19
+ #
20
+ # File: table_view.rb
21
+ # Created: Sat 19 Nov 2011 20:14:33 GMT
22
+ #
23
+ #####################################################################
24
+ #++
25
+
26
+ module RubyMVC
27
+ module Views
28
+
29
+ # This class provides a basic TableView control based
30
+ # loosely on the Archistry JavaScript TreeGrid API. It
31
+ # requires that the data to be displayed be supplied as a
32
+ # TableModel instance.
33
+
34
+ class TableView < View
35
+ def initialize(model, options = {}, &block)
36
+ super(options, &block)
37
+ load(model, options, &block)
38
+ end
39
+
40
+ # This method is used to load the view with the
41
+ # information in the table model.
42
+
43
+ def load(model, options = {}, &block)
44
+ cols = columns(model, options)
45
+ defw = "#{100 / cols.size}%"
46
+ build_header(model, cols, defw, options)
47
+ stack(:width => "100%") do
48
+ model.each { |row| build_row(cols, row, defw) }
49
+ end
50
+ end
51
+
52
+ protected
53
+ # This method extracts or creates the column model for the
54
+ # view.
55
+
56
+ def columns(model, options)
57
+ if cols = options[:columns]
58
+ cols
59
+ else
60
+ cols = model.keys.collect do |k|
61
+ { :key => k.to_sym, :label => "#{k.capitalize}" }
62
+ end
63
+ end
64
+ end
65
+
66
+ def build_header(model, cols, defw, options)
67
+ if options[:headers] != false
68
+ stack(:width => "100%") do
69
+ flow do
70
+ cols.each do |col|
71
+ flow(:width => defw) do
72
+ para col[:label], :weight => "bold", :align => "center"
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
79
+
80
+ def build_row(cols, row, defw)
81
+ flow do
82
+ cols.each do |col|
83
+ flow(:width => defw) do
84
+ if(r = col[:renderer])
85
+ r.render(self, row, col)
86
+ else
87
+ para row[col[:key]], col[:style]
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
94
+
95
+ end
96
+ end
@@ -0,0 +1,65 @@
1
+ #--
2
+ ######################################################################
3
+ #
4
+ # Copyright 2011 Andrew S. Townley
5
+ #
6
+ # Permission to use, copy, modify, and disribute this software for
7
+ # any purpose with or without fee is hereby granted, provided that
8
+ # the above copyright notices and this permission notice appear in
9
+ # all copies.
10
+ #
11
+ # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL
12
+ # WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
13
+ # WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
14
+ # AUTHORS BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT OR
15
+ # CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
16
+ # LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
17
+ # NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
18
+ # CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19
+ #
20
+ # File: web_view.rb
21
+ # Created: Wed 23 Nov 2011 17:08:02 GMT
22
+ #
23
+ #####################################################################
24
+ #++
25
+
26
+ module RubyMVC
27
+ module Views
28
+
29
+ # This is a more sophisticated view control vs. the standard
30
+ # toolkit widget.
31
+
32
+ class WebView < View
33
+ widget Toolkit::WebView
34
+
35
+ # This method is used to load the view with the
36
+ # information in the table model.
37
+
38
+ def load(model, options = {}, &block)
39
+ cols = columns(model, options)
40
+ if r = options[:renderer]
41
+ html = r.render(model, cols, options[:renderer_options])
42
+ puts "HTML:\n#{html}"
43
+ widget.load_html(html)
44
+ else
45
+ raise ArgumentError,"renderer not specified"
46
+ end
47
+ end
48
+
49
+ protected
50
+ # This method extracts or creates the column model for the
51
+ # view.
52
+
53
+ def columns(model, options)
54
+ if cols = options[:columns]
55
+ cols
56
+ else
57
+ cols = model.keys.collect do |k|
58
+ { :key => k.to_sym, :label => "#{k.capitalize}" }
59
+ end
60
+ end
61
+ end
62
+ end
63
+
64
+ end
65
+ end