bowline 0.6.3 → 0.9.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.txt +8 -4
- data/Rakefile +3 -2
- data/TODO +1 -4
- data/VERSION +1 -1
- data/assets/application.js +0 -0
- data/assets/bowline.chain.js +87 -0
- data/assets/bowline.js +144 -300
- data/assets/superclass.js +93 -0
- data/bowline.gemspec +11 -12
- data/examples/example.js +1 -1
- data/examples/twitter.html +1 -2
- data/lib/bowline/app_config.rb +11 -1
- data/lib/bowline/binders.rb +31 -12
- data/lib/bowline/desktop/bridge.rb +1 -1
- data/lib/bowline/desktop/js.rb +3 -3
- data/lib/bowline/desktop/window.rb +3 -3
- data/lib/bowline/desktop/window_manager.rb +7 -2
- data/lib/bowline/desktop/window_methods.rb +1 -1
- data/lib/bowline/generators.rb +45 -13
- data/lib/bowline/generators/application.rb +6 -4
- data/lib/bowline/generators/model.rb +1 -6
- data/lib/bowline/initializer.rb +8 -16
- data/lib/bowline/tasks/app.rake +11 -2
- data/lib/bowline/version.rb +2 -2
- data/templates/Gemfile +1 -2
- data/templates/config/boot.rb +3 -2
- data/templates/model.rb +1 -3
- data/templates/public/index.html +3 -2
- metadata +25 -13
- data/assets/animations.css +0 -92
- data/assets/bowline.menu.js +0 -81
- data/assets/bowline.state.js +0 -66
- data/assets/bowline.test.js +0 -86
- data/assets/bowline.view.js +0 -108
- data/assets/jquery.dataset.js +0 -167
- data/assets/json2.js +0 -479
@@ -0,0 +1,93 @@
|
|
1
|
+
var SuperClass = function(parent){
|
2
|
+
var result = function(){
|
3
|
+
this.init.apply(this, arguments);
|
4
|
+
};
|
5
|
+
|
6
|
+
result.prototype.init = function(){};
|
7
|
+
|
8
|
+
if (parent){
|
9
|
+
for(var i in parent){
|
10
|
+
result[i] = SuperClass.clone(parent[i]);
|
11
|
+
}
|
12
|
+
|
13
|
+
for(var i in parent.prototype){
|
14
|
+
result.prototype[i] = SuperClass.clone(parent.prototype[i]);
|
15
|
+
}
|
16
|
+
|
17
|
+
result.parent = parent;
|
18
|
+
result.prototype.parent = parent.prototype;
|
19
|
+
|
20
|
+
result._super = function(){
|
21
|
+
var parent = this.parent;
|
22
|
+
|
23
|
+
var key = this.findProperty(arguments.callee.caller);
|
24
|
+
var method = parent[key];
|
25
|
+
|
26
|
+
if (!method) return;
|
27
|
+
|
28
|
+
var oldParent = parent;
|
29
|
+
var oldFindProperty = this.findProperty;
|
30
|
+
|
31
|
+
// In case parent method calls super
|
32
|
+
this.findProperty = $.proxy(this.findProperty, parent);
|
33
|
+
this.parent = parent.parent;
|
34
|
+
var value = method.apply(this, arguments);
|
35
|
+
|
36
|
+
// Reset functions refs
|
37
|
+
this.findProperty = oldFindProperty;
|
38
|
+
this.parent = oldParent;
|
39
|
+
|
40
|
+
return value;
|
41
|
+
};
|
42
|
+
result.prototype._super = result._super;
|
43
|
+
}
|
44
|
+
|
45
|
+
result.fn = result.prototype;
|
46
|
+
result.fn._class = result;
|
47
|
+
|
48
|
+
result.findProperty = function(val){
|
49
|
+
for(var key in this)
|
50
|
+
if(this[key] == val) return key;
|
51
|
+
};
|
52
|
+
result.fn.findProperty = result.findProperty;
|
53
|
+
|
54
|
+
result.extend = function(obj){
|
55
|
+
var extended = obj.extended;
|
56
|
+
delete obj.extended;
|
57
|
+
for(var i in obj){
|
58
|
+
result[i] = obj[i];
|
59
|
+
}
|
60
|
+
|
61
|
+
if (extended) extended(result)
|
62
|
+
};
|
63
|
+
|
64
|
+
result.include = function(obj){
|
65
|
+
var included = obj.included;
|
66
|
+
delete obj.included;
|
67
|
+
for(var i in obj){
|
68
|
+
result.fn[i] = obj[i];
|
69
|
+
}
|
70
|
+
|
71
|
+
if (included) included(result)
|
72
|
+
};
|
73
|
+
|
74
|
+
result.aliasMethod = function(newName, oldName){
|
75
|
+
this[newName] = this[oldName];
|
76
|
+
};
|
77
|
+
result.fn.aliasMethod = result.aliasMethod;
|
78
|
+
|
79
|
+
result.aliasMethodChain = function(method, name){
|
80
|
+
this.aliasMethod(method + "Without" + name, method);
|
81
|
+
this.aliasMethod(method, method + "With" + name);
|
82
|
+
};
|
83
|
+
result.fn.aliasMethodChain = result.aliasMethodChain;
|
84
|
+
|
85
|
+
return result;
|
86
|
+
};
|
87
|
+
|
88
|
+
SuperClass.clone = function(obj){
|
89
|
+
if (typeof obj == "function") return obj;
|
90
|
+
if (typeof obj != "object") return obj;
|
91
|
+
if (jQuery.isArray(obj)) return jQuery.extend([], obj);
|
92
|
+
return jQuery.extend({}, obj);
|
93
|
+
};
|
data/bowline.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{bowline}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.9.1"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Alex MacCaw"]
|
12
|
-
s.date = %q{2010-
|
12
|
+
s.date = %q{2010-05-21}
|
13
13
|
s.default_executable = %q{bowline-gen}
|
14
14
|
s.description = %q{Ruby/JS GUI framework}
|
15
15
|
s.email = %q{alex@leadthinking.com}
|
@@ -26,19 +26,15 @@ Gem::Specification.new do |s|
|
|
26
26
|
"Rakefile",
|
27
27
|
"TODO",
|
28
28
|
"VERSION",
|
29
|
-
"assets/
|
29
|
+
"assets/application.js",
|
30
|
+
"assets/bowline.chain.js",
|
30
31
|
"assets/bowline.js",
|
31
|
-
"assets/bowline.menu.js",
|
32
|
-
"assets/bowline.state.js",
|
33
|
-
"assets/bowline.test.js",
|
34
|
-
"assets/bowline.view.js",
|
35
32
|
"assets/jquery.chain.js",
|
36
|
-
"assets/jquery.dataset.js",
|
37
33
|
"assets/jquery.js",
|
38
|
-
"assets/json2.js",
|
39
34
|
"assets/osx/Info.plist.erb",
|
40
35
|
"assets/osx/bowline.png",
|
41
36
|
"assets/osx/makeicns",
|
37
|
+
"assets/superclass.js",
|
42
38
|
"bin/bowline-gen",
|
43
39
|
"bowline.gemspec",
|
44
40
|
"examples/example.js",
|
@@ -150,18 +146,21 @@ Gem::Specification.new do |s|
|
|
150
146
|
s.add_runtime_dependency(%q<templater>, [">= 0.3.2"])
|
151
147
|
s.add_runtime_dependency(%q<activesupport>, [">= 3.0.0.beta"])
|
152
148
|
s.add_runtime_dependency(%q<rubyzip2>, [">= 2.0.1"])
|
153
|
-
s.add_runtime_dependency(%q<
|
149
|
+
s.add_runtime_dependency(%q<bundler08>, [">= 0.8.5"])
|
150
|
+
s.add_runtime_dependency(%q<supermodel>, [">= 0.1.3"])
|
154
151
|
else
|
155
152
|
s.add_dependency(%q<templater>, [">= 0.3.2"])
|
156
153
|
s.add_dependency(%q<activesupport>, [">= 3.0.0.beta"])
|
157
154
|
s.add_dependency(%q<rubyzip2>, [">= 2.0.1"])
|
158
|
-
s.add_dependency(%q<
|
155
|
+
s.add_dependency(%q<bundler08>, [">= 0.8.5"])
|
156
|
+
s.add_dependency(%q<supermodel>, [">= 0.1.3"])
|
159
157
|
end
|
160
158
|
else
|
161
159
|
s.add_dependency(%q<templater>, [">= 0.3.2"])
|
162
160
|
s.add_dependency(%q<activesupport>, [">= 3.0.0.beta"])
|
163
161
|
s.add_dependency(%q<rubyzip2>, [">= 2.0.1"])
|
164
|
-
s.add_dependency(%q<
|
162
|
+
s.add_dependency(%q<bundler08>, [">= 0.8.5"])
|
163
|
+
s.add_dependency(%q<supermodel>, [">= 0.1.3"])
|
165
164
|
end
|
166
165
|
end
|
167
166
|
|
data/examples/example.js
CHANGED
data/examples/twitter.html
CHANGED
@@ -6,12 +6,11 @@
|
|
6
6
|
<link rel="stylesheet" href="stylesheets/application.css" type="text/css" charset="utf-8">
|
7
7
|
<script src="javascripts/jquery.js" type="text/javascript" charset="utf-8"></script>
|
8
8
|
<script src="javascripts/jquery.chain.js" type="text/javascript" charset="utf-8"></script>
|
9
|
-
<script src="javascripts/json2.js" type="text/javascript" charset="utf-8"></script>
|
10
9
|
<script src="javascripts/bowline.js" type="text/javascript" charset="utf-8"></script>
|
11
10
|
<script src="javascripts/application.js" type="text/javascript" charset="utf-8"></script>
|
12
11
|
<script type="text/javascript" charset="utf-8">
|
13
12
|
jQuery(function($){
|
14
|
-
var tweets = $('#tweets').
|
13
|
+
var tweets = $('#tweets').bowlineChain('TweetsBinder');
|
15
14
|
|
16
15
|
$('#updateSubmit').click(function(){
|
17
16
|
tweets.invoke('update', $('#updateText').val());
|
data/lib/bowline/app_config.rb
CHANGED
@@ -9,15 +9,25 @@ module Bowline
|
|
9
9
|
@instance ||= create
|
10
10
|
end
|
11
11
|
|
12
|
-
def marshal_records(record
|
12
|
+
def marshal_records=(record)
|
13
13
|
self.instance.load(record.attributes) if record
|
14
14
|
self.instance
|
15
15
|
end
|
16
16
|
|
17
|
+
def marshal_records
|
18
|
+
self.instance
|
19
|
+
end
|
20
|
+
|
17
21
|
def load!(path)
|
18
22
|
self.instance.load_path(path)
|
19
23
|
self.instance
|
20
24
|
end
|
25
|
+
|
26
|
+
def reset!
|
27
|
+
@instance = nil
|
28
|
+
end
|
29
|
+
alias_method :destroy_all, :reset!
|
30
|
+
alias_method :delete_all, :reset!
|
21
31
|
end
|
22
32
|
|
23
33
|
def load_path(path)
|
data/lib/bowline/binders.rb
CHANGED
@@ -55,6 +55,17 @@ module Bowline
|
|
55
55
|
# </script>
|
56
56
|
#
|
57
57
|
# For more documentation on Bowline's JavaScript API, see bowline.js
|
58
|
+
|
59
|
+
def active(binder = nil) #:nodoc:
|
60
|
+
@active ||= []
|
61
|
+
if binder
|
62
|
+
@active << binder
|
63
|
+
@active.uniq!
|
64
|
+
end
|
65
|
+
@active
|
66
|
+
end
|
67
|
+
module_function :active
|
68
|
+
|
58
69
|
class Base
|
59
70
|
extend Bowline::Watcher::Base
|
60
71
|
extend Bowline::Desktop::Bridge::ClassMethods
|
@@ -66,11 +77,11 @@ module Bowline
|
|
66
77
|
if block_given?
|
67
78
|
Thread.new(callback_proc) do |proc|
|
68
79
|
begin
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
80
|
+
self.callback_proc = proc
|
81
|
+
yield
|
82
|
+
rescue => e
|
83
|
+
Bowline::Logging.log_error(e)
|
84
|
+
end
|
74
85
|
end
|
75
86
|
else
|
76
87
|
methods.each do |method|
|
@@ -89,7 +100,7 @@ module Bowline
|
|
89
100
|
include Async
|
90
101
|
class << self; extend Async; end
|
91
102
|
|
92
|
-
class << self
|
103
|
+
class << self
|
93
104
|
def callback_proc(proc = nil) #:nodoc:
|
94
105
|
Thread.current[:callback] = proc if proc
|
95
106
|
Thread.current[:callback]
|
@@ -115,19 +126,27 @@ module Bowline
|
|
115
126
|
end
|
116
127
|
|
117
128
|
# An array of window currently bound.
|
118
|
-
def windows
|
129
|
+
def windows(window = nil)
|
119
130
|
@windows ||= []
|
131
|
+
if window
|
132
|
+
@windows << window
|
133
|
+
@windows.uniq!
|
134
|
+
end
|
135
|
+
@windows
|
120
136
|
end
|
121
137
|
|
122
138
|
def setup(window) #:nodoc:
|
123
|
-
self
|
124
|
-
|
125
|
-
|
126
|
-
self.items = initial_items
|
127
|
-
end
|
139
|
+
Binders.active(self)
|
140
|
+
windows(window)
|
141
|
+
populate
|
128
142
|
callback(true)
|
129
143
|
end
|
130
144
|
|
145
|
+
# Populate initial items
|
146
|
+
def populate(items = initial)
|
147
|
+
self.items = items if items
|
148
|
+
end
|
149
|
+
|
131
150
|
# Called by a window's JavaScript whenever that window is bound to this Binder.
|
132
151
|
# This method populates the window's HTML with all bound class' records.
|
133
152
|
# Override this if you don't want to send all the class' records to the window.
|
@@ -74,7 +74,7 @@ module Bowline
|
|
74
74
|
object = klass.constantize
|
75
75
|
end
|
76
76
|
|
77
|
-
|
77
|
+
debug "JS invoking: #{klass}.#{method_name}(#{args.join(',')})"
|
78
78
|
|
79
79
|
if object.respond_to?(:js_exposed?) &&
|
80
80
|
object.js_exposed?(method_name)
|
data/lib/bowline/desktop/js.rb
CHANGED
@@ -20,7 +20,7 @@ module Bowline
|
|
20
20
|
|
21
21
|
def call
|
22
22
|
if Desktop.enabled?
|
23
|
-
|
23
|
+
debug "JS eval on #{window}: #{script}"
|
24
24
|
if multiple_windows?
|
25
25
|
windows.each {|w| w.run_script(script) }
|
26
26
|
raise "Can't return from multiple windows" if prok
|
@@ -30,7 +30,7 @@ module Bowline
|
|
30
30
|
end
|
31
31
|
result
|
32
32
|
else
|
33
|
-
|
33
|
+
debug "Pseudo JS eval on #{window}: #{script}"
|
34
34
|
prok.call(nil) if prok
|
35
35
|
end
|
36
36
|
end
|
@@ -51,7 +51,7 @@ module Bowline
|
|
51
51
|
JSON.parse(str)
|
52
52
|
end
|
53
53
|
rescue => e
|
54
|
-
|
54
|
+
debug "Parsing: #{str}"
|
55
55
|
raise e
|
56
56
|
end
|
57
57
|
end
|
@@ -63,9 +63,9 @@ module Bowline
|
|
63
63
|
# Internal ID for the window.
|
64
64
|
|
65
65
|
##
|
66
|
-
# :singleton-method:
|
67
|
-
# Returns true if the window has been
|
68
|
-
# Calling methods on
|
66
|
+
# :singleton-method: deallocated?
|
67
|
+
# Returns true if the window has been deallocated.
|
68
|
+
# Calling methods on deallocated windows has no effect.
|
69
69
|
# Instead, you'll need to create a new instance.
|
70
70
|
|
71
71
|
##
|
@@ -49,7 +49,11 @@ module Bowline
|
|
49
49
|
end
|
50
50
|
|
51
51
|
def allocated?
|
52
|
-
|
52
|
+
!deallocated?
|
53
|
+
end
|
54
|
+
|
55
|
+
def deallocated?
|
56
|
+
!@window || @window.deallocated?
|
53
57
|
end
|
54
58
|
|
55
59
|
# Call this method to allocate a new window.
|
@@ -57,7 +61,7 @@ module Bowline
|
|
57
61
|
# or after it has been closed.
|
58
62
|
def setup!
|
59
63
|
return unless Desktop.enabled?
|
60
|
-
return if
|
64
|
+
return if allocated?
|
61
65
|
if self.name == "MainWindow"
|
62
66
|
@window = MainWindow.get
|
63
67
|
else
|
@@ -69,6 +73,7 @@ module Bowline
|
|
69
73
|
Bowline::Desktop::Bridge.call(self, str)
|
70
74
|
}
|
71
75
|
@window.script_callback = @script_callback
|
76
|
+
true
|
72
77
|
end
|
73
78
|
|
74
79
|
# Evaluate JavaScript in this window. Pass
|
data/lib/bowline/generators.rb
CHANGED
@@ -6,23 +6,22 @@ module Templater
|
|
6
6
|
module Actions
|
7
7
|
class Touch < Action
|
8
8
|
|
9
|
-
def initialize(generator,
|
10
|
-
self.generator
|
11
|
-
self.name = name
|
9
|
+
def initialize(generator, destination, options={})
|
10
|
+
self.generator = generator
|
12
11
|
self.destination = destination
|
13
|
-
self.options
|
12
|
+
self.options = options
|
14
13
|
end
|
15
14
|
|
16
15
|
def render
|
17
16
|
''
|
18
17
|
end
|
19
|
-
|
18
|
+
|
20
19
|
def exists?
|
21
|
-
|
20
|
+
false
|
22
21
|
end
|
23
22
|
|
24
23
|
def identical?
|
25
|
-
|
24
|
+
false
|
26
25
|
end
|
27
26
|
|
28
27
|
def invoke!
|
@@ -30,12 +29,39 @@ module Templater
|
|
30
29
|
::FileUtils.touch(destination)
|
31
30
|
callback(:after)
|
32
31
|
end
|
32
|
+
|
33
|
+
end # Touch
|
33
34
|
|
34
|
-
|
35
|
-
|
35
|
+
class Chmod < Action
|
36
|
+
|
37
|
+
attr_accessor :mode
|
38
|
+
|
39
|
+
def initialize(generator, destination, options={})
|
40
|
+
self.generator = generator
|
41
|
+
self.destination = destination
|
42
|
+
self.options = options
|
43
|
+
self.mode = self.options[:mode] || 0755
|
36
44
|
end
|
37
45
|
|
38
|
-
|
46
|
+
def render
|
47
|
+
''
|
48
|
+
end
|
49
|
+
|
50
|
+
def exists?
|
51
|
+
false
|
52
|
+
end
|
53
|
+
|
54
|
+
def identical?
|
55
|
+
false
|
56
|
+
end
|
57
|
+
|
58
|
+
def invoke!
|
59
|
+
callback(:before)
|
60
|
+
::FileUtils.chmod_R(self.mode, destination)
|
61
|
+
callback(:after)
|
62
|
+
end
|
63
|
+
|
64
|
+
end # Chmod
|
39
65
|
end # Actions
|
40
66
|
end # Templater
|
41
67
|
|
@@ -64,9 +90,15 @@ module Bowline
|
|
64
90
|
"#!/usr/bin/env #{RbConfig::CONFIG["RUBY_INSTALL_NAME"]}"
|
65
91
|
end
|
66
92
|
|
67
|
-
def self.touch(
|
68
|
-
empty_directories << Templater::ActionDescription.new(
|
69
|
-
Templater::Actions::Touch.new(generator,
|
93
|
+
def self.touch(destination, options = {})
|
94
|
+
empty_directories << Templater::ActionDescription.new("touch") do |generator|
|
95
|
+
Templater::Actions::Touch.new(generator, destination, options)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def self.chmod(destination, options = {})
|
100
|
+
files << Templater::ActionDescription.new("chmod") do |generator|
|
101
|
+
Templater::Actions::Chmod.new(generator, destination, options)
|
70
102
|
end
|
71
103
|
end
|
72
104
|
|