rhoconnect 3.0.0.beta1

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 (361) hide show
  1. data/CHANGELOG +208 -0
  2. data/CREDITS +38 -0
  3. data/Gemfile +18 -0
  4. data/Gemfile.lock +97 -0
  5. data/LICENSE +75 -0
  6. data/README.md +10 -0
  7. data/Rakefile +82 -0
  8. data/bench/bench +7 -0
  9. data/bench/bench_runner.rb +112 -0
  10. data/bench/benchapp/Gemfile +21 -0
  11. data/bench/benchapp/Gemfile.lock +76 -0
  12. data/bench/benchapp/Rakefile +22 -0
  13. data/bench/benchapp/application.rb +39 -0
  14. data/bench/benchapp/config.ru +36 -0
  15. data/bench/benchapp/settings/license.key +1 -0
  16. data/bench/benchapp/settings/settings.yml +20 -0
  17. data/bench/benchapp/sources/mock_adapter.rb +55 -0
  18. data/bench/benchapp/sources/queue_mock_adapter.rb +2 -0
  19. data/bench/benchapp/spec/sources/mock_adapter_spec.rb +25 -0
  20. data/bench/benchapp/spec/sources/queue_mock_adapter_spec.rb +25 -0
  21. data/bench/benchapp/spec/spec_helper.rb +42 -0
  22. data/bench/blobapp/Gemfile +31 -0
  23. data/bench/blobapp/Gemfile.lock +103 -0
  24. data/bench/blobapp/Rakefile +25 -0
  25. data/bench/blobapp/application.rb +44 -0
  26. data/bench/blobapp/config.ru +36 -0
  27. data/bench/blobapp/settings/license.key +1 -0
  28. data/bench/blobapp/settings/settings.yml +16 -0
  29. data/bench/blobapp/sources/blob_adapter.rb +71 -0
  30. data/bench/blobapp/spec/sources/blob_adapter_spec.rb +25 -0
  31. data/bench/blobapp/spec/spec_helper.rb +42 -0
  32. data/bench/lib/bench/cli.rb +16 -0
  33. data/bench/lib/bench/logging.rb +13 -0
  34. data/bench/lib/bench/mock_client.rb +41 -0
  35. data/bench/lib/bench/result.rb +50 -0
  36. data/bench/lib/bench/runner.rb +107 -0
  37. data/bench/lib/bench/session.rb +67 -0
  38. data/bench/lib/bench/statistics.rb +56 -0
  39. data/bench/lib/bench/test_data.rb +98 -0
  40. data/bench/lib/bench/timer.rb +10 -0
  41. data/bench/lib/bench/utils.rb +49 -0
  42. data/bench/lib/bench.rb +129 -0
  43. data/bench/lib/testdata/100-data.txt +148 -0
  44. data/bench/lib/testdata/5-data.txt +9 -0
  45. data/bench/lib/testdata/images/icon.ico +0 -0
  46. data/bench/lib/testdata/images/icon.png +0 -0
  47. data/bench/lib/testdata/images/loading-Landscape.png +0 -0
  48. data/bench/lib/testdata/images/loading-LandscapeLeft.png +0 -0
  49. data/bench/lib/testdata/images/loading-LandscapeRight.png +0 -0
  50. data/bench/lib/testdata/images/loading-Portrait.png +0 -0
  51. data/bench/lib/testdata/images/loading-PortraitUpsideDown.png +0 -0
  52. data/bench/lib/testdata/images/loading.png +0 -0
  53. data/bench/lib/testdata/images/loading@2x.png +0 -0
  54. data/bench/run_bench.sh +42 -0
  55. data/bench/run_blob_script.sh +3 -0
  56. data/bench/run_cud_script.sh +3 -0
  57. data/bench/run_query_md_script.sh +3 -0
  58. data/bench/run_query_only_script.sh +3 -0
  59. data/bench/run_query_script.sh +3 -0
  60. data/bench/scripts/blob_cud_script.rb +98 -0
  61. data/bench/scripts/cud_script.rb +92 -0
  62. data/bench/scripts/helpers.rb +101 -0
  63. data/bench/scripts/query_md_script.rb +45 -0
  64. data/bench/scripts/query_only_script.rb +51 -0
  65. data/bench/scripts/query_script.rb +45 -0
  66. data/bench/spec/bench_spec_helper.rb +33 -0
  67. data/bench/spec/logging_spec.rb +15 -0
  68. data/bench/spec/mock_adapter_spec.rb +61 -0
  69. data/bench/spec/mock_client_spec.rb +65 -0
  70. data/bench/spec/result_spec.rb +61 -0
  71. data/bench/spec/utils_spec.rb +36 -0
  72. data/bin/rhoconnect +34 -0
  73. data/bin/rhoconnect-setup +84 -0
  74. data/doc/async-jobs.txt +69 -0
  75. data/doc/authentication.txt +76 -0
  76. data/doc/benchmarks.txt +168 -0
  77. data/doc/blob-sync.txt +130 -0
  78. data/doc/bulk-sync.txt +102 -0
  79. data/doc/client.txt +432 -0
  80. data/doc/command-line.txt +210 -0
  81. data/doc/contributing.txt +60 -0
  82. data/doc/deploying.txt +82 -0
  83. data/doc/install.txt +28 -0
  84. data/doc/introduction.txt +20 -0
  85. data/doc/licensing.txt +18 -0
  86. data/doc/metadata.txt +458 -0
  87. data/doc/migration.txt +182 -0
  88. data/doc/public/css/print.css +29 -0
  89. data/doc/public/css/screen.css +257 -0
  90. data/doc/public/css/style.css +20 -0
  91. data/doc/push.txt +135 -0
  92. data/doc/release.txt +41 -0
  93. data/doc/rest-api.txt +367 -0
  94. data/doc/source-adapters.txt +325 -0
  95. data/doc/stats-middleware.txt +69 -0
  96. data/doc/testing.txt +222 -0
  97. data/doc/tutorial.txt +315 -0
  98. data/doc/web-console.txt +35 -0
  99. data/examples/simple/Rakefile +14 -0
  100. data/examples/simple/application.rb +27 -0
  101. data/examples/simple/config.ru +49 -0
  102. data/examples/simple/settings/license.key +1 -0
  103. data/examples/simple/settings/settings.yml +23 -0
  104. data/examples/simple/sources/sample_adapter.rb +5 -0
  105. data/examples/simple/sources/simple_adapter.rb +5 -0
  106. data/generators/rhoconnect.rb +119 -0
  107. data/generators/templates/application/Gemfile +21 -0
  108. data/generators/templates/application/Rakefile +22 -0
  109. data/generators/templates/application/application.rb +39 -0
  110. data/generators/templates/application/config.ru +36 -0
  111. data/generators/templates/application/settings/license.key +1 -0
  112. data/generators/templates/application/settings/settings.yml +14 -0
  113. data/generators/templates/application/spec/spec_helper.rb +42 -0
  114. data/generators/templates/source/source_adapter.rb +47 -0
  115. data/generators/templates/source/source_spec.rb +25 -0
  116. data/install.sh +408 -0
  117. data/installer/unix-like/rho_connect_install_checkers.rb +140 -0
  118. data/installer/unix-like/rho_connect_install_constants.rb +51 -0
  119. data/installer/unix-like/rho_connect_install_debian.rb +63 -0
  120. data/installer/unix-like/rho_connect_install_dnd.rb +58 -0
  121. data/installer/unix-like/rho_connect_install_get_params.rb +30 -0
  122. data/installer/unix-like/rho_connect_install_installers.rb +142 -0
  123. data/installer/unix-like/rho_connect_install_utilities.rb +85 -0
  124. data/installer/unix-like/rho_connect_install_yum.rb +63 -0
  125. data/installer/unix-like/rhoinstaller.rb +89 -0
  126. data/installer/utils/create_texts.rb +366 -0
  127. data/installer/utils/install_test.rb +140 -0
  128. data/installer/windows/EnvVarUpdate.nsh +328 -0
  129. data/installer/windows/ServiceLib.nsh +369 -0
  130. data/installer/windows/configUi.ini +44 -0
  131. data/installer/windows/icon.ico +0 -0
  132. data/installer/windows/rhosync.nsi +418 -0
  133. data/installer/windows/uninstall.bat +7 -0
  134. data/lib/rhoconnect/api/admin/get_api_token.rb +14 -0
  135. data/lib/rhoconnect/api/admin/get_license_info.rb +8 -0
  136. data/lib/rhoconnect/api/admin/login.rb +6 -0
  137. data/lib/rhoconnect/api/admin/reset.rb +10 -0
  138. data/lib/rhoconnect/api/admin/stats.rb +21 -0
  139. data/lib/rhoconnect/api/application/bulk_data.rb +7 -0
  140. data/lib/rhoconnect/api/application/clientcreate.rb +8 -0
  141. data/lib/rhoconnect/api/application/clientlogin.rb +6 -0
  142. data/lib/rhoconnect/api/application/clientregister.rb +6 -0
  143. data/lib/rhoconnect/api/application/clientreset.rb +6 -0
  144. data/lib/rhoconnect/api/application/query.rb +7 -0
  145. data/lib/rhoconnect/api/application/queue_updates.rb +6 -0
  146. data/lib/rhoconnect/api/application/search.rb +6 -0
  147. data/lib/rhoconnect/api/client/create_client.rb +3 -0
  148. data/lib/rhoconnect/api/client/delete_client.rb +5 -0
  149. data/lib/rhoconnect/api/client/get_client_params.rb +3 -0
  150. data/lib/rhoconnect/api/client/list_client_docs.rb +12 -0
  151. data/lib/rhoconnect/api/client/list_clients.rb +3 -0
  152. data/lib/rhoconnect/api/client/ping.rb +7 -0
  153. data/lib/rhoconnect/api/source/get_adapter.rb +3 -0
  154. data/lib/rhoconnect/api/source/get_db_doc.rb +7 -0
  155. data/lib/rhoconnect/api/source/get_source_params.rb +3 -0
  156. data/lib/rhoconnect/api/source/list_source_docs.rb +10 -0
  157. data/lib/rhoconnect/api/source/list_sources.rb +15 -0
  158. data/lib/rhoconnect/api/source/push_deletes.rb +8 -0
  159. data/lib/rhoconnect/api/source/push_objects.rb +8 -0
  160. data/lib/rhoconnect/api/source/save_adapter.rb +3 -0
  161. data/lib/rhoconnect/api/source/set_db_doc.rb +8 -0
  162. data/lib/rhoconnect/api/source/set_refresh_time.rb +8 -0
  163. data/lib/rhoconnect/api/source/upload_file.rb +4 -0
  164. data/lib/rhoconnect/api/user/create_user.rb +7 -0
  165. data/lib/rhoconnect/api/user/delete_user.rb +9 -0
  166. data/lib/rhoconnect/api/user/list_users.rb +3 -0
  167. data/lib/rhoconnect/api/user/update_user.rb +4 -0
  168. data/lib/rhoconnect/api_token.rb +19 -0
  169. data/lib/rhoconnect/app.rb +76 -0
  170. data/lib/rhoconnect/bulk_data/bulk_data.rb +88 -0
  171. data/lib/rhoconnect/bulk_data/syncdb.index.schema +4 -0
  172. data/lib/rhoconnect/bulk_data/syncdb.schema +41 -0
  173. data/lib/rhoconnect/bulk_data.rb +2 -0
  174. data/lib/rhoconnect/client.rb +96 -0
  175. data/lib/rhoconnect/client_sync.rb +412 -0
  176. data/lib/rhoconnect/console/app/helpers/auth_helper.rb +22 -0
  177. data/lib/rhoconnect/console/app/helpers/extensions.rb +19 -0
  178. data/lib/rhoconnect/console/app/helpers/helpers.rb +57 -0
  179. data/lib/rhoconnect/console/app/public/ThickBox.css +649 -0
  180. data/lib/rhoconnect/console/app/public/home.css +438 -0
  181. data/lib/rhoconnect/console/app/public/images/foot_logo_rhoconnect.png +0 -0
  182. data/lib/rhoconnect/console/app/public/images/header_halo.jpg +0 -0
  183. data/lib/rhoconnect/console/app/public/images/land_separator.gif +0 -0
  184. data/lib/rhoconnect/console/app/public/images/landing_header.jpg +0 -0
  185. data/lib/rhoconnect/console/app/public/images/logo_rhoconnect.png +0 -0
  186. data/lib/rhoconnect/console/app/public/images/rhomobile_rhohub_logo.png +0 -0
  187. data/lib/rhoconnect/console/app/public/images/tabs_separator.png +0 -0
  188. data/lib/rhoconnect/console/app/public/jqplot/excanvas.min.js +35 -0
  189. data/lib/rhoconnect/console/app/public/jqplot/jqplot.barRenderer.min.js +34 -0
  190. data/lib/rhoconnect/console/app/public/jqplot/jqplot.canvasAxisLabelRenderer.js +187 -0
  191. data/lib/rhoconnect/console/app/public/jqplot/jqplot.canvasAxisTickRenderer.js +226 -0
  192. data/lib/rhoconnect/console/app/public/jqplot/jqplot.canvasTextRenderer.js +408 -0
  193. data/lib/rhoconnect/console/app/public/jqplot/jqplot.categoryAxisRenderer.min.js +34 -0
  194. data/lib/rhoconnect/console/app/public/jqplot/jqplot.cursor.js +952 -0
  195. data/lib/rhoconnect/console/app/public/jqplot/jqplot.dateAxisRenderer.js +313 -0
  196. data/lib/rhoconnect/console/app/public/jqplot/jqplot.dateAxisRenderer.min.js +34 -0
  197. data/lib/rhoconnect/console/app/public/jqplot/jqplot.pointLabels.min.js +34 -0
  198. data/lib/rhoconnect/console/app/public/jqplot/jquery-1.4.2.min.js +154 -0
  199. data/lib/rhoconnect/console/app/public/jqplot/jquery.jqplot.min.css +1 -0
  200. data/lib/rhoconnect/console/app/public/jqplot/jquery.jqplot.min.js +34 -0
  201. data/lib/rhoconnect/console/app/public/main.css +7 -0
  202. data/lib/rhoconnect/console/app/public/reset.css +76 -0
  203. data/lib/rhoconnect/console/app/public/style.css +2201 -0
  204. data/lib/rhoconnect/console/app/public/text.txt +0 -0
  205. data/lib/rhoconnect/console/app/routes/adapter.rb +28 -0
  206. data/lib/rhoconnect/console/app/routes/auth.rb +29 -0
  207. data/lib/rhoconnect/console/app/routes/client.rb +31 -0
  208. data/lib/rhoconnect/console/app/routes/docs.rb +145 -0
  209. data/lib/rhoconnect/console/app/routes/heroku.rb +19 -0
  210. data/lib/rhoconnect/console/app/routes/home.rb +63 -0
  211. data/lib/rhoconnect/console/app/routes/timing.rb +242 -0
  212. data/lib/rhoconnect/console/app/routes/user.rb +117 -0
  213. data/lib/rhoconnect/console/app/views/adapter.erb +16 -0
  214. data/lib/rhoconnect/console/app/views/client.erb +30 -0
  215. data/lib/rhoconnect/console/app/views/content.erb +14 -0
  216. data/lib/rhoconnect/console/app/views/doc.erb +8 -0
  217. data/lib/rhoconnect/console/app/views/docdata.erb +28 -0
  218. data/lib/rhoconnect/console/app/views/docs.erb +30 -0
  219. data/lib/rhoconnect/console/app/views/edituser.erb +13 -0
  220. data/lib/rhoconnect/console/app/views/headermenu.erb +40 -0
  221. data/lib/rhoconnect/console/app/views/home.erb +24 -0
  222. data/lib/rhoconnect/console/app/views/index.erb +58 -0
  223. data/lib/rhoconnect/console/app/views/jqplot.erb +52 -0
  224. data/lib/rhoconnect/console/app/views/layout.erb +165 -0
  225. data/lib/rhoconnect/console/app/views/login.erb +26 -0
  226. data/lib/rhoconnect/console/app/views/newuser.erb +17 -0
  227. data/lib/rhoconnect/console/app/views/ping.erb +28 -0
  228. data/lib/rhoconnect/console/app/views/result.erb +11 -0
  229. data/lib/rhoconnect/console/app/views/rightboxlinks.erb +15 -0
  230. data/lib/rhoconnect/console/app/views/select_doc.erb +17 -0
  231. data/lib/rhoconnect/console/app/views/upload_doc.erb +23 -0
  232. data/lib/rhoconnect/console/app/views/user.erb +29 -0
  233. data/lib/rhoconnect/console/app/views/users.erb +12 -0
  234. data/lib/rhoconnect/console/rhoconnect_api.rb +245 -0
  235. data/lib/rhoconnect/console/server.rb +32 -0
  236. data/lib/rhoconnect/console.rb +3 -0
  237. data/lib/rhoconnect/cors.rb +229 -0
  238. data/lib/rhoconnect/credential.rb +9 -0
  239. data/lib/rhoconnect/db_adapter.rb +46 -0
  240. data/lib/rhoconnect/document.rb +49 -0
  241. data/lib/rhoconnect/dynamic_adapter.rb +91 -0
  242. data/lib/rhoconnect/generator.rb +1 -0
  243. data/lib/rhoconnect/jobs/bulk_data_job.rb +203 -0
  244. data/lib/rhoconnect/jobs/ping_job.rb +46 -0
  245. data/lib/rhoconnect/jobs/source_job.rb +16 -0
  246. data/lib/rhoconnect/license.rb +86 -0
  247. data/lib/rhoconnect/lock_ops.rb +11 -0
  248. data/lib/rhoconnect/model.rb +414 -0
  249. data/lib/rhoconnect/ping/android.rb +56 -0
  250. data/lib/rhoconnect/ping/apple.rb +52 -0
  251. data/lib/rhoconnect/ping/blackberry.rb +56 -0
  252. data/lib/rhoconnect/ping.rb +3 -0
  253. data/lib/rhoconnect/read_state.rb +31 -0
  254. data/lib/rhoconnect/rho_indifferent_access.rb +88 -0
  255. data/lib/rhoconnect/server/views/index.erb +13 -0
  256. data/lib/rhoconnect/server.rb +286 -0
  257. data/lib/rhoconnect/source.rb +289 -0
  258. data/lib/rhoconnect/source_adapter.rb +123 -0
  259. data/lib/rhoconnect/source_sync.rb +302 -0
  260. data/lib/rhoconnect/stats/middleware.rb +20 -0
  261. data/lib/rhoconnect/stats/record.rb +108 -0
  262. data/lib/rhoconnect/store.rb +232 -0
  263. data/lib/rhoconnect/tasks.rb +350 -0
  264. data/lib/rhoconnect/test_methods.rb +220 -0
  265. data/lib/rhoconnect/user.rb +95 -0
  266. data/lib/rhoconnect/version.rb +3 -0
  267. data/lib/rhoconnect/x_domain_session_wrapper.rb +53 -0
  268. data/lib/rhoconnect.rb +285 -0
  269. data/rhoconnect.gemspec +67 -0
  270. data/spec/api/admin/api_token_spec.rb +14 -0
  271. data/spec/api/admin/get_api_token_spec.rb +36 -0
  272. data/spec/api/admin/get_license_info_spec.rb +38 -0
  273. data/spec/api/admin/reset_spec.rb +22 -0
  274. data/spec/api/admin/stats_spec.rb +66 -0
  275. data/spec/api/api_helper.rb +21 -0
  276. data/spec/api/application/rhoconnect_api_spec.rb +548 -0
  277. data/spec/api/client/create_client_spec.rb +13 -0
  278. data/spec/api/client/delete_client_spec.rb +13 -0
  279. data/spec/api/client/get_client_params_spec.rb +18 -0
  280. data/spec/api/client/list_client_docs_spec.rb +32 -0
  281. data/spec/api/client/list_clients_spec.rb +22 -0
  282. data/spec/api/client/ping_spec.rb +23 -0
  283. data/spec/api/rhosync_api_spec.rb.orig +606 -0
  284. data/spec/api/source/adapter_spec.rb +29 -0
  285. data/spec/api/source/get_db_doc_spec.rb +21 -0
  286. data/spec/api/source/get_source_params_spec.rb +32 -0
  287. data/spec/api/source/list_source_docs_spec.rb +25 -0
  288. data/spec/api/source/list_sources_spec.rb +26 -0
  289. data/spec/api/source/push_deletes_spec.rb +18 -0
  290. data/spec/api/source/push_objects_spec.rb +27 -0
  291. data/spec/api/source/set_db_doc_spec.rb +19 -0
  292. data/spec/api/source/set_refresh_time_spec.rb +43 -0
  293. data/spec/api/source/upload_file_spec.rb +26 -0
  294. data/spec/api/user/create_user_spec.rb +16 -0
  295. data/spec/api/user/delete_user_spec.rb +36 -0
  296. data/spec/api/user/list_users_spec.rb +30 -0
  297. data/spec/api/user/update_user_spec.rb +31 -0
  298. data/spec/api_token_spec.rb +14 -0
  299. data/spec/app_spec.rb +18 -0
  300. data/spec/apps/emptyapp/application.rb +27 -0
  301. data/spec/apps/emptyapp/settings/license.key +1 -0
  302. data/spec/apps/emptyapp/settings/settings.yml +14 -0
  303. data/spec/apps/rhotestapp/Rakefile +1 -0
  304. data/spec/apps/rhotestapp/application.rb +19 -0
  305. data/spec/apps/rhotestapp/config.ru +1 -0
  306. data/spec/apps/rhotestapp/settings/apple_fake_cert.pem +1 -0
  307. data/spec/apps/rhotestapp/settings/license.key +1 -0
  308. data/spec/apps/rhotestapp/settings/settings.yml +36 -0
  309. data/spec/apps/rhotestapp/sources/base_adapter.rb +9 -0
  310. data/spec/apps/rhotestapp/sources/fixed_schema_adapter.rb +28 -0
  311. data/spec/apps/rhotestapp/sources/sample_adapter.rb +71 -0
  312. data/spec/apps/rhotestapp/sources/simple_adapter.rb +41 -0
  313. data/spec/apps/rhotestapp/sources/sub_adapter.rb +7 -0
  314. data/spec/apps/rhotestapp/vendor/mygem-0.1.0/lib/mygem/mygem.rb +8 -0
  315. data/spec/apps/rhotestapp/vendor/mygem-0.1.0/lib/mygem.rb +1 -0
  316. data/spec/bulk_data/bulk_data_spec.rb +97 -0
  317. data/spec/client_spec.rb +124 -0
  318. data/spec/client_sync_spec.rb +774 -0
  319. data/spec/doc/base.html +72 -0
  320. data/spec/doc/doc_spec.rb +376 -0
  321. data/spec/doc/footer.html +4 -0
  322. data/spec/doc/header.html +30 -0
  323. data/spec/document_spec.rb +31 -0
  324. data/spec/dynamic_adapter_spec.rb +43 -0
  325. data/spec/factories/factories.rb +17 -0
  326. data/spec/generator/generator_spec.rb +58 -0
  327. data/spec/generator/generator_spec_helper.rb +9 -0
  328. data/spec/jobs/bulk_data_job_spec.rb +125 -0
  329. data/spec/jobs/ping_job_spec.rb +102 -0
  330. data/spec/jobs/source_job_spec.rb +29 -0
  331. data/spec/license_spec.rb +66 -0
  332. data/spec/model_spec.rb +273 -0
  333. data/spec/perf/bulk_data_perf_spec.rb +32 -0
  334. data/spec/perf/perf_spec_helper.rb +50 -0
  335. data/spec/perf/store_perf_spec.rb +27 -0
  336. data/spec/ping/android_spec.rb +91 -0
  337. data/spec/ping/apple_spec.rb +70 -0
  338. data/spec/ping/blackberry_spec.rb +62 -0
  339. data/spec/read_state_spec.rb +35 -0
  340. data/spec/rhosync_spec.rb +75 -0
  341. data/spec/server/cors_spec.rb +287 -0
  342. data/spec/server/server_spec.rb +470 -0
  343. data/spec/server/x_domain_session_wrapper_spec.rb +150 -0
  344. data/spec/source_adapter_spec.rb +125 -0
  345. data/spec/source_spec.rb +114 -0
  346. data/spec/source_sync_spec.rb +328 -0
  347. data/spec/spec.opts +4 -0
  348. data/spec/spec_helper.rb +231 -0
  349. data/spec/stats/middleware_spec.rb +53 -0
  350. data/spec/stats/record_spec.rb +92 -0
  351. data/spec/store_spec.rb +251 -0
  352. data/spec/support/shared_examples.rb +168 -0
  353. data/spec/sync_states_spec.rb +72 -0
  354. data/spec/test_methods_spec.rb +134 -0
  355. data/spec/testdata/1000-data.txt +1414 -0
  356. data/spec/testdata/compressed/compress-data.txt +1 -0
  357. data/spec/testdata/upload1.txt +1 -0
  358. data/spec/testdata/upload2.txt +1 -0
  359. data/spec/user_spec.rb +139 -0
  360. data/tasks/redis.rake +206 -0
  361. metadata +706 -0
