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.
Files changed (337) hide show
  1. data/CHANGELOG.md +57 -3
  2. data/Gemfile +9 -7
  3. data/Gemfile.lock +37 -37
  4. data/Rakefile +18 -7
  5. data/bench/benchapp/Gemfile +1 -1
  6. data/bench/benchapp/config.ru +0 -3
  7. data/bench/benchapp/controllers/ruby/application.rb +17 -0
  8. data/bench/benchapp/controllers/ruby/application_controller.rb +17 -0
  9. data/bench/benchapp/controllers/ruby/mock_adapter_controller.rb +8 -0
  10. data/bench/benchapp/controllers/ruby/queue_mock_adapter_controller.rb +8 -0
  11. data/bench/benchapp/{sources → models/ruby}/mock_adapter.rb +1 -1
  12. data/bench/benchapp/{sources → models/ruby}/queue_mock_adapter.rb +0 -0
  13. data/bench/benchapp/spec/{sources → models/ruby}/mock_adapter_spec.rb +1 -1
  14. data/bench/benchapp/spec/{sources → models/ruby}/queue_mock_adapter_spec.rb +1 -1
  15. data/bench/benchapp/spec/spec_helper.rb +2 -2
  16. data/bench/blobapp/Gemfile +1 -1
  17. data/bench/blobapp/config.ru +0 -3
  18. data/bench/blobapp/controllers/ruby/application_controller.rb +17 -0
  19. data/bench/blobapp/controllers/ruby/blob_adapter_controller.rb +8 -0
  20. data/bench/blobapp/{sources → models/ruby}/blob_adapter.rb +9 -2
  21. data/bench/blobapp/spec/{sources → models/ruby}/blob_adapter_spec.rb +1 -1
  22. data/bench/blobapp/spec/spec_helper.rb +1 -1
  23. data/bench/lib/bench/cli.rb +1 -1
  24. data/bench/scripts/blob_cud_script.rb +1 -1
  25. data/bench/scripts/query_md_script.rb +1 -1
  26. data/bench/scripts/query_only_script.rb +1 -1
  27. data/bench/scripts/query_script.rb +1 -1
  28. data/bench/scripts/test_query_script.rb +7 -1
  29. data/bench/spec/mock_adapter_spec.rb +1 -1
  30. data/bench/spec/result_spec.rb +3 -3
  31. data/bin/rhoconnect +5 -3
  32. data/commands/dtach/dtach_install.rb +2 -2
  33. data/commands/execute.rb +8 -3
  34. data/commands/generators/app.rb +3 -3
  35. data/commands/generators/controller.rb +6 -0
  36. data/commands/generators/model.rb +6 -0
  37. data/commands/generators/source.rb +3 -3
  38. data/commands/generators/update.rb +1 -1
  39. data/commands/redis/redis_about.rb +2 -2
  40. data/commands/redis/redis_download.rb +1 -1
  41. data/commands/redis/redis_install.rb +4 -3
  42. data/commands/redis/redis_restart.rb +4 -4
  43. data/commands/redis/redis_start.rb +5 -4
  44. data/commands/redis/redis_startbg.rb +5 -4
  45. data/commands/redis/redis_status.rb +13 -0
  46. data/commands/redis/redis_stop.rb +3 -3
  47. data/commands/rhoconnect/config.rb +28 -16
  48. data/commands/rhoconnect/flushdb.rb +1 -2
  49. data/commands/rhoconnect/get_token.rb +15 -11
  50. data/commands/rhoconnect/restart.rb +13 -5
  51. data/commands/rhoconnect/set_admin_password.rb +8 -8
  52. data/commands/rhoconnect/start.rb +74 -16
  53. data/commands/rhoconnect/startbg.rb +1 -1
  54. data/commands/rhoconnect/startdebug.rb +1 -1
  55. data/commands/rhoconnect/stop.rb +13 -1
  56. data/commands/rhoconnect/web.rb +5 -5
  57. data/commands/rhoconnect_console/console.rb +7 -5
  58. data/commands/{rhoconnect → rhoconnect_spec}/spec.rb +0 -0
  59. data/commands/rhoconnect_war/war.rb +9 -9
  60. data/commands/utilities/blank_app.ru +56 -0
  61. data/commands/utilities/redis_runner.rb +54 -19
  62. data/doc/authentication.txt +80 -6
  63. data/doc/blob-sync.txt +104 -97
  64. data/doc/bulk-sync.txt +1 -1
  65. data/doc/client-java.txt +3 -3
  66. data/doc/client-objc.txt +2 -2
  67. data/doc/client.txt +4 -4
  68. data/doc/command-line.txt +105 -200
  69. data/doc/data-partitioning.txt +40 -0
  70. data/doc/deploying.txt +249 -77
  71. data/doc/extending-rhoconnect-server.txt +40 -57
  72. data/doc/heroku-addon.txt +2 -0
  73. data/doc/install.txt +45 -95
  74. data/doc/introduction.txt +1 -1
  75. data/doc/java-plugin.txt +365 -190
  76. data/doc/metadata.txt +1 -1
  77. data/doc/migration.txt +108 -142
  78. data/doc/preparing-production.txt +1 -1
  79. data/doc/push-backend-setup.txt +2 -0
  80. data/doc/push-client-setup-android.txt +78 -0
  81. data/doc/push-client-setup-bb.txt +81 -0
  82. data/doc/push-client-setup-ios.txt +70 -0
  83. data/doc/push-client-setup-rps.txt +200 -0
  84. data/doc/push-client-setup.txt +63 -66
  85. data/doc/push-server-setup.txt +67 -40
  86. data/doc/push-testing.txt +29 -0
  87. data/doc/push.txt +21 -6
  88. data/doc/rest-api.txt +128 -55
  89. data/doc/rhoconnect-redis-stack.txt +120 -0
  90. data/doc/settings.txt +4 -12
  91. data/doc/source-adapters-intro.txt +28 -0
  92. data/doc/source-adapters.txt +235 -272
  93. data/doc/stats-middleware.txt +9 -29
  94. data/doc/supported-platforms.txt +21 -30
  95. data/doc/testing.txt +40 -42
  96. data/doc/tutorial.txt +72 -57
  97. data/examples/simple/Gemfile +1 -1
  98. data/examples/simple/application.rb +4 -5
  99. data/examples/simple/my_server.rb +2 -2
  100. data/examples/simple/settings/settings.yml +1 -1
  101. data/generators/rhoconnect.rb +151 -50
  102. data/generators/templates/application/Gemfile +1 -1
  103. data/generators/templates/application/Rakefile +3 -3
  104. data/generators/templates/application/config.ru +1 -4
  105. data/generators/templates/application/controllers/application_controller.rb +17 -0
  106. data/generators/templates/application/controllers/js/application_controller.js +14 -0
  107. data/generators/templates/application/controllers/ruby/application_controller.rb +17 -0
  108. data/generators/templates/application/package.json +8 -0
  109. data/generators/templates/application/rcgemfile +2 -5
  110. data/generators/templates/application/settings/settings.yml +3 -3
  111. data/generators/templates/application/spec/application_controller_spec.rb +23 -0
  112. data/generators/templates/application/spec/js_spec.rb +25 -0
  113. data/generators/templates/application/spec/spec_helper.rb +21 -7
  114. data/generators/templates/source/controllers/js/controller.js +7 -0
  115. data/generators/templates/source/controllers/ruby/controller.rb +8 -0
  116. data/generators/templates/source/controllers/ruby/controller_spec.rb +27 -0
  117. data/generators/templates/source/models/js/model.js +46 -0
  118. data/generators/templates/source/{source_adapter.rb → models/ruby/model.rb} +15 -10
  119. data/generators/templates/source/{source_spec.rb → models/ruby/model_spec.rb} +1 -1
  120. data/install.sh +5 -5
  121. data/installer/unix-like/create_texts.rb +2 -2
  122. data/installer/unix-like/rho_connect_install_constants.rb +2 -2
  123. data/installer/unix-like/rho_connect_install_utilities.rb +1 -1
  124. data/installer/utils/constants.rb +4 -4
  125. data/js-adapters/ballroom.js +216 -0
  126. data/js-adapters/node.rb +52 -0
  127. data/js-adapters/node_channel.rb +181 -0
  128. data/js-adapters/request.js +27 -0
  129. data/js-adapters/response.js +57 -0
  130. data/js-adapters/rhoconnect_helpers.js +60 -0
  131. data/js-adapters/router.js +60 -0
  132. data/js-adapters/server.js +5 -0
  133. data/lib/rhoconnect/api/app/ans_login.rb +3 -3
  134. data/lib/rhoconnect/api/app/bulk_data.rb +10 -10
  135. data/lib/rhoconnect/api/app/fast_delete.rb +11 -10
  136. data/lib/rhoconnect/api/app/fast_insert.rb +11 -10
  137. data/lib/rhoconnect/api/app/fast_update.rb +11 -10
  138. data/lib/rhoconnect/api/app/login.rb +5 -5
  139. data/lib/rhoconnect/api/app/push_deletes.rb +12 -11
  140. data/lib/rhoconnect/api/app/push_objects.rb +12 -11
  141. data/lib/rhoconnect/api/app/query.rb +8 -7
  142. data/lib/rhoconnect/api/app/queue_updates.rb +98 -94
  143. data/lib/rhoconnect/api/app/search.rb +8 -7
  144. data/lib/rhoconnect/api/client/client_get_db_doc.rb +5 -5
  145. data/lib/rhoconnect/api/client/client_set_db_doc.rb +8 -8
  146. data/lib/rhoconnect/api/client/create.rb +7 -7
  147. data/lib/rhoconnect/api/client/get_client_params.rb +4 -4
  148. data/lib/rhoconnect/api/client/list_client_docs.rb +17 -17
  149. data/lib/rhoconnect/api/client/register.rb +12 -12
  150. data/lib/rhoconnect/api/client/reset.rb +5 -5
  151. data/lib/rhoconnect/api/readstate/set_refresh_time.rb +9 -9
  152. data/lib/rhoconnect/api/source/get_source_params.rb +4 -4
  153. data/lib/rhoconnect/api/source/list_sources.rb +16 -16
  154. data/lib/rhoconnect/api/source/update_source_params.rb +6 -6
  155. data/lib/rhoconnect/api/store/get_db_doc.rb +4 -4
  156. data/lib/rhoconnect/api/store/set_db_doc.rb +7 -7
  157. data/lib/rhoconnect/api/system/get_adapter.rb +4 -4
  158. data/lib/rhoconnect/api/system/get_license_info.rb +8 -8
  159. data/lib/rhoconnect/api/system/login.rb +15 -15
  160. data/lib/rhoconnect/api/system/reset.rb +11 -11
  161. data/lib/rhoconnect/api/system/save_adapter.rb +4 -4
  162. data/lib/rhoconnect/api/system/stats.rb +22 -22
  163. data/lib/rhoconnect/api/user/create_user.rb +7 -7
  164. data/lib/rhoconnect/api/user/delete_client.rb +6 -6
  165. data/lib/rhoconnect/api/user/delete_user.rb +11 -10
  166. data/lib/rhoconnect/api/user/list_clients.rb +4 -4
  167. data/lib/rhoconnect/api/user/list_source_docs.rb +10 -10
  168. data/lib/rhoconnect/api/user/list_users.rb +3 -3
  169. data/lib/rhoconnect/api/user/ping.rb +3 -3
  170. data/lib/rhoconnect/api/user/show_user.rb +3 -3
  171. data/lib/rhoconnect/api/user/update_user.rb +5 -5
  172. data/lib/rhoconnect/api/user/user_get_db_doc.rb +5 -5
  173. data/lib/rhoconnect/api/user/user_set_db_doc.rb +10 -10
  174. data/lib/rhoconnect/api_token.rb +5 -6
  175. data/lib/rhoconnect/app.rb +6 -46
  176. data/lib/rhoconnect/application/init.rb +5 -2
  177. data/lib/rhoconnect/async.rb +76 -39
  178. data/lib/rhoconnect/bulk_data/bulk_data.rb +6 -4
  179. data/lib/rhoconnect/client.rb +59 -9
  180. data/lib/rhoconnect/condition/admin_required.rb +27 -0
  181. data/lib/rhoconnect/condition/client_required.rb +50 -0
  182. data/lib/rhoconnect/condition/login_required.rb +22 -0
  183. data/lib/rhoconnect/condition/source_required.rb +49 -0
  184. data/lib/rhoconnect/condition/verbs.rb +17 -0
  185. data/lib/rhoconnect/condition/verify_success.rb +19 -0
  186. data/lib/rhoconnect/controller/app_base.rb +74 -0
  187. data/lib/rhoconnect/controller/base.rb +68 -0
  188. data/lib/rhoconnect/controller/clients_controller.rb +79 -0
  189. data/lib/rhoconnect/controller/dynamic_adapter_controller.rb +93 -0
  190. data/lib/rhoconnect/controller/js_base.rb +124 -0
  191. data/lib/rhoconnect/controller/read_state_controller.rb +22 -0
  192. data/lib/rhoconnect/controller/source_adapter_base.rb +14 -0
  193. data/lib/rhoconnect/controller/sources_controller.rb +44 -0
  194. data/lib/rhoconnect/controller/store_controller.rb +25 -0
  195. data/lib/rhoconnect/controller/system_controller.rb +67 -0
  196. data/lib/rhoconnect/controller/users_controller.rb +99 -0
  197. data/lib/rhoconnect/db_adapter.rb +1 -3
  198. data/lib/rhoconnect/document.rb +159 -50
  199. data/lib/rhoconnect/handler/authenticate/execute_methods.rb +77 -0
  200. data/lib/rhoconnect/handler/authenticate/runner.rb +49 -0
  201. data/lib/rhoconnect/handler/authenticate.rb +3 -0
  202. data/lib/rhoconnect/handler/bulk_data.rb +28 -0
  203. data/lib/rhoconnect/handler/changes/engine.rb +271 -0
  204. data/lib/rhoconnect/handler/changes/execute_methods.rb +88 -0
  205. data/lib/rhoconnect/handler/changes/pass_through_runner.rb +11 -0
  206. data/lib/rhoconnect/handler/changes/runner.rb +53 -0
  207. data/lib/rhoconnect/handler/changes.rb +31 -0
  208. data/lib/rhoconnect/handler/helpers/auth_method.rb +29 -0
  209. data/lib/rhoconnect/handler/helpers/binding.rb +18 -0
  210. data/lib/rhoconnect/handler/helpers/bulk_data.rb +53 -0
  211. data/lib/rhoconnect/handler/helpers/source_job.rb +14 -0
  212. data/lib/rhoconnect/handler/helpers.rb +4 -0
  213. data/lib/rhoconnect/handler/plugin_callbacks/execute_methods.rb +99 -0
  214. data/lib/rhoconnect/handler/plugin_callbacks/runner.rb +28 -0
  215. data/lib/rhoconnect/handler/plugin_callbacks.rb +67 -0
  216. data/lib/rhoconnect/handler/query/engine.rb +93 -0
  217. data/lib/rhoconnect/handler/query/execute_methods.rb +21 -0
  218. data/lib/rhoconnect/handler/query/pass_through_runner.rb +35 -0
  219. data/lib/rhoconnect/handler/query/runner.rb +270 -0
  220. data/lib/rhoconnect/handler/query.rb +19 -0
  221. data/lib/rhoconnect/handler/search/engine.rb +60 -0
  222. data/lib/rhoconnect/handler/search/execute_methods.rb +32 -0
  223. data/lib/rhoconnect/handler/search/pass_through_runner.rb +18 -0
  224. data/lib/rhoconnect/handler/search/runner.rb +104 -0
  225. data/lib/rhoconnect/handler/search.rb +26 -0
  226. data/lib/rhoconnect/handler/sync.rb +29 -0
  227. data/lib/rhoconnect/jobs/source_job.rb +13 -4
  228. data/lib/rhoconnect/js_adapter.rb +79 -0
  229. data/lib/rhoconnect/license.rb +10 -2
  230. data/lib/rhoconnect/middleware/current_user.rb +14 -1
  231. data/lib/rhoconnect/middleware/helpers.rb +10 -93
  232. data/lib/rhoconnect/middleware/x_domain_session_wrapper.rb +1 -1
  233. data/lib/rhoconnect/model/base.rb +229 -0
  234. data/lib/rhoconnect/model/dynamic_adapter_model.rb +90 -0
  235. data/lib/rhoconnect/model/js_base.rb +121 -0
  236. data/lib/rhoconnect/ping/android.rb +1 -1
  237. data/lib/rhoconnect/predefined_adapters/bench_adapter.rb +7 -4
  238. data/lib/rhoconnect/read_state.rb +3 -3
  239. data/lib/rhoconnect/server.rb +159 -190
  240. data/lib/rhoconnect/source.rb +100 -11
  241. data/lib/rhoconnect/stats/record.rb +10 -10
  242. data/lib/rhoconnect/store.rb +905 -591
  243. data/lib/rhoconnect/{model.rb → store_orm.rb} +53 -115
  244. data/lib/rhoconnect/tasks.rb +18 -4
  245. data/lib/rhoconnect/test_methods.rb +30 -17
  246. data/lib/rhoconnect/user.rb +35 -17
  247. data/lib/rhoconnect/utilities.rb +1 -1
  248. data/lib/rhoconnect/version.rb +2 -2
  249. data/lib/rhoconnect/web-console/server.rb +29 -14
  250. data/lib/rhoconnect/web-console/views/home.js +10 -10
  251. data/lib/rhoconnect/web-console/views/new_ping.js +1 -1
  252. data/lib/rhoconnect.rb +120 -51
  253. data/rhoconnect.gemspec +4 -3
  254. data/spec/api/api_helper.rb +1 -6
  255. data/spec/api/app/fast_delete_spec.rb +4 -4
  256. data/spec/api/app/fast_insert_spec.rb +4 -4
  257. data/spec/api/app/fast_update_spec.rb +8 -8
  258. data/spec/api/app/push_deletes_spec.rb +2 -2
  259. data/spec/api/app/push_objects_spec.rb +5 -5
  260. data/spec/api/client/client_get_db_doc_spec.rb +6 -4
  261. data/spec/api/client/client_set_db_doc_spec.rb +3 -2
  262. data/spec/api/client/get_client_params_spec.rb +14 -0
  263. data/spec/api/client/list_client_docs_spec.rb +30 -20
  264. data/spec/api/client/reset_spec.rb +36 -0
  265. data/spec/api/source/get_source_params_spec.rb +23 -17
  266. data/spec/api/system/get_license_info_spec.rb +0 -20
  267. data/spec/api/system/login_spec.rb +8 -0
  268. data/spec/api/system/reset_spec.rb +0 -1
  269. data/spec/api/system/stats_spec.rb +5 -5
  270. data/spec/api/user/create_user_spec.rb +14 -6
  271. data/spec/api/user/delete_user_spec.rb +20 -18
  272. data/spec/api/user/list_users_spec.rb +5 -6
  273. data/spec/api/user/update_user_spec.rb +5 -4
  274. data/spec/apps/rhotestapp/config.ru +16 -1
  275. data/spec/apps/rhotestapp/controllers/js/js_sample_controller.js +23 -0
  276. data/spec/apps/rhotestapp/controllers/js/sample2_controller.js +32 -0
  277. data/spec/apps/rhotestapp/controllers/ruby/application_controller.rb +21 -0
  278. data/spec/apps/rhotestapp/controllers/ruby/sample_adapter_controller.rb +8 -0
  279. data/spec/apps/rhotestapp/models/js/js_sample.js +55 -0
  280. data/spec/apps/rhotestapp/models/js/sample2.js +25 -0
  281. data/spec/apps/rhotestapp/{sources → models/ruby}/base_adapter.rb +0 -0
  282. data/spec/apps/rhotestapp/{sources → models/ruby}/fixed_schema_adapter.rb +0 -0
  283. data/spec/apps/rhotestapp/{sources → models/ruby}/other_adapter.rb +0 -0
  284. data/spec/apps/rhotestapp/{sources → models/ruby}/sample_adapter.rb +0 -0
  285. data/spec/apps/rhotestapp/{sources → models/ruby}/simple_adapter.rb +2 -2
  286. data/spec/apps/rhotestapp/{sources → models/ruby}/sub_adapter.rb +0 -0
  287. data/spec/apps/rhotestapp/settings/settings.yml +0 -1
  288. data/spec/bulk_data/bulk_data_spec.rb +20 -5
  289. data/spec/cli/cli_spec.rb +83 -0
  290. data/spec/client_spec.rb +20 -17
  291. data/spec/client_sync_spec.rb +244 -406
  292. data/spec/controllers/js_base_spec.rb +89 -0
  293. data/spec/doc/doc_spec.rb +18 -18
  294. data/spec/document_spec.rb +29 -13
  295. data/spec/dynamic_adapter_spec.rb +6 -6
  296. data/spec/generator/generator_spec.rb +7 -4
  297. data/spec/jobs/bulk_data_job_spec.rb +14 -10
  298. data/spec/jobs/source_job_spec.rb +8 -8
  299. data/spec/license_spec.rb +5 -2
  300. data/spec/models/js_model_spec.rb +39 -0
  301. data/spec/node_spec.rb +42 -0
  302. data/spec/perf/store_perf_spec.rb +67 -12
  303. data/spec/ping/android_spec.rb +1 -1
  304. data/spec/read_state_spec.rb +1 -1
  305. data/spec/rhoconnect_spec.rb +1 -1
  306. data/spec/server/cors_spec.rb +14 -18
  307. data/spec/server/server_spec.rb +265 -88
  308. data/spec/server/stats_spec.rb +1 -1
  309. data/spec/source_adapter_spec.rb +54 -27
  310. data/spec/source_spec.rb +8 -3
  311. data/spec/source_sync_spec.rb +538 -468
  312. data/spec/spec_helper.rb +35 -4
  313. data/spec/stats/record_spec.rb +10 -10
  314. data/spec/{model_spec.rb → store_orm_spec.rb} +56 -54
  315. data/spec/store_spec.rb +159 -179
  316. data/spec/support/shared_examples.rb +36 -27
  317. data/spec/sync_states_spec.rb +40 -33
  318. data/spec/test_methods_spec.rb +18 -14
  319. data/spec/user_spec.rb +17 -30
  320. metadata +156 -52
  321. data/bench/benchapp/application.rb +0 -39
  322. data/bench/blobapp/application.rb +0 -44
  323. data/commands/rhoconnect/clean_start.rb +0 -9
  324. data/commands/rhoconnect/create_user.rb +0 -18
  325. data/commands/rhoconnect/delete_device.rb +0 -9
  326. data/commands/rhoconnect/delete_user.rb +0 -8
  327. data/commands/rhoconnect/reset.rb +0 -16
  328. data/commands/rhoconnect/reset_refresh.rb +0 -11
  329. data/generators/templates/application/application.rb +0 -43
  330. data/lib/rhoconnect/client_sync.rb +0 -434
  331. data/lib/rhoconnect/dynamic_adapter.rb +0 -91
  332. data/lib/rhoconnect/middleware/admin_user.rb +0 -23
  333. data/lib/rhoconnect/middleware/current_request.rb +0 -16
  334. data/lib/rhoconnect/middleware/login_required.rb +0 -22
  335. data/lib/rhoconnect/source_adapter.rb +0 -132
  336. data/lib/rhoconnect/source_sync.rb +0 -464
  337. 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, :key => 'rhoconnect.console', :secret => SecureRandom.hex(64)
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
- this.model.get_license_info();
12
+ this.model.get_license_info();
13
13
  this.model.set('partition_type','app')
14
- this.model.fetch({
15
- error: function(model,resp)
16
- {
17
- if(resp.status == 422){
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
- this.render(domain);
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'>http://"+domain+"</code></p></td>";
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='2' class='input-small'/>&nbsp;(milliseconds)</td>"
70
+ out += "<tr><td>Vibrate</td><td><input id='pingvibrate' type='text' name='vibrate' value='2000' class='input-small'/>&nbsp;(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/dynamic_adapter'
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,'sources'))
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
- # load all pre-defined adapters files
122
- Dir[File.join(File.dirname(__FILE__),'rhoconnect','predefined_adapters','*.rb')].each { |adapter| load adapter }
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
- # Create associations for all sources
125
- Source.update_associations(app.sources)
126
- end
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
- YAML.load_file(settings_file) if settings_file and File.exist?(settings_file)
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
- # Base rhoconnect application class
323
- class Base
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.9.2.2')
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
- # Locked 'connection_pool' version because latest releases (>= 0.9.3) not compatible with MRI 1.8.7
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
@@ -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
- set_state(@s.docname(:md) => data,@s.docname(:md_size) => '3')
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
- verify_result(@s.docname(:md) => data,@s.docname(:md_size)=>'2')
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
- set_state(@s.docname(:md) => data,@s.docname(:md_size) => '3')
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
- verify_result(@s.docname(:md) => data,@s.docname(:md_size)=>'2')
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
- set_state(@s.docname(:md) => data,@s.docname(:md_size) => '2')
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
- verify_result(@s.docname(:md) => data,@s.docname(:md_size)=>'3')
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
- set_state(@s.docname(:md) => data,@s.docname(:md_size) => '3')
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
- verify_result(@s.docname(:md_size)=>'4')
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
- set_state(@s.docname(:md) => data,@s.docname(:md_size) => '3')
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
- verify_result(@s.docname(:md) => data,@s.docname(:md_size)=>'3')
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
- set_state(@s.docname(:md) => data,@s.docname(:md_size) => '3')
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
- verify_result(@s.docname(:md) => data,@s.docname(:md_size)=>'3')
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
- set_state(@s.docname(:md) => data,@s.docname(:md_size) => '3')
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
- verify_result(@s.docname(:md) => data,@s.docname(:md_size)=>'3')
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
- set_state(@s.docname(:md) => data,@s.docname(:md_size) => '3')
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
- verify_result(@s.docname(:md) => data,@s.docname(:md_size)=>'2')
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
- set_state(@s.docname(:md) => data,@s.docname(:md_size) => '3')
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
- verify_result(@s.docname(:md) => data,@s.docname(:md_size)=>'2')
14
+ verify_doc_result(@s, {:md => data, :md_size=>'2'})
15
15
  end
16
16
 
17
17
  end