rhoconnect 4.0.0 → 4.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. data/CHANGELOG.md +8 -0
  2. data/Gemfile.lock +16 -18
  3. data/Rakefile +4 -4
  4. data/bench/benchapp/Rakefile +10 -16
  5. data/bench/blobapp/Rakefile +9 -18
  6. data/bench/distr_bench/distr_bench_main +1 -1
  7. data/bench/distr_bench/run_distr_client.sh +2 -1
  8. data/bench/lib/bench.rb +1 -1
  9. data/bench/lib/bench/cli.rb +2 -0
  10. data/bench/lib/bench/distr_runner.rb +5 -5
  11. data/bench/lib/bench/test_data.rb +2 -2
  12. data/bench/scripts/test_query_script.rb +7 -6
  13. data/bin/rhoconnect +2 -0
  14. data/bin/rhoconnect-benchmark +13 -1
  15. data/commands/redis/redis_download.rb +1 -1
  16. data/commands/rhoconnect/routes.rb +12 -0
  17. data/doc/authentication.txt +1 -1
  18. data/doc/command-line.txt +1 -1
  19. data/doc/deploying.txt +2 -2
  20. data/doc/migration.txt +21 -12
  21. data/doc/push-client-setup-android.txt +1 -1
  22. data/doc/push-client-setup-rps.txt +3 -1
  23. data/doc/supported-platforms.txt +14 -7
  24. data/examples/simple/Rakefile +0 -1
  25. data/generators/rhoconnect.rb +15 -3
  26. data/generators/templates/application/Rakefile +1 -2
  27. data/js-adapters/ballroom.js +36 -9
  28. data/js-adapters/node.rb +8 -2
  29. data/js-adapters/node_channel.rb +10 -6
  30. data/js-adapters/rhoconnect_helpers.js +4 -0
  31. data/js-adapters/router.js +5 -3
  32. data/js-adapters/server.js +1 -1
  33. data/lib/rhoconnect.rb +9 -5
  34. data/lib/rhoconnect/api_token.rb +1 -2
  35. data/lib/rhoconnect/client.rb +1 -1
  36. data/lib/rhoconnect/controller/js_base.rb +7 -2
  37. data/lib/rhoconnect/model/base.rb +1 -1
  38. data/lib/rhoconnect/predefined_adapters/controllers/js/rho_internal_js_bench_adapter_controller.js +12 -0
  39. data/lib/rhoconnect/predefined_adapters/models/js/rho_internal_js_bench_adapter.js +107 -0
  40. data/lib/rhoconnect/source.rb +5 -0
  41. data/lib/rhoconnect/store.rb +3 -0
  42. data/lib/rhoconnect/version.rb +1 -1
  43. data/lib/rhoconnect/web-console/server.rb +1 -2
  44. data/rhoconnect.gemspec +0 -1
  45. data/spec/apps/jstestapp/Rakefile +1 -0
  46. data/spec/apps/jstestapp/config.ru +16 -0
  47. data/spec/apps/jstestapp/controllers/js/application_controller.js +18 -0
  48. data/spec/apps/jstestapp/settings/license.key +1 -0
  49. data/spec/apps/jstestapp/settings/settings.yml +13 -0
  50. data/spec/controllers/js_base_spec.rb +129 -97
  51. data/spec/predefined_adapters/rho_internal_bench_adapter_controller_js_spec.rb +111 -0
  52. data/spec/predefined_adapters/rho_internal_js_bench_adapter_js_spec.rb +44 -0
  53. data/spec/spec_helper.rb +4 -0
  54. data/tasks/redis.rake +9 -127
  55. metadata +19 -20
  56. data/lib/rhoconnect/tasks.rb +0 -315
