luca 0.9.76 → 0.9.89

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 (457) hide show
  1. data/CHANGELOG +65 -2
  2. data/Gemfile +4 -0
  3. data/Gemfile.lock +18 -2
  4. data/Guardfile +3 -25
  5. data/README.md +50 -58
  6. data/ROADMAP +15 -32
  7. data/Rakefile +18 -77
  8. data/app.rb +12 -46
  9. data/{assets → app/assets}/images/glyphicons-halflings-white.png +0 -0
  10. data/{assets → app/assets}/images/glyphicons-halflings.png +0 -0
  11. data/app/assets/javascripts/luca-ui.js +1 -0
  12. data/app/assets/javascripts/luca/basic.coffee +8 -0
  13. data/{src → app/assets/javascripts/luca}/components/application.coffee +233 -65
  14. data/{src → app/assets/javascripts/luca}/components/collection_loader_view.coffee +0 -0
  15. data/app/assets/javascripts/luca/components/collection_view.coffee +207 -0
  16. data/{src → app/assets/javascripts/luca}/components/controller.coffee +27 -13
  17. data/{src/core/field.coffee → app/assets/javascripts/luca/components/fields/base.coffee} +18 -10
  18. data/{src → app/assets/javascripts/luca}/components/fields/button_field.coffee +8 -9
  19. data/{src → app/assets/javascripts/luca}/components/fields/checkbox_array.coffee +0 -0
  20. data/{src → app/assets/javascripts/luca}/components/fields/checkbox_field.coffee +0 -0
  21. data/{src → app/assets/javascripts/luca}/components/fields/file_upload_field.coffee +0 -0
  22. data/{src → app/assets/javascripts/luca}/components/fields/hidden_field.coffee +0 -0
  23. data/{src → app/assets/javascripts/luca}/components/fields/label_field.coffee +0 -0
  24. data/app/assets/javascripts/luca/components/fields/select_field.coffee +159 -0
  25. data/app/assets/javascripts/luca/components/fields/text_area_field.coffee +57 -0
  26. data/{src → app/assets/javascripts/luca}/components/fields/text_field.coffee +9 -3
  27. data/{src → app/assets/javascripts/luca}/components/fields/type_ahead_field.coffee +0 -0
  28. data/app/assets/javascripts/luca/components/form_view.coffee +421 -0
  29. data/app/assets/javascripts/luca/components/grid_layout_view.coffee +43 -0
  30. data/app/assets/javascripts/luca/components/index.coffee +7 -0
  31. data/app/assets/javascripts/luca/components/load_mask.coffee +8 -0
  32. data/{src → app/assets/javascripts/luca}/components/multi_collection_view.coffee +34 -34
  33. data/app/assets/javascripts/luca/components/nav_bar.coffee +80 -0
  34. data/app/assets/javascripts/luca/components/page.coffee +69 -0
  35. data/app/assets/javascripts/luca/components/page_controller.coffee +3 -0
  36. data/{src → app/assets/javascripts/luca}/components/pagination_control.coffee +13 -13
  37. data/{src → app/assets/javascripts/luca}/components/record_manager.coffee +0 -0
  38. data/{src → app/assets/javascripts/luca}/components/router.coffee +4 -1
  39. data/app/assets/javascripts/luca/components/simple_collection_view.coffee +10 -0
  40. data/app/assets/javascripts/luca/components/table_view.coffee +93 -0
  41. data/app/assets/javascripts/luca/components/table_view_scrollable.coffee +23 -0
  42. data/{src → app/assets/javascripts/luca}/concerns/application_event_bindings.coffee +1 -1
  43. data/app/assets/javascripts/luca/concerns/collection_event_bindings.coffee +47 -0
  44. data/{src → app/assets/javascripts/luca}/concerns/deferrable.coffee +1 -2
  45. data/app/assets/javascripts/luca/concerns/development_tool_helpers.coffee +30 -0
  46. data/{src → app/assets/javascripts/luca}/concerns/dom_helpers.coffee +10 -7
  47. data/{src → app/assets/javascripts/luca}/concerns/enhanced_properties.coffee +0 -0
  48. data/{src → app/assets/javascripts/luca}/concerns/filterable.coffee +39 -20
  49. data/app/assets/javascripts/luca/concerns/form_model_bindings.coffee +20 -0
  50. data/{src → app/assets/javascripts/luca}/concerns/grid_layout.coffee +0 -0
  51. data/{src → app/assets/javascripts/luca}/concerns/loadmaskable.coffee +17 -11
  52. data/{src → app/assets/javascripts/luca}/concerns/local_storage.coffee +0 -0
  53. data/app/assets/javascripts/luca/concerns/modal_view.coffee +63 -0
  54. data/{src → app/assets/javascripts/luca}/concerns/model_presenter.coffee +0 -0
  55. data/{src → app/assets/javascripts/luca}/concerns/paginatable.coffee +6 -20
  56. data/{src → app/assets/javascripts/luca}/concerns/query_collection_bindings.coffee +16 -8
  57. data/app/assets/javascripts/luca/concerns/sortable.coffee +69 -0
  58. data/app/assets/javascripts/luca/concerns/state_model.coffee +58 -0
  59. data/{src → app/assets/javascripts/luca}/concerns/templating.coffee +6 -1
  60. data/app/assets/javascripts/luca/config.coffee +54 -0
  61. data/{src → app/assets/javascripts/luca}/containers/card_view.coffee +23 -8
  62. data/{src/core → app/assets/javascripts/luca/containers}/container.coffee +228 -77
  63. data/app/assets/javascripts/luca/containers/index.coffee +2 -0
  64. data/{src → app/assets/javascripts/luca}/containers/modal_view.coffee +1 -1
  65. data/{src → app/assets/javascripts/luca}/containers/panel_toolbar.coffee +5 -6
  66. data/{src → app/assets/javascripts/luca}/containers/tab_view.coffee +19 -10
  67. data/{src → app/assets/javascripts/luca}/containers/viewport.coffee +11 -12
  68. data/{src → app/assets/javascripts/luca}/core/collection.coffee +37 -23
  69. data/{src/components → app/assets/javascripts/luca/core}/collection_view.coffee +21 -38
  70. data/{src/plugins → app/assets/javascripts/luca/core}/events.coffee +38 -6
  71. data/app/assets/javascripts/luca/core/index.coffee +12 -0
  72. data/{src → app/assets/javascripts/luca}/core/model.coffee +1 -1
  73. data/{src → app/assets/javascripts/luca}/core/observer.coffee +0 -0
  74. data/app/assets/javascripts/luca/core/panel.coffee +124 -0
  75. data/{src/define.coffee → app/assets/javascripts/luca/core/registry/component_definition.coffee} +59 -8
  76. data/{src → app/assets/javascripts/luca/core/registry}/concerns.coffee +0 -0
  77. data/app/assets/javascripts/luca/core/registry/index.coffee +4 -0
  78. data/{src/core → app/assets/javascripts/luca/core/registry}/meta_data.coffee +6 -0
  79. data/{src/core → app/assets/javascripts/luca/core/registry}/registry.coffee +20 -14
  80. data/app/assets/javascripts/luca/core/templates.coffee +51 -0
  81. data/app/assets/javascripts/luca/core/view.coffee +364 -0
  82. data/app/assets/javascripts/luca/dependencies.coffee +9 -0
  83. data/{src/tools → app/assets/javascripts/luca/development}/code_mirror_field.coffee +2 -1
  84. data/app/assets/javascripts/luca/development/code_sync_manager.coffee +126 -0
  85. data/app/assets/javascripts/luca/development/component.coffee +76 -0
  86. data/app/assets/javascripts/luca/development/components.coffee +57 -0
  87. data/{src/tools → app/assets/javascripts/luca/development}/console.coffee +6 -5
  88. data/app/assets/javascripts/luca/development/index.coffee +5 -0
  89. data/{src → app/assets/javascripts/luca}/framework.coffee +16 -99
  90. data/app/assets/javascripts/luca/index.coffee +8 -0
  91. data/{src → app/assets/javascripts/luca}/managers/collection_manager.coffee +12 -8
  92. data/app/assets/javascripts/luca/managers/index.coffee +2 -0
  93. data/app/assets/javascripts/luca/managers/socket_manager.coffee +89 -0
  94. data/{src → app/assets/javascripts/luca}/templates/components/bootstrap_form_controls.jst.ejs +0 -0
  95. data/{src → app/assets/javascripts/luca}/templates/components/collection_loader_view.jst.ejs +0 -0
  96. data/{src → app/assets/javascripts/luca}/templates/components/form_alert.jst.ejs +0 -0
  97. data/{src → app/assets/javascripts/luca}/templates/components/grid_view.jst.ejs +0 -0
  98. data/{src → app/assets/javascripts/luca}/templates/components/grid_view_empty_text.jst.ejs +0 -0
  99. data/{src → app/assets/javascripts/luca}/templates/components/load_mask.jst.ejs +0 -0
  100. data/app/assets/javascripts/luca/templates/components/nav_bar.jst.ejs +19 -0
  101. data/{src → app/assets/javascripts/luca}/templates/components/pagination.jst.ejs +0 -0
  102. data/{src/templates → app/assets/javascripts/luca/templates/components}/table_view.jst.ejs +0 -0
  103. data/{src → app/assets/javascripts/luca}/templates/containers/basic.jst.ejs +0 -0
  104. data/{src → app/assets/javascripts/luca}/templates/containers/tab_selector_container.jst.ejs +0 -0
  105. data/app/assets/javascripts/luca/templates/containers/tab_view.jst.ejs +2 -0
  106. data/{src → app/assets/javascripts/luca}/templates/containers/toolbar_wrapper.jst.ejs +0 -0
  107. data/{src → app/assets/javascripts/luca}/templates/fields/button_field.jst.ejs +0 -0
  108. data/{src → app/assets/javascripts/luca}/templates/fields/button_field_link.jst.ejs +0 -0
  109. data/{src → app/assets/javascripts/luca}/templates/fields/checkbox_array.jst.ejs +0 -0
  110. data/{src → app/assets/javascripts/luca}/templates/fields/checkbox_array_item.jst.ejs +0 -0
  111. data/{src → app/assets/javascripts/luca}/templates/fields/checkbox_field.jst.ejs +0 -0
  112. data/{src → app/assets/javascripts/luca}/templates/fields/file_upload_field.jst.ejs +0 -0
  113. data/{src → app/assets/javascripts/luca}/templates/fields/hidden_field.jst.ejs +0 -0
  114. data/{src → app/assets/javascripts/luca}/templates/fields/select_field.jst.ejs +0 -0
  115. data/{src → app/assets/javascripts/luca}/templates/fields/text_area_field.jst.ejs +0 -0
  116. data/{src → app/assets/javascripts/luca}/templates/fields/text_field.jst.ejs +0 -0
  117. data/app/assets/javascripts/luca/util/deprecations.coffee +18 -0
  118. data/app/assets/javascripts/luca/util/index.coffee +4 -0
  119. data/app/assets/javascripts/luca/util/keybindings.coffee +24 -0
  120. data/app/assets/javascripts/luca/util/logging.coffee +30 -0
  121. data/{src/util.coffee → app/assets/javascripts/luca/util/luca.coffee} +27 -4
  122. data/{src/core → app/assets/javascripts/luca/util}/script_loader.coffee +0 -0
  123. data/{src/stylesheets → app/assets/stylesheets/luca}/components/checkbox_array.scss +0 -0
  124. data/app/assets/stylesheets/luca/components/form_view.scss +7 -0
  125. data/{src/stylesheets → app/assets/stylesheets/luca}/components/grid_view.scss +0 -0
  126. data/{src/stylesheets → app/assets/stylesheets/luca}/components/load_mask.scss +0 -0
  127. data/{vendor/assets/luca-ui/components/grid_view.css → app/assets/stylesheets/luca/components/table_view.scss} +60 -51
  128. data/{src/stylesheets → app/assets/stylesheets/luca}/components/viewport.scss +0 -0
  129. data/app/assets/stylesheets/luca/containers/container.scss +19 -0
  130. data/{src/stylesheets → app/assets/stylesheets/luca}/containers/modal_view.scss +0 -0
  131. data/{src/stylesheets → app/assets/stylesheets/luca}/containers/panels.scss +0 -0
  132. data/{src/stylesheets → app/assets/stylesheets/luca}/containers/tab_view.scss +0 -0
  133. data/{src/stylesheets/tools → app/assets/stylesheets/luca/development}/console.scss +0 -0
  134. data/app/assets/stylesheets/luca/development/index.css +3 -0
  135. data/app/assets/stylesheets/luca/index.css +4 -0
  136. data/{src/stylesheets → app/assets/stylesheets/luca}/normalize.scss +0 -0
  137. data/config.ru +1 -2
  138. data/docs/framework.json +1 -0
  139. data/docs/{application.md → old/application.md} +0 -0
  140. data/docs/{collection.md → old/collection.md} +0 -0
  141. data/docs/{collection_manager.md → old/collection_manager.md} +0 -0
  142. data/docs/{container_philosophy.md → old/container_philosophy.md} +0 -0
  143. data/docs/{event_binding_helpers.md → old/event_binding_helpers.md} +0 -0
  144. data/docs/{method_caching_and_computed_properties.md → old/method_caching_and_computed_properties.md} +0 -0
  145. data/docs/{view.md → old/view.md} +0 -0
  146. data/lib/generators/luca/application/application_generator.rb +12 -8
  147. data/lib/generators/luca/application/templates/controller.rb +0 -2
  148. data/lib/generators/luca/application/templates/index.html.erb +12 -0
  149. data/lib/generators/luca/application/templates/index.html.haml +1 -0
  150. data/lib/generators/luca/application/templates/javascripts/application.coffee +18 -0
  151. data/lib/generators/luca/application/templates/javascripts/collection_manager.coffee +2 -0
  152. data/lib/generators/luca/application/templates/javascripts/config.coffee +3 -0
  153. data/lib/generators/luca/application/templates/javascripts/dependencies.coffee +3 -0
  154. data/lib/generators/luca/application/templates/javascripts/home.jst.ejs +2 -0
  155. data/lib/generators/luca/application/templates/javascripts/index.coffee +15 -0
  156. data/lib/generators/luca/application/templates/javascripts/router.coffee +4 -0
  157. data/lib/guard/luca.rb +84 -0
  158. data/lib/luca.rb +18 -1
  159. data/lib/luca/asset_compiler.rb +117 -0
  160. data/lib/luca/collection.rb +64 -0
  161. data/lib/luca/collection/endpoint.rb +37 -0
  162. data/lib/luca/collection/file_backend.rb +121 -0
  163. data/lib/luca/collection/redis_backend.rb +153 -0
  164. data/lib/luca/compiled_asset.rb +61 -0
  165. data/lib/luca/component_definition.rb +338 -0
  166. data/lib/luca/luca_application.rb +247 -0
  167. data/lib/luca/project.rb +73 -0
  168. data/lib/luca/project_harness.rb +96 -0
  169. data/lib/luca/rails.rb +5 -3
  170. data/lib/luca/rails/engine.rb +12 -0
  171. data/lib/luca/rails/version.rb +1 -2
  172. data/lib/luca/stylesheet.rb +36 -0
  173. data/lib/luca/template.rb +2 -0
  174. data/lib/luca/template_asset.rb +64 -0
  175. data/lib/railties/luca/tasks.rake +38 -0
  176. data/spec/{components → javascripts/components}/application_spec.coffee +0 -0
  177. data/spec/{components → javascripts/components}/collection_loader_view_spec.coffee +0 -0
  178. data/spec/{components → javascripts/components}/collection_view_spec.coffee +0 -0
  179. data/spec/{components → javascripts/components}/controller_spec.coffee +4 -0
  180. data/spec/{components → javascripts/components}/fields/checkbox_array_spec.coffee +0 -0
  181. data/spec/javascripts/components/form_view_spec.coffee +162 -0
  182. data/spec/{components → javascripts/components}/grid_view_spec.coffee +0 -0
  183. data/spec/{components → javascripts/components}/multi_collection_view_spec.coffee +0 -0
  184. data/spec/{components → javascripts/components}/pagination_control_spec.coffee +0 -0
  185. data/spec/{components → javascripts/components}/record_manager_spec.coffee +0 -0
  186. data/spec/{components → javascripts/components}/table_view_spec.coffee +0 -0
  187. data/spec/{components → javascripts/components}/template_spec.coffee +0 -0
  188. data/spec/javascripts/concerns/collection_event_bindings_spec.coffee +15 -0
  189. data/spec/{concerns → javascripts/concerns}/dom_helpers_spec.coffee +2 -2
  190. data/spec/{concerns → javascripts/concerns}/filterable_spec.coffee +4 -4
  191. data/spec/{concerns → javascripts/concerns}/model_presenter_spec.coffee +0 -0
  192. data/spec/{concerns → javascripts/concerns}/paginatable_spec.coffee +0 -0
  193. data/spec/javascripts/concerns/state_model_spec.coffee +55 -0
  194. data/spec/{containers → javascripts/containers}/card_view_spec.coffee +5 -0
  195. data/spec/{containers → javascripts/containers}/modal_view_spec.coffee +0 -0
  196. data/spec/{containers → javascripts/containers}/panel_view_spec.coffee +0 -0
  197. data/spec/{containers → javascripts/containers}/tab_view_spec.coffee +0 -0
  198. data/spec/{containers → javascripts/containers}/viewport_spec.coffee +0 -0
  199. data/spec/{core → javascripts/core}/collection_spec.coffee +25 -0
  200. data/spec/{concerns_spec.coffee → javascripts/core/concerns_spec.coffee} +0 -0
  201. data/spec/{core → javascripts/core}/container_spec.coffee +8 -6
  202. data/spec/{define_spec.coffee → javascripts/core/define_spec.coffee} +0 -0
  203. data/spec/javascripts/core/events_spec.coffee +26 -0
  204. data/spec/{core → javascripts/core}/field_spec.coffee +0 -0
  205. data/spec/{framework_spec.coffee → javascripts/core/framework_spec.coffee} +1 -1
  206. data/spec/{core → javascripts/core}/model_spec.coffee +0 -0
  207. data/spec/{core → javascripts/core}/observer_spec.coffee +0 -0
  208. data/spec/{util_spec.coffee → javascripts/core/util_spec.coffee} +2 -2
  209. data/spec/{core → javascripts/core}/view_spec.coffee +114 -38
  210. data/spec/javascripts/dependencies/index.coffee +3 -0
  211. data/{assets → spec}/javascripts/dependencies/jasmine-html.js +0 -0
  212. data/{assets → spec}/javascripts/dependencies/jasmine.js +0 -0
  213. data/{assets → spec}/javascripts/dependencies/sinon.js +0 -0
  214. data/spec/{helper.coffee → javascripts/helper.coffee} +0 -0
  215. data/spec/{managers → javascripts/managers}/collection_manager_spec.coffee +0 -0
  216. data/spec/{managers → javascripts/managers}/socket_manager_spec.coffee +0 -0
  217. data/spec/lib/component_definition_spec.rb +63 -0
  218. data/spec/lib/input_compiler_spec.rb +9 -0
  219. data/spec/lib/luca_application_spec.rb +30 -0
  220. data/spec/support/fixtures/application.coffee +45 -0
  221. data/spec/support/fixtures/component.coffee +34 -0
  222. data/{assets/javascripts/sandbox/views/inspector/instance_list.coffee → tutorials/component-definitions.md} +0 -0
  223. data/{spec/concerns/state_model_spec.coffee → tutorials/component-definitions/01_intro.md} +0 -0
  224. data/tutorials/component-driven-design.md +140 -0
  225. data/tutorials/structure-of-a-project.md +63 -0
  226. data/vendor/assets/javascripts/backbone-ext.js +21 -0
  227. data/vendor/assets/javascripts/backbone-min.js +38 -0
  228. data/vendor/assets/javascripts/backbone-query.min.js +1 -0
  229. data/vendor/assets/javascripts/bootstrap.min.js +7 -0
  230. data/{assets/javascripts/dependencies → vendor/assets/javascripts}/codemirror-coffeescript.js +0 -0
  231. data/{assets/javascripts/dependencies → vendor/assets/javascripts}/codemirror-css.js +0 -0
  232. data/{assets/javascripts/dependencies → vendor/assets/javascripts}/codemirror-html.js +0 -0
  233. data/{assets/javascripts/dependencies → vendor/assets/javascripts}/codemirror-javascript.js +0 -0
  234. data/{assets/javascripts/dependencies → vendor/assets/javascripts}/codemirror-less.js +0 -0
  235. data/vendor/assets/javascripts/codemirror-ui.js +503 -0
  236. data/{assets/javascripts/dependencies → vendor/assets/javascripts}/codemirror-vim.js +0 -0
  237. data/{assets/javascripts/dependencies → vendor/assets/javascripts}/codemirror.js +0 -0
  238. data/vendor/assets/javascripts/hogan.js +707 -0
  239. data/vendor/assets/javascripts/inflections.js +656 -0
  240. data/vendor/assets/javascripts/jasmine-html.js +190 -0
  241. data/vendor/assets/javascripts/jasmine.js +2476 -0
  242. data/{assets/javascripts/dependencies → vendor/assets/javascripts}/jquery.js +0 -0
  243. data/vendor/assets/javascripts/keymaster.min.js +4 -0
  244. data/vendor/assets/javascripts/luca-dependencies.min.js +6 -0
  245. data/vendor/assets/javascripts/luca-development.min.js +1 -0
  246. data/vendor/assets/javascripts/luca-spec.js +11 -0
  247. data/vendor/assets/javascripts/luca-ui.js +3336 -2561
  248. data/vendor/assets/javascripts/luca-ui.min.js +5 -5
  249. data/vendor/assets/javascripts/luca.full.min.js +10 -0
  250. data/vendor/assets/javascripts/luca.min.js +5 -0
  251. data/{assets/javascripts/dependencies → vendor/assets/javascripts}/modal.js +0 -0
  252. data/{assets/javascripts/dependencies → vendor/assets/javascripts}/modernizr.min.js +0 -0
  253. data/{assets/javascripts/dependencies → vendor/assets/javascripts}/prettify.js +0 -0
  254. data/vendor/assets/javascripts/sinon.js +3469 -0
  255. data/{assets/javascripts/dependencies → vendor/assets/javascripts}/spin-min.js +0 -0
  256. data/{assets/javascripts/dependencies → vendor/assets/javascripts}/underscore-min.js +0 -0
  257. data/vendor/assets/javascripts/underscore-string.min.js +1 -0
  258. data/vendor/assets/stylesheets/bootstrap-responsive.min.css +9 -0
  259. data/vendor/assets/stylesheets/bootstrap.min.css +9 -0
  260. data/{assets → vendor/assets}/stylesheets/codemirror-blackboard.css +0 -0
  261. data/{assets → vendor/assets}/stylesheets/codemirror-monokai.css +0 -0
  262. data/{assets → vendor/assets}/stylesheets/codemirror.css +0 -0
  263. data/{assets → vendor/assets}/stylesheets/jasmine.css +0 -0
  264. data/vendor/assets/stylesheets/luca-components.css +204 -0
  265. data/vendor/assets/stylesheets/luca-development.css +23 -0
  266. data/vendor/assets/stylesheets/luca-ui.css +58 -461
  267. data/views/jasmine.erb +2 -2
  268. metadata +280 -336
  269. data/assets/javascripts/dependencies.coffee +0 -5
  270. data/assets/javascripts/dependencies/backbone-min.js +0 -37
  271. data/assets/javascripts/dependencies/backbone-query.min.js +0 -1
  272. data/assets/javascripts/dependencies/bootstrap.min.js +0 -7
  273. data/assets/javascripts/dependencies/coffee-script.js +0 -12189
  274. data/assets/javascripts/dependencies/underscore-string.min.js +0 -14
  275. data/assets/javascripts/luca-templates.js +0 -1
  276. data/assets/javascripts/luca-ui-base.coffee +0 -1
  277. data/assets/javascripts/luca-ui-bootstrap.js +0 -1
  278. data/assets/javascripts/luca-ui-development-tools.coffee +0 -9
  279. data/assets/javascripts/luca-ui-full.js +0 -3
  280. data/assets/javascripts/luca-ui-spec.coffee +0 -2
  281. data/assets/javascripts/luca-ui.js +0 -3
  282. data/assets/javascripts/luca/index.coffee +0 -1
  283. data/assets/javascripts/sandbox.coffee +0 -7
  284. data/assets/javascripts/sandbox/application.coffee +0 -57
  285. data/assets/javascripts/sandbox/config.coffee +0 -7
  286. data/assets/javascripts/sandbox/router.coffee +0 -24
  287. data/assets/javascripts/sandbox/templates/builder.luca +0 -2
  288. data/assets/javascripts/sandbox/templates/builder/component_list.luca +0 -1
  289. data/assets/javascripts/sandbox/templates/main.luca +0 -53
  290. data/assets/javascripts/sandbox/templates/sandbox.luca +0 -1
  291. data/assets/javascripts/sandbox/templates/sandbox/docs_index.luca +0 -1
  292. data/assets/javascripts/sandbox/templates/sandbox/navigation.luca +0 -8
  293. data/assets/javascripts/sandbox/templates/sandbox/readme.luca +0 -30
  294. data/assets/javascripts/sandbox/views/builder.coffee +0 -133
  295. data/assets/javascripts/sandbox/views/builder/builder_canvas.coffee +0 -3
  296. data/assets/javascripts/sandbox/views/builder/builder_editor.coffee +0 -6
  297. data/assets/javascripts/sandbox/views/builder/component_list.coffee +0 -38
  298. data/assets/javascripts/sandbox/views/builder/project_browser.coffee +0 -14
  299. data/assets/javascripts/sandbox/views/docs_controller.coffee +0 -7
  300. data/assets/javascripts/sandbox/views/inspector.coffee +0 -11
  301. data/assets/javascripts/sandbox/views/inspector/instance_filter.coffee +0 -18
  302. data/assets/javascripts/sandbox/views/top_navigation.coffee +0 -4
  303. data/assets/javascripts/spec-dependencies.coffee +0 -4
  304. data/assets/stylesheets/bootstrap-responsive.min.css +0 -2
  305. data/assets/stylesheets/bootstrap.min.css +0 -727
  306. data/assets/stylesheets/luca-ui-bootstrap.css +0 -4
  307. data/assets/stylesheets/luca-ui-development-tools.css +0 -5
  308. data/assets/stylesheets/luca-ui-full.css +0 -3
  309. data/assets/stylesheets/luca-ui-spec.css +0 -3
  310. data/assets/stylesheets/luca-ui.css +0 -3
  311. data/assets/stylesheets/prettify.css +0 -40
  312. data/assets/stylesheets/sandbox.css +0 -3
  313. data/assets/stylesheets/sandbox/builder.scss +0 -79
  314. data/assets/stylesheets/sandbox/sandbox.scss +0 -18
  315. data/assets/stylesheets/themes/amelia-bootstrap.css +0 -826
  316. data/assets/stylesheets/themes/slate-bootstrap.css +0 -797
  317. data/assets/stylesheets/themes/superhero-bootstrap.css +0 -830
  318. data/lib/generators/luca/application/templates/javascripts/application.js +0 -28
  319. data/lib/generators/luca/application/templates/javascripts/application.js.coffee +0 -20
  320. data/lib/generators/luca/application/templates/javascripts/config.js +0 -15
  321. data/lib/generators/luca/application/templates/javascripts/config.js.coffee +0 -9
  322. data/lib/generators/luca/application/templates/javascripts/dependencies.js +0 -5
  323. data/lib/generators/luca/application/templates/javascripts/dependencies.js.coffee +0 -5
  324. data/lib/generators/luca/application/templates/javascripts/index.js +0 -9
  325. data/lib/generators/luca/application/templates/javascripts/index.js.coffee +0 -9
  326. data/lib/generators/luca/application/templates/javascripts/main.js +0 -8
  327. data/lib/generators/luca/application/templates/javascripts/main.js.coffee +0 -3
  328. data/lib/generators/luca/application/templates/javascripts/main.jst.ejs +0 -1
  329. data/lib/generators/luca/application/templates/javascripts/router.js +0 -12
  330. data/lib/generators/luca/application/templates/javascripts/router.js.coffee +0 -7
  331. data/lib/luca/code_browser.rb +0 -55
  332. data/lib/luca/command_line.rb +0 -69
  333. data/spec/components/form_view_spec.coffee +0 -84
  334. data/spec/containers/column_view_spec.coffee +0 -0
  335. data/spec/containers/split_view_spec.coffee +0 -0
  336. data/src/components/base_toolbar.coffee +0 -17
  337. data/src/components/fields/select_field.coffee +0 -96
  338. data/src/components/fields/text_area_field.coffee +0 -42
  339. data/src/components/form_button_toolbar.coffee +0 -28
  340. data/src/components/form_view.coffee +0 -282
  341. data/src/components/grid_view.coffee +0 -269
  342. data/src/components/index.coffee +0 -1
  343. data/src/components/load_mask.coffee +0 -3
  344. data/src/components/nav_bar.coffee +0 -22
  345. data/src/components/page_controller.coffee +0 -2
  346. data/src/components/table_view.coffee +0 -69
  347. data/src/components/template.coffee +0 -5
  348. data/src/components/toolbar_dialog.coffee +0 -25
  349. data/src/concerns/collection_event_bindings.coffee +0 -26
  350. data/src/concerns/modal_view.coffee +0 -38
  351. data/src/concerns/state_model.coffee +0 -16
  352. data/src/containers/column_view.coffee +0 -42
  353. data/src/containers/page_view.coffee +0 -2
  354. data/src/containers/panel_view.coffee +0 -23
  355. data/src/containers/split_view.coffee +0 -8
  356. data/src/core/core.coffee +0 -0
  357. data/src/core/panel.coffee +0 -118
  358. data/src/core/view.coffee +0 -172
  359. data/src/index.coffee +0 -25
  360. data/src/managers/socket_manager.coffee +0 -54
  361. data/src/plugins/development_tool_helpers.coffee +0 -21
  362. data/src/samples/definition.coffee +0 -49
  363. data/src/stylesheets/base.scss +0 -0
  364. data/src/stylesheets/components/form_view.scss +0 -59
  365. data/src/stylesheets/components/toolbar.scss +0 -0
  366. data/src/stylesheets/containers/container.scss +0 -11
  367. data/src/stylesheets/tools/class_browser.scss +0 -32
  368. data/src/stylesheets/tools/code_editor.scss +0 -24
  369. data/src/stylesheets/tools/component_tester.scss +0 -26
  370. data/src/templates/components/nav_bar.jst.ejs +0 -4
  371. data/src/templates/containers/tab_view.jst.ejs +0 -2
  372. data/src/tools/application_inspector.coffee +0 -2
  373. data/src/tools/code_editor.coffee +0 -258
  374. data/src/tools/coffee_script_editor.coffee +0 -82
  375. data/src/tools/collection_inspector.coffee +0 -4
  376. data/src/tools/collections/components.coffee +0 -59
  377. data/src/tools/collections/instances.coffee +0 -15
  378. data/src/tools/component_tester.coffee +0 -462
  379. data/src/tools/models/components.coffee +0 -25
  380. data/src/tools/models/instance.coffee +0 -2
  381. data/src/tools/templates/component_tester/help.luca +0 -14
  382. data/vendor/assets/javascripts/luca-ui-base.js +0 -5304
  383. data/vendor/assets/javascripts/luca-ui-bootstrap.js +0 -9
  384. data/vendor/assets/javascripts/luca-ui-development-tools.js +0 -18561
  385. data/vendor/assets/javascripts/luca-ui-development-tools.min.js +0 -15
  386. data/vendor/assets/javascripts/luca-ui-full.js +0 -6696
  387. data/vendor/assets/javascripts/luca-ui-full.min.js +0 -9
  388. data/vendor/assets/javascripts/luca-ui-spec.js +0 -6815
  389. data/vendor/assets/javascripts/luca-ui-templates.js +0 -92
  390. data/vendor/assets/luca-ui/base.css +0 -85
  391. data/vendor/assets/luca-ui/components/application.js +0 -91
  392. data/vendor/assets/luca-ui/components/base_toolbar.js +0 -23
  393. data/vendor/assets/luca-ui/components/controller.js +0 -38
  394. data/vendor/assets/luca-ui/components/fields/button_field.js +0 -45
  395. data/vendor/assets/luca-ui/components/fields/checkbox_field.js +0 -43
  396. data/vendor/assets/luca-ui/components/fields/file_upload_field.js +0 -20
  397. data/vendor/assets/luca-ui/components/fields/hidden_field.js +0 -20
  398. data/vendor/assets/luca-ui/components/fields/select_field.js +0 -97
  399. data/vendor/assets/luca-ui/components/fields/text_area_field.js +0 -48
  400. data/vendor/assets/luca-ui/components/fields/text_field.js +0 -46
  401. data/vendor/assets/luca-ui/components/fields/type_ahead_field.js +0 -13
  402. data/vendor/assets/luca-ui/components/form_button_toolbar.js +0 -32
  403. data/vendor/assets/luca-ui/components/form_view.css +0 -32
  404. data/vendor/assets/luca-ui/components/form_view.js +0 -207
  405. data/vendor/assets/luca-ui/components/grid_view.js +0 -202
  406. data/vendor/assets/luca-ui/components/record_manager.js +0 -207
  407. data/vendor/assets/luca-ui/components/router.js +0 -36
  408. data/vendor/assets/luca-ui/components/template.js +0 -26
  409. data/vendor/assets/luca-ui/components/toolbar.css +0 -11
  410. data/vendor/assets/luca-ui/containers/card_view.js +0 -98
  411. data/vendor/assets/luca-ui/containers/column_view.js +0 -52
  412. data/vendor/assets/luca-ui/containers/container.css +0 -3
  413. data/vendor/assets/luca-ui/containers/modal_view.css +0 -0
  414. data/vendor/assets/luca-ui/containers/modal_view.js +0 -87
  415. data/vendor/assets/luca-ui/containers/panel_view.js +0 -34
  416. data/vendor/assets/luca-ui/containers/split_view.js +0 -13
  417. data/vendor/assets/luca-ui/containers/tab_view.css +0 -16
  418. data/vendor/assets/luca-ui/containers/tab_view.js +0 -80
  419. data/vendor/assets/luca-ui/containers/viewport.js +0 -18
  420. data/vendor/assets/luca-ui/core/collection.js +0 -221
  421. data/vendor/assets/luca-ui/core/container.js +0 -205
  422. data/vendor/assets/luca-ui/core/field.js +0 -59
  423. data/vendor/assets/luca-ui/core/observer.js +0 -42
  424. data/vendor/assets/luca-ui/core/view.js +0 -127
  425. data/vendor/assets/luca-ui/framework.js +0 -110
  426. data/vendor/assets/luca-ui/index.js +0 -5
  427. data/vendor/assets/luca-ui/managers/collection_manager.js +0 -98
  428. data/vendor/assets/luca-ui/managers/socket_manager.js +0 -52
  429. data/vendor/assets/luca-ui/modules/deferrable.js +0 -21
  430. data/vendor/assets/luca-ui/modules/local_storage.js +0 -81
  431. data/vendor/assets/luca-ui/normalize.css +0 -359
  432. data/vendor/assets/luca-ui/stylesheets/base.css +0 -85
  433. data/vendor/assets/luca-ui/stylesheets/components/form_view.css +0 -32
  434. data/vendor/assets/luca-ui/stylesheets/components/grid_view.css +0 -76
  435. data/vendor/assets/luca-ui/stylesheets/components/toolbar.css +0 -11
  436. data/vendor/assets/luca-ui/stylesheets/containers/container.css +0 -3
  437. data/vendor/assets/luca-ui/stylesheets/containers/modal_view.css +0 -0
  438. data/vendor/assets/luca-ui/stylesheets/containers/tab_view.css +0 -16
  439. data/vendor/assets/luca-ui/stylesheets/normalize.css +0 -359
  440. data/vendor/assets/luca-ui/templates/components/bootstrap_form_controls.js +0 -4
  441. data/vendor/assets/luca-ui/templates/components/form_view.js +0 -4
  442. data/vendor/assets/luca-ui/templates/components/grid_view.js +0 -4
  443. data/vendor/assets/luca-ui/templates/components/grid_view_empty_text.js +0 -4
  444. data/vendor/assets/luca-ui/templates/containers/basic.js +0 -4
  445. data/vendor/assets/luca-ui/templates/containers/tab_selector_container.js +0 -4
  446. data/vendor/assets/luca-ui/templates/containers/tab_view.js +0 -4
  447. data/vendor/assets/luca-ui/templates/containers/toolbar_wrapper.js +0 -4
  448. data/vendor/assets/luca-ui/templates/fields/button_field.js +0 -4
  449. data/vendor/assets/luca-ui/templates/fields/button_field_link.js +0 -4
  450. data/vendor/assets/luca-ui/templates/fields/checkbox_field.js +0 -4
  451. data/vendor/assets/luca-ui/templates/fields/file_upload_field.js +0 -4
  452. data/vendor/assets/luca-ui/templates/fields/hidden_field.js +0 -4
  453. data/vendor/assets/luca-ui/templates/fields/select_field.js +0 -4
  454. data/vendor/assets/luca-ui/templates/fields/text_area_field.js +0 -4
  455. data/vendor/assets/luca-ui/templates/fields/text_field.js +0 -4
  456. data/vendor/assets/luca-ui/templates/sample/contents.js +0 -4
  457. data/vendor/assets/luca-ui/templates/sample/welcome.js +0 -4
