leg 0.0.1 → 0.0.2

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 (78) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +10 -0
  3. data/CODE_OF_CONDUCT.md +74 -0
  4. data/Gemfile +6 -0
  5. data/Gemfile.lock +34 -0
  6. data/LICENSE +21 -0
  7. data/README.md +59 -0
  8. data/Rakefile +11 -0
  9. data/TUTORIAL.md +243 -0
  10. data/bin/console +9 -0
  11. data/bin/setup +6 -0
  12. data/exe/leg +6 -0
  13. data/leg.gemspec +31 -0
  14. data/lib/leg.rb +27 -0
  15. data/lib/leg/cli.rb +42 -0
  16. data/lib/leg/commands.rb +19 -0
  17. data/lib/leg/commands/amend.rb +49 -0
  18. data/lib/leg/commands/base_command.rb +99 -0
  19. data/lib/leg/commands/build.rb +126 -0
  20. data/lib/leg/commands/commit.rb +48 -0
  21. data/lib/leg/commands/diff.rb +29 -0
  22. data/lib/leg/commands/help.rb +43 -0
  23. data/lib/leg/commands/init.rb +46 -0
  24. data/lib/leg/commands/reset.rb +26 -0
  25. data/lib/leg/commands/resolve.rb +31 -0
  26. data/lib/leg/commands/save.rb +31 -0
  27. data/lib/leg/commands/status.rb +54 -0
  28. data/lib/leg/commands/step.rb +31 -0
  29. data/lib/leg/config.rb +42 -0
  30. data/lib/leg/default_templates.rb +340 -0
  31. data/lib/leg/diff.rb +151 -0
  32. data/lib/leg/diff_transformers.rb +11 -0
  33. data/lib/leg/diff_transformers/base_transformer.rb +13 -0
  34. data/lib/leg/diff_transformers/fold_sections.rb +89 -0
  35. data/lib/leg/diff_transformers/omit_adjacent_removals.rb +38 -0
  36. data/lib/leg/diff_transformers/syntax_highlight.rb +32 -0
  37. data/lib/leg/diff_transformers/trim_blank_lines.rb +25 -0
  38. data/lib/leg/line.rb +83 -0
  39. data/lib/leg/markdown.rb +20 -0
  40. data/lib/leg/page.rb +27 -0
  41. data/lib/leg/representations.rb +9 -0
  42. data/lib/leg/representations/base_representation.rb +42 -0
  43. data/lib/leg/representations/git.rb +388 -0
  44. data/lib/leg/representations/litdiff.rb +85 -0
  45. data/lib/leg/step.rb +16 -0
  46. data/lib/leg/template.rb +95 -0
  47. data/lib/leg/tutorial.rb +49 -0
  48. data/lib/leg/version.rb +3 -0
  49. metadata +112 -38
  50. data/bin/leg +0 -9
  51. data/lib/snaptoken.rb +0 -24
  52. data/lib/snaptoken/cli.rb +0 -61
  53. data/lib/snaptoken/commands.rb +0 -13
  54. data/lib/snaptoken/commands/amend.rb +0 -27
  55. data/lib/snaptoken/commands/base_command.rb +0 -92
  56. data/lib/snaptoken/commands/build.rb +0 -107
  57. data/lib/snaptoken/commands/commit.rb +0 -27
  58. data/lib/snaptoken/commands/help.rb +0 -38
  59. data/lib/snaptoken/commands/resolve.rb +0 -27
  60. data/lib/snaptoken/commands/status.rb +0 -21
  61. data/lib/snaptoken/commands/step.rb +0 -35
  62. data/lib/snaptoken/default_templates.rb +0 -287
  63. data/lib/snaptoken/diff.rb +0 -180
  64. data/lib/snaptoken/diff_line.rb +0 -54
  65. data/lib/snaptoken/diff_transformers.rb +0 -9
  66. data/lib/snaptoken/diff_transformers/base_transformer.rb +0 -9
  67. data/lib/snaptoken/diff_transformers/fold_sections.rb +0 -85
  68. data/lib/snaptoken/diff_transformers/omit_adjacent_removals.rb +0 -28
  69. data/lib/snaptoken/diff_transformers/trim_blank_lines.rb +0 -21
  70. data/lib/snaptoken/markdown.rb +0 -18
  71. data/lib/snaptoken/page.rb +0 -64
  72. data/lib/snaptoken/representations.rb +0 -8
  73. data/lib/snaptoken/representations/base_representation.rb +0 -38
  74. data/lib/snaptoken/representations/git.rb +0 -262
  75. data/lib/snaptoken/representations/litdiff.rb +0 -81
  76. data/lib/snaptoken/step.rb +0 -27
  77. data/lib/snaptoken/template.rb +0 -53
  78. data/lib/snaptoken/tutorial.rb +0 -64
