spellbook 0.2.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.
Files changed (46) hide show
  1. data/Gemfile +45 -0
  2. data/Gemfile.lock +65 -0
  3. data/README.mkd +63 -0
  4. data/Rakefile +35 -0
  5. data/TODO +18 -0
  6. data/VERSION +1 -0
  7. data/bin/spellbook +28 -0
  8. data/config.ru +4 -0
  9. data/db/migrate/20110419111502_create_apps.rb +13 -0
  10. data/db/migrate/20110419135238_add_proxy_to_apps.rb +9 -0
  11. data/examples/rails_hello/app/controllers/application_controller.rb +3 -0
  12. data/examples/rails_hello/app/controllers/top_controller.rb +5 -0
  13. data/examples/rails_hello/app/helpers/application_helper.rb +2 -0
  14. data/examples/rails_hello/config/application.rb +42 -0
  15. data/examples/rails_hello/config/boot.rb +6 -0
  16. data/examples/rails_hello/config/environment.rb +5 -0
  17. data/examples/rails_hello/config/environments/development.rb +26 -0
  18. data/examples/rails_hello/config/environments/production.rb +50 -0
  19. data/examples/rails_hello/config/environments/test.rb +35 -0
  20. data/examples/rails_hello/config/initializers/backtrace_silencers.rb +7 -0
  21. data/examples/rails_hello/config/initializers/inflections.rb +10 -0
  22. data/examples/rails_hello/config/initializers/mime_types.rb +5 -0
  23. data/examples/rails_hello/config/initializers/secret_token.rb +7 -0
  24. data/examples/rails_hello/config/initializers/session_store.rb +8 -0
  25. data/examples/rails_hello/config/routes.rb +60 -0
  26. data/examples/rails_hello/db/seeds.rb +7 -0
  27. data/examples/rails_hello/main.rb +76 -0
  28. data/examples/rails_hello/test/performance/browsing_test.rb +9 -0
  29. data/examples/rails_hello/test/test_helper.rb +13 -0
  30. data/examples/sinatra_hello/app.rb +124 -0
  31. data/lib/spellbook.rb +8 -0
  32. data/lib/spellbook/app.rb +16 -0
  33. data/lib/spellbook/proxy.rb +14 -0
  34. data/lib/spellbook/server.rb +202 -0
  35. data/lib/spellbook/views/apps_edit.slim +34 -0
  36. data/lib/spellbook/views/apps_index.slim +36 -0
  37. data/lib/spellbook/views/apps_new.slim +33 -0
  38. data/lib/spellbook/views/apps_show.slim +2 -0
  39. data/lib/spellbook/views/error.slim +7 -0
  40. data/lib/spellbook/views/layout.slim +22 -0
  41. data/lib/spellbook/views/screen.sass +29 -0
  42. data/lib/spellbook/views/top.slim +2 -0
  43. data/spec/database_spec.rb +29 -0
  44. data/spec/server_spec.rb +99 -0
  45. data/spec/spec_helper.rb +16 -0
  46. metadata +315 -0
