livingstyleguide 0.6.0.alpha.2 → 1.0.0.alpha.3
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.
- 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
|
+
|