bowline 0.5.3 → 0.5.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. data/.gitignore +1 -0
  2. data/README.txt +62 -62
  3. data/Rakefile +10 -0
  4. data/TODO +3 -1
  5. data/VERSION +1 -1
  6. data/assets/bowline.js +118 -3
  7. data/bowline.gemspec +6 -6
  8. data/examples/example.js +2 -15
  9. data/examples/tweet.rb +35 -0
  10. data/examples/tweets_binder.rb +6 -0
  11. data/examples/twitter.html +6 -8
  12. data/examples/users.rb +8 -14
  13. data/lib/bowline/binders.rb +130 -42
  14. data/lib/bowline/dependencies/lib/dependencies.rb +2 -1
  15. data/lib/bowline/dependencies/lib/ext/rubygems.rb +4 -4
  16. data/lib/bowline/desktop.rb +11 -2
  17. data/lib/bowline/desktop/app.rb +7 -3
  18. data/lib/bowline/desktop/bridge.rb +8 -9
  19. data/lib/bowline/desktop/clipboard.rb +11 -2
  20. data/lib/bowline/desktop/dialog.rb +19 -0
  21. data/lib/bowline/desktop/dock.rb +14 -3
  22. data/lib/bowline/desktop/host.rb +13 -4
  23. data/lib/bowline/desktop/js.rb +2 -2
  24. data/lib/bowline/desktop/misc.rb +7 -3
  25. data/lib/bowline/desktop/network.rb +1 -1
  26. data/lib/bowline/desktop/proxy.rb +28 -30
  27. data/lib/bowline/desktop/sound.rb +3 -2
  28. data/lib/bowline/desktop/window.rb +147 -21
  29. data/lib/bowline/desktop/window_manager.rb +53 -5
  30. data/lib/bowline/desktop/window_methods.rb +2 -2
  31. data/lib/bowline/ext/object.rb +1 -1
  32. data/lib/bowline/generators.rb +1 -1
  33. data/lib/bowline/generators/binder.rb +1 -1
  34. data/lib/bowline/helpers.rb +1 -1
  35. data/lib/bowline/initializer.rb +37 -4
  36. data/lib/bowline/library.rb +11 -0
  37. data/lib/bowline/local_model.rb +45 -19
  38. data/lib/bowline/logging.rb +1 -1
  39. data/lib/bowline/platform.rb +8 -6
  40. data/lib/bowline/tasks/app.rake +4 -3
  41. data/lib/bowline/version.rb +1 -1
  42. data/lib/bowline/watcher.rb +18 -8
  43. data/templates/binder.rb +1 -1
  44. data/vendor/pathname.rb +0 -4
  45. metadata +6 -6
  46. data/examples/account.rb +0 -31
  47. data/examples/tweets.rb +0 -28
data/.gitignore CHANGED
@@ -1 +1,2 @@
1
1
  pkg
2
+ rdoc
data/README.txt CHANGED
@@ -4,7 +4,7 @@ http://github.com/maccman/bowline
4
4
 
5
5
  = DESCRIPTION
6
6
 
7
- Ruby desktop application framework
7
+ Ruby, HTML and JS desktop application framework.
8
8
 
9
9
  = FEATURES
10
10
 
@@ -12,7 +12,7 @@ Ruby desktop application framework
12
12
  * Uses Webkit
13
13
  * View in HTML/JavaScript
14
14
  * Binding between HTML & Ruby
15
- * Cross platform (only osx atm)
15
+ * Cross platform (only osx atm ;)
16
16
 
17
17
  = INTRODUCTION
18
18
 
@@ -39,13 +39,22 @@ info@eribium.org
39
39
  http://eribium.org
40
40
  http://twitter.com/maccman
41
41
 
42
- = INSTALLATION
42
+ = COMMUNITY
43
+
44
+ http://groups.google.com/group/bowline-dev
45
+
46
+ = REQUIREMENTS
43
47
 
44
- Install the Titanium SDK:
45
- http://www.appcelerator.com/products/download-titanium/download/
48
+ - Mac OSX (both Leopard & Snow Leopard)
49
+ - Ruby 1.9 (Ruby 1.8.6 is supported, but we recommend you use 1.9 since that's the version your application will be using when it's run).
50
+ - Bowline gem
51
+
52
+ The other required libraries, such as bowline-desktop, are downloaded later by Bowline - you don't need to worry about these.
53
+
54
+ = INSTALLATION
46
55
 
