ruby-station 0.0.4 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +0 -1
- data/Rakefile +4 -3
- data/bin/ruby-station +11 -3
- data/config.rb +25 -7
- data/controller/applications.rb +35 -26
- data/controller/main.rb +7 -0
- data/model/application.rb +10 -15
- data/ruby-station.gemspec +32 -9
- data/sample.config.yaml +1 -1
- data/tests/README +29 -0
- data/tests/Rakefile +11 -0
- data/tests/data/conf_dir/config.yaml +7 -0
- data/tests/features/install_file.feature +14 -0
- data/tests/features/install_name.feature +13 -0
- data/tests/features/list.feature +11 -0
- data/tests/features/step_definitions/application_steps.rb +26 -0
- data/tests/features/step_definitions/curelity_steps.rb +117 -0
- data/tests/features/support/env.rb +33 -0
- data/tests/features/uninstall.feature +13 -0
- data/tests/features/upgrade.feature +11 -0
- data/tests/spec/gem_manager.rb +27 -0
- data/tests/test_helper.rb +27 -0
- data/util/{gem-manager.rb → gem_manager.rb} +1 -1
- data/util/servant.rb +56 -0
- data/view/applications/foo.xhtml +19 -0
- data/view/applications/install.xhtml +6 -2
- data/view/applications/uninstall.xhtml +2 -2
- data/view/index.xhtml +14 -14
- data/view/notfound.xhtml +3 -0
- metadata +62 -9
- data/runtime/ruby-station-runtime-0.0.3.gem +0 -0
- data/spec/main.rb +0 -25
data/.gitignore
CHANGED
data/Rakefile
CHANGED
@@ -13,9 +13,10 @@ Jeweler::Tasks.new do |gemspec|
|
|
13
13
|
gemspec.homepage = "http://github.com/yhara/#{PROJECT_NAME}"
|
14
14
|
gemspec.description = gemspec.summary
|
15
15
|
gemspec.authors = ["Yutaka HARA"]
|
16
|
-
|
17
|
-
|
18
|
-
|
16
|
+
gemspec.add_dependency('ramaze', '= 2009.07')
|
17
|
+
gemspec.add_dependency('dm-core')
|
18
|
+
gemspec.add_dependency('do_sqlite3')
|
19
|
+
gemspec.add_development_dependency('rspec', '= 1.2.8')
|
19
20
|
end
|
20
21
|
|
21
22
|
desc "install current source as gem"
|
data/bin/ruby-station
CHANGED
@@ -6,14 +6,22 @@ require 'ramaze'
|
|
6
6
|
|
7
7
|
$LOAD_PATH.unshift __DIR__("../")
|
8
8
|
|
9
|
-
require 'util/
|
9
|
+
require 'util/gem_manager.rb'
|
10
10
|
require 'config.rb'
|
11
|
-
|
11
|
+
if defined?(TESTS_DIR)
|
12
|
+
Conf.set_home(TESTS_DIR/"data/conf_dir/")
|
13
|
+
else
|
14
|
+
Conf.parse_opt
|
15
|
+
end
|
12
16
|
Conf.init
|
13
17
|
|
18
|
+
require 'util/servant.rb'
|
14
19
|
require 'controller/init'
|
15
20
|
require 'model/init'
|
16
21
|
|
22
|
+
if Conf.debug
|
23
|
+
Ramaze::Log.info "Starting Ramaze with dev mode"
|
24
|
+
end
|
17
25
|
Ramaze.start :port => Conf.server_port,
|
18
26
|
:root => __DIR__("../"),
|
19
|
-
:mode => :live
|
27
|
+
:mode => (Conf.debug ? :dev : :live)
|
data/config.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require __DIR__("./util/gem_manager")
|
1
2
|
require 'yaml'
|
2
3
|
require 'fileutils'
|
3
4
|
|
@@ -9,7 +10,7 @@ module RubyStation
|
|
9
10
|
end
|
10
11
|
|
11
12
|
class Conf
|
12
|
-
%w(ruby_command gem_command gem_dir gem_bin_dir gem_install_option data_dir server_port).each do |m|
|
13
|
+
%w(ruby_command gem_command gem_dir gem_bin_dir gem_install_option data_dir server_port debug).each do |m|
|
13
14
|
class_eval <<-EOD
|
14
15
|
def self.#{m}; @yaml[:#{m}]; end
|
15
16
|
EOD
|
@@ -34,6 +35,11 @@ class Conf
|
|
34
35
|
@opt.parse!(ARGV)
|
35
36
|
end
|
36
37
|
|
38
|
+
# for unit tests
|
39
|
+
def self.set_home(path)
|
40
|
+
@home = path
|
41
|
+
end
|
42
|
+
|
37
43
|
def self.load_yaml
|
38
44
|
yaml_path = File.join(@home, "config.yaml")
|
39
45
|
unless File.exist?(yaml_path)
|
@@ -47,7 +53,8 @@ class Conf
|
|
47
53
|
end
|
48
54
|
|
49
55
|
# TODO: refactor X-(
|
50
|
-
def self.init
|
56
|
+
def self.init(home=nil)
|
57
|
+
@home = home if home
|
51
58
|
@yaml = self.load_yaml
|
52
59
|
@yaml[:gem_dir] = File.expand_path(@yaml[:gem_dir], @home)
|
53
60
|
@yaml[:gem_bin_dir] = File.expand_path(@yaml[:gem_bin_dir], @home)
|
@@ -56,15 +63,26 @@ class Conf
|
|
56
63
|
FileUtils.makedirs(@yaml[:gem_bin_dir])
|
57
64
|
FileUtils.makedirs(@yaml[:data_dir])
|
58
65
|
|
59
|
-
|
60
|
-
|
61
|
-
gem_path = __DIR__("runtime/ruby-station-runtime-#{runtime_ver}.gem")
|
62
|
-
GemManager.install_file(gem_path)
|
63
|
-
end
|
66
|
+
Runtime.install unless Runtime.installed?
|
67
|
+
|
64
68
|
# unless `#{self.gem_command} sources`.include?("github")
|
65
69
|
# cmd = "#{self.gem_command} sources -a http://gems.github.com"
|
66
70
|
# Ramaze::Log.info cmd
|
67
71
|
# `#{cmd}`
|
68
72
|
# end
|
69
73
|
end
|
74
|
+
|
75
|
+
module Runtime
|
76
|
+
VERSION = RubyStation::RUNTIME_VERSION
|
77
|
+
|
78
|
+
def self.installed?
|
79
|
+
GemManager.installed?("ruby-station-runtime", VERSION)
|
80
|
+
end
|
81
|
+
|
82
|
+
def self.install
|
83
|
+
path = __DIR__("runtime/ruby-station-runtime-#{VERSION}.gem")
|
84
|
+
GemManager.install_file(path)
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
70
88
|
end
|
data/controller/applications.rb
CHANGED
@@ -1,33 +1,46 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
1
3
|
class Applications < Controller
|
2
4
|
map '/applications'
|
5
|
+
provide :json, :type => "application/json" do |action, value|
|
6
|
+
value.to_json
|
7
|
+
end
|
3
8
|
|
4
9
|
layout{|path, ext|
|
5
|
-
"default" unless path =~ /\
|
10
|
+
"default" unless path =~ /\A_/
|
6
11
|
}
|
7
12
|
|
8
13
|
def install
|
9
|
-
|
14
|
+
session[:source_type] = request["by"]
|
15
|
+
|
16
|
+
case session[:source_type]
|
17
|
+
when "name"
|
10
18
|
@name = request["name"]
|
11
19
|
session[:gemname] = @name
|
12
|
-
|
20
|
+
session[:messages] = []
|
21
|
+
when "file"
|
13
22
|
tempfile = request["gem"][:tempfile]
|
14
23
|
@filename = request["gem"][:filename]
|
15
24
|
@size = tempfile.size
|
16
25
|
session[:tempfile] = tempfile
|
26
|
+
else
|
27
|
+
raise "unknown install source type: #{session[:source_type]}"
|
17
28
|
end
|
18
29
|
end
|
19
30
|
|
20
|
-
def
|
21
|
-
|
31
|
+
def _install
|
32
|
+
case session[:source_type]
|
33
|
+
when "name"
|
34
|
+
gemname = session[:gemname]
|
22
35
|
result, name, version = GemManager.install_gem(gemname)
|
23
|
-
|
36
|
+
when "file"
|
24
37
|
path = session[:tempfile].path
|
25
38
|
result, name, version = GemManager.install_file(path)
|
26
39
|
else
|
27
|
-
raise
|
40
|
+
raise "unknown install source type: #{session[:source_type]}"
|
28
41
|
end
|
29
42
|
|
30
|
-
|
43
|
+
if result and not Application.first(:name => name, :version => version)
|
31
44
|
Application.create({
|
32
45
|
:pid => nil,
|
33
46
|
:port => 30000 + rand(9999),
|
@@ -40,26 +53,23 @@ class Applications < Controller
|
|
40
53
|
h result
|
41
54
|
end
|
42
55
|
|
43
|
-
def create
|
44
|
-
end
|
45
|
-
|
46
|
-
def show(name)
|
47
|
-
end
|
48
|
-
|
49
56
|
def uninstall(id)
|
50
|
-
app = Application.get(id)
|
51
|
-
|
52
|
-
|
53
|
-
|
57
|
+
if app = Application.get(id)
|
58
|
+
@app = app
|
59
|
+
else
|
60
|
+
flash[:error] = "The application (id=#{id}) is already uninstalled."
|
61
|
+
redirect MainController.r(:notfound)
|
62
|
+
end
|
54
63
|
end
|
55
64
|
|
56
|
-
def
|
57
|
-
app = Application.get(id)
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
65
|
+
def _uninstall(id)
|
66
|
+
if app = Application.get(id)
|
67
|
+
result = GemManager.uninstall(app.name, app.version)
|
68
|
+
app.destroy
|
69
|
+
result
|
70
|
+
else
|
71
|
+
""
|
72
|
+
end
|
63
73
|
end
|
64
74
|
|
65
75
|
def start(id)
|
@@ -80,5 +90,4 @@ class Applications < Controller
|
|
80
90
|
|
81
91
|
redirect_referer
|
82
92
|
end
|
83
|
-
|
84
93
|
end
|
data/controller/main.rb
CHANGED
data/model/application.rb
CHANGED
@@ -1,8 +1,5 @@
|
|
1
|
-
require 'ramaze/tool/bin'
|
2
|
-
|
3
1
|
class Application
|
4
2
|
include DataMapper::Resource
|
5
|
-
include Ramaze::Tool::Bin::Helpers
|
6
3
|
|
7
4
|
property :id, Serial
|
8
5
|
property :pid, Integer
|
@@ -20,24 +17,17 @@ class Application
|
|
20
17
|
"--data-dir", data_dir,
|
21
18
|
].join(" ")
|
22
19
|
|
23
|
-
self.pid =
|
24
|
-
|
20
|
+
self.pid = Servant.watch(cmd){
|
21
|
+
stopped
|
25
22
|
}
|
26
23
|
self.save
|
27
24
|
end
|
28
25
|
|
29
26
|
def stop
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
if is_running?(self.pid)
|
34
|
-
sleep 2
|
35
|
-
Ramaze::Log.warn "Process #{self.pid} did not die, forcing it with -9"
|
36
|
-
Process.kill(9, self.pid)
|
27
|
+
if self.pid
|
28
|
+
Servant.kill(self.pid)
|
29
|
+
stopped
|
37
30
|
end
|
38
|
-
|
39
|
-
self.pid = nil
|
40
|
-
self.save
|
41
31
|
end
|
42
32
|
|
43
33
|
def full_name
|
@@ -46,6 +36,11 @@ class Application
|
|
46
36
|
|
47
37
|
private
|
48
38
|
|
39
|
+
def stopped
|
40
|
+
self.pid = nil
|
41
|
+
self.save
|
42
|
+
end
|
43
|
+
|
49
44
|
def script_path
|
50
45
|
File.join(Conf.gem_dir, "gems",
|
51
46
|
full_name, "main.rb")
|
data/ruby-station.gemspec
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{ruby-station}
|
5
|
-
s.version = "0.0
|
5
|
+
s.version = "0.1.0"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Yutaka HARA"]
|
9
|
-
s.date = %q{2009-
|
9
|
+
s.date = %q{2009-10-02}
|
10
10
|
s.default_executable = %q{ruby-station}
|
11
11
|
s.description = %q{Create, Distribute, and Install Ruby applications easily}
|
12
12
|
s.email = %q{yutaka.hara/at/gmail.com}
|
@@ -35,32 +35,55 @@ Gem::Specification.new do |s|
|
|
35
35
|
"runtime/lib/ruby-station.rb",
|
36
36
|
"runtime/lib/ruby-station/helper.rb",
|
37
37
|
"runtime/lib/ruby-station/helper/rails.rb",
|
38
|
-
"runtime/ruby-station-runtime-0.0.3.gem",
|
39
38
|
"runtime/ruby-station-runtime-0.0.4.gem",
|
40
39
|
"sample.config.yaml",
|
41
|
-
"
|
42
|
-
"
|
40
|
+
"tests/README",
|
41
|
+
"tests/Rakefile",
|
42
|
+
"tests/data/conf_dir/config.yaml",
|
43
|
+
"tests/features/install_file.feature",
|
44
|
+
"tests/features/install_name.feature",
|
45
|
+
"tests/features/list.feature",
|
46
|
+
"tests/features/step_definitions/application_steps.rb",
|
47
|
+
"tests/features/step_definitions/curelity_steps.rb",
|
48
|
+
"tests/features/support/env.rb",
|
49
|
+
"tests/features/uninstall.feature",
|
50
|
+
"tests/features/upgrade.feature",
|
51
|
+
"tests/spec/gem_manager.rb",
|
52
|
+
"tests/test_helper.rb",
|
53
|
+
"util/gem_manager.rb",
|
54
|
+
"util/servant.rb",
|
43
55
|
"view/applications/do_install.xhtml",
|
56
|
+
"view/applications/foo.xhtml",
|
44
57
|
"view/applications/install.xhtml",
|
45
58
|
"view/applications/uninstall.xhtml",
|
46
|
-
"view/index.xhtml"
|
59
|
+
"view/index.xhtml",
|
60
|
+
"view/notfound.xhtml"
|
47
61
|
]
|
48
62
|
s.homepage = %q{http://github.com/yhara/ruby-station}
|
49
63
|
s.rdoc_options = ["--charset=UTF-8"]
|
50
64
|
s.require_paths = ["lib"]
|
51
65
|
s.rubygems_version = %q{1.3.5}
|
52
66
|
s.summary = %q{Create, Distribute, and Install Ruby applications easily}
|
53
|
-
s.test_files = [
|
54
|
-
"spec/main.rb"
|
55
|
-
]
|
56
67
|
|
57
68
|
if s.respond_to? :specification_version then
|
58
69
|
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
59
70
|
s.specification_version = 3
|
60
71
|
|
61
72
|
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
73
|
+
s.add_runtime_dependency(%q<ramaze>, ["= 2009.07"])
|
74
|
+
s.add_runtime_dependency(%q<dm-core>, [">= 0"])
|
75
|
+
s.add_runtime_dependency(%q<do_sqlite3>, [">= 0"])
|
76
|
+
s.add_development_dependency(%q<rspec>, ["= 1.2.8"])
|
62
77
|
else
|
78
|
+
s.add_dependency(%q<ramaze>, ["= 2009.07"])
|
79
|
+
s.add_dependency(%q<dm-core>, [">= 0"])
|
80
|
+
s.add_dependency(%q<do_sqlite3>, [">= 0"])
|
81
|
+
s.add_dependency(%q<rspec>, ["= 1.2.8"])
|
63
82
|
end
|
64
83
|
else
|
84
|
+
s.add_dependency(%q<ramaze>, ["= 2009.07"])
|
85
|
+
s.add_dependency(%q<dm-core>, [">= 0"])
|
86
|
+
s.add_dependency(%q<do_sqlite3>, [">= 0"])
|
87
|
+
s.add_dependency(%q<rspec>, ["= 1.2.8"])
|
65
88
|
end
|
66
89
|
end
|
data/sample.config.yaml
CHANGED
data/tests/README
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
Unit tests for RubyStation
|
2
|
+
==========================
|
3
|
+
|
4
|
+
spec
|
5
|
+
----
|
6
|
+
|
7
|
+
$ gem intall rspec
|
8
|
+
|
9
|
+
rspec spec/*
|
10
|
+
|
11
|
+
|
12
|
+
features
|
13
|
+
--------
|
14
|
+
|
15
|
+
1. install cucumber:
|
16
|
+
$ gem install cucumber
|
17
|
+
|
18
|
+
2. install jruby:
|
19
|
+
TODO
|
20
|
+
|
21
|
+
JRuby must be executable by 'jruby'.
|
22
|
+
|
23
|
+
3. install culerity:
|
24
|
+
$ gem install langalex-culerity --source http://gems.github.com
|
25
|
+
|
26
|
+
|
27
|
+
|
28
|
+
|
29
|
+
|
data/tests/Rakefile
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
Feature: Install by file
|
2
|
+
In order to test new applications
|
3
|
+
As an application developer
|
4
|
+
I want to install a new gem file
|
5
|
+
|
6
|
+
Scenario: Install a gem by file
|
7
|
+
Given I do not have 'hello 0.2.0'
|
8
|
+
And I visit the index page
|
9
|
+
And I check 'by file'
|
10
|
+
And I fill in the path of 'data/hello/pkg/hello-0.2.0.gem' for 'gem'
|
11
|
+
When I press 'install'
|
12
|
+
And I wait while the spinner is shown
|
13
|
+
Then I should see 'Installing'
|
14
|
+
And I should have 'hello 0.2.0'
|
@@ -0,0 +1,13 @@
|
|
1
|
+
Feature: Install by name
|
2
|
+
In order to use new applications
|
3
|
+
As an application user
|
4
|
+
I want to install a new application
|
5
|
+
|
6
|
+
Scenario: Install a gem by name
|
7
|
+
Given I do not have 'hello-ruby-station 0.3.0'
|
8
|
+
And I visit the index page
|
9
|
+
And I fill in 'hello-ruby-station' for 'name'
|
10
|
+
When I press 'install'
|
11
|
+
And I wait while the spinner is shown
|
12
|
+
Then I should see 'Installing'
|
13
|
+
And I should have 'hello-ruby-station 0.3.0'
|
@@ -0,0 +1,11 @@
|
|
1
|
+
Feature: List
|
2
|
+
In order to know which application is installed
|
3
|
+
As an application user
|
4
|
+
I want to list my applications
|
5
|
+
|
6
|
+
Scenario: View the list of applications
|
7
|
+
Given I visit the index page
|
8
|
+
# And I fill in '50' for 'first'
|
9
|
+
# And I fill in '70' for 'second'
|
10
|
+
# When I press 'Add'
|
11
|
+
# Then I should see 'Answer: 120'
|
@@ -0,0 +1,26 @@
|
|
1
|
+
Given /^I have '(.*) (.*)'$/ do |name, version|
|
2
|
+
GemManager.installed?(name, version)
|
3
|
+
end
|
4
|
+
|
5
|
+
Given /^I do not have '(.*) (.*)'$/ do |name, version|
|
6
|
+
if GemManager.installed?(name, version)
|
7
|
+
GemManager.uninstall(name, version)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
When /^I install '(.*) (.*)'$/ do |name, version|
|
12
|
+
pending
|
13
|
+
end
|
14
|
+
|
15
|
+
Then /^I should (?:still )?have '(.*) (.*)'$/ do |name, version|
|
16
|
+
GemManager.installed?(name, version).should be_true
|
17
|
+
end
|
18
|
+
|
19
|
+
Then /^I should not have '(.*) (.*)'$/ do |name, version|
|
20
|
+
GemManager.installed?(name, version).should be_false
|
21
|
+
end
|
22
|
+
|
23
|
+
Then /^data files of 'hello 0\.2\.0' is same as data files of 'hello 0\.1\.0'$/ do
|
24
|
+
pending
|
25
|
+
end
|
26
|
+
|
@@ -0,0 +1,117 @@
|
|
1
|
+
require 'tempfile'
|
2
|
+
require 'culerity'
|
3
|
+
require __DIR__('../../test_helper.rb')
|
4
|
+
|
5
|
+
Before do
|
6
|
+
# TODO: start ramaze app in 7001, in test environment
|
7
|
+
# unless $rails_server
|
8
|
+
# $rails_server = Culerity::run_rails
|
9
|
+
# sleep 5
|
10
|
+
# end
|
11
|
+
|
12
|
+
# invoke jruby eval server (communicate via pipe)
|
13
|
+
# the server has instances of Celerity::Browser
|
14
|
+
$server ||= Culerity::run_server
|
15
|
+
|
16
|
+
# get the viatual browser, running in the server
|
17
|
+
$browser = Culerity::RemoteBrowserProxy.new $server, {:browser => :firefox}
|
18
|
+
|
19
|
+
# is needed to open pages
|
20
|
+
@host = "http://localhost:#{Conf.server_port}"
|
21
|
+
end
|
22
|
+
|
23
|
+
at_exit do
|
24
|
+
$browser.exit if $browser
|
25
|
+
$server.exit_server if $server
|
26
|
+
# TODO: stop ramaze app
|
27
|
+
#Process.kill(6, $rails_server.pid.to_i) if $rails_server
|
28
|
+
end
|
29
|
+
|
30
|
+
When /I press '(.*)'/ do |value|
|
31
|
+
$browser.button(:value, value).click
|
32
|
+
assert_successful_response
|
33
|
+
end
|
34
|
+
|
35
|
+
When /I follow '(.*)'/ do |link|
|
36
|
+
$browser.link(:text, /#{link}/).click
|
37
|
+
assert_successful_response
|
38
|
+
end
|
39
|
+
|
40
|
+
When /I fill in '(.*)' for '(.*)'/ do |value, name|
|
41
|
+
$browser.text_field(:name, name).set(value)
|
42
|
+
end
|
43
|
+
|
44
|
+
When /I fill in the path of '(.*)' for '(.*)'/ do |file, name|
|
45
|
+
$browser.file_field(:name, name).set(TESTS_DIR/file)
|
46
|
+
end
|
47
|
+
|
48
|
+
When /I check '(.*)'/ do |field|
|
49
|
+
$browser.check_box(:id, find_label(field).for).set(true)
|
50
|
+
end
|
51
|
+
|
52
|
+
When /^I uncheck '(.*)'$/ do |field|
|
53
|
+
$browser.check_box(:id, find_label(field).for).set(false)
|
54
|
+
end
|
55
|
+
|
56
|
+
When /I select '(.*)' from '(.*)'/ do |value, field|
|
57
|
+
$browser.select_list(:id, find_label(field).for).select value
|
58
|
+
end
|
59
|
+
|
60
|
+
When /I choose '(.*)'/ do |field|
|
61
|
+
$browser.radio(:id, find_label(field).for).set(true)
|
62
|
+
end
|
63
|
+
|
64
|
+
When /I visit the (.+) page/ do |name|
|
65
|
+
path = case name
|
66
|
+
when 'index' then '/'
|
67
|
+
else raise "unknown page name: #{name}"
|
68
|
+
end
|
69
|
+
$browser.goto "#{@host}#{path}"
|
70
|
+
assert_successful_response
|
71
|
+
end
|
72
|
+
|
73
|
+
When /I wait while the spinner is shown/ do
|
74
|
+
$browser.wait_while(60 * 3){ # 3 minutes
|
75
|
+
$browser.image(:id, 'spinner').exist?
|
76
|
+
}
|
77
|
+
end
|
78
|
+
|
79
|
+
When /I wait for the AJAX call to finish/ do
|
80
|
+
$browser.wait
|
81
|
+
end
|
82
|
+
|
83
|
+
Then /I should see '(.*)'/ do |text|
|
84
|
+
# if we simply check for the browser.html content we don't find content that has been added dynamically, e.g. after an ajax call
|
85
|
+
div = $browser.div(:text, /#{text}/)
|
86
|
+
begin
|
87
|
+
div.html
|
88
|
+
rescue
|
89
|
+
#puts $browser.html
|
90
|
+
raise("div with '#{text}' not found")
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
Then /I should not see '(.*)'/ do |text|
|
95
|
+
div = $browser.div(:text, /#{text}/).html rescue nil
|
96
|
+
div.should be_nil
|
97
|
+
end
|
98
|
+
|
99
|
+
def find_label(text)
|
100
|
+
$browser.label :text, text
|
101
|
+
end
|
102
|
+
|
103
|
+
def assert_successful_response
|
104
|
+
status = $browser.page.web_response.status_code
|
105
|
+
if(status == 302 || status == 301)
|
106
|
+
location = $browser.page.web_response.get_response_header_value('Location')
|
107
|
+
puts "Being redirected to #{location}"
|
108
|
+
$browser.goto location
|
109
|
+
assert_successful_response
|
110
|
+
elsif status != 200
|
111
|
+
tmp = Tempfile.new 'culerity_results'
|
112
|
+
tmp << $browser.html
|
113
|
+
tmp.close
|
114
|
+
`open -a /Applications/Safari.app #{tmp.path}`
|
115
|
+
raise "Brower returned Response Code #{$browser.page.web_response.status_code}"
|
116
|
+
end
|
117
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# See http://wiki.github.com/aslakhellesoy/cucumber/ramaze
|
2
|
+
# for more details about Ramaze with Cucumber
|
3
|
+
|
4
|
+
gem 'ramaze', '>= 2009.07'
|
5
|
+
gem 'rack-test', '>= 0.5.0'
|
6
|
+
gem 'webrat', '>= 0.5.3'
|
7
|
+
|
8
|
+
require 'ramaze'
|
9
|
+
Ramaze.options.started = true
|
10
|
+
require __DIR__("../../test_helper.rb")
|
11
|
+
load TESTS_DIR/"../bin/ruby-station"
|
12
|
+
|
13
|
+
require 'spec/expectations'
|
14
|
+
require 'rack/test'
|
15
|
+
require 'webrat'
|
16
|
+
|
17
|
+
Webrat.configure do |config|
|
18
|
+
config.mode = :rack
|
19
|
+
end
|
20
|
+
|
21
|
+
class MyWorld
|
22
|
+
include Rack::Test::Methods
|
23
|
+
include Webrat::Methods
|
24
|
+
include Webrat::Matchers
|
25
|
+
|
26
|
+
Webrat::Methods.delegate_to_session :response_code, :response_body
|
27
|
+
|
28
|
+
def app
|
29
|
+
Ramaze::middleware
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
World{MyWorld.new}
|
@@ -0,0 +1,13 @@
|
|
1
|
+
Feature: Uninstall
|
2
|
+
In order to clean my application list
|
3
|
+
As an application user
|
4
|
+
I want to uninstall an unused application
|
5
|
+
|
6
|
+
Scenario: Uninstall a gem
|
7
|
+
Given I visit the index page
|
8
|
+
When I press the uninstall link
|
9
|
+
# Given I visit the calculator page
|
10
|
+
# And I fill in '50' for 'first'
|
11
|
+
# And I fill in '70' for 'second'
|
12
|
+
# When I press 'Add'
|
13
|
+
# Then I should see 'Answer: 120'
|
@@ -0,0 +1,11 @@
|
|
1
|
+
Feature: Upgrade
|
2
|
+
In order to use new version of an application
|
3
|
+
As an application user
|
4
|
+
I want to install the new version
|
5
|
+
|
6
|
+
Scenario: Upgrade a gem
|
7
|
+
Given I have 'hello 0.1.0'
|
8
|
+
And I do not have 'hello 0.2.0'
|
9
|
+
When I install 'hello 0.2.0'
|
10
|
+
Then I should still have 'hello 0.1.0'
|
11
|
+
And data files of 'hello 0.2.0' is same as data files of 'hello 0.1.0'
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require "#{File.dirname(__FILE__)}/../test_helper.rb"
|
2
|
+
require TESTS_DIR/"../util/gem_manager.rb"
|
3
|
+
|
4
|
+
# helpers
|
5
|
+
|
6
|
+
describe GemManager do
|
7
|
+
it "should install a gem via file" do
|
8
|
+
path = TESTS_DIR/"data/hello/pkg/hello-0.2.0.gem"
|
9
|
+
result, name, version = GemManager.install_file(path)
|
10
|
+
|
11
|
+
result.should be_instance_of(String)
|
12
|
+
name.should == "hello"
|
13
|
+
version.should == "0.2.0"
|
14
|
+
|
15
|
+
GemManager.installed?("hello", "0.2.0").should be_true
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should install a gem via network" do
|
19
|
+
pending
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should uninstall a gem" do
|
23
|
+
GemManager.uninstall("hello", "0.2.0")
|
24
|
+
|
25
|
+
GemManager.installed?("hello", "0.2.0").should be_false
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'ramaze'
|
3
|
+
Ramaze.options.started = true
|
4
|
+
|
5
|
+
TESTS_DIR = __DIR__
|
6
|
+
def TESTS_DIR./(*paths)
|
7
|
+
File.expand_path(File.join(*paths), TESTS_DIR)
|
8
|
+
end
|
9
|
+
|
10
|
+
def clear_tmp(tmp_dir)
|
11
|
+
if File.exist?(tmp_dir)
|
12
|
+
puts "removing all files under #{tmp_dir}..."
|
13
|
+
puts "are you sure? [just push enter if so]"
|
14
|
+
if STDIN.gets.chomp.empty?
|
15
|
+
FileUtils.rm_r(tmp_dir)
|
16
|
+
else
|
17
|
+
raise "user chose not to clear the temporary directory"
|
18
|
+
end
|
19
|
+
else
|
20
|
+
Dir.mkdir(tmp_dir)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
clear_tmp(TESTS_DIR/"tmp/")
|
25
|
+
require TESTS_DIR/"../config.rb"
|
26
|
+
Conf.init TESTS_DIR/"data/conf_dir"
|
27
|
+
|
@@ -53,7 +53,7 @@ module GemManager
|
|
53
53
|
result = `#{cmd}`
|
54
54
|
|
55
55
|
# make data dir
|
56
|
-
raise unless result =~ /installed #{name}-(.*)/
|
56
|
+
raise "installation failed" unless result =~ /installed #{name}-(.*)/
|
57
57
|
version = $1
|
58
58
|
data_dir = File.join(Conf.data_dir, "#{name}-#{version}")
|
59
59
|
unless File.directory?(data_dir)
|
data/util/servant.rb
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'open3'
|
2
|
+
require 'ramaze/tool/bin'
|
3
|
+
|
4
|
+
# class Servant provides process invocations.
|
5
|
+
#
|
6
|
+
# @example
|
7
|
+
# pid = Servant.watch("some-app -p 12345"){
|
8
|
+
# # this block is called when app finishes
|
9
|
+
# }
|
10
|
+
#
|
11
|
+
# Servant.kill(pid) #=> stop the app immediately
|
12
|
+
#
|
13
|
+
# Servant.communicate("gem install foobar"){|line|
|
14
|
+
# # each line is yielded form process
|
15
|
+
# }
|
16
|
+
class Servant
|
17
|
+
extend Ramaze::Tool::Bin::Helpers # provides is_running?
|
18
|
+
|
19
|
+
def self.watch(cmd, args=[], &block)
|
20
|
+
begin
|
21
|
+
pid = Process.spawn(cmd, *args)
|
22
|
+
rescue SystemCallError
|
23
|
+
return nil
|
24
|
+
end
|
25
|
+
|
26
|
+
Thread.new{
|
27
|
+
Process.waitpid(pid)
|
28
|
+
block.call
|
29
|
+
}
|
30
|
+
return pid
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.communicate(cmd, args=[])
|
34
|
+
command = cmd + args.map{|x| ' '+x}.join
|
35
|
+
Open3.popen3(command){|stdin, stdout, stderr|
|
36
|
+
stdin.close
|
37
|
+
while line = stdout.gets
|
38
|
+
yield line
|
39
|
+
end
|
40
|
+
while line = stderr.gets
|
41
|
+
yield line
|
42
|
+
end
|
43
|
+
}
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.kill(pid)
|
47
|
+
Process.kill("INT", pid)
|
48
|
+
|
49
|
+
if is_running?(pid)
|
50
|
+
sleep 2
|
51
|
+
Ramaze::Log.warn "Process #{pid} did not die, forcing it with -9"
|
52
|
+
Process.kill(9, pid)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
<h3>foo</h3>
|
2
|
+
<div id="result">
|
3
|
+
waiting..
|
4
|
+
</div>
|
5
|
+
<script>
|
6
|
+
$(function(){
|
7
|
+
$.get("#{r :_foo_gen}");
|
8
|
+
var loop = function(){
|
9
|
+
$.getJSON("#{r '_foo_get.json'}", function(result){
|
10
|
+
console.debug(result[0], result[1]);
|
11
|
+
$("#result").append(result[1]);
|
12
|
+
if (!result[0]) {
|
13
|
+
setTimeout(loop, 2000);
|
14
|
+
}
|
15
|
+
});
|
16
|
+
};
|
17
|
+
loop();
|
18
|
+
});
|
19
|
+
</script>
|
@@ -1,6 +1,10 @@
|
|
1
1
|
<div id="install">
|
2
2
|
<h2>Installing application</h2>
|
3
3
|
|
4
|
+
<p>
|
5
|
+
This may take some minutes. Please be patient.
|
6
|
+
</p>
|
7
|
+
|
4
8
|
<?r if @name ?>
|
5
9
|
<p>Installing gem '#{@name}'...</p>
|
6
10
|
<?r else ?>
|
@@ -8,7 +12,7 @@
|
|
8
12
|
<?r end ?>
|
9
13
|
|
10
14
|
<pre id="result">
|
11
|
-
<img src='/spinner.gif'>
|
15
|
+
<img id="spinner" src='/spinner.gif'>
|
12
16
|
</pre>
|
13
17
|
|
14
18
|
<a href='/'>back</a>
|
@@ -16,6 +20,6 @@
|
|
16
20
|
|
17
21
|
<script type="text/javascript">
|
18
22
|
$(document).ready(function(){
|
19
|
-
$("#result").load("#{r(:
|
23
|
+
$("#result").load("#{r(:_install)}");
|
20
24
|
});
|
21
25
|
</script>
|
@@ -1,5 +1,5 @@
|
|
1
1
|
<div id="uninstall">
|
2
|
-
<h2
|
2
|
+
<h2>Uninstall</h2>
|
3
3
|
|
4
4
|
<p>uninstalling #{@app.full_name} ..</p>
|
5
5
|
|
@@ -12,6 +12,6 @@
|
|
12
12
|
|
13
13
|
<script type="text/javascript">
|
14
14
|
$(document).ready(function(){
|
15
|
-
$("#result").load("#{r(:
|
15
|
+
$("#result").load("#{r(:_uninstall, @app.id)}");
|
16
16
|
});
|
17
17
|
</script>
|
data/view/index.xhtml
CHANGED
@@ -45,35 +45,35 @@
|
|
45
45
|
</div>
|
46
46
|
<div id="new">
|
47
47
|
<h2>Installing Applications</h2>
|
48
|
-
<
|
49
|
-
|
50
|
-
|
51
|
-
|
48
|
+
<form action="#{Applications.r(:install)}" method="POST" enctype="multipart/form-data">
|
49
|
+
<input type="radio" name="by" value="name" id="by_name_button" checked>
|
50
|
+
<label for="by_name_button">by name</label>
|
51
|
+
<input type="radio" name="by" value="file" id="by_file_button">
|
52
|
+
<label for="by_file_button">by file</label>
|
52
53
|
|
53
|
-
|
54
|
-
<form action="#{Applications.r(:install)}" method="POST" enctype="multipart/form-data">
|
54
|
+
<div id="by_name">
|
55
55
|
<input type="text" name="name" size="30">
|
56
56
|
<input type="submit" value="install">
|
57
|
-
</
|
58
|
-
</div>
|
57
|
+
</div>
|
59
58
|
|
60
|
-
|
61
|
-
<form action="#{Applications.r(:install)}" method="POST" enctype="multipart/form-data">
|
59
|
+
<div id="by_file" style="display: none;">
|
62
60
|
<input type="file" name="gem" size="50">
|
63
61
|
<input type="submit" value="install">
|
64
|
-
</
|
65
|
-
</
|
62
|
+
</div>
|
63
|
+
</form>
|
66
64
|
</div>
|
67
65
|
|
68
66
|
<script type="text/javascript">
|
69
67
|
$(function(){
|
70
|
-
$("#by_name_button").
|
68
|
+
$("#by_name_button").click(function(){
|
71
69
|
$("#by_name").show();
|
72
70
|
$("#by_file").hide();
|
71
|
+
return true;
|
73
72
|
});
|
74
|
-
$("#by_file_button").
|
73
|
+
$("#by_file_button").click(function(){
|
75
74
|
$("#by_name").hide();
|
76
75
|
$("#by_file").show();
|
76
|
+
return true;
|
77
77
|
});
|
78
78
|
});
|
79
79
|
</script>
|
data/view/notfound.xhtml
ADDED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-station
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yutaka HARA
|
@@ -9,10 +9,49 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-10-02 00:00:00 +09:00
|
13
13
|
default_executable: ruby-station
|
14
|
-
dependencies:
|
15
|
-
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: ramaze
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - "="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: "2009.07"
|
24
|
+
version:
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: dm-core
|
27
|
+
type: :runtime
|
28
|
+
version_requirement:
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: "0"
|
34
|
+
version:
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: do_sqlite3
|
37
|
+
type: :runtime
|
38
|
+
version_requirement:
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: "0"
|
44
|
+
version:
|
45
|
+
- !ruby/object:Gem::Dependency
|
46
|
+
name: rspec
|
47
|
+
type: :development
|
48
|
+
version_requirement:
|
49
|
+
version_requirements: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - "="
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 1.2.8
|
54
|
+
version:
|
16
55
|
description: Create, Distribute, and Install Ruby applications easily
|
17
56
|
email: yutaka.hara/at/gmail.com
|
18
57
|
executables:
|
@@ -45,15 +84,29 @@ files:
|
|
45
84
|
- runtime/lib/ruby-station.rb
|
46
85
|
- runtime/lib/ruby-station/helper.rb
|
47
86
|
- runtime/lib/ruby-station/helper/rails.rb
|
48
|
-
- runtime/ruby-station-runtime-0.0.3.gem
|
49
87
|
- runtime/ruby-station-runtime-0.0.4.gem
|
50
88
|
- sample.config.yaml
|
51
|
-
-
|
52
|
-
-
|
89
|
+
- tests/README
|
90
|
+
- tests/Rakefile
|
91
|
+
- tests/data/conf_dir/config.yaml
|
92
|
+
- tests/features/install_file.feature
|
93
|
+
- tests/features/install_name.feature
|
94
|
+
- tests/features/list.feature
|
95
|
+
- tests/features/step_definitions/application_steps.rb
|
96
|
+
- tests/features/step_definitions/curelity_steps.rb
|
97
|
+
- tests/features/support/env.rb
|
98
|
+
- tests/features/uninstall.feature
|
99
|
+
- tests/features/upgrade.feature
|
100
|
+
- tests/spec/gem_manager.rb
|
101
|
+
- tests/test_helper.rb
|
102
|
+
- util/gem_manager.rb
|
103
|
+
- util/servant.rb
|
53
104
|
- view/applications/do_install.xhtml
|
105
|
+
- view/applications/foo.xhtml
|
54
106
|
- view/applications/install.xhtml
|
55
107
|
- view/applications/uninstall.xhtml
|
56
108
|
- view/index.xhtml
|
109
|
+
- view/notfound.xhtml
|
57
110
|
has_rdoc: true
|
58
111
|
homepage: http://github.com/yhara/ruby-station
|
59
112
|
licenses: []
|
@@ -82,5 +135,5 @@ rubygems_version: 1.3.5
|
|
82
135
|
signing_key:
|
83
136
|
specification_version: 3
|
84
137
|
summary: Create, Distribute, and Install Ruby applications easily
|
85
|
-
test_files:
|
86
|
-
|
138
|
+
test_files: []
|
139
|
+
|
Binary file
|
data/spec/main.rb
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
require 'ramaze'
|
2
|
-
require 'ramaze/spec/helper'
|
3
|
-
|
4
|
-
require __DIR__('../start')
|
5
|
-
|
6
|
-
describe MainController do
|
7
|
-
behaves_like 'http', 'xpath'
|
8
|
-
ramaze :view_root => __DIR__('../view'),
|
9
|
-
:public_root => __DIR__('../public')
|
10
|
-
|
11
|
-
it 'should show start page' do
|
12
|
-
got = get('/')
|
13
|
-
got.status.should == 200
|
14
|
-
puts got.body
|
15
|
-
got.at('//title').text.strip.should ==
|
16
|
-
MainController.new.index
|
17
|
-
end
|
18
|
-
|
19
|
-
it 'should show /notemplate' do
|
20
|
-
got = get('/notemplate')
|
21
|
-
got.status.should == 200
|
22
|
-
got.at('//div').text.strip.should ==
|
23
|
-
MainController.new.notemplate
|
24
|
-
end
|
25
|
-
end
|