docks_app 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 (313) hide show
  1. data/.editorconfig +8 -0
  2. data/.gitignore +22 -0
  3. data/.rubocop.yml +20 -0
  4. data/.travis.yml +10 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE.txt +22 -0
  7. data/README.md +35 -0
  8. data/Rakefile +3 -0
  9. data/bin/docks +5 -0
  10. data/config/json/docks_config.json +71 -0
  11. data/config/ruby/docks_config.rb +127 -0
  12. data/config/yaml/docks_config.yml +70 -0
  13. data/docks.gemspec +38 -0
  14. data/lib/docks/build.rb +300 -0
  15. data/lib/docks/cache.rb +143 -0
  16. data/lib/docks/command_line.rb +65 -0
  17. data/lib/docks/configuration.rb +217 -0
  18. data/lib/docks/containers/base_container.rb +103 -0
  19. data/lib/docks/containers/class_container.rb +39 -0
  20. data/lib/docks/containers/component_container.rb +92 -0
  21. data/lib/docks/containers/demo_container.rb +105 -0
  22. data/lib/docks/containers/factory_container.rb +12 -0
  23. data/lib/docks/containers/function_container.rb +46 -0
  24. data/lib/docks/containers/mixin_container.rb +19 -0
  25. data/lib/docks/containers/pattern_container.rb +168 -0
  26. data/lib/docks/containers/pattern_library_container.rb +77 -0
  27. data/lib/docks/containers/state_container.rb +9 -0
  28. data/lib/docks/containers/symbol_container.rb +77 -0
  29. data/lib/docks/containers/variable_container.rb +47 -0
  30. data/lib/docks/containers/variant_container.rb +9 -0
  31. data/lib/docks/containers/variation_container.rb +38 -0
  32. data/lib/docks/containers.rb +25 -0
  33. data/lib/docks/descriptor.rb +60 -0
  34. data/lib/docks/errors.rb +5 -0
  35. data/lib/docks/group.rb +66 -0
  36. data/lib/docks/helpers/github_helper.rb +29 -0
  37. data/lib/docks/helpers/path_helper.rb +94 -0
  38. data/lib/docks/helpers/render_helper.rb +87 -0
  39. data/lib/docks/helpers.rb +19 -0
  40. data/lib/docks/languages/base_language.rb +17 -0
  41. data/lib/docks/languages/coffeescript_language.rb +30 -0
  42. data/lib/docks/languages/common_types/markup_language.rb +71 -0
  43. data/lib/docks/languages/css_language.rb +13 -0
  44. data/lib/docks/languages/erb_language.rb +21 -0
  45. data/lib/docks/languages/haml_language.rb +21 -0
  46. data/lib/docks/languages/html_language.rb +10 -0
  47. data/lib/docks/languages/javascript_language.rb +42 -0
  48. data/lib/docks/languages/json_language.rb +18 -0
  49. data/lib/docks/languages/less_language.rb +33 -0
  50. data/lib/docks/languages/markdown_language.rb +10 -0
  51. data/lib/docks/languages/sass_language.rb +36 -0
  52. data/lib/docks/languages/slim_language.rb +21 -0
  53. data/lib/docks/languages/stylus_language.rb +26 -0
  54. data/lib/docks/languages/yaml_language.rb +18 -0
  55. data/lib/docks/languages.rb +103 -0
  56. data/lib/docks/markdown.rb +18 -0
  57. data/lib/docks/messenger.rb +69 -0
  58. data/lib/docks/naming_conventions/base_naming_convention.rb +9 -0
  59. data/lib/docks/naming_conventions/bem_naming_convention.rb +45 -0
  60. data/lib/docks/naming_conventions/suit_naming_convention.rb +45 -0
  61. data/lib/docks/naming_conventions.rb +21 -0
  62. data/lib/docks/ostruct.rb +17 -0
  63. data/lib/docks/parser.rb +86 -0
  64. data/lib/docks/parsers/base_parser.rb +128 -0
  65. data/lib/docks/parsers/coffeescript_parser.rb +30 -0
  66. data/lib/docks/parsers/css_parser.rb +27 -0
  67. data/lib/docks/parsers/javascript_parser.rb +30 -0
  68. data/lib/docks/parsers/less_parser.rb +22 -0
  69. data/lib/docks/parsers/sass_parser.rb +31 -0
  70. data/lib/docks/parsers/stylus_parser.rb +28 -0
  71. data/lib/docks/process.rb +60 -0
  72. data/lib/docks/processors.rb +416 -0
  73. data/lib/docks/renderers/base_renderer.rb +64 -0
  74. data/lib/docks/renderers/common_features/capturable.rb +69 -0
  75. data/lib/docks/renderers/common_features/helperable.rb +23 -0
  76. data/lib/docks/renderers/erb_renderer.rb +68 -0
  77. data/lib/docks/renderers/haml_renderer.rb +37 -0
  78. data/lib/docks/renderers/slim_renderer.rb +33 -0
  79. data/lib/docks/symbol_sources/base_symbol_source.rb +12 -0
  80. data/lib/docks/symbol_sources/jquery_symbol_source.rb +17 -0
  81. data/lib/docks/symbol_sources/mdn_symbol_source.rb +35 -0
  82. data/lib/docks/symbol_sources/sass_symbol_source.rb +27 -0
  83. data/lib/docks/symbol_sources.rb +28 -0
  84. data/lib/docks/tags/access_tag.rb +27 -0
  85. data/lib/docks/tags/activate_with_tag.rb +17 -0
  86. data/lib/docks/tags/active_tag.rb +14 -0
  87. data/lib/docks/tags/alias_tag.rb +17 -0
  88. data/lib/docks/tags/author_tag.rb +19 -0
  89. data/lib/docks/tags/base_tag.rb +52 -0
  90. data/lib/docks/tags/beta_tag.rb +26 -0
  91. data/lib/docks/tags/class_tag.rb +16 -0
  92. data/lib/docks/tags/compatibility_tag.rb +19 -0
  93. data/lib/docks/tags/demo_type_tag.rb +14 -0
  94. data/lib/docks/tags/deprecated_tag.rb +26 -0
  95. data/lib/docks/tags/description_tag.rb +99 -0
  96. data/lib/docks/tags/example_tag.rb +20 -0
  97. data/lib/docks/tags/factory_tag.rb +16 -0
  98. data/lib/docks/tags/for_tag.rb +23 -0
  99. data/lib/docks/tags/group_tag.rb +10 -0
  100. data/lib/docks/tags/helper_tag.rb +13 -0
  101. data/lib/docks/tags/include_with_tag.rb +57 -0
  102. data/lib/docks/tags/javascript_action_tag.rb +10 -0
  103. data/lib/docks/tags/link_tag.rb +18 -0
  104. data/lib/docks/tags/markup_tag.rb +106 -0
  105. data/lib/docks/tags/member_tag.rb +37 -0
  106. data/lib/docks/tags/method_tag.rb +18 -0
  107. data/lib/docks/tags/name_tag.rb +10 -0
  108. data/lib/docks/tags/object_tag.rb +15 -0
  109. data/lib/docks/tags/param_tag.rb +94 -0
  110. data/lib/docks/tags/pattern_tag.rb +21 -0
  111. data/lib/docks/tags/preclude_tag.rb +17 -0
  112. data/lib/docks/tags/private_tag.rb +15 -0
  113. data/lib/docks/tags/property_tag.rb +18 -0
  114. data/lib/docks/tags/public_tag.rb +15 -0
  115. data/lib/docks/tags/require_tag.rb +47 -0
  116. data/lib/docks/tags/returns_tag.rb +31 -0
  117. data/lib/docks/tags/set_by_tag.rb +18 -0
  118. data/lib/docks/tags/signature_tag.rb +35 -0
  119. data/lib/docks/tags/since_tag.rb +26 -0
  120. data/lib/docks/tags/source_tag.rb +12 -0
  121. data/lib/docks/tags/state_tag.rb +21 -0
  122. data/lib/docks/tags/static_tag.rb +14 -0
  123. data/lib/docks/tags/subcomponent_tag.rb +68 -0
  124. data/lib/docks/tags/subtitle_tag.rb +11 -0
  125. data/lib/docks/tags/symbol_type_tag.rb +10 -0
  126. data/lib/docks/tags/throws_tag.rb +30 -0
  127. data/lib/docks/tags/title_tag.rb +10 -0
  128. data/lib/docks/tags/type_tag.rb +10 -0
  129. data/lib/docks/tags/value_tag.rb +10 -0
  130. data/lib/docks/tags/variant_tag.rb +21 -0
  131. data/lib/docks/tags/variation_tag.rb +136 -0
  132. data/lib/docks/tags.rb +103 -0
  133. data/lib/docks/templates.rb +122 -0
  134. data/lib/docks/themes.rb +19 -0
  135. data/lib/docks/types.rb +26 -0
  136. data/lib/docks/version.rb +3 -0
  137. data/lib/docks.rb +37 -0
  138. data/spec/fixtures/build/scripts/bar/bar_2.js +1 -0
  139. data/spec/fixtures/build/scripts/bar.js +1 -0
  140. data/spec/fixtures/build/styles/foo/foo-2.css +1 -0
  141. data/spec/fixtures/build/styles/foo.css +1 -0
  142. data/spec/fixtures/build/templates/baz/baz_2.erb +1 -0
  143. data/spec/fixtures/build/templates/baz.erb +1 -0
  144. data/spec/fixtures/grouper/components/button/button.coffee +0 -0
  145. data/spec/fixtures/grouper/components/button/button.haml +0 -0
  146. data/spec/fixtures/grouper/components/button/button.scss +0 -0
  147. data/spec/fixtures/grouper/components/checkbox/_checkbox.haml +0 -0
  148. data/spec/fixtures/grouper/components/checkbox/_checkbox.scss +0 -0
  149. data/spec/fixtures/grouper/components/checkbox/checkbox.coffee +0 -0
  150. data/spec/fixtures/grouper/components/form/form.coffee +0 -0
  151. data/spec/fixtures/grouper/components/form/form.m +0 -0
  152. data/spec/fixtures/grouper/components/form/form.scss +0 -0
  153. data/spec/fixtures/grouper/components/next-expanding-textarea/_next-expanding-textarea.scss +0 -0
  154. data/spec/fixtures/grouper/components/next-expanding-textarea/_next_expanding_textarea.coffee +0 -0
  155. data/spec/fixtures/grouper/components/next-expanding-textarea/next-expanding-textarea.haml +0 -0
  156. data/spec/fixtures/grouper/components/next-tab/next-tab.coffee +0 -0
  157. data/spec/fixtures/grouper/components/next-tab/next-tab.haml +0 -0
  158. data/spec/fixtures/grouper/components/next-tab/next-tab.scss +0 -0
  159. data/spec/fixtures/grouper/components/segmented control/segmented control.coffee +0 -0
  160. data/spec/fixtures/grouper/components/segmented control/segmented control.haml +0 -0
  161. data/spec/fixtures/grouper/components/segmented control/segmented control.min.html +0 -0
  162. data/spec/fixtures/grouper/components/segmented control/segmented control.scss +0 -0
  163. data/spec/fixtures/grouper/markup/list-view.haml +0 -0
  164. data/spec/fixtures/grouper/markup/resizable/resizable.haml +0 -0
  165. data/spec/fixtures/grouper/markup/toggle.haml +0 -0
  166. data/spec/fixtures/grouper/scripts/resizable/resizable.coffee +0 -0
  167. data/spec/fixtures/grouper/scripts/toggle.coffee +0 -0
  168. data/spec/fixtures/grouper/style/_list-view.scss +0 -0
  169. data/spec/fixtures/grouper/style/_toggle.scss +0 -0
  170. data/spec/fixtures/languages/stub.json +3 -0
  171. data/spec/fixtures/languages/stub.yml +2 -0
  172. data/spec/fixtures/parsers/coffeescript_parser_fixture_basic.coffee +20 -0
  173. data/spec/fixtures/parsers/coffeescript_parser_fixture_complex.coffee +80 -0
  174. data/spec/fixtures/parsers/css_parser_fixture_basic.css +44 -0
  175. data/spec/fixtures/parsers/css_parser_fixture_complex.css +120 -0
  176. data/spec/fixtures/parsers/javascript_parser_fixture_basic.js +27 -0
  177. data/spec/fixtures/parsers/javascript_parser_fixture_complex.js +85 -0
  178. data/spec/fixtures/parsers/sass_parser_fixture_basic.scss +39 -0
  179. data/spec/fixtures/parsers/sass_parser_fixture_complex.scss +149 -0
  180. data/spec/fixtures/parsers/stylus_parser_fixture_basic.styl +34 -0
  181. data/spec/fixtures/parsers/stylus_parser_fixture_complex.styl +113 -0
  182. data/spec/fixtures/processors/join_with_smart_line_breaks/code_blocks.txt +10 -0
  183. data/spec/fixtures/processors/join_with_smart_line_breaks/headings.txt +15 -0
  184. data/spec/fixtures/processors/join_with_smart_line_breaks/lists.txt +21 -0
  185. data/spec/fixtures/processors/join_with_smart_line_breaks/lists_with_nesting.txt +13 -0
  186. data/spec/fixtures/processors/join_with_smart_line_breaks/multiple_paragraphs.txt +11 -0
  187. data/spec/fixtures/renderers/helpers.rb +37 -0
  188. data/spec/fixtures/renderers/html_output.html +7 -0
  189. data/spec/fixtures/renderers/templates/layouts/application.html.erb +0 -0
  190. data/spec/fixtures/renderers/templates/layouts/more/subdirectory.html.erb +0 -0
  191. data/spec/fixtures/renderers/templates/partials/_leading_underscore.html.erb +1 -0
  192. data/spec/fixtures/renderers/templates/partials/more/_subdirectory.html.erb +1 -0
  193. data/spec/fixtures/renderers/templates/partials/partial.html.erb +0 -0
  194. data/spec/fixtures/renderers/templates/partials/template.html.erb +1 -0
  195. data/spec/fixtures/renderers/templates/template.html.erb +1 -0
  196. data/spec/fixtures/tags/description/button.md +24 -0
  197. data/spec/fixtures/tags/description/class.md +27 -0
  198. data/spec/fixtures/tags/description/component.md +23 -0
  199. data/spec/fixtures/tags/description/function.md +30 -0
  200. data/spec/lib/build_spec.rb +467 -0
  201. data/spec/lib/cache_spec.rb +175 -0
  202. data/spec/lib/command_line_spec.rb +77 -0
  203. data/spec/lib/configuration_spec.rb +180 -0
  204. data/spec/lib/containers/base_container_spec.rb +214 -0
  205. data/spec/lib/containers/class_container_spec.rb +209 -0
  206. data/spec/lib/containers/component_container_spec.rb +158 -0
  207. data/spec/lib/containers/demo_container_spec.rb +113 -0
  208. data/spec/lib/containers/function_container_spec.rb +116 -0
  209. data/spec/lib/containers/mixin_container_spec.rb +4 -0
  210. data/spec/lib/containers/pattern_container_spec.rb +291 -0
  211. data/spec/lib/containers/pattern_library_container_spec.rb +130 -0
  212. data/spec/lib/containers/symbol_container_spec.rb +216 -0
  213. data/spec/lib/containers/variable_container_spec.rb +116 -0
  214. data/spec/lib/containers/variation_container_spec.rb +52 -0
  215. data/spec/lib/containers_spec.rb +22 -0
  216. data/spec/lib/descriptor_spec.rb +73 -0
  217. data/spec/lib/group_spec.rb +151 -0
  218. data/spec/lib/helpers/path_helper_spec.rb +202 -0
  219. data/spec/lib/helpers/render_helper_spec.rb +159 -0
  220. data/spec/lib/helpers_spec.rb +35 -0
  221. data/spec/lib/languages/base_language_spec.rb +32 -0
  222. data/spec/lib/languages/coffeescript_language_spec.rb +52 -0
  223. data/spec/lib/languages/css_language_spec.rb +13 -0
  224. data/spec/lib/languages/erb_language_spec.rb +33 -0
  225. data/spec/lib/languages/haml_language_spec.rb +32 -0
  226. data/spec/lib/languages/javascript_language_spec.rb +54 -0
  227. data/spec/lib/languages/json_language_spec.rb +24 -0
  228. data/spec/lib/languages/less_language_spec.rb +39 -0
  229. data/spec/lib/languages/markup_language_spec.rb +95 -0
  230. data/spec/lib/languages/sass_language_spec.rb +53 -0
  231. data/spec/lib/languages/slim_language_spec.rb +32 -0
  232. data/spec/lib/languages/stylus_language_spec.rb +34 -0
  233. data/spec/lib/languages/yaml_language_spec.rb +24 -0
  234. data/spec/lib/languages_spec.rb +127 -0
  235. data/spec/lib/markdown_spec.rb +63 -0
  236. data/spec/lib/messenger_spec.rb +1 -0
  237. data/spec/lib/naming_conventions/bem_naming_convention_spec.rb +112 -0
  238. data/spec/lib/naming_conventions/suit_naming_convention_spec.rb +107 -0
  239. data/spec/lib/naming_conventions_spec.rb +28 -0
  240. data/spec/lib/ostruct_spec.rb +15 -0
  241. data/spec/lib/parser_spec.rb +93 -0
  242. data/spec/lib/parsers/base_parser_spec.rb +128 -0
  243. data/spec/lib/parsers/coffeescript_parser_spec.rb +184 -0
  244. data/spec/lib/parsers/css_parser_spec.rb +136 -0
  245. data/spec/lib/parsers/javascript_parser_spec.rb +216 -0
  246. data/spec/lib/parsers/less_parser_spec.rb +111 -0
  247. data/spec/lib/parsers/sass_parser_spec.rb +233 -0
  248. data/spec/lib/parsers/stylus_parser_spec.rb +212 -0
  249. data/spec/lib/process_spec.rb +96 -0
  250. data/spec/lib/processors_spec.rb +555 -0
  251. data/spec/lib/renderers/base_renderer_spec.rb +122 -0
  252. data/spec/lib/renderers/common_features/helperable_spec.rb +30 -0
  253. data/spec/lib/renderers/erb_renderer_spec.rb +119 -0
  254. data/spec/lib/renderers/haml_renderer_spec.rb +103 -0
  255. data/spec/lib/renderers/slim_renderer_spec.rb +103 -0
  256. data/spec/lib/symbol_sources/jquery_symbol_source_spec.rb +25 -0
  257. data/spec/lib/symbol_sources/mdn_symbol_source_spec.rb +40 -0
  258. data/spec/lib/symbol_sources/sass_symbol_source_spec.rb +39 -0
  259. data/spec/lib/symbol_sources_spec.rb +19 -0
  260. data/spec/lib/tags/access_tag_spec.rb +32 -0
  261. data/spec/lib/tags/activate_with_tag_spec.rb +31 -0
  262. data/spec/lib/tags/active_tag_spec.rb +24 -0
  263. data/spec/lib/tags/alias_tag_spec.rb +31 -0
  264. data/spec/lib/tags/author_tag_spec.rb +172 -0
  265. data/spec/lib/tags/base_tag_spec.rb +21 -0
  266. data/spec/lib/tags/beta_tag_spec.rb +52 -0
  267. data/spec/lib/tags/class_tag_spec.rb +29 -0
  268. data/spec/lib/tags/compatibility_tag_spec.rb +159 -0
  269. data/spec/lib/tags/demo_type_tag_spec.rb +24 -0
  270. data/spec/lib/tags/deprecated_tag_spec.rb +50 -0
  271. data/spec/lib/tags/description_tag_spec.rb +242 -0
  272. data/spec/lib/tags/example_tag_spec.rb +37 -0
  273. data/spec/lib/tags/factory_tag_spec.rb +29 -0
  274. data/spec/lib/tags/for_tag_spec.rb +45 -0
  275. data/spec/lib/tags/group_tag_spec.rb +20 -0
  276. data/spec/lib/tags/helper_tag_spec.rb +22 -0
  277. data/spec/lib/tags/include_with_tag_spec.rb +74 -0
  278. data/spec/lib/tags/javascript_action_tag_spec.rb +20 -0
  279. data/spec/lib/tags/link_tag_spec.rb +49 -0
  280. data/spec/lib/tags/markup_tag_spec.rb +255 -0
  281. data/spec/lib/tags/member_tag_spec.rb +167 -0
  282. data/spec/lib/tags/method_tag_spec.rb +27 -0
  283. data/spec/lib/tags/name_tag_spec.rb +20 -0
  284. data/spec/lib/tags/object_tag_spec.rb +24 -0
  285. data/spec/lib/tags/param_tag_spec.rb +261 -0
  286. data/spec/lib/tags/pattern_tag_spec.rb +49 -0
  287. data/spec/lib/tags/preclude_tag_spec.rb +31 -0
  288. data/spec/lib/tags/private_tag_spec.rb +31 -0
  289. data/spec/lib/tags/property_tag_spec.rb +27 -0
  290. data/spec/lib/tags/public_tag_spec.rb +29 -0
  291. data/spec/lib/tags/require_tag_spec.rb +133 -0
  292. data/spec/lib/tags/returns_tag_spec.rb +85 -0
  293. data/spec/lib/tags/set_by_tag_spec.rb +92 -0
  294. data/spec/lib/tags/signature_tag_spec.rb +125 -0
  295. data/spec/lib/tags/since_tag_spec.rb +48 -0
  296. data/spec/lib/tags/state_tag_spec.rb +199 -0
  297. data/spec/lib/tags/static_tag_spec.rb +27 -0
  298. data/spec/lib/tags/subcomponent_tag_spec.rb +78 -0
  299. data/spec/lib/tags/subtitle_tag_spec.rb +13 -0
  300. data/spec/lib/tags/symbol_type_tag_spec.rb +20 -0
  301. data/spec/lib/tags/throws_tag_spec.rb +49 -0
  302. data/spec/lib/tags/title_tag_spec.rb +20 -0
  303. data/spec/lib/tags/type_tag_spec.rb +20 -0
  304. data/spec/lib/tags/value_tag_spec.rb +20 -0
  305. data/spec/lib/tags/variant_tag_spec.rb +13 -0
  306. data/spec/lib/tags/variation_tag_spec.rb +154 -0
  307. data/spec/lib/tags_spec.rb +264 -0
  308. data/spec/lib/templates_spec.rb +185 -0
  309. data/spec/lib/themes_spec.rb +32 -0
  310. data/spec/spec_helper.rb +34 -0
  311. data/tasks/rspec.rake +7 -0
  312. data/tasks/rubocop.rake +8 -0
  313. metadata +740 -0
@@ -0,0 +1,32 @@
1
+ require "spec_helper"
2
+
3
+ describe Docks::Languages::Haml do
4
+ subject { Docks::Languages::Haml.instance }
5
+
6
+ describe ".extensions" do
7
+ let(:extensions) { [subject.class.extensions].flatten }
8
+
9
+ it "includes .haml as an extension" do
10
+ expect(extensions).to include "haml"
11
+ end
12
+ end
13
+
14
+ describe "#helper_markup_for" do
15
+ let(:mixed_arguments) { ["hello", 10, false, :goodbye, { bar: "baz", "baz" => :qux }] }
16
+ let(:mixed_arguments_output) { "\"hello\", 10, false, :goodbye, bar: \"baz\",\n#{" " * 36}\"baz\" => :qux" }
17
+ let(:argumentless_hash) { { "baz" => :qux } }
18
+ let(:argumentless_hash_output) { "\"baz\" => :qux" }
19
+
20
+ it "converts an array of arguments into the corresponding function" do
21
+ expect(subject.helper_markup_for("foo", mixed_arguments)).to eq "= foo #{mixed_arguments_output}"
22
+ end
23
+
24
+ it "converts a hash with an arguments key into the corresponding function" do
25
+ expect(subject.helper_markup_for("foo", arguments: mixed_arguments)).to eq "= foo #{mixed_arguments_output}"
26
+ end
27
+
28
+ it "converts a hash without an array key into a function with the hash as the only param" do
29
+ expect(subject.helper_markup_for("foo", argumentless_hash)).to eq "= foo #{argumentless_hash_output}"
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,54 @@
1
+ require "spec_helper"
2
+
3
+ describe Docks::Languages::JavaScript do
4
+ subject { Docks::Languages::JavaScript.instance }
5
+
6
+ describe ".extensions" do
7
+ let(:extensions) { [subject.class.extensions].flatten }
8
+
9
+ it "includes .js as an extension" do
10
+ expect(extensions).to include "js"
11
+ end
12
+ end
13
+
14
+ describe "#signature_for" do
15
+ let(:name) { "foo" }
16
+ let(:function_no_params) { Docks::Containers::Function.new(name: name) }
17
+ let(:function_with_params) { Docks::Containers::Function.new(name: name, params: [OpenStruct.new(name: "bar"), OpenStruct.new(name: "baz", optional: true, default: "'qux'")]) }
18
+ let(:klass) { Docks::Containers::Klass.new(name: name.capitalize, params: function_with_params.params) }
19
+ let(:something_else) { Docks::Containers::Variable.new(name: "bar") }
20
+
21
+ it "gives a signature to functions with no params" do
22
+ expect(subject.signature_for(function_no_params)).to eq "function #{function_no_params.name}() { /* ... */ }"
23
+ end
24
+
25
+ it "gives a signature to functions with params, including default values" do
26
+ expect(subject.signature_for(function_with_params)).to eq "function #{function_with_params.name}(bar, [baz = 'qux']) { /* ... */ }"
27
+ end
28
+
29
+ it "gives a signature for classes with params, including default values" do
30
+ expect(subject.signature_for(klass)).to eq "function #{klass.name}(bar, [baz = 'qux']) { /* ... */ }"
31
+ end
32
+
33
+ it "gives a signature to instance methods with classes" do
34
+ klass.add_member(function_with_params)
35
+ expect(subject.signature_for(function_with_params)).to eq "#{klass.name}.prototype.#{function_with_params.name} = function(bar, [baz = 'qux']) { /* ... */ }"
36
+ end
37
+
38
+ it "gives a signature to instance methods with factories" do
39
+ factory = Docks::Containers::Factory.new(klass)
40
+ factory.add_member(function_with_params)
41
+ expect(subject.signature_for(function_with_params)).to eq "#{function_with_params.name}: function(bar, [baz = 'qux']) { /* ... */ }"
42
+ end
43
+
44
+ it "gives a signature to static methods" do
45
+ function_with_params.static = true
46
+ klass.add_member(function_with_params)
47
+ expect(subject.signature_for(function_with_params)).to eq "#{klass.name}.#{function_with_params.name} = function(bar, [baz = 'qux']) { /* ... */ }"
48
+ end
49
+
50
+ it "doesn't provide a signature for a non-function symbol" do
51
+ expect(subject.signature_for(something_else)).to be nil
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,24 @@
1
+ require "spec_helper"
2
+
3
+ describe Docks::Languages::JSON do
4
+ subject { Docks::Languages::JSON.instance }
5
+
6
+ describe ".extensions" do
7
+ let(:extensions) { [subject.class.extensions].flatten }
8
+
9
+ it "includes .erb as an extension" do
10
+ expect(extensions).to include "json"
11
+ end
12
+ end
13
+
14
+ describe "#load_stub" do
15
+ let(:stub_file) { File.expand_path("../../../fixtures/languages/stub.json", __FILE__) }
16
+ let(:expected_stub) do
17
+ { "foo" => "bar" }
18
+ end
19
+
20
+ it "loads a stub file" do
21
+ expect(subject.load_stub(stub_file)).to eq expected_stub
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,39 @@
1
+ require "spec_helper"
2
+
3
+ describe Docks::Languages::Less do
4
+ subject { Docks::Languages::Less.instance }
5
+
6
+ describe ".extensions" do
7
+ let(:extensions) { [subject.class.extensions].flatten }
8
+
9
+ it "includes .less as an extension" do
10
+ expect(extensions).to include "less"
11
+ end
12
+ end
13
+
14
+ describe "#signature_for" do
15
+ let(:name) { "foo" }
16
+
17
+ let(:mixin_no_params) { Docks::Containers::Mixin.new(name: name) }
18
+ let(:mixin_with_params) { Docks::Containers::Mixin.new(name: name, params: [OpenStruct.new(name: "bar"), OpenStruct.new(name: "baz", default: "'qux'")]) }
19
+
20
+ let(:something_else) { Docks::Containers::Component.new(name: name) }
21
+
22
+ it "gives a signature to mixins with no params" do
23
+ expect(subject.signature_for(mixin_no_params)).to eq ".#{name}() { /* ... */ }"
24
+ end
25
+
26
+ it "gives a signature to mixins with params, including default values" do
27
+ expect(subject.signature_for(mixin_with_params)).to eq ".#{name}(@bar, @baz: 'qux') { /* ... */ }"
28
+ end
29
+
30
+ it "only prefixes variable names with @ if they don't already have it" do
31
+ mixin_with_params.params.first.name = "@bar"
32
+ expect(subject.signature_for(mixin_with_params)).to eq ".#{name}(@bar, @baz: 'qux') { /* ... */ }"
33
+ end
34
+
35
+ it "returns nil if the symbol is not a function/ mixin" do
36
+ expect(subject.signature_for(something_else)).to be nil
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,95 @@
1
+ require "spec_helper"
2
+
3
+ class MarkupLanguageTester
4
+ include Docks::Languages::Common::Markup
5
+ end
6
+
7
+ describe Docks::Languages::Common::Markup do
8
+ subject { MarkupLanguageTester.new }
9
+
10
+ let(:mixed_arguments) { ["hello", 10, false, :goodbye, { bar: "baz", "baz" => :qux }] }
11
+ let(:mixed_arguments_output) { "\"hello\", 10, false, :goodbye, bar: \"baz\",\n#{" " * 34}\"baz\" => :qux" }
12
+ let(:argumentless_hash) { { "baz" => :qux } }
13
+ let(:argumentless_hash_output) { "\"baz\" => :qux" }
14
+
15
+ describe "#functionize_helper" do
16
+ it "converts an array of arguments into the corresponding function" do
17
+ expect(subject.send(:functionize_helper, "foo", mixed_arguments)).to eq "foo #{mixed_arguments_output}"
18
+ end
19
+
20
+ it "converts a hash with an arguments key into the corresponding function" do
21
+ expect(subject.send(:functionize_helper, "foo", arguments: mixed_arguments)).to eq "foo #{mixed_arguments_output}"
22
+ end
23
+
24
+ it "converts a hash without an array key into a function with the hash as the only param" do
25
+ expect(subject.send(:functionize_helper, "foo", argumentless_hash)).to eq "foo #{argumentless_hash_output}"
26
+ end
27
+
28
+ it "does not strip symbols from contained hashes when a hash is the last argument" do
29
+ argumentless_hash["baz"] = argumentless_hash[:qux] = argumentless_hash.clone
30
+ expected_output = "\"baz\" => { #{argumentless_hash_output} },\n qux: { #{argumentless_hash_output} }"
31
+ expect(subject.send(:functionize_helper, "foo", argumentless_hash)).to eq "foo #{expected_output}"
32
+ end
33
+ end
34
+
35
+ describe "#normalize_arguments" do
36
+ it "assumes a passed array is the array of arguments" do
37
+ array = ["foo"]
38
+ expect(subject.send(:normalize_arguments, array)).to eq array
39
+ end
40
+
41
+ it "assumes the passed object is the only argument if it has no arguments key" do
42
+ hash = { foo: "bar" }
43
+ expect(subject.send(:normalize_arguments, hash)).to eq [hash]
44
+ end
45
+
46
+ it "sets the arguments to the contents of the arguments attribute" do
47
+ hash_one = { arguments: ["foo"] }
48
+ hash_two = { "arguments" => ["bar"] }
49
+
50
+ expect(subject.send(:normalize_arguments, hash_one)).to eq ["foo"]
51
+ expect(subject.send(:normalize_arguments, hash_two)).to eq ["bar"]
52
+ end
53
+
54
+ it "sets the arguments to the contents of the arguments attribute in an array" do
55
+ hash_one = { foo: "bar" }
56
+ hash_two = { arguments: hash_one }
57
+
58
+ expect(subject.send(:normalize_arguments, hash_two)).to eq [hash_one]
59
+ end
60
+ end
61
+
62
+ describe "#stringfy_val" do
63
+ it "stringifies strings" do
64
+ expect(subject.send(:stringify_val, "foo")).to eq "\"foo\""
65
+ end
66
+
67
+ it "stringies numbers" do
68
+ expect(subject.send(:stringify_val, 10)).to eq "10"
69
+ expect(subject.send(:stringify_val, 0)).to eq "0"
70
+ expect(subject.send(:stringify_val, -10)).to eq "-10"
71
+ expect(subject.send(:stringify_val, 10_000)).to eq "10_000"
72
+ end
73
+
74
+ it "stringies booleans" do
75
+ expect(subject.send(:stringify_val, false)).to eq "false"
76
+ expect(subject.send(:stringify_val, true)).to eq "true"
77
+ end
78
+
79
+ it "stringifes symbols" do
80
+ expect(subject.send(:stringify_val, :foo)).to eq ":foo"
81
+ expect(subject.send(:stringify_val, :"foo bar baz")).to eq ":\"foo bar baz\""
82
+ end
83
+
84
+ it "stringifies arrays" do
85
+ expect(subject.send(:stringify_val, mixed_arguments)).to eq "[#{mixed_arguments.map { |arg| subject.send(:stringify_val, arg) }.join(", ")}]"
86
+ end
87
+
88
+ it "stringifies hashes" do
89
+ expect(subject.send(:stringify_val, foo: :bar, baz: :qux)).to eq "{ foo: :bar, baz: :qux }"
90
+ expect(subject.send(:stringify_val, "foo" => "bar")).to eq "{ \"foo\" => \"bar\" }"
91
+ expect(subject.send(:stringify_val, "foo" => "bar", baz: :qux)).to eq "{ \"foo\" => \"bar\", baz: :qux }"
92
+ end
93
+ end
94
+ end
95
+
@@ -0,0 +1,53 @@
1
+ require "spec_helper"
2
+
3
+ describe Docks::Languages::Sass do
4
+ subject { Docks::Languages::Sass.instance }
5
+
6
+ describe ".extensions" do
7
+ let(:extensions) { [subject.class.extensions].flatten }
8
+
9
+ it "includes .scss as an extension" do
10
+ expect(extensions).to include "scss"
11
+ end
12
+
13
+ it "includes .sass as an extension" do
14
+ expect(extensions).to include "sass"
15
+ end
16
+ end
17
+
18
+ describe "#signature_for" do
19
+ let(:name) { "foo" }
20
+
21
+ let(:function_no_params) { Docks::Containers::Function.new(name: name) }
22
+ let(:function_with_params) { Docks::Containers::Function.new(name: name, params: [OpenStruct.new(name: "bar"), OpenStruct.new(name: "baz", default: "'qux'")]) }
23
+ let(:mixin_no_params) { Docks::Containers::Mixin.new(name: name) }
24
+ let(:mixin_with_params) { Docks::Containers::Mixin.new(name: name, params: [OpenStruct.new(name: "bar"), OpenStruct.new(name: "baz", default: "'qux'")]) }
25
+
26
+ let(:something_else) { Docks::Containers::Component.new(name: name) }
27
+
28
+ it "gives a signature to functions with no params" do
29
+ expect(subject.signature_for(function_no_params)).to eq "@function #{name}() { /* ... */ }"
30
+ end
31
+
32
+ it "gives a signature to functions with params, including default values" do
33
+ expect(subject.signature_for(function_with_params)).to eq "@function #{name}($bar, $baz: 'qux') { /* ... */ }"
34
+ end
35
+
36
+ it "gives a signature to mixins with no params" do
37
+ expect(subject.signature_for(mixin_no_params)).to eq "@mixin #{name}() { /* ... */ }"
38
+ end
39
+
40
+ it "gives a signature to mixins with params, including default values" do
41
+ expect(subject.signature_for(mixin_with_params)).to eq "@mixin #{name}($bar, $baz: 'qux') { /* ... */ }"
42
+ end
43
+
44
+ it "only prefixes variable names with dollar signs if they don't already exist" do
45
+ function_with_params.params.first.name = "$bar"
46
+ expect(subject.signature_for(function_with_params)).to eq "@function #{name}($bar, $baz: 'qux') { /* ... */ }"
47
+ end
48
+
49
+ it "returns nil if the symbol is not a function/ mixin" do
50
+ expect(subject.signature_for(something_else)).to be nil
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,32 @@
1
+ require "spec_helper"
2
+
3
+ describe Docks::Languages::Slim do
4
+ subject { Docks::Languages::Slim.instance }
5
+
6
+ describe ".extensions" do
7
+ let(:extensions) { [subject.class.extensions].flatten }
8
+
9
+ it "includes .slim as an extension" do
10
+ expect(extensions).to include "slim"
11
+ end
12
+ end
13
+
14
+ describe "#helper_markup_for" do
15
+ let(:mixed_arguments) { ["hello", 10, false, :goodbye, { bar: "baz", "baz" => :qux }] }
16
+ let(:mixed_arguments_output) { "\"hello\", 10, false, :goodbye, bar: \"baz\",\n#{" " * 37}\"baz\" => :qux" }
17
+ let(:argumentless_hash) { { "baz" => :qux } }
18
+ let(:argumentless_hash_output) { "\"baz\" => :qux" }
19
+
20
+ it "converts an array of arguments into the corresponding function" do
21
+ expect(subject.helper_markup_for("foo", mixed_arguments)).to eq "== foo #{mixed_arguments_output}"
22
+ end
23
+
24
+ it "converts a hash with an arguments key into the corresponding function" do
25
+ expect(subject.helper_markup_for("foo", arguments: mixed_arguments)).to eq "== foo #{mixed_arguments_output}"
26
+ end
27
+
28
+ it "converts a hash without an array key into a function with the hash as the only param" do
29
+ expect(subject.helper_markup_for("foo", argumentless_hash)).to eq "== foo #{argumentless_hash_output}"
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,34 @@
1
+ require "spec_helper"
2
+
3
+ describe Docks::Languages::Stylus do
4
+ subject { Docks::Languages::Stylus.instance }
5
+
6
+ describe ".extensions" do
7
+ let(:extensions) { [subject.class.extensions].flatten }
8
+
9
+ it "includes .less as an extension" do
10
+ expect(extensions).to include "styl"
11
+ end
12
+ end
13
+
14
+ describe "#signature_for" do
15
+ let(:name) { "foo" }
16
+
17
+ let(:mixin_no_params) { Docks::Containers::Mixin.new(name: name) }
18
+ let(:mixin_with_params) { Docks::Containers::Mixin.new(name: name, params: [OpenStruct.new(name: "bar"), OpenStruct.new(name: "baz", default: "'qux'")]) }
19
+
20
+ let(:something_else) { Docks::Containers::Component.new(name: name) }
21
+
22
+ it "gives a signature to mixins with no params" do
23
+ expect(subject.signature_for(mixin_no_params)).to eq "#{name}() // ..."
24
+ end
25
+
26
+ it "gives a signature to mixins with params, including default values" do
27
+ expect(subject.signature_for(mixin_with_params)).to eq "#{name}(bar, baz = 'qux') // ..."
28
+ end
29
+
30
+ it "returns nil if the symbol is not a function/ mixin" do
31
+ expect(subject.signature_for(something_else)).to be nil
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,24 @@
1
+ require "spec_helper"
2
+
3
+ describe Docks::Languages::YAML do
4
+ subject { Docks::Languages::YAML.instance }
5
+
6
+ describe ".extensions" do
7
+ let(:extensions) { [subject.class.extensions].flatten }
8
+
9
+ it "includes .erb as an extension" do
10
+ expect(extensions).to include "yml"
11
+ end
12
+ end
13
+
14
+ describe "#load_stub" do
15
+ let(:stub_file) { File.expand_path("../../../fixtures/languages/stub.yml", __FILE__) }
16
+ let(:expected_stub) do
17
+ { "foo" => "bar" }
18
+ end
19
+
20
+ it "loads a stub file" do
21
+ expect(subject.load_stub(stub_file)).to eq expected_stub
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,127 @@
1
+ require "spec_helper"
2
+
3
+ describe Docks::Languages do
4
+ subject { Docks::Languages }
5
+
6
+ before :each do
7
+ subject.send(:clean)
8
+ end
9
+
10
+ describe ".extensions" do
11
+ it "returns all extensions in an array" do
12
+ subject.register(Docks::Languages::Haml)
13
+ subject.register(Docks::Languages::CoffeeScript)
14
+
15
+ [Docks::Languages::Haml.extensions].flatten.each do |extension|
16
+ expect(subject.extensions).to include(extension)
17
+ end
18
+
19
+ [Docks::Languages::CoffeeScript.extensions].flatten.each do |extension|
20
+ expect(subject.extensions).to include(extension)
21
+ end
22
+ end
23
+ end
24
+
25
+ describe ".<type>_extensions" do
26
+ it "has a method to retrieve extensions for each type of file" do
27
+ Docks::Types::Languages.constants.each do |const|
28
+ expect(subject.respond_to?("#{Docks::Types::Languages.const_get(const)}_extensions")).to be true
29
+ end
30
+ end
31
+
32
+ it "registers extensions with the correct type" do
33
+ subject.register(Docks::Languages::Haml)
34
+ subject.register(Docks::Languages::CoffeeScript)
35
+
36
+ [Docks::Languages::Haml.extensions].flatten.each do |extension|
37
+ expect(subject.send("#{Docks::Languages::Haml.type}_extensions".to_sym)).to include(extension)
38
+ expect(subject.send("#{Docks::Languages::CoffeeScript.type}_extensions".to_sym)).not_to include(extension)
39
+ end
40
+
41
+ [Docks::Languages::CoffeeScript.extensions].flatten.each do |extension|
42
+ expect(subject.send("#{Docks::Languages::CoffeeScript.type}_extensions".to_sym)).to include(extension)
43
+ expect(subject.send("#{Docks::Languages::Haml.type}_extensions".to_sym)).not_to include(extension)
44
+ end
45
+ end
46
+ end
47
+
48
+ describe ".register_bundled_languages" do
49
+ it "registers all bundled languages" do
50
+ extensions = []
51
+ subject.constants.select do |const|
52
+ klass = subject.const_get(const)
53
+ next unless Class === klass && !(klass.eql?(subject::Base))
54
+
55
+ expect(subject).to receive(:register).with(klass).and_call_original
56
+ extensions.concat([klass.extensions].flatten)
57
+ end
58
+
59
+ subject.register_bundled_languages
60
+
61
+ bundled_extensions = subject.extensions
62
+ extensions.each do |extension|
63
+ expect(bundled_extensions).to include(extension)
64
+ end
65
+ end
66
+ end
67
+
68
+ describe ".language_for" do
69
+ it "returns the language associated with a file" do
70
+ subject.register(Docks::Languages::CoffeeScript)
71
+
72
+ [Docks::Languages::CoffeeScript.extensions].flatten.each do |extension|
73
+ expect(subject.language_for("foo/bar/baz.#{extension}")).to be Docks::Languages::CoffeeScript.instance
74
+ expect(subject.language_for("foo/bar/baz.min.#{extension}")).to be Docks::Languages::CoffeeScript.instance
75
+ end
76
+ end
77
+
78
+ it "returns nil when no language exists to manage that file" do
79
+ expect(subject.language_for("foo/bar/baz.#{[Docks::Languages::Haml.extensions].flatten.first}")).to be nil
80
+ end
81
+ end
82
+
83
+ describe ".file_type" do
84
+ it "correctly recognizes a registered file type" do
85
+ subject.register(Docks::Languages::CoffeeScript)
86
+
87
+ [Docks::Languages::CoffeeScript.extensions].flatten.each do |extension|
88
+ expect(subject.file_type("foo/bar/baz.#{extension}")).to be Docks::Types::Languages::SCRIPT
89
+ expect(subject.file_type("foo/bar/baz.min.#{extension}")).to be Docks::Types::Languages::SCRIPT
90
+ end
91
+ end
92
+
93
+ it "returns nil for an unregistered file type" do
94
+ expect(subject.file_type("foo/bar/baz.coffee")).to be nil
95
+ end
96
+ end
97
+
98
+ describe ".supported_file?" do
99
+ it "supports a file type whose extension is associated with a registered language" do
100
+ subject.register(Docks::Languages::CoffeeScript)
101
+
102
+ [Docks::Languages::CoffeeScript.extensions].flatten.each do |extension|
103
+ expect(subject.supported_file?("foo/bar/baz.#{extension}")).to be true
104
+ expect(subject.supported_file?("foo/bar/baz.min.#{extension}")).to be true
105
+ end
106
+ end
107
+
108
+ it "doesn't support a file whose extension hasn't been registered" do
109
+ expect(subject.supported_file?("foo/bar/baz.coffee")).to be false
110
+ end
111
+ end
112
+
113
+ describe ".register" do
114
+ it "registers all symbols sources for the language" do
115
+ Array(Docks::Languages::Sass.symbol_sources).each do |source|
116
+ expect(Docks::SymbolSources).to receive(:register).with source
117
+ end
118
+
119
+ subject.register(Docks::Languages::Sass)
120
+ end
121
+
122
+ it "is aliased to <<" do
123
+ expect(subject).to receive(:register).with Docks::Languages::Sass
124
+ subject << Docks::Languages::Sass
125
+ end
126
+ end
127
+ end
@@ -0,0 +1,63 @@
1
+ require "spec_helper"
2
+
3
+ describe Docks::Markdown::Renderer do
4
+ subject { Redcarpet::Markdown.new(described_class, fenced_code_blocks: true) }
5
+
6
+ describe "#block_code" do
7
+ let(:code) { "<div>\n <p>Hi!</p>\n</div>" }
8
+ let(:language) { "html" }
9
+ let(:code_block) { "```#{language}\n#{code}\n```" }
10
+
11
+ it "wraps the content of the code block in a fake element for view-side processing" do
12
+ result = subject.render(code_block)
13
+ expect(result).to have_tag "fenced_code_block", content: code
14
+ expect(result).to_not have_tag "pre"
15
+ expect(result).to_not have_tag "code"
16
+ end
17
+
18
+ it "adds a data property with the language" do
19
+ result = subject.render(code_block)
20
+ expect(result).to have_tag "fenced_code_block", with: { "data-language" => language }
21
+ end
22
+
23
+ it "adds a data property to include a demo if the language has _demo in it, and strips this from the language" do
24
+ code_block.sub!(language, "#{language}_demo")
25
+ result = subject.render(code_block)
26
+ expect(result).to have_tag "fenced_code_block", with: { "data-language" => language, "data-has-demo" => "true" }
27
+ end
28
+ end
29
+
30
+ describe "#link" do
31
+ let(:name) { "button" }
32
+
33
+ it "doesn't mess up standard links" do
34
+ description = "[`Apple`](http://apple.com)"
35
+ expect(subject.render(description)).to eq Redcarpet::Markdown.new(Redcarpet::Render::HTML).render(description)
36
+ end
37
+
38
+ it "preserves @link declarations" do
39
+ result = subject.render("[#{name}](@link #{name})")
40
+ expect(result).to have_tag "a", with: { href: "@link #{name}" }
41
+ end
42
+
43
+ it "uses the text from the link for a bare @link declaration" do
44
+ result = subject.render("[#{name}](@link)")
45
+ expect(result).to have_tag "a", with: { href: "@link #{name}" }
46
+ end
47
+
48
+ it "removes excess tags from the content for bare @link declarations" do
49
+ result = subject.render("[`#{name}`](@link)")
50
+ expect(result).to have_tag "a", with: { href: "@link #{name}" }
51
+ end
52
+
53
+ it "adds a span around content without any wrapping HTML tags" do
54
+ result = subject.render("[#{name}](@link)")
55
+ expect(result).to have_tag "span", text: name
56
+ end
57
+
58
+ it "doesn't add a span when it doesn't need to" do
59
+ result = subject.render("[`#{name}`](@link)")
60
+ expect(result).to_not have_tag "span"
61
+ end
62
+ end
63
+ end
@@ -0,0 +1 @@
1
+ # TODO