rhoconnect 3.4.5 → 4.0.0.beta.10
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/CHANGELOG.md +57 -3
- data/Gemfile +9 -7
- data/Gemfile.lock +37 -37
- data/Rakefile +18 -7
- data/bench/benchapp/Gemfile +1 -1
- data/bench/benchapp/config.ru +0 -3
- data/bench/benchapp/controllers/ruby/application.rb +17 -0
- data/bench/benchapp/controllers/ruby/application_controller.rb +17 -0
- data/bench/benchapp/controllers/ruby/mock_adapter_controller.rb +8 -0
- data/bench/benchapp/controllers/ruby/queue_mock_adapter_controller.rb +8 -0
- data/bench/benchapp/{sources → models/ruby}/mock_adapter.rb +1 -1
- data/bench/benchapp/{sources → models/ruby}/queue_mock_adapter.rb +0 -0
- data/bench/benchapp/spec/{sources → models/ruby}/mock_adapter_spec.rb +1 -1
- data/bench/benchapp/spec/{sources → models/ruby}/queue_mock_adapter_spec.rb +1 -1
- data/bench/benchapp/spec/spec_helper.rb +2 -2
- data/bench/blobapp/Gemfile +1 -1
- data/bench/blobapp/config.ru +0 -3
- data/bench/blobapp/controllers/ruby/application_controller.rb +17 -0
- data/bench/blobapp/controllers/ruby/blob_adapter_controller.rb +8 -0
- data/bench/blobapp/{sources → models/ruby}/blob_adapter.rb +9 -2
- data/bench/blobapp/spec/{sources → models/ruby}/blob_adapter_spec.rb +1 -1
- data/bench/blobapp/spec/spec_helper.rb +1 -1
- data/bench/lib/bench/cli.rb +1 -1
- data/bench/scripts/blob_cud_script.rb +1 -1
- data/bench/scripts/query_md_script.rb +1 -1
- data/bench/scripts/query_only_script.rb +1 -1
- data/bench/scripts/query_script.rb +1 -1
- data/bench/scripts/test_query_script.rb +7 -1
- data/bench/spec/mock_adapter_spec.rb +1 -1
- data/bench/spec/result_spec.rb +3 -3
- data/bin/rhoconnect +5 -3
- data/commands/dtach/dtach_install.rb +2 -2
- data/commands/execute.rb +8 -3
- data/commands/generators/app.rb +3 -3
- data/commands/generators/controller.rb +6 -0
- data/commands/generators/model.rb +6 -0
- data/commands/generators/source.rb +3 -3
- data/commands/generators/update.rb +1 -1
- data/commands/redis/redis_about.rb +2 -2
- data/commands/redis/redis_download.rb +1 -1
- data/commands/redis/redis_install.rb +4 -3
- data/commands/redis/redis_restart.rb +4 -4
- data/commands/redis/redis_start.rb +5 -4
- data/commands/redis/redis_startbg.rb +5 -4
- data/commands/redis/redis_status.rb +13 -0
- data/commands/redis/redis_stop.rb +3 -3
- data/commands/rhoconnect/config.rb +28 -16
- data/commands/rhoconnect/flushdb.rb +1 -2
- data/commands/rhoconnect/get_token.rb +15 -11
- data/commands/rhoconnect/restart.rb +13 -5
- data/commands/rhoconnect/set_admin_password.rb +8 -8
- data/commands/rhoconnect/start.rb +74 -16
- data/commands/rhoconnect/startbg.rb +1 -1
- data/commands/rhoconnect/startdebug.rb +1 -1
- data/commands/rhoconnect/stop.rb +13 -1
- data/commands/rhoconnect/web.rb +5 -5
- data/commands/rhoconnect_console/console.rb +7 -5
- data/commands/{rhoconnect → rhoconnect_spec}/spec.rb +0 -0
- data/commands/rhoconnect_war/war.rb +9 -9
- data/commands/utilities/blank_app.ru +56 -0
- data/commands/utilities/redis_runner.rb +54 -19
- data/doc/authentication.txt +80 -6
- data/doc/blob-sync.txt +104 -97
- data/doc/bulk-sync.txt +1 -1
- data/doc/client-java.txt +3 -3
- data/doc/client-objc.txt +2 -2
- data/doc/client.txt +4 -4
- data/doc/command-line.txt +105 -200
- data/doc/data-partitioning.txt +40 -0
- data/doc/deploying.txt +249 -77
- data/doc/extending-rhoconnect-server.txt +40 -57
- data/doc/heroku-addon.txt +2 -0
- data/doc/install.txt +45 -95
- data/doc/introduction.txt +1 -1
- data/doc/java-plugin.txt +365 -190
- data/doc/metadata.txt +1 -1
- data/doc/migration.txt +108 -142
- data/doc/preparing-production.txt +1 -1
- data/doc/push-backend-setup.txt +2 -0
- data/doc/push-client-setup-android.txt +78 -0
- data/doc/push-client-setup-bb.txt +81 -0
- data/doc/push-client-setup-ios.txt +70 -0
- data/doc/push-client-setup-rps.txt +200 -0
- data/doc/push-client-setup.txt +63 -66
- data/doc/push-server-setup.txt +67 -40
- data/doc/push-testing.txt +29 -0
- data/doc/push.txt +21 -6
- data/doc/rest-api.txt +128 -55
- data/doc/rhoconnect-redis-stack.txt +120 -0
- data/doc/settings.txt +4 -12
- data/doc/source-adapters-intro.txt +28 -0
- data/doc/source-adapters.txt +235 -272
- data/doc/stats-middleware.txt +9 -29
- data/doc/supported-platforms.txt +21 -30
- data/doc/testing.txt +40 -42
- data/doc/tutorial.txt +72 -57
- data/examples/simple/Gemfile +1 -1
- data/examples/simple/application.rb +4 -5
- data/examples/simple/my_server.rb +2 -2
- data/examples/simple/settings/settings.yml +1 -1
- data/generators/rhoconnect.rb +151 -50
- data/generators/templates/application/Gemfile +1 -1
- data/generators/templates/application/Rakefile +3 -3
- data/generators/templates/application/config.ru +1 -4
- data/generators/templates/application/controllers/application_controller.rb +17 -0
- data/generators/templates/application/controllers/js/application_controller.js +14 -0
- data/generators/templates/application/controllers/ruby/application_controller.rb +17 -0
- data/generators/templates/application/package.json +8 -0
- data/generators/templates/application/rcgemfile +2 -5
- data/generators/templates/application/settings/settings.yml +3 -3
- data/generators/templates/application/spec/application_controller_spec.rb +23 -0
- data/generators/templates/application/spec/js_spec.rb +25 -0
- data/generators/templates/application/spec/spec_helper.rb +21 -7
- data/generators/templates/source/controllers/js/controller.js +7 -0
- data/generators/templates/source/controllers/ruby/controller.rb +8 -0
- data/generators/templates/source/controllers/ruby/controller_spec.rb +27 -0
- data/generators/templates/source/models/js/model.js +46 -0
- data/generators/templates/source/{source_adapter.rb → models/ruby/model.rb} +15 -10
- data/generators/templates/source/{source_spec.rb → models/ruby/model_spec.rb} +1 -1
- data/install.sh +5 -5
- data/installer/unix-like/create_texts.rb +2 -2
- data/installer/unix-like/rho_connect_install_constants.rb +2 -2
- data/installer/unix-like/rho_connect_install_utilities.rb +1 -1
- data/installer/utils/constants.rb +4 -4
- data/js-adapters/ballroom.js +216 -0
- data/js-adapters/node.rb +52 -0
- data/js-adapters/node_channel.rb +181 -0
- data/js-adapters/request.js +27 -0
- data/js-adapters/response.js +57 -0
- data/js-adapters/rhoconnect_helpers.js +60 -0
- data/js-adapters/router.js +60 -0
- data/js-adapters/server.js +5 -0
- data/lib/rhoconnect/api/app/ans_login.rb +3 -3
- data/lib/rhoconnect/api/app/bulk_data.rb +10 -10
- data/lib/rhoconnect/api/app/fast_delete.rb +11 -10
- data/lib/rhoconnect/api/app/fast_insert.rb +11 -10
- data/lib/rhoconnect/api/app/fast_update.rb +11 -10
- data/lib/rhoconnect/api/app/login.rb +5 -5
- data/lib/rhoconnect/api/app/push_deletes.rb +12 -11
- data/lib/rhoconnect/api/app/push_objects.rb +12 -11
- data/lib/rhoconnect/api/app/query.rb +8 -7
- data/lib/rhoconnect/api/app/queue_updates.rb +98 -94
- data/lib/rhoconnect/api/app/search.rb +8 -7
- data/lib/rhoconnect/api/client/client_get_db_doc.rb +5 -5
- data/lib/rhoconnect/api/client/client_set_db_doc.rb +8 -8
- data/lib/rhoconnect/api/client/create.rb +7 -7
- data/lib/rhoconnect/api/client/get_client_params.rb +4 -4
- data/lib/rhoconnect/api/client/list_client_docs.rb +17 -17
- data/lib/rhoconnect/api/client/register.rb +12 -12
- data/lib/rhoconnect/api/client/reset.rb +5 -5
- data/lib/rhoconnect/api/readstate/set_refresh_time.rb +9 -9
- data/lib/rhoconnect/api/source/get_source_params.rb +4 -4
- data/lib/rhoconnect/api/source/list_sources.rb +16 -16
- data/lib/rhoconnect/api/source/update_source_params.rb +6 -6
- data/lib/rhoconnect/api/store/get_db_doc.rb +4 -4
- data/lib/rhoconnect/api/store/set_db_doc.rb +7 -7
- data/lib/rhoconnect/api/system/get_adapter.rb +4 -4
- data/lib/rhoconnect/api/system/get_license_info.rb +8 -8
- data/lib/rhoconnect/api/system/login.rb +15 -15
- data/lib/rhoconnect/api/system/reset.rb +11 -11
- data/lib/rhoconnect/api/system/save_adapter.rb +4 -4
- data/lib/rhoconnect/api/system/stats.rb +22 -22
- data/lib/rhoconnect/api/user/create_user.rb +7 -7
- data/lib/rhoconnect/api/user/delete_client.rb +6 -6
- data/lib/rhoconnect/api/user/delete_user.rb +11 -10
- data/lib/rhoconnect/api/user/list_clients.rb +4 -4
- data/lib/rhoconnect/api/user/list_source_docs.rb +10 -10
- data/lib/rhoconnect/api/user/list_users.rb +3 -3
- data/lib/rhoconnect/api/user/ping.rb +3 -3
- data/lib/rhoconnect/api/user/show_user.rb +3 -3
- data/lib/rhoconnect/api/user/update_user.rb +5 -5
- data/lib/rhoconnect/api/user/user_get_db_doc.rb +5 -5
- data/lib/rhoconnect/api/user/user_set_db_doc.rb +10 -10
- data/lib/rhoconnect/api_token.rb +5 -6
- data/lib/rhoconnect/app.rb +6 -46
- data/lib/rhoconnect/application/init.rb +5 -2
- data/lib/rhoconnect/async.rb +76 -39
- data/lib/rhoconnect/bulk_data/bulk_data.rb +6 -4
- data/lib/rhoconnect/client.rb +59 -9
- data/lib/rhoconnect/condition/admin_required.rb +27 -0
- data/lib/rhoconnect/condition/client_required.rb +50 -0
- data/lib/rhoconnect/condition/login_required.rb +22 -0
- data/lib/rhoconnect/condition/source_required.rb +49 -0
- data/lib/rhoconnect/condition/verbs.rb +17 -0
- data/lib/rhoconnect/condition/verify_success.rb +19 -0
- data/lib/rhoconnect/controller/app_base.rb +74 -0
- data/lib/rhoconnect/controller/base.rb +68 -0
- data/lib/rhoconnect/controller/clients_controller.rb +79 -0
- data/lib/rhoconnect/controller/dynamic_adapter_controller.rb +93 -0
- data/lib/rhoconnect/controller/js_base.rb +124 -0
- data/lib/rhoconnect/controller/read_state_controller.rb +22 -0
- data/lib/rhoconnect/controller/source_adapter_base.rb +14 -0
- data/lib/rhoconnect/controller/sources_controller.rb +44 -0
- data/lib/rhoconnect/controller/store_controller.rb +25 -0
- data/lib/rhoconnect/controller/system_controller.rb +67 -0
- data/lib/rhoconnect/controller/users_controller.rb +99 -0
- data/lib/rhoconnect/db_adapter.rb +1 -3
- data/lib/rhoconnect/document.rb +159 -50
- data/lib/rhoconnect/handler/authenticate/execute_methods.rb +77 -0
- data/lib/rhoconnect/handler/authenticate/runner.rb +49 -0
- data/lib/rhoconnect/handler/authenticate.rb +3 -0
- data/lib/rhoconnect/handler/bulk_data.rb +28 -0
- data/lib/rhoconnect/handler/changes/engine.rb +271 -0
- data/lib/rhoconnect/handler/changes/execute_methods.rb +88 -0
- data/lib/rhoconnect/handler/changes/pass_through_runner.rb +11 -0
- data/lib/rhoconnect/handler/changes/runner.rb +53 -0
- data/lib/rhoconnect/handler/changes.rb +31 -0
- data/lib/rhoconnect/handler/helpers/auth_method.rb +29 -0
- data/lib/rhoconnect/handler/helpers/binding.rb +18 -0
- data/lib/rhoconnect/handler/helpers/bulk_data.rb +53 -0
- data/lib/rhoconnect/handler/helpers/source_job.rb +14 -0
- data/lib/rhoconnect/handler/helpers.rb +4 -0
- data/lib/rhoconnect/handler/plugin_callbacks/execute_methods.rb +99 -0
- data/lib/rhoconnect/handler/plugin_callbacks/runner.rb +28 -0
- data/lib/rhoconnect/handler/plugin_callbacks.rb +67 -0
- data/lib/rhoconnect/handler/query/engine.rb +93 -0
- data/lib/rhoconnect/handler/query/execute_methods.rb +21 -0
- data/lib/rhoconnect/handler/query/pass_through_runner.rb +35 -0
- data/lib/rhoconnect/handler/query/runner.rb +270 -0
- data/lib/rhoconnect/handler/query.rb +19 -0
- data/lib/rhoconnect/handler/search/engine.rb +60 -0
- data/lib/rhoconnect/handler/search/execute_methods.rb +32 -0
- data/lib/rhoconnect/handler/search/pass_through_runner.rb +18 -0
- data/lib/rhoconnect/handler/search/runner.rb +104 -0
- data/lib/rhoconnect/handler/search.rb +26 -0
- data/lib/rhoconnect/handler/sync.rb +29 -0
- data/lib/rhoconnect/jobs/source_job.rb +13 -4
- data/lib/rhoconnect/js_adapter.rb +79 -0
- data/lib/rhoconnect/license.rb +10 -2
- data/lib/rhoconnect/middleware/current_user.rb +14 -1
- data/lib/rhoconnect/middleware/helpers.rb +10 -93
- data/lib/rhoconnect/middleware/x_domain_session_wrapper.rb +1 -1
- data/lib/rhoconnect/model/base.rb +229 -0
- data/lib/rhoconnect/model/dynamic_adapter_model.rb +90 -0
- data/lib/rhoconnect/model/js_base.rb +121 -0
- data/lib/rhoconnect/ping/android.rb +1 -1
- data/lib/rhoconnect/predefined_adapters/bench_adapter.rb +7 -4
- data/lib/rhoconnect/read_state.rb +3 -3
- data/lib/rhoconnect/server.rb +159 -190
- data/lib/rhoconnect/source.rb +100 -11
- data/lib/rhoconnect/stats/record.rb +10 -10
- data/lib/rhoconnect/store.rb +905 -591
- data/lib/rhoconnect/{model.rb → store_orm.rb} +53 -115
- data/lib/rhoconnect/tasks.rb +18 -4
- data/lib/rhoconnect/test_methods.rb +30 -17
- data/lib/rhoconnect/user.rb +35 -17
- data/lib/rhoconnect/utilities.rb +1 -1
- data/lib/rhoconnect/version.rb +2 -2
- data/lib/rhoconnect/web-console/server.rb +29 -14
- data/lib/rhoconnect/web-console/views/home.js +10 -10
- data/lib/rhoconnect/web-console/views/new_ping.js +1 -1
- data/lib/rhoconnect.rb +120 -51
- data/rhoconnect.gemspec +4 -3
- data/spec/api/api_helper.rb +1 -6
- data/spec/api/app/fast_delete_spec.rb +4 -4
- data/spec/api/app/fast_insert_spec.rb +4 -4
- data/spec/api/app/fast_update_spec.rb +8 -8
- data/spec/api/app/push_deletes_spec.rb +2 -2
- data/spec/api/app/push_objects_spec.rb +5 -5
- data/spec/api/client/client_get_db_doc_spec.rb +6 -4
- data/spec/api/client/client_set_db_doc_spec.rb +3 -2
- data/spec/api/client/get_client_params_spec.rb +14 -0
- data/spec/api/client/list_client_docs_spec.rb +30 -20
- data/spec/api/client/reset_spec.rb +36 -0
- data/spec/api/source/get_source_params_spec.rb +23 -17
- data/spec/api/system/get_license_info_spec.rb +0 -20
- data/spec/api/system/login_spec.rb +8 -0
- data/spec/api/system/reset_spec.rb +0 -1
- data/spec/api/system/stats_spec.rb +5 -5
- data/spec/api/user/create_user_spec.rb +14 -6
- data/spec/api/user/delete_user_spec.rb +20 -18
- data/spec/api/user/list_users_spec.rb +5 -6
- data/spec/api/user/update_user_spec.rb +5 -4
- data/spec/apps/rhotestapp/config.ru +16 -1
- data/spec/apps/rhotestapp/controllers/js/js_sample_controller.js +23 -0
- data/spec/apps/rhotestapp/controllers/js/sample2_controller.js +32 -0
- data/spec/apps/rhotestapp/controllers/ruby/application_controller.rb +21 -0
- data/spec/apps/rhotestapp/controllers/ruby/sample_adapter_controller.rb +8 -0
- data/spec/apps/rhotestapp/models/js/js_sample.js +55 -0
- data/spec/apps/rhotestapp/models/js/sample2.js +25 -0
- data/spec/apps/rhotestapp/{sources → models/ruby}/base_adapter.rb +0 -0
- data/spec/apps/rhotestapp/{sources → models/ruby}/fixed_schema_adapter.rb +0 -0
- data/spec/apps/rhotestapp/{sources → models/ruby}/other_adapter.rb +0 -0
- data/spec/apps/rhotestapp/{sources → models/ruby}/sample_adapter.rb +0 -0
- data/spec/apps/rhotestapp/{sources → models/ruby}/simple_adapter.rb +2 -2
- data/spec/apps/rhotestapp/{sources → models/ruby}/sub_adapter.rb +0 -0
- data/spec/apps/rhotestapp/settings/settings.yml +0 -1
- data/spec/bulk_data/bulk_data_spec.rb +20 -5
- data/spec/cli/cli_spec.rb +83 -0
- data/spec/client_spec.rb +20 -17
- data/spec/client_sync_spec.rb +244 -406
- data/spec/controllers/js_base_spec.rb +89 -0
- data/spec/doc/doc_spec.rb +18 -18
- data/spec/document_spec.rb +29 -13
- data/spec/dynamic_adapter_spec.rb +6 -6
- data/spec/generator/generator_spec.rb +7 -4
- data/spec/jobs/bulk_data_job_spec.rb +14 -10
- data/spec/jobs/source_job_spec.rb +8 -8
- data/spec/license_spec.rb +5 -2
- data/spec/models/js_model_spec.rb +39 -0
- data/spec/node_spec.rb +42 -0
- data/spec/perf/store_perf_spec.rb +67 -12
- data/spec/ping/android_spec.rb +1 -1
- data/spec/read_state_spec.rb +1 -1
- data/spec/rhoconnect_spec.rb +1 -1
- data/spec/server/cors_spec.rb +14 -18
- data/spec/server/server_spec.rb +265 -88
- data/spec/server/stats_spec.rb +1 -1
- data/spec/source_adapter_spec.rb +54 -27
- data/spec/source_spec.rb +8 -3
- data/spec/source_sync_spec.rb +538 -468
- data/spec/spec_helper.rb +35 -4
- data/spec/stats/record_spec.rb +10 -10
- data/spec/{model_spec.rb → store_orm_spec.rb} +56 -54
- data/spec/store_spec.rb +159 -179
- data/spec/support/shared_examples.rb +36 -27
- data/spec/sync_states_spec.rb +40 -33
- data/spec/test_methods_spec.rb +18 -14
- data/spec/user_spec.rb +17 -30
- metadata +156 -52
- data/bench/benchapp/application.rb +0 -39
- data/bench/blobapp/application.rb +0 -44
- data/commands/rhoconnect/clean_start.rb +0 -9
- data/commands/rhoconnect/create_user.rb +0 -18
- data/commands/rhoconnect/delete_device.rb +0 -9
- data/commands/rhoconnect/delete_user.rb +0 -8
- data/commands/rhoconnect/reset.rb +0 -16
- data/commands/rhoconnect/reset_refresh.rb +0 -11
- data/generators/templates/application/application.rb +0 -43
- data/lib/rhoconnect/client_sync.rb +0 -434
- data/lib/rhoconnect/dynamic_adapter.rb +0 -91
- data/lib/rhoconnect/middleware/admin_user.rb +0 -23
- data/lib/rhoconnect/middleware/current_request.rb +0 -16
- data/lib/rhoconnect/middleware/login_required.rb +0 -22
- data/lib/rhoconnect/source_adapter.rb +0 -132
- data/lib/rhoconnect/source_sync.rb +0 -464
- data/spec/apps/rhotestapp/application.rb +0 -23
|
@@ -3,36 +3,51 @@ require 'erb'
|
|
|
3
3
|
require 'json'
|
|
4
4
|
require 'rhoconnect/graph_helper'
|
|
5
5
|
|
|
6
|
-
module RhoconnectConsole
|
|
6
|
+
module RhoconnectConsole
|
|
7
7
|
class << self
|
|
8
8
|
ROOT_DIR = File.dirname(File.expand_path(__FILE__)) unless defined? ROOT_DIR
|
|
9
9
|
def root_path(*args)
|
|
10
10
|
File.join(ROOT_DIR, *args)
|
|
11
11
|
end
|
|
12
|
-
end
|
|
12
|
+
end
|
|
13
13
|
|
|
14
14
|
class Server < Sinatra::Base
|
|
15
15
|
set :views, RhoconnectConsole.root_path('templates')
|
|
16
16
|
set :public_folder, RhoconnectConsole.root_path
|
|
17
|
-
set :static, true
|
|
18
|
-
use Rack::Session::Cookie
|
|
17
|
+
set :static, true
|
|
18
|
+
use Rack::Session::Cookie
|
|
19
19
|
HEROKU_NAV = ENV['INSTANCE_ID'] ? RestClient.get('http://nav.heroku.com/v1/providers/header') : nil
|
|
20
20
|
before do
|
|
21
21
|
headers['Expires'] = 'Sun, 19 Nov 1978 05:00:00 GMT'
|
|
22
|
-
headers['Cache-Control'] = 'no-store, no-cache, must-revalidate'
|
|
22
|
+
headers['Cache-Control'] = 'no-store, no-cache, must-revalidate'
|
|
23
23
|
headers['Pragma'] = 'no-cache'
|
|
24
24
|
end
|
|
25
25
|
include GraphHelper
|
|
26
|
-
|
|
26
|
+
|
|
27
27
|
get '/' do
|
|
28
28
|
#if heroku instance single sign will already have logged in a have token in session
|
|
29
29
|
@token = session[:token] if ENV['INSTANCE_ID']
|
|
30
30
|
@heroku = RestClient.get('http://nav.heroku.com/v1/providers/header') if @token
|
|
31
31
|
@version = Rhoconnect::VERSION
|
|
32
32
|
@domain = ENV['RHODES_URL'] || request.host_with_port
|
|
33
|
-
@domain += "/application" if @domain
|
|
33
|
+
@domain += "/application" if @domain and !ENV['RHODES_URL']
|
|
34
34
|
erb :index
|
|
35
35
|
end
|
|
36
|
+
|
|
37
|
+
get "/heroku/resources/:id" do
|
|
38
|
+
begin
|
|
39
|
+
# check heroku addon started app
|
|
40
|
+
halt 403 unless ENV['INSTANCE_ID'] == params[:id] && params[:token] == ENV['API_TOKEN']
|
|
41
|
+
# rhoconnect authentication
|
|
42
|
+
session[:login] = 'rhoadmin'
|
|
43
|
+
session[:token] = User.load(session[:login]).token.value
|
|
44
|
+
rescue Exception => e
|
|
45
|
+
session[:token] = nil
|
|
46
|
+
halt 403
|
|
47
|
+
end
|
|
48
|
+
response.set_cookie('heroku-nav-data', :value => params[:nav], :path => '/')
|
|
49
|
+
redirect '/'
|
|
50
|
+
end
|
|
36
51
|
|
|
37
52
|
post "/get_user_graph" do
|
|
38
53
|
count_graph('timing/usercount', "User Count", "Users", "users")
|
|
@@ -45,7 +60,7 @@ module RhoconnectConsole
|
|
|
45
60
|
post '/http_timing' do
|
|
46
61
|
http_timing(params)
|
|
47
62
|
end
|
|
48
|
-
|
|
63
|
+
|
|
49
64
|
post '/http_timing_key' do
|
|
50
65
|
http_timing_key(params)
|
|
51
66
|
end
|
|
@@ -53,16 +68,16 @@ module RhoconnectConsole
|
|
|
53
68
|
post '/device_count' do
|
|
54
69
|
count_graph('timing/devicecount', "Device Count", "Devices", "clients")
|
|
55
70
|
end
|
|
56
|
-
|
|
71
|
+
|
|
57
72
|
get '/get_sources' do
|
|
58
73
|
sources = App.load(APP_NAME).sources
|
|
59
74
|
sources.to_json
|
|
60
75
|
end
|
|
61
|
-
|
|
76
|
+
|
|
62
77
|
get '/get_http_routes' do
|
|
63
78
|
# keys = get_user_count("http:*:*")
|
|
64
79
|
# sources = get_sources('all')
|
|
65
|
-
#
|
|
80
|
+
#
|
|
66
81
|
# #loop through arrays and remove any regex matches
|
|
67
82
|
# keysf = keys.inject([]) do |keys_final, element|
|
|
68
83
|
# found = true
|
|
@@ -72,11 +87,11 @@ module RhoconnectConsole
|
|
|
72
87
|
# keys_final << element.strip if found
|
|
73
88
|
# keys_final
|
|
74
89
|
# end
|
|
75
|
-
|
|
90
|
+
|
|
76
91
|
keysf = get_http_routes()
|
|
77
|
-
|
|
92
|
+
|
|
78
93
|
keysf.to_json
|
|
79
94
|
end
|
|
80
|
-
|
|
95
|
+
|
|
81
96
|
end
|
|
82
97
|
end
|
|
@@ -9,18 +9,18 @@ App.Views.Home = Backbone.View.extend({
|
|
|
9
9
|
|
|
10
10
|
initialize: function() {
|
|
11
11
|
var domain = $('input#domain').val();
|
|
12
|
-
|
|
12
|
+
this.model.get_license_info();
|
|
13
13
|
this.model.set('partition_type','app')
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
14
|
+
this.model.fetch({
|
|
15
|
+
error: function(model,resp)
|
|
16
|
+
{
|
|
17
|
+
if(resp.status == 422){
|
|
18
18
|
new App.Views.Index()
|
|
19
|
+
}
|
|
19
20
|
}
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
this.options.model2.get_adapter();
|
|
21
|
+
});
|
|
22
|
+
this.render(domain);
|
|
23
|
+
this.options.model2.get_adapter();
|
|
24
24
|
},
|
|
25
25
|
|
|
26
26
|
reset: function(){
|
|
@@ -101,7 +101,7 @@ App.Views.Home = Backbone.View.extend({
|
|
|
101
101
|
|
|
102
102
|
out += "<table class='table table-bordered'>";
|
|
103
103
|
out += "<tr><td><p style='margin-top:10px'>Sync Server</p></td>";
|
|
104
|
-
out += "<td><p style='margin-top:10px'><code style='margin:0'>
|
|
104
|
+
out += "<td><p style='margin-top:10px'><code style='margin:0'>"+domain+"</code></p></td>";
|
|
105
105
|
out += "<td><p style='margin-top:10px'>Paste this url into your client app configuration to sync with this RhoConnect instance.</p></td>"
|
|
106
106
|
out += "<form>"
|
|
107
107
|
out += "<tr>"
|
|
@@ -67,7 +67,7 @@ App.Views.NewPing = Backbone.View.extend({
|
|
|
67
67
|
out += "<td>allows you to play audio file if it exists on client</td></tr>"
|
|
68
68
|
out += "<tr><td>Badge</td><td><input id='pingbadge' type='text' name='badge' value='1' class='input-small'/></td>";
|
|
69
69
|
out += "<td>Number displayed on device next to app when push notification arrives. Available for iPhone</td></tr>"
|
|
70
|
-
out += "<tr><td>Vibrate</td><td><input id='pingvibrate' type='text' name='vibrate' value='
|
|
70
|
+
out += "<tr><td>Vibrate</td><td><input id='pingvibrate' type='text' name='vibrate' value='2000' class='input-small'/> (milliseconds)</td>"
|
|
71
71
|
out += "<td>Duration of vibration when push notification is received</td></tr>"
|
|
72
72
|
out += "<tr><td colspan=3><input type='submit' class='btn btn-primary' value='Ping!' /></td></tr>"
|
|
73
73
|
out += "</table></form>";
|
data/lib/rhoconnect.rb
CHANGED
|
@@ -8,24 +8,28 @@ require 'rhoconnect/license'
|
|
|
8
8
|
require 'rhoconnect/version'
|
|
9
9
|
require 'rhoconnect/document'
|
|
10
10
|
require 'rhoconnect/lock_ops'
|
|
11
|
-
require 'rhoconnect/model'
|
|
12
|
-
require 'rhoconnect/source'
|
|
13
11
|
require 'rhoconnect/store'
|
|
12
|
+
require 'rhoconnect/store_orm'
|
|
13
|
+
require 'rhoconnect/source'
|
|
14
14
|
require 'rhoconnect/user'
|
|
15
15
|
require 'rhoconnect/api_token'
|
|
16
16
|
require 'rhoconnect/app'
|
|
17
17
|
require 'rhoconnect/client'
|
|
18
18
|
require 'rhoconnect/read_state'
|
|
19
|
-
require 'rhoconnect/client_sync'
|
|
20
|
-
require 'rhoconnect/stats/record'
|
|
21
|
-
require 'rhoconnect/source_adapter'
|
|
22
|
-
require 'rhoconnect/source_sync'
|
|
23
|
-
require 'rhoconnect/rho_indifferent_access'
|
|
24
19
|
require 'rhoconnect/jobs/source_job'
|
|
25
20
|
require 'rhoconnect/jobs/ping_job'
|
|
21
|
+
require 'rhoconnect/middleware/helpers'
|
|
22
|
+
require 'rhoconnect/stats/record'
|
|
23
|
+
require 'rhoconnect/rho_indifferent_access'
|
|
26
24
|
require 'rhoconnect/bulk_data'
|
|
27
25
|
require 'rhoconnect/db_adapter'
|
|
28
|
-
require 'rhoconnect/
|
|
26
|
+
require 'rhoconnect/model/base'
|
|
27
|
+
require 'rhoconnect/model/dynamic_adapter_model'
|
|
28
|
+
require 'rhoconnect/model/js_base'
|
|
29
|
+
|
|
30
|
+
dir = File.join(File.dirname(__FILE__),'..','js-adapters')
|
|
31
|
+
require "#{dir}/node"
|
|
32
|
+
require "#{dir}/node_channel"
|
|
29
33
|
|
|
30
34
|
REDIS_URL = 'REDIS' unless defined? REDIS_URL
|
|
31
35
|
REDISTOGO_URL = 'REDISTOGO_URL' unless defined? REDISTOGO_URL
|
|
@@ -34,12 +38,14 @@ REDISTOGO_URL = 'REDISTOGO_URL' unless defined? REDISTOGO_URL
|
|
|
34
38
|
module Rhoconnect
|
|
35
39
|
APP_NAME = 'application' unless defined? APP_NAME
|
|
36
40
|
|
|
37
|
-
class InvalidArgumentError < RuntimeError; end
|
|
38
41
|
class RhoconnectServerError < RuntimeError; end
|
|
39
42
|
|
|
40
43
|
# Used by application authenticate to indicate login failure
|
|
41
44
|
class LoginException < RuntimeError; end
|
|
42
45
|
|
|
46
|
+
# Used to indicate that the document doesn't belong to the entity
|
|
47
|
+
class InvalidDocumentException < RuntimeError; end
|
|
48
|
+
|
|
43
49
|
API_VERSION = 'v1'.freeze
|
|
44
50
|
|
|
45
51
|
extend self
|
|
@@ -49,8 +55,36 @@ module Rhoconnect
|
|
|
49
55
|
:vendor_directory, :blackberry_bulk_sync, :redis,
|
|
50
56
|
:log_disabled, :license, :bulk_sync_poll_interval, :stats, :appserver, :api_token,
|
|
51
57
|
:raise_on_expired_lock, :lock_duration, :cookie_expire, :predefined_sources,
|
|
52
|
-
:connection_pool_size, :connection_pool_timeout, :redis_timeout,
|
|
53
|
-
:disable_resque_console, :disable_rc_console
|
|
58
|
+
:connection_pool_size, :connection_pool_timeout, :redis_timeout, :store_key_ttl,
|
|
59
|
+
:disable_resque_console, :disable_rc_console, :use_node
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# this mixin adds the controller into the Application's URL Map
|
|
63
|
+
# register Rhoconnect::EndPoint in the controller's class definition
|
|
64
|
+
module EndPoint
|
|
65
|
+
def self.registered(app)
|
|
66
|
+
Rhoconnect.add_to_url_map(app)
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Rhoconnect API version
|
|
71
|
+
def add_to_url_map(subclass)
|
|
72
|
+
@controllers_map ||= Set.new
|
|
73
|
+
#puts " adding to URL map #{subclass.name}"
|
|
74
|
+
@controllers_map << subclass
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def url_map
|
|
78
|
+
@controllers_map ||= Set.new
|
|
79
|
+
app_url_map = {}
|
|
80
|
+
@controllers_map.each do |klass|
|
|
81
|
+
if klass.respond_to?(:rest_path) and klass.rest_path.size > 0
|
|
82
|
+
app_url_map[klass.rest_path] = klass.new
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
app_url_map['/'] = Rhoconnect::DefaultServer.new
|
|
86
|
+
#puts " and we have URL Map #{app_url_map.inspect}"
|
|
87
|
+
app_url_map
|
|
54
88
|
end
|
|
55
89
|
|
|
56
90
|
### Begin Rhoconnect setup methods
|
|
@@ -73,10 +107,11 @@ module Rhoconnect
|
|
|
73
107
|
Rhoconnect.raise_on_expired_lock = get_setting(config,environment,:raise_on_expired_lock,false)
|
|
74
108
|
Rhoconnect.lock_duration = get_setting(config,environment,:lock_duration)
|
|
75
109
|
Rhoconnect.cookie_expire = get_setting(config,environment,:cookie_expire) || 31536000
|
|
110
|
+
Rhoconnect.store_key_ttl = get_setting(config, environment, :store_key_ttl) || 86400
|
|
76
111
|
Rhoconnect.predefined_sources = {}
|
|
77
112
|
yield self if block_given?
|
|
78
113
|
Store.create(Rhoconnect.redis)
|
|
79
|
-
Resque.redis = Rhoconnect.redis
|
|
114
|
+
Resque.redis = Rhoconnect.redis.is_a?(Array) ? Rhoconnect.redis[0] : Rhoconnect.redis
|
|
80
115
|
Rhoconnect.base_directory ||= File.join(File.dirname(__FILE__),'..')
|
|
81
116
|
Rhoconnect.app_directory ||= Rhoconnect.base_directory
|
|
82
117
|
Rhoconnect.data_directory ||= File.join(Rhoconnect.base_directory,'data')
|
|
@@ -85,8 +120,26 @@ module Rhoconnect
|
|
|
85
120
|
Rhoconnect.license = License.new
|
|
86
121
|
Rhoconnect.disable_rc_console ||= false
|
|
87
122
|
Rhoconnect.disable_resque_console ||= false
|
|
123
|
+
Rhoconnect.use_node = Rhoconnect.use_node.nil? ? true : Rhoconnect.use_node
|
|
124
|
+
if File.directory?(File.join(Rhoconnect.app_directory,'sources'))
|
|
125
|
+
check_and_add(File.join(Rhoconnect.app_directory,'sources'))
|
|
126
|
+
# post deprecation warning !!!
|
|
127
|
+
warning_for_deprecated_sources_dir = <<_MIGRATE_TO_NEW_RHOCONNECT
|
|
128
|
+
|
|
129
|
+
***** WARNING *****
|
|
130
|
+
RhoConnect has detected that you're using deprecated SourceAdapter classes.
|
|
131
|
+
|
|
132
|
+
SourceAdapter class support will be removed in RhoConnect 4.1.
|
|
133
|
+
Please, migrate your SourceAdapter classes into RhoConnect Models.
|
|
134
|
+
|
|
135
|
+
For more details, see RhoConnect Migration guidelines at
|
|
136
|
+
docs.rhomobile.com
|
|
137
|
+
|
|
138
|
+
_MIGRATE_TO_NEW_RHOCONNECT
|
|
139
|
+
puts warning_for_deprecated_sources_dir
|
|
140
|
+
end
|
|
88
141
|
|
|
89
|
-
check_and_add(File.join(Rhoconnect.app_directory,'
|
|
142
|
+
check_and_add(File.join(Rhoconnect.app_directory,'models','ruby'))
|
|
90
143
|
start_app(config)
|
|
91
144
|
create_admin_user
|
|
92
145
|
check_hsql_lib! if Rhoconnect.blackberry_bulk_sync
|
|
@@ -97,14 +150,20 @@ module Rhoconnect
|
|
|
97
150
|
end
|
|
98
151
|
|
|
99
152
|
def start_app(config)
|
|
153
|
+
app = nil
|
|
154
|
+
app_name = APP_NAME
|
|
155
|
+
if App.is_exist?(app_name)
|
|
156
|
+
app = App.load(app_name)
|
|
157
|
+
else
|
|
158
|
+
app = App.create(:name => app_name)
|
|
159
|
+
end
|
|
160
|
+
# load all pre-defined adapters files
|
|
161
|
+
Dir[File.join(File.dirname(__FILE__),'rhoconnect','predefined_adapters','*.rb')].each { |adapter| load adapter }
|
|
162
|
+
# load all Ruby Controller files
|
|
163
|
+
Dir[File.join(Rhoconnect.app_directory,'controllers','ruby','*.rb')].each { |controller_file| require controller_file }
|
|
164
|
+
|
|
165
|
+
# TODO: process sources not only from setting.yml file
|
|
100
166
|
if config and config[Rhoconnect.environment]
|
|
101
|
-
app = nil
|
|
102
|
-
app_name = APP_NAME
|
|
103
|
-
if App.is_exist?(app_name)
|
|
104
|
-
app = App.load(app_name)
|
|
105
|
-
else
|
|
106
|
-
app = App.create(:name => app_name)
|
|
107
|
-
end
|
|
108
167
|
sources = config[:sources] || []
|
|
109
168
|
Source.delete_all
|
|
110
169
|
app.delete_sources
|
|
@@ -114,16 +173,25 @@ module Rhoconnect
|
|
|
114
173
|
source_config[:name] = source_name
|
|
115
174
|
Source.create(source_config,{:app_id => app.name})
|
|
116
175
|
app.sources << source_name
|
|
176
|
+
# check if RubyController class already exists
|
|
177
|
+
unless Object.const_defined?("#{source_name}Controller")
|
|
178
|
+
# add to url map
|
|
179
|
+
Rhoconnect::Controller::SourceAdapterBase.register_controller(source_name)
|
|
180
|
+
end
|
|
181
|
+
|
|
117
182
|
# load ruby file for source adapter to re-load class
|
|
118
183
|
load under_score(source_name+'.rb')
|
|
119
184
|
end
|
|
185
|
+
end
|
|
120
186
|
|
|
121
|
-
|
|
122
|
-
|
|
187
|
+
start_nodejs_channels if Rhoconnect.use_node
|
|
188
|
+
# Create associations for all sources
|
|
189
|
+
Source.update_associations(app.sources)
|
|
190
|
+
end
|
|
123
191
|
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
192
|
+
def start_nodejs_channels
|
|
193
|
+
Node.shell_node
|
|
194
|
+
NodeChannel.bootstrap if Node.started
|
|
127
195
|
end
|
|
128
196
|
|
|
129
197
|
# Generate admin user on first load
|
|
@@ -145,7 +213,12 @@ module Rhoconnect
|
|
|
145
213
|
def get_config(basedir)
|
|
146
214
|
# Load settings
|
|
147
215
|
settings_file = File.join(basedir,'settings','settings.yml') if basedir
|
|
148
|
-
|
|
216
|
+
if settings_file and File.exist?(settings_file)
|
|
217
|
+
YAML.load_file(settings_file)
|
|
218
|
+
else # Otherwise use setting for blank app
|
|
219
|
+
settings_file = File.join(ENV['HOME'], '.rhoconnect.yml')
|
|
220
|
+
YAML.load_file(settings_file) if File.exist?(settings_file)
|
|
221
|
+
end
|
|
149
222
|
end
|
|
150
223
|
|
|
151
224
|
def source_config(source_name)
|
|
@@ -172,6 +245,8 @@ module Rhoconnect
|
|
|
172
245
|
return if Rhoconnect.predefined_sources.has_key?(source_name)
|
|
173
246
|
|
|
174
247
|
Rhoconnect.predefined_sources[source_name] = {:source_loaded => false}
|
|
248
|
+
# create Sinatra server for the predefined source here
|
|
249
|
+
Rhoconnect::Controller::SourceAdapterBase.register_controller(source_name)
|
|
175
250
|
end
|
|
176
251
|
|
|
177
252
|
def create_predefined_source(source_name,params)
|
|
@@ -227,13 +302,6 @@ module Rhoconnect
|
|
|
227
302
|
((Time.now.to_f - Time.mktime(2009,"jan",1,0,0,0,0).to_f) * 10**6).to_i
|
|
228
303
|
end
|
|
229
304
|
|
|
230
|
-
# Computes token for a single client request
|
|
231
|
-
def compute_token(doc_key)
|
|
232
|
-
token = get_token
|
|
233
|
-
Store.put_value(doc_key,token)
|
|
234
|
-
token.to_s
|
|
235
|
-
end
|
|
236
|
-
|
|
237
305
|
# Returns require-friendly filename for a class
|
|
238
306
|
def under_score(camel_cased_word)
|
|
239
307
|
camel_cased_word.to_s.gsub(/::/, '/').
|
|
@@ -287,6 +355,18 @@ module Rhoconnect
|
|
|
287
355
|
end
|
|
288
356
|
end
|
|
289
357
|
|
|
358
|
+
def which(command)
|
|
359
|
+
exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
|
|
360
|
+
paths = ENV['PATH'].split(File::PATH_SEPARATOR)
|
|
361
|
+
paths.each do |path|
|
|
362
|
+
exts.each do |ext|
|
|
363
|
+
exe = File.join(path, "#{command}#{ext}")
|
|
364
|
+
return exe if File.executable? exe
|
|
365
|
+
end
|
|
366
|
+
end
|
|
367
|
+
return nil
|
|
368
|
+
end
|
|
369
|
+
|
|
290
370
|
def lap_timer(msg,start)
|
|
291
371
|
duration = timenow - start
|
|
292
372
|
log "#{msg}: #{duration}"
|
|
@@ -304,7 +384,7 @@ module Rhoconnect
|
|
|
304
384
|
|
|
305
385
|
def log(*args)
|
|
306
386
|
now = Time.now.strftime('%I:%M:%S %p %Y-%m-%d')
|
|
307
|
-
puts "[#{now}] #{args.join}" unless Rhoconnect.log_disabled
|
|
387
|
+
puts "[#{Process.pid}][#{now}] #{args.join}" unless Rhoconnect.log_disabled
|
|
308
388
|
end
|
|
309
389
|
|
|
310
390
|
def self.appserver
|
|
@@ -319,23 +399,8 @@ module Rhoconnect
|
|
|
319
399
|
@@settings ||= get_config(Rhoconnect.base_directory || ROOT_PATH)[Rhoconnect.environment]
|
|
320
400
|
end
|
|
321
401
|
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
# Add everything in vendor to load path
|
|
325
|
-
# TODO: Integrate with 3rd party dependency management
|
|
326
|
-
def self.initializer(path=nil)
|
|
327
|
-
Dir["vendor/*"].each do |dir|
|
|
328
|
-
$:.unshift File.join(dir,'lib')
|
|
329
|
-
end
|
|
330
|
-
require 'rhoconnect'
|
|
331
|
-
require 'rhoconnect/server'
|
|
332
|
-
# Bootstrap Rhoconnect system
|
|
333
|
-
Rhoconnect.bootstrap(path || ENV['PWD'])
|
|
334
|
-
end
|
|
335
|
-
|
|
336
|
-
def self.store_blob(obj,field_name,blob)
|
|
337
|
-
blob[:tempfile].path if blob[:tempfile]
|
|
338
|
-
end
|
|
402
|
+
def self.shutdown
|
|
403
|
+
Rhoconnect::Node.kill_process if Rhoconnect::Node.started
|
|
339
404
|
end
|
|
340
405
|
|
|
341
406
|
protected
|
|
@@ -345,3 +410,7 @@ module Rhoconnect
|
|
|
345
410
|
res || default
|
|
346
411
|
end
|
|
347
412
|
end
|
|
413
|
+
|
|
414
|
+
at_exit do
|
|
415
|
+
Rhoconnect.shutdown
|
|
416
|
+
end
|
data/rhoconnect.gemspec
CHANGED
|
@@ -26,6 +26,7 @@ Gem::Specification.new do |s|
|
|
|
26
26
|
s.files += Dir.glob("generators/templates/application/.rcgemfile")
|
|
27
27
|
s.files += Dir.glob("installer/**/*")
|
|
28
28
|
s.files += Dir.glob("lib/**/*")
|
|
29
|
+
s.files += Dir.glob("js-adapters/**/*")
|
|
29
30
|
s.files += Dir.glob("tasks/**/*")
|
|
30
31
|
s.test_files = Dir.glob("spec/**/*")
|
|
31
32
|
s.executables = Dir.glob("bin/*").map{ |f| File.basename(f) }
|
|
@@ -41,15 +42,15 @@ Gem::Specification.new do |s|
|
|
|
41
42
|
s.add_dependency('bundler', '~> 1.0')
|
|
42
43
|
s.add_dependency("rack", '~> 1.5.2')
|
|
43
44
|
s.add_dependency("sinatra", '~> 1.3')
|
|
44
|
-
s.add_dependency('rake', '~> 0.
|
|
45
|
+
s.add_dependency('rake', '~> 10.0.0')
|
|
45
46
|
s.add_dependency('json', '~> 1.7.7')
|
|
46
47
|
s.add_dependency('rubyzip', '~> 0.9.4')
|
|
47
48
|
s.add_dependency('uuidtools', '>= 2.1.1')
|
|
48
|
-
|
|
49
|
-
s.add_dependency('connection_pool', '0.9.2')
|
|
49
|
+
s.add_dependency('connection_pool', '~> 1.0.0')
|
|
50
50
|
s.add_dependency('redis', '>= 3.0.1')
|
|
51
51
|
s.add_dependency('resque', '>= 1.22.0')
|
|
52
52
|
s.add_dependency('rest-client', '~> 1.6.1')
|
|
53
53
|
s.add_dependency('templater', '~> 1.0.0')
|
|
54
54
|
s.add_dependency('thor', '~> 0.15.0')
|
|
55
|
+
s.add_dependency('ohm', '~> 0.1.3')
|
|
55
56
|
end
|
data/spec/api/api_helper.rb
CHANGED
|
@@ -2,14 +2,9 @@ require 'rack/test'
|
|
|
2
2
|
require 'rspec'
|
|
3
3
|
|
|
4
4
|
require File.join(File.dirname(__FILE__),'..','spec_helper')
|
|
5
|
+
require File.join(File.dirname(__FILE__),'..','..','lib','rhoconnect.rb')
|
|
5
6
|
require File.join(File.dirname(__FILE__),'..','..','lib','rhoconnect','server.rb')
|
|
6
7
|
|
|
7
|
-
def app
|
|
8
|
-
Rhoconnect::Server.set :stats, false
|
|
9
|
-
Rhoconnect.stats = false
|
|
10
|
-
@app ||= Rhoconnect::Server.new
|
|
11
|
-
end
|
|
12
|
-
|
|
13
8
|
def compress(path)
|
|
14
9
|
path.sub!(%r[/$],'')
|
|
15
10
|
archive = File.join(path,File.basename(path))+'.zip'
|
|
@@ -5,23 +5,23 @@ describe "RhoconnectApiFastDelete" do
|
|
|
5
5
|
it "should delete an object from rhoconnect's :md" do
|
|
6
6
|
data = {'1' => @product1, '2' => @product2, '3' => @product3}
|
|
7
7
|
@s = Source.load(@s_fields[:name],@s_params)
|
|
8
|
-
|
|
8
|
+
set_doc_state(@s, {:md => data, :md_size => '3'})
|
|
9
9
|
post "/app/#{Rhoconnect::API_VERSION}/#{@s_fields[:name]}/fast_delete",
|
|
10
10
|
{:user_id => @u.id, :data => {'3' => @product3}}, {Rhoconnect::API_TOKEN_HEADER => @api_token}
|
|
11
11
|
last_response.should be_ok
|
|
12
12
|
data.delete('3')
|
|
13
|
-
|
|
13
|
+
verify_doc_result(@s, {:md => data, :md_size =>'2'})
|
|
14
14
|
end
|
|
15
15
|
|
|
16
16
|
it "should not properly delete the object if fast_delete is called without all the attributes (because fast_delete doesn't ensure any data integrity)" do
|
|
17
17
|
data = {'1' => @product1, '2' => @product2, '3' => @product3}
|
|
18
18
|
delete_data = {'3' => {'price' => '1.99'}}
|
|
19
19
|
@s = Source.load(@s_fields[:name],@s_params)
|
|
20
|
-
|
|
20
|
+
set_doc_state(@s, {:md => data, :md_size => '3'})
|
|
21
21
|
post "/app/#{Rhoconnect::API_VERSION}/#{@s_fields[:name]}/fast_delete",
|
|
22
22
|
{:user_id => @u.id, :data => delete_data}, {Rhoconnect::API_TOKEN_HEADER => @api_token}
|
|
23
23
|
last_response.should be_ok
|
|
24
|
-
|
|
24
|
+
verify_doc_result(@s, {:md => data, :md_size=>'2'})
|
|
25
25
|
end
|
|
26
26
|
end
|
|
27
27
|
end
|
|
@@ -5,24 +5,24 @@ describe "RhoconnectApiFastInsert" do
|
|
|
5
5
|
it "should append new objects to rhoconnect's :md" do
|
|
6
6
|
data = {'1' => @product1, '2' => @product2}
|
|
7
7
|
@s = Source.load(@s_fields[:name],@s_params)
|
|
8
|
-
|
|
8
|
+
set_doc_state(@s, {:md => data, :md_size => '2'})
|
|
9
9
|
post "/app/#{Rhoconnect::API_VERSION}/#{@s_fields[:name]}/fast_insert",
|
|
10
10
|
{:user_id => @u.id, :data => {'3' => @product3}}, {Rhoconnect::API_TOKEN_HEADER => @api_token}
|
|
11
11
|
last_response.should be_ok
|
|
12
12
|
data.merge!({'3' => @product3})
|
|
13
|
-
|
|
13
|
+
verify_doc_result(@s, {:md => data, :md_size=>'3'})
|
|
14
14
|
end
|
|
15
15
|
|
|
16
16
|
it "should incorrectly append data to existing object (because fast_insert doesn't ensure any data integrity)" do
|
|
17
17
|
data = {'1' => @product1, '2' => @product2, '3' => @product3}
|
|
18
18
|
incorrect_insert = {'3' => {'price' => '1.99', 'new_field' => 'value'}}
|
|
19
19
|
@s = Source.load(@s_fields[:name],@s_params)
|
|
20
|
-
|
|
20
|
+
set_doc_state(@s, {:md => data, :md_size => '3'})
|
|
21
21
|
post "/app/#{Rhoconnect::API_VERSION}/#{@s_fields[:name]}/fast_insert",
|
|
22
22
|
{:user_id => @u.id, :data => incorrect_insert}, {Rhoconnect::API_TOKEN_HEADER => @api_token}
|
|
23
23
|
last_response.should be_ok
|
|
24
24
|
data['3'].merge!(incorrect_insert['3'])
|
|
25
|
-
|
|
25
|
+
verify_doc_result(@s, :md_size=>'4')
|
|
26
26
|
end
|
|
27
27
|
end
|
|
28
28
|
end
|
|
@@ -5,7 +5,7 @@ describe "RhoconnectApiFastUpdate" do
|
|
|
5
5
|
it "should update an attribute and add new one for an object in rhoconnect's :md" do
|
|
6
6
|
data = {'1' => @product1, '2' => @product2, '3' => @product3}
|
|
7
7
|
@s = Source.load(@s_fields[:name],@s_params)
|
|
8
|
-
|
|
8
|
+
set_doc_state(@s, {:md => data, :md_size => '3'})
|
|
9
9
|
|
|
10
10
|
orig_obj_attrs = {'3' => {'price' => @product3['price']}}
|
|
11
11
|
new_obj_attrs = {'3' => {'price' => '0.99', 'new_attr' => 'new_value'}}
|
|
@@ -14,13 +14,13 @@ describe "RhoconnectApiFastUpdate" do
|
|
|
14
14
|
{:user_id => @u.id, :delete_data => orig_obj_attrs, :data => new_obj_attrs}, {Rhoconnect::API_TOKEN_HEADER => @api_token}
|
|
15
15
|
last_response.should be_ok
|
|
16
16
|
data['3'].merge!(new_obj_attrs['3'])
|
|
17
|
-
|
|
17
|
+
verify_doc_result(@s, {:md => data, :md_size=>'3'})
|
|
18
18
|
end
|
|
19
19
|
|
|
20
20
|
it "should update an attribute and add new one for an object in rhoconnect's :md using old route with deprecation warning" do
|
|
21
21
|
data = {'1' => @product1, '2' => @product2, '3' => @product3}
|
|
22
22
|
@s = Source.load(@s_fields[:name],@s_params)
|
|
23
|
-
|
|
23
|
+
set_doc_state(@s, {:md => data, :md_size => '3'})
|
|
24
24
|
|
|
25
25
|
orig_obj_attrs = {'3' => {'price' => @product3['price']}}
|
|
26
26
|
new_obj_attrs = {'3' => {'price' => '0.99', 'new_attr' => 'new_value'}}
|
|
@@ -30,13 +30,13 @@ describe "RhoconnectApiFastUpdate" do
|
|
|
30
30
|
last_response.should be_ok
|
|
31
31
|
last_response.headers["Warning"].index('deprecated').should_not == nil
|
|
32
32
|
data['3'].merge!(new_obj_attrs['3'])
|
|
33
|
-
|
|
33
|
+
verify_doc_result(@s, {:md => data, :md_size=>'3'})
|
|
34
34
|
end
|
|
35
35
|
|
|
36
36
|
it "should update one attr, add one attr, and remove one attr for an object in rhoconnect's :md" do
|
|
37
37
|
data = {'1' => @product1, '2' => @product2, '3' => @product3}
|
|
38
38
|
@s = Source.load(@s_fields[:name],@s_params)
|
|
39
|
-
|
|
39
|
+
set_doc_state(@s, {:md => data, :md_size => '3'})
|
|
40
40
|
|
|
41
41
|
orig_obj_attrs = {'3' => {'name' => @product3['name'], 'price' => @product3['price']}}
|
|
42
42
|
new_obj_attrs = {'3' => {'price' => '0.99', 'new_attr' => 'new_value'}}
|
|
@@ -46,13 +46,13 @@ describe "RhoconnectApiFastUpdate" do
|
|
|
46
46
|
last_response.should be_ok
|
|
47
47
|
data['3'].delete('name')
|
|
48
48
|
data['3'].merge!(new_obj_attrs['3'])
|
|
49
|
-
|
|
49
|
+
verify_doc_result(@s, {:md => data, :md_size=>'3'})
|
|
50
50
|
end
|
|
51
51
|
|
|
52
52
|
it "should remove all attributes , and properly adjust md_size" do
|
|
53
53
|
data = {'1' => @product1, '2' => @product2, '3' => @product3}
|
|
54
54
|
@s = Source.load(@s_fields[:name],@s_params)
|
|
55
|
-
|
|
55
|
+
set_doc_state(@s, {:md => data, :md_size => '3'})
|
|
56
56
|
|
|
57
57
|
orig_obj_attrs = {'3' => @product3}
|
|
58
58
|
new_obj_attrs = {}
|
|
@@ -61,7 +61,7 @@ describe "RhoconnectApiFastUpdate" do
|
|
|
61
61
|
{:user_id => @u.id, :delete_data => orig_obj_attrs, :data => new_obj_attrs}, {Rhoconnect::API_TOKEN_HEADER => @api_token}
|
|
62
62
|
last_response.should be_ok
|
|
63
63
|
data.delete('3')
|
|
64
|
-
|
|
64
|
+
verify_doc_result(@s, {:md => data, :md_size=>'2'})
|
|
65
65
|
end
|
|
66
66
|
end
|
|
67
67
|
end
|
|
@@ -6,12 +6,12 @@ describe "RhoconnectApiPushDeletes" do
|
|
|
6
6
|
it "should delete object from :md" do
|
|
7
7
|
data = {'1' => @product1, '2' => @product2, '3' => @product3}
|
|
8
8
|
@s = Source.load(@s_fields[:name],@s_params)
|
|
9
|
-
|
|
9
|
+
set_doc_state(@s, {:md => data, :md_size => '3'})
|
|
10
10
|
data.delete('2')
|
|
11
11
|
post "/app/#{Rhoconnect::API_VERSION}/#{@s_fields[:name]}/push_deletes",
|
|
12
12
|
{:user_id => @u.id, :objects => ['2']}, {Rhoconnect::API_TOKEN_HEADER => @api_token}
|
|
13
13
|
last_response.should be_ok
|
|
14
|
-
|
|
14
|
+
verify_doc_result(@s, {:md => data, :md_size=>'2'})
|
|
15
15
|
end
|
|
16
16
|
|
|
17
17
|
end
|