lanes 0.0.1

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 (391) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +19 -0
  3. data/.jshintrc +3 -0
  4. data/Gemfile +9 -0
  5. data/Guardfile +15 -0
  6. data/LICENSE-MIT.txt +21 -0
  7. data/README.md +15 -0
  8. data/Rakefile +74 -0
  9. data/bin/lanes +5 -0
  10. data/client/images/ajax-loader.gif +0 -0
  11. data/client/images/dataTables/Sorting icons.psd +0 -0
  12. data/client/images/dataTables/back_disabled.png +0 -0
  13. data/client/images/dataTables/back_enabled.png +0 -0
  14. data/client/images/dataTables/back_enabled_hover.png +0 -0
  15. data/client/images/dataTables/favicon.ico +0 -0
  16. data/client/images/dataTables/forward_disabled.png +0 -0
  17. data/client/images/dataTables/forward_enabled.png +0 -0
  18. data/client/images/dataTables/forward_enabled_hover.png +0 -0
  19. data/client/images/dataTables/loading-background.png +0 -0
  20. data/client/images/dataTables/sort_asc.png +0 -0
  21. data/client/images/dataTables/sort_asc_disabled.png +0 -0
  22. data/client/images/dataTables/sort_both.png +0 -0
  23. data/client/images/dataTables/sort_desc.png +0 -0
  24. data/client/images/dataTables/sort_desc_disabled.png +0 -0
  25. data/client/images/logo-sm.png +0 -0
  26. data/client/javascripts/component/Base.coffee +39 -0
  27. data/client/javascripts/component/ChoicesInput.coffee +47 -0
  28. data/client/javascripts/component/Grid.coffee +199 -0
  29. data/client/javascripts/component/ModalDialog.coffee +44 -0
  30. data/client/javascripts/component/PopOver.coffee +52 -0
  31. data/client/javascripts/component/RadioGroup.coffee +59 -0
  32. data/client/javascripts/component/RecordFinder.coffee +143 -0
  33. data/client/javascripts/component/SelectField.coffee +43 -0
  34. data/client/javascripts/component/TaggedField.coffee +27 -0
  35. data/client/javascripts/component/grid/Editor.coffee +65 -0
  36. data/client/javascripts/component/grid/PopOverEditor.coffee +29 -0
  37. data/client/javascripts/component/grid/RowEditor.coffee +31 -0
  38. data/client/javascripts/component/grid/popover-editor.html +18 -0
  39. data/client/javascripts/component/grid/row-editor.html +16 -0
  40. data/client/javascripts/component/grid.html +4 -0
  41. data/client/javascripts/component/index.js +5 -0
  42. data/client/javascripts/component/modal.html +17 -0
  43. data/client/javascripts/component/popover.html +5 -0
  44. data/client/javascripts/component/record-finder/clause.skr +35 -0
  45. data/client/javascripts/component/record-finder/dialog.skr +4 -0
  46. data/client/javascripts/component/record-finder/field.skr +8 -0
  47. data/client/javascripts/data/Bootstrap.coffee +8 -0
  48. data/client/javascripts/data/ChangeSet.coffee +50 -0
  49. data/client/javascripts/data/Collection.coffee +111 -0
  50. data/client/javascripts/data/Config.coffee +15 -0
  51. data/client/javascripts/data/Model.coffee +269 -0
  52. data/client/javascripts/data/PubSub.coffee +68 -0
  53. data/client/javascripts/data/Query.coffee +184 -0
  54. data/client/javascripts/data/Roles.coffee +91 -0
  55. data/client/javascripts/data/Screens.coffee +157 -0
  56. data/client/javascripts/data/Sync.coffee +62 -0
  57. data/client/javascripts/data/User.coffee +70 -0
  58. data/client/javascripts/data/index.js +7 -0
  59. data/client/javascripts/data/mixins/HasCodeField.coffee +13 -0
  60. data/client/javascripts/extension/Base.coffee +9 -0
  61. data/client/javascripts/extension/Extensions.coffee +17 -0
  62. data/client/javascripts/extension/GlAccounts.coffee +9 -0
  63. data/client/javascripts/extension/index.js +6 -0
  64. data/client/javascripts/extension/load.js.erb +3 -0
  65. data/client/javascripts/lanes-complete.js +3 -0
  66. data/client/javascripts/lanes-workspace.js +1 -0
  67. data/client/javascripts/lib/MakeBaseClass.coffee +55 -0
  68. data/client/javascripts/lib/ModuleSupport.coffee +22 -0
  69. data/client/javascripts/lib/Templates.coffee +47 -0
  70. data/client/javascripts/lib/create-namespace.js +0 -0
  71. data/client/javascripts/lib/debounce.coffee +15 -0
  72. data/client/javascripts/lib/defer.coffee +7 -0
  73. data/client/javascripts/lib/el.js +115 -0
  74. data/client/javascripts/lib/index.js +9 -0
  75. data/client/javascripts/lib/loader.coffee +95 -0
  76. data/client/javascripts/lib/namespace.coffee +9 -0
  77. data/client/javascripts/lib/noConflict.coffee +14 -0
  78. data/client/javascripts/lib/promise_helpers.coffee +4 -0
  79. data/client/javascripts/lib/results.coffee +15 -0
  80. data/client/javascripts/lib/underscore.inflection.js +210 -0
  81. data/client/javascripts/lib/utilFunctions.coffee +51 -0
  82. data/client/javascripts/plugins/ResizeSensor.js +144 -0
  83. data/client/javascripts/plugins/index.js +4 -0
  84. data/client/javascripts/plugins/overlay.coffee +41 -0
  85. data/client/javascripts/plugins/trigger.coffee +15 -0
  86. data/client/javascripts/vendor/bootstrap/affix.js +142 -0
  87. data/client/javascripts/vendor/bootstrap/alert.js +92 -0
  88. data/client/javascripts/vendor/bootstrap/button.js +110 -0
  89. data/client/javascripts/vendor/bootstrap/carousel.js +223 -0
  90. data/client/javascripts/vendor/bootstrap/collapse.js +170 -0
  91. data/client/javascripts/vendor/bootstrap/dropdown.js +151 -0
  92. data/client/javascripts/vendor/bootstrap/modal.js +280 -0
  93. data/client/javascripts/vendor/bootstrap/popover.js +113 -0
  94. data/client/javascripts/vendor/bootstrap/scrollspy.js +170 -0
  95. data/client/javascripts/vendor/bootstrap/tab.js +128 -0
  96. data/client/javascripts/vendor/bootstrap/tooltip.js +457 -0
  97. data/client/javascripts/vendor/bootstrap/transition.js +59 -0
  98. data/client/javascripts/vendor/dataTables/dataTables.bootstrap.js +156 -0
  99. data/client/javascripts/vendor/dataTables/dataTables.scroller.js +1185 -0
  100. data/client/javascripts/vendor/dataTables/datatables.responsive.js +666 -0
  101. data/client/javascripts/vendor/dataTables/index.js +2 -0
  102. data/client/javascripts/vendor/dataTables/jquery.dataTables.js +14380 -0
  103. data/client/javascripts/vendor/jquery-2.js +9190 -0
  104. data/client/javascripts/vendor/jquery.tap.js +401 -0
  105. data/client/javascripts/vendor/magicsuggest.js +1565 -0
  106. data/client/javascripts/vendor/message-bus.js +285 -0
  107. data/client/javascripts/vendor/modern-stack.js +14 -0
  108. data/client/javascripts/vendor/packaged.js +13769 -0
  109. data/client/javascripts/view/Assets.coffee +9 -0
  110. data/client/javascripts/view/Base.coffee +231 -0
  111. data/client/javascripts/view/FormBindings.coffee +98 -0
  112. data/client/javascripts/view/Functions.coffee +13 -0
  113. data/client/javascripts/view/Helpers.coffee +77 -0
  114. data/client/javascripts/view/InterfaceState.coffee +88 -0
  115. data/client/javascripts/view/Keys.coffee +59 -0
  116. data/client/javascripts/view/ModelObserver.coffee +31 -0
  117. data/client/javascripts/view/ModelUpdate.coffee +8 -0
  118. data/client/javascripts/view/PubSub.coffee +29 -0
  119. data/client/javascripts/view/RenderContext.coffee +32 -0
  120. data/client/javascripts/view/SaveNotify.coffee +30 -0
  121. data/client/javascripts/view/Screen.coffee +30 -0
  122. data/client/javascripts/view/TimedHighlight.coffee +38 -0
  123. data/client/javascripts/view/TimedMask.coffee +65 -0
  124. data/client/javascripts/view/_button.html +3 -0
  125. data/client/javascripts/view/_toolbar.html +27 -0
  126. data/client/javascripts/view/index.js +10 -0
  127. data/client/javascripts/view/mixins/ScreenChangeListener.coffee +43 -0
  128. data/client/javascripts/view/model-update.html +13 -0
  129. data/client/javascripts/view/screen-definitions.js.erb +7 -0
  130. data/client/javascripts/workspace/ActiveScreensSwitcher.coffee +117 -0
  131. data/client/javascripts/workspace/Instance.es6 +60 -0
  132. data/client/javascripts/workspace/Layout.coffee +18 -0
  133. data/client/javascripts/workspace/LoginDialog.coffee +33 -0
  134. data/client/javascripts/workspace/Navbar.coffee +44 -0
  135. data/client/javascripts/workspace/Pages.coffee +46 -0
  136. data/client/javascripts/workspace/ScreensMenu.coffee +126 -0
  137. data/client/javascripts/workspace/index.js +12 -0
  138. data/client/javascripts/workspace/layout.html +4 -0
  139. data/client/javascripts/workspace/login-dialog.html +16 -0
  140. data/client/javascripts/workspace/menu.html +356 -0
  141. data/client/javascripts/workspace/menu_toggle.html +9 -0
  142. data/client/javascripts/workspace/navbar.html +19 -0
  143. data/client/javascripts/workspace/pages.html +6 -0
  144. data/client/javascripts/workspace/screens-menu.html +11 -0
  145. data/client/javascripts/workspace/screens-switcher.html +7 -0
  146. data/client/javascripts/workspace/tab.html +0 -0
  147. data/client/screens/user-management/UserEditScreen.coffee +21 -0
  148. data/client/screens/user-management/UserManagement.coffee +24 -0
  149. data/client/screens/user-management/grid-popover-editor.html +33 -0
  150. data/client/screens/user-management/index.css +4 -0
  151. data/client/screens/user-management/index.js +2 -0
  152. data/client/screens/user-management/user-management-styles.scss +7 -0
  153. data/client/screens/user-management/user-management.html +8 -0
  154. data/client/stylesheets/compoonents/all.scss +6 -0
  155. data/client/stylesheets/compoonents/changes-notification.scss +44 -0
  156. data/client/stylesheets/compoonents/grid-editors.scss +65 -0
  157. data/client/stylesheets/compoonents/grid.scss +301 -0
  158. data/client/stylesheets/compoonents/modal-dialog.scss +23 -0
  159. data/client/stylesheets/compoonents/record-finder.scss +71 -0
  160. data/client/stylesheets/compoonents/suggest.scss +266 -0
  161. data/client/stylesheets/fonts/icomoon.eot +0 -0
  162. data/client/stylesheets/fonts/icomoon.svg +160 -0
  163. data/client/stylesheets/fonts/icomoon.ttf +0 -0
  164. data/client/stylesheets/fonts/icomoon.woff +0 -0
  165. data/client/stylesheets/fonts/selection.json +3565 -0
  166. data/client/stylesheets/fonts/style.css +451 -0
  167. data/client/stylesheets/fonts.scss +38 -0
  168. data/client/stylesheets/forms.scss +75 -0
  169. data/client/stylesheets/index.css +4 -0
  170. data/client/stylesheets/keybindings.scss +6 -0
  171. data/client/stylesheets/lanes-workspace.scss +17 -0
  172. data/client/stylesheets/layout.scss +272 -0
  173. data/client/stylesheets/plugins/all.scss +2 -0
  174. data/client/stylesheets/plugins/overlay.scss +63 -0
  175. data/client/stylesheets/plugins/resize-sensor.scss +24 -0
  176. data/client/stylesheets/screens.scss +66 -0
  177. data/client/stylesheets/tabs.scss +148 -0
  178. data/client/stylesheets/vendor/bootstrap/_alerts.scss +68 -0
  179. data/client/stylesheets/vendor/bootstrap/_badges.scss +57 -0
  180. data/client/stylesheets/vendor/bootstrap/_breadcrumbs.scss +26 -0
  181. data/client/stylesheets/vendor/bootstrap/_button-groups.scss +240 -0
  182. data/client/stylesheets/vendor/bootstrap/_buttons.scss +157 -0
  183. data/client/stylesheets/vendor/bootstrap/_carousel.scss +243 -0
  184. data/client/stylesheets/vendor/bootstrap/_close.scss +35 -0
  185. data/client/stylesheets/vendor/bootstrap/_code.scss +68 -0
  186. data/client/stylesheets/vendor/bootstrap/_component-animations.scss +35 -0
  187. data/client/stylesheets/vendor/bootstrap/_dropdowns.scss +215 -0
  188. data/client/stylesheets/vendor/bootstrap/_forms.scss +538 -0
  189. data/client/stylesheets/vendor/bootstrap/_glyphicons.scss +237 -0
  190. data/client/stylesheets/vendor/bootstrap/_grid.scss +84 -0
  191. data/client/stylesheets/vendor/bootstrap/_input-groups.scss +166 -0
  192. data/client/stylesheets/vendor/bootstrap/_jumbotron.scss +48 -0
  193. data/client/stylesheets/vendor/bootstrap/_labels.scss +66 -0
  194. data/client/stylesheets/vendor/bootstrap/_list-group.scss +132 -0
  195. data/client/stylesheets/vendor/bootstrap/_media.scss +56 -0
  196. data/client/stylesheets/vendor/bootstrap/_mixins.scss +39 -0
  197. data/client/stylesheets/vendor/bootstrap/_modals.scss +150 -0
  198. data/client/stylesheets/vendor/bootstrap/_navbar.scss +659 -0
  199. data/client/stylesheets/vendor/bootstrap/_navs.scss +242 -0
  200. data/client/stylesheets/vendor/bootstrap/_normalize.scss +425 -0
  201. data/client/stylesheets/vendor/bootstrap/_pager.scss +55 -0
  202. data/client/stylesheets/vendor/bootstrap/_pagination.scss +88 -0
  203. data/client/stylesheets/vendor/bootstrap/_panels.scss +243 -0
  204. data/client/stylesheets/vendor/bootstrap/_popovers.scss +133 -0
  205. data/client/stylesheets/vendor/bootstrap/_print.scss +101 -0
  206. data/client/stylesheets/vendor/bootstrap/_progress-bars.scss +105 -0
  207. data/client/stylesheets/vendor/bootstrap/_responsive-embed.scss +34 -0
  208. data/client/stylesheets/vendor/bootstrap/_responsive-utilities.scss +174 -0
  209. data/client/stylesheets/vendor/bootstrap/_scaffolding.scss +150 -0
  210. data/client/stylesheets/vendor/bootstrap/_tables.scss +233 -0
  211. data/client/stylesheets/vendor/bootstrap/_theme.scss +258 -0
  212. data/client/stylesheets/vendor/bootstrap/_thumbnails.scss +38 -0
  213. data/client/stylesheets/vendor/bootstrap/_tooltip.scss +95 -0
  214. data/client/stylesheets/vendor/bootstrap/_type.scss +304 -0
  215. data/client/stylesheets/vendor/bootstrap/_utilities.scss +57 -0
  216. data/client/stylesheets/vendor/bootstrap/_variables.scss +850 -0
  217. data/client/stylesheets/vendor/bootstrap/_wells.scss +29 -0
  218. data/client/stylesheets/vendor/bootstrap/bootstrap.scss +50 -0
  219. data/client/stylesheets/vendor/bootstrap/mixins/_alerts.scss +14 -0
  220. data/client/stylesheets/vendor/bootstrap/mixins/_background-variant.scss +11 -0
  221. data/client/stylesheets/vendor/bootstrap/mixins/_border-radius.scss +18 -0
  222. data/client/stylesheets/vendor/bootstrap/mixins/_buttons.scss +50 -0
  223. data/client/stylesheets/vendor/bootstrap/mixins/_center-block.scss +7 -0
  224. data/client/stylesheets/vendor/bootstrap/mixins/_clearfix.scss +22 -0
  225. data/client/stylesheets/vendor/bootstrap/mixins/_forms.scss +84 -0
  226. data/client/stylesheets/vendor/bootstrap/mixins/_gradients.scss +58 -0
  227. data/client/stylesheets/vendor/bootstrap/mixins/_grid-framework.scss +81 -0
  228. data/client/stylesheets/vendor/bootstrap/mixins/_grid.scss +122 -0
  229. data/client/stylesheets/vendor/bootstrap/mixins/_hide-text.scss +21 -0
  230. data/client/stylesheets/vendor/bootstrap/mixins/_image.scss +34 -0
  231. data/client/stylesheets/vendor/bootstrap/mixins/_labels.scss +12 -0
  232. data/client/stylesheets/vendor/bootstrap/mixins/_list-group.scss +31 -0
  233. data/client/stylesheets/vendor/bootstrap/mixins/_nav-divider.scss +10 -0
  234. data/client/stylesheets/vendor/bootstrap/mixins/_nav-vertical-align.scss +9 -0
  235. data/client/stylesheets/vendor/bootstrap/mixins/_opacity.scss +8 -0
  236. data/client/stylesheets/vendor/bootstrap/mixins/_pagination.scss +23 -0
  237. data/client/stylesheets/vendor/bootstrap/mixins/_panels.scss +24 -0
  238. data/client/stylesheets/vendor/bootstrap/mixins/_progress-bar.scss +10 -0
  239. data/client/stylesheets/vendor/bootstrap/mixins/_reset-filter.scss +8 -0
  240. data/client/stylesheets/vendor/bootstrap/mixins/_resize.scss +6 -0
  241. data/client/stylesheets/vendor/bootstrap/mixins/_responsive-visibility.scss +21 -0
  242. data/client/stylesheets/vendor/bootstrap/mixins/_size.scss +10 -0
  243. data/client/stylesheets/vendor/bootstrap/mixins/_tab-focus.scss +9 -0
  244. data/client/stylesheets/vendor/bootstrap/mixins/_table-row.scss +28 -0
  245. data/client/stylesheets/vendor/bootstrap/mixins/_text-emphasis.scss +11 -0
  246. data/client/stylesheets/vendor/bootstrap/mixins/_text-overflow.scss +8 -0
  247. data/client/stylesheets/vendor/bootstrap/mixins/_vendor-prefixes.scss +219 -0
  248. data/client/stylesheets/vendor/bootstrap-custom-grid.scss +85 -0
  249. data/client/stylesheets/vendor/bootstrap-custom-modals.scss +150 -0
  250. data/client/stylesheets/vendor/bootstrap.scss +69 -0
  251. data/client/stylesheets/vendor/dataTables.scss +4 -0
  252. data/config/database.yml +9 -0
  253. data/config/puma.rb +7 -0
  254. data/config.ru +4 -0
  255. data/db/migrate/20140615031600_create_hip_users.rb +17 -0
  256. data/db/seed.rb +37 -0
  257. data/foo/Gemfile +5 -0
  258. data/foo/Guardfile +13 -0
  259. data/foo/foo/Gemfile +5 -0
  260. data/foo/foo/lib/foo.rb +7 -0
  261. data/foo/lib/foo/version.rb +3 -0
  262. data/foo/lib/foo.rb +8 -0
  263. data/lanes.gemspec +54 -0
  264. data/lib/generators/lanes/migrations/install_generator.rb +42 -0
  265. data/lib/lanes/access/locked_fields.rb +43 -0
  266. data/lib/lanes/access/role.rb +58 -0
  267. data/lib/lanes/access/role_collection.rb +75 -0
  268. data/lib/lanes/access/roles/administrator.rb +25 -0
  269. data/lib/lanes/access/roles/support.rb +13 -0
  270. data/lib/lanes/access/user_maint_screen.rb +32 -0
  271. data/lib/lanes/access.rb +50 -0
  272. data/lib/lanes/api/asset_pipeline.rb +59 -0
  273. data/lib/lanes/api/authentication_helper.rb +21 -0
  274. data/lib/lanes/api/authentication_provider.rb +45 -0
  275. data/lib/lanes/api/controller.rb +290 -0
  276. data/lib/lanes/api/default_routes.rb +35 -0
  277. data/lib/lanes/api/eco.js +516 -0
  278. data/lib/lanes/api/error_formatter.rb +37 -0
  279. data/lib/lanes/api/helper_methods.rb +32 -0
  280. data/lib/lanes/api/javascript_processor.rb +116 -0
  281. data/lib/lanes/api/pub_sub.rb +33 -0
  282. data/lib/lanes/api/request_wrapper.rb +42 -0
  283. data/lib/lanes/api/root.rb +103 -0
  284. data/lib/lanes/api/skr_templates.rb +60 -0
  285. data/lib/lanes/api/test_specs.rb +59 -0
  286. data/lib/lanes/api/updates.rb +38 -0
  287. data/lib/lanes/api.rb +27 -0
  288. data/lib/lanes/cli.rb +13 -0
  289. data/lib/lanes/concerns/all.rb +16 -0
  290. data/lib/lanes/concerns/api_path.rb +21 -0
  291. data/lib/lanes/concerns/association_extensions.rb +85 -0
  292. data/lib/lanes/concerns/attr_accessor_with_default.rb +62 -0
  293. data/lib/lanes/concerns/code_identifier.rb +43 -0
  294. data/lib/lanes/concerns/export_associations.rb +52 -0
  295. data/lib/lanes/concerns/export_join_tables.rb +39 -0
  296. data/lib/lanes/concerns/export_methods.rb +104 -0
  297. data/lib/lanes/concerns/export_scope.rb +66 -0
  298. data/lib/lanes/concerns/exported_limit_evaluator.rb +17 -0
  299. data/lib/lanes/concerns/immutable_model.rb +32 -0
  300. data/lib/lanes/concerns/locked_fields.rb +84 -0
  301. data/lib/lanes/concerns/pub_sub.rb +105 -0
  302. data/lib/lanes/concerns/queries.rb +20 -0
  303. data/lib/lanes/concerns/random_hash_code.rb +40 -0
  304. data/lib/lanes/concerns/sanitize_api_data.rb +15 -0
  305. data/lib/lanes/concerns/set_attribute_data.rb +154 -0
  306. data/lib/lanes/concerns/track_modifications.rb +51 -0
  307. data/lib/lanes/concerns/visible_id_identifier.rb +53 -0
  308. data/lib/lanes/configuration.rb +85 -0
  309. data/lib/lanes/db/migration_helpers.rb +178 -0
  310. data/lib/lanes/db/migrations.rb +13 -0
  311. data/lib/lanes/db/seed.rb +27 -0
  312. data/lib/lanes/db.rb +86 -0
  313. data/lib/lanes/environment.rb +19 -0
  314. data/lib/lanes/extension.rb +72 -0
  315. data/lib/lanes/generators/app/Gemfile +5 -0
  316. data/lib/lanes/generators/app/Guardfile +13 -0
  317. data/lib/lanes/generators/app/Rakefile +9 -0
  318. data/lib/lanes/generators/app/config/database.yml +9 -0
  319. data/lib/lanes/generators/app/config.ru +4 -0
  320. data/lib/lanes/generators/app/lib/main_class/version.rb +3 -0
  321. data/lib/lanes/generators/app/lib/main_class.rb +8 -0
  322. data/lib/lanes/generators/app.rb +36 -0
  323. data/lib/lanes/guard_tasks.rb +44 -0
  324. data/lib/lanes/logger.rb +37 -0
  325. data/lib/lanes/model.rb +26 -0
  326. data/lib/lanes/numbers.rb +72 -0
  327. data/lib/lanes/rails_engine.rb +5 -0
  328. data/lib/lanes/screens.rb +126 -0
  329. data/lib/lanes/spec_asset_expander.rb +43 -0
  330. data/lib/lanes/strings.rb +56 -0
  331. data/lib/lanes/user.rb +127 -0
  332. data/lib/lanes/validators/all.rb +2 -0
  333. data/lib/lanes/validators/email.rb +17 -0
  334. data/lib/lanes/validators/set.rb +18 -0
  335. data/lib/lanes/version.rb +5 -0
  336. data/lib/lanes.rb +22 -0
  337. data/npm-build/README +1 -0
  338. data/npm-build/compile.coffee +15 -0
  339. data/npm-build/package.json +59 -0
  340. data/npm-build/shims/underscore.js +1416 -0
  341. data/npm-build/template.js +33 -0
  342. data/public/javascripts/jasmine_examples/Player.js +22 -0
  343. data/public/javascripts/jasmine_examples/Song.js +7 -0
  344. data/spec/api/javascript_processor_spec.rb +107 -0
  345. data/spec/api/user_spec.rb +52 -0
  346. data/spec/client/component/ChoicesInputSpec.coffee +12 -0
  347. data/spec/client/component/foo_spec.coffee +4 -0
  348. data/spec/client/foo_spec.js +0 -0
  349. data/spec/client/jasmine_examples/PlayerSpec.js +0 -0
  350. data/spec/client/support/jasmine.yml +128 -0
  351. data/spec/client/support/jasmine_helper.rb +15 -0
  352. data/spec/concerns/api_path_spec.rb +14 -0
  353. data/spec/concerns/association_extensions_spec.rb +30 -0
  354. data/spec/concerns/attr_accessor_with_default_spec.rb +57 -0
  355. data/spec/concerns/code_identifier_spec.rb +45 -0
  356. data/spec/concerns/export_associations_spec.rb +7 -0
  357. data/spec/concerns/export_methods_spec.rb +43 -0
  358. data/spec/concerns/export_scope_spec.rb +15 -0
  359. data/spec/concerns/exported_limits_spec.rb +47 -0
  360. data/spec/concerns/pub_sub_spec.rb +83 -0
  361. data/spec/concerns/set_attribute_data_spec.rb +66 -0
  362. data/spec/configuration_spec.rb +26 -0
  363. data/spec/fixtures/lanes/users.yml +13 -0
  364. data/spec/helpers/.gitkeep +0 -0
  365. data/spec/helpers/SpecHelper.js +18 -0
  366. data/spec/locked_fields_spec.rb +27 -0
  367. data/spec/numbers_spec.rb +26 -0
  368. data/spec/role_collection_spec.rb +19 -0
  369. data/spec/spec_helper.rb +163 -0
  370. data/spec/strings_spec.rb +41 -0
  371. data/spec/testing_models.rb +54 -0
  372. data/spec/user_role_spec.rb +7 -0
  373. data/spec/user_spec.rb +53 -0
  374. data/tasks/migrations.rake +22 -0
  375. data/tasks/publish.rake +8 -0
  376. data/views/index.erb +29 -0
  377. data/views/specs.erb +25 -0
  378. data/yard_ext/all.rb +9 -0
  379. data/yard_ext/code_identifier_handler.rb +33 -0
  380. data/yard_ext/concern_meta_methods.rb +60 -0
  381. data/yard_ext/config_options.rb +27 -0
  382. data/yard_ext/exported_scope.rb +4 -0
  383. data/yard_ext/immutable_handler.rb +17 -0
  384. data/yard_ext/json_attr_accessor.rb +22 -0
  385. data/yard_ext/locked_fields_handler.rb +21 -0
  386. data/yard_ext/templates/default/layout/html/layout.erb +20 -0
  387. data/yard_ext/templates/default/method_details/html/github_link.erb +1 -0
  388. data/yard_ext/templates/default/method_details/setup.rb +3 -0
  389. data/yard_ext/validators.rb +1 -0
  390. data/yard_ext/visible_id_handler.rb +38 -0
  391. metadata +772 -0
@@ -0,0 +1,83 @@
1
+ require_relative '../spec_helper'
2
+
3
+ class PubSubTest < Lanes::TestCase
4
+
5
+ class EventTester
6
+ def self.after_save(*args); end
7
+ def self.after_create(*args); end
8
+ def self.after_update(*args); end
9
+ def self.after_destroy(*args); end
10
+
11
+ include Lanes::Concerns::PubSub
12
+
13
+ def trigger( event, *args )
14
+ fire_event(event, *args )
15
+ end
16
+ end
17
+
18
+ class Ev1 < EventTester
19
+ has_additional_events :test_one
20
+ end
21
+
22
+ class Ev2 < EventTester
23
+ has_additional_events :test_two
24
+ end
25
+
26
+
27
+ def test_event_name_registration
28
+ assert_equal [ :save, :create, :update, :destroy ],EventTester.valid_event_names
29
+ assert_equal [ :save, :create, :update, :destroy, :test_one ],Ev1.valid_event_names
30
+ end
31
+
32
+ def test_only_valid
33
+ assert_raises( EventTester::InvalidEvent) do
34
+ EventTester.observe(:invalid_event) do | ev |
35
+ end
36
+ end
37
+ assert_raises( EventTester::InvalidEvent) do
38
+ EventTester.observe(:save) do | ev |
39
+ end
40
+ EventTester.new.trigger(:invalid_event)
41
+ end
42
+ assert_raises( EventTester::InvalidEvent) do
43
+ Ev1.observe(:test_two) do | ev |
44
+ end
45
+ end
46
+ assert_raises( EventTester::InvalidEvent) do
47
+ Ev2.observe(:test_one) do | ev |
48
+ end
49
+ end
50
+ begin
51
+ Ev2.observe(:test_one) do | ev |
52
+ end
53
+ rescue EventTester::InvalidEvent=>e
54
+ assert_equal 'test_one is not a valid event for PubSubTest::Ev2', e.to_s
55
+ end
56
+ end
57
+
58
+ def test_subscription
59
+ EventTester.observe(:save) do | ev |
60
+ end
61
+ end
62
+ def test_firing
63
+ results=[]
64
+ Ev1.observe(:test_one) do | ev, one, two |
65
+ results = [ ev, one, two ]
66
+ end
67
+ evt=Ev1.new
68
+ evt.trigger( :test_one, 3, 5 )
69
+ assert_equal [ evt, 3, 5 ], results
70
+
71
+ evt.trigger( :test_one, 'foo' )
72
+ assert_equal [ evt, 'foo', nil ], results
73
+ end
74
+
75
+
76
+ def test_firing_with_assertsions
77
+ assert_event_fires( Ev1, :test_one ) do
78
+ Ev1.new.trigger( :test_one, 3, 5 )
79
+ end
80
+ assert_equal [ 3, 5 ], last_event_results[1..-1]
81
+ end
82
+
83
+ end
@@ -0,0 +1,66 @@
1
+ require_relative '../spec_helper'
2
+
3
+ class SetAttributeDataTest < Lanes::TestCase
4
+
5
+ include TestingModels
6
+
7
+ def test_attribute_access
8
+ tm = TestModel.new
9
+ assert tm.setting_attribute_is_allowed?(:name, lanes_users(:admin)), "can't access :name"
10
+ assert tm.can_write_attributes?({}, admin), "Can't write to TestModel"
11
+ data = { name: 'CASH', number: '1200' }
12
+ assert_equal( data, TestModel.new.set_attribute_data(data) )
13
+ end
14
+
15
+ def test_blacklisting
16
+ assert TestModel.new.setting_attribute_is_allowed?(:number,Lanes::User.current)
17
+ TestModel.send :blacklist_attributes, :number
18
+ assert_includes TestModel.blacklisted_attributes, :number
19
+ refute TestModel.new.setting_attribute_is_allowed?(:number, Lanes::User.current), "Allowed setting blacklisted attribute"
20
+ record = TestModel.from_attribute_data({ name: 'CASH', number: '1234'})
21
+ assert_nil record.number
22
+ end
23
+
24
+ def test_whitelisting
25
+ refute TestModel.new.setting_attribute_is_allowed?('updated_at',Lanes::User.current)
26
+ TestModel.send :whitelist_attributes, :updated_at
27
+ assert TestModel.new.setting_attribute_is_allowed?('updated_at',Lanes::User.current)
28
+ end
29
+
30
+ def test_recursive_cleaning_belongs_to
31
+ assert TestModel.has_exported_association?( :bt, admin )
32
+ data = { name: 'testing', bt: { description: 'childish', secret_field: 'dr evil' } }
33
+ record = TestModel.new
34
+ cleaned = record.set_attribute_data(data)
35
+ assert_equal( { name: 'testing', bt:{ description: 'childish' } }, cleaned)
36
+ assert record.bt
37
+ assert_equal 'childish', record.bt.description
38
+ assert_nil record.bt.secret_field
39
+ end
40
+
41
+ def test_recursive_cleaning_has_many
42
+ assert TestModel.has_exported_association?( :hm, admin )
43
+ data = {
44
+ name: 'testing',
45
+ hm: [
46
+ { description: 'childish-1', secret_field: 'dr evil' },
47
+ { description: 'childish-2', secret_field: 'dr evil' }
48
+ ]}
49
+ record = TestModel.new
50
+ cleaned_data = record.set_attribute_data(data)
51
+ assert_equal 2, record.hm.length
52
+ assert_equal cleaned_data, {:name=>"testing", :hm=>[{:description=>"childish-1"}, {:description=>"childish-2"}]}
53
+ assert_saves record
54
+ end
55
+
56
+ def test_sending_to_method
57
+ tm = TestModel.new
58
+ def tm.meaning_of_life=(var); @setting = var end
59
+ tm.set_attribute_data({ meaning_of_life: 42 })
60
+ assert_nil tm.instance_variable_get(:@setting)
61
+ TestModel.send :whitelist_attributes, :meaning_of_life
62
+ tm.set_attribute_data({ meaning_of_life: 42 })
63
+ assert_equal 42, tm.instance_variable_get(:@setting)
64
+ end
65
+
66
+ end
@@ -0,0 +1,26 @@
1
+ require_relative 'spec_helper'
2
+
3
+ describe Lanes::Configuration do
4
+
5
+ def test_changing_values_are_logged
6
+ begin
7
+ assert_logs_matching( /table_prefix changed from / ) do
8
+ Lanes.config.table_prefix=:foo
9
+ end
10
+ ensure
11
+ Lanes.silence_logs { Lanes.config.table_prefix='' }
12
+ end
13
+ end
14
+
15
+ def test_callbacks_are_fired
16
+ sentinel = false
17
+ Lanes.config.on_change(:environment) do |nv,ov|
18
+ sentinel = nv
19
+ end
20
+ Lanes.silence_logs do
21
+ Lanes.config.environment = :testing
22
+ assert_equal sentinel, :testing
23
+ end
24
+ end
25
+
26
+ end
@@ -0,0 +1,13 @@
1
+ admin:
2
+ login: admin
3
+ name: Administrator Jane
4
+ email: admin@test.com
5
+ password_digest: <%= BCrypt::Password.create('password') %>
6
+ role_names: ['administrator']
7
+
8
+ support:
9
+ login: support
10
+ name: Supporter Joe
11
+ email: support@test.com
12
+ password_digest: <%= BCrypt::Password.create('password') %>
13
+ role_names: ['support']
File without changes
@@ -0,0 +1,18 @@
1
+ beforeEach(function(){
2
+ jasmine.addMatchers({
3
+ toBeDeactivated: function() {
4
+ return {
5
+ compare: function(account){
6
+ var accountStatusCode = account.get('status').statusCode;
7
+ var result = { pass: accountStatusCode === 5 };
8
+ if(result.pass) {
9
+ result.message = "Expected account with status code '" + accountStatusCode + " NOT to be deactivated.";
10
+ } else {
11
+ result.message = "Expected account with status code '" + accountStatusCode + "' to be deactivated.";
12
+ }
13
+ return result;
14
+ }
15
+ };
16
+ }
17
+ });
18
+ });
@@ -0,0 +1,27 @@
1
+ require_relative 'spec_helper'
2
+
3
+ class Customer < Lanes::Model
4
+ def self.attribute_names
5
+ [:terms_id]
6
+ end
7
+ end
8
+
9
+ Lanes::Access::Roles::Support.read << Customer
10
+ Lanes::Access::Roles::Administrator.lock Customer, :terms_id
11
+
12
+ class LockedFieldsTest < Lanes::TestCase
13
+
14
+ def setup
15
+ @user = Lanes::User.new( login: 'test', email: 'bob@test.com', name: 'Bob', password: 'testtest')
16
+ @purchaser = Lanes::User.new( login: 'test', email: 'bob@test.com', name: 'Bob', password: 'testtest')
17
+ end
18
+
19
+ def test_validations
20
+ @user.role_names = ['support']
21
+ assert_saves @user
22
+ assert @user.can_read?(Customer), "User with support role cannot read Customer"
23
+ refute @user.can_write?(Customer), "User can write, but shouldn't be able to"
24
+ refute @user.can_read?(Customer, :terms_id), "User can read :terms_id but shouldn't be able to"
25
+ end
26
+
27
+ end
@@ -0,0 +1,26 @@
1
+ require_relative 'spec_helper'
2
+
3
+ describe Lanes::Numbers do
4
+
5
+ Num = Lanes::Numbers
6
+
7
+
8
+ def test_percnum
9
+ assert Num::PercNum.new( '5%' ).is_percentage?, "is a percentage"
10
+ assert Num::PercNum.new( '5% ' ).is_percentage?, "is a percentage"
11
+ assert Num::PercNum.new( '5.3 % ' ).is_percentage?, "is a percentage"
12
+ refute Num::PercNum.new( '$5.3 ' ).is_percentage?, "is not a percentage"
13
+ # this is debatable, but we have to draw the line somewhere
14
+ refute Num::PercNum.new( '%5.3 ' ).is_percentage?, "is a percentage"
15
+
16
+ assert_equal '95.0', Num::PercNum.new( '5' ).debit_from(100).to_s
17
+ assert_equal '95.0', Num::PercNum.new( '5%' ).debit_from(100).to_s
18
+ assert_equal '105.0', Num::PercNum.new( '5%' ).credit_to(100).to_s
19
+ assert_equal '95.0', Num::PercNum.new( '-5%').credit_to(100).to_s
20
+
21
+ assert_equal '137.38449', Num::PercNum.new( '33.383%' ).credit_to(103).to_s
22
+ assert_equal '68.61551', Num::PercNum.new( '33.383%' ).debit_from(103).to_s
23
+ end
24
+
25
+
26
+ end
@@ -0,0 +1,19 @@
1
+ require_relative 'spec_helper'
2
+
3
+
4
+
5
+ class AccessTester < Lanes::Model
6
+ def self.attribute_names
7
+ [:name]
8
+ end
9
+ end
10
+
11
+
12
+ class RoleCollectionTest < Lanes::TestCase
13
+
14
+ def test_administrator_grants
15
+ user = lanes_users(:admin)
16
+ assert_includes user.role_names, 'administrator'
17
+ assert user.roles.can_read?(AccessTester)
18
+ end
19
+ end
@@ -0,0 +1,163 @@
1
+ require 'minitest/autorun'
2
+ require 'mocha/mini_test'
3
+ require 'rack/test'
4
+ require 'lanes'
5
+ require 'lanes/api'
6
+ require 'hashie/mash'
7
+ require 'active_record'
8
+ require 'active_record/fixtures'
9
+ require 'minitest/around/unit'
10
+ require 'minitest/spec'
11
+ require 'minitest/autorun'
12
+ require 'pry'
13
+
14
+ require_relative 'testing_models'
15
+
16
+ RAILS_ENV = "test"
17
+ I18n.enforce_available_locales = true
18
+ Lanes::DB.establish_connection('test')
19
+ Lanes.logger=Logger.new( File.open('log/test.log', File::WRONLY | File::APPEND | File::CREAT ))
20
+ ActiveRecord::Base.logger = Lanes.logger
21
+ ActiveSupport::Dependencies.mechanism = :require
22
+
23
+ module Lanes
24
+
25
+ class TestCase < ActiveSupport::TestCase
26
+ include Lanes
27
+ include ActiveRecordMocks::IncludeMe
28
+
29
+ include ActiveRecord::TestFixtures
30
+ self.fixture_path = Pathname.new(__FILE__).dirname.join('fixtures')
31
+ setup do
32
+ Thread.current[:lanes_current_user] = lanes_users(:admin)
33
+ Lanes::Access.calculate_model_access!
34
+ end
35
+
36
+ self.use_transactional_fixtures = true
37
+ fixtures :all
38
+
39
+ def admin
40
+ lanes_users(:admin)
41
+ end
42
+
43
+ extend MiniTest::Spec::DSL
44
+ register_spec_type self do |desc|
45
+ desc < Lanes::Model if desc.is_a? Class
46
+ end
47
+
48
+ end
49
+
50
+ class ApiTestCase < TestCase
51
+ include Rack::Test::Methods
52
+
53
+ teardown do
54
+ @current_user = nil
55
+ end
56
+
57
+ def app
58
+ Lanes::API::Root.new
59
+ end
60
+
61
+ def json_body
62
+ Hashie::Mash.new Oj.load( last_response.body )
63
+ end
64
+
65
+ def json_data
66
+ json_body['data']
67
+ end
68
+
69
+ [ :get, :put, :post, :delete, :patch].each do |name|
70
+ define_method(name) do |uri, params = {}, env = {}, &block|
71
+ session = env['rack.session'] ||= {}
72
+ env[Rack::Csrf.rackified_header] = Rack::Csrf.token(env)
73
+ session[:user_id] = @current_user.id if @current_user
74
+ params = Oj.dump(params, mode: :compat) if params.is_a?(Hash)
75
+ super(uri,params,env,&block)
76
+ end
77
+ end
78
+
79
+ def login!(user=admin)
80
+ @current_user = user
81
+ end
82
+
83
+ def assert_ok
84
+ assert last_response.ok?, "Request failed with #{last_response.status}"
85
+ end
86
+ def refute_ok
87
+ refute last_response.ok?, "Request succeeded with status #{last_response.status}, expected non-2XX"
88
+ end
89
+ end
90
+ end
91
+
92
+ module MiniTest
93
+ module Assertions
94
+
95
+ def assert_logs_matching( regex, failure_message=nil, &block )
96
+ old_logger = Lanes.logger
97
+ begin
98
+ output = ""
99
+ Lanes.logger=Logger.new( StringIO.new(output) )
100
+ yield
101
+ assert_match( regex, output, failure_message )
102
+ ensure
103
+ Lanes.logger=old_logger
104
+ end
105
+ end
106
+
107
+
108
+ def assert_saves( model )
109
+ assert model.save, "#{model.class} failed to save: #{model.errors.full_messages.join(',')}"
110
+ end
111
+ def refute_saves( model, *errors )
112
+ refute model.save, "#{model.class} saved successfully when it should not have"
113
+ errors.each do |error|
114
+ if model.errors[error.to_sym].empty?
115
+ raise MiniTest::Assertion, "expected #{model.class} to have an error on #{error}"
116
+ end
117
+ end
118
+
119
+ end
120
+
121
+
122
+ def assert_event_fires( klass, event, &block )
123
+ @event_results = []
124
+ klass.observe(event) do | *args |
125
+ @event_results = args
126
+ end
127
+ yield
128
+ raise MiniTest::Assertion, "Event #{event} was not fired" if @event_results.empty?
129
+ end
130
+
131
+ def last_event_results
132
+ @event_results
133
+ end
134
+ end
135
+ end
136
+
137
+
138
+ module FixtureHelpers
139
+
140
+ extend ActiveSupport::Concern
141
+
142
+ included do
143
+ alias_method_chain :table_rows, :custom_autoset_fields
144
+ end
145
+
146
+ def table_rows_with_custom_autoset_fields
147
+ results = table_rows_without_custom_autoset_fields
148
+ if model_class
149
+ results[ table_name ].each do | row |
150
+ row['visible_id'] = Lanes::SequentialId.next_for( model_class ) if model_class.column_names.include?('visible_id')
151
+ row['hash_code' ] = Lanes::Strings.random if model_class.column_names.include?('hash_code')
152
+ row['created_at'] = Time.now if model_class.column_names.include?('created_at')
153
+ row['updated_at'] = Time.now if model_class.column_names.include?('updated_at')
154
+ # 135138680 == "admin"
155
+ row['created_by_id'] = 135138680 if model_class.column_names.include?('created_by_id')
156
+ row['updated_by_id'] = 135138680 if model_class.column_names.include?('updated_by_id')
157
+ end
158
+ end
159
+ results
160
+ end
161
+ end
162
+
163
+ ActiveRecord::FixtureSet.send :include, FixtureHelpers
@@ -0,0 +1,41 @@
1
+ require_relative 'spec_helper'
2
+
3
+ describe Lanes::Strings do
4
+
5
+ # just 'cuz
6
+ Str = Lanes::Strings
7
+
8
+ def test_random_is_of_proper_length
9
+ assert_equal 12, Str.random.length
10
+ assert_equal 6, Str.random(6).length
11
+ end
12
+
13
+ def test_random_doesnt_use_bad_chars
14
+ bad = Str::BAD_RAND_CHARS
15
+ assert bad.present?, 'list of bad random chars is empty'
16
+ 0.upto(10).each do | i |
17
+ string = Str.random
18
+ string.each_char do |c|
19
+ refute bad.include?(c), "Random string #{string} included bad char '#{c}'"
20
+ end
21
+ end
22
+ end
23
+
24
+ def test_code_identifier_shortens
25
+ # if all words are long engouth to shorten, then it takes an
26
+ # equal number from each
27
+ assert_equal 'GENACMCORP', Str.code_identifier( 'General Acme Corp' )
28
+ # If one word is too short, it'll attempt to make up the difference with
29
+ # later words
30
+ assert_equal 'GENIINCORP', Str.code_identifier( 'General I Incorporated' )
31
+ # If it gets to the end and it's still too short, it'll append the
32
+ # padding char
33
+ assert_equal 'GENERALIBC', Str.code_identifier( 'General I BC' )
34
+ assert_equal 'GENERALIB*', Str.code_identifier( 'General I B.', padding: '*' )
35
+ assert_equal 'FSANSEYEAG', Str.code_identifier( 'Four score and seven years ago', padding: '*' )
36
+ assert_equal 'ALONSBEAST', Str.code_identifier( 'A long s beasty' )
37
+ assert_equal 'GE', Str.code_identifier( 'GE', padding: false )
38
+ assert_equal 'HI33ME', Str.code_identifier( 'Hi 33 Me!', padding: false )
39
+ assert_equal 'BADIANDOCO', Str.code_identifier( "Bayer, Dickinson and O'Conner", padding: false )
40
+ end
41
+ end
@@ -0,0 +1,54 @@
1
+ require "active_record_mocks"
2
+
3
+ module TestingModels
4
+
5
+
6
+ def around(&block)
7
+ with_testing_models(&block)
8
+ end
9
+
10
+ def with_testing_models
11
+ with_mocked_tables do |m|
12
+
13
+ m.enable_extension "hstore"
14
+
15
+ m.create_table do |t|
16
+ t.model_name :TestModel
17
+ t.parent_class "Lanes::Model"
18
+ t.belongs_to :bt, class_name: 'Tmbt'
19
+ t.has_many :hm, class_name: 'Tmhm'
20
+ t.layout do |l|
21
+ l.integer :bt_id
22
+ l.string :name, :number
23
+ end
24
+ end
25
+ TestModel.export_associations( :bt, :hm, writable: true )
26
+
27
+ m.create_table do |t|
28
+ t.model_name :Tmbt
29
+ t.parent_class "Lanes::Model"
30
+ t.layout do |l|
31
+ l.string :description, :secret_field, :notes
32
+ end
33
+ end
34
+
35
+ m.create_table do |t|
36
+ t.model_name :Tmhm
37
+ t.parent_class "Lanes::Model"
38
+ t.layout do |l|
39
+ l.integer :test_model_id
40
+ l.string :description, :secret_field, :notes
41
+ end
42
+ end
43
+ Tmhm.blacklist_attributes :secret_field
44
+
45
+ Lanes::Access.calculate_model_access!
46
+ yield
47
+
48
+ TestModel.blacklisted_attributes.clear if TestModel.blacklisted_attributes
49
+
50
+ end
51
+ end
52
+
53
+
54
+ end
@@ -0,0 +1,7 @@
1
+ require_relative 'spec_helper'
2
+
3
+
4
+ class UserRoleTest < Lanes::TestCase
5
+
6
+
7
+ end
data/spec/user_spec.rb ADDED
@@ -0,0 +1,53 @@
1
+ require_relative 'spec_helper'
2
+
3
+ describe Lanes::User do
4
+
5
+ before do
6
+ @user = Lanes::User.new( login: 'test', email: 'bob@test.com', name: 'Bob', password: 'testtest')
7
+ end
8
+
9
+ it "validates attributes" do
10
+ user = Lanes::User.new
11
+ refute_saves user, 'login'
12
+ user.assign_attributes login: 'test', email: 'bob', name: 'Bob'
13
+ refute_saves user, 'email'
14
+ user.email = 'bob@test.com'
15
+ refute_saves user, 'password'
16
+ user.password = 'password'
17
+ assert_saves user
18
+ end
19
+
20
+ it "sets roles" do
21
+ @user.role_names = ['administrator']
22
+ assert_saves @user
23
+ assert_equal [ 'administrator' ], @user.role_names
24
+ end
25
+
26
+ it "can has built-in roles" do
27
+ @support = Lanes::User.new( login: 'test', email: 'support@test.com', name: 'support Bob',
28
+ password: 'testtest', role_names:['support'])
29
+ @admin = Lanes::User.new( login: 'test', email: 'admin@test.com', name: 'admin Bob',
30
+ password: 'testtest', role_names:['administrator'])
31
+
32
+ assert @admin.can_read?(@support)
33
+ assert @admin.can_write?(@support)
34
+
35
+ assert @support.can_read?(@admin)
36
+ refute @support.can_write?(@admin)
37
+ end
38
+
39
+ it "can be set from attribute data" do
40
+ attrs = { login: 'test', email: 'bob', name: 'Bob', password:'password' }
41
+ assert_equal attrs, @user.set_attribute_data( attrs, lanes_users(:admin) )
42
+ end
43
+
44
+ it "users can update themselves" do
45
+ user = lanes_users(:support)
46
+ admin = lanes_users(:admin)
47
+ attrs = { id: 34, login: 'test', email: 'bob', name: 'Bob', password:'password' }
48
+ assert_empty admin.set_attribute_data( attrs, user )
49
+ attrs[:id] = user.id
50
+ assert_equal( {email: 'bob', name: 'Bob', password:'password'}, user.set_attribute_data(attrs, user) )
51
+ end
52
+
53
+ end
@@ -0,0 +1,22 @@
1
+ require 'lanes'
2
+ require 'active_support/core_ext/string/strip'
3
+ require 'fileutils'
4
+ ## quite a bit of this is cribbed from Sinatra ActiveRecord
5
+
6
+ load 'active_record/railties/databases.rake'
7
+ require 'rake'
8
+
9
+
10
+ namespace :db do
11
+
12
+ task :environment do
13
+ Lanes::DB.configure_rake_environment
14
+ end
15
+
16
+ desc "create an ActiveRecord migration"
17
+ task :create_migration,[ :name ] do | t, args |
18
+ Lanes::DB.create_migration( "create_skr_" + args[:name] )
19
+ end
20
+
21
+
22
+ end
@@ -0,0 +1,8 @@
1
+ namespace :publish do
2
+
3
+ desc "generate and publish docs to stockor.org"
4
+ task :docs => 'doc' do
5
+ system( "rsync", "doc/", "-avz", "--delete", "stockor@stockor.org:~/docs/core")
6
+ end
7
+
8
+ end
data/views/index.erb ADDED
@@ -0,0 +1,29 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no, minimal-ui"/>
7
+ <title><%= Lanes.config.app_title %></title>
8
+
9
+ <%= javascript_tag 'lanes-workspace.js' %>
10
+ <%= stylesheet_tag 'lanes-workspace' %>
11
+
12
+
13
+ <script type="text/javascript">
14
+ Lanes.Workspace.create('.lanes-test-root', {
15
+ csrf_token: "<%= csrf_token %>",
16
+ view: 'Lanes.Workspace.Layout',
17
+ user_data: <%= user_data %>,
18
+ root_path: "<%= lanes_api_url %>"
19
+ }, <%= bootstrap_data %> );
20
+ </script>
21
+ </head>
22
+
23
+ <body style="margin: 0; background-color: white;">
24
+
25
+ <div class="lanes-test-root">
26
+ </div>
27
+
28
+ </body>
29
+ </html>