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,51 @@
1
+ class Lanes::User
2
+ end
3
+
4
+ module Lanes::Concerns
5
+
6
+ # Extends Rails updated_by and created_by timestamps to also track who created and updated the model.
7
+ # It reads the current user's id from User.current_id when saving and updating the record
8
+ # The class_name for the created_by and updated_by is set to {Lanes::Configuration#user_model}
9
+ module TrackModifications
10
+ extend ActiveSupport::Concern
11
+
12
+ included do
13
+ class_attribute :record_modifications, :instance_writer=>false
14
+ self.record_modifications = true
15
+
16
+ belongs_to :created_by, :class_name=>Lanes::User
17
+ belongs_to :updated_by, :class_name=>Lanes::User
18
+
19
+ self.blacklist_attributes :created_at, :updated_at, :created_by_id, :updated_by_id
20
+ before_update :record_update_modifications
21
+ before_create :record_create_modifications
22
+ end
23
+
24
+ private
25
+
26
+ def _record_user_to_column( column )
27
+ user_id = Lanes::User.current_id ? Lanes::User.current_id : 0
28
+ write_attribute( column, user_id ) if self.class.column_names.include?( column )
29
+ end
30
+
31
+ def record_create_modifications
32
+ if self.record_modifications
33
+ _record_user_to_column('updated_by_id')
34
+ _record_user_to_column('created_by_id')
35
+ end
36
+ true
37
+ end
38
+
39
+ def record_update_modifications
40
+ if self.record_modifications && should_record_timestamps?
41
+ _record_user_to_column('updated_by_id')
42
+ end
43
+ true
44
+ end
45
+
46
+ def change_tracking_fields
47
+ %w{updated_by_id created_by_id updated_at created_at}
48
+ end
49
+ end
50
+
51
+ end
@@ -0,0 +1,53 @@
1
+ module Lanes
2
+ module Concerns
3
+
4
+ # @see ClassMethods
5
+ module VisibleIdIdentifier
6
+
7
+ extend ActiveSupport::Concern
8
+
9
+ module InstanceMethods
10
+
11
+ # setup the visible id to the next available #{Lanes::SequentialId}
12
+ # @return [Integer] the assigned ID
13
+ def assign_visible_id!
14
+ self.visible_id = Lanes::SequentialId.next_for( self.class )
15
+ end
16
+ end
17
+
18
+
19
+ # ### Visible ID Identifier Concern
20
+ # This adds the {#has_visible_id} class methods
21
+ module ClassMethods
22
+
23
+ # An auto-incrementing number that's user-visible.
24
+ # The visible_id is stored as an integer, but a string index is generated for
25
+ # querying by the sql like operator. The **with_visible_id** scope is available for this purpose
26
+ #
27
+ # The next number an also be adjusted by the end-user by setting {Lanes::SequentialId}
28
+ # so they can set the numbers to start at
29
+ # a specific point, which is useful for getting Invoice and other
30
+ # numbers to match up to a legacy system
31
+ def has_visible_id
32
+ include InstanceMethods
33
+ validates :visible_id, :presence=>{
34
+ :message=>"ID was not set (should be automatically chosen)"
35
+ }
36
+ alias_attribute :record_identifier, :visible_id
37
+ before_validation :assign_visible_id!, :on=>:create
38
+
39
+ export_scope :with_visible_id, lambda{ | visid |
40
+ if visid.to_s =~/%/
41
+ where( 'cast(visible_id as varchar) like ?', visid.to_s )
42
+ else
43
+ where( 'cast(visible_id as varchar) = ?', visid.to_s )
44
+ end
45
+ }
46
+
47
+ end
48
+
49
+ end
50
+ end
51
+
52
+ end
53
+ end
@@ -0,0 +1,85 @@
1
+ require_relative "concerns/attr_accessor_with_default"
2
+ require 'securerandom'
3
+
4
+ module Lanes
5
+
6
+ class Configuration
7
+ include Concerns::AttrAccessorWithDefault
8
+
9
+ # Since changing a config value inadvertently
10
+ # can have pretty drastic consequences that might not be
11
+ # discovered immediately, we log each time a value is changed
12
+ def self.config_option( name, default, options={} )
13
+ define_method( "#{name}=" ) do | value |
14
+ old_value = self.send( name )
15
+ if old_value && Lanes.logger && !options[:silent]
16
+ Lanes.logger.info "Config option #{name} changed from '#{old_value.inspect}' to '#{value.inspect}'"
17
+ end
18
+ instance_variable_set( "@#{name}", value )
19
+ if @observers.has_key?(name)
20
+ @observers[name].each{ |cb| cb.call(value, old_value) }
21
+ end
22
+ end
23
+ attr_reader_with_default(name, default)
24
+ end
25
+
26
+ def initialize
27
+ @observers=Hash.new{ |hash,key| hash[key] = Array.new }
28
+ end
29
+
30
+ def on_change(config, &block)
31
+ @observers[config.to_sym] << block
32
+ end
33
+
34
+ def get(config, &block)
35
+ value = self.send(config.to_sym)
36
+ if block
37
+ on_change(config,&block)
38
+ block.call( value, value )
39
+ end
40
+ value
41
+ end
42
+
43
+ end
44
+
45
+ class DefaultConfiguration < Configuration
46
+
47
+ # Since the Configuration class is essentially a singleton,
48
+ # we don't care about AttrReaderWithDefault sharing values between instances
49
+ # Therefore all the values are given directly and not enclosed in Procs/lambdas.
50
+
51
+ # Database tables will have this prefix applied to them
52
+ config_option :table_prefix, ''
53
+
54
+ config_option :debug_assets, false
55
+ config_option :default_javascript_tag_options, {}
56
+
57
+ config_option :environment, (ENV['RACK_ENV'] || 'development').to_sym
58
+ # The secret key to use for session cookies.
59
+ config_option :session_secret_key_base, '1234', silent: true
60
+ config_option :redis, { path: "/tmp/redis.sock" }
61
+ config_option :pubsub_key, nil
62
+ config_option :pubsub_host, nil
63
+ config_option :pubsub_timeout, 10
64
+
65
+ config_option :es6_transpiler_path, '6to5'
66
+ config_option :es6_transpiler_options, '-t '
67
+ config_option :app_title, "Lanes Test"
68
+
69
+ config_option :mounted_at, ''
70
+
71
+ config_option :specs_root, Pathname.getwd
72
+ end
73
+
74
+ class << self
75
+ @@config = DefaultConfiguration.new
76
+ def config
77
+ @@config
78
+ end
79
+
80
+ def configure
81
+ yield(@@config)
82
+ end
83
+ end
84
+
85
+ end
@@ -0,0 +1,178 @@
1
+ require 'lanes/configuration'
2
+
3
+ module Lanes
4
+
5
+ module DB
6
+
7
+ module TableFields
8
+
9
+ def hip_code_identifier
10
+ column( :code, :string, :null=>false )
11
+ hip_extra_indexes['code'] = {}
12
+ end
13
+
14
+ def hip_visible_id
15
+ column( :visible_id, :integer, :null=>false )
16
+ hip_extra_indexes['visible_id'] = {
17
+ function: 'CAST(visible_id AS VARCHAR)'
18
+ }
19
+ end
20
+
21
+ # track modifications
22
+ def hip_track_modifications( create_only: false )
23
+ column( :created_at, :datetime, :null=>false )
24
+ column( :created_by_id, :integer, :null=>false )
25
+ unless create_only
26
+ column( :updated_at, :datetime, :null=>false )
27
+ column( :updated_by_id, :integer, :null=>false )
28
+ end
29
+ end
30
+
31
+ def hip_currency( names, options )
32
+ options[ :precision ] ||= 15
33
+ options[ :scale ] ||= 2
34
+ column( names, :decimal, options )
35
+ end
36
+
37
+ # An hip_reference combines a belongs_to / has_one column
38
+ # with a postgresql foreign key reference.
39
+ def hip_reference( to_table, *args )
40
+ options = args.extract_options!
41
+
42
+ options[:column] ||= to_table.to_s + '_id'
43
+
44
+ column( options[:column], :integer, :null=>options[:null] || false )
45
+ to_table = options[:to_table] if options.has_key? :to_table
46
+
47
+ if options[:single]
48
+ to_table = to_table.to_s.pluralize
49
+ end
50
+ hip_foreign_keys[ to_table.to_sym ] = options
51
+ end
52
+
53
+ def hip_foreign_keys
54
+ @hip_foreign_keys ||= {}
55
+ end
56
+
57
+ def hip_extra_indexes
58
+ @hip_extra_indexs ||= {}
59
+ end
60
+ end
61
+
62
+ module MigrationMethods
63
+
64
+ def create_hip_table(table_name, *args, &block)
65
+ definition = nil
66
+ create_table( Lanes.config.table_prefix + table_name, *args ) do | td |
67
+ # Thanks for the trick from the Foreigner gem!
68
+ # in connection_adapters/abstract/schema_statements
69
+ definition = td
70
+ block.call(td) unless block.nil?
71
+ end
72
+ definition.hip_foreign_keys.each do |to_table, options |
73
+ hip_add_foreign_key( table_name, to_table, options )
74
+ end
75
+ definition.hip_extra_indexes.each do | index_column, options |
76
+ hip_add_index( table_name, index_column, options )
77
+ end
78
+ end
79
+
80
+ def hip_add_index( table_name, columns, options={} )
81
+ table_name = Lanes.config.table_prefix + table_name.to_s
82
+ if options[:function]
83
+ unique = options[:unique] ? 'unique' : ''
84
+ name = table_name + 'indx_' + columns
85
+ execute( "create #{unique} index #{name} on #{table_name}(#{options[:function]})" )
86
+ else
87
+ add_index( table_name, columns, options )
88
+ end
89
+ end
90
+
91
+ def hip_add_foreign_key( table_name, to_table, options = {} )
92
+ from_table = Lanes.config.table_prefix + table_name.to_s
93
+ to_table = Lanes.config.table_prefix + to_table.to_s
94
+ # table_name #from_table = Lanes.config.table_prefix + table_name
95
+ column = options[:column] || "#{to_table.to_s.singularize}_id"
96
+ foreign_key_name = options.key?(:name) ? options[:name].to_s : "#{from_table}_#{column}_fk"
97
+
98
+ primary_key = options[:primary_key] || "id"
99
+ dependency = case options[:dependent]
100
+ when :nullify then "ON DELETE SET NULL"
101
+ when :delete then "ON DELETE CASCADE"
102
+ when :restrict then "ON DELETE RESTRICT"
103
+ else ""
104
+ end
105
+ sql = "ALTER TABLE #{quote_table_name(from_table)} " +
106
+ "ADD CONSTRAINT #{quote_column_name(foreign_key_name)} " +
107
+ "FOREIGN KEY (#{quote_column_name(column)}) " +
108
+ "REFERENCES #{quote_table_name( to_table )}(#{primary_key})"
109
+ sql << " #{dependency}" if dependency.present?
110
+ sql << " #{options[:options]}" if options[:options]
111
+
112
+ execute(sql)
113
+ end
114
+
115
+ def drop_hip_table( table_name, *args )
116
+ drop_table( Lanes.config.table_prefix + table_name )
117
+ end
118
+
119
+ def remove_hip_index( table_name, column )
120
+ remove_index( Lanes.config.table_prefix + table_name, column )
121
+ end
122
+
123
+ end
124
+
125
+ module CommandRecorder
126
+ def create_hip_table(*args)
127
+ record(:create_hip_table, args)
128
+ end
129
+
130
+ def drop_hip_table(*args)
131
+ record(:drop_hip_table, args)
132
+ end
133
+
134
+ def invert_create_hip_table(args)
135
+ from_table, to_table, add_options = *args
136
+ add_options ||= {}
137
+ if add_options[:name]
138
+ options = {name: add_options[:name]}
139
+ elsif add_options[:column]
140
+ options = {column: add_options[:column]}
141
+ else
142
+ options = to_table
143
+ end
144
+ [:drop_hip_table, [from_table, options]]
145
+ end
146
+
147
+ def hip_add_index(*args)
148
+ record(:hip_add_index,args)
149
+ end
150
+ def invert_hip_add_index(args)
151
+ table, column = *args
152
+ [:remove_hip_index, [table, column]]
153
+ end
154
+
155
+ end
156
+
157
+ end
158
+
159
+ end
160
+
161
+
162
+ class ActiveRecord::Migration
163
+ def hip_prefix
164
+ Lanes.config.table_prefix
165
+ end
166
+ end
167
+
168
+ ActiveRecord::Migration::CommandRecorder.class_eval do
169
+ include Lanes::DB::CommandRecorder
170
+ end
171
+
172
+ ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.class_eval do
173
+ include Lanes::DB::MigrationMethods
174
+ end
175
+
176
+ ActiveRecord::ConnectionAdapters::TableDefinition.class_eval do
177
+ include Lanes::DB::TableFields
178
+ end
@@ -0,0 +1,13 @@
1
+ require 'pathname'
2
+
3
+ module Lanes
4
+ module DB
5
+ module Migrations
6
+ # The `paths` array is an extension point for other
7
+ mattr_accessor :paths
8
+ self.paths = [
9
+ Pathname.new(__FILE__).dirname.join("../../../db/migrate").realpath
10
+ ]
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,27 @@
1
+ require 'pathname'
2
+ require 'yaml'
3
+
4
+ module Lanes
5
+ module DB
6
+
7
+ class Seed
8
+
9
+ @@seeds = []
10
+
11
+ class << self
12
+
13
+ def add(&block)
14
+ @@seeds.push(block)
15
+ end
16
+
17
+ # Loads the database with seed models
18
+ def execute!
19
+ @@seeds.each(&:call)
20
+ end
21
+
22
+ end
23
+
24
+ end
25
+
26
+ end
27
+ end
data/lib/lanes/db.rb ADDED
@@ -0,0 +1,86 @@
1
+ require_relative 'db/seed'
2
+
3
+ module Lanes
4
+
5
+ module DB
6
+ extend self
7
+
8
+ attr_accessor(:config_file)
9
+
10
+ def establish_connection( env = ENV['RAILS_ENV'] || 'development')
11
+ file = config_file || 'config/database.yml'
12
+ config = YAML::load( IO.read( file ) )
13
+ ::ActiveRecord::Base.configurations = config
14
+ self.connect( ::ActiveRecord::Base.configurations[ env ] )
15
+ end
16
+
17
+ def connect( configuration )
18
+ ::ActiveRecord::Base.establish_connection( configuration )
19
+ end
20
+
21
+ def migration_exists?( file_name ) #:nodoc:
22
+ Dir.glob("#{migrations_dir}/[0-9]*_*.rb").grep(/\d+_#{file_name}.rb$/).first
23
+ end
24
+
25
+ def load_seed
26
+ load Pathname.new(__FILE__).dirname.join("../../db/seed.rb")
27
+ Seed.execute!
28
+ end
29
+
30
+ def configure_rake_environment
31
+ ActiveRecord::Tasks::DatabaseTasks.seed_loader = Lanes::DB
32
+ env = ENV['RAILS_ENV'] || 'development'
33
+ Lanes::DB.config_file ||= 'config/database.yml'
34
+ ENV['SCHEMA'] ||= 'db/schema.sql'
35
+ ENV['DB_STRUCTURE'] ||= 'db/schema.sql'
36
+ ActiveRecord::Base.schema_format = :sql
37
+ Lanes::DB.establish_connection( env )
38
+ ActiveRecord::Tasks::DatabaseTasks.database_configuration = ActiveRecord::Base.configurations
39
+ ActiveRecord::Tasks::DatabaseTasks.env = 'test'
40
+ ActiveRecord::Tasks::DatabaseTasks.migrations_paths = 'db/migrate'
41
+ ActiveRecord::Tasks::DatabaseTasks.current_config( :config => ActiveRecord::Base.configurations[ env ] )
42
+ end
43
+
44
+ def create_migration( migration_name )
45
+ STDERR.puts "Migration #{migration_name} already exists!" and return false if migration_exists?( migration_name )
46
+ migration_number = Time.now.utc.strftime("%Y%m%d%H%M%S")
47
+ migration_file = File.join(migrations_dir, "#{migration_number}_#{migration_name}.rb")
48
+ migration_class = migration_name.split("_").map(&:capitalize).join
49
+ File.open(migration_file, 'w') do |file|
50
+ file.write <<-MIGRATION.strip_heredoc
51
+ class #{migration_class} < ActiveRecord::Migration
52
+ def change
53
+ end
54
+ end
55
+ MIGRATION
56
+ end
57
+ end
58
+
59
+ def migrate(version = nil)
60
+ silence_activerecord do
61
+ migration_version = version ? version.to_i : version
62
+ ::ActiveRecord::Migrator.migrate( migrations_dir, migration_version )
63
+ end
64
+ end
65
+
66
+ def rollback(step = nil)
67
+ silence_activerecord do
68
+ migration_step = step ? step.to_i : 1
69
+ ::ActiveRecord::Migrator.rollback(migrations_dir, migration_step)
70
+ end
71
+ end
72
+
73
+ private
74
+
75
+ def migrations_dir
76
+ ::ActiveRecord::Migrator.migrations_paths.first
77
+ end
78
+
79
+ def silence_activerecord(&block)
80
+ old_logger = ::ActiveRecord::Base.logger
81
+ ::ActiveRecord::Base.logger = nil
82
+ yield if block_given?
83
+ ::ActiveRecord::Base.logger = old_logger
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,19 @@
1
+ module Lanes
2
+
3
+ class Environment
4
+ def test?
5
+ Lanes.config.environment == :test
6
+ end
7
+ def development?
8
+ Lanes.config.environment == :development
9
+ end
10
+ def production?
11
+ Lanes.config.environment == :production
12
+ end
13
+ end
14
+
15
+ # @return [Environment]
16
+ def self.env
17
+ @environment ||= Environment.new
18
+ end
19
+ end
@@ -0,0 +1,72 @@
1
+ module Lanes
2
+
3
+ class Extension
4
+
5
+ def initialize(*args)
6
+ end
7
+
8
+ class_attribute :identifier
9
+
10
+ # [String] The path for including the extension in the asset pipeline
11
+ class_attribute :logical_path
12
+
13
+
14
+ # [String] The directory that holds the the root of the asset pipeline
15
+ class_attribute :asset_path
16
+
17
+ class_attribute :before
18
+ class_attribute :after
19
+
20
+ def bootstrap_data(view)
21
+ {}
22
+ end
23
+
24
+ class << self
25
+
26
+ def load_after(extension)
27
+ self.after = extension
28
+ end
29
+
30
+ def load_before(extension)
31
+ self.before = extension
32
+ end
33
+
34
+ def active
35
+ unmapped = self.descendants
36
+ mapped = []
37
+ while unmapped.any?
38
+ mapped_count = mapped.length
39
+ unmapped.each do | ext |
40
+ if !ext.before && !ext.after
41
+ mapped.push(ext)
42
+ end
43
+ if ext.before && (position = mapped.find_index(ext.before))
44
+ mapped.insert(position, ext)
45
+ end
46
+ if ext.after && (position = mapped.find_index(ext.after))
47
+ mapped.insert(position+1, ext)
48
+ end
49
+ end
50
+ if mapped_count == mapped.length # we failed to add any extensions
51
+ Lanes.logger.info "Conflicting load directives. Some extensions will not be available"
52
+ end
53
+ unmapped -= mapped
54
+ end
55
+ mapped
56
+ end
57
+
58
+ def each(config={})
59
+ self.active.each{ |klass| yield klass.new(config) }
60
+ end
61
+
62
+ def bootstrap_data(env)
63
+ data = { 'roles' => Lanes::Access::Role.all_available }
64
+ each do | ext |
65
+ data[ext.identifier] = data.bootstrap_data(env)
66
+ end
67
+ return data
68
+ end
69
+ end
70
+
71
+ end
72
+ end
@@ -0,0 +1,5 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem "lanes", :path=>"/Users/nas/code/lanes" #"~><%= Lanes::VERSION %>"
4
+ gem "rake"
5
+ gem 'puma'
@@ -0,0 +1,13 @@
1
+ require "lanes/guard_tasks"
2
+
3
+ Lanes::GuardTasks.run(self, name: "<%= name %>") do | tests |
4
+
5
+ tests.client do
6
+
7
+ end
8
+
9
+ tests.server do
10
+
11
+ end
12
+
13
+ end
@@ -0,0 +1,9 @@
1
+ require 'lanes'
2
+ require 'puma/control_cli'
3
+
4
+ args = []
5
+
6
+ task :dev do
7
+ args.push('start')
8
+ Puma::ControlCLI.new(args).run
9
+ end
@@ -0,0 +1,9 @@
1
+ development:
2
+ adapter: postgresql
3
+ database: <%= name %>_dev
4
+ host: /tmp
5
+
6
+ test:
7
+ adapter: postgresql
8
+ database: <%= name %>_test
9
+ host: /tmp
@@ -0,0 +1,4 @@
1
+ require 'bundler'
2
+ Bundler.require
3
+ require 'lanes/api'
4
+ run Lanes::API::Root
@@ -0,0 +1,3 @@
1
+ module <%= name.camelize %>
2
+ VERSION=0.1
3
+ end
@@ -0,0 +1,8 @@
1
+ require "lanes"
2
+ require "<%= name %>/version.rb"
3
+
4
+ # The main namespace for <%= name.camelize %>
5
+ module <%= name.camelize %>
6
+
7
+
8
+ end
@@ -0,0 +1,36 @@
1
+ module Lanes
2
+ module Generators
3
+
4
+ class App < Thor::Group
5
+ include Thor::Actions
6
+
7
+ class_options :force => :boolean
8
+
9
+ class_option :test_framework, :type => :string
10
+ class_option :directory, :type=>:string
11
+
12
+ argument :name
13
+
14
+ def self.source_root
15
+ Pathname.new(__FILE__).dirname.join("app")
16
+ end
17
+
18
+ def initialize(*args)
19
+ super
20
+ self.destination_root = options[:directory] || name
21
+ end
22
+
23
+ def create_files
24
+ template "Gemfile"
25
+ template "Rakefile"
26
+ template "Guardfile"
27
+ template "config.ru"
28
+ template "config/database.yml"
29
+ template "lib/main_class.rb", "lib/#{name}.rb"
30
+ template "lib/main_class/version.rb", "lib/#{name}/version.rb"
31
+ empty_directory "tmp"
32
+ end
33
+
34
+ end
35
+ end
36
+ end