dress_code 1.0.0

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.
data/LICENSE ADDED
@@ -0,0 +1,19 @@
1
+ Copyright (c) 2013 Instructure, Inc.
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
4
+ this software and associated documentation files (the "Software"), to deal in
5
+ the Software without restriction, including without limitation the rights to use,
6
+ copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
7
+ Software, and to permit persons to whom the Software is furnished to do so,
8
+ subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in all
11
+ copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
17
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
18
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
19
+
@@ -0,0 +1,89 @@
1
+ Dress Code
2
+ ==========
3
+
4
+ You haven't shown up to the office in your underwear, neither should your UI.
5
+
6
+ ## About
7
+
8
+ Dress Code extracts certain comment blocks from your stylesheets and creates a styleguide with them.
9
+
10
+ Its really flexible, you can:
11
+
12
+ - Include your own CSS
13
+ - Include your own JS
14
+ - Render the styleguide with your own template
15
+
16
+ ## Installation
17
+
18
+ `gem install dress_code`
19
+
20
+ Dress code requires the python library "pygments" for syntax highlighting.
21
+
22
+ `sudo easy_install pygments`
23
+
24
+ ## Usage
25
+
26
+ Dress Code is generally used as a command line tool that takes a yaml config file. It will search your files and extract documentation that matches a regular expresssion.
27
+
28
+ Usage:
29
+
30
+ dress_code [config_path]
31
+
32
+ Example:
33
+
34
+ dress_code config/styleguide.yml
35
+
36
+ Example config yaml file:
37
+
38
+ ```yaml
39
+ # required - the file to generate
40
+ out_file: styleguide/index.html
41
+
42
+ # required - the files to extract docs from
43
+ glob: stylesheets/**/*.css
44
+
45
+ # optional - components can display where they are defined, this will be
46
+ # stripped from that definition
47
+ base_dir: stylesheets
48
+
49
+ # optional - mustache template rendered for the `out_file`
50
+ template: styleguide/index.mustache
51
+
52
+ # optional - CSS files to load in the template
53
+ css:
54
+ - public/stylesheets/framework.css
55
+ - public/stylesheets/app.css
56
+
57
+ # optional - Inline DressCode CSS styles, defaults to true
58
+ dress_code_css: false
59
+
60
+ # optional - JavaScript files to load in the template
61
+ js:
62
+ - public/js/behaviors.js
63
+
64
+ # optional - Inline DressCode JS, defaults to true
65
+ dress_code_js: false
66
+ ```
67
+
68
+ ## Documentation Syntax
69
+
70
+ Comments like the following will be extracted from your stylesheets:
71
+
72
+ /*
73
+ @styleguide Buttons
74
+
75
+ Buttons are amazing.
76
+
77
+ ```html
78
+ <button class="btn">Button</button>
79
+ ```
80
+ */
81
+
82
+ The content of your comment block is parsed as yaml. HTML code fences will be syntax highlighted and rendered in your styleguide.
83
+
84
+ Feel free to extend `DressCode::Extractor` to match your own style of comments.
85
+
86
+ ## API
87
+
88
+ You can require any of the classes in lib to extend Dress Code for your particular needs. Check out `bin/dress_code` to see how to use them.
89
+
@@ -0,0 +1,95 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'colored'
4
+ require 'yaml'
5
+ require_relative '../lib/dress_code'
6
+
7
+ help = "
8
+
9
+ Usage:
10
+
11
+ dress_code [config_path]
12
+
13
+ Example:
14
+
15
+ dress_code config/styleguide.yml
16
+
17
+ "
18
+
19
+ config_help = "
20
+ Example config yaml file:
21
+
22
+ #{'# required - the file to generate'.yellow}
23
+ out_file: styleguide/index.html
24
+
25
+ #{'# required - the files to extract docs from'.yellow}
26
+ glob: stylesheets/**/*.css
27
+
28
+ #{'# optional - components can display where they are defined, this will be'.yellow}
29
+ #{'# stripped from that definition'.yellow}
30
+ base_dir: stylesheets
31
+
32
+ #{'# optional - mustache template rendered for the `out_file`'.yellow}
33
+ template: styleguide/index.mustache
34
+
35
+ #{'# optional - CSS files to load in the template'.yellow}
36
+ css:
37
+ - public/stylesheets/framework.css
38
+ - public/stylesheets/app.css
39
+
40
+
41
+ #{'# optional - Inline DressCode CSS styles, defaults to true'.yellow}
42
+ dress_code_css: false
43
+
44
+ #{'# optional - JavaScript files to load in the template'.yellow}
45
+ js:
46
+ - public/js/behaviors.js
47
+
48
+ #{'# optional - Inline DressCode JS, defaults to true'.yellow}
49
+ dress_code_js: false
50
+
51
+ "
52
+
53
+ config_path = ARGV[0]
54
+
55
+ if ['--help', '-h'].include?(ARGV[0])
56
+ puts help + config_help
57
+ exit
58
+ end
59
+
60
+ if !config_path
61
+ puts help
62
+ exit
63
+ end
64
+
65
+ begin
66
+ config = YAML::load_file(config_path)
67
+ rescue
68
+ puts help + "Error: Could not find config file at '#{config_path}'.".red
69
+ exit
70
+ end
71
+
72
+ if !config['out_file']
73
+ puts config_help + "Error: I need an `out_file` in your config, view the sample above.".red
74
+ exit
75
+ end
76
+
77
+ if !config['glob']
78
+ puts config_help + "Error: I need a `glob` in your config, view the sample above.".red
79
+ exit
80
+ end
81
+
82
+ extractor = DressCode::Extractor.new({
83
+ :files => Dir.glob(config['glob']),
84
+ :base_dir => config['base_dir']
85
+ })
86
+ generator = DressCode::Generator.new({
87
+ :out_file => config['out_file'],
88
+ :docs => extractor.docs,
89
+ :css => config['css'],
90
+ :js => config['js'],
91
+ :dress_code_css => config['dress_code_css'],
92
+ :dress_code_js => config['dress_code_js']
93
+ })
94
+ generator.generate()
95
+
@@ -0,0 +1,3 @@
1
+ module DressCode; end
2
+ Dir[File.dirname(__FILE__) + '/dress_code/**/*.rb'].each {|file| require file }
3
+
@@ -0,0 +1,27 @@
1
+ require_relative '../dress_code'
2
+ require_relative 'renderer'
3
+
4
+ class DressCode::Document
5
+
6
+ MD = Redcarpet::Markdown.new(DressCode::Renderer.new, {
7
+ fenced_code_blocks: true,
8
+ strikethrough: true,
9
+ superscript: true
10
+ })
11
+
12
+ attr_accessor :path, :relative_path, :prose, :component
13
+
14
+ def initialize(attributes)
15
+ @attributes = attributes
16
+ @path = @attributes[:path]
17
+ @relative_path = @attributes[:relative_path]
18
+ @prose = @attributes[:prose]
19
+ @component = @attributes[:component]
20
+ end
21
+
22
+ def to_html
23
+ MD.render(@prose)
24
+ end
25
+
26
+ end
27
+
@@ -0,0 +1,46 @@
1
+ require_relative '../dress_code'
2
+ require_relative 'document'
3
+ require 'debugger'
4
+
5
+ class DressCode::Extractor
6
+
7
+ attr_accessor :files
8
+
9
+ def initialize(opts)
10
+ @files = opts[:files]
11
+ @base_dir = opts[:base_dir]
12
+ @matcher = %r{/*\s+@styleguide\s+([^\n]+)(.+?)\*/}m
13
+ end
14
+
15
+ def extract
16
+ parse_files.sort_by { |doc| doc.component }
17
+ end
18
+ alias_method :docs, :extract
19
+
20
+ def parse_files
21
+ @files.flat_map { |path| parse_file(path) }.compact
22
+ end
23
+
24
+ def parse_file(path)
25
+ src = File.read(path)
26
+ matches = scan(src)
27
+ return unless matches.length
28
+ matches.map { |match| create_doc(match, path) }
29
+ end
30
+
31
+ def scan(src)
32
+ src.scan(@matcher)
33
+ end
34
+
35
+ # must return an instance of Doc
36
+ def create_doc(match, path)
37
+ DressCode::Document.new({
38
+ :component => match[0],
39
+ :prose => match[1].strip,
40
+ :path => path,
41
+ :relative_path => path.gsub(@base_dir, '').gsub(/^\//, '')
42
+ })
43
+ end
44
+
45
+ end
46
+
@@ -0,0 +1,61 @@
1
+ require 'mustache'
2
+ require_relative '../dress_code'
3
+ require 'debugger'
4
+
5
+ class DressCode::Generator
6
+
7
+ STATIC = "#{File.dirname(__FILE__)}/../static"
8
+ TEMPLATE = File.read("#{STATIC}/styleguide.html.mustache")
9
+
10
+ def initialize(opts)
11
+ @out_file = opts[:out_file] || 'styleguide.html'
12
+ @docs = opts[:docs]
13
+ @css = opts[:css]
14
+ @js = opts[:js]
15
+ @template = opts[:template] || TEMPLATE
16
+ @inline_css = opts[:dress_code_css].nil? ? true : !!opts[:dress_code_css]
17
+ @inline_js = opts[:dress_code_js].nil? ? true : !!opts[:dress_code_js]
18
+ end
19
+
20
+ def generate
21
+ write_file(@out_file, Mustache.render(@template, {
22
+ :docs => map_docs,
23
+ :css => @css,
24
+ :js => @js,
25
+ :dress_code_css => dress_code_css,
26
+ :dress_code_js => dress_code_js
27
+ }))
28
+ end
29
+
30
+ def dress_code_css
31
+ return unless @inline_css
32
+ File.read("#{STATIC}/base.css") + File.read("#{STATIC}/github.css")
33
+ end
34
+
35
+ def dress_code_js
36
+ return unless @inline_js
37
+ File.read("#{STATIC}/docs.js")
38
+ end
39
+
40
+ def map_docs
41
+ @docs.map { |doc| map_doc(doc) }
42
+ end
43
+
44
+ def map_doc(doc)
45
+ {
46
+ :id => "#{doc.component.gsub(' ', '_').downcase}",
47
+ :prose => doc.to_html,
48
+ :component => doc.component,
49
+ :file => doc.relative_path
50
+ }
51
+ end
52
+
53
+ def write_file(path, content)
54
+ File.open(path, 'w') do |file|
55
+ puts "# writing file: #{path}"
56
+ file.write(content)
57
+ end
58
+ end
59
+
60
+ end
61
+
@@ -0,0 +1,21 @@
1
+ require 'redcarpet'
2
+ require 'pygments'
3
+ require_relative '../dress_code'
4
+
5
+ class DressCode::Renderer < Redcarpet::Render::HTML
6
+
7
+ def block_code(code, language)
8
+ syntax = Pygments.highlight(code, {
9
+ lexer: language,
10
+ options: { encoding: 'utf-8' }
11
+ })
12
+ inner = if language == 'html'
13
+ "#{syntax} <div class='code-rendered'>#{code}</div>"
14
+ else
15
+ syntax
16
+ end
17
+ "<div class='code-demo'>#{inner}</div>"
18
+ end
19
+
20
+ end
21
+
@@ -0,0 +1,70 @@
1
+ #nav {
2
+ position: absolute;
3
+ top: 0;
4
+ left: 0;
5
+ width: 200px;
6
+ bottom: 0;
7
+ overflow: auto;
8
+ -webkit-overflow-scrolling: touch;
9
+ }
10
+
11
+ #nav > *:fist-child {
12
+ height: 100.5%
13
+ }
14
+
15
+ #nav ul {
16
+ padding: 0;
17
+ margin: 0;
18
+ list-style: none;
19
+ }
20
+
21
+ #nav a {
22
+ display: block;
23
+ border-bottom: solid 1px #ccc;
24
+ padding: 8px 4px;
25
+ text-decoration: none;
26
+ background: #fff;
27
+ color: #454545;
28
+ }
29
+
30
+ #nav a:hover {
31
+ background: #f5f5f5;
32
+ }
33
+
34
+ #nav a.active {
35
+ background: #0088cc;
36
+ color: #fff;
37
+ }
38
+
39
+
40
+ #docs {
41
+ border-left: solid 1px;
42
+ position: absolute;
43
+ top: 0;
44
+ left: 200px;
45
+ right: 0;
46
+ bottom: 0;
47
+ overflow: auto;
48
+ -webkit-overflow-scrolling: touch;
49
+ background: #ccc;
50
+ }
51
+
52
+ #docs > article {
53
+ margin: 40px 20px;
54
+ padding: 20px;
55
+ min-height: 60%;
56
+ box-shadow: 2px 6px 16px rgba(0, 0, 0, 0.5);
57
+ background: #fff;
58
+ max-width: 700px;
59
+ }
60
+
61
+ #docs > article:first-child {
62
+ border:none;
63
+ }
64
+
65
+ .code-demo:hover {
66
+ margin-left: -12px;
67
+ border-left: solid 4px #0088cc;
68
+ padding-left: 8px;
69
+ }
70
+
@@ -0,0 +1,76 @@
1
+ ;(function() {
2
+ var items = document.querySelectorAll('#nav a');
3
+ var docs = document.getElementById('docs');
4
+ var articles = [].slice.call(docs.querySelectorAll('article'), 0);
5
+ var tops;
6
+
7
+ var setTops = function() {
8
+ tops = articles.map(function(header) {
9
+ return header.offsetTop;
10
+ });
11
+ setTimeout(setTops, 1000);
12
+ };
13
+
14
+ var setAnchor = function() {
15
+ var top = docs.scrollTop + (docs.offsetHeight / 2);
16
+ var inView;
17
+ for (var i = 0; i < tops.length; i += 1) {
18
+ if (tops[i] >= top) break;
19
+ }
20
+ setCurrent(i - 1);
21
+ };
22
+
23
+ var setCurrent = (function() {
24
+ var current;
25
+ return function(index) {
26
+ var item = items[index];
27
+ if (current) current.setAttribute('class', '');
28
+ item.setAttribute('class', 'active');
29
+ current = item;
30
+ var article = articles[index];
31
+ var id = article.getAttribute('id');
32
+ article.setAttribute('id', '');
33
+ location.hash = item.hash
34
+ article.setAttribute('id', id);
35
+ }
36
+ })();
37
+
38
+ var throttle = function(func, wait) {
39
+ var context, args, timeout, throttling, more;
40
+ var whenDone = debounce(function(){ more = throttling = false; }, wait);
41
+ return function() {
42
+ context = this; args = arguments;
43
+ var later = function() {
44
+ timeout = null;
45
+ if (more) func.apply(context, args);
46
+ whenDone();
47
+ };
48
+ if (!timeout) timeout = setTimeout(later, wait);
49
+ if (throttling) {
50
+ more = true;
51
+ } else {
52
+ func.apply(context, args);
53
+ }
54
+ whenDone();
55
+ throttling = true;
56
+ };
57
+ };
58
+
59
+ var debounce = function(func, wait) {
60
+ var timeout;
61
+ return function() {
62
+ var context = this, args = arguments;
63
+ var later = function() {
64
+ timeout = null;
65
+ func.apply(context, args);
66
+ };
67
+ clearTimeout(timeout);
68
+ timeout = setTimeout(later, wait);
69
+ };
70
+ };
71
+
72
+ setTops();
73
+ docs.addEventListener('scroll', throttle(setAnchor, 100));
74
+
75
+ })();
76
+
@@ -0,0 +1,61 @@
1
+ .hll { background-color: #ffffcc }
2
+ .c { color: #999988; font-style: italic } /* Comment */
3
+ .err { color: #a61717; background-color: #e3d2d2 } /* Error */
4
+ .k { color: #000000; font-weight: bold } /* Keyword */
5
+ .o { color: #000000; font-weight: bold } /* Operator */
6
+ .cm { color: #999988; font-style: italic } /* Comment.Multiline */
7
+ .cp { color: #999999; font-weight: bold; font-style: italic } /* Comment.Preproc */
8
+ .c1 { color: #999988; font-style: italic } /* Comment.Single */
9
+ .cs { color: #999999; font-weight: bold; font-style: italic } /* Comment.Special */
10
+ .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
11
+ .ge { color: #000000; font-style: italic } /* Generic.Emph */
12
+ .gr { color: #aa0000 } /* Generic.Error */
13
+ .gh { color: #999999 } /* Generic.Heading */
14
+ .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
15
+ .go { color: #888888 } /* Generic.Output */
16
+ .gp { color: #555555 } /* Generic.Prompt */
17
+ .gs { font-weight: bold } /* Generic.Strong */
18
+ .gu { color: #aaaaaa } /* Generic.Subheading */
19
+ .gt { color: #aa0000 } /* Generic.Traceback */
20
+ .kc { color: #000000; font-weight: bold } /* Keyword.Constant */
21
+ .kd { color: #000000; font-weight: bold } /* Keyword.Declaration */
22
+ .kn { color: #000000; font-weight: bold } /* Keyword.Namespace */
23
+ .kp { color: #000000; font-weight: bold } /* Keyword.Pseudo */
24
+ .kr { color: #000000; font-weight: bold } /* Keyword.Reserved */
25
+ .kt { color: #445588; font-weight: bold } /* Keyword.Type */
26
+ .m { color: #009999 } /* Literal.Number */
27
+ .s { color: #d01040 } /* Literal.String */
28
+ .na { color: #008080 } /* Name.Attribute */
29
+ .nb { color: #0086B3 } /* Name.Builtin */
30
+ .nc { color: #445588; font-weight: bold } /* Name.Class */
31
+ .no { color: #008080 } /* Name.Constant */
32
+ .nd { color: #3c5d5d; font-weight: bold } /* Name.Decorator */
33
+ .ni { color: #800080 } /* Name.Entity */
34
+ .ne { color: #990000; font-weight: bold } /* Name.Exception */
35
+ .nf { color: #990000; font-weight: bold } /* Name.Function */
36
+ .nl { color: #990000; font-weight: bold } /* Name.Label */
37
+ .nn { color: #555555 } /* Name.Namespace */
38
+ .nt { color: #000080 } /* Name.Tag */
39
+ .nv { color: #008080 } /* Name.Variable */
40
+ .ow { color: #000000; font-weight: bold } /* Operator.Word */
41
+ .w { color: #bbbbbb } /* Text.Whitespace */
42
+ .mf { color: #009999 } /* Literal.Number.Float */
43
+ .mh { color: #009999 } /* Literal.Number.Hex */
44
+ .mi { color: #009999 } /* Literal.Number.Integer */
45
+ .mo { color: #009999 } /* Literal.Number.Oct */
46
+ .sb { color: #d01040 } /* Literal.String.Backtick */
47
+ .sc { color: #d01040 } /* Literal.String.Char */
48
+ .sd { color: #d01040 } /* Literal.String.Doc */
49
+ .s2 { color: #d01040 } /* Literal.String.Double */
50
+ .se { color: #d01040 } /* Literal.String.Escape */
51
+ .sh { color: #d01040 } /* Literal.String.Heredoc */
52
+ .si { color: #d01040 } /* Literal.String.Interpol */
53
+ .sx { color: #d01040 } /* Literal.String.Other */
54
+ .sr { color: #009926 } /* Literal.String.Regex */
55
+ .s1 { color: #d01040 } /* Literal.String.Single */
56
+ .ss { color: #990073 } /* Literal.String.Symbol */
57
+ .bp { color: #999999 } /* Name.Builtin.Pseudo */
58
+ .vc { color: #008080 } /* Name.Variable.Class */
59
+ .vg { color: #008080 } /* Name.Variable.Global */
60
+ .vi { color: #008080 } /* Name.Variable.Instance */
61
+ .il { color: #009999 } /* Literal.Number.Integer.Long */
@@ -0,0 +1,36 @@
1
+ <!doctype html>
2
+
3
+ <html lang="en">
4
+ <head>
5
+ <meta http-equiv="Content-type" content="text/html; charset=utf-8">
6
+ <title>Styleguide</title>
7
+ <style>{{{dress_code_css}}}</style>
8
+ {{#css}}
9
+ <link href="{{.}}" rel="stylesheet" charset="utf-8">
10
+ {{/css}}
11
+ </head>
12
+ <body>
13
+
14
+ <nav id="nav">
15
+ <ul>
16
+ {{#docs}}
17
+ <li><a href="#{{id}}">{{component}}</a></li>
18
+ {{/docs}}
19
+ </ul>
20
+ </nav>
21
+
22
+ <section id="docs">
23
+ {{#docs}}
24
+ <article id="{{id}}">
25
+ <h2>{{component}}</h2>
26
+ <p><small>Defined in <em>{{file}}</em></small></p>
27
+ {{{prose}}}
28
+ </article>
29
+ {{/docs}}
30
+ </section>
31
+
32
+ {{#js}}
33
+ <script src="{{.}}"></script>
34
+ {{/js}}
35
+ <script>{{{dress_code_js}}}</script>
36
+
metadata ADDED
@@ -0,0 +1,140 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dress_code
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Ryan Florence
9
+ - Cameron Matheson
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2013-03-18 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: redcarpet
17
+ requirement: !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: '0'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ! '>='
29
+ - !ruby/object:Gem::Version
30
+ version: '0'
31
+ - !ruby/object:Gem::Dependency
32
+ name: pygments.rb
33
+ requirement: !ruby/object:Gem::Requirement
34
+ none: false
35
+ requirements:
36
+ - - ! '>='
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ type: :runtime
40
+ prerelease: false
41
+ version_requirements: !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ! '>='
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ - !ruby/object:Gem::Dependency
48
+ name: mustache
49
+ requirement: !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :runtime
56
+ prerelease: false
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ! '>='
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ - !ruby/object:Gem::Dependency
64
+ name: colored
65
+ requirement: !ruby/object:Gem::Requirement
66
+ none: false
67
+ requirements:
68
+ - - ! '>='
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
71
+ type: :runtime
72
+ prerelease: false
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ! '>='
77
+ - !ruby/object:Gem::Version
78
+ version: '0'
79
+ - !ruby/object:Gem::Dependency
80
+ name: rspec
81
+ requirement: !ruby/object:Gem::Requirement
82
+ none: false
83
+ requirements:
84
+ - - ! '>='
85
+ - !ruby/object:Gem::Version
86
+ version: '0'
87
+ type: :development
88
+ prerelease: false
89
+ version_requirements: !ruby/object:Gem::Requirement
90
+ none: false
91
+ requirements:
92
+ - - ! '>='
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
95
+ description: Dress Code extracts comment blocks from your stylesheets and creates
96
+ a styleguide using your CSS.
97
+ email:
98
+ executables:
99
+ - dress_code
100
+ extensions: []
101
+ extra_rdoc_files: []
102
+ files:
103
+ - bin/dress_code
104
+ - lib/dress_code/document.rb
105
+ - lib/dress_code/extractor.rb
106
+ - lib/dress_code/generator.rb
107
+ - lib/dress_code/renderer.rb
108
+ - lib/dress_code.rb
109
+ - lib/static/base.css
110
+ - lib/static/docs.js
111
+ - lib/static/github.css
112
+ - lib/static/styleguide.html.mustache
113
+ - LICENSE
114
+ - README.md
115
+ homepage: http://github.com/instructure/dress_code
116
+ licenses: []
117
+ post_install_message:
118
+ rdoc_options: []
119
+ require_paths:
120
+ - lib
121
+ required_ruby_version: !ruby/object:Gem::Requirement
122
+ none: false
123
+ requirements:
124
+ - - ! '>='
125
+ - !ruby/object:Gem::Version
126
+ version: '0'
127
+ required_rubygems_version: !ruby/object:Gem::Requirement
128
+ none: false
129
+ requirements:
130
+ - - ! '>='
131
+ - !ruby/object:Gem::Version
132
+ version: '0'
133
+ requirements: []
134
+ rubyforge_project:
135
+ rubygems_version: 1.8.23
136
+ signing_key:
137
+ specification_version: 3
138
+ summary: CSS Documentation and Styleguide Generator
139
+ test_files: []
140
+ has_rdoc: