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,31 @@
|
|
1
|
+
module Bowline
|
2
|
+
module Library
|
3
|
+
RUBY_LIB_VERSION = "1.9.1"
|
4
|
+
RUBY_ARCHLIB_PLATFORM = "i386-darwin9.8.0"
|
5
|
+
PROJECT_URL = "http://bowline.s3.amazonaws.com/#{Platform.type}"
|
6
|
+
DESKTOP_URL = "#{PROJECT_URL}/bowline-desktop"
|
7
|
+
RUBYLIB_URL = "#{PROJECT_URL}/rubylib.zip"
|
8
|
+
|
9
|
+
def path
|
10
|
+
File.expand_path(
|
11
|
+
File.join(Gem.user_home, ".bowline")
|
12
|
+
)
|
13
|
+
end
|
14
|
+
module_function :path
|
15
|
+
|
16
|
+
def desktop_path
|
17
|
+
File.join(path, "bowline-desktop")
|
18
|
+
end
|
19
|
+
module_function :desktop_path
|
20
|
+
|
21
|
+
def rubylib_path
|
22
|
+
File.join(path, "rubylib")
|
23
|
+
end
|
24
|
+
module_function :rubylib_path
|
25
|
+
|
26
|
+
def downloaded?
|
27
|
+
File.exist?(desktop_path) && File.directory?(rubylib_path)
|
28
|
+
end
|
29
|
+
module_function :downloaded?
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,116 @@
|
|
1
|
+
module Bowline
|
2
|
+
class LocalModel
|
3
|
+
extend Watcher::Base
|
4
|
+
|
5
|
+
watch :before_save, :after_save,
|
6
|
+
:before_create, :after_create,
|
7
|
+
:before_update, :after_update,
|
8
|
+
:before_destroy, :after_destroy
|
9
|
+
|
10
|
+
@@records = []
|
11
|
+
|
12
|
+
class << self
|
13
|
+
def populate(array)
|
14
|
+
array.each {|r| create(r) }
|
15
|
+
end
|
16
|
+
|
17
|
+
def find(id)
|
18
|
+
@@records.find {|r| r.id == id } || raise('Unknown Record')
|
19
|
+
end
|
20
|
+
alias :[] :find
|
21
|
+
|
22
|
+
def first
|
23
|
+
@@records[0]
|
24
|
+
end
|
25
|
+
|
26
|
+
def last
|
27
|
+
@@records[-1]
|
28
|
+
end
|
29
|
+
|
30
|
+
def count
|
31
|
+
@@records.length
|
32
|
+
end
|
33
|
+
|
34
|
+
def all
|
35
|
+
@@records
|
36
|
+
end
|
37
|
+
|
38
|
+
def destroy(id)
|
39
|
+
find(id).destroy
|
40
|
+
end
|
41
|
+
|
42
|
+
def destroy_all
|
43
|
+
@@records.dup.each {|r| r.destroy }
|
44
|
+
end
|
45
|
+
|
46
|
+
def delete_all
|
47
|
+
@@records.clear
|
48
|
+
end
|
49
|
+
|
50
|
+
def create(atts = {})
|
51
|
+
rec = self.new(atts)
|
52
|
+
rec.save && rec
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
attr_reader :attributes
|
57
|
+
|
58
|
+
def initialize(atts = {})
|
59
|
+
@attributes = {}.with_indifferent_access
|
60
|
+
@attributes.replace(atts)
|
61
|
+
@attributes[:id] ||= __id__
|
62
|
+
@new_record = true
|
63
|
+
end
|
64
|
+
|
65
|
+
# Override __id__
|
66
|
+
def id
|
67
|
+
@attributes[:id]
|
68
|
+
end
|
69
|
+
|
70
|
+
def update(atts)
|
71
|
+
run_callbacks(:before_save)
|
72
|
+
run_callbacks(:before_update)
|
73
|
+
attributes.merge!(atts)
|
74
|
+
run_callbacks(:after_save)
|
75
|
+
run_callbacks(:after_update)
|
76
|
+
true
|
77
|
+
end
|
78
|
+
|
79
|
+
def save
|
80
|
+
run_callbacks(:before_save)
|
81
|
+
if @new_record
|
82
|
+
run_callbacks(:before_create)
|
83
|
+
@@records << self
|
84
|
+
run_callbacks(:after_create)
|
85
|
+
@new_record = false
|
86
|
+
end
|
87
|
+
run_callbacks(:after_save)
|
88
|
+
true
|
89
|
+
end
|
90
|
+
|
91
|
+
def destroy
|
92
|
+
run_callbacks(:before_destroy)
|
93
|
+
@@records.delete(self)
|
94
|
+
run_callbacks(:after_destroy)
|
95
|
+
true
|
96
|
+
end
|
97
|
+
|
98
|
+
def method_missing(method_symbol, *arguments) #:nodoc:
|
99
|
+
method_name = method_symbol.to_s
|
100
|
+
|
101
|
+
case method_name.last
|
102
|
+
when "="
|
103
|
+
attributes[method_name.first(-1)] = arguments.first
|
104
|
+
when "?"
|
105
|
+
attributes[method_name.first(-1)]
|
106
|
+
else
|
107
|
+
attributes.has_key?(method_name) ? attributes[method_name] : super
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
private
|
112
|
+
def run_callbacks(callback)
|
113
|
+
self.class.watcher.call(callback)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Bowline
|
2
|
+
# To be included in classes to allow some basic logging
|
3
|
+
module Logging
|
4
|
+
def trace(msg=nil)
|
5
|
+
Bowline.logger.info(msg)
|
6
|
+
end
|
7
|
+
module_function :trace
|
8
|
+
public :trace
|
9
|
+
|
10
|
+
def debug(msg=nil)
|
11
|
+
Bowline.logger.debug(msg)
|
12
|
+
end
|
13
|
+
module_function :debug
|
14
|
+
public :debug
|
15
|
+
|
16
|
+
# Log an error backtrace if debugging is activated
|
17
|
+
def log_error(e=$!)
|
18
|
+
debug "#{e}\n\t" + e.backtrace.join("\n\t")
|
19
|
+
end
|
20
|
+
module_function :log_error
|
21
|
+
public :log_error
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
# naive platform detection for Ruby
|
2
|
+
# Based on code by Matt Mower <self@mattmower.com>
|
3
|
+
# http://matt.blogs.it/gems/ruby/platform.rb
|
4
|
+
|
5
|
+
module Bowline
|
6
|
+
module Platform
|
7
|
+
if RUBY_PLATFORM =~ /darwin/i
|
8
|
+
OS = :unix
|
9
|
+
IMPL = :macosx
|
10
|
+
elsif RUBY_PLATFORM =~ /linux/i
|
11
|
+
OS = :unix
|
12
|
+
IMPL = :linux
|
13
|
+
elsif RUBY_PLATFORM =~ /freebsd/i
|
14
|
+
OS = :unix
|
15
|
+
IMPL = :freebsd
|
16
|
+
elsif RUBY_PLATFORM =~ /netbsd/i
|
17
|
+
OS = :unix
|
18
|
+
IMPL = :netbsd
|
19
|
+
elsif RUBY_PLATFORM =~ /mswin/i
|
20
|
+
OS = :win32
|
21
|
+
IMPL = :mswin
|
22
|
+
elsif RUBY_PLATFORM =~ /cygwin/i
|
23
|
+
OS = :unix
|
24
|
+
IMPL = :cygwin
|
25
|
+
elsif RUBY_PLATFORM =~ /mingw/i
|
26
|
+
OS = :win32
|
27
|
+
IMPL = :mingw
|
28
|
+
elsif RUBY_PLATFORM =~ /bccwin/i
|
29
|
+
OS = :win32
|
30
|
+
IMPL = :bccwin
|
31
|
+
else
|
32
|
+
OS = :unknown
|
33
|
+
IMPL = :unknown
|
34
|
+
end
|
35
|
+
|
36
|
+
if RUBY_PLATFORM =~ /(i\d86)/i
|
37
|
+
ARCH = :x86
|
38
|
+
elsif RUBY_PLATFORM =~ /ia64/i
|
39
|
+
ARCH = :ia64
|
40
|
+
elsif RUBY_PLATFORM =~ /powerpc/i
|
41
|
+
ARCH = :powerpc
|
42
|
+
elsif RUBY_PLATFORM =~ /alpha/i
|
43
|
+
ARCH = :alpha
|
44
|
+
else
|
45
|
+
ARCH = :unknown
|
46
|
+
end
|
47
|
+
|
48
|
+
def osx?
|
49
|
+
IMPL == :macosx
|
50
|
+
end
|
51
|
+
module_function :osx?
|
52
|
+
|
53
|
+
def linux?
|
54
|
+
IMPL == :linux
|
55
|
+
end
|
56
|
+
module_function :linux?
|
57
|
+
|
58
|
+
def win32?
|
59
|
+
OS == :win32
|
60
|
+
end
|
61
|
+
module_function :win32?
|
62
|
+
|
63
|
+
# Return OS type:
|
64
|
+
# Bowline::Platform.type # => :osx
|
65
|
+
def type
|
66
|
+
return :osx if osx?
|
67
|
+
return :linux if linux?
|
68
|
+
return :win32 if win32?
|
69
|
+
raise "Unknown platform"
|
70
|
+
end
|
71
|
+
module_function :type
|
72
|
+
end
|
73
|
+
end
|
data/lib/bowline/tasks/app.rake
CHANGED
@@ -1,159 +1,91 @@
|
|
1
1
|
require 'fileutils'
|
2
|
+
require 'erb'
|
3
|
+
require 'rbconfig'
|
4
|
+
|
2
5
|
namespace :app do
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
#
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
tifilesystem:0.4.4
|
21
|
-
tiplatform:0.4.4
|
22
|
-
tiui:0.4.4
|
23
|
-
javascript:0.4.4
|
24
|
-
ruby:0.4.4
|
25
|
-
tidatabase:0.4.4
|
26
|
-
tidesktop:0.4.4
|
27
|
-
tigrowl:0.4.4
|
28
|
-
timedia:0.4.4
|
29
|
-
timonkey:0.4.4
|
30
|
-
tinetwork:0.4.4
|
31
|
-
tinotification:0.4.4
|
32
|
-
tiprocess:0.4.4
|
33
|
-
EOF
|
34
|
-
|
35
|
-
conf.publisher ||= 'Bowline'
|
36
|
-
conf.copyright ||= "Copyright © #{Time.now.year}"
|
37
|
-
|
38
|
-
tiapp = <<-EOF
|
39
|
-
<?xml version='1.0' encoding='UTF-8'?>
|
40
|
-
<ti:app xmlns:ti='http://ti.appcelerator.org'>
|
41
|
-
<id>#{conf.id}</id>
|
42
|
-
<name>#{conf.name}</name>
|
43
|
-
<version>#{conf.version}</version>
|
44
|
-
<publisher>#{conf.publisher}</publisher>
|
45
|
-
<url>#{conf.url}</url>
|
46
|
-
<icon>public/icon.png</icon>
|
47
|
-
<copyright>#{conf.copyright}</copyright>
|
48
|
-
<window>
|
49
|
-
<id>initial</id>
|
50
|
-
<title>#{conf.name}</title>
|
51
|
-
<url>app://public/index.html</url>
|
52
|
-
<width>700</width>
|
53
|
-
<max-width>3000</max-width>
|
54
|
-
<min-width>0</min-width>
|
55
|
-
<height>800</height>
|
56
|
-
<max-height>3000</max-height>
|
57
|
-
<min-height>0</min-height>
|
58
|
-
<fullscreen>false</fullscreen>
|
59
|
-
<resizable>true</resizable>
|
60
|
-
<chrome scrollbars="true">true</chrome>
|
61
|
-
<maximizable>true</maximizable>
|
62
|
-
<minimizable>true</minimizable>
|
63
|
-
<closeable>true</closeable>
|
64
|
-
</window>
|
65
|
-
</ti:app>
|
66
|
-
EOF
|
67
|
-
|
68
|
-
FileUtils.cd(config_path) do
|
69
|
-
File.open('manifest', 'w+') {|f| f.write manifest }
|
70
|
-
File.open('tiapp.xml', 'w+') {|f| f.write tiapp }
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
desc "Bundles up app into executables"
|
75
|
-
task :bundle do
|
76
|
-
build_path = File.join(APP_ROOT, 'build')
|
77
|
-
app_path = File.join(build_path, 'app')
|
78
|
-
config_path = File.join(APP_ROOT, 'config')
|
79
|
-
|
80
|
-
tiapp = File.join(config_path, 'tiapp.xml')
|
81
|
-
manifest = File.join(config_path, 'manifest')
|
82
|
-
env = File.join(config_path, 'environment.rb')
|
6
|
+
namespace :build do
|
7
|
+
task :osx => :environment do
|
8
|
+
unless Bowline::Library.downloaded?
|
9
|
+
Rake::Task["libs:download"].invoke
|
10
|
+
end
|
11
|
+
|
12
|
+
config = Bowline.configuration
|
13
|
+
assets_path = File.join(Bowline.assets_path, "osx")
|
14
|
+
build_path = File.join(APP_ROOT, "build")
|
15
|
+
app_path = File.join(build_path, "#{config.name}.app")
|
16
|
+
FileUtils.rm_rf(app_path)
|
17
|
+
contents_path = File.join(app_path, "Contents")
|
18
|
+
FileUtils.mkdir_p(contents_path)
|
19
|
+
FileUtils.cd(contents_path) do
|
20
|
+
config_name = config.name
|
21
|
+
config_id = config.id
|
22
|
+
config_icon = "#{config.name}.icns"
|
83
23
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
24
|
+
info_plist_path = File.join(assets_path, "Info.plist.erb")
|
25
|
+
info_plist = ERB.new(File.read(info_plist_path)).result(binding)
|
26
|
+
File.open("Info.plist", "w+") {|f| f.write info_plist }
|
27
|
+
|
28
|
+
FileUtils.mkdir("Resources")
|
29
|
+
FileUtils.cd("Resources") do
|
30
|
+
FileUtils.mkdir("English.lproj")
|
31
|
+
|
32
|
+
# Make icon
|
33
|
+
makeicns = File.join(assets_path, "makeicns")
|
34
|
+
if config.icon
|
35
|
+
makeicns_in = File.join(APP_ROOT, config.icon)
|
36
|
+
else
|
37
|
+
makeicns_in = File.join(assets_path, "bowline.png")
|
38
|
+
end
|
39
|
+
makeicns_out = File.expand_path(File.join("English.lproj", config_icon))
|
40
|
+
puts "#{makeicns} -in #{makeicns_in} -out #{makeicns_out}"
|
41
|
+
`#{makeicns} -in #{makeicns_in} -out #{makeicns_out}`
|
42
|
+
|
43
|
+
# Copy App
|
44
|
+
dirs = Dir[File.join(APP_ROOT, '**')]
|
45
|
+
dirs.delete(build_path)
|
46
|
+
dirs.delete(File.join(APP_ROOT, 'log'))
|
47
|
+
dirs.delete(File.join(APP_ROOT, 'tmp'))
|
48
|
+
dirs.delete(File.join(APP_ROOT, 'db', 'migrate'))
|
49
|
+
dirs.delete_if {|i| i =~ /\.svn|\.DS_Store/ }
|
50
|
+
FileUtils.cp_r(dirs, '.')
|
51
|
+
|
52
|
+
# Copy Bowline
|
53
|
+
bowline_dir = File.join("vendor", "bowline")
|
54
|
+
FileUtils.rm_rf(bowline_dir)
|
55
|
+
FileUtils.cp_r(
|
56
|
+
Pathname.new(Bowline.lib_path).realpath,
|
57
|
+
bowline_dir
|
58
|
+
)
|
59
|
+
|
60
|
+
# Copy RB libs - TODO
|
61
|
+
FileUtils.mkdir_p(config.rubylib_path)
|
62
|
+
FileUtils.cp_r(Bowline::Library.rubylib_path, config.rubylib_path)
|
63
|
+
end
|
64
|
+
|
65
|
+
# Copy Binary
|
66
|
+
FileUtils.mkdir("MacOS")
|
109
67
|
FileUtils.cp(
|
110
|
-
|
111
|
-
File.join(
|
68
|
+
Bowline::Library.desktop_path,
|
69
|
+
File.join("MacOS", config.name)
|
112
70
|
)
|
113
71
|
end
|
72
|
+
FileUtils.chmod_R(0755, app_path)
|
73
|
+
FileUtils.chmod(0644, File.join(contents_path, "Info.plist"))
|
114
74
|
end
|
115
|
-
end
|
116
|
-
|
117
|
-
desc "Use the Titanium SDK to build the app"
|
118
|
-
task :build do
|
119
|
-
build_path = File.join(APP_ROOT, 'build')
|
120
|
-
app_path = File.join(build_path, 'app')
|
121
75
|
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
elsif RUBY_PLATFORM =~ /win/
|
126
|
-
'C:/ProgramData/Titanium'
|
127
|
-
elsif RUBY_PLATFORM =~ /linux/
|
128
|
-
'/opt/titanium'
|
129
|
-
else
|
130
|
-
raise "Unknown platform"
|
131
|
-
end
|
76
|
+
task :linux => :environment do
|
77
|
+
# Build debian package
|
78
|
+
raise "Unimplemented"
|
132
79
|
end
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
"specify the ENV variable TIPATH"
|
80
|
+
|
81
|
+
task :win32 => :environment do
|
82
|
+
# Use Inno Setup
|
83
|
+
raise "Unimplemented"
|
138
84
|
end
|
139
|
-
|
140
|
-
ti_lib_path = Dir[File.join(ti_path, "sdk", "*", "*")][-1]
|
141
|
-
|
142
|
-
# Space in osx path
|
143
|
-
ti_path.gsub!(' ', '\ ')
|
144
|
-
ti_lib_path.gsub!(' ', '\ ')
|
145
|
-
|
146
|
-
command = ['python']
|
147
|
-
command << File.join(ti_lib_path, "tibuild.py")
|
148
|
-
command << "-d #{build_path}"
|
149
|
-
command << "-s #{ti_path}"
|
150
|
-
command << "-r" if ENV['TIRUN']
|
151
|
-
command << "-a #{ti_lib_path}"
|
152
|
-
command << app_path
|
153
|
-
|
154
|
-
exec(command.join(' '))
|
155
85
|
end
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
86
|
+
|
87
|
+
desc "Build app"
|
88
|
+
task :build do
|
89
|
+
Rake::Task["app:build:#{Bowline::Platform.type}"].invoke
|
90
|
+
end
|
91
|
+
end
|