47
56
  Install the gem:
48
- >> sudo gem install maccman-bowline --source http://gems.github.com
57
+ >> sudo gem install bowline
49
58
 
50
59
  = USAGE
51
60
 
@@ -56,11 +65,12 @@ or browse the completed version here:
56
65
  = GENERATING
57
66
 
58
67
  Using the bowline-gen binary (installed with Bowline) you can generate the following things:
59
- app Generates a new application.
60
- binder Generates a new binder, either a collection one, or a singleton one.
61
- helper Generates a new helper.
62
- migration Generates a new database migration.
63
- model Generates a new model.
68
+ app
69
+ binder
70
+ helper
71
+ migration
72
+ model
73
+ window
64
74
 
65
75
  Run 'bowline-gen --help' for more information.
66
76
 
@@ -72,30 +82,24 @@ App console:
72
82
  Run application:
73
83
  >> script/run
74
84
 
75
- = BINDERS
76
-
77
- Binders are the core of Bowline, they're classes that you can bind HTML to.
78
- Binders contain data. If you modify the binder's data the HTML automatically updates.
79
- It's a one way relationship though.
85
+ Build package for distribution:
86
+ >> script/build
80
87
 
81
- You can think of binders as similar to controllers in Rails.
88
+ = BINDERS
82
89
 
83
- There are two types of binders, singleton and collection.
84
- Singleton binders are for a single data entity, such as the current logged in user.
85
- And it goes without saying that collection binders are for an array of data.
90
+ Binders are the core of Bowline. They're a model abstraction for the view which you can bind HTML to.
91
+ Binders in turn are associated with a Model. When the model gets changed, the binder makes sure that the HTML stays in sync.
86
92
 
87
- You can create a collection binder like this:
88
- >> bowline-gen binder users --type collection
93
+ You can create a binder like this:
94
+ >> bowline-gen binder users
89
95
 
90
96
  Which will generate code a bit like this:
91
- module Binders
92
- class Users < Bowline::Collection
93
- end
97
+ class UsersBinder < Bowline::Binders::Base
94
98
  end
95
99
 
96
100
  Now, in the view you can bind HTML to this collection, by
97
101
  using the following javascript:
98
- $('#users').bowline('users');
102
+ $('#users').bindto('users');
99
103
 
100
104
  You should probably become familiar with Chain.js (which bowline uses for binding): http://wiki.github.com/raid-ox/chain.js/
101
105
 
@@ -111,7 +115,7 @@ Suffice to say, the HTML looks a bit like this:
111
115
  Now, were you to have a user object, you could do something like
112
116
  this to update the HTML.
113
117
 
114
- Binders::Users.items = [User.first]
118
+ # TODO
115
119
 
116
120
  = METHODS IN BINDERS
117
121
 
@@ -124,7 +128,7 @@ $('#users').invoke('admins')
124
128
  It's the same syntax for invoking instance methods, just called
125
129
  on one of the individual users:
126
130
 
127
- $('#users div:first').invoke('instance_method', 'arg1')
131
+ $('#users div:first').invoke('instance_meth', 'arg1')
128
132
 
129
133
  = HELPERS
130
134
 
@@ -136,55 +140,53 @@ $.bowline.helper('name', 'arg1', ['arg2'])
136
140
 
137
141
  = MODELS
138
142
 
139
- Bowline supports ActiveRecord and the Sqlite3 database.
140
- The packaging for databases is still in development though.
143
+ Bowline supports ActiveRecord and the Sqlite3 database.
144
+ The packaging for distributing databases is still in development though.
145
+ Bowline also has a LocalModel class for models held in memory.
141
146
 
142
- = THEMES
147
+ = WINDOWS
143
148
 
144
- The Cappuccino Aristo theme has been specially customized for Bowline, you can see
145
- examples of it in the Twitter client, and find it here:
146
- http://github.com/maccman/aristo
149
+ Bowline lets you control your application's windows. The API is under Bowline::Desktop::Window.
150
+ There's a generator for creating new windows; they live under app/windows.
151
+ Every window lives under the MainWindow class. If the MainWindow is closed, the app exits.
147
152
 
