dune-dashboard 1.0.0

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 (561) hide show
  1. checksums.yaml +7 -0
  2. data/.bowerrc +3 -0
  3. data/.gitignore +22 -0
  4. data/.rspec +2 -0
  5. data/.travis.yml +13 -0
  6. data/CHANGELOG.md +6 -0
  7. data/Gemfile +12 -0
  8. data/Gemfile.lock +392 -0
  9. data/LICENSE.txt +22 -0
  10. data/README.md +58 -0
  11. data/Rakefile +23 -0
  12. data/app/assets/images/dune/dashboard/logo@2x.png +0 -0
  13. data/app/assets/javascripts/adapters/channel_adapter.coffee +1 -0
  14. data/app/assets/javascripts/adapters/form_data.coffee +26 -0
  15. data/app/assets/javascripts/adapters/press_asset_adapter.coffee +1 -0
  16. data/app/assets/javascripts/configs.coffee +10 -0
  17. data/app/assets/javascripts/controllers/.gitkeep +0 -0
  18. data/app/assets/javascripts/controllers/channels.coffee +40 -0
  19. data/app/assets/javascripts/controllers/contributions.coffee +26 -0
  20. data/app/assets/javascripts/controllers/press_assets.coffee +24 -0
  21. data/app/assets/javascripts/controllers/projects.coffee +36 -0
  22. data/app/assets/javascripts/controllers/sessions.coffee +2 -0
  23. data/app/assets/javascripts/controllers/tags.coffee +24 -0
  24. data/app/assets/javascripts/controllers/users.coffee +8 -0
  25. data/app/assets/javascripts/dashboard.coffee +5 -0
  26. data/app/assets/javascripts/dune-dashboard-application.js +16 -0
  27. data/app/assets/javascripts/dune-dashboard-libs.js +25 -0
  28. data/app/assets/javascripts/dune-dashboard-templates.js +1 -0
  29. data/app/assets/javascripts/helpers/daterangepicker.coffee +1 -0
  30. data/app/assets/javascripts/helpers/format-date.coffee +5 -0
  31. data/app/assets/javascripts/helpers/loading.coffee +14 -0
  32. data/app/assets/javascripts/helpers/number-to-currency.coffee +5 -0
  33. data/app/assets/javascripts/helpers/pagination.coffee +1 -0
  34. data/app/assets/javascripts/helpers/show-boolean.coffee +5 -0
  35. data/app/assets/javascripts/i18n/translations_en.js +165 -0
  36. data/app/assets/javascripts/initializers/authentication.coffee +50 -0
  37. data/app/assets/javascripts/mixins/modal-controller.coffee +7 -0
  38. data/app/assets/javascripts/mixins/modal-view.coffee +15 -0
  39. data/app/assets/javascripts/mixins/paginable.coffee +25 -0
  40. data/app/assets/javascripts/mixins/searchable.coffee +58 -0
  41. data/app/assets/javascripts/models/.gitkeep +0 -0
  42. data/app/assets/javascripts/models/channel.coffee +25 -0
  43. data/app/assets/javascripts/models/contributions.coffee +15 -0
  44. data/app/assets/javascripts/models/press_asset.coffee +5 -0
  45. data/app/assets/javascripts/models/project.coffee +16 -0
  46. data/app/assets/javascripts/models/reward.coffee +4 -0
  47. data/app/assets/javascripts/models/tag.coffee +4 -0
  48. data/app/assets/javascripts/models/user.coffee +13 -0
  49. data/app/assets/javascripts/router.coffee +36 -0
  50. data/app/assets/javascripts/routes/.gitkeep +0 -0
  51. data/app/assets/javascripts/routes/application.coffee +35 -0
  52. data/app/assets/javascripts/routes/channels-edit.coffee +4 -0
  53. data/app/assets/javascripts/routes/channels-new.coffee +4 -0
  54. data/app/assets/javascripts/routes/channels.coffee +21 -0
  55. data/app/assets/javascripts/routes/contributions.coffee +29 -0
  56. data/app/assets/javascripts/routes/index.coffee +4 -0
  57. data/app/assets/javascripts/routes/press_assets-edit.coffee +4 -0
  58. data/app/assets/javascripts/routes/press_assets-new.coffee +5 -0
  59. data/app/assets/javascripts/routes/press_assets.coffee +13 -0
  60. data/app/assets/javascripts/routes/projects.coffee +23 -0
  61. data/app/assets/javascripts/routes/sessions.coffee +3 -0
  62. data/app/assets/javascripts/routes/tags-edit.coffee +4 -0
  63. data/app/assets/javascripts/routes/tags-new.coffee +5 -0
  64. data/app/assets/javascripts/routes/tags.coffee +15 -0
  65. data/app/assets/javascripts/routes/users.coffee +17 -0
  66. data/app/assets/javascripts/serializers/channel.coffee +10 -0
  67. data/app/assets/javascripts/serializers/file.coffee +6 -0
  68. data/app/assets/javascripts/serializers/object.coffee +6 -0
  69. data/app/assets/javascripts/serializers/project.coffee +4 -0
  70. data/app/assets/javascripts/store.coffee +5 -0
  71. data/app/assets/javascripts/templates/.gitkeep +0 -0
  72. data/app/assets/javascripts/templates/channels/_form.emblem +256 -0
  73. data/app/assets/javascripts/templates/channels/edit.emblem +1 -0
  74. data/app/assets/javascripts/templates/channels/index.emblem +66 -0
  75. data/app/assets/javascripts/templates/channels/new.emblem +1 -0
  76. data/app/assets/javascripts/templates/channels/search-form.emblem +13 -0
  77. data/app/assets/javascripts/templates/contributions/index.emblem +111 -0
  78. data/app/assets/javascripts/templates/contributions/search-form.emblem +27 -0
  79. data/app/assets/javascripts/templates/contributions/show.emblem +79 -0
  80. data/app/assets/javascripts/templates/daterangepicker.emblem +5 -0
  81. data/app/assets/javascripts/templates/layouts/application.emblem +19 -0
  82. data/app/assets/javascripts/templates/layouts/header.emblem +25 -0
  83. data/app/assets/javascripts/templates/layouts/sidebar.emblem +32 -0
  84. data/app/assets/javascripts/templates/pagination.emblem +10 -0
  85. data/app/assets/javascripts/templates/press_assets/_form.emblem +33 -0
  86. data/app/assets/javascripts/templates/press_assets/edit.emblem +1 -0
  87. data/app/assets/javascripts/templates/press_assets/index.emblem +45 -0
  88. data/app/assets/javascripts/templates/press_assets/new.emblem +1 -0
  89. data/app/assets/javascripts/templates/projects/index.emblem +119 -0
  90. data/app/assets/javascripts/templates/projects/search-form.emblem +19 -0
  91. data/app/assets/javascripts/templates/search-tab.emblem +6 -0
  92. data/app/assets/javascripts/templates/sessions/new.emblem +17 -0
  93. data/app/assets/javascripts/templates/tags/_form.emblem +24 -0
  94. data/app/assets/javascripts/templates/tags/edit.emblem +1 -0
  95. data/app/assets/javascripts/templates/tags/index.emblem +46 -0
  96. data/app/assets/javascripts/templates/tags/new.emblem +1 -0
  97. data/app/assets/javascripts/templates/users/index.emblem +51 -0
  98. data/app/assets/javascripts/templates/users/search-form.emblem +13 -0
  99. data/app/assets/javascripts/views/auto-save-checkbox.coffee +14 -0
  100. data/app/assets/javascripts/views/contributions/show.coffee +1 -0
  101. data/app/assets/javascripts/views/daterangepicker.coffee +60 -0
  102. data/app/assets/javascripts/views/file.coffee +7 -0
  103. data/app/assets/javascripts/views/layouts/header.coffee +23 -0
  104. data/app/assets/javascripts/views/layouts/sidebar.coffee +6 -0
  105. data/app/assets/javascripts/views/page-title.coffee +45 -0
  106. data/app/assets/javascripts/views/pagination.coffee +51 -0
  107. data/app/assets/javascripts/views/projects/index.coffee +5 -0
  108. data/app/assets/javascripts/views/search-tab.coffee +24 -0
  109. data/app/assets/stylesheets/core/core.sass +299 -0
  110. data/app/assets/stylesheets/core/mixins.sass +83 -0
  111. data/app/assets/stylesheets/core/settings.sass +75 -0
  112. data/app/assets/stylesheets/dune-dashboard-application.sass +12 -0
  113. data/app/assets/stylesheets/modules/alerts.sass +21 -0
  114. data/app/assets/stylesheets/modules/avatar.sass +13 -0
  115. data/app/assets/stylesheets/modules/boxes.sass +274 -0
  116. data/app/assets/stylesheets/modules/buttons.sass +160 -0
  117. data/app/assets/stylesheets/modules/dl-details.sass +13 -0
  118. data/app/assets/stylesheets/modules/forms.sass +53 -0
  119. data/app/assets/stylesheets/modules/generic.sass +9 -0
  120. data/app/assets/stylesheets/modules/header.sass +153 -0
  121. data/app/assets/stylesheets/modules/labels.sass +3 -0
  122. data/app/assets/stylesheets/modules/navs.sass +98 -0
  123. data/app/assets/stylesheets/modules/pagination.sass +19 -0
  124. data/app/assets/stylesheets/modules/sidebar.sass +147 -0
  125. data/app/assets/stylesheets/modules/small-box.sass +78 -0
  126. data/app/assets/stylesheets/pages/login.sass +42 -0
  127. data/app/controllers/dune/dashboard/ember_controller.rb +7 -0
  128. data/app/views/layouts/dune/dashboard/application.html.erb +15 -0
  129. data/bower.json +28 -0
  130. data/config/ember-i18n.yml +2 -0
  131. data/config/ember_locales/channels.en.yml +49 -0
  132. data/config/ember_locales/contributions.en.yml +42 -0
  133. data/config/ember_locales/en.yml +1 -0
  134. data/config/ember_locales/layouts.en.yml +16 -0
  135. data/config/ember_locales/press_assets.en.yml +14 -0
  136. data/config/ember_locales/projects.en.yml +33 -0
  137. data/config/ember_locales/sessions.en.yml +11 -0
  138. data/config/ember_locales/tags.en.yml +12 -0
  139. data/config/ember_locales/titles.en.yml +22 -0
  140. data/config/ember_locales/users.en.yml +12 -0
  141. data/config/ember_locales/words.en.yml +12 -0
  142. data/config/routes.rb +4 -0
  143. data/dune-dashboard.gemspec +28 -0
  144. data/lib/dune/dashboard.rb +11 -0
  145. data/lib/dune/dashboard/engine.rb +12 -0
  146. data/lib/dune/dashboard/i18n.rb +108 -0
  147. data/lib/dune/dashboard/version.rb +5 -0
  148. data/spec/dummy/README.rdoc +28 -0
  149. data/spec/dummy/Rakefile +6 -0
  150. data/spec/dummy/app/assets/images/.keep +0 -0
  151. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  152. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  153. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  154. data/spec/dummy/app/controllers/concerns/.keep +0 -0
  155. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  156. data/spec/dummy/app/mailers/.keep +0 -0
  157. data/spec/dummy/app/models/.keep +0 -0
  158. data/spec/dummy/app/models/concerns/.keep +0 -0
  159. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  160. data/spec/dummy/bin/bundle +3 -0
  161. data/spec/dummy/bin/rails +4 -0
  162. data/spec/dummy/bin/rake +4 -0
  163. data/spec/dummy/config.ru +4 -0
  164. data/spec/dummy/config/application.rb +30 -0
  165. data/spec/dummy/config/boot.rb +5 -0
  166. data/spec/dummy/config/environment.rb +5 -0
  167. data/spec/dummy/config/environments/development.rb +29 -0
  168. data/spec/dummy/config/environments/production.rb +80 -0
  169. data/spec/dummy/config/environments/test.rb +38 -0
  170. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  171. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  172. data/spec/dummy/config/initializers/inflections.rb +16 -0
  173. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  174. data/spec/dummy/config/initializers/secret_token.rb +12 -0
  175. data/spec/dummy/config/initializers/session_store.rb +3 -0
  176. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  177. data/spec/dummy/config/locales/en.yml +23 -0
  178. data/spec/dummy/config/routes.rb +3 -0
  179. data/spec/dummy/lib/assets/.keep +0 -0
  180. data/spec/dummy/log/.keep +0 -0
  181. data/spec/dummy/public/404.html +58 -0
  182. data/spec/dummy/public/422.html +58 -0
  183. data/spec/dummy/public/500.html +57 -0
  184. data/spec/dummy/public/favicon.ico +0 -0
  185. data/spec/javascripts/controllers/channels_spec.coffee +16 -0
  186. data/spec/javascripts/controllers/press_assets_spec.coffee +5 -0
  187. data/spec/javascripts/controllers/projects_spec.coffee +16 -0
  188. data/spec/javascripts/controllers/users_spec.coffee +16 -0
  189. data/spec/javascripts/fixtures/channels.coffee +49 -0
  190. data/spec/javascripts/fixtures/contributions.coffee +46 -0
  191. data/spec/javascripts/fixtures/press_assets.coffee +15 -0
  192. data/spec/javascripts/fixtures/projects.coffee +108 -0
  193. data/spec/javascripts/fixtures/tags.coffee +15 -0
  194. data/spec/javascripts/fixtures/users.coffee +26 -0
  195. data/spec/javascripts/helpers/auththentication.coffee +11 -0
  196. data/spec/javascripts/integration/channels_spec.coffee +109 -0
  197. data/spec/javascripts/integration/contributions_spec.coffee +108 -0
  198. data/spec/javascripts/integration/press_assets_spec.coffee +66 -0
  199. data/spec/javascripts/integration/projects_spec.coffee +110 -0
  200. data/spec/javascripts/integration/sessions_spec.coffee +71 -0
  201. data/spec/javascripts/integration/tags_spec.coffee +65 -0
  202. data/spec/javascripts/integration/users_spec.coffee +108 -0
  203. data/spec/javascripts/models/channel_spec.coffee +4 -0
  204. data/spec/javascripts/models/contribution_spec.coffee +4 -0
  205. data/spec/javascripts/models/press_asset_spec.coffee +5 -0
  206. data/spec/javascripts/models/project_spec.coffee +4 -0
  207. data/spec/javascripts/models/reward_spec.coffee +4 -0
  208. data/spec/javascripts/models/tag_spec.coffee +4 -0
  209. data/spec/javascripts/models/user_spec.coffee +4 -0
  210. data/spec/javascripts/spec_helper.coffee +56 -0
  211. data/spec/javascripts/support/jquery.mockjax.js +598 -0
  212. data/spec/teaspoon_env.rb +183 -0
  213. data/vendor/assets/components/cldr/.bower.json +14 -0
  214. data/vendor/assets/components/cldr/README.md +47 -0
  215. data/vendor/assets/components/cldr/plurals.js +240 -0
  216. data/vendor/assets/components/ember-i18n/.bower.json +46 -0
  217. data/vendor/assets/components/ember-i18n/CONTRIBUTING.md +13 -0
  218. data/vendor/assets/components/ember-i18n/Changelog.md +82 -0
  219. data/vendor/assets/components/ember-i18n/LICENSE +10 -0
  220. data/vendor/assets/components/ember-i18n/README.md +148 -0
  221. data/vendor/assets/components/ember-i18n/VERSION +1 -0
  222. data/vendor/assets/components/ember-i18n/bower.json +34 -0
  223. data/vendor/assets/components/ember-i18n/lib/i18n.js +215 -0
  224. data/vendor/assets/components/ember-i18n/package.json +27 -0
  225. data/vendor/assets/components/ember-i18n/script/buildSuite.js +34 -0
  226. data/vendor/assets/components/ember-i18n/script/fetch_vendor.js +66 -0
  227. data/vendor/assets/components/ember-i18n/script/run.js +24 -0
  228. data/vendor/assets/components/ember-simple-auth/.bower.json +31 -0
  229. data/vendor/assets/components/ember-simple-auth/LICENSE +20 -0
  230. data/vendor/assets/components/ember-simple-auth/README.md +15 -0
  231. data/vendor/assets/components/ember-simple-auth/bower.json +21 -0
  232. data/vendor/assets/components/ember-simple-auth/simple-auth-cookie-store.amd.js +220 -0
  233. data/vendor/assets/components/ember-simple-auth/simple-auth-cookie-store.js +284 -0
  234. data/vendor/assets/components/ember-simple-auth/simple-auth-devise.amd.js +243 -0
  235. data/vendor/assets/components/ember-simple-auth/simple-auth-devise.js +312 -0
  236. data/vendor/assets/components/ember-simple-auth/simple-auth-oauth2.amd.js +386 -0
  237. data/vendor/assets/components/ember-simple-auth/simple-auth-oauth2.js +455 -0
  238. data/vendor/assets/components/ember-simple-auth/simple-auth-testing.amd.js +79 -0
  239. data/vendor/assets/components/ember-simple-auth/simple-auth-testing.js +137 -0
  240. data/vendor/assets/components/ember-simple-auth/simple-auth-torii.amd.js +142 -0
  241. data/vendor/assets/components/ember-simple-auth/simple-auth-torii.js +199 -0
  242. data/vendor/assets/components/ember-simple-auth/simple-auth.amd.js +1450 -0
  243. data/vendor/assets/components/ember-simple-auth/simple-auth.js +1548 -0
  244. data/vendor/assets/components/ember/.bower.json +21 -0
  245. data/vendor/assets/components/ember/.gitignore +5 -0
  246. data/vendor/assets/components/ember/Makefile +9 -0
  247. data/vendor/assets/components/ember/README.md +12 -0
  248. data/vendor/assets/components/ember/bower.json +11 -0
  249. data/vendor/assets/components/ember/component.json +13 -0
  250. data/vendor/assets/components/ember/composer.json +27 -0
  251. data/vendor/assets/components/ember/ember-template-compiler.js +336 -0
  252. data/vendor/assets/components/ember/ember.js +46762 -0
  253. data/vendor/assets/components/ember/ember.min.js +20 -0
  254. data/vendor/assets/components/ember/ember.prod.js +46319 -0
  255. data/vendor/assets/components/ember/package.json +11 -0
  256. data/vendor/assets/components/handlebars/.bower.json +16 -0
  257. data/vendor/assets/components/handlebars/.gitignore +2 -0
  258. data/vendor/assets/components/handlebars/README.md +11 -0
  259. data/vendor/assets/components/handlebars/bower.json +6 -0
  260. data/vendor/assets/components/handlebars/component.json +9 -0
  261. data/vendor/assets/components/handlebars/composer.json +35 -0
  262. data/vendor/assets/components/handlebars/handlebars-source.gemspec +21 -0
  263. data/vendor/assets/components/handlebars/handlebars.amd.js +2719 -0
  264. data/vendor/assets/components/handlebars/handlebars.amd.min.js +28 -0
  265. data/vendor/assets/components/handlebars/handlebars.js +2746 -0
  266. data/vendor/assets/components/handlebars/handlebars.js.nuspec +17 -0
  267. data/vendor/assets/components/handlebars/handlebars.min.js +28 -0
  268. data/vendor/assets/components/handlebars/handlebars.runtime.amd.js +515 -0
  269. data/vendor/assets/components/handlebars/handlebars.runtime.amd.min.js +27 -0
  270. data/vendor/assets/components/handlebars/handlebars.runtime.js +530 -0
  271. data/vendor/assets/components/handlebars/handlebars.runtime.min.js +27 -0
  272. data/vendor/assets/components/handlebars/lib/handlebars/source.rb +11 -0
  273. data/vendor/assets/components/jquery/.bower.json +37 -0
  274. data/vendor/assets/components/jquery/MIT-LICENSE.txt +21 -0
  275. data/vendor/assets/components/jquery/bower.json +27 -0
  276. data/vendor/assets/components/jquery/dist/jquery.js +9111 -0
  277. data/vendor/assets/components/jquery/dist/jquery.min.js +5 -0
  278. data/vendor/assets/components/jquery/dist/jquery.min.map +1 -0
  279. data/vendor/assets/components/jquery/src/ajax.js +806 -0
  280. data/vendor/assets/components/jquery/src/ajax/jsonp.js +89 -0
  281. data/vendor/assets/components/jquery/src/ajax/load.js +75 -0
  282. data/vendor/assets/components/jquery/src/ajax/parseJSON.js +13 -0
  283. data/vendor/assets/components/jquery/src/ajax/parseXML.js +28 -0
  284. data/vendor/assets/components/jquery/src/ajax/script.js +64 -0
  285. data/vendor/assets/components/jquery/src/ajax/var/nonce.js +5 -0
  286. data/vendor/assets/components/jquery/src/ajax/var/rquery.js +3 -0
  287. data/vendor/assets/components/jquery/src/ajax/xhr.js +130 -0
  288. data/vendor/assets/components/jquery/src/attributes.js +11 -0
  289. data/vendor/assets/components/jquery/src/attributes/attr.js +143 -0
  290. data/vendor/assets/components/jquery/src/attributes/classes.js +158 -0
  291. data/vendor/assets/components/jquery/src/attributes/prop.js +96 -0
  292. data/vendor/assets/components/jquery/src/attributes/support.js +35 -0
  293. data/vendor/assets/components/jquery/src/attributes/val.js +153 -0
  294. data/vendor/assets/components/jquery/src/callbacks.js +205 -0
  295. data/vendor/assets/components/jquery/src/core.js +500 -0
  296. data/vendor/assets/components/jquery/src/core/access.js +60 -0
  297. data/vendor/assets/components/jquery/src/core/init.js +123 -0
  298. data/vendor/assets/components/jquery/src/core/parseHTML.js +39 -0
  299. data/vendor/assets/components/jquery/src/core/ready.js +96 -0
  300. data/vendor/assets/components/jquery/src/core/var/rsingleTag.js +4 -0
  301. data/vendor/assets/components/jquery/src/css.js +455 -0
  302. data/vendor/assets/components/jquery/src/css/addGetHookIf.js +24 -0
  303. data/vendor/assets/components/jquery/src/css/curCSS.js +57 -0
  304. data/vendor/assets/components/jquery/src/css/defaultDisplay.js +69 -0
  305. data/vendor/assets/components/jquery/src/css/hiddenVisibleSelectors.js +15 -0
  306. data/vendor/assets/components/jquery/src/css/support.js +83 -0
  307. data/vendor/assets/components/jquery/src/css/swap.js +28 -0
  308. data/vendor/assets/components/jquery/src/css/var/cssExpand.js +3 -0
  309. data/vendor/assets/components/jquery/src/css/var/getStyles.js +5 -0
  310. data/vendor/assets/components/jquery/src/css/var/isHidden.js +13 -0
  311. data/vendor/assets/components/jquery/src/css/var/rmargin.js +3 -0
  312. data/vendor/assets/components/jquery/src/css/var/rnumnonpx.js +5 -0
  313. data/vendor/assets/components/jquery/src/data.js +175 -0
  314. data/vendor/assets/components/jquery/src/data/Data.js +181 -0
  315. data/vendor/assets/components/jquery/src/data/accepts.js +20 -0
  316. data/vendor/assets/components/jquery/src/data/var/data_priv.js +5 -0
  317. data/vendor/assets/components/jquery/src/data/var/data_user.js +5 -0
  318. data/vendor/assets/components/jquery/src/deferred.js +149 -0
  319. data/vendor/assets/components/jquery/src/deprecated.js +13 -0
  320. data/vendor/assets/components/jquery/src/dimensions.js +50 -0
  321. data/vendor/assets/components/jquery/src/effects.js +642 -0
  322. data/vendor/assets/components/jquery/src/effects/Tween.js +114 -0
  323. data/vendor/assets/components/jquery/src/effects/animatedSelector.js +13 -0
  324. data/vendor/assets/components/jquery/src/event.js +859 -0
  325. data/vendor/assets/components/jquery/src/event/alias.js +39 -0
  326. data/vendor/assets/components/jquery/src/event/support.js +9 -0
  327. data/vendor/assets/components/jquery/src/exports/amd.js +18 -0
  328. data/vendor/assets/components/jquery/src/exports/global.js +32 -0
  329. data/vendor/assets/components/jquery/src/intro.js +44 -0
  330. data/vendor/assets/components/jquery/src/jquery.js +36 -0
  331. data/vendor/assets/components/jquery/src/manipulation.js +583 -0
  332. data/vendor/assets/components/jquery/src/manipulation/_evalUrl.js +18 -0
  333. data/vendor/assets/components/jquery/src/manipulation/support.js +24 -0
  334. data/vendor/assets/components/jquery/src/manipulation/var/rcheckableType.js +3 -0
  335. data/vendor/assets/components/jquery/src/offset.js +204 -0
  336. data/vendor/assets/components/jquery/src/outro.js +1 -0
  337. data/vendor/assets/components/jquery/src/queue.js +142 -0
  338. data/vendor/assets/components/jquery/src/queue/delay.js +22 -0
  339. data/vendor/assets/components/jquery/src/selector-native.js +171 -0
  340. data/vendor/assets/components/jquery/src/selector-sizzle.js +14 -0
  341. data/vendor/assets/components/jquery/src/selector.js +1 -0
  342. data/vendor/assets/components/jquery/src/serialize.js +111 -0
  343. data/vendor/assets/components/jquery/src/sizzle/dist/sizzle.js +2015 -0
  344. data/vendor/assets/components/jquery/src/sizzle/dist/sizzle.min.js +3 -0
  345. data/vendor/assets/components/jquery/src/sizzle/dist/sizzle.min.map +1 -0
  346. data/vendor/assets/components/jquery/src/traversing.js +200 -0
  347. data/vendor/assets/components/jquery/src/traversing/findFilter.js +100 -0
  348. data/vendor/assets/components/jquery/src/traversing/var/rneedsContext.js +6 -0
  349. data/vendor/assets/components/jquery/src/var/arr.js +3 -0
  350. data/vendor/assets/components/jquery/src/var/class2type.js +4 -0
  351. data/vendor/assets/components/jquery/src/var/concat.js +5 -0
  352. data/vendor/assets/components/jquery/src/var/hasOwn.js +5 -0
  353. data/vendor/assets/components/jquery/src/var/indexOf.js +5 -0
  354. data/vendor/assets/components/jquery/src/var/pnum.js +3 -0
  355. data/vendor/assets/components/jquery/src/var/push.js +5 -0
  356. data/vendor/assets/components/jquery/src/var/rnotwhite.js +3 -0
  357. data/vendor/assets/components/jquery/src/var/slice.js +5 -0
  358. data/vendor/assets/components/jquery/src/var/strundefined.js +3 -0
  359. data/vendor/assets/components/jquery/src/var/support.js +4 -0
  360. data/vendor/assets/components/jquery/src/var/toString.js +5 -0
  361. data/vendor/assets/components/jquery/src/var/trim.js +3 -0
  362. data/vendor/assets/components/jquery/src/wrap.js +78 -0
  363. data/vendor/assets/components/moment/.bower.json +30 -0
  364. data/vendor/assets/components/moment/LICENSE +22 -0
  365. data/vendor/assets/components/moment/bower.json +20 -0
  366. data/vendor/assets/components/moment/lang/ar-ma.js +56 -0
  367. data/vendor/assets/components/moment/lang/ar-sa.js +96 -0
  368. data/vendor/assets/components/moment/lang/ar.js +97 -0
  369. data/vendor/assets/components/moment/lang/az.js +102 -0
  370. data/vendor/assets/components/moment/lang/bg.js +86 -0
  371. data/vendor/assets/components/moment/lang/bn.js +106 -0
  372. data/vendor/assets/components/moment/lang/br.js +107 -0
  373. data/vendor/assets/components/moment/lang/bs.js +139 -0
  374. data/vendor/assets/components/moment/lang/ca.js +66 -0
  375. data/vendor/assets/components/moment/lang/cs.js +155 -0
  376. data/vendor/assets/components/moment/lang/cv.js +59 -0
  377. data/vendor/assets/components/moment/lang/cy.js +77 -0
  378. data/vendor/assets/components/moment/lang/da.js +56 -0
  379. data/vendor/assets/components/moment/lang/de-at.js +72 -0
  380. data/vendor/assets/components/moment/lang/de.js +71 -0
  381. data/vendor/assets/components/moment/lang/el.js +90 -0
  382. data/vendor/assets/components/moment/lang/en-au.js +62 -0
  383. data/vendor/assets/components/moment/lang/en-ca.js +59 -0
  384. data/vendor/assets/components/moment/lang/en-gb.js +63 -0
  385. data/vendor/assets/components/moment/lang/eo.js +65 -0
  386. data/vendor/assets/components/moment/lang/es.js +75 -0
  387. data/vendor/assets/components/moment/lang/et.js +76 -0
  388. data/vendor/assets/components/moment/lang/eu.js +60 -0
  389. data/vendor/assets/components/moment/lang/fa.js +97 -0
  390. data/vendor/assets/components/moment/lang/fi.js +103 -0
  391. data/vendor/assets/components/moment/lang/fo.js +56 -0
  392. data/vendor/assets/components/moment/lang/fr-ca.js +54 -0
  393. data/vendor/assets/components/moment/lang/fr.js +58 -0
  394. data/vendor/assets/components/moment/lang/gl.js +71 -0
  395. data/vendor/assets/components/moment/lang/he.js +77 -0
  396. data/vendor/assets/components/moment/lang/hi.js +105 -0
  397. data/vendor/assets/components/moment/lang/hr.js +140 -0
  398. data/vendor/assets/components/moment/lang/hu.js +105 -0
  399. data/vendor/assets/components/moment/lang/hy-am.js +113 -0
  400. data/vendor/assets/components/moment/lang/id.js +67 -0
  401. data/vendor/assets/components/moment/lang/is.js +124 -0
  402. data/vendor/assets/components/moment/lang/it.js +59 -0
  403. data/vendor/assets/components/moment/lang/ja.js +58 -0
  404. data/vendor/assets/components/moment/lang/ka.js +108 -0
  405. data/vendor/assets/components/moment/lang/km.js +55 -0
  406. data/vendor/assets/components/moment/lang/ko.js +63 -0
  407. data/vendor/assets/components/moment/lang/lb.js +160 -0
  408. data/vendor/assets/components/moment/lang/lt.js +118 -0
  409. data/vendor/assets/components/moment/lang/lv.js +77 -0
  410. data/vendor/assets/components/moment/lang/mk.js +86 -0
  411. data/vendor/assets/components/moment/lang/ml.js +64 -0
  412. data/vendor/assets/components/moment/lang/mr.js +104 -0
  413. data/vendor/assets/components/moment/lang/ms-my.js +66 -0
  414. data/vendor/assets/components/moment/lang/nb.js +57 -0
  415. data/vendor/assets/components/moment/lang/ne.js +105 -0
  416. data/vendor/assets/components/moment/lang/nl.js +67 -0
  417. data/vendor/assets/components/moment/lang/nn.js +56 -0
  418. data/vendor/assets/components/moment/lang/pl.js +98 -0
  419. data/vendor/assets/components/moment/lang/pt-br.js +56 -0
  420. data/vendor/assets/components/moment/lang/pt.js +60 -0
  421. data/vendor/assets/components/moment/lang/ro.js +72 -0
  422. data/vendor/assets/components/moment/lang/ru.js +166 -0
  423. data/vendor/assets/components/moment/lang/sk.js +156 -0
  424. data/vendor/assets/components/moment/lang/sl.js +144 -0
  425. data/vendor/assets/components/moment/lang/sq.js +61 -0
  426. data/vendor/assets/components/moment/lang/sr-cyrl.js +106 -0
  427. data/vendor/assets/components/moment/lang/sr.js +106 -0
  428. data/vendor/assets/components/moment/lang/sv.js +63 -0
  429. data/vendor/assets/components/moment/lang/ta.js +112 -0
  430. data/vendor/assets/components/moment/lang/th.js +58 -0
  431. data/vendor/assets/components/moment/lang/tl-ph.js +58 -0
  432. data/vendor/assets/components/moment/lang/tr.js +93 -0
  433. data/vendor/assets/components/moment/lang/tzm-latn.js +55 -0
  434. data/vendor/assets/components/moment/lang/tzm.js +55 -0
  435. data/vendor/assets/components/moment/lang/uk.js +157 -0
  436. data/vendor/assets/components/moment/lang/uz.js +55 -0
  437. data/vendor/assets/components/moment/lang/vi.js +62 -0
  438. data/vendor/assets/components/moment/lang/zh-cn.js +108 -0
  439. data/vendor/assets/components/moment/lang/zh-tw.js +84 -0
  440. data/vendor/assets/components/moment/min/langs.js +6426 -0
  441. data/vendor/assets/components/moment/min/langs.min.js +4 -0
  442. data/vendor/assets/components/moment/min/moment-with-langs.js +8521 -0
  443. data/vendor/assets/components/moment/min/moment-with-langs.min.js +9 -0
  444. data/vendor/assets/components/moment/min/moment.min.js +6 -0
  445. data/vendor/assets/components/moment/moment.js +2610 -0
  446. data/vendor/assets/components/moment/readme.md +388 -0
  447. data/vendor/assets/components/numeral/.bower.json +28 -0
  448. data/vendor/assets/components/numeral/.gitignore +29 -0
  449. data/vendor/assets/components/numeral/.travis.yml +7 -0
  450. data/vendor/assets/components/numeral/Gruntfile.js +91 -0
  451. data/vendor/assets/components/numeral/LICENSE +22 -0
  452. data/vendor/assets/components/numeral/README.md +213 -0
  453. data/vendor/assets/components/numeral/bower.json +16 -0
  454. data/vendor/assets/components/numeral/component.json +16 -0
  455. data/vendor/assets/components/numeral/languages.js +989 -0
  456. data/vendor/assets/components/numeral/languages/be-nl.js +35 -0
  457. data/vendor/assets/components/numeral/languages/chs.js +34 -0
  458. data/vendor/assets/components/numeral/languages/cs.js +34 -0
  459. data/vendor/assets/components/numeral/languages/da-dk.js +34 -0
  460. data/vendor/assets/components/numeral/languages/de-ch.js +34 -0
  461. data/vendor/assets/components/numeral/languages/de.js +34 -0
  462. data/vendor/assets/components/numeral/languages/en-gb.js +38 -0
  463. data/vendor/assets/components/numeral/languages/es-ES.js +39 -0
  464. data/vendor/assets/components/numeral/languages/es.js +39 -0
  465. data/vendor/assets/components/numeral/languages/et.js +37 -0
  466. data/vendor/assets/components/numeral/languages/fi.js +34 -0
  467. data/vendor/assets/components/numeral/languages/fr-CA.js +34 -0
  468. data/vendor/assets/components/numeral/languages/fr-ch.js +34 -0
  469. data/vendor/assets/components/numeral/languages/fr.js +34 -0
  470. data/vendor/assets/components/numeral/languages/hu.js +34 -0
  471. data/vendor/assets/components/numeral/languages/it.js +34 -0
  472. data/vendor/assets/components/numeral/languages/ja.js +34 -0
  473. data/vendor/assets/components/numeral/languages/nl-nl.js +35 -0
  474. data/vendor/assets/components/numeral/languages/pl.js +34 -0
  475. data/vendor/assets/components/numeral/languages/pt-br.js +34 -0
  476. data/vendor/assets/components/numeral/languages/pt-pt.js +34 -0
  477. data/vendor/assets/components/numeral/languages/ru-UA.js +35 -0
  478. data/vendor/assets/components/numeral/languages/ru.js +37 -0
  479. data/vendor/assets/components/numeral/languages/sk.js +34 -0
  480. data/vendor/assets/components/numeral/languages/th.js +34 -0
  481. data/vendor/assets/components/numeral/languages/tr.js +67 -0
  482. data/vendor/assets/components/numeral/languages/uk-UA.js +35 -0
  483. data/vendor/assets/components/numeral/min/languages.min.js +129 -0
  484. data/vendor/assets/components/numeral/min/languages/be-nl.min.js +6 -0
  485. data/vendor/assets/components/numeral/min/languages/chs.min.js +6 -0
  486. data/vendor/assets/components/numeral/min/languages/cs.min.js +6 -0
  487. data/vendor/assets/components/numeral/min/languages/da-dk.min.js +6 -0
  488. data/vendor/assets/components/numeral/min/languages/de-ch.min.js +6 -0
  489. data/vendor/assets/components/numeral/min/languages/de.min.js +6 -0
  490. data/vendor/assets/components/numeral/min/languages/en-gb.min.js +6 -0
  491. data/vendor/assets/components/numeral/min/languages/es-ES.min.js +6 -0
  492. data/vendor/assets/components/numeral/min/languages/es.min.js +6 -0
  493. data/vendor/assets/components/numeral/min/languages/et.min.js +9 -0
  494. data/vendor/assets/components/numeral/min/languages/fi.min.js +6 -0
  495. data/vendor/assets/components/numeral/min/languages/fr-CA.min.js +6 -0
  496. data/vendor/assets/components/numeral/min/languages/fr-ch.min.js +6 -0
  497. data/vendor/assets/components/numeral/min/languages/fr.min.js +6 -0
  498. data/vendor/assets/components/numeral/min/languages/hu.min.js +6 -0
  499. data/vendor/assets/components/numeral/min/languages/it.min.js +6 -0
  500. data/vendor/assets/components/numeral/min/languages/ja.min.js +6 -0
  501. data/vendor/assets/components/numeral/min/languages/nl-nl.min.js +6 -0
  502. data/vendor/assets/components/numeral/min/languages/pl.min.js +6 -0
  503. data/vendor/assets/components/numeral/min/languages/pt-br.min.js +6 -0
  504. data/vendor/assets/components/numeral/min/languages/pt-pt.min.js +6 -0
  505. data/vendor/assets/components/numeral/min/languages/ru-UA.min.js +1 -0
  506. data/vendor/assets/components/numeral/min/languages/ru.min.js +6 -0
  507. data/vendor/assets/components/numeral/min/languages/sk.min.js +6 -0
  508. data/vendor/assets/components/numeral/min/languages/th.min.js +6 -0
  509. data/vendor/assets/components/numeral/min/languages/tr.min.js +6 -0
  510. data/vendor/assets/components/numeral/min/languages/uk-UA.min.js +1 -0
  511. data/vendor/assets/components/numeral/min/numeral.min.js +8 -0
  512. data/vendor/assets/components/numeral/numeral.js +679 -0
  513. data/vendor/assets/components/numeral/package.json +50 -0
  514. data/vendor/assets/components/numeral/tests/languages/be-nl.js +107 -0
  515. data/vendor/assets/components/numeral/tests/languages/chs.js +101 -0
  516. data/vendor/assets/components/numeral/tests/languages/cs.js +102 -0
  517. data/vendor/assets/components/numeral/tests/languages/da-dk.js +101 -0
  518. data/vendor/assets/components/numeral/tests/languages/de-ch.js +101 -0
  519. data/vendor/assets/components/numeral/tests/languages/de.js +101 -0
  520. data/vendor/assets/components/numeral/tests/languages/en-gb.js +101 -0
  521. data/vendor/assets/components/numeral/tests/languages/en.js +98 -0
  522. data/vendor/assets/components/numeral/tests/languages/es-ES.js +101 -0
  523. data/vendor/assets/components/numeral/tests/languages/es.js +101 -0
  524. data/vendor/assets/components/numeral/tests/languages/et.js +101 -0
  525. data/vendor/assets/components/numeral/tests/languages/fi.js +101 -0
  526. data/vendor/assets/components/numeral/tests/languages/fr-CA.js +101 -0
  527. data/vendor/assets/components/numeral/tests/languages/fr-ch.js +101 -0
  528. data/vendor/assets/components/numeral/tests/languages/fr.js +101 -0
  529. data/vendor/assets/components/numeral/tests/languages/hu.js +101 -0
  530. data/vendor/assets/components/numeral/tests/languages/it.js +101 -0
  531. data/vendor/assets/components/numeral/tests/languages/ja.js +101 -0
  532. data/vendor/assets/components/numeral/tests/languages/nl-nl.js +109 -0
  533. data/vendor/assets/components/numeral/tests/languages/pl.js +102 -0
  534. data/vendor/assets/components/numeral/tests/languages/pt-br.js +101 -0
  535. data/vendor/assets/components/numeral/tests/languages/pt-pt.js +101 -0
  536. data/vendor/assets/components/numeral/tests/languages/ru-UA.js +102 -0
  537. data/vendor/assets/components/numeral/tests/languages/ru.js +102 -0
  538. data/vendor/assets/components/numeral/tests/languages/sk.js +101 -0
  539. data/vendor/assets/components/numeral/tests/languages/th.js +101 -0
  540. data/vendor/assets/components/numeral/tests/languages/tr.js +101 -0
  541. data/vendor/assets/components/numeral/tests/languages/uk-UA.js +102 -0
  542. data/vendor/assets/components/numeral/tests/numeral/format.js +204 -0
  543. data/vendor/assets/components/numeral/tests/numeral/manipulate.js +104 -0
  544. data/vendor/assets/components/numeral/tests/numeral/misc.js +123 -0
  545. data/vendor/assets/components/numeral/tests/numeral/unformat.js +96 -0
  546. data/vendor/assets/components/qunit-bdd/.bower.json +31 -0
  547. data/vendor/assets/components/qunit-bdd/LICENSE +13 -0
  548. data/vendor/assets/components/qunit-bdd/README.md +282 -0
  549. data/vendor/assets/components/qunit-bdd/bower.json +22 -0
  550. data/vendor/assets/components/qunit-bdd/karma.conf.js +70 -0
  551. data/vendor/assets/components/qunit-bdd/lib/qunit-bdd.js +755 -0
  552. data/vendor/assets/components/qunit-bdd/package.json +33 -0
  553. data/vendor/assets/javascripts/bs-breadcrumbs.js +85 -0
  554. data/vendor/assets/javascripts/bs-core.js +476 -0
  555. data/vendor/assets/javascripts/bs-notifications.js +111 -0
  556. data/vendor/assets/javascripts/daterangepicker.js +1030 -0
  557. data/vendor/assets/javascripts/fix_bind_phantomjs.js +37 -0
  558. data/vendor/assets/javascripts/jquery-deparam.js +97 -0
  559. data/vendor/assets/javascripts/sidebar-tree.js +68 -0
  560. data/vendor/assets/stylesheets/daterangepicker.css +271 -0
  561. metadata +766 -0
