leg 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -1,81 +0,0 @@
1
- class Snaptoken::Representations::Litdiff < Snaptoken::Representations::BaseRepresentation
2
- def save!(options = {})
3
- FileUtils.mkdir_p(path)
4
- FileUtils.rm_rf(File.join(path, "."), secure: true)
5
-
6
- step_num = 1
7
- @tutorial.pages.each.with_index do |page, page_idx|
8
- output = ""
9
- page.steps.each do |step|
10
- output << step.text << "\n\n" unless step.text.empty?
11
- output << "~~~ #{step.summary}\n"
12
- output << step.to_patch(unchanged_char: "|") << "\n"
13
-
14
- yield step_num if block_given?
15
- step_num += 1
16
- end
17
- output << page.footer_text << "\n" if page.footer_text
18
-
19
- filename = page.filename + ".litdiff"
20
- filename = "%02d.%s" % [page_idx + 1, filename] if @tutorial.pages.length > 1
21
-
22
- File.write(File.join(path, filename), output)
23
- end
24
- end
25
-
26
- def load!(options = {})
27
- step_num = 1
28
- @tutorial.clear
29
- Dir[File.join(path, "*.litdiff")].sort_by { |f| File.basename(f).to_i }.each do |diff_path|
30
- filename = File.basename(diff_path).sub(/\.litdiff$/, "").sub(/^\d+\./, "")
31
- page = Snaptoken::Page.new(filename)
32
- File.open(diff_path, "r") do |f|
33
- cur_text = ""
34
- cur_diff = nil
35
- cur_summary = nil
36
- while line = f.gets
37
- if line.start_with? "~~~"
38
- cur_summary = (line[3..-1] || "").strip
39
- cur_diff = ""
40
- elsif cur_diff
41
- if line.chomp.empty?
42
- step_diffs = Snaptoken::Diff.parse(cur_diff)
43
- page << Snaptoken::Step.new(step_num, cur_summary, cur_text.strip, step_diffs)
44
-
45
- yield step_num if block_given?
46
- step_num += 1
47
-
48
- cur_text = ""
49
- cur_summary = nil
50
- cur_diff = nil
51
- else
52
- cur_diff << line.sub(/^\|/, " ")
53
- end
54
- else
55
- cur_text << line
56
- end
57
- end
58
- if cur_diff
59
- step_diffs = Snaptoken::Diff.parse(cur_diff)
60
- page << Snaptoken::Step.new(step_num, cur_summary, cur_text.strip, step_diffs)
61
- elsif !cur_text.strip.empty?
62
- page.footer_text = cur_text.strip
63
- end
64
- end
65
- @tutorial << page
66
- end
67
- @tutorial
68
- end
69
-
70
- def path
71
- File.join(@tutorial.config[:path], "doc")
72
- end
73
-
74
- private
75
-
76
- def modified_at
77
- if File.exist? path
78
- Dir[File.join(path, "**/*")].map { |f| File.mtime(f) }.max
79
- end
80
- end
81
- end
@@ -1,27 +0,0 @@
1
- class Snaptoken::Step
2
- attr_accessor :number, :summary, :text, :diffs
3
-
4
- def initialize(number, summary, text, diffs)
5
- @number = number
6
- @summary = summary.strip
7
- @text = text.strip
8
- @diffs = diffs
9
- end
10
-
11
- def to_html(tutorial, offline)
12
- Snaptoken::Template.new(tutorial.step_template, tutorial,
13
- offline: offline,
14
- number: @number,
15
- summary: @summary,
16
- diffs: @diffs
17
- ).render_template
18
- end
19
-
20
- def to_patch(options = {})
21
- @diffs.map { |diff| diff.to_patch(options) }.join("\n")
22
- end
23
-
24
- def syntax_highlight!
25
- @diffs.each(&:syntax_highlight!)
26
- end
27
- end
@@ -1,53 +0,0 @@
1
- class Snaptoken::Template
2
- attr_reader :tutorial
3
-
4
- def initialize(template_source, tutorial, params)
5
- @template_source = template_source
6
- @tutorial = tutorial
7
- @params = params
8
- end
9
-
10
- def render_template
11
- b = binding
12
- @tutorial.config.merge(@params).each do |name, value|
13
- b.local_variable_set(name, value)
14
- end
15
- ERB.new(@template_source).result(b)
16
- end
17
-
18
- def render(path)
19
- if !path.end_with? ".md"
20
- raise ArgumentError, "Only .md files are supported by render() at the moment."
21
- end
22
-
23
- contents = File.read(path)
24
- Snaptoken::Markdown.render(contents)
25
- end
26
-
27
- def markdown(source)
28
- Snaptoken::Markdown.render(source)
29
- end
30
-
31
- def pages
32
- @tutorial.pages
33
- end
34
-
35
- def step(number)
36
- step = @tutorial.step(number)
37
- step.syntax_highlight!
38
- step.to_html(@tutorial, @params[:offline])
39
- end
40
-
41
- def syntax_highlighting_css(scope)
42
- syntax_theme = @tutorial.config[:syntax_theme] || "github"
43
- if syntax_theme.is_a? String
44
- theme = Rouge::Theme.find(syntax_theme)
45
- elsif syntax_theme.is_a? Hash
46
- theme = Class.new(Rouge::Themes::Base16)
47
- theme.name "base16.custom"
48
- theme.palette syntax_theme
49
- end
50
-
51
- theme.render(scope: scope)
52
- end
53
- end
@@ -1,64 +0,0 @@
1
- class Snaptoken::Tutorial
2
- attr_accessor :config
3
- attr_accessor :page_template, :step_template
4
- attr_reader :pages
5
-
6
- def initialize(config = {})
7
- @config = config
8
- @page_template = Snaptoken::DefaultTemplates::PAGE
9
- @step_template = Snaptoken::DefaultTemplates::STEP
10
- @pages = []
11
- end
12
-
13
- def <<(page)
14
- @pages << page
15
- self
16
- end
17
-
18
- def clear
19
- @pages.clear
20
- end
21
-
22
- def step(number)
23
- cur = 1
24
- @pages.each do |page|
25
- page.steps.each do |step|
26
- return step if cur == number
27
- cur += 1
28
- end
29
- end
30
- end
31
-
32
- def num_steps
33
- @pages.map(&:steps).map(&:length).sum
34
- end
35
-
36
- def transform_diffs(transformers, &progress_block)
37
- step_num = 1
38
- @pages.each do |page|
39
- page.steps.each do |step|
40
- step.diffs.map! do |diff|
41
- transformers.inject(diff) do |acc, transformer|
42
- transformer.transform(acc)
43
- end
44
- end
45
- progress_block.(step_num) if progress_block
46
- step_num += 1
47
- end
48
- end
49
- end
50
-
51
- def last_synced_at
52
- File.mtime(last_synced_path) if File.exist?(last_synced_path)
53
- end
54
-
55
- def synced!
56
- FileUtils.touch(last_synced_path)
57
- end
58
-
59
- private
60
-
61
- def last_synced_path
62
- File.join(@config[:path], ".leg/last_synced")
63
- end
64
- end