luca 0.9.8 → 0.9.9

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 (310) hide show
  1. data/CHANGELOG +49 -0
  2. data/Gemfile +8 -1
  3. data/Gemfile.lock +97 -53
  4. data/Guardfile +3 -25
  5. data/README.md +5 -16
  6. data/ROADMAP +15 -9
  7. data/Rakefile +24 -75
  8. data/app.rb +10 -42
  9. data/app/assets/javascripts/luca/basic.coffee +1 -1
  10. data/app/assets/javascripts/luca/components/application.coffee +187 -104
  11. data/app/assets/javascripts/luca/components/collection_view.coffee +115 -51
  12. data/app/assets/javascripts/luca/components/controller.coffee +87 -10
  13. data/app/assets/javascripts/luca/components/fields/base.coffee +74 -13
  14. data/app/assets/javascripts/luca/components/fields/button_field.coffee +60 -13
  15. data/app/assets/javascripts/luca/components/fields/checkbox_array.coffee +12 -7
  16. data/app/assets/javascripts/luca/components/fields/select_field.coffee +82 -23
  17. data/app/assets/javascripts/luca/components/fields/text_area_field.coffee +25 -10
  18. data/app/assets/javascripts/luca/components/fields/text_field.coffee +9 -3
  19. data/app/assets/javascripts/luca/components/form_view.coffee +105 -33
  20. data/app/assets/javascripts/luca/components/grid_layout_view.coffee +42 -0
  21. data/app/assets/javascripts/luca/components/index.coffee +6 -0
  22. data/app/assets/javascripts/luca/components/nav_bar.coffee +60 -6
  23. data/app/assets/javascripts/luca/components/page.coffee +70 -0
  24. data/app/assets/javascripts/luca/components/simple_collection_view.coffee +10 -0
  25. data/app/assets/javascripts/luca/components/table_view.coffee +7 -3
  26. data/app/assets/javascripts/luca/components/table_view_scrollable.coffee +23 -0
  27. data/app/assets/javascripts/luca/concerns/collection_event_bindings.coffee +4 -1
  28. data/app/assets/javascripts/luca/concerns/development_tool_helpers.coffee +23 -14
  29. data/app/assets/javascripts/luca/concerns/dom_helpers.coffee +2 -2
  30. data/app/assets/javascripts/luca/concerns/filterable.coffee +8 -11
  31. data/app/assets/javascripts/luca/concerns/form_model_bindings.coffee +20 -0
  32. data/app/assets/javascripts/luca/concerns/modal_view.coffee +40 -15
  33. data/app/assets/javascripts/luca/concerns/query_collection_bindings.coffee +7 -1
  34. data/app/assets/javascripts/luca/concerns/state_model.coffee +40 -26
  35. data/app/assets/javascripts/luca/concerns/templating.coffee +3 -1
  36. data/app/assets/javascripts/luca/config.coffee +5 -0
  37. data/app/assets/javascripts/luca/containers/card_view.coffee +87 -52
  38. data/app/assets/javascripts/luca/containers/container.coffee +305 -108
  39. data/app/assets/javascripts/luca/containers/modal_view.coffee +9 -9
  40. data/app/assets/javascripts/luca/containers/page_controller.coffee +25 -0
  41. data/app/assets/javascripts/luca/containers/panel_toolbar.coffee +5 -6
  42. data/app/assets/javascripts/luca/containers/tab_view.coffee +19 -10
  43. data/app/assets/javascripts/luca/containers/viewport.coffee +12 -16
  44. data/app/assets/javascripts/luca/core/collection.coffee +19 -5
  45. data/app/assets/javascripts/luca/core/events.coffee +5 -5
  46. data/app/assets/javascripts/luca/core/model.coffee +1 -1
  47. data/app/assets/javascripts/luca/core/panel.coffee +18 -6
  48. data/app/assets/javascripts/luca/core/registry/component_definition.coffee +2 -1
  49. data/app/assets/javascripts/luca/core/registry/meta_data.coffee +2 -0
  50. data/app/assets/javascripts/luca/core/registry/registry.coffee +14 -11
  51. data/app/assets/javascripts/luca/core/templates.coffee +5 -1
  52. data/app/assets/javascripts/luca/core/view.coffee +200 -47
  53. data/app/assets/javascripts/luca/dependencies.coffee +2 -0
  54. data/app/assets/javascripts/luca/development/code_sync_manager.coffee +173 -0
  55. data/app/assets/javascripts/luca/development/component.coffee +76 -0
  56. data/app/assets/javascripts/luca/development/components.coffee +57 -0
  57. data/app/assets/javascripts/luca/development/console.coffee +1 -1
  58. data/app/assets/javascripts/luca/development/index.coffee +4 -1
  59. data/app/assets/javascripts/luca/framework.coffee +7 -3
  60. data/app/assets/javascripts/luca/index.coffee +2 -1
  61. data/app/assets/javascripts/luca/managers/collection_manager.coffee +2 -3
  62. data/app/assets/javascripts/luca/managers/index.coffee +1 -1
  63. data/app/assets/javascripts/luca/managers/socket_manager.coffee +31 -8
  64. data/app/assets/javascripts/luca/templates/components/nav_bar.jst.ejs +16 -1
  65. data/app/assets/javascripts/luca/templates/containers/tab_view.jst.ejs +1 -1
  66. data/app/assets/javascripts/luca/util/index.coffee +1 -0
  67. data/app/assets/javascripts/luca/util/keybindings.coffee +24 -0
  68. data/app/assets/javascripts/luca/util/logging.coffee +15 -0
  69. data/app/assets/javascripts/luca/util/luca.coffee +9 -1
  70. data/app/assets/stylesheets/luca/components/table_view.scss +85 -0
  71. data/app/assets/stylesheets/luca/components/viewport.scss +0 -4
  72. data/app/assets/stylesheets/luca/containers/container.scss +8 -0
  73. data/app/assets/stylesheets/luca/index.css +2 -2
  74. data/bin/luca +14 -0
  75. data/config.ru +1 -2
  76. data/docs/framework.json +1 -0
  77. data/docs/luca-framework-documentation.js +1 -0
  78. data/docs/{application.md → old/application.md} +0 -0
  79. data/docs/{collection.md → old/collection.md} +0 -0
  80. data/docs/{collection_manager.md → old/collection_manager.md} +0 -0
  81. data/docs/{container_philosophy.md → old/container_philosophy.md} +0 -0
  82. data/docs/{event_binding_helpers.md → old/event_binding_helpers.md} +0 -0
  83. data/docs/{method_caching_and_computed_properties.md → old/method_caching_and_computed_properties.md} +0 -0
  84. data/docs/{view.md → old/view.md} +0 -0
  85. data/lib/generators/luca/application/templates/javascripts/dependencies.coffee +2 -5
  86. data/lib/guard/luca.rb +84 -0
  87. data/lib/luca.rb +25 -1
  88. data/lib/luca/asset_compiler.rb +117 -0
  89. data/lib/luca/cli.rb +68 -0
  90. data/lib/luca/cli/generate.rb +37 -0
  91. data/lib/luca/cli/server.rb +20 -0
  92. data/lib/luca/cli/sync.rb +40 -0
  93. data/lib/luca/cli/watch.rb +16 -0
  94. data/lib/luca/collection.rb +64 -0
  95. data/lib/luca/collection/endpoint.rb +38 -0
  96. data/lib/luca/collection/file_backend.rb +121 -0
  97. data/lib/luca/collection/redis_backend.rb +153 -0
  98. data/lib/luca/compiled_asset.rb +61 -0
  99. data/lib/luca/component_definition.rb +356 -0
  100. data/lib/luca/luca_application.rb +258 -0
  101. data/lib/luca/project.rb +73 -0
  102. data/lib/luca/project_harness.rb +96 -0
  103. data/lib/luca/rails.rb +5 -3
  104. data/lib/luca/rails/engine.rb +8 -0
  105. data/lib/luca/rails/version.rb +1 -2
  106. data/lib/luca/server.rb +7 -0
  107. data/lib/luca/stylesheet.rb +35 -0
  108. data/lib/luca/template.rb +2 -0
  109. data/lib/luca/template_asset.rb +64 -0
  110. data/lib/luca/version.rb +3 -0
  111. data/lib/luca/watcher.rb +72 -0
  112. data/lib/railties/luca/tasks.rake +7 -0
  113. data/site/.bundle/config +2 -0
  114. data/site/.gitignore +5 -0
  115. data/site/.rvmrc +1 -0
  116. data/site/CHANGELOG.md +41 -0
  117. data/site/DOCS.md +41 -0
  118. data/site/Gemfile +8 -0
  119. data/site/Gemfile.lock +134 -0
  120. data/site/LICENSE.md +19 -0
  121. data/site/config.rb +84 -0
  122. data/site/helpers/site_helpers.rb +20 -0
  123. data/site/html5bp-docs/README.md +38 -0
  124. data/site/html5bp-docs/contribute.md +104 -0
  125. data/site/html5bp-docs/crossdomain.md +21 -0
  126. data/site/html5bp-docs/css.md +135 -0
  127. data/site/html5bp-docs/extend.md +507 -0
  128. data/site/html5bp-docs/faq.md +77 -0
  129. data/site/html5bp-docs/htaccess.md +323 -0
  130. data/site/html5bp-docs/html.md +170 -0
  131. data/site/html5bp-docs/js.md +31 -0
  132. data/site/html5bp-docs/misc.md +25 -0
  133. data/site/html5bp-docs/usage.md +109 -0
  134. data/site/readme.md +47 -0
  135. data/site/source/.htaccess +540 -0
  136. data/site/source/404.html +157 -0
  137. data/site/source/app/assets/javascripts/dependencies.js.coffee +6 -0
  138. data/site/source/app/assets/javascripts/docs-docs.js +1 -0
  139. data/site/source/app/assets/javascripts/docs/application.coffee +64 -0
  140. data/site/source/app/assets/javascripts/docs/collections/docs_documentation.coffee +17 -0
  141. data/site/source/app/assets/javascripts/docs/collections/github_repositories.coffee +7 -0
  142. data/site/source/app/assets/javascripts/docs/collections/index.coffee +1 -0
  143. data/site/source/app/assets/javascripts/docs/collections/luca_documentation.coffee +17 -0
  144. data/site/source/app/assets/javascripts/docs/collections/public_gists.coffee +4 -0
  145. data/site/source/app/assets/javascripts/docs/config.coffee +5 -0
  146. data/site/source/app/assets/javascripts/docs/index.coffee +12 -0
  147. data/site/source/app/assets/javascripts/docs/lib/router.coffee +3 -0
  148. data/{spec/components/application_spec.coffee → site/source/app/assets/javascripts/docs/lib/util.coffee} +0 -0
  149. data/site/source/app/assets/javascripts/docs/models/component.coffee +99 -0
  150. data/site/source/app/assets/javascripts/docs/models/github_repository.coffee +3 -0
  151. data/site/source/app/assets/javascripts/docs/models/index.coffee +1 -0
  152. data/site/source/app/assets/javascripts/docs/templates/component_documentation.jst.ejs +55 -0
  153. data/site/source/app/assets/javascripts/docs/templates/examples_browser/overview.jst.ejs +4 -0
  154. data/site/source/app/assets/javascripts/docs/templates/examples_browser/selector.jst.ejs +11 -0
  155. data/site/source/app/assets/javascripts/docs/templates/github_repository.jst.ejs +4 -0
  156. data/site/source/app/assets/javascripts/docs/templates/layouts/main.jst.ejs +4 -0
  157. data/site/source/app/assets/javascripts/docs/templates/left_navigation.jst.ejs +5 -0
  158. data/site/source/app/assets/javascripts/docs/templates/pages/getting_started.jst.ejs +78 -0
  159. data/site/source/app/assets/javascripts/docs/templates/pages/home.jst.ejs +57 -0
  160. data/site/source/app/assets/javascripts/docs/views/components/code_editor.coffee +45 -0
  161. data/{spec/components/collection_loader_view_spec.coffee → site/source/app/assets/javascripts/docs/views/components/code_editor/index.coffee} +0 -0
  162. data/site/source/app/assets/javascripts/docs/views/components/component_documentation.coffee +72 -0
  163. data/site/source/app/assets/javascripts/docs/views/index.coffee +3 -0
  164. data/site/source/app/assets/javascripts/docs/views/pages/browse_source.coffee +46 -0
  165. data/site/source/app/assets/javascripts/docs/views/pages/browse_source/details.coffee +37 -0
  166. data/site/source/app/assets/javascripts/docs/views/pages/browse_source/list.coffee +31 -0
  167. data/site/source/app/assets/javascripts/docs/views/pages/component_editor.coffee +10 -0
  168. data/site/source/app/assets/javascripts/docs/views/pages/examples_browser.coffee +102 -0
  169. data/site/source/app/assets/javascripts/docs/views/pages/examples_browser/docs.coffee +12 -0
  170. data/site/source/app/assets/javascripts/docs/views/pages/examples_browser/source.coffee +13 -0
  171. data/site/source/app/assets/javascripts/docs/views/pages/home.coffee +10 -0
  172. data/site/source/app/assets/javascripts/docs/views/views/api_browser/index.coffee +43 -0
  173. data/site/source/app/assets/javascripts/docs/views/views/collection_view_examples/grid_layout_view_example.coffee +14 -0
  174. data/site/source/app/assets/javascripts/docs/views/views/collection_view_examples/table_view_example.coffee +39 -0
  175. data/site/source/app/assets/javascripts/docs/views/views/form_view_examples/basic_example.coffee +38 -0
  176. data/site/source/app/assets/javascripts/docs/views/views/form_view_examples/complex_layout.coffee +110 -0
  177. data/site/source/app/assets/javascripts/docs/views/views/top_navigation.coffee +6 -0
  178. data/site/source/app/assets/javascripts/luca-docs.js +1 -0
  179. data/site/source/app/assets/javascripts/luca-framework-documentation.js +1 -0
  180. data/site/source/app/assets/javascripts/site.js.coffee +4 -0
  181. data/site/source/app/assets/javascripts/vendor/codemirror.js +4786 -0
  182. data/site/source/app/assets/javascripts/vendor/coffeescript.js +346 -0
  183. data/site/source/app/assets/javascripts/vendor/css.js +465 -0
  184. data/site/source/app/assets/javascripts/vendor/htmlmixed.js +84 -0
  185. data/site/source/app/assets/javascripts/vendor/javascript.js +422 -0
  186. data/site/source/app/assets/javascripts/vendor/js-beautify.js +1353 -0
  187. data/site/source/app/assets/javascripts/vendor/modernizr-2.6.1.min.js +4 -0
  188. data/site/source/app/assets/javascripts/vendor/vim.js +2511 -0
  189. data/site/source/app/assets/stylesheets/docs/api-browser.css.scss +5 -0
  190. data/site/source/app/assets/stylesheets/docs/application.css.scss +35 -0
  191. data/site/source/app/assets/stylesheets/docs/browse-source.css.scss +5 -0
  192. data/site/source/app/assets/stylesheets/docs/scrollable-table.css.scss +5 -0
  193. data/site/source/app/assets/stylesheets/site.css.scss +2 -0
  194. data/site/source/app/assets/stylesheets/vendor/codemirror.css +240 -0
  195. data/site/source/app/assets/stylesheets/vendor/prettify-tomorrow-night-bright.css +160 -0
  196. data/site/source/app/assets/stylesheets/vendor/twilight.css +26 -0
  197. data/site/source/crossdomain.xml +15 -0
  198. data/site/source/documentation.html.haml +1 -0
  199. data/site/source/favicon_base.png +0 -0
  200. data/site/source/humans.txt +15 -0
  201. data/site/source/images/background.png +0 -0
  202. data/site/source/images/middleman.png +0 -0
  203. data/site/source/index.html.haml +1 -0
  204. data/site/source/layouts/layout.haml +55 -0
  205. data/site/source/readme.md +63 -0
  206. data/site/source/robots.txt +3 -0
  207. data/spec/{components/grid_view_spec.coffee → javascripts/components/application_spec.coffee} +0 -0
  208. data/spec/{components/pagination_control_spec.coffee → javascripts/components/collection_loader_view_spec.coffee} +0 -0
  209. data/spec/{components → javascripts/components}/collection_view_spec.coffee +1 -1
  210. data/spec/{components → javascripts/components}/controller_spec.coffee +0 -0
  211. data/spec/{components → javascripts/components}/fields/checkbox_array_spec.coffee +0 -0
  212. data/spec/javascripts/components/form_view_spec.coffee +162 -0
  213. data/spec/{components/record_manager_spec.coffee → javascripts/components/grid_view_spec.coffee} +0 -0
  214. data/spec/{components → javascripts/components}/multi_collection_view_spec.coffee +0 -0
  215. data/spec/{components/template_spec.coffee → javascripts/components/pagination_control_spec.coffee} +0 -0
  216. data/spec/{concerns/paginatable_spec.coffee → javascripts/components/record_manager_spec.coffee} +0 -0
  217. data/spec/{components → javascripts/components}/table_view_spec.coffee +0 -0
  218. data/spec/{containers/modal_view_spec.coffee → javascripts/components/template_spec.coffee} +0 -0
  219. data/spec/{concerns → javascripts/concerns}/collection_event_bindings_spec.coffee +0 -0
  220. data/spec/{concerns → javascripts/concerns}/dom_helpers_spec.coffee +0 -0
  221. data/spec/{concerns → javascripts/concerns}/filterable_spec.coffee +0 -0
  222. data/spec/{concerns → javascripts/concerns}/model_presenter_spec.coffee +0 -0
  223. data/spec/{containers/panel_view_spec.coffee → javascripts/concerns/paginatable_spec.coffee} +0 -0
  224. data/spec/{concerns → javascripts/concerns}/state_model_spec.coffee +5 -0
  225. data/spec/javascripts/containers/card_view_spec.coffee +108 -0
  226. data/spec/{containers/tab_view_spec.coffee → javascripts/containers/modal_view_spec.coffee} +0 -0
  227. data/spec/{containers/viewport_spec.coffee → javascripts/containers/panel_view_spec.coffee} +0 -0
  228. data/spec/{core/observer_spec.coffee → javascripts/containers/tab_view_spec.coffee} +0 -0
  229. data/spec/{managers/socket_manager_spec.coffee → javascripts/containers/viewport_spec.coffee} +0 -0
  230. data/spec/{core → javascripts/core}/collection_spec.coffee +1 -1
  231. data/spec/{core → javascripts/core}/concerns_spec.coffee +0 -0
  232. data/spec/{core → javascripts/core}/container_spec.coffee +0 -0
  233. data/spec/{core → javascripts/core}/define_spec.coffee +0 -0
  234. data/spec/{core → javascripts/core}/events_spec.coffee +0 -0
  235. data/spec/{core → javascripts/core}/field_spec.coffee +0 -0
  236. data/spec/{core → javascripts/core}/framework_spec.coffee +0 -0
  237. data/spec/{core → javascripts/core}/model_spec.coffee +0 -0
  238. data/spec/javascripts/core/observer_spec.coffee +0 -0
  239. data/spec/{core → javascripts/core}/util_spec.coffee +0 -0
  240. data/spec/{core → javascripts/core}/view_spec.coffee +51 -39
  241. data/spec/{dependencies → javascripts/dependencies}/index.coffee +0 -0
  242. data/spec/{dependencies → javascripts/dependencies}/jasmine-html.js +0 -0
  243. data/spec/{dependencies → javascripts/dependencies}/jasmine.js +0 -0
  244. data/spec/{dependencies → javascripts/dependencies}/sinon.js +0 -0
  245. data/spec/{helper.coffee → javascripts/helper.coffee} +0 -0
  246. data/spec/{managers → javascripts/managers}/collection_manager_spec.coffee +0 -0
  247. data/spec/javascripts/managers/socket_manager_spec.coffee +0 -0
  248. data/spec/lib/component_definition_spec.rb +63 -0
  249. data/spec/lib/input_compiler_spec.rb +9 -0
  250. data/spec/lib/luca_application_spec.rb +30 -0
  251. data/spec/support/fixtures/application.coffee +45 -0
  252. data/spec/support/fixtures/component.coffee +34 -0
  253. data/tutorials/component-definitions.md +0 -0
  254. data/tutorials/component-definitions/01_intro.md +0 -0
  255. data/tutorials/component-driven-design.md +140 -0
  256. data/tutorials/structure-of-a-project.md +63 -0
  257. data/vendor/assets/javascripts/backbone-min.js +37 -33
  258. data/vendor/assets/javascripts/backbone-query.min.js +1 -1
  259. data/vendor/assets/javascripts/hogan.js +707 -0
  260. data/vendor/assets/javascripts/jquery.js +5 -4
  261. data/vendor/assets/javascripts/keymaster.min.js +4 -0
  262. data/vendor/assets/javascripts/luca-dependencies.min.js +8 -0
  263. data/vendor/assets/javascripts/luca-development.min.js +1 -0
  264. data/vendor/assets/javascripts/luca-spec.js +6 -6
  265. data/vendor/assets/javascripts/luca-ui.js +7386 -0
  266. data/vendor/assets/javascripts/luca-ui.min.js +5 -0
  267. data/vendor/assets/javascripts/luca.full.min.js +12 -0
  268. data/vendor/assets/javascripts/luca.min.js +5 -0
  269. data/vendor/assets/javascripts/underscore-min.js +1 -5
  270. data/vendor/assets/javascripts/underscore-string.min.js +1 -1
  271. data/vendor/assets/stylesheets/luca-components.css +202 -0
  272. data/vendor/assets/stylesheets/luca-development.css +23 -0
  273. data/vendor/assets/stylesheets/luca-ui.css +198 -0
  274. metadata +324 -94
  275. data/app/assets/javascripts/luca/components/base_toolbar.coffee +0 -17
  276. data/app/assets/javascripts/luca/components/form_button_toolbar.coffee +0 -28
  277. data/app/assets/javascripts/luca/components/grid_view.coffee +0 -269
  278. data/app/assets/javascripts/luca/components/page_controller.coffee +0 -7
  279. data/app/assets/javascripts/luca/components/template.coffee +0 -5
  280. data/app/assets/javascripts/luca/components/toolbar_dialog.coffee +0 -25
  281. data/lib/luca/code_browser.rb +0 -55
  282. data/lib/luca/command_line.rb +0 -69
  283. data/lib/luca/component_documentation.rb +0 -72
  284. data/site/assets/bootstrap.min.js +0 -7
  285. data/site/assets/dependencies.js +0 -94
  286. data/site/assets/glyphicons-halflings-white.png +0 -0
  287. data/site/assets/glyphicons-halflings.png +0 -0
  288. data/site/assets/luca-ui-bootstrap.css +0 -1331
  289. data/site/assets/luca-ui-bootstrap.js +0 -9
  290. data/site/assets/luca-ui-development-tools.css +0 -234
  291. data/site/assets/luca-ui-development-tools.js +0 -18561
  292. data/site/assets/luca-ui-development-tools.min.js +0 -15
  293. data/site/assets/luca-ui-full.min.js +0 -8
  294. data/site/assets/luca-ui.min.js +0 -4
  295. data/site/assets/sandbox.css +0 -62
  296. data/site/assets/sandbox.js +0 -469
  297. data/site/docs/application.html +0 -41
  298. data/site/docs/caching.html +0 -43
  299. data/site/docs/collection.html +0 -75
  300. data/site/docs/collection_manager.html +0 -71
  301. data/site/docs/containers.html +0 -118
  302. data/site/docs/events.html +0 -153
  303. data/site/docs/view.html +0 -128
  304. data/site/img/glyphicons-halflings-white.png +0 -0
  305. data/site/img/glyphicons-halflings.png +0 -0
  306. data/site/index.html +0 -20
  307. data/site/source-map.js +0 -1
  308. data/spec/components/form_view_spec.coffee +0 -84
  309. data/spec/containers/card_view_spec.coffee +0 -50
  310. data/spec/luca-spec.coffee +0 -9
