ascii_binder 0.1.9 → 0.1.10

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 (51) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +16 -0
  3. data/ascii_binder.gemspec +5 -3
  4. data/bin/asciibinder +53 -44
  5. data/features/command_help.feature +8 -0
  6. data/features/command_version.feature +8 -0
  7. data/features/repo_build.feature +34 -0
  8. data/features/repo_clean.feature +20 -0
  9. data/features/repo_clone.feature +22 -0
  10. data/features/repo_create.feature +13 -0
  11. data/features/repo_package.feature +15 -0
  12. data/features/step_definitions/steps.rb +182 -0
  13. data/features/support/_clone_distro_map.yml +14 -0
  14. data/features/support/_invalid_distro_map.yml +14 -0
  15. data/features/support/env.rb +468 -0
  16. data/features/support/test_distro/.gitignore +9 -0
  17. data/features/support/test_distro/_distro_map.yml +29 -0
  18. data/features/support/test_distro/_images/asciibinder-logo-horizontal.png +0 -0
  19. data/features/support/test_distro/_images/asciibinder_web_logo.svg +125 -0
  20. data/features/support/test_distro/_images/book_pages_bg.jpg +0 -0
  21. data/features/support/test_distro/_images/favicon.ico +0 -0
  22. data/features/support/test_distro/_images/favicon32x32.png +0 -0
  23. data/features/support/test_distro/_javascripts/.gitkeep +0 -0
  24. data/features/support/test_distro/_stylesheets/asciibinder.css +568 -0
  25. data/features/support/test_distro/_templates/_css.html.erb +3 -0
  26. data/features/support/test_distro/_templates/_nav.html.erb +31 -0
  27. data/features/support/test_distro/_templates/page.html.erb +92 -0
  28. data/features/support/test_distro/_topic_map.yml +36 -0
  29. data/features/support/test_distro/index-main.html +10 -0
  30. data/features/support/test_distro/index-test.html +10 -0
  31. data/features/support/test_distro/main_only_topic_group/index.adoc +17 -0
  32. data/features/support/test_distro/test_only_topic_group/index.adoc +17 -0
  33. data/features/support/test_distro/welcome/index.adoc +17 -0
  34. data/features/support/test_distro/welcome/subtopics/index.adoc +17 -0
  35. data/features/support/test_distro/welcome/subtopics/main_only_topic.adoc +17 -0
  36. data/features/support/test_distro/welcome/subtopics/test_only_topic.adoc +17 -0
  37. data/features/support/test_distro/welcome/subtopics/wildcard_all.adoc +17 -0
  38. data/lib/ascii_binder.rb +4 -2
  39. data/lib/ascii_binder/distro.rb +111 -0
  40. data/lib/ascii_binder/distro_branch.rb +93 -0
  41. data/lib/ascii_binder/distro_map.rb +67 -0
  42. data/lib/ascii_binder/engine.rb +581 -0
  43. data/lib/ascii_binder/helpers.rb +42 -856
  44. data/lib/ascii_binder/site.rb +52 -0
  45. data/lib/ascii_binder/site_info.rb +22 -0
  46. data/lib/ascii_binder/site_map.rb +24 -0
  47. data/lib/ascii_binder/topic_entity.rb +255 -0
  48. data/lib/ascii_binder/topic_map.rb +61 -0
  49. data/lib/ascii_binder/version.rb +1 -1
  50. data/templates/_templates/page.html.erb +1 -1
  51. metadata +118 -14