@@ -0,0 +1,37 @@
1
+ module Luca
2
+ class Collection
3
+ class Endpoint < Sinatra::Base
4
+ # Index
5
+ get "/collections/:namespace" do
6
+ @collection = Luca::Collection.new(namespace: params[:namespace])
7
+ @collection.index.to_json
8
+ end
9
+
10
+ # Show
11
+ get "/collections/:namespace/:id" do
12
+ @collection = Luca::Collection.new(namespace: params[:namespace])
13
+ @collection.show( params[:id] ).to_json
14
+ end
15
+
16
+ # Create
17
+ post "/collections/:namespace" do
18
+ @collection = Luca::Collection.new(namespace: params[:namespace])
19
+ payload = JSON.parse( request.body.read.to_s )
20
+ @collection.create(payload).to_json
21
+ end
22
+
23
+ # Update
24
+ put "/collections/:namespace/:id" do
25
+ @collection = Luca::Collection.new(namespace: params[:namespace])
26
+ payload = JSON.parse( request.body.read.to_s )
27
+ @collection.update(payload).to_json
28
+ end
29
+
30
+ # Destroy
31
+ delete "/collections/:namespace/:id" do
32
+ @collection = Luca::Collection.new(namespace: params[:namespace])
33
+ @collection.destroy(params).to_json
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,121 @@
1
+ module Luca
2
+ class Collection
3
+ class FileBackend
4
+
5
+ attr_accessor :namespace,
6
+ :required_attributes,
7
+ :file_storage,
8
+ :record_storage,
9
+ :data_dir
10
+
11
+ def initialize options={}
12
+ @options = options.dup
13
+ @namespace = options[:namespace]
14
+ @required_attributes = options[:required_attributes]
15
+ @data_dir = options[:data_dir] || File.join(::Rails.root, "db", "collections")
16
+
17
+ unless File.exists?( file_storage_location )
18
+ FileUtils.mkdir_p(data_dir)
19
+
20
+ flush_storage_to_disk
21
+ end
22
+
23
+ read_storage_from_disk
24
+ end
25
+
26
+ def flush_storage_to_disk
27
+ File.open(file_storage_location, 'w+') do |fh|
28
+ payload = JSON.generate(record_storage)
29
+ fh.puts(payload)
30
+ end
31
+ end
32
+
33
+ def read_storage_from_disk
34
+ data = IO.read( file_storage_location )
35
+ @record_storage = JSON.parse(data)
36
+ end
37
+
38
+ def file_storage_location
39
+ File.join(data_dir, "#{ namespace }.json")
40
+ end
41
+
42
+ def sync method, hash={}, options={}
43
+ if method == "read" and hash[:id].nil?
44
+ return index()
45
+ end
46
+
47
+ if method == "read" and !hash[:id].nil?
48
+ return show( hash[:id] )
49
+ end
50
+
51
+ if method == "create"
52
+ return create( hash )
53
+ end
54
+
55
+ if method == "update"
56
+ return update( hash )
57
+ end
58
+
59
+ if method == "delete"
60
+ return destroy( hash )
61
+ end
62
+ end
63
+
64
+ alias_method :backbone_sync, :sync
65
+
66
+ def record_storage
67
+ @record_storage ||= {
68
+ :namespace => namespace,
69
+ :id_counter => 0,
70
+ :records => []
71
+ }
72
+
73
+ @record_storage.symbolize_keys!
74
+ @record_storage
75
+ end
76
+
77
+ def records
78
+ Array(record_storage[:records])
79
+ end
80
+
81
+ def index
82
+ records
83
+ end
84
+
85
+ def show id
86
+ record = records.detect {|r| r[:id].to_s == id.to_s }
87
+ record.symbolize_keys!
88
+ record
89
+ end
90
+
91
+ def allocate_id
92
+ record_storage[:id_counter] += 1
93
+ end
94
+
95
+ def create attributes={}
96
+ attributes.symbolize_keys!
97
+ attributes[:id] ||= allocate_id
98
+ records << attributes
99
+ flush_storage_to_disk
100
+ {success:true,id:attributes[:id],record:attributes}
101
+ end
102
+
103
+ def update attributes={}
104
+ attributes.symbolize_keys!
105
+ record = show(attributes[:id])
106
+ record.merge! attributes
107
+ flush_storage_to_disk
108
+ {success:true,record:record}
109
+ end
110
+
111
+ def destroy id
112
+ records.reject! do |record|
113
+ record[:id] == id
114
+ end
115
+ flush_storage_to_disk
116
+ {success:true}
117
+ end
118
+
119
+ end
120
+ end
121
+ end
@@ -0,0 +1,153 @@
1
+ # This is intended to provide a cheap, throw-away persistence solution
2
+ # for luca collections. Based on redis.
3
+ #
4
+ # it provides a Backbone.sync adapter and API endpoint for accessing it.
5
+ #
6
+ # It is used to make luca.collections persistent for
7
+ # multiple users. Not intended to be used in production or for any apps
8
+ # which require data integrity.
9
+
10
+ require 'json'
11
+
12
+ module Luca
13
+ class Collection
14
+ class RedisBackend
15
+
16
+ def self.default_redis
17
+ require 'redis'
18
+ @default_redis ||= Redis.new host: "localhost", port: 6379, db: 5
19
+ end
20
+
21
+ attr_accessor :namespace,
22
+ :redis,
23
+ :id_storage,
24
+ :required_attributes,
25
+ :redis_database
26
+
27
+ def initialize options={}
28
+ @namespace = options[:namespace].to_s
29
+ @redis = options[:redis] || Luca::Collection::RedisBackend.default_redis
30
+ @id_storage = options[:id_storage] ||= "#{ @namespace }:ids"
31
+ @required_attributes = options[:required_attributes] || []
32
+
33
+ validate_redis_connection
34
+ end
35
+
36
+ def sync method, hash={}, options={}
37
+ if method == "read" and !hash[:id].nil?
38
+ return index()
39
+ end
40
+
41
+ if method == "read" and !hash[:id].nil?
42
+ return show( hash[:id] )
43
+ end
44
+
45
+ if method == "create"
46
+ return create( hash )
47
+ end
48
+
49
+ if method == "update"
50
+ return update( hash )
51
+ end
52
+
53
+ if method == "delete"
54
+ return destroy( hash )
55
+ end
56
+ end
57
+
58
+ alias_method :backbone_sync, :sync
59
+
60
+ def validate_redis_connection
61
+ unless @redis
62
+
63
+ end
64
+
65
+ unless @redis.respond_to?(:get) and @redis.respond_to?(:incr) and @redis.respond_to?(:mget)
66
+ throw "Must specify a valid redis instance."
67
+ end
68
+ end
69
+
70
+ def record_ids
71
+ Array(redis.smembers( id_storage )).map {|id| "#{ namespace }/#{ id }"}
72
+ end
73
+
74
+ def clear!
75
+ return unless record_ids.length > 0
76
+ redis.del( *record_ids )
77
+ redis.del( id_storage )
78
+ end
79
+
80
+ def generate_id id_base=nil
81
+ id_base ||= id_storage
82
+ redis.incr("next:#{ id_base }:id")
83
+ end
84
+
85
+ def index search=nil
86
+ return [] unless record_ids.length > 0
87
+
88
+ redis.mget( *record_ids ).map {|serialized| JSON.parse(serialized) rescue nil }.compact
89
+ end
90
+
91
+ def show id
92
+ record = redis.get("#{ namespace }/#{ id }")
93
+ JSON.parse( record ) if record
94
+ end
95
+
96
+ def create hash
97
+ hash.symbolize_keys!
98
+
99
+ if required_attributes.any? {|attribute| hash[attribute].nil?}
100
+ return {success: false, error:"Missing required attributes."}
101
+ end
102
+
103
+ next_id = hash[:id] ||= generate_id
104
+
105
+ serialized = JSON.generate(hash)
106
+ response = redis.set "#{ namespace }/#{ next_id }", serialized
107
+
108
+ if response == "OK"
109
+ redis.sadd id_storage, hash[:id]
110
+ return {success: true, id: hash[:id], record: hash}
111
+ else
112
+ return {success: false, error:"Error adding record in data store."}
113
+ end
114
+ end
115
+
116
+ def destroy hash
117
+ hash.symbolize_keys!
118
+
119
+ stored = redis.get("#{ namespace }/#{ hash[:id] }")
120
+
121
+ if stored
122
+ redis.del "#{ namespace }/#{ hash[:id] }"
123
+ return {success: true}
124
+ else
125
+ return {success: false, error:"Could not find record with #{ hash[:id] }"}
126
+ end
127
+ end
128
+
129
+ def update hash
130
+ hash.symbolize_keys!
131
+
132
+ if required_attributes.any? {|attribute| hash[attribute].nil?}
133
+ return {success: false, error:"Missing required attributes."}
134
+ end
135
+
136
+ stored = redis.get("#{ namespace }/#{ hash[:id] }")
137
+
138
+ if stored.nil?
139
+ return {success: false, error:"Could not find record with #{ hash[:id] }"}
140
+ end
141
+
142
+ serialized = JSON.generate(hash)
143
+ result = redis.set "#{ namespace }/#{ hash[:id] }", serialized
144
+
145
+ if result == "OK"
146
+ return {success: true}
147
+ else
148
+ return {success: false, error:"Error adding record in data store."}
149
+ end
150
+ end
151
+ end
152
+ end
153
+ end
@@ -0,0 +1,61 @@
1
+ module Luca
2
+ class CompiledAsset
3
+ class << self
4
+ attr_accessor :coffeescript_assets,
5
+ :sass_assets,
6
+ :scss_assets,
7
+ :less_assets,
8
+ :markdown_assets,
9
+ :asset_stores_setup
10
+ end
11
+
12
+ self.asset_stores_setup = false
13
+
14
+ def self.setup_asset_stores
15
+ return if self.asset_stores_setup == true
16
+
17
+ self.coffeescript_assets = Luca::Collection.new(namespace:"coffeescripts",backend:"file")
18
+ self.sass_assets = Luca::Collection.new(namespace:"sass_stylesheets",backend:"file")
19
+ self.scss_assets = Luca::Collection.new(namespace:"scss_stylesheets",backend:"file")
20
+ self.less_assets = Luca::Collection.new(namespace:"less_stylesheets",backend:"file")
21
+ self.markdown_assets = Luca::Collection.new(namespace:"markdown_assets",backend:"file")
22
+ self.asset_stores_setup = true
23
+ end
24
+
25
+ attr_accessor :type, :asset
26
+
27
+ def initialize type, asset
28
+ CompiledAsset.setup_asset_stores
29
+ @type = type
30
+ @asset = asset
31
+ end
32
+
33
+ def compiler
34
+ @compiler ||= AssetCompiler.new(input: asset['input'], type: type)
35
+ end
36
+
37
+ def output
38
+ compiler.output
39
+ end
40
+
41
+ def mime_type
42
+ if type == "coffeescript" || type == "haml" || type == "mustache"
43
+ "text/javascript"
44
+ elsif type == "markdown"
45
+ "text/html"
46
+ else
47
+ "text/css"
48
+ end
49
+ end
50
+
51
+ def self.find_by_type_and_id type, id
52
+ if ["markdown", "haml","coffeescript","sass","scss","less"].include?(type)
53
+ asset = self.send("#{ type }_assets".to_sym)
54
+ asset = asset && asset.show(:id)
55
+ if !asset.nil?
56
+ new(type, asset)
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,338 @@
1
+ require 'rubygems'
2
+ require 'redcarpet'
3
+
4
+ module Luca
5
+ class ComponentDefinition
6
+ attr_accessor :source, :markdown
7
+
8
+ ARGUMENTS_REGEX = /^\w+\:\s*\((.+)\)/
9
+
10
+ def initialize source
11
+ @source = source
12
+ read_source()
13
+ end
14
+
15
+ def read_source
16
+ raise "Invalid source type" unless source.match(/.coffee|.js/)
17
+ @contents = IO.read(source)
18
+ end
19
+
20
+ def update contents
21
+ # File.open(source,'w+') do |fh|
22
+ # fh.puts(contents)
23
+ # end
24
+ end
25
+
26
+ def to_change_notification
27
+ as_json(compile:true, include_contents:true)
28
+ end
29
+
30
+ def as_json options={}
31
+ base = {
32
+ source: source,
33
+ defined_in_file: source,
34
+ type: "javascript"
35
+ }
36
+
37
+ unless class_name.nil?
38
+ base.merge!({ :class_name => class_name,
39
+ :defined_in_file => source,
40
+ :header_documentation => header_documentation,
41
+ :type_alias => type_alias,
42
+ :type => "component_definition",
43
+ :css_class_identifier => css_class_identifier,
44
+ :defines_methods => method_definition_map,
45
+ :defines_properties => property_definition_map })
46
+ end
47
+
48
+ if options[:include_contents]
49
+ base.merge!(:source_file_contents => contents)
50
+ end
51
+
52
+ if options[:compile]
53
+ base.merge!(:compiled => compiled_contents)
54
+ end
55
+
56
+ base
57
+ end
58
+
59
+ def method_definition_map
60
+ defines_methods.inject({}) do |memo, meth|
61
+ definition_line = find_definition_of(meth)
62
+ memo[meth] = {
63
+ defined_on_line: definition_line.line_number,
64
+ documentation: documentation_for(meth) || "",
65
+ arguments: argument_information_for(meth)
66
+ }
67
+ memo
68
+ end
69
+ end
70
+
71
+ def property_definition_map
72
+ defines_properties.inject({}) do |memo,property|
73
+ definition_line = find_definition_of(property)
74
+ memo[property] = {
75
+ defined_on_line: definition_line.line_number,
76
+ documentation: documentation_for(property),
77
+ default: ''
78
+ }
79
+ memo
80
+ end
81
+ end
82
+
83
+ def argument_information_for method
84
+ information = []
85
+ definition = find_definition_of(method).line.strip
86
+
87
+ if arguments = definition.match(ARGUMENTS_REGEX)
88
+ arguments = arguments.to_a[1]
89
+ information = arguments.split(',').map(&:strip).inject(information) do |memo, argument|
90
+ parts = argument.split('=').map(&:strip)
91
+ memo << {:argument=>parts[0],:value=>parts[1]}
92
+ end
93
+ end
94
+
95
+ information
96
+ end
97
+
98
+ def valid?
99
+ !class_name.nil?
100
+ end
101
+
102
+ def parse
103
+ end
104
+
105
+ def contents
106
+ @contents.to_s
107
+ end
108
+
109
+ def compiler
110
+ AssetCompiler.new(input: contents, type: "coffeescript")
111
+ end
112
+
113
+ def compiled
114
+ compiled_contents
115
+ end
116
+
117
+ def compiled_contents
118
+ compiler.output
119
+ end
120
+
121
+ def type_alias
122
+ classified = class_name && class_name.split('.').last
123
+ classified && classified.underscore
124
+ end
125
+
126
+ def view_based?
127
+ extends && !(
128
+ extends.match('.models.') ||
129
+ extends.match('.collections.') ||
130
+ extends.match(/Collection$/) ||
131
+ extends.match(/Model$/)
132
+ )
133
+ end
134
+
135
+ def css_class_identifier
136
+ return '' unless view_based?
137
+
138
+ parts = class_name.split('.')
139
+ parts -= ['views','components']
140
+
141
+ parts.map!(&:underscore)
142
+ parts.map!(&:dasherize)
143
+
144
+ parts.join('-')
145
+ end
146
+
147
+ def extends
148
+ extends_line.split(' ').last.gsub(/"|'/,'')
149
+ end
150
+
151
+ def class_name
152
+ match = definition_line && definition_line.match(/register.*["|'](.*)["|']/)
153
+ match && match[1]
154
+ end
155
+
156
+ def component_definition
157
+ self
158
+ end
159
+
160
+ def lines
161
+ line_number = 0
162
+ contents.lines.map do |line|
163
+ Line.new(line, (line_number += 1) )
164
+ end
165
+ end
166
+
167
+ def extends_line
168
+ match = lines.detect do |line|
169
+ line.component_extension?(definition_proxy_variable_name)
170
+ end
171
+
172
+ match && match.strip
173
+ end
174
+
175
+ def documentation_for method_or_property, compile=true
176
+ comment_lines = find_comments_above(method_or_property).collect(&:line)
177
+ comments = comment_lines.map do |comment_line|
178
+ comment_line.gsub(/\A\s*\#/,'').strip
179
+ end
180
+
181
+ data = comments.reverse.join("\n")
182
+
183
+ docs = if compile == true
184
+ self.class.markdown.render(data) rescue data
185
+ end
186
+
187
+ docs
188
+ end
189
+
190
+ def header_documentation
191
+ header_comments(true)
192
+ end
193
+
194
+ def header_comment_lines
195
+ header_lines = lines[ (0..(definition_line.line_number || 0) ) ]
196
+ comments = header_lines.select(&:comment?).map(&:line)
197
+
198
+ comments.map! {|line| line.gsub(/\A\s*\#[\ |\n]/,'') }
199
+ comments.reject! {|line| line.match(/\=\s*require/) }
200
+
201
+ comments
202
+ end
203
+
204
+ def header_comments compile=true
205
+ combined = header_comment_lines.join("")
206
+
207
+ if compile
208
+ compiled = Redcarpet.new(combined).to_html rescue combined
209
+ else
210
+ combined
211
+ end
212
+ end
213
+
214
+ def find_comments_above method_or_property
215
+ comment_lines = []
216
+ if line = find_definition_of( method_or_property )
217
+ line_number = line.line_number
218
+ indentation_level = line.indentation_level
219
+
220
+ next_line = find_line_by_number( line_number -= 1)
221
+ while !next_line.nil? && next_line.indentation_level == indentation_level && next_line.comment?
222
+ comment_lines << next_line
223
+ next_line = find_line_by_number( line_number -= 1)
224
+ end
225
+ end
226
+
227
+ comment_lines
228
+ end
229
+
230
+ def definition_proxy_variable_name
231
+ definition_line.split('=').first.strip
232
+ end
233
+
234
+ def find_line_by_number line_number=1
235
+ lines.detect {|line| line.line_number == line_number }
236
+ end
237
+
238
+ def definition_line
239
+ lines.detect do |line|
240
+ !line.comment? && line.component_definition?
241
+ end
242
+ end
243
+
244
+ def defines
245
+ lines.select(&:defines_property_or_method?).collect(&:defines)
246
+ end
247
+
248
+ def defines_methods
249
+ lines.select(&:defines_method?).collect(&:defines)
250
+ end
251
+
252
+ def find_definition_of method_or_property
253
+ lines.select(&:defines_property_or_method?).detect {|line| line.defines && line.defines.length > 0 && line.defines == method_or_property }
254
+ end
255
+
256
+ def defines_properties
257
+ lines.select(&:defines_property?).collect(&:defines)
258
+ end
259
+
260
+ class Line
261
+ attr_accessor :line, :line_number, :found_in
262
+
263
+ def initialize(line,line_number)
264
+ @line = line
265
+ @line_number = line_number
266
+ end
267
+
268
+ def match pattern
269
+ line.match(pattern)
270
+ end
271
+
272
+ def split delimiter
273
+ line.split(delimiter)
274
+ end
275
+
276
+ def strip
277
+ line.strip
278
+ end
279
+
280
+ def details
281
+ {
282
+ type: type,
283
+ line_number: line_number,
284
+ indentation_level: indentation_level
285
+ }
286
+ end
287
+
288
+ def indentation_level
289
+ space_count = if match = line.match(/\A */)[0] and match.length > 0
290
+ match.length
291
+ else
292
+ 0
293
+ end
294
+
295
+ space_count / 2
296
+ end
297
+
298
+ def defines_method?
299
+ !comment? && indentation_level == 1 && line.match(/\s*\w+\:\s*\(.*\)/)
300
+ end
301
+
302
+ def comment?
303
+ line.match(/^(\s*)\#/) or line == "#\n"
304
+ end
305
+
306
+ def defines_property?
307
+ !comment? && !defines_method? && indentation_level == 1 && line.match(/\s*\w+\:.*\w/)
308
+ end
309
+
310
+ def body?
311
+ indentation_level == 1 && line.match(/^\s+/)
312
+ end
313
+
314
+ def component
315
+ found_in
316
+ end
317
+
318
+ def component_definition?
319
+ line.match(/[A-Z].+\.register/)
320
+ end
321
+
322
+ def component_extension?(proxy)
323
+ line.include?("#{ proxy }.extends")
324
+ end
325
+
326
+ def defines_property_or_method?
327
+ defines_method? || defines_property?
328
+ end
329
+
330
+ def defines
331
+ if defines_property_or_method?
332
+ line.split(':').first.strip
333
+ end
334
+ end
335
+ end
336
+
337
+ end
338
+ end