@@ -0,0 +1,73 @@
1
+ module Luca
2
+ class Project
3
+ class << self
4
+ attr_accessor :storage
5
+ end
6
+
7
+
8
+ attr_accessor :name,
9
+ :path
10
+
11
+ def self.store
12
+ self.storage ||= Luca::Collection.new(namespace:"projects",backend_type:"file")
13
+ end
14
+
15
+ def self.create attributes={}
16
+ store.create(attributes)
17
+ end
18
+
19
+ def self.index
20
+ store.index
21
+ end
22
+
23
+ def self.find_by_path path
24
+ data = index.detect do |project_data|
25
+ project_data['path'] == path
26
+ end
27
+
28
+ return nil unless data
29
+
30
+ new(path: data['path'], name: data['name'])
31
+ end
32
+
33
+ def self.find_or_create_by_name(name, attributes={})
34
+ if existing = find_by_name(name)
35
+ return existing
36
+ else
37
+ attributes[:name] = name
38
+ create(attributes)
39
+ end
40
+ end
41
+
42
+ def self.find_by_name name
43
+ data = index.detect do |project_data|
44
+ project_data['name'] == name
45
+ end
46
+
47
+ return nil unless data
48
+
49
+ new(path: data['path'], name: data['name'])
50
+ end
51
+
52
+ def initialize options={}
53
+ @path = options[:path]
54
+ @name = options[:name] || File.basename(@path)
55
+ end
56
+
57
+ def as_json
58
+ {path: path, name: name}
59
+ end
60
+
61
+ def git
62
+ @git ||= Grit::Repo.new(path)
63
+ end
64
+
65
+ def app
66
+ luca_application
67
+ end
68
+
69
+ def luca_application
70
+ @luca_application ||= LucaApplication.new(name.capitalize, root: path)
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,96 @@
1
+ module Luca
2
+ # The Luca::ProjectHarness makes the source code browsing endpoints available
3
+ class ProjectHarness < Sinatra::Base
4
+ get "/framework/documentation" do
5
+ app = Luca::LucaApplication.new("Luca", root: Luca.base_path)
6
+
7
+ payload = if File.exists?( app.export_file_location )
8
+ IO.read( app.export_file_location )
9
+ else
10
+ app.export
11
+ end
12
+
13
+ payload
14
+ end
15
+
16
+ get "/framework/documentation/:class_name" do
17
+ application_repository = Luca::LucaApplication.new("Luca", root: Luca.base_path)
18
+ class_name = params[:class_name].gsub('__','.')
19
+ component_definition = application_repository.find_component_definition_for_class( class_name )
20
+
21
+ component_definition.as_json(:include_contents=>true).to_json
22
+ end
23
+
24
+ get "/compiled/assets/:type/:id.:extension" do
25
+ asset = Luca::CompiledAsset.find_by_type_and_id( params[:type], params[:id] )
26
+ content_type asset.mime_type
27
+
28
+ asset.output
29
+ end
30
+
31
+ get "/components/:application_name" do
32
+ application_repository = Luca::Project.find_by_name( params[:application_name] ).app
33
+ definitions = application_repository.component_definitions.map(&:as_json)
34
+
35
+ definitions.to_json
36
+ end
37
+
38
+ get "/stylesheets/:application_name" do
39
+ application_repository = Luca::Project.find_by_name( params[:application_name] ).app
40
+ list = application_repository.find_stylesheet(params)
41
+
42
+ list.to_json
43
+ end
44
+
45
+ get "/templates/:application_name" do
46
+ application_repository = Luca::Project.find_by_name( params[:application_name] ).app
47
+ templates = application_repository.templates.map(&:as_json)
48
+
49
+ templates.to_json
50
+ end
51
+
52
+ get "/templates/:application_name/:template_name" do
53
+ application_repository = Luca::Project.find_by_name( params[:application_name] ).app
54
+ templates = application_repository.templates.map(&:as_json)
55
+ template = templates.detect {|tmpl| tmpl.template_name == params[:template_name] }
56
+
57
+ template.to_json
58
+ end
59
+
60
+
61
+ post "/components/:application_name" do
62
+ application_repository = Luca::Project.find_by_name( params[:application_name] ).app
63
+ application
64
+ end
65
+
66
+ put "/components/:application_name/:class_name" do
67
+ application_repository = Luca::Project.find_by_name( params[:application_name] ).app
68
+ class_name = params[:class_name].gsub('__','.')
69
+ component_definition = application_repository.find_component_definition_for_class( class_name )
70
+
71
+ {success: true}.to_json
72
+ end
73
+
74
+ get "/components/:application_name" do
75
+ application_name = params[:application_name].capitalize
76
+ application_repository = Luca::LucaApplication.new(application_name, root: ::Rails.root)
77
+
78
+ payload = if File.exists?( app.export_file_location )
79
+ IO.read( app.export_file_location )
80
+ else
81
+ app.export
82
+ end
83
+
84
+ payload
85
+ end
86
+
87
+ get "/components/:application_name/:class_name" do
88
+ application_repository = Luca::Project.find_by_name( params[:application_name] ).app
89
+ class_name = params[:class_name].gsub('__','.')
90
+ component_definition = application_repository.find_component_definition_for_class( class_name )
91
+
92
+ component_definition.as_json(:include_contents=>true).to_json
93
+ end
94
+
95
+ end
96
+ end
data/lib/luca/rails.rb CHANGED
@@ -2,9 +2,11 @@ module Luca
2
2
  module Rails