@@ -0,0 +1,3 @@
1
+ <%- Dir.glob("_stylesheets/*").sort.each do |sheet| -%>
2
+ <link href="<%= File.join(css_path, File.basename(sheet)) %>" rel="stylesheet" />
3
+ <%- end -%>
@@ -0,0 +1,31 @@
1
+ <ul class="nav nav-sidebar">
2
+ <%- navigation.each.with_index do |topic_group, groupidx| -%>
3
+ <%- current_group = topic_group[:id] == group_id -%>
4
+ <li class="nav-header">
5
+ <a class="" href="#" data-toggle="collapse" data-target="#topicGroup<%= groupidx %>">
6
+ <span id="tgSpan<%= groupidx %>" class="fa <%= current_group ? 'fa-angle-down' : 'fa-angle-right' %>"></span><%= topic_group[:name] %>
7
+ </a>
8
+ <ul id="topicGroup<%= groupidx %>" class="collapse <%= current_group ? 'in' : '' %> list-unstyled">
9
+ <%- topic_group[:topics].each.with_index do |topic, topicidx| -%>
10
+ <%- if not topic.has_key?(:topics) -%>
11
+ <%- current_topic = current_group && (topic[:id] == topic_id) -%>
12
+ <li><a class="<%= current_topic ? ' active' : '' %>" href="<%= subtopic_shim %><%= topic[:path] %>"><%= topic[:name] %></a></li>
13
+ <%- else -%>
14
+ <%- current_subgroup = topic[:id] == subgroup_id -%>
15
+ <li class="nav-header">
16
+ <a class="" href="#" data-toggle="collapse" data-target="#topicSubGroup-<%= groupidx %>-<%= topicidx %>">
17
+ <span id="sgSpan-<%= groupidx %>-<%= topicidx %>" class="fa <%= current_subgroup ? 'fa-caret-down' : 'fa-caret-right' %>"></span>&nbsp;<%= topic[:name] %>
18
+ </a>
19
+ <ul id="topicSubGroup-<%= groupidx %>-<%= topicidx %>" class="nav-tertiary list-unstyled collapse<%= current_subgroup ? ' in' : '' %>">
20
+ <%- topic[:topics].each do |subtopic| -%>
21
+ <%- current_subtopic = current_group && current_subgroup && (subtopic[:id] == topic_id) %>
22
+ <li><a class="<%= current_subtopic ? ' active' : '' %>" href="<%= subtopic_shim %><%= subtopic[:path] %>"><%= subtopic[:name] %></a></li>
23
+ <%- end -%>
24
+ </ul>
25
+ </li>
26
+ <%- end -%>
27
+ <%- end -%>
28
+ </ul>
29
+ </li>
30
+ <%- end -%>
31
+ </ul>
@@ -0,0 +1,92 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta content="IE=edge" http-equiv="X-UA-Compatible">
6
+ <meta content="width=device-width, initial-scale=1.0" name="viewport">
7
+ <title><%= distro %> <%= version %> | <%= [group_title, subgroup_title, topic_title].compact.join(' | ') %></title>
8
+
9
+ <!-- Bootstrap -->
10
+ <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
11
+ <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap-theme.min.css">
12
+
13
+ <%= render("_templates/_css.html.erb", :css_path => css_path) %>
14
+
15
+ <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
16
+ <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
17
+ <!--[if lt IE 9]>
18
+ <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
19
+ <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
20
+ <![endif]-->
21
+
22
+ <link href="<%= File.join(images_path, "favicon32x32.png") %>" rel="shortcut icon" type="text/css">
23
+ <!--[if IE]><link rel="shortcut icon" href="<%= File.join(images_path, "favicon.ico") %>"><![endif]-->
24
+ <meta content="AsciiBinder" name="application-name">
25
+ </head>
26
+ <body>
27
+ <div class="navbar navbar-default" role="navigation">
28
+ <div class="container-fluid">
29
+ <div class="navbar-header">
30
+ <a class="navbar-brand" href="http://www.asciibinder.org/"><img alt="AsciiBinder" src="<%= File.join(images_path, "asciibinder-logo-horizontal.png") %>"></a>
31
+ </div>
32
+ </div>
33
+ </div>
34
+ <div class="container">
35
+ <p class="toggle-nav visible-xs pull-left">
36
+ <button class="btn btn-default btn-sm" type="button" data-toggle="offcanvas">Toggle nav</button>
37
+ </p>
38
+ <ol class="breadcrumb">
39
+ <li class="sitename">
40
+ <a href="<%= site_home_path %>"><%= site_name %></a>
41
+ </li>
42
+ <li class="hidden-xs active">
43
+ <%= breadcrumb_root %>
44
+ </li>
45
+ <li class="hidden-xs active">
46
+ <%= breadcrumb_group %>
47
+ </li>
48
+ <%= breadcrumb_subgroup_block %>
49
+ <li class="hidden-xs active">
50
+ <%= breadcrumb_topic %>
51
+ </li>
52
+ </ol>
53
+ <div class="row row-offcanvas row-offcanvas-left">
54
+ <div class="col-xs-8 col-sm-3 col-md-3 sidebar sidebar-offcanvas">
55
+ <%= render("_templates/_nav.html.erb", :navigation => navigation, :group_id => group_id, :topic_id => topic_id, :subgroup_id => subgroup_id, :subtopic_shim => subtopic_shim) %>
56
+ </div>
57
+ <div class="col-xs-12 col-sm-9 col-md-9 main">
58
+ <div class="page-header">
59
+ <h2><%= article_title %></h2>
60
+ </div>
61
+ <%= content %>
62
+ </div>
63
+ </div>
64
+ </div>
65
+ <!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
66
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
67
+ <!-- Latest compiled and minified JavaScript -->
68
+ <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
69
+ <script type="text/javascript">
70
+ /*<![CDATA[*/
71
+ $(document).ready(function() {
72
+ $("[id^='topicGroup']").on('show.bs.collapse', function (event) {
73
+ if (!($(event.target).attr('id').match(/^topicSubGroup/))) {
74
+ $(this).parent().find("[id^='tgSpan']").toggleClass("fa-angle-right fa-angle-down");
75
+ }
76
+ });
77
+ $("[id^='topicGroup']").on('hide.bs.collapse', function (event) {
78
+ if (!($(event.target).attr('id').match(/^topicSubGroup/))) {
79
+ $(this).parent().find("[id^='tgSpan']").toggleClass("fa-angle-right fa-angle-down");
80
+ }
81
+ });
82
+ $("[id^='topicSubGroup']").on('show.bs.collapse', function () {
83
+ $(this).parent().find("[id^='sgSpan']").toggleClass("fa-caret-right fa-caret-down");
84
+ });
85
+ $("[id^='topicSubGroup']").on('hide.bs.collapse', function () {
86
+ $(this).parent().find("[id^='sgSpan']").toggleClass("fa-caret-right fa-caret-down");
87
+ });
88
+ });
89
+ /*]]>*/
90
+ </script>
91
+ </body>
92
+ </html>
@@ -0,0 +1,36 @@
1
+ ---
2
+ Name: AsciiBinder Doc Project
3
+ Dir: welcome
4
+ Topics:
5
+ - Name: Welcome
6
+ File: index
7
+ - Name: Subtopics
8
+ Dir: subtopics
9
+ Topics:
10
+ - Name: All Distros
11
+ File: index
12
+ - Name: MAIN_ONLY_TOPIC
13
+ File: main_only_topic
14
+ Distros: distro_main
15
+ - Name: TEST_ONLY_TOPIC
16
+ File: test_only_topic
17
+ Distros: distro_test
18
+ - Name: Wilcard All
19
+ File: wildcard_all
20
+ Distros: distro_*
21
+
22
+ ---
23
+ Name: MAIN_ONLY_TOPIC_GROUP
24
+ Dir: main_only_topic_group
25
+ Distros: distro_main
26
+ Topics:
27
+ - Name: MAIN_ONLY_WELCOME
28
+ File: index
29
+
30
+ ---
31
+ Name: TEST_ONLY_TOPIC_GROUP
32
+ Dir: test_only_topic_group
33
+ Distros: distro_test
34
+ Topics:
35
+ - Name: TEST_ONLY_WELCOME
36
+ File: index
@@ -0,0 +1,10 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>INDEX MAIN</title>
6
+ </head>
7
+ <body>
8
+ INDEX MAIN
9
+ </body>
10
+ </html>
@@ -0,0 +1,10 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>INDEX TEST</title>
6
+ </head>
7
+ <body>
8
+ INDEX TEST
9
+ </body>
10
+ </html>
@@ -0,0 +1,17 @@
1
+ = {product-title} {product-version} Documentation
2
+ {product-author}
3
+ {product-version}
4
+ :data-uri:
5
+ :icons:
6
+
7
+ DIRECTIVE-TAGGED DOC
8
+
9
+ Line 1: This should be visible in all distros
10
+
11
+ ifdef::distro_main[]
12
+ Line 2: This should only be visible in distro_main
13
+ endif::[]
14
+
15
+ ifdef::distro_test[]
16
+ Line 3: This should only be visible in distro_test
17
+ endif::[]
@@ -0,0 +1,17 @@
1
+ = {product-title} {product-version} Documentation
2
+ {product-author}
3
+ {product-version}
4
+ :data-uri:
5
+ :icons:
6
+
7
+ DIRECTIVE-TAGGED DOC
8
+
9
+ Line 1: This should be visible in all distros
10
+
11
+ ifdef::distro_main[]
12
+ Line 2: This should only be visible in distro_main
13
+ endif::[]
14
+
15
+ ifdef::distro_test[]
16
+ Line 3: This should only be visible in distro_test
17
+ endif::[]
@@ -0,0 +1,17 @@
1
+ = {product-title} {product-version} Documentation
2
+ {product-author}
3
+ {product-version}
4
+ :data-uri:
5
+ :icons:
6
+
7
+ DIRECTIVE-TAGGED DOC
8
+
9
+ Line 1: This should be visible in all distros
10
+
11
+ ifdef::distro_main[]
12
+ Line 2: This should only be visible in distro_main
13
+ endif::[]
14
+
15
+ ifdef::distro_test[]
16
+ Line 3: This should only be visible in distro_test
17
+ endif::[]
@@ -0,0 +1,17 @@
1
+ = {product-title} {product-version} Documentation
2
+ {product-author}
3
+ {product-version}
4
+ :data-uri:
5
+ :icons:
6
+
7
+ DIRECTIVE-TAGGED DOC
8
+
9
+ Line 1: This should be visible in all distros
10
+
11
+ ifdef::distro_main[]
12
+ Line 2: This should only be visible in distro_main
13
+ endif::[]
14
+
15
+ ifdef::distro_test[]
16
+ Line 3: This should only be visible in distro_test
17
+ endif::[]
@@ -0,0 +1,17 @@
1
+ = {product-title} {product-version} Documentation
2
+ {product-author}
3
+ {product-version}
4
+ :data-uri:
5
+ :icons:
6
+
7
+ DIRECTIVE-TAGGED DOC
8
+
9
+ Line 1: This should be visible in all distros
10
+
11
+ ifdef::distro_main[]
12
+ Line 2: This should only be visible in distro_main
13
+ endif::[]
14
+
15
+ ifdef::distro_test[]
16
+ Line 3: This should only be visible in distro_test
17
+ endif::[]
@@ -0,0 +1,17 @@
1
+ = {product-title} {product-version} Documentation
2
+ {product-author}
3
+ {product-version}
4
+ :data-uri:
5
+ :icons:
6
+
7
+ DIRECTIVE-TAGGED DOC
8
+
9
+ Line 1: This should be visible in all distros
10
+
11
+ ifdef::distro_main[]
12
+ Line 2: This should only be visible in distro_main
13
+ endif::[]
14
+
15
+ ifdef::distro_test[]
16
+ Line 3: This should only be visible in distro_test
17
+ endif::[]
@@ -0,0 +1,17 @@
1
+ = {product-title} {product-version} Documentation
2
+ {product-author}
3
+ {product-version}
4
+ :data-uri:
5
+ :icons:
6
+
7
+ DIRECTIVE-TAGGED DOC
8
+
9
+ Line 1: This should be visible in all distros
10
+
11
+ ifdef::distro_main[]
12
+ Line 2: This should only be visible in distro_main
13
+ endif::[]
14
+
15
+ ifdef::distro_test[]
16
+ Line 3: This should only be visible in distro_test
17
+ endif::[]
@@ -1,3 +1,5 @@
1
- require "ascii_binder/version"
2
- require "ascii_binder/template_renderer"
1
+ require "ascii_binder/distro_map"
2
+ require "ascii_binder/engine"
3
3
  require "ascii_binder/helpers"
4
+ require "ascii_binder/template_renderer"
5
+ require "ascii_binder/version"
@@ -0,0 +1,111 @@
1
+ require 'ascii_binder/distro_branch'
2
+ require 'ascii_binder/helpers'
3
+ require 'ascii_binder/site'
4
+ require 'trollop'
5
+
6
+ include AsciiBinder::Helpers
7
+
8
+ module AsciiBinder
9
+ class Distro
10
+ attr_reader :id, :name, :author, :site
11
+
12
+ def initialize(distro_map_filepath,distro_key,distro_config)
13
+ @id = distro_key
14
+ @name = distro_config['name']
15
+ @author = distro_config['author']
16
+ @site = AsciiBinder::Site.new(distro_config)
17
+ @branch_map = {}
18
+ distro_config['branches'].each do |branch_name,branch_config|
19
+ if @branch_map.has_key?(branch_name)
20
+ Trollop::die "Error parsing #{distro_map_filepath}: distro '#{distro_key}' lists git branch '#{branch_name}' multiple times."
21
+ end
22
+ @branch_map[branch_name] = AsciiBinder::DistroBranch.new(branch_name,branch_config,self)
23
+ end
24
+ end
25
+
26
+ def is_valid?
27
+ validate
28
+ end
29
+
30
+ def errors
31
+ validate(true)
32
+ end
33
+
34
+ def branch(branch_name)
35
+ unless @branch_map.has_key?(branch_name)
36
+ Trollop::die "Distro '#{@id}' does not include branch '#{branch_name}' in the distro map."
37
+ end
38
+ @branch_map[branch_name]
39
+ end
40
+
41
+ def branch_ids
42
+ @branch_map.keys
43
+ end
44
+
45
+ def branches
46
+ @branch_map.values
47
+ end
48
+
49
+ private
50
+
51
+ def validate(verbose=false)
52
+ errors = []
53
+ unless valid_id?(@id)
54
+ if verbose
55
+ errors << "Distro ID '#{@id}' is not a valid string"
56
+ else
57
+ return false
58
+ end
59
+ end
60
+ unless valid_string?(@name)
61
+ if verbose
62
+ errors << "Distro name '#{@name}' for distro '#{@id}' is not a valid string."
63
+ else
64
+ return false
65
+ end
66
+ end
67
+ unless valid_string?(@author)
68
+ if verbose
69
+ errors << "Distro author '#{@author}' for distro '#{@id}' is not a valid string."
70
+ else
71
+ return false
72
+ end
73
+ end
74
+
75
+ # Remaining checks are sub objects. Handle the verbose case first.
76
+ if verbose
77
+ site_errors = @site.errors
78
+ unless site_errors.empty?
79
+ error_txt = "The site info has errors:\n"
80
+ site_errors.each do |error|
81
+ error_txt << " * #{error}\n"
82
+ end
83
+ errors << error_txt
84
+ end
85
+ all_branch_errors = []
86
+ @branch_map.values.each do |branch|
87
+ branch_errors = branch.errors
88
+ unless branch_errors.empty?
89
+ all_branch_errors << " * In branch #{branch.id}:\n"
90
+ branch_errors.each do |error|
91
+ all_branch_errors << " * #{error}\n"
92
+ end
93
+ end
94
+ end
95
+ unless all_branch_errors.empty?
96
+ all_branch_errors.unshift("The branch info has errors:")
97
+ errors.concat(all_branch_errors)
98
+ end
99
+ return errors
100
+ end
101
+
102
+ # Still here? Run the non-verbose checks instead.
103
+ return false unless @site.is_valid?
104
+ @branch_map.values.each do |branch|
105
+ return false unless branch.is_valid?
106
+ end
107
+
108
+ return true
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,93 @@
1
+ require 'ascii_binder/helpers'
2
+
3
+ include AsciiBinder::Helpers
4
+
5
+ module AsciiBinder
6
+ class DistroBranch
7
+ attr_reader :id, :name, :dir, :distro, :distro_name, :distro_author
8
+
9
+ def initialize(branch_name,branch_config,distro)
10
+ @id = branch_name
11
+ @name = branch_config['name']
12
+ @dir = branch_config['dir']
13
+ @distro = distro
14
+ @distro_name = distro.name
15
+ @distro_author = distro.author
16
+ if branch_config.has_key?('distro-overrides')
17
+ if branch_config['distro-overrides'].has_key?('name')
18
+ @distro_name = branch_config['distro-overrides']['name']
19
+ end
20
+ if branch_config['distro-overrides'].has_key?('author')
21
+ @distro_author = branch_config['distro-overrides']['author']
22
+ end
23
+ end
24
+ end
25
+
26
+ def branch_path
27
+ @branch_path ||= File.join(preview_dir,@distro.id,@dir)
28
+ end
29
+
30
+ def branch_stylesheet_dir
31
+ @branch_stylesheet_dir ||= File.join(branch_path,STYLESHEET_DIRNAME)
32
+ end
33
+
34
+ def branch_javascript_dir
35
+ @branch_javascript_dir ||= File.join(branch_path,JAVASCRIPT_DIRNAME)
36
+ end
37
+
38
+ def branch_image_dir
39
+ @branch_image_dir ||= File.join(branch_path,IMAGE_DIRNAME)
40
+ end
41
+
42
+ def is_valid?
43
+ validate
44
+ end
45
+
46
+ def errors
47
+ validate(true)
48
+ end
49
+
50
+ private
51
+
52
+ def validate(verbose=true)
53
+ errors = []
54
+ unless valid_string?(@id)
55
+ if verbose
56
+ errors << "Branch ID '#{@id}' is not a valid string."
57
+ else
58
+ return false
59
+ end
60
+ end
61
+ unless valid_string?(@name)
62
+ if verbose
63
+ errors << "Branch name '#{@name}' for branch ID '#{@id}' is not a valid string."
64
+ else
65
+ return false
66
+ end
67
+ end
68
+ unless valid_string?(@dir)
69
+ if verbose
70
+ errors << "Branch dir '#{@dir}' for branch ID '#{@id}' is not a valid string."
71
+ else
72
+ return false
73
+ end
74
+ end
75
+ unless valid_string?(@distro_name)
76
+ if verbose
77
+ errors << "Branchwise distro name '#{@distro_name}' for branch ID '#{@id}' is not a valid string."
78
+ else
79
+ return false
80
+ end
81
+ end
82
+ unless valid_string?(@distro_author)
83
+ if verbose
84
+ errors << "Branchwise distro author '#{@distro_author}' for branch ID '#{@id}' is not a valid string."
85
+ else
86
+ return false
87
+ end
88
+ end
89
+ return errors if verbose
90
+ return true
91
+ end
92
+ end
93
+ end