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,22 @@
1
+ {
2
+ "name": "qunit-bdd",
3
+ "version": "0.6.1",
4
+ "authors": [
5
+ "Brian Donovan <donovan@squareup.com>"
6
+ ],
7
+ "description": "BDD-style testing for QUnit.",
8
+ "main": "lib/qunit-bdd.js",
9
+ "keywords": [
10
+ "qunit",
11
+ "bdd"
12
+ ],
13
+ "license": "Apache 2",
14
+ "homepage": "https://github.com/square/qunit-bdd",
15
+ "ignore": [
16
+ "**/.*",
17
+ "node_modules",
18
+ "bower_components",
19
+ "test",
20
+ "tests"
21
+ ]
22
+ }
@@ -0,0 +1,70 @@
1
+ // Karma configuration
2
+ // Generated on Thu Apr 10 2014 16:09:14 GMT-0700 (PDT)
3
+
4
+ module.exports = function(config) {
5
+ config.set({
6
+
7
+ // base path that will be used to resolve all patterns (eg. files, exclude)
8
+ basePath: '',
9
+
10
+
11
+ // frameworks to use
12
+ // available frameworks: https://npmjs.org/browse/keyword/karma-adapter
13
+ frameworks: ['qunit'],
14
+
15
+
16
+ // list of files / patterns to load in the browser
17
+ files: [
18
+ 'test/preconfig.js',
19
+ 'lib/**/*.js',
20
+ 'test/vendor/sinon.js',
21
+ 'test/**/*_test.js'
22
+ ],
23
+
24
+
25
+ // list of files to exclude
26
+ exclude: [
27
+
28
+ ],
29
+
30
+
31
+ // preprocess matching files before serving them to the browser
32
+ // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
33
+ preprocessors: {
34
+
35
+ },
36
+
37
+
38
+ // test results reporter to use
39
+ // possible values: 'dots', 'progress'
40
+ // available reporters: https://npmjs.org/browse/keyword/karma-reporter
41
+ reporters: ['progress'],
42
+
43
+
44
+ // web server port
45
+ port: 9876,
46
+
47
+
48
+ // enable / disable colors in the output (reporters and logs)
49
+ colors: true,
50
+
51
+
52
+ // level of logging
53
+ // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
54
+ logLevel: config.LOG_INFO,
55
+
56
+
57
+ // enable / disable watching file and executing tests whenever any file changes
58
+ autoWatch: true,
59
+
60
+
61
+ // start these browsers
62
+ // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
63
+ browsers: ['PhantomJS'],
64
+
65
+
66
+ // Continuous Integration mode
67
+ // if true, Karma captures browsers, runs the tests and exits
68
+ singleRun: false
69
+ });
70
+ };
@@ -0,0 +1,755 @@
1
+ /* jshint node:true, browser:true, undef:true */
2
+ /* global QUnit, QUNIT_BDD_OPTIONS */
3
+
4
+ ;(function(global, exports, QUnit, options) {
5
+ if (!QUnit) {
6
+ throw new Error('Unable to locate QUnit! Please load it before qunit-bdd.');
7
+ }
8
+
9
+ /**
10
+ * Represents an execution context for tests created by calls to `describe`
11
+ * and `context`. Contexts can be nested inside each other.
12
+ *
13
+ * @class
14
+ * @private
15
+ * @param {string} description
16
+ * @param {?Context} parent
17
+ * @param {?object} options
18
+ */
19
+ function Context(description, parent, options) {
20
+ this.description = description;
21
+ this.parent = parent;
22
+ this.skipped = (options && options.skipped) || (parent && parent.skipped);
23
+ this.tests = [];
24
+ this.before = [];
25
+ this.after = [];
26
+ this.lazySetup = [];
27
+ this.lazyTeardown = [];
28
+ }
29
+
30
+ /**
31
+ * Gets the full context description by prepending any parent context
32
+ * descriptions joined by a space.
33
+ *
34
+ * @return {string}
35
+ */
36
+ Context.prototype.fullDescription = function() {
37
+ if (this.parent) {
38
+ var parentDescription = this.parent.fullDescription();
39
+ if (parentDescription) {
40
+ return parentDescription + ' ' + this.description;
41
+ }
42
+ }
43
+ return this.description;
44
+ };
45
+
46
+ /**
47
+ * Queues the named hook in the given direction using the given execution
48
+ * environment. This is used to set up `lazy` values, run `before` and
49
+ * `after` callbacks, and tear down `lazy` values.
50
+ *
51
+ * See `addTestsToQUnit` for an explanation of how QUnit's queue is used to
52
+ * handle these hooks and async.
53
+ *
54
+ * @private
55
+ * @param {string} hook The name of the hook, such as "before".
56
+ * @param {up} boolean true to run from inside-out, false to run outside-in.
57
+ * @param {object} env `this` inside the hook callback functions.
58
+ */
59
+ Context.prototype.prependHook = function(hook, up, env) {
60
+ var queue = [];
61
+ var parent = this.parent;
62
+
63
+ this[hook].forEach(function(fn) {
64
+ queue.push(function() {
65
+ if (QUnit.config.notrycatch) {
66
+ fn.call(env);
67
+ } else {
68
+ try {
69
+ fn.call(env);
70
+ } catch (e) {
71
+ QUnit.pushFailure(
72
+ 'Exception while running qunit-bdd `' + hook + '` hook: ' +
73
+ (e.message || e),
74
+ QUnit.config.current.stack
75
+ );
76
+ }
77
+ }
78
+ });
79
+ });
80
+
81
+ if (parent) {
82
+ if (up) {
83
+ queue.push(function() { parent.prependHook(hook, up, env); });
84
+ } else {
85
+ queue.unshift(function() { parent.prependHook(hook, up, env); });
86
+ }
87
+ }
88
+
89
+ QUnit.config.queue.unshift.apply(QUnit.config.queue, queue);
90
+ };
91
+
92
+
93
+ /**
94
+ * Context state data. The root context handles top-level `before` and
95
+ * `after` callbacks.
96
+ */
97
+
98
+ var root = new Context();
99
+ var pendingContexts = [];
100
+ var contextStack = [root];
101
+
102
+ /**
103
+ * Gets the innermost context whose body is being evaluated.
104
+ *
105
+ * @private
106
+ * @return {?Context}
107
+ */
108
+ function currentContext() {
109
+ return contextStack[contextStack.length - 1];
110
+ }
111
+
112
+ /**
113
+ * Processes the current contexts by setting them up as QUnit modules.
114
+ *
115
+ * @private
116
+ */
117
+ function addTestsToQUnit() {
118
+ if (options.randomize) {
119
+ pendingContexts = randomize(pendingContexts);
120
+ }
121
+
122
+ pendingContexts.forEach(function(context) {
123
+ QUnit.module(context.fullDescription(), {
124
+ /**
125
+ * We use QUnit's current `queue` to ensure hook functions are run in
126
+ * the right order and obey QUnit's async rules. QUnit synchronizes
127
+ * calls in this order:
128
+ *
129
+ * module('mod', {
130
+ * setup: function(){}, // Step 1
131
+ * teardown: function(){} // Step 3
132
+ * });
133
+ *
134
+ * test('test', function(){}); // Step 2
135
+ *
136
+ * We add some abstractions to that, so we want to run things in this
137
+ * order:
138
+ *
139
+ * describe('outer', function() {
140
+ * lazy('a', function(){}); // Step 1
141
+ *
142
+ * before(function(){}); // Step 3
143
+ * before(function(){}); // Step 4
144
+ *
145
+ * describe('inner', function() {
146
+ * lazy('a', function(){}); // Step 2
147
+ *
148
+ * before(function(){}); // Step 5
149
+ * it('test', function(){}); // Step 6
150
+ * after(function(){}); // Step 7
151
+ * });
152
+ *
153
+ * after(function(){}); // Step 8
154
+ * after(function(){}); // Step 9
155
+ * });
156
+ *
157
+ * So before `setup` is called below, the QUnit queue looks like this:
158
+ *
159
+ * - setup
160
+ * - test
161
+ * - teardown
162
+ *
163
+ * QUnit unshifts `setup` and runs it. We then call `prependHook` which
164
+ * prepends our `before` callbacks so the queue now looks like this:
165
+ *
166
+ * - before (#3)
167
+ * - before (#4)
168
+ * - before (#5)
169
+ * - test
170
+ * - teardown
171
+ *
172
+ * And then we call `prependHook` for the `lazySetup` callbacks, so we
173
+ * end up with this:
174
+ *
175
+ * - lazySetup (#1)
176
+ * - lazySetup (#2)
177
+ * - before (#3)
178
+ * - before (#4)
179
+ * - before (#5)
180
+ * - test
181
+ * - teardown
182
+ *
183
+ * QUnit will ensure that each step is run only once
184
+ * `QUnit.config.semaphore` has gone back down to 0.
185
+ *
186
+ * Similarly, once `teardown` is run we add additional queue items for
187
+ * `lazyTeardown` and `after` callbacks.
188
+ */
189
+
190
+ setup: function() {
191
+ if (!QUnit.config.current.callback.skipped) {
192
+ context.prependHook('before', false, this);
193
+ context.prependHook('lazySetup', false, this);
194
+ }
195
+ },
196
+ teardown: function() {
197
+ if (!QUnit.config.current.callback.skipped) {
198
+ context.prependHook('lazyTeardown', true, this);
199
+ context.prependHook('after', true, this);
200
+ }
201
+ }
202
+ });
203
+
204
+ var tests = context.tests;
205
+
206
+ if (options.randomize) {
207
+ tests = randomize(tests.slice());
208
+ }
209
+
210
+ tests.forEach(function(test) {
211
+ QUnit.test(test.description, test.body);
212
+ });
213
+ });
214
+
215
+ pendingContexts.length = 0;
216
+ }
217
+
218
+ /**
219
+ * Shuffle the entries of `array` randomly.
220
+ *
221
+ * @private
222
+ * @param {Array.<T>} array
223
+ * @return {Array.<T>}
224
+ */
225
+ function shuffle(array) {
226
+ var j, x, i = array.length;
227
+ while (i) {
228
+ j = Math.floor(Math.random() * i);
229
+ x = array[--i];
230
+ array[i] = array[j];
231
+ array[j] = x;
232
+ }
233
+ return array;
234
+ }
235
+ var randomize = (typeof options.randomize === 'function') ?
236
+ options.randomize :
237
+ shuffle;
238
+
239
+ // Add test suites just before QUnit starts running.
240
+ QUnit.begin(addTestsToQUnit);
241
+
242
+ /**
243
+ * Creates a context and adds it to the current context state.
244
+ *
245
+ * @param {string} description
246
+ * @param {function(this: Context)} body
247
+ * @param {?object} options
248
+ */
249
+ function describe(description, body, options) {
250
+ var desc = new Context(description, currentContext(), options);
251
+
252
+ pendingContexts.push(desc);
253
+ contextStack.push(desc);
254
+ body.call(desc);
255
+ contextStack.pop();
256
+ }
257
+
258
+ /**
259
+ * Creates a test for the current context.
260
+ *
261
+ * @param {string} description
262
+ * @param {function()} body
263
+ * @param {boolean} skipped
264
+ */
265
+ function it(description, body, /* internal */ skipped) {
266
+ var context = currentContext();
267
+ if (context.skipped || skipped) {
268
+ description += ' (SKIPPED)';
269
+ body = skippedTestBody;
270
+ }
271
+ context.tests.push({
272
+ description: description,
273
+ body: body
274
+ });
275
+ }
276
+
277
+ /**
278
+ * All skipped tests do the same thing so we can reuse the body function,
279
+ * which is what this is for.
280
+ *
281
+ * @private
282
+ */
283
+ var skippedTestBody = function() {
284
+ QUnit.expect(0);
285
+
286
+ if (typeof document !== 'undefined') {
287
+ var testRow = document.getElementById(QUnit.config.current.id);
288
+ if (testRow && testRow.style) {
289
+ testRow.style.opacity = 0.5;
290
+ }
291
+ }
292
+ };
293
+ skippedTestBody.skipped = true;
294
+
295
+ /**
296
+ * Allows leaving a `describe` in place but having QUnit skip all the tests,
297
+ * as if you'd annotated all of them with `.skip` instead.
298
+ *
299
+ * @param {string} description
300
+ * @param {function()} body
301
+ */
302
+ describe.skip = function(description, body) {
303
+ describe(description, body, { skipped: true });
304
+ };
305
+
306
+ describe.only = function(description, body) {
307
+ var module = currentContext().fullDescription();
308
+ if (module) {
309
+ module += ' ' + description;
310
+ } else {
311
+ module = description;
312
+ }
313
+ QUnit.config.module = module;
314
+ describe(description, body);
315
+ };
316
+
317
+ /**
318
+ * Allows leaving a test intact but without it being run. It will be marked
319
+ * as skipped both in the name of the test and, if running with a DOM, by
320
+ * marking the test results.
321
+ *
322
+ * @param {string} description
323
+ * @param {function()} body
324
+ */
325
+ it.skip = function(description, body) {
326
+ it(description, body, true);
327
+ };
328
+
329
+ /**
330
+ * Allows running only a specific test by using `it.only` instead of `it`.
331
+ * This is the same as running with a specific module/filter combination, but
332
+ * is more practical in situations where accessing the QUnit UI or URL is
333
+ * difficult.
334
+ *
335
+ * @param {string} description
336
+ * @param {function()} body
337
+ */
338
+ it.only = function(description, body) {
339
+ QUnit.config.module = currentContext().fullDescription();
340
+ QUnit.config.filter = description;
341
+ it(description, body);
342
+ };
343
+
344
+ /**
345
+ * Registers a function to run before each test in the current context and
346
+ * all its descendant contexts.
347
+ *
348
+ * @param {function()} body
349
+ */
350
+ function before(body) {
351
+ currentContext().before.push(body);
352
+ }
353
+
354
+ /**
355
+ * Registers a function to run after each test in the current context and
356
+ * all its descendant contexts.
357
+ *
358
+ * @param {function()} body
359
+ */
360
+ function after(body) {
361
+ currentContext().after.push(body);
362
+ }
363
+
364
+ /**
365
+ * Registers a helper function on the current context.
366
+ *
367
+ * Example
368
+ *
369
+ * describe('api', function() {
370
+ * before(function() {
371
+ * this.apiController = {};
372
+ * });
373
+ *
374
+ * helper('fireApiRequest', function() {
375
+ * // full access to everything on `this` context.
376
+ * // this.apiController.doSomething()...
377
+ * });
378
+ *
379
+ * it('works', function() {
380
+ * this.fireApiRequest();
381
+ * });
382
+ *
383
+ * it('works another way', function() {
384
+ * this.fireApiRequest();
385
+ * });
386
+ * });
387
+ *
388
+ * @param {function()} body
389
+ */
390
+ function helper(name, fn) {
391
+ lazy(name, function() { return fn; });
392
+ }
393
+
394
+ /**
395
+ * Registers a named value to be made available in all before/after/it blocks
396
+ * for the current context. This helper allows you to create complex values
397
+ * that are dependent on simpler values that may be overridden in child
398
+ * contexts.
399
+ *
400
+ * `value` may either be a function, in which case the value is lazily
401
+ * determined as needed, or a non-function value, in which case the given
402
+ * value will be used as-is. Dynamic values only have their value computed
403
+ * once per test. Keep in mind the value will not be generated at all if the
404
+ * value is not used.
405
+ *
406
+ * Example
407
+ *
408
+ * describe('Person', function() {
409
+ * lazy('person', function() {
410
+ * return new Person(this.firstName, this.lastName);
411
+ * });
412
+ *
413
+ * describe('#name', function() {
414
+ * context('with both first and last name', function() {
415
+ * lazy('firstName, 'Jim');
416
+ * lazy('lastName', 'Henson');
417
+ *
418
+ * it('joins first and last names on spaces', function() {
419
+ * expect(this.person.name).to.equal('Jim Henson');
420
+ * });
421
+ * });
422
+ *
423
+ * context('with only first name', function() {
424
+ * lazy('firstName, 'Jim');
425
+ *
426
+ * it('uses only the first name', function() {
427
+ * expect(this.person.name).to.equal('Jim');
428
+ * });
429
+ * });
430
+ * });
431
+ * });
432
+ *
433
+ * @param {string} name
434
+ * @param {*} value
435
+ */
436
+ function lazy(name, value) {
437
+ var cached = false;
438
+ var getter;
439
+
440
+ if (typeof value === 'function') {
441
+ getter = value;
442
+ } else {
443
+ getter = function() { return value; };
444
+ }
445
+
446
+ currentContext().lazySetup.push(function() {
447
+ Object.defineProperty(this, name, {
448
+ enumerable: false,
449
+ configurable: true,
450
+ get: function() {
451
+ if (!cached) {
452
+ value = getter.call(this);
453
+ cached = true;
454
+ }
455
+ return value;
456
+ },
457
+ set: function(newValue) {
458
+ cached = true;
459
+ value = newValue;
460
+ }
461
+ });
462
+ });
463
+
464
+ currentContext().lazyTeardown.push(function(context) {
465
+ cached = false;
466
+ Object.defineProperty(this, name, {
467
+ enumerable: false,
468
+ configurable: true,
469
+ value: void 0
470
+ });
471
+ });
472
+ }
473
+
474
+ /**
475
+ * Represents an assertion created by calling `expect`.
476
+ *
477
+ * @class
478
+ * @private
479
+ * @param {*} actual
480
+ */
481
+ function Assertion(actual) {
482
+ this._actual = actual;
483
+ this._flags = {};
484
+ }
485
+
486
+ /**
487
+ * Creates a new Assertion.
488
+ *
489
+ * @param {*} actual
490
+ * @return {Assertion}
491
+ */
492
+ function expect(actual) {
493
+ var assertion = new Assertion(actual);
494
+
495
+ Object.defineProperty(assertion, '_previousExpectedAssertions', {
496
+ value: QUnit.config.current.expected,
497
+ enumerable: false
498
+ });
499
+
500
+ if (typeof actual === 'number') {
501
+ QUnit.config.current.expected = actual;
502
+ }
503
+
504
+ return assertion;
505
+ }
506
+
507
+ /**
508
+ * Add your own assertions or customize built-in ones here.
509
+ *
510
+ * expect.configure({
511
+ * // expect(2).to.be.even();
512
+ * even: function() {
513
+ * QUnit.ok(
514
+ * !(this._actual % 2),
515
+ * 'expected ' + this._actual + ' to be even'
516
+ * );
517
+ * }
518
+ * });
519
+ *
520
+ * @param {object} assertions
521
+ */
522
+ expect.configure = function(assertions) {
523
+ Object.getOwnPropertyNames(assertions).forEach(function(key) {
524
+ var descriptor = Object.getOwnPropertyDescriptor(assertions, key);
525
+ if (descriptor) {
526
+ descriptor.configurable = true;
527
+ if (descriptor.get) {
528
+ descriptor.get = assertionWrapper(key, descriptor.get);
529
+ } else if (typeof descriptor.value === 'function') {
530
+ descriptor.value = assertionWrapper(key, descriptor.value);
531
+ }
532
+ Object.defineProperty(Assertion.prototype, key, descriptor);
533
+ }
534
+ });
535
+ };
536
+
537
+ /**
538
+ * Creates a wrapper function that restores any expect count that might have
539
+ * been set before we overrode it.
540
+ *
541
+ * @param {Function} fn
542
+ * @return {Function}
543
+ */
544
+ function assertionWrapper(key, fn) {
545
+ return function() {
546
+ var previousExpectedAssertions = this._previousExpectedAssertions;
547
+ QUnit.config.current.expected = previousExpectedAssertions;
548
+ return fn.apply(this, arguments);
549
+ };
550
+ }
551
+
552
+ expect.configure(Object.defineProperties({}, {
553
+ /**
554
+ * Negates the meaning of this assertion.
555
+ *
556
+ * expect(1).not.to.equal(2);
557
+ *
558
+ * @return {Assertion}
559
+ */
560
+ not: {
561
+ get: function() {
562
+ this._flags.negate = !this._flags.negate;
563
+ return this;
564
+ }
565
+ },
566
+
567
+ /**
568
+ * Syntactic sugar to help readability:
569
+ *
570
+ * // This doesn't read very nicely.
571
+ * expect(1).equal(1);
572
+ *
573
+ * // But this does.
574
+ * expect(1).to.equal(1);
575
+ *
576
+ * @return {Assertion}
577
+ */
578
+ to: {
579
+ get: function() {
580
+ return this;
581
+ }
582
+ },
583
+
584
+ /**
585
+ * Syntactic sugar to help readability:
586
+ *
587
+ * // This doesn't read very nicely.
588
+ * expect(true).true();
589
+ *
590
+ * // But this does.
591
+ * expect(true).to.be.true();
592
+ *
593
+ * @return {Assertion}
594
+ */
595
+ be: {
596
+ get: function() {
597
+ return this;
598
+ }
599
+ },
600
+
601
+ /**
602
+ * Asserts that the actual and expected values are (or are not) equal. This
603
+ * method checks using strict equality (===) and delegates to
604
+ * QUnit.(not)strictEqual.
605
+ *
606
+ * @param {*} expected
607
+ * @param {?string} message
608
+ */
609
+ equal: {
610
+ value: function(expected, message) {
611
+ if (this._flags.negate) {
612
+ QUnit.notStrictEqual(this._actual, expected, message);
613
+ } else {
614
+ QUnit.strictEqual(this._actual, expected, message);
615
+ }
616
+ }
617
+ },
618
+
619
+ /**
620
+ * Asserts that the actual and expected values are (or are not) deeply equal.
621
+ * This method checks that object keys and values match up, recursively. This
622
+ * method delegates to QUnit.(not)deepEqual.
623
+ *
624
+ * @param {*} expected
625
+ * @param {?string} message
626
+ */
627
+ eql: {
628
+ value: function(expected, message) {
629
+ if (this._flags.negate) {
630
+ QUnit.notDeepEqual(this._actual, expected, message);
631
+ } else {
632
+ QUnit.deepEqual(this._actual, expected, message);
633
+ }
634
+ }
635
+ },
636
+
637
+ /**
638
+ * Asserts that the actual value is (or is not) undefined.
639
+ */
640
+ undefined: {
641
+ value: function(message) {
642
+ this.equal(void 0, message);
643
+ }
644
+ },
645
+
646
+ /**
647
+ * Asserts that the actual value is (or is not) null.
648
+ */
649
+ null: {
650
+ value: function(message) {
651
+ this.equal(null, message);
652
+ }
653
+ },
654
+
655
+ /**
656
+ * Asserts that the actual value is (or is not) false.
657
+ */
658
+ false: {
659
+ value: function(message) {
660
+ this.equal(false, message);
661
+ }
662
+ },
663
+
664
+ /**
665
+ * Asserts that the actual value is (or is not) true.
666
+ */
667
+ true: {
668
+ value: function(message) {
669
+ this.equal(true, message);
670
+ }
671
+ },
672
+
673
+ /**
674
+ * Asserts that the actual value is (or is not) null or undefined.
675
+ */
676
+ defined: {
677
+ value: function(message) {
678
+ if (this._flags.negate) {
679
+ QUnit.push(
680
+ this._actual === null || this._actual === undefined,
681
+ this._actual, undefined, message);
682
+ } else {
683
+ QUnit.push(
684
+ this._actual !== null && this._actual !== undefined,
685
+ this._actual, undefined, message);
686
+ }
687
+ }
688
+ }
689
+ }));
690
+
691
+ /**
692
+ * Fails a test unconditionally with the given message.
693
+ *
694
+ * @param {string} message
695
+ */
696
+ function fail(message) {
697
+ QUnit.ok(false, message);
698
+ }
699
+
700
+ /**
701
+ * GLOBALS configures which API methods should be globally exported, if any.
702
+ * In a CommonJS environment API methods will by default not be made global.
703
+ * In other environments they will be exported by default.
704
+ *
705
+ * To configure this behavior you can set QUNIT_BDD_OPTIONS.GLOBALS to true,
706
+ * false, or an object with function names as keys and boolean values. For
707
+ * example, to disable only the `lazy` function globally:
708
+ *
709
+ * QUNIT_BDD_OPTIONS.GLOBALS = { lazy: false };
710
+ */
711
+ var GLOBALS = options.GLOBALS;
712
+ if (GLOBALS === undefined) {
713
+ GLOBALS = !exports;
714
+ }
715
+
716
+ function doExports(map) {
717
+ for (var key in map) {
718
+ if (map.hasOwnProperty(key)) {
719
+ if (exports) {
720
+ exports[key] = map[key];
721
+ }
722
+ if (GLOBALS === true ||
723
+ (typeof GLOBALS === 'object' &&
724
+ GLOBALS[key] !== false)) {
725
+ global[key] = map[key];
726
+ }
727
+ }
728
+ }
729
+ }
730
+
731
+ doExports({
732
+ describe: describe,
733
+ context: describe,
734
+ it: it,
735
+ before: before,
736
+ after: after,
737
+ lazy: lazy,
738
+ expect: expect,
739
+ fail: fail,
740
+ helper: helper
741
+ });
742
+ }).call(this,
743
+ // global
744
+ (typeof global !== 'undefined') ? global :
745
+ (typeof window !== 'undefined') ? window : this,
746
+ // exports
747
+ (typeof module !== 'undefined' &&
748
+ typeof exports !== 'undefined' &&
749
+ module.exports === exports) ? exports : null,
750
+ // QUnit
751
+ (typeof QUnit !== 'undefined') && QUnit,
752
+ // options
753
+ (typeof QUNIT_BDD_OPTIONS !== 'undefined') &&
754
+ QUNIT_BDD_OPTIONS || this.QUNIT_BDD_OPTIONS || {}
755
+ );