3
3
  require 'luca/template'
4
4
  require 'luca/test_harness'
5
- require 'luca/code_browser'
6
- require 'luca/rails/engine'
7
- require 'luca/rails/version'
5
+ require 'luca/project_harness'
6
+
7
+ if defined?(::Rails)
8
+ require 'luca/rails/engine'
9
+ end
8
10
  end
9
11
  end
10
12
 
@@ -1,3 +1,4 @@
1
+ require 'hogan_assets'
1
2
  module Luca
2
3
  module Rails
3
4
  class Engine < ::Rails::Engine
@@ -10,6 +11,13 @@ module Luca
10
11
  Luca::TestHarness.set(:sprockets,app.assets)
11
12
  Luca::TestHarness.set :root, File.expand_path('../../../../', __FILE__)
12
13
  end
14
+
15
+ initializer "sprockets.hogan", :after => "sprockets.environment", :group => :all do |app|
16
+ HoganAssets::Config.configure do |config|
17
+ config.template_namespace = 'JST'
18
+ end
19
+ end
20
+
13
21
  end
14
22
  end
15
23
  end
@@ -1,6 +1,5 @@
1
1
  module Luca
2
2
  module Rails
3
- VERSION = '0.9.8'
3
+ VERSION = Luca::Version
4
4
  end
5
5
  end
6
-
@@ -0,0 +1,7 @@
1
+ require 'rubygems'
2
+ require 'faye'
3
+
4
+ module Luca
5
+ class Server < Faye::RackAdapter
6
+ end
7
+ end
@@ -0,0 +1,35 @@
1
+ module Luca
2
+ class Stylesheet
3
+ attr_accessor :path, :source, :compiler
4
+
5
+ def initialize(path)
6
+ @source = @path = path
7
+ @compiler = AssetCompiler.new(file: path, type: type)
8
+ end
9
+
10
+ def to_change_notification
11
+ as_json
12
+ end
13
+
14
+ # TODO: Add support for less, sass, etc
15
+ def type
16
+ "scss"
17
+ end
18
+
19
+ def compiled
20
+ @compiler.compiled rescue ""
21
+ end
22
+
23
+ def as_json options={}
24
+ {
25
+ defined_in_file: source,
26
+ type: "stylesheet",
27
+ compiled: compiled,
28
+ source_file_contents: IO.read(source),
29
+ name: File.basename(source),
30
+ path: source,
31
+ id: source.gsub('/','__')
32
+ }
33
+ end
34
+ end
35
+ end
data/lib/luca/template.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # DEPRECATED
2
+
1
3
  require 'tilt'
2
4
 
3
5
  module Luca
@@ -0,0 +1,64 @@
1
+ module Luca
2
+ class TemplateAsset
3
+ attr_accessor :path, :compiler, :contents
4
+
5
+ def initialize(path)
6
+ @path = path
7
+ @contents = IO.read(path)
8
+ @compiler = AssetCompiler.new(input:contents, type: type, file: path)
9
+ end
10
+
11
+ def to_change_notification
12
+ as_json
13
+ end
14
+
15
+ def as_json options={}
16
+ id = "#{ template_prefix }/#{ template_name }".gsub('/','__')
17
+
18
+ {
19
+ type: type,
20
+ contents: compiled,
21
+ name: template_name,
22
+ id: id,
23
+ template_prefix: template_prefix,
24
+ defined_in_file: source,
25
+ source_file_contents: IO.read(source)
26
+ }
27
+ end
28
+
29
+ def to_json
30
+ as_json.to_json
31
+ end
32
+
33
+ def type
34
+ "template"
35
+ end
36
+
37
+ def source
38
+ path
39
+ end
40
+
41
+ def template_prefix
42
+ path.gsub(/^.*app\/assets\/javascripts\//,'').split('.').first
43
+ end
44
+
45
+ def template_name
46
+ File.basename(path).split('.').first
47
+ end
48
+
49
+ def type
50
+ return 'mustache' if path.match(/.mustache/)
51
+ 'template'
52
+ end
53
+
54
+ def compiled
55
+ begin
56
+ output = @compiler.compiled
57
+ needle = @compiler.filename.gsub(/\..*$/,'')
58
+ output.gsub(needle, "#{ template_prefix }")
59
+ rescue
60
+ ""
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,3 @@
1
+ module Luca
2
+ Version = '0.9.9'
3
+ end
@@ -0,0 +1,72 @@
1
+ module Luca
2
+ class Watcher
3
+ attr_reader :app,
4
+ :listener,
5
+ :notifier
6
+
7
+ def initialize(name, options={})
8
+ @app = Luca::LucaApplication.new(name, options)
9
+ @notifier = FayeNotifier.new(options[:url] || "//localhost:9292/faye")
10
+ @listener = Listen.to(app.assets_root)
11
+ .filter(options[:filter] || /(\.coffee|\.css|\.jst|\.mustache)/)
12
+ .latency(options[:latency] || 1)
13
+ .change do |modified, added, removed|
14
+ notify(modified, added, removed)
15
+ end
16
+ end
17
+
18
+ def notify modified, added, removed
19
+ puts "Detected changes in #{ (modified + added).inspect }"
20
+ begin
21
+ payload = change_payload_for(modified + added)
22
+ notifier.publish("/luca-code-sync", payload)
23
+ rescue e
24
+ puts "Error publishing payload: #{ $! }"
25
+ end
26
+ end
27
+
28
+ def change_payload_for paths
29
+ paths.inject({}) do |memo, path|
30
+ file = path.gsub( app.assets_root, '')
31
+ if file && asset = app.find_asset_wrapper_for(file)
32
+ memo[path] = asset.to_change_notification
33
+ end
34
+
35
+ memo
36
+ end
37
+ end
38
+
39
+ def start
40
+ puts "Looking for changes in #{ app.application_name }: #{ app.assets_root }"
41
+ @listener.start
42
+ end
43
+ end
44
+
45
+
46
+ class Watcher::FayeNotifier
47
+ attr_reader :client, :url
48
+
49
+ def initialize url
50
+ @url = url
51
+ end
52
+
53
+ def client
54
+ @client ||= ::Faye::Client.new(url)
55
+ end
56
+
57
+ def shutdown
58
+ EM.stop
59
+ end
60
+
61
+ def publish channel, message
62
+ EM.run do
63
+ client = ::Faye::Client.new(url)
64
+ pub = client.publish( channel, message )
65
+ pub.callback { EM.stop }
66
+ pub.errback { EM.stop }
67
+ end
68
+ end
69
+
70
+ end
71
+
72
+ end
@@ -1,4 +1,11 @@
1
1
  namespace :luca do
2
+ desc "Create a Luca::Project for this app"
3
+ task :project => :environment do |t, args|
4
+ current_folder = Rails.root
5
+ name = ENV['name']
6
+ Luca::Project.find_or_create_by_name(name, :path => current_folder.to_s )
7
+ end
8
+
2
9
  desc "Download the vendor dependencies for a luca app"
3
10
  task :dependencies do
4
11
  base = 'https://raw.github.com/datapimp/luca/master/assets/javascripts/dependencies/'
@@ -0,0 +1,2 @@
1
+ ---
2
+ BUNDLE_WITHOUT: development:test
data/site/.gitignore ADDED
@@ -0,0 +1,5 @@
1
+ *.DS_Store
2
+ *.scssc
3
+ sass-cache/
4
+
5
+ build/
data/site/.rvmrc ADDED
@@ -0,0 +1 @@
1
+ rvm use 1.9.3-p194
data/site/CHANGELOG.md ADDED
@@ -0,0 +1,41 @@
1
+ # Changelog
2
+
3
+ ## 3.0.9 (September 24, 2012)
4
+
5
+ * Update to Middleman 3.0.5 (fixes 3.0.4 Livereload bug)
6
+
7
+ ## 3.0.8 (September 22, 2012)
8
+
9
+ * Update to Middleman 3.0.4
10
+ * Default .rvmrc updated to Ruby 1.9.3-p194
11
+
12
+ ## 3.0.7 (September 11, 2012)
13
+
14
+ * Update to Middleman 3.0.2
15
+
16
+ ## 3.0.6 (September 2, 2012)
17
+
18
+ * Content is parsed with Markdown (using Redcarpet) by default
19
+
20
+ ## 3.0.5 (September 2, 2012)
21
+
22
+ * Smart site and page titles/descriptions through /helpers/site_helpers.rb
23
+ * Better documentation
24
+
25
+ ## 3.0.4 (September 2, 2012)
26
+
27
+ * [SMACSS](http://smacss.com/) stylesheet organization
28
+
29
+ ## 3.0.3 (September 2, 2012)
30
+
31
+ * Added .htaccess for Apache builds
32
+
33
+ ## 3.0.2 (September 2, 2012)
34
+
35
+ * Updated to HTML5 Boilerplate 4.0
36
+ * Updated to Susy 1.0
37
+ * Activate middleman-favicon-maker by default
38
+
39
+ ## 3.0.1 and below
40
+
41
+ See commit log