nemo 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,63 @@
1
+ class Nemo::Visitors::Viewer < Nemo::Visitors::Visitor
2
+
3
+ def initialize(metaobject)
4
+ super
5
+ @viewer = true
6
+ end
7
+
8
+ def render
9
+ r.table { render_fields }
10
+ end
11
+
12
+ def render_fields
13
+ @metaobject.accept(self)
14
+ end
15
+
16
+ def render_label(a, &block)
17
+ r.table_row do
18
+ r.table_header(a.label)
19
+ r.table_data { block ? block.call : r.space }
20
+ end
21
+ end
22
+
23
+ def render_relationship_item(a, item)
24
+ return if item.nil?
25
+ text = a.format(item)
26
+ if a.link_action.nil?
27
+ r.encode_text(text)
28
+ else
29
+ r.anchor.callback{ a.link_action.call(item) }.with { r.encode_text(text) }
30
+ end
31
+ end
32
+
33
+ def visit_text_attribute(a)
34
+ render_label(a) { r.encode_text(a.formatted_value) }
35
+ end
36
+
37
+ def visit_password_attribute(a)
38
+ render_label(a) { r.text('********') }
39
+ end
40
+
41
+ def visit_date_attribute(a)
42
+ visit_text_attribute(a)
43
+ end
44
+
45
+ def visit_boolean_attribute(a)
46
+ visit_text_attribute(a)
47
+ end
48
+
49
+ def visit_multiple_attribute(a)
50
+ visit_multiple_relationship_attribute(a)
51
+ end
52
+
53
+ def visit_single_relationship_attribute(a)
54
+ render_label(a) { render_relationship_item(a, a.value) }
55
+ end
56
+
57
+ def visit_multiple_relationship_attribute(a)
58
+ render_label(a) do
59
+ a.value.each { |item| render_relationship_item(a, item); r.break }
60
+ end
61
+ end
62
+
63
+ end
@@ -0,0 +1,14 @@
1
+ class Nemo::Visitors::Visitor < Wee::Component
2
+
3
+ extend Nemo::Util::Accessors
4
+
5
+ attr_accessor :metaobject
6
+ bool_accessor :viewer
7
+
8
+ def initialize(metaobject)
9
+ super()
10
+ @metaobject = metaobject
11
+ @viewer = false
12
+ end
13
+
14
+ end
data/nemo.gemspec ADDED
@@ -0,0 +1,23 @@
1
+ require 'rubygems'
2
+
3
+ if File.read('lib/nemo.rb') =~ /Version\s+=\s+"(\d+\.\d+\.\d+)"/
4
+ version = $1
5
+ else
6
+ raise "no version"
7
+ end
8
+
9
+ spec = Gem::Specification.new do |s|
10
+ s.name = 'nemo'
11
+ s.version = version
12
+ s.summary = 'Ruby port of Mewa for Wee'
13
+ s.add_dependency('wee', '>= 0.3.1')
14
+
15
+ s.files = Dir['**/*'].delete_if {|item| item.include?(".svn") }
16
+
17
+ s.require_path = 'lib'
18
+
19
+ s.author = "Kevin Howe"
20
+ s.email = "kh@newclear.ca"
21
+ s.homepage = "nemo.rubyforge.org"
22
+ s.rubyforge_project = "nemo"
23
+ end
data/nemo_rdoc.bat ADDED
@@ -0,0 +1 @@
1
+ rdoc -m lib/nemo.rb -o nemodoc -a -S lib -A "call_accessor=RW:Call,bool_accessor=RW:Bool,proc_accessor=RW:Proc"
@@ -0,0 +1,14 @@
1
+ $LOAD_PATH.unshift('../lib')
2
+ require 'nemo'
3
+ require 'wee/adaptors/webrick'
4
+
5
+ app = Wee::Application.new { |app|
6
+ app.default_request_handler { Nemo::Examples::DatePicker::Session.new }
7
+ app.id_generator = Wee::SimpleIdGenerator.new(rand(1_000_000))
8
+ }
9
+
10
+ Wee::WEBrickAdaptor.
11
+ register('/app' => app).
12
+ start(:Port => 2000) { |server|
13
+ server.mount('/', WEBrick::HTTPServlet::FileHandler, './')
14
+ }
@@ -0,0 +1,26 @@
1
+ a {
2
+ text-decoration: none;
3
+ }
4
+ body {
5
+ font-size : 11px;
6
+ font-family : Arial, Helvetica, sans-serif;
7
+ text-align: center;
8
+ }
9
+ td {
10
+ font-family: Arial, Helvetica, sans-serif;
11
+ font-size: 11px;
12
+ border: 1px solid;
13
+ background-color: #FFFFFF;
14
+ vertical-align: top;
15
+ text-align: center;
16
+ }
17
+ th {
18
+ font-family: Arial, Helvetica, sans-serif;
19
+ font-size: 11px;
20
+ font-style: normal;
21
+ font-weight: bold;
22
+ background-color: #BBCCFF;
23
+ border: 1px solid;
24
+ vertical-align: top;
25
+ text-align: center;
26
+ }
Binary file
@@ -0,0 +1,40 @@
1
+ a:link, a:active, a:visited {
2
+ color: blue
3
+ }
4
+ body {
5
+ font-size : 12px;
6
+ font-family : Arial, Helvetica, sans-serif;
7
+ }
8
+ td {
9
+ font-family: Arial, Helvetica, sans-serif;
10
+ font-size: 12px;
11
+ background-color: #BBCCFF;
12
+ border: 1px solid;
13
+ vertical-align: top;
14
+ padding: 2px;
15
+ }
16
+ th {
17
+ font-family: Arial, Helvetica, sans-serif;
18
+ font-size: 12px;
19
+ font-style: normal;
20
+ font-weight: bold;
21
+ background-color: #FFFFFF;
22
+ border: 1px solid;
23
+ vertical-align: top;
24
+ padding: 2px;
25
+ }
26
+ input {
27
+ font-family: Arial, Helvetica, sans-serif;
28
+ font-size: 12px;
29
+ font-style: normal;
30
+ font-weight: bold;
31
+ background-color: #FFFFFF;
32
+ border: 1px solid;
33
+ vertical-align: top;
34
+ }
35
+ select, text, textarea {
36
+ font-family: Arial, Helvetica, sans-serif;
37
+ font-size: 12px;
38
+ font-style: normal;
39
+ font-weight: normal;
40
+ }
@@ -0,0 +1,14 @@
1
+ $LOAD_PATH.unshift('../lib')
2
+ require 'nemo'
3
+ require 'wee/adaptors/webrick'
4
+
5
+ app = Wee::Application.new { |app|
6
+ app.default_request_handler { Nemo::Examples::PersonEditor::Session.new }
7
+ app.id_generator = Wee::SimpleIdGenerator.new(rand(1_000_000))
8
+ }
9
+
10
+ Wee::WEBrickAdaptor.
11
+ register('/app' => app).
12
+ start(:Port => 2000) { |server|
13
+ server.mount('/', WEBrick::HTTPServlet::FileHandler, './')
14
+ }
data/test/unit_test.rb ADDED
@@ -0,0 +1,128 @@
1
+ # Need many more tests, use ZenTest?
2
+
3
+ $LOAD_PATH.unshift('../lib')
4
+ require 'test/unit'
5
+ require 'nemo'
6
+
7
+ module Nemo::Test
8
+
9
+ module_function
10
+
11
+ def person(hash=Hash.new)
12
+ obj = Nemo::Examples::PersonEditor::Person.new
13
+ hash.each { |k,v| obj.send(k.to_s+'=', v) }
14
+ obj
15
+ end
16
+
17
+ end
18
+
19
+ class Nemo::Test::Accessors < Test::Unit::TestCase
20
+
21
+ def test_accessor()
22
+ demo = Class.new
23
+ demo.extend(Nemo::Util::Accessors)
24
+ demo.class_eval { call_accessor(:age) }
25
+ demo.class_eval { bool_accessor(:married) }
26
+ demo.class_eval { proc_accessor(:multiply) }
27
+ d = demo.new
28
+ assert_equal(true, d.respond_to?(:married))
29
+ assert_equal(true, d.respond_to?(:married?))
30
+ assert_equal(true, d.respond_to?(:married=))
31
+ assert_equal(true, d.respond_to?(:age))
32
+ assert_equal(true, d.respond_to?(:age=))
33
+ assert_equal(true, d.respond_to?(:multiply))
34
+ assert_equal(true, d.respond_to?(:multiply=))
35
+ d.married = true
36
+ assert_equal(true, d.married?)
37
+ d.married = false
38
+ assert_equal(false, d.married?)
39
+ d.married(true)
40
+ assert_equal(true, d.married?)
41
+ d.age(5)
42
+ assert_equal(5, d.age)
43
+ d.multiply { |n| n*100 }
44
+ assert_equal(500, d.multiply.call(d.age))
45
+ end
46
+
47
+ end
48
+
49
+ class Nemo::Test::ObjectCollector < Test::Unit::TestCase
50
+
51
+ def collect(*args, &block)
52
+ Nemo::Util::ObjectCollector.collect(*args, &block)
53
+ end
54
+
55
+ def test_collect()
56
+ assert_raise(IndexError) { collect { no_objects_yet } }
57
+ assert_raise(NoMethodError) { collect { o Object.new; invalid_message } }
58
+ assert_equal(3, begin collect { o Object.new; o Object.new; o Object.new }.size rescue nil end)
59
+ assert_equal('bar', begin collect { o Object.new; instance_variable_set('@foo', 'bar') }[0].instance_variable_get('@foo') rescue nil end)
60
+ end
61
+
62
+ end
63
+
64
+ class Nemo::Test::AttributeCollector < Test::Unit::TestCase
65
+
66
+ def test_collect()
67
+ ac = Nemo::MetaObject::AttributeCollector.new(Nemo::Test.person.metaobject)
68
+ assert_equal(ac[:text, :name].class, Nemo::MetaObject::TextAttribute)
69
+ ac << ac[:text, :name]
70
+ assert_equal(ac.collect[0].class, Nemo::MetaObject::TextAttribute)
71
+ end
72
+
73
+ end
74
+
75
+ class Nemo::Test::Attribute < Test::Unit::TestCase
76
+
77
+ def test_value()
78
+ p = Nemo::Test.person(:name=>'Joe', :sex=>true, :birthday=>Date.new(1950, 1, 1))
79
+ b = p.metaobject[:birthday]
80
+ assert_equal(b.value, Date.new(1950,1,1))
81
+ assert_equal(b.formatted_value, 'Jan 01, 1950')
82
+ b.format_with { |value| sprintf('%s-%s-%s',value.day,value.month,value.year) }
83
+ assert_equal('1-1-1950', b.formatted_value)
84
+ end
85
+
86
+ def test_multiple()
87
+ p = Nemo::Test.person(:name=>'Joe', :sex=>true, :birthday=>Date.new(1950, 1, 1))
88
+ pn = p.metaobject[:phone_numbers]
89
+ assert_equal(true, pn.multiple_attribute?)
90
+ n = p.metaobject[:name]
91
+ assert_equal(false, n.multiple_attribute?)
92
+ end
93
+
94
+ end
95
+
96
+ class Nemo::Test::Util < Test::Unit::TestCase
97
+
98
+ def test_pascal_case
99
+ assert_equal(Nemo::Util.pascal_case('ruby_case'), 'RubyCase')
100
+ assert_equal(Nemo::Util.pascal_case('camelCase'), 'CamelCase')
101
+ assert_equal(Nemo::Util.pascal_case('PascalCase'), 'PascalCase')
102
+ end
103
+
104
+ def test_to_bool()
105
+ assert_equal(false, Nemo::Util.to_bool(nil))
106
+ end
107
+
108
+ end
109
+
110
+ class Nemo::Test::MetaObject < Test::Unit::TestCase
111
+
112
+ def test_validate()
113
+ p = Nemo::Test.person(:name=>'Joe', :sex=>true, :birthday=>Date.new(1950, 1, 1)).metaobject
114
+ p.refresh_cache
115
+ assert_equal(true, p.validate.empty?)
116
+ end
117
+
118
+ def test_hidden()
119
+ m = Nemo.metaobject_for(self) { text :name; label 'Name' }
120
+ name = m[:name]
121
+ assert_equal('Name', name.label)
122
+ assert_equal(false, name.hidden?)
123
+ m.hide!(:name)
124
+ assert_equal(true, name.hidden?)
125
+ end
126
+
127
+ end
128
+
metadata ADDED
@@ -0,0 +1,86 @@
1
+ --- !ruby/object:Gem::Specification
2
+ rubygems_version: 0.8.1
3
+ specification_version: 1
4
+ name: nemo
5
+ version: !ruby/object:Gem::Version
6
+ version: 0.1.0
7
+ date: 2005-01-11
8
+ summary: Ruby port of Mewa for Wee
9
+ require_paths:
10
+ - lib
11
+ author: Kevin Howe
12
+ email: kh@newclear.ca
13
+ homepage: nemo.rubyforge.org
14
+ rubyforge_project: nemo
15
+ description:
16
+ autorequire:
17
+ default_executable:
18
+ bindir: bin
19
+ has_rdoc: false
20
+ required_ruby_version: !ruby/object:Gem::Version::Requirement
21
+ requirements:
22
+ -
23
+ - ">"
24
+ - !ruby/object:Gem::Version
25
+ version: 0.0.0
26
+ version:
27
+ platform: ruby
28
+ files:
29
+ - test
30
+ - lib
31
+ - nemo_rdoc.bat
32
+ - nemo.gemspec
33
+ - README
34
+ - INSTALL
35
+ - test/date_picker.rb
36
+ - test/person_editor.rb
37
+ - test/nemo
38
+ - test/unit_test.rb
39
+ - test/nemo/calendar.gif
40
+ - test/nemo/calendar.css
41
+ - test/nemo/person_editor.css
42
+ - lib/nemo
43
+ - lib/nemo.rb
44
+ - lib/nemo/visitors
45
+ - lib/nemo/components
46
+ - lib/nemo/metaobject
47
+ - lib/nemo/util
48
+ - lib/nemo/examples
49
+ - lib/nemo/metaobject.rb
50
+ - lib/nemo/examples.rb
51
+ - lib/nemo/visitors.rb
52
+ - lib/nemo/components.rb
53
+ - lib/nemo/util.rb
54
+ - lib/nemo/visitors/visitor.rb
55
+ - lib/nemo/visitors/editor.rb
56
+ - lib/nemo/visitors/viewer.rb
57
+ - lib/nemo/components/confirm.rb
58
+ - lib/nemo/components/calendar.rb
59
+ - lib/nemo/components/multiattr.rb
60
+ - lib/nemo/metaobject/metaobject.rb
61
+ - lib/nemo/metaobject/validation.rb
62
+ - lib/nemo/metaobject/attributes.rb
63
+ - lib/nemo/metaobject/acollector.rb
64
+ - lib/nemo/util/date.rb
65
+ - lib/nemo/util/blankslate.rb
66
+ - lib/nemo/util/accessors.rb
67
+ - lib/nemo/util/collector.rb
68
+ - lib/nemo/examples/date_picker.rb
69
+ - lib/nemo/examples/person_editor.rb
70
+ test_files: []
71
+ rdoc_options: []
72
+ extra_rdoc_files: []
73
+ executables: []
74
+ extensions: []
75
+ requirements: []
76
+ dependencies:
77
+ - !ruby/object:Gem::Dependency
78
+ name: wee
79
+ version_requirement:
80
+ version_requirements: !ruby/object:Gem::Version::Requirement
81
+ requirements:
82
+ -
83
+ - ">="
84
+ - !ruby/object:Gem::Version
85
+ version: 0.3.1
86
+ version: