livingstyleguide 0.6.0.alpha.2 → 1.0.0.alpha.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +2 -2
- data/CHANGELOG.md +20 -0
- data/MIT-LICENSE.md +11 -0
- data/README.md +44 -6
- data/lib/livingstyleguide.rb +6 -27
- data/lib/livingstyleguide/code_block.rb +35 -0
- data/lib/livingstyleguide/engine.rb +93 -0
- data/lib/livingstyleguide/example.rb +86 -0
- data/lib/livingstyleguide/filter_hooks.rb +34 -0
- data/lib/livingstyleguide/filters.rb +8 -0
- data/lib/livingstyleguide/filters/add_wrapper_class.rb +4 -0
- data/lib/livingstyleguide/filters/coffee_script.rb +18 -0
- data/lib/livingstyleguide/filters/font_example.rb +20 -0
- data/lib/livingstyleguide/filters/full_width.rb +4 -0
- data/lib/livingstyleguide/filters/haml.rb +16 -0
- data/lib/livingstyleguide/filters/highlights.rb +9 -0
- data/lib/livingstyleguide/filters/javascript.rb +10 -0
- data/lib/livingstyleguide/importer.rb +19 -6
- data/lib/livingstyleguide/markdown_extensions.rb +24 -59
- data/lib/livingstyleguide/tilt_template.rb +30 -7
- data/lib/livingstyleguide/version.rb +1 -1
- data/livingstyleguide.gemspec +4 -1
- data/stylesheets/_livingstyleguide.scss +1 -1
- data/stylesheets/livingstyleguide/_content.scss +9 -8
- data/templates/layouts/default.html.erb +6 -6
- data/test/example_test_helper.rb +22 -0
- data/test/fixtures/markdown/code-block-and-example.md +8 -0
- data/test/fixtures/markdown/example-with-highlight.md +1 -1
- data/test/fixtures/markdown/example.md +1 -1
- data/test/fixtures/markdown/font-example.md +4 -1
- data/test/fixtures/markdown/{layout-example.md → full-width-example.md} +2 -1
- data/test/fixtures/markdown/haml-example-with-highlight.md +2 -1
- data/test/fixtures/markdown/haml-example.md +2 -1
- data/test/fixtures/standalone/modules/_buttons.md +1 -1
- data/test/integration/markdown_test.rb +17 -14
- data/test/integration/sprockets_test.rb +19 -0
- data/test/integration/standalone_test.rb +1 -1
- data/test/integration/variables_test.rb +1 -1
- data/test/test_helper.rb +9 -1
- data/test/unit/code_block_test.rb +53 -0
- data/test/unit/example_test.rb +142 -0
- data/test/unit/filter_hooks_test.rb +46 -0
- data/test/unit/filters/add_wrapper_class_test.rb +15 -0
- data/test/unit/filters/coffee_script_test.rb +19 -0
- data/test/unit/filters/font_example_test.rb +47 -0
- data/test/unit/filters/full_width_test.rb +16 -0
- data/test/unit/filters/haml_test.rb +20 -0
- data/test/unit/filters/highlights_test.rb +26 -0
- data/test/unit/filters/javascript_test.rb +18 -0
- data/test/unit/sass_extensions_test.rb +1 -1
- metadata +87 -10
- data/LICENSE.txt +0 -22
- data/lib/livingstyleguide/renderer.rb +0 -36
- data/test/fixtures/markdown/javascript-example.md +0 -4
@@ -1,16 +1,17 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
require 'tilt'
|
3
3
|
|
4
|
-
class MarkdownTest < Test
|
4
|
+
class MarkdownTest < Minitest::Test
|
5
5
|
|
6
|
-
def
|
7
|
-
|
8
|
-
|
6
|
+
def render_markdown(file, options)
|
7
|
+
engine = LivingStyleGuide::Engine.new('', options, {})
|
8
|
+
engine.markdown = File.read(file)
|
9
|
+
engine.html
|
9
10
|
end
|
10
11
|
|
11
|
-
def assert_markdown(expected, file)
|
12
|
+
def assert_markdown(expected, file, options = {})
|
12
13
|
expected = expected.gsub(/\s+/m, ' ').gsub(/([\$\(\)\[\]])/) { |s| "\\#{s}" }.strip
|
13
|
-
given =
|
14
|
+
given = render_markdown(File.join(%W(test fixtures markdown #{file})), options)
|
14
15
|
given = given.gsub(/\s+/m, ' ').strip
|
15
16
|
assert_match /#{expected}/, given
|
16
17
|
end
|
@@ -24,9 +25,9 @@ class MarkdownTest < Test::Unit::TestCase
|
|
24
25
|
HTML
|
25
26
|
end
|
26
27
|
|
27
|
-
def
|
28
|
-
assert_markdown <<-HTML, '
|
29
|
-
<div class="livingstyleguide--
|
28
|
+
def test_full_width_examples
|
29
|
+
assert_markdown <<-HTML, 'full-width-example.md'
|
30
|
+
<div class="livingstyleguide--example -lsg-has-full-width">
|
30
31
|
<button class="button">Test</button>
|
31
32
|
</div>
|
32
33
|
<pre class="livingstyleguide--code-block"><code class="livingstyleguide--code">.+button.+Test.+button.+</code></pre>
|
@@ -88,7 +89,7 @@ class MarkdownTest < Test::Unit::TestCase
|
|
88
89
|
|
89
90
|
def test_code_with_highlight_block
|
90
91
|
assert_markdown <<-HTML, 'code-with-highlight-block.md'
|
91
|
-
<pre class="livingstyleguide--code-block"><code class="livingstyleguide--code"
|
92
|
+
<pre class="livingstyleguide--code-block"><code class="livingstyleguide--code">.+<strong class="livingstyleguide--code-highlight-block">.+Block example.+</strong>.+</code></pre>
|
92
93
|
HTML
|
93
94
|
end
|
94
95
|
|
@@ -123,10 +124,12 @@ class MarkdownTest < Test::Unit::TestCase
|
|
123
124
|
HTML
|
124
125
|
end
|
125
126
|
|
126
|
-
def
|
127
|
-
assert_markdown <<-HTML, '
|
128
|
-
<
|
129
|
-
|
127
|
+
def test_resetting_language
|
128
|
+
assert_markdown <<-HTML, 'code-block-and-example.md', default_language: 'code'
|
129
|
+
<pre class="livingstyleguide--code-block"><code class="livingstyleguide--code">Normal code block</code></pre><div class="livingstyleguide--example">
|
130
|
+
Example
|
131
|
+
</div>
|
132
|
+
<pre class="livingstyleguide--code-block"><code class="livingstyleguide--code">Example</code></pre>
|
130
133
|
HTML
|
131
134
|
end
|
132
135
|
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'tilt'
|
3
|
+
|
4
|
+
describe "Sprockets integration" do
|
5
|
+
|
6
|
+
describe "sprockets should know when to invalidate cache" do
|
7
|
+
template = Tilt.new('test/fixtures/standalone/styleguide.html.lsg')
|
8
|
+
context = Minitest::Mock.new
|
9
|
+
%w(style.scss modules/_buttons.scss modules/_buttons.md styleguide.html.lsg).each do |file|
|
10
|
+
context.expect :depend_on, nil, ["test/fixtures/standalone/#{file}"]
|
11
|
+
end
|
12
|
+
|
13
|
+
template.render context
|
14
|
+
|
15
|
+
context.verify
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
data/test/test_helper.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
|
+
require 'minitest/autorun'
|
1
2
|
require 'compass'
|
2
3
|
require 'livingstyleguide'
|
3
|
-
require '
|
4
|
+
require 'heredoc_unindent'
|
4
5
|
|
5
6
|
Compass.configuration.add_import_path File.join(%w(test fixtures stylesheets))
|
6
7
|
|
@@ -18,3 +19,10 @@ def parse_file(filename)
|
|
18
19
|
Sass::Engine.new(File.read(filename), options)
|
19
20
|
end
|
20
21
|
|
22
|
+
def normalize(html)
|
23
|
+
html.gsub! /\s+/, ' '
|
24
|
+
html.gsub! '><', '> <'
|
25
|
+
html.strip!
|
26
|
+
html
|
27
|
+
end
|
28
|
+
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
describe LivingStyleGuide::CodeBlock do
|
4
|
+
|
5
|
+
before do
|
6
|
+
@code_block = Class.new(LivingStyleGuide::CodeBlock)
|
7
|
+
end
|
8
|
+
|
9
|
+
describe "when no language is given" do
|
10
|
+
it "should output the code" do
|
11
|
+
@code_block.new("My Code").render.must_equal <<-HTML.unindent.strip
|
12
|
+
<pre class="livingstyleguide--code-block"><code class="livingstyleguide--code">My Code</code></pre>
|
13
|
+
HTML
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should html escape the code" do
|
17
|
+
@code_block.new("1 < 2 > 0 &\"").render.must_equal <<-HTML.unindent.strip
|
18
|
+
<pre class="livingstyleguide--code-block"><code class="livingstyleguide--code">1 < 2 > 0 &"</code></pre>
|
19
|
+
HTML
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe "when a language is given" do
|
24
|
+
it "should output the code with syntax highlighting" do
|
25
|
+
@code_block.new("<my-code>", :html).render.must_equal <<-HTML.unindent.strip
|
26
|
+
<pre class="livingstyleguide--code-block"><code class="livingstyleguide--code"><b><<em>my-code</em></b><b>></b></code></pre>
|
27
|
+
HTML
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "when filters are set" do
|
32
|
+
it "should filter the code" do
|
33
|
+
@code_block.filter_code do |code|
|
34
|
+
code.gsub(/ugly/, 'beautiful')
|
35
|
+
end
|
36
|
+
|
37
|
+
@code_block.new("my ugly code").render.must_equal <<-HTML.unindent.strip
|
38
|
+
<pre class="livingstyleguide--code-block"><code class="livingstyleguide--code">my beautiful code</code></pre>
|
39
|
+
HTML
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should use own syntax highlighter" do
|
43
|
+
@code_block.syntax_highlight do |code|
|
44
|
+
code.gsub(/language/, language)
|
45
|
+
end
|
46
|
+
|
47
|
+
@code_block.new("my ugly language code", "html").render.must_equal <<-HTML.unindent.strip
|
48
|
+
<pre class="livingstyleguide--code-block"><code class="livingstyleguide--code">my ugly html code</code></pre>
|
49
|
+
HTML
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
@@ -0,0 +1,142 @@
|
|
1
|
+
require 'example_test_helper'
|
2
|
+
|
3
|
+
class ExampleTest < ExampleTestCase
|
4
|
+
|
5
|
+
def test_default
|
6
|
+
assert_render_equals <<-INPUT, <<-OUTPUT
|
7
|
+
<button>Hello World</button>
|
8
|
+
INPUT
|
9
|
+
<div class="livingstyleguide--example"> <button>Hello World</button> </div>
|
10
|
+
<pre class="livingstyleguide--code-block">
|
11
|
+
<code class="livingstyleguide--code">
|
12
|
+
<b><<em>button</em></b><b>></b>Hello World<b></<em>button</em>></b>
|
13
|
+
</code>
|
14
|
+
</pre>
|
15
|
+
OUTPUT
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_filters_with_underscore_and_dash_case
|
19
|
+
@class.add_filter :test_filter do
|
20
|
+
filter_before do |html|
|
21
|
+
"TEST"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
%w(test_filter test-filter).each do |filter|
|
25
|
+
assert_render_equals <<-INPUT, <<-OUTPUT
|
26
|
+
@#{filter}
|
27
|
+
<button>Hello World</button>
|
28
|
+
INPUT
|
29
|
+
<div class="livingstyleguide--example"> TEST </div>
|
30
|
+
<pre class="livingstyleguide--code-block">
|
31
|
+
<code class="livingstyleguide--code">
|
32
|
+
<b><<em>button</em></b><b>></b>Hello World<b></<em>button</em>></b>
|
33
|
+
</code>
|
34
|
+
</pre>
|
35
|
+
OUTPUT
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_filters
|
40
|
+
@class.add_filter do
|
41
|
+
filter_before do |html|
|
42
|
+
"TEST"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
assert_render_equals <<-INPUT, <<-OUTPUT
|
46
|
+
<button>Hello World</button>
|
47
|
+
INPUT
|
48
|
+
<div class="livingstyleguide--example"> TEST </div>
|
49
|
+
<pre class="livingstyleguide--code-block">
|
50
|
+
<code class="livingstyleguide--code">
|
51
|
+
<b><<em>button</em></b><b>></b>Hello World<b></<em>button</em>></b>
|
52
|
+
</code>
|
53
|
+
</pre>
|
54
|
+
OUTPUT
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_filters_with_argument
|
58
|
+
@class.add_filter :test_filter do |argument|
|
59
|
+
filter_before do |html|
|
60
|
+
argument
|
61
|
+
end
|
62
|
+
end
|
63
|
+
assert_render_equals <<-INPUT, <<-OUTPUT
|
64
|
+
@test_filter Another Test
|
65
|
+
<button>Hello World</button>
|
66
|
+
INPUT
|
67
|
+
<div class="livingstyleguide--example"> Another Test </div>
|
68
|
+
<pre class="livingstyleguide--code-block">
|
69
|
+
<code class="livingstyleguide--code">
|
70
|
+
<b><<em>button</em></b><b>></b>Hello World<b></<em>button</em>></b>
|
71
|
+
</code>
|
72
|
+
</pre>
|
73
|
+
OUTPUT
|
74
|
+
end
|
75
|
+
|
76
|
+
def test_default_filters
|
77
|
+
@class.add_filter :test_filter do
|
78
|
+
filter_before do |html|
|
79
|
+
"TEST"
|
80
|
+
end
|
81
|
+
end
|
82
|
+
assert_render_equals <<-INPUT, <<-OUTPUT, { default_filters: ['@test-filter'] }
|
83
|
+
<button>Hello World</button>
|
84
|
+
INPUT
|
85
|
+
<div class="livingstyleguide--example"> TEST </div>
|
86
|
+
<pre class="livingstyleguide--code-block">
|
87
|
+
<code class="livingstyleguide--code">
|
88
|
+
<b><<em>button</em></b><b>></b>Hello World<b></<em>button</em>></b>
|
89
|
+
</code>
|
90
|
+
</pre>
|
91
|
+
OUTPUT
|
92
|
+
end
|
93
|
+
|
94
|
+
def test_outer_html
|
95
|
+
@class.html do |c|
|
96
|
+
"<span>#{c}</span>"
|
97
|
+
end
|
98
|
+
assert_render_equals <<-INPUT, <<-OUTPUT
|
99
|
+
<button>Hello World</button>
|
100
|
+
INPUT
|
101
|
+
<span> <button>Hello World</button> </span>
|
102
|
+
<pre class="livingstyleguide--code-block">
|
103
|
+
<code class="livingstyleguide--code">
|
104
|
+
<b><<em>button</em></b><b>></b>Hello World<b></<em>button</em>></b>
|
105
|
+
</code>
|
106
|
+
</pre>
|
107
|
+
OUTPUT
|
108
|
+
end
|
109
|
+
|
110
|
+
def test_hide_code_block
|
111
|
+
@class.add_filter :suppress_code_block do
|
112
|
+
suppress_code_block
|
113
|
+
end
|
114
|
+
assert_render_equals <<-INPUT, <<-OUTPUT
|
115
|
+
@suppress-code-block
|
116
|
+
<button>Hello World</button>
|
117
|
+
INPUT
|
118
|
+
<div class="livingstyleguide--example"> <button>Hello World</button> </div>
|
119
|
+
OUTPUT
|
120
|
+
end
|
121
|
+
|
122
|
+
def test_pre_processor
|
123
|
+
@class.add_filter :pre_processor_one do
|
124
|
+
pre_processor { |source| 'fail' }
|
125
|
+
end
|
126
|
+
@class.add_filter :pre_processor_two do
|
127
|
+
pre_processor { |source| source.gsub(/World/, 'Moon') }
|
128
|
+
end
|
129
|
+
assert_render_equals <<-INPUT, <<-OUTPUT
|
130
|
+
@pre-processor-one
|
131
|
+
@pre-processor-two
|
132
|
+
Hello World
|
133
|
+
INPUT
|
134
|
+
<div class="livingstyleguide--example"> Hello Moon </div>
|
135
|
+
<pre class="livingstyleguide--code-block">
|
136
|
+
<code class="livingstyleguide--code">Hello World</code>
|
137
|
+
</pre>
|
138
|
+
OUTPUT
|
139
|
+
end
|
140
|
+
|
141
|
+
end
|
142
|
+
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
describe LivingStyleGuide::FilterHooks do
|
4
|
+
|
5
|
+
before do
|
6
|
+
@class = Class.new
|
7
|
+
@class.class_eval do
|
8
|
+
include Hooks
|
9
|
+
include Hooks::InstanceHooks
|
10
|
+
include LivingStyleGuide::FilterHooks
|
11
|
+
define_hook :filter
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "running filters after each other" do
|
16
|
+
it "should filter one filter" do
|
17
|
+
@class.filter { |text| text * 2 }
|
18
|
+
@class.run_filter_hook(:filter, "hello world").must_equal "hello worldhello world"
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should filter several filter in a row" do
|
22
|
+
@class.filter { |text| text * 2 }
|
23
|
+
@class.filter { |text| text.gsub(/worldhello/, 'beautiful') }
|
24
|
+
@class.run_filter_hook(:filter, "hello world").must_equal "hello beautiful world"
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should work on instances" do
|
28
|
+
@class.filter { |text| text * 2 }
|
29
|
+
@class.new.run_filter_hook(:filter, "hello world").must_equal "hello worldhello world"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe "run only the latest added filter" do
|
34
|
+
it "should should run only one filter" do
|
35
|
+
@class.filter { |text| text.gsub(/animal/, 'fish') }
|
36
|
+
@class.filter { |text| text.gsub(/animal/, 'bird') }
|
37
|
+
@class.run_last_filter_hook(:filter, "the animal").must_equal "the bird"
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should return the original string if no hooks are defined" do
|
41
|
+
@class.run_last_filter_hook(:filter, "the animal").must_equal "the animal"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'example_test_helper'
|
2
|
+
|
3
|
+
class AddWrapperClassTest < ExampleTestCase
|
4
|
+
|
5
|
+
def test_add_wrapper_class
|
6
|
+
assert_render_match <<-INPUT, <<-OUTPUT
|
7
|
+
@add-wrapper-class my-class
|
8
|
+
<section>Something wide</section>
|
9
|
+
INPUT
|
10
|
+
<div class="livingstyleguide--example my-class">
|
11
|
+
OUTPUT
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'example_test_helper'
|
2
|
+
|
3
|
+
class CoffeeScriptTest < ExampleTestCase
|
4
|
+
|
5
|
+
def test_coffee_script
|
6
|
+
assert_render_equals <<-INPUT, <<-OUTPUT
|
7
|
+
@coffee-script
|
8
|
+
alert "Hello world!"
|
9
|
+
INPUT
|
10
|
+
<div class="livingstyleguide--example -lsg-for-javascript"> <script>(function() { alert("Hello world!"); }).call(this); </script> </div>
|
11
|
+
<pre class="livingstyleguide--code-block">
|
12
|
+
<code class="livingstyleguide--code">alert "Hello world!"</code>
|
13
|
+
</pre>
|
14
|
+
OUTPUT
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
|