@@ -0,0 +1,85 @@
1
+ module Leg
2
+ module Representations
3
+ class Litdiff < BaseRepresentation
4
+ def save!(tutorial, options = {})
5
+ FileUtils.mkdir_p(path)
6
+ FileUtils.rm_rf(File.join(path, "."), secure: true)
7
+
8
+ step_num = 1
9
+ tutorial.pages.each.with_index do |page, page_idx|
10
+ output = ""
11
+ page.steps.each do |step|
12
+ output << step.text << "\n\n" unless step.text.empty?
13
+ output << "~~~ #{step_num}. #{step.summary}\n"
14
+ output << step.to_patch(unchanged_char: "|", strip_git_lines: true) << "\n"
15
+
16
+ yield step_num if block_given?
17
+ step_num += 1
18
+ end
19
+ output << page.footer_text << "\n" if page.footer_text
20
+
21
+ filename = page.filename + ".litdiff"
22
+ filename = "%02d.%s" % [page_idx + 1, filename] if tutorial.pages.length > 1
23
+
24
+ File.write(File.join(path, filename), output)
25
+ end
26
+ end
27
+
28
+ def load!(options = {})
29
+ step_num = 1
30
+ tutorial = Leg::Tutorial.new(@config)
31
+ Dir[File.join(path, "*.litdiff")].sort_by { |f| File.basename(f).to_i }.each do |diff_path|
32
+ filename = File.basename(diff_path).sub(/\.litdiff$/, "").sub(/^\d+\./, "")
33
+ page = Leg::Page.new(filename)
34
+ File.open(diff_path, "r") do |f|
35
+ cur_text = ""
36
+ cur_diff = nil
37
+ cur_summary = nil
38
+ while line = f.gets
39
+ if line =~ /^~~~\s*(\d+\.)?(.+)$/
40
+ cur_summary = $2.strip
41
+ cur_diff = ""
42
+ elsif cur_diff
43
+ if line.chomp.empty?
44
+ step_diffs = Leg::Diff.parse(cur_diff)
45
+ page << Leg::Step.new(step_num, cur_summary, cur_text.strip, step_diffs)
46
+
47
+ yield step_num if block_given?
48
+ step_num += 1
49
+
50
+ cur_text = ""
51
+ cur_summary = nil
52
+ cur_diff = nil
53
+ else
54
+ cur_diff << line.sub(/^\|/, " ")
55
+ end
56
+ else
57
+ cur_text << line
58
+ end
59
+ end
60
+ if cur_diff
61
+ step_diffs = Leg::Diff.parse(cur_diff)
62
+ page << Leg::Step.new(step_num, cur_summary, cur_text.strip, step_diffs)
63
+ elsif !cur_text.strip.empty?
64
+ page.footer_text = cur_text.strip
65
+ end
66
+ end
67
+ tutorial << page
68
+ end
69
+ tutorial
70
+ end
71
+
72
+ def path
73
+ File.join(@config.path, "doc")
74
+ end
75
+
76
+ private
77
+
78
+ def modified_at
79
+ if File.exist? path
80
+ Dir[File.join(path, "**/*")].map { |f| File.mtime(f) }.max
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,16 @@
1
+ module Leg
2
+ class Step
3
+ attr_accessor :number, :summary, :text, :diffs
4
+
5
+ def initialize(number, summary, text, diffs)
6
+ @number = number
7
+ @summary = summary.strip
8
+ @text = text.strip
9
+ @diffs = diffs
10
+ end
11
+
12
+ def to_patch(options = {})
13
+ @diffs.map { |diff| diff.to_patch(options) }.join("\n")
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,95 @@
1
+ module Leg
2
+ module Template
3
+ def self.render(template_source, tutorial, config, params = {})
4
+ Leg::Template::Context.new(template_source, tutorial, config, params).render_template
5
+ end
6
+
7
+ def self.render_page(page_template, step_template, format, page, tutorial, config)
8
+ content = ""
9
+ page.steps.each do |step|
10
+ if !step.text.strip.empty?
11
+ output = step.text.strip + "\n\n"
12
+ if format == "html"
13
+ output = Leg::Markdown.render(output)
14
+ end
15
+ content << output
16
+ end
17
+
18
+ content << Leg::Template.render_step(step_template, step, tutorial, config)
19
+ end
20
+ if page.footer_text
21
+ # TODO: DRY this up. Please.
22
+ output = page.footer_text.strip + "\n\n"
23
+ if format == "html"
24
+ output = Leg::Markdown.render(output)
25
+ end
26
+ content << output
27
+ end
28
+
29
+ page_number = tutorial.pages.index(page) + 1
30
+
31
+ Leg::Template.render(page_template, tutorial, config,
32
+ page_title: page.title,
33
+ content: content,
34
+ page_number: page_number,
35
+ prev_page: page_number > 1 ? tutorial.pages[page_number - 2] : nil,
36
+ next_page: page_number < tutorial.pages.length ? tutorial.pages[page_number] : nil
37
+ )
38
+ end
39
+
40
+ def self.render_step(step_template, step, tutorial, config)
41
+ Leg::Template.render(step_template, tutorial, config,
42
+ number: step.number,
43
+ summary: step.summary,
44
+ diffs: step.diffs
45
+ )
46
+ end
47
+
48
+ class Context
49
+ def initialize(template_source, tutorial, config, params)
50
+ @template_source = template_source
51
+ @tutorial = tutorial
52
+ @config = config
53
+ @params = params
54
+ end
55
+
56
+ def render_template
57
+ b = binding
58
+ @config.options.merge(@params).each do |name, value|
59
+ b.local_variable_set(name, value)
60
+ end
61
+ ERB.new(@template_source).result(b)
62
+ end
63
+
64
+ def render(path)
65
+ if !path.end_with? ".md"
66
+ raise ArgumentError, "Only .md files are supported by render() at the moment."
67
+ end
68
+
69
+ contents = File.read(path)
70
+ Leg::Markdown.render(contents)
71
+ end
72
+
73
+ def markdown(source)
74
+ Leg::Markdown.render(source)
75
+ end
76
+
77
+ def pages
78
+ @tutorial.pages
79
+ end
80
+
81
+ def syntax_highlighting_css(scope)
82
+ syntax_theme = @config.options[:syntax_theme] || "github"
83
+ if syntax_theme.is_a? String
84
+ theme = Rouge::Theme.find(syntax_theme)
85
+ elsif syntax_theme.is_a? Hash
86
+ theme = Class.new(Rouge::Themes::Base16)
87
+ theme.name "base16.custom"
88
+ theme.palette syntax_theme
89
+ end
90
+
91
+ theme.render(scope: scope)
92
+ end
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,49 @@
1
+ module Leg
2
+ class Tutorial
3
+ attr_accessor :config
4
+ attr_reader :pages
5
+
6
+ def initialize(config = nil)
7
+ @config = config
8
+ @pages = []
9
+ end
10
+
11
+ def <<(page)
12
+ @pages << page
13
+ self
14
+ end
15
+
16
+ def clear
17
+ @pages.clear
18
+ end
19
+
20
+ def step(number)
21
+ cur = 1
22
+ @pages.each do |page|
23
+ page.steps.each do |step|
24
+ return step if cur == number
25
+ cur += 1
26
+ end
27
+ end
28
+ end
29
+
30
+ def num_steps
31
+ @pages.map(&:steps).map(&:length).sum
32
+ end
33
+
34
+ def transform_diffs(transformers, &progress_block)
35
+ step_num = 1
36
+ @pages.each do |page|
37
+ page.steps.each do |step|
38
+ step.diffs.map! do |diff|
39
+ transformers.inject(diff) do |acc, transformer|
40
+ transformer.transform(acc)
41
+ end
42
+ end
43
+ progress_block.(step_num) if progress_block
44
+ step_num += 1
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,3 @@
1
+ module Leg
2
+ VERSION = "0.0.2"
3
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: leg
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeremy Ruten
8
8
  autorequire:
9
- bindir: bin
9
+ bindir: exe
10
10
  cert_chain: []
11
- date: 2018-03-25 00:00:00.000000000 Z
11
+ date: 2019-06-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rugged
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: 0.25.1.1
19
+ version: 0.27.2
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - '='
25
25
  - !ruby/object:Gem::Version
26
- version: 0.25.1.1
26
+ version: 0.27.2
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: redcarpet
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -52,42 +52,117 @@ dependencies:
52
52
  - - '='
53
53
  - !ruby/object:Gem::Version
54
54
  version: 2.0.7
55
+ - !ruby/object:Gem::Dependency
56
+ name: bundler
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.16'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.16'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '10.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '10.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: minitest
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '5.0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '5.0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: pry
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
55
111
  description:
56
- email: jeremy.ruten@gmail.com
112
+ email:
113
+ - jeremy.ruten@gmail.com
57
114
  executables:
58
115
  - leg
59
116
  extensions: []
60
117
  extra_rdoc_files: []
61
118
  files:
62
- - bin/leg
63
- - lib/snaptoken.rb
64
- - lib/snaptoken/cli.rb
65
- - lib/snaptoken/commands.rb
66
- - lib/snaptoken/commands/amend.rb
67
- - lib/snaptoken/commands/base_command.rb
68
- - lib/snaptoken/commands/build.rb
69
- - lib/snaptoken/commands/commit.rb
70
- - lib/snaptoken/commands/help.rb
71
- - lib/snaptoken/commands/resolve.rb
72
- - lib/snaptoken/commands/status.rb
73
- - lib/snaptoken/commands/step.rb
74
- - lib/snaptoken/default_templates.rb
75
- - lib/snaptoken/diff.rb
76
- - lib/snaptoken/diff_line.rb
77
- - lib/snaptoken/diff_transformers.rb
78
- - lib/snaptoken/diff_transformers/base_transformer.rb
79
- - lib/snaptoken/diff_transformers/fold_sections.rb
80
- - lib/snaptoken/diff_transformers/omit_adjacent_removals.rb
81
- - lib/snaptoken/diff_transformers/trim_blank_lines.rb
82
- - lib/snaptoken/markdown.rb
83
- - lib/snaptoken/page.rb
84
- - lib/snaptoken/representations.rb
85
- - lib/snaptoken/representations/base_representation.rb
86
- - lib/snaptoken/representations/git.rb
87
- - lib/snaptoken/representations/litdiff.rb
88
- - lib/snaptoken/step.rb
89
- - lib/snaptoken/template.rb
90
- - lib/snaptoken/tutorial.rb
119
+ - ".gitignore"
120
+ - CODE_OF_CONDUCT.md
121
+ - Gemfile
122
+ - Gemfile.lock
123
+ - LICENSE
124
+ - README.md
125
+ - Rakefile
126
+ - TUTORIAL.md
127
+ - bin/console
128
+ - bin/setup
129
+ - exe/leg
130
+ - leg.gemspec
131
+ - lib/leg.rb
132
+ - lib/leg/cli.rb
133
+ - lib/leg/commands.rb
134
+ - lib/leg/commands/amend.rb
135
+ - lib/leg/commands/base_command.rb
136
+ - lib/leg/commands/build.rb
137
+ - lib/leg/commands/commit.rb
138
+ - lib/leg/commands/diff.rb
139
+ - lib/leg/commands/help.rb
140
+ - lib/leg/commands/init.rb
141
+ - lib/leg/commands/reset.rb
142
+ - lib/leg/commands/resolve.rb
143
+ - lib/leg/commands/save.rb
144
+ - lib/leg/commands/status.rb
145
+ - lib/leg/commands/step.rb
146
+ - lib/leg/config.rb
147
+ - lib/leg/default_templates.rb
148
+ - lib/leg/diff.rb
149
+ - lib/leg/diff_transformers.rb
150
+ - lib/leg/diff_transformers/base_transformer.rb
151
+ - lib/leg/diff_transformers/fold_sections.rb
152
+ - lib/leg/diff_transformers/omit_adjacent_removals.rb
153
+ - lib/leg/diff_transformers/syntax_highlight.rb
154
+ - lib/leg/diff_transformers/trim_blank_lines.rb
155
+ - lib/leg/line.rb
156
+ - lib/leg/markdown.rb
157
+ - lib/leg/page.rb
158
+ - lib/leg/representations.rb
159
+ - lib/leg/representations/base_representation.rb
160
+ - lib/leg/representations/git.rb
161
+ - lib/leg/representations/litdiff.rb
162
+ - lib/leg/step.rb
163
+ - lib/leg/template.rb
164
+ - lib/leg/tutorial.rb
165
+ - lib/leg/version.rb
91
166
  homepage: https://github.com/yjerem/leg
92
167
  licenses:
93
168
  - MIT
@@ -107,9 +182,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
107
182
  - !ruby/object:Gem::Version
108
183
  version: '0'
109
184
  requirements: []
110
- rubyforge_project:
111
- rubygems_version: 2.6.13
185
+ rubygems_version: 3.0.3
112
186
  signing_key:
113
187
  specification_version: 4
114
- summary: tools for .leg files
188
+ summary: Tools for creating step-by-step programming tutorials
115
189
  test_files: []
data/bin/leg DELETED
@@ -1,9 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- $LOAD_PATH.unshift File.join(File.dirname(__FILE__), '../lib')
4
-
5
- require 'snaptoken'
6
-
7
- cli = Snaptoken::CLI.new
8
- cli.run(ARGV)
9
-