@@ -0,0 +1,4 @@
1
+ describe 'Channel', ->
2
+ it 'is a DS.Model', ->
3
+ ok(Dashboard.Channel)
4
+ ok(DS.Model.detect(Dashboard.Channel))
@@ -0,0 +1,4 @@
1
+ describe 'Contribution', ->
2
+ it 'is a DS.Model', ->
3
+ ok(Dashboard.Contribution)
4
+ ok(DS.Model.detect(Dashboard.Contribution))
@@ -0,0 +1,5 @@
1
+ describe 'PressAsset', ->
2
+ it 'is a DS.Model', ->
3
+ ok(Dashboard.PressAsset)
4
+ ok(DS.Model.detect(Dashboard.PressAsset))
5
+
@@ -0,0 +1,4 @@
1
+ describe 'Project', ->
2
+ it 'is a DS.Model', ->
3
+ ok(Dashboard.Project)
4
+ ok(DS.Model.detect(Dashboard.Project))
@@ -0,0 +1,4 @@
1
+ describe 'Reward', ->
2
+ it 'is a DS.Model', ->
3
+ ok(Dashboard.Reward)
4
+ ok(DS.Model.detect(Dashboard.Reward))
@@ -0,0 +1,4 @@
1
+ describe 'Tag', ->
2
+ it 'is a DS.Model', ->
3
+ ok(Dashboard.Tag)
4
+ ok(DS.Model.detect(Dashboard.Tag))
@@ -0,0 +1,4 @@
1
+ describe 'User', ->
2
+ it 'is a DS.Model', ->
3
+ ok(Dashboard.User)
4
+ ok(DS.Model.detect(Dashboard.User))
@@ -0,0 +1,56 @@
1
+ # Teaspoon includes some support files, but you can use anything from your own support path too.
2
+ #= require support/sinon
3
+ #= require qunit-bdd/lib/qunit-bdd.js
4
+ # require support/your-support-file
5
+ #
6
+ # PhantomJS (Teaspoons default driver) doesn't have support for Function.prototype.bind, which has caused confusion.
7
+ # Use this polyfill to avoid the confusion.
8
+ #= require support/bind-poly
9
+ #
10
+ # Deferring execution
11
+ # If you're using CommonJS, RequireJS or some other asynchronous library you can defer execution. Call
12
+ # Teaspoon.execute() after everything has been loaded. Simple example of a timeout:
13
+ #
14
+ # Teaspoon.defer = true
15
+ # setTimeout(Teaspoon.execute, 1000)
16
+ #
17
+ # Matching files
18
+ # By default Teaspoon will look for files that match _test.{js,js.coffee,.coffee}. Add a filename_test.js file in your
19
+ # test path and it'll be included in the default suite automatically. If you want to customize suites, check out the
20
+ # configuration in config/initializers/teaspoon.rb
21
+ #
22
+ # Manifest
23
+ # If you'd rather require your test files manually (to control order for instance) you can disable the suite matcher in
24
+ # the configuration and use this file as a manifest.
25
+ #
26
+ # For more information: http://github.com/modeset/teaspoon
27
+ #
28
+ # You can require your own javascript files here. By default this will include everything in application, however you
29
+ # may get better load performance if you require the specific files that are being used in the test that tests them.
30
+ #= require dune-dashboard-libs
31
+ #= require ember-simple-auth/simple-auth-testing.js
32
+ #= require dune-dashboard-application
33
+ #= require dune-dashboard-templates
34
+ #= require_tree ./support/
35
+ #= require_tree ./helpers/
36
+ #= require_tree ./fixtures
37
+
38
+ # Prevent the router from manipulating the browser's URL.
39
+ Dashboard.Router.reopen location: 'none'
40
+
41
+ document.write('<div id="ember-testing-container"><div id="ember-testing"></div></div>')
42
+
43
+ Dashboard.rootElement = '#ember-testing'
44
+ Dashboard.setupForTesting()
45
+ Dashboard.injectTestHelpers()
46
+
47
+ window.stubAjax = (type, url, status, json) ->
48
+ return $.mockjax
49
+ type: type
50
+ url: url
51
+ status: status
52
+ dataType: "json"
53
+ responseText: json
54
+
55
+ $.mockjaxSettings.logging = false
56
+ $.mockjaxSettings.responseTime = 0
@@ -0,0 +1,598 @@
1
+ /*!
2
+ * MockJax - jQuery Plugin to Mock Ajax requests
3
+ *
4
+ * Version: 1.5.3
5
+ * Released:
6
+ * Home: http://github.com/appendto/jquery-mockjax
7
+ * Author: Jonathan Sharp (http://jdsharp.com)
8
+ * License: MIT,GPL
9
+ *
10
+ * Copyright (c) 2011 appendTo LLC.
11
+ * Dual licensed under the MIT or GPL licenses.
12
+ * http://appendto.com/open-source-licenses
13
+ */
14
+ (function($) {
15
+ var _ajax = $.ajax,
16
+ mockHandlers = [],
17
+ mockedAjaxCalls = [],
18
+ CALLBACK_REGEX = /=\?(&|$)/,
19
+ jsc = (new Date()).getTime();
20
+
21
+
22
+ // Parse the given XML string.
23
+ function parseXML(xml) {
24
+ if ( window.DOMParser == undefined && window.ActiveXObject ) {
25
+ DOMParser = function() { };
26
+ DOMParser.prototype.parseFromString = function( xmlString ) {
27
+ var doc = new ActiveXObject('Microsoft.XMLDOM');
28
+ doc.async = 'false';
29
+ doc.loadXML( xmlString );
30
+ return doc;
31
+ };
32
+ }
33
+
34
+ try {
35
+ var xmlDoc = ( new DOMParser() ).parseFromString( xml, 'text/xml' );
36
+ if ( $.isXMLDoc( xmlDoc ) ) {
37
+ var err = $('parsererror', xmlDoc);
38
+ if ( err.length == 1 ) {
39
+ throw('Error: ' + $(xmlDoc).text() );
40
+ }
41
+ } else {
42
+ throw('Unable to parse XML');
43
+ }
44
+ return xmlDoc;
45
+ } catch( e ) {
46
+ var msg = ( e.name == undefined ? e : e.name + ': ' + e.message );
47
+ $(document).trigger('xmlParseError', [ msg ]);
48
+ return undefined;
49
+ }
50
+ }
51
+
52
+ // Trigger a jQuery event
53
+ function trigger(s, type, args) {
54
+ (s.context ? $(s.context) : $.event).trigger(type, args);
55
+ }
56
+
57
+ // Check if the data field on the mock handler and the request match. This
58
+ // can be used to restrict a mock handler to being used only when a certain
59
+ // set of data is passed to it.
60
+ function isMockDataEqual( mock, live ) {
61
+ var identical = true;
62
+ // Test for situations where the data is a querystring (not an object)
63
+ if (typeof live === 'string') {
64
+ // Querystring may be a regex
65
+ return $.isFunction( mock.test ) ? mock.test(live) : mock == live;
66
+ }
67
+ $.each(mock, function(k) {
68
+ if ( live[k] === undefined ) {
69
+ identical = false;
70
+ return identical;
71
+ } else {
72
+ // This will allow to compare Arrays
73
+ if ( typeof live[k] === 'object' && live[k] !== null ) {
74
+ identical = identical && isMockDataEqual(mock[k], live[k]);
75
+ } else {
76
+ if ( mock[k] && $.isFunction( mock[k].test ) ) {
77
+ identical = identical && mock[k].test(live[k]);
78
+ } else {
79
+ identical = identical && ( mock[k] == live[k] );
80
+ }
81
+ }
82
+ }
83
+ });
84
+
85
+ return identical;
86
+ }
87
+
88
+ // See if a mock handler property matches the default settings
89
+ function isDefaultSetting(handler, property) {
90
+ return handler[property] === $.mockjaxSettings[property];
91
+ }
92
+
93
+ // Check the given handler should mock the given request
94
+ function getMockForRequest( handler, requestSettings ) {
95
+ // If the mock was registered with a function, let the function decide if we
96
+ // want to mock this request
97
+ if ( $.isFunction(handler) ) {
98
+ return handler( requestSettings );
99
+ }
100
+
101
+ // Inspect the URL of the request and check if the mock handler's url
102
+ // matches the url for this ajax request
103
+ if ( $.isFunction(handler.url.test) ) {
104
+ // The user provided a regex for the url, test it
105
+ if ( !handler.url.test( requestSettings.url ) ) {
106
+ return null;
107
+ }
108
+ } else {
109
+ // Look for a simple wildcard '*' or a direct URL match
110
+ var star = handler.url.indexOf('*');
111
+ if (handler.url !== requestSettings.url && star === -1 ||
112
+ !new RegExp(handler.url.replace(/[-[\]{}()+?.,\\^$|#\s]/g, "\\$&").replace(/\*/g, '.+')).test(requestSettings.url)) {
113
+ return null;
114
+ }
115
+ }
116
+
117
+ // Inspect the data submitted in the request (either POST body or GET query string)
118
+ if ( handler.data && requestSettings.data ) {
119
+ if ( !isMockDataEqual(handler.data, requestSettings.data) ) {
120
+ // They're not identical, do not mock this request
121
+ return null;
122
+ }
123
+ }
124
+ // Inspect the request type
125
+ if ( handler && handler.type &&
126
+ handler.type.toLowerCase() != requestSettings.type.toLowerCase() ) {
127
+ // The request type doesn't match (GET vs. POST)
128
+ return null;
129
+ }
130
+
131
+ return handler;
132
+ }
133
+
134
+ // Process the xhr objects send operation
135
+ function _xhrSend(mockHandler, requestSettings, origSettings) {
136
+
137
+ // This is a substitute for < 1.4 which lacks $.proxy
138
+ var process = (function(that) {
139
+ return function() {
140
+ return (function() {
141
+ var onReady;
142
+
143
+ // The request has returned
144
+ this.status = mockHandler.status;
145
+ this.statusText = mockHandler.statusText;
146
+ this.readyState = 4;
147
+
148
+ // We have an executable function, call it to give
149
+ // the mock handler a chance to update it's data
150
+ if ( $.isFunction(mockHandler.response) ) {
151
+ mockHandler.response(origSettings);
152
+ }
153
+ // Copy over our mock to our xhr object before passing control back to
154
+ // jQuery's onreadystatechange callback
155
+ if ( requestSettings.dataType == 'json' && ( typeof mockHandler.responseText == 'object' ) ) {
156
+ this.responseText = JSON.stringify(mockHandler.responseText);
157
+ } else if ( requestSettings.dataType == 'xml' ) {
158
+ if ( typeof mockHandler.responseXML == 'string' ) {
159
+ this.responseXML = parseXML(mockHandler.responseXML);
160
+ //in jQuery 1.9.1+, responseXML is processed differently and relies on responseText
161
+ this.responseText = mockHandler.responseXML;
162
+ } else {
163
+ this.responseXML = mockHandler.responseXML;
164
+ }
165
+ } else {
166
+ this.responseText = mockHandler.responseText;
167
+ }
168
+ if( typeof mockHandler.status == 'number' || typeof mockHandler.status == 'string' ) {
169
+ this.status = mockHandler.status;
170
+ }
171
+ if( typeof mockHandler.statusText === "string") {
172
+ this.statusText = mockHandler.statusText;
173
+ }
174
+ // jQuery 2.0 renamed onreadystatechange to onload
175
+ onReady = this.onreadystatechange || this.onload;
176
+
177
+ // jQuery < 1.4 doesn't have onreadystate change for xhr
178
+ if ( $.isFunction( onReady ) ) {
179
+ if( mockHandler.isTimeout) {
180
+ this.status = -1;
181
+ }
182
+ onReady.call( this, mockHandler.isTimeout ? 'timeout' : undefined );
183
+ } else if ( mockHandler.isTimeout ) {
184
+ // Fix for 1.3.2 timeout to keep success from firing.
185
+ this.status = -1;
186
+ }
187
+ }).apply(that);
188
+ };
189
+ })(this);
190
+
191
+ if ( mockHandler.proxy ) {
192
+ // We're proxying this request and loading in an external file instead
193
+ _ajax({
194
+ global: false,
195
+ url: mockHandler.proxy,
196
+ type: mockHandler.proxyType,
197
+ data: mockHandler.data,
198
+ dataType: requestSettings.dataType === "script" ? "text/plain" : requestSettings.dataType,
199
+ complete: function(xhr) {
200
+ mockHandler.responseXML = xhr.responseXML;
201
+ mockHandler.responseText = xhr.responseText;
202
+ // Don't override the handler status/statusText if it's specified by the config
203
+ if (isDefaultSetting(mockHandler, 'status')) {
204
+ mockHandler.status = xhr.status;
205
+ }
206
+ if (isDefaultSetting(mockHandler, 'statusText')) {
207
+ mockHandler.statusText = xhr.statusText;
208
+ }
209
+
210
+ this.responseTimer = setTimeout(process, mockHandler.responseTime || 0);
211
+ }
212
+ });
213
+ } else {
214
+ // type == 'POST' || 'GET' || 'DELETE'
215
+ if ( requestSettings.async === false ) {
216
+ // TODO: Blocking delay
217
+ process();
218
+ } else {
219
+ this.responseTimer = setTimeout(process, mockHandler.responseTime || 50);
220
+ }
221
+ }
222
+ }
223
+
224
+ // Construct a mocked XHR Object
225
+ function xhr(mockHandler, requestSettings, origSettings, origHandler) {
226
+ // Extend with our default mockjax settings
227
+ mockHandler = $.extend(true, {}, $.mockjaxSettings, mockHandler);
228
+
229
+ if (typeof mockHandler.headers === 'undefined') {
230
+ mockHandler.headers = {};
231
+ }
232
+ if ( mockHandler.contentType ) {
233
+ mockHandler.headers['content-type'] = mockHandler.contentType;
234
+ }
235
+
236
+ return {
237
+ status: mockHandler.status,
238
+ statusText: mockHandler.statusText,
239
+ readyState: 1,
240
+ open: function() { },
241
+ send: function() {
242
+ origHandler.fired = true;
243
+ _xhrSend.call(this, mockHandler, requestSettings, origSettings);
244
+ },
245
+ abort: function() {
246
+ clearTimeout(this.responseTimer);
247
+ },
248
+ setRequestHeader: function(header, value) {
249
+ mockHandler.headers[header] = value;
250
+ },
251
+ getResponseHeader: function(header) {
252
+ // 'Last-modified', 'Etag', 'content-type' are all checked by jQuery
253
+ if ( mockHandler.headers && mockHandler.headers[header] ) {
254
+ // Return arbitrary headers
255
+ return mockHandler.headers[header];
256
+ } else if ( header.toLowerCase() == 'last-modified' ) {
257
+ return mockHandler.lastModified || (new Date()).toString();
258
+ } else if ( header.toLowerCase() == 'etag' ) {
259
+ return mockHandler.etag || '';
260
+ } else if ( header.toLowerCase() == 'content-type' ) {
261
+ return mockHandler.contentType || 'text/plain';
262
+ }
263
+ },
264
+ getAllResponseHeaders: function() {
265
+ var headers = '';
266
+ $.each(mockHandler.headers, function(k, v) {
267
+ headers += k + ': ' + v + "\n";
268
+ });
269
+ return headers;
270
+ }
271
+ };
272
+ }
273
+
274
+ // Process a JSONP mock request.
275
+ function processJsonpMock( requestSettings, mockHandler, origSettings ) {
276
+ // Handle JSONP Parameter Callbacks, we need to replicate some of the jQuery core here
277
+ // because there isn't an easy hook for the cross domain script tag of jsonp
278
+
279
+ processJsonpUrl( requestSettings );
280
+
281
+ requestSettings.dataType = "json";
282
+ if(requestSettings.data && CALLBACK_REGEX.test(requestSettings.data) || CALLBACK_REGEX.test(requestSettings.url)) {
283
+ createJsonpCallback(requestSettings, mockHandler, origSettings);
284
+
285
+ // We need to make sure
286
+ // that a JSONP style response is executed properly
287
+
288
+ var rurl = /^(\w+:)?\/\/([^\/?#]+)/,
289
+ parts = rurl.exec( requestSettings.url ),
290
+ remote = parts && (parts[1] && parts[1] !== location.protocol || parts[2] !== location.host);
291
+
292
+ requestSettings.dataType = "script";
293
+ if(requestSettings.type.toUpperCase() === "GET" && remote ) {
294
+ var newMockReturn = processJsonpRequest( requestSettings, mockHandler, origSettings );
295
+
296
+ // Check if we are supposed to return a Deferred back to the mock call, or just
297
+ // signal success
298
+ if(newMockReturn) {
299
+ return newMockReturn;
300
+ } else {
301
+ return true;
302
+ }
303
+ }
304
+ }
305
+ return null;
306
+ }
307
+
308
+ // Append the required callback parameter to the end of the request URL, for a JSONP request
309
+ function processJsonpUrl( requestSettings ) {
310
+ if ( requestSettings.type.toUpperCase() === "GET" ) {
311
+ if ( !CALLBACK_REGEX.test( requestSettings.url ) ) {
312
+ requestSettings.url += (/\?/.test( requestSettings.url ) ? "&" : "?") +
313
+ (requestSettings.jsonp || "callback") + "=?";
314
+ }
315
+ } else if ( !requestSettings.data || !CALLBACK_REGEX.test(requestSettings.data) ) {
316
+ requestSettings.data = (requestSettings.data ? requestSettings.data + "&" : "") + (requestSettings.jsonp || "callback") + "=?";
317
+ }
318
+ }
319
+
320
+ // Process a JSONP request by evaluating the mocked response text
321
+ function processJsonpRequest( requestSettings, mockHandler, origSettings ) {
322
+ // Synthesize the mock request for adding a script tag
323
+ var callbackContext = origSettings && origSettings.context || requestSettings,
324
+ newMock = null;
325
+
326
+
327
+ // If the response handler on the moock is a function, call it
328
+ if ( mockHandler.response && $.isFunction(mockHandler.response) ) {
329
+ mockHandler.response(origSettings);
330
+ } else {
331
+
332
+ // Evaluate the responseText javascript in a global context
333
+ if( typeof mockHandler.responseText === 'object' ) {
334
+ $.globalEval( '(' + JSON.stringify( mockHandler.responseText ) + ')');
335
+ } else {
336
+ $.globalEval( '(' + mockHandler.responseText + ')');
337
+ }
338
+ }
339
+
340
+ // Successful response
341
+ jsonpSuccess( requestSettings, callbackContext, mockHandler );
342
+ jsonpComplete( requestSettings, callbackContext, mockHandler );
343
+
344
+ // If we are running under jQuery 1.5+, return a deferred object
345
+ if($.Deferred){
346
+ newMock = new $.Deferred();
347
+ if(typeof mockHandler.responseText == "object"){
348
+ newMock.resolveWith( callbackContext, [mockHandler.responseText] );
349
+ }
350
+ else{
351
+ newMock.resolveWith( callbackContext, [$.parseJSON( mockHandler.responseText )] );
352
+ }
353
+ }
354
+ return newMock;
355
+ }
356
+
357
+
358
+ // Create the required JSONP callback function for the request
359
+ function createJsonpCallback( requestSettings, mockHandler, origSettings ) {
360
+ var callbackContext = origSettings && origSettings.context || requestSettings;
361
+ var jsonp = requestSettings.jsonpCallback || ("jsonp" + jsc++);
362
+
363
+ // Replace the =? sequence both in the query string and the data
364
+ if ( requestSettings.data ) {
365
+ requestSettings.data = (requestSettings.data + "").replace(CALLBACK_REGEX, "=" + jsonp + "$1");
366
+ }
367
+
368
+ requestSettings.url = requestSettings.url.replace(CALLBACK_REGEX, "=" + jsonp + "$1");
369
+
370
+
371
+ // Handle JSONP-style loading
372
+ window[ jsonp ] = window[ jsonp ] || function( tmp ) {
373
+ data = tmp;
374
+ jsonpSuccess( requestSettings, callbackContext, mockHandler );
375
+ jsonpComplete( requestSettings, callbackContext, mockHandler );
376
+ // Garbage collect
377
+ window[ jsonp ] = undefined;
378
+
379
+ try {
380
+ delete window[ jsonp ];
381
+ } catch(e) {}
382
+
383
+ if ( head ) {
384
+ head.removeChild( script );
385
+ }
386
+ };
387
+ }
388
+
389
+ // The JSONP request was successful
390
+ function jsonpSuccess(requestSettings, callbackContext, mockHandler) {
391
+ // If a local callback was specified, fire it and pass it the data
392
+ if ( requestSettings.success ) {
393
+ requestSettings.success.call( callbackContext, mockHandler.responseText || "", status, {} );
394
+ }
395
+
396
+ // Fire the global callback
397
+ if ( requestSettings.global ) {
398
+ trigger(requestSettings, "ajaxSuccess", [{}, requestSettings] );
399
+ }
400
+ }
401
+
402
+ // The JSONP request was completed
403
+ function jsonpComplete(requestSettings, callbackContext) {
404
+ // Process result
405
+ if ( requestSettings.complete ) {
406
+ requestSettings.complete.call( callbackContext, {} , status );
407
+ }
408
+
409
+ // The request was completed
410
+ if ( requestSettings.global ) {
411
+ trigger( "ajaxComplete", [{}, requestSettings] );
412
+ }
413
+
414
+ // Handle the global AJAX counter
415
+ if ( requestSettings.global && ! --$.active ) {
416
+ $.event.trigger( "ajaxStop" );
417
+ }
418
+ }
419
+
420
+
421
+ // The core $.ajax replacement.
422
+ function handleAjax( url, origSettings ) {
423
+ var mockRequest, requestSettings, mockHandler;
424
+
425
+ // If url is an object, simulate pre-1.5 signature
426
+ if ( typeof url === "object" ) {
427
+ origSettings = url;
428
+ url = undefined;
429
+ } else {
430
+ // work around to support 1.5 signature
431
+ origSettings.url = url;
432
+ }
433
+
434
+ // Extend the original settings for the request
435
+ requestSettings = $.extend(true, {}, $.ajaxSettings, origSettings);
436
+
437
+ // Iterate over our mock handlers (in registration order) until we find
438
+ // one that is willing to intercept the request
439
+ for(var k = 0; k < mockHandlers.length; k++) {
440
+ if ( !mockHandlers[k] ) {
441
+ continue;
442
+ }
443
+
444
+ mockHandler = getMockForRequest( mockHandlers[k], requestSettings );
445
+ if(!mockHandler) {
446
+ // No valid mock found for this request
447
+ continue;
448
+ }
449
+
450
+ mockedAjaxCalls.push(requestSettings);
451
+
452
+ // If logging is enabled, log the mock to the console
453
+ $.mockjaxSettings.log( mockHandler, requestSettings );
454
+
455
+
456
+ if ( requestSettings.dataType === "jsonp" ) {
457
+ if ((mockRequest = processJsonpMock( requestSettings, mockHandler, origSettings ))) {
458
+ // This mock will handle the JSONP request
459
+ return mockRequest;
460
+ }
461
+ }
462
+
463
+
464
+ // Removed to fix #54 - keep the mocking data object intact
465
+ //mockHandler.data = requestSettings.data;
466
+
467
+ mockHandler.cache = requestSettings.cache;
468
+ mockHandler.timeout = requestSettings.timeout;
469
+ mockHandler.global = requestSettings.global;
470
+
471
+ copyUrlParameters(mockHandler, origSettings);
472
+
473
+ (function(mockHandler, requestSettings, origSettings, origHandler) {
474
+ mockRequest = _ajax.call($, $.extend(true, {}, origSettings, {
475
+ // Mock the XHR object
476
+ xhr: function() { return xhr( mockHandler, requestSettings, origSettings, origHandler ); }
477
+ }));
478
+ })(mockHandler, requestSettings, origSettings, mockHandlers[k]);
479
+
480
+ return mockRequest;
481
+ }
482
+
483
+ // We don't have a mock request
484
+ if($.mockjaxSettings.throwUnmocked === true) {
485
+ throw('AJAX not mocked: ' + origSettings.url);
486
+ }
487
+ else { // trigger a normal request
488
+ return _ajax.apply($, [origSettings]);
489
+ }
490
+ }
491
+
492
+ /**
493
+ * Copies URL parameter values if they were captured by a regular expression
494
+ * @param {Object} mockHandler
495
+ * @param {Object} origSettings
496
+ */
497
+ function copyUrlParameters(mockHandler, origSettings) {
498
+ //parameters aren't captured if the URL isn't a RegExp
499
+ if (!(mockHandler.url instanceof RegExp)) {
500
+ return;
501
+ }
502
+ //if no URL params were defined on the handler, don't attempt a capture
503
+ if (!mockHandler.hasOwnProperty('urlParams')) {
504
+ return;
505
+ }
506
+ var captures = mockHandler.url.exec(origSettings.url);
507
+ //the whole RegExp match is always the first value in the capture results
508
+ if (captures.length === 1) {
509
+ return;
510
+ }
511
+ captures.shift();
512
+ //use handler params as keys and capture resuts as values
513
+ var i = 0,
514
+ capturesLength = captures.length,
515
+ paramsLength = mockHandler.urlParams.length,
516
+ //in case the number of params specified is less than actual captures
517
+ maxIterations = Math.min(capturesLength, paramsLength),
518
+ paramValues = {};
519
+ for (i; i < maxIterations; i++) {
520
+ var key = mockHandler.urlParams[i];
521
+ paramValues[key] = captures[i];
522
+ }
523
+ origSettings.urlParams = paramValues;
524
+ }
525
+
526
+
527
+ // Public
528
+
529
+ $.extend({
530
+ ajax: handleAjax
531
+ });
532
+
533
+ $.mockjaxSettings = {
534
+ //url: null,
535
+ //type: 'GET',
536
+ log: function( mockHandler, requestSettings ) {
537
+ if ( mockHandler.logging === false ||
538
+ ( typeof mockHandler.logging === 'undefined' && $.mockjaxSettings.logging === false ) ) {
539
+ return;
540
+ }
541
+ if ( window.console && console.log ) {
542
+ var message = 'MOCK ' + requestSettings.type.toUpperCase() + ': ' + requestSettings.url;
543
+ var request = $.extend({}, requestSettings);
544
+
545
+ if (typeof console.log === 'function') {
546
+ console.log(message, request);
547
+ } else {
548
+ try {
549
+ console.log( message + ' ' + JSON.stringify(request) );
550
+ } catch (e) {
551
+ console.log(message);
552
+ }
553
+ }
554
+ }
555
+ },
556
+ logging: true,
557
+ status: 200,
558
+ statusText: "OK",
559
+ responseTime: 500,
560
+ isTimeout: false,
561
+ throwUnmocked: false,
562
+ contentType: 'text/plain',
563
+ response: '',
564
+ responseText: '',
565
+ responseXML: '',
566
+ proxy: '',
567
+ proxyType: 'GET',
568
+
569
+ lastModified: null,
570
+ etag: '',
571
+ headers: {
572
+ etag: 'IJF@H#@923uf8023hFO@I#H#',
573
+ 'content-type' : 'text/plain'
574
+ }
575
+ };
576
+
577
+ $.mockjax = function(settings) {
578
+ var i = mockHandlers.length;
579
+ mockHandlers[i] = settings;
580
+ return i;
581
+ };
582
+ $.mockjaxClear = function(i) {
583
+ if ( arguments.length == 1 ) {
584
+ mockHandlers[i] = null;
585
+ } else {
586
+ mockHandlers = [];
587
+ }
588
+ mockedAjaxCalls = [];
589
+ };
590
+ $.mockjax.handler = function(i) {
591
+ if ( arguments.length == 1 ) {
592
+ return mockHandlers[i];
593
+ }
594
+ };
595
+ $.mockjax.mockedAjaxCalls = function() {
596
+ return mockedAjaxCalls;
597
+ };
598
+ })(jQuery);