lanes 0.0.3 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (446) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/Gemfile +1 -1
  4. data/Rakefile +0 -42
  5. data/client/{javascripts/component → lanes/components}/Base.coffee +10 -10
  6. data/client/{javascripts/component → lanes/components}/ChoicesInput.coffee +0 -0
  7. data/client/lanes/components/enabled.js.erb +3 -0
  8. data/client/{javascripts/lib/create-namespace.js → lanes/components/enabled.scss.erb} +0 -0
  9. data/client/{javascripts/component → lanes/components}/grid/Editor.coffee +10 -13
  10. data/client/{javascripts/component → lanes/components/grid}/Grid.coffee +6 -6
  11. data/client/{javascripts/component → lanes/components}/grid/PopOverEditor.coffee +3 -3
  12. data/client/{javascripts/component → lanes/components}/grid/RowEditor.coffee +2 -3
  13. data/client/lanes/components/grid/config.json +3 -0
  14. data/client/{stylesheets/compoonents/grid-editors.scss → lanes/components/grid/editors.scss} +0 -0
  15. data/client/{stylesheets/compoonents → lanes/components/grid}/grid.scss +8 -6
  16. data/client/lanes/components/grid/index.js +8 -0
  17. data/client/{javascripts/component → lanes/components}/grid/popover-editor.html +0 -0
  18. data/client/{javascripts/component → lanes/components}/grid/row-editor.html +0 -0
  19. data/client/{javascripts/component/grid.html → lanes/components/grid/template.html} +0 -0
  20. data/client/{javascripts/vendor/dataTables → lanes/components/grid/vendor}/dataTables.bootstrap.js +0 -0
  21. data/client/{javascripts/vendor/dataTables → lanes/components/grid/vendor}/dataTables.scroller.js +0 -0
  22. data/client/{javascripts/vendor/dataTables → lanes/components/grid/vendor}/datatables.responsive.js +0 -0
  23. data/client/{javascripts/vendor/dataTables → lanes/components/grid/vendor}/index.js +0 -0
  24. data/client/{javascripts/vendor/dataTables → lanes/components/grid/vendor}/jquery.dataTables.js +1 -0
  25. data/client/lanes/components/index.js +2 -0
  26. data/client/lanes/components/modal/ModalDialog.coffee +47 -0
  27. data/client/lanes/components/modal/index.js +2 -0
  28. data/client/lanes/components/modal/modal.scss +20 -0
  29. data/client/{javascripts/component/modal.html → lanes/components/modal/template.html} +5 -4
  30. data/client/{javascripts/component → lanes/components/popover}/PopOver.coffee +4 -4
  31. data/client/lanes/components/popover/index.js +2 -0
  32. data/client/lanes/components/popover/popover.scss +1 -0
  33. data/client/{javascripts/component/popover.html → lanes/components/popover/template.html} +0 -0
  34. data/client/{javascripts/component → lanes/components/radio_group}/RadioGroup.coffee +1 -1
  35. data/client/{javascripts/component → lanes/components/record_finder}/RecordFinder.coffee +4 -4
  36. data/client/{javascripts/component/record-finder → lanes/components/record_finder}/clause.skr +0 -0
  37. data/client/{javascripts/component/record-finder → lanes/components/record_finder}/dialog.skr +0 -0
  38. data/client/{javascripts/component/record-finder → lanes/components/record_finder}/field.skr +0 -0
  39. data/client/lanes/components/select_field/SelectField.coffee +87 -0
  40. data/client/{screens/user-management → lanes/components/select_field}/index.js +0 -1
  41. data/client/{javascripts/workspace/tab.html → lanes/components/select_field/select_field.scss} +0 -0
  42. data/client/{javascripts → lanes}/data/Bootstrap.coffee +0 -0
  43. data/client/{javascripts → lanes}/data/ChangeSet.coffee +0 -0
  44. data/client/{javascripts → lanes}/data/Collection.coffee +37 -6
  45. data/client/{javascripts → lanes}/data/Config.coffee +0 -0
  46. data/client/{javascripts → lanes}/data/Model.coffee +8 -9
  47. data/client/{javascripts → lanes}/data/PubSub.coffee +0 -0
  48. data/client/{javascripts → lanes}/data/Query.coffee +0 -0
  49. data/client/{javascripts → lanes}/data/Screens.coffee +48 -19
  50. data/client/{javascripts → lanes}/data/Sync.coffee +5 -5
  51. data/client/lanes/data/User.coffee +46 -0
  52. data/client/{javascripts → lanes}/data/index.js +1 -2
  53. data/client/{javascripts → lanes}/data/mixins/HasCodeField.coffee +1 -1
  54. data/client/{javascripts → lanes}/extension/Base.coffee +1 -1
  55. data/client/lanes/extension/EarlyExtensions.js.erb +3 -0
  56. data/client/{javascripts → lanes}/extension/Extensions.coffee +5 -0
  57. data/client/{javascripts → lanes}/extension/GlAccounts.coffee +0 -0
  58. data/client/lanes/extension/LateLoaded.js.erb +3 -0
  59. data/client/lanes/extension/index.js +5 -0
  60. data/client/lanes/extension/namespace-available.js.erb +3 -0
  61. data/client/lanes/index.js +11 -0
  62. data/client/{javascripts → lanes}/lib/MakeBaseClass.coffee +0 -0
  63. data/client/{javascripts → lanes}/lib/ModuleSupport.coffee +0 -0
  64. data/client/{javascripts → lanes}/lib/Templates.coffee +2 -5
  65. data/{spec/client/foo_spec.js → client/lanes/lib/create-namespace.js} +0 -0
  66. data/client/{javascripts → lanes}/lib/debounce.coffee +0 -0
  67. data/client/{javascripts → lanes}/lib/defer.coffee +0 -0
  68. data/client/{javascripts → lanes}/lib/el.js +0 -0
  69. data/client/{javascripts → lanes}/lib/index.js +0 -4
  70. data/client/{javascripts → lanes}/lib/loader.coffee +15 -10
  71. data/client/{javascripts → lanes}/lib/namespace.coffee +3 -0
  72. data/client/{javascripts → lanes}/lib/noConflict.coffee +1 -0
  73. data/client/{javascripts → lanes}/lib/promise_helpers.coffee +0 -0
  74. data/client/{javascripts → lanes}/lib/results.coffee +0 -0
  75. data/client/{javascripts → lanes}/lib/utilFunctions.coffee +11 -13
  76. data/client/{javascripts → lanes}/plugins/ResizeSensor.js +0 -0
  77. data/client/lanes/plugins/index.js +1 -0
  78. data/client/{javascripts → lanes}/plugins/overlay.coffee +0 -0
  79. data/client/{javascripts → lanes}/plugins/trigger.coffee +0 -0
  80. data/client/lanes/screens/Base.coffee +40 -0
  81. data/client/{javascripts/view/mixins/ScreenChangeListener.coffee → lanes/screens/ChangeListener.coffee} +2 -2
  82. data/client/lanes/screens/Router.coffee +6 -0
  83. data/client/lanes/screens/index.js +1 -0
  84. data/client/{javascripts/view → lanes/screens}/screen-definitions.js.erb +0 -0
  85. data/client/{javascripts → lanes}/vendor/bootstrap/affix.js +43 -23
  86. data/client/{javascripts → lanes}/vendor/bootstrap/alert.js +6 -4
  87. data/client/{javascripts → lanes}/vendor/bootstrap/button.js +16 -10
  88. data/client/{javascripts → lanes}/vendor/bootstrap/carousel.js +27 -10
  89. data/client/{javascripts → lanes}/vendor/bootstrap/collapse.js +69 -28
  90. data/client/{javascripts → lanes}/vendor/bootstrap/dropdown.js +20 -10
  91. data/client/{javascripts → lanes}/vendor/bootstrap/modal.js +67 -23
  92. data/client/{javascripts → lanes}/vendor/bootstrap/popover.js +13 -7
  93. data/client/{javascripts → lanes}/vendor/bootstrap/scrollspy.js +12 -7
  94. data/client/{javascripts → lanes}/vendor/bootstrap/tab.js +41 -16
  95. data/client/{javascripts → lanes}/vendor/bootstrap/tooltip.js +60 -39
  96. data/client/{javascripts → lanes}/vendor/bootstrap/transition.js +1 -1
  97. data/client/{javascripts → lanes}/vendor/jquery-2.js +0 -0
  98. data/client/{javascripts → lanes}/vendor/jquery.tap.js +0 -0
  99. data/client/{javascripts → lanes}/vendor/magicsuggest.js +0 -0
  100. data/client/{javascripts → lanes}/vendor/message-bus.js +0 -0
  101. data/client/lanes/vendor/modern-stack.js +27 -0
  102. data/client/lanes/vendor/packaged.js +13698 -0
  103. data/client/{javascripts/view → lanes/views}/Assets.coffee +1 -1
  104. data/client/lanes/views/Base.coffee +426 -0
  105. data/client/{javascripts/view → lanes/views}/FormBindings.coffee +1 -1
  106. data/client/{javascripts/view → lanes/views}/Functions.coffee +1 -1
  107. data/client/{javascripts/view → lanes/views}/Helpers.coffee +6 -6
  108. data/client/{javascripts/view → lanes/views}/Keys.coffee +3 -3
  109. data/client/{javascripts/view → lanes/views}/ModelObserver.coffee +1 -1
  110. data/client/{javascripts/view → lanes/views}/ModelUpdate.coffee +2 -2
  111. data/client/{javascripts/view → lanes/views}/PubSub.coffee +3 -3
  112. data/client/{javascripts/view → lanes/views}/RenderContext.coffee +1 -1
  113. data/client/{javascripts/view → lanes/views}/SaveNotify.coffee +2 -2
  114. data/client/{javascripts/view → lanes/views}/TimedHighlight.coffee +1 -1
  115. data/client/{javascripts/view → lanes/views}/TimedMask.coffee +1 -1
  116. data/client/{javascripts/view/InterfaceState.coffee → lanes/views/Viewport.coffee} +18 -18
  117. data/client/{javascripts/view → lanes/views}/_button.html +0 -0
  118. data/client/{javascripts/view → lanes/views}/_toolbar.html +0 -0
  119. data/client/lanes/views/index.js +2 -0
  120. data/client/{javascripts/view → lanes/views}/model-update.html +0 -0
  121. data/client/{javascripts → lanes}/workspace/ActiveScreensSwitcher.coffee +23 -27
  122. data/client/{javascripts → lanes}/workspace/Instance.es6 +25 -21
  123. data/client/{javascripts → lanes}/workspace/Layout.coffee +6 -5
  124. data/client/{javascripts → lanes}/workspace/Navbar.coffee +2 -2
  125. data/client/{javascripts → lanes}/workspace/Pages.coffee +9 -13
  126. data/client/{javascripts → lanes}/workspace/ScreensMenu.coffee +11 -11
  127. data/client/{javascripts → lanes}/workspace/index.js +7 -5
  128. data/client/{javascripts → lanes}/workspace/layout.html +0 -0
  129. data/client/{javascripts → lanes}/workspace/menu.html +0 -0
  130. data/client/{javascripts → lanes}/workspace/menu_toggle.html +0 -0
  131. data/client/{javascripts → lanes}/workspace/navbar.html +0 -0
  132. data/client/{javascripts → lanes}/workspace/pages.html +0 -0
  133. data/client/{javascripts → lanes}/workspace/screens-menu.html +0 -0
  134. data/client/{javascripts → lanes}/workspace/screens-switcher.html +0 -0
  135. data/client/lanes/workspace/tab.html +0 -0
  136. data/client/lanes/workspace.scss.erb +21 -0
  137. data/client/{javascripts/lanes-complete.js → lanes-complete.js} +0 -0
  138. data/client/lanes-workspace.scss.erb +21 -0
  139. data/client/{stylesheets/compoonents → styles/components}/all.scss +0 -0
  140. data/client/{stylesheets/compoonents → styles/components}/changes-notification.scss +0 -0
  141. data/client/{stylesheets/compoonents → styles/components}/record-finder.scss +0 -0
  142. data/client/{stylesheets/compoonents → styles/components}/suggest.scss +0 -0
  143. data/client/{stylesheets → styles}/fonts/icomoon.eot +0 -0
  144. data/client/{stylesheets → styles}/fonts/icomoon.svg +0 -0
  145. data/client/{stylesheets → styles}/fonts/icomoon.ttf +0 -0
  146. data/client/{stylesheets → styles}/fonts/icomoon.woff +0 -0
  147. data/client/{stylesheets → styles}/fonts/selection.json +0 -0
  148. data/client/{stylesheets/fonts/style.css → styles/fonts/style.scss} +0 -0
  149. data/client/{stylesheets → styles}/fonts.scss +6 -6
  150. data/client/{stylesheets → styles}/forms.scss +0 -0
  151. data/client/{stylesheets → styles}/index.css +0 -0
  152. data/client/{stylesheets → styles}/keybindings.scss +0 -0
  153. data/client/{stylesheets → styles}/layout.scss +1 -1
  154. data/client/{stylesheets → styles}/plugins/all.scss +0 -0
  155. data/client/{stylesheets → styles}/plugins/overlay.scss +1 -1
  156. data/client/{stylesheets → styles}/plugins/resize-sensor.scss +0 -0
  157. data/client/{stylesheets → styles}/screens.scss +0 -0
  158. data/client/{stylesheets → styles}/tabs.scss +0 -0
  159. data/client/{stylesheets → styles}/vendor/bootstrap/_alerts.scss +0 -0
  160. data/client/styles/vendor/bootstrap/_badges.scss +63 -0
  161. data/client/{stylesheets → styles}/vendor/bootstrap/_breadcrumbs.scss +0 -0
  162. data/client/styles/vendor/bootstrap/_button-groups.scss +243 -0
  163. data/client/styles/vendor/bootstrap/_buttons.scss +160 -0
  164. data/client/styles/vendor/bootstrap/_carousel.scss +267 -0
  165. data/client/{stylesheets → styles}/vendor/bootstrap/_close.scss +0 -0
  166. data/client/styles/vendor/bootstrap/_code.scss +69 -0
  167. data/client/styles/vendor/bootstrap/_component-animations.scss +38 -0
  168. data/client/styles/vendor/bootstrap/_dropdowns.scss +213 -0
  169. data/client/styles/vendor/bootstrap/_forms.scss +548 -0
  170. data/client/styles/vendor/bootstrap/_glyphicons.scss +234 -0
  171. data/client/styles/vendor/bootstrap/_grid.scss +84 -0
  172. data/client/{stylesheets → styles}/vendor/bootstrap/_input-groups.scss +0 -0
  173. data/client/styles/vendor/bootstrap/_jumbotron.scss +49 -0
  174. data/client/{stylesheets → styles}/vendor/bootstrap/_labels.scss +0 -0
  175. data/client/styles/vendor/bootstrap/_list-group.scss +124 -0
  176. data/client/styles/vendor/bootstrap/_media.scss +47 -0
  177. data/client/{stylesheets → styles}/vendor/bootstrap/_mixins.scss +0 -0
  178. data/client/styles/vendor/bootstrap/_modals.scss +148 -0
  179. data/client/styles/vendor/bootstrap/_navbar.scss +662 -0
  180. data/client/styles/vendor/bootstrap/_navs.scss +244 -0
  181. data/client/styles/vendor/bootstrap/_normalize.scss +427 -0
  182. data/client/styles/vendor/bootstrap/_pager.scss +54 -0
  183. data/client/styles/vendor/bootstrap/_pagination.scss +88 -0
  184. data/client/styles/vendor/bootstrap/_panels.scss +261 -0
  185. data/client/styles/vendor/bootstrap/_popovers.scss +135 -0
  186. data/client/styles/vendor/bootstrap/_print.scss +107 -0
  187. data/client/styles/vendor/bootstrap/_progress-bars.scss +87 -0
  188. data/client/styles/vendor/bootstrap/_responsive-embed.scss +35 -0
  189. data/client/{stylesheets → styles}/vendor/bootstrap/_responsive-utilities.scss +0 -0
  190. data/client/styles/vendor/bootstrap/_scaffolding.scss +150 -0
  191. data/client/styles/vendor/bootstrap/_tables.scss +234 -0
  192. data/client/styles/vendor/bootstrap/_theme.scss +272 -0
  193. data/client/styles/vendor/bootstrap/_thumbnails.scss +38 -0
  194. data/client/styles/vendor/bootstrap/_tooltip.scss +103 -0
  195. data/client/styles/vendor/bootstrap/_type.scss +298 -0
  196. data/client/styles/vendor/bootstrap/_utilities.scss +56 -0
  197. data/client/styles/vendor/bootstrap/_variables.scss +864 -0
  198. data/client/{stylesheets → styles}/vendor/bootstrap/_wells.scss +0 -0
  199. data/client/{stylesheets → styles}/vendor/bootstrap/mixins/_alerts.scss +0 -0
  200. data/client/{stylesheets → styles}/vendor/bootstrap/mixins/_background-variant.scss +0 -0
  201. data/client/{stylesheets → styles}/vendor/bootstrap/mixins/_border-radius.scss +0 -0
  202. data/client/styles/vendor/bootstrap/mixins/_buttons.scss +52 -0
  203. data/client/{stylesheets → styles}/vendor/bootstrap/mixins/_center-block.scss +0 -0
  204. data/client/{stylesheets → styles}/vendor/bootstrap/mixins/_clearfix.scss +0 -0
  205. data/client/styles/vendor/bootstrap/mixins/_forms.scss +88 -0
  206. data/client/{stylesheets → styles}/vendor/bootstrap/mixins/_gradients.scss +0 -0
  207. data/client/{stylesheets → styles}/vendor/bootstrap/mixins/_grid-framework.scss +0 -0
  208. data/client/styles/vendor/bootstrap/mixins/_grid.scss +122 -0
  209. data/client/styles/vendor/bootstrap/mixins/_hide-text.scss +21 -0
  210. data/client/styles/vendor/bootstrap/mixins/_image.scss +33 -0
  211. data/client/styles/vendor/bootstrap/mixins/_labels.scss +12 -0
  212. data/client/{stylesheets → styles}/vendor/bootstrap/mixins/_list-group.scss +0 -0
  213. data/client/{stylesheets → styles}/vendor/bootstrap/mixins/_nav-divider.scss +0 -0
  214. data/client/{stylesheets → styles}/vendor/bootstrap/mixins/_nav-vertical-align.scss +0 -0
  215. data/client/{stylesheets → styles}/vendor/bootstrap/mixins/_opacity.scss +0 -0
  216. data/client/{stylesheets → styles}/vendor/bootstrap/mixins/_pagination.scss +0 -0
  217. data/client/{stylesheets → styles}/vendor/bootstrap/mixins/_panels.scss +0 -0
  218. data/client/styles/vendor/bootstrap/mixins/_progress-bar.scss +10 -0
  219. data/client/{stylesheets → styles}/vendor/bootstrap/mixins/_reset-filter.scss +0 -0
  220. data/client/{stylesheets → styles}/vendor/bootstrap/mixins/_resize.scss +0 -0
  221. data/client/{stylesheets → styles}/vendor/bootstrap/mixins/_responsive-visibility.scss +0 -0
  222. data/client/{stylesheets → styles}/vendor/bootstrap/mixins/_size.scss +0 -0
  223. data/client/{stylesheets → styles}/vendor/bootstrap/mixins/_tab-focus.scss +0 -0
  224. data/client/{stylesheets → styles}/vendor/bootstrap/mixins/_table-row.scss +0 -0
  225. data/client/{stylesheets → styles}/vendor/bootstrap/mixins/_text-emphasis.scss +0 -0
  226. data/client/{stylesheets → styles}/vendor/bootstrap/mixins/_text-overflow.scss +0 -0
  227. data/client/styles/vendor/bootstrap/mixins/_vendor-prefixes.scss +222 -0
  228. data/client/styles/vendor/bootstrap/old/_alerts.scss +68 -0
  229. data/client/{stylesheets/vendor/bootstrap → styles/vendor/bootstrap/old}/_badges.scss +0 -0
  230. data/client/styles/vendor/bootstrap/old/_breadcrumbs.scss +26 -0
  231. data/client/{stylesheets/vendor/bootstrap → styles/vendor/bootstrap/old}/_button-groups.scss +0 -0
  232. data/client/{stylesheets/vendor/bootstrap → styles/vendor/bootstrap/old}/_buttons.scss +0 -0
  233. data/client/{stylesheets/vendor/bootstrap → styles/vendor/bootstrap/old}/_carousel.scss +0 -0
  234. data/client/styles/vendor/bootstrap/old/_close.scss +35 -0
  235. data/client/{stylesheets/vendor/bootstrap → styles/vendor/bootstrap/old}/_code.scss +0 -0
  236. data/client/{stylesheets/vendor/bootstrap → styles/vendor/bootstrap/old}/_component-animations.scss +0 -0
  237. data/client/{stylesheets/vendor/bootstrap → styles/vendor/bootstrap/old}/_dropdowns.scss +0 -0
  238. data/client/{stylesheets/vendor/bootstrap → styles/vendor/bootstrap/old}/_forms.scss +0 -0
  239. data/client/{stylesheets/vendor/bootstrap → styles/vendor/bootstrap/old}/_glyphicons.scss +0 -0
  240. data/client/{stylesheets/vendor/bootstrap → styles/vendor/bootstrap/old}/_grid.scss +0 -0
  241. data/client/styles/vendor/bootstrap/old/_input-groups.scss +166 -0
  242. data/client/{stylesheets/vendor/bootstrap → styles/vendor/bootstrap/old}/_jumbotron.scss +0 -0
  243. data/client/styles/vendor/bootstrap/old/_labels.scss +66 -0
  244. data/client/{stylesheets/vendor/bootstrap → styles/vendor/bootstrap/old}/_list-group.scss +0 -0
  245. data/client/{stylesheets/vendor/bootstrap → styles/vendor/bootstrap/old}/_media.scss +0 -0
  246. data/client/styles/vendor/bootstrap/old/_mixins.scss +39 -0
  247. data/client/{stylesheets/vendor/bootstrap → styles/vendor/bootstrap/old}/_modals.scss +0 -0
  248. data/client/{stylesheets/vendor/bootstrap → styles/vendor/bootstrap/old}/_navbar.scss +0 -0
  249. data/client/{stylesheets/vendor/bootstrap → styles/vendor/bootstrap/old}/_navs.scss +0 -0
  250. data/client/{stylesheets/vendor/bootstrap → styles/vendor/bootstrap/old}/_normalize.scss +0 -0
  251. data/client/{stylesheets/vendor/bootstrap → styles/vendor/bootstrap/old}/_pager.scss +0 -0
  252. data/client/{stylesheets/vendor/bootstrap → styles/vendor/bootstrap/old}/_pagination.scss +0 -0
  253. data/client/{stylesheets/vendor/bootstrap → styles/vendor/bootstrap/old}/_panels.scss +0 -0
  254. data/client/{stylesheets/vendor/bootstrap → styles/vendor/bootstrap/old}/_popovers.scss +0 -0
  255. data/client/{stylesheets/vendor/bootstrap → styles/vendor/bootstrap/old}/_print.scss +0 -0
  256. data/client/{stylesheets/vendor/bootstrap → styles/vendor/bootstrap/old}/_progress-bars.scss +0 -0
  257. data/client/{stylesheets/vendor/bootstrap → styles/vendor/bootstrap/old}/_responsive-embed.scss +0 -0
  258. data/client/styles/vendor/bootstrap/old/_responsive-utilities.scss +174 -0
  259. data/client/{stylesheets/vendor/bootstrap → styles/vendor/bootstrap/old}/_scaffolding.scss +0 -0
  260. data/client/{stylesheets/vendor/bootstrap → styles/vendor/bootstrap/old}/_tables.scss +0 -0
  261. data/client/{stylesheets/vendor/bootstrap → styles/vendor/bootstrap/old}/_theme.scss +0 -0
  262. data/client/{stylesheets/vendor/bootstrap → styles/vendor/bootstrap/old}/_thumbnails.scss +0 -0
  263. data/client/{stylesheets/vendor/bootstrap → styles/vendor/bootstrap/old}/_tooltip.scss +0 -0
  264. data/client/{stylesheets/vendor/bootstrap → styles/vendor/bootstrap/old}/_type.scss +0 -0
  265. data/client/{stylesheets/vendor/bootstrap → styles/vendor/bootstrap/old}/_utilities.scss +0 -0
  266. data/client/{stylesheets/vendor/bootstrap → styles/vendor/bootstrap/old}/_variables.scss +0 -0
  267. data/client/styles/vendor/bootstrap/old/_wells.scss +29 -0
  268. data/client/{stylesheets/vendor/bootstrap → styles/vendor/bootstrap/old}/bootstrap.scss +0 -0
  269. data/client/styles/vendor/bootstrap/old/mixins/_alerts.scss +14 -0
  270. data/client/styles/vendor/bootstrap/old/mixins/_background-variant.scss +11 -0
  271. data/client/styles/vendor/bootstrap/old/mixins/_border-radius.scss +18 -0
  272. data/client/{stylesheets/vendor/bootstrap → styles/vendor/bootstrap/old}/mixins/_buttons.scss +0 -0
  273. data/client/styles/vendor/bootstrap/old/mixins/_center-block.scss +7 -0
  274. data/client/styles/vendor/bootstrap/old/mixins/_clearfix.scss +22 -0
  275. data/client/{stylesheets/vendor/bootstrap → styles/vendor/bootstrap/old}/mixins/_forms.scss +0 -0
  276. data/client/styles/vendor/bootstrap/old/mixins/_gradients.scss +58 -0
  277. data/client/styles/vendor/bootstrap/old/mixins/_grid-framework.scss +81 -0
  278. data/client/{stylesheets/vendor/bootstrap → styles/vendor/bootstrap/old}/mixins/_grid.scss +0 -0
  279. data/client/{stylesheets/vendor/bootstrap → styles/vendor/bootstrap/old}/mixins/_hide-text.scss +0 -0
  280. data/client/{stylesheets/vendor/bootstrap → styles/vendor/bootstrap/old}/mixins/_image.scss +0 -0
  281. data/client/{stylesheets/vendor/bootstrap → styles/vendor/bootstrap/old}/mixins/_labels.scss +0 -0
  282. data/client/styles/vendor/bootstrap/old/mixins/_list-group.scss +31 -0
  283. data/client/styles/vendor/bootstrap/old/mixins/_nav-divider.scss +10 -0
  284. data/client/styles/vendor/bootstrap/old/mixins/_nav-vertical-align.scss +9 -0
  285. data/client/styles/vendor/bootstrap/old/mixins/_opacity.scss +8 -0
  286. data/client/styles/vendor/bootstrap/old/mixins/_pagination.scss +23 -0
  287. data/client/styles/vendor/bootstrap/old/mixins/_panels.scss +24 -0
  288. data/client/{stylesheets/vendor/bootstrap → styles/vendor/bootstrap/old}/mixins/_progress-bar.scss +0 -0
  289. data/client/styles/vendor/bootstrap/old/mixins/_reset-filter.scss +8 -0
  290. data/client/styles/vendor/bootstrap/old/mixins/_resize.scss +6 -0
  291. data/client/styles/vendor/bootstrap/old/mixins/_responsive-visibility.scss +21 -0
  292. data/client/styles/vendor/bootstrap/old/mixins/_size.scss +10 -0
  293. data/client/styles/vendor/bootstrap/old/mixins/_tab-focus.scss +9 -0
  294. data/client/styles/vendor/bootstrap/old/mixins/_table-row.scss +28 -0
  295. data/client/styles/vendor/bootstrap/old/mixins/_text-emphasis.scss +11 -0
  296. data/client/styles/vendor/bootstrap/old/mixins/_text-overflow.scss +8 -0
  297. data/client/{stylesheets/vendor/bootstrap → styles/vendor/bootstrap/old}/mixins/_vendor-prefixes.scss +0 -0
  298. data/client/{stylesheets → styles}/vendor/bootstrap-custom-grid.scss +0 -0
  299. data/client/{stylesheets → styles}/vendor/bootstrap-custom-modals.scss +0 -0
  300. data/client/{stylesheets → styles}/vendor/bootstrap.scss +14 -9
  301. data/client/{stylesheets → styles}/vendor/dataTables.scss +0 -0
  302. data/lanes.gemspec +5 -1
  303. data/lib/lanes/api/controller.rb +47 -6
  304. data/lib/lanes/api/helper_methods.rb +2 -10
  305. data/lib/lanes/api/javascript_processor.rb +17 -7
  306. data/lib/lanes/api/null_authentication_provider.rb +33 -0
  307. data/lib/lanes/api/request_wrapper.rb +49 -28
  308. data/lib/lanes/api/root.rb +12 -30
  309. data/lib/lanes/api/routing.rb +37 -0
  310. data/lib/lanes/api/sprockets_compressor.rb +35 -0
  311. data/lib/lanes/api/sprockets_extension.rb +69 -0
  312. data/lib/lanes/api/test_specs.rb +13 -9
  313. data/lib/lanes/api.rb +2 -18
  314. data/lib/lanes/cli.rb +22 -2
  315. data/lib/lanes/command/app.rb +49 -0
  316. data/lib/lanes/command/client_model_update.rb +65 -0
  317. data/lib/lanes/command/console.rb +20 -0
  318. data/lib/lanes/command/db.rb +33 -0
  319. data/lib/lanes/command/db.usage +1 -0
  320. data/lib/lanes/command/generate.rb +21 -0
  321. data/lib/lanes/command/generate_model.rb +105 -0
  322. data/lib/lanes/command/generate_model.usage +45 -0
  323. data/lib/lanes/command/generate_screen.rb +31 -0
  324. data/lib/lanes/command/generate_screen.usage +11 -0
  325. data/lib/lanes/command/generate_view.rb +22 -0
  326. data/lib/lanes/command/generate_view.usage +13 -0
  327. data/lib/lanes/command/model_attribute.rb +188 -0
  328. data/lib/lanes/command/named_command.rb +27 -0
  329. data/lib/lanes/command/server.rb +19 -0
  330. data/lib/lanes/command/server.usage +3 -0
  331. data/lib/lanes/command/templates/Gemfile +10 -0
  332. data/lib/lanes/{generators/app → command/templates}/Guardfile +0 -0
  333. data/lib/lanes/command/templates/Rakefile +2 -0
  334. data/lib/lanes/command/templates/client/Extension.coffee +5 -0
  335. data/lib/lanes/command/templates/client/components/.gitkeep +0 -0
  336. data/lib/lanes/command/templates/client/components/Component.coffee +1 -0
  337. data/lib/lanes/command/templates/client/data/Model.coffee +24 -0
  338. data/lib/lanes/command/templates/client/namespace-extension.js +17 -0
  339. data/lib/lanes/command/templates/client/screens/Screen.coffee +9 -0
  340. data/lib/lanes/command/templates/client/screens/index.js +5 -0
  341. data/lib/lanes/command/templates/client/screens/layout.html +3 -0
  342. data/lib/lanes/command/templates/client/screens/styles.scss +9 -0
  343. data/lib/lanes/command/templates/client/styles/styles.scss +1 -0
  344. data/lib/lanes/command/templates/client/views/.gitkeep +0 -0
  345. data/lib/lanes/command/templates/client/views/View.coffee +9 -0
  346. data/lib/lanes/command/templates/client/views/template.html +3 -0
  347. data/lib/lanes/{generators/app → command/templates}/config/database.yml +0 -0
  348. data/lib/lanes/command/templates/config/lanes.rb +7 -0
  349. data/lib/lanes/command/templates/config/routes.rb +2 -0
  350. data/lib/lanes/{generators/app → command/templates}/config.ru +1 -0
  351. data/lib/lanes/command/templates/db/create_table_migration.rb +19 -0
  352. data/lib/lanes/command/templates/gitignore +1 -0
  353. data/lib/lanes/command/templates/lib/namespace/extension.rb +13 -0
  354. data/lib/lanes/command/templates/lib/namespace/model.rb +7 -0
  355. data/lib/lanes/command/templates/lib/namespace/screen.rb +17 -0
  356. data/lib/lanes/command/templates/lib/namespace/version.rb +3 -0
  357. data/lib/lanes/command/templates/lib/namespace.rb +12 -0
  358. data/lib/lanes/command/templates/spec/client/data/ModelSpec.coffee +5 -0
  359. data/lib/lanes/command/templates/spec/client/views/ViewSpec.coffee +5 -0
  360. data/lib/lanes/command/templates/spec/fixtures/namespace/model.yml +16 -0
  361. data/lib/lanes/command/templates/spec/namespace/model_spec.rb +10 -0
  362. data/lib/lanes/command/templates/spec/spec_helper.rb +15 -0
  363. data/lib/lanes/command/update.rb +13 -0
  364. data/lib/lanes/command/update_model.rb +125 -0
  365. data/lib/lanes/command/update_model.usage +2 -0
  366. data/lib/lanes/command.rb +37 -0
  367. data/lib/lanes/components.rb +45 -0
  368. data/lib/lanes/concerns/set_attribute_data.rb +2 -2
  369. data/lib/lanes/configuration.rb +3 -3
  370. data/lib/lanes/db.rb +5 -39
  371. data/lib/lanes/extension.rb +64 -19
  372. data/lib/lanes/guard_tasks.rb +7 -5
  373. data/lib/lanes/rake_tasks.rb +47 -0
  374. data/lib/lanes/screens.rb +1 -48
  375. data/{spec → lib/lanes}/spec_helper.rb +0 -0
  376. data/lib/lanes/version.rb +1 -1
  377. data/lib/lanes.rb +1 -3
  378. data/npm-build/compile.coffee +1 -1
  379. data/npm-build/package.json +5 -5
  380. data/npm-build/template.js +13 -13
  381. data/spec/api/javascript_processor_spec.rb +1 -1
  382. data/spec/client/view/BaseSpec.coffee +166 -0
  383. data/spec/helpers/jasmine-jquery.js +813 -0
  384. data/spec/helpers/jasmine-matchers.js +1586 -0
  385. data/tasks/migrations.rake +1 -1
  386. data/views/index.erb +9 -13
  387. metadata +419 -268
  388. data/client/javascripts/component/ModalDialog.coffee +0 -44
  389. data/client/javascripts/component/SelectField.coffee +0 -43
  390. data/client/javascripts/component/TaggedField.coffee +0 -27
  391. data/client/javascripts/component/index.js +0 -5
  392. data/client/javascripts/data/Roles.coffee +0 -91
  393. data/client/javascripts/data/User.coffee +0 -70
  394. data/client/javascripts/extension/index.js +0 -6
  395. data/client/javascripts/extension/load.js.erb +0 -3
  396. data/client/javascripts/lanes-workspace.js +0 -1
  397. data/client/javascripts/lib/underscore.inflection.js +0 -210
  398. data/client/javascripts/plugins/index.js +0 -4
  399. data/client/javascripts/vendor/modern-stack.js +0 -14
  400. data/client/javascripts/vendor/packaged.js +0 -13769
  401. data/client/javascripts/view/Base.coffee +0 -231
  402. data/client/javascripts/view/Screen.coffee +0 -30
  403. data/client/javascripts/view/index.js +0 -10
  404. data/client/javascripts/workspace/LoginDialog.coffee +0 -33
  405. data/client/javascripts/workspace/login-dialog.html +0 -16
  406. data/client/screens/user-management/UserEditScreen.coffee +0 -21
  407. data/client/screens/user-management/UserManagement.coffee +0 -24
  408. data/client/screens/user-management/grid-popover-editor.html +0 -33
  409. data/client/screens/user-management/index.css +0 -4
  410. data/client/screens/user-management/user-management-styles.scss +0 -7
  411. data/client/screens/user-management/user-management.html +0 -8
  412. data/client/stylesheets/compoonents/modal-dialog.scss +0 -23
  413. data/client/stylesheets/lanes-workspace.scss +0 -17
  414. data/config/puma.rb +0 -7
  415. data/db/seed.rb +0 -37
  416. data/foo/Gemfile +0 -5
  417. data/foo/Guardfile +0 -13
  418. data/foo/foo/Gemfile +0 -5
  419. data/foo/foo/lib/foo.rb +0 -7
  420. data/foo/lib/foo/version.rb +0 -3
  421. data/foo/lib/foo.rb +0 -8
  422. data/lib/lanes/access/locked_fields.rb +0 -43
  423. data/lib/lanes/access/role.rb +0 -58
  424. data/lib/lanes/access/role_collection.rb +0 -75
  425. data/lib/lanes/access/roles/administrator.rb +0 -25
  426. data/lib/lanes/access/roles/support.rb +0 -13
  427. data/lib/lanes/access/user_maint_screen.rb +0 -32
  428. data/lib/lanes/access.rb +0 -50
  429. data/lib/lanes/api/asset_pipeline.rb +0 -59
  430. data/lib/lanes/api/authentication_helper.rb +0 -21
  431. data/lib/lanes/api/authentication_provider.rb +0 -45
  432. data/lib/lanes/api/default_routes.rb +0 -35
  433. data/lib/lanes/api/skr_templates.rb +0 -60
  434. data/lib/lanes/concerns/track_modifications.rb +0 -51
  435. data/lib/lanes/db/seed.rb +0 -27
  436. data/lib/lanes/generators/app/Gemfile +0 -5
  437. data/lib/lanes/generators/app/Rakefile +0 -9
  438. data/lib/lanes/generators/app/lib/main_class/version.rb +0 -3
  439. data/lib/lanes/generators/app/lib/main_class.rb +0 -8
  440. data/lib/lanes/generators/app.rb +0 -36
  441. data/lib/lanes/user.rb +0 -127
  442. data/spec/client/component/ChoicesInputSpec.coffee +0 -12
  443. data/spec/client/component/foo_spec.coffee +0 -4
  444. data/spec/client/support/jasmine.yml +0 -128
  445. data/spec/client/support/jasmine_helper.rb +0 -15
  446. data/spec/helpers/SpecHelper.js +0 -18