@@ -1,3 +1,11 @@
1
+ ## 4.0.1 (2013-10-29)
2
+ * fixed issue with loading JS Store api from controller context
3
+ * spelling mistakes in docs
4
+ * Updated load path to run CLI commands directly from rhoconnect bin directory
5
+ * Added warning msg to app generator if it cannot run bundler due to missing rhoconnect version.
6
+ * Setup redis_url variable to represent connection string for redis (fixes #57611994 and #57773212)
7
+ * Use unique identifier for pubsub channel names (#58934776)
8
+
1
9
  ## 4.0.0 (2013-09-05)
2
10
  * Final v4.0.0 stable release based on beta.63
3
11
 
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rhoconnect (4.0.0)
4
+ rhoconnect (4.0.1)
5
5
  bundler (~> 1.0)
6
6
  connection_pool (~> 1.0.0)
7
7
  json (~> 1.7.7)
@@ -14,7 +14,6 @@ PATH
14
14
  sinatra (~> 1.3)
15
15
  templater (~> 1.0.0)
16
16
  thor (~> 0.18.0)
17
- uuidtools (>= 2.1.1)
18
17
 
19
18
  GEM
20
19
  remote: https://rubygems.org/
@@ -28,7 +27,7 @@ GEM
28
27
  builder
29
28
  mime-types
30
29
  xml-simple
31
- backports (3.3.3)
30
+ backports (3.3.5)
32
31
  builder (3.2.2)
33
32
  cabin (0.6.1)
34
33
  childprocess (0.3.9)
@@ -45,7 +44,7 @@ GEM
45
44
  diff-lcs (1.1.3)
46
45
  eventmachine (1.0.3)
47
46
  excon (0.22.1)
48
- execjs (2.0.1)
47
+ execjs (2.0.2)
49
48
  extlib (0.9.16)
50
49
  ffaker (1.14.0)
51
50
  ffi (1.9.0)
@@ -68,12 +67,12 @@ GEM
68
67
  clamp (~> 0.6)
69
68
  ftw (~> 0.0.30)
70
69
  json (>= 1.7.7)
71
- ftw (0.0.34)
70
+ ftw (0.0.36)
72
71
  addressable
73
72
  backports (>= 2.6.2)
74
73
  cabin (> 0)
75
74
  http_parser.rb (= 0.5.3)
76
- highline (1.6.19)
75
+ highline (1.6.20)
77
76
  hike (1.2.3)
78
77
  http_parser.rb (0.5.3)
79
78
  jasmine (1.3.2)
@@ -89,25 +88,25 @@ GEM
89
88
  rainbow
90
89
  sprockets (~> 2)
91
90
  json (1.7.7)
92
- mime-types (1.25)
91
+ mime-types (2.0)
93
92
  mono_logger (1.1.0)
94
- multi_json (1.7.9)
93
+ multi_json (1.8.2)
95
94
  net-scp (1.1.2)
96
95
  net-ssh (>= 2.6.5)
97
- net-ssh (2.6.8)
96
+ net-ssh (2.7.0)
98
97
  nokogiri (1.5.10)
99
98
  rack (1.5.2)
100
99
  rack-fiber_pool (0.9.3)
101
- rack-protection (1.5.0)
100
+ rack-protection (1.5.1)
102
101
  rack
103
102
  rack-test (0.6.2)
104
103
  rack (>= 1.0)
105
104
  rainbow (1.1.4)
106
105
  rake (10.0.4)
107
- redis (3.0.4)
106
+ redis (3.0.5)
108
107
  redis-namespace (1.3.1)
109
108
  redis (~> 3.0.0)
110
- resque (1.24.1)
109
+ resque (1.25.1)
111
110
  mono_logger (~> 1.0)
112
111
  multi_json (~> 1.0)
113
112
  redis-namespace (~> 1.2)
@@ -125,7 +124,7 @@ GEM
125
124
  rspec-mocks (2.10.1)
126
125
  ruby-hmac (0.4.0)
127
126
  rubyzip (0.9.9)
128
- safe_yaml (0.9.5)
127
+ safe_yaml (0.9.7)
129
128
  selenium-webdriver (2.35.1)
130
129
  childprocess (>= 0.2.5)
131
130
  multi_json (~> 1.0)
@@ -137,7 +136,7 @@ GEM
137
136
  simplecov-html (0.7.1)
138
137
  simplecov-rcov (0.2.3)
139
138
  simplecov (>= 0.4.1)
140
- sinatra (1.4.3)
139
+ sinatra (1.4.4)
141
140
  rack (~> 1.4)
142
141
  rack-protection (~> 1.4)
143
142
  tilt (~> 1.3, >= 1.3.4)
@@ -151,13 +150,12 @@ GEM
151
150
  diff-lcs (>= 1.1.2)
152
151
  extlib (>= 0.9.5)
153
152
  highline (>= 1.4.0)
154
- thin (1.5.1)
153
+ thin (1.6.0)
155
154
  daemons (>= 1.0.9)
156
- eventmachine (>= 0.12.6)
157
- rack (>= 1.0.0)
155
+ eventmachine (>= 1.0.0)
156
+ rack (>= 1.5.0)
158
157
  thor (0.18.1)
159
158
  tilt (1.4.1)
160
- uuidtools (2.1.4)
161
159
  vegas (0.1.11)
162
160
  rack (>= 1.0.0)
163
161
  webmock (1.9.3)
data/Rakefile CHANGED
@@ -2,9 +2,9 @@ require 'rubygems'
2
2
  require 'bundler'
3
3
  Bundler.setup(:default, :development, :test, :build)
4
4
 
5
- load 'tasks/redis.rake'
6
- load 'installer/utils/nix_installation.rake'
7
- load 'installer/utils/package_upload/repos.rake'
5
+ load File.join(File.dirname(__FILE__) ,'tasks', 'redis.rake')
6
+ load File.join(File.dirname(__FILE__) ,'installer', 'utils', 'nix_installation.rake')
7
+ load File.join(File.dirname(__FILE__) ,'installer', 'utils', '', 'package_upload', 'repos.rake')
8
8
 
9
9
  require 'yaml'
10
10
  $:.unshift File.join(File.dirname(__FILE__),'lib')
@@ -181,7 +181,7 @@ end
181
181
 
182
182
  begin
183
183
  require 'jasmine'
184
- load 'tasks/jasmine.rake'
184
+ load File.join(File.dirname(__FILE__) ,'tasks', 'jasmine.rake')
185
185
  rescue LoadError
186
186
  task :jasmine do
187
187
  abort "Jasmine is not available. In order to run jasmine, you must: (sudo) gem install jasmine"
@@ -1,22 +1,16 @@
1
1
  require 'rubygems'
2
2
  require 'bundler/setup'
3
-
4
- begin
5
- require 'vendor/rhoconnect/lib/rhoconnect/tasks'
6
- require 'vendor/rhoconnect/lib/rhoconnect'
7
- rescue LoadError
8
- require 'rhoconnect/tasks'
9
- require 'rhoconnect'
10
- end
3
+ require 'rhoconnect'
4
+ require 'resque/tasks'
11
5
 
12
6
  ROOT_PATH = File.expand_path(File.dirname(__FILE__))
13
7
 
14
- begin
15
- require 'resque/tasks'
16
- task "resque:setup" do
17
- require 'application'
8
+ task 'resque:setup' do
9
+ # The number of redis connections you want a job to have
10
+ Rhoconnect.connection_pool_size = 1
11
+ require 'rhoconnect/application/init'
12
+
13
+ Resque.after_fork do
14
+ Store.reconnect
18
15
  end
19
- rescue LoadError
20
- puts "Resque not available. Install it with: "
21
- puts "gem install resque\n\n"
22
- end
16
+ end
@@ -1,25 +1,16 @@
1
1
  require 'rubygems'
2
2
  require 'bundler/setup'
3
- require 'rhoconnect/tasks'
3
+ require 'rhoconnect'
4
+ require 'resque/tasks'
4
5
 
5
6
  ROOT_PATH = File.expand_path(File.dirname(__FILE__))
6
7
 
7
- begin
8
- require 'resque/tasks'
9
- task "resque:setup" do
10
- require 'application'
11
- end
12
- desc "run rhoconnect console"
13
- task :console, :environment do |t, args|
14
- if RedisRunner.running?
15
- #load development environment by default
16
- ENV['RACK_ENV'] = args[:environment] || 'development'
17
- sh "irb -rubygems -r rhoconnect -r console -r application"
18
- else
19
- puts "Redis is not running. Please start it by running 'rake redis:start' command."
20
- end
8
+ task 'resque:setup' do
9
+ # The number of redis connections you want a job to have
10
+ Rhoconnect.connection_pool_size = 1
11
+ require 'rhoconnect/application/init'
12
+
13
+ Resque.after_fork do
14
+ Store.reconnect
21
15
  end
22
- rescue LoadError
23
- puts "Resque not available. Install it with: "
24
- puts "gem install resque\n\n"
25
16
  end
@@ -115,7 +115,7 @@ begin
115
115
 
116
116
  #7) Start-up all clients
117
117
  n_iterations = 50
118
- command="cd /opt/rhoconnect/bench/distr_bench; ./run_distr_client.sh #{sync_key} #{server} #{n_iterations} #{Bench.datasize} 1>/dev/null"
118
+ command="cd /opt/rhoconnect/bench/distr_bench; ./run_distr_client.sh #{sync_key} #{server} #{n_iterations} #{Bench.datasize} #{Bench.adapter_name} 1>/dev/null"
119
119
 
120
120
  clients = ['ec2-107-20-56-25.compute-1.amazonaws.com',
121
121
  'ec2-107-20-56-25.compute-1.amazonaws.com',
@@ -3,10 +3,11 @@ test_label=$1
3
3
  server=$2
4
4
  n_iterations=$3
5
5
  payload=$4
6
+ adapter_name=$5
6
7
 
7
8
  RACK_ENV=production
8
9
  export RACK_ENV
9
10
 
10
11
  sync_key="${test_label}_$payload"
11
12
  n_threads=1
12
- ruby distr_bench start '../scripts/test_query_script.rb' 'rhoadmin' '' $server $sync_key $n_threads $n_iterations $payload
13
+ ruby distr_bench start '../scripts/test_query_script.rb' 'rhoadmin' '' $server $sync_key $n_threads $n_iterations $payload 0 $adapter_name
@@ -26,7 +26,7 @@ module Bench
26
26
  include TestData
27
27
  include Utils
28
28
 
29
- attr_accessor :concurrency, :iterations, :admin_login, :simtime
29
+ attr_accessor :concurrency, :iterations, :admin_login, :simtime, :adapter_name
30
30
  attr_accessor :admin_password, :user_name
31
31
  attr_accessor :password, :base_url, :host, :token
32
32
  attr_accessor :total_time, :sessions, :verify_error
@@ -15,6 +15,7 @@ module Bench
15
15
  Bench.iterations = params[3].to_i unless params[3].nil?
16
16
  Bench.datasize = params[4].to_i unless params[4].nil?
17
17
  Bench.simtime = params[5].to_i unless params[5].nil?
18
+ Bench.adapter_name = params[6] unless params[6].nil?
18
19
  Bench.admin_login = login
19
20
  Bench.admin_password = password
20
21
  load(script)
@@ -41,6 +42,7 @@ module Bench
41
42
  Bench.iterations = params[3].to_i unless params[3].nil?
42
43
  Bench.datasize = params[4].to_i unless params[4].nil?
43
44
  Bench.simtime = params[5].to_i unless params[5].nil?
45
+ Bench.adapter_name = params[6] unless params[6].nil?
44
46
  Bench.admin_login = login
45
47
  Bench.admin_password = password
46
48
  load(script)
@@ -8,7 +8,7 @@ module Bench
8
8
  @clients_group = clientgroup
9
9
  end
10
10
 
11
- def run(server, sync_key, payload, concurrency, niterations, result_filename=nil, sim_time = 0)
11
+ def run(server, sync_key, payload, concurrency, niterations, result_filename=nil, sim_time = 0, bench_adapter_name = "RhoInternalBenchmarkAdapter")
12
12
  # 1) Extract server name
13
13
  server ||= 'default'
14
14
  if server != 'default'
@@ -20,7 +20,7 @@ module Bench
20
20
  expected_data = Bench.get_test_data(Bench.datasize)
21
21
  Bench.concurrency = concurrency.to_i
22
22
  Bench.iterations = niterations.to_i
23
-
23
+ Bench.adapter_name = bench_adapter_name
24
24
  # 3) extract result filename
25
25
  Bench.result_filename = result_filename
26
26
 
@@ -33,8 +33,8 @@ module Bench
33
33
  Bench.user_name = "benchuser"
34
34
  Bench.password = "password"
35
35
  Bench.set_server_state("test_db_storage:application:#{Bench.user_name}",expected_data)
36
- Bench.reset_refresh_time('RhoInternalBenchmarkAdapter', 0)
37
- Bench.set_simulate_time('RhoInternalBenchmarkAdapter', sim_time)
36
+ Bench.reset_refresh_time(Bench.adapter_name, 0)
37
+ Bench.set_simulate_time(Bench.adapter_name, sim_time)
38
38
 
39
39
  #6) set the sync key
40
40
  @start_time = Time.now + 10.0
@@ -42,7 +42,7 @@ module Bench
42
42
  puts "Sync Key #{sync_key} is set to #{@start_time} - waiting for clients now!!!"
43
43
 
44
44
  #7) Start-up all clients
45
- command="cd /opt/rhoconnect/bin; ruby run_client_benchmark #{server} #{sync_key} #{niterations} 1 #{Bench.datasize} 1>/dev/null"
45
+ command="cd /opt/rhoconnect/bin; ruby run_client_benchmark #{server} #{sync_key} #{niterations} 1 #{Bench.datasize} #{Bench.adapter_name} 1>/dev/null"
46
46
  ec2_clients = clients_group.client_instances[0,concurrency]
47
47
  Bench::AWSUtils.run_stack_ssh_command(ec2_clients, command)
48
48
 
@@ -1,5 +1,5 @@
1
1
  require 'ffaker'
2
- require 'uuidtools'
2
+ require 'securerandom'
3
3
 
4
4
  module Bench
5
5
  module TestData
@@ -43,7 +43,7 @@ module Bench
43
43
  def generate_fake_data(num, generate_blob)
44
44
  res = {}
45
45
  num.times do |n|
46
- mock_id = UUIDTools::UUID.random_create.to_s.gsub(/\-/,'')
46
+ mock_id = SecureRandom.hex
47
47
  res[mock_id] = {
48
48
  "mock_id" => mock_id,
49
49
  "FirstName" => Faker::Name.first_name,
@@ -2,6 +2,7 @@ include BenchHelpers
2
2
  bench_log "Runs simple login,clientcreate,clientregister,sync session and validates response"
3
3
 
4
4
  Bench.config do |config|
5
+ config.adapter_name ||= "RhoInternalBenchmarkAdapter"
5
6
  config.concurrency ||= 1
6
7
  config.iterations ||= 10
7
8
  config.datasize ||= 100
@@ -39,7 +40,7 @@ Bench.config do |config|
39
40
  #exit(1)
40
41
 
41
42
  #config.reset_refresh_time('RhoInternalBenchmarkAdapter', 0)
42
- config.set_simulate_time('RhoInternalBenchmarkAdapter', Bench.simtime)
43
+ config.set_simulate_time(Bench.adapter_name, Bench.simtime)
43
44
  end
44
45
  end
45
46
 
@@ -73,14 +74,14 @@ Bench.test do |config,session|
73
74
  pagesize = @datasize
74
75
  pagesize = @datasize/10 if @datasize > 1000
75
76
  session.get "get-cud",
76
- "#{config.host}/app/#{Rhoconnect::API_VERSION}/RhoInternalBenchmarkAdapter",
77
+ "#{config.host}/app/#{Rhoconnect::API_VERSION}/#{Bench.adapter_name}",
77
78
  {'X-RhoConnect-CLIENT-ID' => session.client_id} do
78
79
  {'p_size' => pagesize}
79
80
  end
80
81
  token = session.last_result.headers[:x_rhoconnect_page_token]
81
82
  while (token and token != '') do
82
83
  session.get "ack-cud",
83
- "#{config.host}/app/#{Rhoconnect::API_VERSION}/RhoInternalBenchmarkAdapter",
84
+ "#{config.host}/app/#{Rhoconnect::API_VERSION}/#{Bench.adapter_name}",
84
85
  {'X-RhoConnect-CLIENT-ID' => session.client_id} do
85
86
  {'token' => token,
86
87
  'p_size' => pagesize}
@@ -93,7 +94,7 @@ Bench.test do |config,session|
93
94
  # we also generate 2 random records for CUD calls
94
95
  expected_for_cud = Bench.generate_fake_data(2, false)
95
96
  session.post "create-object",
96
- "#{config.host}/app/#{Rhoconnect::API_VERSION}/RhoInternalBenchmarkAdapter",
97
+ "#{config.host}/app/#{Rhoconnect::API_VERSION}/#{Bench.adapter_name}",
97
98
  {:content_type => :json, 'X-RhoConnect-CLIENT-ID' => session.client_id} do
98
99
  {:create => expected_for_cud}.to_json
99
100
  end
@@ -101,13 +102,13 @@ Bench.test do |config,session|
101
102
 
102
103
  obj_to_delete = expected_for_cud.keys[0]
103
104
  session.delete "delete_object",
104
- "#{config.host}/app/#{Rhoconnect::API_VERSION}/RhoInternalBenchmarkAdapter/#{obj_to_delete}",
105
+ "#{config.host}/app/#{Rhoconnect::API_VERSION}/#{Bench.adapter_name}/#{obj_to_delete}",
105
106
  {'X-RhoConnect-CLIENT-ID' => session.client_id}
106
107
  session.last_result.verify_code(200)
107
108
 
108
109
  obj_to_delete = expected_for_cud.keys[1]
109
110
  session.post "push_deletes",
110
- "#{config.host}/app/#{Rhoconnect::API_VERSION}/RhoInternalBenchmarkAdapter/push_deletes",
111
+ "#{config.host}/app/#{Rhoconnect::API_VERSION}/#{Bench.adapter_name}/push_deletes",
111
112
  {'X-RhoConnect-API-TOKEN' => config.token, :content_type => :json} do
112
113
  {:user_id => username,
113
114
  :rebuild_md => false,
@@ -1,5 +1,7 @@
1
1
  #!/usr/bin/env ruby -W0
2
2
  require 'thor'
3
+
4
+ $:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
3
5
  require_relative "../lib/rhoconnect/utilities"
4
6
  include Utilities
5
7
 
@@ -1,8 +1,10 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require 'rubygems'
4
+
4
5
  $:.unshift File.join(File.dirname(__FILE__),'..','bench','lib')
5
6
  $:.unshift File.join(File.dirname(__FILE__),'..','bench')
7
+ require 'forwardable'
6
8
  require 'bench'
7
9
  require 'optparse'
8
10
 
@@ -23,6 +25,11 @@ def parse_options
23
25
  opts.on( '-u', '--url URL', 'Use URL as a server for benchmarking' ) do |url|
24
26
  options[:server_url] = url
25
27
  end
28
+
29
+ options[:js_bench] = false
30
+ opts.on( '-j', '--jsbench', 'Runs Benchmark tests against JavaScript Benchmark Adapter (requires JS App)' ) do
31
+ options[:js_bench] = true
32
+ end
26
33
 
27
34
  options[:start_server] = nil
28
35
  opts.on( '-s', '--startserver [APP_PATH]', 'Starts Rhoconnect App Server on localhost and use it for benchmarking' ) do |path|
@@ -218,6 +225,9 @@ begin
218
225
  x_keys = concurrency_array.collect {|t| t.to_s }
219
226
  Bench.prepare_bench_results_meta(result_dir, options[:title], x_keys)
220
227
  end
228
+
229
+ # adapter name
230
+ bench_adapter_name = options[:js_bench] ? "RhoInternalJsBenchAdapter" : "RhoInternalBenchmarkAdapter"
221
231
 
222
232
  concurrency_array.each do |concurrency|
223
233
  payload_array.each do |payload|
@@ -245,11 +255,13 @@ begin
245
255
  bench_args[8] = payload
246
256
  # simulate backend delay
247
257
  bench_args[9] = options[:simtime]
258
+ # JS Adapter
259
+ bench_args[10] = bench_adapter_name
248
260
 
249
261
  # now execute Bench
250
262
  if(options[:distributed])
251
263
  sync_key = "#{options[:title]}_#{payload}"
252
- options[:distr_runner].run(Bench.base_url, sync_key, payload, concurrency, options[:num_iterations], result_fname, options[:simtime])
264
+ options[:distr_runner].run(Bench.base_url, sync_key, payload, concurrency, options[:num_iterations], result_fname, options[:simtime], bench_adapter_name)
253
265
  else
254
266
  Bench::Cli.start bench_args
255
267
  end
@@ -1,4 +1,4 @@
1
- REDIS_RELEASE = "2.6.11"
1
+ REDIS_RELEASE = "2.6.14"
2
2
  Execute.define_task do
3
3
  desc "redis-download", "Download redis release #{REDIS_RELEASE}"
4
4
  def redis_download
@@ -21,6 +21,18 @@ Execute.define_task do
21
21
  puts " --> #{verb.to_s.upcase}\t #{path}"
22
22
  end
23
23
  end
24
+ # also , look in superclasses
25
+ klass = controller.helpers.class
26
+ superklass = controller.helpers.class.superclass
27
+ until superklass.nil? or (superklass.name == "Sinatra::Base")
28
+ superklass.paths.each do |verb, paths|
29
+ paths.each do |path|
30
+ puts " --> #{verb.to_s.upcase}\t #{path}\t (defined in #{superklass.name})"
31
+ end
32
+ end
33
+ klass = superklass
34
+ superklass = klass.superclass
35
+ end
24
36
  end
25
37
  rescue Exception => e
26
38
  Rhoconnect.log "#{e.inspect}"