148
- = TITANIUM
153
+ = BOWLINE-DESKTOP
149
154
 
150
- Bowline is built on top of Titanium, an open source cross platform framework for desktop apps.
151
- You can use any of the Titanium api methods in Ruby and JavaScript, like this:
152
- Titanium.UI.currentWindow.close
155
+ Bowline-desktop is an abstraction upon wxWidgets for Bowline. It gives your app access to numerous APIs & system features, such as the Clipboard, Dock, Speakers and Windows.
153
156
 
154
- Site: http://www.appcelerator.com/products/titanium-desktop/
155
- API Docs: http://www.codestrong.com/titanium/api/
157
+ The binary is built in C++, and statically linked with Ruby 1.9 and wxWidgets so it has no local dependencies. Compiling it isn't a requirement to use Bowline, but if you want to extend or contribute to Bowline-desktop, you can find it here:
158
+ http://github.com/maccman/bowline-desktop
156
159
 
157
- = BUILDING
160
+ = DISTRIBUTING
158
161
 
159
- Once your app is complete, you should run the following command
160
- to make sure all the gems required (including Bowline) have been vendorised:
162
+ Once your app is ready for a release, you should run the following command to make sure all the gems required have been vendorised:
161
163
  rake gems:sync
162
164
 
163
165
  Then, run:
164
- rake app
166
+ ./script/build
165
167
 
166
- You can only build distributions for your local platform, but
167
- using the Titanium Developer app you can build on all three platforms.
168
+ You can only build distributions for your local platform at the moment, but we're planning to extend this.
169
+
170
+ = THEMES
171
+
172
+ The Cappuccino Aristo theme has been specially customized for Bowline, you can see
173
+ examples of it in the Twitter client, and find it here:
174
+ http://github.com/maccman/aristo
168
175
 
169
176
  = EXAMPLES
170
177
 
171
178
  Usage for a collection (of users):
172
179
 
173
- module Binders
174
- class Users < Bowline::Collection
180
+ class Users < Bowline::Binders::Base
181
+ bind User
175
182
  # These are class methods
176
183
  # i.e. methods that appear on
177
184
  # users, rather an user
178
185
  class << self
179
- def index
180
- # self.items is a magic variable -
181
- # it'll update the html binders
182
- self.items = User.all
183
- end
184
-
185
186
  def admins
186
187
  # This just replaces all the listed
187
188
  # users with just admins
189
+ # TODO
188
190
  self.items = User.admins.all
189
191
  end
190
192
  end
@@ -201,7 +203,7 @@ Usage for a collection (of users):
201
203
  # an ActiveRecord instance
202
204
  #
203
205
  # self.page gives you access to the dom, e.g:
204
- # self.page.alert('hello world')
206
+ # self.page.alert('hello world').call
205
207
 
206
208
  def destroy
207
209
  self.item.destroy