@@ -0,0 +1,1586 @@
1
+ /*
2
+ * Copyright © Jamie Mason, @fold_left,
3
+ * https://github.com/JamieMason
4
+ *
5
+ * Permission is hereby granted, free of charge, to any person
6
+ * obtaining a copy of this software and associated documentation files
7
+ * (the "Software"), to deal in the Software without restriction,
8
+ * including without limitation the rights to use, copy, modify, merge,
9
+ * publish, distribute, sublicense, and/or sell copies of the Software,
10
+ * and to permit persons to whom the Software is furnished to do so,
11
+ * subject to the following conditions:
12
+ *
13
+ * The above copyright notice and this permission notice shall be
14
+ * included in all copies or substantial portions of the Software.
15
+ *
16
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
20
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
21
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23
+ * SOFTWARE.
24
+ */
25
+
26
+ (function() {
27
+
28
+ var matchers = {};
29
+ var priv = {};
30
+
31
+ /**
32
+ * @inner
33
+ * @param {Object} object
34
+ * @param {Function} fn
35
+ */
36
+ priv.each = function(object, fn) {
37
+ for (var key in object) {
38
+ if (object.hasOwnProperty(key)) {
39
+ fn.call(this, object[key], key, object);
40
+ }
41
+ }
42
+ };
43
+
44
+ /**
45
+ * @inner
46
+ * @param {Object} object
47
+ * @param {Function} fn
48
+ * @param {*} memo
49
+ * @return {*} memo
50
+ */
51
+ priv.reduce = function(object, fn, memo) {
52
+ priv.each.call(this, object, function(el, ix, list) {
53
+ memo = fn(memo, el, ix, list);
54
+ });
55
+ return memo;
56
+ };
57
+
58
+ /**
59
+ * @inner
60
+ * @param {Array} array
61
+ * @param {Function} fn
62
+ * @return {Boolean}
63
+ */
64
+ priv.all = function(array, fn) {
65
+ var i;
66
+ var len = array.length;
67
+ for (i = 0; i < len; i++) {
68
+ if (fn.call(this, array[i], i, array) === false) {
69
+ return false;
70
+ }
71
+ }
72
+ return true;
73
+ };
74
+
75
+ /**
76
+ * @inner
77
+ * @param {String} matcherName
78
+ * @return {Boolean}
79
+ */
80
+ priv.expectAllMembers = function(matcherName) {
81
+ return priv.all.call(this, this.actual, function(item) {
82
+ return matchers[matcherName].call({
83
+ actual: item
84
+ });
85
+ });
86
+ };
87
+
88
+ /**
89
+ * Assert subject is of type
90
+ * @inner
91
+ * @param {*} subject
92
+ * @param {String} type
93
+ * @return {Boolean}
94
+ */
95
+ priv.is = function(subject, type) {
96
+ return Object.prototype.toString.call(subject) === '[object ' + type + ']';
97
+ };
98
+
99
+ /**
100
+ * Assert subject is an HTML Element with the given node type
101
+ * @inner
102
+ * @param {*} subject
103
+ * @param {String} type
104
+ * @return {Boolean}
105
+ */
106
+ priv.isHtmlElementOfType = function(subject, type) {
107
+ return subject && subject.nodeType === type;
108
+ };
109
+
110
+ /**
111
+ * Convert Array-like Object to true Array
112
+ * @inner
113
+ * @param {*} list
114
+ * @return {Array}
115
+ */
116
+ priv.toArray = function(list) {
117
+ return [].slice.call(list);
118
+ };
119
+
120
+ /**
121
+ * @inner
122
+ * @param {String} matcherName
123
+ * @param {String} memberName
124
+ * @param (*) ...
125
+ * @return {Boolean}
126
+ */
127
+ priv.assertMember = function( /* matcherName, memberName, ... */ ) {
128
+ var args = priv.toArray(arguments);
129
+ var matcherName = args.shift();
130
+ var memberName = args.shift();
131
+ return priv.is(this.actual, 'Object') && matchers[matcherName].apply({
132
+ actual: this.actual[memberName]
133
+ }, args);
134
+ };
135
+
136
+ /**
137
+ * @summary
138
+ * Format the failure message for member matchers such as toHaveString('surname').
139
+ *
140
+ * @inner
141
+ * @param {Object} util Provided by Jasmine.
142
+ * @param {String} name Name of the matcher, such as toBeString.
143
+ * @param {Array} args converted arguments.
144
+ * @param {Boolean} pass Whether the test passed.
145
+ * @param {*} actual The expected value.
146
+ * @return {String} The message to display on failure.
147
+ */
148
+ priv.formatFailMessage = function(util, name, args, pass, actual) {
149
+ if (name.search(/^toHave/) === -1) {
150
+ return util.buildFailureMessage.apply(null, [name, pass, actual].concat(args));
151
+ }
152
+ var memberName = args.shift();
153
+ return util.buildFailureMessage.apply(null, [name, pass, actual].concat(args))
154
+ .replace('Expected', 'Expected member "' + memberName + '" of')
155
+ .replace(' to have ', ' to be ');
156
+ };
157
+
158
+ /**
159
+ * @summary
160
+ * Convert Jasmine 1.0 matchers into the format introduced in Jasmine 2.0.
161
+ *
162
+ * @inner
163
+ * @param {Object} v1Matchers
164
+ * @return {Object} v2Matchers
165
+ */
166
+ priv.adaptMatchers = function(v1Matchers) {
167
+ return priv.reduce(v1Matchers, function(v2Matchers, matcher, name) {
168
+ v2Matchers[name] = function(util) {
169
+ return {
170
+ compare: function(actual /*, expected, ...*/ ) {
171
+ var args = priv.toArray(arguments).slice(1);
172
+ var pass = matcher.apply({
173
+ actual: actual
174
+ }, args);
175
+ return {
176
+ pass: pass,
177
+ message: priv.formatFailMessage(util, name, args, pass, actual)
178
+ };
179
+ }
180
+ };
181
+ };
182
+ return v2Matchers;
183
+ }, {});
184
+ };
185
+
186
+ /**
187
+ * @file Arrays
188
+ *
189
+ * @description
190
+ * See {@link http://git.io/jasmine-array-testing|Unit testing Arrays with Jasmine}.
191
+ */
192
+
193
+ /**
194
+ * @alias
195
+ * expect(array):toBeArray
196
+ *
197
+ * @summary
198
+ * Assert subject is a true Array, created in the parent document — those created and imported
199
+ * from within iframes or other windows will not match.
200
+ *
201
+ * @return {Boolean}
202
+ */
203
+ matchers.toBeArray = function() {
204
+ return this.actual instanceof Array;
205
+ };
206
+
207
+ /**
208
+ * @alias
209
+ * expect(array):toBeArrayOfSize
210
+ *
211
+ * @summary
212
+ * Assert subject is not only a true Array, but one with a specific number of members.
213
+ *
214
+ * @param {Number} size
215
+ * @return {Boolean}
216
+ */
217
+ matchers.toBeArrayOfSize = function(size) {
218
+ return priv.is(this.actual, 'Array') && this.actual.length === size;
219
+ };
220
+
221
+ /**
222
+ * @alias
223
+ * expect(array):toBeEmptyArray
224
+ *
225
+ * @summary
226
+ * Assert subject is not only a true Array, but one without any members.
227
+ *
228
+ * @return {Boolean}
229
+ */
230
+ matchers.toBeEmptyArray = function() {
231
+ return matchers.toBeArrayOfSize.call(this, 0);
232
+ };
233
+
234
+ /**
235
+ * @alias
236
+ * expect(array):toBeNonEmptyArray
237
+ *
238
+ * @summary
239
+ * Assert subject is not only a true Array, but one with at least one member.
240
+ *
241
+ * @return {Boolean}
242
+ */
243
+ matchers.toBeNonEmptyArray = function() {
244
+ return priv.is(this.actual, 'Array') && this.actual.length > 0;
245
+ };
246
+
247
+ /**
248
+ * @inner
249
+ * @param {String} toBeX
250
+ * @return {Function}
251
+ */
252
+ priv.createToBeArrayOfXsMatcher = function(toBeX) {
253
+ return function() {
254
+ return priv.is(this.actual, 'Array') && priv.expectAllMembers.call(this, toBeX);
255
+ };
256
+ };
257
+
258
+ /**
259
+ * @alias
260
+ * expect(array):toBeArrayOfObjects
261
+ *
262
+ * @summary
263
+ * Assert subject is an Array which is either empty or contains only Objects.
264
+ *
265
+ * @return {Boolean}
266
+ */
267
+ matchers.toBeArrayOfObjects = function() {
268
+ return priv.is(this.actual, 'Array') && priv.expectAllMembers.call(this, 'toBeObject');
269
+ };
270
+
271
+ /**
272
+ * @alias
273
+ * expect(array):toBeArrayOfStrings
274
+ *
275
+ * @summary
276
+ * Assert subject is an Array which is either empty or contains only Strings.
277
+ *
278
+ * @return {Boolean}
279
+ */
280
+ matchers.toBeArrayOfStrings = function() {
281
+ return priv.is(this.actual, 'Array') && priv.expectAllMembers.call(this, 'toBeString');
282
+ };
283
+
284
+ /**
285
+ * @alias
286
+ * expect(array):toBeArrayOfNumbers
287
+ *
288
+ * @summary
289
+ * Assert subject is an Array which is either empty or contains only Numbers.
290
+ *
291
+ * @return {Boolean}
292
+ */
293
+ matchers.toBeArrayOfNumbers = function() {
294
+ return priv.is(this.actual, 'Array') && priv.expectAllMembers.call(this, 'toBeNumber');
295
+ };
296
+
297
+ /**
298
+ * @alias
299
+ * expect(array):toBeArrayOfBooleans
300
+ *
301
+ * @summary
302
+ * Assert subject is an Array which is either empty or contains only Booleans.
303
+ *
304
+ * @return {Boolean}
305
+ */
306
+ matchers.toBeArrayOfBooleans = function() {
307
+ return priv.is(this.actual, 'Array') && priv.expectAllMembers.call(this, 'toBeBoolean');
308
+ };
309
+
310
+ /**
311
+ * @file Booleans
312
+ *
313
+ * @description
314
+ * See {@link http://git.io/jasmine-boolean-testing|Unit testing Booleans with Jasmine}.
315
+ */
316
+
317
+ /**
318
+ * @alias
319
+ * expect(boolean):toBeBoolean
320
+ *
321
+ * @summary
322
+ * Assert subject is not only truthy or falsy, but an actual Boolean.
323
+ *
324
+ * @return {Boolean}
325
+ */
326
+ matchers.toBeBoolean = function() {
327
+ return matchers.toBeTrue.call(this) || matchers.toBeFalse.call(this);
328
+ };
329
+
330
+ /**
331
+ * @alias
332
+ * expect(boolean):toBeTrue
333
+ *
334
+ * @summary
335
+ * Assert subject is not only truthy, but an actual Boolean true.
336
+ *
337
+ * @return {Boolean}
338
+ */
339
+ matchers.toBeTrue = function() {
340
+ return this.actual === true || this.actual instanceof Boolean && this.actual.valueOf() === true;
341
+ };
342
+
343
+ /**
344
+ * @alias
345
+ * expect(boolean):toBeFalse
346
+ *
347
+ * @summary
348
+ * Assert subject is not only falsy, but an actual Boolean false.
349
+ *
350
+ * @return {Boolean}
351
+ */
352
+ matchers.toBeFalse = function() {
353
+ return this.actual === false || this.actual instanceof Boolean && this.actual.valueOf() === false;
354
+ };
355
+
356
+ /**
357
+ * @file Browser
358
+ *
359
+ * @description
360
+ * See {@link http://git.io/jasmine-browser-testing|Unit testing Browsers with Jasmine}.
361
+ */
362
+
363
+ /**
364
+ * @alias
365
+ * expect(window):toBeWindow
366
+ *
367
+ * @summary
368
+ * Assert subject is a browser Window global, whether that be the parent window or those
369
+ * created within iframes or other windows.
370
+ *
371
+ * @return {Boolean}
372
+ */
373
+ matchers.toBeWindow = function() {
374
+ return this.actual && typeof this.actual === 'object' && this.actual.window === this.actual;
375
+ };
376
+
377
+ /**
378
+ * @alias
379
+ * expect(document):toBeDocument
380
+ *
381
+ * @summary
382
+ * Assert subject is a browser Window global, whether that be the parent window or those
383
+ * created within iframes or other windows.
384
+ *
385
+ * @return {Boolean}
386
+ */
387
+ matchers.toBeDocument = function() {
388
+ return this.actual && typeof this.actual === 'object' && this.actual instanceof window.HTMLDocument;
389
+ };
390
+
391
+ /**
392
+ * @alias
393
+ * expect(htmlElement):toBeHtmlNode
394
+ *
395
+ * @summary
396
+ * Assert subject is an HTML Element.
397
+ *
398
+ * @return {Boolean}
399
+ */
400
+ matchers.toBeHtmlNode = function() {
401
+ return priv.isHtmlElementOfType(this.actual, 1);
402
+ };
403
+
404
+ /**
405
+ * @alias
406
+ * expect(htmlElement):toBeHtmlTextNode
407
+ *
408
+ * @summary
409
+ * Assert subject is an HTML Text Element.
410
+ *
411
+ * @return {Boolean}
412
+ */
413
+ matchers.toBeHtmlTextNode = function() {
414
+ return priv.isHtmlElementOfType(this.actual, 3);
415
+ };
416
+
417
+ /**
418
+ * @alias
419
+ * expect(htmlElement):toBeHtmlCommentNode
420
+ *
421
+ * @summary
422
+ * Assert subject is an HTML Comment Element.
423
+ *
424
+ * @return {Boolean}
425
+ */
426
+ matchers.toBeHtmlCommentNode = function() {
427
+ return priv.isHtmlElementOfType(this.actual, 8);
428
+ };
429
+
430
+ /**
431
+ * @file Dates
432
+ *
433
+ * @description
434
+ * See {@link http://git.io/jasmine-date-testing|Unit testing Dates with Jasmine}.
435
+ */
436
+
437
+ /**
438
+ * @alias
439
+ * expect(date):toBeDate
440
+ *
441
+ * @summary
442
+ * Assert subject is a true Date, created in the parent document — those created and imported
443
+ * from within iframes or other windows will not match.
444
+ *
445
+ * @return {Boolean}
446
+ */
447
+ matchers.toBeDate = function() {
448
+ return this.actual instanceof Date;
449
+ };
450
+
451
+ /**
452
+ * @alias
453
+ * expect(string):toBeIso8601
454
+ *
455
+ * @summary
456
+ * Assert subject is a Date String conforming to the ISO 8601 standard.
457
+ *
458
+ * @return {Boolean}
459
+ */
460
+ matchers.toBeIso8601 = function() {
461
+ return matchers.toBeString.call(this)
462
+ && this.actual.length >= 10
463
+ && new Date(this.actual).toString() !== 'Invalid Date'
464
+ && new Date(this.actual).toISOString().slice(0, this.actual.length) === this.actual;
465
+ };
466
+
467
+ /**
468
+ * @alias
469
+ * expect(date):toBeBefore
470
+ *
471
+ * @summary
472
+ * Assert subject is a Date occurring before another Date.
473
+ *
474
+ * @param {Date} date
475
+ * @return {Boolean}
476
+ */
477
+ matchers.toBeBefore = function(date) {
478
+ return matchers.toBeDate.call(this) && matchers.toBeDate.call({ actual: date }) && this.actual.getTime() < date.getTime();
479
+ };
480
+
481
+ /**
482
+ * @alias
483
+ * expect(date):toBeAfter
484
+ *
485
+ * @summary
486
+ * Assert subject is a Date occurring after another Date.
487
+ *
488
+ * @param {Date} date
489
+ * @return {Boolean}
490
+ */
491
+ matchers.toBeAfter = function(date) {
492
+ return matchers.toBeBefore.call({ actual: date }, this.actual);
493
+ };
494
+
495
+ /**
496
+ * @file Errors
497
+ *
498
+ * @description
499
+ * See {@link http://git.io/jasmine-error-testing|Unit testing Errors with Jasmine}.
500
+ */
501
+
502
+ /**
503
+ * @alias
504
+ * expect(function):toThrowError
505
+ *
506
+ * @summary
507
+ * Asserts subject throws an Error of any type.
508
+ *
509
+ * @return {Boolean}
510
+ */
511
+ matchers.toThrowError = function() {
512
+ var threwError = false;
513
+ try {
514
+ this.actual();
515
+ } catch (e) {
516
+ threwError = true;
517
+ }
518
+ return threwError;
519
+ };
520
+
521
+ /**
522
+ * @alias
523
+ * expect(function):toThrowErrorOfType
524
+ *
525
+ * @summary
526
+ * Asserts subject throws an Error of a specific type, such as "TypeError".
527
+ *
528
+ * @param {String} type
529
+ * @return {Boolean}
530
+ */
531
+ matchers.toThrowErrorOfType = function(type) {
532
+ var threwErrorOfType = false;
533
+ try {
534
+ this.actual();
535
+ } catch (e) {
536
+ threwErrorOfType = (e.name === type);
537
+ }
538
+ return threwErrorOfType;
539
+ };
540
+
541
+ /**
542
+ * @file Numbers
543
+ *
544
+ * @description
545
+ * See {@link http://git.io/jasmine-number-testing|Unit testing Numbers with Jasmine}.
546
+ */
547
+
548
+ /**
549
+ * @alias
550
+ * expect(number):toBeNumber
551
+ *
552
+ * @summary
553
+ * Assert subject is not only calculable, but an actual Number
554
+ *
555
+ * @return {Boolean}
556
+ */
557
+ matchers.toBeNumber = function() {
558
+ return !isNaN(parseFloat(this.actual)) && !priv.is(this.actual, 'String');
559
+ };
560
+
561
+ /**
562
+ * @alias
563
+ * expect(number):toBeEvenNumber
564
+ *
565
+ * @summary
566
+ * Assert subject is an even Number.
567
+ *
568
+ * @return {Boolean}
569
+ */
570
+ matchers.toBeEvenNumber = function() {
571
+ return matchers.toBeNumber.call(this) && this.actual % 2 === 0;
572
+ };
573
+
574
+ /**
575
+ * @alias
576
+ * expect(number):toBeOddNumber
577
+ *
578
+ * @summary
579
+ * Assert subject is an odd Number.
580
+ *
581
+ * @return {Boolean}
582
+ */
583
+ matchers.toBeOddNumber = function() {
584
+ return matchers.toBeNumber.call(this) && this.actual % 2 !== 0;
585
+ };
586
+
587
+ /**
588
+ * @alias
589
+ * expect(mixed):toBeCalculable
590
+ *
591
+ * @summary
592
+ * Assert subject can be used in Mathemetic calculations, despite not being an actual Number.
593
+ *
594
+ * @example
595
+ * // If all strings are numeric, JavaScript will cast them all as expect(number):
596
+ * "1" * "2" === 2 (pass)
597
+ *
598
+ * @example
599
+ * // If any string is not numeric, JavaScript will cast them all as Strings.
600
+ * "wut?" * 2 === NaN (fail)
601
+ *
602
+ * @return {Boolean}
603
+ */
604
+ matchers.toBeCalculable = function() {
605
+ return !isNaN(this.actual * 2);
606
+ };
607
+
608
+ /**
609
+ * @alias
610
+ * expect(number):toBeWithinRange
611
+ *
612
+ * @summary
613
+ * Assert value falls on or between floor and ceiling.
614
+ *
615
+ * @param {Number} floor
616
+ * @param {Number} ceiling
617
+ * @return {Boolean}
618
+ */
619
+ matchers.toBeWithinRange = function(floor, ceiling) {
620
+ return matchers.toBeNumber.call(this) && this.actual >= floor && this.actual <= ceiling;
621
+ };
622
+
623
+ /**
624
+ * @alias
625
+ * expect(number):toBeWholeNumber
626
+ *
627
+ * @summary
628
+ * Assert value is a number with no decimal places.
629
+ *
630
+ * @return {Boolean}
631
+ */
632
+ matchers.toBeWholeNumber = function() {
633
+ return matchers.toBeNumber.call(this) && (this.actual === 0 || this.actual % 1 === 0);
634
+ };
635
+
636
+ /**
637
+ * @file Objects
638
+ *
639
+ * @description
640
+ * See {@link http://git.io/jasmine-object-testing|Unit testing Objects with Jasmine}.
641
+ */
642
+
643
+ /**
644
+ * @inner
645
+ *
646
+ * @summary
647
+ * Report how many instance members the given Object has.
648
+ *
649
+ * @param {Object} object
650
+ * @return {Number}
651
+ */
652
+ priv.countMembers = function(object) {
653
+ return priv.reduce(object, function(memo, el, ix) {
654
+ return memo + 1;
655
+ }, 0);
656
+ };
657
+
658
+ /**
659
+ * @alias
660
+ * expect(object):toBeObject
661
+ *
662
+ * @summary
663
+ * Assert subject is a true Object, created in the parent document — those created and imported
664
+ * from within iframes or other windows will not match.
665
+ *
666
+ * @return {Boolean}
667
+ */
668
+ matchers.toBeObject = function() {
669
+ return this.actual instanceof Object;
670
+ };
671
+
672
+ /**
673
+ * @alias
674
+ * expect(object):toBeEmptyObject
675
+ *
676
+ * @summary
677
+ * Assert subject is a true Object with no instance members.
678
+ *
679
+ * @return {Boolean}
680
+ */
681
+ matchers.toBeEmptyObject = function() {
682
+ return priv.is(this.actual, 'Object') && priv.countMembers(this.actual) === 0;
683
+ };
684
+
685
+ /**
686
+ * @alias
687
+ * expect(object):toBeNonEmptyObject
688
+ *
689
+ * @summary
690
+ * Assert subject is a true Object with at least one instance member.
691
+ *
692
+ * @return {Boolean}
693
+ */
694
+ matchers.toBeNonEmptyObject = function() {
695
+ return priv.is(this.actual, 'Object') && priv.countMembers(this.actual) > 0;
696
+ };
697
+
698
+ /**
699
+ * @alias
700
+ * expect(object):toImplement
701
+ *
702
+ * @summary
703
+ * Assert subject is a true Object which features at least the same keys as `other` (regardless of
704
+ * whether it also has other members).
705
+ *
706
+ * @param {Object} other
707
+ * @return {Boolean}
708
+ */
709
+ matchers.toImplement = function(other) {
710
+ if (!priv.is(this.actual, 'Object') || !priv.is(other, 'Object')) {
711
+ return false;
712
+ }
713
+ for (var key in other) {
714
+ if (key in this.actual) {
715
+ continue;
716
+ }
717
+ return false;
718
+ }
719
+ return true;
720
+ };
721
+
722
+ /**
723
+ * @alias
724
+ * expect(function):toBeFunction
725
+ *
726
+ * @summary
727
+ * Assert subject is a true Function, created in the parent document — those created and imported
728
+ * from within iframes or other windows will not match.
729
+ *
730
+ * @return {Boolean}
731
+ */
732
+ matchers.toBeFunction = function() {
733
+ return this.actual instanceof Function;
734
+ };
735
+
736
+ /**
737
+ * @file Strings
738
+ *
739
+ * @description
740
+ * See {@link http://git.io/jasmine-string-testing|Unit testing Strings with Jasmine}.
741
+ */
742
+
743
+ /**
744
+ * @alias
745
+ * expect(string):toBeString
746
+ *
747
+ * @summary
748
+ * Assert subject is a String.
749
+ *
750
+ * @return {Boolean}
751
+ */
752
+ matchers.toBeString = function() {
753
+ return priv.is(this.actual, 'String');
754
+ };
755
+
756
+ /**
757
+ * @alias
758
+ * expect(string):toBeEmptyString
759
+ *
760
+ * @summary
761
+ * Assert subject is a String of length 0.
762
+ *
763
+ * @return {Boolean}
764
+ */
765
+ matchers.toBeEmptyString = function() {
766
+ return this.actual === '';
767
+ };
768
+
769
+ /**
770
+ * @alias
771
+ * expect(string):toBeNonEmptyString
772
+ *
773
+ * @summary
774
+ * Assert subject is a String with at least 1 character.
775
+ *
776
+ * @return {Boolean}
777
+ */
778
+ matchers.toBeNonEmptyString = function() {
779
+ return matchers.toBeString.call(this) && this.actual.length > 0;
780
+ };
781
+
782
+ /**
783
+ * @alias
784
+ * expect(string):toBeHtmlString
785
+ *
786
+ * @summary
787
+ * Assert subject is string containing HTML Markup.
788
+ *
789
+ * @return {Boolean}
790
+ */
791
+ matchers.toBeHtmlString = function() {
792
+ // < start with opening tag "<"
793
+ // ( start group 1
794
+ // "[^"]*" allow string in "double quotes"
795
+ // | OR
796
+ // '[^']*' allow string in "single quotes"
797
+ // | OR
798
+ // [^'">] cant contains one single quotes, double quotes and ">"
799
+ // ) end group 1
800
+ // * 0 or more
801
+ // > end with closing tag ">"
802
+ return matchers.toBeString.call(this) && this.actual.search(/<("[^"]*"|'[^']*'|[^'">])*>/) !== -1;
803
+ };
804
+
805
+ /**
806
+ * @alias
807
+ * expect(string):toBeJsonString
808
+ *
809
+ * @summary
810
+ * Assert subject is string containing parseable JSON.
811
+ *
812
+ * @return {Boolean}
813
+ */
814
+ matchers.toBeJsonString = function() {
815
+ var isParseable;
816
+ var json;
817
+ try {
818
+ json = JSON.parse(this.actual);
819
+ } catch (e) {
820
+ isParseable = false;
821
+ }
822
+ return isParseable !== false && json !== null;
823
+ };
824
+
825
+ /**
826
+ * @alias
827
+ * expect(string):toBeWhitespace
828
+ *
829
+ * @summary
830
+ * Assert subject is a String containing nothing but whitespace.
831
+ *
832
+ * @return {Boolean}
833
+ */
834
+ matchers.toBeWhitespace = function() {
835
+ return matchers.toBeString.call(this) && this.actual.search(/\S/) === -1;
836
+ };
837
+
838
+ /**
839
+ * @alias
840
+ * expect(string):toStartWith
841
+ *
842
+ * @summary
843
+ * Assert subject is a String whose first characters match our expected string.
844
+ *
845
+ * @param {String} expected
846
+ * @return {Boolean}
847
+ */
848
+ matchers.toStartWith = function(expected) {
849
+ if (!matchers.toBeNonEmptyString.call(this) || !matchers.toBeNonEmptyString.call({
850
+ actual: expected
851
+ })) {
852
+ return false;
853
+ }
854
+ return this.actual.slice(0, expected.length) === expected;
855
+ };
856
+
857
+ /**
858
+ * @alias
859
+ * expect(string):toEndWith
860
+ *
861
+ * @summary
862
+ * Assert subject is a String whose last characters match our expected string.
863
+ *
864
+ * @param {String} expected
865
+ * @return {Boolean}
866
+ */
867
+ matchers.toEndWith = function(expected) {
868
+ if (!matchers.toBeNonEmptyString.call(this) || !matchers.toBeNonEmptyString.call({
869
+ actual: expected
870
+ })) {
871
+ return false;
872
+ }
873
+ return this.actual.slice(this.actual.length - expected.length, this.actual.length) === expected;
874
+ };
875
+
876
+ /**
877
+ * @alias
878
+ * expect(string):toBeLongerThan
879
+ *
880
+ * @summary
881
+ * Assert subject is a String whose length is greater than our other string.
882
+ *
883
+ * @param {String} other
884
+ * @return {Boolean}
885
+ */
886
+ matchers.toBeLongerThan = function(other) {
887
+ return matchers.toBeString.call(this) && matchers.toBeString.call({
888
+ actual: other
889
+ }) && this.actual.length > other.length;
890
+ };
891
+
892
+ /**
893
+ * @alias
894
+ * expect(string):toBeShorterThan
895
+ *
896
+ * @summary
897
+ * Assert subject is a String whose length is greater than our other string.
898
+ *
899
+ * @param {String} other
900
+ * @return {Boolean}
901
+ */
902
+ matchers.toBeShorterThan = function(other) {
903
+ return matchers.toBeString.call(this) && matchers.toBeString.call({
904
+ actual: other
905
+ }) && this.actual.length < other.length;
906
+ };
907
+
908
+ /**
909
+ * @alias
910
+ * expect(string):toBeSameLengthAs
911
+ *
912
+ * @summary
913
+ * Assert subject is a String whose length is equal to our other string.
914
+ *
915
+ * @param {String} other
916
+ * @return {Boolean}
917
+ */
918
+ matchers.toBeSameLengthAs = function(other) {
919
+ return matchers.toBeString.call(this) && matchers.toBeString.call({
920
+ actual: other
921
+ }) && this.actual.length === other.length;
922
+ };
923
+
924
+ /**
925
+ * ArrayMembers
926
+ */
927
+
928
+ /**
929
+ * @alias
930
+ * expect(object):toHaveArray
931
+ *
932
+ * @summary
933
+ * .
934
+ *
935
+ * @description
936
+ * See {@link http://git.io/jasmine-array-testing|Unit testing Arrays with Jasmine}.
937
+ *
938
+ * @param {String} memberName
939
+ * @return {Boolean}
940
+ */
941
+ matchers.toHaveArray = function(memberName) {
942
+ return priv.assertMember.call(this, 'toBeArray', memberName);
943
+ };
944
+
945
+ /**
946
+ * @alias
947
+ * expect(object):toHaveArrayOfBooleans
948
+ *
949
+ * @summary
950
+ * .
951
+ *
952
+ * @description
953
+ * See {@link http://git.io/jasmine-array-testing|Unit testing Arrays with Jasmine}.
954
+ *
955
+ * @param {String} memberName
956
+ * @return {Boolean}
957
+ */
958
+ matchers.toHaveArrayOfBooleans = function(memberName) {
959
+ return priv.assertMember.call(this, 'toBeArrayOfBooleans', memberName);
960
+ };
961
+
962
+ /**
963
+ * @alias
964
+ * expect(object):toHaveArrayOfNumbers
965
+ *
966
+ * @summary
967
+ * .
968
+ *
969
+ * @description
970
+ * See {@link http://git.io/jasmine-array-testing|Unit testing Arrays with Jasmine}.
971
+ *
972
+ * @param {String} memberName
973
+ * @return {Boolean}
974
+ */
975
+ matchers.toHaveArrayOfNumbers = function(memberName) {
976
+ return priv.assertMember.call(this, 'toBeArrayOfNumbers', memberName);
977
+ };
978
+
979
+ /**
980
+ * @alias
981
+ * expect(object):toHaveArrayOfObjects
982
+ *
983
+ * @summary
984
+ * .
985
+ *
986
+ * @description
987
+ * See {@link http://git.io/jasmine-array-testing|Unit testing Arrays with Jasmine}.
988
+ *
989
+ * @param {String} memberName
990
+ * @return {Boolean}
991
+ */
992
+ matchers.toHaveArrayOfObjects = function(memberName) {
993
+ return priv.assertMember.call(this, 'toBeArrayOfObjects', memberName);
994
+ };
995
+
996
+ /**
997
+ * @alias
998
+ * expect(object):toHaveArrayOfSize
999
+ *
1000
+ * @summary
1001
+ * .
1002
+ *
1003
+ * @description
1004
+ * See {@link http://git.io/jasmine-array-testing|Unit testing Arrays with Jasmine}.
1005
+ *
1006
+ * @param {String} memberName
1007
+ * @param {Number} size
1008
+ * @return {Boolean}
1009
+ */
1010
+ matchers.toHaveArrayOfSize = function(memberName, size) {
1011
+ return priv.assertMember.call(this, 'toBeArrayOfSize', memberName, size);
1012
+ };
1013
+
1014
+ /**
1015
+ * @alias
1016
+ * expect(object):toHaveNonEmptyArray
1017
+ *
1018
+ * @summary
1019
+ * .
1020
+ *
1021
+ * @description
1022
+ * See {@link http://git.io/jasmine-array-testing|Unit testing Arrays with Jasmine}.
1023
+ *
1024
+ * @param {String} memberName
1025
+ * @return {Boolean}
1026
+ */
1027
+ matchers.toHaveNonEmptyArray = function(memberName) {
1028
+ return priv.assertMember.call(this, 'toBeNonEmptyArray', memberName);
1029
+ };
1030
+
1031
+ /**
1032
+ * @alias
1033
+ * expect(object):toHaveEmptyArray
1034
+ *
1035
+ * @summary
1036
+ * .
1037
+ *
1038
+ * @description
1039
+ * See {@link http://git.io/jasmine-array-testing|Unit testing Arrays with Jasmine}.
1040
+ *
1041
+ * @param {String} memberName
1042
+ * @return {Boolean}
1043
+ */
1044
+ matchers.toHaveEmptyArray = function(memberName) {
1045
+ return priv.assertMember.call(this, 'toBeEmptyArray', memberName);
1046
+ };
1047
+
1048
+ /**
1049
+ * @alias
1050
+ * expect(object):toHaveArrayOfStrings
1051
+ *
1052
+ * @summary
1053
+ * .
1054
+ *
1055
+ * @description
1056
+ * See {@link http://git.io/jasmine-array-testing|Unit testing Arrays with Jasmine}.
1057
+ *
1058
+ * @param {String} memberName
1059
+ * @return {Boolean}
1060
+ */
1061
+ matchers.toHaveArrayOfStrings = function(memberName) {
1062
+ return priv.assertMember.call(this, 'toBeArrayOfStrings', memberName);
1063
+ };
1064
+
1065
+ /**
1066
+ * BooleanMembers
1067
+ */
1068
+
1069
+ /**
1070
+ * @alias
1071
+ * expect(object):toHaveBoolean
1072
+ *
1073
+ * @summary
1074
+ * .
1075
+ *
1076
+ * @description
1077
+ * See {@link http://git.io/jasmine-boolean-testing|Unit testing Booleans with Jasmine}.
1078
+ *
1079
+ * @param {String} memberName
1080
+ * @return {Boolean}
1081
+ */
1082
+ matchers.toHaveBoolean = function(memberName) {
1083
+ return priv.assertMember.call(this, 'toBeBoolean', memberName);
1084
+ };
1085
+
1086
+ /**
1087
+ * @alias
1088
+ * expect(object):toHaveFalse
1089
+ *
1090
+ * @summary
1091
+ * .
1092
+ *
1093
+ * @description
1094
+ * See {@link http://git.io/jasmine-boolean-testing|Unit testing Booleans with Jasmine}.
1095
+ *
1096
+ * @param {String} memberName
1097
+ * @return {Boolean}
1098
+ */
1099
+ matchers.toHaveFalse = function(memberName) {
1100
+ return priv.assertMember.call(this, 'toBeFalse', memberName);
1101
+ };
1102
+
1103
+ /**
1104
+ * @alias
1105
+ * expect(object):toHaveTrue
1106
+ *
1107
+ * @summary
1108
+ * .
1109
+ *
1110
+ * @description
1111
+ * See {@link http://git.io/jasmine-boolean-testing|Unit testing Booleans with Jasmine}.
1112
+ *
1113
+ * @param {String} memberName
1114
+ * @return {Boolean}
1115
+ */
1116
+ matchers.toHaveTrue = function(memberName) {
1117
+ return priv.assertMember.call(this, 'toBeTrue', memberName);
1118
+ };
1119
+
1120
+ /**
1121
+ * BrowserMembers
1122
+ */
1123
+
1124
+ /**
1125
+ * @alias
1126
+ * expect(object):toHaveHtmlNode
1127
+ *
1128
+ * @summary
1129
+ * Assert subject is a true Object containing a property at memberName which is an HTML Element.
1130
+ *
1131
+ * @description
1132
+ * See {@link http://git.io/jasmine-browser-testing|Unit testing Browsers with Jasmine}.
1133
+ *
1134
+ * @param {Boolean} memberName
1135
+ * @return {Boolean}
1136
+ */
1137
+ matchers.toHaveHtmlNode = function(memberName) {
1138
+ return priv.assertMember.call(this, 'toBeHtmlNode', memberName);
1139
+ };
1140
+
1141
+ /**
1142
+ * DateMembers
1143
+ */
1144
+
1145
+ /**
1146
+ * @alias
1147
+ * expect(object):toHaveDate
1148
+ *
1149
+ * @summary
1150
+ * .
1151
+ *
1152
+ * @description
1153
+ * See {@link http://git.io/jasmine-date-testing|Unit testing Dates with Jasmine}.
1154
+ *
1155
+ * @param {String} memberName
1156
+ * @return {Boolean}
1157
+ */
1158
+ matchers.toHaveDate = function(memberName) {
1159
+ return priv.assertMember.call(this, 'toBeDate', memberName);
1160
+ };
1161
+
1162
+ /**
1163
+ * @alias
1164
+ * expect(object):toHaveDateAfter
1165
+ *
1166
+ * @summary
1167
+ * .
1168
+ *
1169
+ * @description
1170
+ * See {@link http://git.io/jasmine-bdate-testing|Unit testing Dates with Jasmine}.
1171
+ *
1172
+ * @param {String} memberName
1173
+ * @param {Date} date
1174
+ * @return {Boolean}
1175
+ */
1176
+ matchers.toHaveDateAfter = function(memberName, date) {
1177
+ return priv.assertMember.call(this, 'toBeDateAfter', memberName, date);
1178
+ };
1179
+
1180
+ /**
1181
+ * @alias
1182
+ * expect(object):toHaveDateBefore
1183
+ *
1184
+ * @summary
1185
+ * .
1186
+ *
1187
+ * @description
1188
+ * See {@link http://git.io/jasmine-browser-date|Unit testing Browsers with Dates}.
1189
+ *
1190
+ * @param {String} memberName
1191
+ * @param {Date} date
1192
+ * @return {Boolean}
1193
+ */
1194
+ matchers.toHaveDateBefore = function(memberName, date) {
1195
+ return priv.assertMember.call(this, 'toBeDateBefore', memberName, date);
1196
+ };
1197
+
1198
+ /**
1199
+ * @alias
1200
+ * expect(object):toHaveIso8601
1201
+ *
1202
+ * @summary
1203
+ * .
1204
+ *
1205
+ * @description
1206
+ * See {@link http://git.io/jasmine-date-testing|Unit testing Dates with Jasmine}.
1207
+ *
1208
+ * @param {String} memberName
1209
+ * @return {Boolean}
1210
+ */
1211
+ matchers.toHaveIso8601 = function(memberName) {
1212
+ return priv.assertMember.call(this, 'toBeIso8601', memberName);
1213
+ };
1214
+
1215
+ /**
1216
+ * NumberMembers
1217
+ */
1218
+
1219
+ /**
1220
+ * @alias
1221
+ * expect(object):toHaveNumber
1222
+ *
1223
+ * @summary
1224
+ * .
1225
+ *
1226
+ * @description
1227
+ * See {@link http://git.io/jasmine-number-testing|Unit testing Numbers with Jasmine}.
1228
+ *
1229
+ * @param {String} memberName
1230
+ * @return {Boolean}
1231
+ */
1232
+ matchers.toHaveNumber = function(memberName) {
1233
+ return priv.assertMember.call(this, 'toBeNumber', memberName);
1234
+ };
1235
+
1236
+ /**
1237
+ * @alias
1238
+ * expect(object):toHaveNumberWithinRange
1239
+ *
1240
+ * @summary
1241
+ * .
1242
+ *
1243
+ * @description
1244
+ * See {@link http://git.io/jasmine-number-testing|Unit testing Numbers with Jasmine}.
1245
+ *
1246
+ * @param {String} memberName
1247
+ * @param {Number} floor
1248
+ * @param {Number} ceiling
1249
+ * @return {Boolean}
1250
+ */
1251
+ matchers.toHaveNumberWithinRange = function(memberName, floor, ceiling) {
1252
+ return priv.assertMember.call(this, 'toBeWithinRange', memberName, floor, ceiling);
1253
+ };
1254
+
1255
+ /**
1256
+ * @alias
1257
+ * expect(object):toHaveCalculable
1258
+ *
1259
+ * @summary
1260
+ * .
1261
+ *
1262
+ * @description
1263
+ * See {@link http://git.io/jasmine-number-testing|Unit testing Numbers with Jasmine}.
1264
+ *
1265
+ * @param {String} memberName
1266
+ * @return {Boolean}
1267
+ */
1268
+ matchers.toHaveCalculable = function(memberName) {
1269
+ return priv.assertMember.call(this, 'toBeCalculable', memberName);
1270
+ };
1271
+
1272
+ /**
1273
+ * @alias
1274
+ * expect(object):toHaveEvenNumber
1275
+ *
1276
+ * @summary
1277
+ * .
1278
+ *
1279
+ * @description
1280
+ * See {@link http://git.io/jasmine-number-testing|Unit testing Numbers with Jasmine}.
1281
+ *
1282
+ * @param {String} memberName
1283
+ * @return {Boolean}
1284
+ */
1285
+ matchers.toHaveEvenNumber = function(memberName) {
1286
+ return priv.assertMember.call(this, 'toBeEvenNumber', memberName);
1287
+ };
1288
+
1289
+ /**
1290
+ * @alias
1291
+ * expect(object):toHaveOddNumber
1292
+ *
1293
+ * @summary
1294
+ * .
1295
+ *
1296
+ * @description
1297
+ * See {@link http://git.io/jasmine-number-testing|Unit testing Numbers with Jasmine}.
1298
+ *
1299
+ * @param {String} memberName
1300
+ * @return {Boolean}
1301
+ */
1302
+ matchers.toHaveOddNumber = function(memberName) {
1303
+ return priv.assertMember.call(this, 'toBeOddNumber', memberName);
1304
+ };
1305
+
1306
+ /**
1307
+ * @alias
1308
+ * expect(object):toHaveWholeNumber
1309
+ *
1310
+ * @summary
1311
+ * .
1312
+ *
1313
+ * @description
1314
+ * See {@link http://git.io/jasmine-number-testing|Unit testing Numbers with Jasmine}.
1315
+ *
1316
+ * @param {String} memberName
1317
+ * @return {Boolean}
1318
+ */
1319
+ matchers.toHaveWholeNumber = function(memberName) {
1320
+ return priv.assertMember.call(this, 'toBeWholeNumber', memberName);
1321
+ };
1322
+
1323
+ /**
1324
+ * ObjectMembers
1325
+ */
1326
+
1327
+ /**
1328
+ * @alias
1329
+ * expect(object):toHaveMethod
1330
+ *
1331
+ * @summary
1332
+ * Assert subject is a true Object containing a property at memberName which is a Function.
1333
+ *
1334
+ * @description
1335
+ * See {@link http://git.io/jasmine-object-testing|Unit testing Objects with Jasmine}.
1336
+ *
1337
+ * @param {Boolean} memberName
1338
+ * @return {Boolean}
1339
+ */
1340
+ matchers.toHaveMethod = function(memberName) {
1341
+ return priv.assertMember.call(this, 'toBeFunction', memberName);
1342
+ };
1343
+
1344
+ /**
1345
+ * @alias
1346
+ * expect(object):toHaveObject
1347
+ *
1348
+ * @summary
1349
+ * Assert subject is a true Object containing a property at memberName which is a true Object.
1350
+ *
1351
+ * @description
1352
+ * See {@link http://git.io/jasmine-object-testing|Unit testing Objects with Jasmine}.
1353
+ *
1354
+ * @param {Boolean} memberName
1355
+ * @return {Boolean}
1356
+ */
1357
+ matchers.toHaveObject = function(memberName) {
1358
+ return priv.assertMember.call(this, 'toBeObject', memberName);
1359
+ };
1360
+
1361
+ /**
1362
+ * @alias
1363
+ * expect(object):toHaveEmptyObject
1364
+ *
1365
+ * @summary
1366
+ * Assert subject is a true Object containing a property at memberName which is a true Object with
1367
+ * no instance members.
1368
+ *
1369
+ * @description
1370
+ * See {@link http://git.io/jasmine-object-testing|Unit testing Objects with Jasmine}.
1371
+ *
1372
+ * @param {Boolean} memberName
1373
+ * @return {Boolean}
1374
+ */
1375
+ matchers.toHaveEmptyObject = function(memberName) {
1376
+ return priv.assertMember.call(this, 'toBeEmptyObject', memberName);
1377
+ };
1378
+
1379
+ /**
1380
+ * @alias
1381
+ * expect(object):toHaveNonEmptyObject
1382
+ *
1383
+ * @summary
1384
+ * Assert subject is a true Object containing a property at memberName which is a true Object with
1385
+ * at least one instance member.
1386
+ *
1387
+ * @description
1388
+ * See {@link http://git.io/jasmine-object-testing|Unit testing Objects with Jasmine}.
1389
+ *
1390
+ * @param {Boolean} memberName
1391
+ * @return {Boolean}
1392
+ */
1393
+ matchers.toHaveNonEmptyObject = function(memberName) {
1394
+ return priv.assertMember.call(this, 'toBeNonEmptyObject', memberName);
1395
+ };
1396
+
1397
+ /**
1398
+ * @alias
1399
+ * expect(object):toHaveMember
1400
+ *
1401
+ * @summary
1402
+ * Assert subject is a true Object containing a property at memberName which is of any value,
1403
+ * including undefined.
1404
+ *
1405
+ * @description
1406
+ * See {@link http://git.io/jasmine-object-testing|Unit testing Objects with Jasmine}.
1407
+ *
1408
+ * @param {Boolean} memberName
1409
+ * @return {Boolean}
1410
+ */
1411
+ matchers.toHaveMember = function(memberName) {
1412
+ return memberName && priv.is(this.actual, 'Object') && memberName in this.actual;
1413
+ };
1414
+
1415
+ /**
1416
+ * StringMembers
1417
+ */
1418
+
1419
+ /**
1420
+ * @alias
1421
+ * expect(object):toHaveEmptyString
1422
+ *
1423
+ * @summary
1424
+ * .
1425
+ *
1426
+ * @description
1427
+ * See {@link http://git.io/jasmine-string-testing|Unit testing Strings with Jasmine}.
1428
+ *
1429
+ * @param {String} memberName
1430
+ * @return {Boolean}
1431
+ */
1432
+ matchers.toHaveEmptyString = function(memberName) {
1433
+ return priv.assertMember.call(this, 'toBeEmptyString', memberName);
1434
+ };
1435
+
1436
+ /**
1437
+ * @alias
1438
+ * expect(object):toHaveHtmlString
1439
+ *
1440
+ * @summary
1441
+ * .
1442
+ *
1443
+ * @description
1444
+ * See {@link http://git.io/jasmine-string-testing|Unit testing Strings with Jasmine}.
1445
+ *
1446
+ * @param {String} memberName
1447
+ * @return {Boolean}
1448
+ */
1449
+ matchers.toHaveHtmlString = function(memberName) {
1450
+ return priv.assertMember.call(this, 'toBeHtmlString', memberName);
1451
+ };
1452
+
1453
+ /**
1454
+ * @alias
1455
+ * expect(object):toHaveJsonString
1456
+ *
1457
+ * @summary
1458
+ * .
1459
+ *
1460
+ * @description
1461
+ * See {@link http://git.io/jasmine-string-testing|Unit testing Strings with Jasmine}.
1462
+ *
1463
+ * @param {String} memberName
1464
+ * @return {Boolean}
1465
+ */
1466
+ matchers.toHaveJsonString = function(memberName) {
1467
+ return priv.assertMember.call(this, 'toBeJsonString', memberName);
1468
+ };
1469
+
1470
+ /**
1471
+ * @alias
1472
+ * expect(object):toHaveNonEmptyString
1473
+ *
1474
+ * @summary
1475
+ * .
1476
+ *
1477
+ * @description
1478
+ * See {@link http://git.io/jasmine-string-testing|Unit testing Strings with Jasmine}.
1479
+ *
1480
+ * @param {String} memberName
1481
+ * @return {Boolean}
1482
+ */
1483
+ matchers.toHaveNonEmptyString = function(memberName) {
1484
+ return priv.assertMember.call(this, 'toBeNonEmptyString', memberName);
1485
+ };
1486
+
1487
+ /**
1488
+ * @alias
1489
+ * expect(object):toHaveString
1490
+ *
1491
+ * @summary
1492
+ * .
1493
+ *
1494
+ * @description
1495
+ * See {@link http://git.io/jasmine-string-testing|Unit testing Strings with Jasmine}.
1496
+ *
1497
+ * @param {String} memberName
1498
+ * @return {Boolean}
1499
+ */
1500
+ matchers.toHaveString = function(memberName) {
1501
+ return priv.assertMember.call(this, 'toBeString', memberName);
1502
+ };
1503
+
1504
+ /**
1505
+ * @alias
1506
+ * expect(object):toHaveStringLongerThan
1507
+ *
1508
+ * @summary
1509
+ * .
1510
+ *
1511
+ * @description
1512
+ * See {@link http://git.io/jasmine-string-testing|Unit testing Strings with Jasmine}.
1513
+ *
1514
+ * @param {String} memberName
1515
+ * @param {String} other
1516
+ * @return {Boolean}
1517
+ */
1518
+ matchers.toHaveStringLongerThan = function(memberName, other) {
1519
+ return priv.assertMember.call(this, 'toBeLongerThan', memberName, other);
1520
+ };
1521
+
1522
+ /**
1523
+ * @alias
1524
+ * expect(object):toHaveStringSameLengthAs
1525
+ *
1526
+ * @summary
1527
+ * .
1528
+ *
1529
+ * @description
1530
+ * See {@link http://git.io/jasmine-string-testing|Unit testing Strings with Jasmine}.
1531
+ *
1532
+ * @param {String} memberName
1533
+ * @param {String} other
1534
+ * @return {Boolean}
1535
+ */
1536
+ matchers.toHaveStringSameLengthAs = function(memberName, other) {
1537
+ return priv.assertMember.call(this, 'toBeSameLengthAs', memberName, other);
1538
+ };
1539
+
1540
+ /**
1541
+ * @alias
1542
+ * expect(object):toHaveStringShorterThan
1543
+ *
1544
+ * @summary
1545
+ * .
1546
+ *
1547
+ * @description
1548
+ * See {@link http://git.io/jasmine-string-testing|Unit testing Strings with Jasmine}.
1549
+ *
1550
+ * @param {String} memberName
1551
+ * @param {String} other
1552
+ * @return {Boolean}
1553
+ */
1554
+ matchers.toHaveStringShorterThan = function(memberName, other) {
1555
+ return priv.assertMember.call(this, 'toBeShorterThan', memberName, other);
1556
+ };
1557
+
1558
+ /**
1559
+ * @alias
1560
+ * expect(object):toHaveWhitespaceString
1561
+ *
1562
+ * @summary
1563
+ * .
1564
+ *
1565
+ * @description
1566
+ * See {@link http://git.io/jasmine-string-testing|Unit testing Strings with Jasmine}.
1567
+ *
1568
+ * @param {String} memberName
1569
+ * @return {Boolean}
1570
+ */
1571
+ matchers.toHaveWhitespaceString = function(memberName) {
1572
+ return priv.assertMember.call(this, 'toBeWhitespace', memberName);
1573
+ };
1574
+
1575
+ // Create adapters for the original matchers so they can be compatible with Jasmine 2.0.
1576
+ var matchersV2 = priv.adaptMatchers(matchers);
1577
+
1578
+ beforeEach(function() {
1579
+ if (typeof this.addMatchers === 'function') {
1580
+ this.addMatchers(matchers);
1581
+ } else if (typeof jasmine.addMatchers === 'function') {
1582
+ jasmine.addMatchers(matchersV2);
1583
+ }
1584
+ });
1585
+
1586
+ }());