dress_code 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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: