bowline 0.4.6 → 0.5.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.
- data/Rakefile +1 -0
- data/TODO +11 -0
- data/VERSION +1 -1
- data/assets/bowline.js +194 -0
- data/assets/json2.js +479 -0
- data/assets/osx/Info.plist.erb +45 -0
- data/assets/osx/bowline.png +0 -0
- data/assets/osx/makeicns +0 -0
- data/bowline.gemspec +47 -11
- data/lib/bowline.rb +35 -15
- data/lib/bowline/binders.rb +168 -131
- data/lib/bowline/commands/build.rb +3 -0
- data/lib/bowline/commands/generate.rb +3 -1
- data/lib/bowline/commands/run.rb +7 -4
- data/lib/bowline/desktop.rb +26 -0
- data/lib/bowline/desktop/app.rb +9 -0
- data/lib/bowline/desktop/bridge.rb +97 -0
- data/lib/bowline/desktop/clipboard.rb +9 -0
- data/lib/bowline/desktop/dialog.rb +28 -0
- data/lib/bowline/desktop/dock.rb +9 -0
- data/lib/bowline/desktop/host.rb +10 -0
- data/lib/bowline/desktop/js.rb +92 -0
- data/lib/bowline/desktop/misc.rb +9 -0
- data/lib/bowline/desktop/network.rb +7 -0
- data/lib/bowline/desktop/proxy.rb +94 -0
- data/lib/bowline/desktop/sound.rb +8 -0
- data/lib/bowline/desktop/window.rb +31 -0
- data/lib/bowline/desktop/window_manager.rb +72 -0
- data/lib/bowline/desktop/window_methods.rb +70 -0
- data/lib/bowline/generators.rb +3 -2
- data/lib/bowline/generators/application.rb +8 -5
- data/lib/bowline/generators/binder.rb +10 -6
- data/lib/bowline/generators/model.rb +9 -0
- data/lib/bowline/generators/window.rb +28 -0
- data/lib/bowline/helpers.rb +0 -3
- data/lib/bowline/initializer.rb +65 -11
- data/lib/bowline/library.rb +31 -0
- data/lib/bowline/local_model.rb +116 -0
- data/lib/bowline/logging.rb +23 -0
- data/lib/bowline/platform.rb +73 -0
- data/lib/bowline/tasks/app.rake +80 -148
- data/lib/bowline/tasks/libs.rake +59 -0
- data/lib/bowline/version.rb +2 -2
- data/lib/bowline/watcher.rb +91 -0
- data/templates/binder.rb +2 -8
- data/templates/config/environment.rb +3 -2
- data/templates/main_window.rb +7 -0
- data/templates/model.rb +1 -1
- data/templates/public/index.html +2 -1
- data/templates/script/build +3 -0
- data/templates/script/generate +3 -0
- data/templates/script/init +0 -16
- data/templates/window.rb +3 -0
- data/vendor/pathname.rb +1099 -0
- data/vendor/progressbar.rb +236 -0
- metadata +48 -9
- data/assets/jquery.bowline.js +0 -156
- data/lib/bowline/async.rb +0 -29
- data/lib/bowline/binders/collection.rb +0 -59
- data/lib/bowline/binders/singleton.rb +0 -31
- data/lib/bowline/jquery.rb +0 -31
- data/lib/bowline/observer.rb +0 -66
- data/lib/bowline/window.rb +0 -19
@@ -0,0 +1,72 @@
|
|
1
|
+
module Bowline
|
2
|
+
module Desktop
|
3
|
+
class WindowManager
|
4
|
+
extend Bridge::ClassMethods
|
5
|
+
js_expose
|
6
|
+
|
7
|
+
extend Bowline::Watcher::Base
|
8
|
+
watch :on_load
|
9
|
+
|
10
|
+
class << self
|
11
|
+
def windows
|
12
|
+
subclasses.map(&:constantize)
|
13
|
+
end
|
14
|
+
|
15
|
+
def shown_windows
|
16
|
+
windows.select(&:shown?)
|
17
|
+
end
|
18
|
+
|
19
|
+
def allocated_windows
|
20
|
+
windows.select(&:allocated?)
|
21
|
+
end
|
22
|
+
|
23
|
+
# Methods for subclasses:
|
24
|
+
|
25
|
+
def window
|
26
|
+
@window
|
27
|
+
end
|
28
|
+
|
29
|
+
def allocated?
|
30
|
+
!!@window
|
31
|
+
end
|
32
|
+
|
33
|
+
def setup
|
34
|
+
return unless Desktop.enabled?
|
35
|
+
return if @window && !@window.dealocated?
|
36
|
+
if self.name == "MainWindow"
|
37
|
+
@window = MainWindow.get
|
38
|
+
else
|
39
|
+
@window = Window.new
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def eval(*args, &block)
|
44
|
+
JS.eval(window, *args, &block)
|
45
|
+
end
|
46
|
+
|
47
|
+
def page
|
48
|
+
Proxy.new(window)
|
49
|
+
end
|
50
|
+
|
51
|
+
def loaded?
|
52
|
+
@loaded
|
53
|
+
end
|
54
|
+
|
55
|
+
def loaded! # :nodoc:
|
56
|
+
@loaded = true
|
57
|
+
watcher.call(:on_load)
|
58
|
+
true
|
59
|
+
end
|
60
|
+
|
61
|
+
# Delegate most methods to Window
|
62
|
+
def method_missing(sym, *args)
|
63
|
+
if window && window.respond_to?(sym)
|
64
|
+
return window.send(sym, *args)
|
65
|
+
end
|
66
|
+
# Window won't be around if Bowline::Desktop isn't enabled
|
67
|
+
Bowline::Desktop.enabled? ? super : nil
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
module Bowline
|
2
|
+
module Desktop
|
3
|
+
module WindowMethods
|
4
|
+
def center(direction = nil)
|
5
|
+
direction =
|
6
|
+
case direction
|
7
|
+
when :both then Window::BOTH
|
8
|
+
when :horizontal then Window::HORIZONTAL
|
9
|
+
when :vertical then Window::VERTICAL
|
10
|
+
when :center then Window::CENTRE_ON_SCREEN
|
11
|
+
else
|
12
|
+
Window::BOTH
|
13
|
+
end
|
14
|
+
_center(direction)
|
15
|
+
end
|
16
|
+
|
17
|
+
def file=(path)
|
18
|
+
if path.is_a?(Symbol)
|
19
|
+
path = File.join(APP_ROOT, "public", path.to_s)
|
20
|
+
end
|
21
|
+
if File.extname(path).blank?
|
22
|
+
path += ".html"
|
23
|
+
end
|
24
|
+
path = File.expand_path(path, APP_ROOT)
|
25
|
+
self._file = path
|
26
|
+
end
|
27
|
+
alias :load_file :file=
|
28
|
+
|
29
|
+
def select_dir(options = {})
|
30
|
+
flags = 0
|
31
|
+
flags |= Window::FD_OPEN if options[:open]
|
32
|
+
flags |= Window::FD_SAVE if options[:save]
|
33
|
+
flags |= Window::FD_OVERWRITE_PROMPT if options[:overwrite_prompt]
|
34
|
+
flags |= Window::FD_FILE_MUST_EXIST if options[:file_must_exist]
|
35
|
+
_select_dir(
|
36
|
+
options[:message],
|
37
|
+
options[:default_path],
|
38
|
+
options[:default_filename],
|
39
|
+
options[:default_extension],
|
40
|
+
options[:wildcard],
|
41
|
+
flags
|
42
|
+
)
|
43
|
+
end
|
44
|
+
|
45
|
+
def select_dir(options = {})
|
46
|
+
_select_dir(options[:message], options[:default_path])
|
47
|
+
end
|
48
|
+
|
49
|
+
def width=(w)
|
50
|
+
set_size(w, -1)
|
51
|
+
end
|
52
|
+
|
53
|
+
def height=(h)
|
54
|
+
set_size(h, -1)
|
55
|
+
end
|
56
|
+
|
57
|
+
# Window was shut; setup!
|
58
|
+
# needs to be called again
|
59
|
+
def dealocated?
|
60
|
+
id == -1
|
61
|
+
end
|
62
|
+
|
63
|
+
# The methods won't exist on window
|
64
|
+
# if Bowline::Desktop isn't enabled
|
65
|
+
def method_missing(sym, *args)
|
66
|
+
Bowline::Desktop.enabled? ? raise : nil
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
data/lib/bowline/generators.rb
CHANGED
@@ -55,6 +55,7 @@ end
|
|
55
55
|
|
56
56
|
require "bowline/generators/application"
|
57
57
|
require "bowline/generators/binder"
|
58
|
-
require "bowline/generators/model"
|
59
58
|
require "bowline/generators/helper"
|
60
|
-
require "bowline/generators/migration"
|
59
|
+
require "bowline/generators/migration"
|
60
|
+
require "bowline/generators/model"
|
61
|
+
require "bowline/generators/window"
|
@@ -40,16 +40,19 @@ module Bowline::Generators
|
|
40
40
|
|
41
41
|
glob! "script"
|
42
42
|
|
43
|
-
file :jquery, "../assets/jquery.js",
|
44
|
-
file :chainjs, "../assets/jquery.chain.js",
|
45
|
-
file :
|
43
|
+
file :jquery, "../assets/jquery.js", "public/javascripts/jquery.js"
|
44
|
+
file :chainjs, "../assets/jquery.chain.js", "public/javascripts/jquery.chain.js"
|
45
|
+
file :json2js, "../assets/json2.js", "public/javascripts/json2.js"
|
46
|
+
file :bowlinejs, "../assets/bowline.js", "public/javascripts/bowline.js"
|
46
47
|
|
47
48
|
empty_directory :app, "app"
|
48
49
|
empty_directory :models, "app/models"
|
49
50
|
empty_directory :binders, "app/binders"
|
50
|
-
empty_directory :
|
51
|
-
empty_directory :
|
51
|
+
empty_directory :helpers, "app/helpers"
|
52
|
+
empty_directory :windows, "app/windows"
|
53
|
+
file :mainwindow, "main_window.rb", "app/windows"
|
52
54
|
|
55
|
+
empty_directory :config, "config"
|
53
56
|
template :environment, "config/environment.rb", "config/environment.rb"
|
54
57
|
["application.yml", "database.yml", "boot.rb"].each {|action|
|
55
58
|
action = File.join('config', action)
|
@@ -1,20 +1,24 @@
|
|
1
1
|
module Bowline::Generators
|
2
2
|
class BinderGenerator < NamedGenerator
|
3
3
|
desc <<-DESC
|
4
|
-
Generates a new binder
|
4
|
+
Generates a new binder.
|
5
5
|
DESC
|
6
6
|
|
7
|
+
alias :plain_class_name :class_name
|
7
8
|
def class_name
|
8
|
-
super + " < Bowline::Binders
|
9
|
+
super + "Binder < Bowline::Binders::Base"
|
9
10
|
end
|
10
11
|
|
11
|
-
def
|
12
|
-
|
12
|
+
def expose_name
|
13
|
+
plain_class_name.singularize
|
13
14
|
end
|
14
15
|
|
15
|
-
|
16
|
-
|
16
|
+
def file_name
|
17
|
+
super + "_binder"
|
18
|
+
end
|
17
19
|
|
20
|
+
first_argument :name, :required => true, :desc => "binder name"
|
21
|
+
|
18
22
|
template :binder do |template|
|
19
23
|
template.source = "binder.rb"
|
20
24
|
template.destination = "app/binders/#{file_name}.rb"
|
@@ -4,11 +4,20 @@ module Bowline::Generators
|
|
4
4
|
Generates a new model.
|
5
5
|
DESC
|
6
6
|
|
7
|
+
def class_name
|
8
|
+
if local
|
9
|
+
super + " < Bowline::LocalModel"
|
10
|
+
else
|
11
|
+
super + " < ActiveRecord::Base"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
7
15
|
def modules
|
8
16
|
[]
|
9
17
|
end
|
10
18
|
|
11
19
|
first_argument :name, :required => true, :desc => "model name"
|
20
|
+
second_argument :local, :required => false
|
12
21
|
|
13
22
|
template :model do |template|
|
14
23
|
template.source = "model.rb"
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Bowline::Generators
|
2
|
+
class WindowGenerator < NamedGenerator
|
3
|
+
desc <<-DESC
|
4
|
+
Generates a new window.
|
5
|
+
DESC
|
6
|
+
|
7
|
+
def modules
|
8
|
+
[]
|
9
|
+
end
|
10
|
+
|
11
|
+
def class_name
|
12
|
+
"#{self.name.camel_case}Window"
|
13
|
+
end
|
14
|
+
|
15
|
+
def file_name
|
16
|
+
"#{name}_window"
|
17
|
+
end
|
18
|
+
|
19
|
+
first_argument :name, :required => true, :desc => "window name"
|
20
|
+
|
21
|
+
template :helper do |template|
|
22
|
+
template.source = "window.rb"
|
23
|
+
template.destination = "app/windows/#{file_name}.rb"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
add :window, WindowGenerator
|
28
|
+
end
|
data/lib/bowline/helpers.rb
CHANGED
data/lib/bowline/initializer.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'logger'
|
2
|
-
require 'set'
|
3
1
|
require 'pathname'
|
4
2
|
|
5
3
|
module Bowline
|
@@ -60,6 +58,27 @@ module Bowline
|
|
60
58
|
@loaded_plugins = []
|
61
59
|
end
|
62
60
|
|
61
|
+
def initialize_ruby
|
62
|
+
ruby_path = File.join(configuration.rubylib_path)
|
63
|
+
unless File.directory?(ruby_path)
|
64
|
+
ruby_path = Bowline::Library.rubylib_path
|
65
|
+
return unless File.directory?(ruby_path)
|
66
|
+
end
|
67
|
+
version = Library::RUBY_LIB_VERSION
|
68
|
+
platform = Library::RUBY_ARCHLIB_PLATFORM
|
69
|
+
$: << File.join(ruby_path, version) # RUBY_LIB
|
70
|
+
$: << File.join(ruby_path, version, platform) # RUBY_ARCHLIB
|
71
|
+
$: << File.join(ruby_path, "site_path") # RUBY_SITE_LIB
|
72
|
+
$: << File.join(ruby_path, "site_path", version) # RUBY_SITE_LIB2
|
73
|
+
$: << File.join(ruby_path, "site_ruby", version, platform) # RUBY_SITE_ARCHLIB
|
74
|
+
$: << File.join(ruby_path, "vendor_ruby") # RUBY_VENDOR_LIB
|
75
|
+
$: << File.join(ruby_path, "vendor_ruby", version) # RUBY_VENDOR_LIB2
|
76
|
+
$: << File.join(ruby_path, "vendor_ruby", version, platform) # RUBY_VENDOR_ARCHLIB
|
77
|
+
require File.join(*%w[enc encdb])
|
78
|
+
require File.join(*%w[enc trans transdb])
|
79
|
+
$:.uniq!
|
80
|
+
end
|
81
|
+
|
63
82
|
def require_frameworks
|
64
83
|
configuration.frameworks.each { |framework| require(framework.to_s) }
|
65
84
|
end
|
@@ -218,7 +237,6 @@ module Bowline
|
|
218
237
|
helpers = configuration.helpers
|
219
238
|
helpers = helpers.map(&:constantize)
|
220
239
|
helpers.each {|h| Helpers.module_eval { extend h } }
|
221
|
-
Helpers.init
|
222
240
|
end
|
223
241
|
|
224
242
|
def load_application_classes
|
@@ -262,14 +280,25 @@ module Bowline
|
|
262
280
|
end
|
263
281
|
|
264
282
|
def initialize_js
|
265
|
-
Bowline.
|
283
|
+
return unless Bowline::Desktop.enabled?
|
284
|
+
Bowline::Desktop::JS.setup
|
285
|
+
Bowline::Desktop::Bridge.setup
|
286
|
+
end
|
287
|
+
|
288
|
+
def initialize_windows
|
289
|
+
return unless Bowline::Desktop.enabled?
|
290
|
+
MainWindow.setup
|
291
|
+
MainWindow.name = configuration.name
|
292
|
+
MainWindow.file = configuration.index_path
|
266
293
|
end
|
267
294
|
|
268
295
|
def process
|
269
296
|
Bowline.configuration = configuration
|
270
297
|
|
298
|
+
initialize_ruby
|
271
299
|
set_load_path
|
272
300
|
initialize_gems
|
301
|
+
load_gems
|
273
302
|
|
274
303
|
require_frameworks
|
275
304
|
set_autoload_paths
|
@@ -290,7 +319,6 @@ module Bowline
|
|
290
319
|
initialize_name
|
291
320
|
load_app_config
|
292
321
|
|
293
|
-
load_gems
|
294
322
|
load_plugins
|
295
323
|
|
296
324
|
load_application_initializers
|
@@ -301,6 +329,7 @@ module Bowline
|
|
301
329
|
load_application_helpers
|
302
330
|
|
303
331
|
initialize_js
|
332
|
+
initialize_windows
|
304
333
|
|
305
334
|
Bowline.initialized = true
|
306
335
|
end
|
@@ -406,6 +435,8 @@ module Bowline
|
|
406
435
|
|
407
436
|
attr_accessor :gem_path
|
408
437
|
|
438
|
+
attr_accessor :rubylib_path
|
439
|
+
|
409
440
|
# Sets the default +time_zone+. Setting this will enable +time_zone+
|
410
441
|
# awareness for Active Record models and set the Active Record default
|
411
442
|
# timezone to <tt>:utc</tt>.
|
@@ -417,16 +448,18 @@ module Bowline
|
|
417
448
|
|
418
449
|
attr_accessor :initializer_glob
|
419
450
|
|
451
|
+
attr_accessor :index_path
|
452
|
+
|
420
453
|
attr_accessor :name
|
421
454
|
attr_accessor :id
|
422
455
|
attr_accessor :version
|
423
456
|
attr_accessor :description
|
424
|
-
attr_accessor :publisher
|
425
457
|
attr_accessor :url
|
426
458
|
attr_accessor :icon
|
427
|
-
|
459
|
+
|
460
|
+
attr_accessor :publisher
|
428
461
|
attr_accessor :copyright
|
429
|
-
|
462
|
+
|
430
463
|
# Create a new Configuration instance, initialized with the default values.
|
431
464
|
def initialize
|
432
465
|
set_root_path!
|
@@ -444,9 +477,13 @@ module Bowline
|
|
444
477
|
self.app_config_file = default_app_config_file
|
445
478
|
self.gems = default_gems
|
446
479
|
self.gem_path = default_gem_path
|
480
|
+
self.rubylib_path = default_rubylib_path
|
447
481
|
self.plugin_glob = default_plugin_glob
|
448
482
|
self.helper_glob = default_helper_glob
|
449
483
|
self.initializer_glob = default_initalizer_glob
|
484
|
+
self.index_path = default_index_path
|
485
|
+
self.publisher = default_publisher
|
486
|
+
self.copyright = default_copyright
|
450
487
|
|
451
488
|
for framework in default_frameworks
|
452
489
|
self.send("#{framework}=", Bowline::OrderedOptions.new)
|
@@ -518,6 +555,7 @@ module Bowline
|
|
518
555
|
app/models
|
519
556
|
app/remote
|
520
557
|
app/helpers
|
558
|
+
app/windows
|
521
559
|
lib
|
522
560
|
vendor
|
523
561
|
).map { |dir| "#{root_path}/#{dir}" }.select { |dir| File.directory?(dir) }
|
@@ -536,6 +574,7 @@ module Bowline
|
|
536
574
|
app/models
|
537
575
|
app/remote
|
538
576
|
app/helpers
|
577
|
+
app/windows
|
539
578
|
).map { |dir| "#{root_path}/#{dir}" }.select { |dir| File.directory?(dir) }
|
540
579
|
end
|
541
580
|
|
@@ -570,14 +609,17 @@ module Bowline
|
|
570
609
|
def default_gems
|
571
610
|
gems = []
|
572
611
|
gems << Dependencies::Dependency.new(
|
573
|
-
|
612
|
+
"activesupport", :lib => "active_support"
|
574
613
|
)
|
575
|
-
gems << Dependencies::Dependency.new("activesupport")
|
576
614
|
gems
|
577
615
|
end
|
578
616
|
|
617
|
+
def default_rubylib_path
|
618
|
+
File.join(root_path, *%w{ vendor rubylib })
|
619
|
+
end
|
620
|
+
|
579
621
|
def default_gem_path
|
580
|
-
|
622
|
+
File.join(root_path, *%w{ vendor gems })
|
581
623
|
end
|
582
624
|
|
583
625
|
def default_plugin_glob
|
@@ -591,6 +633,18 @@ module Bowline
|
|
591
633
|
def default_initalizer_glob
|
592
634
|
File.join(root_path, *%w{ config initializers **/*.rb })
|
593
635
|
end
|
636
|
+
|
637
|
+
def default_index_path
|
638
|
+
File.join(root_path, *%w{ public index.html })
|
639
|
+
end
|
640
|
+
|
641
|
+
def default_publisher
|
642
|
+
"Bowline"
|
643
|
+
end
|
644
|
+
|
645
|
+
def default_copyright
|
646
|
+
"Copyright #{Time.now.year}"
|
647
|
+
end
|
594
648
|
end
|
595
649
|
end
|
596
650
|
|