@@ -0,0 +1,21 @@
1
+ require File.join(File.dirname(__FILE__),'..','api_helper')
2
+
3
+ describe "RhoconnectApiGetDbDoc" do
4
+ it_should_behave_like "ApiHelper" do
5
+ it "should return db document by name" do
6
+ data = {'1' => {'foo' => 'bar'}}
7
+ set_state('abc:abc' => data)
8
+ post "/api/source/get_db_doc", :api_token => @api_token, :doc => 'abc:abc'
9
+ last_response.should be_ok
10
+ JSON.parse(last_response.body).should == data
11
+ end
12
+
13
+ it "should return db document by name and data_type" do
14
+ data = 'some string'
15
+ set_state('abc:abc' => data)
16
+ post "/api/source/get_db_doc", :api_token => @api_token, :doc => 'abc:abc', :data_type => :string
17
+ last_response.should be_ok
18
+ last_response.body.should == data
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,32 @@
1
+ require File.join(File.dirname(__FILE__),'..','api_helper')
2
+
3
+ describe "RhoconnectApiGetSourceParams" do
4
+
5
+ it_should_behave_like "ApiHelper" do
6
+
7
+ it "should list source attributes" do
8
+ post "/api/source/get_source_params", {:api_token => @api_token, :source_id =>"SampleAdapter"}
9
+ result = JSON.parse(last_response.body).sort {|x,y| y["name"] <=> x["name"] }
10
+ result.should == [
11
+ {"name"=>"rho__id", "value"=>"SampleAdapter", "type"=>"string"},
12
+ {"name"=>"source_id", "value"=>nil, "type"=>"integer"},
13
+ {"name"=>"name", "value"=>"SampleAdapter", "type"=>"string"},
14
+ {"name"=>"url", "value"=>"http://example.com", "type"=>"string"},
15
+ {"name"=>"login", "value"=>"testuser", "type"=>"string"},
16
+ {"name"=>"password", "value"=>"testpass", "type"=>"string"},
17
+ {"name"=>"priority", "value"=>3, "type"=>"integer"},
18
+ {"name"=>"callback_url", "value"=>nil, "type"=>"string"},
19
+ {"name"=>"poll_interval", "value"=>300, "type"=>"integer"},
20
+ {"name"=>"partition_type", "value"=>"user", "type"=>"string"},
21
+ {"name"=>"sync_type", "value"=>"incremental", "type"=>"string"},
22
+ {"name"=>"belongs_to", "type"=>"string", "value"=>nil},
23
+ {"name"=>"has_many", "type"=>"string", "value"=>"FixedSchemaAdapter,brand"},
24
+ {"name"=>"id", "value"=>"SampleAdapter", "type"=>"string"},
25
+ {"name"=>"queue", "value"=>nil, "type"=>"string"},
26
+ {"name"=>"query_queue", "value"=>nil, "type"=>"string"},
27
+ {"name"=>"pass_through", "value"=>nil, "type"=>"string"},
28
+ {"name"=>"cud_queue", "value"=>nil, "type"=>"string"}].sort {|x,y| y["name"] <=> x["name"] }
29
+ end
30
+ end
31
+ end
32
+
@@ -0,0 +1,25 @@
1
+ require File.join(File.dirname(__FILE__),'..','api_helper')
2
+
3
+ describe "RhoconnectApiListSourceDocs" do
4
+ it_should_behave_like "ApiHelper" do
5
+ it "should list of shared source documents" do
6
+ post "/api/source/list_source_docs", {:api_token => @api_token,
7
+ :source_id => "SimpleAdapter", :user_id => '*'}
8
+ JSON.parse(last_response.body).should == {
9
+ "md"=>"source:application:__shared__:SimpleAdapter:md",
10
+ "errors"=>"source:application:__shared__:SimpleAdapter:errors",
11
+ "md_size"=>"source:application:__shared__:SimpleAdapter:md_size",
12
+ "md_copy"=>"source:application:__shared__:SimpleAdapter:md_copy"}
13
+ end
14
+
15
+ it "should list user source documents" do
16
+ post "/api/source/list_source_docs", {:api_token => @api_token,
17
+ :source_id => "SampleAdapter", :user_id => @u.id}
18
+ JSON.parse(last_response.body).should == {
19
+ "md"=>"source:application:testuser:SampleAdapter:md",
20
+ "errors"=>"source:application:testuser:SampleAdapter:errors",
21
+ "md_size"=>"source:application:testuser:SampleAdapter:md_size",
22
+ "md_copy"=>"source:application:testuser:SampleAdapter:md_copy"}
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,26 @@
1
+ require File.join(File.dirname(__FILE__),'..','api_helper')
2
+
3
+ describe "RhoconnectApiListSources" do
4
+ it_should_behave_like "ApiHelper" do
5
+ it "should list all application sources" do
6
+ post "/api/source/list_sources", {:api_token => @api_token}
7
+ JSON.parse(last_response.body).sort.should == ["SimpleAdapter", "SampleAdapter", "FixedSchemaAdapter"].sort
8
+ end
9
+
10
+ it "should list all application sources using partition_type param" do
11
+ post "/api/source/list_sources",
12
+ {:api_token => @api_token, :partition_type => 'all'}
13
+ JSON.parse(last_response.body).sort.should == ["SimpleAdapter", "SampleAdapter", "FixedSchemaAdapter"].sort
14
+ end
15
+
16
+ it "should list app partition sources" do
17
+ post "/api/source/list_sources", {:api_token => @api_token, :partition_type => :app}
18
+ JSON.parse(last_response.body).should == ["SimpleAdapter"]
19
+ end
20
+
21
+ it "should list user partition sources" do
22
+ post "/api/source/list_sources", {:api_token => @api_token, :partition_type => :user}
23
+ JSON.parse(last_response.body).sort.should == ["SampleAdapter", "FixedSchemaAdapter"].sort
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,18 @@
1
+ require File.join(File.dirname(__FILE__),'..','api_helper')
2
+
3
+ describe "RhoconnectApiPushDeletes" do
4
+ it_should_behave_like "ApiHelper" do
5
+
6
+ it "should delete object from :md" do
7
+ data = {'1' => @product1, '2' => @product2, '3' => @product3}
8
+ @s = Source.load(@s_fields[:name],@s_params)
9
+ set_state(@s.docname(:md) => data,@s.docname(:md_size) => '3')
10
+ data.delete('2')
11
+ post "/api/source/push_deletes", :api_token => @api_token,
12
+ :user_id => @u.id, :source_id => @s_fields[:name], :objects => ['2']
13
+ last_response.should be_ok
14
+ verify_result(@s.docname(:md) => data,@s.docname(:md_size)=>'2')
15
+ end
16
+
17
+ end
18
+ end
@@ -0,0 +1,27 @@
1
+ require File.join(File.dirname(__FILE__),'..','api_helper')
2
+
3
+ describe "RhoconnectApiPushObjects" do
4
+ it_should_behave_like "ApiHelper" do
5
+ it "should push new objects to rhoconnect's :md" do
6
+ data = {'1' => @product1, '2' => @product2, '3' => @product3}
7
+ post "/api/source/push_objects", :api_token => @api_token,
8
+ :user_id => @u.id, :source_id => @s_fields[:name], :objects => data
9
+ last_response.should be_ok
10
+ verify_result(@s.docname(:md) => data,@s.docname(:md_size)=>'3')
11
+ end
12
+
13
+ it "should push updates to existing objects to rhoconnect's :md" do
14
+ data = {'1' => @product1, '2' => @product2, '3' => @product3}
15
+ update = {'price' => '0.99', 'new_field' => 'value'}
16
+ @s = Source.load(@s_fields[:name],@s_params)
17
+ set_state(@s.docname(:md) => data,@s.docname(:md_size) => '3')
18
+ update.each do |key,value|
19
+ data['2'][key] = value
20
+ end
21
+ post "/api/source/push_objects", :api_token => @api_token,
22
+ :user_id => @u.id, :source_id => @s_fields[:name], :objects => {'2'=>update}
23
+ last_response.should be_ok
24
+ verify_result(@s.docname(:md) => data,@s.docname(:md_size)=>'3')
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,19 @@
1
+ require File.join(File.dirname(__FILE__),'..','api_helper')
2
+
3
+ describe "RhoconnectApiSetDbDoc" do
4
+ it_should_behave_like "ApiHelper" do
5
+ it "should set db document by doc name and data" do
6
+ data = {'1' => {'foo' => 'bar'}}
7
+ post "/api/source/set_db_doc", :api_token => @api_token, :doc => 'abc:abc', :data => data
8
+ last_response.should be_ok
9
+ verify_result('abc:abc' => data)
10
+ end
11
+
12
+ it "should set db document by doc name, data type, and data" do
13
+ data = 'some string'
14
+ post "/api/source/set_db_doc", :api_token => @api_token, :doc => 'abc:abc:str', :data => data, :data_type => :string
15
+ last_response.should be_ok
16
+ verify_result('abc:abc:str' => data)
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,43 @@
1
+ require File.join(File.dirname(__FILE__),'..','api_helper')
2
+
3
+ describe "RhoconnectApiSetRefreshTime" do
4
+ it_should_behave_like "ApiHelper" do
5
+ it "should set refresh time to 100s from 'now'" do
6
+ before = Time.now.to_i
7
+ post "/api/source/set_refresh_time", :api_token => @api_token,
8
+ :source_name => @s_fields[:name], :user_name => @u_fields[:login], :refresh_time => 100
9
+ after = Time.now.to_i
10
+ last_response.should be_ok
11
+ @s = Source.load(@s.id,@s_params)
12
+ @s.read_state.refresh_time.should >= before + 100
13
+ @s.read_state.refresh_time.should <= after + 100
14
+ end
15
+
16
+ it "should set refresh time to 'now' if no refresh_time provided" do
17
+ before = Time.now.to_i
18
+ post "/api/source/set_refresh_time", :api_token => @api_token,
19
+ :source_name => @s_fields[:name], :user_name => @u_fields[:login]
20
+ after = Time.now.to_i
21
+ last_response.should be_ok
22
+ @s = Source.load(@s.id,@s_params)
23
+ @s.read_state.refresh_time.should >= before
24
+ @s.read_state.refresh_time.should <= after
25
+ end
26
+
27
+ it "should set poll interval" do
28
+ post "/api/source/set_refresh_time", :api_token => @api_token,
29
+ :source_name => @s_fields[:name], :user_name => @u_fields[:login], :poll_interval => 100
30
+ last_response.should be_ok
31
+ @s = Source.load(@s.id,@s_params)
32
+ @s.poll_interval.should == 100
33
+ end
34
+
35
+ it "should should not set nil poll interval" do
36
+ post "/api/source/set_refresh_time", :api_token => @api_token,
37
+ :source_name => @s_fields[:name], :user_name => @u_fields[:login], :poll_interval => nil
38
+ last_response.should be_ok
39
+ @s = Source.load(@s.id,@s_params)
40
+ @s.poll_interval.should == 300
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,26 @@
1
+ require File.join(File.dirname(__FILE__),'..','api_helper')
2
+
3
+ describe "RhoconnectApiUploadFile" do
4
+ it_should_behave_like "ApiHelper" do
5
+ it "should upload and unzip file" do
6
+ file = File.join(File.dirname(__FILE__),'../..','testdata','compressed')
7
+ compress(file)
8
+ zipfile = File.join(file,"compressed.zip")
9
+ post "/api/source/upload_file", :api_token => @api_token,
10
+ :upload_file => Rack::Test::UploadedFile.new(zipfile, "application/octet-stream")
11
+ FileUtils.rm zipfile
12
+ expected = File.join(Rhoconnect.app_directory,'compress-data.txt')
13
+ File.exists?(expected).should == true
14
+ File.read(expected).should == 'some compressed text'
15
+ FileUtils.rm expected
16
+ end
17
+
18
+ it "should fail to upload a non-zip file" do
19
+ file = File.join(File.dirname(__FILE__),'../..','testdata','compressed','compress-data.txt')
20
+ post "/api/source/upload_file", :api_token => @api_token,
21
+ :upload_file => Rack::Test::UploadedFile.new(file, "application/octet-stream")
22
+ last_response.status.should == 500
23
+ File.exists?(File.join(Rhoconnect.app_directory,'compress-data.txt')).should == false
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,16 @@
1
+ require File.join(File.dirname(__FILE__),'..','api_helper')
2
+
3
+ describe "RhoconnectApiCreateUser" do
4
+ it_should_behave_like "ApiHelper" do
5
+ it "should create user" do
6
+ params = {:api_token => @api_token,
7
+ :attributes => {:login => 'testuser1', :password => 'testpass1'}}
8
+ post "/api/user/create_user", params
9
+ last_response.should be_ok
10
+ User.load(params[:attributes][:login]).login.should == params[:attributes][:login]
11
+ User.authenticate(params[:attributes][:login],
12
+ params[:attributes][:password]).login.should == params[:attributes][:login]
13
+ @a.users.members.sort.should == [@u.login, params[:attributes][:login]]
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,36 @@
1
+ require File.join(File.dirname(__FILE__),'..','api_helper')
2
+
3
+ describe "RhoconnectApiDeleteUser" do
4
+ it_should_behave_like "ApiHelper" do
5
+ it "should delete user" do
6
+ params = {:api_token => @api_token,
7
+ :attributes => {:login => 'testuser1', :password => 'testpass1'}}
8
+ post "/api/user/create_user", params
9
+ last_response.should be_ok
10
+ User.is_exist?(params[:attributes][:login]).should == true
11
+
12
+ #set up two users with data for the same source
13
+ params2 = {:app_id => APP_NAME,:user_id => 'testuser1'}
14
+ params3 = {:app_id => APP_NAME,:user_id => 'testuser'}
15
+ time = Time.now.to_i
16
+ s = Source.load('SampleAdapter', params2)
17
+ s.read_state.refresh_time = time
18
+ s2 = Source.load('SampleAdapter', params3)
19
+ s2.read_state.refresh_time = time
20
+ set_state(s.docname(:delete) => {'4'=>@product4})
21
+ set_state(s2.docname(:delete) => {'4'=>@product4})
22
+ verify_result(s.docname(:delete) => {'4'=>@product4})
23
+ verify_result(s2.docname(:delete) => {'4'=>@product4})
24
+
25
+
26
+ post "/api/user/delete_user", {:api_token => @api_token, :user_id => params[:attributes][:login]}
27
+ last_response.should be_ok
28
+ verify_result(s.docname(:delete) => {})
29
+ verify_result(s2.docname(:delete) => {'4'=>@product4})
30
+ s.load_read_state.should == nil
31
+ s2.load_read_state.refresh_time.should == time
32
+ User.is_exist?(params[:attributes][:login]).should == false
33
+ App.load(test_app_name).users.members.should == ["testuser"]
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,30 @@
1
+ require File.join(File.dirname(__FILE__),'..','api_helper')
2
+
3
+ describe "RhoconnectApiListUsers" do
4
+ it_should_behave_like "ApiHelper" do
5
+ it "should list users" do
6
+ params = {:api_token => @api_token,
7
+ :attributes => {:login => 'testuser1', :password => 'testpass1'}}
8
+ post "/api/user/create_user", params
9
+ last_response.should be_ok
10
+ post "/api/user/list_users", {:api_token => @api_token}
11
+ JSON.parse(last_response.body).should == ["testuser", "testuser1"]
12
+ end
13
+
14
+ it "should handle empty user's list" do
15
+ @a.delete; @a = App.create(@a_fields)
16
+ post "/api/user/list_users", {:api_token => @api_token}
17
+ JSON.parse(last_response.body).should == []
18
+ end
19
+
20
+ it "should show the deprecation warning on /api/list users" do
21
+ params = {:api_token => @api_token,
22
+ :attributes => {:login => 'testuser1', :password => 'testpass1'}}
23
+ post "/api/user/create_user", params
24
+ last_response.should be_ok
25
+ post "/api/list_users", {:api_token => @api_token}
26
+ JSON.parse(last_response.body).should == ["testuser", "testuser1"]
27
+ last_response.headers['Warning'].index('deprecated').should_not == nil
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,31 @@
1
+ require File.join(File.dirname(__FILE__),'..','api_helper')
2
+
3
+ describe "RhoconnectApiUpdateUser" do
4
+ it_should_behave_like "ApiHelper" do
5
+ it "should update user successfully" do
6
+ post "/api/user/update_user", :api_token => @api_token,
7
+ :attributes => {:new_password => '123'}
8
+ last_response.should be_ok
9
+ user = User.authenticate('rhoadmin','123')
10
+ user.login.should == 'rhoadmin'
11
+ user.admin.should == 1
12
+ end
13
+
14
+ it "should fail to update user with wrong attributes" do
15
+ post "/api/user/update_user", :api_token => @api_token,
16
+ :attributes => {:missingattrib => '123'}
17
+ last_response.status.should == 500
18
+ last_response.body.match('undefined method').should_not be_nil
19
+ end
20
+
21
+ it "should not update login attribute for user" do
22
+ post "/api/user/update_user", :api_token => @api_token,
23
+ :attributes => {:new_password => '123', :login => 'admin1'}
24
+ last_response.should be_ok
25
+ user = User.authenticate('rhoadmin','123')
26
+ user.login.should == 'rhoadmin'
27
+ user.admin.should == 1
28
+ User.is_exist?('admin1').should == false
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,14 @@
1
+ require File.join(File.dirname(__FILE__),'spec_helper')
2
+ require File.join(File.dirname(__FILE__), 'support', 'shared_examples')
3
+
4
+ describe "ApiToken" do
5
+ it_behaves_like "SharedRhoconnectHelper", :rhoconnect_data => true do
6
+ it "should generate api token with user" do
7
+ token = ApiToken.create(:user_id => @u.id)
8
+ token.value.length.should == 32
9
+ token.user_id.should == @u.id
10
+ token.user.login.should == @u.login
11
+ token.delete
12
+ end
13
+ end
14
+ end
data/spec/app_spec.rb ADDED
@@ -0,0 +1,18 @@
1
+ require File.join(File.dirname(__FILE__),'spec_helper')
2
+ require File.join(File.dirname(__FILE__), 'support', 'shared_examples')
3
+
4
+ describe "App" do
5
+ it_behaves_like "SharedRhoconnectHelper", :rhoconnect_data => false do
6
+ it "should create app with fields" do
7
+ @a.id.should == @a_fields[:name]
8
+ @a1 = App.load(@a_fields[:name])
9
+ @a1.id.should == @a.id
10
+ @a1.name.should == @a_fields[:name]
11
+ end
12
+
13
+ it "should add source adapters" do
14
+ @a1 = App.load(@a_fields[:name])
15
+ @a1.sources.sort.should == ["FixedSchemaAdapter", "SampleAdapter", "SimpleAdapter"]
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,27 @@
1
+ class Application < Rhoconnect::Base
2
+ class << self
3
+ def authenticate(username,password,session)
4
+ true # do some interesting authentication here...
5
+ end
6
+
7
+ # Add hooks for application startup here
8
+ # Don't forget to call super at the end!
9
+ def initializer(path)
10
+ super
11
+ end
12
+
13
+ # Calling super here returns rack tempfile path:
14
+ # i.e. /var/folders/J4/J4wGJ-r6H7S313GEZ-Xx5E+++TI
15
+ # Note: This tempfile is removed when server stops or crashes...
16
+ # See http://rack.rubyforge.org/doc/Multipart.html for more info
17
+ #
18
+ # Override this by creating a copy of the file somewhere
19
+ # and returning the path to that file (then don't call super!):
20
+ # i.e. /mnt/myimages/soccer.png
21
+ def store_blob(object,field_name,blob)
22
+ super #=> returns blob[:tempfile]
23
+ end
24
+ end
25
+ end
26
+
27
+ Application.initializer(ROOT_PATH)
@@ -0,0 +1 @@
1
+ 858fc60fadfde40273d0ac505906969318aa4931d1a2c4aeb24d98393c74379f60e226651601969874257f7f1fbda9b099ecd551a641519aa46819947fda0191
@@ -0,0 +1,14 @@
1
+ :sources:
2
+
3
+ :development:
4
+ :licensefile: settings/license.key
5
+ :redis: localhost:6379
6
+ :syncserver: http://localhost:9292/application/
7
+ :test:
8
+ :licensefile: settings/license.key
9
+ :redis: localhost:6379
10
+ :syncserver: http://localhost:9292/application/
11
+ :production:
12
+ :licensefile: settings/license.key
13
+ :redis: localhost:6379
14
+ :syncserver: http://localhost:9292/application/
@@ -0,0 +1 @@
1
+ # Dummy Rakefile for testing...
@@ -0,0 +1,19 @@
1
+ class Application < Rhoconnect::Base
2
+ class << self
3
+ def authenticate(username,password,session)
4
+ session[:auth] = "delegated"
5
+ raise RuntimeError.new('server error') if password == 'server error'
6
+ raise LoginException.new('login exception') if password == 'wrongpass'
7
+ return "different" if password == "diffuser"
8
+ password == 'wrongpassnomsg' ? false : true
9
+ end
10
+
11
+ # Add hooks for application startup here
12
+ # Don't forget to call super at the end!
13
+ def initializer(path)
14
+ super
15
+ end
16
+ end
17
+ end
18
+
19
+ Application.initializer(File.dirname(__FILE__))
@@ -0,0 +1 @@
1
+ # Dummy config.ru for testing...
@@ -0,0 +1 @@
1
+ This is fake!
@@ -0,0 +1 @@
1
+ 858fc60fadfde40273d0ac505906969318aa4931d1a2c4aeb24d98393c74379f60e226651601969874257f7f1fbda9b099ecd551a641519aa46819947fda0191
@@ -0,0 +1,36 @@
1
+ :sources:
2
+ SampleAdapter:
3
+ poll_interval: 300
4
+ SimpleAdapter:
5
+ poll_interval: 600
6
+ partition_type: 'app'
7
+ FixedSchemaAdapter:
8
+ poll_interval: 300
9
+ sync_type: 'incremental'
10
+ belongs_to:
11
+ - brand: 'SampleAdapter'
12
+
13
+ :development:
14
+ :licensefile: settings/license.key
15
+ :bulk_sync_poll_interval: 3600
16
+ :redis: localhost:6379
17
+ :syncserver: http://localhost:9292/application/
18
+ :appserver: http://test.rhoconnect.com
19
+ :api_token: b6f22608fa8b4acf84e844808845e2fe
20
+ :test:
21
+ :licensefile: settings/license.key
22
+ :iphonecertfile: settings/apple_fake_cert.pem
23
+ :iphonepassphrase: certpassword
24
+ :iphoneserver: gateway.sandbox.push.apple.com
25
+ :iphoneport: 2195
26
+ :bulk_sync_poll_interval: 3600
27
+ :redis: localhost:6379
28
+ :syncserver: http://localhost:9292/application/
29
+ :appserver: http://test.rhoconnect.com
30
+ :api_token: b6f22608fa8b4acf84e844808845e2fe
31
+ :cookie_expire: 9999999
32
+ :production:
33
+ :licensefile: settings/license.key
34
+ :bulk_sync_poll_interval: 3600
35
+ :redis: localhost:6379
36
+ :syncserver: http://localhost:9292/application/
@@ -0,0 +1,9 @@
1
+ class BaseAdapter < SourceAdapter
2
+ def initialize(source)
3
+ super(source)
4
+ end
5
+
6
+ def query(params=nil)
7
+ @result
8
+ end
9
+ end
@@ -0,0 +1,28 @@
1
+ class FixedSchemaAdapter < SourceAdapter
2
+ def initialize(source)
3
+ super(source)
4
+ end
5
+
6
+ def query(params=nil)
7
+ @result = Store.get_data('test_db_storage')
8
+ end
9
+
10
+ def schema
11
+ {
12
+ 'version' => '1.0',
13
+ 'property' => {
14
+ 'name' => 'string',
15
+ 'brand' => 'string',
16
+ 'price' => 'string',
17
+ 'image_url_cropped' => 'blob,overwrite',
18
+ 'image_url' => 'blob'
19
+ },
20
+ 'index' => {
21
+ 'by_name_brand' => 'name,brand'
22
+ },
23
+ 'unique_index' => {
24
+ 'by_price' => 'price'
25
+ }
26
+ }.to_json
27
+ end
28
+ end
@@ -0,0 +1,71 @@
1
+ class SampleAdapter < SourceAdapter
2
+ def initialize(source)
3
+ super(source)
4
+ end
5
+
6
+ def login
7
+ raise SourceAdapterLoginException.new('Error logging in') if _is_empty?(current_user.login)
8
+ true
9
+ end
10
+
11
+ def query(params=nil)
12
+ _read('query',params)
13
+ end
14
+
15
+ def search(params=nil)
16
+ _read('search',params)
17
+ end
18
+
19
+ def sync
20
+ super
21
+ end
22
+
23
+ def create(create_hash)
24
+ Store.put_data('test_create_storage',{create_hash['_id']=>create_hash},true)
25
+ raise SourceAdapterException.new("ID provided in create_hash") if create_hash['id']
26
+ _raise_exception(create_hash)
27
+ 'backend_id' if create_hash and create_hash['link']
28
+ end
29
+
30
+ def update(update_hash)
31
+ raise SourceAdapterException.new("No id provided in update_hash") unless update_hash['id']
32
+ Store.put_data('test_update_storage',{update_hash['id']=>update_hash},true)
33
+ _raise_exception(update_hash)
34
+ end
35
+
36
+ def delete(delete_hash)
37
+ raise SourceAdapterException.new("No id provided in delete_hash") unless delete_hash['id']
38
+ raise SourceAdapterServerErrorException.new("Error delete record") if delete_hash['id'] == ERROR
39
+ Store.put_data('test_delete_storage',{delete_hash['id']=>delete_hash},true)
40
+ end
41
+
42
+ def logoff
43
+ @result = Store.get_data('test_db_storage')
44
+ raise SourceAdapterLogoffException.new(@result[ERROR]['an_attribute']) if @result[ERROR] and
45
+ @result[ERROR]['name'] == 'logoff error'
46
+ end
47
+
48
+ private
49
+ def _is_empty?(str)
50
+ str.length <= 0
51
+ end
52
+
53
+ def _raise_exception(data_hash)
54
+ if data_hash and data_hash['name'] == 'wrongname' or data_hash['id'] == 'error'
55
+ raise SourceAdapterServerErrorException.new(data_hash['an_attribute'])
56
+ end
57
+ end
58
+
59
+ def _read(operation,params)
60
+ @result = Store.get_data('test_db_storage')
61
+ if params and params['stash_result']
62
+ stash_result
63
+ # @result is nil at this point; if @result is empty then md will be cleared
64
+ else
65
+ raise SourceAdapterServerErrorException.new(@result[ERROR]['an_attribute']) if @result[ERROR] and
66
+ @result[ERROR]['name'] == "#{operation} error"
67
+ @result.reject! {|key,value| value['name'] != params['name']} if params
68
+ end
69
+ @result
70
+ end
71
+ end