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,69 @@
1
+ // Core variables and mixins
2
+
3
+ $zindex-navbar: 1;
4
+ $zindex-dropdown: 30;
5
+ $zindex-popover: 30;
6
+ $zindex-tooltip: 10;
7
+ $zindex-navbar-fixed: 1;
8
+ $zindex-modal-background: 25;
9
+ $zindex-modal: 26;
10
+ $zindex-tooltip: 31;
11
+ $grid-gutter-width: 10px;
12
+ $popover-max-width: 320px;
13
+
14
+ @import "bootstrap/variables";
15
+ @import "bootstrap/mixins";
16
+
17
+ .lanes{
18
+
19
+ // Reset and dependencies
20
+ @import "bootstrap/normalize";
21
+ @import "bootstrap/print";
22
+ /* @import "bootstrap/glyphicons"; */
23
+
24
+ // Core CSS
25
+ @import "bootstrap/scaffolding";
26
+ @import "bootstrap/type";
27
+ @import "bootstrap/code";
28
+ @import "bootstrap-custom-grid";
29
+ /* @import "bootstrap/grid"; */
30
+ @import "bootstrap/tables";
31
+ @import "bootstrap/forms";
32
+ @import "bootstrap/buttons";
33
+
34
+ // Components
35
+ @import "bootstrap/component-animations";
36
+ @import "bootstrap/dropdowns";
37
+ @import "bootstrap/button-groups";
38
+ @import "bootstrap/input-groups";
39
+ @import "bootstrap/navs";
40
+ @import "bootstrap/navbar";
41
+ @import "bootstrap/breadcrumbs";
42
+ @import "bootstrap/pagination";
43
+ @import "bootstrap/pager";
44
+ @import "bootstrap/labels";
45
+ @import "bootstrap/badges";
46
+ @import "bootstrap/jumbotron";
47
+ @import "bootstrap/thumbnails";
48
+ @import "bootstrap/alerts";
49
+ @import "bootstrap/progress-bars";
50
+ @import "bootstrap/media";
51
+ @import "bootstrap/list-group";
52
+ @import "bootstrap/panels";
53
+ @import "bootstrap/responsive-embed";
54
+ @import "bootstrap/wells";
55
+ @import "bootstrap/close";
56
+
57
+ // Components w/ JavaScript
58
+ @import "bootstrap-custom-modals";
59
+
60
+ /* @import "bootstrap/modals"; */
61
+
62
+ @import "bootstrap/tooltip";
63
+ @import "bootstrap/popovers";
64
+ /* @import "bootstrap/carousel"; */
65
+
66
+ // Utility classes
67
+ @import "bootstrap/utilities";
68
+ @import "bootstrap/responsive-utilities";
69
+ }
@@ -0,0 +1,4 @@
1
+ .lanes {
2
+ // @import "dataTables/jquery.dataTables";
3
+ @import "dataTables/dataTables.scroller";
4
+ }
@@ -0,0 +1,9 @@
1
+ development:
2
+ adapter: postgresql
3
+ database: lanes_dev
4
+ host: /tmp
5
+
6
+ test:
7
+ adapter: postgresql
8
+ database: lanes_test
9
+ host: /tmp
data/config/puma.rb ADDED
@@ -0,0 +1,7 @@
1
+ #daemonize
2
+
3
+ workers 1 # should be same number of your CPU core
4
+ threads 1, 6
5
+
6
+ pidfile "tmp/lanes.pid"
7
+ #stdout_redirect 'log/lanes.log', 'log/lanes-error.log', true
data/config.ru ADDED
@@ -0,0 +1,4 @@
1
+ require 'bundler'
2
+ Bundler.require
3
+ require 'lanes/api'
4
+ run Lanes::API::Root
@@ -0,0 +1,17 @@
1
+ require 'lanes/db/migration_helpers'
2
+
3
+ class CreateHipUsers < ActiveRecord::Migration
4
+ def change
5
+ create_hip_table "users" do | t |
6
+ t.string :login, :name, :email, null: false
7
+ t.text :notes
8
+ t.string :password_digest, null: false
9
+ t.string :role_names, array: true, null:false, default: []
10
+ t.json :options, null: false, default: {}
11
+ t.hip_track_modifications
12
+ end
13
+
14
+ hip_add_index :users, :role_names, using: 'gin'
15
+
16
+ end
17
+ end
data/db/seed.rb ADDED
@@ -0,0 +1,37 @@
1
+ Lanes::DB::Seed.add do
2
+
3
+ # This could totes be better written
4
+
5
+ unless Lanes::User.exists?(1)
6
+ u = Lanes::User.new( name: "Administrator Tester", email: "admin-test@stockor.org",
7
+ login: "admin", role_names: ['administrator'] )
8
+ u.id = 1
9
+ u.password = "password"
10
+ u.save!
11
+ end
12
+
13
+ unless Lanes::User.exists?(2)
14
+ u = Lanes::User.new( name: "Accounting Tester", email: "accounting-test@stockor.org",
15
+ login: "accounting", role_names: ['accounting'] )
16
+ u.id = 2
17
+ u.password = "password"
18
+ u.save!
19
+ end
20
+
21
+ unless Lanes::User.exists?(3)
22
+ u = Lanes::User.new( name: "Customer Support Tester", email: "support-test@stockor.org",
23
+ login: "support", role_names: ['customer_support'] )
24
+ u.id = 3
25
+ u.password = "password"
26
+ u.save!
27
+ end
28
+
29
+ unless Lanes::User.exists?(4)
30
+ u = Lanes::User.new( name: "Purchasing Tester", email: "purchasing-test@stockor.org",
31
+ login: "purchasing", role_names: ['purchasing'] )
32
+ u.id = 4
33
+ u.password = "password"
34
+ u.save!
35
+ end
36
+
37
+ end
data/foo/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem "lanes", "~>0.2"
4
+
5
+ gemspec
data/foo/Guardfile ADDED
@@ -0,0 +1,13 @@
1
+ require "lanes/guard_tasks"
2
+
3
+ Lanes::GuardTasks.run(self, name: "foo") do | tests |
4
+
5
+ tests.client do
6
+
7
+ end
8
+
9
+ tests.server do
10
+
11
+ end
12
+
13
+ end
data/foo/foo/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem "lanes", "~>0.2"
4
+
5
+ gemspec
@@ -0,0 +1,7 @@
1
+ require 'lanes'
2
+
3
+ # The main entry point for Foo
4
+ class Foo
5
+
6
+
7
+ end
@@ -0,0 +1,3 @@
1
+ module Foo
2
+ VERSION=0.1
3
+ end
data/foo/lib/foo.rb ADDED
@@ -0,0 +1,8 @@
1
+ require "lanes"
2
+ require "foo/version.rb"
3
+
4
+ # The main namespace for Foo
5
+ module Foo
6
+
7
+
8
+ end
data/lanes.gemspec ADDED
@@ -0,0 +1,54 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'lanes/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+
8
+ spec.name = "lanes"
9
+ spec.version = Lanes::VERSION
10
+ spec.authors = ["Nathan Stitt"]
11
+ spec.email = ["nathan@argosity.com"]
12
+
13
+ spec.summary = %q{Stockor Core contains the models for the Stockor ERP system}
14
+ spec.description = %q{Stockor Core contains the ActiveRecord models and business logic for the Stockor ERP system}
15
+
16
+ spec.homepage = "http://stockor.org/"
17
+ spec.license = "MIT"
18
+
19
+ spec.files = `git ls-files`.split($/)
20
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
21
+ spec.test_files = spec.files.grep(%r{^test/})
22
+ spec.require_paths = ["lib"]
23
+
24
+ spec.required_ruby_version = ">= 2.0"
25
+
26
+ spec.add_dependency "activerecord", "~> 4.1"
27
+ spec.add_dependency "pg", "~> 0.17"
28
+ spec.add_dependency "sinatra", "~> 1.4"
29
+ spec.add_dependency "bcrypt-ruby", "~> 3.1"
30
+ spec.add_dependency "oj", "~> 2.1"
31
+ spec.add_dependency "message_bus", "~> 1.0"
32
+ spec.add_dependency "rack_csrf", "~> 2.5"
33
+ spec.add_dependency "sprockets", "~> 2.0"
34
+ spec.add_dependency "coffee-script", "~> 2.3"
35
+ spec.add_dependency "execjs", "~> 2.2"
36
+ spec.add_dependency "thor", "~> 0.19"
37
+
38
+ spec.add_dependency "sass", "~> 3.4"
39
+ spec.add_dependency "sass-css-importer", "~> 1.0"
40
+ spec.add_dependency "sprockets-helpers", "~> 1.1"
41
+
42
+ spec.add_dependency "guard", "~> 2.0"
43
+ spec.add_dependency "hashie", "~> 3.3"
44
+ spec.add_dependency "rack-test", "~> 0.6"
45
+ spec.add_dependency "minitest-around", "~> 0.2"
46
+ spec.add_dependency "guard-minitest", "~> 2.3"
47
+ spec.add_dependency "rake", "~> 10.0"
48
+ spec.add_dependency "jasmine-core", "~> 2.0"
49
+
50
+ spec.add_development_dependency "bundler", "~> 1.5"
51
+ spec.add_development_dependency "growl", "~> 1.0"
52
+ spec.add_development_dependency "pry-byebug", "~> 2.0"
53
+
54
+ end
@@ -0,0 +1,42 @@
1
+ require 'lanes/db/migrations'
2
+
3
+ module Lanes
4
+
5
+ module Migrations
6
+
7
+ class InstallGenerator < Rails::Generators::Base
8
+ include Rails::Generators::Migration
9
+
10
+ source_root Lanes::DB::Migrations.paths.first
11
+
12
+ Lanes::DB::Migrations.paths.slice(1..-1).each do | source_path |
13
+ source_paths << source_path
14
+ end
15
+
16
+ desc "Install Stockor migrations"
17
+ def self.next_migration_number(path)
18
+ unless @prev_migration_nr
19
+ @prev_migration_nr = Time.now.utc.strftime("%Y%m%d%H%M%S").to_i
20
+ else
21
+ @prev_migration_nr += 1
22
+ end
23
+ @prev_migration_nr.to_s
24
+ end
25
+
26
+ def copy_migrations
27
+ Lanes::DB::Migrations.paths.each do | source_path |
28
+
29
+ Pathname.glob( source_path.join('*') ).each do | migration |
30
+ from = File.basename( migration )
31
+ dest = from.gsub(/^\d+_(.*).rb$/,'\\1.rb')
32
+ if self.class.migration_exists?("db/migrate", "#{dest}")
33
+ say_status("skipped", "Migration #{dest} already exists")
34
+ else
35
+ migration_template( from, "db/migrate/#{dest}" )
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,43 @@
1
+ module Lanes
2
+ module Access
3
+
4
+ class LockedFields
5
+
6
+ @definitions = Hash.new{ |fields,klass|
7
+ fields[klass] = Hash.new{ |grants,field| grants[field] = [] }
8
+ }
9
+ class << self
10
+
11
+ # @param klass [Lanes::Model]
12
+ # @param field [Symbol]
13
+ # @param access_type [:read, :write]
14
+ # @return [Array<Role>] Roles that are allowed to access the field.
15
+ # An empty array indicates that the field is not locked and the Model
16
+ # should be used for determining access
17
+ def roles_needed_for(klass, attribute, access_type)
18
+ if @definitions.has_key?(klass) && @definitions[klass].has_key?(attribute)
19
+ @definitions[klass][attribute].each_with_object([]) do | grant, result |
20
+ result.push(grant[:role]) if grant[:only].nil? || grant[:only] == access_type
21
+ end
22
+ else
23
+ []
24
+ end
25
+ end
26
+
27
+ # Lock a given class and attribute to a given role
28
+ # @param klass [Lanes::Model]
29
+ # @param field [Symbol]
30
+ # @param only [:read, :write]
31
+ def lock(klass, field, role, only=nil)
32
+ @definitions[klass][field] << { role: role, only: only }
33
+ end
34
+
35
+ def definitions
36
+ @definitions
37
+ end
38
+ end
39
+
40
+ end
41
+
42
+ end
43
+ end
@@ -0,0 +1,58 @@
1
+ # N.B. Keep in sync with js/user-extension/lanes/extensions/user-access/Roles.coffee
2
+
3
+ module Lanes
4
+ module Access
5
+
6
+ class Role
7
+ class_attribute :read, :write, :delete
8
+
9
+ def initialize(user)
10
+ @user = user
11
+ end
12
+
13
+ def can_read?(model)
14
+ read.include?(model)
15
+ end
16
+
17
+ def can_write?(model)
18
+ write.include?(model)
19
+ end
20
+
21
+ def can_delete?(model)
22
+ delete.include?(model)
23
+ end
24
+
25
+ class << self
26
+ def grant_global_access(klass,types=[:read,:write,:delete])
27
+ types = [*types]
28
+ descendants.each do | child |
29
+ types.each{ |type| child.send(type).push(klass) }
30
+ end
31
+ end
32
+
33
+ def inherited(sub)
34
+ sub.read = []; sub.write = []; sub.delete = []
35
+ end
36
+
37
+ def grant( *klasses )
38
+ self.read.push( *klasses )
39
+ write.push( *klasses )
40
+ delete.push( *klasses )
41
+ end
42
+
43
+ def lock(klass, attribute)
44
+ LockedFields.lock( klass, attribute, self)
45
+ end
46
+
47
+ def lock_writes(klass, attribute)
48
+ LockedFields.lock( klass, attribute, self, :write)
49
+ end
50
+
51
+ def all_available
52
+ descendants.map{ |klass| klass.to_s.demodulize }
53
+ end
54
+ end
55
+ end
56
+
57
+ end
58
+ end
@@ -0,0 +1,75 @@
1
+ module Lanes
2
+ module Access
3
+
4
+ class RoleCollection
5
+ include Enumerable
6
+
7
+ def initialize(user)
8
+ @roles ||= user.role_names.map{ |name|
9
+ "Lanes::Access::Roles::#{name.classify}".safe_constantize
10
+ }.compact.map{ |klass| klass.new(user) }
11
+ end
12
+
13
+ def exposed_data
14
+ @roles.map{ |role| role.class.to_s.demodulize.downcase }
15
+ end
16
+
17
+ # @param model [Lanes::Model]
18
+ # @param attribute [Symbol]
19
+ # @return [Boolean] Can the User view the model?
20
+ def can_read?(model, attribute = nil)
21
+ klass=model_to_class(model)
22
+ test_access(klass, attribute, :read){ |role| role.can_read?(klass) }
23
+ end
24
+
25
+ # @param model [Lanes::Model]
26
+ # @param attribute [Symbol]
27
+ # @return [Boolean] Can the User create and update the model?
28
+ def can_write?(model, attribute = nil)
29
+ klass=model_to_class(model)
30
+ test_access(klass, attribute, :write){ |role| role.can_write?(klass) }
31
+ end
32
+
33
+ # @param model [Lanes::Model]
34
+ # @param id [Fixnum] the id of the record to remove
35
+ # @return [Boolean] Can the User delete the model?
36
+ def can_delete?(model,id)
37
+ klass=model_to_class(model)
38
+ @roles.each{ |role| role.can_delete?(klass) }
39
+ end
40
+
41
+ # @return [Array<symbol>] list of roles
42
+ def to_sym
43
+ @roles.map{ |r| r.class.to_s.demodulize.downcase.to_sym }
44
+ end
45
+
46
+ def each
47
+ @roles.each{|r| yield r}
48
+ end
49
+
50
+ private
51
+
52
+ def model_to_class(model)
53
+ model.is_a?(Class) ? model : model.class
54
+ end
55
+
56
+ # Test if the given roles grant access to the model
57
+ def test_access(model, attribute, access_type)
58
+ # Check if the attribute is locked
59
+ # If it is, the locks determine access, otherwise use the model's grants
60
+ roles = LockedFields.roles_needed_for(model, attribute, access_type)
61
+ if roles.empty?
62
+ return !!@roles.detect { |role| yield role }.present?
63
+ else
64
+ !!roles.find { |role| @roles.map(&:class).include?(role) }
65
+ end
66
+ end
67
+
68
+ end
69
+
70
+ end
71
+ end
72
+
73
+
74
+ require_relative "roles/support"
75
+ require_relative "roles/administrator"
@@ -0,0 +1,25 @@
1
+ module Lanes
2
+ module Access
3
+
4
+ module Roles
5
+
6
+ class Administrator < Role
7
+
8
+ def self.grant_global_access!
9
+
10
+ self.grant( *Lanes::Model.descendants )
11
+
12
+ LockedFields.definitions.each do | klass, fields |
13
+ fields.each do |field, grants|
14
+ grants.push({ role: self, only: nil })
15
+ end
16
+ end
17
+ end
18
+
19
+ lock User, :password_digest
20
+ end
21
+
22
+ end
23
+
24
+ end
25
+ end
@@ -0,0 +1,13 @@
1
+ module Lanes
2
+ module Access
3
+
4
+ module Roles
5
+
6
+ class Support < Role
7
+ self.read << User
8
+ end
9
+
10
+ end
11
+
12
+ end
13
+ end
@@ -0,0 +1,32 @@
1
+ require 'pathname'
2
+
3
+ module Lanes
4
+ module Access
5
+
6
+ class WorkspaceScreen < Workspace::ScreenDefinition
7
+
8
+ def specification
9
+ {
10
+ id: 'users-management',
11
+ title: 'Users',
12
+ description: 'Create and maintain Users',
13
+ icon: 'icon-user',
14
+ group_id: 'customers',
15
+ view: 'UserManagement',
16
+ model: 'User'
17
+ }
18
+ end
19
+
20
+ def asset_path
21
+ Pathname.new(__FILE__).dirname.join("../../../js/screen").realpath
22
+ end
23
+
24
+ def asset_file_names
25
+ [ 'lanes/access/users-management.js' ]
26
+ end
27
+
28
+ end
29
+
30
+ end
31
+
32
+ end
@@ -0,0 +1,50 @@
1
+ module Lanes
2
+
3
+ module Access
4
+
5
+ class << self
6
+
7
+ def _type_to_str(klass)
8
+ klass.to_s.demodulize.underscore
9
+ end
10
+
11
+ def for_user( user )
12
+ {
13
+ :roles => user.roles.map{ | role |
14
+ {
15
+ type: _type_to_str(role.class),
16
+ read: role.read.map{ |klass| _type_to_str(klass) },
17
+ write: role.write.map{ |klass| _type_to_str(klass) },
18
+ delete: role.delete.map{ |klass| _type_to_str(klass) }
19
+ }
20
+ },
21
+ :locked_fields => LockedFields.definitions.map{ | klass, locks |
22
+ {
23
+ type: _type_to_str(klass),
24
+ locks: locks.each_with_object({}) do |(field, grants), result|
25
+ result[field] = grants.map do |grant|
26
+ { role: _type_to_str(grant[:role]), only: grant[:only] }
27
+ end
28
+ end
29
+ }
30
+ }
31
+ }
32
+ end
33
+
34
+ def calculate_model_access!
35
+ Roles::Administrator.grant_global_access!
36
+ end
37
+
38
+
39
+ end
40
+ end
41
+
42
+ end
43
+
44
+ require_relative 'access/locked_fields'
45
+ require_relative 'access/role'
46
+ require_relative 'access/role_collection'
47
+
48
+ Lanes::Access.calculate_model_access!
49
+ # require_relative 'access/user_maint_screen'
50
+ # require_relative 'access/workspace_extension'
@@ -0,0 +1,59 @@
1
+ require 'sprockets'
2
+ require 'sass'
3
+ require 'sass-css-importer'
4
+ require 'sinatra/sprockets-helpers'
5
+ require_relative 'javascript_processor'
6
+
7
+ module Lanes
8
+ module API
9
+ module AssetPipeline
10
+
11
+ def self.configure(env)
12
+ root = Pathname.new(__FILE__).dirname.join("../../..")
13
+ Lanes.config.get(:environment) do
14
+ if Lanes.env.development?
15
+ env.cache = Sprockets::Cache::FileStore.new(root.join('tmp','cache'))
16
+ end
17
+ end
18
+ env.append_path root.join('client', 'javascripts')
19
+ env.append_path root.join('client', 'stylesheets')
20
+ env.append_path root.join('client', 'screens')
21
+ env.append_path root.join('client', 'images')
22
+
23
+ JsAssetCompiler.register(env)
24
+ end
25
+
26
+ def self.registered(app)
27
+ app.register Sinatra::Sprockets::Helpers
28
+
29
+ app.set :sprockets, Sprockets::Environment.new
30
+ configure(app.sprockets)
31
+
32
+ # The url for client
33
+ app.set :assets_prefix, '/assets'
34
+
35
+ app.set :digest_assets, false
36
+
37
+ app.configure do
38
+
39
+ Sprockets::Helpers.configure do |config|
40
+ config.environment = app.sprockets
41
+ config.prefix = app.assets_prefix
42
+ config.digest = app.digest_assets
43
+ config.public_path = app.public_folder
44
+ config.debug = true
45
+ end
46
+ end
47
+
48
+ app.configure :test, :development do
49
+ app.get "#{app.assets_prefix}/*" do |path|
50
+ env_sprockets = request.env.dup
51
+ env_sprockets['PATH_INFO'] = path
52
+ settings.sprockets.call env_sprockets
53
+ end
54
+ end
55
+ end
56
+
57
+ end
58
+ end
59
+ end