rhoconnect 4.0.0 → 4.0.1

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 (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}"