lustr-core 0.1.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.
@@ -0,0 +1,59 @@
1
+ =begin
2
+ This file is part of Lustr (http://rubyforge.org/projects/lustr).
3
+
4
+ Copyright (c) 2007 Mark L. Murphy.
5
+
6
+ Lustr is free software; you can redistribute it and/or modify it under the
7
+ terms of the GNU General Public License as published by the Free Software
8
+ Foundation; either version 2 of the License.
9
+
10
+ Lustr is distributed in the hope that it will be useful, but WITHOUT ANY
11
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
12
+ FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
13
+ details. This file is included in the Ruby gem as License.txt.
14
+ =end
15
+
16
+ module Lustr
17
+ def self.declare(builder)
18
+ add_dsl_handler builder.widget_type, builder
19
+ end
20
+
21
+ def self.defaults(sym)
22
+ Lustr::Defaults.send(sym)
23
+ end
24
+
25
+ def self.add_dsl_handler(sym, builder)
26
+ @builders ||= {}
27
+ @builders[sym]=builder
28
+ builder.type=sym if builder.respond_to?(:type=)
29
+ DSL.add_dsl_method sym
30
+ end
31
+
32
+ def self.get_builder_klass(sym)
33
+ return @builders[sym]
34
+ end
35
+
36
+ def self.run
37
+ require ARGV[1]
38
+
39
+ self.execute(ARGV[0])
40
+ end
41
+
42
+ def self.execute(script)
43
+ results=ParseContext.new
44
+ runtime=Runtime.new
45
+ dsl=DSL.new(results, runtime)
46
+ dsl.involve(script)
47
+ runtime.show(results)
48
+ end
49
+
50
+ def self.generate(options)
51
+ results=ParseContext.new
52
+ generator_klass=options[:generator]
53
+ generator=generator_klass.new(options)
54
+ dsl=DSL.new(results, generator)
55
+ dsl.involve(options[:script])
56
+ generator.generate(results)
57
+ end
58
+ end
59
+
@@ -0,0 +1,45 @@
1
+ =begin
2
+ This file is part of Lustr (http://rubyforge.org/projects/lustr).
3
+
4
+ Copyright (c) 2007 Mark L. Murphy.
5
+
6
+ Lustr is free software; you can redistribute it and/or modify it under the
7
+ terms of the GNU General Public License as published by the Free Software
8
+ Foundation; either version 2 of the License.
9
+
10
+ Lustr is distributed in the hope that it will be useful, but WITHOUT ANY
11
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
12
+ FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
13
+ details. This file is included in the Ruby gem as License.txt.
14
+ =end
15
+
16
+ module Lustr
17
+ class EvalContext
18
+ def initialize
19
+ @gadget_stack=[]
20
+ end
21
+
22
+ def current_gadget
23
+ @gadget_stack.last
24
+ end
25
+
26
+ def for_gadget(gadget, callable)
27
+ @gadget_stack.push gadget
28
+
29
+ begin
30
+ callable.call
31
+ ensure
32
+ @gadget_stack.pop if @gadget_stack.size>1
33
+ end
34
+ end
35
+
36
+ def init_gadget(gadget, builder)
37
+ # mostly for subclasses
38
+ end
39
+
40
+ def is_runtime?
41
+ false
42
+ end
43
+ end
44
+ end
45
+
@@ -0,0 +1,103 @@
1
+ =begin
2
+ This file is part of Lustr (http://rubyforge.org/projects/lustr).
3
+
4
+ Copyright (c) 2007 Mark L. Murphy.
5
+
6
+ Lustr is free software; you can redistribute it and/or modify it under the
7
+ terms of the GNU General Public License as published by the Free Software
8
+ Foundation; either version 2 of the License.
9
+
10
+ Lustr is distributed in the hope that it will be useful, but WITHOUT ANY
11
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
12
+ FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
13
+ details. This file is included in the Ruby gem as License.txt.
14
+ =end
15
+
16
+ require File.join(File.dirname(__FILE__), 'widget')
17
+
18
+ module Lustr
19
+ class Gadget < BlankSlate
20
+ include WidgetBase
21
+
22
+ attr_reader :widgets, :parent_widget, :builder
23
+ attr_reader :controller
24
+
25
+ def initialize(builder, parent_widget=nil, ctlr=NullController, options={})
26
+ @builder=builder
27
+ @widgets={}
28
+ @parent_widget=parent_widget
29
+ self.controller=ctlr
30
+ end
31
+
32
+ def controller=(thing)
33
+ @controller=(thing ? thing : NullController.new)
34
+ @controller=thing.new if thing.kind_of?(Class)
35
+ controller.gadget=self if controller
36
+ end
37
+
38
+ def resolve
39
+ return children[0].resolve if children.size>0
40
+ return super
41
+ end
42
+
43
+ def resolve_parent
44
+ return parent_widget
45
+ end
46
+
47
+ def show
48
+ children.each do |child|
49
+ child.show
50
+ end
51
+ end
52
+
53
+ def generate(ctxt)
54
+ if parent_widget
55
+ contents(ctxt)
56
+ else
57
+ children.each do |child|
58
+ child.generate(ctxt)
59
+ end
60
+ end
61
+ end
62
+
63
+ def contents(ctxt)
64
+ ctxt.build_gadget_ref(self)
65
+ end
66
+
67
+ def method_missing(sym, *args)
68
+ result=widgets[sym.to_s]
69
+
70
+ return result if result
71
+ return super
72
+ end
73
+ end
74
+
75
+ class GadgetBuilder < BuilderBase
76
+ attr_accessor :controller
77
+
78
+ def initialize(options={})
79
+ super(nil, options)
80
+ @controller=options[:controller]
81
+ end
82
+
83
+ def dup_from(options)
84
+ myself=self.dup
85
+ myself.options=options
86
+ myself.controller=controller
87
+
88
+ return myself
89
+ end
90
+
91
+ def build_all(eval_context, parent_widget=nil)
92
+ gadget=super
93
+ eval_context.init_gadget gadget, self
94
+
95
+ return gadget
96
+ end
97
+
98
+ def build(parent_widget)
99
+ return Gadget.new(self, parent_widget, controller, options)
100
+ end
101
+ end
102
+ end
103
+
@@ -0,0 +1,81 @@
1
+ =begin
2
+ This file is part of Lustr (http://rubyforge.org/projects/lustr).
3
+
4
+ Copyright (c) 2007 Mark L. Murphy.
5
+
6
+ Lustr is free software; you can redistribute it and/or modify it under the
7
+ terms of the GNU General Public License as published by the Free Software
8
+ Foundation; either version 2 of the License.
9
+
10
+ Lustr is distributed in the hope that it will be useful, but WITHOUT ANY
11
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
12
+ FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
13
+ details. This file is included in the Ruby gem as License.txt.
14
+ =end
15
+
16
+ module Lustr
17
+ class Generator < EvalContext
18
+ attr_reader :options, :parse_context
19
+
20
+ def initialize(options)
21
+ super()
22
+ @options=options
23
+ end
24
+
25
+ def generate(parse_context)
26
+ @parse_context=parse_context
27
+
28
+ parse_context.gadget_builders.each_pair do |name, builder|
29
+ if name
30
+ base=name
31
+ dir=options[:gadget_dir] || options[:dir]
32
+ ext=options[:gadget_ext] || options[:extension]
33
+ ctxt=create_gadget_context(base)
34
+ else
35
+ base=options[:default_name] || 'application'
36
+ dir=options[:dir]
37
+ ext=options[:extension]
38
+ ctxt=create_context(base)
39
+ end
40
+
41
+ builder.build_all(self).generate(ctxt)
42
+ generate_builder(builder, dir, base, ext, options, ctxt)
43
+ end
44
+
45
+ generate_extra_files(options[:dir])
46
+ end
47
+
48
+ def generate_builder(builder, dir, base, ext, options, ctxt)
49
+ FileUtils.mkdir_p(dir)
50
+ path=File::join(dir, base+ext)
51
+
52
+ File.open(path, "w") do |aFile|
53
+ aFile.puts ctxt.to_s
54
+ end
55
+
56
+ if options[:script_extension]
57
+ path=File::join(dir, '_'+base+options[:script_extension])
58
+
59
+ if !File::exists?(path)
60
+ File.open(path, "w") do |aFile|
61
+ aFile.puts ""
62
+ end
63
+ end
64
+ end
65
+ end
66
+
67
+ def create_context(name)
68
+ # for overridding in subclasses, required
69
+ raise Exception('Lustr::Generator#create_context must be overridden!')
70
+ end
71
+
72
+ def create_gadget_context(name)
73
+ return create_context(name) # override if gadgets need separate context
74
+ end
75
+
76
+ def generate_extra_files(dir)
77
+ # for overridding in subclasses, optional
78
+ end
79
+ end
80
+ end
81
+
@@ -0,0 +1,58 @@
1
+ =begin
2
+ This file is part of Lustr (http://rubyforge.org/projects/lustr).
3
+
4
+ Copyright (c) 2007 Mark L. Murphy.
5
+
6
+ Lustr is free software; you can redistribute it and/or modify it under the
7
+ terms of the GNU General Public License as published by the Free Software
8
+ Foundation; either version 2 of the License.
9
+
10
+ Lustr is distributed in the hope that it will be useful, but WITHOUT ANY
11
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
12
+ FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
13
+ details. This file is included in the Ruby gem as License.txt.
14
+ =end
15
+
16
+ module Lustr
17
+ class ParseContext
18
+ attr_reader :gadget_builders
19
+
20
+ def initialize
21
+ @gadget_builders={}
22
+ @builder_stack=[]
23
+ builder=GadgetBuilder.new
24
+ gadget_builders[nil]=builder
25
+ @builder_stack.push builder
26
+ end
27
+
28
+ def current_builder
29
+ @builder_stack.last
30
+ end
31
+
32
+ def add_builder(name, options)
33
+ current=current_builder
34
+ builder_klass=Lustr.get_builder_klass(name)
35
+
36
+ if builder_klass.kind_of?(Class)
37
+ child=builder_klass.new(options)
38
+ else
39
+ child=builder_klass.dup_from(options)
40
+ end
41
+
42
+ current << child
43
+ attach_builder(child) { yield if block_given? }
44
+ end
45
+
46
+ def attach_builder(builder, name=nil)
47
+ @builder_stack.push builder
48
+ gadget_builders[name]=builder if name && builder.kind_of?(GadgetBuilder)
49
+ yield if block_given?
50
+ @builder_stack.pop
51
+ end
52
+
53
+ def handle_event(name, callable)
54
+ current_builder.event_handlers[name]=callable
55
+ end
56
+ end
57
+ end
58
+
@@ -0,0 +1,41 @@
1
+ =begin
2
+ This file is part of Lustr (http://rubyforge.org/projects/lustr).
3
+
4
+ Copyright (c) 2007 Mark L. Murphy.
5
+
6
+ Lustr is free software; you can redistribute it and/or modify it under the
7
+ terms of the GNU General Public License as published by the Free Software
8
+ Foundation; either version 2 of the License.
9
+
10
+ Lustr is distributed in the hope that it will be useful, but WITHOUT ANY
11
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
12
+ FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
13
+ details. This file is included in the Ruby gem as License.txt.
14
+ =end
15
+
16
+ module Lustr
17
+ class Runtime < EvalContext
18
+ def initialize
19
+ super
20
+ end
21
+
22
+ def show(parse_context)
23
+ root=parse_context.gadget_builders[nil].build_all(self)
24
+
25
+ root.show
26
+ end
27
+
28
+ def init_gadget(gadget, builder)
29
+ super
30
+ end
31
+
32
+ def attach_controller()
33
+ # mostly for subclasses
34
+ end
35
+
36
+ def is_runtime?
37
+ true
38
+ end
39
+ end
40
+ end
41
+
@@ -0,0 +1,24 @@
1
+ =begin
2
+ This file is part of Lustr (http://rubyforge.org/projects/lustr).
3
+
4
+ Copyright (c) 2007 Mark L. Murphy.
5
+
6
+ Lustr is free software; you can redistribute it and/or modify it under the
7
+ terms of the GNU General Public License as published by the Free Software
8
+ Foundation; either version 2 of the License.
9
+
10
+ Lustr is distributed in the hope that it will be useful, but WITHOUT ANY
11
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
12
+ FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
13
+ details. This file is included in the Ruby gem as License.txt.
14
+ =end
15
+
16
+ module Lustr #:nodoc:
17
+ module VERSION #:nodoc:
18
+ MAJOR = 0
19
+ MINOR = 1
20
+ TINY = 0
21
+
22
+ STRING = [MAJOR, MINOR, TINY].join('.')
23
+ end
24
+ end
@@ -0,0 +1,103 @@
1
+ =begin
2
+ This file is part of Lustr (http://rubyforge.org/projects/lustr).
3
+
4
+ Copyright (c) 2007 Mark L. Murphy.
5
+
6
+ Lustr is free software; you can redistribute it and/or modify it under the
7
+ terms of the GNU General Public License as published by the Free Software
8
+ Foundation; either version 2 of the License.
9
+
10
+ Lustr is distributed in the hope that it will be useful, but WITHOUT ANY
11
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
12
+ FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
13
+ details. This file is included in the Ruby gem as License.txt.
14
+ =end
15
+
16
+ require 'erb'
17
+ require 'rubygems'
18
+ require 'builder'
19
+
20
+ module Lustr
21
+ module WidgetBase
22
+ attr_accessor :name, :eval_context, :gadget, :label, :parent
23
+ attr_reader :options
24
+
25
+ def children
26
+ @children||=[]
27
+ @children
28
+ end
29
+
30
+ def <<(child)
31
+ _add(child)
32
+ end
33
+
34
+ def _add(child)
35
+ children << child
36
+ child.parent=self
37
+ end
38
+
39
+ def resolve
40
+ return self
41
+ end
42
+
43
+ def resolve_parent
44
+ return self
45
+ end
46
+
47
+ def init_options(options)
48
+ @options=options
49
+ end
50
+
51
+ def option(name)
52
+ return options[name]
53
+ end
54
+
55
+ def controller=(thing)
56
+ gadget.controller=thing
57
+ end
58
+
59
+ def raise_event(expr, event=nil)
60
+ if expr
61
+ if expr.kind_of?(Proc)
62
+ expr.call(event, gadget)
63
+ elsif expr.kind_of?(Symbol)
64
+ gadget.controller.send(expr, event) if gadget.controller
65
+ else
66
+ gadget.controller.instance_eval(expr) if gadget.controller
67
+ end
68
+ end
69
+ end
70
+
71
+ def to_s
72
+ return label if label
73
+ return super
74
+ end
75
+ end
76
+
77
+ class XmlBasedWidget
78
+ include WidgetBase
79
+ end
80
+
81
+ class TemplatedWidget
82
+ include WidgetBase
83
+
84
+ def generate(ctxt)
85
+ ctxt << contents(ctxt)
86
+ end
87
+
88
+ def contents(ctxt)
89
+ ERB.new(template).result(binding)
90
+ end
91
+
92
+ def children_contents(ctxt)
93
+ result=''
94
+
95
+ children.each do |child|
96
+ result+=child.contents(ctxt)+"\n" if child.respond_to?(:contents)
97
+ end
98
+
99
+ return(result)
100
+ end
101
+ end
102
+ end
103
+