@@ -220,7 +222,7 @@ Usage for a collection (of users):
220
222
  jQuery(function($){
221
223
  $.bowline.ready(function(){
222
224
  // Bind the element users to UserBinder
223
- var users = $('#users').bowline('users', function(){
225
+ var users = $('#users').bindto('users', function(){
224
226
  var self = $(this);
225
227
  self.find('.destroy').click(function(){
226
228
  self.invoke('destroy');
@@ -257,19 +259,17 @@ Usage for a collection (of users):
257
259
 
258
260
  = Building a basic Twitter client
259
261
 
260
- Install the Titanium SDK:
261
- http://www.appcelerator.com/products/download-titanium/download/
262
-
263
262
  Install the gem:
264
- >> sudo gem install maccman-bowline --source http://gems.github.com
263
+ >> sudo gem install bowline
265
264
 
266
265
  Run the app/binder generators:
267
266
  >> bowline-gen app bowline_twitter
268
267
  >> cd bowline_twitter
269
268
  >> bowline-gen binder tweets
270
269
 
271
- Copy tweets.rb from examples to app/binders/tweets.rb
272
- Add your Twitter credentials to tweets.rb - in this simple example they're not dynamic.
270
+ Copy tweets_binder.rb from examples to app/binders/tweets_binder.rb
271
+ Copy tweet.rb from examples to app/models/tweet.rb
272
+ Add your Twitter credentials to config/application.yml - in this simple example they're not dynamic.
273
273
 
274
274
  Copy twitter.html from examples to public/index.html
275
275
 
data/Rakefile CHANGED
@@ -18,4 +18,14 @@ end
18
18
  task :write_version do
19
19
  require File.join(File.dirname(__FILE__), *%w[lib bowline])
20
20
  File.open('VERSION', 'w') {|f| f.write Bowline::Version::STRING }
21
+ end
22
+
23
+ require 'rake/rdoctask'
24
+ desc "Generate documentation for Bowline."
25
+ Rake::RDocTask.new(:rdoc) do |rdoc|
26
+ rdoc.rdoc_dir = "rdoc"
27
+ rdoc.title = "Bowline"
28
+ rdoc.options << "--line-numbers" << "--inline-source"
29
+ rdoc.rdoc_files.include("README.txt")
30
+ rdoc.rdoc_files.include("lib/**/*.rb")
21
31
  end
data/TODO CHANGED
@@ -8,4 +8,6 @@ Investigate thread safety
8
8
 
9
9
  Load all required JS through Bowline (so you only have to require one JS file)
10
10
 
11
- Add --version to bowline-gen
11
+ Add --version to bowline-gen
12
+
13
+ Update bowline-twitter
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.5.3
1
+ 0.5.4
data/assets/bowline.js CHANGED
@@ -1,3 +1,118 @@
1
+ /*
2
+ Bowline JavaScript API
3
+
4
+ This library lets you call Ruby methods, and bind up elements.
5
+ It requires jQuery, Chain.js and json2:
6
+ http://jquery.com
7
+ http://github.com/raid-ox/chain.js
8
+ http://www.JSON.org/json2.js
9
+
10
+ = Functions
11
+
12
+ invoke(klass, method, *args)
13
+ Invoke a class method on a particular class. Usually
14
+ used to invoke methods on a binder. The class needs to
15
+ be exposed to JS (using the Bowline::Desktop::Bridge#js_expose).
16
+ Usage:
17
+ Bowline.invoke('MyClass', 'my_method');
18
+
19
+ instanceInvoke(klass, id, method, *args)
20
+ Invoke an instance method an a binder.
21
+ Usually called via the jQuery helper functions.
22
+ Usage:
23
+ Bowline.instanceInvoke('UsersBinder', 1, 'charge!');
24
+
25
+ windowInvoke(method, *args)
26
+ Invoke class method on this window's class.
27
+ Usage:
28
+ Bowline.windowInvoke('close');
29
+
30
+ helper(method, *args)
31
+ Invoke a method defined in any helper.
32
+
33
+ bindto(element, klass, options = {})
34
+ Bind a element to a Bowline binder.
35
+ Usually called via the jQuery helper functions.
36
+ Usage:
37
+ Bowline.bindto('#users', 'UsersBinder');
38
+
39
+ The options can either be a template hash:
40
+ {
41
+ '.name .first': {
42
+ style: 'color: blue;',
43
+ content: 'First Name: {first}'
44
+ },
45
+ '.name .last': 'Family Name: {last}',
46
+ '.address': function(data, el){
47
+ if(!data.address)
48
+ el.hide();
49
+ return data.address;
50
+ },
51
+ builder: function(){
52
+ var data = this.item();
53
+ this.find('.name').click(function(){alert(data.name)});
54
+ }
55
+ }
56
+
57
+ Or the options can be a builder function:
58
+ (function(){
59
+ this.bind('click', function(){
60
+ var data = this.item();
61
+ alert(data);
62
+ })
63
+
64
+ For more documentation, look at the Chain.js library:
65
+ http://wiki.github.com/raid-ox/chain.js/elementchain
66
+
67
+ = Filtering items
68
+
69
+ $('#users').items('filter', 'value');
70
+
71
+ = Sorting items
72
+
73
+ $('#users').items('sort', 'first_name');
74
+
75
+ = Update events
76
+
77
+ $('#users').update(function(){
78
+ //...
79
+ });
80
+
81
+ = JQuery functions
82
+
83
+ These are how you usually bind elements, or invoke a binders class/instance methods.
84
+
85
+ $.fn.bindto(klass, options)
86
+ Associate an an element with a Bowline binder.
87
+ Example:
88
+ $("#users").bindto('UsersBinder');
89
+
90
+ $.fn.invoke(method, *args)
91
+ Invoke a class/instance method on a Bowline binder.
92
+
93
+ If called on the bound element, in this example the #users div, then a class method
94
+ will be called on the binder.
95
+ Example:
96
+ $("#users").invoke("my_class_method", "arg1");
97
+
98
+ If called on a item inside a bound element, an instance method will be called.
99
+ Example:
100
+ $("#users").items(10).invoke("my_instance_method");
101
+
102
+ = Debugging
103
+
104
+ Turn on Bowline.trace to show debugging information:
105
+ Bowline.trace = true
106
+
107
+ = Using other libraries (e.g. Prototype)
108
+
109
+ Although this library requires jQuery, its API is not jQuery
110
+ specific. It's perfectly feasible to rewrite to use Prototype instead.
111
+ Additionally, jQuery plays nicely with other libraries using it's noConflict() method.
112
+ So you're still free to use other JavaScript libraries without fear of conflicts.
113
+
114
+ */
115
+
1
116
  var Bowline = {
2
117
  msgs: [],
3
118
  callbacks: {},
@@ -54,7 +169,7 @@ var Bowline = {
54
169
  Bowline.invoke(args);
55
170
  },
56
171
 
57
- bind: function(el, klass, options){
172
+ bindto: function(el, klass, options){
58
173
  el = jQuery(el);
59
174
  el.chain(options);
60
175
  el.data('bowline', klass);
@@ -182,10 +297,10 @@ var Bowline = {
182
297
  }
183
298
  };
184
299
 
185
- $.fn.bowline = function(){
300
+ $.fn.bindto = function(){
186
301
  var args = $.makeArray(arguments);
187
302
  args.unshift(this);
188
- Bowline.bind.apply(this, args);
303
+ Bowline.bindto.apply(this, args);
189
304
  };
190
305
  })(jQuery);
191
306
 
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.5.3"
8
+ s.version = "0.5.4"
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{2009-12-20}
12
+ s.date = %q{2009-12-22}
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}
@@ -35,9 +35,9 @@ Gem::Specification.new do |s|
35
35
  "assets/osx/makeicns",
36
36
  "bin/bowline-gen",
37
37
  "bowline.gemspec",
38
- "examples/account.rb",
39
38
  "examples/example.js",
40
- "examples/tweets.rb",
39
+ "examples/tweet.rb",
40
+ "examples/tweets_binder.rb",
41
41
  "examples/twitter.html",
42
42
  "examples/users.rb",
43
43
  "lib/bowline.rb",
@@ -125,8 +125,8 @@ Gem::Specification.new do |s|
125
125
  s.rubygems_version = %q{1.3.5}
126
126
  s.summary = %q{Bowline GUI framework}
127
127
  s.test_files = [
128
- "examples/account.rb",
129
- "examples/tweets.rb",
128
+ "examples/tweet.rb",
129
+ "examples/tweets_binder.rb",
130
130
  "examples/users.rb"
131
131
  ]
132
132
 
data/examples/example.js CHANGED
@@ -1,11 +1,4 @@
1
- $('#users').bowline('users_binder');
2
-
3
- var user = $('#users').items(10);
4
- user.update({name: 'Alex'}); // will automatiinvokey
5
- user.item().errors //=> []
6
-
7
- // Deletes item from DOM too
8
- item.destroy()
1
+ $('#users').bindto('UsersBinder');
9
2
 
10
3
  // invoke collection method
11
4
  // This will invoke UserBinder.admins and fill #users with admins
@@ -15,10 +8,4 @@ $('#users').invoke('admins');
15
8
  $('#users').items(10).invoke('charge!');
16
9
 
17
10
  // invoke charge! on every user
18
- $('#users').items().invoke('charge!')
19
-
20
- // // For binding over a http connection - an async invoke
21
- // // last argument is a function
22
- // $('#users').items(10).invoke('charge!', function(){
23
- //
24
- // })
11
+ $('#users').items().invoke('charge!')