@@ -0,0 +1,34 @@
1
+ h2 Edit app
2
+
3
+ form action="/spellbook/apps/#{@app.name}" method="POST"
4
+ input type="hidden" name="_method" value="PUT"
5
+ dl
6
+ dt Name
7
+ dl
8
+ input type="text" name="name" value=(@app.name)
9
+
10
+ dt Port
11
+ dl
12
+ input type="text" name="port" value=(@app.port)
13
+
14
+ dt Command
15
+ dl
16
+ input type="text" name="command" size="120" value=(@app.command)
17
+
18
+ p
19
+ input type="hidden" name="proxy" value="0"
20
+ input type="checkbox" name="proxy" value="1" checked=(true if @app.proxy)
21
+ | Enable proxy by Spellbook
22
+ small
23
+ br
24
+ | (With this option, you can access to this application
25
+ using port
26
+ = settings.port
27
+ | . The application must support --prefix option)
28
+
29
+ dt
30
+ dl
31
+ input type="submit" value="save"
32
+
33
+ a href="/"
34
+ | back
@@ -0,0 +1,36 @@
1
+ table
2
+ tr
3
+ th Name
4
+ th Switch
5
+ th Command
6
+ th Operation
7
+
8
+ - @apps.each do |app|
9
+ tr
10
+ td
11
+ - if running?(app)
12
+ a href="#{app.url}" target="_blank"
13
+ = app.name
14
+ - else
15
+ = app.name
16
+ td
17
+ - if running?(app)
18
+ | ON
19
+ '
20
+ a href="/spellbook/apps/#{app.name}/stop"
21
+ | OFF
22
+ - else
23
+ a href="/spellbook/apps/#{app.name}/start"
24
+ | ON
25
+ '
26
+ | OFF
27
+ td
28
+ = app.command
29
+ td
30
+ a href="/spellbook/apps/#{app.name}/edit"
31
+ | edit
32
+
33
+ p
34
+ a href="/spellbook/apps/new"
35
+ | register new application
36
+
@@ -0,0 +1,33 @@
1
+ h2 Register new app
2
+
3
+ form action="/spellbook/apps" method="POST"
4
+ dl
5
+ dt Name
6
+ dl
7
+ input type="text" name="name"
8
+
9
+ dt Port
10
+ dl
11
+ input type="text" name="port" value=(@port)
12
+
13
+ dt Command
14
+ dl
15
+ input type="text" name="command" size="120"
16
+
17
+ p
18
+ input type="hidden" name="proxy" value="0"
19
+ input type="checkbox" name="proxy" value="1" checked=true
20
+ | Enable proxy by Spellbook
21
+ small
22
+ br
23
+ | (With this option, you can access to this application
24
+ using port
25
+ = settings.port
26
+ | . The application must support --prefix option)
27
+
28
+ dt
29
+ dl
30
+ input type="submit" value="save"
31
+
32
+ a href="/"
33
+ | back
@@ -0,0 +1,2 @@
1
+ p
2
+ | hello
@@ -0,0 +1,7 @@
1
+ h2
2
+ ' Error
3
+ small
4
+ = "(#{@err.class})"
5
+
6
+ pre
7
+ = @err.message
@@ -0,0 +1,22 @@
1
+ ! doctype html
2
+ html
3
+ head
4
+ meta charset="utf-8"
5
+ title Spellbook
6
+ link rel="stylesheet" href="/screen.css" type="text/css"
7
+
8
+ body
9
+ #header
10
+ h1
11
+ a href="/"
12
+ | Spellbook
13
+
14
+ #content
15
+ == yield
16
+
17
+ #footer
18
+ div
19
+ a href="http://github.com/yhara/spellbook/"
20
+ | Spellbook
21
+ = " #{SpellBook::VERSION} #{settings.environment} mode"
22
+
@@ -0,0 +1,29 @@
1
+ body
2
+ margin-left: 10%
3
+ margin-right: 10%
4
+ font-family: Helvetica, sans-serif
5
+
6
+ #header, #content, #footer
7
+ background: white
8
+ border: #39f 1px solid
9
+ border-radius: 3px
10
+ margin: 1em
11
+
12
+ #header
13
+ padding-left: 1em
14
+
15
+ #content, #footer
16
+ padding: 1em
17
+
18
+ #content
19
+ table
20
+ border-collapse: collapse
21
+ td, th
22
+ border: 1px solid #999
23
+ padding: 6px
24
+ th
25
+ background: #efefef
26
+ color: #555
27
+
28
+ #footer
29
+ text-align: right
@@ -0,0 +1,2 @@
1
+ a href="/spellbook/apps/"
2
+ | apps
@@ -0,0 +1,29 @@
1
+ require 'fileutils'
2
+ require 'spellbook/database'
3
+
4
+ describe SpellBook::Database do
5
+
6
+ DATA_PATH = File.expand_path("tmp.db", File.dirname(__FILE__))
7
+
8
+ it "should create file" do
9
+ File.exist?(DATA_PATH).should be_false
10
+
11
+ db = SpellBook::Database.new(DATA_PATH)
12
+ db.save_data
13
+
14
+ File.exist?(DATA_PATH).should be_true
15
+ end
16
+
17
+ it "should save and restore data" do
18
+ db = SpellBook::Database.new(DATA_PATH)
19
+ db[:foo] = :bar
20
+ db.save_data
21
+
22
+ db2 = SpellBook::Database.new(DATA_PATH)
23
+ db2[:foo].should == :bar
24
+ end
25
+
26
+ after :all do
27
+ FileUtils.rm(DATA_PATH)
28
+ end
29
+ end
@@ -0,0 +1,99 @@
1
+ require "#{File.dirname __FILE__}/spec_helper.rb"
2
+ require 'spellbook/server'
3
+
4
+ SpellBook::Server.set :environment, :test
5
+
6
+ Capybara.app = SpellBook::Server
7
+
8
+ App = SpellBook::App
9
+
10
+ describe "Spellbook::Server" do
11
+ include Rack::Test::Methods
12
+
13
+ def app
14
+ SpellBook::Server
15
+ end
16
+
17
+ before :each do
18
+ App.destroy_all
19
+ end
20
+
21
+ describe "GET /" do
22
+ it "should redirect to /spellbook/apps" do
23
+ get '/'
24
+ last_response.status.should == 302
25
+ last_response.headers["Location"].should =~ %r{/spellbook/apps$}
26
+ end
27
+ end
28
+
29
+ describe "GET apps#index" do
30
+ it "should show list of apps" do
31
+ get '/spellbook/apps'
32
+ last_response.should be_ok
33
+ end
34
+ end
35
+
36
+ describe "GET apps#new - POST apps#create" do
37
+ it "should create an app with proxy ON" do
38
+ lambda {
39
+ visit '/spellbook/apps/new'
40
+
41
+ fill_in 'name', :with => "Sample app"
42
+ fill_in 'port', :with => 12345
43
+ fill_in 'command', :with => "ruby someapp.rb"
44
+ check 'proxy'
45
+
46
+ click_button "save"
47
+ }.should change(App, :count).by 1
48
+
49
+ App.first.proxy.should be_true
50
+ end
51
+
52
+ it "should create an app with proxy OFF" do
53
+ lambda {
54
+ visit '/spellbook/apps/new'
55
+
56
+ fill_in 'name', :with => "Sample app"
57
+ fill_in 'port', :with => 12345
58
+ fill_in 'command', :with => "ruby someapp.rb"
59
+ uncheck 'proxy'
60
+
61
+ click_button "save"
62
+ }.should change(App, :count).by 1
63
+
64
+ App.first.proxy.should be_false
65
+ end
66
+ end
67
+
68
+ describe "GET apps#edit - PUT apps#update" do
69
+ before :each do
70
+ @app = App.new(
71
+ :name => "someapp",
72
+ :port => 12345,
73
+ :command => "ruby someapp.rb",
74
+ )
75
+ end
76
+
77
+ it "should update an app to proxy ON" do
78
+ @app.proxy = false
79
+ @app.save!
80
+
81
+ lambda {
82
+ visit '/spellbook/apps/someapp/edit'
83
+ check 'proxy'
84
+ click_button "save"
85
+ }.should change{ App.first.proxy }.from(false).to(true)
86
+ end
87
+
88
+ it "should update an app to proxy OFF" do
89
+ @app.proxy = true
90
+ @app.save!
91
+
92
+ lambda {
93
+ visit '/spellbook/apps/someapp/edit'
94
+ uncheck 'proxy'
95
+ click_button "save"
96
+ }.should change{ App.first.proxy }.from(true).to(false)
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,16 @@
1
+ $LOAD_PATH << "#{File.dirname __FILE__}/../lib"
2
+ require 'spellbook'
3
+ require 'rspec'
4
+ require 'rack/test'
5
+ require 'capybara/rspec'
6
+ require 'capybara/dsl'
7
+
8
+ module SpellBook
9
+ def self.opts
10
+ {:environment => "test"}
11
+ end
12
+ end
13
+
14
+ RSpec.configure do |config|
15
+ config.include(Capybara)
16
+ end
metadata ADDED
@@ -0,0 +1,315 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: spellbook
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Yutaka HARA
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-04-23 00:00:00.000000000 +09:00
13
+ default_executable: spellbook
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: sinatra
17
+ requirement: &1534100 !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: '1.2'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: *1534100
26
+ - !ruby/object:Gem::Dependency
27
+ name: sinatra-activerecord
28
+ requirement: &1533530 !ruby/object:Gem::Requirement
29
+ none: false
30
+ requirements:
31
+ - - =
32
+ - !ruby/object:Gem::Version
33
+ version: 0.1.3
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: *1533530
37
+ - !ruby/object:Gem::Dependency
38
+ name: slim
39
+ requirement: &1532010 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ! '>='
43
+ - !ruby/object:Gem::Version
44
+ version: '0'
45
+ type: :runtime
46
+ prerelease: false
47
+ version_requirements: *1532010
48
+ - !ruby/object:Gem::Dependency
49
+ name: sass
50
+ requirement: &1530810 !ruby/object:Gem::Requirement
51
+ none: false
52
+ requirements:
53
+ - - ! '>='
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ type: :runtime
57
+ prerelease: false
58
+ version_requirements: *1530810
59
+ - !ruby/object:Gem::Dependency
60
+ name: childprocess
61
+ requirement: &1527870 !ruby/object:Gem::Requirement
62
+ none: false
63
+ requirements:
64
+ - - ! '>='
65
+ - !ruby/object:Gem::Version
66
+ version: '0'
67
+ type: :runtime
68
+ prerelease: false
69
+ version_requirements: *1527870
70
+ - !ruby/object:Gem::Dependency
71
+ name: slop
72
+ requirement: &1464820 !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ type: :runtime
79
+ prerelease: false
80
+ version_requirements: *1464820
81
+ - !ruby/object:Gem::Dependency
82
+ name: sqlite3
83
+ requirement: &1463390 !ruby/object:Gem::Requirement
84
+ none: false
85
+ requirements:
86
+ - - ! '>='
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ type: :runtime
90
+ prerelease: false
91
+ version_requirements: *1463390
92
+ - !ruby/object:Gem::Dependency
93
+ name: sinatra-reloader
94
+ requirement: &1439700 !ruby/object:Gem::Requirement
95
+ none: false
96
+ requirements:
97
+ - - ! '>='
98
+ - !ruby/object:Gem::Version
99
+ version: '0'
100
+ type: :development
101
+ prerelease: false
102
+ version_requirements: *1439700
103
+ - !ruby/object:Gem::Dependency
104
+ name: thin
105
+ requirement: &1438530 !ruby/object:Gem::Requirement
106
+ none: false
107
+ requirements:
108
+ - - ! '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ type: :development
112
+ prerelease: false
113
+ version_requirements: *1438530
114
+ - !ruby/object:Gem::Dependency
115
+ name: sinatra
116
+ requirement: &1437580 !ruby/object:Gem::Requirement
117
+ none: false
118
+ requirements:
119
+ - - ! '>='
120
+ - !ruby/object:Gem::Version
121
+ version: '1.2'
122
+ type: :runtime
123
+ prerelease: false
124
+ version_requirements: *1437580
125
+ - !ruby/object:Gem::Dependency
126
+ name: sinatra-activerecord
127
+ requirement: &1434710 !ruby/object:Gem::Requirement
128
+ none: false
129
+ requirements:
130
+ - - =
131
+ - !ruby/object:Gem::Version
132
+ version: 0.1.3
133
+ type: :runtime
134
+ prerelease: false
135
+ version_requirements: *1434710
136
+ - !ruby/object:Gem::Dependency
137
+ name: sqlite3
138
+ requirement: &1433890 !ruby/object:Gem::Requirement
139
+ none: false
140
+ requirements:
141
+ - - ! '>='
142
+ - !ruby/object:Gem::Version
143
+ version: '0'
144
+ type: :runtime
145
+ prerelease: false
146
+ version_requirements: *1433890
147
+ - !ruby/object:Gem::Dependency
148
+ name: slim
149
+ requirement: &1431740 !ruby/object:Gem::Requirement
150
+ none: false
151
+ requirements:
152
+ - - ! '>='
153
+ - !ruby/object:Gem::Version
154
+ version: '0'
155
+ type: :runtime
156
+ prerelease: false
157
+ version_requirements: *1431740
158
+ - !ruby/object:Gem::Dependency
159
+ name: sass
160
+ requirement: &1430670 !ruby/object:Gem::Requirement
161
+ none: false
162
+ requirements:
163
+ - - ! '>='
164
+ - !ruby/object:Gem::Version
165
+ version: '0'
166
+ type: :runtime
167
+ prerelease: false
168
+ version_requirements: *1430670
169
+ - !ruby/object:Gem::Dependency
170
+ name: childprocess
171
+ requirement: &1429750 !ruby/object:Gem::Requirement
172
+ none: false
173
+ requirements:
174
+ - - ! '>='
175
+ - !ruby/object:Gem::Version
176
+ version: '0'
177
+ type: :runtime
178
+ prerelease: false
179
+ version_requirements: *1429750
180
+ - !ruby/object:Gem::Dependency
181
+ name: rspec
182
+ requirement: &1428730 !ruby/object:Gem::Requirement
183
+ none: false
184
+ requirements:
185
+ - - ! '>='
186
+ - !ruby/object:Gem::Version
187
+ version: '2.0'
188
+ type: :development
189
+ prerelease: false
190
+ version_requirements: *1428730
191
+ - !ruby/object:Gem::Dependency
192
+ name: sinatra-reloader
193
+ requirement: &1425800 !ruby/object:Gem::Requirement
194
+ none: false
195
+ requirements:
196
+ - - ! '>='
197
+ - !ruby/object:Gem::Version
198
+ version: '0'
199
+ type: :development
200
+ prerelease: false
201
+ version_requirements: *1425800
202
+ - !ruby/object:Gem::Dependency
203
+ name: thin
204
+ requirement: &1412680 !ruby/object:Gem::Requirement
205
+ none: false
206
+ requirements:
207
+ - - ! '>='
208
+ - !ruby/object:Gem::Version
209
+ version: '0'
210
+ type: :development
211
+ prerelease: false
212
+ version_requirements: *1412680
213
+ description: Launcher for browser-based desktop applications
214
+ email: yutaka.hara/at/gmail.com
215
+ executables:
216
+ - spellbook
217
+ extensions: []
218
+ extra_rdoc_files:
219
+ - README.mkd
220
+ - TODO
221
+ files:
222
+ - Gemfile
223
+ - Gemfile.lock
224
+ - README.mkd
225
+ - Rakefile
226
+ - TODO
227
+ - VERSION
228
+ - bin/spellbook
229
+ - config.ru
230
+ - db/migrate/20110419111502_create_apps.rb
231
+ - db/migrate/20110419135238_add_proxy_to_apps.rb
232
+ - examples/sinatra_hello/app.rb
233
+ - lib/spellbook.rb
234
+ - lib/spellbook/app.rb
235
+ - lib/spellbook/proxy.rb
236
+ - lib/spellbook/server.rb
237
+ - lib/spellbook/views/apps_edit.slim
238
+ - lib/spellbook/views/apps_index.slim
239
+ - lib/spellbook/views/apps_new.slim
240
+ - lib/spellbook/views/apps_show.slim
241
+ - lib/spellbook/views/error.slim
242
+ - lib/spellbook/views/layout.slim
243
+ - lib/spellbook/views/screen.sass
244
+ - lib/spellbook/views/top.slim
245
+ - spec/database_spec.rb
246
+ - spec/server_spec.rb
247
+ - spec/spec_helper.rb
248
+ - examples/rails_hello/app/controllers/application_controller.rb
249
+ - examples/rails_hello/app/controllers/top_controller.rb
250
+ - examples/rails_hello/app/helpers/application_helper.rb
251
+ - examples/rails_hello/config/application.rb
252
+ - examples/rails_hello/config/boot.rb
253
+ - examples/rails_hello/config/environment.rb
254
+ - examples/rails_hello/config/environments/development.rb
255
+ - examples/rails_hello/config/environments/production.rb
256
+ - examples/rails_hello/config/environments/test.rb
257
+ - examples/rails_hello/config/initializers/backtrace_silencers.rb
258
+ - examples/rails_hello/config/initializers/inflections.rb
259
+ - examples/rails_hello/config/initializers/mime_types.rb
260
+ - examples/rails_hello/config/initializers/secret_token.rb
261
+ - examples/rails_hello/config/initializers/session_store.rb
262
+ - examples/rails_hello/config/routes.rb
263
+ - examples/rails_hello/db/seeds.rb
264
+ - examples/rails_hello/main.rb
265
+ - examples/rails_hello/test/performance/browsing_test.rb
266
+ - examples/rails_hello/test/test_helper.rb
267
+ has_rdoc: true
268
+ homepage: http://github.com/yhara/spellbook
269
+ licenses: []
270
+ post_install_message:
271
+ rdoc_options: []
272
+ require_paths:
273
+ - lib
274
+ required_ruby_version: !ruby/object:Gem::Requirement
275
+ none: false
276
+ requirements:
277
+ - - ! '>='
278
+ - !ruby/object:Gem::Version
279
+ version: '0'
280
+ required_rubygems_version: !ruby/object:Gem::Requirement
281
+ none: false
282
+ requirements:
283
+ - - ! '>='
284
+ - !ruby/object:Gem::Version
285
+ version: '0'
286
+ requirements: []
287
+ rubyforge_project:
288
+ rubygems_version: 1.5.2
289
+ signing_key:
290
+ specification_version: 3
291
+ summary: Launcher for browser-based desktop applications
292
+ test_files:
293
+ - examples/rails_hello/app/controllers/application_controller.rb
294
+ - examples/rails_hello/app/controllers/top_controller.rb
295
+ - examples/rails_hello/app/helpers/application_helper.rb
296
+ - examples/rails_hello/config/application.rb
297
+ - examples/rails_hello/config/boot.rb
298
+ - examples/rails_hello/config/environment.rb
299
+ - examples/rails_hello/config/environments/development.rb
300
+ - examples/rails_hello/config/environments/production.rb
301
+ - examples/rails_hello/config/environments/test.rb
302
+ - examples/rails_hello/config/initializers/backtrace_silencers.rb
303
+ - examples/rails_hello/config/initializers/inflections.rb
304
+ - examples/rails_hello/config/initializers/mime_types.rb
305
+ - examples/rails_hello/config/initializers/secret_token.rb
306
+ - examples/rails_hello/config/initializers/session_store.rb
307
+ - examples/rails_hello/config/routes.rb
308
+ - examples/rails_hello/db/seeds.rb
309
+ - examples/rails_hello/main.rb
310
+ - examples/rails_hello/test/performance/browsing_test.rb
311
+ - examples/rails_hello/test/test_helper.rb
312
+ - examples/sinatra_hello/app.rb
313
+ - spec/database_spec.rb
314
+ - spec/server_spec.rb
315
+ - spec/spec_helper.rb